diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 7dff644e5fcf..a3d65ccce259 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -37,6 +37,12 @@ body: placeholder: Arch Linux, GCC 16.2.1, RTX 5080 (NVIDIA 615.78.08) validations: required: true + - type: textarea + id: host_report + attributes: + label: Host report + description: Start the game with `ANYPS5_HOST_REPORT=1` and paste the block it prints to stderr. It holds the OS, CPU, GPU, driver, Vulkan items the GPU lacks, SDL version and the `APS5_*` switches, without paths or user names. See [Host report](https://github.com/boykopovar/AnyPS5/blob/main/docs/user/USAGE.md#host-report). + render: text - type: textarea id: steps attributes: @@ -48,7 +54,7 @@ body: id: log attributes: label: Log - description: The lines around the stop. + description: The lines around the stop. Setting ANYPS5_LOG_FILE= before the run saves the whole log to a file you can attach. render: text validations: required: true diff --git a/.github/workflows/area-labels.yml b/.github/workflows/area-labels.yml index f76171b143b7..6c1f0906d97c 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/build.yml b/.github/workflows/build.yml index 547ca0238112..59ce300740bf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -140,7 +140,7 @@ jobs: touches('core/libs/tests/register_context/', 'core/libs/tests/RegisterContext.cpp', libc), writeWatch: edits('write-watch') || touches('core/libs/tests/write_watch/', 'core/libs/tests/WriteWatch.cpp', libc), mingwHostTests: edits('eligibility') || edits('windows') || touches( - 'core/libs/', 'tools/build_mingw_host_only_tests.py', + 'core/libs/', 'tools/build_mingw_host_only_tests.py', 'tools/build_changed_guest_tests.py', 'tools/tests/test_build_changed_guest_tests.py', 'tools/tests/test_mingw_host_only_test_targets.py', 'CMakeLists.txt' ), }; @@ -703,6 +703,10 @@ jobs: if: github.event_name == 'pull_request' shell: cmd run: python tools/build_mingw_host_only_tests.py build changed.txt + - name: Build and run changed guest core/libs tests + if: github.event_name == 'pull_request' + shell: cmd + run: python tools/build_changed_guest_tests.py build changed.txt - id: libs if: github.event_name != 'pull_request' shell: cmd diff --git a/.github/workflows/emscripten-libraries.yml b/.github/workflows/emscripten-libraries.yml new file mode 100644 index 000000000000..790bf599a3c3 --- /dev/null +++ b/.github/workflows/emscripten-libraries.yml @@ -0,0 +1,43 @@ +name: Emscripten library portability + +on: + pull_request: + paths: + - .github/workflows/emscripten-libraries.yml + - core/libs/** + push: + branches: [main] + paths: + - .github/workflows/emscripten-libraries.yml + - core/libs/** + +permissions: + contents: read + +jobs: + library-portability: + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/checkout@v7 + with: + persist-credentials: false + - name: Compile native library sources and test guest long doubles + run: | + cmake -S core/libs/tests/emscripten -B build-native -DCMAKE_BUILD_TYPE=Release + cmake --build build-native --parallel 2 + ctest --test-dir build-native --output-on-failure + - uses: actions/setup-node@v6 + with: + node-version: '26' + - name: Compile memory64 libraries and test conversions and module errors + shell: bash + run: | + ANYPS5_TEST_NODE="$(command -v node)" + git clone --depth 1 https://github.com/emscripten-core/emsdk.git "$RUNNER_TEMP/emsdk" + "$RUNNER_TEMP/emsdk/emsdk" install 6.0.12 + "$RUNNER_TEMP/emsdk/emsdk" activate 6.0.12 + source "$RUNNER_TEMP/emsdk/emsdk_env.sh" + emcmake cmake -S core/libs/tests/emscripten -B build-portable -DCMAKE_BUILD_TYPE=Release -DANYPS5_NODE="$ANYPS5_TEST_NODE" + cmake --build build-portable --parallel 2 + ctest --test-dir build-portable --output-on-failure diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cff3998f8cd9..a10dd29ebcf9 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: @@ -162,10 +162,13 @@ jobs: - name: Check release files and collect documentation shell: bash run: | - for file in "prx-windows-$RELEASE_TAG.zip" "prx-windows-$RELEASE_TAG.tar.gz" "prx-linux-$RELEASE_TAG.zip" "prx-linux-$RELEASE_TAG.tar.gz" "relinker-$RELEASE_TAG.exe" "relinker-$RELEASE_TAG" "web-$RELEASE_TAG.zip"; do + for file in "prx-windows-$RELEASE_TAG.zip" "prx-windows-$RELEASE_TAG.tar.gz" "prx-linux-$RELEASE_TAG.zip" "prx-linux-$RELEASE_TAG.tar.gz" "prx-windows-unpatched-$RELEASE_TAG.zip" "prx-windows-unpatched-$RELEASE_TAG.tar.gz" "prx-linux-unpatched-$RELEASE_TAG.zip" "prx-linux-unpatched-$RELEASE_TAG.tar.gz" "relinker-$RELEASE_TAG.exe" "relinker-$RELEASE_TAG" "web-$RELEASE_TAG.zip"; do test -s "dist/$file" done python tools/package_release.py --docs docs/user --output dist + python tools/package_release.py --platform headers --version "$RELEASE_TAG" --output dist + test -s "dist/prx-headers-$RELEASE_TAG.zip" + test -s "dist/prx-headers-$RELEASE_TAG.tar.gz" chmod +x "dist/relinker-$RELEASE_TAG" - name: Prepare release notes shell: bash diff --git a/.github/workflows/sanitizers.yml b/.github/workflows/sanitizers.yml index 914ad341bf4a..94c7c2631c4f 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 9632e4458dc7..67d85a24d289 100644 --- a/.gitignore +++ b/.gitignore @@ -62,8 +62,10 @@ build-wasm/ venv/ env/ ENV/ +/.local/ __pycache__/ +*.pyc *.pyo *.pyd *.egg diff --git a/.gitmodules b/.gitmodules index 219621ad1add..f05248d4084f 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/SPIRV-Headers b/3rdparty/SPIRV-Headers index 01e0577914a7..b824a462d425 160000 --- a/3rdparty/SPIRV-Headers +++ b/3rdparty/SPIRV-Headers @@ -1 +1 @@ -Subproject commit 01e0577914a75a2569c846778c2f93aa8e6feddd +Subproject commit b824a462d4256d720bebb40e78b9eb8f78bbb305 diff --git a/3rdparty/SPIRV-Tools b/3rdparty/SPIRV-Tools index 7f2d9ee926f9..262bdab48146 160000 --- a/3rdparty/SPIRV-Tools +++ b/3rdparty/SPIRV-Tools @@ -1 +1 @@ -Subproject commit 7f2d9ee926f98fc77a3ed1e1e0f113b8c9c49458 +Subproject commit 262bdab48146c937467f826699a40da0fdfc0f1a diff --git a/3rdparty/quickjs b/3rdparty/quickjs new file mode 160000 index 000000000000..6d46d07d0404 --- /dev/null +++ b/3rdparty/quickjs @@ -0,0 +1 @@ +Subproject commit 6d46d07d04041b40f4f49eaa7fdebe44c314c699 diff --git a/3rdparty/vorbis b/3rdparty/vorbis index 0657aee69dec..c2aa86b05e98 160000 --- a/3rdparty/vorbis +++ b/3rdparty/vorbis @@ -1 +1 @@ -Subproject commit 0657aee69dec8508a0011f47f3b69d7538e9d262 +Subproject commit c2aa86b05e981c96bf381fc6aa11cdd03eccc2fb diff --git a/CMakeLists.txt b/CMakeLists.txt index d08b1acf883a..b65c331ce12c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,6 +32,7 @@ endfunction() option(BUILD_TESTING "Build and register relinker tests" OFF) option(ANYPS5_RELINKER_ONLY "Build the relinker without system libraries or third-party dependencies" OFF) option(ANYPS5_BUILD_WASM "Build the browser relinker" OFF) +option(ANYPS5_RELINKER_CLI "Build the native relinker command line" ON) if(ANYPS5_BUILD_WASM) if(NOT EMSCRIPTEN) message(FATAL_ERROR "ANYPS5_BUILD_WASM requires emcmake and Emscripten") @@ -65,6 +66,7 @@ option(ANYPS5_ENABLE_ASAN "Build Linux targets with AddressSanitizer and use an option(ANYPS5_ENABLE_TSAN "Build Linux targets with ThreadSanitizer" OFF) option(APS5_ENABLE_TIMING_LOG "Write frame timings asynchronously to frame-timing.log" OFF) option(APS5_ENABLE_TRACY "Build the Tracy profiler client and report performance timer scopes as Tracy zones" OFF) +option(ANYPS5_LIBRESSL_ORACLE "Build guest_libressl_oracle, which compares libSceLibreSsl with LibreSSL 2.5.4 downloaded from ftp.openbsd.org" OFF) option(ANYPS5_USE_SYSTEM_DEPS "Resolve SDL2, freetype, Vulkan-Headers, SPIRV-Headers, glslang and SPIRV-Tools from the system instead of the bundled submodules" OFF) add_compile_definitions(APS5_ENABLE_TIMING_LOG=$) include(cmake/SystemDeps.cmake) @@ -162,6 +164,25 @@ if(BUILD_TESTING) core/shader/recompiler/IntermediateRepresentation/include) add_test(NAME shader_ir_use_rewrite COMMAND shader_ir_use_rewrite_tests) set_tests_properties(shader_ir_use_rewrite PROPERTIES TIMEOUT 20) + add_test_executable(shader_ssa_pass_reads_tests + core/shader/recompiler/tests/SsaPassReads.cpp + core/shader/recompiler/Optimization/src/SsaBuilder/SsaPass.cpp + core/shader/recompiler/Optimization/src/SsaBuilder/SsaDefTable.cpp + core/shader/recompiler/Optimization/src/SsaBuilder/SsaVariable.cpp + core/shader/recompiler/IntermediateRepresentation/src/IrProgram.cpp + core/shader/recompiler/IntermediateRepresentation/src/IrValue.cpp + core/shader/recompiler/IntermediateRepresentation/src/IrBlock.cpp + core/shader/recompiler/IntermediateRepresentation/src/IrOpcode.cpp + core/shader/recompiler/IntermediateRepresentation/src/IrType.cpp + core/shader/recompiler/IntermediateRepresentation/src/GuestRegister.cpp) + target_include_directories(shader_ssa_pass_reads_tests PRIVATE + core/shader/recompiler + core/shader/recompiler/IntermediateRepresentation/include + core/shader/recompiler/Optimization/include + core/shader/recompiler/RdnaDecoder/include + core/shader/recompiler/ControlFlow/include) + add_test(NAME shader_ssa_pass_reads COMMAND shader_ssa_pass_reads_tests) + set_tests_properties(shader_ssa_pass_reads PROPERTIES TIMEOUT 20) add_test_executable(pad_command_file_tests core/libs/prx/libScePad/tests/InputCommandFile.cpp) target_include_directories(pad_command_file_tests PRIVATE core/libs) add_test(NAME pad_command_file COMMAND pad_command_file_tests) @@ -169,6 +190,11 @@ 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} ${CMAKE_CURRENT_SOURCE_DIR}/core/shader/recompiler/tests/test_shader_cache_native_paths.py ${CMAKE_CURRENT_SOURCE_DIR}/core/shader/recompiler/ShaderCacheVersion.cmake ${CMAKE_COMMAND}) @@ -184,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} @@ -199,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} @@ -244,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} @@ -259,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) @@ -308,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} @@ -334,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} @@ -376,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) @@ -431,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} @@ -449,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 61881a4db07a..9b2b8e1a79e6 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 879ac61ea1d7..7c0bad824681 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 c0e4f117ab0e..315f27b251b3 100644 --- a/core/libs/CMakeLists.txt +++ b/core/libs/CMakeLists.txt @@ -121,6 +121,7 @@ endif() set(UNPATCHED_DIR ${CMAKE_CURRENT_BINARY_DIR}/libs/unpatched) set(PATCHED_DIR ${CMAKE_CURRENT_BINARY_DIR}/libs) set(IMPLIB_DIR ${PATCHED_DIR}/implib) +set(RELEASE_IMPLIBS "libc=$\n") set_target_properties(libc PROPERTIES PREFIX "" @@ -210,9 +211,14 @@ foreach(LIB_DIR ${LIBS_DIRS}) ) list(APPEND PATCHED_OUTPUTS ${PATCHED_FILE}) + string(APPEND RELEASE_IMPLIBS "${LIB_NAME}=$\n") endif() endforeach() +if(WIN32) + file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/release-implibs.txt CONTENT "${RELEASE_IMPLIBS}") +endif() + target_link_libraries(libSceUsbStorageDialog PRIVATE libSceUserService) include(prx/libSceFreeType/PostScriptInfo.cmake) @@ -280,6 +286,15 @@ if(BUILD_TESTING) set_tests_properties(guest_posix_scalar_io PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") endif() + add_test_executable(guest_kernel_sys_upd_version_tests tests/GuestKernelSysUpdVersion.cpp) + target_include_directories(guest_kernel_sys_upd_version_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) + target_link_libraries(guest_kernel_sys_upd_version_tests PRIVATE libkernel_sys libkernel libc ${CMAKE_DL_LIBS}) + configure_windows_unwind(guest_kernel_sys_upd_version_tests) + add_test(NAME guest_kernel_sys_upd_version COMMAND guest_kernel_sys_upd_version_tests) + if(WIN32) + set_tests_properties(guest_kernel_sys_upd_version PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() add_test_executable(guest_kernel_sys_sdk_version_tests tests/GuestKernelSysSdkVersion.cpp) target_include_directories(guest_kernel_sys_sdk_version_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(guest_kernel_sys_sdk_version_tests PRIVATE libkernel_sys libkernel libc) @@ -307,6 +322,16 @@ if(BUILD_TESTING) set_tests_properties(guest_kernel_sys_cpumode PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") endif() + add_test_executable(guest_kernel_sys_neo_mode_tests tests/GuestKernelSysNeoMode.cpp) + target_include_directories(guest_kernel_sys_neo_mode_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) + target_link_libraries(guest_kernel_sys_neo_mode_tests PRIVATE libkernel_sys libkernel libc) + configure_windows_unwind(guest_kernel_sys_neo_mode_tests) + add_test(NAME guest_kernel_sys_neo_mode COMMAND guest_kernel_sys_neo_mode_tests) + set_tests_properties(guest_kernel_sys_neo_mode PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(guest_kernel_sys_neo_mode PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() add_test_executable(nid_buffer_validation_tests nid/tests/BufferValidation.cpp) target_include_directories(nid_buffer_validation_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/nid/include) target_compile_features(nid_buffer_validation_tests PRIVATE cxx_std_20) @@ -427,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) @@ -456,13 +492,23 @@ if(BUILD_TESTING) set_tests_properties(guest_kernel_sys_constants PROPERTIES TIMEOUT 20) add_test_executable(guest_firmware_constant_returns_tests tests/GuestFirmwareConstantReturns.cpp) target_include_directories(guest_firmware_constant_returns_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) - target_link_libraries(guest_firmware_constant_returns_tests PRIVATE libSceComposite libSceFsInternalForVsh libSceHttpCache libScePlayReady libSceSdma libSceSsl libSceVisionManager libmdbg_syscore libkernel libc) + target_link_libraries(guest_firmware_constant_returns_tests PRIVATE libSceAvSetting libSceComposite libSceFsInternalForVsh libSceHttpCache libScePlayReady libSceSdma libSceSsl libSceVisionManager libmdbg_syscore libkernel libc) configure_windows_unwind(guest_firmware_constant_returns_tests) add_test(NAME guest_firmware_constant_returns COMMAND guest_firmware_constant_returns_tests) set_tests_properties(guest_firmware_constant_returns PROPERTIES TIMEOUT 20) if(WIN32) 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:$;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} @@ -623,6 +669,16 @@ if(BUILD_TESTING) "PATH=path_list_prepend:$") endif() + add_test_executable(guest_remoteplay_tests tests/GuestRemoteplay.cpp) + target_include_directories(guest_remoteplay_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) + target_link_libraries(guest_remoteplay_tests PRIVATE libSceRemoteplay libc) + configure_windows_unwind(guest_remoteplay_tests) + add_test(NAME guest_remoteplay COMMAND guest_remoteplay_tests) + if(WIN32) + set_tests_properties(guest_remoteplay PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test_executable(guest_gnm_neo_retail_tests tests/GuestGnmNeoRetail.cpp) target_include_directories(guest_gnm_neo_retail_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(guest_gnm_neo_retail_tests PRIVATE libSceGnmDriverForNeoMode libc) @@ -633,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) @@ -708,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) @@ -1002,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 000000000000..4f14137785ca --- /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 000000000000..3fbbed18a40b --- /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 000000000000..c3d732bcd3ed --- /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 d81f4a5e32c4..061e032714c3 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" @@ -5,6 +8,668 @@ extern "C" { -APS5_DUMMY_FUN + +int APS5_VABI sceAbstractStorageUnknown_7RnkdybfYiQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7RnkdybfYiQ", sceAbstractStorageUnknown_7RnkdybfYiQ_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_gINcKTbrqk4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gINcKTbrqk4", sceAbstractStorageUnknown_gINcKTbrqk4_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_F6tunp5_4ZM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("F6tunp5+4ZM", sceAbstractStorageUnknown_F6tunp5_4ZM_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_QRnz_VjPrkY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QRnz-VjPrkY", sceAbstractStorageUnknown_QRnz_VjPrkY_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_DkAGX6EPi_g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DkAGX6EPi+g", sceAbstractStorageUnknown_DkAGX6EPi_g_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_tDhVqVa_tvU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tDhVqVa-tvU", sceAbstractStorageUnknown_tDhVqVa_tvU_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_o9RD998mN8M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("o9RD998mN8M", sceAbstractStorageUnknown_o9RD998mN8M_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_KAJD5gNtjzg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KAJD5gNtjzg", sceAbstractStorageUnknown_KAJD5gNtjzg_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_jekg6a2C_KE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jekg6a2C-KE", sceAbstractStorageUnknown_jekg6a2C_KE_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_SPPYTszg6LQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SPPYTszg6LQ", sceAbstractStorageUnknown_SPPYTszg6LQ_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_ppyod3XEauc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ppyod3XEauc", sceAbstractStorageUnknown_ppyod3XEauc_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_FC7E1riolAM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FC7E1riolAM", sceAbstractStorageUnknown_FC7E1riolAM_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_h64Ojqk4fbE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("h64Ojqk4fbE", sceAbstractStorageUnknown_h64Ojqk4fbE_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_L9n8X5qE3gI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("L9n8X5qE3gI", sceAbstractStorageUnknown_L9n8X5qE3gI_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_UqSO97fYNAs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UqSO97fYNAs", sceAbstractStorageUnknown_UqSO97fYNAs_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_nxefs8JHV5U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nxefs8JHV5U", sceAbstractStorageUnknown_nxefs8JHV5U_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_TI_djeSDh5s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TI+djeSDh5s", sceAbstractStorageUnknown_TI_djeSDh5s_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_23QZTBt3E60_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("23QZTBt3E60", sceAbstractStorageUnknown_23QZTBt3E60_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_CgSbdJjHTyc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CgSbdJjHTyc", sceAbstractStorageUnknown_CgSbdJjHTyc_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_uhxDqVGiDTY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uhxDqVGiDTY", sceAbstractStorageUnknown_uhxDqVGiDTY_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_93IuLXtj1sc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("93IuLXtj1sc", sceAbstractStorageUnknown_93IuLXtj1sc_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_6g_lsIudFQY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6g-lsIudFQY", sceAbstractStorageUnknown_6g_lsIudFQY_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_r_kkC2OXw10_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("r+kkC2OXw10", sceAbstractStorageUnknown_r_kkC2OXw10_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_xeunZETVUSk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xeunZETVUSk", sceAbstractStorageUnknown_xeunZETVUSk_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_k0BKafeYaUo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("k0BKafeYaUo", sceAbstractStorageUnknown_k0BKafeYaUo_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_iAN_9pPHZSE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iAN-9pPHZSE", sceAbstractStorageUnknown_iAN_9pPHZSE_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_QbKmf_2_cR0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QbKmf+2+cR0", sceAbstractStorageUnknown_QbKmf_2_cR0_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_JWT7NbPA9Ds_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JWT7NbPA9Ds", sceAbstractStorageUnknown_JWT7NbPA9Ds_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown__fMkDXxU9E0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+fMkDXxU9E0", sceAbstractStorageUnknown__fMkDXxU9E0_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_sFN0uAZmk04_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sFN0uAZmk04", sceAbstractStorageUnknown_sFN0uAZmk04_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_wvDKH1RiZhU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wvDKH1RiZhU", sceAbstractStorageUnknown_wvDKH1RiZhU_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_FxOHF0FBNfU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FxOHF0FBNfU", sceAbstractStorageUnknown_FxOHF0FBNfU_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_JvyLbYhVigM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JvyLbYhVigM", sceAbstractStorageUnknown_JvyLbYhVigM_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_bb_T5NMDPck_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bb-T5NMDPck", sceAbstractStorageUnknown_bb_T5NMDPck_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_LPRr40DzhbA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LPRr40DzhbA", sceAbstractStorageUnknown_LPRr40DzhbA_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_oIR7L2c6df8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oIR7L2c6df8", sceAbstractStorageUnknown_oIR7L2c6df8_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_mhLGIWhMLlk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mhLGIWhMLlk", sceAbstractStorageUnknown_mhLGIWhMLlk_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_0Ydc18_XsSw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0Ydc18+XsSw", sceAbstractStorageUnknown_0Ydc18_XsSw_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_piG6ktf2BTU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("piG6ktf2BTU", sceAbstractStorageUnknown_piG6ktf2BTU_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_iLakkVdPya4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iLakkVdPya4", sceAbstractStorageUnknown_iLakkVdPya4_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_1Ko_sKZgqqs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1Ko+sKZgqqs", sceAbstractStorageUnknown_1Ko_sKZgqqs_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown__PYC3_W6yUE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-PYC3+W6yUE", sceAbstractStorageUnknown__PYC3_W6yUE_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_3iP9Xa6Z3z0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3iP9Xa6Z3z0", sceAbstractStorageUnknown_3iP9Xa6Z3z0_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_JREmVpFIgEY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JREmVpFIgEY", sceAbstractStorageUnknown_JREmVpFIgEY_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_kCX0k5t1v_w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kCX0k5t1v-w", sceAbstractStorageUnknown_kCX0k5t1v_w_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_3Cp_nOwl47U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3Cp-nOwl47U", sceAbstractStorageUnknown_3Cp_nOwl47U_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_v9CSqw6Ve0w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("v9CSqw6Ve0w", sceAbstractStorageUnknown_v9CSqw6Ve0w_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_KxTVuhlCL7o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KxTVuhlCL7o", sceAbstractStorageUnknown_KxTVuhlCL7o_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_YXXMdeJmxJw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YXXMdeJmxJw", sceAbstractStorageUnknown_YXXMdeJmxJw_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_2_S0J1RW2vQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2-S0J1RW2vQ", sceAbstractStorageUnknown_2_S0J1RW2vQ_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_K3qnBgQ0nC4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("K3qnBgQ0nC4", sceAbstractStorageUnknown_K3qnBgQ0nC4_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_rHzXUC9OHh8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rHzXUC9OHh8", sceAbstractStorageUnknown_rHzXUC9OHh8_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_Dlri33kcH6o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Dlri33kcH6o", sceAbstractStorageUnknown_Dlri33kcH6o_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_lH57wXDczHk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lH57wXDczHk", sceAbstractStorageUnknown_lH57wXDczHk_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_xJbY3QNYIzM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xJbY3QNYIzM", sceAbstractStorageUnknown_xJbY3QNYIzM_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_tbeA_hlRlHc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tbeA-hlRlHc", sceAbstractStorageUnknown_tbeA_hlRlHc_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_01BHTyfcbBs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("01BHTyfcbBs", sceAbstractStorageUnknown_01BHTyfcbBs_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_1PrEoSKt3_w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1PrEoSKt3-w", sceAbstractStorageUnknown_1PrEoSKt3_w_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_MoUJZiDoHMk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MoUJZiDoHMk", sceAbstractStorageUnknown_MoUJZiDoHMk_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_I69kRgYrWmY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("I69kRgYrWmY", sceAbstractStorageUnknown_I69kRgYrWmY_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_GCMRCWH3PU0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GCMRCWH3PU0", sceAbstractStorageUnknown_GCMRCWH3PU0_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_SYb4Kmj0u88_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SYb4Kmj0u88", sceAbstractStorageUnknown_SYb4Kmj0u88_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_k2VonUL2gF8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("k2VonUL2gF8", sceAbstractStorageUnknown_k2VonUL2gF8_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_zkaNI1552m4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zkaNI1552m4", sceAbstractStorageUnknown_zkaNI1552m4_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_KAtGZCifCMo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KAtGZCifCMo", sceAbstractStorageUnknown_KAtGZCifCMo_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown__sxz_ThMtGM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-sxz-ThMtGM", sceAbstractStorageUnknown__sxz_ThMtGM_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_wyEuZhFhbOE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wyEuZhFhbOE", sceAbstractStorageUnknown_wyEuZhFhbOE_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_F_Tz7UzYtJ4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("F-Tz7UzYtJ4", sceAbstractStorageUnknown_F_Tz7UzYtJ4_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_zC_hnmcVEOw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zC+hnmcVEOw", sceAbstractStorageUnknown_zC_hnmcVEOw_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_scYjSEuq2ik_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("scYjSEuq2ik", sceAbstractStorageUnknown_scYjSEuq2ik_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_QPNELEk9zkI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QPNELEk9zkI", sceAbstractStorageUnknown_QPNELEk9zkI_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_WnE1cxQELbY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WnE1cxQELbY", sceAbstractStorageUnknown_WnE1cxQELbY_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_Hg0GBcA80dk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Hg0GBcA80dk", sceAbstractStorageUnknown_Hg0GBcA80dk_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_gid_GlhKgJM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gid+GlhKgJM", sceAbstractStorageUnknown_gid_GlhKgJM_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_oJSXws_cIv8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oJSXws+cIv8", sceAbstractStorageUnknown_oJSXws_cIv8_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_GgNWVxe_YSU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GgNWVxe-YSU", sceAbstractStorageUnknown_GgNWVxe_YSU_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown__1PWHzoXWyU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-1PWHzoXWyU", sceAbstractStorageUnknown__1PWHzoXWyU_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_sLg6rUpiYSM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sLg6rUpiYSM", sceAbstractStorageUnknown_sLg6rUpiYSM_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_lYUGcgHYT7Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lYUGcgHYT7Y", sceAbstractStorageUnknown_lYUGcgHYT7Y_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_hQiPEotip7M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hQiPEotip7M", sceAbstractStorageUnknown_hQiPEotip7M_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_pekT_IsAkQU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pekT-IsAkQU", sceAbstractStorageUnknown_pekT_IsAkQU_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_xilbMn7q9qE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xilbMn7q9qE", sceAbstractStorageUnknown_xilbMn7q9qE_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_UZbuoykGKzE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UZbuoykGKzE", sceAbstractStorageUnknown_UZbuoykGKzE_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_RenWwlxG9Tw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RenWwlxG9Tw", sceAbstractStorageUnknown_RenWwlxG9Tw_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_JZ3wKDjl0yQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JZ3wKDjl0yQ", sceAbstractStorageUnknown_JZ3wKDjl0yQ_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_m7OSrfA7K_s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("m7OSrfA7K+s", sceAbstractStorageUnknown_m7OSrfA7K_s_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_spsjzV2pTSc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("spsjzV2pTSc", sceAbstractStorageUnknown_spsjzV2pTSc_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_6Fp8jJ7A7CY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6Fp8jJ7A7CY", sceAbstractStorageUnknown_6Fp8jJ7A7CY_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_wBaVZTLTjkg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wBaVZTLTjkg", sceAbstractStorageUnknown_wBaVZTLTjkg_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_DyerRilxWZ4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DyerRilxWZ4", sceAbstractStorageUnknown_DyerRilxWZ4_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_jCKhrVa9MEU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jCKhrVa9MEU", sceAbstractStorageUnknown_jCKhrVa9MEU_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_tIIRbXa2ZOk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tIIRbXa2ZOk", sceAbstractStorageUnknown_tIIRbXa2ZOk_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_vatp8UwS_nE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vatp8UwS+nE", sceAbstractStorageUnknown_vatp8UwS_nE_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_CrZTHC5yd64_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CrZTHC5yd64", sceAbstractStorageUnknown_CrZTHC5yd64_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_IoNgvbVSw24_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IoNgvbVSw24", sceAbstractStorageUnknown_IoNgvbVSw24_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_PEuuRn6zhF4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PEuuRn6zhF4", sceAbstractStorageUnknown_PEuuRn6zhF4_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_Ngfl7wTF7M0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ngfl7wTF7M0", sceAbstractStorageUnknown_Ngfl7wTF7M0_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_tLtIJWgGINI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tLtIJWgGINI", sceAbstractStorageUnknown_tLtIJWgGINI_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_4ns7J9OrJ5g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4ns7J9OrJ5g", sceAbstractStorageUnknown_4ns7J9OrJ5g_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_aKBqHZKouts_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aKBqHZKouts", sceAbstractStorageUnknown_aKBqHZKouts_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_fydJOJjDxX4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fydJOJjDxX4", sceAbstractStorageUnknown_fydJOJjDxX4_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_qtgEboQL0YE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qtgEboQL0YE", sceAbstractStorageUnknown_qtgEboQL0YE_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_XBlKK5ijWI8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XBlKK5ijWI8", sceAbstractStorageUnknown_XBlKK5ijWI8_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_xP3aCoP48XI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xP3aCoP48XI", sceAbstractStorageUnknown_xP3aCoP48XI_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_FCSUVvY_0RM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FCSUVvY-0RM", sceAbstractStorageUnknown_FCSUVvY_0RM_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_oc6n6hdUrEM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oc6n6hdUrEM", sceAbstractStorageUnknown_oc6n6hdUrEM_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_Cb7xWd9_7tc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Cb7xWd9-7tc", sceAbstractStorageUnknown_Cb7xWd9_7tc_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_mv9rtQAknH4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mv9rtQAknH4", sceAbstractStorageUnknown_mv9rtQAknH4_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_ka5TVf37Akg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ka5TVf37Akg", sceAbstractStorageUnknown_ka5TVf37Akg_nid_no_patch); + +int APS5_VABI sceAbstractStorageUnknown_1uryzAWFUuA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +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 000000000000..c31503d8e5b7 --- /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 000000000000..07e0b0c235bc --- /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 6f70f09beec2..02bce84cd0c8 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 d81f4a5e32c4..89aa5469d469 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 000000000000..1cb3756009c8 --- /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 6f70f09beec2..55d111f3d88a 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/libSceAbstractYoutube/Export.cpp b/core/libs/prx/libSceAbstractYoutube/Export.cpp index d81f4a5e32c4..6479276d8510 100644 --- a/core/libs/prx/libSceAbstractYoutube/Export.cpp +++ b/core/libs/prx/libSceAbstractYoutube/Export.cpp @@ -5,6 +5,90 @@ extern "C" { -APS5_DUMMY_FUN + +int APS5_VABI sceAbstractYoutubeUnknown_Hyxyxn00C18_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Hyxyxn00C18", sceAbstractYoutubeUnknown_Hyxyxn00C18_nid_no_patch); + +int APS5_VABI sceAbstractYoutubeUnknown_YWi5nsiD7Gc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YWi5nsiD7Gc", sceAbstractYoutubeUnknown_YWi5nsiD7Gc_nid_no_patch); + +int APS5_VABI sceAbstractYoutubeUnknown_Iy3kQxW3G10_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Iy3kQxW3G10", sceAbstractYoutubeUnknown_Iy3kQxW3G10_nid_no_patch); + +int APS5_VABI sceAbstractYoutubeUnknown_LHSZA0ujcbM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LHSZA0ujcbM", sceAbstractYoutubeUnknown_LHSZA0ujcbM_nid_no_patch); + +int APS5_VABI sceAbstractYoutubeUnknown_Vzp_LwIEg3o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Vzp+LwIEg3o", sceAbstractYoutubeUnknown_Vzp_LwIEg3o_nid_no_patch); + +int APS5_VABI sceAbstractYoutubeUnknown_a3T5ylvPLd8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("a3T5ylvPLd8", sceAbstractYoutubeUnknown_a3T5ylvPLd8_nid_no_patch); + +int APS5_VABI sceAbstractYoutubeUnknown_XB_EN3hFrS4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XB-EN3hFrS4", sceAbstractYoutubeUnknown_XB_EN3hFrS4_nid_no_patch); + +int APS5_VABI sceAbstractYoutubeUnknown_NomnFPQmVmY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NomnFPQmVmY", sceAbstractYoutubeUnknown_NomnFPQmVmY_nid_no_patch); + +int APS5_VABI sceAbstractYoutubeUnknown_Koq9Z_B4jcQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Koq9Z-B4jcQ", sceAbstractYoutubeUnknown_Koq9Z_B4jcQ_nid_no_patch); + +int APS5_VABI sceAbstractYoutubeUnknown_PAkQucLJN0c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PAkQucLJN0c", sceAbstractYoutubeUnknown_PAkQucLJN0c_nid_no_patch); + +int APS5_VABI sceAbstractYoutubeUnknown_iqJYGVNed1E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iqJYGVNed1E", sceAbstractYoutubeUnknown_iqJYGVNed1E_nid_no_patch); + +int APS5_VABI sceAbstractYoutubeUnknown_Pf_StbYH98s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Pf-StbYH98s", sceAbstractYoutubeUnknown_Pf_StbYH98s_nid_no_patch); + +int APS5_VABI sceAbstractYoutubeUnknown__mALZnOB7ro_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-mALZnOB7ro", sceAbstractYoutubeUnknown__mALZnOB7ro_nid_no_patch); + +int APS5_VABI sceAbstractYoutubeUnknown_A8fX5m6Lnrg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("A8fX5m6Lnrg", sceAbstractYoutubeUnknown_A8fX5m6Lnrg_nid_no_patch); + +int APS5_VABI sceAbstractYoutubeUnknown_LGgxtVdxaLY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LGgxtVdxaLY", sceAbstractYoutubeUnknown_LGgxtVdxaLY_nid_no_patch); + +int APS5_VABI sceAbstractYoutubeUnknown_JiGH4RQ_WxU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JiGH4RQ+WxU", sceAbstractYoutubeUnknown_JiGH4RQ_WxU_nid_no_patch); + +int APS5_VABI sceAbstractYoutubeUnknown_vJGnqFj6ygE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vJGnqFj6ygE", sceAbstractYoutubeUnknown_vJGnqFj6ygE_nid_no_patch); } diff --git a/core/libs/prx/libSceAcm/Export.cpp b/core/libs/prx/libSceAcm/Export.cpp index ddbe893628cf..d0cf25bf7786 100644 --- a/core/libs/prx/libSceAcm/Export.cpp +++ b/core/libs/prx/libSceAcm/Export.cpp @@ -1,11 +1,18 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceAcm/include/InventoryExports.hpp" #include "prx/libSceAcm/include/Api.hpp" #include #include #include +#include +#include #include +#include #include +#include #include #include +#include #include "SceTypes.hpp" #include "prx/libc/include/General.hpp" @@ -13,15 +20,202 @@ namespace { constexpr int SCE_ACM_ERROR_BAD_CONTEXT = static_cast(0x81940002); constexpr int SCE_ACM_ERROR_BAD_POINTER = static_cast(0x81940006); +constexpr int SCE_ACM_ERROR_BATCH_FULL = static_cast(0x81940009); +constexpr int SCE_ACM_ERROR_ALIGNMENT = static_cast(0x8194000A); +constexpr std::size_t ReverbDescriptorSize = 0x280; std::mutex g_mutex; std::unordered_set g_contexts; std::atomic g_nextId{1}; +struct ReverbEntry { + const void* samples; + std::uint32_t length; + std::uint32_t startOffset; + std::uint32_t total; + const void* metadata; + const void* filterMetadata; + void* workspace; + void* output; + float gain; + bool wideSamples; +}; + +std::uint64_t Address(const void* pointer) { + return reinterpret_cast(pointer); +} + +int AppendReverbJob(AcmBatchInfo& batch, std::uint32_t blockSize, const ReverbEntry& input, const ReverbEntry* entries, std::uint32_t count) { + const auto offset = batch.offset; + const auto capacity = batch.buffer_size; + if (capacity < ReverbDescriptorSize || offset > capacity - ReverbDescriptorSize || capacity - ReverbDescriptorSize - offset < 40) return SCE_ACM_ERROR_BATCH_FULL; + std::array order{}; + std::iota(order.begin(), order.begin() + count, 0u); + std::stable_sort(order.begin(), order.begin() + count, [entries](std::uint32_t left, std::uint32_t right) { return entries[left].length > entries[right].length; }); + std::array descriptor{}; + const auto put = [&descriptor](std::size_t position, auto value) { std::memcpy(descriptor.data() + position, &value, sizeof(value)); }; + const auto putEntry = [&put](std::uint32_t slot, const ReverbEntry& entry, std::uint32_t length) { + put(8 * slot, Address(entry.samples)); + put(0x48 + 4 * slot, length); + put(0x80 + 8 * slot, Address(entry.metadata)); + put(0xC8 + 4 * slot, entry.startOffset); + put(0x100 + 8 * slot, Address(entry.filterMetadata)); + put(0x148 + 4 * slot, entry.total); + }; + std::uint32_t longest = 0; + std::uint32_t wideMask = input.wideSamples ? 1u : 0u; + bool hasMetadata = input.metadata || input.filterMetadata; + for (std::uint32_t position = 0; position < count; ++position) { + const auto& entry = entries[order[position]]; + longest = std::max(longest, entry.length); + putEntry(position + 1, entry, entry.length); + descriptor[0x16C + order[position]] = static_cast(position); + wideMask |= (entry.wideSamples ? 1u : 0u) << (position + 1); + hasMetadata = hasMetadata || entry.metadata || entry.filterMetadata; + put(0x180 + 8 * position, Address(entry.workspace)); + put(0x1C0 + 4 * position, entry.gain); + put(0x200 + 8 * position, Address(entry.output)); + } + putEntry(0, input, longest); + put(0x174, 2 * blockSize); + put(0x178, wideMask); + put(0x17C, count + 1); + auto* buffer = static_cast(batch.buffer); + const auto descriptorOffset = capacity - ReverbDescriptorSize; + std::memcpy(buffer + descriptorOffset, descriptor.data(), descriptor.size()); + const std::array words{0x028000000000000D, Address(buffer + descriptorOffset), blockSize == 1024 || hasMetadata ? 0x1000Au : 0x1030Au, 0x10A, 0x20A}; + std::memcpy(buffer + offset, words.data(), sizeof(words)); + batch.offset = offset + sizeof(words); + batch.buffer_size = descriptorOffset; + return 0; +} + +int EncodeTransforms(AcmBatchInfo* batch, bool inverse, std::int32_t transformSize, std::uint32_t transformCount, std::int32_t inputFormat, const void* const* inputs, std::int32_t outputFormat, void* const* outputs, std::int32_t flags) { + const std::int32_t conflictingFlags = inverse ? 5 : 3; + if (!batch || transformCount == 0 || transformCount > 0x7FFFFFFF || !inputs || !outputs || (flags & conflictingFlags) == conflictingFlags || inputFormat < 0 || inputFormat > 1 || outputFormat < 0 || outputFormat > 1) return SCE_ACM_ERROR_BAD_POINTER; + if (transformSize != 256 && transformSize != 512 && transformSize != 1024 && transformSize != 2048) return SCE_ACM_ERROR_BAD_POINTER; + const bool real = (flags & 1) != 0; + const bool wide = transformSize == 2048; + if (wide && !inverse && !real) return SCE_ACM_ERROR_BAD_POINTER; + const std::uint32_t sizeIndex = transformSize == 256 ? 0 : transformSize == 512 ? 1 : transformSize == 1024 ? 2 : 3; + const std::uint32_t inputBytes = transformSize * (inputFormat == 1 ? 2 : 4); + const std::uint32_t outputBytes = transformSize * (outputFormat == 1 ? 2 : 4); + const std::uint64_t inputBlocks = (inputBytes >> 8) >> (!inverse && real ? 1 : 0); + const std::uint64_t outputBlocks = outputBytes >> 8; + std::uint32_t inputCommand; + std::uint32_t transformCommand; + std::uint32_t outputCommand; + if (wide) { + inputCommand = 2 * inputFormat + (inverse ? 1 : 0); + transformCommand = inverse ? 7 : 6; + outputCommand = 4 | outputFormat; + } else if (inverse) { + inputCommand = 4 | inputFormat; + transformCommand = 0xC; + outputCommand = 6 | outputFormat; + } else { + inputCommand = (real ? 0 : 2) | inputFormat; + transformCommand = real ? 0xA : 0xB; + outputCommand = 8 | outputFormat; + } + std::uint64_t header = 0; + if (!(flags & 8)) { + const auto encodedCount = transformCount < 64000 ? transformCount : 64000; + header = (inverse ? 0 : std::uint64_t{1} << 16) | (static_cast(flags & 6) << 20) | (real ? std::uint64_t{1} << (inverse ? 23 : 24) : 0) | (std::uint64_t{1} << (inputFormat == 1 ? 25 : 27)) | (std::uint64_t{1} << (outputFormat == 1 ? 26 : 28)) | (std::uint64_t{1} << (17 + sizeIndex)) | (static_cast(encodedCount) << 29); + } + header |= static_cast(7 + sizeIndex) << 8; + auto* buffer = static_cast(batch->buffer); + auto offset = batch->offset; + const auto capacity = batch->buffer_size; + const auto hasRoom = [&](std::uint64_t bytes) { return offset <= capacity && capacity - offset >= bytes; }; + const auto appendWord = [&](std::uint64_t value) { + std::memcpy(buffer + offset, &value, sizeof(value)); + offset += sizeof(value); + }; + constexpr int noSpace = static_cast(0x81940009); + constexpr int badAlignment = static_cast(0x8194000A); + if (!hasRoom(16)) return noSpace; + appendWord(header); + appendWord(10 | ((wide ? 8u : 0xDu) << 8)); + const bool pairedInputs = (flags & 2) != 0; + const bool pairedOutputs = (flags & 4) != 0; + const bool realOutput = inverse && real; + for (std::uint32_t index = 0; index < transformCount; ++index) { + const auto inputIndex = static_cast(index) * (pairedInputs ? 2 : 1); + const auto input = reinterpret_cast(inputs[inputIndex]); + const auto secondInput = pairedInputs ? reinterpret_cast(inputs[inputIndex + 1]) : 0; + if (!pairedInputs && !input) return SCE_ACM_ERROR_BAD_POINTER; + if ((input | secondInput) & 127) return badAlignment; + if (!hasRoom((pairedInputs ? 24 : 16) + 24)) return noSpace; + appendWord((pairedInputs ? 7 : 6) | (inputBlocks << 32) | (pairedInputs ? static_cast(inputBytes / 2) << 48 : 0)); + appendWord(input); + if (pairedInputs) appendWord(secondInput); + appendWord(10 | (inputCommand << 8)); + appendWord(10 | (transformCommand << 8)); + appendWord(10 | (outputCommand << 8)); + const auto outputIndex = static_cast(index) * (pairedOutputs ? 2 : 1); + const auto output = reinterpret_cast(outputs[outputIndex]); + const auto secondOutput = pairedOutputs ? reinterpret_cast(outputs[outputIndex + 1]) : 0; + if ((output | secondOutput) & 127) return badAlignment; + const bool longRecord = pairedOutputs || realOutput; + if (!hasRoom(longRecord ? 24 : 16)) return noSpace; + appendWord((longRecord ? 9 : 8) | (outputBlocks << 32) | (longRecord ? static_cast(outputBytes / 2) << 48 : 0)); + if (realOutput) appendWord(0); + appendWord(output); + if (pairedOutputs) appendWord(secondOutput); + } + batch->offset = offset; + return 0; +} + } extern "C" { +int APS5_VABI sceAcmChain_Audio3dPO1_Clear() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAcmChain_Audio3dPO1_RenderObject() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAcmChain_Audio3dPO1_Activate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAcmChain_Audio3dPO1_Output() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAcm_ConvReverb_SharedIr_2() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAcmChain_Audio3dPO1_RenderAmbisonicsChannel() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAcmChain_Audio3dPO2_Activate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAcmChain_Audio3dPO1_RenderPassthroughObject() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAcmChain_Audio3dPO2_RenderDelay() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAcmGetTelemetry() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAcm_ConvReverb_SharedInput_2() { + NotImplemented_nid_no_patch(__func__); +} + int APS5_VABI sceAcmBatchStartBuffer(AcmContextId context, const void* batch_commands, size_t batch_size, AcmBatchError* batch_error, AcmBatchId* batch) { (void)batch_commands; (void)batch_size; @@ -81,85 +275,87 @@ int APS5_VABI sceAcmContextDestroy(AcmContextId context) { } int APS5_VABI sceAcm_ConvReverb_SharedInput(AcmBatchInfo* batch, std::uint32_t mode, AcmReverbInput* input, std::uint32_t outputCount, const AcmReverbFilter* const* filters, const float* gains, const AcmReverbOutput* const* outputs) { - return 0; -} - -int APS5_VABI sceAcm_FFT(AcmBatchInfo* batch, std::int32_t transformSize, std::uint32_t transformCount, std::int32_t inputFormat, const void* const* inputs, std::int32_t outputFormat, void* const* outputs, std::int32_t flags) { - if (!batch || transformCount == 0 || transformCount > 0x7FFFFFFF || !inputs || !outputs || (flags & 3) == 3 || inputFormat < 0 || inputFormat > 1 || outputFormat < 0 || outputFormat > 1) return SCE_ACM_ERROR_BAD_POINTER; - if (transformSize != 512 && transformSize != 1024 && transformSize != 2048) return SCE_ACM_ERROR_BAD_POINTER; - const bool realInput = (flags & 1) != 0; - if (transformSize == 2048 && !realInput) return SCE_ACM_ERROR_BAD_POINTER; - const std::uint32_t inputBytes = transformSize * (inputFormat == 1 ? 2 : 4); - const std::uint32_t outputBytes = transformSize * (outputFormat == 1 ? 2 : 4); - const std::uint32_t inputBlocks = (inputBytes >> 9) >> (realInput ? 1 : 0); - const std::uint32_t outputBlocks = outputBytes >> 9; - std::uint32_t transformCommand; - std::uint32_t inputCommand; - std::uint32_t outputCommand; - std::uint32_t setupCommand; - std::uint32_t sizeCode; - if (transformSize == 512) { - sizeCode = 4; - transformCommand = realInput ? 7 : 11; - inputCommand = realInput ? 2 * inputFormat : 9 + inputFormat; - outputCommand = 4 | outputFormat; - setupCommand = realInput ? 6 : 12; - } else if (transformSize == 1024) { - sizeCode = 5; - transformCommand = realInput ? 8 : 13; - inputCommand = realInput ? 2 * inputFormat : 14 | inputFormat; - outputCommand = 5 | (2 * outputFormat); - setupCommand = realInput ? 10 : 12; - } else { - sizeCode = 6; - transformCommand = 6; - inputCommand = 2 * inputFormat; - outputCommand = 4 | outputFormat; - setupCommand = 8; + if (!batch || mode != 1 || !input || !filters) return SCE_ACM_ERROR_BAD_POINTER; + const auto blockSize = input->blockSize; + if (blockSize != 128 && blockSize != 256 && blockSize != 512 && blockSize != 1024) return SCE_ACM_ERROR_BAD_POINTER; + for (std::uint32_t index = 0; index < outputCount; ++index) { + if (!filters[index] || filters[index]->blockCount == 0) return SCE_ACM_ERROR_BAD_POINTER; } - auto* buffer = static_cast(batch->buffer); - auto offset = batch->offset; - const auto capacity = batch->buffer_size; - const auto appendWord = [&](std::uint64_t value) { - if (offset > capacity || capacity - offset < sizeof(value)) return false; - std::memcpy(buffer + offset, &value, sizeof(value)); - offset += sizeof(value); - return true; - }; - std::uint64_t header = static_cast(sizeCode) << 8; - if (!(flags & 8)) { - const auto encodedCount = transformCount < 64000 ? transformCount : 64000; - header |= (std::uint64_t{1} << 16) | (static_cast(transformSize) << 8) | (static_cast(flags & 6) << 19) | (static_cast(flags & 1) << 23) | (std::uint64_t{1} << (inputFormat == 1 ? 24 : 26)) | (std::uint64_t{1} << (outputFormat == 1 ? 25 : 27)) | (static_cast(encodedCount) << 28); + const auto blockCount = input->blockCount; + if (!input->history || blockCount == 0) return SCE_ACM_ERROR_BAD_POINTER; + input->currentBlock = (input->availableBlocks == 0 || input->currentBlock == 0 ? blockCount : input->currentBlock) - 1; + input->availableBlocks = std::min(input->availableBlocks + 1, blockCount); + const auto channelCount = input->channelCount; + if (channelCount == 0 || channelCount > 256 || !input->inputChannels || input->sampleFormat > 1) return SCE_ACM_ERROR_BAD_POINTER; + const bool wideSamples = input->sampleFormat == 0; + const std::uint32_t slotBytes = blockSize * (wideSamples ? 8 : 4); + const std::uint32_t current = input->currentBlock; + std::vector sources(channelCount); + std::vector destinations(channelCount); + for (std::uint32_t channel = 0; channel < channelCount; ++channel) { + const auto* history = input->history[channel]; + if (!history || history->blockMetadata || !history->samples || !input->inputChannels[channel]) return SCE_ACM_ERROR_BAD_POINTER; + const auto position = wideSamples ? channel : channelCount - 1 - channel; + sources[position] = input->inputChannels[channel]; + destinations[position] = static_cast(history->samples) + current * slotBytes; } - constexpr int noSpace = static_cast(0x81940009); - constexpr int badAlignment = static_cast(0x8194000A); - if (!appendWord(header) || !appendWord(10 | (setupCommand << 8))) return noSpace; - for (std::uint32_t index = 0; index < transformCount; ++index) { - const auto inputIndex = static_cast(index) * ((flags & 2) ? 2 : 1); - const auto input = reinterpret_cast(inputs[inputIndex]); - const auto secondInput = (flags & 2) ? reinterpret_cast(inputs[inputIndex + 1]) : 0; - if (!(flags & 2) && !input) return SCE_ACM_ERROR_BAD_POINTER; - if ((input | secondInput) & 127) return badAlignment; - const auto inputRecordSize = (flags & 2) ? 24u : 16u; - if (offset > capacity || capacity - offset < inputRecordSize) return noSpace; - appendWord(((flags & 2) ? 7 : 6) | (static_cast(inputBlocks) << 32) | ((flags & 2) ? static_cast(inputBytes / 2) << 48 : 0)); - appendWord(input); - if (flags & 2) appendWord(secondInput); - if (!appendWord(10 | (inputCommand << 8)) || !appendWord(10 | (transformCommand << 8)) || !appendWord(10 | (outputCommand << 8))) return noSpace; - const auto outputIndex = static_cast(index) * ((flags & 4) ? 2 : 1); - const auto output = reinterpret_cast(outputs[outputIndex]); - const auto secondOutput = (flags & 4) ? reinterpret_cast(outputs[outputIndex + 1]) : 0; - if ((output | secondOutput) & 127) return badAlignment; - const auto outputRecordSize = (flags & 4) ? 24u : 16u; - if (offset > capacity || capacity - offset < outputRecordSize) return noSpace; - appendWord(((flags & 4) ? 9 : 8) | (static_cast(outputBlocks) << 32) | ((flags & 4) ? static_cast(outputBytes / 2) << 48 : 0)); - appendWord(output); - if (flags & 4) appendWord(secondOutput); + AcmBatchInfo work = *batch; + if (const auto result = sceAcm_FFT(&work, static_cast(2 * blockSize), channelCount, 0, sources.data(), wideSamples ? 0 : 1, destinations.data(), 9)) return result; + if (outputCount == 0 || !outputs) return SCE_ACM_ERROR_BAD_POINTER; + const auto headerOffset = work.offset; + if (headerOffset > work.buffer_size || work.buffer_size - headerOffset < 8) return SCE_ACM_ERROR_BATCH_FULL; + work.offset += 8; + const auto available = input->availableBlocks; + const auto start = current >= blockCount ? current - blockCount : current; + std::uint64_t flags = 0; + std::uint32_t smallestBlockCount = blockCount; + for (std::uint32_t channel = 0; channel < channelCount; ++channel) { + const ReverbEntry inputEntry{input->history[channel]->samples, available, start * slotBytes, blockCount * slotBytes, nullptr, nullptr, nullptr, nullptr, 0.0f, wideSamples}; + flags |= std::uint64_t{1} << (wideSamples ? 21 : 20); + std::array entries{}; + std::uint32_t entryCount = 0; + for (std::uint32_t outputIndex = 0; outputIndex < outputCount; ++outputIndex) { + const auto* filter = filters[outputIndex]; + const auto* output = outputs[outputIndex]; + const auto filterChannels = filter->channelCount; + if (!filter->channels || !output || !output->workspace || !output->samples || filter->blockSize != blockSize || output->blockSize != blockSize || filterChannels == 0 || output->channelCount != std::max(channelCount, filterChannels)) return SCE_ACM_ERROR_BAD_POINTER; + if (filterChannels != channelCount && channelCount != 1 && filterChannels != 1) return SCE_ACM_ERROR_BAD_POINTER; + if (Address(filter->blockMetadata) & 3) return SCE_ACM_ERROR_ALIGNMENT; + if (filter->sampleFormat > 1) return SCE_ACM_ERROR_BAD_POINTER; + const bool wideFilter = filter->sampleFormat == 0; + flags |= (filterChannels != 1 && channelCount == 1 ? std::uint64_t{1} << 17 : 0) | (filterChannels == 1 && channelCount != 1 ? std::uint64_t{1} << 18 : 0) | (filterChannels == channelCount ? std::uint64_t{1} << 19 : 0) | (std::uint64_t{1} << (wideFilter ? 23 : 22)) | (filter->blockMetadata ? std::uint64_t{1} << 27 : 0) | (std::uint64_t{1} << (filterChannels == 1 ? 39 : (0x47 - std::countl_zero(filterChannels - 1)) & 63)); + smallestBlockCount = std::min(smallestBlockCount, filter->blockCount); + const auto first = filterChannels == channelCount ? channel : 0; + const auto last = filterChannels == channelCount ? channel + 1 : channelCount == 1 ? filterChannels : 1; + const auto length = std::min(available, filter->blockCount); + for (auto filterChannel = first; filterChannel < last; ++filterChannel) { + const auto outputChannel = channel - first + filterChannel; + const auto* block = filter->channels[filterChannel]; + if (!block || !block->samples || !output->workspace[outputChannel] || !output->samples[outputChannel]) return SCE_ACM_ERROR_BAD_POINTER; + if ((Address(block->blockMetadata) & 3) || ((Address(block->samples) | Address(output->workspace[outputChannel]) | Address(output->samples[outputChannel])) & 127)) return SCE_ACM_ERROR_ALIGNMENT; + if (block->blockMetadata) flags |= std::uint64_t{1} << 26; + entries[entryCount++] = {block->samples, length, 0, 0xFFFFFFFF, block->blockMetadata, filter->blockMetadata, output->workspace[outputChannel], output->samples[outputChannel], gains ? gains[outputIndex] : 1.0f, wideFilter}; + if (entryCount == entries.size()) { + if (const auto result = AppendReverbJob(work, blockSize, inputEntry, entries.data(), entryCount)) return result; + entryCount = 0; + } + } + } + if (entryCount) { + if (const auto result = AppendReverbJob(work, blockSize, inputEntry, entries.data(), entryCount)) return result; + } } - batch->offset = offset; + flags |= (std::uint64_t{std::min(outputCount - 1, 15u)} << 29) | (std::uint64_t{1} << ((64 - std::countl_zero(channelCount)) & 63)) | (std::uint64_t{std::min(smallestBlockCount, 7u)} << 45); + const std::uint64_t header = ((flags & 0xFFFF) ? std::uint64_t{1} << 63 : flags) | ((0x0B + static_cast(std::countr_zero(blockSize >> 7))) << 8); + std::memcpy(static_cast(work.buffer) + headerOffset, &header, sizeof(header)); + *batch = work; return 0; } +int APS5_VABI sceAcm_FFT(AcmBatchInfo* batch, std::int32_t transformSize, std::uint32_t transformCount, std::int32_t inputFormat, const void* const* inputs, std::int32_t outputFormat, void* const* outputs, std::int32_t flags) { + return EncodeTransforms(batch, false, transformSize, transformCount, inputFormat, inputs, outputFormat, outputs, flags); +} + int APS5_VABI sceAcm_Panner(AcmBatchInfo* batch, std::uint32_t sourceCount, const void* const* sources, std::uint32_t sourceMode, std::uint32_t outputMode, std::uint32_t channelCount, const void* const* sourceParameters, const void* const* sourceMatrices, const void* const* inputChannels, void* const* outputChannels) { if (!batch || sourceCount == 0 || sourceCount > 65535 || sourceMode > 2 || outputMode > 1 || channelCount == 0 || channelCount > 36 || !sources || !sourceParameters || !sourceMatrices || !outputChannels) return SCE_ACM_ERROR_BAD_POINTER; std::uintptr_t alignment = reinterpret_cast(sources) | reinterpret_cast(sourceParameters) | reinterpret_cast(sourceMatrices) | reinterpret_cast(inputChannels) | reinterpret_cast(outputChannels); @@ -204,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; } @@ -213,9 +414,8 @@ int APS5_VABI sceAcm_ConvReverb_SharedIr() { return 0; } -int APS5_VABI sceAcm_IFFT() { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI sceAcm_IFFT(AcmBatchInfo* batch, std::int32_t transformSize, std::uint32_t transformCount, std::int32_t inputFormat, const void* const* inputs, std::int32_t outputFormat, void* const* outputs, std::int32_t flags) { + return EncodeTransforms(batch, true, transformSize, transformCount, inputFormat, inputs, outputFormat, outputs, flags); } int APS5_VABI sceAcmBatchJobNotification() { @@ -224,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/Api.hpp b/core/libs/prx/libSceAcm/include/Api.hpp index c4da0653952f..c8a7005f2ebe 100644 --- a/core/libs/prx/libSceAcm/include/Api.hpp +++ b/core/libs/prx/libSceAcm/include/Api.hpp @@ -4,6 +4,18 @@ extern "C" { +int APS5_VABI sceAcmChain_Audio3dPO1_Clear(); +int APS5_VABI sceAcmChain_Audio3dPO1_RenderObject(); +int APS5_VABI sceAcmChain_Audio3dPO1_Activate(); +int APS5_VABI sceAcmChain_Audio3dPO1_Output(); +int APS5_VABI sceAcm_ConvReverb_SharedIr_2(); +int APS5_VABI sceAcmChain_Audio3dPO1_RenderAmbisonicsChannel(); +int APS5_VABI sceAcmChain_Audio3dPO2_Activate(); +int APS5_VABI sceAcmChain_Audio3dPO1_RenderPassthroughObject(); +int APS5_VABI sceAcmChain_Audio3dPO2_RenderDelay(); +int APS5_VABI sceAcmGetTelemetry(); +int APS5_VABI sceAcm_ConvReverb_SharedInput_2(); + int APS5_VABI sceAcmBatchStartBuffer(AcmContextId context, const void* batchCommands, size_t batchSize, AcmBatchError* batchError, AcmBatchId* batch); int APS5_VABI sceAcmBatchStartBuffers(AcmContextId context, uint32_t batchInfoCount, const AcmBatchInfo* const batch_info[], AcmBatchError* batchError, AcmBatchId* batch); int APS5_VABI sceAcmBatchWait(AcmContextId context, AcmBatchId batch, uint32_t timeout); @@ -14,7 +26,7 @@ int APS5_VABI sceAcm_FFT(AcmBatchInfo* batch, std::int32_t transformSize, std::u int APS5_VABI sceAcm_Panner(AcmBatchInfo* batch, std::uint32_t sourceCount, const void* const* sources, std::uint32_t sourceMode, std::uint32_t outputMode, std::uint32_t channelCount, const void* const* sourceParameters, const void* const* sourceMatrices, const void* const* inputChannels, void* const* outputChannels); int APS5_VABI sceAcmBatchJobPriority(AcmBatchInfo* batch, std::uint32_t priority); int APS5_VABI sceAcm_ConvReverb_SharedIr(); -int APS5_VABI sceAcm_IFFT(); +int APS5_VABI sceAcm_IFFT(AcmBatchInfo* batch, std::int32_t transformSize, std::uint32_t transformCount, std::int32_t inputFormat, const void* const* inputs, std::int32_t outputFormat, void* const* outputs, std::int32_t flags); int APS5_VABI sceAcmBatchJobNotification(); } diff --git a/core/libs/prx/libSceAcm/include/InventoryExports.hpp b/core/libs/prx/libSceAcm/include/InventoryExports.hpp new file mode 100644 index 000000000000..cfcc68f05fd1 --- /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 a8b95eefbf65..7ffc676d825b 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 9054c828baa0..86bcaacf4389 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 1e521cb6fa97..d273837962d2 100644 --- a/core/libs/prx/libSceAgcDriver/CMakeLists.txt +++ b/core/libs/prx/libSceAgcDriver/CMakeLists.txt @@ -306,6 +306,9 @@ set(agcDriverSources ${CMAKE_CURRENT_SOURCE_DIR}/Execution/src/ShaderMemory.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Execution/src/BdaFeatures.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Execution/src/SubgroupClock.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Execution/src/HostReport.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Execution/src/HostReportSources.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Execution/src/HostReportVulkan.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Execution/src/ShaderDeviceProfile.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Execution/src/Pm4.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Execution/src/SubmissionCapture.cpp @@ -318,6 +321,7 @@ set(agcDriverSources ${CMAKE_CURRENT_SOURCE_DIR}/Execution/src/PresentationPass.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Execution/src/PerformanceOverlay.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Execution/src/KeyboardOverlay.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Execution/src/PadStatusOverlay.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Execution/src/Screenshot.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Graphics/src/Draw.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Graphics/src/DepthSurface.cpp @@ -435,215 +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_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_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() @@ -652,872 +453,18 @@ 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_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) -set(agcSampleLodShaderHeader ${agcTestShaderGeneratedRoot}/SampleLod_spv.h) -add_custom_command( - OUTPUT "${agcSampleLodShaderHeader}" - COMMAND ${CMAKE_COMMAND} -E make_directory "${agcTestShaderGeneratedRoot}" - COMMAND "$" -V --target-env vulkan1.1 -o "${agcSampleLodShaderSpv}" "${agcSampleLodShaderSource}" - COMMAND ${CMAKE_COMMAND} -DINPUT=${agcSampleLodShaderSpv} -DOUTPUT=${agcSampleLodShaderHeader} - -DSYMBOL=SAMPLE_LOD_SPV -P "${CMAKE_CURRENT_SOURCE_DIR}/embed_spirv.cmake" - DEPENDS "${agcSampleLodShaderSource}" glslang-standalone - VERBATIM +set(agcSampleLodShaderSource ${CMAKE_CURRENT_SOURCE_DIR}/tests/shaders/SampleLod.comp) +set(agcTestShaderGeneratedRoot ${CMAKE_CURRENT_BINARY_DIR}/generated-tests) +set(agcSampleLodShaderSpv ${agcTestShaderGeneratedRoot}/SampleLod.spv) +set(agcSampleLodShaderHeader ${agcTestShaderGeneratedRoot}/SampleLod_spv.h) +add_custom_command( + OUTPUT "${agcSampleLodShaderHeader}" + COMMAND ${CMAKE_COMMAND} -E make_directory "${agcTestShaderGeneratedRoot}" + COMMAND "$" -V --target-env vulkan1.1 -o "${agcSampleLodShaderSpv}" "${agcSampleLodShaderSource}" + COMMAND ${CMAKE_COMMAND} -DINPUT=${agcSampleLodShaderSpv} -DOUTPUT=${agcSampleLodShaderHeader} + -DSYMBOL=SAMPLE_LOD_SPV -P "${CMAKE_CURRENT_SOURCE_DIR}/embed_spirv.cmake" + DEPENDS "${agcSampleLodShaderSource}" glslang-standalone + VERBATIM ) set(agcSampleArrayShaderSource ${CMAKE_CURRENT_SOURCE_DIR}/tests/shaders/SampleArray.comp) @@ -1529,712 +476,54 @@ add_custom_command( COMMAND "$" -V --target-env vulkan1.1 -o "${agcSampleArrayShaderSpv}" "${agcSampleArrayShaderSource}" COMMAND ${CMAKE_COMMAND} -DINPUT=${agcSampleArrayShaderSpv} -DOUTPUT=${agcSampleArrayShaderHeader} -DSYMBOL=SAMPLE_ARRAY_SPV -P "${CMAKE_CURRENT_SOURCE_DIR}/embed_spirv.cmake" - DEPENDS "${agcSampleArrayShaderSource}" glslang-standalone - VERBATIM -) - -foreach(agcTriangleStage IN ITEMS vert frag) - set(agcTriangleSource ${CMAKE_CURRENT_SOURCE_DIR}/tests/shaders/Triangle.${agcTriangleStage}) - set(agcTriangleSpv ${agcTestShaderGeneratedRoot}/Triangle_${agcTriangleStage}.spv) - set(agcTriangleHeader ${agcTestShaderGeneratedRoot}/Triangle_${agcTriangleStage}_spv.h) - add_custom_command( - OUTPUT "${agcTriangleHeader}" - COMMAND ${CMAKE_COMMAND} -E make_directory "${agcTestShaderGeneratedRoot}" - COMMAND "$" -V --target-env vulkan1.1 -o "${agcTriangleSpv}" "${agcTriangleSource}" - COMMAND ${CMAKE_COMMAND} -DINPUT=${agcTriangleSpv} -DOUTPUT=${agcTriangleHeader} - -DSYMBOL=TRIANGLE_${agcTriangleStage}_SPV -P "${CMAKE_CURRENT_SOURCE_DIR}/embed_spirv.cmake" - DEPENDS "${agcTriangleSource}" glslang-standalone - VERBATIM - ) - list(APPEND agcTriangleHeaders "${agcTriangleHeader}") -endforeach() - -foreach(agcCoverStage IN ITEMS vert frag) - string(TOUPPER "${agcCoverStage}" agcCoverSymbol) - set(agcCoverShaderSpv ${agcTestShaderGeneratedRoot}/Cover_${agcCoverStage}.spv) - set(agcCoverShaderHeader ${agcTestShaderGeneratedRoot}/Cover_${agcCoverStage}_spv.h) - add_custom_command( - OUTPUT "${agcCoverShaderHeader}" - COMMAND ${CMAKE_COMMAND} -E make_directory "${agcTestShaderGeneratedRoot}" - COMMAND "$" -V --target-env vulkan1.1 -o "${agcCoverShaderSpv}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/shaders/Cover.${agcCoverStage}" - COMMAND ${CMAKE_COMMAND} -DINPUT=${agcCoverShaderSpv} -DOUTPUT=${agcCoverShaderHeader} - -DSYMBOL=COVER_${agcCoverSymbol}_SPV -P "${CMAKE_CURRENT_SOURCE_DIR}/embed_spirv.cmake" - DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/tests/shaders/Cover.${agcCoverStage}" glslang-standalone - VERBATIM - ) - 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) -add_custom_command( - OUTPUT "${agcBufferUpdateHeader}" - COMMAND ${CMAKE_COMMAND} -E make_directory "${agcTestShaderGeneratedRoot}" - COMMAND "$" -V --target-env vulkan1.1 -o "${agcBufferUpdateSpv}" "${agcBufferUpdateSource}" - COMMAND ${CMAKE_COMMAND} -DINPUT=${agcBufferUpdateSpv} -DOUTPUT=${agcBufferUpdateHeader} - -DSYMBOL=BUFFER_UPDATE_SPV -P "${CMAKE_CURRENT_SOURCE_DIR}/embed_spirv.cmake" - DEPENDS "${agcBufferUpdateSource}" glslang-standalone - 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") - 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_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_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_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_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_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_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_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_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() + DEPENDS "${agcSampleArrayShaderSource}" glslang-standalone + VERBATIM +) -set_target_properties(agc_driver_graphics_tests PROPERTIES CXX_EXTENSIONS OFF) -configure_windows_unwind(agc_driver_graphics_tests) +foreach(agcTriangleStage IN ITEMS vert frag) + set(agcTriangleSource ${CMAKE_CURRENT_SOURCE_DIR}/tests/shaders/Triangle.${agcTriangleStage}) + set(agcTriangleSpv ${agcTestShaderGeneratedRoot}/Triangle_${agcTriangleStage}.spv) + set(agcTriangleHeader ${agcTestShaderGeneratedRoot}/Triangle_${agcTriangleStage}_spv.h) + add_custom_command( + OUTPUT "${agcTriangleHeader}" + COMMAND ${CMAKE_COMMAND} -E make_directory "${agcTestShaderGeneratedRoot}" + COMMAND "$" -V --target-env vulkan1.1 -o "${agcTriangleSpv}" "${agcTriangleSource}" + COMMAND ${CMAKE_COMMAND} -DINPUT=${agcTriangleSpv} -DOUTPUT=${agcTriangleHeader} + -DSYMBOL=TRIANGLE_${agcTriangleStage}_SPV -P "${CMAKE_CURRENT_SOURCE_DIR}/embed_spirv.cmake" + DEPENDS "${agcTriangleSource}" glslang-standalone + VERBATIM + ) + list(APPEND agcTriangleHeaders "${agcTriangleHeader}") +endforeach() -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} +foreach(agcCoverStage IN ITEMS vert frag) + string(TOUPPER "${agcCoverStage}" agcCoverSymbol) + set(agcCoverShaderSpv ${agcTestShaderGeneratedRoot}/Cover_${agcCoverStage}.spv) + set(agcCoverShaderHeader ${agcTestShaderGeneratedRoot}/Cover_${agcCoverStage}_spv.h) + add_custom_command( + OUTPUT "${agcCoverShaderHeader}" + COMMAND ${CMAKE_COMMAND} -E make_directory "${agcTestShaderGeneratedRoot}" + COMMAND "$" -V --target-env vulkan1.1 -o "${agcCoverShaderSpv}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/shaders/Cover.${agcCoverStage}" + COMMAND ${CMAKE_COMMAND} -DINPUT=${agcCoverShaderSpv} -DOUTPUT=${agcCoverShaderHeader} + -DSYMBOL=COVER_${agcCoverSymbol}_SPV -P "${CMAKE_CURRENT_SOURCE_DIR}/embed_spirv.cmake" + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/tests/shaders/Cover.${agcCoverStage}" glslang-standalone + VERBATIM + ) + list(APPEND agcCoverShaderHeaders ${agcCoverShaderHeader}) +endforeach() + +set(agcBufferUpdateSource ${CMAKE_CURRENT_SOURCE_DIR}/tests/shaders/BufferUpdate.comp) +set(agcBufferUpdateSpv ${agcTestShaderGeneratedRoot}/BufferUpdate.spv) +set(agcBufferUpdateHeader ${agcTestShaderGeneratedRoot}/BufferUpdate_spv.h) +add_custom_command( + OUTPUT "${agcBufferUpdateHeader}" + COMMAND ${CMAKE_COMMAND} -E make_directory "${agcTestShaderGeneratedRoot}" + COMMAND "$" -V --target-env vulkan1.1 -o "${agcBufferUpdateSpv}" "${agcBufferUpdateSource}" + COMMAND ${CMAKE_COMMAND} -DINPUT=${agcBufferUpdateSpv} -DOUTPUT=${agcBufferUpdateHeader} + -DSYMBOL=BUFFER_UPDATE_SPV -P "${CMAKE_CURRENT_SOURCE_DIR}/embed_spirv.cmake" + DEPENDS "${agcBufferUpdateSource}" glslang-standalone + VERBATIM ) -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}") @@ -2253,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) @@ -2325,591 +557,114 @@ foreach(agcExecutionTestSource IN LISTS agcExecutionTestSources) string(REGEX REPLACE "([a-z0-9])([A-Z])" "\\1_\\2" agcExecutionTestName "${agcExecutionTestName}") string(TOLOWER "agc_driver_${agcExecutionTestName}_tests" agcExecutionTest) add_test_executable(${agcExecutionTest} EXCLUDE_FROM_ALL ${agcExecutionTestSource}) - target_include_directories(${agcExecutionTest} PRIVATE - ${LIBS_INCLUDE_DIR} - $ - ${CMAKE_SOURCE_DIR}/core/shader/recompiler - ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} - ${ANYPS5_SPIRV_HEADERS_INCLUDE_DIR} - ) - target_link_libraries(${agcExecutionTest} PRIVATE libSceAgcDriver SDL2-static libc) - set_target_properties(${agcExecutionTest} PROPERTIES CXX_EXTENSIONS OFF) - configure_windows_unwind(${agcExecutionTest}) - if(agcExecutionTests) - list(GET agcExecutionTests 0 agcExecutionPchTarget) - target_precompile_headers(${agcExecutionTest} REUSE_FROM ${agcExecutionPchTarget}) - else() - target_precompile_headers(${agcExecutionTest} PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/tests/execution/VulkanTestDevice.hpp - ) - endif() - if(CMAKE_CXX_COMPILER_LAUNCHER MATCHES "ccache") - set_target_properties(${agcExecutionTest} PROPERTIES CXX_COMPILER_LAUNCHER - "${CMAKE_COMMAND};-E;env;CCACHE_SLOPPINESS=pch_defines,time_macros;${CMAKE_CXX_COMPILER_LAUNCHER}") - endif() - list(APPEND agcExecutionTests ${agcExecutionTest}) -endforeach() -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() -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 $) - -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_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:$") + target_include_directories(${agcExecutionTest} PRIVATE + ${LIBS_INCLUDE_DIR} + $ + ${CMAKE_SOURCE_DIR}/core/shader/recompiler + ${ANYPS5_VULKAN_HEADERS_INCLUDE_DIR} + ${ANYPS5_SPIRV_HEADERS_INCLUDE_DIR} + ) + target_link_libraries(${agcExecutionTest} PRIVATE libSceAgcDriver SDL2-static libc) + set_target_properties(${agcExecutionTest} PROPERTIES CXX_EXTENSIONS OFF) + configure_windows_unwind(${agcExecutionTest}) + if(agcExecutionTests) + list(GET agcExecutionTests 0 agcExecutionPchTarget) + target_precompile_headers(${agcExecutionTest} REUSE_FROM ${agcExecutionPchTarget}) + else() + target_precompile_headers(${agcExecutionTest} PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/tests/execution/VulkanTestDevice.hpp + ) 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:$") + if(CMAKE_CXX_COMPILER_LAUNCHER MATCHES "ccache") + set_target_properties(${agcExecutionTest} PROPERTIES CXX_COMPILER_LAUNCHER + "${CMAKE_COMMAND};-E;env;CCACHE_SLOPPINESS=pch_defines,time_macros;${CMAKE_CXX_COMPILER_LAUNCHER}") 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) + 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(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:$") + set_tests_properties(${agcTestName} 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) +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(agc_shader_quad_mask_no_demote PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + set_tests_properties(${agcTestName}_draw_pipeline 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:$") +endfunction() + +function(agc_add_spirv_mode_tests agcTest) + if(NOT TARGET ${agcTest}) + return() 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() + 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() - 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") + 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:$") + "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:$") +endfunction() + +if(BUILD_TESTING) + 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() - 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() + +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() - 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) +endforeach() +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) + +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) + 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) 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 + 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() - 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) +endif() + +if(BUILD_TESTING) if(Python3_Interpreter_FOUND) set(housekeepingModes plain) if(WIN32) @@ -2928,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) @@ -2954,269 +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) - set_tests_properties(agc_address_copy_cap agc_address_copy_cap_remembered PROPERTIES TIMEOUT 30) - if(WIN32) - set_tests_properties(agc_address_copy_cap agc_address_copy_cap_remembered 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}") @@ -3226,7 +709,7 @@ if(BUILD_TESTING) set_tests_properties(${agcGuestMemoryLifetimeTests} PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") endif() - if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" AND Python3_Interpreter_FOUND) + if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" AND Python3_Interpreter_FOUND AND ANYPS5_RELINKER_CLI) add_library(agc_guest_memory_lifetime_fixture SHARED tests/GuestMemoryLifetimeFixture.cpp) target_include_directories(agc_guest_memory_lifetime_fixture PRIVATE ${LIBS_INCLUDE_DIR} @@ -3238,308 +721,16 @@ 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) - 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 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 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) - 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 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_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) - 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}") if(WIN32) - set_tests_properties(${partialStoreTest} PROPERTIES ENVIRONMENT_MODIFICATION - "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:$") + set_tests_properties(${partialStoreTest} 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 @@ -3650,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 @@ -3717,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} @@ -3824,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/CompileBudget.hpp b/core/libs/prx/libSceAgcDriver/Execution/include/CompileBudget.hpp new file mode 100644 index 000000000000..1c9913e331fb --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/Execution/include/CompileBudget.hpp @@ -0,0 +1,77 @@ +#ifndef CORE_LIBS_PRX_LIBSCEAGCDRIVER_EXECUTION_INCLUDE_COMPILEBUDGET_HPP +#define CORE_LIBS_PRX_LIBSCEAGCDRIVER_EXECUTION_INCLUDE_COMPILEBUDGET_HPP + +#include +#include +#include +#include + +namespace AgcDriver { + +class CompileBudget { +public: + class Hold { + public: + Hold(CompileBudget& budget, std::uint64_t bytes) : budget(budget), bytes(bytes) { + std::unique_lock lock(budget.mutex); + if (bytes > budget.limit) { + ++budget.waitingAlone; + budget.released.wait(lock, [&] { return budget.held == 0; }); + --budget.waitingAlone; + } else { + budget.released.wait(lock, [&] { return budget.waitingAlone == 0 && budget.held + bytes <= budget.limit; }); + } + budget.held += bytes; + if (budget.held > budget.peak) budget.peak = budget.held; + } + + ~Hold() { + { + std::lock_guard lock(budget.mutex); + budget.held -= bytes; + } + budget.released.notify_all(); + } + + Hold(const Hold&) = delete; + Hold& operator=(const Hold&) = delete; + + private: + CompileBudget& budget; + std::uint64_t bytes; + }; + + explicit CompileBudget(std::uint64_t limit) : limit(limit) {} + + std::uint64_t Peak() const { + std::lock_guard lock(mutex); + return peak; + } + + std::uint64_t WaitingAlone() const { + std::lock_guard lock(mutex); + return waitingAlone; + } + +private: + mutable std::mutex mutex; + std::condition_variable released; + std::uint64_t limit; + std::uint64_t held = 0; + std::uint64_t peak = 0; + std::uint64_t waitingAlone = 0; +}; + +inline std::uint64_t BackgroundCompileLimitFor(const char* configured) { + constexpr std::uint64_t automaticKiB = 8192; + return (configured != nullptr ? std::strtoull(configured, nullptr, 10) : automaticKiB) * 1024u; +} + +inline CompileBudget& BackgroundCompileBudget() { + static CompileBudget budget(BackgroundCompileLimitFor(std::getenv("APS5_BACKGROUND_COMPILE_KIB"))); + return budget; +} + +} + +#endif 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 5f3df6c538af..b65f22d0d11a 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 7ae26d17b27e..e486345e111e 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 2e917bcbbb63..3e1af24b666a 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 @@ class Driver { 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(); @@ -178,6 +182,7 @@ class Driver { static bool registerKeyEnabled(); static bool verifyDrawRecipe(); static std::size_t drawCacheEntries(); + static bool drawCacheIndirect(); void accountDrawVariant(const DispatchVariant& variant, bool added); void insertDrawEntry(std::uint64_t key, std::vector>& fresh, std::shared_ptr decode, std::uint64_t shape = 0, bool replaceShape = false); bool admitDrawKey(std::uint64_t key, std::uint64_t shape); @@ -193,8 +198,6 @@ class Driver { 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(); @@ -217,7 +220,10 @@ class Driver { static PendingDrawPhases& pendingDrawPhases(); void addDrawPhases(const std::array& ms, bool drawn, std::uint64_t captures); void noteLabelStore(std::uint64_t address, std::span bytes, std::uint64_t stamp, std::uint32_t queue); - bool storedSince(std::span packet, std::uint64_t address, std::size_t bytes, std::uint64_t received, std::uint32_t* writer = nullptr); + 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(); static std::size_t& writeCursor(); @@ -458,6 +464,7 @@ class Driver { AgcDriver::Mutex labelStoresMutex; std::unordered_map> labelStores; + 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 0c19b88668ef..16dbff7bac40 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,10 @@ 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(); unsigned RegistrationPreparationThreads(); 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 000000000000..eff8338f785f --- /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/HostReport.hpp b/core/libs/prx/libSceAgcDriver/Execution/include/HostReport.hpp new file mode 100644 index 000000000000..398950a79423 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/Execution/include/HostReport.hpp @@ -0,0 +1,84 @@ +#ifndef CORE_LIBS_PRX_LIBSCEAGCDRIVER_EXECUTION_INCLUDE_HOSTREPORT_HPP +#define CORE_LIBS_PRX_LIBSCEAGCDRIVER_EXECUTION_INCLUDE_HOSTREPORT_HPP + +#include +#include +#include +#include +#include +#include + +namespace AgcDriver { + +struct HostRequirement { + std::string name; + std::string kind; + bool required = false; + bool present = false; +}; + +struct HostGpuFacts { + std::string name; + std::string type; + std::string driverName; + std::string driverInfo; + std::uint32_t vendorId = 0; + std::uint32_t deviceId = 0; + std::uint32_t apiVersion = 0; + std::uint32_t driverVersion = 0; + std::uint32_t subgroupSize = 0; + std::uint64_t deviceLocalMiB = 0; + std::vector candidates; + std::vector presentModes; + std::string requestedPresentMode; + std::vector requirements; +}; + +struct HostShaderCacheFacts { + bool enabled = false; + bool present = false; + std::uint64_t sizeMiB = 0; +}; + +struct HostFacts { + std::string commit; + std::optional os; + std::optional cpuModel; + std::optional cpuThreads; + std::optional memoryMiB; + std::optional> cpuMissing; + std::optional sdlLinked; + std::optional sdlCompiled; + std::optional gpu; + std::optional shaderCache; + std::vector> environment; + std::vector redactions; + std::vector unavailable; +}; + +struct HostSources { + std::string commit; + std::function os; + std::function cpuModel; + std::function cpuThreads; + std::function memoryMiB; + std::function()> cpuMissing; + std::function sdlLinked; + std::function sdlCompiled; + std::function shaderCache; + std::function()> environment; + std::function()> redactions; +}; + +HostFacts CollectHostFacts(const HostSources& sources); +std::vector> FilterHostEnvironment(const std::vector& entries); +std::vector HostRedactionNames(const std::string& user, const std::string& hostName, const std::string& homeDirectory); +std::vector MissingRequirements(const HostGpuFacts& gpu); +std::string DescribeMissingRequirements(const HostGpuFacts& gpu, const std::vector& redactions = {}); +bool ParseHostReportSetting(const char* value); +std::string RedactHostText(const std::string& text, const std::vector& names = {}); +std::string FormatHostReport(const HostFacts& facts); + +} + +#endif diff --git a/core/libs/prx/libSceAgcDriver/Execution/include/HostReportSources.hpp b/core/libs/prx/libSceAgcDriver/Execution/include/HostReportSources.hpp new file mode 100644 index 000000000000..660b57dbdee6 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/Execution/include/HostReportSources.hpp @@ -0,0 +1,12 @@ +#ifndef CORE_LIBS_PRX_LIBSCEAGCDRIVER_EXECUTION_INCLUDE_HOSTREPORTSOURCES_HPP +#define CORE_LIBS_PRX_LIBSCEAGCDRIVER_EXECUTION_INCLUDE_HOSTREPORTSOURCES_HPP + +#include "prx/libSceAgcDriver/Execution/include/HostReport.hpp" + +namespace AgcDriver { + +HostSources SystemHostSources(); + +} + +#endif diff --git a/core/libs/prx/libSceAgcDriver/Execution/include/HostReportVulkan.hpp b/core/libs/prx/libSceAgcDriver/Execution/include/HostReportVulkan.hpp new file mode 100644 index 000000000000..f43c582ba637 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/Execution/include/HostReportVulkan.hpp @@ -0,0 +1,28 @@ +#ifndef CORE_LIBS_PRX_LIBSCEAGCDRIVER_EXECUTION_INCLUDE_HOSTREPORTVULKAN_HPP +#define CORE_LIBS_PRX_LIBSCEAGCDRIVER_EXECUTION_INCLUDE_HOSTREPORTVULKAN_HPP + +#include "prx/libSceAgcDriver/Execution/include/HostReport.hpp" +#include +#include +#include +#include + +namespace AgcDriver { + +struct HostGpuQuery { + PFN_vkGetInstanceProcAddr instanceProc = nullptr; + VkInstance instance = VK_NULL_HANDLE; + VkPhysicalDevice physical = VK_NULL_HANDLE; + VkSurfaceKHR surface = VK_NULL_HANDLE; + bool presentation = false; + std::uint32_t subgroupSize = 0; + std::span extensions; + std::vector candidates; + const char* requestedPresentMode = nullptr; +}; + +HostGpuFacts CollectHostGpuFacts(const HostGpuQuery& query); + +} + +#endif diff --git a/core/libs/prx/libSceAgcDriver/Execution/include/KeyboardOverlay.hpp b/core/libs/prx/libSceAgcDriver/Execution/include/KeyboardOverlay.hpp index 70c7c2d92da8..3553ee0cb9dc 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/include/KeyboardOverlay.hpp +++ b/core/libs/prx/libSceAgcDriver/Execution/include/KeyboardOverlay.hpp @@ -5,10 +5,13 @@ #include #include "prx/libSceAgcDriver/Execution/include/PerformanceOverlay.hpp" #include "prx/libSceIme/include/ImeKeyboardView.hpp" +#include "prx/libSceIme/include/ModalDialog.hpp" #include #include #include #include +#include +#include namespace AgcDriver { @@ -27,6 +30,19 @@ struct KeyboardMetrics { static constexpr std::int32_t LinesPerScale = 360; }; +struct DialogMetrics { + static constexpr std::int32_t MaxColumns = 36; + static constexpr std::int32_t MaxLines = 8; + static constexpr std::int32_t LineHeight = KeyboardMetrics::GlyphHeight + KeyboardMetrics::LineGap; + static constexpr std::int32_t Padding = 6; + static constexpr std::int32_t MessageGap = 8; + static constexpr std::int32_t ButtonHeight = 17; + static constexpr std::int32_t ButtonInset = 6; + static constexpr std::int32_t ButtonGap = 4; + static constexpr std::int32_t ButtonMinWidth = 36; + static constexpr std::int32_t ButtonMaxColumns = 16; +}; + using KeyboardGlyphRows = std::array; struct KeyboardGlyphEntry { @@ -45,6 +61,11 @@ std::int32_t KeyboardPanelHeight(const ImeKeyboardView& view); std::int32_t KeyboardScale(VkExtent2D extent, const ImeKeyboardView& view); OverlayLayout LayOutKeyboard(const ImeKeyboardView& view, VkExtent2D extent); std::optional SystemOverlayView(); +std::vector WrapDialogMessage(const std::u16string& message, std::size_t columns, std::size_t maxLines); +std::int32_t DialogScale(VkExtent2D extent, const ModalDialogView& view); +OverlayLayout LayOutDialog(const ModalDialogView& view, VkExtent2D extent); +std::optional SystemDialogView(); +std::optional SystemOverlayLayout(VkExtent2D extent); } diff --git a/core/libs/prx/libSceAgcDriver/Execution/include/PadStatus.hpp b/core/libs/prx/libSceAgcDriver/Execution/include/PadStatus.hpp new file mode 100644 index 000000000000..7d9777f3abba --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/Execution/include/PadStatus.hpp @@ -0,0 +1,39 @@ +#ifndef CORE_LIBS_PRX_LIBSCEAGCDRIVER_EXECUTION_INCLUDE_PADSTATUS_HPP +#define CORE_LIBS_PRX_LIBSCEAGCDRIVER_EXECUTION_INCLUDE_PADSTATUS_HPP + +#include +#include +#include +#include +#include + +namespace AgcDriver { + +inline constexpr std::size_t PadStatusSlots = 4; + +enum class PadKind : std::uint8_t { Unknown, DualSense, DualShock4, DualShock3, Xbox, Switch, Other }; + +enum class PadPower : std::uint8_t { Unknown, Empty, Low, Medium, Full, Wired }; + +struct PadSlotStatus { + bool connected = false; + PadKind kind = PadKind::Unknown; + std::string name; + PadPower power = PadPower::Unknown; + + bool operator==(const PadSlotStatus&) const = default; +}; + +struct PadStatusSnapshot { + std::array slots; + + bool operator==(const PadStatusSnapshot&) const = default; +}; + +struct PadStatusProvider { + std::function read; +}; + +} + +#endif diff --git a/core/libs/prx/libSceAgcDriver/Execution/include/PadStatusOverlay.hpp b/core/libs/prx/libSceAgcDriver/Execution/include/PadStatusOverlay.hpp new file mode 100644 index 000000000000..a184bc26fd9c --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/Execution/include/PadStatusOverlay.hpp @@ -0,0 +1,61 @@ +#ifndef CORE_LIBS_PRX_LIBSCEAGCDRIVER_EXECUTION_INCLUDE_PADSTATUSOVERLAY_HPP +#define CORE_LIBS_PRX_LIBSCEAGCDRIVER_EXECUTION_INCLUDE_PADSTATUSOVERLAY_HPP + +#define VK_NO_PROTOTYPES +#include +#include "prx/libSceAgcDriver/Execution/include/PadStatus.hpp" +#include "prx/libSceAgcDriver/Execution/include/PerformanceOverlay.hpp" +#include +#include +#include +#include +#include +#include +#include +#include + +namespace AgcDriver { + +enum class PadStatusMode : std::uint8_t { Off, Events }; + +struct PadStatusMetrics { + static constexpr std::int32_t Columns = 32; + static constexpr std::int32_t KindColumns = 12; +}; + +PadStatusMode ParsePadStatusMode(const char* value); +std::string FormatPadStatusLine(std::size_t slot, const PadSlotStatus& status); +OverlayCorner PadStatusCorner(OverlayCorner overlay); +OverlayContent ComposePadStatus(const std::vector& lines); +OverlayLayout LayOutPadStatus(const std::vector& lines, VkExtent2D extent, OverlayCorner overlay); +bool PadStatusDrawn(bool visible, bool keyboardShown); +std::optional> PadStatusOverlayLines(); + +class PadStatusDisplay { +public: + using Clock = std::chrono::steady_clock; + static constexpr Clock::duration Duration = std::chrono::seconds(4); + + explicit PadStatusDisplay(PadStatusMode mode); + + bool Observe(Clock::time_point now, const PadStatusSnapshot& snapshot); + void Request(Clock::time_point now); + bool Visible(Clock::time_point now) const; + bool Wants(Clock::time_point now) const; + bool Poll(Clock::time_point now, const PadStatusProvider& provider); + std::vector Lines() const; + +private: + PadStatusMode mode; + std::optional previous; + std::array seen{}; + std::optional shownUntil; + std::optional polled; +}; + +} + +extern "C" void AgcDriverPadStatusPoll_nid_postfix(const AgcDriver::PadStatusProvider* provider); +extern "C" void AgcDriverPadStatusShow_nid_postfix(); + +#endif diff --git a/core/libs/prx/libSceAgcDriver/Execution/include/Presentation.hpp b/core/libs/prx/libSceAgcDriver/Execution/include/Presentation.hpp index daab2de00e86..0fa05f84897f 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/include/Presentation.hpp +++ b/core/libs/prx/libSceAgcDriver/Execution/include/Presentation.hpp @@ -10,6 +10,7 @@ #include "prx/libSceAgcDriver/Execution/include/DisplayBuffer.hpp" struct ImeKeyboardView; +struct ModalDialogView; namespace AgcDriver { @@ -33,6 +34,7 @@ extern "C" void AgcDriverPresentBuffer_nid_postfix(const AgcDriver::Presentation extern "C" void AgcDriverReleaseWindow_nid_postfix(void* window); extern "C" void AgcDriverTogglePerformanceOverlay_nid_postfix(); extern "C" void AgcDriverSetSystemOverlay_nid_postfix(const ImeKeyboardView* view); +extern "C" void AgcDriverSetSystemDialog_nid_postfix(const ModalDialogView* view); extern "C" void AgcDriverReportFailure_nid_postfix(std::exception_ptr error); #endif diff --git a/core/libs/prx/libSceAgcDriver/Execution/include/ShaderMemory.hpp b/core/libs/prx/libSceAgcDriver/Execution/include/ShaderMemory.hpp index 269104b0bca8..f0edd61fd1e8 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/include/ShaderMemory.hpp +++ b/core/libs/prx/libSceAgcDriver/Execution/include/ShaderMemory.hpp @@ -87,6 +87,7 @@ class ShaderMemory { }; 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 @@ class ShaderMemory { 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 1b61253b6f30..708765ac4e94 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 @@ class VulkanDevice { // 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 @@ class VulkanDevice { // 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 @@ class VulkanDevice { // 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/include/WriteWatchCoverage.hpp b/core/libs/prx/libSceAgcDriver/Execution/include/WriteWatchCoverage.hpp index 22865df48768..9dac933a1c15 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/include/WriteWatchCoverage.hpp +++ b/core/libs/prx/libSceAgcDriver/Execution/include/WriteWatchCoverage.hpp @@ -2,6 +2,7 @@ #define CORE_LIBS_PRX_LIBSCEAGCDRIVER_EXECUTION_INCLUDE_WRITEWATCHCOVERAGE_HPP #include +#include #include #include #include @@ -42,14 +43,18 @@ class WriteWatchCoverage { std::size_t first = 0; std::size_t last = 0; if (!excludedBlocks(address, bytes, first, last)) return false; + const auto offset = std::max(address, base) - base; + const auto firstPage = offset / PageBytes; + const auto endPage = (std::min(address + bytes - base, size) + PageBytes - 1) / PageBytes; bool changed = false; for (auto block = first; block <= last; ++block) { - const auto pages = (std::min(BlockBytes, size - block * BlockBytes) + PageBytes - 1) / PageBytes; - const auto mask = pageMask(0, pages); - changed = changed || excluded[block] != mask; - auto& stamp = excludedGenerations[block]; - stamp = std::max(stamp, std::max(generation, 1)); - excluded[block] = mask; + const auto from = block == first ? firstPage % PagesPerBlock : 0; + const auto to = block == last ? (endPage - 1) % PagesPerBlock + 1 : PagesPerBlock; + const auto mask = pageMask(from, to); + changed = changed || (excluded[block] & mask) != mask; + auto& stamps = excludedGenerations[block]; + for (auto page = from; page < to; ++page) stamps[page] = std::max(stamps[page], std::max(generation, 1)); + excluded[block] |= mask; } return changed; } @@ -72,12 +77,17 @@ class WriteWatchCoverage { const auto last = (endPage - 1) / PagesPerBlock; bool changed = false; for (auto block = first; block <= last; ++block) { - const auto mask = pageMask(block == first ? firstPage % PagesPerBlock : 0, block == last ? (endPage - 1) % PagesPerBlock + 1 : PagesPerBlock); - if ((excluded[block] & mask) != 0 && excludedGenerations.at(block) < generation) { + const auto from = block == first ? firstPage % PagesPerBlock : 0; + const auto to = block == last ? (endPage - 1) % PagesPerBlock + 1 : PagesPerBlock; + if ((excluded[block] & pageMask(from, to)) == 0) continue; + const auto& stamps = excludedGenerations.at(block); + for (auto page = from; page < to; ++page) { + const auto bit = static_cast(1u << page); + if ((excluded[block] & bit) == 0 || stamps[page] >= generation) continue; + excluded[block] &= static_cast(~bit); changed = true; - excluded[block] &= static_cast(~mask); - if (excluded[block] == 0) excludedGenerations.erase(block); } + if (excluded[block] == 0) excludedGenerations.erase(block); } return changed; } @@ -106,7 +116,7 @@ class WriteWatchCoverage { std::uint64_t base = 0; std::size_t size = 0; std::vector excluded; - std::unordered_map excludedGenerations; + std::unordered_map> excludedGenerations; }; } 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 ac5747f9149d..c443f794921e 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; @@ -437,7 +442,7 @@ void Driver::dispatch(QueueState& queue, std::span packet, ++groupStats.resolved; if (cached) ++groupStats.resolvedHits; if (!cached && compiledResult != nullptr && !localDevice->HasComputePipeline(*compiledResult)) { - SubmitLibraryPrebuild([localDevice, compiledResult, address] { + SubmitComputePrebuild([localDevice, compiledResult, address] { try { localDevice->PrebuildComputePipeline(*compiledResult, address); } catch (const std::exception&) {} }); } @@ -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 10ccca5989bc..04568afd5b4a 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/DrawCache.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCache.cpp index c42ca7d2e494..02fc76119eb5 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCache.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCache.cpp @@ -74,6 +74,11 @@ std::uint64_t Driver::DrawCacheBytes() { return bytes; } +bool Driver::drawCacheIndirect() { + static const bool indirect = std::getenv("APS5_DRAW_CACHE_INDIRECT") != nullptr; + return indirect; +} + void Driver::accountDrawVariant(const DispatchVariant& variant, bool added) { if (added) { ++drawCacheVariants; 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 6697f87de71c..c33af99f90d5 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCapture.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCapture.cpp @@ -210,7 +210,7 @@ void Driver::recordStageDataPositions(DispatchVariant& variant, const ShaderReco } void Driver::cacheDrawStages(bool useDrawEntries, bool drawHit, const Pm4::DrawParameters& drawParameters, const std::optional& indirectCpu, const std::vector& programs, const std::vector& stageCaptures, const std::vector>& vertexInfos, const std::vector>& decodeReads, bool verifyHit, const std::vector>& matched, const std::vector& stageData, std::vector>& fresh, std::uint64_t drawKey, bool registerKey, const std::shared_ptr& decode, DrawPhaseTiming& phaseTiming, const std::vector& reused, const std::shared_ptr& entry, std::uint64_t shapeKey, bool shapeNeedsEntry) { - const bool cacheable = useDrawEntries && !drawHit && !(drawParameters.indirect && indirectCpu); + const bool cacheable = useDrawEntries && !drawHit && (drawCacheIndirect() || !(drawParameters.indirect && indirectCpu)); const bool admitted = cacheable && (verifyHit || admitDrawKey(drawKey, registerKey && drawDataHits() ? shapeKey : 0)); const bool replaceShape = cacheable && !admitted && shapeNeedsEntry; if (admitted || replaceShape) { @@ -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/DrawDecode.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawDecode.cpp index 11b89fe3d7ff..5438da0a53c8 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawDecode.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawDecode.cpp @@ -194,7 +194,7 @@ std::shared_ptr Driver::decodeDraw(const QueueState& queue, const Su product->pixel.targetExportPacking = Graphics::ExportPackings(product->state); product->pixel.dualSourceBlend = product->state.dualSourceBlend; product->pixel.reversedBlend = product->state.reversedBlend; - product->pixel.targetMerge = Graphics::ExportTargetMerge(product->state); + product->pixel.targetMerges = Graphics::ExportTargetMerges(product->state); product->pixel.alphaToCoverage = product->state.alphaToCoverage; product->pixel.quadPixelMask = Graphics::QuadPixelMask(product->state); if (product->state.sampleLocationGrid) { diff --git a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawLookup.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawLookup.cpp index b92f94a08c33..397682365488 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawLookup.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawLookup.cpp @@ -81,14 +81,16 @@ void Driver::lookupDraw(const Submission& submission, const std::shared_ptr(value)); mix(pixel.dualSourceBlend); mix(pixel.reversedBlend); - mix(pixel.targetMerge.target); - mix(pixel.targetMerge.mask); - mix(pixel.targetMerge.samples); - for (const auto word : pixel.targetMerge.descriptor) mix(word); - mix(pixel.targetMerge.depthStencilWrites); - mix(pixel.targetMerge.depthStencilTests); - if (pixel.targetMerge.blend.enabled) { - const auto& blend = pixel.targetMerge.blend; + mix(pixel.targetMerges.size()); + for (const auto& merge : pixel.targetMerges) { + mix(merge.target); + mix(merge.mask); + mix(merge.samples); + for (const auto word : merge.descriptor) mix(word); + mix(merge.depthStencilWrites); + mix(merge.depthStencilTests); + if (!merge.blend.enabled) continue; + const auto& blend = merge.blend; mix(blend.snorm); mix(blend.colorSource); mix(blend.colorDestination); diff --git a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawPipeline.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawPipeline.cpp index cea7d17c51f2..63d7f5222276 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawPipeline.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawPipeline.cpp @@ -364,7 +364,6 @@ void DrawPipeline::report(std::chrono::steady_clock::time_point now) { char reads[96]; std::snprintf(reads, sizeof(reads), " %llu read ranges, %llu stores held, %llu decode drains", static_cast(heldReadRanges.load(std::memory_order_relaxed)), static_cast(heldReadHits.exchange(0, std::memory_order_relaxed)), static_cast(decodeDrainCount - reportedDecodeDrains)); reportedDecodeDrains = decodeDrainCount; - drainText += reads; AgcDriver::ProfilePrint_nid_no_patch("[draw] pipelined (10 s, depth %zu): %llu commits at %.1f us each on the committer, %llu failed; %llu enqueued behind %.2f on average, waiting %.1f us per draw for room, %.2f us for the lock; %llu committer wakes;%s; drains:%s\n", Depth(), static_cast(commits), perCommit, static_cast(commitErrors), static_cast(enqueued), queued, perDraw, enqueued == 0 ? 0.0 : static_cast(lockWaitNs) / 1e3 / static_cast(enqueued), static_cast(wakes), reads, drainText.c_str()); commits = commitNs = commitErrors = enqueued = fullWaitNs = depthSum = wakes = lockWaitNs = 0; drains = {}; diff --git a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRegisterKey.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRegisterKey.cpp index 8ec6a2e600ca..bf0a48226c62 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRegisterKey.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRegisterKey.cpp @@ -263,7 +263,7 @@ bool Driver::sameDecode(const DrawDecode& a, const DrawDecode& b) { const auto& y = b.programs[i]; if (x.binary.stage != y.binary.stage || x.binary.codeAddress != y.binary.codeAddress || x.userDataBase != y.userDataBase || x.firstUserSgpr != y.firstUserSgpr || x.userData != y.userData || x.snapshot != y.snapshot || x.codeOffset != y.codeOffset || x.tailContinuation != y.tailContinuation) return false; } - if (p.targetExportPacking != q.targetExportPacking || p.dualSourceBlend != q.dualSourceBlend || p.reversedBlend != q.reversedBlend || p.targetMerge != q.targetMerge || p.alphaToCoverage != q.alphaToCoverage || p.rasterPrimitive != q.rasterPrimitive || p.ditheredAlphaToCoverage != q.ditheredAlphaToCoverage || p.ditheredAlphaSamples != q.ditheredAlphaSamples || p.quadPixelMask != q.quadPixelMask || p.quadSampleMask != q.quadSampleMask || p.iteratesSamples != q.iteratesSamples || p.positionLocation != q.positionLocation || p.sampleLocations != q.sampleLocations || p.sampleOrder != q.sampleOrder) return false; + if (p.targetExportPacking != q.targetExportPacking || p.dualSourceBlend != q.dualSourceBlend || p.reversedBlend != q.reversedBlend || p.targetMerges != q.targetMerges || p.alphaToCoverage != q.alphaToCoverage || p.rasterPrimitive != q.rasterPrimitive || p.ditheredAlphaToCoverage != q.ditheredAlphaToCoverage || p.ditheredAlphaSamples != q.ditheredAlphaSamples || p.quadPixelMask != q.quadPixelMask || p.quadSampleMask != q.quadSampleMask || p.iteratesSamples != q.iteratesSamples || p.positionLocation != q.positionLocation || p.sampleLocations != q.sampleLocations || p.sampleOrder != q.sampleOrder) return false; if (s.samples != t.samples || s.mergedCoverage != t.mergedCoverage || s.truncatedCoverage != t.truncatedCoverage || s.quadSampleMask != t.quadSampleMask || s.pixelEarlyZ != t.pixelEarlyZ || s.pixelKill != t.pixelKill) return false; return true; } 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 c03e05baea00..52a8c3c29243 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/Packets/PacketExecution.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketExecution.cpp index db1978a17e5c..7f91219d1cec 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketExecution.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketExecution.cpp @@ -274,6 +274,7 @@ void Driver::execute(const Submission& submission) { if (APS5_ENABLE_TIMING_LOG && submission.queue == 0 && pendingFrameTiming == nullptr) includeTimingSubmission(submission, false); PerformanceContext timingContext(submission.queue == 0 ? pendingFrameTiming.get() : FrameTiming::Async()); PerformanceTimer timing("Driver.Packet"); + if (!predicated) noteLabelIssue(packet, submission.queue); if (pipelined && !predicated && header != FlipPacketHeader && header != RenderingWaitPacketHeader && !submission.flips.contains(cursor) && (enqueueLabelPacket(packet, opcode, submission.queue) || enqueueDmaPacket(packet, opcode, submission.queue, queue))) { traceLabel(packet, submission.queue); recent.Record(cursor); @@ -287,6 +288,7 @@ void Driver::execute(const Submission& submission) { if (value.has_value() && Pm4::WaitComparesValue(packet, *value)) { ++waitOutcomes().fromRecorderSameQueue; gateOpened() = true; + noteLabelPass(packet, submission.queue); recent.Record(cursor); cursor = nextCursor; continue; @@ -295,6 +297,7 @@ void Driver::execute(const Submission& submission) { bumpEpoch(&EpochBumps::waits); ++waitOutcomes().atEntry; gateOpened() = true; + noteLabelPass(packet, submission.queue); recent.Record(cursor); cursor = nextCursor; continue; @@ -317,6 +320,7 @@ void Driver::execute(const Submission& submission) { cursor = opcode == 0x3f ? submission.conditionalEnds.at(cursor) : nextCursor; continue; } + noteLabelIssue(packet, submission.queue); } if (opcode == 0x3f) { cursor = nextCursor; @@ -455,6 +459,7 @@ void Driver::execute(const Submission& submission) { static const bool traceGpu = std::getenv("APS5_TRACE_GPU") != nullptr; const auto waitStart = traceGpu ? std::chrono::steady_clock::now() : std::chrono::steady_clock::time_point{}; timed(&WorkerProfile::waitMs, [&] { waitMemory(packet, submission.queue, recent, submission.received, submission.heldAtSubmit.contains(cursor)); }); + noteLabelPass(packet, submission.queue); gateOpened() = true; if (traceGpu && std::chrono::steady_clock::now() - waitStart > std::chrono::milliseconds(200)) { 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 a620cb18494b..7ce73fefc901 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 7b452b32f380..76facb3cd768 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 568c8f84585c..8de23ca03e21 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp @@ -981,20 +981,28 @@ std::string hexText(std::uint64_t value) { std::vector ReadUserDataCallee(std::uint64_t address, std::uint32_t linkRegister) { constexpr std::uint64_t page = 4096u; - constexpr std::size_t limitWords = 16384u; + constexpr std::size_t limitWords = 1024u * 1024u / 4u; if (address % 4u != 0u) throw std::runtime_error("its callee address " + hexText(address) + " is not dword aligned"); std::vector words; + const auto finish = [&] { + const auto length = ShaderRecompiler::UserDataCalleeLength(words, linkRegister); + if (length) words.resize(*length); + return length.has_value(); + }; + std::size_t nextCheck = 0; while (words.size() < limitWords) { const auto next = address + words.size() * 4u; const auto bytes = static_cast(page - next % page); - if (!GuestMemory::Accessible(reinterpret_cast(static_cast(next)), bytes)) throw std::runtime_error("its callee at " + hexText(address) + " is not readable at " + hexText(next)); + if (!GuestMemory::Accessible(reinterpret_cast(static_cast(next)), bytes)) { + if (finish()) return words; + throw std::runtime_error("its callee at " + hexText(address) + " is not readable at " + hexText(next)); + } const auto old = words.size(); words.resize(old + bytes / 4u); GuestMemory::Read(next, std::as_writable_bytes(std::span(words).subspan(old))); - if (const auto length = ShaderRecompiler::UserDataCalleeLength(words, linkRegister)) { - words.resize(*length); - return words; - } + if (words.size() < nextCheck && words.size() < limitWords) continue; + nextCheck = words.size() * 2u; + if (finish()) return words; } throw std::runtime_error("its callee at " + hexText(address) + " does not return within " + std::to_string(limitWords * 4u) + " bytes"); } @@ -1213,6 +1221,7 @@ struct RegisteredPreparation { std::optional request; std::vector abiKey; std::shared_ptr prebuildDevice; + std::uint64_t program = 0; }; bool RegistrationPrepareWithinMemoryBudget(); @@ -1259,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 { @@ -1343,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}}}; @@ -1352,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) { @@ -1366,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()); } @@ -1537,8 +1547,8 @@ class RegistrationPreparePool { private: static std::mutex& Lifecycle() { - static std::mutex lifecycle; - return lifecycle; + static auto* lifecycle = new std::mutex; + return *lifecycle; } static bool& Closing() { @@ -1558,13 +1568,14 @@ class RegistrationPreparePool { public: - void Submit(std::function task, const PreparedShaders* prepared = nullptr) { + 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}); - else tasks.push_back({std::move(task), prepared, sequence}); + 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(); @@ -1582,6 +1593,16 @@ class RegistrationPreparePool { 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; @@ -1596,6 +1617,7 @@ class RegistrationPreparePool { 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(); } @@ -1652,6 +1674,7 @@ class RegistrationPreparePool { } pthread_attr_destroy(&attributes); #endif + budgetedLimit = std::max(1u, threads / 2u); } #ifdef _WIN32 @@ -1668,26 +1691,35 @@ class RegistrationPreparePool { Task task; { std::unique_lock lock(pool.mutex); - pool.ready.wait(lock, [&] { return !pool.tasks.empty() || pool.closed; }); - if (pool.tasks.empty()) { + auto next = pool.tasks.end(); + pool.ready.wait(lock, [&] { + next = std::ranges::find_if(pool.tasks, [&](const Task& queued) { return !queued.budgeted || pool.budgetedRunning < pool.budgetedLimit; }); + return next != pool.tasks.end() || (pool.closed && pool.tasks.empty()); + }); + if (next == pool.tasks.end()) { liveWorkers.fetch_sub(1, std::memory_order_acq_rel); return nullptr; } - task = std::move(pool.tasks.front()); - pool.tasks.pop_front(); + 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; } const auto sequence = task.sequence; + const bool budgeted = task.budgeted; task.function(); task = {}; bool drained = false; { std::lock_guard lock(pool.mutex); --pool.running; + if (budgeted) --pool.budgetedRunning; pool.unfinished.erase(sequence); drained = pool.tasks.empty() && pool.running == 0; pool.idle.notify_all(); } + if (budgeted) pool.ready.notify_all(); #ifdef __GLIBC__ if (drained) trimFreedMemory(); #endif @@ -1699,16 +1731,21 @@ class RegistrationPreparePool { std::function function; 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}; unsigned running = 0; + unsigned budgetedRunning = 0; + unsigned budgetedLimit = 1; std::uint64_t submitted = 0; std::set unfinished; bool closed = false; @@ -1787,8 +1824,21 @@ 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) { + RegistrationPreparePool::Prebuild().Submit(std::move(task), nullptr, true); } void AwaitLibraryPrebuilds() { @@ -1989,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; @@ -1999,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 fe1553922262..8b4141c7ebdf 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Synchronization/LabelHistory.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Synchronization/LabelHistory.cpp @@ -1,6 +1,7 @@ #include "prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp" #include "prx/libSceAgcDriver/Execution/include/Pm4.hpp" #include "prx/libSceAgcDriver/Execution/include/Mutex.hpp" +#include #include #include #include @@ -19,14 +20,59 @@ void Driver::noteLabelStore(std::uint64_t address, std::span by } } -bool Driver::storedSince(std::span packet, std::uint64_t address, std::size_t bytes, std::uint64_t received, std::uint32_t* writer) { +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; + const auto bytes = Pm4::WaitAwaitedBytes(packet); + 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) 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 mayTake = [&](std::uint64_t address, std::uint64_t bytes) { + for (std::uint64_t offset = 0; offset < bytes; offset += 4) { + 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()) || !mayTake(label->address, label->Bytes().size())) return; + std::lock_guard lock(labelStoresMutex); + take(label->address, label->Bytes().size()); + return; + } + case 0x40: case 0x50: case 0x83: break; + 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)) || !mayTake(store.address, store.bytes); }); + if (stores.empty()) return; + std::lock_guard lock(labelStoresMutex); + for (const auto& store : stores) take(store.address, store.bytes); +} + +bool Driver::storedSince(std::span packet, std::uint64_t address, std::size_t bytes, std::uint64_t received, std::uint32_t queue, std::uint32_t* writer) { std::lock_guard lock(labelStoresMutex); const auto low = labelStores.find(address); if (low == labelStores.end()) return false; 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) taken = std::max(taken, labelTakes.Taken(queue, address + offset)); for (const auto& store : low->second) { - if (store.stamp <= received) continue; + if (store.stamp <= received || (store.queue != queue && store.stamp <= taken)) continue; std::uint64_t value = store.value; if (bytes == 8) { const auto upper = std::find_if(high->second.begin(), high->second.end(), [&](const LabelStore& other) { return other.stamp == store.stamp; }); diff --git a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Synchronization/WaitMemory.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Synchronization/WaitMemory.cpp index 99edca9a11a6..4dadf332460b 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Synchronization/WaitMemory.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Synchronization/WaitMemory.cpp @@ -137,7 +137,7 @@ void Driver::waitMemory(std::span packet, std::uint32_t que } epochPoint; const auto storedByOwnLabel = [&] { std::uint32_t writer = queue; - return !requireMemory && storedSince(packet, awaited, awaitedBytes, received, &writer) && writer == queue; + return !requireMemory && storedSince(packet, awaited, awaitedBytes, received, queue, &writer) && writer == queue; }; GuestMemory::CheckRange(reinterpret_cast(awaited), awaitedBytes, awaitedBytes); if (Pm4::WaitSatisfiedUnchecked(packet)) { @@ -146,7 +146,7 @@ void Driver::waitMemory(std::span packet, std::uint32_t que return; } if (heldAtSubmit) return; - if (std::uint32_t writer = queue; !requireMemory && storedSince(packet, awaited, awaitedBytes, received, &writer)) { + if (std::uint32_t writer = queue; !requireMemory && storedSince(packet, awaited, awaitedBytes, received, queue, &writer)) { if (writer != queue) notePendingWait(packet, queue, received); else epochPoint.bump = false; return; @@ -342,7 +342,7 @@ void Driver::waitMemory(std::span packet, std::uint32_t que std::uint32_t polls = 0; StallWatch stall(queue); while (!Pm4::WaitSatisfiedUnchecked(packet)) { - if (std::uint32_t writer = queue; !requireMemory && storedSince(packet, awaited, awaitedBytes, received, &writer)) { + if (std::uint32_t writer = queue; !requireMemory && storedSince(packet, awaited, awaitedBytes, received, queue, &writer)) { if (writer != queue) notePendingWait(packet, queue, received); else epochPoint.bump = false; return; diff --git a/core/libs/prx/libSceAgcDriver/Execution/src/FrameRecorder.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/FrameRecorder.cpp index ec51eb12b6c0..fdaf90768159 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/GuestMemory.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp index 32233e1c386d..fdcf56d9b76d 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp @@ -1116,7 +1116,10 @@ struct WriteTracker { bool blockPartWatched(std::uint64_t first, std::uint64_t stop) const { #ifdef _WIN32 - return covers(first, 1) || covers(stop - 1, 1); + for (auto page = first; page < stop; page = (page / WritePageBytes + 1) * WritePageBytes) { + if (covers(page, 1)) return true; + } + return false; #else return GuestWriteWatch::GuestWriteWatchOverlaps_nid_postfix(static_cast(first), static_cast(stop - first)); #endif @@ -2150,12 +2153,17 @@ thread_local ThreadCollectMemo threadHintMemo; bool walkHints(WriteTracker& tracker, std::uint64_t first, std::uint64_t stop) { auto cursor = first; bool marked = false; + StampRuns runs{tracker, StampKind::Cpu}; while (cursor < stop) { std::size_t count = tracker.pages.size(); if (!GuestArena::GuestArenaCollectWrites_nid_postfix(static_cast(cursor), static_cast(stop - cursor), tracker.pages.data(), &count, true)) return false; if (count != 0 && !marked) ++tracker.generation; marked = marked || count != 0; - for (std::size_t i = 0; i < count; ++i) tracker.stampHint(tracker.blockOf(reinterpret_cast(tracker.pages[i]))); + for (std::size_t i = 0; i < count; ++i) { + const auto page = reinterpret_cast(tracker.pages[i]); + tracker.stampHint(tracker.blockOf(page)); + if (tracker.coverage.Covers(page, WritePageBytes)) stampWrittenRun(&runs, page, page + WritePageBytes); + } if (count < tracker.pages.size()) break; cursor = reinterpret_cast(tracker.pages[count - 1]) + WritePageBytes; } diff --git a/core/libs/prx/libSceAgcDriver/Execution/src/HostReport.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/HostReport.cpp new file mode 100644 index 000000000000..5560603d037e --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/Execution/src/HostReport.cpp @@ -0,0 +1,336 @@ +#include "prx/libSceAgcDriver/Execution/include/HostReport.hpp" +#include +#include +#include +#include +#include +#include + +namespace AgcDriver { + +namespace { + +bool nameCharacter(unsigned char value) { + return std::isalnum(value) != 0 || value == '_'; +} + +std::string replaceNames(std::string text, const std::vector& names) { + for (const auto& name : names) { + if (name.empty()) continue; + std::string result; + std::size_t cursor = 0; + for (;;) { + const auto found = text.find(name, cursor); + if (found == std::string::npos) break; + const auto end = found + name.size(); + const bool before = found == 0 || !nameCharacter(static_cast(text[found - 1])); + const bool after = end == text.size() || !nameCharacter(static_cast(text[end])); + result.append(text, cursor, found - cursor); + if (before && after) result += ""; + else result.append(text, found, name.size()); + cursor = end; + } + result.append(text, cursor, std::string::npos); + text = std::move(result); + } + return text; +} + +bool hardwareAddress(const std::string& token) { + if (token.size() != 17) return false; + for (std::size_t index = 0; index < token.size(); ++index) { + const auto value = static_cast(token[index]); + if (index % 3 == 2) { + if (value != ':' && value != '-') return false; + } else if (std::isxdigit(value) == 0) { + return false; + } + } + return true; +} + +std::string tokenPlaceholder(const std::string& token) { + auto begin = token.find_first_not_of("(\"'[,;"); + auto end = token.find_last_not_of(")\"']',;"); + if (begin == std::string::npos || end == std::string::npos || end < begin) return token; + const auto core = token.substr(begin, end - begin + 1); + if (core.find("://") != std::string::npos) return ""; + if (hardwareAddress(core)) return ""; + const bool drive = core.size() >= 3 && std::isalpha(static_cast(core[0])) != 0 && core[1] == ':' && (core[2] == '\\' || core[2] == '/'); + if (core[0] == '/' || core[0] == '~' || core.find('\\') != std::string::npos || drive) return ""; + return token; +} + +HostFacts sanitized(const HostFacts& facts) { + const auto clean = [&](const std::string& text) { return RedactHostText(text, facts.redactions); }; + const auto cleanAll = [&](std::vector values) { + for (auto& value : values) value = clean(value); + return values; + }; + HostFacts result = facts; + result.redactions.clear(); + result.commit = clean(facts.commit); + if (facts.os) result.os = clean(*facts.os); + if (facts.cpuModel) result.cpuModel = clean(*facts.cpuModel); + if (facts.cpuMissing) result.cpuMissing = cleanAll(*facts.cpuMissing); + if (facts.sdlLinked) result.sdlLinked = clean(*facts.sdlLinked); + if (facts.sdlCompiled) result.sdlCompiled = clean(*facts.sdlCompiled); + if (facts.gpu) { + auto& gpu = *result.gpu; + gpu.name = clean(gpu.name); + gpu.type = clean(gpu.type); + gpu.driverName = clean(gpu.driverName); + gpu.driverInfo = clean(gpu.driverInfo); + gpu.candidates = cleanAll(gpu.candidates); + gpu.presentModes = cleanAll(gpu.presentModes); + gpu.requestedPresentMode = clean(gpu.requestedPresentMode); + for (auto& requirement : gpu.requirements) { + requirement.name = clean(requirement.name); + requirement.kind = clean(requirement.kind); + } + } + result.unavailable = cleanAll(facts.unavailable); + for (auto& entry : result.environment) { + entry.first = clean(entry.first); + entry.second = clean(entry.second); + } + return result; +} + +std::string hex(std::uint32_t value) { + char buffer[16]; + std::snprintf(buffer, sizeof buffer, "0x%08x", value); + return buffer; +} + +std::string hex16(std::uint32_t value) { + char buffer[16]; + std::snprintf(buffer, sizeof buffer, "0x%04x", value); + return buffer; +} + +std::string vulkanVersion(std::uint32_t version) { + return std::to_string((version >> 22) & 0x7Fu) + "." + std::to_string((version >> 12) & 0x3FFu) + "." + std::to_string(version & 0xFFFu); +} + +std::string join(const std::vector& values) { + std::string text; + for (const auto& value : values) { + if (!text.empty()) text += ", "; + text += value; + } + return text; +} + +void line(std::string& output, const std::string& key, const std::string& value) { + output += key; + output += ": "; + output += value; + output += '\n'; +} + +void optionalLine(std::string& output, const std::string& key, const std::optional& value) { + line(output, key, value ? *value : std::string("unavailable")); +} + +std::optional text(const std::optional& value) { + if (!value) return std::nullopt; + return std::to_string(*value); +} + +} + +namespace { + +template +std::optional gather(const std::function& source, const char* name, std::vector& unavailable) { + if (!source) { + unavailable.push_back(std::string(name) + ": no source"); + return std::nullopt; + } + try { + return source(); + } catch (const std::exception& error) { + unavailable.push_back(std::string(name) + ": " + error.what()); + } + return std::nullopt; +} + +} + +HostFacts CollectHostFacts(const HostSources& sources) { + HostFacts facts; + facts.commit = sources.commit; + facts.redactions = gather(sources.redactions, "redactions", facts.unavailable).value_or(std::vector{}); + facts.os = gather(sources.os, "os", facts.unavailable); + facts.cpuModel = gather(sources.cpuModel, "cpu", facts.unavailable); + facts.cpuThreads = gather(sources.cpuThreads, "cpu_threads", facts.unavailable); + facts.memoryMiB = gather(sources.memoryMiB, "memory", facts.unavailable); + facts.cpuMissing = gather(sources.cpuMissing, "cpu_gate", facts.unavailable); + facts.sdlLinked = gather(sources.sdlLinked, "sdl_linked", facts.unavailable); + facts.sdlCompiled = gather(sources.sdlCompiled, "sdl_compiled", facts.unavailable); + facts.shaderCache = gather(sources.shaderCache, "shader_cache", facts.unavailable); + facts.environment = FilterHostEnvironment(gather(sources.environment, "environment", facts.unavailable).value_or(std::vector{})); + return facts; +} + +std::vector> FilterHostEnvironment(const std::vector& entries) { + std::vector> result; + for (const auto& entry : entries) { + const auto equals = entry.find('='); + if (equals == std::string::npos || equals == 0) continue; + const auto name = entry.substr(0, equals); + for (const char* prefix : {"APS5_", "ANYPS5_", "VK_", "SDL_"}) { + if (name.rfind(prefix, 0) == 0) { + result.emplace_back(name, entry.substr(equals + 1)); + break; + } + } + } + std::sort(result.begin(), result.end()); + return result; +} + +std::vector HostRedactionNames(const std::string& user, const std::string& hostName, const std::string& homeDirectory) { + std::vector names; + const auto add = [&](const std::string& name) { + if (!name.empty() && std::find(names.begin(), names.end(), name) == names.end()) names.push_back(name); + }; + add(user); + add(hostName); + auto home = homeDirectory; + while (!home.empty() && (home.back() == '/' || home.back() == '\\')) home.pop_back(); + const auto separator = home.find_last_of("/\\"); + add(separator == std::string::npos ? home : home.substr(separator + 1)); + return names; +} + +std::vector MissingRequirements(const HostGpuFacts& gpu) { + std::vector missing; + for (const auto& requirement : gpu.requirements) + if (requirement.required && !requirement.present) missing.push_back(requirement); + std::sort(missing.begin(), missing.end(), [](const auto& left, const auto& right) { + if (left.kind != right.kind) return left.kind < right.kind; + return left.name < right.name; + }); + return missing; +} + +std::string DescribeMissingRequirements(const HostGpuFacts& gpu, const std::vector& redactions) { + const auto missing = MissingRequirements(gpu); + if (missing.empty()) return {}; + std::string lacks; + for (const auto& requirement : missing) { + if (!lacks.empty()) lacks += ", "; + lacks += requirement.name + " (" + requirement.kind + ")"; + } + std::string driver = gpu.driverName.empty() ? std::string("unknown driver") : gpu.driverName; + if (!gpu.driverInfo.empty()) driver += " " + gpu.driverInfo; + std::string text = "Vulkan: " + gpu.name + " (" + driver + ", Vulkan " + vulkanVersion(gpu.apiVersion) + ") lacks " + std::to_string(missing.size()) + + (missing.size() == 1 ? " item" : " items") + " AnyPS5 needs: " + lacks + ". Update the graphics driver; an older GPU or driver may not offer them."; + std::vector others; + for (const auto& candidate : gpu.candidates) + if (candidate != gpu.name) others.push_back(candidate); + if (!others.empty()) text += " Other Vulkan devices on this machine: " + join(others) + "; set ANYPS5_GPU to a part of one name to run on it."; + text += " Start again with ANYPS5_HOST_REPORT=1 and attach the report to the issue."; + return RedactHostText(text, redactions); +} + +bool ParseHostReportSetting(const char* value) { + const std::string_view text = value != nullptr ? value : ""; + if (text.empty() || text == "0") return false; + if (text == "1") return true; + throw std::runtime_error("ANYPS5_HOST_REPORT must be 0 or 1, not '" + std::string(text) + "'"); +} + +std::string RedactHostText(const std::string& text, const std::vector& names) { + std::string flat = text; + for (auto& character : flat) { + const auto value = static_cast(character); + if (value < 0x20 || value == 0x7f) character = ' '; + } + const auto named = replaceNames(flat, names); + std::string result; + std::size_t cursor = 0; + while (cursor <= named.size()) { + const auto space = named.find(' ', cursor); + const auto stop = space == std::string::npos ? named.size() : space; + result += tokenPlaceholder(named.substr(cursor, stop - cursor)); + if (space == std::string::npos) break; + result += ' '; + cursor = space + 1; + } + return result; +} + +std::string FormatHostReport(const HostFacts& original) { + const HostFacts facts = sanitized(original); + std::string output = "AnyPS5 host report (format 1)\n"; + line(output, "commit", facts.commit.empty() ? "unknown" : facts.commit); + output += "[system]\n"; + optionalLine(output, "os", facts.os); + optionalLine(output, "cpu", facts.cpuModel); + optionalLine(output, "cpu_threads", text(facts.cpuThreads)); + optionalLine(output, "memory_mib", text(facts.memoryMiB)); + if (facts.cpuMissing) line(output, "cpu_gate", facts.cpuMissing->empty() ? "passed" : "failed, lacks " + join(*facts.cpuMissing)); + else line(output, "cpu_gate", "unavailable"); + output += "[sdl]\n"; + optionalLine(output, "linked", facts.sdlLinked); + optionalLine(output, "compiled", facts.sdlCompiled); + output += "[gpu]\n"; + if (!facts.gpu) { + line(output, "device", "none selected"); + } else { + const auto& gpu = *facts.gpu; + line(output, "device", gpu.name); + line(output, "type", gpu.type); + line(output, "vendor_id", hex16(gpu.vendorId)); + line(output, "device_id", hex16(gpu.deviceId)); + line(output, "vulkan_api", vulkanVersion(gpu.apiVersion)); + line(output, "driver", gpu.driverName.empty() ? "unknown" : gpu.driverName); + line(output, "driver_info", gpu.driverInfo.empty() ? "unknown" : gpu.driverInfo); + line(output, "driver_version_raw", hex(gpu.driverVersion)); + line(output, "subgroup_size", std::to_string(gpu.subgroupSize)); + line(output, "device_local_mib", std::to_string(gpu.deviceLocalMiB)); + line(output, "candidates", gpu.candidates.empty() ? "none" : join(gpu.candidates)); + auto presentModes = gpu.presentModes; + std::sort(presentModes.begin(), presentModes.end()); + line(output, "present_modes", presentModes.empty() ? "unknown" : join(presentModes)); + line(output, "present_mode_requested", gpu.requestedPresentMode.empty() ? "default" : gpu.requestedPresentMode); + output += "[vulkan]\n"; + auto requirements = gpu.requirements; + std::sort(requirements.begin(), requirements.end(), [](const auto& left, const auto& right) { + if (left.required != right.required) return left.required; + if (left.kind != right.kind) return left.kind < right.kind; + return left.name < right.name; + }); + for (const auto& requirement : requirements) { + line(output, requirement.name, std::string(requirement.kind) + " " + (requirement.required ? "required" : "optional") + " " + (requirement.present ? "present" : "missing")); + } + } + output += "[shader_cache]\n"; + if (!facts.shaderCache) { + line(output, "state", "unavailable"); + } else if (!facts.shaderCache->enabled) { + line(output, "state", "disabled"); + } else if (!facts.shaderCache->present) { + line(output, "state", "absent"); + } else { + line(output, "state", "present"); + line(output, "size_mib", std::to_string(facts.shaderCache->sizeMiB)); + } + output += "[environment]\n"; + auto environment = facts.environment; + std::sort(environment.begin(), environment.end()); + if (environment.empty()) output += "none\n"; + for (const auto& entry : environment) line(output, entry.first, entry.second); + if (!facts.unavailable.empty()) { + auto unavailable = facts.unavailable; + std::sort(unavailable.begin(), unavailable.end()); + output += "[unavailable]\n"; + for (const auto& item : unavailable) output += item + "\n"; + } + return output; +} + +} diff --git a/core/libs/prx/libSceAgcDriver/Execution/src/HostReportSources.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/HostReportSources.cpp new file mode 100644 index 000000000000..a3a4257fd805 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/Execution/src/HostReportSources.cpp @@ -0,0 +1,166 @@ +#include "prx/libSceAgcDriver/Execution/include/HostReportSources.hpp" +#include "prx/libSceAgcDriver/TraceRevision.hpp" +#include "prx/libkernel/System/include/HostCpu.hpp" +#include "ShaderCacheDirectory.hpp" +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#else +#include +#include +#include +#endif + +namespace AgcDriver { + +namespace { + +constexpr std::uint64_t MaxCacheEntries = 200000; + +std::string operatingSystem() { +#ifdef _WIN32 + using QueryVersion = LONG(WINAPI*)(PRTL_OSVERSIONINFOW); + static const auto query = reinterpret_cast(reinterpret_cast(::GetProcAddress(::GetModuleHandleW(L"ntdll.dll"), "RtlGetVersion"))); + RTL_OSVERSIONINFOW version{}; + version.dwOSVersionInfoSize = sizeof(version); + if (query == nullptr || query(&version) != 0) throw std::runtime_error("RtlGetVersion failed"); + return "Windows " + std::to_string(version.dwMajorVersion) + "." + std::to_string(version.dwMinorVersion) + "." + std::to_string(version.dwBuildNumber); +#else + utsname name{}; + if (::uname(&name) != 0) throw std::system_error(errno, std::generic_category(), "uname"); + return std::string(name.sysname) + " " + name.release + " " + name.machine; +#endif +} + +std::uint64_t physicalMemoryMiB() { +#ifdef _WIN32 + MEMORYSTATUSEX status{}; + status.dwLength = sizeof(status); + if (::GlobalMemoryStatusEx(&status) == 0) throw std::system_error(static_cast(::GetLastError()), std::system_category(), "GlobalMemoryStatusEx"); + return status.ullTotalPhys / (1024 * 1024); +#else + const long pages = ::sysconf(_SC_PHYS_PAGES); + const long size = ::sysconf(_SC_PAGE_SIZE); + if (pages <= 0 || size <= 0) throw std::system_error(errno, std::generic_category(), "sysconf physical memory"); + return static_cast(pages) * static_cast(size) / (1024 * 1024); +#endif +} + +std::string cpuModel() { + const std::string model = HostCpuModel_nid_no_patch().value; + const auto first = model.find_first_not_of(' '); + if (first == std::string::npos) throw std::runtime_error("the CPU reports no brand string"); + const auto last = model.find_last_not_of(' '); + return model.substr(first, last - first + 1); +} + +std::vector cpuMissing() { +#if (defined(__x86_64__) || defined(__i386__)) && !defined(__APPLE__) + const auto registers = ReadHostCpuRegisters_nid_no_patch(); + const std::string joined = MissingHostCpuFeatures_nid_no_patch(®isters).value; + std::vector missing; + for (std::size_t start = 0; start < joined.size();) { + auto end = joined.find(", ", start); + if (end == std::string::npos) end = joined.size(); + missing.push_back(joined.substr(start, end - start)); + start = end + 2; + } + return missing; +#else + throw std::runtime_error("the CPU gate runs on x86 Linux and Windows hosts only"); +#endif +} + +std::string versionText(const SDL_version& version) { + return std::to_string(version.major) + "." + std::to_string(version.minor) + "." + std::to_string(version.patch); +} + +std::string sdlLinked() { + SDL_version version{}; + SDL_GetVersion(&version); + return versionText(version); +} + +std::string sdlCompiled() { + SDL_version version{}; + SDL_VERSION(&version); + return versionText(version); +} + +HostShaderCacheFacts shaderCache() { + HostShaderCacheFacts facts; + const auto directory = ShaderRecompiler::ShaderCacheDirectory(); + if (directory.empty()) return facts; + facts.enabled = true; + std::error_code error; + facts.present = std::filesystem::is_directory(directory, error) && !error; + if (!facts.present) return facts; + std::uint64_t bytes = 0; + std::uint64_t entries = 0; + std::filesystem::recursive_directory_iterator walk(directory, std::filesystem::directory_options::skip_permission_denied, error); + for (; !error && walk != std::filesystem::recursive_directory_iterator(); walk.increment(error)) { + if (++entries > MaxCacheEntries) break; + std::error_code sizeError; + if (walk->is_regular_file(sizeError) && !sizeError) { + const auto size = walk->file_size(sizeError); + if (!sizeError) bytes += size; + } + } + facts.sizeMiB = bytes / (1024 * 1024); + return facts; +} + +std::vector environmentEntries() { + std::vector entries; +#ifdef _WIN32 + char** variables = _environ; +#else + char** variables = environ; +#endif + for (; variables != nullptr && *variables != nullptr; ++variables) entries.emplace_back(*variables); + return entries; +} + +std::string variable(const char* name) { + const char* value = std::getenv(name); + return value != nullptr ? value : ""; +} + +std::vector redactions() { +#ifdef _WIN32 + const auto user = variable("USERNAME"); + const auto host = variable("COMPUTERNAME"); + const auto home = variable("USERPROFILE"); +#else + const auto user = variable("USER").empty() ? variable("LOGNAME") : variable("USER"); + char buffer[256]{}; + const auto host = ::gethostname(buffer, sizeof buffer - 1) == 0 ? std::string(buffer) : std::string(); + const auto home = variable("HOME"); +#endif + return HostRedactionNames(user, host, home); +} + +} + +HostSources SystemHostSources() { + HostSources sources; + sources.commit = APS5_TRACE_COMMIT; + sources.os = operatingSystem; + sources.cpuModel = cpuModel; + sources.cpuThreads = [] { return static_cast(std::thread::hardware_concurrency()); }; + sources.memoryMiB = physicalMemoryMiB; + sources.cpuMissing = cpuMissing; + sources.sdlLinked = sdlLinked; + sources.sdlCompiled = sdlCompiled; + sources.shaderCache = shaderCache; + sources.environment = environmentEntries; + sources.redactions = redactions; + return sources; +} + +} diff --git a/core/libs/prx/libSceAgcDriver/Execution/src/HostReportVulkan.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/HostReportVulkan.cpp new file mode 100644 index 000000000000..08516957b4b6 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/Execution/src/HostReportVulkan.cpp @@ -0,0 +1,126 @@ +#include "prx/libSceAgcDriver/Execution/include/HostReportVulkan.hpp" +#include +#include +#include + +namespace AgcDriver { + +namespace { + +template +TFunction load(const HostGpuQuery& query, const char* name) { + const auto function = reinterpret_cast(reinterpret_cast(query.instanceProc(query.instance, name))); + if (function == nullptr) throw std::runtime_error(std::string(name) + " is not available"); + return function; +} + +const char* deviceType(VkPhysicalDeviceType type) { + switch (type) { + case VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU: return "discrete"; + case VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU: return "integrated"; + case VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU: return "virtual"; + case VK_PHYSICAL_DEVICE_TYPE_CPU: return "cpu"; + default: return "other"; + } +} + +const char* presentModeName(VkPresentModeKHR mode) { + switch (mode) { + case VK_PRESENT_MODE_IMMEDIATE_KHR: return "immediate"; + case VK_PRESENT_MODE_MAILBOX_KHR: return "mailbox"; + case VK_PRESENT_MODE_FIFO_KHR: return "fifo"; + case VK_PRESENT_MODE_FIFO_RELAXED_KHR: return "fifo_relaxed"; + case VK_PRESENT_MODE_FIFO_LATEST_READY_KHR: return "fifo_latest_ready"; + default: return "other"; + } +} + +} + +HostGpuFacts CollectHostGpuFacts(const HostGpuQuery& query) { + const auto has = [&](const char* name) { + return std::any_of(query.extensions.begin(), query.extensions.end(), [&](const auto& item) { return std::strcmp(item.extensionName, name) == 0; }); + }; + HostGpuFacts gpu; + gpu.candidates = query.candidates; + gpu.subgroupSize = query.subgroupSize; + gpu.requestedPresentMode = query.requestedPresentMode != nullptr ? query.requestedPresentMode : ""; + const auto properties2 = load(query, "vkGetPhysicalDeviceProperties2"); + VkPhysicalDeviceDriverProperties driver{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES}; + VkPhysicalDeviceFloatControlsProperties floatControls{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES}; + VkPhysicalDeviceProperties2 properties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2}; + const bool hasDriver = has(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME); + const bool hasFloatControls = has(VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME); + void** next = &properties.pNext; + if (hasDriver) { + *next = &driver; + next = &driver.pNext; + } + if (hasFloatControls) *next = &floatControls; + properties2(query.physical, &properties); + gpu.name = properties.properties.deviceName; + gpu.type = deviceType(properties.properties.deviceType); + gpu.vendorId = properties.properties.vendorID; + gpu.deviceId = properties.properties.deviceID; + gpu.apiVersion = properties.properties.apiVersion; + gpu.driverVersion = properties.properties.driverVersion; + if (hasDriver) { + gpu.driverName = driver.driverName; + gpu.driverInfo = driver.driverInfo; + } + VkPhysicalDeviceMemoryProperties memory{}; + load(query, "vkGetPhysicalDeviceMemoryProperties")(query.physical, &memory); + std::uint64_t largest = 0; + for (std::uint32_t index = 0; index < memory.memoryHeapCount && index < VK_MAX_MEMORY_HEAPS; ++index) + if ((memory.memoryHeaps[index].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) != 0) largest = std::max(largest, memory.memoryHeaps[index].size); + gpu.deviceLocalMiB = largest / (1024u * 1024u); + + VkPhysicalDevice8BitStorageFeatures bytes{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES}; + VkPhysicalDeviceBufferDeviceAddressFeatures address{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES}; + VkPhysicalDeviceFeatures2 features{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2}; + const bool hasBytes = has(VK_KHR_8BIT_STORAGE_EXTENSION_NAME); + const bool hasAddress = has(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME); + void** featureNext = &features.pNext; + if (hasBytes) { + *featureNext = &bytes; + featureNext = &bytes.pNext; + } + if (hasAddress) *featureNext = &address; + load(query, "vkGetPhysicalDeviceFeatures2")(query.physical, &features); + const auto& core = features.features; + const auto required = [&](const char* name, const char* kind, bool present) { gpu.requirements.push_back({name, kind, true, present}); }; + const auto optional = [&](const char* name) { gpu.requirements.push_back({name, "extension", false, has(name)}); }; + if (query.presentation) required(VK_KHR_SWAPCHAIN_EXTENSION_NAME, "extension", has(VK_KHR_SWAPCHAIN_EXTENSION_NAME)); + required(VK_KHR_8BIT_STORAGE_EXTENSION_NAME, "extension", hasBytes); + required(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, "extension", hasAddress); + required(VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME, "extension", hasFloatControls); + required("storageBuffer8BitAccess", "feature", hasBytes && bytes.storageBuffer8BitAccess == VK_TRUE); + required("bufferDeviceAddress", "feature", hasAddress && address.bufferDeviceAddress == VK_TRUE); + required("shaderInt64", "feature", core.shaderInt64 == VK_TRUE); + required("shaderSignedZeroInfNanPreserveFloat32", "feature", hasFloatControls && floatControls.shaderSignedZeroInfNanPreserveFloat32 == VK_TRUE); + required("vertexPipelineStoresAndAtomics", "feature", core.vertexPipelineStoresAndAtomics == VK_TRUE); + required("fragmentStoresAndAtomics", "feature", core.fragmentStoresAndAtomics == VK_TRUE); + required("samplerAnisotropy", "feature", core.samplerAnisotropy == VK_TRUE); + required("textureCompressionBC", "feature", core.textureCompressionBC == VK_TRUE); + for (const char* name : {VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME, VK_EXT_MEMORY_BUDGET_EXTENSION_NAME, VK_EXT_MESH_SHADER_EXTENSION_NAME, + VK_KHR_SPIRV_1_4_EXTENSION_NAME, VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME, VK_KHR_SHADER_TERMINATE_INVOCATION_EXTENSION_NAME, + VK_EXT_FRAGMENT_SHADER_INTERLOCK_EXTENSION_NAME, VK_KHR_SHADER_CLOCK_EXTENSION_NAME, VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME, + VK_KHR_MAINTENANCE_5_EXTENSION_NAME, VK_EXT_HDR_METADATA_EXTENSION_NAME, VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME, + VK_EXT_SHADER_IMAGE_ATOMIC_INT64_EXTENSION_NAME, VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME, + VK_EXT_SAMPLE_LOCATIONS_EXTENSION_NAME, VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME, VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME, + VK_KHR_PRESENT_MODE_FIFO_LATEST_READY_EXTENSION_NAME, "VK_EXT_present_mode_fifo_latest_ready"}) + optional(name); + + if (query.surface != VK_NULL_HANDLE) { + const auto modes = load(query, "vkGetPhysicalDeviceSurfacePresentModesKHR"); + std::uint32_t count = 0; + if (modes(query.physical, query.surface, &count, nullptr) == VK_SUCCESS) { + std::vector available(count); + if (modes(query.physical, query.surface, &count, available.data()) == VK_SUCCESS) + for (const auto mode : available) gpu.presentModes.push_back(presentModeName(mode)); + } + } + return gpu; +} + +} diff --git a/core/libs/prx/libSceAgcDriver/Execution/src/KeyboardOverlay.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/KeyboardOverlay.cpp index dcd31370042b..9bd1dd45b551 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/KeyboardOverlay.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/KeyboardOverlay.cpp @@ -249,6 +249,7 @@ constexpr std::array KeyboardSymbolGlyphs{{ std::mutex systemOverlayMutex; std::optional systemOverlay; +std::optional systemDialog; std::int32_t gridWidth(const ImeKeyboardView& view) { return view.columns * KeyboardMetrics::KeyWidth + (view.columns - 1) * KeyboardMetrics::Gap; @@ -407,6 +408,147 @@ OverlayLayout LayOutKeyboard(const ImeKeyboardView& view, VkExtent2D extent) { return layout; } +std::vector WrapDialogMessage(const std::u16string& message, std::size_t columns, std::size_t maxLines) { + Graphics::Require(columns > 3 && maxLines != 0, "the dialog needs room for its text"); + std::size_t unused = 0; + const auto characters = decode(message, 0, &unused); + std::vector lines; + std::u32string current; + const auto addWord = [&](std::u32string word) { + while (word.size() > columns) { + if (!current.empty()) { + lines.push_back(std::move(current)); + current.clear(); + } + lines.push_back(word.substr(0, columns)); + word.erase(0, columns); + } + if (word.empty()) return; + if (current.empty()) { + current = std::move(word); + } else if (current.size() + 1 + word.size() <= columns) { + current.push_back(U' '); + current += word; + } else { + lines.push_back(std::move(current)); + current = std::move(word); + } + }; + std::u32string word; + for (const char32_t character : characters) { + if (character == U'\r') continue; + if (character == U' ' || character == U'\n') { + addWord(std::move(word)); + word.clear(); + if (character == U'\n') { + lines.push_back(std::move(current)); + current.clear(); + } + } else { + word.push_back(character); + } + } + addWord(std::move(word)); + if (!current.empty() || lines.empty()) lines.push_back(std::move(current)); + if (lines.size() > maxLines) { + lines.resize(maxLines); + auto& last = lines.back(); + if (last.size() + 3 > columns) last.resize(columns - 3); + last += U"..."; + } + return lines; +} + +namespace { + +std::int32_t buttonWidth(const ModalDialogButtonView& button) { + std::size_t unused = 0; + const auto characters = std::min(decode(button.label, 0, &unused).size(), DialogMetrics::ButtonMaxColumns); + return std::max(DialogMetrics::ButtonMinWidth, lineWidth(characters) + 2 * DialogMetrics::ButtonInset); +} + +std::int32_t buttonsWidth(const ModalDialogView& view) { + std::int32_t width = 0; + for (const auto& button : view.buttons) width += buttonWidth(button) + (width != 0 ? DialogMetrics::ButtonGap : 0); + return width; +} + +std::vector dialogLines(const ModalDialogView& view) { + return WrapDialogMessage(view.message, DialogMetrics::MaxColumns, DialogMetrics::MaxLines); +} + +std::int32_t dialogInnerWidth(const ModalDialogView& view, const std::vector& lines) { + std::int32_t width = buttonsWidth(view); + for (const auto& text : lines) width = std::max(width, lineWidth(text.size())); + return width; +} + +std::int32_t dialogHeight(std::size_t lines) { + return DialogMetrics::Padding * 2 + static_cast(lines) * DialogMetrics::LineHeight + DialogMetrics::MessageGap + DialogMetrics::ButtonHeight; +} + +} + +std::int32_t DialogScale(VkExtent2D extent, const ModalDialogView& view) { + const auto lines = dialogLines(view); + const auto width = dialogInnerWidth(view, lines) + 2 * DialogMetrics::Padding; + const auto height = dialogHeight(lines.size()); + auto scale = std::max(1, static_cast(extent.height / KeyboardMetrics::LinesPerScale)); + while (scale > 1 && (static_cast(width) * scale > extent.width || static_cast(height) * scale > extent.height)) --scale; + return scale; +} + +OverlayLayout LayOutDialog(const ModalDialogView& view, VkExtent2D extent) { + Graphics::Require(extent.width != 0 && extent.height != 0, "the system dialog needs a destination"); + Graphics::Require(!view.buttons.empty() && view.buttons.size() <= ModalDialogMaxButtons, "the system dialog needs one to three buttons"); + const auto lines = dialogLines(view); + const auto inner = dialogInnerWidth(view, lines); + const auto width = inner + 2 * DialogMetrics::Padding; + const auto height = dialogHeight(lines.size()); + OverlayLayout layout; + const auto scale = DialogScale(extent, view); + layout.scale = scale; + const auto left = std::max(0, (static_cast(extent.width) - width * scale) / 2); + const auto top = std::max(0, (static_cast(extent.height) - height * scale) / 2); + layout.bounds = {left, top, width * scale, height * scale, static_cast(OverlayColor::Panel)}; + layout.rects.push_back(layout.bounds); + const auto rect = [&](std::int32_t x, std::int32_t y, std::int32_t w, std::int32_t h, OverlayColor color) { + layout.rects.push_back({left + x * scale, top + y * scale, w * scale, h * scale, static_cast(color)}); + }; + for (std::size_t index = 0; index < lines.size(); ++index) { + const auto y = DialogMetrics::Padding + static_cast(index) * DialogMetrics::LineHeight; + const auto x = DialogMetrics::Padding + (inner - lineWidth(lines[index].size())) / 2; + for (std::size_t column = 0; column < lines[index].size(); ++column) { + glyph(layout, KeyboardGlyph(lines[index][column]), left + (x + static_cast(column) * KeyboardMetrics::Advance) * scale, top + y * scale, scale, OverlayColor::Text); + } + } + const auto rowTop = DialogMetrics::Padding + static_cast(lines.size()) * DialogMetrics::LineHeight + DialogMetrics::MessageGap; + auto x = DialogMetrics::Padding + (inner - buttonsWidth(view)) / 2; + for (const auto& button : view.buttons) { + const auto w = buttonWidth(button); + if (button.selected) { + rect(x, rowTop, w, DialogMetrics::ButtonHeight, OverlayColor::Accent); + rect(x + KeyboardMetrics::Border, rowTop + KeyboardMetrics::Border, w - 2 * KeyboardMetrics::Border, DialogMetrics::ButtonHeight - 2 * KeyboardMetrics::Border, OverlayColor::Key); + } else { + rect(x, rowTop, w, DialogMetrics::ButtonHeight, OverlayColor::Key); + } + line(layout, button.label.substr(0, DialogMetrics::ButtonMaxColumns), layout.bounds, x, w, rowTop + (DialogMetrics::ButtonHeight - KeyboardMetrics::GlyphHeight) / 2, scale, OverlayColor::Text); + x += w + DialogMetrics::ButtonGap; + } + return layout; +} + +std::optional SystemDialogView() { + std::lock_guard lock(systemOverlayMutex); + return systemDialog; +} + +std::optional SystemOverlayLayout(VkExtent2D extent) { + if (const auto keyboard = SystemOverlayView()) return LayOutKeyboard(*keyboard, extent); + if (const auto dialog = SystemDialogView()) return LayOutDialog(*dialog, extent); + return std::nullopt; +} + std::optional SystemOverlayView() { std::lock_guard lock(systemOverlayMutex); return systemOverlay; @@ -419,3 +561,9 @@ extern "C" void AgcDriverSetSystemOverlay_nid_postfix(const ImeKeyboardView* vie if (view != nullptr) AgcDriver::systemOverlay = *view; else AgcDriver::systemOverlay.reset(); } + +extern "C" void AgcDriverSetSystemDialog_nid_postfix(const ModalDialogView* view) { + std::lock_guard lock(AgcDriver::systemOverlayMutex); + if (view != nullptr) AgcDriver::systemDialog = *view; + else AgcDriver::systemDialog.reset(); +} diff --git a/core/libs/prx/libSceAgcDriver/Execution/src/PadStatusOverlay.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/PadStatusOverlay.cpp new file mode 100644 index 000000000000..237a8b9d3e93 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/Execution/src/PadStatusOverlay.cpp @@ -0,0 +1,188 @@ +#include "prx/libSceAgcDriver/Execution/include/PadStatusOverlay.hpp" +#include "prx/libSceAgcDriver/Execution/include/PerformanceOverlay.hpp" +#include +#include +#include +#include +#include +#include + +namespace AgcDriver { +namespace { + +bool batteryRank(PadPower power, int& rank) { + switch (power) { + case PadPower::Empty: rank = 0; return true; + case PadPower::Low: rank = 1; return true; + case PadPower::Medium: rank = 2; return true; + case PadPower::Full: rank = 3; return true; + case PadPower::Unknown: + case PadPower::Wired: break; + } + return false; +} + +bool batteryDropped(PadPower before, PadPower after) { + int from = 0; + int to = 0; + return batteryRank(before, from) && batteryRank(after, to) && to < from; +} + +bool padEvent(const PadSlotStatus& before, const PadSlotStatus& after) { + if (after.connected != before.connected) return true; + if (!after.connected) return false; + return after.kind != before.kind || after.name != before.name || batteryDropped(before.power, after.power); +} + +std::string_view powerText(PadPower power) { + switch (power) { + case PadPower::Empty: return "BATTERY EMPTY"; + case PadPower::Low: return "BATTERY LOW"; + case PadPower::Medium: return "BATTERY MEDIUM"; + case PadPower::Full: return "BATTERY FULL"; + case PadPower::Wired: return "WIRED"; + case PadPower::Unknown: break; + } + return "BATTERY UNKNOWN"; +} + +std::string kindText(const PadSlotStatus& status) { + switch (status.kind) { + case PadKind::DualSense: return "DUALSENSE"; + case PadKind::DualShock4: return "DUALSHOCK 4"; + case PadKind::DualShock3: return "DUALSHOCK 3"; + case PadKind::Xbox: return "XBOX"; + case PadKind::Switch: return "SWITCH"; + case PadKind::Unknown: + case PadKind::Other: break; + } + auto text = OverlayText(status.name); + const auto first = text.find_first_not_of(' '); + if (first == std::string::npos) return "PAD"; + text = text.substr(first, text.find_last_not_of(' ') - first + 1); + return text; +} + +} + +PadStatusMode ParsePadStatusMode(const char* value) { + const std::string_view mode = value != nullptr ? value : ""; + if (mode.empty() || mode == "0") return PadStatusMode::Off; + if (mode == "1") return PadStatusMode::Events; + throw std::runtime_error("ANYPS5_PAD_STATUS must be 0 or 1, not '" + std::string(mode) + "'"); +} + +std::string FormatPadStatusLine(std::size_t slot, const PadSlotStatus& status) { + Graphics::Require(slot < PadStatusSlots, "a pad status line is for one of the four player slots"); + const auto prefix = "P" + std::to_string(slot + 1) + " "; + if (!status.connected) return prefix + "DISCONNECTED"; + auto kind = kindText(status); + constexpr auto limit = static_cast(PadStatusMetrics::KindColumns); + if (kind.size() > limit) kind = kind.substr(0, limit - 1) + "."; + return prefix + kind + " " + std::string(powerText(status.power)); +} + +OverlayCorner PadStatusCorner(OverlayCorner overlay) { + switch (overlay) { + case OverlayCorner::TopLeft: return OverlayCorner::TopRight; + case OverlayCorner::TopRight: return OverlayCorner::TopLeft; + case OverlayCorner::BottomLeft: return OverlayCorner::BottomRight; + case OverlayCorner::BottomRight: return OverlayCorner::BottomLeft; + } + throw std::runtime_error("the performance overlay has no such corner"); +} + +OverlayContent ComposePadStatus(const std::vector& lines) { + Graphics::Require(!lines.empty(), "the pad status panel has nothing to show"); + OverlayContent content; + content.above = lines; + content.columns = PadStatusMetrics::Columns; + content.graph = false; + return content; +} + +OverlayLayout LayOutPadStatus(const std::vector& lines, VkExtent2D extent, OverlayCorner overlay) { + return LayOutOverlay(ComposePadStatus(lines), extent, PadStatusCorner(overlay)); +} + +bool PadStatusDrawn(bool visible, bool keyboardShown) { + return visible && !keyboardShown; +} + +PadStatusDisplay::PadStatusDisplay(PadStatusMode mode) : mode(mode) { +} + +bool PadStatusDisplay::Observe(Clock::time_point now, const PadStatusSnapshot& snapshot) { + const PadStatusSnapshot baseline; + const auto& before = previous ? *previous : baseline; + bool event = false; + for (std::size_t slot = 0; slot < PadStatusSlots; ++slot) { + event = event || padEvent(before.slots[slot], snapshot.slots[slot]); + seen[slot] = seen[slot] || snapshot.slots[slot].connected; + } + previous = snapshot; + if (event && mode == PadStatusMode::Events) shownUntil = now + Duration; + return event; +} + +void PadStatusDisplay::Request(Clock::time_point now) { + shownUntil = now + Duration; +} + +bool PadStatusDisplay::Visible(Clock::time_point now) const { + return shownUntil.has_value() && now < *shownUntil; +} + +bool PadStatusDisplay::Wants(Clock::time_point now) const { + return mode == PadStatusMode::Events || Visible(now); +} + +bool PadStatusDisplay::Poll(Clock::time_point now, const PadStatusProvider& provider) { + if (!Wants(now)) { + polled.reset(); + return false; + } + auto snapshot = provider.read(); + if (!polled.has_value() || *polled != snapshot) Observe(now, snapshot); + polled = std::move(snapshot); + return true; +} + +std::vector PadStatusDisplay::Lines() const { + std::vector lines; + for (std::size_t slot = 0; slot < PadStatusSlots; ++slot) { + if (seen[slot] && previous) lines.push_back(FormatPadStatusLine(slot, previous->slots[slot])); + } + if (lines.empty()) lines.push_back("NO CONTROLLER"); + return lines; +} + +namespace { + +std::mutex displayMutex; + +PadStatusDisplay& display() { + static PadStatusDisplay shared(ParsePadStatusMode(std::getenv("ANYPS5_PAD_STATUS"))); + return shared; +} + +} + +std::optional> PadStatusOverlayLines() { + std::lock_guard lock(displayMutex); + auto& shared = display(); + if (!shared.Visible(PadStatusDisplay::Clock::now())) return std::nullopt; + return shared.Lines(); +} + +} + +extern "C" void AgcDriverPadStatusPoll_nid_postfix(const AgcDriver::PadStatusProvider* provider) { + std::lock_guard lock(AgcDriver::displayMutex); + AgcDriver::display().Poll(AgcDriver::PadStatusDisplay::Clock::now(), *provider); +} + +extern "C" void AgcDriverPadStatusShow_nid_postfix() { + std::lock_guard lock(AgcDriver::displayMutex); + AgcDriver::display().Request(AgcDriver::PadStatusDisplay::Clock::now()); +} diff --git a/core/libs/prx/libSceAgcDriver/Execution/src/ShaderMemory.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/ShaderMemory.cpp index e1a7f3a69a34..91380e6132f0 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 7890b588abc4..e0036db99a42 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp @@ -3,6 +3,7 @@ #include "prx/libSceAgcDriver/Graphics/include/PipelineSpecialization.hpp" #include "prx/libSceAgcDriver/Execution/include/CaptureTrace.hpp" #include "prx/libSceAgcDriver/Execution/include/Mutex.hpp" +#include "prx/libSceAgcDriver/Execution/include/CompileBudget.hpp" #include "BdaAbi.hpp" #if ANYPS5_ENABLE_SPIRV_TOOLS #include "SpirvBackend/SpirvOptimizer.hpp" @@ -15,6 +16,8 @@ #include "prx/libSceAgcDriver/Execution/include/Driver/Shaders/ShaderRegistry.hpp" #include "prx/libSceAgcDriver/Execution/include/PerformanceTimer.hpp" #include "prx/libSceAgcDriver/Execution/include/BdaFeatures.hpp" +#include "prx/libSceAgcDriver/Execution/include/HostReportSources.hpp" +#include "prx/libSceAgcDriver/Execution/include/HostReportVulkan.hpp" #include "prx/libSceAgcDriver/Execution/include/DeviceFault.hpp" #include "prx/libSceAgcDriver/Execution/include/FragmentBarycentric.hpp" #include "prx/libSceAgcDriver/Execution/include/Float32FlushControl.hpp" @@ -28,6 +31,7 @@ #include "prx/libSceAgcDriver/Execution/include/SwapchainImages.hpp" #include "prx/libSceAgcDriver/Execution/include/PerformanceOverlay.hpp" #include "prx/libSceAgcDriver/Execution/include/KeyboardOverlay.hpp" +#include "prx/libSceAgcDriver/Execution/include/PadStatusOverlay.hpp" #include "prx/libSceAgcDriver/Execution/include/PresentationPass.hpp" #include "prx/libSceAgcDriver/Execution/include/PresentationScaler.hpp" #include "prx/libSceAgcDriver/Execution/include/Screenshot.hpp" @@ -63,6 +67,7 @@ #include #include #include +#include #include #include #include @@ -144,6 +149,35 @@ void require(bool condition, const char* reason) { if (!condition) throw std::runtime_error(std::string("Vulkan presentation: ") + reason); } +void checkHostRequirements(const HostGpuQuery& query, bool printReport) { + HostGpuFacts gpu; + try { + gpu = CollectHostGpuFacts(query); + } catch (const std::exception& error) { + if (printReport) std::fprintf(stderr, "AnyPS5 host report: the GPU could not be queried: %s\n", error.what()); + return; + } + const bool lacking = !MissingRequirements(gpu).empty(); + if (!printReport && !lacking) return; + auto facts = printReport ? CollectHostFacts(SystemHostSources()) : HostFacts{}; + if (!printReport) { + try { + facts.redactions = SystemHostSources().redactions(); + } catch (const std::exception&) { + } + } + if (printReport) { + static std::atomic printed{false}; + if (!printed.exchange(true)) { + facts.gpu = gpu; + const auto text = FormatHostReport(facts); + std::fputs(text.c_str(), stderr); + std::fflush(stderr); + } + } + if (lacking) throw std::runtime_error(DescribeMissingRequirements(gpu, facts.redactions)); +} + bool CoreVulkanCapability(std::uint32_t capability) { switch (capability) { case spv::CapabilityMatrix: @@ -528,6 +562,7 @@ struct VulkanDevice::State { std::unique_ptr planePass; std::unique_ptr overlay; std::unique_ptr keyboard; + std::unique_ptr padStatus; VkFormat surfaceFormat = VK_FORMAT_B8G8R8A8_UNORM; VkColorSpaceKHR surfaceColorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR; bool swapchainColorSpaces = false; @@ -804,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; @@ -928,6 +964,7 @@ struct VulkanDevice::State { overlay.reset(); planePass.reset(); keyboard.reset(); + padStatus.reset(); presentation.reset(); scaler.reset(); hdrScaler.reset(); @@ -1131,6 +1168,7 @@ VulkanDevice::VulkanDevice(CompileOnly) : VulkanDevice(nullptr, true) {} VulkanDevice::VulkanDevice(const PresentationWindow* window, bool compileOnly) : state(std::make_unique()), serial([] { static std::atomic serials{0}; return serials.fetch_add(1, std::memory_order_relaxed) + 1; }()) { state->compileOnly = compileOnly; + const bool hostReport = !compileOnly && ParseHostReportSetting(std::getenv("ANYPS5_HOST_REPORT")); APS5_LOG_OUT("VulkanDevice constructor window=%p", static_cast(window)); #ifdef _WIN32 state->library = SDL_LoadObject("vulkan-1.dll"); @@ -1212,6 +1250,7 @@ VulkanDevice::VulkanDevice(const PresentationWindow* window, bool compileOnly) : return false; }; std::string candidateNames; + std::vector candidateList; const auto rankDeviceType = [](VkPhysicalDeviceType type) { switch (type) { case VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU: return 3; @@ -1227,6 +1266,7 @@ VulkanDevice::VulkanDevice(const PresentationWindow* window, bool compileOnly) : APS5_LOG_OUT("Physical device candidate=%p name=%s api=0x%x type=%d", reinterpret_cast(physical), properties.deviceName, properties.apiVersion, static_cast(properties.deviceType)); if (!candidateNames.empty()) candidateNames += ", "; candidateNames += properties.deviceName; + candidateList.emplace_back(properties.deviceName); if (properties.apiVersion < VK_API_VERSION_1_1) { continue; } @@ -1311,6 +1351,19 @@ VulkanDevice::VulkanDevice(const PresentationWindow* window, bool compileOnly) : state->workgroupScopeFences = WorkgroupScopeFenceUsable(driver.driverID); state->ldsLockFences = LdsLockFencesRequired(driver.driverID); } + { + HostGpuQuery hostQuery; + hostQuery.instanceProc = state->instanceProc; + hostQuery.instance = state->instance; + hostQuery.physical = selected; + hostQuery.surface = state->surface; + hostQuery.presentation = window != nullptr; + hostQuery.subgroupSize = state->subgroup.subgroupSize; + hostQuery.extensions = availableExtensions; + hostQuery.candidates = candidateList; + hostQuery.requestedPresentMode = std::getenv("ANYPS5_PRESENT_MODE"); + checkHostRequirements(hostQuery, hostReport); + } if (driverId == VK_DRIVER_ID_NVIDIA_PROPRIETARY && hasExtension(VK_NV_SHADER_SM_BUILTINS_EXTENSION_NAME)) { VkPhysicalDeviceShaderSMBuiltinsPropertiesNV smBuiltins{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV}; VkPhysicalDeviceProperties2 smProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, &smBuiltins}; @@ -1348,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}; @@ -1375,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)) { @@ -1688,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}; @@ -2336,12 +2380,34 @@ bool VulkanDevice::ReplayComputePipeline(const ShaderRecompiler::RecompileResult std::lock_guard pipelines(state->computePipelinesMutex); if (state->computePipelines.contains(key) || state->computePipelinesBuilding.contains(key)) return false; } - 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; + 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()); + } + 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 { @@ -2360,6 +2426,8 @@ void VulkanDevice::PrebuildComputePipeline(const ShaderRecompiler::RecompileResu const auto pushStages = Graphics::PushConstantStages(shaders); if (pushStages != 0 && state->properties.limits.maxPushConstantsSize < Graphics::ComputePushConstantBytes) return; if (HasComputePipeline(shader)) return; + const CompileBudget::Hold hold(BackgroundCompileBudget(), shader.spirv.size() * sizeof(std::uint32_t)); + if (HasComputePipeline(shader)) return; const auto layouts = Graphics::DescribeSetLayouts(context, shaders); static_cast(computePipeline(context, shader, layouts.layouts.main, layouts.mainKey, pushStages, programAddress)); } @@ -2416,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); } @@ -2595,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; @@ -3641,9 +3713,11 @@ bool VulkanDevice::present(std::uint32_t width, std::uint32_t height, bool opaqu plane = nullptr; } const auto planeSource = plane != nullptr ? OverlayPlaneSource(graphicsContext(), *plane) : PlaneSource{}; - const auto keyboardView = SystemOverlayView(); - const bool keyboard = keyboardView.has_value(); - const bool drawsOver = overlay || keyboard || plane != nullptr; + const auto systemLayout = SystemOverlayLayout(state->extent); + const bool keyboard = systemLayout.has_value(); + const auto padStatusLines = PadStatusOverlayLines(); + const bool padStatusShown = PadStatusDrawn(padStatusLines.has_value(), keyboard); + const bool drawsOver = overlay || keyboard || padStatusShown || plane != nullptr; if (display != nullptr && resident == nullptr) { static_cast(DisplayBufferSize(*display)); state->colorTransfer->Upload(display->address, width, height, Graphics::ColorTileMode::RenderTarget, DisplayTexelBytes(display->pixelFormat)); @@ -3807,7 +3881,7 @@ bool VulkanDevice::present(std::uint32_t width, std::uint32_t height, bool opaqu } if (plane != nullptr) { bindPlane(); - state->planePass->RecordOverlay(commands, planeSlot, barrier.image, state->surfaceFormat, state->surfaceColorSpace, state->extent, drawn ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, overlay || keyboard ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_PRESENT_SRC_KHR); + state->planePass->RecordOverlay(commands, planeSlot, barrier.image, state->surfaceFormat, state->surfaceColorSpace, state->extent, drawn ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, overlay || keyboard || padStatusShown ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_PRESENT_SRC_KHR); if (planeSource.resident != nullptr) { planeBarrier.srcAccessMask = VK_ACCESS_SHADER_READ_BIT; planeBarrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_TRANSFER_WRITE_BIT; @@ -3817,13 +3891,17 @@ bool VulkanDevice::present(std::uint32_t width, std::uint32_t height, bool opaqu } if (keyboard) { if (!state->keyboard) state->keyboard = std::make_unique(graphicsContext(), state->presentSlots.size()); - state->keyboard->RecordRects(commands, static_cast(&slot - state->presentSlots.data()), barrier.image, state->surfaceFormat, state->surfaceColorSpace, state->extent, drawn || plane != nullptr ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, overlay ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, LayOutKeyboard(*keyboardView, state->extent)); + state->keyboard->RecordRects(commands, static_cast(&slot - state->presentSlots.data()), barrier.image, state->surfaceFormat, state->surfaceColorSpace, state->extent, drawn || plane != nullptr ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, overlay ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, *systemLayout); + } + if (padStatusShown) { + if (!state->padStatus) state->padStatus = std::make_unique(graphicsContext(), state->presentSlots.size()); + state->padStatus->RecordRects(commands, static_cast(&slot - state->presentSlots.data()), barrier.image, state->surfaceFormat, state->surfaceColorSpace, state->extent, drawn || plane != nullptr ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, overlay ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, LayOutPadStatus(*padStatusLines, state->extent, PerformanceOverlay::Corner())); } if (overlay) { if (!state->overlay) state->overlay = std::make_unique(graphicsContext(), state->presentSlots.size()); state->overlay->NotePresent(std::chrono::steady_clock::now(), clearOnly ? VkExtent2D{} : VkExtent2D{width, height}, OverlayPresentInfo{std::exchange(state->presentedAddress, 0), state->presentMode, presentCounters.acquireDrops}); - state->overlay->Record(commands, static_cast(&slot - state->presentSlots.data()), barrier.image, state->surfaceFormat, state->surfaceColorSpace, state->extent, drawn || plane != nullptr || keyboard ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR); - } else if (!drawn && plane == nullptr && !keyboard) { + state->overlay->Record(commands, static_cast(&slot - state->presentSlots.data()), barrier.image, state->surfaceFormat, state->surfaceColorSpace, state->extent, drawn || plane != nullptr || keyboard || padStatusShown ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR); + } else if (!drawn && plane == nullptr && !keyboard && !padStatusShown) { barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; barrier.dstAccessMask = 0; barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; @@ -4068,6 +4146,7 @@ ShaderRecompiler::SpirvTarget VulkanDevice::buildTarget() const { target.pixelFunctionStorageDwords = state->pixelFunctionStorageDwords; target.deviceScopeLdsMemoryBarriers = !state->workgroupScopeFences; target.ldsLockFences = state->ldsLockFences; + target.meshWindowBuffer = state->driverId == VK_DRIVER_ID_NVIDIA_PROPRIETARY && std::getenv("APS5_NO_MESH_WINDOW_BUFFER") == nullptr; target.srgbDecodeFormats = state->srgbDecodeFormats & ~state->srgbCopyFormats; target.vertexSubgroups = (state->subgroup.supportedStages & VK_SHADER_STAGE_VERTEX_BIT) != 0; if (state->meshShader) { @@ -4935,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; @@ -4957,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); @@ -4974,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()) { @@ -5528,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; @@ -5685,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/Execution/src/WorkerSampler.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/WorkerSampler.cpp index 63e53b148329..7eefc1cce6cd 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/WorkerSampler.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/WorkerSampler.cpp @@ -11,9 +11,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -30,6 +32,20 @@ std::jthread processSamplerThread; std::jthread workerSamplerThread; std::jthread committerSamplerThread; +std::optional ConfiguredPath(const wchar_t* value) { + if (value == nullptr) return std::nullopt; + const auto text = std::filesystem::path(value).u8string(); + return std::string(reinterpret_cast(text.data()), text.size()); +} + +std::filesystem::path NativePath(const std::string& path) { + return std::filesystem::path(reinterpret_cast(path.c_str())); +} + +std::FILE* OpenForWriting(const std::string& path) { + return _wfopen(NativePath(path).c_str(), L"w"); +} + // Debug aid: APS5_SAMPLE_WORKER= samples the calling thread every millisecond and, every 20 s, // writes "module+offset self inclusive" lines to for offline symbolization with nm. struct Sampler { @@ -173,7 +189,7 @@ struct Sampler { void write() { std::lock_guard lock(mutex); - std::FILE* file = std::fopen(path.c_str(), "w"); + std::FILE* file = OpenForWriting(path); if (file == nullptr) return; std::fprintf(file, "# %llu samples\n", static_cast(samples)); std::map loaded; @@ -199,7 +215,7 @@ struct Sampler { std::map names; std::map loaded; for (const auto& [address, count] : counts) names.emplace(address, frameName(address, loaded)); - std::FILE* file = std::fopen(temporary.c_str(), "w"); + std::FILE* file = OpenForWriting(temporary); if (file == nullptr) return; LARGE_INTEGER frequency{}; QueryPerformanceFrequency(&frequency); @@ -210,7 +226,7 @@ struct Sampler { const auto text = stacks.Format([&](std::uint64_t address) { return names.at(address); }); const bool written = std::fwrite(text.data(), 1, text.size(), file) == text.size(); if (std::fclose(file) != 0 || !written) return; - MoveFileExA(temporary.c_str(), collapsed.c_str(), MOVEFILE_REPLACE_EXISTING); + MoveFileExW(NativePath(temporary).c_str(), NativePath(collapsed).c_str(), MOVEFILE_REPLACE_EXISTING); } }; @@ -250,7 +266,7 @@ struct ProcessSampler { } void write() { - std::FILE* file = std::fopen(path.c_str(), "w"); + std::FILE* file = OpenForWriting(path); if (file == nullptr) return; std::fprintf(file, "# %llu rounds\n", static_cast(rounds)); std::map loaded; @@ -278,9 +294,9 @@ struct ProcessSampler { }; void StartProcessSampler() { - const char* path = std::getenv("APS5_SAMPLE_THREADS"); - if (path == nullptr) return; - processSamplerThread = std::jthread([path = std::string(path)](std::stop_token token) { + const auto path = ConfiguredPath(_wgetenv(L"APS5_SAMPLE_THREADS")); + if (!path) return; + processSamplerThread = std::jthread([path = *path](std::stop_token token) { auto sampler = std::make_unique(); sampler->path = path; sampler->self = GetCurrentThreadId(); @@ -297,10 +313,10 @@ void StartProcessSampler() { }); } -void StartCallingThreadSampler(const char* path, std::jthread& slot) { - if (path == nullptr) return; +void StartCallingThreadSampler(const std::optional& path, std::jthread& slot) { + if (!path) return; auto sampler = std::make_unique(); - sampler->path = path; + sampler->path = *path; sampler->depth = Sampler::WorkerDepth; sampler->keepStacks = true; const auto* block = reinterpret_cast(NtCurrentTeb()); @@ -332,11 +348,11 @@ void StartWorkerSampler(std::uint32_t queue) { const char* value = std::getenv("APS5_SAMPLE_WORKER_QUEUE"); return value != nullptr ? static_cast(std::strtoul(value, nullptr, 0)) : 0u; }(); - if (queue == sampledQueue) StartCallingThreadSampler(std::getenv("APS5_SAMPLE_WORKER"), workerSamplerThread); + if (queue == sampledQueue) StartCallingThreadSampler(ConfiguredPath(_wgetenv(L"APS5_SAMPLE_WORKER")), workerSamplerThread); } void StartCommitterSampler() { - StartCallingThreadSampler(std::getenv("APS5_SAMPLE_COMMITTER"), committerSamplerThread); + StartCallingThreadSampler(ConfiguredPath(_wgetenv(L"APS5_SAMPLE_COMMITTER")), committerSamplerThread); } void StopWorkerSampler() { diff --git a/core/libs/prx/libSceAgcDriver/Export.cpp b/core/libs/prx/libSceAgcDriver/Export.cpp index fd98ebbdb50f..199dad965669 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 000000000000..c4b1ec4ed2b3 --- /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/BdaResources.hpp b/core/libs/prx/libSceAgcDriver/Graphics/include/BdaResources.hpp index 3f75b2a804d1..2a796be04636 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/include/BdaResources.hpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/include/BdaResources.hpp @@ -37,8 +37,6 @@ class BdaResources { std::uint64_t hits = 0; std::uint64_t misses = 0; std::size_t held = 0; - // Hits served by the cached address space's serial alone (no hash, no compare; see - // GuestBufferMemory::CachedAddressTable), counted in `hits` too. std::uint64_t spaceTables = 0; // Why the most recently used table did not serve a build ([bda-table] first-differing entry // class): its owners were gone (expired weak reference), or its word hash differed, split by diff --git a/core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp b/core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp index e909c5a1ef8d..985840aef96c 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp @@ -346,6 +346,15 @@ struct Context { if (budget == 0 || (usage < budget && bytes <= budget - usage)) return type; const auto host = HostMemoryType(mask); if (!host) return type; + if (cacheReclaim != nullptr) { + const auto wanted = bytes + (usage > budget ? usage - budget : 0u); + const auto released = cacheReclaim(wanted, true); + if (released >= wanted) return type; + if (released != 0) { + memoryProperties2(physical, &properties); + if (reported.heapUsage[heap] < reported.heapBudget[heap] && bytes <= reported.heapBudget[heap] - reported.heapUsage[heap]) return type; + } + } static std::atomic placements{0}, placedBytes{0}; const auto count = placements.fetch_add(1) + 1; const auto total = placedBytes.fetch_add(bytes) + bytes; diff --git a/core/libs/prx/libSceAgcDriver/Graphics/include/DepthSurface.hpp b/core/libs/prx/libSceAgcDriver/Graphics/include/DepthSurface.hpp index e707fe097b90..d2d1eedb538a 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 4694fd55037e..016ca9a49379 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/include/Draw.hpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/include/Draw.hpp @@ -37,6 +37,12 @@ void PreparePixelFunctionLds(const Context& context, VkCommandBuffer commands, s void BindPixelFunctionLds(const Context& context, VkCommandBuffer commands, VkPipelineLayout layout); 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); +void ReleaseMeshWindow(VkDevice device); std::optional KnownValidationFailure(const Context& context, std::span shaders, const State& state); std::uint64_t DrawRenderPassKey(const Context& context, const State& state, std::span targetViews); diff --git a/core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp b/core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp index 72e07d86648b..e9e1874a7ee1 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 @@ class GuestBufferMemory { 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 @@ class GuestBufferMemory { // 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 @@ class GuestBufferMemory { // 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 @@ class GuestBufferMemory { // 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 @@ class GuestBufferMemory { 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/MultisampleTarget.hpp b/core/libs/prx/libSceAgcDriver/Graphics/include/MultisampleTarget.hpp index 43e8248442d1..44c1a862468a 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/include/MultisampleTarget.hpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/include/MultisampleTarget.hpp @@ -4,6 +4,7 @@ #include "prx/libSceAgcDriver/Graphics/include/Context.hpp" #include "prx/libSceAgcDriver/Graphics/include/DccMetadata.hpp" #include "prx/libSceAgcDriver/Graphics/include/SampleOrder.hpp" +#include "BdaAbi.hpp" #include "prx/libSceAgcDriver/Graphics/include/State.hpp" #include #include @@ -81,8 +82,12 @@ bool MultisampledColorFillAbsorbs(std::uint64_t address, std::size_t bytes, std: void NoteColorMetadataFill(std::uint64_t address, std::size_t bytes, std::uint32_t pattern); std::shared_ptr MultisampleTargetFmaskTexture_nid_no_patch(const Context& context, const GuestTextureResource& resource, VkComponentMapping components); void ClearMultisampleTargets(VkDevice device); +std::uint64_t MultisampleTargetRangeGeneration(); +std::optional> ExcludeMultisampleTargetRanges( + VkDevice device, std::span ranges, std::uint64_t& generation); void InstallResidentImageReadGuard_nid_no_patch(); void UpdateResidentImageUnmapObserver_nid_no_patch(); +void ClaimMultisampleTargetMemory(std::uint64_t address, std::uint64_t bytes); void GuardOneFragmentFmask(const Context& context, const ColorTarget& target); void RequireNoMultisampleTarget(std::uint64_t address, std::size_t bytes, const char* access); void RequireNoMultisampleColorTarget(std::uint64_t address, std::size_t bytes, const char* access); diff --git a/core/libs/prx/libSceAgcDriver/Graphics/include/PipelineCache.hpp b/core/libs/prx/libSceAgcDriver/Graphics/include/PipelineCache.hpp index 4aaebda08a7b..f1074b7e2d44 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/include/PipelineCache.hpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/include/PipelineCache.hpp @@ -28,6 +28,8 @@ class PipelineCache { void SaveNow(); void SaveUnlessBusy(); + friend struct PipelineCacheTestAccess; + private: struct FileHeader { std::uint32_t magic; @@ -66,6 +68,12 @@ class PipelineCache { std::thread saver; }; +struct PipelineCacheTestAccess { + static bool HasHeader(const PipelineCache& cache) { + return cache.readHeader().has_value(); + } +}; + } #endif diff --git a/core/libs/prx/libSceAgcDriver/Graphics/include/Recorder.hpp b/core/libs/prx/libSceAgcDriver/Graphics/include/Recorder.hpp index 637a5e1ab458..a52799fe7529 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/include/Recorder.hpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/include/Recorder.hpp @@ -425,6 +425,7 @@ class Recorder { // 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 @@ class Recorder { // 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, @@ -860,9 +864,7 @@ class Recorder { std::uint64_t writeNoteCount = 0; std::shared_ptr drawUpload; VkDeviceSize drawUploadUsed = 0; - // Command buffers and fences of completed batches, reused by later ones (hundreds of batches per - // frame would otherwise allocate and free their objects each time). - std::vector> spare; + std::vector spare; std::vector sparePools; mutable AgcDriver::Mutex completedMutex; std::array completed; diff --git a/core/libs/prx/libSceAgcDriver/Graphics/include/ResidentMirror.hpp b/core/libs/prx/libSceAgcDriver/Graphics/include/ResidentMirror.hpp index f6c10579b93a..87e0619b8ba3 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 a65ab38f730a..1f9b57f592ac 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 @@ class ShaderResources { // 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(); @@ -322,6 +323,17 @@ class ShaderResources { // Why the fast proof of a Revalidate left the object to the full walk (the [rescache] // revalidate line's reasons); Count: it did not. enum class FastFail : std::size_t { NoRecord, Collect, Pending, Evicted, Changed, Keys, ClearedView, StorageKeys, Depth, Replaced, Audit, Count }; + struct CollectRefusals { + std::uint64_t sampled = 0; + std::uint64_t storage = 0; + std::uint64_t uncommitted = 0; + std::uint64_t unwatched = 0; + std::uint64_t other = 0; + std::uint64_t surfaces = 0; + std::uint64_t bytes = 0; + }; + static CollectRefusals CollectRefusalCounts(); + static std::array(FastFail::Count)> FullWalkNanoseconds(); // Why a Pending failure was left to the full walk instead of the own-object refresh (T1, see // refreshOwnObjects); Count: it was not. enum class OwnRefreshFallback : std::size_t { Disabled, Snapshot, Keys, ForeignView, SurfaceKey, NotImported, Uncached, Rerun, Count }; @@ -450,6 +462,7 @@ class ShaderResources { std::size_t addGuestBuffer(std::span words, const ColorTarget* target, std::uint64_t indexAddress, std::size_t indexBytes, bool written, bool atomic, bool read, std::uint32_t extent); std::uint64_t guestBufferBytes(std::span words) const; std::size_t addDataBuffer(std::span words); + void requireGuestBuffers(std::span moved = {}) const; // Stage A: the layout entry of an image binding (samplers are taken at once, the sampler cache // locks itself); stage B looks the sampled textures and storage images up (resolveImageBinding). void addImageBinding(const ShaderRecompiler::DescriptorBinding& binding, VkShaderStageFlags flags); @@ -535,6 +548,8 @@ class ShaderResources { bool storage; bool viewUncompressed; bool sourceEligible = false; + bool depthCompare = false; + bool sourceRefreshed = false; }; // `serialBefore` is StorageTexture::PendingSerial() loaded before any check of this Revalidate; // `refreshed` the surfaces refreshOwnObjects resolved earlier in the same Revalidate (empty on @@ -608,6 +623,7 @@ class ShaderResources { 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/State.hpp b/core/libs/prx/libSceAgcDriver/Graphics/include/State.hpp index a3d0965993b6..b3b31c409d1c 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/include/State.hpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/include/State.hpp @@ -219,7 +219,7 @@ std::uint16_t PackedWriteMask(std::uint8_t componentMapping, std::uint32_t expor GuestTextureResource TargetMergeSurface(const ColorTarget& color); bool DepthStencilWrites(const State& state); bool DepthStencilTests(const State& state); -ShaderRecompiler::TargetMerge ExportTargetMerge(const State& state); +std::vector ExportTargetMerges(const State& state); ShaderRecompiler::RasterPrimitive RasterPrimitiveOf(const State& state); bool PartialSampleMask(const State& state); bool UniformSampleMask(const State& state); diff --git a/core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp b/core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp index dfc8e9679e4d..6baa15aab695 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 @@ class StorageTexture : public std::enable_shared_from_this { // 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; @@ -358,7 +359,7 @@ class StorageTexture : public std::enable_shared_from_this { const GuestTextureResource& Descriptor() const { return descriptor; } std::uint32_t ImageLayers() const { return geometry.imageLayers; } std::uint32_t ImageDepth() const { return geometry.imageDepth; } - VkFormat ImageFormat() const { return storageFormat; } + VkFormat ImageFormat() const { return imageFormat; } // Content version: advances when the image is re-uploaded or a shader wrote it. Together with // Generation (the write generation guest memory was last known to match the content at) it // validates textures copied from this image. @@ -383,6 +384,7 @@ class StorageTexture : public std::enable_shared_from_this { inline static std::atomic epochRefreshes{0}; static std::uint64_t SinglePassMoves(); static std::uint64_t SlabRetiles(); + static std::uint64_t PaddingSeedCopies(); static std::uint64_t RefreshesProved(); static std::uint64_t ClearHandOvers(); static std::uint64_t HandedOverSuperseded(); @@ -401,6 +403,7 @@ class StorageTexture : public std::enable_shared_from_this { // The regions of every array layer, or of the tracked layers `layers` selects. std::vector CopyRegions(const std::vector* layers = nullptr) const; void upload(const std::vector* layers = nullptr); + void clearImage(VkCommandBuffer commands, VkClearColorValue value, const VkImageSubresourceRange& range); std::vector cpuUploadLayers(const std::vector& units) const; void captureGuestBytes(const std::vector* layers); bool originalHolds(std::uint64_t address, std::size_t bytes) const; @@ -458,6 +461,7 @@ class StorageTexture : public std::enable_shared_from_this { // covered tile blocks and of linear rows, tail blocks, the bytes between mips; every byte of a // thick surface), ascending: a write-back keeps the guest's bytes there. std::vector> uncoveredBytes(std::span> runs) const; + std::vector> coveredBytes(std::span> runs) const; // The seed of a write-back's tiled scratch where its copies would carry bytes no element holds: // those bytes' current contents (a fresh unit shadow's, else the import's), copied into the // scratch before the retile, so the copies out of the scratch store them unchanged. `copied` @@ -669,6 +673,7 @@ class StorageTexture : public std::enable_shared_from_this { VkDeviceMemory proxyMemory = VK_NULL_HANDLE; VkImageView proxyView = VK_NULL_HANDLE; VkFormat storageFormat = VK_FORMAT_UNDEFINED; + VkFormat imageFormat = VK_FORMAT_UNDEFINED; // Results are on the GPU only (guarded by the pending-write registry lock). bool dirty = false; bool drawnListed = false; diff --git a/core/libs/prx/libSceAgcDriver/Graphics/include/TextureDetiler.hpp b/core/libs/prx/libSceAgcDriver/Graphics/include/TextureDetiler.hpp index d0b15ac51c8a..93fa96c5eb00 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/include/TextureDetiler.hpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/include/TextureDetiler.hpp @@ -79,6 +79,8 @@ namespace AgcDriver::Graphics { VkPipelineLayout pipelineLayout = VK_NULL_HANDLE; VkShaderModule module = VK_NULL_HANDLE; std::vector> pipelines; + std::vector> gcnGeometries; + std::uint32_t layerBankXor(TextureTileMode tileMode, std::uint32_t elementBytes, const TileMipLayout& layout, std::uint32_t layer); DescriptorRing descriptorSets; VkDescriptorSetLayout cmaskDescriptorLayout = VK_NULL_HANDLE; VkPipelineLayout cmaskPipelineLayout = VK_NULL_HANDLE; diff --git a/core/libs/prx/libSceAgcDriver/Graphics/include/TextureTiling.hpp b/core/libs/prx/libSceAgcDriver/Graphics/include/TextureTiling.hpp index 8b27373458bc..75a94a7d15e8 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/include/TextureTiling.hpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/include/TextureTiling.hpp @@ -88,8 +88,12 @@ struct GcnTileGeometry { std::array equation; std::uint32_t splitSlices = 1; std::array splitMasks{}; + std::uint32_t layerBankStep = 0; + std::uint32_t bankMask = 0; + std::uint32_t bankShift = 0; }; GcnTileGeometry GcnTiling(TextureTileMode tileMode, std::uint32_t bytesPerElement); +inline std::uint32_t GcnLayerBankXor(const GcnTileGeometry& geometry, std::uint32_t layer) { return ((geometry.layerBankStep * layer) & geometry.bankMask) << geometry.bankShift; } inline TextureTileMode MipTileMode(TextureTileMode tileMode, const TileMipLayout& mip) { return mip.gcnMicroTiled ? GcnMicroTileMode(tileMode) : tileMode; } bool LevelsFitAllocation(const GuestTextureResource& surface, std::uint32_t levels); GuestTextureResource ViewedArrayWindow(const GuestTextureResource& viewed, bool keysReadAsStored); diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/BdaResources.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/BdaResources.cpp index a8440fb7f0ac..3b0498e7b85c 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/src/BdaResources.cpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/src/BdaResources.cpp @@ -1,5 +1,6 @@ #include "prx/libSceAgcDriver/Graphics/include/BdaResources.hpp" #include "prx/libSceAgcDriver/Execution/include/Mutex.hpp" +#include "prx/libSceAgcDriver/Graphics/include/MultisampleTarget.hpp" #include "ImageTableAbi.hpp" #include "prx/libSceAgcDriver/Execution/include/GuestMemory.hpp" #include @@ -18,29 +19,11 @@ namespace AgcDriver::Graphics { namespace { -// The page tables built per device, reused by a build whose ranges (guest ranges, device -// addresses, permissions) equal one of them: consecutive address-based builds map the same registered -// set through the same imports and mirrors, so the ~1200-entry table repeats. The shader only reads -// the table (its lookup keeps its state in function variables), and a batch in flight keeps its -// BdaResources, so sharing the buffer is safe. The cache holds the tables weakly: they never outlive -// the builds that own them (a static owner would destroy the buffer after its device, at exit or on -// device replacement, and would fail the tests' leak check), and with deferred lease release the -// previous builds are still in flight when the next one asks, which is what makes the hit rate. -// One table was enough while every build repeated the last one exactly; now the misaligned -// descriptor sub-ranges the GPU copies out of imports sit in pool staging buffers whose device -// addresses cycle through the few buffers the batches in flight leave free, and the three -// address-based programs of one queue interleave with the lease draws, so a table differs from the -// previous one and comes back a few builds later (69% misses in the wave-8 run, 4% before the GPU -// copies). Hence several recent tables, most recently used first, matched by a word hash before -// the byte compare. APS5_BDA_TABLE_CACHE_ENTRIES sets how many (default 8; 1 is the previous -// behaviour); APS5_NO_BDA_TABLE_CACHE=1 builds every table. -// A table built for (or found equal to) the cached address space's ranges carries the space's -// serial: a build served by that space alone binds it by the serial, with no hash and no compare. struct TableEntry { std::uint64_t hash; std::vector ranges; std::weak_ptr buffer; - std::uint64_t spaceSerial = 0; + std::vector> spaceKeys; }; struct TableCache { @@ -54,8 +37,6 @@ struct TableCache { bool sameRanges(const std::vector& left, const std::vector& right); -// APS5_PROFILE_DRAW: why the most recently used entry did not serve this build (see -// TableCacheStats). Under the cache mutex. void classifyFirstEntry(TableCache& cache, std::uint64_t hash, const std::vector& ranges) { static const bool profile = std::getenv("APS5_PROFILE_DRAW") != nullptr; if (!profile) return; @@ -135,8 +116,33 @@ BdaResources::BdaResources(const Context& context, const GuestBufferMemory& memo const auto cached = memory.CachedAddressTable(); std::vector built; if (!cached.has_value()) built = memory.AddressRanges(); - const auto& ranges = cached.has_value() ? *cached->ranges : built; + const auto& addressRanges = cached.has_value() ? *cached->ranges : built; const auto serial = cached.has_value() ? cached->serial : 0; + auto guardSerial = MultisampleTargetRangeGeneration(); + if (tableCacheEnabled() && serial != 0) { + auto& cache = Tables(); + std::lock_guard lock(cache.mutex); + if (cache.device != context.device) { + cache.entries.clear(); + cache.device = context.device; + } + for (auto it = cache.entries.begin(); it != cache.entries.end(); ++it) { + const auto key = std::pair{serial, guardSerial}; + if (std::find(it->spaceKeys.begin(), it->spaceKeys.end(), key) == it->spaceKeys.end()) continue; + if (auto shared = it->buffer.lock(); shared != nullptr) { + tableBytes = shared->Bytes().size(); + ++cache.hits; + ++cache.classes.spaceTables; + table = std::move(shared); + cache.entries.splice(cache.entries.begin(), cache.entries, it); + return; + } + cache.entries.erase(it); + break; + } + } + auto filtered = ExcludeMultisampleTargetRanges(context.device, addressRanges, guardSerial); + const auto& ranges = filtered.has_value() ? *filtered : addressRanges; Require(ranges.size() <= std::numeric_limits::max(), "BDA table range count overflow"); Require(ranges.size() <= (std::numeric_limits::max() - sizeof(ShaderRecompiler::BdaAbi::Header)) / sizeof(ShaderRecompiler::BdaAbi::Range), "BDA table size overflow"); tableBytes = sizeof(ShaderRecompiler::BdaAbi::Header) + ranges.size() * sizeof(ShaderRecompiler::BdaAbi::Range); @@ -150,20 +156,6 @@ BdaResources::BdaResources(const Context& context, const GuestBufferMemory& memo cache.entries.clear(); cache.device = context.device; } - if (serial != 0) { - for (auto it = cache.entries.begin(); it != cache.entries.end(); ++it) { - if (it->spaceSerial != serial) continue; - if (auto shared = it->buffer.lock(); shared != nullptr) { - ++cache.hits; - ++cache.classes.spaceTables; - table = std::move(shared); - cache.entries.splice(cache.entries.begin(), cache.entries, it); - return; - } - cache.entries.erase(it); - break; - } - } hash = hashRanges(ranges); classifyFirstEntry(cache, hash, ranges); for (auto it = cache.entries.begin(); it != cache.entries.end();) { @@ -186,9 +178,13 @@ BdaResources::BdaResources(const Context& context, const GuestBufferMemory& memo } if (sameRanges(it->ranges, ranges)) { ++cache.hits; - // An equal table of an earlier space (a rebuild that mapped the same ranges the - // same way): the next build of this space binds it by the serial. - if (serial != 0) it->spaceSerial = serial; + if (serial != 0) { + const auto key = std::pair{serial, guardSerial}; + auto found = std::find(it->spaceKeys.begin(), it->spaceKeys.end(), key); + if (found != it->spaceKeys.end()) it->spaceKeys.erase(found); + it->spaceKeys.push_back(key); + if (it->spaceKeys.size() > tableCacheEntries()) it->spaceKeys.erase(it->spaceKeys.begin()); + } table = std::move(shared); cache.entries.splice(cache.entries.begin(), cache.entries, it); return; @@ -209,7 +205,9 @@ BdaResources::BdaResources(const Context& context, const GuestBufferMemory& memo cache.entries.clear(); cache.device = context.device; } - cache.entries.push_front({hash, cached.has_value() ? ranges : std::move(built), table, serial}); + auto cachedRanges = filtered.has_value() ? std::move(*filtered) : cached.has_value() ? *cached->ranges : std::move(built); + cache.entries.push_front({hash, std::move(cachedRanges), table, {}}); + if (serial != 0) cache.entries.front().spaceKeys.emplace_back(serial, guardSerial); while (cache.entries.size() > tableCacheEntries()) cache.entries.pop_back(); } } diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/DccMetadata.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/DccMetadata.cpp index 94751531e65d..60a6fe706884 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 a1ba618fef5f..73d166e5f6b0 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp @@ -590,6 +590,11 @@ class DepthSurface { stencilMemory = target.stencilAddress != 0 ? GuestMemory::CollectWrites(target.stencilAddress, static_cast(stencilBytes())) : 0; } + bool OverwrittenOnGpu() const { + std::array, 2> ranges{{{target.address, target.address + depthBytes()}, {target.stencilAddress, target.stencilAddress + stencilBytes()}}}; + return StorageTexture::AnyPendingOverlaps(std::span(ranges).first(target.stencilAddress != 0 ? 2u : 1u)); + } + bool OverwrittenInMemory() const { GuestMemory::CollectWrites(target.address, static_cast(depthBytes())); if (GuestMemory::WrittenSince(target.address, static_cast(depthBytes()), depthMemory)) return true; @@ -1856,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); @@ -1905,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); @@ -2090,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; @@ -2193,6 +2251,10 @@ float HostDepthBiasConstant(const Context& context, VkFormat format, float const } VkImageView DepthSurfaceView(const Context& context, const DepthTarget& target, bool depthWritten) { + const auto planeBytes = [&](std::uint32_t bytesPerTexel) { return target.samples == 1u ? DepthSliceBytes(target.extent, bytesPerTexel) : MultisampledDepthBytes_nid_no_patch(target.extent, bytesPerTexel, target.samples); }; + ClaimMultisampleTargetMemory(target.address, planeBytes(target.format == VK_FORMAT_D16_UNORM || target.format == VK_FORMAT_D16_UNORM_S8_UINT ? 2u : 4u)); + if (target.stencilAddress != 0u) ClaimMultisampleTargetMemory(target.stencilAddress, planeBytes(1u)); + if (target.htileAddress != 0u) ClaimMultisampleTargetMemory(target.htileAddress, HtileMetadataBytes(target.extent)); const auto htileCleared = RoutesToNativeDepthOwner(target) ? VkImageAspectFlags{0} : storeBackClearedHtile(context, target); std::lock_guard gpu(GuestMemory::GpuMutex()); settlePendingHtileClear(context, target.address); @@ -2430,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; @@ -2522,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); @@ -2584,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); @@ -2658,10 +2773,11 @@ std::shared_ptr DepthSurfaceTexture(const Context& context, std::span resource.depthOrLastArray)) && !(cube && resource.depthOrLastArray != 0 && (resource.depthOrLastArray + 1u) % 6u != 0u) && (resource.dimension == TextureDimension::k2D || resource.dimension == TextureDimension::k2DArray || cube); - if (!(sampled ? found->SampledAccepts(words, resource) : planes) && found->OverwrittenInMemory()) { + if (!(sampled ? found->SampledAccepts(words, resource) : planes) && (found->OverwrittenInMemory() || found->OverwrittenOnGpu())) { retireStoringStale(*found); return nullptr; } + if (sampled && !stencil && mirrorable(base)) found->SyncFromMemory(mirrorResource(base)); found->ApplyFastClear(); if (sampled) return found->Sampled(words, resource, components, found == drawnDepth); Require(found->hostFormat == base.format, "sampling several slices or an integer view of a depth plane that the device stores in another depth format is not implemented"); diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp index 16e8a2cd1d44..3b6c9f52a2a1 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp @@ -71,6 +71,33 @@ std::unordered_map& PixelLdsPools() { return pools; } +struct MeshWindowPool { + Context context{}; + VkBuffer buffer = VK_NULL_HANDLE; + VkDeviceMemory memory = VK_NULL_HANDLE; + VkDescriptorPool descriptorPool = VK_NULL_HANDLE; + VkDescriptorSet set = VK_NULL_HANDLE; + VkDescriptorSetLayout layout = VK_NULL_HANDLE; +}; + +std::mutex& MeshWindowMutex() { + static std::mutex mutex; + return mutex; +} + +std::unordered_map& MeshWindowPools() { + static std::unordered_map pools; + return pools; +} + +void DestroyMeshWindow(MeshWindowPool& pool) { + if (pool.descriptorPool != VK_NULL_HANDLE) pool.context.Function("vkDestroyDescriptorPool")(pool.context.device, pool.descriptorPool, nullptr); + if (pool.buffer != VK_NULL_HANDLE) pool.context.Function("vkDestroyBuffer")(pool.context.device, pool.buffer, nullptr); + if (pool.memory != VK_NULL_HANDLE) pool.context.Function("vkFreeMemory")(pool.context.device, pool.memory, nullptr); + if (pool.layout != VK_NULL_HANDLE) pool.context.Function("vkDestroyDescriptorSetLayout")(pool.context.device, pool.layout, nullptr); + pool = MeshWindowPool{}; +} + void DestroyPixelFunctionLds(PixelFunctionLdsPool& pool) { if (pool.header != nullptr) pool.context.Function("vkUnmapMemory")(pool.context.device, pool.memory); if (pool.descriptorPool != VK_NULL_HANDLE) pool.context.Function("vkDestroyDescriptorPool")(pool.context.device, pool.descriptorPool, nullptr); @@ -191,6 +218,97 @@ void PreparePixelFunctionLds(const Context& context, VkCommandBuffer commands, s context.Resolved(&DeviceFunctions::cmdPipelineBarrier, "vkCmdPipelineBarrier")(commands, VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, 1, &afterFill, 0, nullptr, 0, nullptr); } +bool UsesMeshWindow(std::span shaders) { + return std::ranges::any_of(shaders, [](const CompiledShader& shader) { return shader.program != nullptr && shader.program->meshWindowBuffer; }); +} + +VkDescriptorSetLayout MeshWindowSetLayout(const Context& context) { + std::lock_guard lock(MeshWindowMutex()); + auto& pool = MeshWindowPools()[context.device]; + if (pool.layout == VK_NULL_HANDLE) { + pool.context = context; + const VkDescriptorSetLayoutBinding binding{0u, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1u, VK_SHADER_STAGE_MESH_BIT_EXT, nullptr}; + VkDescriptorSetLayoutCreateInfo info{VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO}; + info.bindingCount = 1u; + info.pBindings = &binding; + Check(context.Function("vkCreateDescriptorSetLayout")(context.device, &info, nullptr, &pool.layout), "vkCreateDescriptorSetLayout mesh window"); + } + return pool.layout; +} + +void PrepareMeshWindow(const Context& context) { + std::lock_guard lock(MeshWindowMutex()); + auto& pool = MeshWindowPools()[context.device]; + Require(pool.layout != VK_NULL_HANDLE, "mesh window descriptor set layout was not created"); + if (pool.set != VK_NULL_HANDLE) return; + try { + const auto bytes = (static_cast(ShaderRecompiler::MeshWindowHeaderDwords) + static_cast(ShaderRecompiler::MeshWindowSlots) * ShaderRecompiler::MeshWindowSlotDwords) * 4ull; + Require(bytes <= context.limits.maxStorageBufferRange, "mesh window pool does not fit in the device storage buffer range"); + VkBufferCreateInfo bufferInfo{VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO}; + bufferInfo.size = bytes; + bufferInfo.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; + bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + Check(context.Function("vkCreateBuffer")(context.device, &bufferInfo, nullptr, &pool.buffer), "vkCreateBuffer mesh window"); + VkMemoryRequirements requirements{}; + context.Function("vkGetBufferMemoryRequirements")(context.device, pool.buffer, &requirements); + VkMemoryAllocateInfo allocation{VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO}; + allocation.allocationSize = requirements.size; + allocation.memoryTypeIndex = context.MemoryType(requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + Check(context.Function("vkAllocateMemory")(context.device, &allocation, nullptr, &pool.memory), "vkAllocateMemory mesh window"); + Check(context.Function("vkBindBufferMemory")(context.device, pool.buffer, pool.memory, 0), "vkBindBufferMemory mesh window"); + const VkDescriptorPoolSize size{VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1u}; + VkDescriptorPoolCreateInfo poolInfo{VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO}; + poolInfo.maxSets = 1u; + poolInfo.poolSizeCount = 1u; + poolInfo.pPoolSizes = &size; + Check(context.Function("vkCreateDescriptorPool")(context.device, &poolInfo, nullptr, &pool.descriptorPool), "vkCreateDescriptorPool mesh window"); + VkDescriptorSetAllocateInfo sets{VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO}; + sets.descriptorPool = pool.descriptorPool; + sets.descriptorSetCount = 1u; + sets.pSetLayouts = &pool.layout; + VkDescriptorSet set = VK_NULL_HANDLE; + Check(context.Function("vkAllocateDescriptorSets")(context.device, &sets, &set), "vkAllocateDescriptorSets mesh window"); + const VkDescriptorBufferInfo buffer{pool.buffer, 0, bytes}; + VkWriteDescriptorSet write{VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET}; + write.dstSet = set; + write.dstBinding = 0u; + write.descriptorCount = 1u; + write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + write.pBufferInfo = &buffer; + context.Function("vkUpdateDescriptorSets")(context.device, 1u, &write, 0u, nullptr); + CommandBatch batch(context); + const auto commands = batch.Handle(); + context.Function("vkCmdFillBuffer")(commands, pool.buffer, 0, ShaderRecompiler::MeshWindowHeaderDwords * 4u, 0u); + const VkMemoryBarrier afterFill{VK_STRUCTURE_TYPE_MEMORY_BARRIER, nullptr, VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT}; + context.Function("vkCmdPipelineBarrier")(commands, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 1, &afterFill, 0, nullptr, 0, nullptr); + batch.SubmitAndWait(); + pool.set = set; + std::fprintf(stderr, "[gpu] mesh window pool: %u workgroup slots, %llu MiB\n", ShaderRecompiler::MeshWindowSlots, static_cast(bytes >> 20u)); + } catch (...) { + const auto layout = pool.layout; + pool.layout = VK_NULL_HANDLE; + DestroyMeshWindow(pool); + pool.context = context; + pool.layout = layout; + throw; + } +} + +void BindMeshWindow(const Context& context, VkCommandBuffer commands, VkPipelineLayout layout) { + std::lock_guard lock(MeshWindowMutex()); + const auto& pool = MeshWindowPools().at(context.device); + Require(pool.set != VK_NULL_HANDLE, "mesh window buffer was not prepared"); + context.Resolved(&DeviceFunctions::cmdBindDescriptorSets, "vkCmdBindDescriptorSets")(commands, VK_PIPELINE_BIND_POINT_GRAPHICS, layout, ShaderRecompiler::MeshWindowDescriptorSet, 1, &pool.set, 0, nullptr); +} + +void ReleaseMeshWindow(VkDevice device) { + std::lock_guard lock(MeshWindowMutex()); + const auto found = MeshWindowPools().find(device); + if (found == MeshWindowPools().end()) return; + DestroyMeshWindow(found->second); + MeshWindowPools().erase(found); +} + std::uint32_t PixelFunctionLdsSubgroup(std::span shaders) { std::uint32_t subgroup = 0u; for (const auto& shader : shaders) { @@ -832,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 @@ -849,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; @@ -919,6 +1041,8 @@ bool ValidationKey(const Context& context, std::span shade return keyed; } +namespace { + AgcDriver::Mutex& validationMutex() { static AgcDriver::Mutex mutex; return mutex; @@ -2349,6 +2473,7 @@ void recordDraw(const Context& context, const State& state, const Pm4::DrawParam } const PassAccess passAccess{passReads, passWrites, passImages, passAttachments, unknownMemory, unknownWrites, passWriteOnly}; const bool fenced = state.depth.has_value() || !record.proxies.empty(); + if (UsesMeshWindow(shaders)) PrepareMeshWindow(context); const auto start = recorder->StartDrawPass(passKey, capture || readsTarget || gpuIndirect || meshIndirect || captured || PixelFunctionLdsSubgroup(shaders) != 0u, fenced, passAccess); for (const auto& target : record.multisampleTargets) KeepMultisampleTarget_nid_no_patch(target); const bool continued = start.continued; @@ -2433,6 +2558,7 @@ void recordDraw(const Context& context, const State& state, const Pm4::DrawParam resources.Bind(commands, VK_PIPELINE_BIND_POINT_GRAPHICS, record.pipeline->Layout()); } if (std::ranges::any_of(shaders, [](const CompiledShader& shader) { return shader.program != nullptr && shader.program->functionLdsBuffer; })) BindPixelFunctionLds(context, commands, record.pipeline->Layout()); + if (UsesMeshWindow(shaders)) BindMeshWindow(context, commands, record.pipeline->Layout()); APS5_LOG_CHARS_OUT_DEBUG("Resources bound"); pushDrawConstants(*record.pipeline, commands, state, draw, shaders, resources, record.pushBytes, record.pushStages, meshArguments != nullptr ? meshArguments->DeviceAddress() : 0, !inputs.restartTable.empty()); APS5_LOG_CHARS_OUT_DEBUG("Push constants recorded"); @@ -2821,6 +2947,7 @@ bool prepareDraw(const Context& context, const State& state, const Pm4::DrawPara const ColorTargetLayout colorLayout(color.extent.width, color.extent.height, color.tileMode, color.elementBytes); static_cast(FlushDepthPlanes(color.address, colorLayout.Bytes(), DepthPlaneScope::Whole)); RetireDepthSurfaces(context.device, color.address, colorLayout.Bytes()); + ClaimMultisampleTargetMemory(color.address, colorLayout.Bytes()); if (color.fmaskAddress != 0) GuardOneFragmentFmask(context, color); constexpr VkBufferUsageFlags copies = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; timer.phase(PhaseSetup); @@ -3262,6 +3389,7 @@ void recordPreparedDraw(const Context& context, const State& state, const Pm4::D return (begin < args->arguments + args->RangeBytes() && args->arguments < end) || (args->countIndirect && begin < args->countAddress + 4 && args->countAddress < end); }; static_cast(StorageTexture::StoreDrawnLinearTouching("draw access", [&](std::uint64_t begin, std::uint64_t end) { return touches(begin, end) || std::any_of(inputs.inPlaceReads.begin(), inputs.inPlaceReads.end(), [&](const auto& read) { return read.first < end && begin < read.second; }); }, resources->HoldsLease() || resources->UsesAddressTable() || resources->HasCopiedWrites())); + if (UsesMeshWindow(shaders)) PrepareMeshWindow(context); APS5_LOG_CHARS_OUT_DEBUG("Creating CommandBatch"); std::optional batch; if (!recorded) { @@ -3367,6 +3495,7 @@ void recordPreparedDraw(const Context& context, const State& state, const Pm4::D APS5_LOG_CHARS_OUT_DEBUG("Pipeline Begin OK"); resources->Bind(commands, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline->Layout()); if (pixelLdsSubgroup != 0u) BindPixelFunctionLds(context, commands, pipeline->Layout()); + if (UsesMeshWindow(shaders)) BindMeshWindow(context, commands, pipeline->Layout()); APS5_LOG_CHARS_OUT_DEBUG("Resources bound"); pushDrawConstants(*pipeline, commands, state, draw, shaders, *resources, nullptr, 0, meshArguments != nullptr ? meshArguments->DeviceAddress() : 0, !inputs.restartTable.empty()); APS5_LOG_CHARS_OUT_DEBUG("Push constants recorded"); diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp index 64de3d8c8d75..4e30b8b899b3 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; @@ -298,6 +310,7 @@ struct HostImports { std::uint64_t frameFloor = 0; std::uint64_t previousFrameFloor = 0; std::uint64_t framesEnded = 0; + bool mirrorsYield = false; std::array counts{}; VkPhysicalDevice reportedDevice = VK_NULL_HANDLE; std::chrono::steady_clock::time_point reportedAt{}; @@ -1615,16 +1628,38 @@ bool pointerHeld(const HostImports& state, const HostImport& entry) { constexpr std::uint64_t ProtectedUses = 256; +bool mirrorsEnabled(); + +bool mirrorStandsIn(const HostImport& entry) { + return mirrorsEnabled() && !entry.joined && entry.ranges.size() == 1 && entry.range != nullptr && entry.range->releasable && GuestMemory::Watched(entry.range->address, entry.range->bytes); +} + bool hasFrameHistory(const HostImports& state) { return state.previousFrameFloor != 0; } bool evictable(const HostImports& state, const HostImport& entry) { if (pointerHeld(state, entry)) return false; + if (state.mirrorsYield && mirrorStandsIn(entry)) return true; if (!hasFrameHistory(state)) return effectiveUse(state, entry) + ProtectedUses < state.useCounter; return effectiveUse(state, entry) < state.previousFrameFloor; } +struct MirrorsYield { + HostImports& state; + std::uint64_t floor; + MirrorsYield(HostImports& state, std::uint64_t buildFloor) : state(state), floor(state.buildFloor) { + state.mirrorsYield = true; + state.buildFloor = buildFloor; + } + ~MirrorsYield() { + state.mirrorsYield = false; + state.buildFloor = floor; + } + MirrorsYield(const MirrorsYield&) = delete; + MirrorsYield& operator=(const MirrorsYield&) = delete; +}; + bool evictingRefusalCurrent(const HostImports& state, const EvictingRefusal& refusal, std::uint64_t budget) { return refusal.epoch == state.epoch && refusal.frames == state.framesEnded && refusal.liveBytes == state.liveBytes && budget <= refusal.budget && refusal.window == importWindow.load(std::memory_order_relaxed) && state.useCounter < refusal.ready && (state.buildFloor <= refusal.floor || state.useCounter < refusal.readyHeld); } @@ -2007,7 +2042,7 @@ const HostImport* importRunAt(const Context& context, HostImports& state, Import } const auto budget = effectiveBudget(context, state); const auto containing = std::find_if(run.ranges.begin(), run.ranges.end(), [address](const auto& range) { return address >= range->address && address < range->address + range->bytes; }); - if (const auto remembered = state.evictingRefusals.find({base, bytes}); evict && remembered != state.evictingRefusals.end()) { + if (const auto remembered = state.evictingRefusals.find({base, bytes}); evict && !state.mirrorsYield && remembered != state.evictingRefusals.end()) { if (remembered->second.joined == joined && evictingRefusalCurrent(state, remembered->second, budget) && sameRun(remembered->second, run)) { ++counts.refused; counts.refusedBytes += bytes; @@ -2222,12 +2257,10 @@ const HostImport* importRunAt(const Context& context, HostImports& state, Import state.pendingImports.insert(base); #ifdef _WIN32 if (deferredSettles.load(std::memory_order_relaxed) && entry.alias == nullptr && state.watchPrivateImports && writable) { - if (base % settleBlockBytes != 0 || bytes % settleBlockBytes != 0) { - entry.settleOnDemand = entry.unwatched; - } else if (entry.unwatched) { + if (entry.unwatched) { state.pendingSettles.insert_or_assign(base, PendingSettle{}); state.settleWanted.push_back(base); - } else if (settled && !GuestMemory::Watched(base, static_cast(bytes))) { + } else if (base % settleBlockBytes == 0 && bytes % settleBlockBytes == 0 && settled && !GuestMemory::Watched(base, static_cast(bytes))) { entry.unwatched = true; state.pendingSettles.insert_or_assign(base, PendingSettle{SettlePhase::Settled, 0}); state.settleReady.push_back(base); @@ -2441,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(); }; @@ -2524,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; @@ -2541,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; @@ -2611,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); } } @@ -2633,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); @@ -3085,7 +3121,10 @@ bool heapMirrorWatched(ImageMirror& mirror) { } bool importsNow(const Context& context, HostImports& state, const GuestAllocations::Lease& lease, std::uint64_t address) { - return context.hostImportAlignment != 0 && (importsStale(context, state) || importAllocation(context, state, address, lease, ImportRequester::Build, 0, false) != nullptr); + if (context.hostImportAlignment == 0) return false; + if (importsStale(context, state)) return true; + const MirrorsYield yield(state, state.useCounter + 1); + return importAllocation(context, state, address, lease, ImportRequester::Build, 0, true) != nullptr; } const char* heapCopyReason(bool overBudget, bool watched) { @@ -3271,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; @@ -3292,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; } @@ -3361,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); @@ -3648,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; } @@ -3657,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); @@ -3724,6 +3815,12 @@ void ClearHostImports(VkDevice device) { state.settles.erase(found); } if (state.device != device) return; + std::vector> unwatched; + GuestAllocations::Lease lease; + if (std::any_of(state.imports.begin(), state.imports.end(), [](const auto& import) { return import.second.unwatched; })) { + lease = GuestAllocations::GuestAllocationsAcquire_nid_postfix(); + for (const auto& [address, entry] : state.imports) noteRetiredUnwatched(unwatched, entry, lease); + } for (const auto& [address, entry] : state.imports) { state.destroyBuffer(state.device, entry.buffer, nullptr); state.freeMemory(state.device, entry.memory, nullptr); @@ -3732,6 +3829,7 @@ void ClearHostImports(VkDevice device) { #endif } state.imports.clear(); + rewatchRetired(state, std::move(unwatched)); state.pendingImports.clear(); state.liveBytes = 0; state.failed.clear(); @@ -4327,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; @@ -4343,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; @@ -4497,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)); } @@ -4511,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) { @@ -4519,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; @@ -4536,7 +4676,10 @@ void GuestBufferMemory::AcquireRegistered() { if (overBudget && copiedBytes + committed > cap) { auto& state = Imports(); std::lock_guard lock(state.mutex); - entry = importAllocation(context, state, range->address, lease, ImportRequester::Build, 0, true); + { + const MirrorsYield yield(state, state.buildFloor); + entry = importAllocation(context, state, range->address, lease, ImportRequester::Build, 0, true); + } if (entry != nullptr) { covering = entry; coveredBegin = entry->base; @@ -4561,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; @@ -4635,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); } } } @@ -5130,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(); @@ -5173,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; @@ -5344,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) { @@ -5408,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/GuestSamplerResource.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/GuestSamplerResource.cpp index e08b9e47fd62..50c81d226f47 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/src/GuestSamplerResource.cpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/src/GuestSamplerResource.cpp @@ -93,7 +93,6 @@ GuestSamplerResource DecodeSamplerResource(std::span words, Require(!isAnisoFilter(xyMagFilter) && !isAnisoFilter(xyMinFilter), "guest sampler descriptor uses unnormalized coordinates with anisotropic filtering, which is not implemented"); Require(clampX == 0u || clampX == 2u || clampX == 6u, "guest sampler descriptor uses unnormalized coordinates with clamp mode " + std::to_string(clampX) + " on X; only clamp-to-last-texel and clamp-to-border are implemented"); Require(clampY == 0u || clampY == 2u || clampY == 6u, "guest sampler descriptor uses unnormalized coordinates with clamp mode " + std::to_string(clampY) + " on Y; only clamp-to-last-texel and clamp-to-border are implemented"); - Require(!truncCoord, "guest sampler descriptor uses unnormalized coordinates with TRUNC_COORD, which is not implemented"); Require(!mcCoordTrunc, "guest sampler descriptor uses unnormalized coordinates with MC_COORD_TRUNC, which is not implemented"); } else { Require(!unnormalizedProven, "guest sampler descriptor is bound as unnormalized without FORCE_UNNORMALIZED"); diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp index 051b7149dfd2..43b8c69993d8 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp @@ -142,6 +142,12 @@ void recordCommands(const Context& context, Record&& record) { if (batch) batch->SubmitAndWait(); } +struct TargetUse { + std::atomic hostOnly{true}; + std::atomic writes{0}; + std::atomic claimed{false}; +}; + class MultisampleTarget : public std::enable_shared_from_this { public: MultisampleTarget(const Context& context, const ColorTarget& target) : context(context), target(target), cmask(target.cmaskAddress, target.cmaskBytes), colorFill(target) { @@ -535,7 +541,7 @@ class MultisampleTarget : public std::enable_shared_from_this Context context; std::shared_ptr> active = std::make_shared>(true); - std::shared_ptr> hostOnly = std::make_shared>(true); + std::shared_ptr use = std::make_shared(); std::shared_ptr> metadataValid; ColorTarget target; VkImage image = VK_NULL_HANDLE; @@ -763,7 +769,7 @@ struct GuardedRange { std::uint32_t samples; std::shared_ptr> active; std::shared_ptr> metadataValid; - std::shared_ptr> hostOnly; + std::shared_ptr use; bool fmask = false; }; @@ -790,6 +796,11 @@ std::atomic& anyGuarded() { return any; } +std::atomic& guardedGeneration() { + static std::atomic generation{0}; + return generation; +} + void guardReads(std::uint64_t address, std::size_t bytes) { RequireNoMultisampleTarget(address, bytes, "a CPU read"); } @@ -828,17 +839,22 @@ void retireUnmapped(std::uintptr_t address, std::size_t bytes) { forgetSingleClears(address, bytes); RetireUnmappedDepth_nid_no_patch(address, bytes); std::unique_lock lock(guardedMutex()); - std::erase_if(guarded(), [&](const auto& range) { - if (range.metadataValid && address < range.address + range.bytes && range.address < address + bytes) range.metadataValid->store(false, std::memory_order_release); + bool metadataChanged = false; + const auto invalidated = std::erase_if(guarded(), [&](const auto& range) { + if (range.metadataValid && address < range.address + range.bytes && range.address < address + bytes) { + range.metadataValid->store(false, std::memory_order_release); + metadataChanged = true; + } if (range.address < address || range.address - address > bytes || range.bytes > bytes - (range.address - address)) return false; if (!range.metadataValid) range.active->store(false, std::memory_order_release); return true; }); - std::erase_if(guarded(), [](const auto& range) { return range.metadataValid && !range.active->load(std::memory_order_acquire); }); + const auto staleMetadata = std::erase_if(guarded(), [](const auto& range) { return range.metadataValid && !range.active->load(std::memory_order_acquire); }); + if (metadataChanged || invalidated != 0 || staleMetadata != 0) guardedGeneration().fetch_add(1, std::memory_order_release); anyGuarded().store(!guarded().empty(), std::memory_order_release); } -void guard(const Context& context, const ColorTarget& target, const std::shared_ptr>& active, const std::shared_ptr>& metadataValid, const std::shared_ptr>& hostOnly) { +std::uint64_t guardedColorBytes(const ColorTarget& target) { auto bytes = std::max(target.bytes * target.samples, static_cast(target.extent.width) * target.extent.height * target.elementBytes * target.samples); if (MultisampledBlockLog2(target.tileMode) == 16u && target.tileMode != ColorTileMode::Standard64KB && std::has_single_bit(target.elementBytes) && std::has_single_bit(target.samples)) { const auto log2Samples = std::countr_zero(target.samples); @@ -849,13 +865,34 @@ void guard(const Context& context, const ColorTarget& target, const std::shared_ const auto align = [](std::uint32_t extent, std::uint32_t block) { return (static_cast(extent) + block - 1u) / block * block; }; bytes = align(target.extent.width, blockWidth) * align(target.extent.height, blockHeight) * target.elementBytes * target.samples; } + return bytes; +} + +void claimOverlapping(std::uint64_t address, std::uint64_t bytes, const TargetUse* claimant) { + for (const auto& range : guarded()) { + if (!range.fmask && range.use.get() != claimant && address < range.address + range.bytes && range.address < address + bytes) range.use->claimed.store(true, std::memory_order_release); + } +} + +void stampUse(TargetUse& use, std::uint64_t address, std::uint64_t bytes) { + use.claimed.store(false, std::memory_order_release); + if (bytes == 0) return; + if (GuestMemory::Watched(address, static_cast(bytes))) use.writes.store(GuestMemory::CollectWrites(address, static_cast(bytes)), std::memory_order_release); + std::shared_lock lock(guardedMutex()); + claimOverlapping(address, bytes, &use); +} + +void guard(const Context& context, const ColorTarget& target, const std::shared_ptr>& active, const std::shared_ptr>& metadataValid, const std::shared_ptr& use) { + const auto bytes = guardedColorBytes(target); + stampUse(*use, target.address, bytes); std::unique_lock lock(guardedMutex()); - guarded().push_back({context.device, target.address, bytes, target.samples, active, nullptr, hostOnly}); + guarded().push_back({context.device, target.address, bytes, target.samples, active, nullptr, use}); if (target.dccAddress != 0) { - guarded().push_back({context.device, target.dccAddress, MultisampledDccBytes(target), target.samples, active, metadataValid, hostOnly}); - if (target.cmaskAddress != 0) guarded().push_back({context.device, target.cmaskAddress, target.cmaskBytes, target.samples, active, metadataValid, hostOnly}); - if (target.samples == 8u && target.fmaskAddress != 0u && target.cmaskAddress != 0u) guarded().push_back({context.device, target.fmaskAddress, DescribeSurface(fmaskResource(target)).guestBytes, target.samples, active, metadataValid, hostOnly}); + guarded().push_back({context.device, target.dccAddress, MultisampledDccBytes(target), target.samples, active, metadataValid, use}); + if (target.cmaskAddress != 0) guarded().push_back({context.device, target.cmaskAddress, target.cmaskBytes, target.samples, active, metadataValid, use}); + if (target.samples == 8u && target.fmaskAddress != 0u && target.cmaskAddress != 0u) guarded().push_back({context.device, target.fmaskAddress, DescribeSurface(fmaskResource(target)).guestBytes, target.samples, active, metadataValid, use}); } + guardedGeneration().fetch_add(1, std::memory_order_release); anyGuarded().store(true, std::memory_order_release); InstallResidentImageReadGuard_nid_no_patch(); } @@ -875,9 +912,12 @@ void discardRetiredTargets() { } bool holdHostOnly(const MultisampleTarget& target) { - std::unique_lock lock(guardedMutex()); - if (!target.active->load(std::memory_order_acquire)) return false; - target.hostOnly->store(true, std::memory_order_release); + { + std::unique_lock lock(guardedMutex()); + if (!target.active->load(std::memory_order_acquire)) return false; + target.use->hostOnly.store(true, std::memory_order_release); + } + stampUse(*target.use, target.target.address, guardedColorBytes(target.target)); return true; } @@ -896,15 +936,15 @@ MultisampleTarget& acquire(const Context& context, const ColorTarget& requested) anyGuarded().store(!guarded().empty(), std::memory_order_release); } target->Recreate(use); - target->hostOnly->store(true, std::memory_order_release); - guard(context, use, target->active, target->metadataValid, target->hostOnly); + target->use->hostOnly.store(true, std::memory_order_release); + guard(context, use, target->active, target->metadataValid, target->use); target->ApplyFastClear(use); return *target; } { std::unique_lock lock(guardedMutex()); if (!target->active->load(std::memory_order_acquire)) continue; - target->hostOnly->store(true, std::memory_order_release); + target->use->hostOnly.store(true, std::memory_order_release); } if (target->fromTexture && use.cmaskAddress != 0) { target->fromTexture = false; @@ -914,6 +954,7 @@ MultisampleTarget& acquire(const Context& context, const ColorTarget& requested) target->Keep(); target->SettleStorageWrites(); target->ApplyFastClear(use); + stampUse(*target->use, target->target.address, guardedColorBytes(target->target)); return *target; } const auto& use = requested; @@ -921,7 +962,7 @@ MultisampleTarget& acquire(const Context& context, const ColorTarget& requested) target->Keep(); targets().push_back(std::move(target)); auto& created = *targets().back(); - guard(context, use, created.active, created.metadataValid, created.hostOnly); + guard(context, use, created.active, created.metadataValid, created.use); if (use.cmaskFastClear && use.dccAddress == 0) created.cmask.SeedCode(CurrentUniformMetadataByte(use.cmaskAddress, static_cast(use.cmaskBytes))); created.ApplyFastClear(use); created.Keep(); @@ -995,8 +1036,8 @@ MultisampleTarget& createFilled(const Context& context, const GuestTextureResour target->Keep(); targets().push_back(std::move(target)); auto& created = *targets().back(); - created.hostOnly->store(written, std::memory_order_release); - guard(context, use, created.active, created.metadataValid, created.hostOnly); + created.use->hostOnly.store(written, std::memory_order_release); + guard(context, use, created.active, created.metadataValid, created.use); created.colorFill.NoteFill(use.address, static_cast(bytes), value); created.fromTexture = true; created.htileAddress = resource.dccAddress; @@ -1447,22 +1488,94 @@ void ClearMultisampleTargets(VkDevice device) { std::lock_guard lock(targetsMutex()); std::erase_if(targets(), [&](const auto& target) { return target->context.device == device; }); std::unique_lock guardLock(guardedMutex()); - std::erase_if(guarded(), [&](const auto& range) { return range.device == device; }); + const auto removed = std::erase_if(guarded(), [&](const auto& range) { return range.device == device; }); + if (removed != 0) guardedGeneration().fetch_add(1, std::memory_order_release); anyGuarded().store(!guarded().empty(), std::memory_order_release); UpdateResidentImageUnmapObserver_nid_no_patch(); } +void ClaimMultisampleTargetMemory(std::uint64_t address, std::uint64_t bytes) { + if (bytes == 0 || !anyGuarded().load(std::memory_order_acquire)) return; + std::shared_lock lock(guardedMutex()); + claimOverlapping(address, bytes, nullptr); +} + void GuardOneFragmentFmask(const Context& context, const ColorTarget& target) { const auto bits = static_cast(target.extent.width) * target.extent.height * target.coverageSamples; const auto bytes = std::max((bits / 8u + 0xffffu) & ~0xffffull, 0x10000u); std::unique_lock lock(guardedMutex()); const bool known = std::ranges::any_of(guarded(), [&](const auto& range) { return range.fmask && range.device == context.device && range.address == target.fmaskAddress && range.bytes == bytes; }); - if (!known) guarded().push_back({context.device, target.fmaskAddress, bytes, target.coverageSamples, std::make_shared>(true), nullptr, std::make_shared>(true), true}); + if (!known) guarded().push_back({context.device, target.fmaskAddress, bytes, target.coverageSamples, std::make_shared>(true), nullptr, std::make_shared(), true}); anyGuarded().store(true, std::memory_order_release); lock.unlock(); InstallResidentImageReadGuard_nid_no_patch(); } +std::uint64_t MultisampleTargetRangeGeneration() { + std::shared_lock lock(guardedMutex()); + return guardedGeneration().load(std::memory_order_acquire); +} + +std::optional> ExcludeMultisampleTargetRanges( + VkDevice device, std::span ranges, std::uint64_t& generation) { + if (ranges.empty()) { + generation = MultisampleTargetRangeGeneration(); + return std::nullopt; + } + if (!anyGuarded().load(std::memory_order_acquire)) { + generation = MultisampleTargetRangeGeneration(); + return std::nullopt; + } + std::vector> excluded; + { + std::shared_lock lock(guardedMutex()); + generation = guardedGeneration().load(std::memory_order_relaxed); + for (const auto& range : guarded()) { + if (range.device != device || !range.active->load(std::memory_order_acquire)) continue; + excluded.emplace_back(range.address, range.address + range.bytes); + } + } + if (excluded.empty()) return std::nullopt; + std::sort(excluded.begin(), excluded.end()); + std::vector> merged; + merged.reserve(excluded.size()); + for (const auto& range : excluded) { + if (!merged.empty() && range.first <= merged.back().second) merged.back().second = std::max(merged.back().second, range.second); + else merged.push_back(range); + } + std::vector filtered; + filtered.reserve(ranges.size() + merged.size()); + bool changed = false; + for (const auto& range : ranges) { + auto cursor = range.begin; + for (const auto& [begin, end] : merged) { + if (end <= cursor) continue; + if (begin >= range.end) break; + const auto cutBegin = std::max(cursor, begin); + const auto cutEnd = std::min(range.end, end); + if (cutBegin > cursor) { + auto part = range; + part.begin = cursor; + part.end = cutBegin; + part.deviceAddress += cursor - range.begin; + filtered.push_back(part); + } + if (cutBegin < cutEnd) { + changed = true; + cursor = cutEnd; + } + if (cursor == range.end) break; + } + if (cursor < range.end) { + auto part = range; + part.begin = cursor; + part.deviceAddress += cursor - range.begin; + filtered.push_back(part); + } + } + return changed ? std::optional(std::move(filtered)) : std::nullopt; +} + void RequireNoMultisampleTarget(std::uint64_t address, std::size_t bytes, const char* access) { RequireNoResidentDepthRead_nid_no_patch(address, bytes); RequireNoMultisampleColorTarget(address, bytes, access); @@ -1480,12 +1593,20 @@ void RequireNoMultisampleColorTarget(std::uint64_t address, std::size_t bytes, c std::snprintf(text, sizeof(text), "AGC graphics: %s of 0x%llx+0x%zx overlaps multisampled color target 0x%llx+0x%llx (%u samples), whose samples are only on the host: guest access to it is not implemented", access, static_cast(address), bytes, static_cast(range.address), static_cast(range.bytes), range.samples); throw std::runtime_error(text); }; + const auto canRetire = [&](const GuardedRange& range) { + if (!range.use->hostOnly.load(std::memory_order_acquire) || range.use->claimed.load(std::memory_order_acquire)) return true; + if (range.metadataValid) return false; + const auto used = range.use->writes.load(std::memory_order_acquire); + const auto begin = std::max(address, range.address); + const auto overlap = static_cast(std::min(address + bytes, range.address + range.bytes) - begin); + return used != 0 && GuestMemory::Watched(begin, overlap) && !GuestMemory::UnchangedSinceCollected(begin, overlap, used); + }; { std::shared_lock lock(guardedMutex()); bool retirable = false; for (const auto& range : guarded()) { if (!overlaps(range)) continue; - if (range.hostOnly->load(std::memory_order_acquire)) refuse(range); + if (!canRetire(range)) refuse(range); retirable = true; } if (!retirable) return; @@ -1494,7 +1615,7 @@ void RequireNoMultisampleColorTarget(std::uint64_t address, std::size_t bytes, c std::vector>> retired; for (const auto& range : guarded()) { if (!overlaps(range)) continue; - if (range.hostOnly->load(std::memory_order_acquire)) refuse(range); + if (!canRetire(range)) refuse(range); retired.push_back(range.active); } for (const auto& active : retired) active->store(false, std::memory_order_release); @@ -1508,7 +1629,7 @@ std::vector> HostOnlySampleRanges(std::u if (bytes != 0 && anyGuarded().load(std::memory_order_acquire)) { std::shared_lock lock(guardedMutex()); for (const auto& range : guarded()) { - if (address < range.address + range.bytes && range.address < address + bytes && range.hostOnly->load(std::memory_order_acquire)) ranges.emplace_back(range.address, range.bytes); + if (address < range.address + range.bytes && range.address < address + bytes && range.use->hostOnly.load(std::memory_order_acquire)) ranges.emplace_back(range.address, range.bytes); } } std::ranges::sort(ranges); diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp index 8f7297d9a672..0063fd6382a4 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp @@ -330,7 +330,7 @@ void appendKey(std::vector& key, const TValue& value) { bool libraryKeys(PipelineLibraryKeys& keys, const Context& context, const State& state, const VertexInputLayout& input, const PipelineSetLayouts& resources, std::span shaders) { using Stage = ShaderRecompiler::ShaderStage; - if (!context.graphicsPipelineLibrary || context.pipelineExecutableInfo || (state.stages.tessellation && !context.tessellationPipelineCache) || state.depthBiasPerFace || state.rectList || BarycentricPatches(state, shaders) || SplitsAlternateAlpha(state) || std::ranges::any_of(shaders, [](const CompiledShader& shader) { return shader.program != nullptr && shader.program->functionLdsBuffer; }) || FragmentInterlock(shaders)) return false; + if (!context.graphicsPipelineLibrary || context.pipelineExecutableInfo || (state.stages.tessellation && !context.tessellationPipelineCache) || state.depthBiasPerFace || state.rectList || BarycentricPatches(state, shaders) || SplitsAlternateAlpha(state) || std::ranges::any_of(shaders, [](const CompiledShader& shader) { return shader.program != nullptr && shader.program->functionLdsBuffer; }) || UsesMeshWindow(shaders) || FragmentInterlock(shaders)) return false; keys = {}; for (const auto& shader : shaders) { const auto identity = shader.program->Identity(); @@ -521,13 +521,14 @@ Pipeline::Pipeline(const Context& context, const State& state, const VertexInput // A descriptor set layout with the same bindings as this one is compatible with the pipeline // layout, so later draws bind their own ShaderResources' set under it. const bool pixelLds = std::ranges::any_of(shaders, [](const CompiledShader& shader) { return shader.program != nullptr && shader.program->functionLdsBuffer; }); - const auto pixelLdsLayouts = pixelLds ? PixelFunctionLdsSetLayouts(context) : PixelFunctionLdsLayouts{}; - const std::array setLayouts{resources.main, pixelLds && !resources.split ? pixelLdsLayouts.empty : resources.fragment, pixelLdsLayouts.buffer}; + const bool meshWindow = UsesMeshWindow(shaders); + const auto pixelLdsLayouts = pixelLds || meshWindow ? PixelFunctionLdsSetLayouts(context) : PixelFunctionLdsLayouts{}; + const std::array setLayouts{resources.main, (pixelLds || meshWindow) && !resources.split ? pixelLdsLayouts.empty : resources.fragment, pixelLds ? pixelLdsLayouts.buffer : pixelLdsLayouts.empty, meshWindow ? MeshWindowSetLayout(context) : VK_NULL_HANDLE}; const VkPushConstantRange push{pushStages, 0, PipelinePushSlotBytes}; const std::array slots{{{pushStagesOf(context), 0, PipelinePushSlotBytes}, {VK_SHADER_STAGE_FRAGMENT_BIT, PipelinePushSlotBytes, PipelinePushSlotBytes}}}; VkPipelineLayoutCreateInfo layoutInfo{VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO}; - layoutInfo.flags = pixelLds || !resources.split ? 0 : VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT; - layoutInfo.setLayoutCount = pixelLds ? 3u : resources.split ? 2u : 1u; + layoutInfo.flags = pixelLds || meshWindow || !resources.split ? 0 : VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT; + layoutInfo.setLayoutCount = meshWindow ? 4u : pixelLds ? 3u : resources.split ? 2u : 1u; layoutInfo.pSetLayouts = setLayouts.data(); layoutInfo.pushConstantRangeCount = dynamicRendering ? static_cast(slots.size()) : pushStages != 0 ? 1 : 0; layoutInfo.pPushConstantRanges = dynamicRendering ? slots.data() : pushStages != 0 ? &push : nullptr; @@ -678,10 +679,7 @@ Pipeline::Pipeline(const Context& context, const State& state, const VertexInput std::vector secondChannels(state.blends.begin(), state.blends.end()); for (const auto& merged : state.colors) { if (merged.partialWriteMask != UnclampedBlendMask) continue; - for (auto* channels : {&firstChannels, &secondChannels}) { - channels->at(merged.exportIndex).blendEnable = VK_FALSE; - channels->at(merged.exportIndex).colorWriteMask = 0; - } + for (auto* channels : {&firstChannels, &secondChannels}) channels->at(merged.exportIndex) = {}; } if (alternateAlpha) { const auto keepsStencil = [](const VkStencilOpState& face) { return face.writeMask == 0 || (face.failOp == VK_STENCIL_OP_KEEP && face.passOp == VK_STENCIL_OP_KEEP && face.depthFailOp == VK_STENCIL_OP_KEEP); }; @@ -1398,6 +1396,7 @@ void ClearCachedPipelines(VkDevice device) { } ClearPipelineLibraries(device); ReleasePixelFunctionLds(device); + ReleaseMeshWindow(device); } } diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/PipelineCache.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/PipelineCache.cpp index ab8802ea4df5..862e59483df1 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/src/PipelineCache.cpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/src/PipelineCache.cpp @@ -12,6 +12,12 @@ #include #include #include +#ifdef _WIN32 +#ifndef NOMINMAX +#define NOMINMAX +#endif +#include +#endif namespace AgcDriver::Graphics { @@ -100,6 +106,10 @@ std::span PipelineCache::File::Payload() const { PipelineCache::File PipelineCache::readFile() const { File file; + if (path.empty()) { + file.state = FileState::Missing; + return file; + } if (!ShaderRecompiler::ReadWholeFile(path, file.contents)) { std::error_code error; #ifdef _WIN32 @@ -152,16 +162,24 @@ PipelineCache::File PipelineCache::readFile() const { } std::optional PipelineCache::readHeader() const { + if (path.empty()) return std::nullopt; #ifdef _WIN32 std::error_code error; const auto native = ShaderRecompiler::NativeCachePath_nid_no_patch(path, error); if (error) return std::nullopt; - std::ifstream file(native, std::ios::binary); + const auto file = CreateFileW(native.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); + if (file == INVALID_HANDLE_VALUE) return std::nullopt; + struct Close { HANDLE file; ~Close() { CloseHandle(file); } } close{file}; + FileHeader header{}; + DWORD readBytes = 0; + if (!ReadFile(file, &header, sizeof(header), &readBytes, nullptr) || readBytes != sizeof(header)) return std::nullopt; #else std::ifstream file(path, std::ios::binary); -#endif FileHeader header{}; if (!file.read(reinterpret_cast(&header), sizeof(header))) return std::nullopt; +#endif + if (header.magic != FileMagic || header.format != FileFormat) return std::nullopt; return header; } @@ -186,6 +204,7 @@ void PipelineCache::load(std::vector& initialData) { } void PipelineCache::save(bool final, bool waitForPipelines) try { + if (path.empty()) return; std::lock_guard pathLock(pathMutex(path)); const auto getData = context.Function("vkGetPipelineCacheData"); const auto snapshot = [&] { return waitForPipelines ? synchronization.LockForSnapshot() : synchronization.TryLockForSnapshot(); }; diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp index 8f077856a2a3..c2ccc3aa01bc 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" @@ -33,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -523,6 +525,8 @@ std::atomic completionStores{0}; std::atomic writeBackCompletions{0}; std::atomic completionStoresSkipped{0}; std::atomic completionStoresRun{0}; +std::atomic commandBuffersFreed{0}; +std::atomic fencesKept{0}; // Write-backs noted over a tracked label dword (NoteWrittenBack): a CPU store over a GPU label. std::atomic writeBacksOverLabels{0}; // Completion labels that entered the pending count at a write-back (see NoteWrittenBack). @@ -1187,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) { @@ -1241,10 +1246,7 @@ Recorder::~Recorder() { } if (dispatchArgumentPipeline != VK_NULL_HANDLE) context.Function("vkDestroyPipeline")(context.device, dispatchArgumentPipeline, nullptr); if (dispatchArgumentLayout != VK_NULL_HANDLE) context.Function("vkDestroyPipelineLayout")(context.device, dispatchArgumentLayout, nullptr); - for (auto& [commands, fence] : spare) { - context.Function("vkFreeCommandBuffers")(context.device, context.pool, 1, &commands); - context.Function("vkDestroyFence")(context.device, fence, nullptr); - } + for (const auto fence : spare) context.Function("vkDestroyFence")(context.device, fence, nullptr); spare.clear(); for (const auto pool : sparePools) context.Function("vkDestroyQueryPool")(context.device, pool, nullptr); sparePools.clear(); @@ -1580,16 +1582,15 @@ void Recorder::ensureOpen() { if (open == nullptr) { auto batch = std::make_unique(); try { + VkCommandBufferAllocateInfo allocation{VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO}; + allocation.commandPool = context.pool; + allocation.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; + allocation.commandBufferCount = 1; + Check(context.Function("vkAllocateCommandBuffers")(context.device, &allocation, &batch->commands), "vkAllocateCommandBuffers recorder"); if (!spare.empty()) { - // The pool resets command buffers on begin; the fence was reset when the batch completed. - std::tie(batch->commands, batch->fence) = spare.back(); + batch->fence = spare.back(); spare.pop_back(); } else { - VkCommandBufferAllocateInfo allocation{VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO}; - allocation.commandPool = context.pool; - allocation.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; - allocation.commandBufferCount = 1; - Check(context.Function("vkAllocateCommandBuffers")(context.device, &allocation, &batch->commands), "vkAllocateCommandBuffers recorder"); VkFenceCreateInfo info{VK_STRUCTURE_TYPE_FENCE_CREATE_INFO}; Check(context.Function("vkCreateFence")(context.device, &info, nullptr, &batch->fence), "vkCreateFence recorder"); } @@ -1855,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; @@ -1920,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) { @@ -2005,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)]; @@ -4173,7 +4191,7 @@ void Recorder::finish(std::unique_ptr batch, bool wait, int source, bool const auto& h = holdCounters; AgcDriver::ProfilePrint_nid_no_patch("[recorder] %llu syncs waited %.1f s for the GPU in total (sources, count/wait: idle %llu/%.1fs, pending write %llu/%.1fs, recorded store %llu/%.1fs, address-based %llu/%.1fs, other %llu/%.1fs); hook %llu calls, %llu locked; %llu targeted syncs left %llu batches in flight; snapshot %llu rebuilds %.0f ms, %llu notes covered; %llu unlocked timeline waits %.1f s; %llu submissions, %zu label entries, %llu completion labels pending; fence waits by thread (count/wait):%s; top sync sites (source@caller syncs/batches/wait):%s; under holds (cumulative): %llu completions ran %.0f ms (kept objects released %.0f ms), pending-write syncs from completions: %llu skipped, %llu waited %.0f ms; %llu reaps (%llu with work) retired %llu batches in %.0f ms; hook waits unlocked %llu / %.0f ms GPU (pending write %llu / %.0f ms, recorded store %llu / %.0f ms) + %.0f ms relock (%llu found the recorder torn down), locked %llu; deferred releases: on the release thread %llu batches (%llu objects) in %.0f ms, inline %llu batches (%llu objects) in %.0f ms (%llu batches over the queue bound of %zu), queue max %llu batches, %llu pending\n",static_cast(waits), waitedMs / 1000, static_cast(syncCounts[0]), syncWaitedMs[0] / 1000, static_cast(syncCounts[1]), syncWaitedMs[1] / 1000, static_cast(syncCounts[2]), syncWaitedMs[2] / 1000, static_cast(syncCounts[3]), syncWaitedMs[3] / 1000, static_cast(syncCounts[4]), syncWaitedMs[4] / 1000, static_cast(hookCalls.load()), static_cast(hookLocks.load()), static_cast(targetedSyncs.load()), static_cast(batchesLeftInFlight.load()), static_cast(snapshotRebuilds), snapshotRebuildMs, static_cast(snapshotCovered), static_cast(unlockedWaits.load()), unlockedWaitedUs.load() / 1e6, static_cast(recorder.submissions), recorder.PendingLabels(), static_cast(completionLabels.load()), ThreadSyncReport().c_str(), SyncSiteReport().c_str(), static_cast(h.completions), h.completionMs, h.keptReleaseMs, static_cast(h.completionSyncsSkipped), static_cast(h.completionSyncsWaited), h.completionSyncWaitMs, static_cast(h.reaps), static_cast(h.reapsWithWork), static_cast(h.reapBatches), h.reapMs, static_cast(h.hookUnlockedWaits), h.hookUnlockedWaitMs, static_cast(h.hookUnlockedWaitsBySource[1]), h.hookUnlockedWaitMsBySource[1], static_cast(h.hookUnlockedWaitsBySource[2]), h.hookUnlockedWaitMsBySource[2], h.hookRelockMs, static_cast(h.hookUnlockedTornDown), static_cast(h.hookLockedWaits), static_cast(threadReleases.load()), static_cast(threadObjects.load()), threadReleaseUs.load() / 1000.0, static_cast(inlineReleases.load()), static_cast(inlineObjects.load()), inlineReleaseUs.load() / 1000.0, static_cast(inlineOverBound.load()), ReleaseQueueBound(), static_cast(releaseQueueMax.load()), static_cast(deferredPending.load())); AgcDriver::ProfilePrint_nid_no_patch("[recorder] completion label stores: %llu run, %llu skipped (no CPU write-back overlapped them); %llu counted pending at a write-back; %llu write-backs over a tracked label; %llu write-back completions pending\n", static_cast(completionStoresRun.load()), static_cast(completionStoresSkipped.load()), static_cast(completionLabelsCountedLate.load()), static_cast(writeBacksOverLabels.load()), static_cast(writeBackCompletions.load())); - AgcDriver::ProfilePrint_nid_no_patch("[recorder] submits %llu, vkQueueSubmit mean %.1f us, max %.1f us\n", static_cast(submitCount), submitCount != 0 ? submitUs / static_cast(submitCount) : 0.0, submitMaxUs); + AgcDriver::ProfilePrint_nid_no_patch("[recorder] submits %llu, vkQueueSubmit mean %.1f us, max %.1f us; command buffers freed at batch release %llu, fences kept for reuse %llu\n", static_cast(submitCount), submitCount != 0 ? submitUs / static_cast(submitCount) : 0.0, submitMaxUs, static_cast(commandBuffersFreed.load()), static_cast(fencesKept.load())); const auto reads = Recorder::ReadCounts(); AgcDriver::ProfilePrint_nid_no_patch("[recorder] in-place reads: %llu noted, %llu queries, hits by reader: dispatch element %llu, gpu copy %llu, address-based %llu, indirect %llu, storage upload %llu, copy source %llu, draw input %llu; %llu hits on signaled batches ignored\n", static_cast(reads.noted), static_cast(reads.queries), static_cast(reads.hits[0]), static_cast(reads.hits[1]), static_cast(reads.hits[2]), static_cast(reads.hits[3]), static_cast(reads.hits[4]), static_cast(reads.hits[5]), static_cast(reads.hits[6]), static_cast(reads.staleIgnored)); } @@ -4318,17 +4336,22 @@ void Recorder::release(Batch& batch) noexcept { batch.endedSamples.clear(); batch.segments = VK_NULL_HANDLE; batch.segmentPool.reset(); - // A completed (or never submitted) batch's objects are kept for reuse: the fence is signaled or - // untouched, so resetting it cannot block, and the command buffer is no longer pending. - if (batch.commands != VK_NULL_HANDLE && batch.fence != VK_NULL_HANDLE && spare.size() < 64 && function(resetFences, "vkResetFences")(context.device, 1, &batch.fence) == VK_SUCCESS) { - spare.emplace_back(batch.commands, batch.fence); - batch.commands = VK_NULL_HANDLE; - batch.fence = VK_NULL_HANDLE; - return; + static const bool profile = std::getenv("APS5_PROFILE_DRAW") != nullptr; + if (batch.commands != VK_NULL_HANDLE) { + context.Function("vkFreeCommandBuffers")(context.device, context.pool, 1, &batch.commands); + if (profile) commandBuffersFreed.fetch_add(1, std::memory_order_relaxed); } - if (batch.commands != VK_NULL_HANDLE) context.Function("vkFreeCommandBuffers")(context.device, context.pool, 1, &batch.commands); - if (batch.fence != VK_NULL_HANDLE) context.Function("vkDestroyFence")(context.device, batch.fence, nullptr); batch.commands = VK_NULL_HANDLE; + if (batch.fence != VK_NULL_HANDLE && spare.size() < 64 && function(resetFences, "vkResetFences")(context.device, 1, &batch.fence) == VK_SUCCESS) { + try { + spare.push_back(batch.fence); + batch.fence = VK_NULL_HANDLE; + if (profile) fencesKept.fetch_add(1, std::memory_order_relaxed); + return; + } catch (const std::bad_alloc&) { + } + } + if (batch.fence != VK_NULL_HANDLE) context.Function("vkDestroyFence")(context.device, batch.fence, nullptr); batch.fence = VK_NULL_HANDLE; } diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp index 774f8691cb21..186aea757a04 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"); @@ -707,6 +720,27 @@ void reportGuestAllocation(const GuestTextureResource& resource, std::uint64_t g std::fprintf(stderr, "[gpu] view 0x%llx of %llu MiB lies in the guest allocation 0x%llx..0x%llx (%llu MiB, range 0x%llx..0x%llx, %s%s%s): %llu of its %u slices fit in the range\n", static_cast(resource.baseAddress), static_cast(guestBytes >> 20u), static_cast(range->allocationAddress), static_cast(range->allocationAddress + range->allocationBytes), static_cast(range->allocationBytes >> 20u), static_cast(range->address), static_cast(end), range->readable ? "r" : "-", range->writable ? "w" : "-", range->gpu ? "g" : "-", static_cast(fitting), geometry.layers); } +struct PendingLookup { + std::shared_ptr source; + bool depthCopy = false; + bool srgbExpand = false; + bool blockCopy = false; + bool repackCopy = false; +}; + +PendingLookup pendingLookupSource(const Context& context, const GuestTextureResource& resource, std::uint64_t guestBytes, bool depthCompare) { + PendingLookup lookup; + lookup.depthCopy = depthCompare && guestBytes >= DepthCopyMinBytes() && Texture::DepthCopyFormat(ResolveTextureFormat(resource.format)) != VK_FORMAT_UNDEFINED && resource.dimension != TextureDimension::k3D; + lookup.srgbExpand = !depthCompare && SrgbExpandsToRgba8(context, resource.format); + lookup.source = StorageTexture::FindPending(resource.baseAddress, guestBytes); + auto& source = lookup.source; + lookup.blockCopy = source != nullptr && !depthCompare && !lookup.srgbExpand && Texture::CanBlockCopyFrom(*source, resource); + lookup.repackCopy = source != nullptr && !depthCompare && Texture::CanRepackCopyFrom(*source, resource); + if (source != nullptr && !lookup.blockCopy && !lookup.repackCopy && (depthCompare ? !lookup.depthCopy || !Texture::CanDepthCopyFrom(*source, resource) : lookup.srgbExpand ? !Texture::CanSrgbExpandFrom(context, *source, resource) : !Texture::CanCopyFrom(*source, resource))) source.reset(); + if (source != nullptr && MetadataMoved(*source, resource)) source.reset(); + return lookup; +} + // `guestBytes` is the surface size when the caller described the surface already (0: described here). std::shared_ptr cachedTexture(const Context& context, std::span words, const GuestTextureResource& requested, VkComponentMapping components, std::uint64_t guestBytes = 0, bool depthCompare = false, VkImageViewType multisampleViewType = VK_IMAGE_VIEW_TYPE_2D) { const auto resource = ArrayLayerWindow(requested, context.limits.maxImageArrayLayers); @@ -790,13 +824,11 @@ std::shared_ptr cachedTexture(const Context& context, std::span= DepthCopyMinBytes() && Texture::DepthCopyFormat(ResolveTextureFormat(resource.format)) != VK_FORMAT_UNDEFINED && resource.dimension != TextureDimension::k3D; - const bool srgbExpand = !depthCompare && SrgbExpandsToRgba8(context, resource.format); - auto source = StorageTexture::FindPending(address, guestBytes); - const bool blockCopy = source != nullptr && !depthCompare && !srgbExpand && Texture::CanBlockCopyFrom(*source, resource); - const bool repackCopy = source != nullptr && !depthCompare && Texture::CanRepackCopyFrom(*source, resource); - if (source != nullptr && !blockCopy && !repackCopy && (depthCompare ? !depthCopy || !Texture::CanDepthCopyFrom(*source, resource) : srgbExpand ? !Texture::CanSrgbExpandFrom(context, *source, resource) : !Texture::CanCopyFrom(*source, resource))) source.reset(); - if (source != nullptr && MetadataMoved(*source, resource)) source.reset(); + auto lookup = pendingLookupSource(context, resource, guestBytes, depthCompare); + const bool depthCopy = lookup.depthCopy; + const bool srgbExpand = lookup.srgbExpand; + auto source = std::move(lookup.source); + const bool blockCopy = lookup.blockCopy; std::optional keys; bool clearThroughKeys = false; if (source != nullptr && resource.dccAddress != 0 && IsDccClear(source->FilledKeys())) { @@ -900,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); @@ -971,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) { @@ -1000,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); @@ -1651,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). @@ -2191,6 +2230,7 @@ void ShaderResources::buildPrepare(std::span shaders, cons // collects cost the same wherever they run. if (precollectImages()) phase(BuildPhase::Precollect); if (drawBuild && !usesBda && std::all_of(allocations.begin(), allocations.end(), [&](const Allocation& allocation) { return !allocation.guest || allocation.pushByte >= 0 || (allocation.dataAllocation >= 0 && allocation.dataByte < allocations[static_cast(allocation.dataAllocation)].size); })) guestMemory.AllowAdjustedRegions(); + requireGuestBuffers(); guestMemory.UploadPrepare(usesBda); timing.uploadMs = phase(BuildPhase::Upload); splitSets = SplitsSets(context, shaders); @@ -2427,7 +2467,8 @@ void ShaderResources::buildComplete() { Require(textures.size() == plannedSampledImages && storageTextures.size() == plannedStorageImages, "image lookups disagree with the descriptor plan"); resolveImageTables(); timing.bindingsMs += phase(BuildPhase::Images); - guestMemory.UploadFinish(usesBda); + requireGuestBuffers(); + 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); @@ -2631,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(); @@ -2909,6 +2950,14 @@ struct RevalidateProfile { std::atomic refreshedOverlaps{0}; std::atomic proofsVerified{0}; std::atomic lastReport{0}; + std::array, static_cast(FastFail::Count)> fullNanoseconds{}; + std::atomic refusedSampled{0}; + std::atomic refusedStorage{0}; + std::atomic refusedUncommitted{0}; + std::atomic refusedUnwatched{0}; + std::atomic refusedOther{0}; + std::mutex refusedMutex; + std::unordered_map refusedSurfaces; }; RevalidateProfile& Revalidations() { @@ -2944,6 +2993,25 @@ void countFullWalk(FastFail reason) { if (BuildProfiled() && reason != FastFail::Count) Revalidations().fullByReason[static_cast(reason)].fetch_add(1, std::memory_order_relaxed); } +void countFullWalkTime(FastFail reason, std::chrono::steady_clock::time_point start) { + if (!BuildProfiled() || reason == FastFail::Count) return; + const auto nanoseconds = std::chrono::duration_cast(std::chrono::steady_clock::now() - start).count(); + Revalidations().fullNanoseconds[static_cast(reason)].fetch_add(static_cast(nanoseconds), std::memory_order_relaxed); +} + +constexpr std::size_t RefusedSurfaceLimit = 65536; + +void countCollectRefusal(bool storage, std::uint64_t address, std::size_t bytes) { + if (!BuildProfiled()) return; + auto& profile = Revalidations(); + (storage ? profile.refusedStorage : profile.refusedSampled).fetch_add(1, std::memory_order_relaxed); + const bool accessible = GuestMemory::Accessible(reinterpret_cast(address), bytes); + const bool watched = accessible && GuestMemory::Watched(address, bytes); + (!accessible ? profile.refusedUncommitted : !watched ? profile.refusedUnwatched : profile.refusedOther).fetch_add(1, std::memory_order_relaxed); + std::lock_guard lock(profile.refusedMutex); + if (profile.refusedSurfaces.size() < RefusedSurfaceLimit || profile.refusedSurfaces.contains(address)) profile.refusedSurfaces[address] = bytes; +} + void countOwnRefreshFallback(OwnRefreshFallback reason) { if (BuildProfiled()) Revalidations().ownFallbacks[static_cast(reason)].fetch_add(1, std::memory_order_relaxed); } @@ -2996,7 +3064,23 @@ void countRevalidate(bool fast, bool ok, std::chrono::steady_clock::time_point s const auto reasons = byReason(profile.fastFails, FastFailNames); const auto fullReasons = byReason(profile.fullByReason, FastFailNames); const auto fallbacks = byReason(profile.ownFallbacks, OwnRefreshFallbackNames); - AgcDriver::ProfilePrint_nid_no_patch("[rescache] revalidate (10 s): %llu calls %.1f ms: fast %llu, full %llu, failed %llu; fast-fail by reason:%s; full walks: T1 refreshed %llu (%llu storage images, %llu view sources, %llu views served by their own pending source, %llu overlaps left by the refresh accepted), full by reason:%s, T1 fallback by reason:%s, proofs verified %llu; fast-fail pending image: own 0 (the query excepts the own object), foreign %llu, snapshot %llu, T1 eligible %llu; keys proven: %llu sampled, %llu storage; epoch gate: %llu registry scans skipped, %llu import loops skipped; lookup log: %llu builds and full walks kept their records past the bound\n", static_cast(profile.calls.exchange(0, std::memory_order_relaxed)), profile.nanoseconds.exchange(0, std::memory_order_relaxed) / 1e6, static_cast(profile.fast.exchange(0, std::memory_order_relaxed)), static_cast(profile.full.exchange(0, std::memory_order_relaxed)), static_cast(profile.failed.exchange(0, std::memory_order_relaxed)), reasons.c_str(), static_cast(profile.ownRefreshed.exchange(0, std::memory_order_relaxed)), static_cast(profile.ownStorageRefreshes.exchange(0, std::memory_order_relaxed)), static_cast(profile.ownViewRefreshes.exchange(0, std::memory_order_relaxed)), static_cast(profile.ownSourceViews.exchange(0, std::memory_order_relaxed)), static_cast(profile.refreshedOverlaps.exchange(0, std::memory_order_relaxed)), fullReasons.c_str(), fallbacks.c_str(), static_cast(profile.proofsVerified.exchange(0, std::memory_order_relaxed)), static_cast(profile.pendingForeign.exchange(0, std::memory_order_relaxed)), static_cast(profile.pendingSnapshot.exchange(0, std::memory_order_relaxed)), static_cast(profile.pendingT1Eligible.exchange(0, std::memory_order_relaxed)), static_cast(profile.keysProven.exchange(0, std::memory_order_relaxed)), static_cast(profile.storageKeysProven.exchange(0, std::memory_order_relaxed)), static_cast(profile.serialSkips.exchange(0, std::memory_order_relaxed)), static_cast(profile.importSkips.exchange(0, std::memory_order_relaxed)), static_cast(lookupBuildsPastBound.exchange(0, std::memory_order_relaxed))); + std::string walkMs; + for (std::size_t i = 0; i < FastFailNames.size(); ++i) { + const auto nanoseconds = profile.fullNanoseconds[i].exchange(0, std::memory_order_relaxed); + if (nanoseconds == 0) continue; + char text[64]; + std::snprintf(text, sizeof(text), " %s %.1f", FastFailNames[i], static_cast(nanoseconds) / 1e6); + walkMs += text; + } + std::uint64_t refusedSurfaces = 0; + std::uint64_t refusedBytes = 0; + { + std::lock_guard lock(profile.refusedMutex); + refusedSurfaces = profile.refusedSurfaces.size(); + for (const auto& surface : profile.refusedSurfaces) refusedBytes += surface.second; + profile.refusedSurfaces.clear(); + } + AgcDriver::ProfilePrint_nid_no_patch("[rescache] revalidate (10 s): %llu calls %.1f ms: fast %llu, full %llu, failed %llu; fast-fail by reason:%s; full walks: T1 refreshed %llu (%llu storage images, %llu view sources, %llu views served by their own pending source, %llu overlaps left by the refresh accepted), full by reason:%s, T1 fallback by reason:%s, proofs verified %llu; fast-fail pending image: own 0 (the query excepts the own object), foreign %llu, snapshot %llu, T1 eligible %llu; keys proven: %llu sampled, %llu storage; epoch gate: %llu registry scans skipped, %llu import loops skipped; lookup log: %llu builds and full walks kept their records past the bound; full walk ms by reason:%s; collect refusals: sampled %llu, storage %llu (uncommitted pages %llu, unwatched %llu, other %llu) over %llu surfaces, %.1f MiB\n", static_cast(profile.calls.exchange(0, std::memory_order_relaxed)), profile.nanoseconds.exchange(0, std::memory_order_relaxed) / 1e6, static_cast(profile.fast.exchange(0, std::memory_order_relaxed)), static_cast(profile.full.exchange(0, std::memory_order_relaxed)), static_cast(profile.failed.exchange(0, std::memory_order_relaxed)), reasons.c_str(), static_cast(profile.ownRefreshed.exchange(0, std::memory_order_relaxed)), static_cast(profile.ownStorageRefreshes.exchange(0, std::memory_order_relaxed)), static_cast(profile.ownViewRefreshes.exchange(0, std::memory_order_relaxed)), static_cast(profile.ownSourceViews.exchange(0, std::memory_order_relaxed)), static_cast(profile.refreshedOverlaps.exchange(0, std::memory_order_relaxed)), fullReasons.c_str(), fallbacks.c_str(), static_cast(profile.proofsVerified.exchange(0, std::memory_order_relaxed)), static_cast(profile.pendingForeign.exchange(0, std::memory_order_relaxed)), static_cast(profile.pendingSnapshot.exchange(0, std::memory_order_relaxed)), static_cast(profile.pendingT1Eligible.exchange(0, std::memory_order_relaxed)), static_cast(profile.keysProven.exchange(0, std::memory_order_relaxed)), static_cast(profile.storageKeysProven.exchange(0, std::memory_order_relaxed)), static_cast(profile.serialSkips.exchange(0, std::memory_order_relaxed)), static_cast(profile.importSkips.exchange(0, std::memory_order_relaxed)), static_cast(lookupBuildsPastBound.exchange(0, std::memory_order_relaxed)), walkMs.c_str(), static_cast(profile.refusedSampled.exchange(0, std::memory_order_relaxed)), static_cast(profile.refusedStorage.exchange(0, std::memory_order_relaxed)), static_cast(profile.refusedUncommitted.exchange(0, std::memory_order_relaxed)), static_cast(profile.refusedUnwatched.exchange(0, std::memory_order_relaxed)), static_cast(profile.refusedOther.exchange(0, std::memory_order_relaxed)), static_cast(refusedSurfaces), static_cast(refusedBytes) / 1048576.0); } // APS5_NO_EPOCH_REVALIDATE=1: the per-element registry, cache and stamp checks and the per-region @@ -3074,6 +3158,27 @@ void ShaderResources::captureValidation() { trim(indices); } +ShaderResources::CollectRefusals ShaderResources::CollectRefusalCounts() { + auto& profile = Revalidations(); + CollectRefusals counts; + counts.sampled = profile.refusedSampled.load(std::memory_order_relaxed); + counts.storage = profile.refusedStorage.load(std::memory_order_relaxed); + counts.uncommitted = profile.refusedUncommitted.load(std::memory_order_relaxed); + counts.unwatched = profile.refusedUnwatched.load(std::memory_order_relaxed); + counts.other = profile.refusedOther.load(std::memory_order_relaxed); + std::lock_guard lock(profile.refusedMutex); + counts.surfaces = profile.refusedSurfaces.size(); + for (const auto& surface : profile.refusedSurfaces) counts.bytes += surface.second; + return counts; +} + +std::array(ShaderResources::FastFail::Count)> ShaderResources::FullWalkNanoseconds() { + std::array(FastFail::Count)> result{}; + auto& profile = Revalidations(); + for (std::size_t i = 0; i < result.size(); ++i) result[i] = profile.fullNanoseconds[i].load(std::memory_order_relaxed); + return result; +} + std::size_t ShaderResources::LookupLogCapacity() { return lookupLog().capacity(); } @@ -3138,7 +3243,10 @@ bool ShaderResources::fastRevalidate(std::uint64_t serialBefore, std::span(surface.bytes); if (!FlushDepthPlanes(address, bytes).empty()) return fail(FastFail::Changed); surface.collected = GuestMemory::CollectWrites(address, bytes); - if (surface.collected == 0) return fail(FastFail::Collect); + if (surface.collected == 0) { + countCollectRefusal(false, address, bytes); + return fail(FastFail::Collect); + } const auto* source = surface.source; if (!keyProofs) { // Without proofs the keys are compared with the record's (a cleared view's identity @@ -3194,7 +3302,10 @@ bool ShaderResources::fastRevalidate(std::uint64_t serialBefore, std::spanstorage || pending[k].found == pending[k].except || (pending[k].found == nullptr && entry->sourceEligible))) { + const auto lookupAccepts = [&](const PendingOverlap& entry) { + const auto& surface = validatedTextures[entry.element]; + if (surface.resource.dccAddress != 0) return false; + const auto viewed = pendingLookupSource(context, surface.resource, surface.bytes, entry.depthCompare).source; + return viewed.get() == pending[k].except || (viewed == nullptr && entry.sourceEligible && entry.sourceRefreshed); + }; + if (const auto entry = refreshedOwner(owners[k]); entry != refreshed.end() && (entry->storage || pending[k].found == pending[k].except || (pending[k].found == nullptr && entry->sourceEligible) || lookupAccepts(*entry))) { if (BuildProfiled()) Revalidations().refreshedOverlaps.fetch_add(1, std::memory_order_relaxed); accepted = true; continue; @@ -3326,7 +3443,7 @@ ShaderResources::OwnRefreshFallback ShaderResources::refreshOwnObjects(std::span // view stays the lookup's answer only when that image is its own source. `sourceEligible` is // recorded whichever branch answers: a later refresh of this call may flush the source, and // the re-run then judges the surface by the other branch. - const auto refreshView = [&](std::size_t i, PendingOverlap& overlap) { + const auto refreshView = [&](std::size_t i, PendingOverlap& overlap, bool depthCompare) { const auto& surface = validatedTextures[i]; const auto& source = textures[i]->SharedStorageSource(); if (source == nullptr || source.get() != surface.source) return OwnRefreshFallback::Snapshot; @@ -3336,8 +3453,9 @@ ShaderResources::OwnRefreshFallback ShaderResources::refreshOwnObjects(std::span const auto bytes = static_cast(surface.bytes); const bool imported = SampledFromStorageEligible(context, surface.resource, surface.bytes); overlap.sourceEligible = imported && SurfaceKey(context, source->Descriptor()) == SurfaceKey(context, surface.resource); - auto found = StorageTexture::FindPending(address, surface.bytes); - if (found != nullptr && !Texture::CanCopyFrom(*found, surface.resource)) found.reset(); + overlap.depthCompare = depthCompare; + overlap.sourceRefreshed = false; + const auto found = pendingLookupSource(context, surface.resource, surface.bytes, depthCompare).source; if (found != nullptr) { if (found != source) return OwnRefreshFallback::ForeignView; if (!GuestMemory::UnchangedSince(address, bytes, source->GenerationFor(address, bytes))) { @@ -3352,6 +3470,7 @@ ShaderResources::OwnRefreshFallback ShaderResources::refreshOwnObjects(std::span // The cache's image of the key is this source while it is cached (an entry is replaced // only after its image left the cache), so the lookup would refresh and return it. source->Refresh(); + overlap.sourceRefreshed = true; return OwnRefreshFallback::Count; }; // A storage element's lookup (cachedStorageTexture): the cached image of its surface key, @@ -3378,7 +3497,7 @@ ShaderResources::OwnRefreshFallback ShaderResources::refreshOwnObjects(std::span const auto index = textureIndex++; const auto overlap = listed(index, false); if (overlap == overlapping.end()) continue; - if (const auto fallback = refreshView(index, *overlap); fallback != OwnRefreshFallback::Count) return fallback; + if (const auto fallback = refreshView(index, *overlap, !binding.imageDepthCompare.empty() && binding.imageDepthCompare.at(element)); fallback != OwnRefreshFallback::Count) return fallback; } } else if (binding.kind == ShaderRecompiler::DescriptorKind::StorageImage) { for (std::uint32_t element = 0; element < binding.count; ++element) { @@ -3393,12 +3512,15 @@ ShaderResources::OwnRefreshFallback ShaderResources::refreshOwnObjects(std::span } } for (const auto& table : tableStages) { - for (const auto index : table.elementTextures) { + const auto* images = table.elementTextures.empty() ? nullptr : tableImages(shaders, table.stage); + for (std::size_t element = 0; element < table.elementTextures.size(); ++element) { + const auto index = table.elementTextures[element]; if (index == std::numeric_limits::max()) continue; if (index != textureIndex++ || index >= textures.size()) return OwnRefreshFallback::Uncached; const auto overlap = listed(index, false); if (overlap == overlapping.end()) continue; - if (const auto fallback = refreshView(index, *overlap); fallback != OwnRefreshFallback::Count) return fallback; + if (images == nullptr || images->count != table.elementTextures.size()) return OwnRefreshFallback::Uncached; + if (const auto fallback = refreshView(index, *overlap, images->imageDepthCompare.at(element)); fallback != OwnRefreshFallback::Count) return fallback; } } return OwnRefreshFallback::Count; @@ -3632,7 +3754,10 @@ bool ShaderResources::revalidateFull(std::span shaders, Pr if (report != nullptr) report->path = !fast ? ProofPath::Full : ownRefreshed ? ProofPath::OwnRefreshed : ProofPath::Fast; if (!fast) { countFullWalk(reason); - if (!fullWalk()) { + const auto walkStart = profile ? std::chrono::steady_clock::now() : std::chrono::steady_clock::time_point{}; + const bool walked = fullWalk(); + countFullWalkTime(reason, walkStart); + if (!walked) { const auto failure = [&] { switch (reason) { case FastFail::Pending: return ProofFailure::Pending; @@ -3714,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); @@ -5331,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)}; @@ -5649,6 +5779,7 @@ std::size_t ShaderResources::DrawUploadLimit() { } std::shared_ptr ShaderResources::PrepareDrawBindings(Recorder& recorder, std::span moved, bool movedOnly) const { + requireGuestBuffers(moved); if ((_set == VK_NULL_HANDLE && fragment.set == VK_NULL_HANDLE) || usesBda) return {}; thread_local std::vector>* readsSlot = nullptr; auto& reads = ShaderRecompiler::ThreadOwned(readsSlot); @@ -5797,7 +5928,20 @@ std::shared_ptr ShaderResources::PrepareDrawBindi return result; } +void ShaderResources::requireGuestBuffers(std::span moved) const { + for (std::size_t index = 0; index < allocations.size(); ++index) { + const auto& item = allocations[index]; + if (!item.guest) continue; + 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; + RequireNoResidentDepthRead_nid_no_patch(address, bytes, htileClear); + RequireNoMultisampleColorTarget(address, bytes, "a shader buffer access"); + } +} + void ShaderResources::Bind(VkCommandBuffer commands, VkPipelineBindPoint bindPoint, VkPipelineLayout layout) const { + requireGuestBuffers(); if (_set != VK_NULL_HANDLE) context.Resolved(&DeviceFunctions::cmdBindDescriptorSets, "vkCmdBindDescriptorSets")(commands, bindPoint, layout, 0, 1, &_set, 0, nullptr); if (fragment.set != VK_NULL_HANDLE) context.Resolved(&DeviceFunctions::cmdBindDescriptorSets, "vkCmdBindDescriptorSets")(commands, bindPoint, layout, ShaderRecompiler::RuntimeAbi::FragmentDescriptorSet, 1, &fragment.set, 0, nullptr); } diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/ShaderValidation.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/ShaderValidation.cpp index bdd1dedfcb97..8b8bd0a0d492 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 || @@ -595,6 +595,10 @@ Module Inspect(const CompiledShader& compiled, const State& state, const VkPhysi } else { Require(variable.storage == spv::StorageClassStorageBuffer && decoration.set && decoration.binding, "unsupported or unbound shader resource"); const auto key = std::make_pair(*decoration.set, *decoration.binding); + if (*decoration.set == ShaderRecompiler::MeshWindowDescriptorSet) { + Require(mesh && *decoration.binding == 0u, "mesh window buffer binding is wrong"); + continue; + } if (*decoration.set == ShaderRecompiler::PixelFunctionLdsDescriptorSet) { Require(fragment && *decoration.binding == 0u, "pixel function LDS buffer binding is wrong"); continue; diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp index 4d73da9f9d23..dafe76944691 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp @@ -1226,7 +1226,7 @@ std::array PixelSampleLocations(const State& state, const Shad std::array locations{}; const bool sampleBarycentrics = (pixel.inputAddr & (PixelInputBit(PixelInput::PerspectiveSample) | PixelInputBit(PixelInput::LinearSample))) != 0u; const bool samplePosition = !state.perSampleShading && (pixel.posX || pixel.posY) && pixel.positionLocation == ShaderRecompiler::PixelPositionLocation::Sample; - const bool mergedCentres = pixel.targetMerge.samples > 1u && (pixel.inputAddr & (PixelInputBit(PixelInput::PerspectiveCenter) | PixelInputBit(PixelInput::LinearCenter))) != 0u; + const bool mergedCentres = !pixel.targetMerges.empty() && pixel.targetMerges.front().samples > 1u && (pixel.inputAddr & (PixelInputBit(PixelInput::PerspectiveCenter) | PixelInputBit(PixelInput::LinearCenter))) != 0u; if (!sampleBarycentrics && !samplePosition && !mergedCentres) return locations; const auto samples = state.perSampleShading ? state.samples : 1u; for (std::uint32_t pixelIndex = 0; pixelIndex < 4u; ++pixelIndex) { @@ -1840,7 +1840,7 @@ State DecodeState(const QueueState& queue, bool vertexWorkgroup) { Require(nibbles || (exportedMask & packedMask) == packedMask, "partial writes of " + packed + " color target are unsupported"); if ((exportedMask & packedMask) != packedMask) { Require(color.mipCount == 1u && color.depth == 1u && color.layers == 1u && color.arrayLastSlice == 0u, "partial writes of a mipmapped, volume or array " + std::string(PackedColorTargetName(color.packing)) + " color target are not implemented"); - Require(std::ranges::none_of(result.colors, [](const ColorTarget& other) { return other.partialWriteMask != 0; }), "a draw merges into one color target at most, so partial writes of a packed color target cannot join another merged color target"); + Require(std::ranges::none_of(result.colors, [](const ColorTarget& other) { return other.partialWriteMask != 0; }), "partial writes of a packed color target merge into their target alone and cannot join another merged color target of the draw"); color.partialWriteMask = PackedWriteMask(mapping, exportedMask); state.colorWriteMask = 0; if (color.samples > 1u) { @@ -1871,7 +1871,7 @@ State DecodeState(const QueueState& queue, bool vertexWorkgroup) { Require(color.samples == 1u && color.packing == ShaderRecompiler::ColorExportPacking::None, "blending unclamped normalized color into a multisampled or packed color target is not implemented" + where); Require(!reversed && mapping != 0xecu, "blending unclamped normalized color into a color target with a reversed or alternate component order is not implemented" + where); Require(!(secondSource(state.srcColorBlendFactor) || secondSource(state.dstColorBlendFactor) || secondSource(state.srcAlphaBlendFactor) || secondSource(state.dstAlphaBlendFactor)), "dual-source blending of unclamped normalized color is not implemented" + where); - Require(std::ranges::none_of(result.colors, [&](const ColorTarget& other) { return &other != &color && other.partialWriteMask != 0; }), "a draw merges into one color target at most, so blending unclamped normalized color cannot join another merged color target" + where); + Require(std::ranges::none_of(result.colors, [&](const ColorTarget& other) { return &other != &color && other.partialWriteMask != 0 && other.partialWriteMask != UnclampedBlendMask; }), "blending unclamped normalized color cannot join a partial write of a packed color target in one draw" + where); Require(!SignedNormalizedFormat(color.format) || (state.colorWriteMask & NormalizedChannelMask(color.format)) == NormalizedChannelMask(color.format), "blending unclamped signed normalized color with a write mask that skips a component is not implemented, since the shader rewrites the skipped component through a float and the code -128 would become -127" + where); color.partialWriteMask = UnclampedBlendMask; } @@ -1942,12 +1942,14 @@ bool DepthStencilTests(const State& state) { return state.depth.has_value() && (state.depthTest || state.stencilTest || state.depthBoundsTest); } -ShaderRecompiler::TargetMerge ExportTargetMerge(const State& state) { +std::vector ExportTargetMerges(const State& state) { static_assert(VK_BLEND_FACTOR_ZERO == 0 && VK_BLEND_FACTOR_SRC_ALPHA_SATURATE == 14 && VK_BLEND_OP_ADD == 0 && VK_BLEND_OP_MAX == 4); - ShaderRecompiler::TargetMerge merge; + std::vector merges; for (const auto& color : state.colors) { if (color.partialWriteMask == 0) continue; - Require(merge.mask == 0 && color.exportIndex < 8u && color.samples <= 8u, "a draw merges into one color target at most"); + Require(color.exportIndex < 8u && color.samples <= 8u, "a merged color target needs an MRT slot below 8 and at most 8 samples"); + Require(std::ranges::none_of(state.colors, [&](const ColorTarget& other) { return &other != &color && other.partialWriteMask != 0 && other.address < color.address + color.bytes && color.address < other.address + other.bytes; }), "two merged color targets of one draw share memory"); + auto& merge = merges.emplace_back(); Require(color.samples == 1u || state.perSampleShading, "a merged multisampled color target needs per-sample shading"); merge.target = static_cast(color.exportIndex); merge.mask = color.partialWriteMask; @@ -1969,7 +1971,7 @@ ShaderRecompiler::TargetMerge ExportTargetMerge(const State& state) { blend.writeMask = static_cast(attachment.colorWriteMask & 0xfu); for (std::size_t i = 0; i < 4; ++i) blend.constants[i] = std::bit_cast(state.blendConstants[i]); } - return merge; + return merges; } bool PartialSampleMask(const State& state) { diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp index 8edbe4069507..ce2d871ed5f0 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp @@ -20,6 +20,7 @@ #include "prx/libSceAgcDriver/Graphics/include/UnitShadow.hpp" #include "prx/libSceAgcDriver/Execution/include/GuestMemory.hpp" #include "RdnaDecoder/include/RdnaDecoder/RdnaDescriptorFormat.hpp" +#include "IntermediateRepresentation/include/IntermediateRepresentation/IrMetadata/BufferFormat.hpp" #include #include #include @@ -105,7 +106,7 @@ thread_local const char* uploadReason = "first"; // selections widened to every pending unit (the hysteresis in writeBack), units dropped as dead // (DiscardPendingInside) and units an alias's own results superseded (markLayersPending); relaxed, // reported only. -std::atomic singlePassMoves{0}, slabRetiles{0}; +std::atomic singlePassMoves{0}, slabRetiles{0}, paddingSeedCopies{0}; std::atomic partialUploads{0}, partialUploadBytes{0}, partialWriteBacks{0}, partialWriteBackBytes{0}, emptyWriteBacks{0}, coalescedWriteBacks{0}, unitsDropped{0}, unitsSuperseded{0}, clearHandOvers{0}, handedOverSuperseded{0}; // FlushPending listings skipped because no pending unit of the image lay inside the range, images // whose selected pending units were dropped because their memory is no longer registered (see @@ -336,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; @@ -362,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"); @@ -404,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). @@ -1437,12 +1471,21 @@ std::shared_ptr StorageTexture::Create(const Context& context, T return texture; } +void StorageTexture::clearImage(VkCommandBuffer commands, VkClearColorValue value, const VkImageSubresourceRange& range) { + if (imageFormat == VK_FORMAT_R8G8B8A8_UINT && storageFormat == VK_FORMAT_R32_UINT) { + const auto bits = value.uint32[0]; + for (std::uint32_t component = 0; component < 4; ++component) value.uint32[component] = (bits >> (8 * component)) & 0xffu; + } + context.Function("vkCmdClearColorImage")(commands, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &value, 1, &range); +} + StorageTexture::StorageTexture(const Context& context, TextureDetiler& detiler, const GuestTextureResource& descriptor, std::uint32_t mipLevel) : context(context), detiler(detiler), descriptor(descriptor) { try { Require(!IsBlockCompressed(descriptor.format), "block-compressed textures cannot be storage images"); Require(mipLevel < descriptor.mipCount, "storage texture mip level is outside the texture"); const auto vkFormat = StorageFormatFor(context, ResolveTextureFormat(descriptor.format)); storageFormat = vkFormat; + imageFormat = descriptor.format == static_cast(ShaderRecompiler::IrBufferFormat::Format11_11_10Float) && storageFormat == VK_FORMAT_R32_UINT ? VK_FORMAT_R8G8B8A8_UINT : storageFormat; #ifdef APS5_DEBUG_LOG AGC_LOG_DEFERRED(stdout, "StorageTexture address=0x%llx %ux%u mips=%u mip=%u layers=%u base=%u dim=%d tile=%d format=%u vk=%d", static_cast(descriptor.baseAddress), descriptor.width, descriptor.height, descriptor.mipCount, mipLevel, descriptor.depthOrLastArray, descriptor.baseArray, static_cast(descriptor.dimension), static_cast(descriptor.tileMode), descriptor.format, static_cast(vkFormat)); @@ -1474,7 +1517,7 @@ StorageTexture::StorageTexture(const Context& context, TextureDetiler& detiler, // Sampled views of other same-size formats (sRGB, reinterpretations) read the image directly. imageInfo.flags = (descriptor.dimension == TextureDimension::kCube ? VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT : 0u) | (descriptor.dimension == TextureDimension::k3D ? VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT : 0u) | VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_EXTENDED_USAGE_BIT; imageInfo.imageType = ImageTypeFor(descriptor.dimension); - imageInfo.format = vkFormat; + imageInfo.format = imageFormat; imageInfo.extent = {descriptor.width, descriptor.height, geometry.imageDepth}; imageInfo.mipLevels = descriptor.mipCount; Require(geometry.imageLayers <= context.limits.maxImageArrayLayers, "a texture array with more layers than maxImageArrayLayers is not implemented"); @@ -2493,6 +2536,10 @@ std::uint64_t StorageTexture::SlabRetiles() { return slabRetiles.load(std::memory_order_relaxed); } +std::uint64_t StorageTexture::PaddingSeedCopies() { + return paddingSeedCopies.load(std::memory_order_relaxed); +} + bool StorageTexture::otherPendingOverlaps() const { auto& pending = Pending(); std::lock_guard lock(pending.mutex); @@ -2747,7 +2794,7 @@ void StorageTexture::upload(const std::vector* layers) { toClear.image = image; toClear.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, descriptor.mipCount, 0, geometry.imageLayers}; context.Function("vkCmdPipelineBarrier")(commands, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, 1, &toClear); - context.Function("vkCmdClearColorImage")(commands, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clearValue, 1, &toClear.subresourceRange); + clearImage(commands, clearValue, toClear.subresourceRange); VkImageMemoryBarrier toGeneral = toClear; toGeneral.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; toGeneral.dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT; @@ -3107,6 +3154,24 @@ std::vector> StorageTexture::uncoveredBy return uncovered; } +std::vector> StorageTexture::coveredBytes(std::span> runs) const { + const auto uncovered = uncoveredBytes(runs); + std::vector> sorted(runs.begin(), runs.end()); + std::sort(sorted.begin(), sorted.end()); + std::vector> covered; + std::size_t next = 0; + for (const auto& [runBegin, runEnd] : sorted) { + while (next < uncovered.size() && uncovered[next].second <= runBegin) ++next; + auto at = runBegin; + for (auto i = next; i < uncovered.size() && uncovered[i].first < runEnd; ++i) { + if (uncovered[i].first > at) covered.emplace_back(at, uncovered[i].first); + at = std::max(at, uncovered[i].second); + } + if (at < runEnd) covered.emplace_back(at, runEnd); + } + return covered; +} + StorageTexture::PaddingSeeds StorageTexture::paddingSeeds(const HostImport& import, std::vector copied) const { PaddingSeeds seeds; std::sort(copied.begin(), copied.end(), [](const CopiedBytes& a, const CopiedBytes& b) { return a.begin < b.begin; }); @@ -3479,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}); } @@ -3648,7 +3714,10 @@ std::uint64_t StorageTexture::writeBackWindows(std::span se } // The padding's current bytes, under the retile that follows (the import-ready barrier // orders the scratch writes). - for (const auto& [source, copies] : padding.copies) context.Resolved(&DeviceFunctions::cmdCopyBuffer, "vkCmdCopyBuffer")(commands, source, tiledScratch->Handle(), static_cast(copies.size()), copies.data()); + for (const auto& [source, copies] : padding.copies) { + context.Resolved(&DeviceFunctions::cmdCopyBuffer, "vkCmdCopyBuffer")(commands, source, tiledScratch->Handle(), static_cast(copies.size()), copies.data()); + paddingSeedCopies.fetch_add(copies.size(), std::memory_order_relaxed); + } for (const auto& [source, slab, copies] : holeCopies) context.Resolved(&DeviceFunctions::cmdCopyBuffer, "vkCmdCopyBuffer")(commands, source, slab, static_cast(copies.size()), copies.data()); } const VkMemoryBarrier importReady{VK_STRUCTURE_TYPE_MEMORY_BARRIER, nullptr, VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_HOST_WRITE_BIT, VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT}; @@ -4608,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; { @@ -5295,7 +5383,7 @@ bool StorageTexture::clearByKeysFill(DccKeys keys, std::uint8_t key) { toClear.image = image; toClear.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, descriptor.mipCount, 0, geometry.imageLayers}; context.Function("vkCmdPipelineBarrier")(commands, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, 1, &toClear); - context.Function("vkCmdClearColorImage")(commands, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clearValue, 1, &toClear.subresourceRange); + clearImage(commands, clearValue, toClear.subresourceRange); VkImageMemoryBarrier toGeneral = toClear; toGeneral.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; toGeneral.dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; @@ -5431,7 +5519,7 @@ bool StorageTexture::FillClear(std::span pattern, std::u toClear.image = image; toClear.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, descriptor.mipCount, layer == WholeImage ? 0u : layer, layer == WholeImage ? geometry.imageLayers : 1u}; context.Function("vkCmdPipelineBarrier")(commands, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, 1, &toClear); - context.Function("vkCmdClearColorImage")(commands, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clearValue, 1, &toClear.subresourceRange); + clearImage(commands, clearValue, toClear.subresourceRange); VkImageMemoryBarrier toGeneral = toClear; toGeneral.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; toGeneral.dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; @@ -6175,7 +6263,16 @@ void StorageTexture::writeBackLayers(const std::vector& layers) { auto tiledScratch = std::make_shared(context, static_cast(guestBytes), VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT); std::vector copied; for (const auto& [from, to] : keep) copied.push_back({from - descriptor.baseAddress, to - descriptor.baseAddress, from - descriptor.baseAddress}); - const auto padding = paddingSeeds(segments, copied); + auto padding = paddingSeeds(segments, copied); + std::vector> importStores(keep.begin(), keep.end()); + const bool linearRows = descriptor.tileMode == TextureTileMode::kLinear && !geometry.thick && std::none_of(mips.begin(), mips.end(), [](const TileMipLayout& mip) { return mip.tail; }); + if (linearRows && !padding.copies.empty() && padding.slabs.empty() && saveUnits.empty()) { + std::vector> runs; + for (const auto& range : copied) runs.emplace_back(range.begin, range.end); + importStores.clear(); + for (const auto& [begin, end] : coveredBytes(runs)) importStores.emplace_back(descriptor.baseAddress + begin, descriptor.baseAddress + end); + padding = {}; + } detiler.BeginBatch(); auto* recorder = Recorder::Active(); std::unique_ptr batch; @@ -6196,7 +6293,7 @@ void StorageTexture::writeBackLayers(const std::vector& layers) { Recorder::CountBarriers(Recorder::CommandClass::StorageWriteBack, padding.copies.empty() ? 4 : 5); if (Recorder::BarrierValidate()) { const std::pair read{image, false}; - recorder->NoteAccess(Recorder::CommandClass::StorageWriteBack, Recorder::Access{padding.importReads, keep, std::span(&read, 1), VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT}); + recorder->NoteAccess(Recorder::CommandClass::StorageWriteBack, Recorder::Access{padding.importReads, importStores, std::span(&read, 1), VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT}); } } else { batch = std::make_unique(context); @@ -6220,7 +6317,10 @@ void StorageTexture::writeBackLayers(const std::vector& layers) { // earlier writer of the import, host stores included, first; the import-ready barrier // below orders the scratch writes). RecordMemoryBarrier(context, commands, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_HOST_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT); - for (const auto& [source, copies] : padding.copies) context.Function("vkCmdCopyBuffer")(commands, source, tiledScratch->Handle(), static_cast(copies.size()), copies.data()); + for (const auto& [source, copies] : padding.copies) { + context.Function("vkCmdCopyBuffer")(commands, source, tiledScratch->Handle(), static_cast(copies.size()), copies.data()); + paddingSeedCopies.fetch_add(copies.size(), std::memory_order_relaxed); + } } const auto regions = CopyRegions(storedLayers); context.Function("vkCmdCopyImageToBuffer")(commands, image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, linear->Handle(), static_cast(regions.size()), regions.data()); @@ -6240,7 +6340,7 @@ void StorageTexture::writeBackLayers(const std::vector& layers) { context.Function("vkCmdPipelineBarrier")(commands, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 1, &scratchDone, 0, nullptr); for (const auto& segment : segments) { std::vector copies; - for (const auto& [from, to] : keep) { + for (const auto& [from, to] : importStores) { const auto begin = std::max(from, segment.begin); const auto end = std::min(to, segment.end); if (begin < end) copies.push_back({begin - descriptor.baseAddress, HostImportOffset(*segment.import, begin), end - begin}); diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp index b0a1e2588f7a..3c358829589c 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp @@ -203,6 +203,15 @@ VkPipeline TextureDetiler::pipeline(TextureTileMode tileMode, std::uint32_t elem return result; } +std::uint32_t TextureDetiler::layerBankXor(TextureTileMode tileMode, std::uint32_t elementBytes, const TileMipLayout& layout, std::uint32_t layer) { + if (layer == 0 || layout.gcnMicroTiled || !IsGcnMacroTiled(tileMode)) return 0u; + const auto key = (static_cast(tileMode) << 8u) | elementBytes; + for (const auto& entry : gcnGeometries) { + if (entry.first == key) return GcnLayerBankXor(entry.second, layer); + } + return GcnLayerBankXor(gcnGeometries.emplace_back(key, GcnTiling(tileMode, elementBytes)).second, layer); +} + void TextureDetiler::checkWindow(const TileMipLayout& layout, const DetileWindow& window, std::uint32_t& columnEnd, std::uint32_t& rowEnd) const { Require(layout.width != 0 && layout.height != 0, "texture detiling requires a non-empty mip layout"); Require(layout.tiledSize != 0 && layout.linearSize != 0, "texture detiling requires a non-empty mip layout"); @@ -268,7 +277,7 @@ void TextureDetiler::Dispatch(VkCommandBuffer commands, TextureTileMode tileMode push.linearBase = window.linearBase; push.columnBegin = window.columnBegin; push.rowBegin = window.rowBegin; - push.pipeBankXor = window.pipeBankXor; + push.pipeBankXor = window.pipeBankXor ^ layerBankXor(tileMode, elementBytes, layout, slice); push.splitStride = layout.gcnSplitStride; context.Function("vkCmdPushConstants")(commands, pipelineLayout, VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(Push), &push); const auto groupsX = (columnEnd - window.columnBegin + 7u) / 8u; @@ -459,7 +468,7 @@ void TextureDetiler::DispatchImage(VkCommandBuffer commands, TextureTileMode til push.linearBase = 0; push.columnBegin = window.columnBegin; push.rowBegin = window.rowBegin; - push.pipeBankXor = window.pipeBankXor; + push.pipeBankXor = window.pipeBankXor ^ layerBankXor(tileMode, elementBytes, layout, slice); push.splitStride = layout.gcnSplitStride; context.Function("vkCmdPushConstants")(commands, imagePipelineLayout, VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(Push), &push); const auto groupsX = (columnEnd - window.columnBegin + 7u) / 8u; diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/TextureFormat.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/TextureFormat.cpp index 1756e2fa0235..912d86a3733e 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/src/TextureFormat.cpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/src/TextureFormat.cpp @@ -224,6 +224,7 @@ std::uint32_t RepackTextureWord(std::uint32_t word) { std::optional FindGuestColorTargetFormat(VkFormat format, std::uint32_t elementBytes) { switch (format) { case VK_FORMAT_B8G8R8A8_UNORM: format = VK_FORMAT_R8G8B8A8_UNORM; break; + case VK_FORMAT_B8G8R8A8_SNORM: format = VK_FORMAT_R8G8B8A8_SNORM; break; case VK_FORMAT_B8G8R8A8_SRGB: format = VK_FORMAT_R8G8B8A8_SRGB; break; case VK_FORMAT_A2R10G10B10_UNORM_PACK32: format = VK_FORMAT_A2B10G10R10_UNORM_PACK32; break; default: break; diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/TextureTiling.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/TextureTiling.cpp index 0d5bd91dca12..a3a487e76608 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/src/TextureTiling.cpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/src/TextureTiling.cpp @@ -557,6 +557,9 @@ GcnTileGeometry GcnTiling(TextureTileMode tileMode, std::uint32_t bytesPerElemen for (std::uint32_t bit = 0; bit < log2Pipes; ++bit) geometry.equation[pipeInterleaveBits + bit] = pipe[bit]; for (std::uint32_t bit = 0; bit < bankBits; ++bit) geometry.equation[pipeInterleaveBits + log2Pipes + bit] = bank[bit]; for (auto bit = pipeInterleaveBits; bit < innerBits; ++bit) geometry.equation[bit + log2Pipes + bankBits] = inner[bit]; + geometry.layerBankStep = prt ? 0u : mode.banks / 2u - 1u; + geometry.bankMask = mode.banks - 1u; + geometry.bankShift = pipeInterleaveBits + log2Pipes; return geometry; } diff --git a/core/libs/prx/libSceAgcDriver/Resource/src/Registration.cpp b/core/libs/prx/libSceAgcDriver/Resource/src/Registration.cpp index 7cae8c3afb18..efe0e6724170 100644 --- a/core/libs/prx/libSceAgcDriver/Resource/src/Registration.cpp +++ b/core/libs/prx/libSceAgcDriver/Resource/src/Registration.cpp @@ -6,7 +6,6 @@ #include "SceTypes.hpp" #include "prx/libc/include/General.hpp" -// Resource registration feeds GPU debugging tools, none of which are attached; the game treats this code as benign. static constexpr int SCE_AGC_ERROR_RESOURCE_REGISTRATION_UNAVAILABLE = static_cast(0x8A6C9018); static constexpr uint32_t RESOURCE_REGISTRATION_MAX_NAME_LENGTH = 0xfc; static constexpr int SCE_AGC_ERROR_WORKLOAD_STREAM_INVALID_ID = static_cast(0x8A6C0033); diff --git a/core/libs/prx/libSceAgcDriver/Unimplemented.cpp b/core/libs/prx/libSceAgcDriver/Unimplemented.cpp index f361aacbe898..df2d3bd4e6a8 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 000000000000..c26819a9b74a --- /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 a370fe280249..9b854cb45309 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/BdaDevice.cpp b/core/libs/prx/libSceAgcDriver/tests/BdaDevice.cpp index deb5bb8e8d10..0231d443649f 100644 --- a/core/libs/prx/libSceAgcDriver/tests/BdaDevice.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/BdaDevice.cpp @@ -92,6 +92,8 @@ class Device { explicit Device(bool importHostMemory = false) { #ifdef _WIN32 library = SDL_LoadObject("vulkan-1.dll"); +#elif defined(__APPLE__) + library = SDL_LoadObject("libvulkan.1.dylib"); #else library = SDL_LoadObject("libvulkan.so.1"); #endif @@ -103,6 +105,12 @@ class Device { application.apiVersion = VK_API_VERSION_1_1; VkInstanceCreateInfo info{VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO}; info.pApplicationInfo = &application; +#ifdef __APPLE__ + const char* portability = VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME; + info.flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; + info.enabledExtensionCount = 1; + info.ppEnabledExtensionNames = &portability; +#endif Check(function("vkCreateInstance")(&info, nullptr, &instance), "vkCreateInstance"); std::uint32_t count = 0; const auto enumerate = function("vkEnumeratePhysicalDevices"); diff --git a/core/libs/prx/libSceAgcDriver/tests/BdaResources.cpp b/core/libs/prx/libSceAgcDriver/tests/BdaResources.cpp index 530932720e35..a00cc6e740a9 100644 --- a/core/libs/prx/libSceAgcDriver/tests/BdaResources.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/BdaResources.cpp @@ -116,6 +116,7 @@ void snapshotTableTests(const Context& context, const BdaTestAccess& access) { auto a = build(first, false, true, snapshotAddress); auto plain = build(first, false, false, snapshotAddress); auto d = build(first, true, true, snapshotAddress); + const auto spaceTableHitsBefore = BdaResources::TableCacheCounters().spaceTables; auto b = build(first, false, true, snapshotAddress); auto c = build(second, false, true, snapshotAddress); Require(a.snapshot == b.snapshot && a.view == b.view, "two builds of one snapshot with the same bytes do not share its device copy"); @@ -124,6 +125,8 @@ void snapshotTableTests(const Context& context, const BdaTestAccess& access) { if (spaces) { Require(a.memory->CachedAddressTable().has_value() && c.memory->CachedAddressTable().has_value() && d.memory->CachedAddressTable().has_value(), "a build with its own regions over the address space has no cached BDA table"); Require(a.table == b.table, "two builds of the same space and snapshot do not share their BDA table"); + Require(BdaResources::TableCacheCounters().spaceTables == spaceTableHitsBefore + 1, "a repeated build with a stable address-space and MSAA guard generation missed the serial-keyed BDA table"); + Require(b.bda->Table().range == a.bda->Table().range && b.bda->Table().range != 0, "a cached BDA descriptor lost its byte range: " + std::to_string(b.bda->Table().range) + " instead of " + std::to_string(a.bda->Table().range)); Require(c.table != a.table, "a build with other snapshot bytes took another build's BDA table"); Require(a.memory->CachedAddressTable()->serial == b.memory->CachedAddressTable()->serial && c.memory->CachedAddressTable()->serial != a.memory->CachedAddressTable()->serial, "cached BDA table serials do not follow the build's ranges"); } @@ -3381,6 +3384,10 @@ void RunHeapMirrorUnwatchTests(const Context& context, const BdaTestAccess& acce GuestAllocations::GuestAllocationsEnd_nid_postfix(mutation); }; registry(true); +#ifdef _WIN32 + AgcDriver::GuestMemory::Unwatch(idle, idleBytes); + AgcDriver::GuestMemory::Unwatch(busy, busyBytes); +#endif auto importing = context; importing.hostImportAlignment = block; SetHostImportBudget(heapBytes + idleBytes + busyBytes - block); @@ -3785,6 +3792,196 @@ void RunAddressCopyCapTests(const Context& context, const BdaTestAccess& access, std::cout << (remembered ? "an address-based build answered from a remembered budget refusal evicts instead of copying a partly unwatched heap past the cap\n" : "an address-based build serves a partly unwatched heap whose import is over the budget\n"); } +void RunAddressCopyCapMirrorTests(const Context& context, const BdaTestAccess& access, int frames) { + constexpr std::size_t block = 65536; + constexpr std::size_t unwatchedBytes = 32 * block; + constexpr std::size_t mirroredBytes = 16 * block; +#ifdef _WIN32 + if (!GuestArena::GuestArenaAvailable_nid_postfix() || !GuestArena::GuestArenaWriteWatched_nid_postfix()) { + std::cout << "guest arena unavailable or not write-watched: imports yielding to the address copy cap not tested\n"; + return; + } +#else + if (!GuestWriteWatch::GuestWriteWatchAvailable_nid_postfix()) { + std::cout << "write watch unavailable: imports yielding to the address copy cap not tested\n"; + return; + } +#endif + struct Piece { + void* pointer = nullptr; + void* mapping = nullptr; + std::size_t allocated = 0; + std::size_t bytes = 0; + }; + std::array pieces{}; + for (auto& piece : pieces) { + piece.allocated = unwatchedBytes + block; +#ifdef _WIN32 + piece.pointer = GuestArena::GuestArenaAllocate_nid_postfix(piece.allocated, block); + Require(piece.pointer != nullptr, "cannot allocate the yielding import ranges in the guest arena"); + GuestArena::GuestArenaCommit_nid_postfix(piece.pointer, piece.allocated, PAGE_READWRITE, piece.allocated); + piece.mapping = piece.pointer; +#else + piece.mapping = mmap(nullptr, piece.allocated + block, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + Require(piece.mapping != MAP_FAILED, "cannot map the yielding import ranges"); + piece.pointer = reinterpret_cast((reinterpret_cast(piece.mapping) + block - 1) & ~std::uintptr_t{block - 1}); +#endif + std::memset(piece.pointer, 0x5a, piece.allocated); + } + if (pieces[1].pointer < pieces[0].pointer) { + std::swap(pieces[0].pointer, pieces[1].pointer); + std::swap(pieces[0].mapping, pieces[1].mapping); + std::swap(pieces[0].allocated, pieces[1].allocated); + } + pieces[0].bytes = unwatchedBytes; + pieces[1].bytes = mirroredBytes; + const auto unwatched = reinterpret_cast(pieces[0].pointer); + const auto mirrored = reinterpret_cast(pieces[1].pointer); +#ifndef _WIN32 + GuestWriteWatch::GuestWriteWatchRegister_nid_postfix(pieces[1].pointer, mirroredBytes); +#endif + { + auto* mutation = GuestAllocations::GuestAllocationsBegin_nid_postfix(); + for (const auto& piece : pieces) GuestAllocations::GuestAllocationsAdd_nid_postfix(mutation, piece.pointer, piece.bytes, true, false, true); + GuestAllocations::GuestAllocationsEnd_nid_postfix(mutation); + } +#ifdef _WIN32 + AgcDriver::GuestMemory::Unwatch(unwatched, unwatchedBytes); +#endif + Require(!AgcDriver::GuestMemory::Watched(unwatched, unwatchedBytes) && AgcDriver::GuestMemory::Watched(mirrored, mirroredBytes), "the first range is not outside the write watch or the second is not inside it"); + auto importing = context; + importing.hostImportAlignment = block; + SetHostImportBudget(unwatchedBytes + block); + for (int frame = 0; frame < frames; ++frame) NoteHostImportFrame(); + for (int use = 0; use < 300; ++use) Require(HostImportFor(importing, mirrored, 64) != nullptr, "the write-watched range was not imported"); + Require(HostImportLiveBytes() == mirroredBytes, "the import before the build is not the write-watched range"); + const auto before = MirrorCounters(); + { + GuestBufferMemory leased(importing); + leased.AcquireRegistered(); + leased.Upload(true); + Require(HostImportCovers(importing, unwatched, unwatchedBytes), "an address-based build did not import a range that only an import serves in place of a recently used import a mirror can stand in for"); + Require(!HostImportCovers(importing, mirrored, mirroredBytes) && MirrorCounters().heapMirrors == before.heapMirrors + 1, "the write-watched range whose import yielded is not mirrored"); + const auto ranges = leased.AddressRanges(); + const auto found = std::find_if(ranges.begin(), ranges.end(), [&](const auto& range) { return range.begin == mirrored; }); + Require(found != ranges.end() && found->deviceAddress != 0u, "the write-watched range is missing from the BDA table"); + Require(access.addressBytes(found->deviceAddress)[mirroredBytes / 2 + 3] == std::byte{0x5a}, "the mirror of the write-watched range does not hold the guest bytes"); + leased.WriteBack(); + } + SetHostImportBudget(0); + { + auto* mutation = GuestAllocations::GuestAllocationsBegin_nid_postfix(); + for (const auto& piece : pieces) GuestAllocations::GuestAllocationsRemove_nid_postfix(mutation, piece.pointer); + GuestAllocations::GuestAllocationsEnd_nid_postfix(mutation); + } + ClearImageMirrors(importing.device); + ClearHostImports(importing.device); + ClearSnapshotCopies(importing.device); +#ifndef _WIN32 + GuestWriteWatch::GuestWriteWatchUnregister_nid_postfix(pieces[1].pointer, mirroredBytes); +#endif + for (const auto& piece : pieces) { +#ifdef _WIN32 + GuestArena::GuestArenaReset_nid_postfix(piece.pointer, piece.allocated); + GuestArena::GuestArenaRelease_nid_postfix(piece.pointer, piece.allocated); +#else + munmap(piece.mapping, piece.allocated + block); +#endif + } + std::cout << "an address-based build past the copy cap takes a range only an import serves from a recently used import a mirror stands in for\n"; +} + +void RunUnwatchedMirrorImportTests(const Context& context, const BdaTestAccess& access, int frames) { + constexpr std::size_t block = 65536; + constexpr std::size_t rangeBytes = 16 * block; +#ifdef _WIN32 + if (!GuestArena::GuestArenaAvailable_nid_postfix() || !GuestArena::GuestArenaWriteWatched_nid_postfix()) { + std::cout << "guest arena unavailable or not write-watched: imports of heaps whose mirror left the write watch not tested\n"; + return; + } +#else + if (!GuestWriteWatch::GuestWriteWatchAvailable_nid_postfix()) { + std::cout << "write watch unavailable: imports of heaps whose mirror left the write watch not tested\n"; + return; + } +#endif + struct Piece { + void* pointer = nullptr; + void* mapping = nullptr; + std::size_t allocated = rangeBytes + block; + }; + std::array pieces{}; + for (auto& piece : pieces) { +#ifdef _WIN32 + piece.pointer = GuestArena::GuestArenaAllocate_nid_postfix(piece.allocated, block); + Require(piece.pointer != nullptr, "cannot allocate the mirrored heap ranges in the guest arena"); + GuestArena::GuestArenaCommit_nid_postfix(piece.pointer, piece.allocated, PAGE_READWRITE, piece.allocated); + piece.mapping = piece.pointer; +#else + piece.mapping = mmap(nullptr, piece.allocated + block, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + Require(piece.mapping != MAP_FAILED, "cannot map the mirrored heap ranges"); + piece.pointer = reinterpret_cast((reinterpret_cast(piece.mapping) + block - 1) & ~std::uintptr_t{block - 1}); +#endif + std::memset(piece.pointer, 0x5a, piece.allocated); +#ifndef _WIN32 + GuestWriteWatch::GuestWriteWatchRegister_nid_postfix(piece.pointer, rangeBytes); +#endif + } + const auto leaving = reinterpret_cast(pieces[0].pointer); + const auto staying = reinterpret_cast(pieces[1].pointer); + { + auto* mutation = GuestAllocations::GuestAllocationsBegin_nid_postfix(); + for (const auto& piece : pieces) GuestAllocations::GuestAllocationsAdd_nid_postfix(mutation, piece.pointer, rangeBytes, true, false, true); + GuestAllocations::GuestAllocationsEnd_nid_postfix(mutation); + } + Require(AgcDriver::GuestMemory::Watched(leaving, rangeBytes) && AgcDriver::GuestMemory::Watched(staying, rangeBytes), "the heap ranges are not write-watched"); + auto importing = context; + importing.hostImportAlignment = block; + SetHostImportBudget(rangeBytes + block); + for (int frame = 0; frame < frames; ++frame) NoteHostImportFrame(); + for (int use = 0; use < 300; ++use) Require(HostImportFor(importing, staying, 64) != nullptr, "the staying range was not imported"); + const auto build = [&](const char* what) { + GuestBufferMemory leased(importing); + leased.AcquireRegistered(); + leased.Upload(true); + const auto ranges = leased.AddressRanges(); + for (const auto address : {leaving, staying}) { + const auto found = std::find_if(ranges.begin(), ranges.end(), [&](const auto& range) { return range.begin == address; }); + Require(found != ranges.end() && found->deviceAddress != 0u, std::string("a heap range is missing from the BDA table ") + what); + Require(HostImportCovers(importing, address, rangeBytes) || access.addressBytes(found->deviceAddress)[rangeBytes / 2 + 3] == std::byte{0x5a}, std::string("the mirror of a heap range does not hold its guest bytes ") + what); + } + leased.WriteBack(); + }; + build("before the write watch left"); + Require(!HostImportCovers(importing, leaving, rangeBytes) && HostImportCovers(importing, staying, rangeBytes), "the first build did not mirror the heap the budget refused beside the imported one"); + AgcDriver::GuestMemory::Unwatch(leaving, rangeBytes); + Require(!AgcDriver::GuestMemory::Watched(leaving, rangeBytes), "the mirrored heap did not leave the write watch"); + build("after the write watch left"); + Require(HostImportCovers(importing, leaving, rangeBytes), "a heap whose mirror left the write watch was not imported in place of an import a mirror can replace"); + Require(!HostImportCovers(importing, staying, rangeBytes), "the write-watched heap kept its import beside the heap that left the write watch"); + SetHostImportBudget(0); + { + auto* mutation = GuestAllocations::GuestAllocationsBegin_nid_postfix(); + for (const auto& piece : pieces) GuestAllocations::GuestAllocationsRemove_nid_postfix(mutation, piece.pointer); + GuestAllocations::GuestAllocationsEnd_nid_postfix(mutation); + } + ClearImageMirrors(importing.device); + ClearHostImports(importing.device); + ClearSnapshotCopies(importing.device); +#ifndef _WIN32 + GuestWriteWatch::GuestWriteWatchUnregister_nid_postfix(pieces[1].pointer, rangeBytes); +#endif + for (const auto& piece : pieces) { +#ifdef _WIN32 + GuestArena::GuestArenaReset_nid_postfix(piece.pointer, piece.allocated); + GuestArena::GuestArenaRelease_nid_postfix(piece.pointer, piece.allocated); +#else + munmap(piece.mapping, piece.allocated + block); +#endif + } + std::cout << "a heap whose mirror left the write watch is imported in place of an import a mirror can replace\n"; +} + void hostWriteWatchExclusionTests() { #ifdef _WIN32 std::vector host(64, 0x31); diff --git a/core/libs/prx/libSceAgcDriver/tests/BdaTests.hpp b/core/libs/prx/libSceAgcDriver/tests/BdaTests.hpp index 3ea90d15c663..08ac6006e927 100644 --- a/core/libs/prx/libSceAgcDriver/tests/BdaTests.hpp +++ b/core/libs/prx/libSceAgcDriver/tests/BdaTests.hpp @@ -22,6 +22,8 @@ void RunSparseHeapMirrorUnwatchTests(const AgcDriver::Graphics::Context& context void RunSparseHeapMirrorBudgetTests(const AgcDriver::Graphics::Context& context, const BdaTestAccess& access); void RunHeapMirrorRunUnwatchTests(const AgcDriver::Graphics::Context& context, const BdaTestAccess& access); void RunAddressCopyCapTests(const AgcDriver::Graphics::Context& context, const BdaTestAccess& access, bool remembered, int frames); +void RunAddressCopyCapMirrorTests(const AgcDriver::Graphics::Context& context, const BdaTestAccess& access, int frames); +void RunUnwatchedMirrorImportTests(const AgcDriver::Graphics::Context& context, const BdaTestAccess& access, int frames); void RunGuestAllocationTests(); void RunGuestLeaseWaitTests(); void RunUnmappedGapTests(); diff --git a/core/libs/prx/libSceAgcDriver/tests/CompileBudget.cpp b/core/libs/prx/libSceAgcDriver/tests/CompileBudget.cpp new file mode 100644 index 000000000000..f8abc3d7b1c5 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/CompileBudget.cpp @@ -0,0 +1,112 @@ +#include "prx/libSceAgcDriver/Execution/include/CompileBudget.hpp" +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +using namespace std::chrono_literals; +using AgcDriver::BackgroundCompileLimitFor; +using AgcDriver::CompileBudget; + +void Require(bool condition, const std::string& message) { + if (!condition) throw std::runtime_error(message); +} + +void CheckLimitPolicy() { + Require(BackgroundCompileLimitFor(nullptr) == 8192u * 1024u, "an unset APS5_BACKGROUND_COMPILE_KIB is not 8 MiB"); + Require(BackgroundCompileLimitFor("16") == 16u * 1024u, "APS5_BACKGROUND_COMPILE_KIB=16 is not 16 KiB"); + Require(BackgroundCompileLimitFor("0") == 0u, "APS5_BACKGROUND_COMPILE_KIB=0 leaves room"); +} + +std::uint64_t MostHeldAtOnce(CompileBudget& budget, const std::vector& sizes) { + std::atomic held{0}; + std::atomic most{0}; + std::vector threads; + for (const auto bytes : sizes) { + threads.emplace_back([&, bytes] { + const CompileBudget::Hold hold(budget, bytes); + const auto now = held.fetch_add(bytes) + bytes; + auto seen = most.load(); + while (seen < now && !most.compare_exchange_weak(seen, now)) {} + std::this_thread::sleep_for(20ms); + held.fetch_sub(bytes); + }); + } + for (auto& thread : threads) thread.join(); + return most.load(); +} + +void CheckSharedLimit() { + CompileBudget budget(100); + const auto most = MostHeldAtOnce(budget, std::vector(8, 40)); + Require(most <= 80, "eight 40-byte holds under a 100-byte budget held " + std::to_string(most) + " bytes at once"); + Require(budget.Peak() >= 40 && budget.Peak() <= 80, "eight 40-byte holds under a 100-byte budget peaked at " + std::to_string(budget.Peak()) + " bytes"); +} + +void CheckZeroLimitRunsOneAtATime() { + CompileBudget budget(0); + const auto most = MostHeldAtOnce(budget, std::vector(6, 1)); + Require(most == 1 && budget.Peak() == 1, "a zero budget let " + std::to_string(most) + " one-byte holds run at once"); +} + +void CheckLargerHoldRunsAlone() { + CompileBudget budget(100); + const auto most = MostHeldAtOnce(budget, {500, 10, 10, 10}); + Require(most == 500 && budget.Peak() == 500, "a 500-byte hold under a 100-byte budget did not run alone: " + std::to_string(most) + " bytes were held at once"); +} + +void CheckWaitingLargerHoldKeepsNewHoldsOut() { + CompileBudget budget(100); + std::atomic firstHeld{false}; + std::atomic releaseFirst{false}; + std::atomic entries{0}; + std::atomic largeEntry{-1}; + std::atomic smallEntry{-1}; + std::thread first([&] { + const CompileBudget::Hold hold(budget, 40); + firstHeld = true; + while (!releaseFirst) std::this_thread::sleep_for(1ms); + }); + while (!firstHeld) std::this_thread::sleep_for(1ms); + std::thread large([&] { + const CompileBudget::Hold hold(budget, 500); + largeEntry = entries++; + std::this_thread::sleep_for(10ms); + }); + while (budget.WaitingAlone() == 0) std::this_thread::sleep_for(1ms); + std::thread small([&] { + const CompileBudget::Hold hold(budget, 40); + smallEntry = entries++; + }); + std::this_thread::sleep_for(20ms); + const bool enteredEarly = smallEntry != -1; + releaseFirst = true; + first.join(); + large.join(); + small.join(); + Require(!enteredEarly, "a 40-byte hold that fits entered while a 500-byte hold was waiting to run alone"); + Require(largeEntry == 0 && smallEntry == 1, "the waiting 500-byte hold did not run before the 40-byte hold that came after it"); +} + +} + +int main() { + try { + CheckLimitPolicy(); + CheckSharedLimit(); + CheckZeroLimitRunsOneAtATime(); + CheckLargerHoldRunsAlone(); + CheckWaitingLargerHoldKeepsNewHoldsOut(); + std::cout << "compile budget tests passed\n"; + return 0; + } catch (const std::exception& error) { + std::cerr << error.what() << '\n'; + return 1; + } +} diff --git a/core/libs/prx/libSceAgcDriver/tests/ControlFlow.cpp b/core/libs/prx/libSceAgcDriver/tests/ControlFlow.cpp index b59161ab494d..c35f27d7437e 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 @@ int main(int argc, char** argv) { } } try { + verifyPredecessorRebuild(); verifyNullSwappc(); verifyScheduledJumpTable(); VerifyUserDataTail(); diff --git a/core/libs/prx/libSceAgcDriver/tests/DeviceMemoryFallback.cpp b/core/libs/prx/libSceAgcDriver/tests/DeviceMemoryFallback.cpp index a5ff02af5d70..02d00ffcdf18 100644 --- a/core/libs/prx/libSceAgcDriver/tests/DeviceMemoryFallback.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/DeviceMemoryFallback.cpp @@ -53,6 +53,41 @@ void Choose(const char* what, bool budgetExtension, std::uint64_t budget, std::u Expect(type == expected, std::string(what) + ": chose memory type " + std::to_string(type) + ", expected " + std::to_string(expected)); } +VkDeviceSize reclaimAsked = 0; +VkDeviceSize reclaimReturns = 0; +VkDeviceSize reclaimUsageAfter = 0; +bool reclaimNewImage = false; + +VkDeviceSize mockReclaim(VkDeviceSize bytes, bool newImage) { + reclaimAsked = bytes; + reclaimNewImage = newImage; + reportedUsage = reclaimUsageAfter; + return reclaimReturns; +} + +void ReclaimTests() { + const std::uint32_t both = (1u << HostType) | (1u << DeviceType); + Context context = mockContext(true); + context.cacheReclaim = mockReclaim; + const auto choose = [&](const char* what, std::uint64_t budget, std::uint64_t usage, VkDeviceSize returns, std::uint64_t usageAfter, std::uint32_t expected, VkDeviceSize asked) { + reportedBudget = budget; + reportedUsage = usage; + reclaimAsked = 0; + reclaimReturns = returns; + reclaimUsageAfter = usageAfter; + const auto type = context.DeviceMemoryType(both, 64 * MiB, "test"); + Expect(type == expected, std::string(what) + ": chose memory type " + std::to_string(type) + ", expected " + std::to_string(expected)); + Expect(reclaimAsked == asked, std::string(what) + ": asked the caches for " + std::to_string(reclaimAsked) + " bytes, expected " + std::to_string(asked)); + }; + choose("room in the budget leaves the caches alone", 3000 * MiB, 2000 * MiB, 0, 2000 * MiB, DeviceType, 0); + choose("caches release the whole allocation", 3000 * MiB, 2937 * MiB, 64 * MiB, 2937 * MiB, DeviceType, 64 * MiB); + Expect(reclaimNewImage, "the budget reclaim did not ask for a new image's room"); + choose("caches release the allocation and the overage", 2952 * MiB, 3633 * MiB, 745 * MiB, 3633 * MiB, DeviceType, 745 * MiB); + choose("a partial release that the budget then shows", 3000 * MiB, 2990 * MiB, 32 * MiB, 2900 * MiB, DeviceType, 64 * MiB); + choose("a partial release the budget does not show", 3000 * MiB, 2990 * MiB, 32 * MiB, 2990 * MiB, HostType, 64 * MiB); + choose("caches release nothing", 3000 * MiB, 2990 * MiB, 0, 2990 * MiB, HostType, 64 * MiB); +} + void RefusedFallbackTests() { const auto context = mockContext(true); const std::uint32_t both = (1u << HostType) | (1u << DeviceType); @@ -117,6 +152,7 @@ int main() { Choose("no host type allowed", true, 3000 * MiB, 3000 * MiB, 1u << DeviceType, DeviceType); BufferPlacementTests(); RefusedFallbackTests(); + ReclaimTests(); } catch (const std::exception& error) { std::fprintf(stderr, "FAIL: %s\n", error.what()); return 1; diff --git a/core/libs/prx/libSceAgcDriver/tests/DrawPipelineProfile.cpp b/core/libs/prx/libSceAgcDriver/tests/DrawPipelineProfile.cpp new file mode 100644 index 000000000000..bd688ddc104d --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/DrawPipelineProfile.cpp @@ -0,0 +1,124 @@ +#include "prx/libSceAgcDriver/Execution/include/Driver/Draw/DrawPipeline.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#else +#include +#endif + +namespace { + +void Check(bool condition, const char* message) { + if (!condition) throw std::runtime_error(message); +} + +class StderrCapture { +public: + StderrCapture() : path(std::filesystem::temp_directory_path() / ("aps5_pipeline_profile_" + std::to_string(std::chrono::steady_clock::now().time_since_epoch().count()) + ".txt")) { + std::fflush(stderr); +#ifdef _WIN32 + saved = _dup(_fileno(stderr)); + Check(saved >= 0, "cannot save stderr"); + Check(_wfreopen(path.wstring().c_str(), L"wb", stderr) != nullptr, "cannot redirect stderr"); +#else + saved = dup(fileno(stderr)); + Check(saved >= 0, "cannot save stderr"); + Check(std::freopen(path.c_str(), "wb", stderr) != nullptr, "cannot redirect stderr"); +#endif + } + + ~StderrCapture() { + std::fflush(stderr); +#ifdef _WIN32 + _dup2(saved, _fileno(stderr)); + _close(saved); +#else + dup2(saved, fileno(stderr)); + close(saved); +#endif + std::error_code error; + std::filesystem::remove(path, error); + } + + StderrCapture(const StderrCapture&) = delete; + StderrCapture& operator=(const StderrCapture&) = delete; + + std::string ReadReport() const { + const auto deadline = std::chrono::steady_clock::now() + std::chrono::seconds(2); + do { + std::ifstream file(path, std::ios::binary); + const std::string text{std::istreambuf_iterator(file), std::istreambuf_iterator()}; + const auto begin = text.find("[draw] pipelined "); + if (begin != std::string::npos) { + const auto end = text.find('\n', begin); + if (end != std::string::npos) return text.substr(begin, end - begin); + } + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + } while (std::chrono::steady_clock::now() < deadline); + throw std::runtime_error("pipeline profile report was not written"); + } + +private: + std::filesystem::path path; + int saved = -1; +}; + +std::size_t Count(std::string_view text, std::string_view value) { + std::size_t count = 0; + for (std::size_t offset = 0; (offset = text.find(value, offset)) != std::string_view::npos; offset += value.size()) ++count; + return count; +} + +void TestReport() { + using AgcDriver::DriverDetail::DrawPipeline; + auto& pipeline = DrawPipeline::Queue0(); + Check(DrawPipeline::Depth() >= 2, "test requires at least two pipeline slots"); + const auto reportAfter = std::chrono::steady_clock::now() + std::chrono::milliseconds(10100); + StderrCapture capture; + std::binary_semaphore release{0}; + std::exception_ptr failure; + try { + pipeline.Enqueue([&] { release.acquire(); }, {}, 0, {}, {{0x1000, 0x1010}, {0x2000, 0x2010}}, true); + Check(DrawPipeline::HeldReads(0x1000, 4), "queued read range was not held"); + for (unsigned i = 0; i < 3; ++i) pipeline.NoteDecodeDrain(); + std::this_thread::sleep_until(reportAfter); + pipeline.Enqueue([] {}, {}, 0, {}, {}, true); + } catch (...) { + failure = std::current_exception(); + } + release.release(); + pipeline.Stop(); + if (failure) std::rethrow_exception(failure); + const auto report = capture.ReadReport(); + std::cout << report << '\n'; + Check(report.find(" 2 read ranges, 1 stores held, 3 decode drains") != std::string::npos, "pipeline read counters changed"); + Check(Count(report, " read ranges") == 1, "pipeline read-range counters were printed more than once"); + Check(Count(report, " stores held") == 1, "pipeline held-store counters were printed more than once"); + Check(Count(report, " decode drains") == 1, "pipeline decode-drain counters were printed more than once"); + Check(report.find("; drains:") != std::string::npos, "pipeline drain counters were lost"); + Check(report.find("packet drains by opcode:") != std::string::npos, "pipeline opcode counters were lost"); +} + +} + +int main() { + try { + TestReport(); + std::cout << "Draw pipeline profile passed\n"; + return 0; + } catch (const std::exception& error) { + std::cerr << error.what() << '\n'; + return 1; + } +} diff --git a/core/libs/prx/libSceAgcDriver/tests/FrameDumpIo.cpp b/core/libs/prx/libSceAgcDriver/tests/FrameDumpIo.cpp index f6b12a62e60d..a32430080e4d 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 5c9c74f422af..84960a4d2550 100644 --- a/core/libs/prx/libSceAgcDriver/tests/Graphics.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/Graphics.cpp @@ -1835,7 +1835,7 @@ void UnclampedNormalizedColorTests() { queue.context[0x1e0] = blending; state = DecodeState(queue); Require(state.colors.at(0).partialWriteMask == AgcDriver::Graphics::UnclampedBlendMask && state.blends.at(0).blendEnable && state.blends.at(0).colorWriteMask != 0, "an 8_8 UNORM target that blends with BLEND_CLAMP clear (CB_COLOR_INFO 0x0000000c, CB_BLEND0_CONTROL 0x40000504) was not routed to the pixel shader"); - const auto merge = AgcDriver::Graphics::ExportTargetMerge(state); + const auto merge = AgcDriver::Graphics::ExportTargetMerges(state).at(0); Require(merge.blend.enabled && !merge.blend.snorm && merge.mask == AgcDriver::Graphics::UnclampedBlendMask && merge.samples == 1u && merge.blend.colorSource == VK_BLEND_FACTOR_SRC_ALPHA && merge.blend.colorDestination == VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA && merge.blend.colorOperation == VK_BLEND_OP_ADD && merge.blend.writeMask == state.blends.at(0).colorWriteMask, "the unclamped blend of an 8_8 UNORM target was not described to the pixel shader"); queue.context[0x31c] |= 0x10000u; state = DecodeState(queue); @@ -1844,7 +1844,7 @@ void UnclampedNormalizedColorTests() { Require(DecodeState(queue).colors.at(0).format == VK_FORMAT_R8G8_SNORM, "an unclamped SNORM target that does not blend was refused"); queue.context[0x1e0] = blending; state = DecodeState(queue); - Require(state.colors.at(0).partialWriteMask == AgcDriver::Graphics::UnclampedBlendMask && AgcDriver::Graphics::ExportTargetMerge(state).blend.snorm, "an unclamped SNORM target that blends was not routed to the pixel shader as signed"); + Require(state.colors.at(0).partialWriteMask == AgcDriver::Graphics::UnclampedBlendMask && AgcDriver::Graphics::ExportTargetMerges(state).at(0).blend.snorm, "an unclamped SNORM target that blends was not routed to the pixel shader as signed"); auto unsignedMasked = target(0x0000000cu); unsignedMasked.context[0x1e0] = blending; unsignedMasked.context[0x8e] = 0x1u; @@ -1859,6 +1859,41 @@ void UnclampedNormalizedColorTests() { queue.context[0x1e0] = blending; state = DecodeState(queue); Require(state.colors.at(0).format == VK_FORMAT_R16_SFLOAT && state.blends.at(0).blendEnable, "a 16 float target, which keeps BLEND_CLAMP clear, stopped blending"); + const auto pair = [&](std::uint32_t second) { + auto both = target(0x0000000cu); + for (const auto offset : {0x31bu, 0x31cu, 0x31du}) both.context[offset + 0xfu] = both.context.at(offset); + for (const auto offset : {0x3b0u, 0x3b8u}) both.context[offset + 1u] = both.context.at(offset); + const auto address = reinterpret_cast(sliceMemory.data()); + both.context[0x327] = static_cast(address >> 8u); + both.context[0x391] = static_cast(address >> 40u); + both.context[0x31c + 0xfu] = second; + both.context[0x8e] = 0xffu; + both.context[0x8f] = 0xffu; + both.context[0x1c5] = 0x99u; + both.context[0x1e0] = both.context[0x1e1] = 0x40010504u; + return both; + }; + state = DecodeState(pair(0x0000000cu)); + const auto merges = AgcDriver::Graphics::ExportTargetMerges(state); + Require(state.colors.size() == 2u && merges.size() == 2u && merges[0].target == 0u && merges[1].target == 1u && merges[0].descriptor != merges[1].descriptor && std::ranges::all_of(merges, [](const ShaderRecompiler::TargetMerge& merge) { return merge.mask == AgcDriver::Graphics::UnclampedBlendMask && merge.blend.enabled && merge.blend.colorSource == VK_BLEND_FACTOR_SRC_ALPHA && merge.blend.colorDestination == VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA && merge.blend.colorOperation == VK_BLEND_OP_ADD && merge.blend.alphaSource == VK_BLEND_FACTOR_SRC_ALPHA && merge.blend.alphaDestination == VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA && merge.blend.alphaOperation == VK_BLEND_OP_ADD; }), "two 8_8 UNORM targets that blend with BLEND_CLAMP clear in one draw (CB_COLOR_INFO 0x0000000c, CB_BLEND0_CONTROL and CB_BLEND1_CONTROL 0x40010504, PPSA26344) did not each merge into their own target"); + auto additive = pair(0x0000000cu); + additive.context[0x1e1] = (1u << 30u) | 1u | (1u << 8u); + const auto separate = AgcDriver::Graphics::ExportTargetMerges(DecodeState(additive)); + Require(separate.size() == 2u && separate[0].blend.colorDestination == VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA && separate[1].blend.colorSource == VK_BLEND_FACTOR_ONE && separate[1].blend.colorDestination == VK_BLEND_FACTOR_ONE, "two unclamped targets of one draw did not each keep their own CB_BLENDn_CONTROL"); + auto shared = pair(0x0000000cu); + shared.context[0x327] = shared.context.at(0x318); + shared.context[0x391] = shared.context.at(0x390); + expectFailure([&] { static_cast(AgcDriver::Graphics::ExportTargetMerges(DecodeState(shared))); }, "two merged color targets of one draw share memory"); + const auto packed = (0x28028u & ~((0x1fu << 2u) | (7u << 8u) | (3u << 11u))) | (19u << 2u) | (2u << 11u); + auto packedSecond = pair(packed); + packedSecond.context[0x8e] = 0x1fu; + packedSecond.context[0x1e1] = 0; + expectFailure([&] { DecodeState(packedSecond); }, "partial writes of a packed color target merge into their target alone"); + auto packedFirst = pair(0x0000000cu); + packedFirst.context[0x31c] = packed; + packedFirst.context[0x8e] = 0xf1u; + packedFirst.context[0x1e0] = 0; + expectFailure([&] { DecodeState(packedFirst); }, "blending unclamped normalized color cannot join a partial write of a packed color target in one draw"); } void OpaqueDestinationAlphaTests() { @@ -2750,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}; @@ -5062,6 +5139,18 @@ void TwoSampleDitheredAlphaToCoverageTests() { } expectFailure([&] { AgcDriver::Graphics::DecodeState(dithered); }, "DB_EQAA"); Require(AgcDriver::Graphics::DrawRejection(dithered, false).find("DB_EQAA") != std::string::npos, "the precheck accepted DB_ALPHA_TO_MASK 0xe701 with eight samples"); + auto singleSample = makeState(); + singleSample.context[0x1b3] = 2; + singleSample.context[0x1b4] = 2; + singleSample.context[0x2dc] = 0xe701; + singleSample.context[0x2f8] = 0; + singleSample.context[0x292] = 2; + singleSample.context[0x203] &= ~0x800u; + expectFailure([&] { AgcDriver::Graphics::DecodeState(singleSample); }, "requires two matched raster/DB_EQAA samples"); + Require(AgcDriver::Graphics::DrawRejection(singleSample, false).find("requires two matched raster/DB_EQAA samples") != std::string::npos, "the precheck accepted DB_ALPHA_TO_MASK 0xe701 on a single-sample target"); + singleSample.context[0x2dc] = 0x18701; + expectFailure([&] { AgcDriver::Graphics::DecodeState(singleSample); }, "requires eight matched raster/DB_EQAA samples"); + Require(AgcDriver::Graphics::DrawRejection(singleSample, false).find("requires eight matched raster/DB_EQAA samples") != std::string::npos, "the precheck accepted DB_ALPHA_TO_MASK 0x18701 on a single-sample target"); } void AlphaToCoverageTests() { @@ -6233,7 +6322,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); } @@ -7502,6 +7599,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; @@ -7707,6 +7805,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"; @@ -7736,10 +7835,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) { @@ -8677,6 +8780,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}); @@ -10494,14 +10614,14 @@ void unorm4_4_4_4TargetTests() { Require(state.color.format == VK_FORMAT_R16_UINT && state.color.elementBytes == 2 && state.color.componentMapping == 0x1bu && state.color.packing == ColorExportPacking::Unorm4_4_4_4, "a 4_4_4_4 unorm target did not decode to an R16_UINT attachment with reversed exports"); const auto packings = AgcDriver::Graphics::ExportPackings(state); Require(packings[0] == ColorExportPacking::Unorm4_4_4_4 && std::all_of(packings.begin() + 1, packings.end(), [](ColorExportPacking packing) { return packing == ColorExportPacking::None; }), "export 0 did not carry the 4_4_4_4 unorm packing"); - Require(state.color.partialWriteMask == 0u && state.blends[0].colorWriteMask == 0xfu && AgcDriver::Graphics::ExportTargetMerge(state).mask == 0u, "a full write of a 4_4_4_4 unorm target merged into the target"); + Require(state.color.partialWriteMask == 0u && state.blends[0].colorWriteMask == 0xfu && AgcDriver::Graphics::ExportTargetMerges(state).empty(), "a full write of a 4_4_4_4 unorm target merged into the target"); auto changed = queue; for (const auto& [targetMask, wordMask] : {std::pair{1u, 0xf000u}, std::pair{7u, 0xfff0u}, std::pair{8u, 0x000fu}, std::pair{0xau, 0x0f0fu}}) { changed.context[0x8e] = targetMask; Require(AgcDriver::Graphics::DrawRejection(changed, false).empty(), "the draw precheck refused CB_TARGET_MASK " + std::to_string(targetMask) + " of a 4_4_4_4 unorm target"); const auto partial = AgcDriver::Graphics::DecodeState(changed); Require(partial.color.partialWriteMask == wordMask && partial.colors.front().partialWriteMask == wordMask && partial.blends[0].colorWriteMask == 0u && partial.blend.colorWriteMask == 0u, "CB_TARGET_MASK " + std::to_string(targetMask) + " of a 4_4_4_4 unorm target did not merge its nibbles behind a closed write mask"); - const auto merge = AgcDriver::Graphics::ExportTargetMerge(partial); + const auto merge = AgcDriver::Graphics::ExportTargetMerges(partial).at(0); const auto expected = AgcDriver::Graphics::SurfaceForTarget(partial.color); const auto surface = AgcDriver::Graphics::DecodeTextureResource(merge.descriptor); Require(merge.target == 0u && merge.mask == wordMask && merge.samples == 1u && !merge.depthStencilWrites && surface.baseAddress == expected.baseAddress && surface.pipeBankXor == expected.pipeBankXor && surface.width == expected.width && surface.height == expected.height && surface.format == expected.format && surface.tileMode == expected.tileMode && surface.dimension == AgcDriver::Graphics::TextureDimension::k2D && surface.mipCount == 1u && surface.samples == 1u, "the merge descriptor of CB_TARGET_MASK " + std::to_string(targetMask) + " does not decode to the target's surface"); @@ -10535,7 +10655,7 @@ void unorm4_4_4_4TargetTests() { const auto what = "DB_DEPTH_CONTROL " + std::to_string(control) + " with stencil operations " + std::to_string(ops) + " and masks " + std::to_string(masks); Require(AgcDriver::Graphics::DrawRejection(depthQueue, false).empty(), "the draw precheck refused a partial 4_4_4_4 write under " + what); const auto partial = AgcDriver::Graphics::DecodeState(depthQueue); - const auto merge = AgcDriver::Graphics::ExportTargetMerge(partial); + const auto merge = AgcDriver::Graphics::ExportTargetMerges(partial).at(0); Require(partial.depth.has_value() == ((control & 0xbu) != 0u) && partial.depthBoundsTest == ((control & 8u) != 0u) && merge.mask == 0xf000u && AgcDriver::Graphics::DepthStencilWrites(partial) == writes && merge.depthStencilWrites == writes && merge.depthStencilTests == ((control & 0xbu) != 0u), "a partial 4_4_4_4 write under " + what + (writes ? " did not report" : " reported") + " depth or stencil writes"); } auto truncated = depthQueue; @@ -10575,16 +10695,16 @@ void unorm4_4_4_4TargetTests() { Require(killState.pixelKill && !killState.pixelEarlyZ && !earlyState.pixelKill && earlyState.pixelEarlyZ, "DB_SHADER_CONTROL.KILL_ENABLE of a 4_4_4_4 merge did not decode as a kill under late tests"); constexpr std::array mergeCode{0xf800180fu, 0x07060504u, 0xbf810000u}; auto merging = packedExportRequest(changed, partial, mergeCode); - merging.context.pixel->targetMerge = AgcDriver::Graphics::ExportTargetMerge(partial); + merging.context.pixel->targetMerges = AgcDriver::Graphics::ExportTargetMerges(partial); const std::array capabilities{spv::CapabilityShader, spv::CapabilityFragmentShaderPixelInterlockEXT, spv::CapabilityStorageImageReadWithoutFormat}; merging.target.supportedCapabilities = capabilities; merging.target.registrationWordLimit = 1u << 20u; const ShaderRecompiler::RequestSerializer mergeSerializer; - Require(mergeSerializer.Deserialize(mergeSerializer.Serialize(merging)).request.context.pixel->targetMerge == merging.context.pixel->targetMerge, "the 4_4_4_4 target merge was lost in serialization"); + Require(mergeSerializer.Deserialize(mergeSerializer.Serialize(merging)).request.context.pixel->targetMerges == merging.context.pixel->targetMerges, "the 4_4_4_4 target merge was lost in serialization"); auto unmerged = merging; - unmerged.context.pixel->targetMerge = {}; + unmerged.context.pixel->targetMerges = {}; auto moved = merging; - moved.context.pixel->targetMerge.descriptor[0] += 0x100u; + moved.context.pixel->targetMerges.at(0).descriptor[0] += 0x100u; std::vector mergedKey, unmergedKey, movedKey; ShaderRecompiler::RecompileCacheKey::BuildInterface(merging, mergedKey); ShaderRecompiler::RecompileCacheKey::BuildInterface(unmerged, unmergedKey); @@ -10605,7 +10725,7 @@ void unorm4_4_4_4TargetTests() { const auto bound = std::ranges::any_of(merged.bindings, [&](const ShaderRecompiler::DescriptorBinding& binding) { if (binding.role != ShaderRecompiler::DescriptorRole::GuestImages || binding.kind != ShaderRecompiler::DescriptorKind::StorageImage) return false; for (std::size_t offset = 0; offset + 8u <= binding.guestDescriptor.size(); offset += 8u) { - if (std::equal(merging.context.pixel->targetMerge.descriptor.begin(), merging.context.pixel->targetMerge.descriptor.end(), binding.guestDescriptor.begin() + static_cast(offset))) return true; + if (std::equal(merging.context.pixel->targetMerges.at(0).descriptor.begin(), merging.context.pixel->targetMerges.at(0).descriptor.end(), binding.guestDescriptor.begin() + static_cast(offset))) return true; } return false; }); @@ -10637,7 +10757,7 @@ void unorm4_4_4_4TargetTests() { } Require(reads == 1u && writes == 1u && interlockShape(words) == "capability extension ordered begin end " && declaresEarlyFragmentTests(killing), "a killing 4_4_4_4 merge module under late tests of a draw without depth or stencil writes did not merge inside a pixel interlock after early tests"); } - killing.context.pixel->targetMerge.depthStencilWrites = true; + killing.context.pixel->targetMerges.at(0).depthStencilWrites = true; expectFailure([&] { static_cast(ShaderRecompiler::Recompile(killing)); }, "kills pixels under late tests of a draw writing depth or stencil"); auto earlyKilling = killing; earlyKilling.context.pixel->earlyZ = true; @@ -10650,7 +10770,7 @@ void unorm4_4_4_4TargetTests() { constexpr std::array countingCode{0x7e000281u, 0xe0c80000u, 0x80000000u, 0xf800180fu, 0x07060504u, 0xbf810000u}; auto counting = packedExportRequest(changed, partial, countingCode); counting.context.userData = counter; - counting.context.pixel->targetMerge = merging.context.pixel->targetMerge; + counting.context.pixel->targetMerges = merging.context.pixel->targetMerges; counting.target = merging.target; counting.target.registrationModules = false; counting.target.bdaAbiVersion = ShaderRecompiler::BdaAbi::Version; @@ -10658,7 +10778,7 @@ void unorm4_4_4_4TargetTests() { counting.target.supportedCapabilities = atomicCapabilities; counting.context.pixel->earlyZ = false; static_cast(ShaderRecompiler::Recompile(counting)); - counting.context.pixel->targetMerge.depthStencilTests = true; + counting.context.pixel->targetMerges.at(0).depthStencilTests = true; expectFailure([&] { static_cast(ShaderRecompiler::Recompile(counting)); }, "writes guest memory (stores, atomics or GDS) under late tests"); counting.context.pixel->earlyZ = true; const auto earlyWords = ShaderRecompiler::Recompile(counting).spirv.Copy(); @@ -10667,7 +10787,7 @@ void unorm4_4_4_4TargetTests() { Require(atomics == 1u && interlockShape(earlyWords) == "capability extension ordered begin end " && declaresEarlyFragmentTests(counting), "a 4_4_4_4 merge whose shader adds to a counter under early tests did not keep its one atomic add beside the merge"); constexpr std::array gdsReadCode{0xbefc03ffu, 0x00000100u, 0x7e000280u, 0xd8da0000u, 0x04000000u, 0xbf8c0000u, 0xf800180fu, 0x07060504u, 0xbf810000u}; auto gdsReading = packedExportRequest(changed, partial, gdsReadCode); - gdsReading.context.pixel->targetMerge = counting.context.pixel->targetMerge; + gdsReading.context.pixel->targetMerges = counting.context.pixel->targetMerges; gdsReading.context.pixel->earlyZ = false; gdsReading.target = counting.target; static_cast(ShaderRecompiler::Recompile(gdsReading)); @@ -10677,7 +10797,7 @@ void unorm4_4_4_4TargetTests() { expectFailure([&] { static_cast(ShaderRecompiler::Recompile(gdsAdding)); }, "writes guest memory (stores, atomics or GDS) under late tests"); auto lateMerge = counting; lateMerge.context.pixel->earlyZ = false; - lateMerge.context.pixel->targetMerge = {}; + lateMerge.context.pixel->targetMerges = {}; static_cast(ShaderRecompiler::Recompile(lateMerge)); } changed = queue; @@ -10722,15 +10842,15 @@ void unorm4_4_4_4TargetTests() { for (const auto& [inputs, position, what] : {InputCase{0x0302u, 0u, "POS_X_FLOAT and POS_Y_FLOAT at the centre"}, InputCase{0x0302u, 0x100000u, "POS_X_FLOAT and POS_Y_FLOAT at the upper-left corner"}, InputCase{0x9022u, 0u, "PERSP_CENTER, LINEAR_CENTER, FRONT_FACE and POS_FIXED_PT"}}) { Require(AgcDriver::Graphics::DecodeState(inputState(rasterized, inputs, position)).perSampleShading, std::string("a partial write of a 2-sample 4_4_4_4 unorm target whose pixel-rate shader reads ") + what + " was refused"); } - const auto merge = AgcDriver::Graphics::ExportTargetMerge(multisampled); + const auto merge = AgcDriver::Graphics::ExportTargetMerges(multisampled).at(0); const auto surface = AgcDriver::Graphics::DecodeTextureResource(merge.descriptor); Require(merge.samples == 2u && merge.mask == 0xf000u && surface.dimension == AgcDriver::Graphics::TextureDimension::k2DMsaa && surface.samples == 2u && surface.baseAddress == multisampled.color.surfaceAddress && surface.width == multisampled.color.extent.width && surface.height == multisampled.color.extent.height && surface.format == AgcDriver::Graphics::TargetMergeSurface(multisampled.color).format, "the merge descriptor of a 2-sample 4_4_4_4 unorm target does not decode to its multisampled surface"); auto unshaded = multisampled; unshaded.perSampleShading = false; - expectFailure([&] { static_cast(AgcDriver::Graphics::ExportTargetMerge(unshaded)); }, "needs per-sample shading"); + expectFailure([&] { static_cast(AgcDriver::Graphics::ExportTargetMerges(unshaded)); }, "needs per-sample shading"); constexpr std::array mergeCode{0xf800180fu, 0x07060504u, 0xbf810000u}; auto merging = packedExportRequest(changed, multisampled, mergeCode); - merging.context.pixel->targetMerge = merge; + merging.context.pixel->targetMerges = {merge}; const std::array capabilities{spv::CapabilityShader, spv::CapabilityFragmentShaderPixelInterlockEXT, spv::CapabilityStorageImageReadWithoutFormat, spv::CapabilityStorageImageMultisample, spv::CapabilityInterpolationFunction}; merging.target.supportedCapabilities = capabilities; merging.target.fragmentShaderBarycentricEnabled = true; @@ -10755,7 +10875,7 @@ void unorm4_4_4_4TargetTests() { static_cast(ShaderRecompiler::Recompile(centred)); const auto rasterizedState = AgcDriver::Graphics::DecodeState(rasterized); auto offCentre = packedExportRequest(rasterized, rasterizedState, mergeCode); - offCentre.context.pixel->targetMerge = AgcDriver::Graphics::ExportTargetMerge(rasterizedState); + offCentre.context.pixel->targetMerges = AgcDriver::Graphics::ExportTargetMerges(rasterizedState); offCentre.context.pixel->iteratesSamples = rasterizedState.perSampleShading; offCentre.context.pixel->sampleLocations = AgcDriver::Graphics::PixelSampleLocations(rasterizedState, *offCentre.context.pixel); Require(std::ranges::any_of(offCentre.context.pixel->sampleLocations, [](std::uint8_t location) { return location != 0u; }), "a 2-sample rasterizer's merge did not pass its off-centre sample locations"); @@ -10769,7 +10889,7 @@ void unorm4_4_4_4TargetTests() { constexpr std::array countingCode{0x7e000281u, 0xe0c80000u, 0x80000000u, 0xf800180fu, 0x07060504u, 0xbf810000u}; auto counting = packedExportRequest(changed, multisampled, countingCode); counting.context.userData = counter; - counting.context.pixel->targetMerge = merge; + counting.context.pixel->targetMerges = {merge}; counting.context.pixel->iteratesSamples = true; counting.context.pixel->earlyZ = true; counting.target = merging.target; @@ -10778,7 +10898,7 @@ void unorm4_4_4_4TargetTests() { counting.target.supportedCapabilities = atomicCapabilities; expectFailure([&] { static_cast(ShaderRecompiler::Recompile(counting)); }, "each covered sample would repeat its writes"); auto unmergedCounting = counting; - unmergedCounting.context.pixel->targetMerge = {}; + unmergedCounting.context.pixel->targetMerges = {}; static_cast(ShaderRecompiler::Recompile(unmergedCounting)); } for (const auto& [number, swap] : {std::pair{1u, 2u}, std::pair{4u, 2u}, std::pair{0u, 0u}, std::pair{0u, 1u}, std::pair{0u, 3u}}) { @@ -11115,6 +11235,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"); @@ -12649,7 +12779,7 @@ int main(int argc, char** argv) { Require(mock.live == 0, "the heap mirror run unwatch test leaked Vulkan objects"); return 0; } - if (argc == 2 && (std::string_view(argv[1]) == "--address-copy-cap" || std::string_view(argv[1]) == "--address-copy-cap-remembered")) { + if (argc == 2 && (std::string_view(argv[1]) == "--address-copy-cap" || std::string_view(argv[1]) == "--address-copy-cap-remembered" || std::string_view(argv[1]) == "--address-copy-cap-mirror" || std::string_view(argv[1]) == "--unwatched-mirror-import")) { #ifdef _WIN32 _putenv_s("APS5_ADDRESS_COPY_MAX_MIB", "1"); #else @@ -12660,7 +12790,7 @@ int main(int argc, char** argv) { auto context = mockContext(); context.bufferDeviceAddress = true; context.limits.maxStorageBufferRange = 1u << 27; - RunAddressCopyCapTests(context, { + const BdaTestAccess access{ [](VkBuffer buffer) -> std::span { return mockBufferMemory(buffer); }, {}, [](VkDeviceAddress address) { @@ -12670,7 +12800,10 @@ int main(int argc, char** argv) { }, {}, {} - }, std::string_view(argv[1]) == "--address-copy-cap-remembered", frames); + }; + if (std::string_view(argv[1]) == "--address-copy-cap-mirror") RunAddressCopyCapMirrorTests(context, access, frames); + else if (std::string_view(argv[1]) == "--unwatched-mirror-import") RunUnwatchedMirrorImportTests(context, access, frames); + else RunAddressCopyCapTests(context, access, std::string_view(argv[1]) == "--address-copy-cap-remembered", frames); Require(mock.live == 0, "the address copy cap test leaked Vulkan objects"); } return 0; @@ -12816,6 +12949,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 9cd66b426c82..1aa39877148e 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/GuestAllocations.cpp b/core/libs/prx/libSceAgcDriver/tests/GuestAllocations.cpp index 6a1deede07da..fd1412e0fd32 100644 --- a/core/libs/prx/libSceAgcDriver/tests/GuestAllocations.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/GuestAllocations.cpp @@ -30,6 +30,62 @@ void reject(TAction action) { throw std::runtime_error("expected guest allocation ownership rejection"); } +void heapHeaderTests() { + for (const auto [alignment, bytes] : std::array, 4>{{{32, 32}, {256, 32}, {32, 131072}, {32, 0}}}) { + void* pointer = GuestHeap::GuestHeapAlign_nid_postfix(alignment, bytes); + void* neighbor = GuestHeap::GuestHeapAlign_nid_postfix(alignment, bytes); + auto& raw = reinterpret_cast(pointer)[-2]; + auto& blockBytes = reinterpret_cast(pointer)[-1]; + void* savedRaw = raw; + const auto savedBytes = blockBytes; + void* forgedRaw = static_cast(pointer) - 2 * sizeof(void*); + if (forgedRaw == savedRaw) forgedRaw = reinterpret_cast(reinterpret_cast(savedRaw) - sizeof(void*)); + raw = forgedRaw; + reject([&] { GuestHeap::GuestHeapFree_nid_postfix(pointer); }); + reject([&] { GuestHeap::GuestHeapReallocate_nid_postfix(pointer, 64); }); + reject([&] { GuestHeap::GuestHeapRealign_nid_postfix(pointer, 64, 256); }); + reject([&] { GuestHeap::GuestHeapReallocate_nid_postfix(pointer, 0); }); + reject([&] { GuestHeap::GuestHeapRealign_nid_postfix(pointer, 0, alignment); }); + { + const auto lease = GuestAllocations::GuestAllocationsAcquire_nid_postfix(); + Require(lease.size() == (bytes == 0 ? 0u : 2u), "rejected heap operation changed the registered allocations"); + const auto found = std::find_if(lease.begin(), lease.end(), [&](const auto& range) { return range->address == reinterpret_cast(pointer); }); + Require(bytes == 0 || (found != lease.end() && (*found)->bytes == bytes), "rejected free lost the original registered range"); + } + Require(GuestHeap::GuestHeapUsableSize_nid_postfix(pointer) == bytes && GuestHeap::GuestHeapUsableSize_nid_postfix(neighbor) == bytes, "rejected free lost a registered allocation"); + void* next = GuestHeap::GuestHeapAlign_nid_postfix(alignment, bytes); + void* nextRaw = reinterpret_cast(next)[-2]; + const auto nextBytes = reinterpret_cast(next)[-1]; + const auto start = reinterpret_cast(savedRaw); + const auto nextStart = reinterpret_cast(nextRaw); + Require(nextRaw != forgedRaw && (nextStart >= start + savedBytes || start >= nextStart + nextBytes), "same-class allocation received a forged overlapping block"); + GuestHeap::GuestHeapFree_nid_postfix(next); + raw = savedRaw; + for (const auto corruptedBytes : {std::size_t{0}, savedBytes * 2}) { + blockBytes = corruptedBytes; + reject([&] { GuestHeap::GuestHeapFree_nid_postfix(pointer); }); + Require(GuestHeap::GuestHeapUsableSize_nid_postfix(pointer) == bytes, "size corruption removed the allocation"); + } + blockBytes = savedBytes; + raw = reinterpret_cast(neighbor)[-2]; + reject([&] { GuestHeap::GuestHeapFree_nid_postfix(pointer); }); + raw = savedRaw; + GuestHeap::GuestHeapFree_nid_postfix(pointer); + GuestHeap::GuestHeapFree_nid_postfix(neighbor); + Require(GuestAllocations::GuestAllocationsAcquire_nid_postfix().empty(), "restored heap allocations remain registered"); + } + alignas(32) std::array mapping{}; + void* pointer = mapping.data() + 32; + reinterpret_cast(pointer)[-2] = mapping.data(); + reinterpret_cast(pointer)[-1] = mapping.size(); + { + GuestAllocations::Mutation mutation; + mutation.Add(pointer, 32, true, true, false); + } + reject([&] { GuestHeap::GuestHeapFree_nid_postfix(pointer); }); + GuestAllocations::Mutation().Remove(pointer); +} + void leaseSnapshotTests() { std::array memory{}; const auto address = reinterpret_cast(memory.data()); @@ -171,6 +227,7 @@ void RunGuestAllocationTests() { Require(static_cast(pointer)[31] == 0x66, "aligned guest realloc lost data"); GuestHeap::GuestHeapFree_nid_postfix(pointer); Require(GuestAllocations::GuestAllocationsAcquire_nid_postfix().empty(), "freed guest allocations remain registered"); + heapHeaderTests(); std::array mapping{}; { GuestAllocations::Mutation mutation; diff --git a/core/libs/prx/libSceAgcDriver/tests/GuestSamplerResource.cpp b/core/libs/prx/libSceAgcDriver/tests/GuestSamplerResource.cpp index 7f5b21682c69..88a51361de67 100644 --- a/core/libs/prx/libSceAgcDriver/tests/GuestSamplerResource.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/GuestSamplerResource.cpp @@ -450,9 +450,20 @@ void RunGuestSamplerResourceTests() { const auto unnormalizedBiasedResult = DecodeSamplerResource(pack(unnormalizedBiased), true); requireUnnormalized(unnormalizedBiasedResult, "unnormalized S# with primary and secondary LOD bias"); Require(unnormalizedBiasedResult.lodBias == 0.0f, "unnormalized coordinates must zero host lodBias"); - Fields unnormalizedTruncated = unnormalizedBase; - unnormalizedTruncated.truncCoord = true; - rejectUnnormalized(unnormalizedTruncated, "unnormalized coordinates with TRUNC_COORD"); + for (const std::uint32_t filter : {0u, 1u}) { + Fields unnormalizedUntruncated = unnormalizedBase; + unnormalizedUntruncated.xyMagFilter = filter; + unnormalizedUntruncated.xyMinFilter = filter; + Fields unnormalizedTruncated = unnormalizedUntruncated; + unnormalizedTruncated.truncCoord = true; + const auto truncatedResult = DecodeSamplerResource(pack(unnormalizedTruncated), true); + const auto untruncatedResult = DecodeSamplerResource(pack(unnormalizedUntruncated), true); + requireUnnormalized(truncatedResult, "unnormalized S# with TRUNC_COORD"); + Require(truncatedResult.magFilter == untruncatedResult.magFilter && truncatedResult.minFilter == untruncatedResult.minFilter + && truncatedResult.addressModeU == untruncatedResult.addressModeU && truncatedResult.addressModeV == untruncatedResult.addressModeV + && truncatedResult.borderColor == untruncatedResult.borderColor, + "TRUNC_COORD must not change the host sampler of an unnormalized S#"); + } auto truncatedBlend = pack(unnormalizedBase); truncatedBlend[0] |= 1u << 19u; reject([&] { DecodeSamplerResource(truncatedBlend, true); }, "unnormalized coordinates with MC_COORD_TRUNC"); diff --git a/core/libs/prx/libSceAgcDriver/tests/HostReport.cpp b/core/libs/prx/libSceAgcDriver/tests/HostReport.cpp new file mode 100644 index 000000000000..fec1cfc605d7 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/HostReport.cpp @@ -0,0 +1,294 @@ +#include "prx/libSceAgcDriver/Execution/include/HostReport.hpp" +#include +#include +#include +#include + +namespace { + +int failures = 0; + +void Check(bool condition, const char* what) { + if (condition) return; + std::fprintf(stderr, "failed: %s\n", what); + ++failures; +} + +AgcDriver::HostFacts SampleFacts() { + AgcDriver::HostFacts facts; + facts.commit = "0123456789ab"; + facts.os = "Linux 6.1.0-test"; + facts.cpuModel = "Test CPU 9000"; + facts.cpuThreads = 12; + facts.memoryMiB = 32000; + facts.cpuMissing = std::vector{}; + facts.sdlLinked = "2.30.0"; + facts.sdlCompiled = "2.30.1"; + AgcDriver::HostGpuFacts gpu; + gpu.name = "Test GPU"; + gpu.type = "discrete"; + gpu.driverName = "test-driver"; + gpu.driverInfo = "Test 1.2.3"; + gpu.vendorId = 0x10de; + gpu.deviceId = 0x2504; + gpu.apiVersion = (1u << 22) | (3u << 12) | 280u; + gpu.driverVersion = 0x12345678; + gpu.subgroupSize = 32; + gpu.deviceLocalMiB = 12288; + gpu.candidates = {"Test GPU", "Other GPU"}; + gpu.presentModes = {"mailbox", "fifo", "immediate"}; + gpu.requirements = { + {"VK_KHR_swapchain", "extension", true, true}, + {"shaderInt64", "feature", true, true}, + {"VK_EXT_memory_budget", "extension", false, true}, + {"VK_KHR_maintenance5", "extension", false, false}, + }; + facts.gpu = gpu; + facts.shaderCache = AgcDriver::HostShaderCacheFacts{true, true, 512}; + facts.environment = {{"ANYPS5_OVERLAY", "1"}, {"APS5_PROFILE_GPU", "1"}}; + return facts; +} + +constexpr const char* Golden = + "AnyPS5 host report (format 1)\n" + "commit: 0123456789ab\n" + "[system]\n" + "os: Linux 6.1.0-test\n" + "cpu: Test CPU 9000\n" + "cpu_threads: 12\n" + "memory_mib: 32000\n" + "cpu_gate: passed\n" + "[sdl]\n" + "linked: 2.30.0\n" + "compiled: 2.30.1\n" + "[gpu]\n" + "device: Test GPU\n" + "type: discrete\n" + "vendor_id: 0x10de\n" + "device_id: 0x2504\n" + "vulkan_api: 1.3.280\n" + "driver: test-driver\n" + "driver_info: Test 1.2.3\n" + "driver_version_raw: 0x12345678\n" + "subgroup_size: 32\n" + "device_local_mib: 12288\n" + "candidates: Test GPU, Other GPU\n" + "present_modes: fifo, immediate, mailbox\n" + "present_mode_requested: default\n" + "[vulkan]\n" + "VK_KHR_swapchain: extension required present\n" + "shaderInt64: feature required present\n" + "VK_EXT_memory_budget: extension optional present\n" + "VK_KHR_maintenance5: extension optional missing\n" + "[shader_cache]\n" + "state: present\n" + "size_mib: 512\n" + "[environment]\n" + "ANYPS5_OVERLAY: 1\n" + "APS5_PROFILE_GPU: 1\n"; + +void GoldenOutput() { + Check(AgcDriver::FormatHostReport(SampleFacts()) == Golden, "the report differs from the golden text"); +} + +void OrderIsStable() { + auto shuffled = SampleFacts(); + std::reverse(shuffled.environment.begin(), shuffled.environment.end()); + std::reverse(shuffled.gpu->requirements.begin(), shuffled.gpu->requirements.end()); + std::reverse(shuffled.gpu->presentModes.begin(), shuffled.gpu->presentModes.end()); + Check(AgcDriver::FormatHostReport(shuffled) == Golden, "the entry order of the input changed the report"); + Check(AgcDriver::FormatHostReport(SampleFacts()) == AgcDriver::FormatHostReport(SampleFacts()), "two formats of the same facts differ"); +} + +void MissingFactsAreNamed() { + AgcDriver::HostFacts facts; + const auto text = AgcDriver::FormatHostReport(facts); + Check(text.find("os: unavailable\n") != std::string::npos, "an absent OS is not reported as unavailable"); + Check(text.find("cpu_gate: unavailable\n") != std::string::npos, "an unknown CPU gate is not reported as unavailable"); + Check(text.find("device: none selected\n") != std::string::npos, "an absent GPU is not reported"); + Check(text.find("state: unavailable\n") != std::string::npos, "an unknown shader cache is not reported as unavailable"); + Check(text.find("commit: unknown\n") != std::string::npos, "an empty commit is not reported as unknown"); + facts.cpuMissing = std::vector{"AVX2", "BMI2"}; + facts.shaderCache = AgcDriver::HostShaderCacheFacts{false, false, 0}; + const auto failed = AgcDriver::FormatHostReport(facts); + Check(failed.find("cpu_gate: failed, lacks AVX2, BMI2\n") != std::string::npos, "a failed CPU gate does not list the missing extensions"); + Check(failed.find("state: disabled\n") != std::string::npos, "a disabled shader cache is not reported"); + facts.shaderCache = AgcDriver::HostShaderCacheFacts{true, false, 0}; + Check(AgcDriver::FormatHostReport(facts).find("state: absent\n") != std::string::npos, "an absent shader cache directory is not reported"); +} + +void PathsAndAddressesAreRedacted() { + Check(AgcDriver::RedactHostText("/home/alice/.cache/shader_cache") == "", "an absolute path was kept"); + Check(AgcDriver::RedactHostText("loaded from ~/games/x") == "loaded from ", "a home-relative path was kept"); + Check(AgcDriver::RedactHostText("C:\\Users\\bob\\AppData") == "", "a Windows path was kept"); + Check(AgcDriver::RedactHostText("D:/Users/bob") == "", "a Windows drive path with a slash was kept"); + Check(AgcDriver::RedactHostText("(/usr/lib/libvulkan.so.1)") == "", "a parenthesised path was kept"); + Check(AgcDriver::RedactHostText("https://user:secret@example.org/a") == "", "a URL was kept"); + Check(AgcDriver::RedactHostText("nic 00:1a:2B:3c:4d:5e up") == "nic up", "a MAC address was kept"); + Check(AgcDriver::RedactHostText("00-1A-2B-3C-4D-5E") == "", "a dashed MAC address was kept"); + Check(AgcDriver::RedactHostText("LAHF/SAHF") == "LAHF/SAHF", "a feature name with a slash was changed"); + Check(AgcDriver::RedactHostText("AMD Radeon RX 6750 XT (RADV NAVI22)") == "AMD Radeon RX 6750 XT (RADV NAVI22)", "a device name was changed"); + Check(AgcDriver::RedactHostText("a\nfake: line\r\tx") == "a fake: line x", "control characters were kept"); +} + +void MissingRequirementsAreDescribed() { + auto facts = SampleFacts(); + Check(AgcDriver::DescribeMissingRequirements(*facts.gpu).empty(), "a GPU with every required item got a message"); + Check(AgcDriver::MissingRequirements(*facts.gpu).empty(), "a GPU with every required item lists missing items"); + facts.gpu->requirements.push_back({"VK_KHR_8bit_storage", "extension", true, false}); + facts.gpu->requirements.push_back({"bufferDeviceAddress", "feature", true, false}); + facts.gpu->requirements.push_back({"VK_KHR_present_wait", "extension", false, false}); + const auto message = AgcDriver::DescribeMissingRequirements(*facts.gpu); + const std::string expected = "Vulkan: Test GPU (test-driver Test 1.2.3, Vulkan 1.3.280) lacks 2 items AnyPS5 needs: " + "VK_KHR_8bit_storage (extension), bufferDeviceAddress (feature). Update the graphics driver; an older GPU or driver may not offer them. " + "Other Vulkan devices on this machine: Other GPU; set ANYPS5_GPU to a part of one name to run on it. " + "Start again with ANYPS5_HOST_REPORT=1 and attach the report to the issue."; + Check(message == expected, "the message differs from the expected text"); + Check(message.find("VK_KHR_present_wait") == std::string::npos, "an optional item was listed as needed"); + facts.gpu->candidates = {"Test GPU"}; + facts.gpu->requirements = {{"shaderInt64", "feature", true, false}}; + facts.gpu->driverName.clear(); + facts.gpu->driverInfo.clear(); + const auto single = AgcDriver::DescribeMissingRequirements(*facts.gpu); + Check(single.find("lacks 1 item AnyPS5 needs: shaderInt64 (feature).") != std::string::npos, "the singular form is wrong"); + Check(single.find("unknown driver") != std::string::npos, "an unknown driver is not named as unknown"); + Check(single.find("Other Vulkan devices") == std::string::npos, "the only device was offered as an alternative"); + facts.gpu->name = "GPU of alice at /home/alice"; + const auto redacted = AgcDriver::DescribeMissingRequirements(*facts.gpu, {"alice"}); + Check(redacted.find("alice") == std::string::npos, "the message leaked a listed name"); +} + +AgcDriver::HostSources FakeSources() { + AgcDriver::HostSources sources; + sources.commit = "feedface"; + sources.os = [] { return std::string("Fake OS 1"); }; + sources.cpuModel = [] { return std::string("Fake CPU"); }; + sources.cpuThreads = [] { return std::uint64_t{8}; }; + sources.memoryMiB = [] { return std::uint64_t{16000}; }; + sources.cpuMissing = [] { return std::vector{"BMI2"}; }; + sources.sdlLinked = [] { return std::string("2.30.0"); }; + sources.sdlCompiled = [] { return std::string("2.30.1"); }; + sources.shaderCache = [] { return AgcDriver::HostShaderCacheFacts{true, true, 7}; }; + sources.environment = [] { return std::vector{"HOME=/home/alice", "VK_INSTANCE_LAYERS=layer", "APS5_B=2", "ANYPS5_A=1", "SDL_VIDEODRIVER=x11", "NOEQUALS", "=x", "PATH=/bin"}; }; + sources.redactions = [] { return std::vector{"alice"}; }; + return sources; +} + +void SourcesAreCollected() { + const auto facts = AgcDriver::CollectHostFacts(FakeSources()); + Check(facts.commit == "feedface" && facts.os == "Fake OS 1" && facts.cpuModel == "Fake CPU", "a text source was not collected"); + Check(facts.cpuThreads == 8 && facts.memoryMiB == 16000, "a number source was not collected"); + Check(facts.cpuMissing && *facts.cpuMissing == std::vector{"BMI2"}, "the CPU gate source was not collected"); + Check(facts.sdlLinked == "2.30.0" && facts.sdlCompiled == "2.30.1", "an SDL source was not collected"); + Check(facts.shaderCache && facts.shaderCache->sizeMiB == 7, "the shader cache source was not collected"); + Check(facts.redactions == std::vector{"alice"}, "the redaction source was not collected"); + Check(facts.unavailable.empty(), "a working source was reported as unavailable"); + Check(!facts.gpu, "the collector invented a GPU"); + const std::vector> environment{{"ANYPS5_A", "1"}, {"APS5_B", "2"}, {"SDL_VIDEODRIVER", "x11"}, {"VK_INSTANCE_LAYERS", "layer"}}; + Check(facts.environment == environment, "the environment was not filtered and sorted"); +} + +void FailingSourcesAreRecorded() { + auto sources = FakeSources(); + sources.os = [] () -> std::string { throw std::runtime_error("uname failed"); }; + sources.memoryMiB = nullptr; + sources.cpuModel = [] () -> std::string { throw std::logic_error("cpuid"); }; + const auto facts = AgcDriver::CollectHostFacts(sources); + Check(!facts.os && !facts.memoryMiB && !facts.cpuModel, "a failing source produced a value"); + Check(facts.cpuThreads == 8 && facts.sdlLinked == "2.30.0", "a failing source hid the others"); + const std::vector unavailable{"os: uname failed", "cpu: cpuid", "memory: no source"}; + Check(facts.unavailable.size() == 3, "the failures were not all recorded"); + for (const auto& item : unavailable) Check(std::find(facts.unavailable.begin(), facts.unavailable.end(), item) != facts.unavailable.end(), item.c_str()); + const auto text = AgcDriver::FormatHostReport(facts); + Check(text.find("os: unavailable\n") != std::string::npos && text.find("memory_mib: unavailable\n") != std::string::npos, "a failed source is not shown as unavailable"); + Check(text.find("[unavailable]\ncpu: cpuid\nmemory: no source\nos: uname failed\n") != std::string::npos, "the unavailable section is missing or unsorted"); + Check(AgcDriver::FormatHostReport(AgcDriver::CollectHostFacts(FakeSources())).find("[unavailable]") == std::string::npos, "a report with every fact printed an unavailable section"); + auto leaking = facts; + leaking.unavailable.push_back("environment: cannot read /home/alice/.config"); + Check(AgcDriver::FormatHostReport(leaking).find("alice") == std::string::npos, "a failure message leaked a path"); + AgcDriver::HostSources none; + const auto empty = AgcDriver::CollectHostFacts(none); + Check(empty.unavailable.size() == 10 && !empty.os && empty.environment.empty() && empty.redactions.empty(), "an empty source set did not report every source"); +} + +void RedactionNamesAreDerived() { + Check(AgcDriver::HostRedactionNames("alice", "alice-pc", "/home/alice/") == std::vector{"alice", "alice-pc"}, "the user, host and home names were not derived"); + Check(AgcDriver::HostRedactionNames("alice", "box", "/home/ally") == std::vector{"alice", "box", "ally"}, "a home name that differs from the user was dropped"); + Check(AgcDriver::HostRedactionNames("", "", "/home/ally/") == std::vector{"ally"}, "a trailing separator hid the home directory name"); + Check(AgcDriver::HostRedactionNames("", "", "C:\\Users\\Bob") == std::vector{"Bob"}, "a Windows home directory was not split"); + Check(AgcDriver::HostRedactionNames("", "", "").empty(), "empty inputs produced names"); +} + +bool Refused(const char* value, std::string& message) { + try { + static_cast(AgcDriver::ParseHostReportSetting(value)); + } catch (const std::runtime_error& error) { + message = error.what(); + return true; + } + return false; +} + +void SettingIsParsed() { + Check(!AgcDriver::ParseHostReportSetting(nullptr), "an unset variable turned the report on"); + Check(!AgcDriver::ParseHostReportSetting(""), "an empty value turned the report on"); + Check(!AgcDriver::ParseHostReportSetting("0"), "0 turned the report on"); + Check(AgcDriver::ParseHostReportSetting("1"), "1 did not turn the report on"); + for (const char* bad : {"2", "true", "yes", " 1", "1 ", "01", "-1", "on", "00"}) { + std::string message; + Check(Refused(bad, message), bad); + Check(message.find("ANYPS5_HOST_REPORT") != std::string::npos && message.find(std::string("'") + bad + "'") != std::string::npos, "the refusal does not name the variable and the value"); + } +} + +void NamedValuesAreRedacted() { + const std::vector names{"alice", "al", "workstation-7", ""}; + Check(AgcDriver::RedactHostText("user alice on workstation-7", names) == "user on ", "a listed name was kept"); + Check(AgcDriver::RedactHostText("al's radeon", names) == "'s radeon", "a short name hit inside a word or was kept"); + Check(AgcDriver::RedactHostText("alicia palice", names) == "alicia palice", "a name inside another word was replaced"); + Check(AgcDriver::RedactHostText("alice-pc", names) == "-pc", "a name before a dash was kept"); + Check(AgcDriver::RedactHostText("no names here", {}) == "no names here", "text without names changed"); + auto facts = SampleFacts(); + facts.redactions = {"alice", "workstation-7"}; + facts.os = "Linux workstation-7 6.1"; + facts.gpu->name = "GPU of alice"; + facts.environment.push_back({"APS5_NOTE", "alice"}); + const auto text = AgcDriver::FormatHostReport(facts); + Check(text.find("alice") == std::string::npos && text.find("workstation-7") == std::string::npos, "a listed name reached the report"); + Check(text.find("os: Linux 6.1\n") != std::string::npos, "the host name was not replaced in the OS line"); + Check(text.find("device: GPU of \n") != std::string::npos, "the user name was not replaced in the GPU name"); +} + +void FormattedReportHasNoSensitiveText() { + auto facts = SampleFacts(); + facts.os = "Linux 6.1 /home/alice/kernel"; + facts.cpuModel = "CPU at \\\\server\\share"; + facts.gpu->driverInfo = "Mesa 24 /usr/lib/x86_64-linux-gnu/dri/radeonsi_dri.so"; + facts.gpu->candidates.push_back("Dev 00:11:22:33:44:55"); + facts.environment.push_back({"ANYPS5_SHADER_CACHE_DIR", "/home/alice/cache"}); + facts.environment.push_back({"APS5_TRACE_DIR", "C:\\Users\\alice\\trace"}); + facts.environment.push_back({"APS5_NOTE", "line\nINJECTED: yes"}); + const auto text = AgcDriver::FormatHostReport(facts); + for (const char* forbidden : {"alice", "/home", "/usr", "C:\\", "00:11:22", "\\\\server", "\nINJECTED"}) + Check(text.find(forbidden) == std::string::npos, forbidden); + Check(text.find("ANYPS5_SHADER_CACHE_DIR: \n") != std::string::npos, "an environment path value was not replaced"); + Check(text.find("driver_info: Mesa 24 \n") != std::string::npos, "a path in the driver info was not replaced"); + Check(text.find("APS5_NOTE: line INJECTED: yes\n") != std::string::npos, "a newline in a value was not flattened"); +} + +} + +int main() { + GoldenOutput(); + OrderIsStable(); + MissingFactsAreNamed(); + PathsAndAddressesAreRedacted(); + NamedValuesAreRedacted(); + SettingIsParsed(); + MissingRequirementsAreDescribed(); + SourcesAreCollected(); + FailingSourcesAreRecorded(); + RedactionNamesAreDerived(); + FormattedReportHasNoSensitiveText(); + return failures == 0 ? 0 : 1; +} diff --git a/core/libs/prx/libSceAgcDriver/tests/HostReportVulkan.cpp b/core/libs/prx/libSceAgcDriver/tests/HostReportVulkan.cpp new file mode 100644 index 000000000000..879366ee27b0 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/HostReportVulkan.cpp @@ -0,0 +1,225 @@ +#include "prx/libSceAgcDriver/Execution/include/HostReportVulkan.hpp" +#include +#include +#include +#include +#include + +namespace { + +int failures = 0; + +void Check(bool condition, const char* what) { + if (condition) return; + std::fprintf(stderr, "failed: %s\n", what); + ++failures; +} + +struct FakeDevice { + bool bytes = true; + bool address = true; + bool int64 = true; + bool signedZero = true; + bool stores = true; + bool anisotropy = true; + bool bc = true; + VkPhysicalDeviceType type = VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU; + std::vector modes{VK_PRESENT_MODE_FIFO_KHR, VK_PRESENT_MODE_MAILBOX_KHR}; +}; + +FakeDevice device; + +template +TStructure* Find(void* chain, VkStructureType type) { + for (auto* header = static_cast(chain); header != nullptr; header = header->pNext) + if (header->sType == type) return reinterpret_cast(header); + return nullptr; +} + +void VKAPI_CALL Properties2(VkPhysicalDevice, VkPhysicalDeviceProperties2* properties) { + std::strcpy(properties->properties.deviceName, "Fake GPU 9000"); + properties->properties.deviceType = device.type; + properties->properties.vendorID = 0x1002; + properties->properties.deviceID = 0x73bf; + properties->properties.apiVersion = VK_MAKE_API_VERSION(0, 1, 3, 250); + properties->properties.driverVersion = 0x00abcdef; + if (auto* driver = Find(properties->pNext, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES)) { + std::strcpy(driver->driverName, "fake-driver"); + std::strcpy(driver->driverInfo, "Fake 24.1.2"); + } + if (auto* controls = Find(properties->pNext, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES)) + controls->shaderSignedZeroInfNanPreserveFloat32 = device.signedZero ? VK_TRUE : VK_FALSE; +} + +void VKAPI_CALL Features2(VkPhysicalDevice, VkPhysicalDeviceFeatures2* features) { + features->features.shaderInt64 = device.int64 ? VK_TRUE : VK_FALSE; + features->features.vertexPipelineStoresAndAtomics = device.stores ? VK_TRUE : VK_FALSE; + features->features.fragmentStoresAndAtomics = device.stores ? VK_TRUE : VK_FALSE; + features->features.samplerAnisotropy = device.anisotropy ? VK_TRUE : VK_FALSE; + features->features.textureCompressionBC = device.bc ? VK_TRUE : VK_FALSE; + if (auto* bytes = Find(features->pNext, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES)) + bytes->storageBuffer8BitAccess = device.bytes ? VK_TRUE : VK_FALSE; + if (auto* address = Find(features->pNext, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES)) + address->bufferDeviceAddress = device.address ? VK_TRUE : VK_FALSE; +} + +void VKAPI_CALL Memory(VkPhysicalDevice, VkPhysicalDeviceMemoryProperties* memory) { + *memory = {}; + memory->memoryHeapCount = 3; + memory->memoryHeaps[0] = {16ull << 30, 0}; + memory->memoryHeaps[1] = {256ull << 20, VK_MEMORY_HEAP_DEVICE_LOCAL_BIT}; + memory->memoryHeaps[2] = {8ull << 30, VK_MEMORY_HEAP_DEVICE_LOCAL_BIT}; +} + +VkResult VKAPI_CALL PresentModes(VkPhysicalDevice, VkSurfaceKHR, std::uint32_t* count, VkPresentModeKHR* modes) { + if (modes == nullptr) { + *count = static_cast(device.modes.size()); + return VK_SUCCESS; + } + std::copy(device.modes.begin(), device.modes.begin() + *count, modes); + return VK_SUCCESS; +} + +PFN_vkVoidFunction VKAPI_CALL Proc(VkInstance, const char* name) { + if (std::strcmp(name, "vkGetPhysicalDeviceProperties2") == 0) return reinterpret_cast(Properties2); + if (std::strcmp(name, "vkGetPhysicalDeviceFeatures2") == 0) return reinterpret_cast(Features2); + if (std::strcmp(name, "vkGetPhysicalDeviceMemoryProperties") == 0) return reinterpret_cast(Memory); + if (std::strcmp(name, "vkGetPhysicalDeviceSurfacePresentModesKHR") == 0) return reinterpret_cast(PresentModes); + return nullptr; +} + +std::vector Extensions(std::initializer_list names) { + std::vector result; + for (const char* name : names) { + VkExtensionProperties item{}; + std::strcpy(item.extensionName, name); + result.push_back(item); + } + return result; +} + +std::vector AllRequired() { + return Extensions({VK_KHR_SWAPCHAIN_EXTENSION_NAME, VK_KHR_8BIT_STORAGE_EXTENSION_NAME, VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, + VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME, VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME, VK_EXT_MEMORY_BUDGET_EXTENSION_NAME}); +} + +AgcDriver::HostGpuQuery Query(const std::vector& extensions) { + AgcDriver::HostGpuQuery query; + query.instanceProc = Proc; + query.physical = reinterpret_cast(static_cast(1)); + query.surface = reinterpret_cast(static_cast(2)); + query.presentation = true; + query.subgroupSize = 64; + query.extensions = extensions; + query.candidates = {"Fake GPU 9000", "Other GPU"}; + return query; +} + +const AgcDriver::HostRequirement* Find(const AgcDriver::HostGpuFacts& facts, const std::string& name) { + for (const auto& item : facts.requirements) + if (item.name == name) return &item; + return nullptr; +} + +void IdentityIsRead() { + device = {}; + const auto extensions = AllRequired(); + auto query = Query(extensions); + query.requestedPresentMode = "mailbox"; + const auto gpu = AgcDriver::CollectHostGpuFacts(query); + Check(gpu.name == "Fake GPU 9000" && gpu.type == "discrete", "the name or type was not read"); + Check(gpu.vendorId == 0x1002 && gpu.deviceId == 0x73bf && gpu.driverVersion == 0x00abcdef, "the ids or the raw driver version were not read"); + Check(gpu.apiVersion == VK_MAKE_API_VERSION(0, 1, 3, 250), "the Vulkan version was not read"); + Check(gpu.driverName == "fake-driver" && gpu.driverInfo == "Fake 24.1.2", "the driver name and info were not read"); + Check(gpu.deviceLocalMiB == 8192, "the largest device-local heap was not chosen"); + Check(gpu.subgroupSize == 64 && gpu.candidates.size() == 2 && gpu.requestedPresentMode == "mailbox", "the caller's facts were not kept"); + Check(gpu.presentModes == std::vector{"fifo", "mailbox"}, "the present modes were not read"); + Check(AgcDriver::DescribeMissingRequirements(gpu).empty(), "a complete device reported a missing item"); + device.type = VK_PHYSICAL_DEVICE_TYPE_CPU; + Check(AgcDriver::CollectHostGpuFacts(Query(extensions)).type == "cpu", "a software device was not named"); +} + +void NoDriverPropertiesLeavesDriverEmpty() { + device = {}; + const auto extensions = Extensions({VK_KHR_SWAPCHAIN_EXTENSION_NAME, VK_KHR_8BIT_STORAGE_EXTENSION_NAME, VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME}); + const auto gpu = AgcDriver::CollectHostGpuFacts(Query(extensions)); + Check(gpu.driverName.empty() && gpu.driverInfo.empty(), "a driver was named without VK_KHR_driver_properties"); + const auto* optional = Find(gpu, VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME); + Check(optional != nullptr && !optional->required && !optional->present, "the absent driver properties extension is not listed as optional and missing"); + const auto* budget = Find(gpu, VK_EXT_MEMORY_BUDGET_EXTENSION_NAME); + Check(budget != nullptr && !budget->present, "the absent memory budget extension is not listed as missing"); +} + +void MissingExtensionsAreFound() { + device = {}; + const auto extensions = Extensions({VK_KHR_SWAPCHAIN_EXTENSION_NAME, VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME}); + const auto gpu = AgcDriver::CollectHostGpuFacts(Query(extensions)); + const auto missing = AgcDriver::MissingRequirements(gpu); + std::vector names; + for (const auto& item : missing) names.push_back(item.name); + const std::vector expected{VK_KHR_8BIT_STORAGE_EXTENSION_NAME, VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, "bufferDeviceAddress", "storageBuffer8BitAccess"}; + Check(names == expected, "the missing extensions and the features that depend on them were not found"); + const auto message = AgcDriver::DescribeMissingRequirements(gpu); + Check(message.find("Fake GPU 9000") != std::string::npos && message.find("VK_KHR_8bit_storage (extension)") != std::string::npos, "the message does not name the GPU and the missing extension"); +} + +void MissingFeaturesAreFound() { + device = {}; + device.int64 = false; + device.signedZero = false; + device.anisotropy = false; + const auto extensions = AllRequired(); + const auto gpu = AgcDriver::CollectHostGpuFacts(Query(extensions)); + std::vector names; + for (const auto& item : AgcDriver::MissingRequirements(gpu)) names.push_back(item.name); + const std::vector expected{"samplerAnisotropy", "shaderInt64", "shaderSignedZeroInfNanPreserveFloat32"}; + Check(names == expected, "the unsupported features were not the only missing items"); + device = {}; + device.stores = false; + device.bc = false; + device.bytes = false; + device.address = false; + names.clear(); + for (const auto& item : AgcDriver::MissingRequirements(AgcDriver::CollectHostGpuFacts(Query(extensions)))) names.push_back(item.name); + const std::vector second{"bufferDeviceAddress", "fragmentStoresAndAtomics", "storageBuffer8BitAccess", "textureCompressionBC", "vertexPipelineStoresAndAtomics"}; + Check(names == second, "the second set of unsupported features was not found"); +} + +void SwapchainIsRequiredOnlyWithAWindow() { + device = {}; + const auto extensions = Extensions({VK_KHR_8BIT_STORAGE_EXTENSION_NAME, VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME}); + auto query = Query(extensions); + const auto windowed = AgcDriver::CollectHostGpuFacts(query); + Check(Find(windowed, VK_KHR_SWAPCHAIN_EXTENSION_NAME) != nullptr && !AgcDriver::MissingRequirements(windowed).empty(), "a missing swapchain extension was not required with a window"); + query.presentation = false; + query.surface = VK_NULL_HANDLE; + const auto headless = AgcDriver::CollectHostGpuFacts(query); + Check(Find(headless, VK_KHR_SWAPCHAIN_EXTENSION_NAME) == nullptr && AgcDriver::MissingRequirements(headless).empty(), "the swapchain extension was required without a window"); + Check(headless.presentModes.empty(), "present modes were read without a surface"); +} + +void MissingEntryPointIsAnError() { + device = {}; + const auto extensions = AllRequired(); + auto query = Query(extensions); + query.instanceProc = [](VkInstance, const char*) -> PFN_vkVoidFunction { return nullptr; }; + bool thrown = false; + try { + static_cast(AgcDriver::CollectHostGpuFacts(query)); + } catch (const std::runtime_error& error) { + thrown = std::string(error.what()).find("vkGetPhysicalDeviceProperties2") != std::string::npos; + } + Check(thrown, "a missing entry point was not reported by name"); +} + +} + +int main() { + IdentityIsRead(); + NoDriverPropertiesLeavesDriverEmpty(); + MissingExtensionsAreFound(); + MissingFeaturesAreFound(); + SwapchainIsRequiredOnlyWithAWindow(); + MissingEntryPointIsAnError(); + return failures == 0 ? 0 : 1; +} diff --git a/core/libs/prx/libSceAgcDriver/tests/IrReclaim.cpp b/core/libs/prx/libSceAgcDriver/tests/IrReclaim.cpp index 8befc9e58242..4256def9d94b 100644 --- a/core/libs/prx/libSceAgcDriver/tests/IrReclaim.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/IrReclaim.cpp @@ -76,6 +76,43 @@ int main() { program.Metadata().dynamicReads.clear(); if (program.ReclaimUnusedValues() != 2u) throw std::runtime_error("reclamation did not recover after an external-owner rejection"); if (builder.Constant(999u).Id() <= pinned.back()->Id()) throw std::runtime_error("reclamation reused a value ID"); + IrProgram replaced; + auto& shared = replaced.CreateValue(IrOpcode::IAdd32, IrType::U32); + std::vector readers; + for (std::uint32_t number = 0; number < 40u; ++number) { + auto& reader = replaced.CreateValue(IrOpcode::IAdd32, IrType::U32); + reader.AddArgument(&shared); + readers.push_back(&reader); + } + for (std::size_t index = 0; index < readers.size(); ++index) { + if (shared.OperandUses()[index].user != readers[index]) throw std::runtime_error("a use list lost an entry while growing"); + } + auto& target = replaced.CreateValue(IrOpcode::IAdd32, IrType::U32); + shared.ReplaceAllUsesWith(&target); + if (shared.HasUses() || target.UseCount() != readers.size() || readers.front()->Argument(0) != &target || readers.back()->Argument(0) != &target) throw std::runtime_error("moving a grown use list to another value lost a use"); + IrProgram replacement; + auto& kept = replacement.CreateValue(IrOpcode::IAdd32, IrType::U32); + auto& keptReader = replacement.CreateValue(IrOpcode::IAdd32, IrType::U32); + keptReader.AddArgument(&kept); + replaced = std::move(replacement); + if (kept.UseCount() != 1u || kept.OperandUses().front().user != &keptReader) throw std::runtime_error("move assignment invalidated the assigned program's use lists"); + IrProgram cached; + auto& source = cached.CreateValue(IrOpcode::IAdd32, IrType::U32); + std::vector users; + for (std::uint32_t number = 0; number < 40u; ++number) { + auto& user = cached.CreateValue(IrOpcode::IAdd32, IrType::U32); + user.AddArgument(&source); + users.push_back(&user); + } + cached.ReleaseUseArena(); + if (source.OperandUses().get_allocator().Arena() != nullptr || users.front()->OperandUses().get_allocator().Arena() != nullptr) throw std::runtime_error("releasing the use arena left a use list in it"); + if (source.UseCount() != users.size()) throw std::runtime_error("releasing the use arena lost a use"); + for (std::size_t index = 0; index < users.size(); ++index) { + if (source.OperandUses()[index].user != users[index] || users[index]->Argument(0) != &source) throw std::runtime_error("releasing the use arena reordered a use list"); + } + auto& late = cached.CreateValue(IrOpcode::IAdd32, IrType::U32); + late.AddArgument(&source); + if (late.OperandUses().get_allocator().Arena() == nullptr || source.UseCount() != users.size() + 1u || source.OperandUses().back().user != &late) throw std::runtime_error("a value created after releasing the use arena did not get a new one"); IrProgram moved = std::move(program); if (value.Id() != id || value.ImmediateU32() != 42u || moved.ReclaimUnusedValues() != 1u) throw std::runtime_error("moving a program invalidated its allocation owner"); IrProgram assigned; diff --git a/core/libs/prx/libSceAgcDriver/tests/KeyboardOverlay.cpp b/core/libs/prx/libSceAgcDriver/tests/KeyboardOverlay.cpp index b528a523890c..ab213f5f9b39 100644 --- a/core/libs/prx/libSceAgcDriver/tests/KeyboardOverlay.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/KeyboardOverlay.cpp @@ -335,6 +335,132 @@ void paletteTests() { } } +ModalDialogView dialogOf(const std::u16string& message, std::vector labels, std::size_t focus) { + ModalDialogView view; + view.message = message; + for (std::size_t index = 0; index < labels.size(); ++index) view.buttons.push_back({labels[index], index == focus}); + return view; +} + +std::vector rectsOf(const OverlayLayout& layout, OverlayColor color) { + std::vector found; + for (const auto& rect : layout.rects) { + if (rect.color == colorOf(color)) found.push_back(rect); + } + return found; +} + +void dialogWrapTests() { + using AgcDriver::WrapDialogMessage; + using Lines = std::vector; + require(WrapDialogMessage(u"hello world", 5, 8) == Lines{U"hello", U"world"}, "words are not wrapped at the column limit"); + require(WrapDialogMessage(u"a b c", 5, 8) == Lines{U"a b c"}, "words that fit were split"); + require(WrapDialogMessage(u"abcdefghij", 4, 8) == Lines{U"abcd", U"efgh", U"ij"}, "a long word is not broken at the column limit"); + require(WrapDialogMessage(u"one\ntwo", 20, 8) == Lines{U"one", U"two"}, "a line break is not kept"); + require(WrapDialogMessage(u"one\n\ntwo", 20, 8) == Lines{U"one", U"", U"two"}, "a blank line is not kept"); + require(WrapDialogMessage(u"one\r\ntwo", 20, 8) == Lines{U"one", U"two"}, "a carriage return is drawn"); + require(WrapDialogMessage(u" spaced out ", 20, 8) == Lines{U"spaced out"}, "extra spaces are kept"); + require(WrapDialogMessage(u"", 20, 8) == Lines{U""}, "an empty message has no line"); + require(WrapDialogMessage(u"one\n", 20, 8) == Lines{U"one"}, "a trailing line break adds a line"); + require(WrapDialogMessage(u"a\U0001F600b", 4, 8) == Lines{U"a\U0001F600b"}, "a surrogate pair counts as two characters"); + require(WrapDialogMessage(u"aa bb cc dd ee", 5, 2) == Lines{U"aa bb", U"cc..."}, "an overlong message does not end in dots"); + require(WrapDialogMessage(u"abcde fghij klmno", 5, 2) == Lines{U"abcde", U"fg..."}, "a full last line is not cut to make room for the dots"); + bool threw = false; + try { + static_cast(WrapDialogMessage(u"x", 3, 8)); + } catch (const std::exception&) { + threw = true; + } + require(threw, "a dialog with no room for its text was accepted"); + std::printf("dialog wrap: words, long words, breaks, dots\n"); +} + +void dialogLayoutTests() { + const auto message = u"Overwrite the save?\nThis cannot be undone, and the previous data cannot be restored afterwards."; + for (const VkExtent2D extent : {VkExtent2D{640, 360}, VkExtent2D{1280, 720}, VkExtent2D{1920, 1080}, VkExtent2D{3840, 2160}}) { + for (const std::size_t count : {std::size_t{1}, std::size_t{2}, std::size_t{3}}) { + const std::vector labels{u"Yes", u"No", u"Cancel"}; + const auto view = dialogOf(message, {labels.begin(), labels.begin() + static_cast(count)}, count - 1); + const auto layout = AgcDriver::LayOutDialog(view, extent); + const auto name = std::to_string(extent.width) + "x" + std::to_string(extent.height) + " with " + std::to_string(count) + " buttons"; + require(layout.scale == std::max(1, static_cast(extent.height / KeyboardMetrics::LinesPerScale)), name + ": the dialog scale is not the keyboard's"); + require(contains({0, 0, static_cast(extent.width), static_cast(extent.height), 0}, layout.bounds), name + ": the dialog leaves the screen"); + require(std::abs(layout.bounds.x + layout.bounds.width / 2 - static_cast(extent.width) / 2) <= layout.scale && std::abs(layout.bounds.y + layout.bounds.height / 2 - static_cast(extent.height) / 2) <= layout.scale, name + ": the dialog is not centred"); + require(layout.rects.front().color == colorOf(OverlayColor::Panel) && layout.rects.front().x == layout.bounds.x, name + ": the panel is not drawn first"); + for (const auto& rect : layout.rects) require(contains(layout.bounds, rect), name + ": a rectangle leaves the panel"); + const auto accents = rectsOf(layout, OverlayColor::Accent); + require(rectsOf(layout, OverlayColor::Key).size() == count && accents.size() == 1, name + ": one key per button and one accent border are expected"); + std::vector buttons; + for (const auto& rect : layout.rects) { + if ((rect.color == colorOf(OverlayColor::Key) || rect.color == colorOf(OverlayColor::Accent)) && rect.height == AgcDriver::DialogMetrics::ButtonHeight * layout.scale) buttons.push_back(rect); + } + std::sort(buttons.begin(), buttons.end(), [](const OverlayRect& a, const OverlayRect& b) { return a.x < b.x; }); + require(buttons.size() == count, name + ": the buttons are not all drawn"); + for (std::size_t index = 1; index < buttons.size(); ++index) require(buttons[index].x >= buttons[index - 1].x + buttons[index - 1].width, name + ": the buttons overlap"); + require(buttons.back().color == colorOf(OverlayColor::Accent), name + ": the accent border is not on the focused button"); + require(!rectsOf(layout, OverlayColor::Text).empty(), name + ": no text is drawn"); + } + } + std::printf("dialog layout: bounds, centring, buttons, focus\n"); + + const VkExtent2D extent{1280, 720}; + const auto first = AgcDriver::LayOutDialog(dialogOf(u"Question", {u"Yes", u"No"}, 0), extent); + const auto second = AgcDriver::LayOutDialog(dialogOf(u"Question", {u"Yes", u"No"}, 1), extent); + require(first.bounds.x == second.bounds.x && first.bounds.width == second.bounds.width, "the focus changed the panel size"); + require(rectsOf(first, OverlayColor::Accent).front().x < rectsOf(second, OverlayColor::Accent).front().x, "the accent border does not follow the focus"); + require(rectsOf(AgcDriver::LayOutDialog(dialogOf(u"Question", {u"Yes", u"No"}, 5), extent), OverlayColor::Accent).empty(), "a dialog with no focused button drew an accent border"); + + const auto crowded = dialogOf(std::u16string(400, u'w'), {u"OK"}, 0); + const auto crowdedLayout = AgcDriver::LayOutDialog(crowded, extent); + require(contains({0, 0, 1280, 720, 0}, crowdedLayout.bounds), "a long message makes the dialog leave the screen"); + require(crowdedLayout.bounds.height <= 720, "a long message makes the dialog taller than the screen"); + + const auto small = AgcDriver::LayOutDialog(dialogOf(u"Very long message that needs the whole panel width to be shown at once here", {u"Yes", u"No", u"Cancel"}, 0), VkExtent2D{1280, 720}); + const auto narrow = AgcDriver::LayOutDialog(dialogOf(u"Very long message that needs the whole panel width to be shown at once here", {u"Yes", u"No", u"Cancel"}, 0), VkExtent2D{320, 720}); + require(narrow.scale == 1 && narrow.scale < small.scale, "the dialog does not shrink for a narrow target"); + + for (const auto& bad : {dialogOf(u"x", {}, 0), dialogOf(u"x", {u"a", u"b", u"c", u"d"}, 0)}) { + bool threw = false; + try { + static_cast(AgcDriver::LayOutDialog(bad, extent)); + } catch (const std::exception&) { + threw = true; + } + require(threw, "a dialog without one to three buttons was laid out"); + } + bool threw = false; + try { + static_cast(AgcDriver::LayOutDialog(dialogOf(u"x", {u"OK"}, 0), VkExtent2D{0, 0})); + } catch (const std::exception&) { + threw = true; + } + require(threw, "a dialog without a destination was laid out"); + std::printf("dialog layout: focus, long text, narrow target, invalid input\n"); +} + +void systemDialogTests() { + const VkExtent2D extent{1280, 720}; + require(!AgcDriver::SystemDialogView().has_value() && !AgcDriver::SystemOverlayLayout(extent).has_value(), "an overlay is laid out before one was set"); + const auto dialog = dialogOf(u"Continue?", {u"Yes", u"No"}, 1); + AgcDriverSetSystemDialog_nid_postfix(&dialog); + const auto shown = AgcDriver::SystemDialogView(); + require(shown.has_value() && shown->message == u"Continue?" && shown->buttons.size() == 2 && shown->buttons[1].selected, "the shown dialog is not the one set"); + const auto layout = AgcDriver::SystemOverlayLayout(extent); + const auto expected = AgcDriver::LayOutDialog(dialog, extent); + require(layout.has_value() && layout->bounds.x == expected.bounds.x && layout->bounds.width == expected.bounds.width && layout->rects.size() == expected.rects.size(), "the system overlay is not the dialog"); + ImeDialog::PadKeyboardOptions options; + const auto keyboard = viewOf(ImeDialog::PadKeyboardOpen(options), u"ab", 1); + AgcDriverSetSystemOverlay_nid_postfix(&keyboard); + const auto both = AgcDriver::SystemOverlayLayout(extent); + const auto keyboardLayout = AgcDriver::LayOutKeyboard(keyboard, extent); + require(both.has_value() && both->bounds.width == keyboardLayout.bounds.width && both->rects.size() == keyboardLayout.rects.size(), "the keyboard does not take the overlay from the dialog"); + AgcDriverSetSystemOverlay_nid_postfix(nullptr); + require(AgcDriver::SystemOverlayLayout(extent).has_value(), "the dialog is gone after the keyboard was cleared"); + AgcDriverSetSystemDialog_nid_postfix(nullptr); + require(!AgcDriver::SystemDialogView().has_value() && !AgcDriver::SystemOverlayLayout(extent).has_value(), "a cleared dialog is still shown"); + std::printf("system dialog: set, read back, ranked below the keyboard and cleared\n"); +} + void systemOverlayTests() { require(!AgcDriver::SystemOverlayView().has_value(), "a keyboard is shown before one was set"); ImeDialog::PadKeyboardOptions options; @@ -358,6 +484,9 @@ int main() { caretTests(); paletteTests(); systemOverlayTests(); + dialogWrapTests(); + dialogLayoutTests(); + systemDialogTests(); std::cout << "keyboard overlay tests passed\n"; return 0; } catch (const std::exception& error) { diff --git a/core/libs/prx/libSceAgcDriver/tests/PadStatusOverlay.cpp b/core/libs/prx/libSceAgcDriver/tests/PadStatusOverlay.cpp new file mode 100644 index 000000000000..1ee6abb9575b --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/PadStatusOverlay.cpp @@ -0,0 +1,490 @@ +#include "prx/libSceAgcDriver/Execution/include/PadStatusOverlay.hpp" +#include "prx/libSceAgcDriver/Execution/include/PerformanceOverlay.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +using AgcDriver::PadKind; +using AgcDriver::PadPower; +using AgcDriver::PadSlotStatus; +using AgcDriver::PadStatusDisplay; +using AgcDriver::PadStatusMode; +using AgcDriver::PadStatusSnapshot; + +void require(bool condition, const std::string& reason) { + if (!condition) throw std::runtime_error(reason); +} + +PadStatusDisplay::Clock::time_point at(int milliseconds) { + return PadStatusDisplay::Clock::time_point{} + std::chrono::milliseconds(milliseconds); +} + +PadSlotStatus pad(PadKind kind, PadPower power, const std::string& name = {}) { + return {true, kind, name, power}; +} + +PadStatusSnapshot snapshot(const std::vector& slots) { + PadStatusSnapshot result; + for (std::size_t index = 0; index < slots.size(); ++index) result.slots[index] = slots[index]; + return result; +} + +bool parseRefused(const char* value) { + try { + AgcDriver::ParsePadStatusMode(value); + } catch (const std::runtime_error& error) { + return std::string(error.what()).find("ANYPS5_PAD_STATUS") != std::string::npos; + } + return false; +} + +void modeTests() { + require(AgcDriver::ParsePadStatusMode(nullptr) == PadStatusMode::Off, "an unset ANYPS5_PAD_STATUS is not off"); + require(AgcDriver::ParsePadStatusMode("") == PadStatusMode::Off, "an empty ANYPS5_PAD_STATUS is not off"); + require(AgcDriver::ParsePadStatusMode("0") == PadStatusMode::Off, "ANYPS5_PAD_STATUS=0 is not off"); + require(AgcDriver::ParsePadStatusMode("1") == PadStatusMode::Events, "ANYPS5_PAD_STATUS=1 is not the events mode"); + for (const char* value : {"2", "01", " 1", "1 ", "on", "true", "-1", "events", "00"}) require(parseRefused(value), std::string("ANYPS5_PAD_STATUS='") + value + "' is not refused with the variable's name"); + std::printf("pad status mode: unset, empty and 0 are off, 1 is events, anything else is refused\n"); +} + +void hiddenByDefaultTests() { + PadStatusDisplay off(PadStatusMode::Off); + require(!off.Visible(at(0)), "a new display is visible"); + require(off.Observe(at(0), snapshot({pad(PadKind::DualSense, PadPower::Wired)})), "a connect is not reported as an event"); + require(!off.Visible(at(0)) && !off.Visible(at(1)), "the mode 0 display shows a connect"); + require(off.Observe(at(100), snapshot({})), "a disconnect is not reported as an event"); + require(!off.Visible(at(100)), "the mode 0 display shows a disconnect"); + require(off.Observe(at(200), snapshot({pad(PadKind::Xbox, PadPower::Full)})), "a second connect is not reported"); + require(off.Observe(at(300), snapshot({pad(PadKind::Xbox, PadPower::Low)})) && !off.Visible(at(300)), "the mode 0 display shows a battery drop"); + PadStatusDisplay quiet(PadStatusMode::Events); + require(!quiet.Observe(at(0), snapshot({})) && !quiet.Visible(at(0)), "an empty first observation shows the panel"); + for (int step = 1; step < 200; ++step) require(!quiet.Observe(at(step * 16), snapshot({})) && !quiet.Visible(at(step * 16)), "an unchanged snapshot shows the panel"); + std::printf("pad status: mode 0 and an idle mode 1 never show the panel\n"); +} + +void expiryTests() { + PadStatusDisplay display(PadStatusMode::Events); + display.Observe(at(0), snapshot({})); + require(display.Observe(at(1000), snapshot({pad(PadKind::DualSense, PadPower::Wired)})), "a connect is not an event"); + require(display.Visible(at(1000)), "the panel is hidden when the controller connects"); + require(display.Visible(at(1001)) && display.Visible(at(4999)), "the panel hides before its 4 seconds are over"); + require(!display.Visible(at(5000)), "the panel is still shown 4 seconds after the event"); + require(!display.Visible(at(60000)), "the panel comes back by itself"); + require(PadStatusDisplay::Duration == std::chrono::seconds(4), "the panel's duration is not 4 seconds"); + std::printf("pad status: shown for 4 s after a connect, then gone\n"); +} + +void initialConnectTests() { + PadStatusDisplay display(PadStatusMode::Events); + require(display.Observe(at(0), snapshot({pad(PadKind::Xbox, PadPower::Medium)})) && display.Visible(at(0)), "a controller present at start does not show the panel"); + require(!display.Visible(at(4000)), "the start panel stays"); + std::printf("pad status: a controller present at the first observation counts as a connect\n"); +} + +void extensionTests() { + PadStatusDisplay display(PadStatusMode::Events); + display.Observe(at(0), snapshot({})); + display.Observe(at(0), snapshot({pad(PadKind::DualSense, PadPower::Wired)})); + require(!display.Observe(at(3000), snapshot({pad(PadKind::DualSense, PadPower::Wired)})), "an unchanged snapshot is an event"); + require(!display.Visible(at(4000)), "an observation without an event extended the panel"); + PadStatusDisplay extended(PadStatusMode::Events); + extended.Observe(at(0), snapshot({})); + extended.Observe(at(0), snapshot({pad(PadKind::DualSense, PadPower::Wired)})); + require(extended.Observe(at(3000), snapshot({pad(PadKind::DualSense, PadPower::Wired), pad(PadKind::Xbox, PadPower::Full)})), "a second connect is not an event"); + require(extended.Visible(at(6999)), "a new event did not restart the 4 seconds"); + require(!extended.Visible(at(7000)), "the restarted panel outlives its 4 seconds"); + extended.Observe(at(6000), snapshot({pad(PadKind::DualSense, PadPower::Wired)})); + require(extended.Visible(at(9999)) && !extended.Visible(at(10000)), "a disconnect did not restart the 4 seconds"); + std::printf("pad status: a new event restarts the 4 s, a quiet observation does not\n"); +} + +void batteryTests() { + struct Case { + PadPower before; + PadPower after; + bool event; + }; + const Case cases[] = { + {PadPower::Full, PadPower::Medium, true}, + {PadPower::Medium, PadPower::Low, true}, + {PadPower::Low, PadPower::Empty, true}, + {PadPower::Full, PadPower::Empty, true}, + {PadPower::Full, PadPower::Low, true}, + {PadPower::Medium, PadPower::Medium, false}, + {PadPower::Low, PadPower::Medium, false}, + {PadPower::Empty, PadPower::Full, false}, + {PadPower::Medium, PadPower::Full, false}, + {PadPower::Full, PadPower::Wired, false}, + {PadPower::Wired, PadPower::Low, false}, + {PadPower::Wired, PadPower::Wired, false}, + {PadPower::Unknown, PadPower::Low, false}, + {PadPower::Medium, PadPower::Unknown, false}, + {PadPower::Unknown, PadPower::Unknown, false}, + }; + for (const auto& item : cases) { + PadStatusDisplay display(PadStatusMode::Events); + display.Observe(at(0), snapshot({pad(PadKind::Xbox, item.before)})); + const bool shownAtConnect = display.Visible(at(1000)); + require(shownAtConnect, "the connect did not show the panel"); + const bool event = display.Observe(at(10000), snapshot({pad(PadKind::Xbox, item.after)})); + require(event == item.event, "a battery change was classified wrongly"); + require(display.Visible(at(10001)) == item.event, "a battery change shows the panel wrongly"); + } + PadStatusDisplay second(PadStatusMode::Events); + second.Observe(at(0), snapshot({pad(PadKind::Xbox, PadPower::Full), pad(PadKind::DualSense, PadPower::Full)})); + require(second.Observe(at(10000), snapshot({pad(PadKind::Xbox, PadPower::Full), pad(PadKind::DualSense, PadPower::Low)})) && second.Visible(at(10001)), "a drop on the second slot is not an event"); + std::printf("pad status: only a drop to a lower battery class is an event\n"); +} + +void replacementTests() { + PadStatusDisplay display(PadStatusMode::Events); + display.Observe(at(0), snapshot({pad(PadKind::Xbox, PadPower::Full)})); + require(display.Observe(at(10000), snapshot({pad(PadKind::DualSense, PadPower::Full)})) && display.Visible(at(10001)), "swapping the controller in a slot is not an event"); + require(display.Observe(at(20000), snapshot({pad(PadKind::Other, PadPower::Full, "ONE")})) && display.Visible(at(20001)), "a controller of another kind is not an event"); + require(display.Observe(at(30000), snapshot({pad(PadKind::Other, PadPower::Full, "TWO")})) && display.Visible(at(30001)), "a controller of the same kind and another name is not an event"); + require(!display.Observe(at(40000), snapshot({pad(PadKind::Other, PadPower::Full, "TWO")})) && !display.Visible(at(40000)), "the same controller is an event"); + std::printf("pad status: swapping the controller in a slot is an event\n"); +} + +void requestTests() { + PadStatusDisplay off(PadStatusMode::Off); + off.Request(at(500)); + require(off.Visible(at(500)) && off.Visible(at(4499)), "a request does not show the panel in mode 0"); + require(!off.Visible(at(4500)), "a request in mode 0 stays past 4 seconds"); + off.Request(at(3000)); + require(off.Visible(at(6999)) && !off.Visible(at(7000)), "a second request does not restart the 4 seconds"); + PadStatusDisplay events(PadStatusMode::Events); + events.Observe(at(0), snapshot({pad(PadKind::Xbox, PadPower::Full)})); + events.Request(at(3000)); + require(events.Visible(at(6999)) && !events.Visible(at(7000)), "a request on a panel that is shown does not restart the 4 seconds"); + events.Request(at(20000)); + require(events.Visible(at(20001)) && !events.Visible(at(24000)), "a request after the panel expired does not show it"); + std::printf("pad status: a request shows the panel for 4 s in both modes\n"); +} + +void providerTests() { + std::vector script{snapshot({}), snapshot({pad(PadKind::DualSense, PadPower::Wired)}), snapshot({pad(PadKind::DualSense, PadPower::Wired)}), snapshot({})}; + std::size_t step = 0; + AgcDriver::PadStatusProvider provider{[&] { return script[step]; }}; + PadStatusDisplay display(PadStatusMode::Events); + std::vector shown; + for (step = 0; step < script.size(); ++step) { + display.Observe(at(static_cast(step) * 1000), provider.read()); + shown.push_back(display.Visible(at(static_cast(step) * 1000))); + } + require((shown == std::vector{false, true, true, true}), "the injected provider did not drive the display"); + require(display.Visible(at(6999)) && !display.Visible(at(7000)), "the last event of the script did not set the expiry"); + std::printf("pad status: an injected provider drives the display without SDL\n"); +} + +void lineTests() { + using AgcDriver::FormatPadStatusLine; + require(FormatPadStatusLine(0, pad(PadKind::DualSense, PadPower::Wired)) == "P1 DUALSENSE WIRED", "a wired DualSense line"); + require(FormatPadStatusLine(1, pad(PadKind::Xbox, PadPower::Medium)) == "P2 XBOX BATTERY MEDIUM", "a medium Xbox line"); + require(FormatPadStatusLine(2, PadSlotStatus{}) == "P3 DISCONNECTED", "a disconnected slot line"); + require(FormatPadStatusLine(3, pad(PadKind::Switch, PadPower::Low)) == "P4 SWITCH BATTERY LOW", "a Switch line"); + require(FormatPadStatusLine(0, pad(PadKind::DualShock3, PadPower::Empty)) == "P1 DUALSHOCK 3 BATTERY EMPTY", "a DualShock 3 line"); + require(FormatPadStatusLine(0, pad(PadKind::Unknown, PadPower::Wired)) == "P1 PAD WIRED", "an unknown controller without a name"); + require(FormatPadStatusLine(1, pad(PadKind::Other, PadPower::Full, "")) == "P2 PAD BATTERY FULL", "another controller without a name"); + const std::pair powers[] = { + {PadPower::Unknown, "P1 DUALSHOCK 4 BATTERY UNKNOWN"}, + {PadPower::Empty, "P1 DUALSHOCK 4 BATTERY EMPTY"}, + {PadPower::Low, "P1 DUALSHOCK 4 BATTERY LOW"}, + {PadPower::Medium, "P1 DUALSHOCK 4 BATTERY MEDIUM"}, + {PadPower::Full, "P1 DUALSHOCK 4 BATTERY FULL"}, + {PadPower::Wired, "P1 DUALSHOCK 4 WIRED"}, + }; + for (const auto& [power, expected] : powers) require(FormatPadStatusLine(0, pad(PadKind::DualShock4, power)) == expected, std::string("the line for ") + expected); + std::printf("pad status lines: every power level and kind formats as expected\n"); +} + +void nameTests() { + using AgcDriver::FormatPadStatusLine; + require(FormatPadStatusLine(0, pad(PadKind::Other, PadPower::Full, "8BitDo Ultimate 2C Wireless")) == "P1 8BITDO ULTI. BATTERY FULL", "a long name is not cut to the kind column"); + require(FormatPadStatusLine(0, pad(PadKind::Other, PadPower::Wired, "ABCDEFGHIJKL")) == "P1 ABCDEFGHIJKL WIRED", "a name of exactly 12 characters is cut although it fits"); + require(FormatPadStatusLine(0, pad(PadKind::Other, PadPower::Wired, "ABCDEFGHIJKLM")) == "P1 ABCDEFGHIJK. WIRED", "a name of 13 characters is not cut with a dot"); + require(FormatPadStatusLine(0, pad(PadKind::Other, PadPower::Wired, " Pad (2) ! ")) == "P1 PAD 2 WIRED", "a name is not reduced to the glyphs the font has"); + require(FormatPadStatusLine(0, pad(PadKind::Other, PadPower::Wired, " ")) == "P1 PAD WIRED", "a blank name is not shown as PAD"); + require(FormatPadStatusLine(0, pad(PadKind::Other, PadPower::Wired, "\xc3\xa9\xc3\xa9")) == "P1 PAD WIRED", "a name without a glyph is not shown as PAD"); + require(FormatPadStatusLine(0, pad(PadKind::Xbox, PadPower::Wired, "A very long name that is not shown")) == "P1 XBOX WIRED", "a known kind shows its own label, not the name"); + const PadKind kinds[] = {PadKind::Unknown, PadKind::DualSense, PadKind::DualShock4, PadKind::DualShock3, PadKind::Xbox, PadKind::Switch, PadKind::Other}; + const PadPower levels[] = {PadPower::Unknown, PadPower::Empty, PadPower::Low, PadPower::Medium, PadPower::Full, PadPower::Wired}; + const std::string longName(80, 'w'); + for (const auto kind : kinds) { + for (const auto power : levels) { + for (std::size_t slot = 0; slot < AgcDriver::PadStatusSlots; ++slot) { + const auto line = FormatPadStatusLine(slot, pad(kind, power, longName)); + require(line.size() <= static_cast(AgcDriver::PadStatusMetrics::Columns), "a line is wider than the panel: " + line); + require(AgcDriver::OverlayText(line) == line, "a line has a character the overlay font cannot draw: " + line); + } + } + } + bool refused = false; + try { + FormatPadStatusLine(AgcDriver::PadStatusSlots, PadSlotStatus{}); + } catch (const std::exception&) { + refused = true; + } + require(refused, "a fifth slot is formatted"); + std::printf("pad status lines: long names are cut, every line fits the panel\n"); +} + +void listTests() { + PadStatusDisplay display(PadStatusMode::Off); + require(display.Lines() == std::vector{"NO CONTROLLER"}, "a display that saw nothing does not say so"); + display.Observe(at(0), snapshot({})); + require(display.Lines() == std::vector{"NO CONTROLLER"}, "a display that saw no controller does not say so"); + display.Observe(at(1), snapshot({pad(PadKind::DualSense, PadPower::Wired), pad(PadKind::Xbox, PadPower::Medium)})); + require((display.Lines() == std::vector{"P1 DUALSENSE WIRED", "P2 XBOX BATTERY MEDIUM"}), "two connected controllers are not listed"); + display.Observe(at(2), snapshot({PadSlotStatus{}, pad(PadKind::Xbox, PadPower::Low)})); + require((display.Lines() == std::vector{"P1 DISCONNECTED", "P2 XBOX BATTERY LOW"}), "a slot that lost its controller is not listed as disconnected"); + PadSlotStatus stale; + stale.kind = PadKind::DualSense; + stale.power = PadPower::Full; + display.Observe(at(3), snapshot({stale, pad(PadKind::Xbox, PadPower::Low), PadSlotStatus{}, pad(PadKind::Switch, PadPower::Full)})); + require((display.Lines() == std::vector{"P1 DISCONNECTED", "P2 XBOX BATTERY LOW", "P4 SWITCH BATTERY FULL"}), "a slot that never had a controller is listed"); + PadStatusDisplay first(PadStatusMode::Events); + first.Observe(at(0), snapshot({PadSlotStatus{}, PadSlotStatus{}, stale})); + require(first.Lines() == std::vector{"NO CONTROLLER"}, "stale fields of an unconnected slot are listed"); + std::printf("pad status lines: one line per slot that ever had a controller\n"); +} + +using AgcDriver::OverlayColor; +using AgcDriver::OverlayCorner; +using AgcDriver::OverlayLayout; +using AgcDriver::OverlayRect; + +bool disjoint(const OverlayRect& a, const OverlayRect& b) { + return a.x + a.width <= b.x || b.x + b.width <= a.x || a.y + a.height <= b.y || b.y + b.height <= a.y; +} + +std::size_t glyphRuns(const std::string& line) { + std::size_t runs = 0; + for (const char character : line) { + for (const auto bits : AgcDriver::OverlayGlyph(character)) { + bool inside = false; + for (int x = 0; x < AgcDriver::OverlayMetrics::GlyphWidth; ++x) { + const bool set = (bits & (0x10u >> x)) != 0; + if (set && !inside) ++runs; + inside = set; + } + } + } + return runs; +} + +void layoutTests() { + const std::vector one{"P1 DUALSENSE WIRED"}; + const auto big = AgcDriver::LayOutPadStatus(one, {1920, 1080}, OverlayCorner::TopLeft); + require(big.scale == 2, "the panel is not drawn at scale 2 on 1080 lines"); + require(big.bounds.x == 1518 && big.bounds.y == 8 && big.bounds.width == 394 && big.bounds.height == 26, "the one-line panel is not at the top right of 1920x1080"); + const std::vector four{"P1 DUALSENSE WIRED", "P2 XBOX BATTERY MEDIUM", "P3 DISCONNECTED", "P4 DUALSHOCK 4 BATTERY UNKNOWN"}; + const auto small = AgcDriver::LayOutPadStatus(four, {1280, 720}, OverlayCorner::TopLeft); + require(small.scale == 2, "the panel is not drawn at scale 2 on 720 lines"); + require(small.bounds.x == 1280 - 8 - 394 && small.bounds.y == 8 && small.bounds.width == 394 && small.bounds.height == 80, "the four-line panel is not at the top right of 1280x720"); + const auto bottom = AgcDriver::LayOutPadStatus(four, {1280, 720}, OverlayCorner::TopRight); + require(bottom.bounds.x == 8 && bottom.bounds.y == 8, "the panel does not move to the top left when the overlay is at the top right"); + const auto low = AgcDriver::LayOutPadStatus(four, {1280, 720}, OverlayCorner::BottomLeft); + require(low.bounds.x == 1280 - 8 - 394 && low.bounds.y == 720 - 8 - 80, "the panel does not follow the overlay to the bottom"); + const auto lowRight = AgcDriver::LayOutPadStatus(four, {1280, 720}, OverlayCorner::BottomRight); + require(lowRight.bounds.x == 8 && lowRight.bounds.y == 720 - 8 - 80, "the panel is not at the bottom left when the overlay is at the bottom right"); + const auto tiny = AgcDriver::LayOutPadStatus(one, {640, 360}, OverlayCorner::TopLeft); + require(tiny.scale == 1 && tiny.bounds.width == 197 && tiny.bounds.height == 13, "the panel is not drawn at scale 1 on 360 lines"); + std::printf("pad status layout: panel size and corner on 1920x1080, 1280x720 and 640x360\n"); +} + +void paintTests() { + const std::vector four{"P1 DUALSENSE WIRED", "P2 XBOX BATTERY MEDIUM", "P3 DISCONNECTED", "P4 DUALSHOCK 4 BATTERY UNKNOWN"}; + const auto layout = AgcDriver::LayOutPadStatus(four, {1280, 720}, OverlayCorner::TopLeft); + std::size_t expected = 1; + for (const auto& line : four) expected += glyphRuns(line); + require(layout.rects.size() == expected, "the panel does not draw one rectangle per glyph run plus its background"); + require(layout.rects.front().color == static_cast(OverlayColor::Background) && layout.rects.front().x == layout.bounds.x, "the first rectangle is not the background"); + for (std::size_t index = 1; index < layout.rects.size(); ++index) { + const auto& rect = layout.rects[index]; + require(rect.color == static_cast(OverlayColor::Text), "a glyph is not drawn in the text colour"); + require(rect.x >= layout.bounds.x && rect.y >= layout.bounds.y && rect.x + rect.width <= layout.bounds.x + layout.bounds.width && rect.y + rect.height <= layout.bounds.y + layout.bounds.height, "a glyph lies outside the panel"); + } + const auto widest = AgcDriver::LayOutPadStatus({std::string(AgcDriver::PadStatusMetrics::Columns, 'W')}, {1280, 720}, OverlayCorner::TopLeft); + std::int32_t right = 0; + for (const auto& rect : widest.rects) right = std::max(right, rect.x + rect.width); + require(right <= widest.bounds.x + widest.bounds.width, "a full-width line leaves the panel"); + bool refused = false; + try { + AgcDriver::LayOutPadStatus({std::string(AgcDriver::PadStatusMetrics::Columns + 1, 'W')}, {1280, 720}, OverlayCorner::TopLeft); + } catch (const std::exception&) { + refused = true; + } + require(refused, "a line wider than the panel is laid out"); + refused = false; + try { + AgcDriver::LayOutPadStatus({}, {1280, 720}, OverlayCorner::TopLeft); + } catch (const std::exception&) { + refused = true; + } + require(refused, "a panel without lines is laid out"); + std::printf("pad status layout: one rectangle per glyph run, all inside the panel\n"); +} + +void cornerTests() { + require(AgcDriver::PadStatusCorner(OverlayCorner::TopLeft) == OverlayCorner::TopRight, "top left does not mirror to top right"); + require(AgcDriver::PadStatusCorner(OverlayCorner::TopRight) == OverlayCorner::TopLeft, "top right does not mirror to top left"); + require(AgcDriver::PadStatusCorner(OverlayCorner::BottomLeft) == OverlayCorner::BottomRight, "bottom left does not mirror to bottom right"); + require(AgcDriver::PadStatusCorner(OverlayCorner::BottomRight) == OverlayCorner::BottomLeft, "bottom right does not mirror to bottom left"); + const std::vector four{"P1 DUALSENSE WIRED", "P2 XBOX BATTERY MEDIUM", "P3 DISCONNECTED", "P4 DUALSHOCK 4 BATTERY UNKNOWN"}; + const AgcDriver::OverlayStatistics statistics; + const auto first = AgcDriver::ComposeOverlay(statistics, true, true); + const auto second = AgcDriver::ComposeOverlayDetails(AgcDriver::OverlayDetailSample{}); + for (const VkExtent2D extent : {VkExtent2D{640, 360}, VkExtent2D{1280, 720}, VkExtent2D{1366, 768}, VkExtent2D{1920, 1080}, VkExtent2D{3840, 2160}}) { + for (const auto corner : {OverlayCorner::TopLeft, OverlayCorner::TopRight, OverlayCorner::BottomLeft, OverlayCorner::BottomRight}) { + const auto panel = AgcDriver::LayOutPadStatus(four, extent, corner); + for (const auto* page : {&first, &second}) { + const auto overlay = AgcDriver::LayOutOverlay(*page, extent, corner); + require(disjoint(panel.bounds, overlay.bounds), "the panel covers the performance overlay"); + } + } + } + std::printf("pad status layout: never covers the performance overlay, in any corner or page\n"); +} + +void priorityTests() { + require(AgcDriver::PadStatusDrawn(true, false), "a visible panel is not drawn without the keyboard"); + require(!AgcDriver::PadStatusDrawn(true, true), "the panel is drawn over the system keyboard"); + require(!AgcDriver::PadStatusDrawn(false, false), "a hidden panel is drawn"); + require(!AgcDriver::PadStatusDrawn(false, true), "a hidden panel is drawn with the keyboard"); + PadStatusDisplay display(PadStatusMode::Events); + display.Observe(at(0), snapshot({pad(PadKind::Xbox, PadPower::Full)})); + require(AgcDriver::PadStatusDrawn(display.Visible(at(1000)), false), "the panel is not drawn before the keyboard opens"); + require(!AgcDriver::PadStatusDrawn(display.Visible(at(2000)), true), "the panel is drawn while the keyboard is open"); + require(AgcDriver::PadStatusDrawn(display.Visible(at(3000)), false), "the panel does not come back when the keyboard closes within its 4 seconds"); + require(!AgcDriver::PadStatusDrawn(display.Visible(at(5000)), false), "the panel waited for the keyboard past its 4 seconds"); + std::printf("pad status priority: the system keyboard wins, the panel's clock keeps running\n"); +} + +void sharedDisplayTests(bool events) { + require(!AgcDriver::PadStatusOverlayLines().has_value(), "the panel is shown before anything happened"); + std::size_t reads = 0; + const auto connected = snapshot({pad(PadKind::DualSense, PadPower::Wired)}); + const AgcDriver::PadStatusProvider provider{[&] { + ++reads; + return connected; + }}; + AgcDriverPadStatusPoll_nid_postfix(&provider); + require((reads == 1) == events && (reads == 0) == !events, events ? "the events mode did not read the provider" : "the provider was read with ANYPS5_PAD_STATUS unset and no request"); + require(AgcDriver::PadStatusOverlayLines().has_value() == events, events ? "a connect does not show the panel with ANYPS5_PAD_STATUS=1" : "a connect shows the panel with ANYPS5_PAD_STATUS unset"); + AgcDriverPadStatusShow_nid_postfix(); + AgcDriverPadStatusPoll_nid_postfix(&provider); + require(reads == (events ? 2u : 1u), "a request did not make the next poll read the provider once"); + const auto lines = AgcDriver::PadStatusOverlayLines(); + require(lines.has_value() && *lines == std::vector{"P1 DUALSENSE WIRED"}, "the shown panel does not list the controller"); + std::printf("pad status: the shared display %s\n", events ? "shows on a connect and on a request" : "reads and shows only after a request"); +} + +void invalidEnvironmentTests() { + const auto connected = snapshot({pad(PadKind::DualSense, PadPower::Wired)}); + const AgcDriver::PadStatusProvider provider{[&] { return connected; }}; + try { + AgcDriverPadStatusPoll_nid_postfix(&provider); + } catch (const std::runtime_error& error) { + require(std::string(error.what()).find("ANYPS5_PAD_STATUS") != std::string::npos, "the invalid value is refused without naming the variable"); + std::printf("pad status: an invalid ANYPS5_PAD_STATUS stops the first use: %s\n", error.what()); + return; + } + throw std::runtime_error("an invalid ANYPS5_PAD_STATUS was accepted at first use"); +} + +struct CountingProvider { + std::vector script; + std::size_t reads = 0; + std::size_t at = 0; + AgcDriver::PadStatusProvider provider() { + return {[this] { + ++reads; + return script[std::min(at, script.size() - 1)]; + }}; + } +}; + +void pollTests() { + CountingProvider off; + off.script = {snapshot({pad(PadKind::DualSense, PadPower::Wired)})}; + PadStatusDisplay hidden(PadStatusMode::Off); + const auto offProvider = off.provider(); + for (int step = 0; step < 500; ++step) require(!hidden.Poll(at(step * 16), offProvider) && !hidden.Visible(at(step * 16)), "the mode 0 display read a snapshot or showed the panel"); + require(off.reads == 0, "the provider was called with the mode off and no request"); + hidden.Request(at(10000)); + require(hidden.Poll(at(10000), offProvider) && off.reads == 1, "a request does not make the display read the provider"); + require(hidden.Visible(at(13999)) && !hidden.Visible(at(14000)), "the requested panel does not last 4 seconds"); + require((hidden.Lines() == std::vector{"P1 DUALSENSE WIRED"}), "the requested panel does not list the controller"); + off.script = {snapshot({pad(PadKind::DualSense, PadPower::Wired)}), snapshot({pad(PadKind::DualSense, PadPower::Low)})}; + off.at = 1; + require(hidden.Poll(at(12000), offProvider) && off.reads == 2, "a shown panel stops following the controller"); + require((hidden.Lines() == std::vector{"P1 DUALSENSE BATTERY LOW"}), "a shown panel does not follow a battery change"); + require(!hidden.Poll(at(14000), offProvider) && off.reads == 2, "an expired panel still reads the provider"); + off.at = 0; + hidden.Request(at(20000)); + require(hidden.Poll(at(20000), offProvider) && off.reads == 3 && hidden.Visible(at(23999)) && !hidden.Visible(at(24000)), "a second request does not behave like the first"); + require((hidden.Lines() == std::vector{"P1 DUALSENSE WIRED"}), "a second request shows a stale snapshot"); + + CountingProvider on; + on.script = {snapshot({}), snapshot({pad(PadKind::Xbox, PadPower::Full)}), snapshot({pad(PadKind::Xbox, PadPower::Full)}), snapshot({})}; + PadStatusDisplay events(PadStatusMode::Events); + PadStatusDisplay direct(PadStatusMode::Events); + const auto onProvider = on.provider(); + for (std::size_t step = 0; step < on.script.size(); ++step) { + on.at = step; + const int time = static_cast(step) * 1000; + require(events.Poll(at(time), onProvider), "the events mode did not read the provider"); + direct.Observe(at(time), on.script[step]); + for (const int offset : {0, 1, 999, 3999, 4000, 4001}) + require(events.Visible(at(time + offset)) == direct.Visible(at(time + offset)), "polling shows the panel at other times than observing"); + } + require(on.reads == 4, "the events mode did not read the provider on every poll"); + require(events.Lines() == direct.Lines(), "polling lists other lines than observing"); + std::printf("pad status: the snapshot is read only in the events mode or while a request keeps the panel shown\n"); +} + +} + +int main(int argc, char** argv) try { + const std::string mode = argc > 1 ? argv[1] : ""; + if (mode == "invalid") { + invalidEnvironmentTests(); + return 0; + } + if (mode == "events" || mode == "default") { + sharedDisplayTests(mode == "events"); + std::printf("pad status shared display tests passed\n"); + return 0; + } + modeTests(); + hiddenByDefaultTests(); + expiryTests(); + initialConnectTests(); + extensionTests(); + batteryTests(); + replacementTests(); + requestTests(); + providerTests(); + lineTests(); + nameTests(); + listTests(); + layoutTests(); + paintTests(); + cornerTests(); + priorityTests(); + pollTests(); + std::printf("pad status overlay tests passed\n"); + return 0; +} catch (const std::exception& error) { + std::cerr << error.what() << '\n'; + return 1; +} diff --git a/core/libs/prx/libSceAgcDriver/tests/Pm4Replay.cpp b/core/libs/prx/libSceAgcDriver/tests/Pm4Replay.cpp index 7359bc4598fc..79004b096d17 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 d83cc6d08a55..fd907a10406f 100644 --- a/core/libs/prx/libSceAgcDriver/tests/Recorder.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/Recorder.cpp @@ -31,8 +31,10 @@ #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" #include "HostImportLifetime.hpp" #include "ShaderCacheDirectory.hpp" #include "SampleLod_spv.h" @@ -253,6 +255,113 @@ bool hintMappingHistoryTests() { #endif } +bool hintPartialBlockStoreTests() { +#ifdef _WIN32 + constexpr std::size_t bytes = 131072; + constexpr std::size_t page = 4096; + auto* memory = static_cast(AllocateWatched(bytes, 65536)); + if (memory == nullptr) return false; + GuestAllocations::Mutation().Add(memory, bytes, true, true, false); + struct Cleanup { + std::uint8_t* memory; + ~Cleanup() { + GuestAllocations::Mutation().Remove(memory); + ReleaseWatched(memory, bytes); + } + } cleanup{memory}; + const auto address = reinterpret_cast(memory); + std::memset(memory, 0x11, bytes); + AgcDriver::GuestMemory::BumpCollectEpoch(); + const auto before = AgcDriver::GuestMemory::CollectWrites(address + 8 * page, page); + Require(before != 0, "the watched page has no collected write history"); + AgcDriver::GuestMemory::Unwatch(address, 6 * page); + Require(!AgcDriver::GuestMemory::Watched(address, 6 * page) && AgcDriver::GuestMemory::Watched(address + 6 * page, 10 * page), "the partial-block import did not exclude only its own pages"); + memory[8 * page] = 0x22; + AgcDriver::GuestMemory::BumpCollectEpoch(); + Require(AgcDriver::GuestMemory::UntrackedHint(address + 4 * page, 6 * page) != 0, "a range across the import's end has no untracked hint"); + Require(AgcDriver::GuestMemory::CollectWrites(address + 8 * page, page) != 0, "the watched page past the import stopped collecting CPU writes"); + Require(!AgcDriver::GuestMemory::UnchangedSince(address + 8 * page, page, before), "a hint walk across a partial-block import consumed a CPU store to a watched page"); + Require(memory[8 * page] == 0x22, "the hint walk changed guest bytes"); + return true; +#else + return false; +#endif +} + +bool sharedBlockRewatchTests() { +#ifdef _WIN32 + constexpr std::size_t bytes = 131072; + constexpr std::size_t page = 4096; + auto* memory = static_cast(AllocateWatched(bytes, 65536)); + if (memory == nullptr) return false; + GuestAllocations::Mutation().Add(memory, bytes, true, true, false); + struct Cleanup { + std::uint8_t* memory; + ~Cleanup() { + GuestAllocations::Mutation().Remove(memory); + ReleaseWatched(memory, bytes); + } + } cleanup{memory}; + const auto address = reinterpret_cast(memory); + std::memset(memory, 0x11, bytes); + AgcDriver::GuestMemory::BumpCollectEpoch(); + AgcDriver::GuestMemory::Unwatch(address, 6 * page); + AgcDriver::GuestMemory::Unwatch(address + 8 * page, 4 * page); + Require(!AgcDriver::GuestMemory::Watched(address, 6 * page) && !AgcDriver::GuestMemory::Watched(address + 8 * page, 4 * page), "two imports in one block were not both excluded"); + Require(AgcDriver::GuestMemory::Watched(address + 6 * page, 2 * page) && AgcDriver::GuestMemory::Watched(address + 12 * page, 4 * page), "two imports in one block excluded pages outside both"); + const auto before = AgcDriver::GuestMemory::CollectWrites(address + 6 * page, page); + Require(before != 0, "the page between the imports has no collected write history"); + const std::array, 1> first{{{address, address + 6 * page}}}; + AgcDriver::GuestMemory::Rewatch(first); + Require(AgcDriver::GuestMemory::Watched(address, 8 * page), "settling the first import did not return its pages to the write watch"); + for (std::size_t index = 8; index < 12; ++index) Require(!AgcDriver::GuestMemory::Watched(address + index * page, page), "settling the first import returned a page of the second import in its block to the write watch"); + Require(!AgcDriver::GuestMemory::Watched(address, 16 * page), "settling one import proved its whole shared block watched"); + memory[6 * page] = 0x22; + AgcDriver::GuestMemory::BumpCollectEpoch(); + Require(AgcDriver::GuestMemory::CollectWrites(address + 6 * page, page) != 0 && !AgcDriver::GuestMemory::UnchangedSince(address + 6 * page, page, before), "a CPU store between the imports was lost after the first import settled"); + const std::array, 1> second{{{address + 8 * page, address + 12 * page}}}; + AgcDriver::GuestMemory::Rewatch(second); + Require(AgcDriver::GuestMemory::Watched(address, 16 * page), "settling both imports did not return their shared block to the write watch"); + Require(memory[6 * page] == 0x22, "rewatching changed guest bytes"); + return true; +#else + return false; +#endif +} + +bool interiorWatchedDriverWriteTests(bool complete) { +#ifdef _WIN32 + constexpr std::size_t bytes = 131072; + constexpr std::size_t page = 4096; + auto* memory = static_cast(AllocateWatched(bytes, 65536)); + if (memory == nullptr) return false; + GuestAllocations::Mutation().Add(memory, bytes, true, true, false); + struct Cleanup { + std::uint8_t* memory; + ~Cleanup() { + GuestAllocations::Mutation().Remove(memory); + ReleaseWatched(memory, bytes); + } + } cleanup{memory}; + const auto address = reinterpret_cast(memory); + std::memset(memory, 0x11, bytes); + AgcDriver::GuestMemory::BumpCollectEpoch(); + AgcDriver::GuestMemory::Unwatch(address, 6 * page); + AgcDriver::GuestMemory::Unwatch(address + 12 * page, 4 * page); + Require(!AgcDriver::GuestMemory::Watched(address, 6 * page) && !AgcDriver::GuestMemory::Watched(address + 12 * page, 4 * page), "both ends of the block were not excluded"); + Require(AgcDriver::GuestMemory::Watched(address + 6 * page, 6 * page), "the pages between the excluded ends are not watched"); + const auto before = AgcDriver::GuestMemory::CollectWrites(address + 8 * page, page); + Require(before != 0, "the watched interior page has no collected write history"); + if (complete) AgcDriver::GuestMemory::MarkWritten(address, 16 * page); + else AgcDriver::GuestMemory::MarkPossiblyWritten(address, 16 * page); + Require(!AgcDriver::GuestMemory::UnchangedSince(address + 8 * page, page, before), complete ? "a complete driver write across a block with both ends excluded was not recorded on its watched interior page" : "a possible driver write across a block with both ends excluded was not recorded on its watched interior page"); + return true; +#else + (void)complete; + return false; +#endif +} + void gpuTimingKeyTests() { constexpr std::uint64_t variant = 0x2; const auto key = Recorder::DrawTimingKey(variant); @@ -303,6 +412,8 @@ class Device { explicit Device(bool settleOnOtherFamily = false) { #ifdef _WIN32 library = SDL_LoadObject("vulkan-1.dll"); +#elif defined(__APPLE__) + library = SDL_LoadObject("libvulkan.1.dylib"); #else library = SDL_LoadObject("libvulkan.so.1"); #endif @@ -314,6 +425,12 @@ class Device { application.apiVersion = VK_API_VERSION_1_1; VkInstanceCreateInfo info{VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO}; info.pApplicationInfo = &application; +#ifdef __APPLE__ + const char* portability = VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME; + info.flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; + info.enabledExtensionCount = 1; + info.ppEnabledExtensionNames = &portability; +#endif Check(function("vkCreateInstance")(&info, nullptr, &instance), "vkCreateInstance"); std::uint32_t count = 0; const auto enumerate = function("vkEnumeratePhysicalDevices"); @@ -1304,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)); @@ -2764,7 +2881,8 @@ bool settleInitialDccTests(const Device& device) { gpu.lock(); HostImportFor(context, address, importBytes); } - Require(!Watched(address, importBytes), "(m) a deferred settle returned an import that is not a whole number of 64 KiB blocks to the write watch"); + if (kind == Case::PartialBlock) Require(Watched(address, importBytes), "(m) a deferred settle did not return an import of whole and partial 64 KiB blocks to the write watch" + describe(ExistingHostImportFor(context, address, importBytes), address, importBytes)); + else Require(!Watched(address, importBytes), "(m) a deferred settle returned an import that shares its last 64 KiB block with a compared import to the write watch"); } const auto before = HostImportSettles(); Require(!fmaskAlone || before.submitted == quiet.submitted, "(m) a settle read was submitted between the FMASK's import and the target's first use"); @@ -2786,7 +2904,8 @@ bool settleInitialDccTests(const Device& device) { } Require(refusal.empty(), std::string("(m) an initial multisampled DCC import over ") + name + " was refused: " + refusal); Require(!fmaskAlone || (after.submitted - before.submitted == 1 && after.rewatched - before.rewatched == 1), "(m) the first use over a pending FMASK settle alone submitted " + std::to_string(after.submitted - before.submitted) + " settle reads, not the FMASK's alone"); - Require(after.submitted > before.submitted && after.rewatched > before.rewatched && Watched(address, importBytes) && settled != nullptr && !settled->unwatched, std::string("(m) the initial DCC import over ") + name + " did not settle the import and return it to the write watch"); + const bool settledBefore = kind == Case::PartialBlock; + Require((settledBefore ? after.submitted == before.submitted : after.submitted > before.submitted && after.rewatched > before.rewatched) && Watched(address, importBytes) && settled != nullptr && !settled->unwatched, std::string("(m) the initial DCC import over ") + name + " did not settle the import and return it to the write watch"); if (fmask != nullptr) { const auto* settledFmask = ExistingHostImportFor(context, target.fmaskAddress, fmaskBytes); Require(Watched(target.fmaskAddress, fmaskBytes) && settledFmask != nullptr && !settledFmask->unwatched, "(m) the FMASK's import did not settle back into the write watch" + describe(settledFmask, target.fmaskAddress, fmaskBytes)); @@ -6688,6 +6807,9 @@ void writeBackPaddingTests(const Device& device, Recorder& recorder, bool watche {"64 KiB R_X 200x150 off a 64 KiB boundary, 3 mips", TextureTileMode::kR64KBX, 200, 150, 3, 4096}, {"4 KiB S 100x70, 2 mips", TextureTileMode::kStandard4KB, 100, 70, 2, 0}, {"linear 200x150", TextureTileMode::kLinear, 200, 150, 1, 0}, + {"linear 240x135, 2 mips", TextureTileMode::kLinear, 240, 135, 2, 0}, + {"linear 1000x700", TextureTileMode::kLinear, 1000, 700, 1, 0}, + {"linear 1900x1100, 2 mips", TextureTileMode::kLinear, 1900, 1100, 2, 0}, {"64 KiB R_X 512x512, 3 mips, no padding below the tail", TextureTileMode::kR64KBX, 512, 512, 3, 0, true}, {"64 KiB R_X 1000x700", TextureTileMode::kR64KBX, 1000, 700, 1, 0, true}, {"64 KiB R_X 1900x1100, across two 8 MiB slabs", TextureTileMode::kR64KBX, 1900, 1100, 1, 0, true}, @@ -6773,12 +6895,15 @@ void writeBackPaddingTests(const Device& device, Recorder& recorder, bool watche RecordMemoryBarrier(context, commands, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT); image->MarkDirty(); const auto slabRetilesBefore = StorageTexture::SlabRetiles(); + const auto paddingSeedsBefore = StorageTexture::PaddingSeedCopies(); image->WriteBack(); recorder.Submit(); device.WaitQueue(); recorder.Sync(); const auto slabRetiled = StorageTexture::SlabRetiles() - slabRetilesBefore; if (test.direct && watched && UnitShadowEnabled() && AgcDriver::GuestMemory::Watched(address, surfaceBytes) && slabRetiled == 0) failures += what + ": no window was retiled straight into its unit-shadow slab\n"; + const auto paddingSeeded = StorageTexture::PaddingSeedCopies() - paddingSeedsBefore; + if (test.tileMode == TextureTileMode::kLinear && watched && AgcDriver::GuestMemory::Watched(address, surfaceBytes) && paddingSeeded != 0) failures += what + ": the write-back copied " + std::to_string(paddingSeeded) + " pieces of row padding from the import through its scratch\n"; std::vector read(bytes); if (watched) AgcDriver::GuestMemory::Read(blockAddress, read); else std::memcpy(read.data(), memory, bytes); @@ -7265,6 +7390,62 @@ void singlePassTests(const Device& device, Recorder& recorder, bool watched) { std::cout << "single-pass storage moves" << (watched ? " (watched)" : "") << ": ok (" << tested << " surfaces)\n"; } +class CommandBufferProbe { +public: + explicit CommandBufferProbe(Context& context) : context(context), resolver(context.deviceProc) { + Require(active == nullptr, "nested command buffer probe"); + active = this; + context.deviceProc = resolve; + } + ~CommandBufferProbe() { + context.deviceProc = resolver; + active = nullptr; + } + CommandBufferProbe(const CommandBufferProbe&) = delete; + CommandBufferProbe& operator=(const CommandBufferProbe&) = delete; + std::uint32_t Allocated() const { return allocated; } + std::uint32_t Freed() const { return freed; } + +private: + static VKAPI_ATTR VkResult VKAPI_CALL allocateBuffers(VkDevice device, const VkCommandBufferAllocateInfo* info, VkCommandBuffer* buffers) { + const auto result = reinterpret_cast(active->resolver(device, "vkAllocateCommandBuffers"))(device, info, buffers); + if (result == VK_SUCCESS) active->allocated += info->commandBufferCount; + return result; + } + static VKAPI_ATTR void VKAPI_CALL freeBuffers(VkDevice device, VkCommandPool pool, std::uint32_t count, const VkCommandBuffer* buffers) { + active->freed += count; + reinterpret_cast(active->resolver(device, "vkFreeCommandBuffers"))(device, pool, count, buffers); + } + static VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL resolve(VkDevice device, const char* name) { + if (std::strcmp(name, "vkAllocateCommandBuffers") == 0) return reinterpret_cast(allocateBuffers); + if (std::strcmp(name, "vkFreeCommandBuffers") == 0) return reinterpret_cast(freeBuffers); + return active->resolver(device, name); + } + Context& context; + PFN_vkGetDeviceProcAddr resolver; + std::uint32_t allocated = 0; + std::uint32_t freed = 0; + static inline CommandBufferProbe* active = nullptr; +}; + +void commandBufferReleaseTests(const Device& device, Recorder& previous) { + auto context = device.GetContext(); + previous.Sync(); + CommandBufferProbe probe(context); + { + Recorder recorder(context); + recorder.Activate(); + for (std::uint32_t batch = 1; batch <= 3; ++batch) { + Require(recorder.Commands() != VK_NULL_HANDLE, "command buffer release: no batch opened"); + recorder.Submit(); + recorder.Sync(); + Require(recorder.Idle() && probe.Allocated() == batch && probe.Freed() == batch, "command buffer release: after " + std::to_string(batch) + " completed batches " + std::to_string(probe.Allocated()) + " command buffers were allocated and " + std::to_string(probe.Freed()) + " freed (a completed batch kept its command buffer)"); + } + } + previous.Activate(); + std::cout << "Command buffer release tests passed\n"; +} + class StorageUploadProbe { public: StorageUploadProbe(Context& context, bool failView) : context(context), resolver(context.deviceProc), failView(failView) { @@ -9165,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"); @@ -11125,6 +11307,40 @@ int pipelineCacheFileTests(const Device& device) { PipelineCache reloaded(context, properties); Require(holds(reloaded.Handle(), 1), "an invalid cache file was not replaced by the saving object's pipelines"); } + { + PipelineCache restoring(context, properties); + Require(holds(restoring.Handle(), 1), "the valid cache file lost a pipeline"); + { + std::ofstream corrupt(path, std::ios::binary | std::ios::trunc); + corrupt << "corrupted pipeline cache header with 24 bytes"; + } + PipelineCache invalidHeader(context, properties, false); + Require(!PipelineCacheTestAccess::HasHeader(invalidHeader), "an invalid cache header was accepted as present"); + restoring.SaveNow(); + } + { + PipelineCache reloaded(context, properties); + Require(holds(reloaded.Handle(), 1), "an invalid cache header was not replaced by the unchanged cache object"); + } + { +#ifdef _WIN32 + _putenv_s("ANYPS5_NO_SHADER_CACHE", "1"); +#else + setenv("ANYPS5_NO_SHADER_CACHE", "1", 1); +#endif + PipelineCache emptyPath(context, properties); + build(emptyPath.Handle(), 0); + StderrCapture capture; + emptyPath.SaveNow(); + const auto output = capture.Finish(); + Require(output.find("cannot write") == std::string::npos, "an empty cache path attempted to write to disk"); + Require(holds(emptyPath.Handle(), 0), "an empty cache path failed to retain in-memory pipelines"); +#ifdef _WIN32 + _putenv_s("ANYPS5_NO_SHADER_CACHE", "0"); +#else + setenv("ANYPS5_NO_SHADER_CACHE", "0", 1); +#endif + } { PipelineCache busy(context, properties); build(busy.Handle(), 0); @@ -11524,11 +11740,11 @@ bool clearHandOverTests(const Device& device, Recorder& recorder, bool watched) return true; } -void denormalClearTests(const Device& device, Recorder& recorder) { +bool denormalClearTests(const Device& device, Recorder& recorder) { const auto& base = device.GetContext(); if (base.hostImportAlignment == 0) { std::cout << "host imports unavailable: denormal fill clears not tested\n"; - return; + return false; } constexpr std::uint32_t side = 64; constexpr std::size_t bytes = 65536; @@ -11558,7 +11774,7 @@ void denormalClearTests(const Device& device, Recorder& recorder) { } unregister{base, block, address}; if (HostImportFor(base, address, bytes) == nullptr) { std::cout << "host import of the denormal clear block refused: denormal fill clears not tested\n"; - return; + return false; } TextureDetiler detiler(base); auto context = base; @@ -11614,8 +11830,17 @@ void denormalClearTests(const Device& device, Recorder& recorder) { const std::array nan{0x7e007e00u, 0x7e007e00u, 0x7e007e00u, 0x7e007e00u}; refusal = nullptr; Require(!image->FillClear(nan, StorageTexture::WholeImage, refusal), "a NaN half pattern was cleared"); + resource.format = static_cast(ShaderRecompiler::IrBufferFormat::Format11_11_10Float); + image = StorageTexture::Create(context, detiler, resource, 0); + for (const auto texel : {0x01234567u, 0xffffffffu}) { + const std::array pattern{texel, texel, texel, texel}; + refusal = nullptr; + Require(image->FillClear(pattern, StorageTexture::WholeImage, refusal), "a packed-float bit pattern was refused"); + Require(holds(texel), "a packed-float fill clear stored other bits"); + } } recorder.Sync(); + return true; } class LibraryCreateFlags { @@ -12003,6 +12228,23 @@ int main(int argc, char** argv) { std::cout << "hint mapping history tests passed\n"; return 0; } + if (argc == 2 && std::string_view(argv[1]) == "--hint-partial-block-store-only") { + if (!hintPartialBlockStoreTests()) return 77; + std::cout << "hint partial-block store tests passed\n"; + return 0; + } + if (argc == 2 && std::string_view(argv[1]) == "--shared-block-rewatch-only") { + if (!sharedBlockRewatchTests()) return 77; + std::cout << "shared-block rewatch tests passed\n"; + return 0; + } + if (argc == 3 && std::string_view(argv[1]) == "--interior-watched-driver-write-only") { + const std::string_view kind = argv[2]; + if (kind != "complete" && kind != "possible") return 2; + if (!interiorWatchedDriverWriteTests(kind == "complete")) return 77; + std::cout << "interior watched driver write tests passed\n"; + return 0; + } if (argc == 2 && std::string_view(argv[1]) == "--partial-watch-restoration-only") { if (!partialWatchRestorationTests()) return 77; std::cout << "partial private write-watch restoration tests passed\n"; @@ -12219,6 +12461,9 @@ int main(int argc, char** argv) { } return 0; } + if (argc == 2 && std::string_view(argv[1]) == "--typed-fill-clear-only") { + return denormalClearTests(device, recorder) ? 0 : 77; + } if (argc == 2 && std::string_view(argv[1]) == "--integer-clear-only") { integerClearTests(device); return 0; @@ -12227,6 +12472,10 @@ int main(int argc, char** argv) { settledBaselineTests(device, recorder); return 0; } + if (argc == 2 && std::string_view(argv[1]) == "--command-buffer-release-only") { + commandBufferReleaseTests(device, recorder); + return 0; + } if (argc == 2 && std::string_view(argv[1]) == "--completion-labels-only") { completionCountTests(device, recorder); afterRecordedWorkTests(device, recorder); diff --git a/core/libs/prx/libSceAgcDriver/tests/RedundantValueElimination.cpp b/core/libs/prx/libSceAgcDriver/tests/RedundantValueElimination.cpp index 202aa559ae2b..9b2ebbd8a9b4 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 74d98eae7f2a..280a642b9aa3 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() { @@ -5841,6 +6214,85 @@ void verifySingleLaneVertexWave() { require(withoutKey != withKey, "single-lane vertex wave: vertex subgroup support did not change the cache key"); } +void verifySingleLaneElectedAtomicMax() { + using namespace ShaderRecompiler; + static constexpr std::array capabilities{spv::CapabilityGroupNonUniform, spv::CapabilityGroupNonUniformBallot, spv::CapabilityGroupNonUniformShuffle, spv::CapabilityGroupNonUniformArithmetic, spv::CapabilityGroupNonUniformShuffleRelative, spv::CapabilityClipDistance, spv::CapabilityInt64}; + static const std::vector userData{0x10000u, 0u, 0x100u, 0x31016facu, 0x20000u, 0x100000u, 0x1000u, 0x31016facu}; + const auto compiled = [](std::span code, bool vertexSubgroups) { + RecompileRequest request{}; + request.shader = {ShaderStage::Vertex, 0x5c000u, code, 0, {}}; + request.context.waveSize = 64; + request.context.userDataBaseRegister = 8; + request.context.userData = userData; + request.context.vertex = ShaderVertexStageInfo{}; + request.target.vulkanVersion = 0x00401000u; + request.target.spirvVersion = 0x00010300u; + request.target.subgroupSize = 32u; + request.target.supportedCapabilities = capabilities; + request.target.vertexSubgroups = vertexSubgroups; + request.target.bdaAbiVersion = BdaAbi::Version; + request.layout.pushConstantSizeBytes = 128; + request.useCache = false; + return Recompile(request).spirv.Copy(); + }; + const auto usesSubgroups = [](std::span spirv) { + for (std::size_t cursor = 5; cursor < spirv.size() && (spirv[cursor] >> 16u) != 0u; cursor += spirv[cursor] >> 16u) { + const auto op = spirv[cursor] & 0xffffu; + if (op >= spv::OpGroupNonUniformElect && op <= spv::OpGroupNonUniformQuadSwap) return true; + } + return false; + }; + static constexpr std::array elected{ + 0xe00c2000u, 0x80030005u, 0xbf8c3f70u, 0x7e0c0d05u, 0xd5088006u, 0x02020cffu, 0x3d000000u, 0xbe94047eu, 0xbe9625c1u, 0x7e1402ffu, + 0xff800000u, 0xd501000au, 0x00520d0au, 0x201414fau, 0xff01110au, 0x201414fau, 0xff01120au, 0x201414fau, 0xff01140au, 0x201414fau, + 0xff01180au, 0xd7780009u, 0x0305830au, 0x2014130au, 0xbefe0416u, 0xd7600018u, 0x02013f0au, 0xd7600019u, 0x02017f0au, 0xd5100008u, + 0x02003218u, 0x7c240d08u, 0xbf880002u, 0xe0e00000u, 0x80020800u, 0xbefe0414u, 0xf80008cfu, 0x03020100u, 0xf800020fu, 0x00000000u, + 0xbf810000u, + }; + const auto variant = [](std::initializer_list> words) { + std::vector code(elected.begin(), elected.end()); + for (const auto& [index, word] : words) code[index] = word; + return code; + }; + auto maskedAddress = variant({{32u, 0xbf880003u}, {33u, 0xe0e01000u}, {34u, 0x80020809u}}); + maskedAddress.insert(maskedAddress.begin() + 33, 0x7e120280u); + auto unbranched = variant({}); + unbranched.erase(unbranched.begin() + 32); + auto electedWrite = variant({{32u, 0xbf880003u}, {39u, 0x00000007u}}); + electedWrite.insert(electedWrite.begin() + 33, 0x7e0e02f2u); + auto laneAddress = maskedAddress; + laneAddress[33] = 0x7e120305u; + auto negativeZero = variant({{4u, 0x7e0c02ffu}, {5u, 0x80000000u}}); + negativeZero.erase(negativeZero.begin() + 6); + const std::array>, 4> accepted{{ + {"buffer_atomic_umax", variant({})}, + {"buffer_atomic_smax", variant({{33u, 0xe0dc0000u}})}, + {"an address the permutation register keeps only in lanes without the atomic", maskedAddress}, + {"an atomic without s_cbranch_execz", unbranched}, + }}; + for (const auto& [name, code] : accepted) { + const auto spirv = compiled(code, false); + require(!spirv.empty() && !usesSubgroups(spirv), (std::string("single-lane elected atomic max: ") + name + " did not build without subgroup operations").c_str()); + } + require(usesSubgroups(compiled(elected, true)), "single-lane elected atomic max: the reduction left subgroup operations with vertex subgroups"); + const std::array>, 11> rejected{{ + {"keys without a clamp", variant({{4u, 0xd5080006u}})}, + {"an atomic whose result is read", variant({{33u, 0xe0e04000u}, {39u, 0x08080808u}})}, + {"a maximum exported beside the atomic", variant({{39u, 0x00000008u}})}, + {"buffer_atomic_add", variant({{33u, 0xe0c80000u}})}, + {"a comparison against another value", variant({{31u, 0x7c240308u}})}, + {"an atomic addressed by the permutation", variant({{33u, 0xe0e01000u}, {34u, 0x80020809u}})}, + {"a register written for the elected lanes and exported", electedWrite}, + {"an atomic indexed by the vertex", variant({{33u, 0xe0e02000u}, {34u, 0x80020805u}})}, + {"an address the elected lanes take from the vertex", laneAddress}, + {"a key of -0", negativeZero}, + {"a maximum written under EXEC -1", variant({{24u, 0xd7600018u}, {25u, 0x02013f0au}, {26u, 0xd7600019u}, {27u, 0x02017f0au}, {28u, 0xd5100008u}, {29u, 0x02003218u}, {30u, 0xbefe0416u}})}, + }}; + for (const auto& [name, code] : rejected) { + expectFailure([&] { static_cast(compiled(code, false)); }, "v_permlanex16_b32 from lanes 16-31 is outside the 1-lane host subgroup", (std::string("single-lane elected atomic max: ") + name + " was accepted").c_str()); + } +} + void verifyMeshConfiguration() { using namespace ShaderRecompiler; ShaderMeshInputInfo list; @@ -6197,7 +6649,7 @@ void verifyPixelRequestSerialization() { value.posZ, value.posW, value.frontFace, value.frontFaceAllBits, value.ancillary, value.sampleShading, value.noPerspective, value.linearCentroid, value.pixelKillEnable, value.depthExportEnable, value.sampleMaskExportEnable, value.earlyZ, value.executeOnNoop, value.conservativeZExport, value.orderedPixelShader, - value.targetOutputMode, value.targetExportMapping, value.alphaToCoverage, value.stencilRefExportEnable, value.rasterPrimitive, value.layerExported, value.ditheredAlphaToCoverage, value.reversedBlend, value.targetMerge); + value.targetOutputMode, value.targetExportMapping, value.alphaToCoverage, value.stencilRefExportEnable, value.rasterPrimitive, value.layerExported, value.ditheredAlphaToCoverage, value.reversedBlend, value.targetMerges); }; const std::array code{0xbf810000u}; const std::array userData{0x12345678u, 0xabcdef01u, 0x87654321u}; @@ -6245,7 +6697,7 @@ void verifyPixelRequestSerialization() { pixel.stencilRefExportEnable = true; pixel.ditheredAlphaToCoverage = true; pixel.reversedBlend = 0x570001u; - pixel.targetMerge = {1u, 0x0ff0u, 1u, {0x100u, 0x2u, 0x3u, 0x4u, 0x5u, 0x6u, 0x7u, 0x8u}}; + pixel.targetMerges = {{1u, 0x0ff0u, 1u, {0x100u, 0x2u, 0x3u, 0x4u, 0x5u, 0x6u, 0x7u, 0x8u}}}; const std::array, 3> mappings{{ {0x00u, 0xe4u, 0xc6u, 0x1bu, 0xffu, 0x80u, 0x55u, 0xaau}, {0xe4u, 0xe4u, 0xe4u, 0xe4u, 0xe4u, 0xe4u, 0xe4u, 0xe4u}, @@ -6279,25 +6731,25 @@ void verifyPixelRequestSerialization() { RecompileCacheKey::Build(withoutReversedBlend, replayKey); require(key == replayKey && RecompileCacheKey::ContextHash(request) == RecompileCacheKey::ContextHash(withoutReversedBlend), "the reversed-order blend code changed the static shader identity"); auto movedMerge = request; - movedMerge.context.pixel->targetMerge.descriptor[0] = 0x200u; + movedMerge.context.pixel->targetMerges.at(0).descriptor[0] = 0x200u; RecompileCacheKey::Build(movedMerge, replayKey); require(key == replayKey, "the merged target's descriptor changed the static shader identity"); auto depthWritingMerge = request; - depthWritingMerge.context.pixel->targetMerge.depthStencilWrites = true; + depthWritingMerge.context.pixel->targetMerges.at(0).depthStencilWrites = true; RecompileCacheKey::Build(depthWritingMerge, replayKey); require(key != replayKey, "the merge draw's depth or stencil writes did not change the static shader identity"); auto depthTestingMerge = request; - depthTestingMerge.context.pixel->targetMerge.depthStencilTests = true; + depthTestingMerge.context.pixel->targetMerges.at(0).depthStencilTests = true; RecompileCacheKey::Build(depthTestingMerge, replayKey); require(key != replayKey, "the merge draw's depth or stencil tests did not change the static shader identity"); auto blending = request; - blending.context.pixel->targetMerge.blend = {true, false, 6u, 7u, 0u, 1u, 0u, 0u, 0xfu, {}}; + blending.context.pixel->targetMerges.at(0).blend = {true, false, 6u, 7u, 0u, 1u, 0u, 0u, 0xfu, {}}; RecompileCacheKey::Build(blending, replayKey); require(key != replayKey && RecompileCacheKey::ContextHash(request) != RecompileCacheKey::ContextHash(blending), "an unclamped color target blend did not change the static shader identity"); const auto blendKey = replayKey; for (const auto change : {0, 1, 2, 3, 4, 5, 6, 7, 8}) { auto other = blending; - auto& blend = other.context.pixel->targetMerge.blend; + auto& blend = other.context.pixel->targetMerges.at(0).blend; if (change == 0) blend.snorm = true; if (change == 1) blend.colorSource = 2u; if (change == 2) blend.colorDestination = 2u; @@ -6310,12 +6762,26 @@ void verifyPixelRequestSerialization() { RecompileCacheKey::Build(other, replayKey); require(blendKey != replayKey, "a field of the unclamped color target blend did not change the static shader identity"); } + auto second = blending; + second.context.pixel->targetMerges.push_back({3u, 0xffffu, 1u, {0x300u}, false, false, {true, false, 4u, 5u, 0u, 4u, 5u, 0u, 0xfu, {}}}); + RecompileCacheKey::Build(second, replayKey); + const auto secondKey = replayKey; + require(secondKey != blendKey && RecompileCacheKey::ContextHash(second) != RecompileCacheKey::ContextHash(blending), "a second merged target did not change the static shader identity"); + for (const auto change : {0, 1, 2}) { + auto other = second; + auto& merge = other.context.pixel->targetMerges.at(1); + if (change == 0) merge.target = 4u; + if (change == 1) merge.blend.colorSource = 2u; + if (change == 2) merge.descriptor[0] = 0x400u; + RecompileCacheKey::Build(other, replayKey); + require((secondKey == replayKey) == (change == 2), "the second merged target's slot or blend did not change the static shader identity, or its descriptor did"); + } auto disabled = blending; - disabled.context.pixel->targetMerge.blend.enabled = false; + disabled.context.pixel->targetMerges.at(0).blend.enabled = false; RecompileCacheKey::Build(disabled, replayKey); require(key == replayKey && RecompileCacheKey::ContextHash(request) == RecompileCacheKey::ContextHash(disabled), "a disabled color target blend changed the static shader identity"); auto withoutMerge = request; - withoutMerge.context.pixel->targetMerge = {}; + withoutMerge.context.pixel->targetMerges = {}; RecompileCacheKey::Build(withoutMerge, replayKey); require(key != replayKey, "a color target merge did not change the static shader identity"); auto withoutCoverage = request; @@ -6332,10 +6798,10 @@ void verifyPixelRequestSerialization() { blendedDepth.context.pixel->depthExportEnable = true; blendedDepth.context.pixel->depthExportMin = -0.25f; blendedDepth.context.pixel->depthExportMax = 0.75f; - blendedDepth.context.pixel->targetMerge.blend = {true, true, 6u, 7u, 1u, 2u, 3u, 4u, 0xau, {0x3f800000u, 0x40000000u, 0x40400000u, 0x40800000u}}; + blendedDepth.context.pixel->targetMerges.at(0).blend = {true, true, 6u, 7u, 1u, 2u, 3u, 4u, 0xau, {0x3f800000u, 0x40000000u, 0x40400000u, 0x40800000u}}; const auto blendedReplay = serializer.Deserialize(serializer.Serialize(blendedDepth)); require(blendedReplay.request.context.pixel.has_value() && fields(*blendedReplay.request.context.pixel) == fields(*blendedDepth.context.pixel), "a pixel request with a target blend and depth export bounds lost pixel fields in serialization"); - require(blendedReplay.request.context.pixel->targetMerge.blend == blendedDepth.context.pixel->targetMerge.blend, "the target blend did not round-trip beside the depth export bounds"); + require(blendedReplay.request.context.pixel->targetMerges.at(0).blend == blendedDepth.context.pixel->targetMerges.at(0).blend, "the target blend did not round-trip beside the depth export bounds"); require(blendedReplay.request.context.pixel->depthExportMin == -0.25f && blendedReplay.request.context.pixel->depthExportMax == 0.75f, "the depth export bounds did not round-trip beside the target blend"); require(blendedReplay.request.context.vertex.has_value() && blendedReplay.request.context.vertex->fetchAttribReg == 17u && blendedReplay.request.context.memory.size() == 1u && blendedReplay.request.context.memory[0].guestAddress == 0x60000u, "a target blend with depth export bounds displaced the following guest context"); request.context.pixel.reset(); @@ -6751,18 +7217,30 @@ void verifyVertexInfoVersion19() { const auto orderOffset = blendOffset + 4u + iterationBytes; const auto mergeOffset = static_cast(orderOffset + sampleOrderBytes); auto merging = pixel; - merging.context.pixel->targetMerge = {3u, 0xf00fu, 2u, {1u, 2u, 3u, 4u, 5u, 6u, 7u, 0x89abcdefu}, true, true}; + merging.context.pixel->targetMerges = {{3u, 0xf00fu, 2u, {1u, 2u, 3u, 4u, 5u, 6u, 7u, 0x89abcdefu}, true, true}}; const auto mergingBytes = decodeBase64(serializer.Serialize(merging)); require(mergingBytes.size() == plainPixel.size() && std::equal(plainPixel.begin(), plainPixel.begin() + mergeOffset, mergingBytes.begin()) && mergingBytes[mergeOffset] == 3u && mergingBytes[mergeOffset + 1] == 0x0fu && mergingBytes[mergeOffset + 2] == 0xf0u && mergingBytes[mergeOffset + 5] == 2u && mergingBytes[mergeOffset + 6] == 1u && mergingBytes[mergeOffset + 34] == 0xefu && mergingBytes[mergeOffset + 37] == 0x89u && mergingBytes[mergeOffset + 38] == 1u && mergingBytes[mergeOffset + 39] == 1u && std::equal(plainPixel.begin() + mergeOffset + static_cast(mergeBytes), plainPixel.end(), mergingBytes.begin() + mergeOffset + static_cast(mergeBytes)), "the color target merge is not the 40 bytes the version 46 pixel info adds after the sample order"); - require(serializer.Deserialize(serializer.Serialize(merging)).request.context.pixel->targetMerge == merging.context.pixel->targetMerge, "a serialized request lost its color target merge"); + require(serializer.Deserialize(serializer.Serialize(merging)).request.context.pixel->targetMerges == merging.context.pixel->targetMerges, "a serialized request lost its color target merge"); auto blendMerging = pixel; - blendMerging.context.pixel->targetMerge = {1u, 0xffffu, 1u, {1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u}, true, false, {true, true, 6u, 7u, 1u, 1u, 0u, 4u, 0xbu, {0x3fc00000u, 0xbe800000u, 0x3f000000u, 0x40000000u}}}; + blendMerging.context.pixel->targetMerges = {{1u, 0xffffu, 1u, {1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u}, true, false, {true, true, 6u, 7u, 1u, 1u, 0u, 4u, 0xbu, {0x3fc00000u, 0xbe800000u, 0x3f000000u, 0x40000000u}}}}; const auto blendMergingBytes = decodeBase64(serializer.Serialize(blendMerging)); constexpr std::size_t blendPayloadBytes = 24u; require(blendMergingBytes.size() == plainPixel.size() + blendPayloadBytes && std::equal(plainPixel.begin(), plainPixel.begin() + mergeOffset, blendMergingBytes.begin()) && blendMergingBytes[mergeOffset] == 1u && blendMergingBytes[mergeOffset + 1] == 0xffu && blendMergingBytes[mergeOffset + 2] == 0xffu && blendMergingBytes[mergeOffset + 3] == 0x01u && blendMergingBytes[mergeOffset + 4] == 0x00u, "a color target blend is not flagged in the merge mask word, or changed the bytes before the merge"); - require(serializer.Deserialize(serializer.Serialize(blendMerging)).request.context.pixel->targetMerge == blendMerging.context.pixel->targetMerge, "a serialized request lost its color target blend"); + require(serializer.Deserialize(serializer.Serialize(blendMerging)).request.context.pixel->targetMerges == blendMerging.context.pixel->targetMerges, "a serialized request lost its color target blend"); + auto twoMerging = blendMerging; + twoMerging.context.pixel->targetMerges.push_back({3u, 0xffffu, 1u, {9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u}, true, false, {true, false, 4u, 5u, 0u, 4u, 5u, 0u, 0x3u, {}}}); + const auto twoMergingBytes = decodeBase64(serializer.Serialize(twoMerging)); + require(twoMergingBytes.size() == blendMergingBytes.size() + mergeBytes + blendPayloadBytes && twoMergingBytes[mergeOffset + 3] == 0x03u && std::equal(blendMergingBytes.begin() + mergeOffset + 4, blendMergingBytes.begin() + mergeOffset + static_cast(mergeBytes + blendPayloadBytes), twoMergingBytes.begin() + mergeOffset + 4), "a second color target merge did not follow the first, counted in the first merge word"); + require(serializer.Deserialize(serializer.Serialize(twoMerging)).request.context.pixel->targetMerges == twoMerging.context.pixel->targetMerges, "a serialized request lost its second color target merge"); + auto unmasked = twoMergingBytes; + const auto secondMask = mergeOffset + static_cast(mergeBytes + blendPayloadBytes) + 1; + unmasked[secondMask] = unmasked[secondMask + 1] = 0u; + expectFailure([&] { static_cast(serializer.Deserialize(encodeBase64(unmasked))); }, "invalid recompile request target merge mask", "a request whose second color target merge has no mask was read"); + auto nine = twoMerging; + nine.context.pixel->targetMerges.resize(9u, twoMerging.context.pixel->targetMerges.back()); + expectFailure([&] { static_cast(serializer.Serialize(nine)); }, "merges into more than eight color targets", "a request with nine color target merges was serialized"); auto disabledBlend = merging; - disabledBlend.context.pixel->targetMerge.blend = {false, true, 6u, 7u, 1u, 1u, 0u, 4u, 0xbu, {1u, 2u, 3u, 4u}}; + disabledBlend.context.pixel->targetMerges.at(0).blend = {false, true, 6u, 7u, 1u, 1u, 0u, 4u, 0xbu, {1u, 2u, 3u, 4u}}; require(serializer.Serialize(disabledBlend) == serializer.Serialize(merging), "a disabled color target blend changed the serialized request"); // A version 43 request: no color target merge, and no fused arithmetic flag, pixel function LDS flag, storage size or barycentric built-ins flag at the end. const auto version43Bytes = [&](std::vector bytes) { @@ -6774,13 +7252,13 @@ void verifyVertexInfoVersion19() { auto version42 = version43Bytes(plainPixel); version42[4] = 42u; const auto replay42 = serializer.Deserialize(encodeBase64(version42)); - require(replay42.request.context.pixel.has_value() && replay42.request.context.pixel->targetMerge == TargetMerge{} && serializer.Serialize(replay42.request) == encodedPixel, "a version 42 request read a color target merge or misread the fields after it"); + require(replay42.request.context.pixel.has_value() && replay42.request.context.pixel->targetMerges.empty() && serializer.Serialize(replay42.request) == encodedPixel, "a version 42 request read a color target merge or misread the fields after it"); auto version39 = version42; version39.pop_back(); version39.erase(version39.begin() + static_cast(orderOffset), version39.begin() + mergeOffset); version39[4] = 39u; const auto replay39 = serializer.Deserialize(encodeBase64(version39)); - require(replay39.request.context.pixel.has_value() && replay39.request.context.pixel->targetMerge == TargetMerge{} && replay39.request.context.pixel->sampleOrder == std::array{} && serializer.Serialize(replay39.request) == encodedPixel, "a version 39 request read a sample order or color target merge, or misread the fields after them"); + require(replay39.request.context.pixel.has_value() && replay39.request.context.pixel->targetMerges.empty() && replay39.request.context.pixel->sampleOrder == std::array{} && serializer.Serialize(replay39.request) == encodedPixel, "a version 39 request read a sample order or color target merge, or misread the fields after them"); auto ordered = pixel; ordered.context.pixel->sampleOrder = {0x76543210u, 0x76543210u, 0x76543201u, 0x76543201u}; const auto orderedBytes = decodeBase64(serializer.Serialize(ordered)); @@ -8110,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"); } } @@ -9236,6 +9721,9 @@ void verifyVolumeArrayLoadMode() { require(sampled.dimension == RdnaImageDimension::Dim3D && !sampled.cube, "2D-array image sample on a 3D T# did not select a volume runtime mode"); const DescriptorValue arrayDescriptor{{0x02466600u, 0x01400000u, 0u, 0xd0500204u, 1u, 0x00700000u, 0u, 0u}, 8u}; require(sampleModes[ResourceMaterializer::RuntimeImageMode(image, arrayDescriptor, sampleModes)].dimension == RdnaImageDimension::Dim2DArray, "2D-array image sample on a 2D-array T# no longer selects the 2D-array runtime mode"); + image.adjustedSample = true; + expectFailure([&] { static_cast(ResourceMaterializer::RuntimeImageMode(image, descriptor, ResourceMaterializer::RuntimeImageModes(image))); }, "incompatible with the static runtime image interface", "a 2D-array image_sample_a on a 3D T# selected a volume runtime mode"); + image.adjustedSample = false; image.volumeArraySampleCompatible = false; ImageResource store{}; store.resourceClass = ImageResourceClass::Storage; @@ -9271,6 +9759,12 @@ void verifyMultisamplePlaneReadMode() { other.cubeFaceCompatible = false; refused(other, "a 2D read of a 2D MSAA T# through a mip, gather, bias, gradient or offset access was accepted"); other = image; + other.adjustedSample = true; + require(modes[ResourceMaterializer::RuntimeImageMode(other, descriptor, ResourceMaterializer::RuntimeImageModes(other))].dimension == RdnaImageDimension::Dim2D, "a 2D image_sample_a of a 2D MSAA T# did not select the 2D runtime mode"); + const DescriptorValue cube{{0x02143930u, 71u << 20u, 0u, 0xb1b00facu, 5u, 0u, 0u, 0u}, 8u}; + require(modes[ResourceMaterializer::RuntimeImageMode(image, cube, modes)].cube, "a 2D sample of a cube T# did not select a cube face runtime mode"); + expectFailure([&] { static_cast(ResourceMaterializer::RuntimeImageMode(other, cube, ResourceMaterializer::RuntimeImageModes(other))); }, "incompatible with the static runtime image interface", "a 2D image_sample_a of a cube T# selected a cube face runtime mode"); + other = image; other.depthCompare = true; refused(other, "a 2D depth comparison of a 2D MSAA T# was accepted"); other = image; @@ -9616,6 +10110,7 @@ int main(int argc, char** argv) { verifyFusedExactArithmetic(); verifyNarrowVertexWave(); verifySingleLaneVertexWave(); + verifySingleLaneElectedAtomicMax(); verifyMeshConfiguration(); verifyPixelInputs(); verifyCanonicalVersion20And21Requests(); diff --git a/core/libs/prx/libSceAgcDriver/tests/Submit.cpp b/core/libs/prx/libSceAgcDriver/tests/Submit.cpp index 9e8c71662fa9..482c6aad1bde 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) { @@ -422,6 +434,85 @@ void testLabelHeldAtSubmission() { AgcDriverWaitIdle_nid_postfix(); } +void testLabelTakenAndResetInOneSubmission() { + alignas(64) static volatile std::uint32_t gate = 0, label = 0, first = 0, waiting = 0, second = 0; + submit(0x20, commands(waitEqual(&gate, 1), waitEqual(&label, 1), writeData(&label, 0), writeData(&first, 1), writeData(&waiting, 1), waitEqual(&label, 1), writeData(&second, 1))); + submit(0, commands(writeData(&label, 1))); + waitFor(&label, 1, "producer label never landed"); + gate = 1; + waitFor(&waiting, 1, "consumer never reached its second label wait"); + std::this_thread::sleep_for(std::chrono::milliseconds(1200)); + check(first == 1 && second == 0, "a label store its own queue had taken and reset satisfied the queue's next wait, or the wait expired"); + submit(0, commands(writeData(&label, 1))); + waitFor(&second, 1, "consumer did not resume after a new producer label"); + AgcDriverWaitIdle_nid_postfix(); +} + +void testLabelTakenAndResetByEarlierSubmission() { + alignas(64) static volatile std::uint32_t gate = 0, label = 0, first = 0, second = 0; + submit(0x20, commands(waitEqual(&gate, 1), waitEqual(&label, 1), writeData(&label, 0), writeData(&first, 1))); + submit(0x20, commands(waitEqual(&label, 1), writeData(&label, 0), 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"); + submit(0, commands(writeData(&label, 1))); + waitFor(&second, 1, "the later submission did not resume after a new producer label"); + 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; @@ -1072,6 +1163,10 @@ int main(int argc, char** argv) { testLabelStoredSinceSubmission(); testEndOfPipeLabelsWithoutWork(); 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 000000000000..490ba0cb1fbb --- /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 6bfe87eb6d3b..3feba5079b43 100644 --- a/core/libs/prx/libSceAgcDriver/tests/TextureFormat.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/TextureFormat.cpp @@ -250,6 +250,28 @@ 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() { + Require(FindGuestTextureFormat(VK_FORMAT_R8_UNORM, 1) == 1u, "format 1 must look up from R8_UNORM"); + Require(FindGuestTextureFormat(VK_FORMAT_R8G8B8A8_UNORM, 4) == 56u, "format 56 must look up from R8G8B8A8_UNORM"); + Require(FindGuestTextureFormat(VK_FORMAT_R8G8B8A8_SNORM, 4) == 57u, "format 57 must look up from R8G8B8A8_SNORM"); + Require(FindGuestTextureFormat(VK_FORMAT_R16G16B16A16_SFLOAT, 8) == 71u, "format 71 must look up from R16G16B16A16_SFLOAT"); + Require(!FindGuestTextureFormat(VK_FORMAT_B8G8R8A8_UNORM, 4).has_value(), "B8G8R8A8_UNORM is not a native texture format"); + Require(!FindGuestTextureFormat(VK_FORMAT_B8G8R8A8_SNORM, 4).has_value(), "B8G8R8A8_SNORM is not a native texture format"); + Require(!FindGuestTextureFormat(VK_FORMAT_BC1_RGBA_UNORM_BLOCK, 8).has_value(), "block-compressed formats must not look up as texture formats"); + Require(!FindGuestTextureFormat(VK_FORMAT_R8_UNORM, 2).has_value(), "mismatched element bytes must reject texture format lookup"); + + Require(FindGuestColorTargetFormat(VK_FORMAT_B8G8R8A8_UNORM, 4) == 56u, "B8G8R8A8_UNORM color target must map to guest format 56"); + Require(FindGuestColorTargetFormat(VK_FORMAT_B8G8R8A8_SNORM, 4) == 57u, "B8G8R8A8_SNORM color target must map to guest format 57"); + Require(FindGuestColorTargetFormat(VK_FORMAT_B8G8R8A8_SRGB, 4) == 130u, "B8G8R8A8_SRGB color target must map to guest format 130"); + Require(FindGuestColorTargetFormat(VK_FORMAT_A2R10G10B10_UNORM_PACK32, 4) == 50u, "A2R10G10B10_UNORM color target must map to guest format 50"); + Require(FindGuestColorTargetFormat(VK_FORMAT_A2B10G10R10_UNORM_PACK32, 4) == 50u, "A2B10G10R10_UNORM color target must map to guest format 50"); + Require(!FindGuestColorTargetFormat(VK_FORMAT_B8G8R8A8_SNORM, 8).has_value(), "mismatched element bytes must reject color target format lookup"); } } @@ -318,4 +340,5 @@ void RunTextureFormatTests() { packedFloatDccClearTests(); fillContractTests(); gcnBufferFormatTests(); + guestFormatLookupTests(); } diff --git a/core/libs/prx/libSceAgcDriver/tests/TextureTiling.cpp b/core/libs/prx/libSceAgcDriver/tests/TextureTiling.cpp index ddd5a4b1187d..f91d045d4f77 100644 --- a/core/libs/prx/libSceAgcDriver/tests/TextureTiling.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/TextureTiling.cpp @@ -140,7 +140,7 @@ void requireSliceAddresses(const GuestTextureResource& resource, std::uint32_t b } } -std::uint64_t referenceGcnAddress(TextureTileMode mode, std::uint32_t bytes, std::uint32_t pitch, std::uint32_t height, std::uint32_t x, std::uint32_t y) { +std::uint64_t referenceGcnAddress(TextureTileMode mode, std::uint32_t bytes, std::uint32_t pitch, std::uint32_t height, std::uint32_t x, std::uint32_t y, std::uint32_t slice = 0u) { const auto bit = [](std::uint32_t value, std::uint32_t index) { return (value >> index) & 1u; }; const std::uint32_t x0 = bit(x, 0), x1 = bit(x, 1), x2 = bit(x, 2), y0 = bit(y, 0), y1 = bit(y, 1), y2 = bit(y, 2); std::array pixel{x0, y0, x1, y1, x2, y2}; @@ -190,7 +190,9 @@ std::uint64_t referenceGcnAddress(TextureTileMode mode, std::uint32_t bytes, std std::uint32_t bank = 0; if (banks == 16u) bank = (bit(bx, 0) ^ bit(by, 3)) | ((bit(bx, 1) ^ bit(by, 2) ^ bit(by, 3)) << 1u) | ((bit(bx, 2) ^ bit(by, 1)) << 2u) | ((bit(bx, 3) ^ bit(by, 0)) << 3u); else bank = (bit(bx, 0) ^ bit(by, 2)) | ((bit(bx, 1) ^ bit(by, 1) ^ bit(by, 2)) << 1u) | ((bit(bx, 2) ^ bit(by, 0)) << 2u); - if (!pipe8x16) bank = (bank ^ static_cast((banks / 2u + 1u) * splitSlice)) & (banks - 1u); + if (!prt) bank ^= (banks / 2u - 1u) * slice; + if (!pipe8x16) bank ^= static_cast((banks / 2u + 1u) * splitSlice); + bank &= banks - 1u; const std::uint32_t bankBits = static_cast(std::countr_zero(banks)); return ((total >> 8u) << (8u + 3u + bankBits)) | (static_cast(bank) << 11u) | (static_cast(pipe) << 8u) | (total & 0xffu); } @@ -220,6 +222,45 @@ void gcnTilingTests() { } } } + for (const auto mode : {kGcnDisplay2D, kGcnThin2D, kGcnDepth2D64, kGcnDepth2D256, kGcnDepth2D1K, kGcnDepthPrt256, kGcnDisplayPrt, kGcnThin2DPrt}) { + for (std::uint32_t bytes = 1u; bytes <= 16u; bytes <<= 1u) { + const auto geometry = GcnTiling(mode, bytes); + constexpr std::array formats{1u, 7u, 20u, 62u, 75u}; + for (const auto mipCount : {1u, 2u}) { + GuestTextureResource array{}; + array.width = geometry.blockWidth * 4u; + array.height = geometry.blockHeight * 4u; + array.depthOrLastArray = 5u; + array.mipCount = mipCount; + array.lastLevel = mipCount - 1u; + array.tileMode = mode; + array.dimension = TextureDimension::k2DArray; + array.format = formats[std::countr_zero(bytes)]; + array.gcnPitch = array.width; + const auto surface = DescribeSurface(array); + const auto what = "PS4 tile mode " + std::to_string(static_cast(mode)) + " at " + std::to_string(bytes) + " bytes with " + std::to_string(mipCount) + " mips"; + for (std::uint32_t level = 0; level < mipCount; ++level) { + const auto& mip = surface.mips[level]; + Require(!mip.gcnMicroTiled, what + ": level " + std::to_string(level) + " is micro-tiled"); + const auto width = mip.blocksPerRow * geometry.blockWidth; + const auto height = ((array.height >> level) + geometry.blockHeight - 1u) / geometry.blockHeight * geometry.blockHeight; + for (std::uint32_t layer = 0; layer < surface.layers; ++layer) { + for (std::uint32_t y = 0; y < height; ++y) { + for (std::uint32_t x = 0; x < width; ++x) { + std::uint32_t inBlock = 0, split = 0; + for (std::uint32_t bit = 0; bit < 16u; ++bit) inBlock |= static_cast(std::popcount((x & geometry.equation[bit] & 0xfffu) ^ ((y << 12u) & geometry.equation[bit] & 0xfff000u)) & 1) << bit; + for (std::uint32_t bit = 0; bit < 4u; ++bit) split |= static_cast(std::popcount((x & geometry.splitMasks[bit] & 0xfffu) ^ ((y << 12u) & geometry.splitMasks[bit] & 0xfff000u)) & 1) << bit; + const auto block = static_cast(y / geometry.blockHeight) * mip.blocksPerRow + x / geometry.blockWidth; + const auto address = surface.GuestOffset(layer, mip) + block * geometry.blockBytes + (inBlock ^ GcnLayerBankXor(geometry, layer)) + static_cast(split) * mip.gcnSplitStride; + const auto expected = surface.GuestOffset(layer, mip) + referenceGcnAddress(mode, bytes, width, height, x, y, layer); + if (address != expected) Require(false, what + ": element " + std::to_string(x) + "," + std::to_string(y) + " of level " + std::to_string(level) + ", array layer " + std::to_string(layer) + " is at " + std::to_string(address) + ", addrlib places it at " + std::to_string(expected)); + } + } + } + } + } + } + } constexpr std::array, 5> display2DPrt{{{256u, 256u}, {256u, 128u}, {128u, 128u}, {128u, 64u}, {64u, 64u}}}; for (std::uint32_t log2 = 0; log2 < 5u; ++log2) { const auto geometry = GcnTiling(TextureTileMode::kGcnDisplay2DPrt, 1u << log2); diff --git a/core/libs/prx/libSceAgcDriver/tests/UnsupportedDiagnostics.cpp b/core/libs/prx/libSceAgcDriver/tests/UnsupportedDiagnostics.cpp index 85a226d1bfa9..f1546a3e4bf2 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/WorkerSampler.cpp b/core/libs/prx/libSceAgcDriver/tests/WorkerSampler.cpp index 55d1e6dea84f..1e03a9fb1ac6 100644 --- a/core/libs/prx/libSceAgcDriver/tests/WorkerSampler.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/WorkerSampler.cpp @@ -15,26 +15,39 @@ int main(int argc, char** argv) { const bool process = mode == "process"; const bool workerExpected = selected || mode == "default"; const auto stem = std::filesystem::temp_directory_path() / ("anyps5-sampler-" + std::to_string(GetCurrentProcessId())); - const auto workerPath = stem.string() + "-worker.txt"; - const auto processPath = stem.string() + "-process.txt"; - _putenv_s("APS5_SAMPLE_WORKER", workerPath.c_str()); - _putenv_s("APS5_SAMPLE_THREADS", process ? processPath.c_str() : ""); + auto workerPath = stem; + workerPath += "-worker.txt"; + auto processPath = stem; + processPath += "-process.txt"; + _wputenv_s(L"APS5_SAMPLE_WORKER", workerPath.c_str()); + _wputenv_s(L"APS5_SAMPLE_THREADS", process ? processPath.c_str() : L""); _putenv_s("APS5_SAMPLE_WORKER_QUEUE", mode == "default" ? "" : "0x50"); AgcDriver::StartWorkerSampler(selected ? 0x50 : 0); const auto until = std::chrono::steady_clock::now() + std::chrono::milliseconds(200); while (std::chrono::steady_clock::now() < until) std::this_thread::yield(); AgcDriver::StopWorkerSampler(); - const auto sampled = [](const std::string& path) { + const auto sampled = [](const std::filesystem::path& path) { std::ifstream file(path); std::string marker; std::uint64_t samples = 0; return (file >> marker >> samples) && marker == "#" && samples != 0; }; - const bool passed = sampled(workerPath) == workerExpected && sampled(processPath) == process; + auto collapsed = stem; + collapsed += "-worker.collapsed.txt"; + auto temporary = collapsed; + temporary += ".tmp"; + const auto published = [&] { + std::ifstream file(collapsed); + std::string header; + unsigned long long samples = 0; + return std::getline(file, header) && std::sscanf(header.c_str(), "# samples=%llu", &samples) == 1 && samples != 0 && + !std::filesystem::exists(temporary); + }; + const bool passed = sampled(workerPath) == workerExpected && sampled(processPath) == process && published() == workerExpected; std::filesystem::remove(workerPath); std::filesystem::remove(processPath); - std::filesystem::remove(stem.string() + "-worker.collapsed.txt"); - std::filesystem::remove(stem.string() + "-worker.collapsed.txt.tmp"); + std::filesystem::remove(collapsed); + std::filesystem::remove(temporary); std::printf("worker sampler %s: %s\n", mode.c_str(), passed ? "passed" : "failed"); return passed ? 0 : 1; } diff --git a/core/libs/prx/libSceAgcDriver/tests/WriteTracking.cpp b/core/libs/prx/libSceAgcDriver/tests/WriteTracking.cpp index c8931d43c0bc..755dc8c40dd5 100644 --- a/core/libs/prx/libSceAgcDriver/tests/WriteTracking.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/WriteTracking.cpp @@ -820,14 +820,16 @@ void CheckRewatchImportTail() { constexpr std::size_t bytes = 0xc4000; ImportFixture fixture(13 * Block, bytes); const auto import = fixture.Base(); + const bool pastWatched = Watched(import + bytes, 4096); UnwatchImport(import, bytes); + Require(Watched(import + bytes, 4096) == pastWatched, "unwatching an import ending inside a block changed the page past it"); PrintPageState("page past a 0xc4000-byte import", fixture.memory + bytes); const auto unwatched = UnwatchSerial(); Rewatch(BlockSpan(import, bytes)); Require(!Watched(import, bytes) && UnwatchSerial() == unwatched, "the 64 KiB span past the import's committed pages returned to the write watch"); Rewatch(PageSpan(import, bytes)); Require(Watched(import, bytes), "a settled import whose size is not a whole block did not return to the write watch"); - Require(Watched(import + 12 * Block, bytes - 12 * Block) && !Watched(import, bytes + 1) && !Watched(import + bytes - 1, 2) && !Watched(import + bytes, 4096), "rewatching an import ending inside a block did not return exactly its pages"); + Require(Watched(import + 12 * Block, bytes - 12 * Block) && Watched(import + bytes, 4096) == pastWatched && Watched(import, bytes + 1) == pastWatched, "rewatching an import ending inside a block changed the page past it"); Require(UnwatchSerial() != unwatched && UntrackedHint(import, bytes) == 0, "a rewatched import still reads as unwatched"); RequireRewatchedStores(import, bytes); } @@ -838,13 +840,16 @@ void CheckRewatchUnalignedImport() { constexpr std::size_t committed = 0xc8000; ImportFixture fixture(13 * Block, committed); const auto import = fixture.Base() + offset; + const bool beforeWatched = Watched(fixture.Base(), offset); + const bool pastWatched = Watched(import + bytes, 4096); UnwatchImport(import, bytes); + Require(Watched(fixture.Base(), offset) == beforeWatched && Watched(import + bytes, 4096) == pastWatched, "unwatching an import inside its blocks changed the pages around it"); PrintPageState("page past an import at block offset 0x1000", fixture.memory + committed); Rewatch(BlockSpan(import, bytes)); Require(!Watched(import, bytes), "the 64 KiB span past the committed pages around an import returned to the write watch"); Rewatch(PageSpan(import, bytes)); Require(Watched(import, bytes), "a settled import that does not start on a block did not return to the write watch"); - Require(!Watched(fixture.Base(), offset) && !Watched(import + bytes, 4096), "rewatching an import returned pages outside it"); + Require(Watched(fixture.Base(), offset) == beforeWatched && Watched(import + bytes, 4096) == pastWatched, "rewatching an import changed the pages around it"); RequireRewatchedStores(import, bytes); } diff --git a/core/libs/prx/libSceAgcDriver/tests/WriteWatchCoverage.cpp b/core/libs/prx/libSceAgcDriver/tests/WriteWatchCoverage.cpp index 121205b1a225..e4b14ceec941 100644 --- a/core/libs/prx/libSceAgcDriver/tests/WriteWatchCoverage.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/WriteWatchCoverage.cpp @@ -27,8 +27,11 @@ int main() { require(!coverage.ExcludedSpan(base - block, block, &spanBegin, &spanEnd) && !coverage.ExcludedSpan(base + 5 * block, block, &spanBegin, &spanEnd) && !coverage.ExcludedSpan(base, 0, &spanBegin, &spanEnd), "an outside or empty import has a span"); require(coverage.Exclude(base + block + 4096, 1), "an imported page was not excluded"); require(!coverage.Covers(base + block, block), "the imported block is still watched"); - require(!coverage.Covers(base + block - 1, 2), "a range crossing into the import is watched"); + require(coverage.Covers(base + block, 4096) && coverage.Covers(base + block + 2 * 4096, block - 2 * 4096), "an import unwatched pages of its block outside it"); + require(!coverage.Covers(base + block + 4095, 2) && !coverage.Covers(base + block + 2 * 4096 - 1, 2), "a range crossing into the import is watched"); require(coverage.Covers(base, block) && coverage.Covers(base + 2 * block, 2 * block + 1), "unrelated blocks lost write watching"); + require(!coverage.Exclude(base + block + 4096, 1), "excluding an imported page again reports a change"); + require(coverage.Exclude(base + block, block) && !coverage.Covers(base + block, 4096), "excluding the rest of an imported block reports no change"); require(!coverage.Exclude(base + block, block), "excluding an imported block again reports a change"); require(coverage.Exclude(base + 3 * block - 1, 2), "an import across a block boundary was not excluded"); require(!coverage.Covers(base + 2 * block, block) && !coverage.Covers(base + 3 * block, block), "a boundary import left one block watched"); @@ -69,9 +72,9 @@ int main() { require(!coverage.Covers(base + 16383, 2) && !coverage.Covers(base + 32767, 2), "a boundary query included excluded pages"); require(!coverage.Restore(base + 32768, 4096, 10), "a stale partial mapping restored an exclusion"); coverage.Exclude(base + 4096, 1, 12); - require(!coverage.Covers(base + 16384, 16384), "a repeated import kept partial coverage from an older mapping"); - require(!coverage.Restore(base + 16384, 16384, 11), "a delayed partial mapping restored a newer import"); - require(coverage.Restore(base + 16384, 16384, 13), "fresh partial coverage was not restored after re-import"); + require(!coverage.Covers(base + 4096, 4096) && coverage.Covers(base + 16384, 16384), "a re-import of one page changed the coverage of other pages"); + require(!coverage.Restore(base + 4096, 4096, 11), "a delayed partial mapping restored a newer import"); + require(coverage.Restore(base + 4096, 4096, 13) && coverage.Covers(base + 4096, 4096), "a fresh mapping did not restore a re-imported page"); constexpr std::size_t page = 4096; for (std::size_t first = 0; first < block / page; ++first) { for (std::size_t count = 1; count <= block / page - first; ++count) { @@ -104,12 +107,28 @@ int main() { coverage.Exclude(base, tail, 50); require(coverage.Restore(base, tail, 51), "an import ending inside a block did not restore its pages"); require(coverage.Covers(base, tail) && coverage.Covers(base + 12 * block, tail - 12 * block), "an import ending inside a block is not watched"); - require(!coverage.Covers(base, tail + 1) && !coverage.Covers(base + tail - 1, 2) && !coverage.Covers(base + tail, page) && !coverage.Covers(base, 13 * block), "a range past an import ending inside a block is watched"); - require(coverage.Covers(base + tail - page, page) && !coverage.Covers(base + 13 * block - page, page) && coverage.Covers(base + 13 * block, block), "an import ending inside a block changed the pages after it"); + require(coverage.Covers(base, 13 * block) && coverage.Covers(base + tail, page), "a restored import ending inside a block left pages excluded"); + coverage.Exclude(base, tail, 52); + require(!coverage.Covers(base + tail - page, page) && !coverage.Covers(base + tail - 1, 2), "a range ending inside an import is watched"); + require(coverage.Covers(base + tail, 13 * block - tail) && coverage.Covers(base + 13 * block, block), "an import ending inside a block unwatched the pages after it"); coverage.Initialize(base, 14 * block); coverage.Exclude(base + page, tail, 60); require(coverage.Restore(base + page, tail, 61) && coverage.Covers(base + page, tail), "an import starting and ending inside blocks is not watched"); - require(!coverage.Covers(base, page) && !coverage.Covers(base, tail) && !coverage.Covers(base + page + tail, page) && !coverage.Covers(base + page, tail + 1), "an import starting and ending inside blocks watched pages outside it"); + coverage.Exclude(base + page, tail, 62); + require(coverage.Covers(base, page) && coverage.Covers(base + page + tail, page), "an import starting and ending inside blocks unwatched pages outside it"); + require(!coverage.Covers(base, 2 * page) && !coverage.Covers(base + page + tail - 1, 2), "a range reaching into an import starting and ending inside blocks is watched"); + coverage.Initialize(base, 2 * block); + coverage.Exclude(base + page, page, 70); + coverage.Exclude(base + 5 * page, page, 75); + require(coverage.Restore(base + page, page, 72) && coverage.Covers(base + page, page), "a newer import of another page in the block kept an older page excluded"); + require(!coverage.Covers(base + 5 * page, page), "restoring an older page restored a newer import in the same block"); + require(!coverage.Restore(base + 5 * page, page, 74) && !coverage.Covers(base + 5 * page, page), "a stale mapping restored a newer page in the same block"); + require(coverage.Restore(base + 5 * page, page, 76) && coverage.Covers(base, 2 * block), "a fresh mapping did not restore the newer page"); + coverage.Exclude(base + 3 * page, page, 80); + for (std::size_t index = 0; index < 2 * block / page; ++index) { + require(coverage.Covers(base + index * page, page) == (index != 3), "excluding one page changed another page of the arena"); + } + require(coverage.ExcludedSpan(base + 3 * page, page, &spanBegin, &spanEnd) && spanBegin == base && spanEnd == base + block, "the span of an excluded page is not its whole block"); std::cout << "write watch coverage passed\n"; return 0; } catch (const std::exception& error) { 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 000000000000..19085cc7d7de --- /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 000000000000..ac53d8070fc7 --- /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 000000000000..290b7132aff9 --- /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 000000000000..66a83d362422 --- /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 000000000000..46e97841265b --- /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 000000000000..5edb1c481e0f --- /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 000000000000..7ffaf4fbd825 --- /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 000000000000..d7c82f620f1c --- /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 000000000000..e86bf5faf71d --- /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 000000000000..2367926617c5 --- /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 000000000000..9e08d76b5c42 --- /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 000000000000..45b91fcbe5d1 --- /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 000000000000..447e0b8aad0b --- /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 000000000000..ba1ec6818625 --- /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 000000000000..1d61029ae295 --- /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 000000000000..178a8d915a88 --- /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 000000000000..7e0b1155886c --- /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 000000000000..a6a84810cf7c --- /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 000000000000..c9e028e78c80 --- /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 000000000000..dee9f6f8f093 --- /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 000000000000..30061b54d342 --- /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 000000000000..711518b679e7 --- /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 000000000000..88f140756ade --- /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 000000000000..9d9048b75e31 --- /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 000000000000..63c317d18a63 --- /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 000000000000..9208eaf2d256 --- /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 000000000000..ac0bbbe423dd --- /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 000000000000..c3b957f8adaa --- /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 000000000000..1d12dea7323b --- /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 000000000000..a04e3566680a --- /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 000000000000..6eedba2d4ac2 --- /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 000000000000..6657a149501c --- /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 000000000000..3c7fa372bbf0 --- /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 000000000000..91dd83dfc849 --- /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 000000000000..b7160628ebc1 --- /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 000000000000..298dff2a13a5 --- /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 000000000000..2665ea3ed3a3 --- /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 000000000000..122e6d9d65fd --- /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 000000000000..afca8a34ea64 --- /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 000000000000..7beac60cfad2 --- /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 000000000000..86b69033ad36 --- /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 000000000000..c06c5354badb --- /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 000000000000..04f29eb3b10b --- /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 000000000000..1aeadece59b8 --- /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 000000000000..aa3486152a1b --- /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 000000000000..31e1d85526fa --- /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 000000000000..de018fd7d9a1 --- /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 000000000000..cead7e6d6918 --- /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 000000000000..ae4b99b882dc --- /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 000000000000..510aeafff229 --- /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 000000000000..835d1aa0cf25 --- /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 000000000000..ab17f264f2ae --- /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 000000000000..49eaf3a0e92c --- /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 000000000000..807d44f0c0f1 --- /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 000000000000..230d88b1669c --- /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 000000000000..0fef20d16193 --- /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 000000000000..6d2bf390e2f4 --- /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 000000000000..815cab6386da --- /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_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 000000000000..4a900f984337 --- /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 000000000000..d5faddfad0e1 --- /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 000000000000..bcb26845925a --- /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 000000000000..889a5ae09ccc --- /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 000000000000..29af95cfa5cc --- /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 000000000000..b4a9dd345028 --- /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 000000000000..2db7da6d90dd --- /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 000000000000..569c559b259a --- /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 000000000000..11e868084c79 --- /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 000000000000..10989ffcdccf --- /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 000000000000..d933f3070ddd --- /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 000000000000..6fa9fc23d1ea --- /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 000000000000..eef2320e6e57 --- /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 000000000000..91e40b79237d --- /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 000000000000..1735c5d32735 --- /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 000000000000..9fbe39343a91 --- /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 000000000000..68d699ce19f5 --- /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 000000000000..fa9a73bb7c25 --- /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 000000000000..78e86d96672b --- /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 000000000000..725d651511cc --- /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 000000000000..d2b73419c869 --- /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 000000000000..e1e265cfd939 --- /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 000000000000..426c43e5f8e6 --- /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 000000000000..eaa7ba200c71 --- /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 000000000000..ed41634053ad --- /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 000000000000..c21ce2b8f566 --- /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 000000000000..b261e2d70be1 --- /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 000000000000..2389f6aac7ed --- /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 000000000000..f59d1d8c4179 --- /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 000000000000..ef578806d6e9 --- /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 000000000000..52c43305f9aa --- /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 000000000000..2f26ed8c15dd --- /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 000000000000..d1ca697fa035 --- /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 000000000000..30b35015fbc0 --- /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 000000000000..0992f09dc7b2 --- /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 000000000000..ecc2f0364203 --- /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 000000000000..4c6372e74322 --- /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 000000000000..21df8b182491 --- /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 000000000000..1b14546aef33 --- /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 000000000000..41d13ebf24a6 --- /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 000000000000..d6904e9ecde6 --- /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 000000000000..0a1af8fefccd --- /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 000000000000..891e3e7ebd41 --- /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 000000000000..76bd0b8d7ffb --- /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 000000000000..d44ec5a784f4 --- /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 000000000000..1062511583a3 --- /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 000000000000..7b1c4d4aaa2f --- /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 000000000000..c19228872ef7 --- /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 000000000000..63a078aa117a --- /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 000000000000..38a274318427 --- /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 000000000000..b4df42c2ced8 --- /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 000000000000..f80d0d69b445 --- /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 000000000000..59f85e5bf0b1 --- /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 000000000000..e9afb15570fc --- /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 000000000000..1852488bc573 --- /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 000000000000..191898c34f6f --- /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 000000000000..d80131f4602f --- /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 000000000000..f8d2a159013a --- /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 000000000000..47e76a68790b --- /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 000000000000..f14e9b8d5b06 --- /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 000000000000..c8ea685d727d --- /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 000000000000..9d4b8ccb1d76 --- /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 000000000000..3ce36f91fbe3 --- /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 000000000000..023e8c55df76 --- /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 000000000000..07148a1eab37 --- /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 000000000000..44926f7087e0 --- /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 000000000000..6dc4f6d5683f --- /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 000000000000..372b14535d0e --- /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 000000000000..a238e74936c0 --- /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 000000000000..e7cc4adc91bf --- /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 000000000000..026970ef58ed --- /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 000000000000..4ef7fd83c7b5 --- /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 000000000000..0ef4a91136c6 --- /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 000000000000..5c4381007e24 --- /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 000000000000..b304bfb33369 --- /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 000000000000..2740681a9589 --- /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 000000000000..bf0f20fa31b2 --- /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 000000000000..be0352512ce7 --- /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 000000000000..454037a68cf4 --- /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 000000000000..417520f2652e --- /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 000000000000..c04af1991741 --- /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 000000000000..c077f7cbe3bd --- /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 000000000000..6a0be4089766 --- /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 000000000000..f982191576a9 --- /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 000000000000..53a2513474fc --- /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 000000000000..d6b26bf7dacf --- /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 000000000000..817f77fbf825 --- /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 000000000000..bc58d8d7814c --- /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 000000000000..688fd4820eab --- /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 000000000000..360ac39859f2 --- /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 000000000000..0c1ec506312c --- /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 000000000000..eb7c0a6323a7 --- /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 000000000000..1807700ee121 --- /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 000000000000..85a7e1ae387c --- /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 000000000000..f616a8f244b2 --- /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 000000000000..d67511a3253f --- /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 000000000000..cdb8208427da --- /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 000000000000..84e09835c1f9 --- /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 000000000000..fe6fd86b0953 --- /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 000000000000..a9c3c84ac0cf --- /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 000000000000..e902e756a520 --- /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 000000000000..45e1d0648555 --- /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 000000000000..153d6a93883a --- /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 000000000000..46785e7b7461 --- /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 000000000000..f845ed95e06e --- /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 000000000000..486f1eb67b99 --- /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 000000000000..966bb7cd1d70 --- /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 000000000000..1d9197edea31 --- /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 000000000000..6e733563e496 --- /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 000000000000..89971b631e69 --- /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 000000000000..63d232de9d08 --- /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 000000000000..b274076e55b9 --- /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 000000000000..5156ccd1729d --- /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 000000000000..b7988ff07d09 --- /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 000000000000..82731929c8fa --- /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 000000000000..45abdbb32e1b --- /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 000000000000..65c2c8e8be24 --- /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 000000000000..789a4d72e601 --- /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 000000000000..0d229fdfa049 --- /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 000000000000..d4bfed242727 --- /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 000000000000..332c5c52c2c5 --- /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 000000000000..bdf9ca7382b6 --- /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 000000000000..df60c3477fbe --- /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 000000000000..524a09fb9c1c --- /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 000000000000..b55ef7f3eb55 --- /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 000000000000..1690c2425db7 --- /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 000000000000..179b8b0194bb --- /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 000000000000..8e5b7c6ff9eb --- /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 000000000000..4b36f4ec6939 --- /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 000000000000..bf557efcdee4 --- /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 000000000000..acfd1f1e58ef --- /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 000000000000..0872d3d3af98 --- /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 000000000000..5b84f54dbc77 --- /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 000000000000..17e79b4d3096 --- /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 000000000000..ef1914bcbbd0 --- /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 000000000000..f4beee493e53 --- /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 000000000000..a25080ce3803 --- /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 000000000000..928246f45016 --- /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 000000000000..ef7a969e695e --- /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 000000000000..d1954bd6bcce --- /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 000000000000..f5052b5e18f1 --- /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 000000000000..31e92d1545db --- /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 000000000000..da83f9ba81fa --- /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 000000000000..ddf5441641d5 --- /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 000000000000..da03c174fd86 --- /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 000000000000..95dd8f2b74e7 --- /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 000000000000..0f85f013481c --- /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 000000000000..c379e4d62cb5 --- /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 000000000000..08e733b8ad01 --- /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 000000000000..3f92a3e15f01 --- /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 000000000000..d88952caca58 --- /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 000000000000..7f7d4b109a95 --- /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 000000000000..469dc262eb08 --- /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 000000000000..b0e82e2d05b2 --- /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 000000000000..011a0c25064b --- /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 000000000000..c639a3870e1b --- /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 000000000000..0564e1c07d38 --- /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 000000000000..902a0d9bbcf5 --- /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 000000000000..5b1bbd7302cf --- /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 000000000000..27aeaf6bb81e --- /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 000000000000..341ac51cce11 --- /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 000000000000..04be803a42f7 --- /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 000000000000..7e10142f3d56 --- /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 000000000000..1f282de5b8d8 --- /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 000000000000..68987a79f2ae --- /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 000000000000..df272bf0a7a1 --- /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 000000000000..27cda4d3e596 --- /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 000000000000..47c3993221f0 --- /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 000000000000..259f306ad38e --- /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 000000000000..63123928ae13 --- /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 000000000000..512596c04085 --- /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 000000000000..f26b5038aeb1 --- /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 000000000000..0cd558ee506c --- /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 000000000000..0ede3dacb43b --- /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 000000000000..2c1a8276f4c7 --- /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 000000000000..f8d57739e1d8 --- /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 000000000000..1f590c4e4766 --- /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 000000000000..02d667ce0fcb --- /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 000000000000..e0ddbd092c92 --- /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 000000000000..a54c7288c92b --- /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 000000000000..0ecba4e5fc07 --- /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 000000000000..c6cf60492c88 --- /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 000000000000..f6bb64c63ace --- /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 000000000000..baa30d351da4 --- /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 000000000000..3a8d68d85196 --- /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 000000000000..9be4428973a7 --- /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 000000000000..3e0ee2900285 --- /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 000000000000..e03eea1f7a0a --- /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 000000000000..ea73a4bbea16 --- /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 000000000000..c2a9e93d4e14 --- /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 000000000000..4440ebdc39da --- /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 000000000000..b6f71fc8605b --- /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 000000000000..0f1b42653e30 --- /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 000000000000..a6c1ff7621b6 --- /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 000000000000..b73390837cb0 --- /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 000000000000..c9c6c8939364 --- /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 000000000000..5bf4d82f527b --- /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 000000000000..058105618800 --- /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 000000000000..499439f6bd6a --- /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 000000000000..8b7716935225 --- /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 000000000000..488576608829 --- /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 000000000000..20ba47faf9b7 --- /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 000000000000..9811a4ad52e9 --- /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 000000000000..3b77faeb42af --- /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 000000000000..fc81a7fd2131 --- /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 000000000000..a3102832ae45 --- /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 000000000000..ec4d8935dab3 --- /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 000000000000..f0ddc4807b07 --- /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 000000000000..a6d2e23ca05c --- /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 000000000000..a4a2c7ca13f3 --- /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 000000000000..48eed279b8e2 --- /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 000000000000..1be60bd39970 --- /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 000000000000..9eca034cdc63 --- /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 000000000000..e91616eedbe3 --- /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 000000000000..6ece6bb09d26 --- /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 000000000000..1e4df0377e18 --- /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 000000000000..aeb958dc28ba --- /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 000000000000..a64684e4dbb0 --- /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 000000000000..d44268b01cad --- /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 000000000000..ef12da241281 --- /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 000000000000..fb14aac3cf00 --- /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 15aa7c77a2bb..e847bc1c62d6 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/ComputePrebuildShare.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/ComputePrebuildShare.cpp new file mode 100644 index 000000000000..58c6d43f5918 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/execution/ComputePrebuildShare.cpp @@ -0,0 +1,96 @@ +#include "prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp" +#include "prx/libSceAgcDriver/Execution/include/Driver/Shaders/ShaderRegistry.hpp" +#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("compute prebuild share: " + 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); +} + +struct Gate { + std::mutex mutex; + std::condition_variable changed; + bool open = false; + bool libraryBuilt = false; + unsigned running = 0; + unsigned most = 0; + unsigned finished = 0; +}; + +struct OpenOnExit { + std::shared_ptr gate; + ~OpenOnExit() { + { + std::lock_guard lock(gate->mutex); + gate->open = true; + } + gate->changed.notify_all(); + AgcDriver::DriverDetail::AwaitLibraryPrebuilds(); + } +}; + +void CheckLibraryPrebuildRunsBesideBlockedComputePrebuilds() { + const unsigned threads = PrebuildThreads(); + const unsigned limit = std::max(1u, threads / 2u); + const auto gate = std::make_shared(); + const OpenOnExit release{gate}; + for (unsigned index = 0; index < threads; ++index) { + AgcDriver::DriverDetail::SubmitComputePrebuild([gate] { + std::unique_lock lock(gate->mutex); + ++gate->running; + gate->most = std::max(gate->most, gate->running); + gate->changed.notify_all(); + gate->changed.wait(lock, [&] { return gate->open; }); + --gate->running; + ++gate->finished; + gate->changed.notify_all(); + }); + } + std::unique_lock lock(gate->mutex); + Require(gate->changed.wait_for(lock, std::chrono::seconds(10), [&] { return gate->running == limit; }), std::to_string(gate->running) + " of " + std::to_string(threads) + " blocked compute prebuilds started, not " + std::to_string(limit)); + lock.unlock(); + AgcDriver::DriverDetail::SubmitLibraryPrebuild([gate] { + std::lock_guard built(gate->mutex); + gate->libraryBuilt = true; + gate->changed.notify_all(); + }); + lock.lock(); + const bool built = gate->changed.wait_for(lock, std::chrono::seconds(10), [&] { return gate->libraryBuilt; }); + Require(built, "a library prebuild queued behind " + std::to_string(threads) + " blocked compute prebuilds did not run while they waited"); + Require(gate->running == limit, std::to_string(gate->running) + " compute prebuilds ran beside the library prebuild, not " + std::to_string(limit)); + gate->open = true; + gate->changed.notify_all(); + Require(gate->changed.wait_for(lock, std::chrono::seconds(10), [&] { return gate->finished == threads; }), "only " + std::to_string(gate->finished) + " of " + std::to_string(threads) + " compute prebuilds finished after they were released"); + Require(gate->most == limit, std::to_string(gate->most) + " compute prebuilds ran at once, more than " + std::to_string(limit)); +} + +} + +int main() { + try { + AgcDriver::DriverDetail::Driver::Get(); + CheckLibraryPrebuildRunsBesideBlockedComputePrebuilds(); + AgcDriver::DriverDetail::CloseRegistrationPreparation(); + std::puts("compute prebuild share 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/ComputeTableCalls.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/ComputeTableCalls.cpp index f85c5c7d8a6e..7934f4cecfd6 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/ComputeUserDataCalls.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/ComputeUserDataCalls.cpp index f69cfaf201b7..314e0bc467a4 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/ComputeUserDataCalls.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/ComputeUserDataCalls.cpp @@ -4,6 +4,7 @@ #include "SceShaders.hpp" #include "VulkanTestDevice.hpp" #include +#include #include #include #include @@ -11,6 +12,11 @@ #include #include #include +#ifdef _WIN32 +#include +#else +#include +#endif namespace { @@ -92,6 +98,25 @@ void Register(bool wave32) { AgcDriverRegisterShader_nid_postfix(&header.shader); } +const void* LongCallee() { + constexpr std::size_t page = 4096u; + constexpr std::size_t words = 20000u; + constexpr std::size_t committed = (words * 4u + page - 1u) / page * page; +#ifdef _WIN32 + auto* block = static_cast(VirtualAlloc(nullptr, committed + page, MEM_RESERVE, PAGE_NOACCESS)); + Require(block != nullptr && VirtualAlloc(block, committed, MEM_COMMIT, PAGE_READWRITE) != nullptr, "cannot reserve the long callee"); +#else + void* mapped = mmap(nullptr, committed + page, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + Require(mapped != MAP_FAILED && mprotect(mapped, committed, PROT_READ | PROT_WRITE) == 0, "cannot reserve the long callee"); + auto* block = static_cast(mapped); +#endif + block[0] = 0x4a020281u; + for (std::size_t word = 1; word + 1u < words; ++word) block[word] = 0xbf800000u; + block[words - 1u] = 0xbe80200eu; + for (std::size_t word = words; word < committed / 4u; ++word) block[word] = 0xbf810000u; + return block; +} + template void ExpectFailure(TAction action, const char* expected) { try { @@ -114,10 +139,12 @@ int main(int argc, char** argv) { if (!device) return VulkanTestSkipped; } if (registered) Register(true); + const auto* longCallee = LongCallee(); for (const bool wave32 : registered ? std::vector{true} : std::vector{false, true}) { Check(AddFive.data(), AddSixtyFour.data(), wave32, 3u * (5u + 64u), "two user-data callees called from a loop"); Check(AddOne.data(), AddSixtyFour.data(), wave32, 3u * (1u + 64u), "the first callee replaced"); Check(AddSixtyFour.data(), AddSixtyFour.data(), wave32, 3u * (64u + 64u), "one callee behind both pointers"); + Check(longCallee, AddSixtyFour.data(), wave32, 3u * (1u + 64u), "a callee of 20,000 dwords whose last page is followed by unreadable memory"); } const auto* unmapped = reinterpret_cast(std::uintptr_t{0x1000u}); ExpectFailure([&] { Dispatch(AddFive.data(), unmapped, registered); }, "is not readable"); diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/DepthFastClearSubmit.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/DepthFastClearSubmit.cpp index f535dcfc1051..569374c594b9 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/DepthPlaneSampling.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/DepthPlaneSampling.cpp index 108954d47f58..3336a5c1f111 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/DepthPlaneSampling.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/DepthPlaneSampling.cpp @@ -72,6 +72,7 @@ constexpr std::size_t SmallCubeOffset = 0x180000; constexpr std::size_t LargeCubeOffset = 0x200000; constexpr std::size_t GuestDepthBitsOffset = 0x480000; constexpr std::size_t FrameCopiesOffset = 0x520000; +constexpr std::size_t ReloadOffset = 0x700000; constexpr float DrawnDepth = 0.25f; constexpr float DrawnD16Depth = 0.2f; constexpr std::uint32_t DrawnD16Bits = 13107; @@ -174,7 +175,7 @@ std::uint32_t Bits(float value) { // Draws a full-target triangle at depth `z` into the depth surface at `address`, which makes the driver create the // surface (the base slice a later plane copy reads from the surface instead of from guest memory). -void DrawDepth(AgcDriver::VulkanDevice& device, std::uint64_t address, VkExtent2D extent, VkFormat format, float z) { +void DrawDepth(AgcDriver::VulkanDevice& device, std::uint64_t address, VkExtent2D extent, VkFormat format, float z, std::uint32_t swizzle = 0) { static std::deque>> vertexData; vertexData.push_back({{-1.0f, -1.0f, z, 1.0f}, {3.0f, -1.0f, z, 1.0f}, {-1.0f, 3.0f, z, 1.0f}}); const auto& vertices = vertexData.back(); @@ -219,6 +220,7 @@ void DrawDepth(AgcDriver::VulkanDevice& device, std::uint64_t address, VkExtent2 state.colors = {state.color}; state.hasColorTarget = true; state.depth = AgcDriver::Graphics::DepthTarget{address, 0, extent, format, 1.0f, 0}; + state.depth->depthSwizzle = swizzle; state.depthTest = true; state.depthWrite = true; state.depthCompare = VK_COMPARE_OP_ALWAYS; @@ -340,6 +342,21 @@ void GuestDepthBitsCase(AgcDriver::VulkanDevice& device, GuestBlock& block, std: } } +void GuestWriteAfterDrawCase(AgcDriver::VulkanDevice& device, GuestBlock& block, std::span output) { + auto* base = block.At(ReloadOffset); + if (!AgcDriver::GuestMemory::WriteWatched() || !AgcDriver::GuestMemory::Watched(reinterpret_cast(base), SliceBytes)) { + std::puts("guest memory has no write watch: the guest write after a draw is not checked"); + return; + } + const Shape shape{Format32Float, 128, 128, Type2D, 0, Swizzle64KbZX}; + DrawDepth(device, reinterpret_cast(base), {128, 128}, VK_FORMAT_D32_SFLOAT, DrawnDepth, AgcDriver::Graphics::XorSwizzleMode(AgcDriver::Graphics::TextureTileMode::kZ64KBX)); + Load(device, base, shape, 0, output); + Expect(output, Bits(DrawnDepth), "D32 plane sampled after a draw"); + FillSlice(base, SliceBytes, Bits(0.75f), 4u); + Load(device, base, shape, 0, output); + Expect(output, Bits(0.75f), "D32 plane the guest wrote after a draw, sampled before its surface is bound again"); +} + void FirstSliceCase(AgcDriver::VulkanDevice& device, GuestBlock& block, std::span output) { auto* one = block.At(OneSliceOffset); DrawDepth(device, reinterpret_cast(one), {128, 128}, VK_FORMAT_D32_SFLOAT, DrawnDepth); @@ -497,6 +514,8 @@ int main(int argc, char** argv) { present(); GuestDepthBitsCase(*device, block, output); present(); + GuestWriteAfterDrawCase(*device, block, output); + present(); FirstSliceCase(*device, block, output); present(); PaddedCubeCase(*device, block, output); diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/DepthSurfaceFromStorage.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/DepthSurfaceFromStorage.cpp index fdd4bbe36a73..8c7267c2ba10 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/DepthSurfaceFromStorage.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/DepthSurfaceFromStorage.cpp @@ -1,6 +1,8 @@ #include "prx/libSceAgcDriver/Execution/include/GuestMemory.hpp" #include "prx/libSceAgcDriver/Graphics/include/DepthSurface.hpp" +#include "prx/libSceAgcDriver/Graphics/include/GuestTextureResource.hpp" #include "prx/libSceAgcDriver/Graphics/include/Texture.hpp" +#include "prx/libSceAgcDriver/Graphics/include/TextureTiling.hpp" #include "prx/libc/include/GuestAllocations.hpp" #include "prx/libc/include/GuestArena.hpp" #include "prx/libc/include/GuestWriteWatch.hpp" @@ -19,11 +21,20 @@ #include #include #include +#include #include #include #include #include +namespace AgcDriver { + +struct VulkanDeviceTestAccess { + static Graphics::Context ContextOf(const VulkanDevice& device) { return device.graphicsContext(); } +}; + +} + namespace { using DepthFastClearHarness::Covered; @@ -40,7 +51,7 @@ constexpr std::uint32_t TileDepth64KB = 0x18; constexpr std::uint32_t Type2D = 9; constexpr std::uint32_t Type2DArray = 13; constexpr std::size_t PlaneBytes = 65536; -constexpr std::size_t BlockBytes = 9 * PlaneBytes; +constexpr std::size_t BlockBytes = 11 * PlaneBytes; constexpr std::uint32_t RowPasses = 15; alignas(256) constexpr std::array StoreRowCode{ @@ -99,13 +110,13 @@ std::uint64_t Address(const std::uint8_t* plane) { return static_cast(reinterpret_cast(plane)); } -std::array StorageView(std::uint64_t address, std::uint32_t format, std::uint32_t layers) { +std::array StorageView(std::uint64_t address, std::uint32_t format, std::uint32_t layers, std::uint32_t baseLevel = 0, std::uint32_t lastLevel = 0) { return { static_cast(address >> 8u), static_cast((address >> 40u) & 0xffu) | (format << 20u) | (((Width - 1u) & 3u) << 30u), ((Width - 1u) >> 2u) | ((Height - 1u) << 14u), - 0xfacu | (TileDepth64KB << 20u) | ((layers > 1u ? Type2DArray : Type2D) << 28u), - layers - 1u, 0u, 0u, 0u, + 0xfacu | (baseLevel << 12u) | (lastLevel << 16u) | (TileDepth64KB << 20u) | ((layers > 1u ? Type2DArray : Type2D) << 28u), + layers - 1u, lastLevel << 4u, 0u, 0u, }; } @@ -119,9 +130,9 @@ void Fill(std::uint8_t* plane, VkFormat format) { for (std::size_t offset = 0; offset < PlaneBytes; offset += sizeof(quarter)) std::memcpy(plane + offset, &quarter, sizeof(quarter)); } -void StoreRow(AgcDriver::VulkanDevice& device, std::uint8_t* plane, VkFormat format, std::uint32_t layers) { +void StoreRow(AgcDriver::VulkanDevice& device, std::uint8_t* plane, VkFormat format, std::uint32_t layers, std::uint32_t level = 0) { std::vector userData(16, 0u); - const auto view = StorageView(Address(plane), format == VK_FORMAT_D16_UNORM ? Format16Unorm : Format32Float, layers); + const auto view = StorageView(Address(plane), format == VK_FORMAT_D16_UNORM ? Format16Unorm : Format32Float, layers, level, level); std::copy(view.begin(), view.end(), userData.begin() + 4); const std::span code = layers > 1u ? std::span(StoreRowLayerCode) : std::span(StoreRowCode); const std::array memory{{{reinterpret_cast(code.data()), std::as_bytes(code)}}}; @@ -163,6 +174,73 @@ void NewSurfaceCase(AgcDriver::VulkanDevice& device, const DepthFastClearHarness RequireCount(DepthFastClearHarness::Draw(device, shaders, Plane(plane, format), {}), RowPasses, what); } +void PendingChainCase(AgcDriver::VulkanDevice& device, const DepthFastClearHarness::Shaders& shaders, std::uint8_t* plane) { + Fill(plane, VK_FORMAT_D32_SFLOAT); + StoreRow(device, plane, VK_FORMAT_D32_SFLOAT, 1, 1); + AgcDriver::Graphics::StorageTexture::FlushPending(Address(plane), PlaneBytes, nullptr, "test"); + device.WaitIdle(); + Require(AgcDriver::Graphics::StorageTexture::FindLive(Address(plane), PlaneBytes) != nullptr, "the two-level chain's storage image is not held after its first write was flushed"); + static_cast(DepthFastClearHarness::Draw(device, shaders, Plane(plane, VK_FORMAT_D32_SFLOAT), {})); + Require(AgcDriver::Graphics::DepthSurfaceAt(Address(plane)), "the drawn depth surface is not live"); + StoreRow(device, plane, VK_FORMAT_D32_SFLOAT, 1, 1); + Require(AgcDriver::Graphics::StorageTexture::FindPending(Address(plane), 1) != nullptr, "level 1 of a two-level chain over the depth plane is not pending in a storage image"); + const auto words = StorageView(Address(plane), Format32Float, 1, 0, 1); + const auto resource = AgcDriver::Graphics::DecodeTextureResource(words); + std::shared_ptr texture; + try { + texture = AgcDriver::Graphics::DepthSurfaceTexture(AgcDriver::VulkanDeviceTestAccess::ContextOf(device), words, resource, {}); + } catch (const std::runtime_error& error) { + Require(false, std::string("a two-level view of a depth plane that a pending storage write covers was refused: ") + error.what()); + } + Require(texture == nullptr, "a two-level view of a depth plane that a pending storage write covers was served from the depth plane"); + Require(!AgcDriver::Graphics::DepthSurfaceAt(Address(plane)), "a pending storage write over the depth plane, then a two-level view: the depth surface stayed live"); +} + +struct ChainAfterRetire { + std::vector level0; + std::vector level1; + bool disjoint = false; +}; + +ChainAfterRetire RetireOverPendingChain(AgcDriver::VulkanDevice& device, const DepthFastClearHarness::Shaders& shaders, std::uint8_t* plane, bool depthWrite) { + Fill(plane, VK_FORMAT_D32_SFLOAT); + StoreRow(device, plane, VK_FORMAT_D32_SFLOAT, 1, 1); + AgcDriver::Graphics::StorageTexture::FlushPending(Address(plane), PlaneBytes, nullptr, "test"); + device.WaitIdle(); + static_cast(DepthFastClearHarness::Draw(device, shaders, Plane(plane, VK_FORMAT_D32_SFLOAT), {.depthTest = true, .depthWrite = depthWrite, .depthCompare = VK_COMPARE_OP_ALWAYS})); + Require(AgcDriver::Graphics::DepthSurfaceAt(Address(plane)), "the drawn depth surface of the retire case is not live"); + StoreRow(device, plane, VK_FORMAT_D32_SFLOAT, 1, 1); + const auto words = StorageView(Address(plane), Format32Float, 1, 0, 1); + const auto resource = AgcDriver::Graphics::DecodeTextureResource(words); + const auto texture = AgcDriver::Graphics::DepthSurfaceTexture(AgcDriver::VulkanDeviceTestAccess::ContextOf(device), words, resource, {}); + Require(texture == nullptr && !AgcDriver::Graphics::DepthSurfaceAt(Address(plane)), "a two-level view over a drawn depth plane under a pending storage write did not retire the surface"); + AgcDriver::Graphics::StorageTexture::FlushPending(Address(plane), PlaneBytes, nullptr, "test"); + device.WaitIdle(); + AgcDriver::GuestMemory::FlushGpuWrites(Address(plane), PlaneBytes); + const auto geometry = AgcDriver::Graphics::DescribeSurface(resource); + const auto& first = geometry.mips.at(0); + const auto& second = geometry.mips.at(1); + ChainAfterRetire result; + result.level0.assign(plane + first.tiledOffset, plane + first.tiledOffset + first.tiledSize); + result.level1.assign(plane + second.tiledOffset, plane + second.tiledOffset + second.tiledSize); + result.disjoint = first.tiledOffset + first.tiledSize <= second.tiledOffset || second.tiledOffset + second.tiledSize <= first.tiledOffset; + return result; +} + +void RetireStoresDepthCase(AgcDriver::VulkanDevice& device, const DepthFastClearHarness::Shaders& shaders, std::uint8_t* control, std::uint8_t* drawn) { + const auto kept = RetireOverPendingChain(device, shaders, control, false); + const auto stored = RetireOverPendingChain(device, shaders, drawn, true); + Require(stored.level1 == kept.level1, "a retire that stored depth drawn only on the GPU changed level 1 of the chain a pending storage write produced"); + if (!stored.disjoint) return; + std::size_t half = 0; + for (std::size_t offset = 0; offset + sizeof(float) <= stored.level0.size(); offset += sizeof(float)) { + float value = 0.0f; + std::memcpy(&value, stored.level0.data() + offset, sizeof(value)); + half += value == 0.5f; + } + Require(half == stored.level0.size() / sizeof(float), "the retire left " + std::to_string(stored.level0.size() / sizeof(float) - half) + " of the drawn depth plane's texels without the depth drawn on the GPU"); +} + } int main() { @@ -190,6 +268,8 @@ int main() { StoreRow(*device, stenciled, VK_FORMAT_D32_SFLOAT, 1); RequireCount(DepthFastClearHarness::Draw(*device, shaders, depthStencil, {}), RowPasses, "a new D32S8 depth surface over a pending R32F storage write"); RequireCount(DepthFastClearHarness::Draw(*device, shaders, depthStencil, {.depthTest = false, .stencilTest = true, .stencil = equalZero}), Covered, "the stencil plane of a new D32S8 depth surface that took a storage write, tested EQUAL to its clear value 0"); + PendingChainCase(*device, shaders, block.Plane(8)); + RetireStoresDepthCase(*device, shaders, block.Plane(9), block.Plane(10)); if (!failures.empty()) { std::string text; diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/DescriptorWebFaults.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/DescriptorWebFaults.cpp index a522e40647a4..dc0524d6a8b8 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/DrawCacheReuse.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/DrawCacheReuse.cpp index 41ff2d9a5010..adf337663816 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/DrawCacheReuse.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/DrawCacheReuse.cpp @@ -28,6 +28,10 @@ alignas(256) constexpr std::array TriangleVertexCode{ 0x7e000d05u, 0x080200f4u, 0x10020300u, 0x100202f4u, 0x060202f3u, 0x060400f3u, 0x10040500u, 0x060404f3u, 0x7e060280u, 0x7e0802f2u, 0xf80008cfu, 0x04030201u, 0xbf810000u, }; +alignas(256) constexpr std::array OffsetTriangleVertexCode{ + 0x7e000d05u, 0x080200f4u, 0x10020300u, 0x100202f4u, 0x060202f3u, 0x060400f3u, 0x10040500u, 0x060404f3u, + 0x7e0c0c08u, 0x06020306u, 0x7e060280u, 0x7e0802f2u, 0xf80008cfu, 0x04030201u, 0xbf810000u, +}; alignas(256) constexpr std::array PixelCode{0x7e000200u, 0x7e020280u, 0xf800180fu, 0x00010100u, 0xbf810000u, 0xbf810000u, 0xbf810000u, 0xbf810000u}; alignas(256) constexpr std::array ConstantPixelCode{0xf4000080u, 0xfa000000u, 0xbf8cc07fu, 0x7e000202u, 0x7e020280u, 0xf800180fu, 0x00010100u, 0xbf810000u}; alignas(256) std::array ColorMemory{}; @@ -42,6 +46,9 @@ alignas(8) Header VertexHeader{}; alignas(8) Header PixelHeader{}; alignas(8) Header TriangleVertexHeader{}; alignas(8) Header ConstantPixelHeader{}; +alignas(8) Header OffsetTriangleVertexHeader{}; +alignas(256) std::array IndirectRecord{3, 1, 0, 0}; +alignas(256) std::array OffsetRecords{3, 1, 4, 0, 3, 1, 0, 0}; const Shader* Registered(Header& header, const std::uint32_t* code, std::size_t bytes, std::uint8_t type) { header.shader.file_header = 0x34333231u; @@ -231,6 +238,72 @@ void RetainedPixelCacheTransitions() { Require(after.verifyDecodeMismatches == before.verifyDecodeMismatches && after.facadeMismatches == before.facadeMismatches, "cached pixel transitions disagreed with fresh decoding"); } +void CpuPathIndirectDrawsAreCachedWhenAsked(bool libraries) { + const auto mode = std::string(libraries ? "with" : "without") + " graphics pipeline libraries"; + const bool cached = std::getenv("APS5_DRAW_CACHE_INDIRECT") != nullptr; + auto commands = Draws(8.0f, VertexCode.data(), 1, PixelCode.data(), 1, {}); + Append(commands, 0x76, {0x00c, std::bit_cast(1.0f)}); + Append(commands, 0x79, {0x24a, 0}); + const auto records = reinterpret_cast(IndirectRecord.data()); + Append(commands, 0x11, {1, static_cast(records), static_cast(records >> 32u)}); + for (unsigned i = 0; i < 3; ++i) Append(commands, 0x24, {0, 0x8c, 0, 2}); + const auto notFolded = static_cast(AgcDriver::Graphics::IndirectDrawPath::NotFolded); + const auto pathsBefore = AgcDriver::Graphics::IndirectDrawCounts(); + const auto before = AgcDriver::DriverDetail::Driver::Get().DrawCacheCounters(); + const auto after = Submit(commands); + const auto pathsAfter = AgcDriver::Graphics::IndirectDrawCounts(); + if (std::getenv("APS5_PROFILE_DRAW") != nullptr) Require(pathsAfter[notFolded] - pathsBefore[notFolded] == 3, mode + ": " + std::to_string(pathsAfter[notFolded] - pathsBefore[notFolded]) + " of three indirect draws whose packet patches a user word the vertex program reads as a value took the CPU path for an unfolded SGPR, expected 3"); + Require(after.lookups - before.lookups == 3, mode + ": three CPU-path indirect draws made " + std::to_string(after.lookups - before.lookups) + " draw-cache lookups, expected 3"); + if (cached) { + Require(after.inserts - before.inserts == 1 && after.absent - before.absent == 2, mode + ": with APS5_DRAW_CACHE_INDIRECT, three CPU-path indirect draws inserted " + std::to_string(after.inserts - before.inserts) + " draw entries with " + std::to_string(after.absent - before.absent) + " lookups absent, expected 1 and 2"); + Require(after.hits - before.hits == 1, mode + ": with APS5_DRAW_CACHE_INDIRECT, the third CPU-path indirect draw did not reuse the cached draw (" + std::to_string(after.hits - before.hits) + " hits)"); + } else { + Require(after.inserts == before.inserts && after.hits == before.hits && after.absent - before.absent == 3, mode + ": without APS5_DRAW_CACHE_INDIRECT, CPU-path indirect draws inserted " + std::to_string(after.inserts - before.inserts) + " draw entries and hit " + std::to_string(after.hits - before.hits) + " times, expected none"); + } +} + +void RecordsKeepThePacketsFragmentWord(bool libraries) { + const auto mode = std::string(libraries ? "with" : "without") + " graphics pipeline libraries"; + const bool cached = std::getenv("APS5_DRAW_CACHE_INDIRECT") != nullptr; + Registered(OffsetTriangleVertexHeader, OffsetTriangleVertexCode.data(), sizeof(OffsetTriangleVertexCode), 2); + const auto submitRecords = [&](float fragmentWord) { + ColorMemory.fill(std::byte{0}); + auto commands = Draws(32.0f, OffsetTriangleVertexCode.data(), 1, PixelCode.data(), 1, {}); + Append(commands, 0x76, {0x00c, std::bit_cast(fragmentWord)}); + Append(commands, 0x79, {0x24a, 0}); + const auto records = reinterpret_cast(OffsetRecords.data()); + Append(commands, 0x11, {1, static_cast(records), static_cast(records >> 32u)}); + Append(commands, 0x2c, {0, 0x8c, 0, 0, 2, 0, 0, 16, 2}); + return Submit(commands); + }; + const auto wrote = [&](unsigned expected, const std::string& what) { + const auto brightest = BrightestColorByte(); + Require(brightest == expected, mode + ": " + what + " wrote " + std::to_string(brightest) + ", expected " + std::to_string(expected)); + }; + const auto before = AgcDriver::DriverDetail::Driver::Get().DrawCacheCounters(); + submitRecords(0.75f); + wrote(191, "two records of a CPU-path indirect draw, the first moving the triangle off screen through the vertex word the packet names, with the fragment stage reading its own word 0 of 0.75 as its color,"); + submitRecords(0.75f); + const auto seen = submitRecords(0.75f); + wrote(191, "the same two records on a cached draw"); + const auto changed = submitRecords(0.25f); + wrote(64, "the same two records with the fragment stage's word changed to 0.25"); + submitRecords(0.25f); + const auto second = submitRecords(0.25f); + wrote(64, "the same two records on the cached draw with the fragment word 0.25"); + const auto after = submitRecords(0.75f); + wrote(191, "the same two records back on the cached draw with the fragment word 0.75"); + Require(after.lookups - before.lookups == 7, mode + ": seven CPU-path indirect draws made " + std::to_string(after.lookups - before.lookups) + " draw-cache lookups, expected 7"); + if (cached) { + Require(seen.inserts - before.inserts == 1 && seen.hits - before.hits == 1, mode + ": with APS5_DRAW_CACHE_INDIRECT, three CPU-path indirect draws inserted " + std::to_string(seen.inserts - before.inserts) + " entries and hit " + std::to_string(seen.hits - before.hits) + " times, expected 1 and 1"); + Require(changed.hits == seen.hits, mode + ": a CPU-path indirect draw whose fragment word changed reused the cached draw (" + std::to_string(changed.hits - seen.hits) + " hits)"); + Require(second.inserts - seen.inserts == 1 && second.hits - changed.hits == 1, mode + ": with APS5_DRAW_CACHE_INDIRECT, the draws with the fragment word 0.25 inserted " + std::to_string(second.inserts - seen.inserts) + " entries and hit " + std::to_string(second.hits - changed.hits) + " times, expected 1 and 1"); + Require(after.hits - second.hits == 1 && after.inserts == second.inserts, mode + ": with APS5_DRAW_CACHE_INDIRECT, the draw back with the fragment word 0.75 hit " + std::to_string(after.hits - second.hits) + " times and inserted " + std::to_string(after.inserts - second.inserts) + " entries, expected 1 and 0"); + } else { + Require(after.inserts == before.inserts && after.hits == before.hits, mode + ": without APS5_DRAW_CACHE_INDIRECT, CPU-path indirect draws inserted " + std::to_string(after.inserts - before.inserts) + " draw entries and hit " + std::to_string(after.hits - before.hits) + " times, expected none"); + } +} + void SightingsKeepCollidingKeys() { DrawKeySightings sightings(DrawKeySightings::Ways); Require(!sightings.SeenBefore(0) && sightings.SeenBefore(0), "draw key 0 was not admitted at its second sight"); @@ -260,6 +333,8 @@ int main() { UserDataDrawsReuseTheirShape(libraries); StageDataHitsRefreshTheirWords(libraries); RetainedPixelCacheTransitions(); + CpuPathIndirectDrawsAreCachedWhenAsked(libraries); + RecordsKeepThePacketsFragmentWord(libraries); } AgcDriverShutdown_nid_postfix(); Require(AgcDriver::Graphics::PipelineLibraryWorkers() == 0, "the driver's shutdown left the pipeline library worker running"); 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 000000000000..1c2407762fac --- /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 b656cca50337..7194667f9207 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 9dcc8b2bf9b0..2e96d1b48de6 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 a9d0238d0b1a..c9d951d979bb 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 d427b01f05d2..29643a5996d6 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 afacd844cb94..fa57f2f3ecc2 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 000000000000..8832b2736570 --- /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/GcnDetile.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/GcnDetile.cpp index 43a63b3fe3a5..5bb07584970a 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/GcnDetile.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/GcnDetile.cpp @@ -29,13 +29,15 @@ std::uint8_t elementByte(std::uint32_t x, std::uint32_t y, std::uint32_t byte) { return static_cast(x * 7u + y * 13u + byte * 101u + (x >> 4u) * 3u + (y >> 3u) * 5u); } -void detile(const Context& context, TextureDetiler& detiler, TextureTileMode mode, std::uint32_t bytes) { +void detile(const Context& context, TextureDetiler& detiler, TextureTileMode mode, std::uint32_t bytes, std::uint32_t layer) { constexpr std::array formats{1u, 7u, 20u, 62u, 75u}; const auto geometry = GcnTiling(mode, bytes); const auto width = geometry.blockWidth * 2u; const auto height = geometry.blockHeight * 2u; const auto mip = ComputeGcnMipLayout(mode, formats[std::countr_zero(bytes)], width, height, width, false, 1u).front(); - const auto what = "PS4 tile mode " + std::to_string(static_cast(mode)) + " at " + std::to_string(bytes) + " bytes"; + const auto what = "PS4 tile mode " + std::to_string(static_cast(mode)) + " at " + std::to_string(bytes) + " bytes, array layer " + std::to_string(layer); + const auto banks = geometry.blockWidth == 64u ? 8u : 16u; + const auto layerBankXor = IsGcnMacroTiled(mode) && !IsGcnPrtTiled(mode) ? static_cast(((banks / 2u - 1u) * layer) & (banks - 1u)) << 11u : 0u; Buffer tiled(context, static_cast(mip.tiledSize), VK_BUFFER_USAGE_STORAGE_BUFFER_BIT); Buffer linear(context, static_cast(mip.linearSize), VK_BUFFER_USAGE_STORAGE_BUFFER_BIT); std::memset(tiled.Bytes().data(), 0, tiled.Bytes().size()); @@ -46,14 +48,14 @@ void detile(const Context& context, TextureDetiler& detiler, TextureTileMode mod for (std::uint32_t bit = 0; bit < 16u; ++bit) inBlock |= parity(geometry.equation[bit], x, y) << bit; for (std::uint32_t bit = 0; bit < 4u; ++bit) split |= parity(geometry.splitMasks[bit], x, y) << bit; const auto block = static_cast(y / geometry.blockHeight) * mip.blocksPerRow + x / geometry.blockWidth; - const auto offset = block * geometry.blockBytes + inBlock + static_cast(split) * mip.gcnSplitStride; + const auto offset = block * geometry.blockBytes + (inBlock ^ layerBankXor) + static_cast(split) * mip.gcnSplitStride; Require(offset + bytes <= tiled.Bytes().size(), what + ": an element lies outside the tiled surface"); for (std::uint32_t byte = 0; byte < bytes; ++byte) tiled.Bytes()[offset + byte] = static_cast(elementByte(x, y, byte)); } } CommandBatch batch(context); detiler.BeginBatch(); - detiler.Dispatch(batch.Handle(), mode, bytes, tiled.Handle(), 0, linear.Handle(), 0, mip); + detiler.Dispatch(batch.Handle(), mode, bytes, tiled.Handle(), 0, linear.Handle(), 0, mip, false, layer); const VkMemoryBarrier toHost{VK_STRUCTURE_TYPE_MEMORY_BARRIER, nullptr, VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT}; context.Function("vkCmdPipelineBarrier")(batch.Handle(), VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 1, &toHost, 0, nullptr, 0, nullptr); batch.SubmitAndWait(); @@ -78,7 +80,9 @@ int main() { TextureDetiler detiler(context); using enum TextureTileMode; for (const auto mode : {kGcnThin1D, kGcnDisplay1D, kGcnDisplay2D, kGcnThin2D, kGcnDepth2D64, kGcnDepth2D256, kGcnDepth2D1K, kGcnDisplayPrt, kGcnThin2DPrt, kGcnDepthPrt256}) { - for (std::uint32_t bytes = 1u; bytes <= 16u; bytes <<= 1u) detile(context, detiler, mode, bytes); + for (std::uint32_t bytes = 1u; bytes <= 16u; bytes <<= 1u) { + for (const auto layer : {0u, 1u, 2u, 3u, 5u}) detile(context, detiler, mode, bytes, layer); + } } } device.reset(); diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/GcnSinNearZero.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/GcnSinNearZero.cpp new file mode 100644 index 000000000000..a4d25f41872f --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/execution/GcnSinNearZero.cpp @@ -0,0 +1,151 @@ +#include "prx/libSceAgcDriver/Execution/include/GuestMemory.hpp" +#include "prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp" +#include "prx/libSceAgcDriver/Graphics/include/Draw.hpp" +#include "prx/libc/include/GuestArena.hpp" +#include "Recompiler.hpp" +#include "RdnaDecoder/RdnaInstructionDecoder.hpp" +#include "VulkanTestDevice.hpp" +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +using AgcDriver::Graphics::Require; +using ShaderRecompiler::ShaderStage; + +constexpr std::size_t BlockBytes = 65536; +constexpr std::uintptr_t GcnAddressLimit = std::uintptr_t{1} << 44u; +constexpr std::uint32_t InputOffset = 0; +constexpr std::uint32_t OutputOffset = 1024; + +alignas(256) constexpr std::array Code{ + 0x34020082u, 0xe0301000u, 0x80000201u, 0xbf8c0f70u, 0x7e066b02u, 0xe0701000u, 0x80010301u, 0xbf8c0f00u, 0xbf810000u, +}; + +struct Row { + std::uint32_t input; + std::uint32_t expected; + std::uint32_t tolerance; +}; + +constexpr std::array Rows{{ + {0x39bf48b8u, 0x3b163bedu, 0u}, + {0x39bff171u, 0x3b16c071u, 0u}, + {0xb9bff171u, 0xbb16c071u, 0u}, + {0x39bf0da3u, 0x3b160d86u, 0u}, + {0x39bfffffu, 0x3b16cbdfu, 0u}, + {0xb9bfffffu, 0xbb16cbdfu, 0u}, + {0x3941b44eu, 0x3a98228cu, 0u}, + {0x39c00000u, 0x3b16cbdfu, 6u}, + {0xb9c00000u, 0xbb16cbdfu, 6u}, + {0x39c00001u, 0x3b16cbdfu, 6u}, + {0xb9c00001u, 0xbb16cbdfu, 6u}, +}}; + +class LowBlock { +public: + LowBlock() : block(static_cast(GuestArena::GuestArenaAllocate_nid_postfix(BlockBytes, BlockBytes))) { + Require(block != nullptr, "GCN sin near zero: cannot allocate the buffer block in the guest arena"); + GuestArena::GuestArenaCommit_nid_postfix(block, BlockBytes, 0x04u, BlockBytes); + } + + ~LowBlock() { + GuestArena::GuestArenaReset_nid_postfix(block, BlockBytes); + GuestArena::GuestArenaRelease_nid_postfix(block, BlockBytes); + } + + LowBlock(const LowBlock&) = delete; + LowBlock& operator=(const LowBlock&) = delete; + + std::uintptr_t Address() const { return reinterpret_cast(block); } + bool Addressable() const { return Address() + BlockBytes <= GcnAddressLimit; } + std::uint32_t* Words(std::uint32_t offset) const { return block + offset / 4u; } + +private: + std::uint32_t* block = nullptr; +}; + +std::array BufferDescriptor(std::uintptr_t address, std::uint32_t bytes) { + return {static_cast(address), static_cast((address >> 32u) & 0xffffu), bytes, 0x00027facu}; +} + +std::string Hex(std::uint32_t value) { + char text[16]; + std::snprintf(text, sizeof(text), "0x%08x", value); + return text; +} + +std::uint32_t Ordered(std::uint32_t bits) { + return (bits & 0x80000000u) != 0u ? 0x80000000u - (bits & 0x7fffffffu) : bits | 0x80000000u; +} + +std::uint32_t Distance(std::uint32_t actual, std::uint32_t expected) { + const std::uint32_t a = Ordered(actual); + const std::uint32_t e = Ordered(expected); + return a > e ? a - e : e - a; +} + +void Run(AgcDriver::VulkanDevice& device, const LowBlock& block) { + for (std::size_t lane = 0; lane < Rows.size(); ++lane) { + block.Words(InputOffset)[lane] = Rows[lane].input; + block.Words(OutputOffset)[lane] = 0xdeadbeefu; + } + std::vector userData(8, 0u); + const auto bytes = static_cast(Rows.size() * 4u); + const auto input = BufferDescriptor(reinterpret_cast(block.Words(InputOffset)), bytes); + const auto output = BufferDescriptor(reinterpret_cast(block.Words(OutputOffset)), bytes); + 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{{static_cast(Rows.size()), 1, 1}, 0u, {false, false, false}, false, 1}; + ShaderRecompiler::RecompileRequest request{ + {ShaderStage::Compute, reinterpret_cast(code.data()), code, 0, {}}, + {64, 0, userData, compute, std::nullopt, std::nullopt, memory}, + device.Target(), + {0, 0, 0, 128} + }; + request.useCache = false; + request.context.floatMode = ShaderRecompiler::ShaderFloatMode{0xc0u, true, false, false}; + const auto result = ShaderRecompiler::Recompile(request); + device.Dispatch(result, 1, 1, 1, {}, reinterpret_cast(code.data())); + device.WaitIdle(); +} + +void Check(const LowBlock& block) { + std::array stored{}; + AgcDriver::GuestMemory::Read(reinterpret_cast(block.Words(OutputOffset)), std::as_writable_bytes(std::span(stored)), 4); + for (std::size_t lane = 0; lane < Rows.size(); ++lane) { + const auto& row = Rows[lane]; + const std::string name = "GCN sin near zero: v_sin_f32(" + Hex(row.input) + ") is " + Hex(stored[lane]) + ", the PS4 returns " + Hex(row.expected); + Require(Distance(stored[lane], row.expected) <= row.tolerance, name + " (tolerance " + std::to_string(row.tolerance) + " ulp)"); + } +} + +} + +int main() { + try { + const auto device = OpenVulkanTestDevice(); + if (!device) return VulkanTestSkipped; + ShaderRecompiler::SetGcnGuestShaders(true); + const LowBlock block; + if (!block.Addressable()) { + std::printf("skipped, the guest arena block at 0x%llx lies above the 44-bit GCN V# address range\n", static_cast(block.Address())); + return VulkanTestSkipped; + } + Run(*device, block); + Check(block); + std::puts("GCN sin near zero 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/GuardedNullPointer.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/GuardedNullPointer.cpp index d05f48058596..9292d65322a3 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 000000000000..0e326b4dbd55 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/execution/IdleStoreYields.cpp @@ -0,0 +1,197 @@ +#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; + +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)); +} + +void StopsBetweenImages() { + Surface first(256, 256); + Surface second(256, 256); + { + GuestAllocations::Mutation mutation; + mutation.Add(first.texels, first.bytes, true, true, true); + mutation.Add(second.texels, second.bytes, true, true, true); + } + 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"); + GuestAllocations::Mutation mutation; + mutation.Remove(first.texels); + mutation.Remove(second.texels); +} + +void StopsWithinAnImage() { + Surface surface(2048, 1024); + Require(surface.bytes > Piece, "idle yield fixture: the large surface is not larger than one stored piece"); + { + GuestAllocations::Mutation mutation; + mutation.Add(surface.texels, surface.bytes, true, true, true); + } + 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"); + GuestAllocations::Mutation mutation; + mutation.Remove(surface.texels); +} + +} + +int main() { + try { + { + const auto device = OpenVulkanTestDevice(); + if (!device) return VulkanTestSkipped; + } + struct ShutdownGuard { + ~ShutdownGuard() { try { AgcDriverShutdown_nid_postfix(); } catch (...) {} } + } shutdown; + StopsBetweenImages(); + 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/ImagePlaneBiasOnSingleLevelVolume.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/ImagePlaneBiasOnSingleLevelVolume.cpp index 29875f7792f4..c4bb8c6f3ec9 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/ImagePlaneBiasOnSingleLevelVolume.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/ImagePlaneBiasOnSingleLevelVolume.cpp @@ -24,6 +24,7 @@ constexpr std::uint32_t Height = 16; constexpr std::uint32_t Size = 16; constexpr std::uint32_t Mips = 1; constexpr std::uint32_t Format8888UNorm = 56; +constexpr std::uint32_t Type2D = 9; constexpr std::uint32_t Type3D = 10; constexpr float SecondCoordinateScale = 1.0f / static_cast(Size); alignas(256) std::array Pixels{}; @@ -79,7 +80,7 @@ void FillTexture() { } } -void Draw(AgcDriver::VulkanDevice& device, std::array texture, std::array sampler, float bias, bool mixedSamplers = false) { +std::uint64_t Draw(AgcDriver::VulkanDevice& device, std::array texture, std::array sampler, float bias, bool mixedSamplers = false) { const auto& target = device.Target(); alignas(256) std::array code{}; std::copy_n(BiasPixelCode.begin(), 3u, code.begin()); @@ -134,8 +135,8 @@ void Draw(AgcDriver::VulkanDevice& device, std::array texture, target, PixelPushLayout(vertexPush, target) }; - fragment.useCache = false; const auto pixelResult = ShaderRecompiler::Recompile(fragment); + Require(!target.registrationModules || pixelResult.registrationModule, "single-level volume bias did not exercise its requested registration module"); const std::array shaders{{ {ShaderStage::Vertex, &vertexResult, 0}, {ShaderStage::Fragment, &pixelResult, PixelPushOffset(vertexPush, target)} @@ -159,6 +160,7 @@ void Draw(AgcDriver::VulkanDevice& device, std::array texture, const AgcDriver::Pm4::DrawParameters draw{0, static_cast(Triangle.size()), 0, 1, 0, false}; device.Draw(state, draw, shaders); device.WaitIdle(); + return pixelResult.variantId; } void Check(bool degamma = false) { @@ -197,8 +199,9 @@ int main() { const auto device = OpenVulkanTestDevice(); if (!device) return VulkanTestSkipped; FillTexture(); + std::uint64_t ordinaryArtifact = 0u; for (const float bias : {-16.0f, -0.5f, 0.0f, 0.5f, 16.0f}) { - Draw(*device, VolumeDescriptor(), SamplerDescriptor(), bias); + ordinaryArtifact = Draw(*device, VolumeDescriptor(), SamplerDescriptor(), bias); Check(); } for (const std::uint32_t reduction : {1u, 2u}) { @@ -207,14 +210,20 @@ int main() { Draw(*device, VolumeDescriptor(), sampler, 8.0f); Check(); } + auto plane = VolumeDescriptor(); + plane[3] = (plane[3] & ~(0xfu << 28u)) | (Type2D << 28u); + Require(Draw(*device, plane, SamplerDescriptor(), 0.0f) == ordinaryArtifact, "single-level volume and plane modes did not share their cached artifact"); + Check(); auto integerTexture = VolumeDescriptor(); integerTexture[1] = (integerTexture[1] & ~(0x1ffu << 20u)) | (60u << 20u); auto forcedSampler = SamplerDescriptor(); forcedSampler[0] |= 1u << 20u; for (const float bias : {-16.0f, 0.0f, 16.0f}) { - Draw(*device, integerTexture, forcedSampler, bias); + Require(Draw(*device, integerTexture, forcedSampler, bias) == ordinaryArtifact, "single-level volume numeric modes did not share their cached artifact"); Check(true); } + Require(Draw(*device, VolumeDescriptor(), SamplerDescriptor(), 0.0f) == ordinaryArtifact, "single-level volume did not reuse its original artifact after a numeric mode change"); + Check(); std::string mixedRefusal; try { Draw(*device, integerTexture, forcedSampler, 0.0f, true); diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/ImageSampleUnnormalized.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/ImageSampleUnnormalized.cpp index 4bf2fffbcecf..26c503233221 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/ImageSampleUnnormalized.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/ImageSampleUnnormalized.cpp @@ -340,6 +340,13 @@ int main() { Require(unequalFilterSamples == magFilterReference, "unnormalized sampler with unequal filters does not sample with its magnification filter"); const auto clampModeZeroSamples = Run(*device, Plain, single, {0x00008090u, 0x00fff000u, 0x05500000u, 0u}, coordinates); Require(clampModeZeroSamples == magFilterReference, "unnormalized sampler with clamp mode 0 does not sample with clamp mode 2"); + for (const std::size_t index : {std::size_t{0}, std::size_t{1}, std::size_t{4}}) { + auto truncated = Samplers[index].words; + truncated[0] |= 1u << 27u; + const auto truncatedSamples = Run(*device, Plain, single, truncated, coordinates); + Check(Plain, Samplers[index], 0u, "1-level image through an S# with TRUNC_COORD", coordinates, truncatedSamples); + Require(truncatedSamples == Run(*device, Plain, single, Samplers[index].words, coordinates), std::string(Samplers[index].name) + ": TRUNC_COORD changed the samples"); + } const auto constantView = [&](std::uint32_t type, std::uint32_t format, std::uint32_t swizzle) { auto descriptor = TextureDescriptor(SingleLevel.data(), 0u, 0u); descriptor[1] = (descriptor[1] & ~(0x1ffu << 20u)) | (format << 20u); diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/ImageTable.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/ImageTable.cpp index 19753d34822a..49c8267de866 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/ImageTableReuse.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/ImageTableReuse.cpp index a46aeb00bea4..65687323d8bc 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/ImageTableReuse.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/ImageTableReuse.cpp @@ -47,6 +47,8 @@ constexpr std::size_t BlockBytes = TexturesOffset + 2 * 65536; constexpr std::size_t UnimportableBytes = BlockBytes - 256; constexpr std::uint64_t CpuWriteResolutions = 1; +bool chained = false; + alignas(256) std::array Keys{}; alignas(256) std::array Output{}; alignas(256) std::array Srt{}; @@ -209,6 +211,10 @@ void ExpectWrites(const AgcDriver::Graphics::ImageTableReuseCounts& before, std: const auto now = AgcDriver::Graphics::ImageTableReuses(); const auto keptNow = now.writesKept - before.writesKept; const auto madeNow = now.writesMade - before.writesMade; + if (chained) { + Require(keptNow == 0u && madeNow == 0u, "image table reuse: " + what + ": table descriptors were recorded for a set from the shared pool chain"); + return; + } if (!keptSets) { Require(keptNow == 0u && madeNow == kept + made, "image table reuse: " + what + ": table descriptors were kept with kept sets turned off"); return; @@ -261,11 +267,15 @@ void RunTests(AgcDriver::VulkanDevice& device, const GuestBlock& block, const Gu std::vector unbumped[2]; auto before = AgcDriver::Graphics::ImageTableReuses(); + const auto pools = device.graphicsContext().descriptorCache->Counters(); std::thread thread([&] { unbumped[0] = Dispatch(device, result, 3); unbumped[1] = Dispatch(device, result, 3); }); thread.join(); + const auto poolsNow = device.graphicsContext().descriptorCache->Counters(); + chained = poolsNow.dedicatedPools + poolsNow.reusedSets == pools.dedicatedPools + pools.reusedSets; + if (chained) std::puts("the table's descriptor set fits the shared pool chain: kept table sets are not tested"); Require(unbumped[0] == Row(block.Texels(3)) && unbumped[1] == Row(block.Texels(3)), "image table reuse: a thread without a collect epoch sampled the wrong entry"); Expect(before, 0, 2, "a thread without a collect epoch"); diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/LdsMixedWidthAtomics.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/LdsMixedWidthAtomics.cpp index 250f80264acc..1a45fdb00f8a 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 000000000000..aae30364f568 --- /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 new file mode 100644 index 000000000000..4833c5a03b48 --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/execution/MeshVectorWindowWaves.cpp @@ -0,0 +1,182 @@ +#include "prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp" +#include "prx/libSceAgcDriver/Execution/include/GuestMemory.hpp" +#include "prx/libSceAgcDriver/Submit/include/Dcb.hpp" +#include "VulkanTestDevice.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +using AgcDriver::Graphics::Require; + +constexpr std::uint32_t Threads = 256; +constexpr std::uint32_t WaveSize = 64; +constexpr std::uint32_t Waves = Threads / WaveSize; +constexpr std::uint32_t GroupVertices = 192; +constexpr std::uint32_t GroupPrimitives = 64; +constexpr std::uint32_t Width = 64; +constexpr std::uint32_t Height = 64; + +alignas(256) std::array Mismatches{}; +alignas(256) std::array Pixels{}; +alignas(16) std::array Descriptor{}; + +constexpr std::uint32_t WindowBase = 10; +constexpr std::uint32_t WindowSize = 128; + +constexpr std::uint32_t Branch(std::uint32_t opcode, std::size_t from, std::size_t to) { + return opcode | (static_cast(static_cast(to) - static_cast(from) - 1) & 0xffffu); +} + +alignas(256) constexpr auto GeometryCode = [] { + std::array code{}; + std::size_t at = 0; + const auto put = [&](std::initializer_list words) { + for (const auto word : words) code[at++] = word; + }; + put({0xd7650001u, 0x000100c1u, 0xd7660001u, 0x000202c1u, 0x9382ff03u, 0x00040018u, 0xd7460002u, 0x04050c02u}); + put({0xbefe04c1u, 0xf4080204u, 0xfa000000u, 0x34100482u, 0x34060488u, 0x8f068502u}); + put({0x4a000000u | (WindowBase << 17u) | (3u << 9u) | 0x81u}); + for (std::uint32_t reg = WindowBase + 1u; reg < WindowBase + WindowSize; ++reg) put({0x4a000000u | (reg << 17u) | ((reg - 1u) << 9u) | 0x81u}); + put({0xbf8a0000u, 0x7e0c0280u, 0xbe850380u}); + const auto loop = at; + put({0x807c0605u, 0x877cff7cu, WindowSize - 1u, 0x7d840c80u, 0xbe8c246au}); + const auto skip = at; + put({0u, 0x7e08870au, 0x7e148504u, 0x4a0a067cu, 0x4a0a0a81u, 0x7d8a0b04u, 0x500c0c80u}); + code[skip] = Branch(0xbf880000u, skip, at); + put({0x88fe0c7eu, 0x80058105u, 0xbf0aff05u, WindowSize}); + put({Branch(0xbf850000u, at, loop)}); + put({0x4a0a0681u, 0x7d8a0b0au, 0x500c0c80u, 0x4a0a06c0u, 0x7d8a0b49u, 0x500c0c80u, 0x4a0a06ffu, WindowSize, 0x7d8a0b89u, 0x500c0c80u}); + put({0xbf8cc07fu, 0xe0701000u, 0x80020608u, 0xbf8c0000u}); + put({0xbefc0380u, 0xbf900009u, 0xbefe0480u, 0xf8000941u, 0x00000000u, 0xf80008cfu, 0x00000000u, 0xbf810000u}); + if (at != code.size()) throw "geometry program size"; + return code; +}(); + +alignas(256) constexpr std::array PixelCode{0x7e0e02f2u, 0xf800180fu, 0x07070707u, 0xbf810000u}; + +struct Header { + Shader shader{}; + ShaderUserData users{}; +}; + +Header GeometryHeader{}; +Header PixelHeader{}; + +void Register(Header& header, const std::uint32_t* code, std::size_t size, 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(size); + header.shader.code = code; + header.shader.type = type; + header.shader.user_data = &header.users; + AgcDriverRegisterShader_nid_postfix(&header.shader); +} + +void Write(std::vector& commands, std::uint32_t opcode, std::uint32_t offset, std::uint32_t value) { + commands.insert(commands.end(), {0xc0010000u | (opcode << 8u), offset, value}); +} + +void Draw() { + Mismatches.fill(0xdeadbeefu); + const auto color = reinterpret_cast(Pixels.data()); + const auto geometry = reinterpret_cast(GeometryCode.data()); + const auto pixel = reinterpret_cast(PixelCode.data()); + const auto table = reinterpret_cast(Descriptor.data()); + const std::vector> context{ + {0x2d5, 0x20}, {0x1ff, Threads}, {0x2ce, 3}, {0x29b, 2}, {0x2ab, 4}, {0x260, 0}, + {0x1b6, 1}, {0x1b3, 2}, {0x1b4, 2}, {0x191, 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, ((Height - 1u) << 14u) | (Width - 1u)}, + {0x3b8, 0x9000000}, {0x1e0, 0}, {0xc, 0}, {0xd, (Height << 16u) | Width}, + {0x81, 0x80000000}, {0x82, (Height << 16u) | Width}, + {0x90, 0x80000000}, {0x91, (Height << 16u) | Width}, + {0x94, 0x80000000}, {0x95, (Height << 16u) | Width}, + {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(32.0f)}, {0x112, std::bit_cast(32.0f)}, + {0x113, std::bit_cast(1.0f)}, {0x114, 0}, + {0xb4, 0}, {0xb5, std::bit_cast(1.0f)} + }; + const std::vector> shaders{ + {0xc8, static_cast(geometry >> 8u)}, {0xc9, static_cast(geometry >> 40u)}, + {0x8a, 0x600c0000u}, {0x8b, (32u << 19u) | (3u << 16u) | (2u << 1u)}, + {0x8c, static_cast(table)}, {0x8d, static_cast(table >> 32u)}, + {0x8, static_cast(pixel >> 8u)}, {0x9, static_cast(pixel >> 40u)}, {0xb, 0} + }; + std::vector commands; + Write(commands, 0x79, 0x242, 4u); + Write(commands, 0x79, 0x25b, (GroupVertices << 9u) | GroupPrimitives); + for (const auto& [offset, value] : context) Write(commands, 0x69, offset, value); + for (const auto& [offset, value] : shaders) Write(commands, 0x76, offset, value); + commands.insert(commands.end(), {0xc0012d00u, GroupVertices, 2u}); + Packet packet{commands.data(), static_cast(commands.size()), 0, {}}; + Require(sceAgcDriverSubmitDcb(&packet) == 0, "mesh vector window submission failed"); + AgcDriverWaitIdle_nid_postfix(); + AgcDriver::GuestMemory::FlushGpuWrites(reinterpret_cast(Mismatches.data()), sizeof(Mismatches)); +} + +void Check() { + std::array wrong{}; + std::string first; + for (std::uint32_t thread = 0; thread < Threads; ++thread) { + if (Mismatches[thread] == 0u) continue; + ++wrong[thread / WaveSize]; + if (first.empty()) first = "thread " + std::to_string(thread) + " read " + std::to_string(Mismatches[thread]) + " window registers wrong"; + } + if (first.empty()) return; + std::string summary = first + "; wrong threads per wave:"; + for (const auto count : wrong) summary += " " + std::to_string(count); + Require(false, "mesh vector window: " + summary); +} + +} + +int main() { + try { + { + const auto device = OpenVulkanTestDevice(); + 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; + } + } + const auto address = reinterpret_cast(Mismatches.data()); + Descriptor = {static_cast(address), static_cast((address >> 32u) & 0xffffu), static_cast(sizeof(Mismatches)), 0x31016facu}; + Register(GeometryHeader, GeometryCode.data(), sizeof(GeometryCode), 2); + Register(PixelHeader, PixelCode.data(), sizeof(PixelCode), 1); + for (std::uint32_t pass = 0; pass < 2; ++pass) { + Draw(); + Check(); + } + AgcDriverShutdown_nid_postfix(); + std::cout << "mesh vector window tests passed\n"; + return 0; + } catch (const std::exception& error) { + std::cerr << error.what() << '\n'; + AgcDriverShutdown_nid_postfix(); + return 1; + } +} diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/NativeMultisampleDepth.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/NativeMultisampleDepth.cpp index 9dc8ed545806..7144710b9902 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/NativeMultisampleDepth.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/NativeMultisampleDepth.cpp @@ -128,12 +128,31 @@ class Device { 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 @@ class Device { 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/OversizedDescriptorSets.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/OversizedDescriptorSets.cpp index 213d8c7aaf55..c3d018387c2d 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/OversizedDescriptorSets.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/OversizedDescriptorSets.cpp @@ -32,6 +32,8 @@ class Device { Device() { #ifdef _WIN32 library = SDL_LoadObject("vulkan-1.dll"); +#elif defined(__APPLE__) + library = SDL_LoadObject("libvulkan.1.dylib"); #else library = SDL_LoadObject("libvulkan.so.1"); #endif @@ -43,6 +45,12 @@ class Device { application.apiVersion = VK_API_VERSION_1_1; VkInstanceCreateInfo info{VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO}; info.pApplicationInfo = &application; +#ifdef __APPLE__ + const char* portability = VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME; + info.flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; + info.enabledExtensionCount = 1; + info.ppEnabledExtensionNames = &portability; +#endif Check(function("vkCreateInstance")(&info, nullptr, &instance), "vkCreateInstance"); std::uint32_t count = 0; const auto enumerate = function("vkEnumeratePhysicalDevices"); diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/OwnRefreshRepackAlias.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/OwnRefreshRepackAlias.cpp new file mode 100644 index 000000000000..72fe9296551d --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/execution/OwnRefreshRepackAlias.cpp @@ -0,0 +1,260 @@ +#include "prx/libSceAgcDriver/Execution/include/GuestMemory.hpp" +#include "prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp" +#include "prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.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 +#include + +namespace AgcDriver { + +struct VulkanDeviceTestAccess { + static Graphics::Context ContextOf(const VulkanDevice& device) { return device.graphicsContext(); } +}; + +} + +namespace { + +using AgcDriver::Graphics::CompiledShader; +using AgcDriver::Graphics::Require; +using AgcDriver::Graphics::ShaderResources; +using AgcDriver::Graphics::StorageTexture; +using ShaderRecompiler::ShaderStage; + +constexpr std::uint32_t Threads = 32; +constexpr std::uint32_t Format8888UNorm = 56; +constexpr std::uint32_t Format10_11_11Float = 43; +constexpr std::uint32_t Format32Float = 22; +constexpr std::uint32_t TileR64KBX = 0x1b; +constexpr std::uint32_t Type2D = 9; +constexpr std::uint32_t ClampEdge = 2; +constexpr std::uint32_t LessEqual = 3; +constexpr std::size_t BlockBytes = 2u << 20u; + +alignas(256) constexpr std::array StoreCode{ + 0x7e020280, 0x7e04020c, 0xf0201108, 0x00010200, 0xbf810000, +}; + +alignas(256) constexpr std::array SampleCode{ + 0x1614008c, 0xe03c1000, 0x8000010a, 0xbf8c3f70, 0xf09c0f08, 0x00820402, 0xbf8c3f70, + 0x34160084, 0xe0781000, 0x8001040b, 0xbf810000, 0xbf810000, +}; + +alignas(256) constexpr std::array CompareSampleCode{ + 0x1614008c, 0xe03c1000, 0x8000010a, 0xbf8c3f70, 0xf0bc0108, 0x00820401, 0xbf8c3f70, + 0x34160082, 0xe0701000, 0x8001040b, 0xbf810000, 0xbf810000, 0xbf810000, +}; + +struct Case { + std::string name; + std::uint32_t format; + std::uint32_t side; + std::span sample; + bool compare; +}; + +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(BlockBytes, 65536)); + if (block != nullptr) GuestArena::GuestArenaCommit_nid_postfix(block, BlockBytes, PAGE_READWRITE, BlockBytes); +#else + constexpr std::uintptr_t alignment = 65536; + void* mapped = mmap(nullptr, BlockBytes + 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 + BlockBytes != begin + BlockBytes + alignment) munmap(reinterpret_cast(aligned + BlockBytes), begin + alignment - aligned); + block = reinterpret_cast(aligned); + GuestWriteWatch::GuestWriteWatchRegister_nid_postfix(block, BlockBytes); + } +#endif + Require(block != nullptr, "own refresh repack alias: cannot allocate a guest block"); + std::memset(block, 0, BlockBytes); + GuestAllocations::Mutation().Add(block, BlockBytes, true, true, true); + AgcDriver::GuestMemory::CollectWritesUncached(AddressOf(block), BlockBytes); + } + + ~GuestBlock() { + GuestAllocations::Mutation().Remove(block); +#ifdef _WIN32 + GuestArena::GuestArenaReset_nid_postfix(block, BlockBytes); + GuestArena::GuestArenaRelease_nid_postfix(block, BlockBytes); +#else + munmap(block, BlockBytes); + GuestWriteWatch::GuestWriteWatchUnregister_nid_postfix(block, BlockBytes); +#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, std::uint32_t format, std::uint32_t side) { + const auto address = AddressOf(texels); + return { + static_cast(address >> 8u), + static_cast((address >> 40u) & 0xffu) | (format << 20u) | (((side - 1u) & 3u) << 30u), + ((side - 1u) >> 2u) | ((side - 1u) << 14u), + 0xfacu | (TileR64KBX << 20u) | (Type2D << 28u), + 0u, + 0u, + 0u, + 0u, + }; +} + +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}; +} + +ShaderRecompiler::RecompileResult Compile(const AgcDriver::VulkanDevice& device, std::span code, std::span 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; + return ShaderRecompiler::Recompile(request); +} + +void Store(AgcDriver::VulkanDevice& device, const std::uint8_t* texels, std::uint32_t side, std::uint32_t value) { + std::vector userData(16, 0u); + const auto texture = TextureDescriptor(texels, Format8888UNorm, side); + std::copy(texture.begin(), texture.end(), userData.begin() + 4); + userData[12] = value; + const auto result = Compile(device, StoreCode, userData); + device.Dispatch(result, 1, 1, 1, {}, reinterpret_cast(StoreCode.data())); + device.WaitIdle(); +} + +std::vector SampleUserData(const std::uint8_t* texels, std::uint8_t* buffers, const Case& test) { + std::vector userData(24, 0u); + const auto input = BufferDescriptor(buffers, Threads * 12u); + const auto output = BufferDescriptor(buffers + 4096u, Threads * 16u); + const auto texture = TextureDescriptor(texels, test.format, test.side); + const std::array sampler{ClampEdge | (ClampEdge << 3u) | (ClampEdge << 6u) | (test.compare ? LessEqual << 12u : 0u), 0u, 0u, 0u}; + std::copy(input.begin(), input.end(), userData.begin()); + std::copy(output.begin(), output.end(), userData.begin() + 4); + std::copy(texture.begin(), texture.end(), userData.begin() + 8); + std::copy(sampler.begin(), sampler.end(), userData.begin() + 16); + return userData; +} + +std::string Path(const ShaderResources::ProofReport& report) { + switch (report.path) { + case ShaderResources::ProofPath::Fast: return "fast path"; + case ShaderResources::ProofPath::OwnRefreshed: return "own-object refresh"; + default: return "full walk"; + } +} + +bool Run(AgcDriver::VulkanDevice& device, const Case& test) { + GuestBlock block; + GuestBlock buffers; + auto* texels = block.Data(); + const auto surface = AddressOf(texels); + const auto bytes = static_cast(AgcDriver::Graphics::DescribeSurface(AgcDriver::Graphics::DecodeTextureResource(TextureDescriptor(texels, test.format, test.side))).guestBytes); + std::lock_guard gpu(AgcDriver::GuestMemory::GpuMutex()); + const auto context = AgcDriver::VulkanDeviceTestAccess::ContextOf(device); + Store(device, texels, test.side, 0x38003800u); + StorageTexture::FlushPending(surface, bytes, nullptr, "test"); + device.WaitIdle(); + AgcDriver::GuestMemory::CollectWritesUncached(surface, bytes); + if (!AgcDriver::Graphics::HostImportCovers(context, surface, bytes)) { + std::printf("%s: skipped, the device does not import guest memory\n", test.name.c_str()); + return false; + } + const bool compared = !AgcDriver::GuestMemory::Watched(surface, bytes); + std::printf("%s: the surface is %s\n", test.name.c_str(), compared ? "compared, not write-watched" : "write-watched"); + Require(StorageTexture::FindPending(surface, bytes) == nullptr, test.name + ": the first 8888 unorm store stayed pending after its flush"); + const auto userData = SampleUserData(texels, buffers.Data(), test); + const auto program = Compile(device, test.sample, userData); + const CompiledShader shader{ShaderStage::Compute, &program, 0}; + auto resources = std::make_shared(context, shader); + Require(resources->Reusable() && resources->SampledTextures().size() == 1, test.name + ": the set is not reusable over one texture"); + const auto view = resources->SampledTextures().front(); + const auto source = view->SharedStorageSource(); + Require(source != nullptr && source->Descriptor().format == test.format, test.name + ": the view is not a view of its own storage image"); + for (const std::uint32_t value : {0x3c003c00u, 0x41004100u}) { + Store(device, texels, test.side, value); + const auto alias = StorageTexture::FindPending(surface, bytes); + Require(alias != nullptr && alias != source && alias->Descriptor().format == Format8888UNorm, test.name + ": the 8888 unorm store left no pending image of its own over the surface"); + ShaderResources::ProofReport report; + const bool current = resources->Revalidate(shader, &report); + Require(current, test.name + ": the set over the refreshed view was not proved current"); + if (!compared) Require(report.path == ShaderResources::ProofPath::OwnRefreshed, test.name + ": a set whose view refreshed its own image over a pending 8888 unorm alias took the " + Path(report) + ", not the own-object refresh"); + Require(resources->SampledTextures().front() == view, test.name + ": the proof replaced the view"); + } + StorageTexture::FlushPending(surface, bytes, nullptr, "test"); + device.WaitIdle(); + AgcDriver::Graphics::ClearCachedTextures(device.Device()); + return true; +} + +} + +int main(int argc, char** argv) { +#ifdef _WIN32 + if (std::getenv("APS5_TEMPLATE_AUDIT_MS") == nullptr) _putenv_s("APS5_TEMPLATE_AUDIT_MS", "0"); + if (std::getenv("APS5_VERIFY_PROOFS") == nullptr) _putenv_s("APS5_VERIFY_PROOFS", "1"); +#else + setenv("APS5_TEMPLATE_AUDIT_MS", "0", 0); + setenv("APS5_VERIFY_PROOFS", "1", 0); +#endif + try { + const auto device = OpenVulkanTestDevice(); + if (!device) return VulkanTestSkipped; + const std::string only = argc == 2 ? argv[1] : ""; + if (only.empty() || only == "repack") { + if (!Run(*device, {"10_11_11 float view", Format10_11_11Float, 128, SampleCode, false})) return VulkanTestSkipped; + } + if (only.empty() || only == "compare") { + if (!Run(*device, {"R32F comparison view", Format32Float, 512, CompareSampleCode, true})) return VulkanTestSkipped; + } + std::puts("own refresh repack alias 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/PackedUnorm4444MultisamplePartialWrite.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/PackedUnorm4444MultisamplePartialWrite.cpp index 894ccc375a1c..d4fe925cb9d0 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/PackedUnorm4444MultisamplePartialWrite.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/PackedUnorm4444MultisamplePartialWrite.cpp @@ -197,8 +197,9 @@ AgcDriver::Graphics::State TargetState(const Block& block, std::uint32_t exporte char detail[256]; std::snprintf(detail, sizeof(detail), "CB_TARGET_MASK 0x%x of the %u-sample 4_4_4_4 target decoded %zu targets, %u samples, word mask 0x%04x, write mask 0x%x and %s shading", exportedMask, samples, decoded.colors.size(), decoded.samples, color.partialWriteMask, decoded.blends.front().colorWriteMask, decoded.perSampleShading ? "per-sample" : "pixel-rate"); Require(decoded.colors.size() == 1u && decoded.samples == samples && color.samples == samples && color.partialWriteMask == (partial ? AgcDriver::Graphics::PackedWriteMask(color.componentMapping, exportedMask) : 0u) && decoded.blends.size() == 1u && decoded.blends.front().colorWriteMask == (partial ? 0u : 0xfu) && decoded.blend.colorWriteMask == decoded.blends.front().colorWriteMask && decoded.perSampleShading == partial, detail); - const auto merge = AgcDriver::Graphics::ExportTargetMerge(decoded); - Require(merge.mask == color.partialWriteMask && merge.samples == (partial ? samples : 1u) && !merge.depthStencilWrites && merge.descriptor == (partial ? AgcDriver::Graphics::EncodeTextureResource(AgcDriver::Graphics::TargetMergeSurface(color)) : std::array{}), "the decoded " + std::to_string(samples) + "-sample target exported another merge than its own surface"); + const auto merges = AgcDriver::Graphics::ExportTargetMerges(decoded); + const auto merge = merges.empty() ? ShaderRecompiler::TargetMerge{} : merges.front(); + Require(merges.size() == (partial ? 1u : 0u) && merge.mask == color.partialWriteMask && merge.samples == (partial ? samples : 1u) && !merge.depthStencilWrites && merge.descriptor == (partial ? AgcDriver::Graphics::EncodeTextureResource(AgcDriver::Graphics::TargetMergeSurface(color)) : std::array{}), "the decoded " + std::to_string(samples) + "-sample target exported another merge than its own surface"); AgcDriver::Graphics::State state{}; state.stages = {AgcDriver::Graphics::ShaderPath::Vertex, 0u, 64u, 64u, std::nullopt, std::nullopt}; state.colors = decoded.colors; @@ -251,7 +252,7 @@ void Draw(AgcDriver::VulkanDevice& device, const AgcDriver::Graphics::State& sta fragment.shader.code = snapshot.code; fragment.context.pixel = AgcDriver::Graphics::DecodePixelStageInfo(context, AgcDriver::Graphics::ExportMappings(state)); fragment.context.pixel->targetExportPacking = AgcDriver::Graphics::ExportPackings(state); - fragment.context.pixel->targetMerge = AgcDriver::Graphics::ExportTargetMerge(state); + fragment.context.pixel->targetMerges = AgcDriver::Graphics::ExportTargetMerges(state); const ShaderRecompiler::SrtRuntime runtime{}; const auto invocation = AgcDriver::DriverDetail::InvocationFor(snapshot, 0, fragment); const auto pixelResult = invocation.Materialize(*invocation.Capture(runtime)); diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/PackedUnorm4444PartialWrite.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/PackedUnorm4444PartialWrite.cpp index 4afab2612184..09cb138925ed 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/PackedUnorm4444PartialWrite.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/PackedUnorm4444PartialWrite.cpp @@ -279,9 +279,9 @@ std::uint32_t Draw(AgcDriver::VulkanDevice& device, AgcDriver::Graphics::ColorTa fragment.shader.code = snapshot.code; fragment.context.pixel = AgcDriver::Graphics::DecodePixelStageInfo(context, AgcDriver::Graphics::ExportMappings(state)); fragment.context.pixel->targetExportPacking = AgcDriver::Graphics::ExportPackings(state); - fragment.context.pixel->targetMerge = AgcDriver::Graphics::ExportTargetMerge(state); - Require(fragment.context.pixel->pixelKillEnable == ((setup.shaderControl & LateKill) != 0u) && !fragment.context.pixel->earlyZ && fragment.context.pixel->targetMerge.depthStencilWrites == (partial && setup.depth != 0 && setup.depthWrite), "the draw's pixel kill under late tests or its depth and stencil writes did not decode"); - Require((fragment.context.pixel->targetMerge.mask != 0u) == partial && fragment.context.pixel->targetMerge.mask == color.partialWriteMask, "the draw's target merge disagrees with its write mask"); + fragment.context.pixel->targetMerges = AgcDriver::Graphics::ExportTargetMerges(state); + Require(fragment.context.pixel->pixelKillEnable == ((setup.shaderControl & LateKill) != 0u) && !fragment.context.pixel->earlyZ && std::ranges::all_of(fragment.context.pixel->targetMerges, [&](const ShaderRecompiler::TargetMerge& merge) { return merge.depthStencilWrites == (setup.depth != 0 && setup.depthWrite); }), "the draw's pixel kill under late tests or its depth and stencil writes did not decode"); + Require(fragment.context.pixel->targetMerges.size() == (partial ? 1u : 0u) && (!partial || fragment.context.pixel->targetMerges.front().mask == color.partialWriteMask), "the draw's target merge disagrees with its write mask"); const ShaderRecompiler::SrtRuntime runtime{}; const auto invocation = AgcDriver::DriverDetail::InvocationFor(snapshot, 0, fragment); const auto pixelResult = invocation.Materialize(*invocation.Capture(runtime)); diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/PipelineJournal.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/PipelineJournal.cpp index 50962142c0fd..664f6c4940aa 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 499685434663..02b9256f7ac3 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 9b80ce493cc5..06615fbf2ad0 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 @@ class StderrCapture { 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 548aa80dd1ae..536ab5610af8 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/ResidentHeapMirror.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/ResidentHeapMirror.cpp @@ -137,6 +137,14 @@ class GuestHeap { 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 4aacbc435770..f4218f55cfc6 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 @@ -36,10 +37,16 @@ #include #include #include +#include #include #include #include #include +#ifdef _WIN32 +#include +#else +#include +#endif namespace AgcDriver { @@ -81,6 +88,9 @@ constexpr std::uint32_t TileD64KBX = 0x1a; constexpr std::uint32_t Threads = 32; constexpr std::uint32_t Words = 32; constexpr std::uint32_t LoadResult = 12; +constexpr std::uint32_t BdaThreads = 64; +constexpr std::uint32_t BdaLoadBase = 0x100; +constexpr std::uint32_t BdaOutputBase = 0x8000; constexpr std::array Drawn{0.25f, 0.5f, 0.125f, 1.0f}; constexpr double EdgeMargin = 1.0 / 32.0; constexpr std::uint32_t FillOnes = 0x3c003c00u; @@ -130,6 +140,13 @@ alignas(256) constexpr std::array PlaneCode{ 0x80001a01, 0xe070105c, 0x80001b01, 0xbf810000, }; +constexpr auto AdjustedPlaneCodeWords = [] { + auto code = PlaneCode; + code[14] = 0xf0800f09u; + return code; +}(); +alignas(256) constexpr std::array AdjustedPlaneCode = AdjustedPlaneCodeWords; + alignas(256) constexpr std::array StoreCode{ 0x34020087, 0xe030100c, 0x80000501, 0xe0301010, 0x80000601, 0xe0301014, 0x80000701, 0xe0301018, 0x80001001, 0xe030101c, 0x80001101, 0xe0301020, 0x80001201, 0xe0301024, 0x80001301, 0xbf8c3f70, @@ -142,12 +159,56 @@ struct SampleWrite { std::uint32_t sample; }; +alignas(256) constexpr std::array BdaSpanCode{ + 0x34040084, 0x4a0404ff, BdaLoadBase, 0x34080081, 0x36080882, 0x4a040504, 0x34060083, 0x4a0606ff, + BdaOutputBase, 0xdc388ff8, 0x04000002, 0xbf8c3f70, 0xdc708000, 0x00000503, 0xdc708004, 0x00000703, 0xbf810000, +}; + constexpr std::array, 3> Triangle{{ {-1.0f, -1.0f, 0.5f, 1.0f}, {0.83f, -1.0f, 0.5f, 1.0f}, {-1.0f, 0.71f, 0.5f, 1.0f} }}; alignas(256) std::array Buffer{}; +alignas(256) constexpr std::array BufferLoadCode{0x34020082u, 0xe8001000u | (20u << 19u), 0x80000201u, 0xbf8c0000u, 0xe0701000u, 0x80010201u, 0xbf810000u}; + +class StderrCapture { +public: + StderrCapture() { + std::fflush(stderr); + file = TemporaryFile::Open(); + Require(file != nullptr, "cannot open a temporary file for stderr"); +#ifdef _WIN32 + saved = _dup(_fileno(stderr)); + _dup2(_fileno(file), _fileno(stderr)); +#else + saved = dup(fileno(stderr)); + dup2(fileno(file), fileno(stderr)); +#endif + } + std::string Finish() { + std::fflush(stderr); +#ifdef _WIN32 + _dup2(saved, _fileno(stderr)); + _close(saved); +#else + dup2(saved, fileno(stderr)); + close(saved); +#endif + std::rewind(file); + std::string text; + char buffer[4096]; + for (std::size_t read = 0; (read = std::fread(buffer, 1, sizeof(buffer), file)) != 0;) text.append(buffer, read); + std::fclose(file); + std::fwrite(text.data(), 1, text.size(), stderr); + return text; + } + +private: + std::FILE* file = nullptr; + int saved = -1; +}; + struct Block { explicit Block(std::size_t bytes, bool watched = false) : bytes(bytes), watched(watched) { #ifdef _WIN32 @@ -206,20 +267,24 @@ struct Block { std::uint8_t* data = nullptr; }; -AgcDriver::Graphics::ColorTarget DecodeTarget(const Block& block) { +AgcDriver::Graphics::ColorTarget DecodeTarget(std::uint64_t address, std::uint32_t sampleShift = SampleShift, VkExtent2D extent = {Side, Side}) { AgcDriver::Registers cx; - cx[0x318] = static_cast(block.Address() >> 8u); + cx[0x318] = static_cast(address >> 8u); cx[0x31b] = 0; cx[0x31c] = Float16x4Info; - cx[0x31d] = MultisampledAttrib; - cx[0x3b0] = ((Side - 1u) << 14u) | (Side - 1u); + cx[0x31d] = (sampleShift << 12u) | (sampleShift << 15u); + cx[0x3b0] = ((extent.width - 1u) << 14u) | (extent.height - 1u); cx[0x3b8] = TiledAttrib3; - cx[0x390] = static_cast(block.Address() >> 40u); + cx[0x390] = static_cast(address >> 40u); const auto color = AgcDriver::Graphics::DecodeColorBuffer(cx, 0); - Require(color.format == VK_FORMAT_R16G16B16A16_SFLOAT && color.samples == Samples && color.extent.width == Side && color.extent.height == Side, "the target did not decode as a 16x16 RGBA16F surface of 4 samples"); + Require(color.format == VK_FORMAT_R16G16B16A16_SFLOAT && color.samples == 1u << sampleShift && color.extent.width == extent.width && color.extent.height == extent.height, "the target did not decode as an RGBA16F surface of " + std::to_string(extent.width) + "x" + std::to_string(extent.height) + " and " + std::to_string(1u << sampleShift) + " samples"); return color; } +AgcDriver::Graphics::ColorTarget DecodeTarget(const Block& block) { + return DecodeTarget(block.Address()); +} + AgcDriver::Graphics::ColorTarget DecodeSwappedTarget(const Block& block) { AgcDriver::Registers cx; cx[0x318] = static_cast(block.Address() >> 8u); @@ -317,11 +382,11 @@ AgcDriver::Graphics::State TargetState(const AgcDriver::Graphics::ColorTarget& c state.colors = {color}; state.color = color; state.hasColorTarget = true; - state.renderExtent = {Side, Side}; + state.renderExtent = color.extent; state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; - state.viewport = {0, static_cast(Side), static_cast(Side), -static_cast(Side), 0, 1}; + state.viewport = {0, static_cast(color.extent.height), static_cast(color.extent.width), -static_cast(color.extent.height), 0, 1}; state.negativeOneToOne = false; - state.scissor = {{0, 0}, {Side, Side}}; + state.scissor = {{0, 0}, color.extent}; state.cullMode = VK_CULL_MODE_NONE; state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; state.blends = {blend}; @@ -509,10 +574,11 @@ std::vector> LoadSamples(AgcDriver::VulkanDevice& device, c return LoadSamples(device, TargetDescriptor(block, SampleShift, format, tileMode)); } -void CheckFirstSampleReads(AgcDriver::VulkanDevice& device, const std::array& texture, const std::vector>& samples, bool distinct, const std::string& what) { +void CheckFirstSampleReads(AgcDriver::VulkanDevice& device, const std::array& texture, const std::vector>& samples, bool distinct, const std::string& what, const std::array& code = PlaneCode, const char* second = "image_sample_lz") { std::vector userData; - const auto program = CompileProgram(device, PlaneCode, texture, userData, PointMipSampler); - const auto codeAddress = reinterpret_cast(PlaneCode.data()); + const auto program = CompileProgram(device, code, texture, userData, PointMipSampler); + const auto codeAddress = reinterpret_cast(code.data()); + const auto secondRead = std::string("a DIM 2D ") + second; const auto bits = [&](std::size_t index) { return std::bit_cast>(samples[index]); }; bool differs = false; for (std::uint32_t first = 0; first < Side * Side; first += Threads) { @@ -532,7 +598,7 @@ void CheckFirstSampleReads(AgcDriver::VulkanDevice& device, const std::array texel{}; std::copy_n(&Buffer[tid * Words + LoadResult + read * 4u], texel.size(), texel.begin()); char where[200]; - std::snprintf(where, sizeof(where), "%s of pixel (%u, %u) read %08x %08x %08x %08x, sample 0 is %08x %08x %08x %08x", read == 0u ? "a DIM 2D image_load" : read == 1u ? "a DIM 2D image_sample_lz" : "a DIM 2D image_sample_l at LOD 1", pixel % Side, pixel / Side, texel[0], texel[1], texel[2], texel[3], sampleZero[0], sampleZero[1], sampleZero[2], sampleZero[3]); + std::snprintf(where, sizeof(where), "%s of pixel (%u, %u) read %08x %08x %08x %08x, sample 0 is %08x %08x %08x %08x", read == 0u ? "a DIM 2D image_load" : read == 1u ? secondRead.c_str() : "a DIM 2D image_sample_l at LOD 1", pixel % Side, pixel / Side, texel[0], texel[1], texel[2], texel[3], sampleZero[0], sampleZero[1], sampleZero[2], sampleZero[3]); Require(texel == sampleZero, std::string(where) + " " + what); } } @@ -673,10 +739,188 @@ void CheckNativeIndices(AgcDriver::VulkanDevice& device, const Block& source, co Require(missed == 0, "native indices missed " + std::to_string(missed) + " resident-image refusals"); } +void CheckOverwrittenTarget(AgcDriver::VulkanDevice& device) { + Block reused(4u * BlockBytes, true); + if (!AgcDriver::GuestMemory::Watched(reused.Address(), reused.bytes)) { + std::puts("overwritten target retirement not tested: the guest block is not write-watched"); + return; + } + const auto color = DecodeTarget(reused); + const auto state = TargetState(color); + Draw(device, state); + device.WaitIdle(); + CheckSamples(state, LoadSamples(device, reused), {}); + const auto colorBytes = AgcDriver::Graphics::MultisampledColorBytes(color); + Require(colorBytes >= 2u * 256u && colorBytes <= reused.bytes, "the watched 4x target's color memory does not fit its block"); + std::string refusal; + try { + AgcDriver::Graphics::RequireNoMultisampleTarget(reused.Address(), 64u, "a read of a drawn target the title has not written"); + } catch (const std::exception& error) { + refusal = error.what(); + } + Require(refusal.find("whose samples are only on the host") != std::string::npos, "a drawn target in watched memory is not guarded"); + const auto written = reused.Address() + colorBytes / 2u; + std::memset(reused.data + colorBytes / 2u, 0x5a, 256u); + AgcDriver::Graphics::RequireNoMultisampleTarget(written, 256u, "a read of target memory the title wrote over"); + AgcDriver::Graphics::RequireNoMultisampleTarget(reused.Address(), 64u, "a read of the rest of a target the title wrote over"); + Draw(device, state); + device.WaitIdle(); + refusal.clear(); + try { + AgcDriver::Graphics::RequireNoMultisampleTarget(written, 256u, "a read of a target drawn again over memory the title wrote"); + } catch (const std::exception& error) { + refusal = error.what(); + } + Require(refusal.find("whose samples are only on the host") != std::string::npos, "a target drawn again after the title wrote over it is not guarded"); + std::puts("a drawn 4x target in watched memory stays guarded until the title writes over its color memory; the next guarded read then retires it, and a later draw guards the new target"); +} + +bool Refused(std::uint64_t address, std::size_t bytes, const char* access) { + try { + AgcDriver::Graphics::RequireNoMultisampleTarget(address, bytes, access); + } catch (const std::exception& error) { + if (std::string_view(error.what()).find("whose samples are only on the host") == std::string_view::npos) throw; + return true; + } + return false; +} + +void CheckClaimedTargets(AgcDriver::VulkanDevice& device) { + const auto context = AgcDriver::VulkanDeviceTestAccess::ContextOf(device); + if ((context.limits.framebufferColorSampleCounts & VK_SAMPLE_COUNT_2_BIT) == 0 || (context.limits.framebufferStencilSampleCounts & VK_SAMPLE_COUNT_2_BIT) == 0) { + std::puts("claimed target retirement not tested: the device cannot render two-sample color and stencil"); + return; + } + const auto bindStencil = [&](const Block& plane, const Block& depth) { + AgcDriver::Graphics::DepthTarget stencil{depth.Address(), plane.Address(), {Side, Side}, VK_FORMAT_D32_SFLOAT_S8_UINT, 1.0f, 0u, depth.Address() + BlockBytes, false, 2u}; + stencil.htileDepthOnly = true; + AgcDriver::Graphics::DepthSurfaceView(context, stencil); + device.WaitIdle(); + }; + for (const bool drawnAgain : {false, true}) { + Block color(BlockBytes); + Block depth(2u * BlockBytes); + const auto state = TargetState(DecodeTarget(color.Address(), 1u)); + Draw(device, state); + device.WaitIdle(); + Require(Refused(color.Address(), 0x1000u, "a read of a drawn 2x target"), "a drawn 2x target is not guarded"); + bindStencil(color, depth); + if (drawnAgain) { + Draw(device, state); + device.WaitIdle(); + } + const bool refused = Refused(color.Address(), 0x1000u, drawnAgain ? "a read of a 2x target drawn again after a stencil plane was bound over it" : "a read of a 2x target that a stencil plane was bound over"); + AgcDriver::Graphics::ClearDepthSurfaces(context.device); + Require(refused == drawnAgain, drawnAgain ? "a 2x target drawn again after a D32S8 target's stencil plane was bound over it is not guarded" : "a 2x target that a D32S8 target's stencil plane was bound over after its last draw is still guarded"); + } + { + Block reused(BlockBytes); + Draw(device, TargetState(DecodeTarget(reused.Address(), 1u))); + device.WaitIdle(); + Draw(device, TargetState(DecodeTarget(reused.Address(), 0u))); + device.WaitIdle(); + Require(!Refused(reused.Address(), 0x1000u, "a read of a 2x target that a single-sample color target was drawn over"), "a 2x target that a single-sample color target was drawn over is still guarded"); + } + { + Block reused(2u * BlockBytes); + const auto wide = TargetState(DecodeTarget(reused.Address(), 1u, {8u * Side, 4u * Side})); + const auto narrow = TargetState(DecodeTarget(reused.Address())); + Require(AgcDriver::Graphics::MultisampledColorBytes(wide.color) == 2u * BlockBytes && AgcDriver::Graphics::MultisampledColorBytes(narrow.color) == BlockBytes, "the 2x target does not span the 4x target and one more block"); + Draw(device, wide); + device.WaitIdle(); + Draw(device, narrow); + device.WaitIdle(); + Require(!Refused(reused.Address() + BlockBytes, 0x1000u, "a read of the part of a 2x target that a 4x target drawn over it does not cover"), "a 2x target that a 4x target was drawn over is still guarded"); + Require(Refused(reused.Address(), 0x1000u, "a read of a 4x target drawn over a 2x target"), "a 4x target drawn over a 2x target is not guarded"); + } + if (context.storageImageMultisample) { + Block color(BlockBytes); + Block depth(2u * BlockBytes); + Draw(device, TargetState(DecodeTarget(color.Address(), 1u))); + device.WaitIdle(); + bindStencil(color, depth); + StoreSamples(device, TargetDescriptor(color, 1u), {{0u, 0u, 0u}}); + const bool refused = Refused(color.Address(), 0x1000u, "a read of a 2x target that a dispatch stored to after a stencil plane was bound over it"); + AgcDriver::Graphics::ClearDepthSurfaces(context.device); + Require(refused, "a 2x target that a dispatch stored to after a D32S8 target's stencil plane was bound over it is not guarded"); + } else { + std::puts("a dispatch's store after a claim not tested: storage image multisampling unavailable"); + } + { + Block fmask(BlockBytes); + Block depth(2u * BlockBytes); + AgcDriver::Graphics::ColorTarget oneFragment{}; + oneFragment.extent = {128u, 128u}; + oneFragment.samples = 1u; + oneFragment.coverageSamples = 4u; + oneFragment.fmaskAddress = fmask.Address(); + AgcDriver::Graphics::GuardOneFragmentFmask(context, oneFragment); + bindStencil(fmask, depth); + std::string refusal; + try { + AgcDriver::Graphics::RequireNoMultisampleTarget(fmask.Address(), 0x1000u, "a read of claimed FMASK"); + } catch (const std::exception& error) { + refusal = error.what(); + } + AgcDriver::Graphics::ClearDepthSurfaces(context.device); + Require(refusal.find("overlaps the FMASK") != std::string::npos, "a stencil plane bound over a one-fragment target's FMASK retired its guard: " + refusal); + } + std::puts("a 2x target whose memory a D32S8 stencil plane, a single-sample color target or a 4x target was bound over after its last draw is retired at the next guarded read; one drawn again or stored to after the stencil bind stays guarded, and a one-fragment target's FMASK guard keeps refusing"); +} + void StoreWords(const Block& block, std::uint64_t bytes, std::uint32_t word) { for (std::uint64_t offset = 0; offset < bytes; offset += sizeof(word)) std::memcpy(block.data + offset, &word, sizeof(word)); } +ShaderRecompiler::RecompileResult CompileBdaSpan(AgcDriver::VulkanDevice& device, std::uint64_t address) { + const std::span code(BdaSpanCode); + const std::array memory{{{reinterpret_cast(code.data()), std::as_bytes(code)}}}; + const std::array userData{static_cast(address), static_cast(address >> 32u)}; + const ShaderRecompiler::ShaderComputeStageInfo compute{{BdaThreads, 1, 1}, 0, {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); + Require(std::ranges::any_of(result.bindings, [](const auto& binding) { return binding.role == ShaderRecompiler::DescriptorRole::BdaPagetable; }), "the native multisample BDA test has no address-table binding"); + return result; +} + +void CheckBdaSpan(AgcDriver::VulkanDevice& device, const Block& block, std::size_t offset, bool refused) { + std::vector before(block.bytes); + for (std::size_t index = 0; index < before.size(); ++index) before[index] = static_cast(index * 37u + 11u); + const auto output = offset + 0x8000u; + std::fill(before.begin() + static_cast(output), before.begin() + static_cast(output + BdaThreads * 8u), 0xcdu); + std::memcpy(block.data, before.data(), before.size()); + auto expected = before; + for (std::uint32_t tid = 0; tid < BdaThreads; ++tid) { + const auto load = offset + BdaLoadBase + tid * 16u + (tid & 1u) * 2u - 8u; + std::memcpy(expected.data() + output + tid * 8u, before.data() + load + 4u, sizeof(std::uint32_t)); + std::memcpy(expected.data() + output + tid * 8u + 4u, before.data() + load + 12u, sizeof(std::uint32_t)); + } + std::string failure; + StderrCapture log; + try { + const auto address = block.Address() + offset; + device.Dispatch(CompileBdaSpan(device, address), 1, 1, 1, {}, reinterpret_cast(BdaSpanCode.data())); + device.WaitIdle(); + } catch (const std::exception& error) { + failure = error.what(); + } + const auto deferred = log.Finish(); + if (failure.empty()) failure = deferred; + if (refused) { + Require(failure.find("BDA access failed:") != std::string::npos, "BDA access to a resident native multisample range was not refused: " + failure); + Require(std::equal(before.begin(), before.end(), block.data), "a refused BDA access changed guest memory"); + } else { + Require(failure.empty(), "BDA access to an ordinary neighboring range failed: " + failure); + Require(std::equal(expected.begin(), expected.end(), block.data), "the ordinary BDA span did not preserve its reads, writes or boundaries"); + } +} + void RequireRefused(AgcDriver::VulkanDevice& device, const std::array& texture, const std::string& expected, const std::string& what) { std::string refusal; try { @@ -739,6 +983,44 @@ void DrawVertexInput(AgcDriver::VulkanDevice& device, const AgcDriver::Graphics: device.WaitIdle(); } +ShaderRecompiler::RecompileResult CompileBufferLoad(AgcDriver::VulkanDevice& device, std::uint64_t source, std::uint64_t destination) { + const std::array userData{ + static_cast(source), static_cast((source >> 32u) & 0xffffu), Threads * 4u, 0x31016facu, + static_cast(destination), static_cast((destination >> 32u) & 0xffffu), Threads * 4u, 0x31016facu + }; + const std::span code(BufferLoadCode); + 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; + return ShaderRecompiler::Recompile(request); +} + +void CheckBufferLoad(AgcDriver::VulkanDevice& device, const ShaderRecompiler::RecompileResult& program, const Block& output, std::shared_ptr* recipe = nullptr) { + const std::span words(reinterpret_cast(output.data), Threads * 2u); + std::fill(words.begin(), words.end(), 0xdeadbeefu); + device.Dispatch(program, 1, 1, 1, {}, reinterpret_cast(BufferLoadCode.data()), nullptr, recipe); + device.WaitIdle(); + Require(std::all_of(words.begin(), words.begin() + Threads, [](auto word) { return word == 0; }), "the nonresident typed buffer load did not read zeroes"); + Require(std::all_of(words.begin() + Threads, words.end(), [](auto word) { return word == 0xdeadbeefu; }), "the typed buffer load overwrote its output boundary"); +} + +template +void CheckBufferRefused(TAction&& action, const char* name, std::vector& missing) { + std::string refusal; + try { + action(); + } catch (const std::runtime_error& error) { + refusal = error.what(); + } + const bool refused = refusal.find("whose samples are only on the host") != std::string::npos; + std::cout << "native buffer " << name << ": " << (refused ? "refused" : "missing refusal") << '\n'; + if (!refused) missing.emplace_back(std::string(name) + ": " + refusal); +} + void CheckVertexValues(std::uint64_t address, std::uint32_t stride) { std::array expected{}; for (std::size_t vertex = 0; vertex < 3u; ++vertex) { @@ -1014,12 +1296,25 @@ int main(int argc, char** argv) { if (argc == 2 && std::string_view(argv[1]) == "--native-vertex-input") return NativeVertexInput(device); Block block(4u * BlockBytes); Block other(BlockBytes); + Block output(2u * 1024u * 1024u); + Block destination(BlockBytes); + struct ReleaseDevice { + decltype(device)& value; + ~ReleaseDevice() { value.reset(); } + } releaseDevice{device}; + const auto warm = CompileBufferLoad(*device, block.Address(), output.Address()); + std::shared_ptr recipe; + CheckBufferLoad(*device, warm, output, &recipe); + const auto deferredProgram = CompileBufferLoad(*device, block.Address() + Threads * 4u, output.Address()); + auto prepared = device->PrepareDispatch(deferredProgram, {}, Threads, reinterpret_cast(BufferLoadCode.data())); const auto color = DecodeTarget(block); const auto state = TargetState(color); Draw(*device, state); const auto drawn = LoadSamples(*device, block); CheckSamples(state, drawn, {}); CheckFirstSampleReads(*device, TargetDescriptor(block, SampleShift), drawn, true, "from the drawn 4x target"); + CheckFirstSampleReads(*device, TargetDescriptor(block, SampleShift), drawn, true, "from the drawn 4x target", AdjustedPlaneCode, "image_sample_a"); + std::puts("a DIM 2D image_sample_a read of a 4x color target returns each pixel's sample 0"); Draw(*device, state, 0, 2u, Unorm8PixelCode); const auto redrawn = LoadSamples(*device, block); Require(redrawn != drawn, "drawing the 4x target again with another color left its samples unchanged"); @@ -1058,14 +1353,63 @@ int main(int argc, char** argv) { CheckFirstSampleReads(*device, TargetDescriptor(signedFill, SampleShift, Format8888Sint), std::vector>(Side * Side * Samples, std::bit_cast>(FilledSint8Texel)), false, "from 8_8_8_8_SINT color memory no draw rendered to"); std::puts("DIM 2D reads of a drawn 4x 8_8_8_8_UINT target and of 8_8_8_8_SINT color memory no draw rendered to return each pixel's sample 0 bit for bit"); } + CheckOverwrittenTarget(*device); + CheckClaimedTargets(*device); if (!AgcDriver::VulkanDeviceTestAccess::ContextOf(*device).storageImageMultisample) { - std::puts("multisampled target fills, stores and swizzle modes not tested: storage image multisampling unavailable"); + std::puts("multisampled target fills, stores and swizzle modes skipped, the device has no shaderStorageImageMultisample"); return VulkanTestSkipped; } const auto colorBytes = AgcDriver::Graphics::MultisampledColorBytes(color); + Require(colorBytes == BlockBytes, "the native color target does not occupy exactly one BDA block"); + Block bda(4u * BlockBytes); + const auto bdaState = TargetState(DecodeTarget(bda)); + CheckBdaSpan(*device, bda, 0, false); + CheckBdaSpan(*device, bda, BlockBytes, false); + Draw(*device, bdaState); + CheckBdaSpan(*device, bda, 0, true); + CheckBdaSpan(*device, bda, BlockBytes, false); + Draw(*device, state); + CheckBdaSpan(*device, block, 0, true); + CheckBdaSpan(*device, block, BlockBytes, false); + CheckSamples(state, LoadSamples(*device, block), {}); Require(colorBytes != 0 && colorBytes <= block.bytes, "the 4x target's color memory does not fit its block"); AgcDriver::Graphics::NoteColorMetadataFill(block.Address(), static_cast(colorBytes), FillOnes); CheckUniform(LoadSamples(*device, block), Ones, "after a fill of the target's color memory with half-float ones"); + std::vector missing; + const auto dispatch = [&](const auto& program) { + device->Dispatch(program, 1, 1, 1, {}, reinterpret_cast(BufferLoadCode.data())); + device->WaitIdle(); + }; + CheckBufferRefused([&] { dispatch(CompileBufferLoad(*device, block.Address() + 4u, output.Address())); }, "fresh read", missing); + CheckBufferRefused([&] { dispatch(CompileBufferLoad(*device, block.Address() + colorBytes - 4u, output.Address())); }, "edge read", missing); + CheckBufferRefused([&] { dispatch(CompileBufferLoad(*device, block.Address() + colorBytes, block.Address())); }, "write", missing); + CheckBufferRefused([&] { dispatch(warm); }, "warmed dispatch", missing); + if (prepared != nullptr) { + CheckBufferRefused([&] { + device->Dispatch(deferredProgram, 1, 1, 1, {}, reinterpret_cast(BufferLoadCode.data()), prepared); + device->WaitIdle(); + }, "deferred dispatch", missing); + } + bool recipeReused = false; + if (recipe != nullptr) { + const auto hit = device->PrepareRecipe(recipe, false); + Require(hit != nullptr, "the warmed buffer recipe did not retain its template"); + recipeReused = true; + CheckBufferRefused([&] { + AgcDriver::VulkanDevice::IndirectOutcome outcome{}; + device->DispatchRecipe(warm, 1, 1, 1, 0, reinterpret_cast(BufferLoadCode.data()), hit, outcome); + device->WaitIdle(); + }, "recipe dispatch", missing); + } + std::memset(block.data + colorBytes, 0, BlockBytes); + CheckBufferLoad(*device, CompileBufferLoad(*device, block.Address() + colorBytes, output.Address()), output); + CheckUniform(LoadSamples(*device, block), Ones, "after the native buffer access refusals and adjacent buffer control"); + std::cout << "native buffer controls: adjacent=passed deferred=" << (prepared != nullptr) << " recipe=" << recipeReused << std::endl; + std::string failures; + for (const auto& item : missing) failures += " " + item; + Require(missing.empty(), "buffer aliases of live native MSAA color memory bypassed the guard:" + failures); + recipe.reset(); + prepared.reset(); RequireRefused(*device, TargetDescriptor(block, 3u), "texture of 8 samples", "loading a 4x target as an 8x texture"); Require(colorBytes <= other.bytes, "the 4x target's color memory does not fit one block"); CheckUniform(LoadSamples(*device, other), {}, "from zeroed color memory no draw rendered to"); @@ -1154,8 +1498,11 @@ int main(int argc, char** argv) { Block standard(BlockBytes); StoreWords(standard, colorBytes, FillOnes); RequireRefused(*device, TargetDescriptor(standard, SampleShift, Format16161616Float, TileS64KBX), "has no modeled multisampled color footprint", "loading an S swizzle multisampled texture no draw rendered to"); + device->WaitIdle(); + AgcDriver::Graphics::ClearMultisampleTargets(device->Device()); + CheckBdaSpan(*device, block, 0, false); + Draw(*device, TargetState(DecodeTarget(block))); std::puts("every sample of a 4x color target loaded through its multisampled texture descriptor matches the triangle drawn into it, then the fill of its color memory; a surface no draw rendered to loads the value its color memory repeats and keeps it under a later draw"); - Block destination(BlockBytes); struct ReleaseIndexDevice { std::unique_ptr& device; ~ReleaseIndexDevice() { device.reset(); } diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/SampledCacheBudget.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/SampledCacheBudget.cpp index 2edc80d0ac7f..276bb593202e 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/SampledCacheBudget.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/SampledCacheBudget.cpp @@ -125,6 +125,8 @@ class Device { explicit Device(bool enableStorageImageMultisample = true) { #ifdef _WIN32 library = SDL_LoadObject("vulkan-1.dll"); +#elif defined(__APPLE__) + library = SDL_LoadObject("libvulkan.1.dylib"); #else library = SDL_LoadObject("libvulkan.so.1"); #endif @@ -136,6 +138,12 @@ class Device { application.apiVersion = VK_API_VERSION_1_1; VkInstanceCreateInfo info{VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO}; info.pApplicationInfo = &application; +#ifdef __APPLE__ + const char* portability = VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME; + info.flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; + info.enabledExtensionCount = 1; + info.ppEnabledExtensionNames = &portability; +#endif Check(function("vkCreateInstance")(&info, nullptr, &instance), "vkCreateInstance"); std::uint32_t count = 0; const auto enumerate = function("vkEnumeratePhysicalDevices"); @@ -329,6 +337,48 @@ class WatchedSurface { std::uint8_t* memory = nullptr; }; +class PartialSurface { +public: + explicit PartialSurface(const Context& context, std::size_t bytes = SurfaceBytes) : context(context), span(bytes) { + memory = static_cast(GuestArena::GuestArenaAllocate_nid_postfix(bytes, 65536)); + Require(memory != nullptr, "cannot reserve the partial surface"); + GuestAllocations::Mutation().Add(memory, bytes, true, true, true); + } + + ~PartialSurface() { + ClearCachedTextures(context.device); + GuestAllocations::Mutation().Remove(memory); +#ifdef _WIN32 + GuestArena::GuestArenaReset_nid_postfix(memory, span); +#else + GuestWriteWatch::GuestWriteWatchUnregister_nid_postfix(memory, span); + munmap(memory, span); +#endif + GuestArena::GuestArenaRelease_nid_postfix(memory, span); + } + + PartialSurface(const PartialSurface&) = delete; + PartialSurface& operator=(const PartialSurface&) = delete; + + void Commit(std::size_t offset, std::size_t bytes, std::uint8_t fill) { +#ifdef _WIN32 + GuestArena::GuestArenaCommit_nid_postfix(memory + offset, bytes, PAGE_READWRITE, bytes); +#else + Require(mmap(memory + offset, bytes, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0) != MAP_FAILED, "cannot commit a page of the partial surface"); + GuestWriteWatch::GuestWriteWatchRegister_nid_postfix(memory + offset, bytes); +#endif + GuestAllocations::GuestAllocationsInvalidate_nid_postfix(reinterpret_cast(memory + offset), bytes); + std::memset(memory + offset, fill, bytes); + } + + std::uint64_t Address() const { return reinterpret_cast(memory); } + +private: + const Context& context; + std::size_t span = 0; + std::uint8_t* memory = nullptr; +}; + std::array Descriptor(std::uint64_t address, std::uint32_t side = Side, std::uint32_t format = Format32UInt) { return { static_cast(address >> 8u), @@ -1173,10 +1223,94 @@ void recoveryTests(Context context, const std::string& mode) { } +ShaderRecompiler::RecompileResult StorageProgram(std::uint64_t address) { + ShaderRecompiler::DescriptorBinding binding{}; + binding.kind = ShaderRecompiler::DescriptorKind::StorageImage; + binding.role = ShaderRecompiler::DescriptorRole::GuestImages; + binding.descriptorSet = 0; + binding.binding = ShaderRecompiler::RuntimeAbi::FirstStorageImageBinding + PlaceholderDimensionsPerClass + 2u; + binding.count = 1; + binding.imageShape = ShaderRecompiler::DescriptorImageShape::Image2D; + binding.imageWritten.assign(1, false); + binding.imageSamplers.assign(1, 0u); + const auto words = Descriptor(address); + binding.guestDescriptor.assign(words.begin(), words.end()); + ShaderRecompiler::RecompileResult program; + program.bindings.push_back(std::move(binding)); + return program; +} + +void collectRefusalTests(Context context) { + PlaceholderImages placeholders(context); + context.placeholderImages = &placeholders; + TextureCache textures(context); + context.textureCache = &textures; + constexpr std::size_t PageBytes = 4096; + constexpr auto collect = static_cast(ShaderResources::FastFail::Collect); + PartialSurface surface(context); + surface.Commit(0, SurfaceBytes - PageBytes, 0x5a); + ClearCachedTextures(context.device); + const auto program = SampledProgram(surface.Address()); + const CompiledShader shader{ShaderRecompiler::ShaderStage::Compute, &program, 0}; + auto sampled = std::make_shared(context, shader); + Require(sampled->Reusable() && sampled->SampledTextures().size() == 1, "the template over the partial surface is not reusable"); + ShaderResources::ProofReport report{}; + Require(sampled->Revalidate(shader, &report), "a template over a surface with an uncommitted page did not prove current"); + Require(report.path == ShaderResources::ProofPath::Full, "a template over a surface with an uncommitted page took the fast proof"); + const auto before = ShaderResources::CollectRefusalCounts(); + const auto walksBefore = ShaderResources::FullWalkNanoseconds(); + Require(sampled->Revalidate(shader, &report) && report.path == ShaderResources::ProofPath::Full, "the second proof over the uncommitted page did not take the full walk"); + Require(sampled->Revalidate(shader, &report) && report.path == ShaderResources::ProofPath::Full, "the third proof over the uncommitted page did not take the full walk"); + const auto after = ShaderResources::CollectRefusalCounts(); + const auto walksAfter = ShaderResources::FullWalkNanoseconds(); + Require(after.sampled - before.sampled == 2, "two collect refusals of a sampled surface were not counted"); + Require(after.uncommitted - before.uncommitted == 2, "collect refusals over an uncommitted page were not counted as uncommitted"); + Require(after.storage == before.storage && after.unwatched == before.unwatched && after.other == before.other, "a sampled surface's collect refusal was counted under another kind or cause"); + Require(after.surfaces == 1 && after.bytes == SurfaceBytes, "two refusals of one surface were not counted as one surface of its bytes"); + Require(walksAfter[collect] > walksBefore[collect], "the full walks after a collect refusal were not timed"); + const auto storageProgram = StorageProgram(surface.Address()); + const CompiledShader storageShader{ShaderRecompiler::ShaderStage::Compute, &storageProgram, 0}; + auto storage = std::make_shared(context, storageShader); + Require(storage->Reusable() && storage->StorageImages().size() == 1, "the storage template over the partial surface is not reusable"); + Require(storage->Revalidate(storageShader, &report) && report.path == ShaderResources::ProofPath::Full, "a storage template over a surface with an uncommitted page did not take the full walk"); + const auto withStorage = ShaderResources::CollectRefusalCounts(); + Require(withStorage.storage - after.storage == 1 && withStorage.sampled == after.sampled, "a storage image's collect refusal was not counted as a storage one"); + Require(withStorage.uncommitted - after.uncommitted == 1, "a storage image's collect refusal over an uncommitted page was not counted as uncommitted"); + Require(withStorage.surfaces == 1 && withStorage.bytes == SurfaceBytes, "a storage refusal of the same surface was counted as another surface"); + Block block(context); + const auto hostProgram = SampledProgram(block.Surface(0)); + const CompiledShader hostShader{ShaderRecompiler::ShaderStage::Compute, &hostProgram, 0}; + auto hosted = std::make_shared(context, hostShader); + Require(hosted->Reusable() && hosted->SampledTextures().size() == 1, "the template over the host-allocated surface is not reusable"); + Require(hosted->Revalidate(hostShader, &report) && report.path == ShaderResources::ProofPath::Full, "a template over a host-allocated surface did not take the full walk"); + const auto outside = ShaderResources::CollectRefusalCounts(); + Require(outside.sampled - withStorage.sampled == 1 && outside.unwatched - withStorage.unwatched == 1, "a host-allocated surface's collect refusal was not counted as unwatched"); + Require(outside.uncommitted == withStorage.uncommitted && outside.other == withStorage.other, "a host-allocated surface's collect refusal was counted under another cause"); + Require(outside.surfaces == 2 && outside.bytes == 2 * SurfaceBytes, "the host-allocated surface was not counted as a second surface"); + hosted.reset(); + surface.Commit(SurfaceBytes - PageBytes, PageBytes, 0); + const auto committed = ShaderResources::CollectRefusalCounts(); + Require(sampled->Revalidate(shader, &report), "the template did not prove current once the page was committed"); + Require(storage->Revalidate(storageShader, &report), "the storage template did not prove current once the page was committed"); + const auto final = ShaderResources::CollectRefusalCounts(); + Require(final.sampled == committed.sampled && final.storage == committed.storage, "a proof over a committed surface counted a collect refusal"); + sampled.reset(); + storage.reset(); + ClearCachedTextures(context.device); + std::puts("collect refusal counters passed"); +} + int main(int argc, char** argv) { try { const bool memory = argc > 1 && std::string(argv[1]) == "memory"; const std::string mode = argc > 1 ? argv[1] : ""; + if (mode == "collect-refusals") { +#ifdef _WIN32 + _putenv_s("APS5_PROFILE_DRAW", "1"); +#else + setenv("APS5_PROFILE_DRAW", "1", 1); +#endif + } if (mode == "device-selection-cpu") { deviceSelectionTests(); return 0; @@ -1240,6 +1374,12 @@ int main(int argc, char** argv) { std::puts("resource cache lookup-changed tests passed"); return 0; } + if (mode == "collect-refusals") { + std::lock_guard gpu(AgcDriver::GuestMemory::GpuMutex()); + collectRefusalTests(context); + std::puts("resource cache collect refusal tests passed"); + return 0; + } if (memory) { std::lock_guard gpu(AgcDriver::GuestMemory::GpuMutex()); memoryTests(context); 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 000000000000..729e9e1d1b74 --- /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 000000000000..a8ba0bd671d0 --- /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 a95b32f66f32..a8c47fc2c40d 100644 --- a/core/libs/prx/libSceAgcDriver/tests/execution/UnclampedNormalizedBlend.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/execution/UnclampedNormalizedBlend.cpp @@ -49,6 +49,7 @@ constexpr std::uint32_t ScissorWidth = 128; constexpr std::size_t BlockBytes = 65536; constexpr std::uint32_t Unorm8888Info = 10u << 2u; constexpr std::uint32_t Snorm8888Info = (10u << 2u) | (1u << 8u); +constexpr std::uint32_t Unorm88Info = 3u << 2u; constexpr std::uint32_t TiledAttrib3 = 0x4dc6c000u; constexpr std::uint32_t Float32Export = 9; constexpr std::uint32_t PositionInputs = 0x300u; @@ -95,6 +96,22 @@ std::span DepthAsXProgram(std::array rgba) { return std::span(code.data(), at); } +std::span TwoTargetProgram(std::array first, std::array second) { + Require(programCount < Programs.size(), "too many test programs"); + auto& code = Programs[programCount++]; + std::size_t at = 0; + for (std::uint32_t vgpr = 0; vgpr < 8u; ++vgpr) { + code[at++] = 0x7e0002ffu | ((4u + vgpr) << 17u); + code[at++] = std::bit_cast(vgpr < 4u ? first[vgpr] : second[vgpr - 4u]); + } + code[at++] = 0xf800000fu; + code[at++] = 0x07060504u; + code[at++] = 0xf800181fu; + code[at++] = 0x0b0a0908u; + code[at++] = 0xbf810000u; + return std::span(code.data(), at); +} + const std::array, 3>& TriangleAt(float z) { static std::map, 3>> triangles; return triangles.try_emplace(z, std::array, 3>{{{-1.0f, -1.0f, z, 1.0f}, {3.0f, -1.0f, z, 1.0f}, {-1.0f, 3.0f, z, 1.0f}}}).first->second; @@ -180,7 +197,12 @@ struct BlendCase { }; -void Draw(AgcDriver::VulkanDevice& device, AgcDriver::Graphics::ColorTarget color, const BlendCase& blendCase, std::uint32_t exportFormat, std::span pixelCode, const DrawSetup& setup = {}) { +struct Target { + AgcDriver::Graphics::ColorTarget color; + BlendCase blend; +}; + +void Draw(AgcDriver::VulkanDevice& device, std::span targets, std::uint32_t exportFormat, std::span pixelCode, const DrawSetup& setup = {}) { auto target = device.Target(); std::vector capabilities(target.supportedCapabilities.begin(), target.supportedCapabilities.end()); if (setup.withoutInterlock) std::erase(capabilities, static_cast(spv::CapabilityFragmentShaderPixelInterlockEXT)); @@ -201,11 +223,25 @@ void Draw(AgcDriver::VulkanDevice& device, AgcDriver::Graphics::ColorTarget colo const auto vertexResult = ShaderRecompiler::Recompile(vertex); const auto vertexPush = static_cast(vertexResult.pushConstants.size()); - color.partialWriteMask = AgcDriver::Graphics::UnclampedBlendMask; AgcDriver::Graphics::State state{}; state.stages = {AgcDriver::Graphics::ShaderPath::Vertex, 0u, waveSize, waveSize, std::nullopt, std::nullopt}; - state.colors = {color}; - state.color = color; + for (const auto& entry : targets) { + auto color = entry.color; + color.partialWriteMask = AgcDriver::Graphics::UnclampedBlendMask; + state.colors.push_back(color); + VkPipelineColorBlendAttachmentState blend{}; + blend.blendEnable = VK_TRUE; + blend.srcColorBlendFactor = entry.blend.colorSource; + blend.dstColorBlendFactor = entry.blend.colorDestination; + blend.colorBlendOp = entry.blend.colorOperation; + blend.srcAlphaBlendFactor = entry.blend.alphaSource; + blend.dstAlphaBlendFactor = entry.blend.alphaDestination; + blend.alphaBlendOp = entry.blend.alphaOperation; + blend.colorWriteMask = entry.blend.writeMask; + state.blends.resize(std::max(state.blends.size(), color.exportIndex + 1u)); + state.blends[color.exportIndex] = blend; + } + state.color = state.colors.front(); state.hasColorTarget = true; state.renderExtent = {Width, Height}; state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; @@ -214,18 +250,8 @@ void Draw(AgcDriver::VulkanDevice& device, AgcDriver::Graphics::ColorTarget colo state.scissor = {{0, 0}, {ScissorWidth, Height}}; state.cullMode = VK_CULL_MODE_NONE; state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; - VkPipelineColorBlendAttachmentState blend{}; - blend.blendEnable = VK_TRUE; - blend.srcColorBlendFactor = blendCase.colorSource; - blend.dstColorBlendFactor = blendCase.colorDestination; - blend.colorBlendOp = blendCase.colorOperation; - blend.srcAlphaBlendFactor = blendCase.alphaSource; - blend.dstAlphaBlendFactor = blendCase.alphaDestination; - blend.alphaBlendOp = blendCase.alphaOperation; - blend.colorWriteMask = blendCase.writeMask; - state.blends = {blend}; - state.blend = blend; - state.blendConstants = blendCase.constants; + state.blend = state.blends.front(); + state.blendConstants = targets.front().blend.constants; if (setup.depth != 0) { state.depth = AgcDriver::Graphics::DepthTarget{setup.depth, 0, {Width, Height}, VK_FORMAT_D32_SFLOAT, 1.0f, 0, 0, false}; state.depthTest = true; @@ -248,14 +274,28 @@ void Draw(AgcDriver::VulkanDevice& device, AgcDriver::Graphics::ColorTarget colo fragment.shader.code = snapshot.code; fragment.context.pixel = AgcDriver::Graphics::DecodePixelStageInfo(context, AgcDriver::Graphics::ExportMappings(state)); fragment.context.pixel->targetExportPacking = AgcDriver::Graphics::ExportPackings(state); - fragment.context.pixel->targetMerge = AgcDriver::Graphics::ExportTargetMerge(state); + fragment.context.pixel->targetMerges = AgcDriver::Graphics::ExportTargetMerges(state); Require(!fragment.context.pixel->pixelKillEnable && !fragment.context.pixel->earlyZ, "the test pixel shader does not kill"); - Require(fragment.context.pixel->targetMerge.blend.enabled && fragment.context.pixel->targetMerge.mask == AgcDriver::Graphics::UnclampedBlendMask && fragment.context.pixel->targetMerge.blend.snorm == blendCase.snorm, "the draw's target merge does not describe the unclamped blend"); + const auto& merges = fragment.context.pixel->targetMerges; + Require(merges.size() == targets.size() && std::ranges::all_of(merges, [&](const ShaderRecompiler::TargetMerge& merge) { + const auto& entry = targets[static_cast(&merge - merges.data())]; + return merge.blend.enabled && merge.mask == AgcDriver::Graphics::UnclampedBlendMask && merge.target == entry.color.exportIndex && merge.blend.snorm == entry.blend.snorm; + }), "the draw's target merges do not describe one unclamped blend per target"); const ShaderRecompiler::SrtRuntime runtime{}; const auto invocation = AgcDriver::DriverDetail::InvocationFor(snapshot, 0, fragment); const auto pixelResult = invocation.Materialize(*invocation.Capture(runtime)); const bool registered = pixelResult->variantId == ShaderRecompiler::GetPreparedArtifact(*handle).variantId; Require(!registered, "the blending draw reused the registered pixel shader"); + const auto words = pixelResult->spirv.Copy(); + std::size_t begins = 0, inside = 0, outside = 0; + bool interlocked = false; + for (std::size_t at = 5; at < words.size() && (words[at] >> 16u) != 0; at += words[at] >> 16u) { + const auto op = static_cast(words[at] & 0xffffu); + if (op == spv::OpBeginInvocationInterlockEXT) ++begins; + if (op == spv::OpBeginInvocationInterlockEXT || op == spv::OpEndInvocationInterlockEXT) interlocked = op == spv::OpBeginInvocationInterlockEXT; + if (op == spv::OpImageWrite) ++(interlocked ? inside : outside); + } + Require(begins == 1u && inside >= targets.size() && outside == 0u, "the blending draw does not store every merged target inside its one pixel interlock region"); const std::array shaders{{ {ShaderStage::Vertex, &vertexResult, 0}, {ShaderStage::Fragment, pixelResult.get(), PixelPushOffset(vertexPush, target)} @@ -263,6 +303,11 @@ void Draw(AgcDriver::VulkanDevice& device, AgcDriver::Graphics::ColorTarget colo const AgcDriver::Pm4::DrawParameters draw{0, static_cast(setup.vertices.size()), 0, 1, 0, false}; device.Draw(state, draw, shaders); } + +void Draw(AgcDriver::VulkanDevice& device, const AgcDriver::Graphics::ColorTarget& color, const BlendCase& blendCase, std::uint32_t exportFormat, std::span pixelCode, const DrawSetup& setup = {}) { + const std::array target{{{color, blendCase}}}; + Draw(device, target, exportFormat, pixelCode, setup); +} struct Case { const char* name; BlendCase blend; @@ -272,17 +317,20 @@ struct Case { constexpr int Tolerance = 1; -AgcDriver::Graphics::ColorTarget DecodeTarget(const Block& block, bool snorm) { +AgcDriver::Graphics::ColorTarget DecodeTarget(const Block& block, std::uint32_t info, std::uint32_t slot = 0) { AgcDriver::Registers cx; - cx[0x318] = static_cast(block.Address() >> 8u); - cx[0x31b] = 0; - cx[0x31c] = snorm ? Snorm8888Info : Unorm8888Info; - cx[0x31d] = 0; - cx[0x3b0] = ((Width - 1u) << 14u) | (Height - 1u); - cx[0x3b8] = TiledAttrib3; - cx[0x390] = static_cast(block.Address() >> 40u); - auto color = AgcDriver::Graphics::DecodeColorBuffer(cx, 0); - Require(color.format == (snorm ? VK_FORMAT_R8G8B8A8_SNORM : VK_FORMAT_R8G8B8A8_UNORM) && color.componentMapping == 0xe4u && color.packing == ShaderRecompiler::ColorExportPacking::None && color.tileMode == ColorTileMode::RenderTarget && color.bytes == block.bytes, "the 8_8_8_8 target did not decode as expected"); + const auto stride = slot * 0xfu; + cx[0x318 + stride] = static_cast(block.Address() >> 8u); + cx[0x31b + stride] = 0; + cx[0x31c + stride] = info; + cx[0x31d + stride] = 0; + cx[0x3b0 + slot] = ((Width - 1u) << 14u) | (Height - 1u); + cx[0x3b8 + slot] = TiledAttrib3; + cx[0x390 + slot] = static_cast(block.Address() >> 40u); + auto color = AgcDriver::Graphics::DecodeColorBuffer(cx, slot); + color.exportIndex = slot; + const auto format = info == Unorm88Info ? VK_FORMAT_R8G8_UNORM : info == Snorm8888Info ? VK_FORMAT_R8G8B8A8_SNORM : VK_FORMAT_R8G8B8A8_UNORM; + Require(color.format == format && color.componentMapping == 0xe4u && color.packing == ShaderRecompiler::ColorExportPacking::None && color.tileMode == ColorTileMode::RenderTarget && color.bytes == block.bytes, "the color target did not decode as expected"); return color; } @@ -369,9 +417,11 @@ std::vector Fill(Block& block, std::uint32_t seed) { return bytes; } -std::array Texel(const std::vector& bytes, const ColorTargetLayout& layout, std::uint32_t x, std::uint32_t y) { +std::array Texel(const std::vector& bytes, const ColorTargetLayout& layout, std::uint32_t x, std::uint32_t y, std::uint32_t components) { const auto offset = layout.Offset(x, y); - return {bytes[offset], bytes[offset + 1u], bytes[offset + 2u], bytes[offset + 3u]}; + std::array texel{0u, 0u, 0u, 0xffu}; + for (std::uint32_t channel = 0; channel < components; ++channel) texel[channel] = bytes[offset + channel]; + return texel; } struct Outcome { @@ -382,17 +432,17 @@ int Difference(std::uint8_t left, std::uint8_t right, bool snorm) { return snorm ? std::abs(static_cast(static_cast(left)) - static_cast(static_cast(right))) : std::abs(static_cast(left) - static_cast(right)); } -Outcome Expect(AgcDriver::VulkanDevice& device, const Block& block, const ColorTargetLayout& layout, const std::vector& before, bool snorm, std::uint32_t writeMask, const std::string& what, const std::function(const std::array&)>& expected, const std::function(const std::array&)>& clamped) { +Outcome Expect(AgcDriver::VulkanDevice& device, const Block& block, const ColorTargetLayout& layout, const std::vector& before, bool snorm, std::uint32_t writeMask, const std::string& what, const std::function(const std::array&)>& expected, const std::function(const std::array&)>& clamped, std::uint32_t components = 4u) { const auto stored = ReadBack(device, block); Outcome outcome; for (std::uint32_t y = 0; y < Height; ++y) { for (std::uint32_t x = 0; x < Width; ++x) { - const auto was = Texel(before, layout, x, y); + const auto was = Texel(before, layout, x, y, components); const bool inside = x < ScissorWidth; const auto want = inside ? expected(was) : was; - const auto got = Texel(stored, layout, x, y); - if (inside && clamped(was) != want) outcome.distinguished = true; - for (std::uint32_t channel = 0; channel < 4u; ++channel) { + const auto got = Texel(stored, layout, x, y, components); + if (inside && !std::equal(want.begin(), want.begin() + components, clamped(was).begin())) outcome.distinguished = true; + for (std::uint32_t channel = 0; channel < components; ++channel) { const bool written = inside && (writeMask & (1u << channel)) != 0u; if (Difference(got[channel], want[channel], snorm) <= (written ? Tolerance : 0)) continue; char detail[256]; @@ -413,6 +463,22 @@ void RunCase(AgcDriver::VulkanDevice& device, Block& block, const ColorTargetLay Require(outcome.distinguished == testCase.distinguishesClamping, std::string("unclamped blend ") + testCase.name + (testCase.distinguishesClamping ? " does not differ from Vulkan's clamped blend, so it cannot catch a clamping approximation" : " differs from Vulkan's clamped blend, which the case declares equal")); } +void RunTwoTargets(AgcDriver::VulkanDevice& device, const std::string& name, std::array blocks, std::array layouts, std::array colors, std::array cases, std::uint32_t seed) { + std::array, 2> before; + for (std::size_t index = 0; index < 2u; ++index) before[index] = Fill(*blocks[index], seed + static_cast(index)); + const std::array targets{{{colors[0], cases[0].blend}, {colors[1], cases[1].blend}}}; + Draw(device, targets, Float32Export | (Float32Export << 4u), TwoTargetProgram(cases[0].rgba, cases[1].rgba)); + for (std::size_t index = 0; index < 2u; ++index) { + const auto& testCase = cases[index]; + const auto what = name + ", MRT" + std::to_string(index) + " " + testCase.name; + const auto outcome = Expect(device, *blocks[index], *layouts[index], before[index], testCase.blend.snorm, testCase.blend.writeMask, what, + [&](const std::array& was) { return Blended(testCase.blend, testCase.rgba, was, false); }, + [&](const std::array& was) { return Blended(testCase.blend, testCase.rgba, was, true); }, + colors[index].format == VK_FORMAT_R8G8_UNORM ? 2u : 4u); + Require(outcome.distinguished == testCase.distinguishesClamping, what + (testCase.distinguishesClamping ? " does not differ from Vulkan's clamped blend" : " differs from Vulkan's clamped blend")); + } +} + void Overdraw(AgcDriver::VulkanDevice& device, Block& block, const ColorTargetLayout& layout, const AgcDriver::Graphics::ColorTarget& color, float first, float last, std::uint32_t seed) { constexpr std::uint32_t Layers = 16; static std::map>> stacks; @@ -446,10 +512,14 @@ 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, false); - const auto snorm = DecodeTarget(block, true); + const auto unorm = DecodeTarget(block, Unorm8888Info); + const auto snorm = DecodeTarget(block, Snorm8888Info); constexpr VkColorComponentFlags All = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; constexpr auto Zero = VK_BLEND_FACTOR_ZERO; constexpr auto One = VK_BLEND_FACTOR_ONE; @@ -489,7 +559,17 @@ int main() { Require(refusal.find("blending into an unclamped normalized color target needs the fragmentShaderPixelInterlock feature, which the device lacks") != std::string::npos, "a device without fragmentShaderPixelInterlock did not refuse the unclamped blend: " + refusal); Overdraw(*device, block, layout, unorm, 0.2f, 0.8f, 401u); Overdraw(*device, block, layout, unorm, 0.8f, 0.2f, 402u); - std::printf("unclamped normalized color blend tests passed: %zu UNORM draws, %zu SNORM draws, 2 same-draw overdraws of 16 layers, 1 refusal without pixel interlock\n", unormCases.size(), snormCases.size()); + const ColorTargetLayout pairLayout(Width, Height, ColorTileMode::RenderTarget, 2); + Block firstPair(pairLayout.Bytes()); + Block secondPair(pairLayout.Bytes()); + const auto firstTarget = DecodeTarget(firstPair, Unorm88Info, 0); + const auto secondTarget = DecodeTarget(secondPair, Unorm88Info, 1); + const BlendCase over{VK_BLEND_FACTOR_SRC_ALPHA, VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, Add, VK_BLEND_FACTOR_SRC_ALPHA, VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, Add, All, {}, false}; + RunTwoTargets(*device, "two 8_8 UNORM targets blending SRC_ALPHA, ONE_MINUS_SRC_ALPHA in one draw (CB_COLOR_INFO 0x0000000c, CB_BLEND0_CONTROL and CB_BLEND1_CONTROL 0x40010504, PPSA26344)", {&firstPair, &secondPair}, {&pairLayout, &pairLayout}, {firstTarget, secondTarget}, + {{{"with an out-of-range source and alpha", over, {0.75f, -0.5f, 2.0f, 1.5f}, true}, {"with an out-of-range source", over, {1.5f, 0.25f, -1.0f, 0.5f}, true}}}, 501u); + RunTwoTargets(*device, "an 8_8_8_8 UNORM MRT0 and an 8_8 UNORM MRT1 with different blend equations in one draw", {&block, &secondPair}, {&layout, &pairLayout}, {unorm, secondTarget}, + {{unormCases[3], unormCases[4]}}, 503u); + std::printf("unclamped normalized color blend tests passed: %zu UNORM draws, %zu SNORM draws, 2 same-draw overdraws of 16 layers, 2 draws blending two targets each, 1 refusal without pixel interlock\n", unormCases.size(), snormCases.size()); return 0; } catch (const std::exception& error) { std::cerr << error.what() << '\n'; diff --git a/core/libs/prx/libSceAgcDriver/tests/execution/VertexElectedAtomicMax.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/VertexElectedAtomicMax.cpp new file mode 100644 index 000000000000..c870db68f63f --- /dev/null +++ b/core/libs/prx/libSceAgcDriver/tests/execution/VertexElectedAtomicMax.cpp @@ -0,0 +1,134 @@ +#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 Width = 32; +constexpr std::uint32_t Height = 32; +constexpr std::uint32_t MaxVertices = 129; +alignas(256) std::array Pixels{}; +alignas(256) std::array Result{}; +alignas(256) std::array, MaxVertices> Positions{}; + +alignas(256) constexpr std::array VertexCode{ + 0xe00c2000, 0x80030005, 0xbf8c3f70, 0x7e0c0d05, 0xd5088006, 0x02020cff, 0x3d000000, 0xbe94047e, + 0xbe9625c1, 0x7e1402ff, 0xff800000, 0xd501000a, 0x00520d0a, 0x201414fa, 0xff01110a, 0x201414fa, + 0xff01120a, 0x201414fa, 0xff01140a, 0x201414fa, 0xff01180a, 0xd7780009, 0x0305830a, 0x2014130a, + 0xbefe0416, 0xd7600018, 0x02013f0a, 0xd7600019, 0x02017f0a, 0xd5100008, 0x02003218, 0x7c240d08, + 0xbf880002, 0xe0e00000, 0x80020800, 0xbefe0414, 0xf80008cf, 0x03020100, 0xf800020f, 0x00000000, + 0xbf810000, +}; + +alignas(256) constexpr std::array PixelCode{ + 0x7e0002f2, 0xf800180f, 0x00000000, 0xbf810000, +}; + +std::array BufferDescriptor(const void* data, std::uint32_t stride, std::uint32_t count) { + const auto address = reinterpret_cast(data); + return {static_cast(address), static_cast((address >> 32u) & 0xffffu) | (stride << 16u), count, 0x01016facu}; +} + +void FillPositions() { + for (std::uint32_t vertex = 0; vertex < MaxVertices; ++vertex) { + const auto triangle = vertex / 3u; + const auto corner = vertex % 3u; + const auto x = -0.9f + 0.04f * static_cast(triangle % 40u); + const auto y = -0.9f + 0.4f * static_cast(triangle / 40u); + Positions[vertex] = {x + (corner == 1u ? 0.03f : 0.0f), y + (corner == 2u ? 0.03f : 0.0f), 0.5f, 1.0f}; + } +} + +void Draw(AgcDriver::VulkanDevice& device, std::uint32_t vertices) { + Pixels.fill(0.0f); + const auto target = device.Target(); + std::vector vertexUserData(16, 0u); + const auto result = BufferDescriptor(Result.data(), 4u, static_cast(Result.size())); + const auto positions = BufferDescriptor(Positions.data(), 16u, vertices); + std::copy(result.begin(), result.end(), vertexUserData.begin() + 8); + std::copy(positions.begin(), positions.end(), vertexUserData.begin() + 12); + const std::array vertexMemory{{{reinterpret_cast(VertexCode.data()), std::as_bytes(std::span(VertexCode))}}}; + ShaderRecompiler::RecompileRequest vertex{ + {ShaderStage::Vertex, reinterpret_cast(VertexCode.data()), VertexCode, 0, {}}, + {64u, 0, vertexUserData, std::nullopt, std::nullopt, ShaderRecompiler::ShaderVertexStageInfo{}, vertexMemory}, + target, + {0, 0, 0, 64} + }; + vertex.useCache = false; + const auto vertexResult = ShaderRecompiler::Recompile(vertex); + const auto vertexPush = static_cast(vertexResult.pushConstants.size()); + + ShaderRecompiler::ShaderPixelStageInfo pixel{}; + pixel.executeOnNoop = true; + pixel.targetOutputMode[0] = 9; + pixel.targetExportMapping.fill(0xe4u); + const std::vector pixelUserData; + const std::array pixelMemory{{{reinterpret_cast(PixelCode.data()), std::as_bytes(std::span(PixelCode))}}}; + ShaderRecompiler::RecompileRequest fragment{ + {ShaderStage::Fragment, reinterpret_cast(PixelCode.data()), PixelCode, 0, {}}, + {64u, 0, pixelUserData, std::nullopt, pixel, std::nullopt, pixelMemory}, + target, + PixelPushLayout(vertexPush, target) + }; + fragment.useCache = false; + const auto pixelResult = ShaderRecompiler::Recompile(fragment); + const std::vector shaders{{ShaderStage::Vertex, &vertexResult, 0}, {ShaderStage::Fragment, &pixelResult, PixelPushOffset(vertexPush, target)}}; + + AgcDriver::Graphics::State state{}; + state.stages = {AgcDriver::Graphics::ShaderPath::Vertex, 0u, 64u, 64u, std::nullopt, std::nullopt}; + state.color = {reinterpret_cast(Pixels.data()), {Width, Height}, VK_FORMAT_R32G32B32A32_SFLOAT, sizeof(Pixels), 0xe4u, AgcDriver::Graphics::ColorTileMode::Linear, 16u}; + state.colors = {state.color}; + state.hasColorTarget = true; + state.renderExtent = {Width, Height}; + state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; + state.viewport = {0, static_cast(Height), static_cast(Width), -static_cast(Height), 0, 1}; + state.negativeOneToOne = false; + state.scissor = {{0, 0}, {Width, Height}}; + state.cullMode = VK_CULL_MODE_NONE; + state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; + state.blend.colorWriteMask = 15; + state.blends = {state.blend}; + state.blendConstants = {}; + device.Draw(state, AgcDriver::Pm4::DrawParameters{0, vertices, 0, 1, 0, false}, shaders); + device.WaitIdle(); +} + +} + +int main() { + try { + const auto device = OpenVulkanTestDevice(); + if (!device) return VulkanTestSkipped; + if (device->Target().vertexSubgroups) { + std::puts("skipped, the device runs vertex programs in subgroups, so they keep their cross-lane reductions"); + return VulkanTestSkipped; + } + FillPositions(); + for (const auto vertices : {3u, 21u, 33u, 48u, 129u}) { + Result.fill(0u); + Result[1] = 0x3e800000u; + Draw(*device, vertices); + const auto expected = std::bit_cast(std::min(1.0f, static_cast(vertices - 1u) / 32.0f)); + Require(Result[0] == expected, "elected atomic max over " + std::to_string(vertices) + " vertices: the buffer holds " + std::to_string(std::bit_cast(Result[0])) + ", expected " + std::to_string(std::bit_cast(expected))); + Require(Result[1] == 0x3e800000u, "elected atomic max over " + std::to_string(vertices) + " vertices: a word past the target changed"); + } + std::puts("vertex elected atomic max 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/WindowLaneSpill.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/WindowLaneSpill.cpp index a18422c71164..e6b94db9846b 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 c9f1f976a7c5..7248aaec4c11 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/PatchLibAtrac9.cmake b/core/libs/prx/libSceAjm.native/PatchLibAtrac9.cmake index ed0a64c6e9e2..8a53e5b9e835 100644 --- a/core/libs/prx/libSceAjm.native/PatchLibAtrac9.cmake +++ b/core/libs/prx/libSceAjm.native/PatchLibAtrac9.cmake @@ -7,7 +7,7 @@ if(libatrac9GuardPosition EQUAL -1) endif() string(REPLACE "${libatrac9OldGuard}" "${libatrac9NewGuard}" libatrac9Unpack "${libatrac9Unpack}") file(MAKE_DIRECTORY ${LIBATRAC9_PATCHED_DIR}) -file(WRITE ${LIBATRAC9_PATCHED_DIR}/unpack.c "${libatrac9Unpack}") +file(CONFIGURE OUTPUT ${LIBATRAC9_PATCHED_DIR}/unpack.c CONTENT "${libatrac9Unpack}" @ONLY) file(READ ${LIBATRAC9_DIR}/bit_reader.c libatrac9BitReader) set(libatrac9OldPeek "\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) {") @@ -17,7 +17,7 @@ if(libatrac9PeekPosition EQUAL -1) endif() set(libatrac9NewPeek "\tconst int byteIndex = br->Position >> 3;\n\tconst int bitIndex = br->Position & 7;\n\tconst unsigned char* buffer = br->Buffer;\n\tif (bits > 0 && bits <= 24 && byteIndex + 4 <= (br->LengthBits >> 3)) {\n\t\tconst unsigned raw = ((unsigned)buffer[byteIndex] << 24) | ((unsigned)buffer[byteIndex + 1] << 16) | ((unsigned)buffer[byteIndex + 2] << 8) | (unsigned)buffer[byteIndex + 3];\n\t\treturn (int)((raw << bitIndex) >> (32 - bits));\n\t}\n\tconst int numBytes = (bitIndex + bits - 1) / 8 + 1;\n\tint value;\n\tswitch (numBytes) {") string(REPLACE "${libatrac9OldPeek}" "${libatrac9NewPeek}" libatrac9BitReader "${libatrac9BitReader}") -file(WRITE ${LIBATRAC9_PATCHED_DIR}/bit_reader.c "${libatrac9BitReader}") +file(CONFIGURE OUTPUT ${LIBATRAC9_PATCHED_DIR}/bit_reader.c CONTENT "${libatrac9BitReader}" @ONLY) file(READ ${LIBATRAC9_DIR}/decinit.c libatrac9Decinit) set(libatrac9OldConfigGuard "header != 0xFE || validationBit != 0") @@ -27,7 +27,7 @@ if(libatrac9ConfigGuardPosition EQUAL -1) message(FATAL_ERROR "LibAtrac9 config data guard has changed; review the local bounds fix") endif() string(REPLACE "${libatrac9OldConfigGuard}" "${libatrac9NewConfigGuard}" libatrac9Decinit "${libatrac9Decinit}") -file(WRITE ${LIBATRAC9_PATCHED_DIR}/decinit.c "${libatrac9Decinit}") +file(CONFIGURE OUTPUT ${LIBATRAC9_PATCHED_DIR}/decinit.c CONTENT "${libatrac9Decinit}" @ONLY) file(READ ${LIBATRAC9_DIR}/utility.c libatrac9Utility) set(libatrac9OldReverse "\treturn value >> (32 - bitCount);") @@ -45,4 +45,4 @@ if(libatrac9SignExtendPosition EQUAL -1) message(FATAL_ERROR "LibAtrac9 SignExtend32 has changed; review the local signed-shift guard") endif() string(REPLACE "${libatrac9OldSignExtend}" "${libatrac9NewSignExtend}" libatrac9Utility "${libatrac9Utility}") -file(WRITE ${LIBATRAC9_PATCHED_DIR}/utility.c "${libatrac9Utility}") +file(CONFIGURE OUTPUT ${LIBATRAC9_PATCHED_DIR}/utility.c CONTENT "${libatrac9Utility}" @ONLY) 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 000000000000..ffeb4739ddc5 --- /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 ed8be05e6b5b..938acd9e23c2 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/libSceAjm.native/src/Ajm.cpp b/core/libs/prx/libSceAjm.native/src/Ajm.cpp index 1b6ba84d78f2..dff2f7ab8248 100644 --- a/core/libs/prx/libSceAjm.native/src/Ajm.cpp +++ b/core/libs/prx/libSceAjm.native/src/Ajm.cpp @@ -1821,6 +1821,27 @@ void* EndConsoleJob(std::uint8_t* job, std::uint8_t* end, std::uint32_t instance return end; } +constexpr std::uint64_t CONSOLE_RUN_FLAGS = 0x0000E00000001FFF; + +std::uint8_t* KeepConsoleWords(std::uint8_t* at, std::uint32_t keep, std::uint32_t low, std::uint32_t word) { + std::uint32_t words[2]; + std::memcpy(words, at, sizeof(words)); + words[0] = (words[0] & keep) | low; + words[1] = word; + std::memcpy(at, words, sizeof(words)); + return at + sizeof(words); +} + +std::uint8_t* KeepConsoleBuffer(std::uint8_t* at, ConsoleChunk kind, const void* address, std::size_t size) { + at = KeepConsoleWords(at, 0xFFFFFFE0u, static_cast(kind), static_cast(size)); + std::memcpy(at, &address, sizeof(address)); + return at + sizeof(address); +} + +std::uint8_t* KeepConsoleFlags(std::uint8_t* at, ConsoleChunk kind, std::uint64_t flags) { + return KeepConsoleWords(at, 0xFC000000u, static_cast(kind) | ((static_cast(flags >> 32) & 0xFFFFFu) << 6), static_cast(flags)); +} + struct ConsoleJob { JobHeader header; std::vector buffers; @@ -2191,9 +2212,15 @@ void* APS5_VABI sceAjmBatchJobRunSplitBufferRa(void* position, uint32_t instance } void* APS5_VABI sceAjmBatchJobRunBufferRa(void* position, uint32_t instance, uint64_t flags, const void* data_input, size_t data_input_size, void* data_output, size_t data_output_size, void* sideband_output, size_t sideband_output_size, void* return_address) { - const AjmBuffer input{const_cast(data_input), data_input_size}; - const AjmBuffer output{data_output, data_output_size}; - return sceAjmBatchJobRunSplitBufferRa(position, instance, flags, &input, 1, &output, 1, sideband_output, sideband_output_size, return_address); + auto* job = static_cast(position); + auto* at = job + 2 * sizeof(std::uint32_t); + if (return_address) at = KeepConsoleBuffer(at, ConsoleChunk::ReturnAddress, return_address, 0); + at = KeepConsoleBuffer(at, ConsoleChunk::InputRunBuffer, data_input, data_input_size); + at = KeepConsoleFlags(at, ConsoleChunk::RunFlags, flags & CONSOLE_RUN_FLAGS); + at = KeepConsoleBuffer(at, ConsoleChunk::OutputRunBuffer, data_output, data_output_size); + at = KeepConsoleBuffer(at, ConsoleChunk::OutputControlBuffer, sideband_output, sideband_output_size); + KeepConsoleWords(job, 0xFC000000u, (instance & 0xFFFFFu) << 6, static_cast(at - job) - 2 * sizeof(std::uint32_t)); + return at; } void* APS5_VABI sceAjmBatchJobInlineBuffer(void* position, const void* data_input, size_t data_input_size, const void** batch_address) { diff --git a/core/libs/prx/libSceAjm/Export.cpp b/core/libs/prx/libSceAjm/Export.cpp index 87830816c5c6..75b366597b80 100644 --- a/core/libs/prx/libSceAjm/Export.cpp +++ b/core/libs/prx/libSceAjm/Export.cpp @@ -8,4 +8,16 @@ extern "C" { APS5_DUMMY_FUN +int APS5_VABI sceAjmGetFailedInstance() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAjmInstanceGetSize() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAjmTelemetryGetLog() { + NotImplemented_nid_no_patch(__func__); +} + } diff --git a/core/libs/prx/libSceAjm/include/Api.hpp b/core/libs/prx/libSceAjm/include/Api.hpp index 2cc01a795b1f..ac19dab8b670 100644 --- a/core/libs/prx/libSceAjm/include/Api.hpp +++ b/core/libs/prx/libSceAjm/include/Api.hpp @@ -4,4 +4,8 @@ extern "C" { +int APS5_VABI sceAjmGetFailedInstance(); +int APS5_VABI sceAjmInstanceGetSize(); +int APS5_VABI sceAjmTelemetryGetLog(); + } diff --git a/core/libs/prx/libSceAjmi/Export.cpp b/core/libs/prx/libSceAjmi/Export.cpp index 9cf6bf93766c..925569074a96 100644 --- a/core/libs/prx/libSceAjmi/Export.cpp +++ b/core/libs/prx/libSceAjmi/Export.cpp @@ -23,9 +23,32 @@ void* APS5_VABI sceAjmBatchJobInlineBuffer_nid_disambig1(void* position, const v return at + size; } -int APS5_VABI sceAjmBatchJobRunBufferRa_nid_disambig1(void) { - NotImplemented_nid_no_patch("sceAjmBatchJobRunBufferRa"); - return 0; +static std::uint8_t* KeepChunk(std::uint8_t* at, std::uint32_t keep, std::uint32_t low, std::uint32_t word) { + std::uint32_t words[2]; + std::memcpy(words, at, sizeof(words)); + words[0] = (words[0] & keep) | low; + words[1] = word; + std::memcpy(at, words, sizeof(words)); + return at + sizeof(words); +} + +static std::uint8_t* KeepBuffer(std::uint8_t* at, std::uint32_t kind, const void* address, std::size_t size) { + at = KeepChunk(at, 0xFFFFFFE0u, kind, static_cast(size)); + std::memcpy(at, &address, sizeof(address)); + return at + sizeof(address); +} + +void* APS5_VABI sceAjmBatchJobRunBufferRa_nid_disambig1(void* position, uint32_t instance, uint64_t flags, const void* data_input, size_t data_input_size, void* data_output, size_t data_output_size, void* sideband_output, size_t sideband_output_size, void* return_address) { + auto* job = static_cast(position); + auto* at = job + 2 * sizeof(std::uint32_t); + if (return_address) at = KeepBuffer(at, 6, return_address, 0); + at = KeepBuffer(at, 1, data_input, data_input_size); + const std::uint64_t kept = flags & 0x0000E00000001FFF; + at = KeepChunk(at, 0xFC000000u, 4 | ((static_cast(kept >> 32) & 0xFFFFFu) << 6), static_cast(kept)); + at = KeepBuffer(at, 0x11, data_output, data_output_size); + at = KeepBuffer(at, 0x12, sideband_output, sideband_output_size); + KeepChunk(job, 0xFC000000u, (instance & 0xFFFFFu) << 6, static_cast(at - job) - 2 * sizeof(std::uint32_t)); + return at; } } diff --git a/core/libs/prx/libSceAjmi/include/Api.hpp b/core/libs/prx/libSceAjmi/include/Api.hpp index 15ccb0a84e2c..22e8d42e3c07 100644 --- a/core/libs/prx/libSceAjmi/include/Api.hpp +++ b/core/libs/prx/libSceAjmi/include/Api.hpp @@ -5,6 +5,6 @@ extern "C" { void* APS5_VABI sceAjmBatchJobInlineBuffer_nid_disambig1(void* position, const void* data_input, size_t data_input_size, const void** batch_address); -int APS5_VABI sceAjmBatchJobRunBufferRa_nid_disambig1(void); +void* APS5_VABI sceAjmBatchJobRunBufferRa_nid_disambig1(void* position, uint32_t instance, uint64_t flags, const void* data_input, size_t data_input_size, void* data_output, size_t data_output_size, void* sideband_output, size_t sideband_output_size, void* return_address); } diff --git a/core/libs/prx/libSceAmpr/CMakeLists.txt b/core/libs/prx/libSceAmpr/CMakeLists.txt index f9898075a10e..7205256f673a 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 24ed4c244b91..08c7fb26cbe0 100644 --- a/core/libs/prx/libSceAmpr/Export.cpp +++ b/core/libs/prx/libSceAmpr/Export.cpp @@ -363,6 +363,22 @@ int APS5_VABI sceAmprCommandBufferWriteAddressFromCounterPairOnCompletion(Apr::C std::uint64_t APS5_VABI sceAmprMeasureCommandSizeWriteAddressOnCompletion() { return sizeof(Apr::WriteAddressCommand); } std::uint64_t APS5_VABI sceAmprMeasureCommandSizeWriteCounterOnCompletion() { return sizeof(Apr::WriteCounterCommand); } + +std::uint64_t APS5_VABI sceAmprMeasureCommandSizeWriteAddressFromTimeCounterOnCompletion(volatile std::uint64_t* address) { + if (!ValidWriteAddress(address)) return MeasureInvalid; + return sizeof(Apr::WriteAddressFromCounterCommand); +} + +std::uint64_t APS5_VABI sceAmprMeasureCommandSizeWriteAddressFromCounterOnCompletion(volatile std::uint64_t* address, std::uint8_t counter) { + (void)counter; + if (!ValidWriteAddress(address)) return MeasureInvalid; + return sizeof(Apr::WriteAddressFromCounterCommand); +} + +std::uint64_t APS5_VABI sceAmprMeasureCommandSizeWriteAddressFromCounterPairOnCompletion(volatile std::uint64_t* address, std::uint8_t counter) { + if (!ValidWriteAddress(address) || (counter & 1u) != 0u) return MeasureInvalid; + return sizeof(Apr::WriteAddressFromCounterCommand); +} std::uint64_t APS5_VABI sceAmprMeasureCommandSizeWaitOnAddress() { return sizeof(Apr::WaitCommand); } std::uint64_t APS5_VABI sceAmprMeasureCommandSizeWaitOnCounter() { return sizeof(Apr::WaitCommand); } std::uint64_t APS5_VABI sceAmprMeasureCommandSizeWriteKernelEventQueueOnCompletion() { return sizeof(Apr::WriteKernelEventQueueCommand); } @@ -502,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) { @@ -899,7 +915,7 @@ int APS5_VABI sceAmprAmmGetVirtualAddressRanges(std::uint64_t* start, std::uint6 return 0; } -int APS5_VABI sceAmprAmmSetPageTablePoolOccupancyNotificationThreshold(void) { +int APS5_VABI sceAmprAmmSetPageTablePoolOccupancyNotificationThreshold(int threshold) { NotImplemented_nid_no_patch(__func__); return 0; } diff --git a/core/libs/prx/libSceAmpr/include/Api.hpp b/core/libs/prx/libSceAmpr/include/Api.hpp index 8939494652bb..78ea95adf3ff 100644 --- a/core/libs/prx/libSceAmpr/include/Api.hpp +++ b/core/libs/prx/libSceAmpr/include/Api.hpp @@ -30,6 +30,9 @@ int APS5_VABI sceAmprCommandBufferWriteAddressFromCounterOnCompletion(Apr::Comma int APS5_VABI sceAmprCommandBufferWriteAddressFromCounterPairOnCompletion(Apr::CommandBufferObject* buffer, volatile std::uint64_t* address, std::uint8_t counter); std::uint64_t APS5_VABI sceAmprMeasureCommandSizeWriteAddressOnCompletion(); std::uint64_t APS5_VABI sceAmprMeasureCommandSizeWriteCounterOnCompletion(); +std::uint64_t APS5_VABI sceAmprMeasureCommandSizeWriteAddressFromTimeCounterOnCompletion(volatile std::uint64_t* address); +std::uint64_t APS5_VABI sceAmprMeasureCommandSizeWriteAddressFromCounterOnCompletion(volatile std::uint64_t* address, std::uint8_t counter); +std::uint64_t APS5_VABI sceAmprMeasureCommandSizeWriteAddressFromCounterPairOnCompletion(volatile std::uint64_t* address, std::uint8_t counter); std::uint64_t APS5_VABI sceAmprMeasureCommandSizeWaitOnAddress(); std::uint64_t APS5_VABI sceAmprMeasureCommandSizeWaitOnCounter(); std::uint64_t APS5_VABI sceAmprMeasureCommandSizeWriteKernelEventQueueOnCompletion(); @@ -129,7 +132,7 @@ std::int64_t APS5_VABI sceAmprAmmMeasureAmmCommandSizeMapAsPrt(std::uint64_t add std::int64_t APS5_VABI sceAmprAmmMeasureAmmCommandSizeAllocatePaForPrt(std::uint64_t address, std::uint64_t size, std::int32_t type, std::int32_t protection); int APS5_VABI sceAmprAmmGiveDirectMemory(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 sceAmprAmmGetVirtualAddressRanges(std::uint64_t* start, std::uint64_t* end, std::uint64_t* multimapStart, std::uint64_t* multimapEnd); -int APS5_VABI sceAmprAmmSetPageTablePoolOccupancyNotificationThreshold(void); +int APS5_VABI sceAmprAmmSetPageTablePoolOccupancyNotificationThreshold(int threshold); int APS5_VABI sceAmprAmmSubmitCommandBuffer(void* base, std::uint32_t offset, std::uint32_t priority); int APS5_VABI sceAmprAmmSubmitCommandBuffer2(void* base, std::uint32_t offset, std::uint32_t priority, AmmSubmitResult* result, std::uint32_t* id); int APS5_VABI sceAmprAmmSubmitCommandBuffer3(void* base, std::uint32_t offset, std::uint32_t priority, std::uint32_t* id); diff --git a/core/libs/prx/libSceAppContent/CMakeLists.txt b/core/libs/prx/libSceAppContent/CMakeLists.txt index b1deabb076d4..669824c193ff 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 478f72de029b..9d53053c3bce 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 a48561a66ee8..ae24effec57a 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 2c7f64dfb833..fba072b0cb14 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 d81f4a5e32c4..597259ef7ab9 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 000000000000..ff279a70151f --- /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 000000000000..2dfae935642d --- /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 6f70f09beec2..b6a8c1375e2c 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 51721067a851..e2f0a0c8b69e 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 @@ -83,6 +85,38 @@ int APS5_VABI sceAppInstUtilGetPrimaryAppSlot(const char* titleId, void* slot) { return 0; } +int APS5_VABI sceAppInstUtilCheckLatestPatch2() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAppInstUtilAppGetIrremovableAppList2() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAppInstUtilGetAddons2() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAppInstUtilInstallPatch2() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAppInstUtilAppUnInstall3() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAppInstUtilGetPatchInstallStatus2() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAppInstUtilAppRequestMoveApps2() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAppInstUtilGetContentSize3() { + NotImplemented_nid_no_patch(__func__); +} + int APS5_VABI sceAppInstUtilAppGetAppInstallStatusByAppInfo(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -573,4 +607,177 @@ int APS5_VABI sceAppInstUtilInstallAddons(void) { return 0; } +int APS5_VABI sceAppInstUtilAppConvertAppDiscToDownload(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceAppInstUtilAppGetCustomThemeInfo(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceAppInstUtilAppGetInstallAddcontFromDiscStatus(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceAppInstUtilAppInstallCloudGame(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceAppInstUtilAppInstallMediaPlayer(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceAppInstUtilAppInstallRequestAddcontFromDisc(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceAppInstUtilAppSetSavedataUploadStatus(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +} + +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/Api.hpp b/core/libs/prx/libSceAppInstUtil/include/Api.hpp index eeb9b40a3136..6615e53d470e 100644 --- a/core/libs/prx/libSceAppInstUtil/include/Api.hpp +++ b/core/libs/prx/libSceAppInstUtil/include/Api.hpp @@ -26,6 +26,15 @@ int APS5_VABI sceAppInstUtilGetInstallProgressInfo(const char* titleId, AppInsta int APS5_VABI sceAppInstUtilGetInstallProgress(const char* titleId, void* progress); int APS5_VABI sceAppInstUtilGetPrimaryAppSlot(const char* titleId, void* slot); +int APS5_VABI sceAppInstUtilCheckLatestPatch2(); +int APS5_VABI sceAppInstUtilAppGetIrremovableAppList2(); +int APS5_VABI sceAppInstUtilGetAddons2(); +int APS5_VABI sceAppInstUtilInstallPatch2(); +int APS5_VABI sceAppInstUtilAppUnInstall3(); +int APS5_VABI sceAppInstUtilGetPatchInstallStatus2(); +int APS5_VABI sceAppInstUtilAppRequestMoveApps2(); +int APS5_VABI sceAppInstUtilGetContentSize3(); + int APS5_VABI sceAppInstUtilAppGetAppInstallStatusByAppInfo(void); int APS5_VABI sceAppInstUtilAppUnInstall2(void); int APS5_VABI sceAppInstUtilAppUnInstallForRemote(void); @@ -124,5 +133,12 @@ int APS5_VABI sceAppInstUtilRestoreDataSource(void); int APS5_VABI sceAppInstUtilGetNeededStorageSize(void); int APS5_VABI sceAppInstUtilAppGetStorageDestType(void); int APS5_VABI sceAppInstUtilInstallAddons(void); +int APS5_VABI sceAppInstUtilAppConvertAppDiscToDownload(void); +int APS5_VABI sceAppInstUtilAppGetCustomThemeInfo(void); +int APS5_VABI sceAppInstUtilAppGetInstallAddcontFromDiscStatus(void); +int APS5_VABI sceAppInstUtilAppInstallCloudGame(void); +int APS5_VABI sceAppInstUtilAppInstallMediaPlayer(void); +int APS5_VABI sceAppInstUtilAppInstallRequestAddcontFromDisc(void); +int APS5_VABI sceAppInstUtilAppSetSavedataUploadStatus(void); } diff --git a/core/libs/prx/libSceAppInstUtil/include/InventoryExports.hpp b/core/libs/prx/libSceAppInstUtil/include/InventoryExports.hpp new file mode 100644 index 000000000000..d2614897da13 --- /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 8d20c5a6f26d..dd626ff2a685 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 d81f4a5e32c4..8d7902c401a2 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 000000000000..1e92e112392b --- /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 000000000000..56e3b682e8a4 --- /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 6f70f09beec2..66a5a89a06b2 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 2d4e0247349c..04e1fe1c6dac 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 e07e56b57ac4..37d36a98b5e0 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; +} + +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 OpenPort(const char* function, int user_id, const Audio3dOpenParameters* parameters, std::uint32_t* id) { +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; -} - -int APS5_VABI sceAudio3dPortGetStatus(uint32_t port_id, void* status) { - 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 sceAudio3dReportRegisterHandler(void) { - 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 sceAudio3dReportUnregisterHandler(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(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 5740301c7ea5..61b011914a0d 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 34cddabe60f1..a8e939bab4dd 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) @@ -132,6 +165,17 @@ if(BUILD_TESTING) "PATH=path_list_prepend:$") endif() + add_test_executable(audio_out2_pad_haptic_intensity_tests tests/AudioOut2PadHapticIntensity.cpp src/AudioOut2PadMix.cpp) + target_include_directories(audio_out2_pad_haptic_intensity_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(audio_out2_pad_haptic_intensity_tests PRIVATE libc) + configure_windows_unwind(audio_out2_pad_haptic_intensity_tests) + add_test(NAME audio_out2_pad_haptic_intensity COMMAND audio_out2_pad_haptic_intensity_tests) + set_tests_properties(audio_out2_pad_haptic_intensity PROPERTIES TIMEOUT 30) + if(WIN32) + set_tests_properties(audio_out2_pad_haptic_intensity PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + add_test_executable(audio_out_mix_level_pad_spk_tests tests/AudioOutMixLevelPadSpk.cpp) target_include_directories(audio_out_mix_level_pad_spk_tests PRIVATE ${LIBS_INCLUDE_DIR}) target_link_libraries(audio_out_mix_level_pad_spk_tests PRIVATE libSceAudioOut libc) @@ -272,4 +316,14 @@ if(BUILD_TESTING) set_tests_properties(audio_out_system_state PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") endif() + + add_test_executable(audio_out2_context_handles_tests tests/AudioOut2ContextHandles.cpp) + target_include_directories(audio_out2_context_handles_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(audio_out2_context_handles_tests PRIVATE libSceAudioOut libc) + configure_windows_unwind(audio_out2_context_handles_tests) + add_test(NAME audio_out2_context_handles COMMAND audio_out2_context_handles_tests) + if(WIN32) + set_tests_properties(audio_out2_context_handles PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() endif() diff --git a/core/libs/prx/libSceAudioOut/include/HostGain.hpp b/core/libs/prx/libSceAudioOut/include/HostGain.hpp new file mode 100644 index 000000000000..edea7e9f9de6 --- /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 13bd1029e9fc..810fe104ec7c 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 30c3b33e15ec..9ca3e30b1a91 100644 --- a/core/libs/prx/libSceAudioOut/src/AudioOut.cpp +++ b/core/libs/prx/libSceAudioOut/src/AudioOut.cpp @@ -17,9 +17,12 @@ #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" +#include "prx/libScePad/include/PadRumbleIntensity.hpp" static constexpr int PORT_TYPE_MAIN = 0; static constexpr int PORT_TYPE_BGM = 1; @@ -123,6 +126,7 @@ struct Port { AudioOut2PadLayout padLayout; SDL_AudioDeviceID device = 0; SDL_AudioSpec spec = {}; + HostGainRamp hostGain; }; static std::mutex g_mutex; @@ -194,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) { @@ -291,10 +310,11 @@ static void queueAudio(Port& port, const void* data, std::unique_lock(port.samplesNum) * port.padLayout.channels); - AudioOut2WritePadFrames(pad.data(), port.padLayout, padFrames.data(), port.samplesNum); + AudioOut2WritePadFrames(pad.data(), port.padLayout, padFrames.data(), port.samplesNum, Pad::RumblePercent()); queueData = padFrames.data(); } else { queueData = prepareBuffer(port, data, prepareBuf); + queueData = HostGainFilter(port.hostGain, HostVolumeGain_nid_no_patch(), queueData, formatIsFloat(port.format), port.samplesNum, static_cast(port.channels), prepareBuf); queueSize = checkedBufferSize(port.samplesNum, static_cast(port.channels), bytesPerSample(port.format)); } @@ -382,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) { @@ -490,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 { @@ -527,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 43ed70daf41b..c4628c8553d0 100644 --- a/core/libs/prx/libSceAudioOut/src/AudioOut2Context.cpp +++ b/core/libs/prx/libSceAudioOut/src/AudioOut2Context.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include "SceTypes.hpp" @@ -16,9 +17,11 @@ #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" +#include "prx/libScePad/include/PadRumbleIntensity.hpp" using Clock = std::chrono::steady_clock; @@ -56,8 +59,17 @@ double AudioOut2TraceSeconds() { return std::chrono::duration(Clock::now() - start).count(); } -static AudioOut2Context* FromHandle(AudioOut2ContextHandle ctx) { - return reinterpret_cast(ctx); +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; + +AudioOut2Context* AudioOut2FindContext(AudioOut2ContextHandle ctx) { + std::lock_guard lock(g_contextsLock); + const auto found = g_contexts.find(reinterpret_cast(ctx)); + return found == g_contexts.end() ? nullptr : *found; } static Clock::duration GrainDuration(const AudioOut2Context& context) { @@ -203,7 +215,7 @@ static void UpdatePadDevice(AudioOut2Context& context, Clock::time_point now) { } static void QueuePadGrain(AudioOut2Context& context) { - AudioOut2WritePadFrames(context.padMix.data(), context.padLayout, context.padFrames.data(), context.grain); + AudioOut2WritePadFrames(context.padMix.data(), context.padLayout, context.padFrames.data(), context.grain, Pad::RumblePercent()); const auto frameBytes = static_cast(context.padLayout.channels * sizeof(float)); const auto grainBytes = context.grain * frameBytes; const auto cushionBytes = CUSHION_MS * (AUDIO_OUT2_SAMPLE_RATE / 1000) * frameBytes; @@ -252,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++; @@ -278,11 +291,23 @@ 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 { const AudioOutCall call; - auto* context = FromHandle(ctx); + auto* context = AudioOut2FindContext(ctx); if (!context) return SCE_AUDIO_OUT2_ERROR_INVALID_HANDLE; std::unique_lock lock(context->lock); const QueueLevelPublisher publication{*context, lock}; @@ -309,7 +334,9 @@ int APS5_VABI sceAudioOut2ContextAdvance(AudioOut2ContextHandle ctx) try { int APS5_VABI sceAudioOut2ContextCreate(const AudioOut2ContextParam* params, void* buffer, size_t buffer_size, AudioOut2ContextHandle* ctx) { if (!params || !ctx) return SCE_AUDIO_OUT2_ERROR_INVALID_ARGUMENT; + const float padSpeakerFallbackGain = AudioPadSpeakerFallbackGain(); auto* context = new AudioOut2Context(); + context->padSpeakerFallbackGain = padSpeakerFallbackGain; context->grain = params->num_grains ? params->num_grains : AUDIO_OUT2_DEFAULT_GRAIN; context->queueDepth = params->queue_depth ? params->queue_depth : 1; context->playHead = Clock::now(); @@ -319,14 +346,21 @@ int APS5_VABI sceAudioOut2ContextCreate(const AudioOut2ContextParam* params, voi static_cast(context), context->grain, 1000.0 * context->grain / AUDIO_OUT2_SAMPLE_RATE, context->queueDepth, AUDIO_OUT2_SAMPLE_RATE); OpenDevice(*context); context->deviceBacked = context->device != 0; + { + std::lock_guard lock(g_contextsLock); + g_contexts.insert(context); + } *ctx = reinterpret_cast(context); return 0; } int APS5_VABI sceAudioOut2ContextDestroy(AudioOut2ContextHandle ctx) try { const AudioOutCall call; - auto* context = FromHandle(ctx); - if (!context) return SCE_AUDIO_OUT2_ERROR_INVALID_HANDLE; + auto* context = reinterpret_cast(ctx); + { + std::lock_guard lock(g_contextsLock); + if (g_contexts.erase(context) == 0) return SCE_AUDIO_OUT2_ERROR_INVALID_HANDLE; + } AUDIOOUT2_TRACE("t=%.3f ContextDestroy ctx %p after %llu pushes\n", AudioOut2TraceSeconds(), static_cast(context), static_cast(context->pushes)); SDL_AudioDeviceID device = 0; { @@ -343,7 +377,7 @@ int APS5_VABI sceAudioOut2ContextDestroy(AudioOut2ContextHandle ctx) try { } int APS5_VABI sceAudioOut2ContextGetQueueLevel(AudioOut2ContextHandle ctx, uint32_t* queue_level, uint32_t* available_queue) { - auto* context = FromHandle(ctx); + auto* context = AudioOut2FindContext(ctx); if (!context) return SCE_AUDIO_OUT2_ERROR_INVALID_HANDLE; if (context->deviceBacked && !AudioOut2TraceEnabled()) { const auto level = context->publishedQueueLevel.load(std::memory_order_acquire); @@ -352,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++; @@ -363,28 +397,21 @@ int APS5_VABI sceAudioOut2ContextGetQueueLevel(AudioOut2ContextHandle ctx, uint3 int APS5_VABI sceAudioOut2ContextPush(AudioOut2ContextHandle ctx, uint32_t blocking) try { const AudioOutCall call; - auto* context = FromHandle(ctx); + auto* context = AudioOut2FindContext(ctx); 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++; @@ -421,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++; @@ -450,7 +478,7 @@ int APS5_VABI sceAudioOut2ContextResetParam(AudioOut2ContextParam* params) { } int APS5_VABI sceAudioOut2ContextSetAttributes(AudioOut2ContextHandle ctx, const AudioOut2Attribute* attributes, uint32_t num) { - auto* context = FromHandle(ctx); + auto* context = AudioOut2FindContext(ctx); if (!context) return SCE_AUDIO_OUT2_ERROR_INVALID_HANDLE; if (!attributes && num != 0) return SCE_AUDIO_OUT2_ERROR_INVALID_ARGUMENT; for (uint32_t index = 0; index < num; index++) { diff --git a/core/libs/prx/libSceAudioOut/src/AudioOut2Internal.hpp b/core/libs/prx/libSceAudioOut/src/AudioOut2Internal.hpp index 2df977b0eec8..fa3c2de31408 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. @@ -108,6 +111,7 @@ struct AudioOut2Context { std::deque pendingGrains; std::deque pendingSince; SDL_AudioDeviceID padDevice = 0; + float padSpeakerFallbackGain = 1.0f; std::chrono::steady_clock::time_point nextPadProbe; AudioOut2PadLayout padLayout; std::vector padMix; @@ -128,8 +132,11 @@ struct AudioOut2Context { std::chrono::steady_clock::time_point summaryStart; bool deviceBacked = false; std::atomic publishedQueueLevel{0}; + std::optional clockForTest; }; +AudioOut2Context* AudioOut2FindContext(AudioOut2ContextHandle ctx); + // Mixes every port of the context that carries PCM data into out (stereo float, frames frames), summing // onto the zeroed buffer. Returns the number of ports mixed. std::uint32_t AudioOut2MixPorts(const AudioOut2Context& context, const AudioOut2Grain& grain, float* out, float* padOut, std::uint32_t frames); diff --git a/core/libs/prx/libSceAudioOut/src/AudioOut2PadMix.cpp b/core/libs/prx/libSceAudioOut/src/AudioOut2PadMix.cpp index 5d1a0f387d2e..4cd85b9b7543 100644 --- a/core/libs/prx/libSceAudioOut/src/AudioOut2PadMix.cpp +++ b/core/libs/prx/libSceAudioOut/src/AudioOut2PadMix.cpp @@ -1,10 +1,51 @@ #include "AudioOut2PadMix.hpp" #include +#include #include +#include #include #include #include +#include + +static constexpr float DEFAULT_PAD_SPEAKER_FALLBACK_GAIN = 1.0f; +static constexpr float PAD_SPEAKER_FALLBACK_MIN_DB = -60.0f; +static constexpr float PAD_SPEAKER_FALLBACK_MAX_DB = 0.0f; + +static bool WordEquals(const char* first, const char* last, const char* word) { + const auto length = static_cast(last - first); + if (std::strlen(word) != length) return false; + for (std::size_t index = 0; index < length; index++) { + if (std::tolower(static_cast(first[index])) != word[index]) return false; + } + return true; +} + +static bool IsMutedText(const char* text) { + while (std::isspace(static_cast(*text))) text++; + const char* end = text + std::strlen(text); + while (end > text && std::isspace(static_cast(end[-1]))) end--; + return WordEquals(text, end, "mute") || WordEquals(text, end, "off") || WordEquals(text, end, "-inf"); +} + +float AudioPadSpeakerFallbackGainFrom(const char* dbText) { + if (dbText == nullptr) return DEFAULT_PAD_SPEAKER_FALLBACK_GAIN; + const char* const text = dbText; + while (std::isspace(static_cast(*dbText))) dbText++; + if (IsMutedText(dbText)) return 0.0f; + char* end = nullptr; + const float db = std::strtof(dbText, &end); + while (std::isspace(static_cast(*end))) end++; + if (end == dbText || !std::isfinite(db) || *end != '\0' || db < PAD_SPEAKER_FALLBACK_MIN_DB || db > PAD_SPEAKER_FALLBACK_MAX_DB) { + throw std::runtime_error(std::string(AUDIO_PAD_SPEAKER_FALLBACK_ENV) + '=' + text + ": expected mute, off, -inf or a number of dB from -60 to 0"); + } + return std::pow(10.0f, db / 20.0f); +} + +float AudioPadSpeakerFallbackGain() { + return AudioPadSpeakerFallbackGainFrom(std::getenv(AUDIO_PAD_SPEAKER_FALLBACK_ENV)); +} AudioOut2Route AudioOut2RouteForPort(std::uint16_t type, std::uint32_t channels) { if (type == AUDIO_OUT2_PORT_TYPE_PAD_SPEAKER && (channels == 1 || channels == 2)) return AudioOut2Route::PadSpeaker; @@ -63,10 +104,16 @@ AudioOut2PadLayout AudioOut2PadLayoutForDriver(const char* driver) { return layout; } -void AudioOut2WritePadFrames(const float* pad, const AudioOut2PadLayout& layout, float* out, std::uint32_t frames) { +void AudioOut2WritePadFrames(const float* pad, const AudioOut2PadLayout& layout, float* out, std::uint32_t frames, unsigned vibrationPercent) { std::fill(out, out + static_cast(frames) * layout.channels, 0.0f); + const bool scaled = vibrationPercent < 100; + const float gain = static_cast(vibrationPercent) / 100.0f; for (std::uint32_t frame = 0; frame < frames; frame++) { for (std::uint32_t channel = 0; channel < AUDIO_OUT2_PAD_CHANNELS; channel++) { + if (scaled && (channel == AUDIO_OUT2_PAD_VIBRATION_LEFT || channel == AUDIO_OUT2_PAD_VIBRATION_RIGHT)) { + if (vibrationPercent != 0) out[static_cast(frame) * layout.channels + layout.position[channel]] = pad[static_cast(frame) * AUDIO_OUT2_PAD_CHANNELS + channel] * gain; + continue; + } out[static_cast(frame) * layout.channels + layout.position[channel]] = pad[static_cast(frame) * AUDIO_OUT2_PAD_CHANNELS + channel]; } } diff --git a/core/libs/prx/libSceAudioOut/src/AudioOut2PadMix.hpp b/core/libs/prx/libSceAudioOut/src/AudioOut2PadMix.hpp index 1d4663c03966..b055658f84d5 100644 --- a/core/libs/prx/libSceAudioOut/src/AudioOut2PadMix.hpp +++ b/core/libs/prx/libSceAudioOut/src/AudioOut2PadMix.hpp @@ -13,6 +13,7 @@ static constexpr std::uint32_t AUDIO_OUT2_PAD_SPEAKER_RIGHT = 1; static constexpr std::uint32_t AUDIO_OUT2_PAD_VIBRATION_LEFT = 2; static constexpr std::uint32_t AUDIO_OUT2_PAD_VIBRATION_RIGHT = 3; static constexpr std::uint32_t AUDIO_OUT2_PAD_DEVICE_CHANNELS_MAX = 6; +static constexpr const char* AUDIO_PAD_SPEAKER_FALLBACK_ENV = "APS5_PAD_SPEAKER_FALLBACK_DB"; enum class AudioOut2Route { Main, @@ -25,12 +26,14 @@ struct AudioOut2PadLayout { std::uint32_t position[AUDIO_OUT2_PAD_CHANNELS] = {0, 1, 2, 3}; }; +float AudioPadSpeakerFallbackGainFrom(const char* dbText); +float AudioPadSpeakerFallbackGain(); AudioOut2Route AudioOut2RouteForPort(std::uint16_t type, std::uint32_t channels); bool AudioOut2IsPadAudioDevice(const char* name); void AudioOut2AccumulatePadFrame(AudioOut2Route route, const float* in, std::uint32_t channels, const float* volume, float* pad); void AudioOut2FinishPadMix(float* out, std::uint32_t frames); std::array AudioOut2RumbleFromPadFrames(const float* pad, std::uint32_t frames); AudioOut2PadLayout AudioOut2PadLayoutForDriver(const char* driver); -void AudioOut2WritePadFrames(const float* pad, const AudioOut2PadLayout& layout, float* out, std::uint32_t frames); +void AudioOut2WritePadFrames(const float* pad, const AudioOut2PadLayout& layout, float* out, std::uint32_t frames, unsigned vibrationPercent = 100); #endif diff --git a/core/libs/prx/libSceAudioOut/src/AudioOut2Port.cpp b/core/libs/prx/libSceAudioOut/src/AudioOut2Port.cpp index bc2b4d7d325a..99afa02fe6ca 100644 --- a/core/libs/prx/libSceAudioOut/src/AudioOut2Port.cpp +++ b/core/libs/prx/libSceAudioOut/src/AudioOut2Port.cpp @@ -86,7 +86,7 @@ static void AccumulatePadPort(const AudioOut2Port& port, const void* data, Audio } } -static void AccumulatePort(const AudioOut2Port& port, const void* data, float* out, std::uint32_t frames, const float* volume) { +static void AccumulatePort(const AudioOut2Port& port, const void* data, float* out, std::uint32_t frames, const float* volume, float gain) { const auto& fold = *port.fold; float in[AUDIO_OUT2_PORT_CHANNELS_MAX]; for (std::uint32_t frame = 0; frame < frames; frame++) { @@ -98,8 +98,8 @@ static void AccumulatePort(const AudioOut2Port& port, const void* data, float* o if (fold.left[c] != 0.0f) left += sample * fold.left[c]; if (fold.right[c] != 0.0f) right += sample * fold.right[c]; } - out[frame * AUDIO_OUT2_OUTPUT_CHANNELS] += left; - out[frame * AUDIO_OUT2_OUTPUT_CHANNELS + 1] += right; + out[frame * AUDIO_OUT2_OUTPUT_CHANNELS] += left * gain; + out[frame * AUDIO_OUT2_OUTPUT_CHANNELS + 1] += right * gain; } } @@ -146,7 +146,8 @@ std::uint32_t AudioOut2MixPorts(const AudioOut2Context& context, const AudioOut2 if (!port.used || port.generation != generation || port.context != &context || port.channels == 0) continue; const auto route = AudioOut2RouteForPort(port.type, port.channels); const float* volume = captured.pcm.empty() ? port.volume : captured.volume.data(); - if (route == AudioOut2Route::Main || (context.padDevice == 0 && route == AudioOut2Route::PadSpeaker)) AccumulatePort(port, data, out, frames, volume); + if (route == AudioOut2Route::Main) AccumulatePort(port, data, out, frames, volume, 1.0f); + else if (context.padDevice == 0 && route == AudioOut2Route::PadSpeaker) AccumulatePort(port, data, out, frames, volume, context.padSpeakerFallbackGain); else if (padOut != nullptr) AccumulatePadPort(port, data, route, padOut, frames, volume); mixed++; } @@ -208,7 +209,8 @@ extern "C" { int APS5_VABI sceAudioOut2PortCreate(AudioOut2ContextHandle ctx, const AudioOut2PortParam* params, AudioOut2PortHandle* port) try { const AudioOutCall call; - if (!ctx) return SCE_AUDIO_OUT2_ERROR_INVALID_HANDLE; + auto* context = AudioOut2FindContext(ctx); + if (!context) return SCE_AUDIO_OUT2_ERROR_INVALID_HANDLE; if (!params || !port) return SCE_AUDIO_OUT2_ERROR_INVALID_ARGUMENT; const auto channels = (params->data_format >> FORMAT_CHANNELS_SHIFT) & FORMAT_CHANNELS_MASK; const auto sampleType = params->data_format & FORMAT_TYPE_MASK; @@ -231,7 +233,7 @@ int APS5_VABI sceAudioOut2PortCreate(AudioOut2ContextHandle ctx, const AudioOut2 entry = AudioOut2Port{}; entry.used = true; entry.generation = ++g_portGeneration; - entry.context = reinterpret_cast(ctx); + entry.context = context; entry.type = params->port_type; entry.dataFormat = params->data_format; entry.samplingFreq = params->sampling_freq; diff --git a/core/libs/prx/libSceAudioOut/src/InventoryExports.cpp b/core/libs/prx/libSceAudioOut/src/InventoryExports.cpp index f6c3567919cf..80a45d240b91 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/AudioOut2ContextHandles.cpp b/core/libs/prx/libSceAudioOut/tests/AudioOut2ContextHandles.cpp new file mode 100644 index 000000000000..4341cca018c2 --- /dev/null +++ b/core/libs/prx/libSceAudioOut/tests/AudioOut2ContextHandles.cpp @@ -0,0 +1,95 @@ +#include "prx/libSceAudioOut/libSceAudioOut.hpp" +#include "SceTypes.hpp" + +#include +#include +#include +#include +#include +#include + +static void Require(bool value, const char* message) { + if (value) return; + std::fprintf(stderr, "%s\n", message); + std::abort(); +} + +static void SetEnvironment(const char* name, const std::string& value) { +#ifdef _WIN32 + _putenv_s(name, value.c_str()); +#else + setenv(name, value.c_str(), 1); +#endif +} + +namespace { + +constexpr int errorInvalidHandle = static_cast(0x80260503); +constexpr std::uint32_t formatStereoFloat = 2u << 8; +constexpr AudioOut2PortHandle portSentinel = 0x6B6B; + +AudioOut2ContextHandle CreateContext() { + AudioOut2ContextParam params{}; + Require(sceAudioOut2ContextResetParam(¶ms) == 0, "the context parameters did not reset"); + AudioOut2ContextHandle context = 0; + Require(sceAudioOut2ContextCreate(¶ms, nullptr, 0, &context) == 0 && context != 0, "a context was not created"); + return context; +} + +int CreatePort(AudioOut2ContextHandle context, AudioOut2PortHandle* port) { + AudioOut2PortParam params{}; + params.data_format = formatStereoFloat; + params.sampling_freq = 48000; + return sceAudioOut2PortCreate(context, ¶ms, port); +} + +void RequireInvalidContext(AudioOut2ContextHandle context) { + AudioOut2PortHandle port = portSentinel; + Require(CreatePort(context, &port) == errorInvalidHandle, "a port was created on a context that does not exist"); + Require(port == portSentinel, "a refused port creation wrote a handle"); + Require(sceAudioOut2LoPortCreate(context, nullptr, &port) == errorInvalidHandle, "a low-latency port was created on a context that does not exist"); + std::uint32_t level = 77; + std::uint32_t available = 78; + Require(sceAudioOut2ContextGetQueueLevel(context, &level, &available) == errorInvalidHandle, "a context that does not exist reported a queue level"); + Require(level == 77 && available == 78, "a refused queue level query wrote its outputs"); + Require(sceAudioOut2ContextPush(context, 0) == errorInvalidHandle, "a context that does not exist took a push"); + Require(sceAudioOut2ContextPush(context, 1) == errorInvalidHandle, "a context that does not exist took a blocking push"); + Require(sceAudioOut2ContextAdvance(context) == errorInvalidHandle, "a context that does not exist advanced"); + Require(sceAudioOut2ContextSetAttributes(context, nullptr, 0) == errorInvalidHandle, "a context that does not exist took attributes"); + Require(sceAudioOut2ContextDestroy(context) == errorInvalidHandle, "a context that does not exist was destroyed"); + Require(sceAudioOut2LoContextDestroy(context) == errorInvalidHandle, "a context that does not exist was destroyed through the low-latency call"); +} + +void DestroyedContextIsInvalid() { + const auto context = CreateContext(); + AudioOut2PortHandle port = 0; + Require(CreatePort(context, &port) == 0, "a port was not created on a live context"); + Require(sceAudioOut2ContextDestroy(context) == 0, "a live context was not destroyed"); + Require(sceAudioOut2PortDestroy(port) == errorInvalidHandle, "a port outlived its destroyed context"); + RequireInvalidContext(context); +} + +void UncreatedContextIsInvalid() { + const auto live = CreateContext(); + RequireInvalidContext(live + 8); + std::uint64_t notAContext = 0; + RequireInvalidContext(reinterpret_cast(¬AContext)); + std::uint32_t level = 99; + std::uint32_t available = 99; + Require(sceAudioOut2ContextGetQueueLevel(live, &level, &available) == 0 && level + available == 1, "a live context lost its queue level"); + Require(sceAudioOut2ContextDestroy(live) == 0, "a live context was not destroyed"); +} + +} + +int main() { + const auto path = std::filesystem::temp_directory_path() / ("anyps5_audio_out2_context_handles-" + std::to_string(std::random_device{}()) + ".raw"); + std::filesystem::remove(path); + SetEnvironment("SDL_AUDIODRIVER", "disk"); + SetEnvironment("SDL_DISKAUDIOFILE", path.string()); + UncreatedContextIsInvalid(); + DestroyedContextIsInvalid(); + std::filesystem::remove(path); + std::puts("audio out2 context handles: PASS"); + return 0; +} diff --git a/core/libs/prx/libSceAudioOut/tests/AudioOut2DeviceState.cpp b/core/libs/prx/libSceAudioOut/tests/AudioOut2DeviceState.cpp index dffab531e689..2e1956f7460b 100644 --- a/core/libs/prx/libSceAudioOut/tests/AudioOut2DeviceState.cpp +++ b/core/libs/prx/libSceAudioOut/tests/AudioOut2DeviceState.cpp @@ -1,4 +1,5 @@ #include "prx/libSceAudioOut/libSceAudioOut.hpp" +#include "prx/libSceAudioOut/src/AudioOut2PadMix.hpp" #include "SceTypes.hpp" #include @@ -37,6 +38,14 @@ void SetEnvironment(const char* name, const std::string& value) { #endif } +void UnsetEnvironment(const char* name) { +#ifdef _WIN32 + _putenv_s(name, ""); +#else + unsetenv(name); +#endif +} + AudioOut2PortState StateOfPort(AudioOut2ContextHandle context, std::uint32_t format) { AudioOut2PortParam params{}; params.port_type = portTypeMain; @@ -145,6 +154,7 @@ void SystemStateIsSilentAndRejectsNull() { } int main() { + UnsetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV); const auto path = std::filesystem::temp_directory_path() / ("anyps5_audio_out2_device_state-" + std::to_string(std::random_device{}()) + ".raw"); std::filesystem::remove(path); SetEnvironment("SDL_DISKAUDIOFILE", path.string()); diff --git a/core/libs/prx/libSceAudioOut/tests/AudioOut2PadHapticIntensity.cpp b/core/libs/prx/libSceAudioOut/tests/AudioOut2PadHapticIntensity.cpp new file mode 100644 index 000000000000..84c5dbc1d45c --- /dev/null +++ b/core/libs/prx/libSceAudioOut/tests/AudioOut2PadHapticIntensity.cpp @@ -0,0 +1,81 @@ +#include "prx/libSceAudioOut/src/AudioOut2PadMix.hpp" + +#include +#include +#include +#include +#include +#include + +namespace { + +void Require(bool condition, const char* message) { + if (condition) return; + std::fprintf(stderr, "audio_out2_pad_haptic_intensity: %s\n", message); + std::exit(1); +} + +constexpr std::uint32_t kFrames = 4; +const float kPad[kFrames * AUDIO_OUT2_PAD_CHANNELS] = { + 0.25f, -0.5f, 0.8f, -0.6f, + 1.0f, 1.0f, -1.0f, 1.0f, + 0.1f, 0.2f, 0.3f, 0.4f, + 0.0f, 0.0f, 0.0f, 0.0f, +}; + +std::vector Write(const AudioOut2PadLayout& layout, bool explicitPercent, unsigned percent) { + std::vector out(static_cast(kFrames) * layout.channels, 9.0f); + if (explicitPercent) AudioOut2WritePadFrames(kPad, layout, out.data(), kFrames, percent); + else AudioOut2WritePadFrames(kPad, layout, out.data(), kFrames); + return out; +} + +bool SameBytes(const std::vector& a, const std::vector& b) { + return a.size() == b.size() && std::memcmp(a.data(), b.data(), a.size() * sizeof(float)) == 0; +} + +bool IsVibration(std::uint32_t channel) { + return channel == AUDIO_OUT2_PAD_VIBRATION_LEFT || channel == AUDIO_OUT2_PAD_VIBRATION_RIGHT; +} + +} + +int main() { + const AudioOut2PadLayout layouts[] = {AudioOut2PadLayoutForDriver("pipewire"), AudioOut2PadLayoutForDriver("pulseaudio")}; + for (const auto& layout : layouts) { + const auto legacy = Write(layout, false, 0); + Require(SameBytes(legacy, Write(layout, true, 100)), "100 percent writes the same bytes as the call without a percentage"); + Require(SameBytes(legacy, Write(layout, true, 250)), "a percentage above 100 never amplifies"); + + const auto off = Write(layout, true, 0); + const auto half = Write(layout, true, 50); + const auto nearlyFull = Write(layout, true, 99); + for (std::uint32_t frame = 0; frame < kFrames; ++frame) { + for (std::uint32_t channel = 0; channel < AUDIO_OUT2_PAD_CHANNELS; ++channel) { + const auto index = static_cast(frame) * layout.channels + layout.position[channel]; + const float source = kPad[static_cast(frame) * AUDIO_OUT2_PAD_CHANNELS + channel]; + if (IsVibration(channel)) { + Require(off[index] == 0.0f, "0 percent silences the actuator channels"); + Require(half[index] == source * 0.5f, "50 percent halves the actuator channels"); + Require(nearlyFull[index] == source * 0.99f, "99 percent scales the actuator channels"); + } else { + Require(off[index] == source && half[index] == source, "the controller speaker channels are never scaled"); + } + } + } + for (std::uint32_t frame = 0; frame < kFrames; ++frame) { + for (std::uint32_t slot = 0; slot < layout.channels; ++slot) { + bool mapped = false; + for (std::uint32_t channel = 0; channel < AUDIO_OUT2_PAD_CHANNELS; ++channel) mapped = mapped || layout.position[channel] == slot; + if (!mapped) Require(off[static_cast(frame) * layout.channels + slot] == 0.0f, "unmapped device channels stay silent"); + } + } + } + const float broken[AUDIO_OUT2_PAD_CHANNELS] = {0.5f, 0.5f, std::nanf(""), HUGE_VALF}; + for (const auto& layout : layouts) { + std::vector out(layout.channels, 9.0f); + AudioOut2WritePadFrames(broken, layout, out.data(), 1, 0); + Require(out[layout.position[AUDIO_OUT2_PAD_VIBRATION_LEFT]] == 0.0f && out[layout.position[AUDIO_OUT2_PAD_VIBRATION_RIGHT]] == 0.0f, "0 percent silences even a non-finite sample"); + } + return 0; +} diff --git a/core/libs/prx/libSceAudioOut/tests/AudioOut2PadMix.cpp b/core/libs/prx/libSceAudioOut/tests/AudioOut2PadMix.cpp index 5c6857971913..e967ba8200c3 100644 --- a/core/libs/prx/libSceAudioOut/tests/AudioOut2PadMix.cpp +++ b/core/libs/prx/libSceAudioOut/tests/AudioOut2PadMix.cpp @@ -1,20 +1,55 @@ #include "prx/libSceAudioOut/src/AudioOut2PadMix.hpp" #include +#include #include #include #include +#include static void Require(bool value, const char*) { if (!value) std::abort(); } -template +static void SetEnvironment(const char* name, const std::string& value) { +#ifdef _WIN32 + _putenv_s(name, value.c_str()); +#else + setenv(name, value.c_str(), 1); +#endif +} + +static void UnsetEnvironment(const char* name) { +#ifdef _WIN32 + _putenv_s(name, ""); +#else + unsetenv(name); +#endif +} + +static void RequireGain(const char* text, float expected, const char* message) { + Require(std::fabs(AudioPadSpeakerFallbackGainFrom(text) - expected) <= 1e-6f, message); +} + +static void RequireRejected(const char* text, const char* message) { + try { + AudioPadSpeakerFallbackGainFrom(text); + } catch (const std::exception& error) { + const std::string what(error.what()); + Require(what.find(std::string(AUDIO_PAD_SPEAKER_FALLBACK_ENV) + '=' + text) != std::string::npos && what.find("expected") != std::string::npos, message); + return; + } + Require(false, message); +} + +template static bool Throws(TAction action) { try { action(); - } catch (const std::invalid_argument&) { + } catch (const TException&) { return true; + } catch (...) { + return false; } return false; } @@ -98,11 +133,39 @@ int main() { { auto out = Silence<1>(); const float data[8] = {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}; - Require(Throws([&] { AudioOut2AccumulatePadFrame(AudioOut2Route::Main, data, 2, unity, out.data()); }), "a main-mix port is refused"); - Require(Throws([&] { AudioOut2AccumulatePadFrame(AudioOut2Route::PadVibration, data, 8, unity, out.data()); }), "an 8-channel pad port is refused"); + Require(Throws([&] { AudioOut2AccumulatePadFrame(AudioOut2Route::Main, data, 2, unity, out.data()); }), "a main-mix port is refused"); + Require(Throws([&] { AudioOut2AccumulatePadFrame(AudioOut2Route::PadVibration, data, 8, unity, out.data()); }), "an 8-channel pad port is refused"); for (float sample : out) Require(sample == 0.0f, "a refused port mixes nothing"); } + RequireGain(nullptr, 1.0f, "unset text keeps unity"); + RequireGain("0", 1.0f, "0 dB is unity"); + RequireGain("-15", 0.17782794f, "explicit -15"); + RequireGain(" -15 ", 0.17782794f, "surrounding whitespace is ignored"); + RequireGain("mute", 0.0f, "mute"); + RequireGain("off", 0.0f, "off"); + RequireGain(" -inf ", 0.0f, "negative infinity with surrounding whitespace"); + RequireGain("-60", 0.001f, "lower bound"); + RequireRejected("", "an empty value is rejected"); + RequireRejected(" ", "whitespace-only text is rejected"); + RequireRejected("nan", "a non-finite value is rejected"); + RequireRejected("inf", "a non-finite value is rejected"); + RequireRejected("-100", "a value below the range is rejected"); + RequireRejected("5", "a value above the range is rejected"); + RequireRejected("garbage", "invalid input is rejected"); + RequireRejected("-15x", "trailing text is rejected"); + RequireRejected(" -15x", "leading whitespace is reported verbatim"); + + UnsetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV); + Require(std::fabs(AudioPadSpeakerFallbackGain() - 1.0f) <= 1e-6f, "unset environment keeps unity"); + SetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV, "-15"); + Require(std::fabs(AudioPadSpeakerFallbackGain() - 0.17782794f) <= 1e-6f, "environment override"); + SetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV, "mute"); + Require(AudioPadSpeakerFallbackGain() == 0.0f, "muted environment"); + SetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV, "garbage"); + Require(Throws([] { AudioPadSpeakerFallbackGain(); }), "an invalid environment stops the title"); + UnsetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV); + { const auto quad = AudioOut2PadLayoutForDriver("pipewire"); Require(quad.channels == 4 && quad.position[0] == 0 && quad.position[1] == 1 && quad.position[2] == 2 && quad.position[3] == 3, "quad layout"); diff --git a/core/libs/prx/libSceAudioOut/tests/AudioOut2PortBuffers.cpp b/core/libs/prx/libSceAudioOut/tests/AudioOut2PortBuffers.cpp index a46559d5ae8d..f14b1d290e1f 100644 --- a/core/libs/prx/libSceAudioOut/tests/AudioOut2PortBuffers.cpp +++ b/core/libs/prx/libSceAudioOut/tests/AudioOut2PortBuffers.cpp @@ -1,4 +1,5 @@ #include "prx/libSceAudioOut/include/AudioOut2.hpp" +#include "prx/libSceAudioOut/src/AudioOut2PadMix.hpp" #include "SceTypes.hpp" #include @@ -28,6 +29,14 @@ static void SetEnvironment(const char* name, const std::string& value) { #endif } +static void UnsetEnvironment(const char* name) { +#ifdef _WIN32 + _putenv_s(name, ""); +#else + unsetenv(name); +#endif +} + namespace { constexpr std::uint32_t grain = 256; @@ -300,6 +309,7 @@ void TestBufferReusedAcrossPortsKeepsEachPortsGrain(bool advanced) { } int main() { + UnsetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV); SetEnvironment("SDL_AUDIODRIVER", "disk"); TestAdvanceRetainsRewrittenBuffer(); TestAdvanceRetainsVolume(); diff --git a/core/libs/prx/libSceAudioOut/tests/AudioOut2PortLayouts.cpp b/core/libs/prx/libSceAudioOut/tests/AudioOut2PortLayouts.cpp index dcdcb0268cd8..c6fec59e840f 100644 --- a/core/libs/prx/libSceAudioOut/tests/AudioOut2PortLayouts.cpp +++ b/core/libs/prx/libSceAudioOut/tests/AudioOut2PortLayouts.cpp @@ -1,4 +1,5 @@ #include "prx/libSceAudioOut/include/AudioOut2.hpp" +#include "prx/libSceAudioOut/src/AudioOut2PadMix.hpp" #include "SceTypes.hpp" #include @@ -25,6 +26,14 @@ static void SetEnvironment(const char* name, const std::string& value) { #endif } +static void UnsetEnvironment(const char* name) { +#ifdef _WIN32 + _putenv_s(name, ""); +#else + unsetenv(name); +#endif +} + namespace { constexpr std::uint32_t grain = 256; @@ -144,12 +153,14 @@ struct PortData { std::vector volume; }; -std::vector Play(const std::vector& inputs) { +template +std::vector Play(const std::vector& inputs, TAfterCreate afterCreate) { const auto path = std::filesystem::temp_directory_path() / ("anyps5_audio_out2_port_layouts-" + std::to_string(std::random_device{}()) + ".raw"); std::filesystem::remove(path); SetEnvironment("SDL_DISKAUDIOFILE", path.string()); const auto context = CreateContext(); + afterCreate(); std::vector ports; for (const auto& input : inputs) { AudioOut2PortHandle port = 0; @@ -178,6 +189,10 @@ std::vector Play(const std::vector& inputs) { return {samples + first, samples + last}; } +std::vector Play(const std::vector& inputs) { + return Play(inputs, [] {}); +} + std::vector Play(std::uint32_t format, const void* data, const std::vector& volume) { return Play({{portTypeMain, format, data, volume}}); } @@ -277,6 +292,48 @@ void TestPadPortsWithoutPadDevice() { Require(Play({{portTypePadVibration, Format(stereo.channels, formatFloat), vibration.data(), unity}}).empty()); } +void TestPadSpeakerFallbackOverride() { + const auto speaker = FloatGrain(mono.channels); + SetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV, "-15"); + const auto played = Play({{portTypePadSpeaker, Format(mono.channels, formatFloat), speaker.data(), {1.0f}}}); + UnsetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV); + RequireFold(played, mono, speaker, {1.0f}, 0.17782794f); +} + +void TestPadSpeakerFallbackMute() { + const auto speaker = FloatGrain(mono.channels); + SetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV, "mute"); + const auto played = Play({{portTypePadSpeaker, Format(mono.channels, formatFloat), speaker.data(), {1.0f}}}); + UnsetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV); + Require(played.empty()); +} + +void TestPadSpeakerFallbackReadOnce() { + const auto speaker = FloatGrain(mono.channels); + SetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV, "-15"); + const auto played = Play({{portTypePadSpeaker, Format(mono.channels, formatFloat), speaker.data(), {1.0f}}}, [] { + SetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV, "garbage"); + }); + UnsetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV); + RequireFold(played, mono, speaker, {1.0f}, 0.17782794f); +} + +void TestPadSpeakerFallbackInvalidStopsTheTitle() { + const auto speaker = FloatGrain(mono.channels); + SetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV, "garbage"); + std::string what; + bool thrown = false; + try { + Play({{portTypePadSpeaker, Format(mono.channels, formatFloat), speaker.data(), {1.0f}}}); + } catch (const std::exception& error) { + thrown = true; + what = error.what(); + } + UnsetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV); + Require(thrown); + Require(what.find(AUDIO_PAD_SPEAKER_FALLBACK_ENV) != std::string::npos && what.find("garbage") != std::string::npos); +} + void TestMeasuredMainPortFormats() { struct Case { std::uint32_t format; @@ -326,6 +383,7 @@ void TestMeasuredMainPortFormats() { } int main() { + UnsetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV); TestUserAttributes(); SetEnvironment("SDL_AUDIODRIVER", "disk"); for (const Layout* layout : {&mono, &stereo, &surround71, &surround714}) { @@ -345,6 +403,10 @@ int main() { TestHeightChannels(); TestDroppedLfe(); TestPadPortsWithoutPadDevice(); + TestPadSpeakerFallbackOverride(); + TestPadSpeakerFallbackReadOnce(); + TestPadSpeakerFallbackMute(); + TestPadSpeakerFallbackInvalidStopsTheTitle(); TestMeasuredMainPortFormats(); return 0; } diff --git a/core/libs/prx/libSceAudioOut/tests/AudioOut2Timing.cpp b/core/libs/prx/libSceAudioOut/tests/AudioOut2Timing.cpp index d0b85c57cc71..691045c6b825 100644 --- a/core/libs/prx/libSceAudioOut/tests/AudioOut2Timing.cpp +++ b/core/libs/prx/libSceAudioOut/tests/AudioOut2Timing.cpp @@ -1,5 +1,6 @@ #include "prx/libSceAudioOut/include/AudioOut2.hpp" #include "prx/libSceAudioOut/src/AudioOut2Internal.hpp" +#include "prx/libSceAudioOut/src/AudioOut2PadMix.hpp" #include "SceTypes.hpp" #include @@ -12,9 +13,11 @@ #include #include #include +#include #include #include #include +#include #include static void Require(bool value) { if (!value) std::abort(); } @@ -27,6 +30,14 @@ static void SetEnvironment(const char* name, const std::string& value) { #endif } +static void UnsetEnvironment(const char* name) { +#ifdef _WIN32 + _putenv_s(name, ""); +#else + unsetenv(name); +#endif +} + namespace { constexpr std::uint32_t grain = 256; @@ -187,18 +198,118 @@ void TestDeviceLevelDoesNotWaitForTheContext(bool low) { } void TestLevelWithoutADeviceUsesThePlaybackClock() { - AudioOut2Context context; - context.queueDepth = queueDepth; + Session session("anyps5_audio_out2_no_device.raw"); + auto& context = *reinterpret_cast(session.context); + SDL_CloseAudioDevice(std::exchange(context.device, 0)); + context.deviceBacked = false; context.queued = queueDepth; context.playHead = std::chrono::steady_clock::now() + std::chrono::seconds(5); - const auto handle = reinterpret_cast(&context); std::uint32_t level = 99; std::uint32_t available = 99; - Require(sceAudioOut2ContextGetQueueLevel(handle, &level, &available) == 0); + Require(sceAudioOut2ContextGetQueueLevel(session.context, &level, &available) == 0); Require(level == queueDepth && available == 0); context.playHead = std::chrono::steady_clock::now() - std::chrono::seconds(5); - Require(sceAudioOut2LoContextGetQueueLevel(handle, &level, &available) == 0); + Require(sceAudioOut2LoContextGetQueueLevel(session.context, &level, &available) == 0); Require(level == 0 && available == queueDepth); + 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() { @@ -352,6 +463,7 @@ void TestLowLatencyQueueLevelFillsToTheDepth() { } int main() { + UnsetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV); SetEnvironment("SDL_AUDIODRIVER", "disk"); TestReadAtNextPush(); TestRecreatedPort(); @@ -359,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 96f280678607..f0bc493e7385 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 0b54f5b39998..778173a664b9 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 15703d8ba8f0..170e40391968 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 6b9577e91d3a..5af102d6cc0b 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/AudioOutShutdown.cpp b/core/libs/prx/libSceAudioOut/tests/AudioOutShutdown.cpp index fcadcec548f2..46ea98cb5eec 100644 --- a/core/libs/prx/libSceAudioOut/tests/AudioOutShutdown.cpp +++ b/core/libs/prx/libSceAudioOut/tests/AudioOutShutdown.cpp @@ -1,5 +1,6 @@ #include "prx/libSceAudioOut/include/AudioOut2.hpp" #include "prx/libSceAudioOut/include/AudioOut.hpp" +#include "prx/libSceAudioOut/src/AudioOut2PadMix.hpp" #include "SceTypes.hpp" #include "prx/libc/include/general/VabiMacros.hpp" #include "prx/libc/include/Shutdown.hpp" @@ -125,8 +126,10 @@ void OutputAudioOut() { int main(int argc, char** argv) { #ifdef _WIN32 _putenv_s("SDL_AUDIODRIVER", "dummy"); + _putenv_s(AUDIO_PAD_SPEAKER_FALLBACK_ENV, ""); #else setenv("SDL_AUDIODRIVER", "dummy", 1); + unsetenv(AUDIO_PAD_SPEAKER_FALLBACK_ENV); #endif const bool waiting = argc == 2 && std::strcmp(argv[1], "--audio-out2-waiting-push") == 0; if (argc == 2 && std::strcmp(argv[1], "--audio-out2") == 0) PushAudioOut2(); diff --git a/core/libs/prx/libSceAudioOut/tests/AudioOutVibrationDevice.cpp b/core/libs/prx/libSceAudioOut/tests/AudioOutVibrationDevice.cpp index 505cbf878cdb..987a9e143315 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 000000000000..ca97e3613718 --- /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 000000000000..8dc8c133f898 --- /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 000000000000..6e17db497969 --- /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 f00b2ea48adc..cbd21fcf7894 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 0575687fe342..a65abb2cd55c 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 000000000000..8847fa7bc573 --- /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/libSceAudioSystem/Export.cpp b/core/libs/prx/libSceAudioSystem/Export.cpp index de11eb33ddb8..09a91b16b53c 100644 --- a/core/libs/prx/libSceAudioSystem/Export.cpp +++ b/core/libs/prx/libSceAudioSystem/Export.cpp @@ -16,4 +16,28 @@ int APS5_VABI sceAudioSystemSystemSuspend() { return 0; } +int APS5_VABI sceAudioSystemInit() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAudioSystemProcessAdd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAudioSystemProcessRemove() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAudioSystemProcessResume() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAudioSystemProcessSuspend() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAudioSystemTerminate() { + NotImplemented_nid_no_patch(__func__); +} + } diff --git a/core/libs/prx/libSceAudioSystem/include/Api.hpp b/core/libs/prx/libSceAudioSystem/include/Api.hpp index c15ab7a62726..2a5bf8e3092e 100644 --- a/core/libs/prx/libSceAudioSystem/include/Api.hpp +++ b/core/libs/prx/libSceAudioSystem/include/Api.hpp @@ -6,5 +6,11 @@ extern "C" { int APS5_VABI sceAudioSystemSystemResume(); int APS5_VABI sceAudioSystemSystemSuspend(); +int APS5_VABI sceAudioSystemInit(); +int APS5_VABI sceAudioSystemProcessAdd(); +int APS5_VABI sceAudioSystemProcessRemove(); +int APS5_VABI sceAudioSystemProcessResume(); +int APS5_VABI sceAudioSystemProcessSuspend(); +int APS5_VABI sceAudioSystemTerminate(); } diff --git a/core/libs/prx/libSceAudiodec.native/CMakeLists.txt b/core/libs/prx/libSceAudiodec.native/CMakeLists.txt index 982091750372..90195a771210 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 96acf5c292cf..7b8fbb75a3a7 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 f5050e00190d..d23f33d32a09 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.native/libSceAudiodec.native.hpp b/core/libs/prx/libSceAudiodec.native/libSceAudiodec.native.hpp index 2f7cfa515f9c..9ad30fe2a627 100644 --- a/core/libs/prx/libSceAudiodec.native/libSceAudiodec.native.hpp +++ b/core/libs/prx/libSceAudiodec.native/libSceAudiodec.native.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceAudiodec.native/include/Api.hpp" +#include "prx/libSceAudiodec/libSceAudiodec.hpp" diff --git a/core/libs/prx/libSceAudiodec/CMakeLists.txt b/core/libs/prx/libSceAudiodec/CMakeLists.txt index 2e7fa84a5ece..5ac315a08fec 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/libSceAvPlayer/src/Source.cpp b/core/libs/prx/libSceAvPlayer/src/Source.cpp index 452e4a88c8e6..70fbbc1472a8 100644 --- a/core/libs/prx/libSceAvPlayer/src/Source.cpp +++ b/core/libs/prx/libSceAvPlayer/src/Source.cpp @@ -539,7 +539,9 @@ class FfmpegSource final : public ISource { std::uint64_t clockMillis() const { if (!started) return 0; - const auto milliseconds = static_cast(presentationClock.Now()); + const auto now = presentationClock.Now(); + constexpr auto latest = std::numeric_limits::max(); + const auto milliseconds = now < static_cast(latest) ? static_cast(now) : latest; return duration != 0 ? std::min(milliseconds, duration) : milliseconds; } diff --git a/core/libs/prx/libSceAvPlayerStreaming/Export.cpp b/core/libs/prx/libSceAvPlayerStreaming/Export.cpp index ba81d51df84e..2f37058f062e 100644 --- a/core/libs/prx/libSceAvPlayerStreaming/Export.cpp +++ b/core/libs/prx/libSceAvPlayerStreaming/Export.cpp @@ -62,6 +62,10 @@ int APS5_VABI MvpHttpSetRedirectCb_nid_postfix(void) { return 0; } +int APS5_VABI sceAvPlayerStreamingRegisterVprinf() { + NotImplemented_nid_no_patch(__func__); +} + int APS5_VABI sceTsCloseFile(void) { NotImplemented_nid_no_patch(__func__); return 0; diff --git a/core/libs/prx/libSceAvPlayerStreaming/include/Api.hpp b/core/libs/prx/libSceAvPlayerStreaming/include/Api.hpp index 0fcaf246adf8..620ef9a4e5f3 100644 --- a/core/libs/prx/libSceAvPlayerStreaming/include/Api.hpp +++ b/core/libs/prx/libSceAvPlayerStreaming/include/Api.hpp @@ -15,6 +15,7 @@ int APS5_VABI MvpHttpPost_nid_postfix(void); int APS5_VABI MvpHttpSetCert_nid_postfix(void); int APS5_VABI MvpHttpSetRecvTimeout_nid_postfix(void); int APS5_VABI MvpHttpSetRedirectCb_nid_postfix(void); +int APS5_VABI sceAvPlayerStreamingRegisterVprinf(); int APS5_VABI sceTsCloseFile(void); int APS5_VABI sceTsDisableRepresentation(void); int APS5_VABI sceTsEnableRepresentation(void); diff --git a/core/libs/prx/libSceAvSetting/Export.cpp b/core/libs/prx/libSceAvSetting/Export.cpp index 64d53713fcdc..e5ad3ef7f60a 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 @@ -126,6 +128,10 @@ int APS5_VABI sceAvControlDebugAddCallbacks(void) { return 0; } +int APS5_VABI sceAvControlInit2() { + NotImplemented_nid_no_patch(__func__); +} + int APS5_VABI sceAvControlChangeOutputLayout() { NotImplemented_nid_no_patch(__func__); return 0; @@ -592,8 +598,7 @@ int APS5_VABI sceAvSettingSetDispclk() { } int APS5_VABI sceAvSettingSetDisplayBlackLevel() { - NotImplemented_nid_no_patch(__func__); - return 0; + return static_cast(0x802A00FF); } int APS5_VABI sceAvSettingSetHdcpMode() { @@ -637,8 +642,7 @@ int APS5_VABI sceAvSettingSimulateProcessOutputModeArbitration_() { } int APS5_VABI sceAvSettingTerm() { - NotImplemented_nid_no_patch(__func__); - return 0; + return static_cast(0x802A00FF); } int APS5_VABI sceAvSettingWaitCallback() { @@ -647,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/Api.hpp b/core/libs/prx/libSceAvSetting/include/Api.hpp index d038e47803b5..766c611ce598 100644 --- a/core/libs/prx/libSceAvSetting/include/Api.hpp +++ b/core/libs/prx/libSceAvSetting/include/Api.hpp @@ -28,6 +28,7 @@ int APS5_VABI sceAvControlCheckVideoOutMode(void); int APS5_VABI sceAvControlSetCheckoutputMode(void); int APS5_VABI sceAvControlSetSystemVideoMode(void); int APS5_VABI sceAvControlDebugAddCallbacks(void); +int APS5_VABI sceAvControlInit2(); int APS5_VABI sceAvControlChangeOutputLayout(void); int APS5_VABI sceAvControlChangeOutputMode(void); int APS5_VABI sceAvControlChangeOutputModeForDiag(void); diff --git a/core/libs/prx/libSceAvSetting/include/InventoryExports.hpp b/core/libs/prx/libSceAvSetting/include/InventoryExports.hpp new file mode 100644 index 000000000000..7dc06a4f6c50 --- /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 76b2b294731f..2f369de99962 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/libSceAvcap2/Export.cpp b/core/libs/prx/libSceAvcap2/Export.cpp index 2afd1f25defa..00f142044e27 100644 --- a/core/libs/prx/libSceAvcap2/Export.cpp +++ b/core/libs/prx/libSceAvcap2/Export.cpp @@ -41,4 +41,144 @@ int APS5_VABI sceAvcap2ReadAudio(void) { return 0; } +int APS5_VABI sceAvcap2AllocateVideoEncoderMemory() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2AllocateVideoEncoderMemory2() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2FreeEncoderVideoMemory() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2GetAudioOutVolume() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2GetFramePitch() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2GetImagePasteMemory() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2GetMicVolume() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2GetNonVclNalUnitStream() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2GetNonVclNalUnitStream2() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2GetNonVclNalUnitStream3() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2GetRecProhibit() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2GetSupportInformation() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2GetVideoOutMode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2LockInputDataBuffer() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2MapMemory() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2OpenPadSpk() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2OpenVideo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2QueryVideoEncoderMemorySize() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2ReadPadSpk() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2ReadVideo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2ReadVideo2() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2RequestKeyFrame() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2Select() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2SetAudioOutVolume() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2SetAudioOutVolumeForRec() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2SetChapterOpenLevel() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2SetChapterPermissionLevel() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2SetImagePaste() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2SetInvalidFrame() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2SetMicVolume() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2SetMicVolumeForRec() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2SetPrivacyGuard() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2SetPrivacyImage() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2SetVideoEncodeConfig() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceAvcap2UnlockInputDataBuffer() { + NotImplemented_nid_no_patch(__func__); +} + } diff --git a/core/libs/prx/libSceAvcap2/include/Api.hpp b/core/libs/prx/libSceAvcap2/include/Api.hpp index 66afd355f3bc..7dcdc50f192f 100644 --- a/core/libs/prx/libSceAvcap2/include/Api.hpp +++ b/core/libs/prx/libSceAvcap2/include/Api.hpp @@ -12,4 +12,40 @@ int APS5_VABI sceAvcap2Start(void); int APS5_VABI sceAvcap2Stop(void); int APS5_VABI sceAvcap2ReadAudio(void); +int APS5_VABI sceAvcap2AllocateVideoEncoderMemory(); +int APS5_VABI sceAvcap2AllocateVideoEncoderMemory2(); +int APS5_VABI sceAvcap2FreeEncoderVideoMemory(); +int APS5_VABI sceAvcap2GetAudioOutVolume(); +int APS5_VABI sceAvcap2GetFramePitch(); +int APS5_VABI sceAvcap2GetImagePasteMemory(); +int APS5_VABI sceAvcap2GetMicVolume(); +int APS5_VABI sceAvcap2GetNonVclNalUnitStream(); +int APS5_VABI sceAvcap2GetNonVclNalUnitStream2(); +int APS5_VABI sceAvcap2GetNonVclNalUnitStream3(); +int APS5_VABI sceAvcap2GetRecProhibit(); +int APS5_VABI sceAvcap2GetSupportInformation(); +int APS5_VABI sceAvcap2GetVideoOutMode(); +int APS5_VABI sceAvcap2LockInputDataBuffer(); +int APS5_VABI sceAvcap2MapMemory(); +int APS5_VABI sceAvcap2OpenPadSpk(); +int APS5_VABI sceAvcap2OpenVideo(); +int APS5_VABI sceAvcap2QueryVideoEncoderMemorySize(); +int APS5_VABI sceAvcap2ReadPadSpk(); +int APS5_VABI sceAvcap2ReadVideo(); +int APS5_VABI sceAvcap2ReadVideo2(); +int APS5_VABI sceAvcap2RequestKeyFrame(); +int APS5_VABI sceAvcap2Select(); +int APS5_VABI sceAvcap2SetAudioOutVolume(); +int APS5_VABI sceAvcap2SetAudioOutVolumeForRec(); +int APS5_VABI sceAvcap2SetChapterOpenLevel(); +int APS5_VABI sceAvcap2SetChapterPermissionLevel(); +int APS5_VABI sceAvcap2SetImagePaste(); +int APS5_VABI sceAvcap2SetInvalidFrame(); +int APS5_VABI sceAvcap2SetMicVolume(); +int APS5_VABI sceAvcap2SetMicVolumeForRec(); +int APS5_VABI sceAvcap2SetPrivacyGuard(); +int APS5_VABI sceAvcap2SetPrivacyImage(); +int APS5_VABI sceAvcap2SetVideoEncodeConfig(); +int APS5_VABI sceAvcap2UnlockInputDataBuffer(); + } diff --git a/core/libs/prx/libSceAvcap2mvr/Export.cpp b/core/libs/prx/libSceAvcap2mvr/Export.cpp index d81f4a5e32c4..098d77b5bbc6 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 000000000000..146cd85ecddf --- /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 6f70f09beec2..dbb05bf78dac 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/libSceBackupRestoreUtil/Export.cpp b/core/libs/prx/libSceBackupRestoreUtil/Export.cpp index a737e30ad8f8..e3fce840518f 100644 --- a/core/libs/prx/libSceBackupRestoreUtil/Export.cpp +++ b/core/libs/prx/libSceBackupRestoreUtil/Export.cpp @@ -86,4 +86,24 @@ int APS5_VABI sceBackupRestoreUtilTerminate() { return 0; } +int APS5_VABI sceBackupRestoreUtilCalcRequiredSize() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceBackupRestoreUtilCancelCalcRequiredSize() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceBackupRestoreUtilGetBackupTelemetryInfo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceBackupRestoreUtilGetRestoreFailedTitles() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceBackupRestoreUtilGetRestoreTelemetryInfo() { + NotImplemented_nid_no_patch(__func__); +} + } diff --git a/core/libs/prx/libSceBackupRestoreUtil/include/Api.hpp b/core/libs/prx/libSceBackupRestoreUtil/include/Api.hpp index 7851d2c31592..8a7ce1fc0ebf 100644 --- a/core/libs/prx/libSceBackupRestoreUtil/include/Api.hpp +++ b/core/libs/prx/libSceBackupRestoreUtil/include/Api.hpp @@ -20,5 +20,10 @@ int APS5_VABI sceBackupRestoreUtilInitialize(); int APS5_VABI sceBackupRestoreUtilPrepareBackup(); int APS5_VABI sceBackupRestoreUtilRestoreData(); int APS5_VABI sceBackupRestoreUtilTerminate(); +int APS5_VABI sceBackupRestoreUtilCalcRequiredSize(); +int APS5_VABI sceBackupRestoreUtilCancelCalcRequiredSize(); +int APS5_VABI sceBackupRestoreUtilGetBackupTelemetryInfo(); +int APS5_VABI sceBackupRestoreUtilGetRestoreFailedTitles(); +int APS5_VABI sceBackupRestoreUtilGetRestoreTelemetryInfo(); } diff --git a/core/libs/prx/libSceBemp2sys/Export.cpp b/core/libs/prx/libSceBemp2sys/Export.cpp index 94f4dd456303..072a28cede29 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 000000000000..a4979a1d9b5a --- /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 23c390341fa0..e5dd2b177ef8 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 422771488d17..1b656aa87c87 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 000000000000..610153426a6f --- /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 637dd6d2f707..ca58d9687eeb 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 d81f4a5e32c4..8621dcfbcb6a 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 000000000000..12c1ad31969b --- /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 000000000000..f19404611c14 --- /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 6f70f09beec2..a5cc589431e7 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 5251fcf22893..ac3dc38eee9d 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" @@ -19,4 +20,27 @@ int APS5_VABI sceCameraSetForceDriverMode() { NotImplemented_nid_no_patch(__func__); } +int APS5_VABI sceCameraIsVrCaptureEnable() { + NotImplemented_nid_no_patch(__func__); +} + +} + +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 7b4ea82928f1..28e0b990aecf 100644 --- a/core/libs/prx/libSceCamera/include/InventoryExports.hpp +++ b/core/libs/prx/libSceCamera/include/InventoryExports.hpp @@ -8,5 +8,12 @@ int APS5_VABI sceCameraGetUsageInfo(); int APS5_VABI sceCameraGetUsageInfoWithoutCountProcess(); int APS5_VABI sceCameraOpenByModuleIdWithMode(); 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 000000000000..aa49a128b9e0 --- /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 000000000000..6e2048b0e98e --- /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 000000000000..abf61d0ea059 --- /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 25cb1446d7eb..75b7d8a7dce9 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 000000000000..950a09c44713 --- /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 29b94d8e374a..93ed41ac0def 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/libSceCesCs/CMakeLists.txt b/core/libs/prx/libSceCesCs/CMakeLists.txt index 36a84feff4cb..10bf345bada5 100644 --- a/core/libs/prx/libSceCesCs/CMakeLists.txt +++ b/core/libs/prx/libSceCesCs/CMakeLists.txt @@ -25,11 +25,13 @@ if(BUILD_TESTING) endif() if(BUILD_TESTING) - foreach(variant IN ITEMS unicode unicode_module japanese japanese_module wide wide_module chinese chinese_module mbc mbc_module jis2004 jis2004_module iso646 iso646_module) + foreach(variant IN ITEMS unicode unicode_module japanese japanese_module wide wide_module chinese chinese_module mbc mbc_module jis2004 jis2004_module iso646 iso646_module iso2022 iso2022_module) if(variant MATCHES "^jis2004") add_test_executable(guest_ces_${variant}_tests ${LIBS_INCLUDE_DIR}/tests/GuestCesJis2004.cpp) elseif(variant MATCHES "^iso646") add_test_executable(guest_ces_${variant}_tests ${LIBS_INCLUDE_DIR}/tests/GuestCesIso646.cpp) + elseif(variant MATCHES "^iso2022") + add_test_executable(guest_ces_${variant}_tests ${LIBS_INCLUDE_DIR}/tests/GuestCesIso2022.cpp) elseif(variant MATCHES "^mbc") add_test_executable(guest_ces_${variant}_tests ${LIBS_INCLUDE_DIR}/tests/GuestCesMbc.cpp) elseif(variant MATCHES "^chinese") @@ -51,7 +53,7 @@ if(BUILD_TESTING) add_test(NAME guest_ces_${variant} COMMAND guest_ces_${variant}_tests) endforeach() if(WIN32) - set_tests_properties(guest_ces_unicode guest_ces_unicode_module guest_ces_japanese guest_ces_japanese_module guest_ces_wide guest_ces_wide_module guest_ces_chinese guest_ces_chinese_module guest_ces_mbc guest_ces_mbc_module guest_ces_jis2004 guest_ces_jis2004_module guest_ces_iso646 guest_ces_iso646_module PROPERTIES ENVIRONMENT_MODIFICATION + set_tests_properties(guest_ces_unicode guest_ces_unicode_module guest_ces_japanese guest_ces_japanese_module guest_ces_wide guest_ces_wide_module guest_ces_chinese guest_ces_chinese_module guest_ces_mbc guest_ces_mbc_module guest_ces_jis2004 guest_ces_jis2004_module guest_ces_iso646 guest_ces_iso646_module guest_ces_iso2022 guest_ces_iso2022_module PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") endif() endif() diff --git a/core/libs/prx/libSceCesCs/Export.cpp b/core/libs/prx/libSceCesCs/Export.cpp index 7e1ee734ef13..4dfe63642a9f 100644 --- a/core/libs/prx/libSceCesCs/Export.cpp +++ b/core/libs/prx/libSceCesCs/Export.cpp @@ -211,6 +211,28 @@ int decodeScalarUtf8(const uint8_t* utf8, uint32_t utf8max, uint32_t& length, ui return 0; } +int decodeIso2022Utf8(const uint8_t* utf8, uint32_t utf8max, uint32_t& length, uint32_t& code) { + const uint8_t lead = utf8[0]; + uint32_t minimum = 0; + if (lead < 0x80) { + length = 1; + code = lead; + return 0; + } + if ((lead & 0xE0) == 0xC0) { length = 2; code = lead & 0x1F; minimum = 0x80; } + else if ((lead & 0xF0) == 0xE0) { length = 3; code = lead & 0x0F; minimum = 0x800; } + else if ((lead & 0xF8) == 0xF0) { length = 4; code = lead & 0x07; minimum = 0x10000; } + else return CES_ERROR_INVALID_ENCODE; + + for (uint32_t i = 1; i < length; ++i) { + if (i >= utf8max) return CES_ERROR_SRC_BUFFER_END; + if ((utf8[i] & 0xC0) != 0x80) return CES_ERROR_INVALID_ENCODE; + code = code << 6 | (utf8[i] & 0x3F); + } + if (code < minimum || code > 0x10FFFF || (code >= 0xD800 && code <= 0xDFFF)) return CES_ERROR_INVALID_ENCODE; + return 0; +} + uint32_t encodeUtf8(uint32_t code, uint8_t* utf8) { if (code < 0x80) { utf8[0] = static_cast(code); @@ -1154,6 +1176,252 @@ int rejected(int result, uint32_t length, uint32_t* sourceSize, Unit* character, return result; } +constexpr uint8_t ISO2022_RFC1468_TAG[8] = {'I', 'S', 'O', '2', '0', '2', '2', 'R'}; +constexpr uint8_t ISO2022_CP50221_TAG[8] = {'I', 'S', 'O', '2', '0', '2', '2', '1'}; +constexpr uint8_t ISO2022_CP50222_TAG[8] = {'I', 'S', 'O', '2', '0', '2', '2', '2'}; +constexpr uint32_t ISO2022_NO_CHARACTER = 0xFFFFFFFFu; + +bool isIso2022(const void* profile) { + return hasTag(profile, ISO2022_RFC1468_TAG) || hasTag(profile, ISO2022_CP50221_TAG) || hasTag(profile, ISO2022_CP50222_TAG); +} + +bool iso2022Katakana(const void* profile) { + return hasTag(profile, ISO2022_CP50221_TAG) || hasTag(profile, ISO2022_CP50222_TAG); +} + +bool iso2022ShiftsKatakana(const void* profile) { + return hasTag(profile, ISO2022_CP50222_TAG); +} + +enum class Iso2022Set : uint8_t { Ascii, Roman, Jis0208, Katakana, Other }; + +struct Iso2022State { + Iso2022Set set = Iso2022Set::Ascii; + bool shiftedOut = false; +}; + +bool isIso2022Rfc1468(const void* profile) { + return hasTag(profile, ISO2022_RFC1468_TAG); +} + +Iso2022State iso2022Start(const void* profile) { + Iso2022State state; + state.set = isIso2022Rfc1468(profile) ? Iso2022Set::Roman : Iso2022Set::Ascii; + return state; +} + +int iso2022Designation(const void* profile, Iso2022State& state, const uint8_t* iso, uint32_t isoMax, uint32_t& length) { + if (isoMax < 2) return CES_ERROR_SRC_BUFFER_END; + if (iso[1] != 0x28 && iso[1] != 0x24) return CES_ERROR_INVALID_ENCODE; + if (isoMax < 3) return CES_ERROR_SRC_BUFFER_END; + const bool multibyte = iso[1] == 0x24; + uint8_t final = iso[2]; + length = 3; + if (multibyte && final == 0x28) { + if (isoMax < 4) return CES_ERROR_SRC_BUFFER_END; + final = iso[3]; + length = 4; + if (final < 0x40 || final > 0x7E) return CES_ERROR_INVALID_ENCODE; + state.set = Iso2022Set::Other; + return 0; + } + if (final < 0x40 || final > 0x7E) return CES_ERROR_INVALID_ENCODE; + if (multibyte) state.set = final == 0x40 || final == 0x42 ? Iso2022Set::Jis0208 : Iso2022Set::Other; + else if (final == 0x42 || final == 0x4A) state.set = isIso2022Rfc1468(profile) ? Iso2022Set::Roman : Iso2022Set::Ascii; + else if (final == 0x49 && iso2022Katakana(profile) && !iso2022ShiftsKatakana(profile)) state.set = Iso2022Set::Katakana; + else state.set = Iso2022Set::Other; + return 0; +} + +int decodeIso2022(const void* profile, Iso2022State& state, const uint8_t* iso, uint32_t isoMax, uint32_t& length, uint32_t& code) { + const uint8_t lead = iso[0]; + code = ISO2022_NO_CHARACTER; + if (lead == 0x1B) { + if (const int result = iso2022Designation(profile, state, iso, isoMax, length); result != 0) return result; + return isoMax == length ? CES_ERROR_SRC_BUFFER_END : 0; + } + length = 1; + if (lead == 0x0E || lead == 0x0F) { + if (isoMax < 2) return CES_ERROR_SRC_BUFFER_END; + if (!iso2022ShiftsKatakana(profile)) return CES_ERROR_ILLEGAL_CODE; + state.shiftedOut = lead == 0x0E; + return 0; + } + if (lead >= 0x80) return CES_ERROR_INVALID_ENCODE; + const bool doubleOrKana = state.shiftedOut || state.set == Iso2022Set::Katakana || state.set == Iso2022Set::Jis0208; + if (lead < 0x20 || (lead == 0x7F && !doubleOrKana) || (lead == 0x20 && state.set == Iso2022Set::Other)) { + code = lead; + return 0; + } + if (lead == 0x7F) return CES_ERROR_UNASSIGNED_CODE; + if (state.shiftedOut || state.set == Iso2022Set::Katakana) { + if (lead == 0x20 || lead > 0x5F) return CES_ERROR_UNASSIGNED_CODE; + code = 0xFF61 + (lead - 0x21); + return 0; + } + if (state.set == Iso2022Set::Ascii) { + code = lead; + return 0; + } + if (state.set == Iso2022Set::Roman) { + code = sjisX0208Single(lead); + return 0; + } + if (state.set == Iso2022Set::Other) return CES_ERROR_ILLEGAL_CODE; + if (lead == 0x20) return CES_ERROR_UNASSIGNED_CODE; + if (isoMax < 2) return CES_ERROR_SRC_BUFFER_END; + const uint8_t trail = iso[1]; + if (trail < 0x21 || trail > 0x7F) return CES_ERROR_INVALID_ENCODE; + length = 2; + code = jisX0208ToUnicode(isIso2022Rfc1468(profile) ? JisStrict::Sjis : JisStrict::None, (lead - 0x21) * 94 + (trail - 0x21)); + return code != 0 ? 0 : CES_ERROR_UNASSIGNED_CODE; +} + +uint32_t iso2022Designate(Iso2022State& state, Iso2022Set set, uint8_t* out) { + if (state.set == set) return 0; + state.set = set; + out[0] = 0x1B; + out[1] = set == Iso2022Set::Jis0208 ? 0x24 : 0x28; + out[2] = set == Iso2022Set::Katakana ? 0x49 : 0x42; + return 3; +} + +uint32_t iso2022ShiftIn(Iso2022State& state, uint8_t* out) { + if (!state.shiftedOut) return 0; + state.shiftedOut = false; + state.set = Iso2022Set::Other; + out[0] = 0x0F; + return 1; +} + +const std::vector& iso2022CpReverse() { + static const auto reverse = [] { + auto entries = jisReverse(JisStrict::None); + for (const JisChange& change : JIS_X0208_CHANGES) entries.push_back({change.code, static_cast(jisIndex(change.jis)), false}); + for (const JisChange& fallback : JIS_X0208_EUC_FALLBACKS) entries.push_back({fallback.code, static_cast(jisIndex(fallback.jis)), false}); + entries.push_back({0xFF3C, static_cast(jisIndex(JIS_X0208_BACKSLASH_CELL)), false}); + std::stable_sort(entries.begin(), entries.end(), [](const JisCell& left, const JisCell& right) { return left.code < right.code; }); + return entries; + }(); + return reverse; +} + +int encodeIso2022(const void* profile, Iso2022State& state, uint32_t code, uint8_t* out, uint32_t& length) { + length = 0; + const bool rfc1468 = isIso2022Rfc1468(profile); + if (code == 0xFEFF) return 0; + if (code == 0x0E || code == 0x0F || (code >= 0x80 && code <= 0x9F)) return CES_ERROR_UNSUPPORTED_CODE; + const Iso2022Set single = rfc1468 ? Iso2022Set::Roman : Iso2022Set::Ascii; + const bool roman = rfc1468 && (code == 0x00A5 || code == 0x203E); + if ((code < 0x80 && !(rfc1468 && (code == 0x5C || code == 0x7E))) || roman) { + const bool control = code < 0x20 || code == 0x7F; + length += iso2022ShiftIn(state, out + length); + if (!control || code == 0x0A || code == 0x0D) length += iso2022Designate(state, single, out + length); + out[length++] = roman ? (code == 0x00A5 ? 0x5C : 0x7E) : static_cast(code); + return 0; + } + if (code >= 0xFF61 && code <= 0xFF9F) { + if (!iso2022Katakana(profile)) return CES_ERROR_UNSUPPORTED_CODE; + if (iso2022ShiftsKatakana(profile)) { + if (!state.shiftedOut) { + state.shiftedOut = true; + out[length++] = 0x0E; + } + } else { + length += iso2022Designate(state, Iso2022Set::Katakana, out + length); + } + out[length++] = static_cast(0x21 + (code - 0xFF61)); + return 0; + } + if (code > 0xFFFF) return CES_ERROR_UNASSIGNED_CODE; + const auto& reverse = rfc1468 ? jisReverse(JisStrict::Sjis) : iso2022CpReverse(); + const auto found = std::lower_bound(reverse.begin(), reverse.end(), static_cast(code), [](const JisCell& entry, uint16_t value) { return entry.code < value; }); + if (found == reverse.end() || found->code != code || found->supplementary) return CES_ERROR_UNASSIGNED_CODE; + length += iso2022ShiftIn(state, out + length); + length += iso2022Designate(state, Iso2022Set::Jis0208, out + length); + out[length++] = static_cast(0x21 + found->cell / 94); + out[length++] = static_cast(0x21 + found->cell % 94); + return 0; +} + +template +int toIso2022(const void* context, const Source* source, uint32_t sourceMax, uint32_t* sourceLen, uint8_t* iso, uint32_t isoMax, uint32_t* isoLen, Decode decode) { + if (!context) return CES_ERROR_INVALID_PARAMETER; + const void* profile = contextProfile(context); + if (!isIso2022(profile)) return CES_ERROR_INVALID_PARAMETER; + if (!source) return CES_ERROR_INVALID_SRC_BUFFER; + Iso2022State state = iso2022Start(profile); + uint32_t read = 0; + uint32_t written = 0; + const auto fail = [&](int result) { + if (sourceLen) *sourceLen = read; + if (isoLen) *isoLen = written; + return result; + }; + const auto emit = [&](const uint8_t* encoded, uint32_t size) { + if (iso) { + if (written + size > isoMax) return CES_ERROR_DST_BUFFER_END; + std::memcpy(iso + written, encoded, size); + } + written += size; + return 0; + }; + while (read < sourceMax && source[read] != 0) { + uint32_t length = 0; + uint32_t code = 0; + if (const int result = decode(source + read, sourceMax - read, length, code); result != 0) return fail(result == CES_ERROR_INVALID_ENCODE && code >= 0xD800 && code <= 0xDFFF ? CES_ERROR_ILLEGAL_CODE : result); + if (code == 0x1B) return fail(read + length < sourceMax && source[read + length] != 0 ? CES_ERROR_ILLEGAL_CODE : CES_ERROR_SRC_BUFFER_END); + uint8_t encoded[8]; + uint32_t size = 0; + if (const int result = encodeIso2022(profile, state, code, encoded, size); result != 0) return fail(result); + if (const int result = emit(encoded, size); result != 0) return fail(result); + read += length; + } + uint8_t tail[4]; + uint32_t tailSize = iso2022ShiftIn(state, tail); + tailSize += iso2022Designate(state, iso2022Start(profile).set, tail + tailSize); + if (const int result = emit(tail, tailSize); result != 0) return fail(result); + if (sourceLen) *sourceLen = read; + if (isoLen) *isoLen = written; + return 0; +} + +template +int fromIso2022(const void* context, const uint8_t* iso, uint32_t isoMax, uint32_t* isoLen, Target* target, uint32_t targetMax, uint32_t* targetLen, Encode encode) { + if (!context) return CES_ERROR_INVALID_PARAMETER; + const void* profile = contextProfile(context); + if (!isIso2022(profile)) return CES_ERROR_INVALID_PARAMETER; + if (!iso) return CES_ERROR_INVALID_SRC_BUFFER; + Iso2022State state = iso2022Start(profile); + uint32_t read = 0; + uint32_t consumed = 0; + uint32_t written = 0; + const auto fail = [&](int result) { + if (isoLen) *isoLen = consumed; + if (targetLen) *targetLen = written; + return result; + }; + while (read < isoMax && iso[read] != 0) { + uint32_t length = 0; + uint32_t code = 0; + if (const int result = decodeIso2022(profile, state, iso + read, isoMax - read, length, code); result != 0) return fail(result); + read += length; + if (code == ISO2022_NO_CHARACTER) continue; + consumed = read; + Target encoded[4]; + const uint32_t size = encode(code, encoded); + if (size == 0) return fail(CES_ERROR_UNASSIGNED_CODE); + if (target) { + if (written + size > targetMax) return fail(CES_ERROR_DST_BUFFER_END); + std::memcpy(target + written, encoded, size * sizeof(Target)); + } + written += size; + } + if (isoLen) *isoLen = consumed; + if (targetLen) *targetLen = written; + return 0; +} + int mbcsToUtf8(bool accepted, const void* profile, const uint8_t* mbcs, uint32_t mbcsMax, uint32_t* mbcsLen, uint8_t* utf8, uint32_t utf8Max, uint32_t* utf8Len) { if (!accepted) return CES_ERROR_INVALID_PARAMETER; if (!mbcs) return CES_ERROR_INVALID_SRC_BUFFER; @@ -2447,4 +2715,111 @@ void* APS5_VABI sceCesUcsProfileInitSJis2004X0213(void* sheet) { return sheet; } +void* APS5_VABI sceCesUcsProfileInitIso2022JpRfc1468(void* sheet) { + if (!sheet) return nullptr; + std::memcpy(sheet, ISO2022_RFC1468_TAG, sizeof(ISO2022_RFC1468_TAG)); + return sheet; +} + +void* APS5_VABI sceCesUcsProfileInitIso2022JpCp50221(void* sheet) { + if (!sheet) return nullptr; + std::memcpy(sheet, ISO2022_CP50221_TAG, sizeof(ISO2022_CP50221_TAG)); + return sheet; +} + +void* APS5_VABI sceCesUcsProfileInitIso2022JpCp50222(void* sheet) { + if (!sheet) return nullptr; + std::memcpy(sheet, ISO2022_CP50222_TAG, sizeof(ISO2022_CP50222_TAG)); + return sheet; +} + +int APS5_VABI sceCesIso2022UcsContextInit(void* context, const void* profile) { + if (!context) return CES_ERROR_INVALID_PARAMETER; + if (!profile) { + std::memset(context, 0, 0x100); + return CES_ERROR_INVALID_PARAMETER; + } + std::memcpy(context, &profile, sizeof(profile)); + return 0; +} + +int APS5_VABI sceCesIso2022UcsContextInitCopy(void* context, const void* source) { + if (!context || !source) return CES_ERROR_INVALID_PARAMETER; + const void* profile = contextProfile(source); + std::memcpy(context, &profile, sizeof(profile)); + return 0; +} + +int APS5_VABI sceCesUtf8StrToIso2022Str(void* context, const uint8_t* utf8, uint32_t utf8max, uint32_t* utf8Len, uint8_t* iso, uint32_t isoMax, uint32_t* isoLen) { + if (!iso) return CES_ERROR_INVALID_DST_BUFFER; + return toIso2022(context, utf8, utf8max, utf8Len, iso, isoMax, isoLen, decodeIso2022Utf8); +} + +int APS5_VABI sceCesUtf8StrGetIso2022Len(void* context, const uint8_t* utf8, uint32_t utf8max, uint32_t* utf8Len, uint32_t* isoLen) { + return toIso2022(context, utf8, utf8max, utf8Len, static_cast(nullptr), 0, isoLen, decodeIso2022Utf8); +} + +int APS5_VABI sceCesIso2022StrToUtf8Str(void* context, const uint8_t* iso, uint32_t isoMax, uint32_t* isoLen, uint8_t* utf8, uint32_t utf8max, uint32_t* utf8Len) { + if (!utf8) return CES_ERROR_INVALID_DST_BUFFER; + return fromIso2022(context, iso, isoMax, isoLen, utf8, utf8max, utf8Len, encodeUtf8); +} + +int APS5_VABI sceCesIso2022StrGetUtf8Len(void* context, const uint8_t* iso, uint32_t isoMax, uint32_t* isoLen, uint32_t* utf8Len) { + return fromIso2022(context, iso, isoMax, isoLen, static_cast(nullptr), 0, utf8Len, encodeUtf8); +} + +int APS5_VABI sceCesUcs2StrToIso2022Str(void* context, const uint16_t* ucs2, uint32_t ucs2max, uint32_t* ucs2Len, uint8_t* iso, uint32_t isoMax, uint32_t* isoLen) { + if (!iso) return CES_ERROR_INVALID_DST_BUFFER; + return toIso2022(context, ucs2, ucs2max, ucs2Len, iso, isoMax, isoLen, decodeUcs2); +} + +int APS5_VABI sceCesUcs2StrGetIso2022Len(void* context, const uint16_t* ucs2, uint32_t ucs2max, uint32_t* ucs2Len, uint32_t* isoLen) { + return toIso2022(context, ucs2, ucs2max, ucs2Len, static_cast(nullptr), 0, isoLen, decodeUcs2); +} + +int APS5_VABI sceCesIso2022StrToUcs2Str(void* context, const uint8_t* iso, uint32_t isoMax, uint32_t* isoLen, uint16_t* ucs2, uint32_t ucs2max, uint32_t* ucs2Len) { + if (!ucs2) return CES_ERROR_INVALID_DST_BUFFER; + return fromIso2022(context, iso, isoMax, isoLen, ucs2, ucs2max, ucs2Len, encodeUcs2); +} + +int APS5_VABI sceCesIso2022StrGetUcs2Len(void* context, const uint8_t* iso, uint32_t isoMax, uint32_t* isoLen, uint32_t* ucs2Len) { + return fromIso2022(context, iso, isoMax, isoLen, static_cast(nullptr), 0, ucs2Len, encodeUcs2); +} + +int APS5_VABI sceCesUtf16StrToIso2022Str(void* context, const uint16_t* utf16, uint32_t utf16max, uint32_t* utf16Len, uint8_t* iso, uint32_t isoMax, uint32_t* isoLen) { + if (!iso) return CES_ERROR_INVALID_DST_BUFFER; + return toIso2022(context, utf16, utf16max, utf16Len, iso, isoMax, isoLen, decodeUtf16); +} + +int APS5_VABI sceCesUtf16StrGetIso2022Len(void* context, const uint16_t* utf16, uint32_t utf16max, uint32_t* utf16Len, uint32_t* isoLen) { + return toIso2022(context, utf16, utf16max, utf16Len, static_cast(nullptr), 0, isoLen, decodeUtf16); +} + +int APS5_VABI sceCesIso2022StrToUtf16Str(void* context, const uint8_t* iso, uint32_t isoMax, uint32_t* isoLen, uint16_t* utf16, uint32_t utf16max, uint32_t* utf16Len) { + if (!utf16) return CES_ERROR_INVALID_DST_BUFFER; + return fromIso2022(context, iso, isoMax, isoLen, utf16, utf16max, utf16Len, encodeUtf16); +} + +int APS5_VABI sceCesIso2022StrGetUtf16Len(void* context, const uint8_t* iso, uint32_t isoMax, uint32_t* isoLen, uint32_t* utf16Len) { + return fromIso2022(context, iso, isoMax, isoLen, static_cast(nullptr), 0, utf16Len, encodeUtf16); +} + +int APS5_VABI sceCesUtf32StrToIso2022Str(void* context, const uint32_t* utf32, uint32_t utf32max, uint32_t* utf32Len, uint8_t* iso, uint32_t isoMax, uint32_t* isoLen) { + if (!iso) return CES_ERROR_INVALID_DST_BUFFER; + return toIso2022(context, utf32, utf32max, utf32Len, iso, isoMax, isoLen, decodeUtf32); +} + +int APS5_VABI sceCesUtf32StrGetIso2022Len(void* context, const uint32_t* utf32, uint32_t utf32max, uint32_t* utf32Len, uint32_t* isoLen) { + return toIso2022(context, utf32, utf32max, utf32Len, static_cast(nullptr), 0, isoLen, decodeUtf32); +} + +int APS5_VABI sceCesIso2022StrToUtf32Str(void* context, const uint8_t* iso, uint32_t isoMax, uint32_t* isoLen, uint32_t* utf32, uint32_t utf32max, uint32_t* utf32Len) { + if (!utf32) return CES_ERROR_INVALID_DST_BUFFER; + return fromIso2022(context, iso, isoMax, isoLen, utf32, utf32max, utf32Len, encodeUtf32); +} + +int APS5_VABI sceCesIso2022StrGetUtf32Len(void* context, const uint8_t* iso, uint32_t isoMax, uint32_t* isoLen, uint32_t* utf32Len) { + return fromIso2022(context, iso, isoMax, isoLen, static_cast(nullptr), 0, utf32Len, encodeUtf32); +} + } diff --git a/core/libs/prx/libSceCesCs/PendingExports.cpp b/core/libs/prx/libSceCesCs/PendingExports.cpp index 9089f429b974..6aee7097b659 100644 --- a/core/libs/prx/libSceCesCs/PendingExports.cpp +++ b/core/libs/prx/libSceCesCs/PendingExports.cpp @@ -38,56 +38,6 @@ int APS5_VABI sceCesIso2022JpUcsProfileSetSbcs(void) { return 0; } -int APS5_VABI sceCesIso2022StrGetUcs2Len(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceCesIso2022StrGetUtf16Len(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceCesIso2022StrGetUtf32Len(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceCesIso2022StrGetUtf8Len(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceCesIso2022StrToUcs2Str(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceCesIso2022StrToUtf16Str(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceCesIso2022StrToUtf32Str(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceCesIso2022StrToUtf8Str(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceCesIso2022UcsContextInit(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceCesIso2022UcsContextInitCopy(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI sceCesJisGetLevel(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -173,30 +123,6 @@ int APS5_VABI sceCesSJisUcsProfileSetSbcs(void) { return 0; } -int APS5_VABI sceCesUcs2StrGetIso2022Len(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceCesUcs2StrToIso2022Str(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceCesUcsProfileInitIso2022JpCp50221(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceCesUcsProfileInitIso2022JpCp50222(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceCesUcsProfileInitIso2022JpRfc1468(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} int APS5_VABI sceCesUcsToJiscs(void) { NotImplemented_nid_no_patch(__func__); @@ -208,34 +134,4 @@ int APS5_VABI sceCesUhcUcsProfileSetSbcs(void) { return 0; } -int APS5_VABI sceCesUtf16StrGetIso2022Len(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceCesUtf16StrToIso2022Str(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceCesUtf32StrGetIso2022Len(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceCesUtf32StrToIso2022Str(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceCesUtf8StrGetIso2022Len(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceCesUtf8StrToIso2022Str(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - } diff --git a/core/libs/prx/libSceCesCs/include/Api.hpp b/core/libs/prx/libSceCesCs/include/Api.hpp index 868da5a976ac..a21ea8a5c75c 100644 --- a/core/libs/prx/libSceCesCs/include/Api.hpp +++ b/core/libs/prx/libSceCesCs/include/Api.hpp @@ -215,16 +215,16 @@ int APS5_VABI sceCesGbUcsProfileSet4ByteCharRange(void); int APS5_VABI sceCesGbUcsProfileSetSbcs(void); int APS5_VABI sceCesGbUcsProfileSetUdaMapping(void); int APS5_VABI sceCesIso2022JpUcsProfileSetSbcs(void); -int APS5_VABI sceCesIso2022StrGetUcs2Len(void); -int APS5_VABI sceCesIso2022StrGetUtf16Len(void); -int APS5_VABI sceCesIso2022StrGetUtf32Len(void); -int APS5_VABI sceCesIso2022StrGetUtf8Len(void); -int APS5_VABI sceCesIso2022StrToUcs2Str(void); -int APS5_VABI sceCesIso2022StrToUtf16Str(void); -int APS5_VABI sceCesIso2022StrToUtf32Str(void); -int APS5_VABI sceCesIso2022StrToUtf8Str(void); -int APS5_VABI sceCesIso2022UcsContextInit(void); -int APS5_VABI sceCesIso2022UcsContextInitCopy(void); +int APS5_VABI sceCesIso2022StrGetUcs2Len(void* context, const uint8_t* iso, uint32_t isoMax, uint32_t* isoLen, uint32_t* ucs2Len); +int APS5_VABI sceCesIso2022StrGetUtf16Len(void* context, const uint8_t* iso, uint32_t isoMax, uint32_t* isoLen, uint32_t* utf16Len); +int APS5_VABI sceCesIso2022StrGetUtf32Len(void* context, const uint8_t* iso, uint32_t isoMax, uint32_t* isoLen, uint32_t* utf32Len); +int APS5_VABI sceCesIso2022StrGetUtf8Len(void* context, const uint8_t* iso, uint32_t isoMax, uint32_t* isoLen, uint32_t* utf8Len); +int APS5_VABI sceCesIso2022StrToUcs2Str(void* context, const uint8_t* iso, uint32_t isoMax, uint32_t* isoLen, uint16_t* ucs2, uint32_t ucs2max, uint32_t* ucs2Len); +int APS5_VABI sceCesIso2022StrToUtf16Str(void* context, const uint8_t* iso, uint32_t isoMax, uint32_t* isoLen, uint16_t* utf16, uint32_t utf16max, uint32_t* utf16Len); +int APS5_VABI sceCesIso2022StrToUtf32Str(void* context, const uint8_t* iso, uint32_t isoMax, uint32_t* isoLen, uint32_t* utf32, uint32_t utf32max, uint32_t* utf32Len); +int APS5_VABI sceCesIso2022StrToUtf8Str(void* context, const uint8_t* iso, uint32_t isoMax, uint32_t* isoLen, uint8_t* utf8, uint32_t utf8max, uint32_t* utf8Len); +int APS5_VABI sceCesIso2022UcsContextInit(void* context, const void* profile); +int APS5_VABI sceCesIso2022UcsContextInitCopy(void* context, const void* source); int APS5_VABI sceCesJisGetLevel(void); int APS5_VABI sceCesJiscsToUcs(void); int APS5_VABI sceCesMbcsUcsSetMbcsReplacementCharCode(void); @@ -254,28 +254,28 @@ const uint8_t* APS5_VABI sceCesRefersUcsProfileJisX0201Tilde0x7e(void); const uint8_t* APS5_VABI sceCesRefersUcsProfileKsX1003(void); const uint8_t* APS5_VABI sceCesRefersUcsProfileKsX1003Tilde0x7e(void); int APS5_VABI sceCesSJisUcsProfileSetSbcs(void); -int APS5_VABI sceCesUcs2StrGetIso2022Len(void); -int APS5_VABI sceCesUcs2StrToIso2022Str(void); +int APS5_VABI sceCesUcs2StrGetIso2022Len(void* context, const uint16_t* ucs2, uint32_t ucs2max, uint32_t* ucs2Len, uint32_t* isoLen); +int APS5_VABI sceCesUcs2StrToIso2022Str(void* context, const uint16_t* ucs2, uint32_t ucs2max, uint32_t* ucs2Len, uint8_t* iso, uint32_t isoMax, uint32_t* isoLen); int APS5_VABI sceCesUcs2ToMbc(uint16_t ucs2, const void* profile, uint8_t* mbcBuffer, uint32_t mbcMax, uint32_t* mbcLen); void* APS5_VABI sceCesUcsProfileInitEucJis2004(void* sheet); -int APS5_VABI sceCesUcsProfileInitIso2022JpCp50221(void); -int APS5_VABI sceCesUcsProfileInitIso2022JpCp50222(void); -int APS5_VABI sceCesUcsProfileInitIso2022JpRfc1468(void); +void* APS5_VABI sceCesUcsProfileInitIso2022JpCp50221(void* sheet); +void* APS5_VABI sceCesUcsProfileInitIso2022JpCp50222(void* sheet); +void* APS5_VABI sceCesUcsProfileInitIso2022JpRfc1468(void* sheet); void* APS5_VABI sceCesUcsProfileInitSJis2004X0213(void* sheet); int APS5_VABI sceCesUcsToJiscs(void); int APS5_VABI sceCesUhcUcsProfileSetSbcs(void); -int APS5_VABI sceCesUtf16StrGetIso2022Len(void); -int APS5_VABI sceCesUtf16StrToIso2022Str(void); +int APS5_VABI sceCesUtf16StrGetIso2022Len(void* context, const uint16_t* utf16, uint32_t utf16max, uint32_t* utf16Len, uint32_t* isoLen); +int APS5_VABI sceCesUtf16StrToIso2022Str(void* context, const uint16_t* utf16, uint32_t utf16max, uint32_t* utf16Len, uint8_t* iso, uint32_t isoMax, uint32_t* isoLen); int APS5_VABI sceCesUtf16ToMbc(const uint16_t* utf16Buffer, uint32_t utf16Max, uint32_t* utf16Len, const void* profile, uint8_t* mbcBuffer, uint32_t mbcMax, uint32_t* mbcLen); int APS5_VABI sceCesUtf16beToMbc(const uint16_t* utf16Buffer, uint32_t utf16Max, uint32_t* utf16Len, const void* profile, uint8_t* mbcBuffer, uint32_t mbcMax, uint32_t* mbcLen); int APS5_VABI sceCesUtf16leToMbc(const uint16_t* utf16Buffer, uint32_t utf16Max, uint32_t* utf16Len, const void* profile, uint8_t* mbcBuffer, uint32_t mbcMax, uint32_t* mbcLen); -int APS5_VABI sceCesUtf32StrGetIso2022Len(void); -int APS5_VABI sceCesUtf32StrToIso2022Str(void); +int APS5_VABI sceCesUtf32StrGetIso2022Len(void* context, const uint32_t* utf32, uint32_t utf32max, uint32_t* utf32Len, uint32_t* isoLen); +int APS5_VABI sceCesUtf32StrToIso2022Str(void* context, const uint32_t* utf32, uint32_t utf32max, uint32_t* utf32Len, uint8_t* iso, uint32_t isoMax, uint32_t* isoLen); int APS5_VABI sceCesUtf32ToMbc(uint32_t utf32, const void* profile, uint8_t* mbcBuffer, uint32_t mbcMax, uint32_t* mbcLen); int APS5_VABI sceCesUtf32beToMbc(const uint32_t* utf32, const void* profile, uint8_t* mbcBuffer, uint32_t mbcMax, uint32_t* mbcLen); int APS5_VABI sceCesUtf32leToMbc(const uint32_t* utf32, const void* profile, uint8_t* mbcBuffer, uint32_t mbcMax, uint32_t* mbcLen); -int APS5_VABI sceCesUtf8StrGetIso2022Len(void); -int APS5_VABI sceCesUtf8StrToIso2022Str(void); +int APS5_VABI sceCesUtf8StrGetIso2022Len(void* context, const uint8_t* utf8, uint32_t utf8max, uint32_t* utf8Len, uint32_t* isoLen); +int APS5_VABI sceCesUtf8StrToIso2022Str(void* context, const uint8_t* utf8, uint32_t utf8max, uint32_t* utf8Len, uint8_t* iso, uint32_t isoMax, uint32_t* isoLen); int APS5_VABI sceCesUtf8ToMbc(const uint8_t* utf8Buffer, uint32_t utf8Max, uint32_t* utf8Len, const void* profile, uint8_t* mbcBuffer, uint32_t mbcMax, uint32_t* mbcLen); int APS5_VABI sceCesUcs2ToUtf8(uint16_t source, uint8_t* target, uint32_t capacity, uint32_t* targetLength); int APS5_VABI sceCesUtf8ToUcs2(const uint8_t* source, uint32_t available, uint32_t* sourceLength, uint16_t* target); diff --git a/core/libs/prx/libSceCffMgr/Export.cpp b/core/libs/prx/libSceCffMgr/Export.cpp new file mode 100644 index 000000000000..2efb2e198ee2 --- /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 000000000000..bd74407b0daa --- /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 000000000000..af6b8036b46b --- /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 000000000000..ece48c5ffccf --- /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 d3e8c4b64e74..b3b6f9bf1be0 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/libSceComposite/Export.cpp b/core/libs/prx/libSceComposite/Export.cpp index 96949e8e2f3a..92183376c0de 100644 --- a/core/libs/prx/libSceComposite/Export.cpp +++ b/core/libs/prx/libSceComposite/Export.cpp @@ -391,4 +391,96 @@ int APS5_VABI sceCompsoitorGetRenderingTime() { return 0; } +int APS5_VABI sceCompositorGetMemoryPoolAddress() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCompositorGetMemoryPoolSize() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCompositorGetNullCanvasHandle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCompositorGetSecondaryMemoryAddress() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCompositorGetSecondaryMemorySize() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCompositorGetTFRing() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCompositorGetVirtualCanvasHandle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCompositorIsVirtualCanvasHandle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCompositorMemoryPoolCommit() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCompositorMemoryPoolCreate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCompositorPermanentMemoryCreate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCompositorSecondaryMemoryCreate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCompositorSetCanvasIdToCanvasHandle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCompositorSetFlipCommand3() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCompositorSetMainPort() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCompositorSetMainPortPixelFormat() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCompositorSetMetaIdToCanvasHandle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCompositorSetNativeVrVideoOutMode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCompositorSetTFRing() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCompositorSetVirtualCanvasRenderTargetCommand() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCompositorStartSeeThroughBuffer() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCompositorStopSeeThroughBuffer() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCompositorWaitEndOfRenderingIfGpuWorking() { + NotImplemented_nid_no_patch(__func__); +} + } diff --git a/core/libs/prx/libSceComposite/include/Api.hpp b/core/libs/prx/libSceComposite/include/Api.hpp index 0df26cb6bc2e..8a37a3177946 100644 --- a/core/libs/prx/libSceComposite/include/Api.hpp +++ b/core/libs/prx/libSceComposite/include/Api.hpp @@ -83,4 +83,28 @@ int APS5_VABI sceCompsoitorGetGpuClock(); int APS5_VABI sceCompsoitorGetProcessRenderingTime(); int APS5_VABI sceCompsoitorGetRenderingTime(); +int APS5_VABI sceCompositorGetMemoryPoolAddress(); +int APS5_VABI sceCompositorGetMemoryPoolSize(); +int APS5_VABI sceCompositorGetNullCanvasHandle(); +int APS5_VABI sceCompositorGetSecondaryMemoryAddress(); +int APS5_VABI sceCompositorGetSecondaryMemorySize(); +int APS5_VABI sceCompositorGetTFRing(); +int APS5_VABI sceCompositorGetVirtualCanvasHandle(); +int APS5_VABI sceCompositorIsVirtualCanvasHandle(); +int APS5_VABI sceCompositorMemoryPoolCommit(); +int APS5_VABI sceCompositorMemoryPoolCreate(); +int APS5_VABI sceCompositorPermanentMemoryCreate(); +int APS5_VABI sceCompositorSecondaryMemoryCreate(); +int APS5_VABI sceCompositorSetCanvasIdToCanvasHandle(); +int APS5_VABI sceCompositorSetFlipCommand3(); +int APS5_VABI sceCompositorSetMainPort(); +int APS5_VABI sceCompositorSetMainPortPixelFormat(); +int APS5_VABI sceCompositorSetMetaIdToCanvasHandle(); +int APS5_VABI sceCompositorSetNativeVrVideoOutMode(); +int APS5_VABI sceCompositorSetTFRing(); +int APS5_VABI sceCompositorSetVirtualCanvasRenderTargetCommand(); +int APS5_VABI sceCompositorStartSeeThroughBuffer(); +int APS5_VABI sceCompositorStopSeeThroughBuffer(); +int APS5_VABI sceCompositorWaitEndOfRenderingIfGpuWorking(); + } diff --git a/core/libs/prx/libSceConnectAccountDialog/Export.cpp b/core/libs/prx/libSceConnectAccountDialog/Export.cpp index d81f4a5e32c4..6bdb0783f087 100644 --- a/core/libs/prx/libSceConnectAccountDialog/Export.cpp +++ b/core/libs/prx/libSceConnectAccountDialog/Export.cpp @@ -1,3 +1,4 @@ +#include "prx/libSceConnectAccountDialog/include/InventoryExports.hpp" #include #include #include "SceTypes.hpp" @@ -8,3 +9,35 @@ extern "C" { APS5_DUMMY_FUN } + +extern "C" { + +int APS5_VABI sceConnectAccountDialogClose() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceConnectAccountDialogGetResult() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceConnectAccountDialogGetStatus() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceConnectAccountDialogInitialize() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceConnectAccountDialogOpen() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceConnectAccountDialogTerminate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceConnectAccountDialogUpdateStatus() { + NotImplemented_nid_no_patch(__func__); +} + +} diff --git a/core/libs/prx/libSceConnectAccountDialog/include/InventoryExports.hpp b/core/libs/prx/libSceConnectAccountDialog/include/InventoryExports.hpp new file mode 100644 index 000000000000..7ff0e8782430 --- /dev/null +++ b/core/libs/prx/libSceConnectAccountDialog/include/InventoryExports.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceConnectAccountDialogClose(); +int APS5_VABI sceConnectAccountDialogGetResult(); +int APS5_VABI sceConnectAccountDialogGetStatus(); +int APS5_VABI sceConnectAccountDialogInitialize(); +int APS5_VABI sceConnectAccountDialogOpen(); +int APS5_VABI sceConnectAccountDialogTerminate(); +int APS5_VABI sceConnectAccountDialogUpdateStatus(); + +} diff --git a/core/libs/prx/libSceConnectAccountDialog/libSceConnectAccountDialog.hpp b/core/libs/prx/libSceConnectAccountDialog/libSceConnectAccountDialog.hpp index 6f70f09beec2..02c3f75b03d7 100644 --- a/core/libs/prx/libSceConnectAccountDialog/libSceConnectAccountDialog.hpp +++ b/core/libs/prx/libSceConnectAccountDialog/libSceConnectAccountDialog.hpp @@ -1 +1,2 @@ #pragma once +#include "prx/libSceConnectAccountDialog/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceContentListController/Export.cpp b/core/libs/prx/libSceContentListController/Export.cpp index d81f4a5e32c4..66632a93b6b3 100644 --- a/core/libs/prx/libSceContentListController/Export.cpp +++ b/core/libs/prx/libSceContentListController/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceContentListController/include/InventoryExports.hpp" #include #include #include "SceTypes.hpp" @@ -8,3 +10,84 @@ extern "C" { APS5_DUMMY_FUN } + +extern "C" { + +int APS5_VABI sceCLCClearFileList() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCLCClearTrackList() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCLCGetDeviceInfo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCLCGetDeviceList() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCLCGetFileInfo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCLCGetFileList() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCLCGetFileListInfo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCLCGetFolderInfo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCLCGetShuffle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCLCGetTrackInfo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCLCGetTrackList() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCLCGetTrackListInfo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCLCGetUsbStorageCallback() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCLCRegisterEventCallback() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCLCSetPlaybackResult() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCLCSetShuffle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCLCSetTrackList() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCLCSetUsbStorageCallback() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI libSceContentListControllerUnknown_SoBk_minus_kuNLsE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SoBk-kuNLsE", libSceContentListControllerUnknown_SoBk_minus_kuNLsE_nid_no_patch); + +} diff --git a/core/libs/prx/libSceContentListController/include/InventoryExports.hpp b/core/libs/prx/libSceContentListController/include/InventoryExports.hpp new file mode 100644 index 000000000000..8f3186abcf16 --- /dev/null +++ b/core/libs/prx/libSceContentListController/include/InventoryExports.hpp @@ -0,0 +1,27 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceCLCClearFileList(); +int APS5_VABI sceCLCClearTrackList(); +int APS5_VABI sceCLCGetDeviceInfo(); +int APS5_VABI sceCLCGetDeviceList(); +int APS5_VABI sceCLCGetFileInfo(); +int APS5_VABI sceCLCGetFileList(); +int APS5_VABI sceCLCGetFileListInfo(); +int APS5_VABI sceCLCGetFolderInfo(); +int APS5_VABI sceCLCGetShuffle(); +int APS5_VABI sceCLCGetTrackInfo(); +int APS5_VABI sceCLCGetTrackList(); +int APS5_VABI sceCLCGetTrackListInfo(); +int APS5_VABI sceCLCGetUsbStorageCallback(); +int APS5_VABI sceCLCRegisterEventCallback(); +int APS5_VABI sceCLCSetPlaybackResult(); +int APS5_VABI sceCLCSetShuffle(); +int APS5_VABI sceCLCSetTrackList(); +int APS5_VABI sceCLCSetUsbStorageCallback(); +int APS5_VABI libSceContentListControllerUnknown_SoBk_minus_kuNLsE_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceContentListController/libSceContentListController.hpp b/core/libs/prx/libSceContentListController/libSceContentListController.hpp index 6f70f09beec2..3c762c8b5da1 100644 --- a/core/libs/prx/libSceContentListController/libSceContentListController.hpp +++ b/core/libs/prx/libSceContentListController/libSceContentListController.hpp @@ -1 +1,2 @@ #pragma once +#include "prx/libSceContentListController/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceContentSearch/Export.cpp b/core/libs/prx/libSceContentSearch/Export.cpp index 3b3229ac0602..13c17b161aa1 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 b5a22ec35d5d..74132697f37d 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/libSceCustomMusicAudioOut/Export.cpp b/core/libs/prx/libSceCustomMusicAudioOut/Export.cpp index 04ed029ae6f2..d152ff1067f8 100644 --- a/core/libs/prx/libSceCustomMusicAudioOut/Export.cpp +++ b/core/libs/prx/libSceCustomMusicAudioOut/Export.cpp @@ -16,6 +16,10 @@ int APS5_VABI sceCustomMusicAudioOutGetAllMusicVolume() { return 0; } +int APS5_VABI sceCustomMusicAudioOutGetLastOutputTime() { + NotImplemented_nid_no_patch(__func__); +} + int APS5_VABI sceCustomMusicAudioOutGetMuted() { NotImplemented_nid_no_patch(__func__); return 0; @@ -26,9 +30,25 @@ int APS5_VABI sceCustomMusicAudioOutGetVolume() { return 0; } +int APS5_VABI sceCustomMusicAudioOutInitialize() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCustomMusicAudioOutOutput() { + NotImplemented_nid_no_patch(__func__); +} + int APS5_VABI sceCustomMusicAudioOutSetAllMusicVolume() { NotImplemented_nid_no_patch(__func__); return 0; } +int APS5_VABI sceCustomMusicAudioOutSetMuted() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCustomMusicAudioOutSetVolume() { + NotImplemented_nid_no_patch(__func__); +} + } diff --git a/core/libs/prx/libSceCustomMusicAudioOut/include/Api.hpp b/core/libs/prx/libSceCustomMusicAudioOut/include/Api.hpp index 934f42befc88..24a61c1c3253 100644 --- a/core/libs/prx/libSceCustomMusicAudioOut/include/Api.hpp +++ b/core/libs/prx/libSceCustomMusicAudioOut/include/Api.hpp @@ -6,8 +6,13 @@ extern "C" { int APS5_VABI sceCustomMusicAudioOutFinalize(); int APS5_VABI sceCustomMusicAudioOutGetAllMusicVolume(); +int APS5_VABI sceCustomMusicAudioOutGetLastOutputTime(); int APS5_VABI sceCustomMusicAudioOutGetMuted(); int APS5_VABI sceCustomMusicAudioOutGetVolume(); +int APS5_VABI sceCustomMusicAudioOutInitialize(); +int APS5_VABI sceCustomMusicAudioOutOutput(); int APS5_VABI sceCustomMusicAudioOutSetAllMusicVolume(); +int APS5_VABI sceCustomMusicAudioOutSetMuted(); +int APS5_VABI sceCustomMusicAudioOutSetVolume(); } diff --git a/core/libs/prx/libSceCustomMusicCore/Export.cpp b/core/libs/prx/libSceCustomMusicCore/Export.cpp index 65b3aaccac31..caab1b9301a8 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 000000000000..50d5550704f3 --- /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 e7d4cf7206ae..72de12a3a8d5 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 000000000000..702fa32c7fd8 --- /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 000000000000..c5a9c40f8284 --- /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 000000000000..d3bd79200fb4 --- /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 000000000000..e88e4a62fc1e --- /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 5c993b6dfb1e..a67cc5bff3d9 100644 --- a/core/libs/prx/libSceDataTransfer/Export.cpp +++ b/core/libs/prx/libSceDataTransfer/Export.cpp @@ -306,4 +306,130 @@ int APS5_VABI sceDataTransferTerminate() { return 0; } +int APS5_VABI sceDataTransferAbortAuthPS5() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferAbortFgTransferPS5() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferAbortLaunchPS4() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferAbortLaunchPS5() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferAbortPS5Request() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferAbortRequestBeforeFgTransferPS5() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferAbortSearchPS5() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferEventIsAuthReadyPS4() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferEventIsPwrReqReadyPS4() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferEventIsPwrReqReadyPS5() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferGetFgTransferProgressPS5() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferGetPS4RebootData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferHostNotifyEasySignInReady() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferRequestAuthPS4() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferRequestAuthPS5() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferRequestCalcTransferSizePS4() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferRequestCalcTransferSizePS5() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferRequestEndFgTransfer() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferRequestEndFgTransferPS5() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferRequestGetDeviceInfoPS4() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferRequestGetPS4Info() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferRequestGetPS5Info() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferRequestLaunchPS5() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferRequestPrepareFgTransferPS5() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferRequestRebootAuthPS5() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferRequestSearchPS5() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferRequestStartFgTransferPS5() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceDataTransferRequestTransferTimePS5() { + NotImplemented_nid_no_patch(__func__); +} + +} + +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 f04a12fef419..a954ad8f9e4b 100644 --- a/core/libs/prx/libSceDataTransfer/include/Api.hpp +++ b/core/libs/prx/libSceDataTransfer/include/Api.hpp @@ -64,5 +64,35 @@ int APS5_VABI sceDataTransferTargetRequestSendSsoOld2New(); int APS5_VABI sceDataTransferTargetRequestStartTransfer(); int APS5_VABI sceDataTransferTargetRequestTransferSpeed(); int APS5_VABI sceDataTransferTerminate(); +int APS5_VABI sceDataTransferAbortAuthPS5(); +int APS5_VABI sceDataTransferAbortFgTransferPS5(); +int APS5_VABI sceDataTransferAbortLaunchPS4(); +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(); +int APS5_VABI sceDataTransferGetFgTransferProgressPS5(); +int APS5_VABI sceDataTransferGetPS4RebootData(); +int APS5_VABI sceDataTransferHostNotifyEasySignInReady(); +int APS5_VABI sceDataTransferRequestAuthPS4(); +int APS5_VABI sceDataTransferRequestAuthPS5(); +int APS5_VABI sceDataTransferRequestCalcTransferSizePS4(); +int APS5_VABI sceDataTransferRequestCalcTransferSizePS5(); +int APS5_VABI sceDataTransferRequestEndFgTransfer(); +int APS5_VABI sceDataTransferRequestEndFgTransferPS5(); +int APS5_VABI sceDataTransferRequestGetDeviceInfoPS4(); +int APS5_VABI sceDataTransferRequestGetPS4Info(); +int APS5_VABI sceDataTransferRequestGetPS5Info(); +int APS5_VABI sceDataTransferRequestLaunchPS5(); +int APS5_VABI sceDataTransferRequestPrepareFgTransferPS5(); +int APS5_VABI sceDataTransferRequestRebootAuthPS5(); +int APS5_VABI sceDataTransferRequestSearchPS5(); +int APS5_VABI sceDataTransferRequestStartFgTransferPS5(); +int APS5_VABI sceDataTransferRequestTransferTimePS5(); } diff --git a/core/libs/prx/libSceDepth/Export.cpp b/core/libs/prx/libSceDepth/Export.cpp index 58c40c04fd74..e6fa071a1ebb 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 000000000000..5e8d7bf6f28d --- /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 889970561806..1ef31b6f2885 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 18a122f40c13..9af500df42d2 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 000000000000..6f597114121d --- /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 30a843bc1bb8..a918ff3b4952 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/libSceDipsw/Export.cpp b/core/libs/prx/libSceDipsw/Export.cpp index a822968f7dd8..cca05fb90fc0 100644 --- a/core/libs/prx/libSceDipsw/Export.cpp +++ b/core/libs/prx/libSceDipsw/Export.cpp @@ -31,6 +31,10 @@ int APS5_VABI sceKernelIsDisableRazor() { return 0; } +int APS5_VABI sceKernelGetDiableBinaryVersionCheckValue() { + NotImplemented_nid_no_patch(__func__); +} + int APS5_VABI sceKernelReadDipswData() { NotImplemented_nid_no_patch(__func__); return 0; diff --git a/core/libs/prx/libSceDipsw/include/Api.hpp b/core/libs/prx/libSceDipsw/include/Api.hpp index 655ebbc6de9a..5b61319c2ff8 100644 --- a/core/libs/prx/libSceDipsw/include/Api.hpp +++ b/core/libs/prx/libSceDipsw/include/Api.hpp @@ -9,6 +9,7 @@ int APS5_VABI sceKernelInitializeDipsw(); int APS5_VABI sceKernelIsAssistMode(); int APS5_VABI sceKernelIsDevelopmentMode(); int APS5_VABI sceKernelIsDisableRazor(); +int APS5_VABI sceKernelGetDiableBinaryVersionCheckValue(); int APS5_VABI sceKernelReadDipswData(); int APS5_VABI sceKernelSetDipsw(); int APS5_VABI sceKernelUnsetDipsw(); diff --git a/core/libs/prx/libSceDiscMap/Export.cpp b/core/libs/prx/libSceDiscMap/Export.cpp index 7eea1e399907..60e7b92ba63d 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 000000000000..d7a97b8de8db --- /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 e380270d799f..c46405c8fa75 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/libSceEditMp4/CMakeLists.txt b/core/libs/prx/libSceEditMp4/CMakeLists.txt new file mode 100644 index 000000000000..e2e93c20c63c --- /dev/null +++ b/core/libs/prx/libSceEditMp4/CMakeLists.txt @@ -0,0 +1,14 @@ +add_library(libSceEditMp4 SHARED EXCLUDE_FROM_ALL Export.cpp) +target_include_directories(libSceEditMp4 PRIVATE ${LIBS_INCLUDE_DIR}) +configure_windows_unwind(libSceEditMp4) + +if(BUILD_TESTING) + add_test_executable(guest_edit_mp4_tests ${LIBS_INCLUDE_DIR}/tests/GuestEditMp4.cpp) + target_include_directories(guest_edit_mp4_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_edit_mp4_tests PRIVATE libSceEditMp4) + add_test(NAME guest_edit_mp4 COMMAND guest_edit_mp4_tests) + if(WIN32) + set_tests_properties(guest_edit_mp4 PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceEditMp4/Export.cpp b/core/libs/prx/libSceEditMp4/Export.cpp index cc4aed4a4344..423d5a76e081 100644 --- a/core/libs/prx/libSceEditMp4/Export.cpp +++ b/core/libs/prx/libSceEditMp4/Export.cpp @@ -1,6 +1,7 @@ #include "prx/libSceEditMp4/include/Api.hpp" #include #include +#include #include "SceTypes.hpp" #include "prx/libc/include/General.hpp" @@ -26,14 +27,18 @@ int APS5_VABI sceEditMp4Initialize() { return 0; } -int APS5_VABI sceEditMp4InitializeParam() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI sceEditMp4InitializeParam(void* param) { + if (param == nullptr) return; + auto* bytes = static_cast(param); + const std::uint64_t at10 = 0x3f; + const std::uint32_t at18 = 700; + std::memset(bytes, 0, 0x10); + std::memcpy(bytes + 0x10, &at10, sizeof(at10)); + std::memcpy(bytes + 0x18, &at18, sizeof(at18)); } -int APS5_VABI sceEditMp4QueryMemSize() { - NotImplemented_nid_no_patch(__func__); - return 0; +std::uint64_t APS5_VABI sceEditMp4QueryMemSize() { + return 0x387d30; } int APS5_VABI sceEditMp4SetFinishCallback() { diff --git a/core/libs/prx/libSceEditMp4/include/Api.hpp b/core/libs/prx/libSceEditMp4/include/Api.hpp index 219759f5bf37..ce0ee511aa16 100644 --- a/core/libs/prx/libSceEditMp4/include/Api.hpp +++ b/core/libs/prx/libSceEditMp4/include/Api.hpp @@ -1,6 +1,7 @@ #pragma once #include "SceTypes.hpp" +#include extern "C" { @@ -8,8 +9,8 @@ int APS5_VABI sceEditMp4Abort(); int APS5_VABI sceEditMp4Edit(); int APS5_VABI sceEditMp4GetStatus(); int APS5_VABI sceEditMp4Initialize(); -int APS5_VABI sceEditMp4InitializeParam(); -int APS5_VABI sceEditMp4QueryMemSize(); +void APS5_VABI sceEditMp4InitializeParam(void* param); +std::uint64_t APS5_VABI sceEditMp4QueryMemSize(); int APS5_VABI sceEditMp4SetFinishCallback(); int APS5_VABI sceEditMp4Terminate(); int APS5_VABI sceEditMp4Unite(); diff --git a/core/libs/prx/libSceErrorDialog/CMakeLists.txt b/core/libs/prx/libSceErrorDialog/CMakeLists.txt index 8473f24eac9f..43c8e4f09b0c 100644 --- a/core/libs/prx/libSceErrorDialog/CMakeLists.txt +++ b/core/libs/prx/libSceErrorDialog/CMakeLists.txt @@ -1,14 +1,20 @@ add_library(libSceErrorDialog SHARED EXCLUDE_FROM_ALL Export.cpp) target_include_directories(libSceErrorDialog PRIVATE ${LIBS_INCLUDE_DIR}) +target_link_libraries(libSceErrorDialog PRIVATE libSceIme) configure_windows_unwind(libSceErrorDialog) if(BUILD_TESTING) add_test_executable(guest_error_dialog_tests ${LIBS_INCLUDE_DIR}/tests/GuestErrorDialog.cpp) target_include_directories(guest_error_dialog_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(guest_error_dialog_tests PRIVATE libSceErrorDialog) + target_link_libraries(guest_error_dialog_tests PRIVATE libSceErrorDialog libSceIme libc) add_test(NAME guest_error_dialog COMMAND guest_error_dialog_tests) if(WIN32) set_tests_properties(guest_error_dialog PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") + "PATH=path_list_prepend:$;PATH=path_list_prepend:$") endif() + + add_test_executable(error_dialog_request_tests ${LIBS_INCLUDE_DIR}/tests/ErrorDialogRequest.cpp) + target_include_directories(error_dialog_request_tests PRIVATE ${LIBS_INCLUDE_DIR}) + configure_host_test_executable(error_dialog_request_tests) + add_test(NAME error_dialog_request COMMAND error_dialog_request_tests) endif() diff --git a/core/libs/prx/libSceErrorDialog/Export.cpp b/core/libs/prx/libSceErrorDialog/Export.cpp index 5d6ed9d85ed6..9cf93ee24e85 100644 --- a/core/libs/prx/libSceErrorDialog/Export.cpp +++ b/core/libs/prx/libSceErrorDialog/Export.cpp @@ -1,4 +1,6 @@ #include "prx/libSceErrorDialog/include/Api.hpp" +#include "prx/libSceErrorDialog/include/ErrorDialogRequest.hpp" +#include "prx/libSceIme/include/ModalDialog.hpp" #include #include #include @@ -29,6 +31,7 @@ constexpr std::size_t kParamSize = 16; std::mutex g_lock; int g_status = kStatusNone; +bool g_presented = false; bool Readable(const void* p, std::size_t n) { #ifdef _WIN32 @@ -42,6 +45,12 @@ bool Readable(const void* p, std::size_t n) { return p != nullptr; #endif } + +void Refresh() { + if (g_status != kStatusRunning || !g_presented) return; + std::size_t chosen = 0; + if (ModalDialogPoll_nid_postfix(chosen, ModalDialogOwnerErrorDialog) != ModalDialogState::Showing) g_status = kStatusFinished; +} } // namespace extern "C" { @@ -64,25 +73,31 @@ int APS5_VABI sceErrorDialogOpen(const void* param) { std::int32_t userId = 0; std::memcpy(&errorCode, static_cast(param) + 4, sizeof(errorCode)); std::memcpy(&userId, static_cast(param) + 8, sizeof(userId)); - APS5_HIT("ERRORDIALOG", "open: error_code=0x%08X user_id=%d", errorCode, userId); + ModalDialogRequest request = ErrorDialog::BuildRequest(errorCode); + request.owner = ModalDialogOwnerErrorDialog; + g_presented = ModalDialogOpen_nid_postfix(request); + APS5_HIT("ERRORDIALOG", "open: error_code=0x%08X user_id=%d -> %s", errorCode, userId, g_presented ? "shown" : "auto answer"); g_status = kStatusRunning; return kErrOk; } int APS5_VABI sceErrorDialogUpdateStatus(void) { std::lock_guard g(g_lock); - if (g_status == kStatusRunning) g_status = kStatusFinished; + Refresh(); + if (g_status == kStatusRunning && !g_presented) g_status = kStatusFinished; return g_status; } int APS5_VABI sceErrorDialogGetStatus(void) { std::lock_guard g(g_lock); + Refresh(); return g_status; } int APS5_VABI sceErrorDialogClose(void) { std::lock_guard g(g_lock); if (g_status != kStatusRunning) return kErrInvalidState; + if (g_presented) ModalDialogClose_nid_postfix(ModalDialogOwnerErrorDialog); g_status = kStatusFinished; return kErrOk; } @@ -91,6 +106,8 @@ int APS5_VABI sceErrorDialogTerminate(void) { std::lock_guard g(g_lock); if (g_status == kStatusNone) return kErrNotInitialized; g_status = kStatusNone; + g_presented = false; + ModalDialogReset_nid_postfix(ModalDialogOwnerErrorDialog); return kErrOk; } diff --git a/core/libs/prx/libSceErrorDialog/include/ErrorDialogRequest.hpp b/core/libs/prx/libSceErrorDialog/include/ErrorDialogRequest.hpp new file mode 100644 index 000000000000..6e75fc275e63 --- /dev/null +++ b/core/libs/prx/libSceErrorDialog/include/ErrorDialogRequest.hpp @@ -0,0 +1,25 @@ +#ifndef CORE_LIBS_PRX_LIBSCEERRORDIALOG_INCLUDE_ERRORDIALOGREQUEST_HPP +#define CORE_LIBS_PRX_LIBSCEERRORDIALOG_INCLUDE_ERRORDIALOGREQUEST_HPP + +#include +#include +#include + +#include "prx/libSceIme/include/ModalDialog.hpp" + +namespace ErrorDialog { + +inline ModalDialogRequest BuildRequest(std::int32_t errorCode) { + char code[16] = {}; + std::snprintf(code, sizeof(code), "0x%08X", static_cast(errorCode)); + ModalDialogRequest request; + request.message = u"An error occurred.\nError code: "; + for (const char* digit = code; *digit != '\0'; ++digit) request.message.push_back(static_cast(*digit)); + request.buttons = {u"OK"}; + request.cancel = 0; + return request; +} + +} + +#endif diff --git a/core/libs/prx/libSceEsvm/Export.cpp b/core/libs/prx/libSceEsvm/Export.cpp index cbef694c99b7..3935b8b5ad9a 100644 --- a/core/libs/prx/libSceEsvm/Export.cpp +++ b/core/libs/prx/libSceEsvm/Export.cpp @@ -26,4 +26,185 @@ int APS5_VABI sceEsvmSyncVideo() { return 0; } +int APS5_VABI sceEsvmAddDecoder() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmAddDecoder2() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmCheckCallback() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmCreateContext() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmCreateMediaKeySession() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmCreateMediaKeys() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmDestroyContext() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmDestroyMediaKeySession() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmDestroyMediaKeySystemAccess() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmDestroyMediaKeys() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmFlush() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmInitialize() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmMediaKeySessionClose() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmMediaKeySessionDecryptAudioData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmMediaKeySessionGenerateRequest() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmMediaKeySessionGetExpiration() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmMediaKeySessionGetKeyStatuses() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmMediaKeySessionGetSessionId() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmMediaKeySessionLoad() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmMediaKeySessionRemove() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmMediaKeySessionUpdate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmMute() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmPause() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmPlay() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmPushAccessUnit() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmReleaseVideoFrame() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmRender() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmRenderById() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmSetAudiblePlaybackRate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmSetCodecConfig() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmSetPlaybackRate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmSetVolume() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmTerminate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmVideoOutAllowOutputResolutionWqhdDetection() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmVideoOutConfigureOutputEx() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmVideoOutGetMonitorInfo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmVideoOutGetOutputStatus() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmVideoOutInitializeOutputOptions() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmVideoOutIsHdcp14Enabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmVideoOutIsHdcp23Enabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmVideoOutIsOutputSupportedByMonitorInfo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmVideoOutIsPortDeviceConnected() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmVideoOutIsPortStatusUsable() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmVideoOutSetContentDynamicRange() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmVideoOutSetContentType() { + NotImplemented_nid_no_patch(__func__); +} + + } diff --git a/core/libs/prx/libSceEsvm/include/Api.hpp b/core/libs/prx/libSceEsvm/include/Api.hpp index d11b339d0e26..ea4db121268a 100644 --- a/core/libs/prx/libSceEsvm/include/Api.hpp +++ b/core/libs/prx/libSceEsvm/include/Api.hpp @@ -8,4 +8,51 @@ int APS5_VABI sceEsvmAppAudioSyncCreateContext(); int APS5_VABI sceEsvmAppAudioSyncFlush(); int APS5_VABI sceEsvmSyncVideo(); +int APS5_VABI sceEsvmAddDecoder(); +int APS5_VABI sceEsvmAddDecoder2(); +int APS5_VABI sceEsvmCheckCallback(); +int APS5_VABI sceEsvmCreateContext(); +int APS5_VABI sceEsvmCreateMediaKeySession(); +int APS5_VABI sceEsvmCreateMediaKeys(); +int APS5_VABI sceEsvmDestroyContext(); +int APS5_VABI sceEsvmDestroyMediaKeySession(); +int APS5_VABI sceEsvmDestroyMediaKeySystemAccess(); +int APS5_VABI sceEsvmDestroyMediaKeys(); +int APS5_VABI sceEsvmFlush(); +int APS5_VABI sceEsvmInitialize(); +int APS5_VABI sceEsvmMediaKeySessionClose(); +int APS5_VABI sceEsvmMediaKeySessionDecryptAudioData(); +int APS5_VABI sceEsvmMediaKeySessionGenerateRequest(); +int APS5_VABI sceEsvmMediaKeySessionGetExpiration(); +int APS5_VABI sceEsvmMediaKeySessionGetKeyStatuses(); +int APS5_VABI sceEsvmMediaKeySessionGetSessionId(); +int APS5_VABI sceEsvmMediaKeySessionLoad(); +int APS5_VABI sceEsvmMediaKeySessionRemove(); +int APS5_VABI sceEsvmMediaKeySessionUpdate(); +int APS5_VABI sceEsvmMute(); +int APS5_VABI sceEsvmPause(); +int APS5_VABI sceEsvmPlay(); +int APS5_VABI sceEsvmPushAccessUnit(); +int APS5_VABI sceEsvmReleaseVideoFrame(); +int APS5_VABI sceEsvmRender(); +int APS5_VABI sceEsvmRenderById(); +int APS5_VABI sceEsvmSetAudiblePlaybackRate(); +int APS5_VABI sceEsvmSetCodecConfig(); +int APS5_VABI sceEsvmSetPlaybackRate(); +int APS5_VABI sceEsvmSetVolume(); +int APS5_VABI sceEsvmTerminate(); +int APS5_VABI sceEsvmVideoOutAllowOutputResolutionWqhdDetection(); +int APS5_VABI sceEsvmVideoOutConfigureOutputEx(); +int APS5_VABI sceEsvmVideoOutGetMonitorInfo(); +int APS5_VABI sceEsvmVideoOutGetOutputStatus(); +int APS5_VABI sceEsvmVideoOutInitializeOutputOptions(); +int APS5_VABI sceEsvmVideoOutIsHdcp14Enabled(); +int APS5_VABI sceEsvmVideoOutIsHdcp23Enabled(); +int APS5_VABI sceEsvmVideoOutIsOutputSupportedByMonitorInfo(); +int APS5_VABI sceEsvmVideoOutIsPortDeviceConnected(); +int APS5_VABI sceEsvmVideoOutIsPortStatusUsable(); +int APS5_VABI sceEsvmVideoOutSetContentDynamicRange(); +int APS5_VABI sceEsvmVideoOutSetContentType(); + + } diff --git a/core/libs/prx/libSceEsvmEngine/Export.cpp b/core/libs/prx/libSceEsvmEngine/Export.cpp index 1ffc3f63982f..132a7599bd2d 100644 --- a/core/libs/prx/libSceEsvmEngine/Export.cpp +++ b/core/libs/prx/libSceEsvmEngine/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceEsvmEngine/include/InventoryExports.hpp" #include "prx/libSceEsvmEngine/include/Api.hpp" #include #include @@ -6,6 +8,58 @@ extern "C" { +int APS5_VABI sceEsvmEngineAddDecoder2() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineAppAudioSyncFlush() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineGetMetrics() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineGetVideoPlaybackQuality() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineInitializeCdm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineMediaKeySessionDecryptAudioData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineMediaKeysDecryptAudioData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineMediaKeysSetAppParameter() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineProcessAckResponse() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineReleaseVideoFrame() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineSetAudiblePlaybackRate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineSetMediaKeys() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineSyncVideo() { + NotImplemented_nid_no_patch(__func__); +} + int APS5_VABI sceEsvmEngineDestroyMediaKeySystemAccess() { NotImplemented_nid_no_patch(__func__); return 0; @@ -102,3 +156,113 @@ int APS5_VABI sceEsvmEngineRequestMediaKeySystemAccess() { } } + +extern "C" { + +int APS5_VABI sceEsvmEngineAddDecoder() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineCreateContext() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineDbgOverrideMediaKeySession() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineDeleteContext() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineFlush() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineGetAudioFrame() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineGetPlaybackRate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineGetProvisioningRequest() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineGetServiceCertificateRequest() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineGetVideoFrame() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineHandleProvisioningResponse() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineInitialize() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineIsProvisioned() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineMediaKeySystemAccessCreateMediaKeys2() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineMediaKeySystemAccessGetKeySystem() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineParseAndLoadServerCertificateResponse() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEnginePause() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEnginePlay() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEnginePushAccessUnit() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineQueryVideoMemory() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineRemoveDecoder() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineSetPlaybackRate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineSetServerCertificate2() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceEsvmEngineTerminate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI libSceEsvmEngineUnknown_TLCfQqZ_minus_6AU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TLCfQqZ-6AU", libSceEsvmEngineUnknown_TLCfQqZ_minus_6AU_nid_no_patch); + +int APS5_VABI libSceEsvmEngineUnknown_Y6Rtwfuj0Bw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Y6Rtwfuj0Bw", libSceEsvmEngineUnknown_Y6Rtwfuj0Bw_nid_no_patch); + +} diff --git a/core/libs/prx/libSceEsvmEngine/include/Api.hpp b/core/libs/prx/libSceEsvmEngine/include/Api.hpp index a99c298234d2..ef0a65b4820d 100644 --- a/core/libs/prx/libSceEsvmEngine/include/Api.hpp +++ b/core/libs/prx/libSceEsvmEngine/include/Api.hpp @@ -4,6 +4,20 @@ extern "C" { +int APS5_VABI sceEsvmEngineAddDecoder2(); +int APS5_VABI sceEsvmEngineAppAudioSyncFlush(); +int APS5_VABI sceEsvmEngineGetMetrics(); +int APS5_VABI sceEsvmEngineGetVideoPlaybackQuality(); +int APS5_VABI sceEsvmEngineInitializeCdm(); +int APS5_VABI sceEsvmEngineMediaKeySessionDecryptAudioData(); +int APS5_VABI sceEsvmEngineMediaKeysDecryptAudioData(); +int APS5_VABI sceEsvmEngineMediaKeysSetAppParameter(); +int APS5_VABI sceEsvmEngineProcessAckResponse(); +int APS5_VABI sceEsvmEngineReleaseVideoFrame(); +int APS5_VABI sceEsvmEngineSetAudiblePlaybackRate(); +int APS5_VABI sceEsvmEngineSetMediaKeys(); +int APS5_VABI sceEsvmEngineSyncVideo(); + int APS5_VABI sceEsvmEngineDestroyMediaKeySystemAccess(); int APS5_VABI sceEsvmEngineMediaKeySessionClose(); int APS5_VABI sceEsvmEngineMediaKeySessionGenerateRequest(); diff --git a/core/libs/prx/libSceEsvmEngine/include/InventoryExports.hpp b/core/libs/prx/libSceEsvmEngine/include/InventoryExports.hpp new file mode 100644 index 000000000000..05e09036a3cd --- /dev/null +++ b/core/libs/prx/libSceEsvmEngine/include/InventoryExports.hpp @@ -0,0 +1,34 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceEsvmEngineAddDecoder(); +int APS5_VABI sceEsvmEngineCreateContext(); +int APS5_VABI sceEsvmEngineDbgOverrideMediaKeySession(); +int APS5_VABI sceEsvmEngineDeleteContext(); +int APS5_VABI sceEsvmEngineFlush(); +int APS5_VABI sceEsvmEngineGetAudioFrame(); +int APS5_VABI sceEsvmEngineGetPlaybackRate(); +int APS5_VABI sceEsvmEngineGetProvisioningRequest(); +int APS5_VABI sceEsvmEngineGetServiceCertificateRequest(); +int APS5_VABI sceEsvmEngineGetVideoFrame(); +int APS5_VABI sceEsvmEngineHandleProvisioningResponse(); +int APS5_VABI sceEsvmEngineInitialize(); +int APS5_VABI sceEsvmEngineIsProvisioned(); +int APS5_VABI sceEsvmEngineMediaKeySystemAccessCreateMediaKeys2(); +int APS5_VABI sceEsvmEngineMediaKeySystemAccessGetKeySystem(); +int APS5_VABI sceEsvmEngineParseAndLoadServerCertificateResponse(); +int APS5_VABI sceEsvmEnginePause(); +int APS5_VABI sceEsvmEnginePlay(); +int APS5_VABI sceEsvmEnginePushAccessUnit(); +int APS5_VABI sceEsvmEngineQueryVideoMemory(); +int APS5_VABI sceEsvmEngineRemoveDecoder(); +int APS5_VABI sceEsvmEngineSetPlaybackRate(); +int APS5_VABI sceEsvmEngineSetServerCertificate2(); +int APS5_VABI sceEsvmEngineTerminate(); +int APS5_VABI libSceEsvmEngineUnknown_TLCfQqZ_minus_6AU_nid_no_patch(); +int APS5_VABI libSceEsvmEngineUnknown_Y6Rtwfuj0Bw_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceEsvmEngine/libSceEsvmEngine.hpp b/core/libs/prx/libSceEsvmEngine/libSceEsvmEngine.hpp index c8bc3ef97cf5..b45868f1a93f 100644 --- a/core/libs/prx/libSceEsvmEngine/libSceEsvmEngine.hpp +++ b/core/libs/prx/libSceEsvmEngine/libSceEsvmEngine.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceEsvmEngine/include/Api.hpp" +#include "prx/libSceEsvmEngine/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceFlexContent/Export.cpp b/core/libs/prx/libSceFlexContent/Export.cpp new file mode 100644 index 000000000000..801f42104d2a --- /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 000000000000..c921f4d50def --- /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 000000000000..b02aa37666f8 --- /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/libSceFont-module/libSceFont-module.hpp b/core/libs/prx/libSceFont-module/libSceFont-module.hpp index 6f70f09beec2..9bcb0ad7a89f 100644 --- a/core/libs/prx/libSceFont-module/libSceFont-module.hpp +++ b/core/libs/prx/libSceFont-module/libSceFont-module.hpp @@ -1 +1,3 @@ #pragma once + +#include "prx/libSceFont/libSceFont.hpp" diff --git a/core/libs/prx/libSceFont.native/libSceFont.native.hpp b/core/libs/prx/libSceFont.native/libSceFont.native.hpp index 6f70f09beec2..9bcb0ad7a89f 100644 --- a/core/libs/prx/libSceFont.native/libSceFont.native.hpp +++ b/core/libs/prx/libSceFont.native/libSceFont.native.hpp @@ -1 +1,3 @@ #pragma once + +#include "prx/libSceFont/libSceFont.hpp" diff --git a/core/libs/prx/libSceFont/include/Api.hpp b/core/libs/prx/libSceFont/include/Api.hpp index 2e7d3d5ca6ee..0080743d0f59 100644 --- a/core/libs/prx/libSceFont/include/Api.hpp +++ b/core/libs/prx/libSceFont/include/Api.hpp @@ -323,8 +323,8 @@ int APS5_VABI sceFontGraphicsUpdateShapeFill(FontGraphicsResource* resource, con int APS5_VABI sceFontGraphicsUpdateShapeFillPlot(FontGraphicsResource* resource, const FontGraphicsFillPlot* plot); int APS5_VABI sceFontSupportGlyphs(const FontGlyphSupport* support); int APS5_VABI sceFontWordsFindWordCharacters(FontWords* words, FontTextCharacter* firstCharacter, FontTextCharacter* endCharacter, FontTextCharacter** lastCharacter, FontTextCharacter** nextCharacter); -int APS5_VABI sceFontGraphicsDrawupFillTextureImageObject(FontGraphicsFrame* frame, const void* data, std::uint32_t dataSize, float x, float y, float width, float height, FontGraphicsFill** fill); -int APS5_VABI sceFontGraphicsDrawupFillTexturePatternObject(FontGraphicsFrame* frame, const void* data, std::uint32_t dataSize, std::uint32_t firstMode, std::uint32_t secondMode, std::int32_t firstCount, std::int32_t firstLayout, std::int32_t secondLayout, std::int32_t secondCount, FontGraphicsFill** fill); +int APS5_VABI sceFontGraphicsDrawupFillTextureImageObject(FontGraphicsFrame* graphicsObject, const void* fillObject, std::uint32_t mode, void** output, float x, float y, float width, float height); +int APS5_VABI sceFontGraphicsDrawupFillTexturePatternObject(FontGraphicsFrame* graphicsObject, const void* fillObject, std::uint32_t mode, void** output, float x, float y, float width, float height); int APS5_VABI sceFontCreateWritingLine(const FontMemory* memory, std::int32_t writingForm, const void* writingLineDetail, void** pWritingLine); int APS5_VABI sceFontDestroyWritingLine(void** pWritingLine); int APS5_VABI sceFontWritingLineClear(void* writingLine); @@ -333,4 +333,49 @@ const FontWritingLineStep* APS5_VABI sceFontWritingLineRefersRenderStep(void* wr int APS5_VABI sceFontWritingLineGetRenderMetrics(void* writingLine, FontWritingMetrics* writingMetrics); int APS5_VABI sceFontWritingLineGetOrderingSpace(void* writingLine, float* advanceSpace, float* headSpace, float* inlineSpace, float* tailSpace); +int APS5_VABI sceFontGraphicsCanvasStartDrawing(); +int APS5_VABI sceFontGraphicsGetDrawingFrameHandle(); +int APS5_VABI sceFontGraphicsGetIndexedVertexesGlyph(); +int APS5_VABI sceFontGraphicsProcessWaitAllSequences(); +int APS5_VABI sceFontGraphicsStructureVertexesGlyph(); +int APS5_VABI sceFontGraphicsTextureRefersSurface(); +int APS5_VABI sceFontGraphicsUndefineIndexedVertexesGlyph(); +int APS5_VABI sceFontGraphicsAppendGradientSegment(); +int APS5_VABI sceFontSupportSystemUpdation(); +int APS5_VABI sceFontGraphicsCanvasRenewal(); +int APS5_VABI sceFontGraphicsDesignStartDrawing(); +int APS5_VABI sceFontGraphicsGetVertexesGlyphMetrics(); +int APS5_VABI sceFontGraphicsUpdateSlantShift(); +int APS5_VABI sceFontGraphicsTextureMakeFillTexture(); +int APS5_VABI sceFontGraphicsTextureMakeFillTextureImage(); +int APS5_VABI sceFontGraphicsCanvasSetSurfaceFill(); +int APS5_VABI sceFontGraphicsDrawVertexesGlyph(); +int APS5_VABI sceFontGraphicsDrawRegionShape(); +int APS5_VABI sceFontGraphicsProcessWaitSequence(); +int APS5_VABI sceFontGraphicsTextureGetSurface(); +int APS5_VABI sceFontGraphicsUndefineIndexedVertexesGlyphs(); +int APS5_VABI sceFontGetCharVariationGlyphCode(); +int APS5_VABI sceFontGraphicsSetupSlantShift(); +int APS5_VABI sceFontGraphicsAdjustFillRadialGradient(); +int APS5_VABI sceFontGraphicsDrawupFillFlatColor(); +int APS5_VABI sceFontGraphicsDrawupFillLinearGradient(); +int APS5_VABI sceFontGraphicsSetVertexesGlyphScale(); +int APS5_VABI sceFontGlyphGetOutlineVertexes(); +int APS5_VABI sceFontGraphicsDrawupFillRadialGradient(); +int APS5_VABI sceFontGraphicsAdjustGradientSpread(); +int APS5_VABI sceFontGraphicsCanvasSetSurfaceFillWithLayout(); +int APS5_VABI sceFontGraphicsCanvasGetPreprocess(); +int APS5_VABI sceFontGraphicsReportError(); +int APS5_VABI sceFontGraphicsDrawRectangleShape(); +int APS5_VABI sceFontGraphicsProcessSetSyncPolicy(); +int APS5_VABI sceFontGraphicsCanvasSetSurfaceFillWithMapping(); +int APS5_VABI sceFontGraphicsUndefineIndexedVertexesGlyphAll(); +int APS5_VABI sceFontGraphicsGetVertexesGlyphScale(); +int APS5_VABI sceFontGraphicsCanvasClearPreprocess(); +int APS5_VABI sceFontGraphicsFindIndexedVertexesGlyph(); +int APS5_VABI sceFontGraphicsDefineIndexedVertexesGlyph(); +int APS5_VABI sceFontGraphicsProcessRenderSequence(); +int APS5_VABI sceFontOutlineVertexesInterfaceInit(); +int APS5_VABI sceFontGraphicsSurfaceSetTargetView(); + } diff --git a/core/libs/prx/libSceFont/src/Open.cpp b/core/libs/prx/libSceFont/src/Open.cpp index 62d33f609ea5..654e189b7ade 100644 --- a/core/libs/prx/libSceFont/src/Open.cpp +++ b/core/libs/prx/libSceFont/src/Open.cpp @@ -110,7 +110,7 @@ std::uint32_t ClaimEntry(FontCtxHeader* header, const OpenRequest& request) { std::uint32_t firstFree = 0xFFFFFFFFu; for (std::uint32_t i = 0; i < header->max_entries; ++i) { const auto& entry = entries[i]; - if ((entry.active != 0 && entry.unique_id == uniqueId) || (request.matchAddress && entry.font_address == address)) { + if (entry.active != 0 && (entry.unique_id == uniqueId || (request.matchAddress && entry.font_address == address))) { entryIndex = i; break; } diff --git a/core/libs/prx/libSceFont/src/Unimplemented.cpp b/core/libs/prx/libSceFont/src/Unimplemented.cpp index fa5b689e1eac..74b4a6244a54 100644 --- a/core/libs/prx/libSceFont/src/Unimplemented.cpp +++ b/core/libs/prx/libSceFont/src/Unimplemented.cpp @@ -358,16 +358,193 @@ int APS5_VABI sceFontWordsFindWordCharacters(FontWords* words, FontTextCharacter return Font::WordsFindWordCharacters(words, firstCharacter, endCharacter, lastCharacter, nextCharacter); } -int APS5_VABI sceFontGraphicsDrawupFillTextureImageObject(FontGraphicsFrame* frame, const void* data, std::uint32_t dataSize, float x, float y, float width, float height, FontGraphicsFill** fill) { +int APS5_VABI sceFontGraphicsDrawupFillTextureImageObject(FontGraphicsFrame* graphicsObject, const void* fillObject, std::uint32_t mode, void** output, float x, float y, float width, float height) { NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI sceFontGraphicsDrawupFillTexturePatternObject(FontGraphicsFrame* frame, const void* data, std::uint32_t dataSize, std::uint32_t firstMode, std::uint32_t secondMode, std::int32_t firstCount, std::int32_t firstLayout, std::int32_t secondLayout, std::int32_t secondCount, FontGraphicsFill** fill) { +int APS5_VABI sceFontGraphicsDrawupFillTexturePatternObject(FontGraphicsFrame* graphicsObject, const void* fillObject, std::uint32_t mode, void** output, float x, float y, float width, float height) { NotImplemented_nid_no_patch(__func__); return 0; } +int APS5_VABI sceFontGraphicsCanvasStartDrawing() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsGetDrawingFrameHandle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsGetIndexedVertexesGlyph() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsProcessWaitAllSequences() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsStructureVertexesGlyph() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsTextureRefersSurface() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsUndefineIndexedVertexesGlyph() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsAppendGradientSegment() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontSupportSystemUpdation() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsCanvasRenewal() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsDesignStartDrawing() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsGetVertexesGlyphMetrics() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsUpdateSlantShift() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsTextureMakeFillTexture() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsTextureMakeFillTextureImage() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsCanvasSetSurfaceFill() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsDrawVertexesGlyph() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsDrawRegionShape() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsProcessWaitSequence() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsTextureGetSurface() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsUndefineIndexedVertexesGlyphs() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGetCharVariationGlyphCode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsSetupSlantShift() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsAdjustFillRadialGradient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsDrawupFillFlatColor() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsDrawupFillLinearGradient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsSetVertexesGlyphScale() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGlyphGetOutlineVertexes() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsDrawupFillRadialGradient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsAdjustGradientSpread() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsCanvasSetSurfaceFillWithLayout() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsCanvasGetPreprocess() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsReportError() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsDrawRectangleShape() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsProcessSetSyncPolicy() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsCanvasSetSurfaceFillWithMapping() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsUndefineIndexedVertexesGlyphAll() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsGetVertexesGlyphScale() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsCanvasClearPreprocess() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsFindIndexedVertexesGlyph() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsDefineIndexedVertexesGlyph() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsProcessRenderSequence() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontOutlineVertexesInterfaceInit() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceFontGraphicsSurfaceSetTargetView() { + NotImplemented_nid_no_patch(__func__); +} + + } #pragma GCC visibility pop diff --git a/core/libs/prx/libSceFontGs.native/Export.cpp b/core/libs/prx/libSceFontGs.native/Export.cpp new file mode 100644 index 000000000000..258ca4598fa5 --- /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 000000000000..d2de1415bc2c --- /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 000000000000..3d9d20a693fc --- /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 d81f4a5e32c4..c625cc94a11e 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 000000000000..c3ae4d3351db --- /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 6f70f09beec2..3ec3b9d1c691 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/libSceFreeType/src/Advances.cpp b/core/libs/prx/libSceFreeType/src/Advances.cpp index a4e1cae36ccf..caa440793c57 100644 --- a/core/libs/prx/libSceFreeType/src/Advances.cpp +++ b/core/libs/prx/libSceFreeType/src/Advances.cpp @@ -1,6 +1,5 @@ #include "prx/libSceFreeType/libSceFreeType.hpp" #include "prx/libSceFreeType/include/GuestObjects.hpp" -#include "prx/libc/include/General.hpp" #include FT_ADVANCES_H #include FT_FONT_FORMATS_H @@ -8,6 +7,7 @@ #include #include +#include #include using namespace FreeType; @@ -33,12 +33,24 @@ int GetAdvances(GuestFaceRec* face, std::uint32_t start, std::uint32_t count, st if (count == 0) return 0; std::vector values(count); + std::vector repeat; if constexpr (sizeof(FT_Fixed) == sizeof(std::int64_t)) { std::memcpy(values.data(), advances, values.size() * sizeof(FT_Fixed)); } const auto query = [&](std::int32_t loadFlags) { - return single ? FT_Get_Advance(owner->host, start, loadFlags, values.data()) - : FT_Get_Advances(owner->host, start, count, loadFlags, values.data()); + const auto run = [&](FT_Fixed* output) { + return single ? FT_Get_Advance(owner->host, start, loadFlags, output) + : FT_Get_Advances(owner->host, start, count, loadFlags, output); + }; + if constexpr (sizeof(FT_Fixed) == sizeof(std::int64_t)) { + return run(values.data()); + } else { + values.assign(count, 0); + repeat.assign(count, 1); + const FT_Error result = run(values.data()); + if (run(repeat.data()) != result) throw std::runtime_error("FreeType advance query: native query is not repeatable"); + return result; + } }; FT_Error error = query(flags | FT_ADVANCE_FLAG_FAST_ONLY); bool syncSlot = error != FT_Err_Unimplemented_Feature && FastQueryLoadsGlyph(owner->host, flags); @@ -50,11 +62,8 @@ int GetAdvances(GuestFaceRec* face, std::uint32_t start, std::uint32_t count, st if constexpr (sizeof(FT_Fixed) == sizeof(std::int64_t)) { std::memcpy(advances, values.data(), values.size() * sizeof(FT_Fixed)); } else { - if (error != 0 && error != FT_Err_Unimplemented_Feature) { - NotImplemented_nid_no_patch("FreeType advance query: partial output after a native backend error with 32-bit FT_Fixed"); - } - if (error == 0) { - for (std::uint32_t index = 0; index < count; ++index) advances[index] = values[index]; + for (std::uint32_t index = 0; index < count; ++index) { + if (values[index] == repeat[index]) advances[index] = values[index]; } } return error; diff --git a/core/libs/prx/libSceFreeType/src/CurveBounds.cpp b/core/libs/prx/libSceFreeType/src/CurveBounds.cpp index 3ae90d4f6028..772510377b86 100644 --- a/core/libs/prx/libSceFreeType/src/CurveBounds.cpp +++ b/core/libs/prx/libSceFreeType/src/CurveBounds.cpp @@ -1,58 +1,217 @@ +// Derived from FreeType src/base/ftbbox.c (FreeType 2.13.3, commit 42608f77f20749dd6ddc9e0536788eaad70ea4b5). +// Copyright (C) 1996-2024 by David Turner, Robert Wilhelm, and Werner Lemberg. +// This file is part of the FreeType project, and may only be used, modified, and distributed +// under the terms of the FreeType project license, LICENSE.TXT. By continuing to use, modify, +// or distribute this file you indicate that you have read the license and understand and accept it fully. + #include "prx/libSceFreeType/include/Api.hpp" #include "prx/libSceFreeType/include/GuestFreeType.hpp" -#include "prx/libc/include/General.hpp" #include -#include FT_BBOX_H +#include FT_FREETYPE_H +#include +#include #include -#include +#include +#include + +using FreeType::GuestBBox; +using FreeType::GuestOutlineFuncs; +using FreeType::GuestOutline; +using FreeType::GuestVector; namespace { -FT_Pos NativePosition(std::int64_t value) { - if (value < std::numeric_limits::min() || value > std::numeric_limits::max()) - NotImplemented_nid_no_patch("FT_Outline_Get_BBox: coordinate outside the native FT_Pos range"); - return static_cast(value); -} - -} - -extern "C" int APS5_VABI FT_Outline_Get_BBox_nid_postfix(FreeType::GuestOutline* outline, FreeType::GuestBBox* boundingBox) { - if (!boundingBox) return FT_Outline_Get_BBox(nullptr, nullptr); - FT_BBox result{}; - if (!outline) return FT_Outline_Get_BBox(nullptr, &result); - FT_Outline native{outline->n_contours, outline->n_points, nullptr, outline->tags, outline->contours, outline->flags}; - std::vector points; - if (outline->n_points != 0 && outline->n_contours != 0) { - if (!outline->points || !outline->tags || !outline->contours) - NotImplemented_nid_no_patch("FT_Outline_Get_BBox: missing nonempty outline arrays"); - if (outline->n_contours > outline->n_points) - NotImplemented_nid_no_patch("FT_Outline_Get_BBox: inconsistent contour bounds"); - std::size_t first = 0; - for (std::size_t contour = 0; contour < outline->n_contours; ++contour) { - const std::size_t last = outline->contours[contour]; - if (last < first || last >= outline->n_points) - NotImplemented_nid_no_patch("FT_Outline_Get_BBox: inconsistent contour bounds"); - first = last + 1; +constexpr std::int64_t Minimum = std::numeric_limits::min(); +constexpr std::int64_t Maximum = std::numeric_limits::max(); +constexpr std::int64_t Unset = 0x7FFFFFFF; + +[[noreturn]] void Undefined(const char* reason) { + throw std::invalid_argument(std::string("FT_Outline_Get_BBox: ") + reason); +} + +std::int64_t Add(std::int64_t a, std::int64_t b) { + if ((b > 0 && a > Maximum - b) || (b < 0 && a < Minimum - b)) Undefined("signed overflow in the extremum arithmetic"); + return a + b; +} + +std::int64_t Subtract(std::int64_t a, std::int64_t b) { + if ((b < 0 && a > Maximum + b) || (b > 0 && a < Minimum + b)) Undefined("signed overflow in the extremum arithmetic"); + return a - b; +} + +std::int64_t Scale(std::int64_t value, std::int64_t factor) { + if (value > Maximum / factor || value < Minimum / factor) Undefined("signed overflow in the extremum arithmetic"); + return value * factor; +} + +std::int64_t Absolute(std::int64_t value) { + if (value == Minimum) Undefined("signed overflow in the extremum arithmetic"); + return value < 0 ? -value : value; +} + +std::int64_t MulDiv(std::int64_t a, std::int64_t b, std::int64_t c) { + int sign = 1; + const auto magnitude = [&sign](std::int64_t value) { + if (value >= 0) return static_cast(value); + sign = -sign; + return std::uint64_t{0} - static_cast(value); + }; + const std::uint64_t ua = magnitude(a); + const std::uint64_t ub = magnitude(b); + const std::uint64_t uc = magnitude(c); + const std::uint64_t quotient = uc > 0 ? (ua * ub + (uc >> 1)) / uc : std::uint64_t{0x7FFFFFFF}; + return static_cast(sign < 0 ? std::uint64_t{0} - quotient : quotient); +} + +void Include(const GuestVector& point, GuestBBox& box) { + if (point.x < box.xMin) box.xMin = point.x; + if (point.x > box.xMax) box.xMax = point.x; + if (point.y < box.yMin) box.yMin = point.y; + if (point.y > box.yMax) box.yMax = point.y; +} + +void ConicCheck(std::int64_t y1, std::int64_t y2, std::int64_t y3, std::int64_t& minimum, std::int64_t& maximum) { + y1 = Subtract(y1, y2); + y3 = Subtract(y3, y2); + y2 = Add(y2, MulDiv(y1, y3, Add(y1, y3))); + if (y2 < minimum) minimum = y2; + if (y2 > maximum) maximum = y2; +} + +std::int64_t CubicPeak(std::int64_t q1, std::int64_t q2, std::int64_t q3, std::int64_t q4) { + const auto bits = static_cast(Absolute(q1) | Absolute(q2) | Absolute(q3) | Absolute(q4)); + if (bits == 0) Undefined("cubic control distances whose low 32 bits are zero"); + int shift = 27 - (31 - std::countl_zero(bits)); + if (shift > 0) { + if (shift > 2) shift = 2; + const std::int64_t factor = std::int64_t{1} << shift; + q1 = Scale(q1, factor); + q2 = Scale(q2, factor); + q3 = Scale(q3, factor); + q4 = Scale(q4, factor); + } else { + q1 >>= -shift; + q2 >>= -shift; + q3 >>= -shift; + q4 >>= -shift; + } + std::int64_t peak = 0; + while (q2 > 0 || q3 > 0) { + if (Add(q1, q2) > Add(q3, q4)) { + q4 = Add(q4, q3); + q3 = Add(q3, q2); + q2 = Add(q2, q1); + q4 = Add(q4, q3); + q3 = Add(q3, q2); + q4 = Add(q4, q3) >> 3; + q3 >>= 2; + q2 >>= 1; + } else { + q1 = Add(q1, q2); + q2 = Add(q2, q3); + q3 = Add(q3, q4); + q1 = Add(q1, q2); + q2 = Add(q2, q3); + q1 = Add(q1, q2) >> 3; + q2 >>= 2; + q3 >>= 1; + } + if (q1 == q2 && q1 >= q3) { + peak = q1; + break; } - if (first != outline->n_points) - NotImplemented_nid_no_patch("FT_Outline_Get_BBox: inconsistent contour bounds"); - points.reserve(outline->n_points); - constexpr std::int64_t curveLimit = std::numeric_limits::max() / 4; - bool curved = false; - bool wide = false; - for (std::size_t index = 0; index < outline->n_points; ++index) { - points.push_back({NativePosition(outline->points[index].x), NativePosition(outline->points[index].y)}); - curved |= (outline->tags[index] & 3) != FT_CURVE_TAG_ON; - wide |= outline->points[index].x < -curveLimit || outline->points[index].x > curveLimit || - outline->points[index].y < -curveLimit || outline->points[index].y > curveLimit; + if (q3 == q4 && q2 <= q4) { + peak = q4; + break; } - if (curved && wide) - NotImplemented_nid_no_patch("FT_Outline_Get_BBox: curved coordinates exceed the portable arithmetic range"); - native.points = points.data(); } - const FT_Error error = FT_Outline_Get_BBox(&native, &result); - if (error == 0) *boundingBox = {result.xMin, result.yMin, result.xMax, result.yMax}; - return error; + if (shift > 0) return peak >> shift; + if (shift == 0) return peak; + if (peak < 0) Undefined("left shift of a negative cubic peak"); + return Scale(peak, std::int64_t{1} << -shift); +} + +void CubicCheck(std::int64_t p1, std::int64_t p2, std::int64_t p3, std::int64_t p4, std::int64_t& minimum, std::int64_t& maximum) { + if (p2 > maximum || p3 > maximum) { + maximum = Add(maximum, CubicPeak(Subtract(p1, maximum), Subtract(p2, maximum), Subtract(p3, maximum), Subtract(p4, maximum))); + } + if (p2 < minimum || p3 < minimum) { + minimum = Subtract(minimum, CubicPeak(Subtract(minimum, p1), Subtract(minimum, p2), Subtract(minimum, p3), Subtract(minimum, p4))); + } +} + +bool OutsideX(const GuestVector& point, const GuestBBox& box) { + return point.x < box.xMin || point.x > box.xMax; +} + +bool OutsideY(const GuestVector& point, const GuestBBox& box) { + return point.y < box.yMin || point.y > box.yMax; +} + +struct Walk { + GuestVector last{}; + GuestBBox box{}; +}; + +APS5_VABI int MoveTo(const GuestVector* to, void* user) { + auto& walk = *static_cast(user); + Include(*to, walk.box); + walk.last = *to; + return 0; +} + +APS5_VABI int LineTo(const GuestVector* to, void* user) { + static_cast(user)->last = *to; + return 0; +} + +APS5_VABI int ConicTo(const GuestVector* control, const GuestVector* to, void* user) { + auto& walk = *static_cast(user); + Include(*to, walk.box); + if (OutsideX(*control, walk.box)) ConicCheck(walk.last.x, control->x, to->x, walk.box.xMin, walk.box.xMax); + if (OutsideY(*control, walk.box)) ConicCheck(walk.last.y, control->y, to->y, walk.box.yMin, walk.box.yMax); + walk.last = *to; + return 0; +} + +APS5_VABI int CubicTo(const GuestVector* control1, const GuestVector* control2, const GuestVector* to, void* user) { + auto& walk = *static_cast(user); + if (OutsideX(*control1, walk.box) || OutsideX(*control2, walk.box)) + CubicCheck(walk.last.x, control1->x, control2->x, to->x, walk.box.xMin, walk.box.xMax); + if (OutsideY(*control1, walk.box) || OutsideY(*control2, walk.box)) + CubicCheck(walk.last.y, control1->y, control2->y, to->y, walk.box.yMin, walk.box.yMax); + walk.last = *to; + return 0; +} + +} + +extern "C" int APS5_VABI FT_Outline_Get_BBox_nid_postfix(GuestOutline* outline, GuestBBox* boundingBox) { + if (!boundingBox) return FT_Err_Invalid_Argument; + if (!outline) return FT_Err_Invalid_Outline; + if (outline->n_points == 0 || outline->n_contours == 0) { + *boundingBox = {}; + return 0; + } + if (!outline->points || !outline->tags) + throw std::invalid_argument("FT_Outline_Get_BBox: null point or tag array in a nonempty outline"); + GuestBBox control{Unset, Unset, -Unset, -Unset}; + GuestBBox on = control; + for (std::uint32_t index = 0; index < outline->n_points; ++index) { + Include(outline->points[index], control); + if ((outline->tags[index] & 3) == FT_CURVE_TAG_ON) Include(outline->points[index], on); + } + if (control.xMin < on.xMin || control.xMax > on.xMax || control.yMin < on.yMin || control.yMax > on.yMax) { + if (!outline->contours) Undefined("null contour array in a nonempty outline"); + Walk walk{{}, on}; + const GuestOutlineFuncs functions{MoveTo, LineTo, ConicTo, CubicTo, 0, 0}; + const int error = FT_Outline_Decompose_nid_postfix(outline, &functions, &walk); + if (error != 0) return error; + *boundingBox = walk.box; + } else { + *boundingBox = on; + } + return 0; } diff --git a/core/libs/prx/libSceFreeType/src/ModuleProperties.cpp b/core/libs/prx/libSceFreeType/src/ModuleProperties.cpp index 1932227852e9..525c1c1380cd 100644 --- a/core/libs/prx/libSceFreeType/src/ModuleProperties.cpp +++ b/core/libs/prx/libSceFreeType/src/ModuleProperties.cpp @@ -5,11 +5,31 @@ #include FT_MODULE_H #include FT_DRIVER_H +#include #include #include using namespace FreeType; +struct GuestGlyphToScriptMap { + GuestFaceRec* face; + std::uint16_t* map; +}; + +static int ReadGlyphToScriptMap(FT_Library library, const char* moduleName, const char* propertyName, void* output) { + GuestFaceRec* face = nullptr; + std::memcpy(&face, output, sizeof(face)); + const GuestFace* owner = FaceOf(face); + FT_Prop_GlyphToScriptMap property{owner ? owner->host : nullptr, nullptr}; + const int error = FT_Property_Get(library, moduleName, propertyName, &property); + if (!error) std::memcpy(static_cast(output) + offsetof(GuestGlyphToScriptMap, map), &property.map, sizeof(property.map)); + return error; +} + +static bool IsGlyphToScriptMap(const char* moduleName, const char* propertyName) { + return moduleName && propertyName && std::strcmp(moduleName, "autofitter") == 0 && std::strcmp(propertyName, "glyph-to-script-map") == 0; +} + static_assert(sizeof(FT_UInt) == sizeof(std::uint32_t)); static_assert(sizeof(FT_Int32) == sizeof(std::int32_t)); static_assert(sizeof(FT_Int) == sizeof(std::int32_t)); @@ -84,6 +104,8 @@ int WriteIncreaseXHeight(FT_Library library, const char* moduleName, const char* extern "C" int APS5_VABI FT_Property_Get_nid_postfix(GuestLibrary* library, const char* moduleName, const char* propertyName, void* value) { + if (library && library->host && value && IsGlyphToScriptMap(moduleName, propertyName)) + return ReadGlyphToScriptMap(library->host, moduleName, propertyName, value); const auto host = library ? library->host : nullptr; if (!host || !moduleName || !propertyName || !value) return FT_Property_Get(host, moduleName, propertyName, value); switch (TypeOf(moduleName, propertyName)) { @@ -98,6 +120,10 @@ extern "C" int APS5_VABI FT_Property_Get_nid_postfix(GuestLibrary* library, cons extern "C" int APS5_VABI FT_Property_Set_nid_postfix(GuestLibrary* library, const char* moduleName, const char* propertyName, const void* value) { + if (library && library->host && value && IsGlyphToScriptMap(moduleName, propertyName)) { + FT_Prop_GlyphToScriptMap property{}; + return FT_Property_Set(library->host, moduleName, propertyName, &property); + } const auto host = library ? library->host : nullptr; if (!host || !moduleName || !propertyName || !value) return FT_Property_Set(host, moduleName, propertyName, value); switch (TypeOf(moduleName, propertyName)) { diff --git a/core/libs/prx/libSceFreeType/src/OutlineDecompose.cpp b/core/libs/prx/libSceFreeType/src/OutlineDecompose.cpp index 2304dc5a9bb9..9305bac92364 100644 --- a/core/libs/prx/libSceFreeType/src/OutlineDecompose.cpp +++ b/core/libs/prx/libSceFreeType/src/OutlineDecompose.cpp @@ -56,6 +56,7 @@ extern "C" int APS5_VABI FT_Outline_Decompose_nid_postfix(GuestOutline* outline, const std::int32_t first = previousEnd + 1; const std::int32_t last = outline->contours[contour]; if (last < first) return FT_Err_Invalid_Outline; + if (last >= outline->n_points) throw std::invalid_argument("FT_Outline_Decompose: contour endpoint at or beyond n_points"); previousEnd = last; auto* points = outline->points; auto* tags = outline->tags; diff --git a/core/libs/prx/libSceFreeTypeOt/CMakeLists.txt b/core/libs/prx/libSceFreeTypeOt/CMakeLists.txt index 4d34176d1f9f..5fe4b841691a 100644 --- a/core/libs/prx/libSceFreeTypeOt/CMakeLists.txt +++ b/core/libs/prx/libSceFreeTypeOt/CMakeLists.txt @@ -18,3 +18,20 @@ if(BUILD_TESTING) "PATH=path_list_prepend:$") endif() endif() + +target_sources(libSceFreeTypeOt PRIVATE src/Memory.cpp) +if(BUILD_TESTING) + add_test_executable(guest_freetype_ot_memory_tests ${LIBS_INCLUDE_DIR}/tests/GuestFreeTypeOtMemory.cpp) + target_include_directories(guest_freetype_ot_memory_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_freetype_ot_memory_tests PRIVATE libSceFreeTypeOt) + if(WIN32) + target_link_libraries(guest_freetype_ot_memory_tests PRIVATE libc) + endif() + configure_windows_unwind(guest_freetype_ot_memory_tests) + add_test(NAME guest_freetype_ot_memory COMMAND guest_freetype_ot_memory_tests) + set_tests_properties(guest_freetype_ot_memory PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(guest_freetype_ot_memory PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceFreeTypeOt/Export.cpp b/core/libs/prx/libSceFreeTypeOt/Export.cpp index 8669bd9fe226..91243f68ee9f 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); } @@ -590,46 +602,6 @@ int APS5_VABI sceFreeTypeOtUnknown_AEU2tkjdZ2w_nid_no_patch() { } APS5_EXPORT("AEU2tkjdZ2w", sceFreeTypeOtUnknown_AEU2tkjdZ2w_nid_no_patch); -int APS5_VABI sceFreeTypeOtUnknown_fPrLu1YGOaw_nid_no_patch() { - NotImplemented_nid_no_patch(__func__); -} -APS5_EXPORT("fPrLu1YGOaw", sceFreeTypeOtUnknown_fPrLu1YGOaw_nid_no_patch); - -int APS5_VABI sceFreeTypeOtUnknown_t3vCgnT5YL0_nid_no_patch() { - NotImplemented_nid_no_patch(__func__); -} -APS5_EXPORT("t3vCgnT5YL0", sceFreeTypeOtUnknown_t3vCgnT5YL0_nid_no_patch); - -int APS5_VABI sceFreeTypeOtUnknown_8bkQ_YRnpOE_nid_no_patch() { - NotImplemented_nid_no_patch(__func__); -} -APS5_EXPORT("8bkQ+YRnpOE", sceFreeTypeOtUnknown_8bkQ_YRnpOE_nid_no_patch); - -int APS5_VABI sceFreeTypeOtUnknown_q4qhGebYuGI_nid_no_patch() { - NotImplemented_nid_no_patch(__func__); -} -APS5_EXPORT("q4qhGebYuGI", sceFreeTypeOtUnknown_q4qhGebYuGI_nid_no_patch); - -int APS5_VABI sceFreeTypeOtUnknown_ni_K_leoQNg_nid_no_patch() { - NotImplemented_nid_no_patch(__func__); -} -APS5_EXPORT("ni-K-leoQNg", sceFreeTypeOtUnknown_ni_K_leoQNg_nid_no_patch); - -int APS5_VABI sceFreeTypeOtUnknown_XfcgJB6V2a0_nid_no_patch() { - NotImplemented_nid_no_patch(__func__); -} -APS5_EXPORT("XfcgJB6V2a0", sceFreeTypeOtUnknown_XfcgJB6V2a0_nid_no_patch); - -int APS5_VABI sceFreeTypeOtUnknown_TWzf5iykiGw_nid_no_patch() { - NotImplemented_nid_no_patch(__func__); -} -APS5_EXPORT("TWzf5iykiGw", sceFreeTypeOtUnknown_TWzf5iykiGw_nid_no_patch); - -int APS5_VABI sceFreeTypeOtUnknown__b4iVKArt94_nid_no_patch() { - NotImplemented_nid_no_patch(__func__); -} -APS5_EXPORT("-b4iVKArt94", sceFreeTypeOtUnknown__b4iVKArt94_nid_no_patch); - int APS5_VABI sceFreeTypeOtUnknown_uSNqxrARpEQ_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } diff --git a/core/libs/prx/libSceFreeTypeOt/include/Calc.hpp b/core/libs/prx/libSceFreeTypeOt/include/Calc.hpp index c536e3fffc27..71e4a71e3963 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/libSceFreeTypeOt/include/Memory.hpp b/core/libs/prx/libSceFreeTypeOt/include/Memory.hpp new file mode 100644 index 000000000000..b0453f8844a1 --- /dev/null +++ b/core/libs/prx/libSceFreeTypeOt/include/Memory.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include "prx/libSceFreeType/include/GuestList.hpp" + +#include + +extern "C" { + +void* APS5_VABI ft_mem_alloc_nid_postfix(FreeType::GuestMemoryRec* memory, std::int64_t size, std::int32_t* error); +void* APS5_VABI ft_mem_qalloc_nid_postfix(FreeType::GuestMemoryRec* memory, std::int64_t size, std::int32_t* error); +void* APS5_VABI ft_mem_realloc_nid_postfix(FreeType::GuestMemoryRec* memory, std::int64_t itemSize, std::int64_t currentCount, std::int64_t newCount, void* block, std::int32_t* error); +void* APS5_VABI ft_mem_qrealloc_nid_postfix(FreeType::GuestMemoryRec* memory, std::int64_t itemSize, std::int64_t currentCount, std::int64_t newCount, void* block, std::int32_t* error); +void APS5_VABI ft_mem_free_nid_postfix(FreeType::GuestMemoryRec* memory, const void* block); +void* APS5_VABI ft_mem_dup_nid_postfix(FreeType::GuestMemoryRec* memory, const void* address, std::uint64_t size, std::int32_t* error); +void* APS5_VABI ft_mem_strdup_nid_postfix(FreeType::GuestMemoryRec* memory, const char* string, std::int32_t* error); +std::int32_t APS5_VABI ft_mem_strcpyn_nid_postfix(char* destination, const char* source, std::uint64_t size); + +} diff --git a/core/libs/prx/libSceFreeTypeOt/libSceFreeTypeOt.hpp b/core/libs/prx/libSceFreeTypeOt/libSceFreeTypeOt.hpp index 00e2da72778c..1155682fa15b 100644 --- a/core/libs/prx/libSceFreeTypeOt/libSceFreeTypeOt.hpp +++ b/core/libs/prx/libSceFreeTypeOt/libSceFreeTypeOt.hpp @@ -3,3 +3,4 @@ #include "prx/libSceFreeTypeOt/include/Stream.hpp" #include "prx/libSceFreeType/include/Api.hpp" #include "prx/libSceFreeTypeOt/include/Calc.hpp" +#include "prx/libSceFreeTypeOt/include/Memory.hpp" diff --git a/core/libs/prx/libSceFreeTypeOt/src/Memory.cpp b/core/libs/prx/libSceFreeTypeOt/src/Memory.cpp new file mode 100644 index 000000000000..95a271240951 --- /dev/null +++ b/core/libs/prx/libSceFreeTypeOt/src/Memory.cpp @@ -0,0 +1,104 @@ +#include "prx/libSceFreeTypeOt/include/Memory.hpp" + +#include +#include +#include + +namespace { + +constexpr std::int32_t InvalidArgument = 0x06; +constexpr std::int32_t ArrayTooLarge = 0x0A; +constexpr std::int32_t OutOfMemory = 0x40; +constexpr std::int64_t IntMax = 0x7FFFFFFF; + +std::int64_t Bytes(std::int64_t count, std::int64_t itemSize) { + return static_cast(static_cast(count) * static_cast(itemSize)); +} + +} + +extern "C" { + +void* APS5_VABI ft_mem_qalloc_nid_postfix(FreeType::GuestMemoryRec* memory, std::int64_t size, std::int32_t* error) { + std::int32_t result = 0; + void* block = nullptr; + if (size > 0) { + block = memory->alloc(memory, size); + if (!block) result = OutOfMemory; + } else if (size < 0) { + result = InvalidArgument; + } + *error = result; + return block; +} + +void* APS5_VABI ft_mem_alloc_nid_postfix(FreeType::GuestMemoryRec* memory, std::int64_t size, std::int32_t* error) { + std::int32_t result = 0; + void* block = ft_mem_qalloc_nid_postfix(memory, size, &result); + if (!result && block && size > 0) std::memset(block, 0, static_cast(size)); + *error = result; + return block; +} + +void APS5_VABI ft_mem_free_nid_postfix(FreeType::GuestMemoryRec* memory, const void* block) { + if (block) memory->free(memory, const_cast(block)); +} + +void* APS5_VABI ft_mem_qrealloc_nid_postfix(FreeType::GuestMemoryRec* memory, std::int64_t itemSize, std::int64_t currentCount, + std::int64_t newCount, void* block, std::int32_t* error) { + std::int32_t result = 0; + if (currentCount < 0 || newCount < 0 || itemSize < 0) { + result = InvalidArgument; + } else if (newCount == 0 || itemSize == 0) { + ft_mem_free_nid_postfix(memory, block); + block = nullptr; + } else if (newCount > IntMax / itemSize) { + result = ArrayTooLarge; + } else if (currentCount == 0) { + block = ft_mem_alloc_nid_postfix(memory, newCount * itemSize, &result); + } else { + void* resized = memory->realloc(memory, Bytes(currentCount, itemSize), newCount * itemSize, block); + if (resized) { + block = resized; + } else { + result = OutOfMemory; + } + } + *error = result; + return block; +} + +void* APS5_VABI ft_mem_realloc_nid_postfix(FreeType::GuestMemoryRec* memory, std::int64_t itemSize, std::int64_t currentCount, + std::int64_t newCount, void* block, std::int32_t* error) { + std::int32_t result = 0; + block = ft_mem_qrealloc_nid_postfix(memory, itemSize, currentCount, newCount, block, &result); + if (!result && block && newCount > currentCount) { + std::memset(static_cast(block) + currentCount * itemSize, 0, static_cast((newCount - currentCount) * itemSize)); + } + *error = result; + return block; +} + +void* APS5_VABI ft_mem_dup_nid_postfix(FreeType::GuestMemoryRec* memory, const void* address, std::uint64_t size, std::int32_t* error) { + std::int32_t result = 0; + void* copy = ft_mem_qalloc_nid_postfix(memory, static_cast(size), &result); + if (!result && address && size > 0) std::memcpy(copy, address, static_cast(size)); + *error = result; + return copy; +} + +void* APS5_VABI ft_mem_strdup_nid_postfix(FreeType::GuestMemoryRec* memory, const char* string, std::int32_t* error) { + const std::uint64_t length = string ? std::strlen(string) + 1 : 0; + return ft_mem_dup_nid_postfix(memory, string, length, error); +} + +std::int32_t APS5_VABI ft_mem_strcpyn_nid_postfix(char* destination, const char* source, std::uint64_t size) { + while (size > 1 && *source != 0) { + *destination++ = *source++; + --size; + } + *destination = 0; + return *source != 0; +} + +} diff --git a/core/libs/prx/libSceGLSlimVSH/CMakeLists.txt b/core/libs/prx/libSceGLSlimVSH/CMakeLists.txt new file mode 100644 index 000000000000..de516797aac3 --- /dev/null +++ b/core/libs/prx/libSceGLSlimVSH/CMakeLists.txt @@ -0,0 +1,3 @@ +add_library(libSceGLSlimVSH SHARED EXCLUDE_FROM_ALL Export.cpp) +target_include_directories(libSceGLSlimVSH PRIVATE ${LIBS_INCLUDE_DIR}) +configure_windows_unwind(libSceGLSlimVSH) diff --git a/core/libs/prx/libSceGLSlimVSH/Export.cpp b/core/libs/prx/libSceGLSlimVSH/Export.cpp index d81f4a5e32c4..2989577c609d 100644 --- a/core/libs/prx/libSceGLSlimVSH/Export.cpp +++ b/core/libs/prx/libSceGLSlimVSH/Export.cpp @@ -1,10 +1,1095 @@ +#include "prx/libSceGLSlimVSH/include/InventoryExports.hpp" #include #include #include "SceTypes.hpp" #include "prx/libc/include/General.hpp" +#include "prx/libSceGLSlimVSH/include/Api.hpp" extern "C" { -APS5_DUMMY_FUN +EGLBoolean APS5_VABI eglBindTexImage_nid_postfix(EGLDisplay dpy, EGLSurface surface, EGLint buffer) { + (void)dpy; + (void)surface; + (void)buffer; + NotImplemented_nid_no_patch(__func__); + return {}; +} + +EGLSurface APS5_VABI eglCreatePbufferFromClientBuffer_nid_postfix(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list) { + (void)dpy; + (void)buftype; + (void)buffer; + (void)config; + (void)attrib_list; + NotImplemented_nid_no_patch(__func__); + return {}; +} + +EGLSurface APS5_VABI eglCreatePbufferSurface_nid_postfix(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list) { + (void)dpy; + (void)config; + (void)attrib_list; + NotImplemented_nid_no_patch(__func__); + return {}; +} + +EGLBoolean APS5_VABI eglGetConfigAttrib_nid_postfix(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value) { + (void)dpy; + (void)config; + (void)attribute; + (void)value; + NotImplemented_nid_no_patch(__func__); + return {}; +} + +EGLBoolean APS5_VABI eglGetConfigs_nid_postfix(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config) { + (void)dpy; + (void)configs; + (void)config_size; + (void)num_config; + NotImplemented_nid_no_patch(__func__); + return {}; +} + +EGLContext APS5_VABI eglGetCurrentContext_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return {}; +} + +EGLDisplay APS5_VABI eglGetCurrentDisplay_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return {}; +} + +EGLSurface APS5_VABI eglGetCurrentSurface_nid_postfix(EGLint readdraw) { + (void)readdraw; + NotImplemented_nid_no_patch(__func__); + return {}; +} + +__eglMustCastToProperFunctionPointerType APS5_VABI eglGetProcAddress_nid_postfix(const char *procname) { + (void)procname; + NotImplemented_nid_no_patch(__func__); + return {}; +} + +EGLenum APS5_VABI eglQueryAPI_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return {}; +} + +EGLBoolean APS5_VABI eglQueryContext_nid_postfix(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value) { + (void)dpy; + (void)ctx; + (void)attribute; + (void)value; + NotImplemented_nid_no_patch(__func__); + return {}; +} + +const char * APS5_VABI eglQueryString_nid_postfix(EGLDisplay dpy, EGLint name) { + (void)dpy; + (void)name; + NotImplemented_nid_no_patch(__func__); + return {}; +} + +EGLBoolean APS5_VABI eglQuerySurface_nid_postfix(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value) { + (void)dpy; + (void)surface; + (void)attribute; + (void)value; + NotImplemented_nid_no_patch(__func__); + return {}; +} + +EGLBoolean APS5_VABI eglReleaseTexImage_nid_postfix(EGLDisplay dpy, EGLSurface surface, EGLint buffer) { + (void)dpy; + (void)surface; + (void)buffer; + NotImplemented_nid_no_patch(__func__); + return {}; +} + +EGLBoolean APS5_VABI eglReleaseThread_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return {}; +} + +EGLBoolean APS5_VABI eglSurfaceAttrib_nid_postfix(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value) { + (void)dpy; + (void)surface; + (void)attribute; + (void)value; + NotImplemented_nid_no_patch(__func__); + return {}; +} + +EGLBoolean APS5_VABI eglWaitClient_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return {}; +} + +EGLBoolean APS5_VABI eglWaitGL_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return {}; +} + +EGLBoolean APS5_VABI eglWaitNative_nid_postfix(EGLint engine) { + (void)engine; + NotImplemented_nid_no_patch(__func__); + return {}; +} + +void APS5_VABI glBindAttribLocation_nid_postfix(GLuint program, GLuint index, const GLchar *name) { + (void)program; + (void)index; + (void)name; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glBindBuffer_nid_postfix(GLenum target, GLuint buffer) { + (void)target; + (void)buffer; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glBindFramebuffer_nid_postfix(GLenum target, GLuint framebuffer) { + (void)target; + (void)framebuffer; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glBindRenderbuffer_nid_postfix(GLenum target, GLuint renderbuffer) { + (void)target; + (void)renderbuffer; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glBlendColor_nid_postfix(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { + (void)red; + (void)green; + (void)blue; + (void)alpha; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glBlendEquation_nid_postfix(GLenum mode) { + (void)mode; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glBlendEquationSeparate_nid_postfix(GLenum modeRGB, GLenum modeAlpha) { + (void)modeRGB; + (void)modeAlpha; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glBlendFuncSeparate_nid_postfix(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) { + (void)sfactorRGB; + (void)dfactorRGB; + (void)sfactorAlpha; + (void)dfactorAlpha; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glBufferData_nid_postfix(GLenum target, GLsizeiptr size, const void *data, GLenum usage) { + (void)target; + (void)size; + (void)data; + (void)usage; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glBufferSubData_nid_postfix(GLenum target, GLintptr offset, GLsizeiptr size, const void *data) { + (void)target; + (void)offset; + (void)size; + (void)data; + NotImplemented_nid_no_patch(__func__); +} + +GLenum APS5_VABI glCheckFramebufferStatus_nid_postfix(GLenum target) { + (void)target; + NotImplemented_nid_no_patch(__func__); + return {}; +} + +void APS5_VABI glClearDepthf_nid_postfix(GLfloat d) { + (void)d; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glClearStencil_nid_postfix(GLint s) { + (void)s; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glColorMask_nid_postfix(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) { + (void)red; + (void)green; + (void)blue; + (void)alpha; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glCompileShader_nid_postfix(GLuint shader) { + (void)shader; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glCompressedTexImage2D_nid_postfix(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data) { + (void)target; + (void)level; + (void)internalformat; + (void)width; + (void)height; + (void)border; + (void)imageSize; + (void)data; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glCompressedTexSubImage2D_nid_postfix(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data) { + (void)target; + (void)level; + (void)xoffset; + (void)yoffset; + (void)width; + (void)height; + (void)format; + (void)imageSize; + (void)data; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glCopyTexImage2D_nid_postfix(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) { + (void)target; + (void)level; + (void)internalformat; + (void)x; + (void)y; + (void)width; + (void)height; + (void)border; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glCopyTexSubImage2D_nid_postfix(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) { + (void)target; + (void)level; + (void)xoffset; + (void)yoffset; + (void)x; + (void)y; + (void)width; + (void)height; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glCullFace_nid_postfix(GLenum mode) { + (void)mode; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glDeleteBuffers_nid_postfix(GLsizei n, const GLuint *buffers) { + (void)n; + (void)buffers; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glDeleteFramebuffers_nid_postfix(GLsizei n, const GLuint *framebuffers) { + (void)n; + (void)framebuffers; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glDeleteRenderbuffers_nid_postfix(GLsizei n, const GLuint *renderbuffers) { + (void)n; + (void)renderbuffers; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glDepthFunc_nid_postfix(GLenum func) { + (void)func; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glDepthMask_nid_postfix(GLboolean flag) { + (void)flag; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glDepthRangef_nid_postfix(GLfloat n, GLfloat f) { + (void)n; + (void)f; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glDetachShader_nid_postfix(GLuint program, GLuint shader) { + (void)program; + (void)shader; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glDisable_nid_postfix(GLenum cap) { + (void)cap; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glDisableVertexAttribArray_nid_postfix(GLuint index) { + (void)index; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glDrawElements_nid_postfix(GLenum mode, GLsizei count, GLenum type, const void *indices) { + (void)mode; + (void)count; + (void)type; + (void)indices; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glFinish_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glFlush_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glFramebufferRenderbuffer_nid_postfix(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) { + (void)target; + (void)attachment; + (void)renderbuffertarget; + (void)renderbuffer; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glFramebufferTexture2D_nid_postfix(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { + (void)target; + (void)attachment; + (void)textarget; + (void)texture; + (void)level; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glFrontFace_nid_postfix(GLenum mode) { + (void)mode; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glGenBuffers_nid_postfix(GLsizei n, GLuint *buffers) { + (void)n; + (void)buffers; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glGenFramebuffers_nid_postfix(GLsizei n, GLuint *framebuffers) { + (void)n; + (void)framebuffers; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glGenRenderbuffers_nid_postfix(GLsizei n, GLuint *renderbuffers) { + (void)n; + (void)renderbuffers; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glGenerateMipmap_nid_postfix(GLenum target) { + (void)target; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glGetAttachedShaders_nid_postfix(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders) { + (void)program; + (void)maxCount; + (void)count; + (void)shaders; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glGetBooleanv_nid_postfix(GLenum pname, GLboolean *data) { + (void)pname; + (void)data; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glGetBufferParameteriv_nid_postfix(GLenum target, GLenum pname, GLint *params) { + (void)target; + (void)pname; + (void)params; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glGetFloatv_nid_postfix(GLenum pname, GLfloat *data) { + (void)pname; + (void)data; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glGetFramebufferAttachmentParameteriv_nid_postfix(GLenum target, GLenum attachment, GLenum pname, GLint *params) { + (void)target; + (void)attachment; + (void)pname; + (void)params; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glGetIntegerv_nid_postfix(GLenum pname, GLint *data) { + (void)pname; + (void)data; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glGetProgramInfoLog_nid_postfix(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog) { + (void)program; + (void)bufSize; + (void)length; + (void)infoLog; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glGetRenderbufferParameteriv_nid_postfix(GLenum target, GLenum pname, GLint *params) { + (void)target; + (void)pname; + (void)params; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glGetShaderInfoLog_nid_postfix(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog) { + (void)shader; + (void)bufSize; + (void)length; + (void)infoLog; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glGetShaderPrecisionFormat_nid_postfix(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision) { + (void)shadertype; + (void)precisiontype; + (void)range; + (void)precision; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glGetShaderiv_nid_postfix(GLuint shader, GLenum pname, GLint *params) { + (void)shader; + (void)pname; + (void)params; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glGetTexParameterfv_nid_postfix(GLenum target, GLenum pname, GLfloat *params) { + (void)target; + (void)pname; + (void)params; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glGetTexParameteriv_nid_postfix(GLenum target, GLenum pname, GLint *params) { + (void)target; + (void)pname; + (void)params; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glGetUniformfv_nid_postfix(GLuint program, GLint location, GLfloat *params) { + (void)program; + (void)location; + (void)params; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glGetUniformiv_nid_postfix(GLuint program, GLint location, GLint *params) { + (void)program; + (void)location; + (void)params; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glGetVertexAttribPointerv_nid_postfix(GLuint index, GLenum pname, void **pointer) { + (void)index; + (void)pname; + (void)pointer; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glGetVertexAttribfv_nid_postfix(GLuint index, GLenum pname, GLfloat *params) { + (void)index; + (void)pname; + (void)params; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glGetVertexAttribiv_nid_postfix(GLuint index, GLenum pname, GLint *params) { + (void)index; + (void)pname; + (void)params; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glHint_nid_postfix(GLenum target, GLenum mode) { + (void)target; + (void)mode; + NotImplemented_nid_no_patch(__func__); +} + +GLboolean APS5_VABI glIsBuffer_nid_postfix(GLuint buffer) { + (void)buffer; + NotImplemented_nid_no_patch(__func__); + return {}; +} + +GLboolean APS5_VABI glIsEnabled_nid_postfix(GLenum cap) { + (void)cap; + NotImplemented_nid_no_patch(__func__); + return {}; +} + +GLboolean APS5_VABI glIsFramebuffer_nid_postfix(GLuint framebuffer) { + (void)framebuffer; + NotImplemented_nid_no_patch(__func__); + return {}; +} + +GLboolean APS5_VABI glIsProgram_nid_postfix(GLuint program) { + (void)program; + NotImplemented_nid_no_patch(__func__); + return {}; +} + +GLboolean APS5_VABI glIsRenderbuffer_nid_postfix(GLuint renderbuffer) { + (void)renderbuffer; + NotImplemented_nid_no_patch(__func__); + return {}; +} + +GLboolean APS5_VABI glIsShader_nid_postfix(GLuint shader) { + (void)shader; + NotImplemented_nid_no_patch(__func__); + return {}; +} + +GLboolean APS5_VABI glIsTexture_nid_postfix(GLuint texture) { + (void)texture; + NotImplemented_nid_no_patch(__func__); + return {}; +} + +void APS5_VABI glLineWidth_nid_postfix(GLfloat width) { + (void)width; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glPolygonOffset_nid_postfix(GLfloat factor, GLfloat units) { + (void)factor; + (void)units; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glReadPixels_nid_postfix(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels) { + (void)x; + (void)y; + (void)width; + (void)height; + (void)format; + (void)type; + (void)pixels; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glReleaseShaderCompiler_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glRenderbufferStorage_nid_postfix(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) { + (void)target; + (void)internalformat; + (void)width; + (void)height; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glSampleCoverage_nid_postfix(GLfloat value, GLboolean invert) { + (void)value; + (void)invert; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glScissor_nid_postfix(GLint x, GLint y, GLsizei width, GLsizei height) { + (void)x; + (void)y; + (void)width; + (void)height; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glShaderSource_nid_postfix(GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length) { + (void)shader; + (void)count; + (void)string; + (void)length; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glStencilFunc_nid_postfix(GLenum func, GLint ref, GLuint mask) { + (void)func; + (void)ref; + (void)mask; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glStencilFuncSeparate_nid_postfix(GLenum face, GLenum func, GLint ref, GLuint mask) { + (void)face; + (void)func; + (void)ref; + (void)mask; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glStencilMask_nid_postfix(GLuint mask) { + (void)mask; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glStencilMaskSeparate_nid_postfix(GLenum face, GLuint mask) { + (void)face; + (void)mask; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glStencilOp_nid_postfix(GLenum fail, GLenum zfail, GLenum zpass) { + (void)fail; + (void)zfail; + (void)zpass; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glStencilOpSeparate_nid_postfix(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass) { + (void)face; + (void)sfail; + (void)dpfail; + (void)dppass; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glTexParameterf_nid_postfix(GLenum target, GLenum pname, GLfloat param) { + (void)target; + (void)pname; + (void)param; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glTexParameterfv_nid_postfix(GLenum target, GLenum pname, const GLfloat *params) { + (void)target; + (void)pname; + (void)params; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glTexParameteriv_nid_postfix(GLenum target, GLenum pname, const GLint *params) { + (void)target; + (void)pname; + (void)params; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glTexSubImage2D_nid_postfix(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) { + (void)target; + (void)level; + (void)xoffset; + (void)yoffset; + (void)width; + (void)height; + (void)format; + (void)type; + (void)pixels; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glUniform1fv_nid_postfix(GLint location, GLsizei count, const GLfloat *value) { + (void)location; + (void)count; + (void)value; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glUniform1iv_nid_postfix(GLint location, GLsizei count, const GLint *value) { + (void)location; + (void)count; + (void)value; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glUniform2f_nid_postfix(GLint location, GLfloat v0, GLfloat v1) { + (void)location; + (void)v0; + (void)v1; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glUniform2fv_nid_postfix(GLint location, GLsizei count, const GLfloat *value) { + (void)location; + (void)count; + (void)value; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glUniform2i_nid_postfix(GLint location, GLint v0, GLint v1) { + (void)location; + (void)v0; + (void)v1; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glUniform2iv_nid_postfix(GLint location, GLsizei count, const GLint *value) { + (void)location; + (void)count; + (void)value; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glUniform3f_nid_postfix(GLint location, GLfloat v0, GLfloat v1, GLfloat v2) { + (void)location; + (void)v0; + (void)v1; + (void)v2; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glUniform3fv_nid_postfix(GLint location, GLsizei count, const GLfloat *value) { + (void)location; + (void)count; + (void)value; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glUniform3i_nid_postfix(GLint location, GLint v0, GLint v1, GLint v2) { + (void)location; + (void)v0; + (void)v1; + (void)v2; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glUniform3iv_nid_postfix(GLint location, GLsizei count, const GLint *value) { + (void)location; + (void)count; + (void)value; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glUniform4f_nid_postfix(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) { + (void)location; + (void)v0; + (void)v1; + (void)v2; + (void)v3; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glUniform4fv_nid_postfix(GLint location, GLsizei count, const GLfloat *value) { + (void)location; + (void)count; + (void)value; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glUniform4i_nid_postfix(GLint location, GLint v0, GLint v1, GLint v2, GLint v3) { + (void)location; + (void)v0; + (void)v1; + (void)v2; + (void)v3; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glUniform4iv_nid_postfix(GLint location, GLsizei count, const GLint *value) { + (void)location; + (void)count; + (void)value; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glUniformMatrix2fv_nid_postfix(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + (void)location; + (void)count; + (void)transpose; + (void)value; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glUniformMatrix3fv_nid_postfix(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + (void)location; + (void)count; + (void)transpose; + (void)value; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glValidateProgram_nid_postfix(GLuint program) { + (void)program; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glVertexAttrib1f_nid_postfix(GLuint index, GLfloat x) { + (void)index; + (void)x; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glVertexAttrib1fv_nid_postfix(GLuint index, const GLfloat *v) { + (void)index; + (void)v; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glVertexAttrib2f_nid_postfix(GLuint index, GLfloat x, GLfloat y) { + (void)index; + (void)x; + (void)y; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glVertexAttrib2fv_nid_postfix(GLuint index, const GLfloat *v) { + (void)index; + (void)v; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glVertexAttrib3f_nid_postfix(GLuint index, GLfloat x, GLfloat y, GLfloat z) { + (void)index; + (void)x; + (void)y; + (void)z; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glVertexAttrib3fv_nid_postfix(GLuint index, const GLfloat *v) { + (void)index; + (void)v; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glVertexAttrib4f_nid_postfix(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { + (void)index; + (void)x; + (void)y; + (void)z; + (void)w; + NotImplemented_nid_no_patch(__func__); +} + +void APS5_VABI glVertexAttrib4fv_nid_postfix(GLuint index, const GLfloat *v) { + (void)index; + (void)v; + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceGLSlimVSHUnknown_iIsF4NzYgD4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("iIsF4NzYgD4", sceGLSlimVSHUnknown_iIsF4NzYgD4_nid_no_patch); + +int APS5_VABI sceGLSlimVSHUnknown_hA8TWZkwPRU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("hA8TWZkwPRU", sceGLSlimVSHUnknown_hA8TWZkwPRU_nid_no_patch); + +int APS5_VABI sceGLSlimVSHUnknown_LuP1plTAR7g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("LuP1plTAR7g", sceGLSlimVSHUnknown_LuP1plTAR7g_nid_no_patch); + +int APS5_VABI sceGLSlimVSHUnknown_J5IG3lL56FI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("J5IG3lL56FI", sceGLSlimVSHUnknown_J5IG3lL56FI_nid_no_patch); + +int APS5_VABI sceGLSlimVSHUnknown_oXkQEVitkCs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("oXkQEVitkCs", sceGLSlimVSHUnknown_oXkQEVitkCs_nid_no_patch); + +int APS5_VABI sceGLSlimVSHUnknown_sDotUt1uEhA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("sDotUt1uEhA", sceGLSlimVSHUnknown_sDotUt1uEhA_nid_no_patch); + +int APS5_VABI sceGLSlimVSHUnknown_3gtNzvkq_XY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("3gtNzvkq-XY", sceGLSlimVSHUnknown_3gtNzvkq_XY_nid_no_patch); + +int APS5_VABI sceGLSlimVSHUnknown_T__xooU3VvQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("T-+xooU3VvQ", sceGLSlimVSHUnknown_T__xooU3VvQ_nid_no_patch); + +int APS5_VABI sceGLSlimVSHUnknown_AcruVcmKz78_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("AcruVcmKz78", sceGLSlimVSHUnknown_AcruVcmKz78_nid_no_patch); + +int APS5_VABI sceGLSlimVSHUnknown_QvXbiLqpn6c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("QvXbiLqpn6c", sceGLSlimVSHUnknown_QvXbiLqpn6c_nid_no_patch); + +int APS5_VABI sceGLSlimVSHUnknown_mgKTS0PIvd8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("mgKTS0PIvd8", sceGLSlimVSHUnknown_mgKTS0PIvd8_nid_no_patch); + +int APS5_VABI sceGLSlimVSHUnknown_RP5cXUjm48U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("RP5cXUjm48U", sceGLSlimVSHUnknown_RP5cXUjm48U_nid_no_patch); + +int APS5_VABI sceGLSlimVSHUnknown_srJHx3p48v0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("srJHx3p48v0", sceGLSlimVSHUnknown_srJHx3p48v0_nid_no_patch); + +int APS5_VABI sceGLSlimVSHUnknown_6ZQXcSKKjyo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("6ZQXcSKKjyo", sceGLSlimVSHUnknown_6ZQXcSKKjyo_nid_no_patch); + +int APS5_VABI sceGLSlimVSHUnknown_wdRBDMIxI7I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("wdRBDMIxI7I", sceGLSlimVSHUnknown_wdRBDMIxI7I_nid_no_patch); + +int APS5_VABI sceGLSlimVSHUnknown_CzmA_OALrH8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("CzmA-OALrH8", sceGLSlimVSHUnknown_CzmA_OALrH8_nid_no_patch); + +int APS5_VABI sceGLSlimVSHUnknown_aRqvgeH_oe0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("aRqvgeH+oe0", sceGLSlimVSHUnknown_aRqvgeH_oe0_nid_no_patch); + +int APS5_VABI sceGLSlimVSHUnknown_gI_XEd5mWPU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("gI+XEd5mWPU", sceGLSlimVSHUnknown_gI_XEd5mWPU_nid_no_patch); + +int APS5_VABI sceGLSlimVSHUnknown_1TFdFqQBGqY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("1TFdFqQBGqY", sceGLSlimVSHUnknown_1TFdFqQBGqY_nid_no_patch); + +int APS5_VABI sceGLSlimVSHUnknown_7Mp6qE235Qc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("7Mp6qE235Qc", sceGLSlimVSHUnknown_7Mp6qE235Qc_nid_no_patch); + +int APS5_VABI sceGLSlimVSHUnknown_BrNgn7z6A40_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("BrNgn7z6A40", sceGLSlimVSHUnknown_BrNgn7z6A40_nid_no_patch); + +int APS5_VABI sceGLSlimVSHUnknown_iyTnezpw1jE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +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/Api.hpp b/core/libs/prx/libSceGLSlimVSH/include/Api.hpp new file mode 100644 index 000000000000..9559fb141a25 --- /dev/null +++ b/core/libs/prx/libSceGLSlimVSH/include/Api.hpp @@ -0,0 +1,156 @@ +#pragma once + +#include +#include +#include "SceTypes.hpp" + +using EGLBoolean = unsigned int; +using EGLenum = unsigned int; +using EGLint = std::int32_t; +using EGLDisplay = void*; +using EGLSurface = void*; +using EGLContext = void*; +using EGLConfig = void*; +using EGLClientBuffer = void*; +using __eglMustCastToProperFunctionPointerType = void (*)(void); +using GLenum = unsigned int; +using GLboolean = unsigned char; +using GLchar = char; +using GLfloat = float; +using GLint = std::int32_t; +using GLuint = std::uint32_t; +using GLsizei = std::int32_t; +using GLintptr = std::intptr_t; +using GLsizeiptr = std::ptrdiff_t; + +extern "C" { + +EGLBoolean APS5_VABI eglBindTexImage_nid_postfix(EGLDisplay dpy, EGLSurface surface, EGLint buffer); +EGLSurface APS5_VABI eglCreatePbufferFromClientBuffer_nid_postfix(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list); +EGLSurface APS5_VABI eglCreatePbufferSurface_nid_postfix(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list); +EGLBoolean APS5_VABI eglGetConfigAttrib_nid_postfix(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value); +EGLBoolean APS5_VABI eglGetConfigs_nid_postfix(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config); +EGLContext APS5_VABI eglGetCurrentContext_nid_postfix(void); +EGLDisplay APS5_VABI eglGetCurrentDisplay_nid_postfix(void); +EGLSurface APS5_VABI eglGetCurrentSurface_nid_postfix(EGLint readdraw); +__eglMustCastToProperFunctionPointerType APS5_VABI eglGetProcAddress_nid_postfix(const char *procname); +EGLenum APS5_VABI eglQueryAPI_nid_postfix(void); +EGLBoolean APS5_VABI eglQueryContext_nid_postfix(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value); +const char * APS5_VABI eglQueryString_nid_postfix(EGLDisplay dpy, EGLint name); +EGLBoolean APS5_VABI eglQuerySurface_nid_postfix(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value); +EGLBoolean APS5_VABI eglReleaseTexImage_nid_postfix(EGLDisplay dpy, EGLSurface surface, EGLint buffer); +EGLBoolean APS5_VABI eglReleaseThread_nid_postfix(void); +EGLBoolean APS5_VABI eglSurfaceAttrib_nid_postfix(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value); +EGLBoolean APS5_VABI eglWaitClient_nid_postfix(void); +EGLBoolean APS5_VABI eglWaitGL_nid_postfix(void); +EGLBoolean APS5_VABI eglWaitNative_nid_postfix(EGLint engine); +void APS5_VABI glBindAttribLocation_nid_postfix(GLuint program, GLuint index, const GLchar *name); +void APS5_VABI glBindBuffer_nid_postfix(GLenum target, GLuint buffer); +void APS5_VABI glBindFramebuffer_nid_postfix(GLenum target, GLuint framebuffer); +void APS5_VABI glBindRenderbuffer_nid_postfix(GLenum target, GLuint renderbuffer); +void APS5_VABI glBlendColor_nid_postfix(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +void APS5_VABI glBlendEquation_nid_postfix(GLenum mode); +void APS5_VABI glBlendEquationSeparate_nid_postfix(GLenum modeRGB, GLenum modeAlpha); +void APS5_VABI glBlendFuncSeparate_nid_postfix(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +void APS5_VABI glBufferData_nid_postfix(GLenum target, GLsizeiptr size, const void *data, GLenum usage); +void APS5_VABI glBufferSubData_nid_postfix(GLenum target, GLintptr offset, GLsizeiptr size, const void *data); +GLenum APS5_VABI glCheckFramebufferStatus_nid_postfix(GLenum target); +void APS5_VABI glClearDepthf_nid_postfix(GLfloat d); +void APS5_VABI glClearStencil_nid_postfix(GLint s); +void APS5_VABI glColorMask_nid_postfix(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +void APS5_VABI glCompileShader_nid_postfix(GLuint shader); +void APS5_VABI glCompressedTexImage2D_nid_postfix(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +void APS5_VABI glCompressedTexSubImage2D_nid_postfix(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +void APS5_VABI glCopyTexImage2D_nid_postfix(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +void APS5_VABI glCopyTexSubImage2D_nid_postfix(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +void APS5_VABI glCullFace_nid_postfix(GLenum mode); +void APS5_VABI glDeleteBuffers_nid_postfix(GLsizei n, const GLuint *buffers); +void APS5_VABI glDeleteFramebuffers_nid_postfix(GLsizei n, const GLuint *framebuffers); +void APS5_VABI glDeleteRenderbuffers_nid_postfix(GLsizei n, const GLuint *renderbuffers); +void APS5_VABI glDepthFunc_nid_postfix(GLenum func); +void APS5_VABI glDepthMask_nid_postfix(GLboolean flag); +void APS5_VABI glDepthRangef_nid_postfix(GLfloat n, GLfloat f); +void APS5_VABI glDetachShader_nid_postfix(GLuint program, GLuint shader); +void APS5_VABI glDisable_nid_postfix(GLenum cap); +void APS5_VABI glDisableVertexAttribArray_nid_postfix(GLuint index); +void APS5_VABI glDrawElements_nid_postfix(GLenum mode, GLsizei count, GLenum type, const void *indices); +void APS5_VABI glFinish_nid_postfix(void); +void APS5_VABI glFlush_nid_postfix(void); +void APS5_VABI glFramebufferRenderbuffer_nid_postfix(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +void APS5_VABI glFramebufferTexture2D_nid_postfix(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +void APS5_VABI glFrontFace_nid_postfix(GLenum mode); +void APS5_VABI glGenBuffers_nid_postfix(GLsizei n, GLuint *buffers); +void APS5_VABI glGenFramebuffers_nid_postfix(GLsizei n, GLuint *framebuffers); +void APS5_VABI glGenRenderbuffers_nid_postfix(GLsizei n, GLuint *renderbuffers); +void APS5_VABI glGenerateMipmap_nid_postfix(GLenum target); +void APS5_VABI glGetAttachedShaders_nid_postfix(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); +void APS5_VABI glGetBooleanv_nid_postfix(GLenum pname, GLboolean *data); +void APS5_VABI glGetBufferParameteriv_nid_postfix(GLenum target, GLenum pname, GLint *params); +void APS5_VABI glGetFloatv_nid_postfix(GLenum pname, GLfloat *data); +void APS5_VABI glGetFramebufferAttachmentParameteriv_nid_postfix(GLenum target, GLenum attachment, GLenum pname, GLint *params); +void APS5_VABI glGetIntegerv_nid_postfix(GLenum pname, GLint *data); +void APS5_VABI glGetProgramInfoLog_nid_postfix(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +void APS5_VABI glGetRenderbufferParameteriv_nid_postfix(GLenum target, GLenum pname, GLint *params); +void APS5_VABI glGetShaderInfoLog_nid_postfix(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +void APS5_VABI glGetShaderPrecisionFormat_nid_postfix(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); +void APS5_VABI glGetShaderiv_nid_postfix(GLuint shader, GLenum pname, GLint *params); +void APS5_VABI glGetTexParameterfv_nid_postfix(GLenum target, GLenum pname, GLfloat *params); +void APS5_VABI glGetTexParameteriv_nid_postfix(GLenum target, GLenum pname, GLint *params); +void APS5_VABI glGetUniformfv_nid_postfix(GLuint program, GLint location, GLfloat *params); +void APS5_VABI glGetUniformiv_nid_postfix(GLuint program, GLint location, GLint *params); +void APS5_VABI glGetVertexAttribPointerv_nid_postfix(GLuint index, GLenum pname, void **pointer); +void APS5_VABI glGetVertexAttribfv_nid_postfix(GLuint index, GLenum pname, GLfloat *params); +void APS5_VABI glGetVertexAttribiv_nid_postfix(GLuint index, GLenum pname, GLint *params); +void APS5_VABI glHint_nid_postfix(GLenum target, GLenum mode); +GLboolean APS5_VABI glIsBuffer_nid_postfix(GLuint buffer); +GLboolean APS5_VABI glIsEnabled_nid_postfix(GLenum cap); +GLboolean APS5_VABI glIsFramebuffer_nid_postfix(GLuint framebuffer); +GLboolean APS5_VABI glIsProgram_nid_postfix(GLuint program); +GLboolean APS5_VABI glIsRenderbuffer_nid_postfix(GLuint renderbuffer); +GLboolean APS5_VABI glIsShader_nid_postfix(GLuint shader); +GLboolean APS5_VABI glIsTexture_nid_postfix(GLuint texture); +void APS5_VABI glLineWidth_nid_postfix(GLfloat width); +void APS5_VABI glPolygonOffset_nid_postfix(GLfloat factor, GLfloat units); +void APS5_VABI glReadPixels_nid_postfix(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); +void APS5_VABI glReleaseShaderCompiler_nid_postfix(void); +void APS5_VABI glRenderbufferStorage_nid_postfix(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +void APS5_VABI glSampleCoverage_nid_postfix(GLfloat value, GLboolean invert); +void APS5_VABI glScissor_nid_postfix(GLint x, GLint y, GLsizei width, GLsizei height); +void APS5_VABI glShaderSource_nid_postfix(GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); +void APS5_VABI glStencilFunc_nid_postfix(GLenum func, GLint ref, GLuint mask); +void APS5_VABI glStencilFuncSeparate_nid_postfix(GLenum face, GLenum func, GLint ref, GLuint mask); +void APS5_VABI glStencilMask_nid_postfix(GLuint mask); +void APS5_VABI glStencilMaskSeparate_nid_postfix(GLenum face, GLuint mask); +void APS5_VABI glStencilOp_nid_postfix(GLenum fail, GLenum zfail, GLenum zpass); +void APS5_VABI glStencilOpSeparate_nid_postfix(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +void APS5_VABI glTexParameterf_nid_postfix(GLenum target, GLenum pname, GLfloat param); +void APS5_VABI glTexParameterfv_nid_postfix(GLenum target, GLenum pname, const GLfloat *params); +void APS5_VABI glTexParameteriv_nid_postfix(GLenum target, GLenum pname, const GLint *params); +void APS5_VABI glTexSubImage2D_nid_postfix(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +void APS5_VABI glUniform1fv_nid_postfix(GLint location, GLsizei count, const GLfloat *value); +void APS5_VABI glUniform1iv_nid_postfix(GLint location, GLsizei count, const GLint *value); +void APS5_VABI glUniform2f_nid_postfix(GLint location, GLfloat v0, GLfloat v1); +void APS5_VABI glUniform2fv_nid_postfix(GLint location, GLsizei count, const GLfloat *value); +void APS5_VABI glUniform2i_nid_postfix(GLint location, GLint v0, GLint v1); +void APS5_VABI glUniform2iv_nid_postfix(GLint location, GLsizei count, const GLint *value); +void APS5_VABI glUniform3f_nid_postfix(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +void APS5_VABI glUniform3fv_nid_postfix(GLint location, GLsizei count, const GLfloat *value); +void APS5_VABI glUniform3i_nid_postfix(GLint location, GLint v0, GLint v1, GLint v2); +void APS5_VABI glUniform3iv_nid_postfix(GLint location, GLsizei count, const GLint *value); +void APS5_VABI glUniform4f_nid_postfix(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +void APS5_VABI glUniform4fv_nid_postfix(GLint location, GLsizei count, const GLfloat *value); +void APS5_VABI glUniform4i_nid_postfix(GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +void APS5_VABI glUniform4iv_nid_postfix(GLint location, GLsizei count, const GLint *value); +void APS5_VABI glUniformMatrix2fv_nid_postfix(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +void APS5_VABI glUniformMatrix3fv_nid_postfix(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +void APS5_VABI glValidateProgram_nid_postfix(GLuint program); +void APS5_VABI glVertexAttrib1f_nid_postfix(GLuint index, GLfloat x); +void APS5_VABI glVertexAttrib1fv_nid_postfix(GLuint index, const GLfloat *v); +void APS5_VABI glVertexAttrib2f_nid_postfix(GLuint index, GLfloat x, GLfloat y); +void APS5_VABI glVertexAttrib2fv_nid_postfix(GLuint index, const GLfloat *v); +void APS5_VABI glVertexAttrib3f_nid_postfix(GLuint index, GLfloat x, GLfloat y, GLfloat z); +void APS5_VABI glVertexAttrib3fv_nid_postfix(GLuint index, const GLfloat *v); +void APS5_VABI glVertexAttrib4f_nid_postfix(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +void APS5_VABI glVertexAttrib4fv_nid_postfix(GLuint index, const GLfloat *v); + +} diff --git a/core/libs/prx/libSceGLSlimVSH/include/InventoryExports.hpp b/core/libs/prx/libSceGLSlimVSH/include/InventoryExports.hpp new file mode 100644 index 000000000000..596047ecd85c --- /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 6f70f09beec2..2dac489e1fba 100644 --- a/core/libs/prx/libSceGLSlimVSH/libSceGLSlimVSH.hpp +++ b/core/libs/prx/libSceGLSlimVSH/libSceGLSlimVSH.hpp @@ -1 +1,4 @@ #pragma once + +#include "prx/libSceGLSlimVSH/include/Api.hpp" +#include "prx/libSceGLSlimVSH/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceGameLiveStreaming/Export.cpp b/core/libs/prx/libSceGameLiveStreaming/Export.cpp index ec6278d1e3bb..764069065ac0 100644 --- a/core/libs/prx/libSceGameLiveStreaming/Export.cpp +++ b/core/libs/prx/libSceGameLiveStreaming/Export.cpp @@ -78,8 +78,9 @@ int APS5_VABI sceGameLiveStreamingScreenInitialize(void) { return 0; } -int APS5_VABI sceGameLiveStreamingScreenInitializeSeparateModeParameter(void) { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI sceGameLiveStreamingScreenInitializeSeparateModeParameter(void* parameter) { + if (parameter == nullptr) return ErrorInvalidArgument; + std::memset(parameter, 0, 0x44); return 0; } diff --git a/core/libs/prx/libSceGameLiveStreaming/include/Api.hpp b/core/libs/prx/libSceGameLiveStreaming/include/Api.hpp index 9f69bbc0fcd8..bf1983254597 100644 --- a/core/libs/prx/libSceGameLiveStreaming/include/Api.hpp +++ b/core/libs/prx/libSceGameLiveStreaming/include/Api.hpp @@ -57,7 +57,7 @@ int APS5_VABI sceGameLiveStreamingTerminate(void); int APS5_VABI sceGameLiveStreamingGetCurrentStatus2(GameLiveStreamingStatus2* status); int APS5_VABI sceGameLiveStreamingGetProgramInfo(GameLiveStreamingProgramInfo* info); int APS5_VABI sceGameLiveStreamingScreenInitialize(void); -int APS5_VABI sceGameLiveStreamingScreenInitializeSeparateModeParameter(void); +int APS5_VABI sceGameLiveStreamingScreenInitializeSeparateModeParameter(void* parameter); int APS5_VABI sceGameLiveStreamingScreenTerminate(void); int APS5_VABI sceGameLiveStreamingScreenCloseSeparateMode(void); int APS5_VABI sceGameLiveStreamingScreenConfigureSeparateMode(void); diff --git a/core/libs/prx/libSceGameUpdate/Export.cpp b/core/libs/prx/libSceGameUpdate/Export.cpp index 0e3ef3835ea4..7c61d2507de6 100644 --- a/core/libs/prx/libSceGameUpdate/Export.cpp +++ b/core/libs/prx/libSceGameUpdate/Export.cpp @@ -176,4 +176,8 @@ int APS5_VABI sceGameUpdateTerminate(void) { return 0; } +int APS5_VABI sceGameUpdateCheckTitle() { + NotImplemented_nid_no_patch(__func__); +} + } diff --git a/core/libs/prx/libSceGameUpdate/include/Api.hpp b/core/libs/prx/libSceGameUpdate/include/Api.hpp index 2de12ef94160..f7d282e6659c 100644 --- a/core/libs/prx/libSceGameUpdate/include/Api.hpp +++ b/core/libs/prx/libSceGameUpdate/include/Api.hpp @@ -11,5 +11,6 @@ int APS5_VABI sceGameUpdateDeleteRequest(int requestId); int APS5_VABI sceGameUpdateGetAddcontLatestVersion(uint32_t serviceLabel, const NpUnifiedEntitlementLabel* entitlementLabel, GameUpdateAddcontVersionInfo* info); int APS5_VABI sceGameUpdateInitialize(void); int APS5_VABI sceGameUpdateTerminate(void); +int APS5_VABI sceGameUpdateCheckTitle(); } diff --git a/core/libs/prx/libSceGifParser/Export.cpp b/core/libs/prx/libSceGifParser/Export.cpp index d81f4a5e32c4..309220de2a93 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 000000000000..215be09ff6a6 --- /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 6f70f09beec2..95a60745d01a 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 d3f9dffc0e19..bc1b64b7b7b7 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 000000000000..f23c96155482 --- /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 ebeb3b8baddf..0cb944e98929 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 4d1c7ba5b3d8..d9386d44dd73 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 000000000000..429132d631a4 --- /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 000000000000..27a49b0aae22 --- /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 c639941f8dd3..4241b94e8538 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/libSceHmd/Export.cpp b/core/libs/prx/libSceHmd/Export.cpp index c859361ee45d..e2a3f61d72de 100644 --- a/core/libs/prx/libSceHmd/Export.cpp +++ b/core/libs/prx/libSceHmd/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceHmd/include/InventoryExports.hpp" #include "prx/libSceHmd/include/Api.hpp" #include "Hmd.hpp" #include "prx/libc/include/ApplicationHeap.hpp" @@ -919,3 +921,102 @@ int APS5_VABI sceHmdGet2dVrCommand(std::int32_t handle, const Hmd2dVrCommandPara } } + +extern "C" { + +int APS5_VABI libSceHmdUnknown__minus_Bk71lPyry4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-Bk71lPyry4", libSceHmdUnknown__minus_Bk71lPyry4_nid_no_patch); + +int APS5_VABI libSceHmdUnknown__minus_y4OUwFf4jE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-y4OUwFf4jE", libSceHmdUnknown__minus_y4OUwFf4jE_nid_no_patch); + +int APS5_VABI libSceHmdUnknown_IC0NGmh_minus_zS8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IC0NGmh-zS8", libSceHmdUnknown_IC0NGmh_minus_zS8_nid_no_patch); + +int APS5_VABI libSceHmdUnknown_NY2_minus_gYo9ihI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NY2-gYo9ihI", libSceHmdUnknown_NY2_minus_gYo9ihI_nid_no_patch); + +int APS5_VABI libSceHmdUnknown_XMutp2_minus_o9A4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XMutp2-o9A4", libSceHmdUnknown_XMutp2_minus_o9A4_nid_no_patch); + +int APS5_VABI libSceHmdUnknown_Y9QDFn3AjPA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Y9QDFn3AjPA", libSceHmdUnknown_Y9QDFn3AjPA_nid_no_patch); + +int APS5_VABI libSceHmdUnknown_aTg7K0466r8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aTg7K0466r8", libSceHmdUnknown_aTg7K0466r8_nid_no_patch); + +int APS5_VABI libSceHmdUnknown_eRVgwy9PbWg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eRVgwy9PbWg", libSceHmdUnknown_eRVgwy9PbWg_nid_no_patch); + +int APS5_VABI libSceHmdUnknown_mVIneDkja6c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mVIneDkja6c", libSceHmdUnknown_mVIneDkja6c_nid_no_patch); + +int APS5_VABI libSceHmdUnknown_miduc55U7q8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("miduc55U7q8", libSceHmdUnknown_miduc55U7q8_nid_no_patch); + +int APS5_VABI libSceHmdUnknown_nlAZlOKJy_plus_c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nlAZlOKJy+c", libSceHmdUnknown_nlAZlOKJy_plus_c_nid_no_patch); + +int APS5_VABI libSceHmdUnknown_ox9NqLO9LhI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ox9NqLO9LhI", libSceHmdUnknown_ox9NqLO9LhI_nid_no_patch); + +int APS5_VABI libSceHmdUnknown_oxoDINgOrZk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oxoDINgOrZk", libSceHmdUnknown_oxoDINgOrZk_nid_no_patch); + +int APS5_VABI libSceHmdUnknown_qS18I6w2SZM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qS18I6w2SZM", libSceHmdUnknown_qS18I6w2SZM_nid_no_patch); + +int APS5_VABI libSceHmdUnknown_rczCXLh2_minus_b4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rczCXLh2-b4", libSceHmdUnknown_rczCXLh2_minus_b4_nid_no_patch); + +int APS5_VABI libSceHmdUnknown_sWZSZB_minus_mnw4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sWZSZB-mnw4", libSceHmdUnknown_sWZSZB_minus_mnw4_nid_no_patch); + +int APS5_VABI libSceHmdUnknown_smQw6nT8PcA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("smQw6nT8PcA", libSceHmdUnknown_smQw6nT8PcA_nid_no_patch); + +int APS5_VABI libSceHmdUnknown_thTykLZ_minus_tZs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("thTykLZ-tZs", libSceHmdUnknown_thTykLZ_minus_tZs_nid_no_patch); + +int APS5_VABI libSceHmdUnknown_uab6BzXsfkk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uab6BzXsfkk", libSceHmdUnknown_uab6BzXsfkk_nid_no_patch); + +} diff --git a/core/libs/prx/libSceHmd/include/InventoryExports.hpp b/core/libs/prx/libSceHmd/include/InventoryExports.hpp new file mode 100644 index 000000000000..f40521d8d22a --- /dev/null +++ b/core/libs/prx/libSceHmd/include/InventoryExports.hpp @@ -0,0 +1,27 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceHmdUnknown__minus_Bk71lPyry4_nid_no_patch(); +int APS5_VABI libSceHmdUnknown__minus_y4OUwFf4jE_nid_no_patch(); +int APS5_VABI libSceHmdUnknown_IC0NGmh_minus_zS8_nid_no_patch(); +int APS5_VABI libSceHmdUnknown_NY2_minus_gYo9ihI_nid_no_patch(); +int APS5_VABI libSceHmdUnknown_XMutp2_minus_o9A4_nid_no_patch(); +int APS5_VABI libSceHmdUnknown_Y9QDFn3AjPA_nid_no_patch(); +int APS5_VABI libSceHmdUnknown_aTg7K0466r8_nid_no_patch(); +int APS5_VABI libSceHmdUnknown_eRVgwy9PbWg_nid_no_patch(); +int APS5_VABI libSceHmdUnknown_mVIneDkja6c_nid_no_patch(); +int APS5_VABI libSceHmdUnknown_miduc55U7q8_nid_no_patch(); +int APS5_VABI libSceHmdUnknown_nlAZlOKJy_plus_c_nid_no_patch(); +int APS5_VABI libSceHmdUnknown_ox9NqLO9LhI_nid_no_patch(); +int APS5_VABI libSceHmdUnknown_oxoDINgOrZk_nid_no_patch(); +int APS5_VABI libSceHmdUnknown_qS18I6w2SZM_nid_no_patch(); +int APS5_VABI libSceHmdUnknown_rczCXLh2_minus_b4_nid_no_patch(); +int APS5_VABI libSceHmdUnknown_sWZSZB_minus_mnw4_nid_no_patch(); +int APS5_VABI libSceHmdUnknown_smQw6nT8PcA_nid_no_patch(); +int APS5_VABI libSceHmdUnknown_thTykLZ_minus_tZs_nid_no_patch(); +int APS5_VABI libSceHmdUnknown_uab6BzXsfkk_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceHmd/libSceHmd.hpp b/core/libs/prx/libSceHmd/libSceHmd.hpp index fb3f263602e3..68ab5c0e8e31 100644 --- a/core/libs/prx/libSceHmd/libSceHmd.hpp +++ b/core/libs/prx/libSceHmd/libSceHmd.hpp @@ -2,3 +2,4 @@ #include "prx/libSceHmd/Hmd.hpp" #include "prx/libSceHmd/include/Api.hpp" +#include "prx/libSceHmd/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceHmd2/CMakeLists.txt b/core/libs/prx/libSceHmd2/CMakeLists.txt index 6d7565ac4acb..ee0e0ffd8cb4 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 fff32538f4b0..ffaa366f137d 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 000000000000..175663fe98d8 --- /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 000000000000..f6998fa1ead9 --- /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 0c3f869cc76b..fec259ad7a3f 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 fd767bc0f888..45e3b0708165 100644 --- a/core/libs/prx/libSceHttp2/CMakeLists.txt +++ b/core/libs/prx/libSceHttp2/CMakeLists.txt @@ -9,16 +9,26 @@ function(configure_http2_backend) add_subdirectory(${CMAKE_SOURCE_DIR}/3rdparty/nghttp2 ${CMAKE_BINARY_DIR}/3rdparty/nghttp2 EXCLUDE_FROM_ALL) endfunction() configure_http2_backend() +foreach(property LINK_LIBRARIES INTERFACE_LINK_LIBRARIES) + get_target_property(libraries nghttp2_static ${property}) + if(libraries) + list(REMOVE_ITEM libraries windows_seh_personalities) + set_property(TARGET nghttp2_static PROPERTY ${property} "${libraries}") + endif() +endforeach() set_target_properties(nghttp2_static PROPERTIES POSITION_INDEPENDENT_CODE ON C_VISIBILITY_PRESET hidden) if(MINGW OR CMAKE_SYSTEM_NAME STREQUAL "Linux") target_link_options(nghttp2_static INTERFACE LINKER:--exclude-libs,libnghttp2.a) 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 4b9956e544ca..da8ca45a89c7 100644 --- a/core/libs/prx/libSceHttp2/Export.cpp +++ b/core/libs/prx/libSceHttp2/Export.cpp @@ -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) { @@ -382,8 +382,15 @@ int APS5_VABI sceHttp2SetRequestNoContentLength(int id) { return Update(id, __func__, [&](auto& settings) { settings.noContentLength = true; }); } +extern "C" void Http2SetLookupHook_nid_no_patch(Http2::LookupHook hook) { + Http2::LookupHookSlot().store(hook, std::memory_order_release); +} + int APS5_VABI sceHttp2SetResolveRetry(int id, int32_t retry) { - return Update(id, __func__, [&](auto&) { if (retry != 0) NotImplemented_nid_no_patch("sceHttp2SetResolveRetry"); }); + return Update(id, __func__, [&](auto& settings) { + if (retry < 0) NotImplemented_nid_no_patch("sceHttp2SetResolveRetry"); + settings.resolveRetry = retry; + }); } int APS5_VABI sceHttp2WebSocketCreateRequest(std::int32_t templateId, const char* url, Http2WebSocketTextCallback textCallback, Http2WebSocketDataCallback dataCallback, Http2WebSocketCloseCallback closeCallback, Http2WebSocketErrorCallback errorCallback, void* receiveBuffer, std::size_t receiveBufferSize, void* userData, const void* option) { @@ -491,4 +498,10 @@ int APS5_VABI sceHttp2SetPreSendCallback(int id, void* cb_func, void* user_arg) }, true); } +int APS5_VABI sceHttp2Unknown_001_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("AS45QoYHjc4", sceHttp2Unknown_001_nid_no_patch); + } diff --git a/core/libs/prx/libSceHttp2/Transport.cpp b/core/libs/prx/libSceHttp2/Transport.cpp index a8a9ac6b71e9..60ba971b062d 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); @@ -163,6 +166,7 @@ class Resolver { hints.ai_family = AF_UNSPEC; addrinfo* raw = nullptr; const auto service = std::to_string(job->port); + if (const auto hook = LookupHookSlot().load(std::memory_order_acquire)) Require(hook(job->host.c_str()) == 0, "sceHttp2: DNS failed; console error mapping is unknown"); const int result = getaddrinfo(job->host.c_str(), service.c_str(), &hints, &raw); std::unique_ptr addresses(raw, freeaddrinfo); Require(result == 0, "sceHttp2: DNS failed; console error mapping is unknown"); @@ -253,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; @@ -317,22 +323,78 @@ 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); Require(startup >= 0, "sceHttp2: network initialization failed; console error mapping is unknown"); Require(sceNetSocketClose(startup) == 0, "sceHttp2: network initialization socket close failed"); #endif - const auto deadline = Deadline(settings.resolveTimeout); - const auto job = Dns().Submit(url); - { + std::shared_ptr job; + for (std::int32_t attempt = 0;; ++attempt) { + const auto deadline = Deadline(settings.resolveTimeout); + job = Dns().Submit(url); std::unique_lock lock(job->mutex); while (!job->complete) { Check(deadline); job->changed.wait_for(lock, std::chrono::milliseconds(5)); } Check(deadline); - if (job->failure) std::rethrow_exception(job->failure); + if (!job->failure) break; + if (attempt >= settings.resolveRetry) std::rethrow_exception(job->failure); } const auto connectDeadline = Deadline(settings.connectTimeout); int result = 0; @@ -409,6 +471,7 @@ struct Request::State { state.contentLength = Number(text); state.hasLength = true; } + if (key == "content-encoding") state.contentEncoding = Lower(std::string(text)); }); } @@ -430,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); }); } @@ -595,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); @@ -619,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 116790ad2bd7..1595ab10483d 100644 --- a/core/libs/prx/libSceHttp2/Transport.hpp +++ b/core/libs/prx/libSceHttp2/Transport.hpp @@ -10,16 +10,25 @@ namespace Http2 { +using LookupHook = int (*)(const char* host); + +inline std::atomic& LookupHookSlot() { + static std::atomic hook{nullptr}; + return hook; +} + struct Settings { std::string userAgent; 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; std::uint32_t timeout = 120000000; std::uint32_t connectTimeout = 30000000; + std::int32_t resolveRetry = 0; std::uint32_t sendTimeout = 120000000; std::uint32_t recvTimeout = 120000000; std::uint32_t resolveTimeout = 30000000; @@ -57,3 +66,5 @@ std::shared_ptr CreateCapacity_nid_no_patch(int maximum); std::shared_ptr CreateRequest_nid_no_patch(int sslContext, std::shared_ptr capacity, Settings settings, std::string method, std::string url); } + +extern "C" void Http2SetLookupHook_nid_no_patch(Http2::LookupHook hook); diff --git a/core/libs/prx/libSceIcu/CMakeLists.txt b/core/libs/prx/libSceIcu/CMakeLists.txt index e557ab24edcc..0bbdfb93f191 100644 --- a/core/libs/prx/libSceIcu/CMakeLists.txt +++ b/core/libs/prx/libSceIcu/CMakeLists.txt @@ -1,8 +1,26 @@ add_library(libSceIcu SHARED EXCLUDE_FROM_ALL Export.cpp Invariant.cpp Version.cpp Unescape.cpp) 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) + target_include_directories(guest_icu_utf8_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_icu_utf8_tests PRIVATE libSceIcu libc) + configure_windows_unwind(guest_icu_utf8_tests) + add_test(NAME guest_icu_utf8 COMMAND guest_icu_utf8_tests) + set_tests_properties(guest_icu_utf8 PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(guest_icu_utf8 PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() if(BUILD_TESTING) add_test_executable(guest_icu_cstring_tests ${LIBS_INCLUDE_DIR}/tests/GuestIcuCString.cpp) @@ -17,6 +35,19 @@ if(BUILD_TESTING) endif() endif() +if(BUILD_TESTING) + add_test_executable(guest_icu_converter_callbacks_tests ${LIBS_INCLUDE_DIR}/tests/GuestIcuConverterCallbacks.cpp) + target_include_directories(guest_icu_converter_callbacks_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_icu_converter_callbacks_tests PRIVATE libSceIcu libc) + configure_windows_unwind(guest_icu_converter_callbacks_tests) + add_test(NAME guest_icu_converter_callbacks COMMAND guest_icu_converter_callbacks_tests) + set_tests_properties(guest_icu_converter_callbacks PROPERTIES TIMEOUT 10) + if(WIN32) + set_tests_properties(guest_icu_converter_callbacks PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() + if(BUILD_TESTING) add_test_executable(guest_icu_version_tests ${LIBS_INCLUDE_DIR}/tests/GuestIcuVersion.cpp) target_include_directories(guest_icu_version_tests PRIVATE ${LIBS_INCLUDE_DIR}) @@ -55,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 000000000000..f214fd55e851 --- /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/ConverterCallbacks.cpp b/core/libs/prx/libSceIcu/ConverterCallbacks.cpp new file mode 100644 index 000000000000..9021a30bb44a --- /dev/null +++ b/core/libs/prx/libSceIcu/ConverterCallbacks.cpp @@ -0,0 +1,58 @@ +#include "prx/libSceIcu/libSceIcu.hpp" +#include "prx/libc/include/General.hpp" +#include +#include + +namespace { + +void ValidateReason(std::int32_t reason) { + if (reason < 0 || reason > 7) APS5_INVALID_ARG_EX; +} + +void ClearError(std::int32_t* error) { + if (!error) APS5_INVALID_ARG_EX; + *error = 0; +} + +bool IsDefaultIgnorable(std::int32_t codePoint) { + constexpr std::array, 17> ranges{{ + {0x00ad, 0x00ad}, {0x034f, 0x034f}, {0x061c, 0x061c}, + {0x115f, 0x1160}, {0x17b4, 0x17b5}, {0x180b, 0x180f}, + {0x200b, 0x200f}, {0x202a, 0x202e}, {0x2060, 0x206f}, + {0x3164, 0x3164}, {0xfe00, 0xfe0f}, {0xfeff, 0xfeff}, + {0xffa0, 0xffa0}, {0xfff0, 0xfff8}, {0x1bca0, 0x1bca3}, + {0x1d173, 0x1d17a}, {0xe0000, 0xe0fff} + }}; + for (const auto& range : ranges) + if (codePoint >= range[0] && codePoint <= range[1]) return true; + return false; +} + +bool ContextSkips(const void* context, std::int32_t reason) { + return !context || (*static_cast(context) == 'i' && reason == 0); +} + +} + +extern "C" { + +void APS5_VABI UCNV_FROM_U_CALLBACK_STOP_nid_postfix(const void*, Icu::ConverterFromUnicodeArgs*, const char16_t*, std::int32_t, std::int32_t codePoint, std::int32_t reason, std::int32_t* error) { + ValidateReason(reason); + if (reason == 0 && IsDefaultIgnorable(codePoint)) ClearError(error); +} + +void APS5_VABI UCNV_FROM_U_CALLBACK_SKIP_nid_postfix(const void* context, Icu::ConverterFromUnicodeArgs*, const char16_t*, std::int32_t, std::int32_t codePoint, std::int32_t reason, std::int32_t* error) { + ValidateReason(reason); + if (reason <= 2 && ((reason == 0 && IsDefaultIgnorable(codePoint)) || ContextSkips(context, reason))) ClearError(error); +} + +void APS5_VABI UCNV_TO_U_CALLBACK_STOP_nid_postfix(const void*, Icu::ConverterToUnicodeArgs*, const char*, std::int32_t, std::int32_t reason, std::int32_t*) { + ValidateReason(reason); +} + +void APS5_VABI UCNV_TO_U_CALLBACK_SKIP_nid_postfix(const void* context, Icu::ConverterToUnicodeArgs*, const char*, std::int32_t, std::int32_t reason, std::int32_t* error) { + ValidateReason(reason); + if (reason <= 2 && ContextSkips(context, reason)) ClearError(error); +} + +} diff --git a/core/libs/prx/libSceIcu/ConverterCallbacks.hpp b/core/libs/prx/libSceIcu/ConverterCallbacks.hpp new file mode 100644 index 000000000000..2cb0ded8a12f --- /dev/null +++ b/core/libs/prx/libSceIcu/ConverterCallbacks.hpp @@ -0,0 +1,15 @@ +#pragma once +#include "prx/libc/include/general/VabiMacros.hpp" +#include + +namespace Icu { +struct ConverterFromUnicodeArgs; +struct ConverterToUnicodeArgs; +} + +extern "C" { +void APS5_VABI UCNV_FROM_U_CALLBACK_STOP_nid_postfix(const void* context, Icu::ConverterFromUnicodeArgs* arguments, const char16_t* codeUnits, std::int32_t length, std::int32_t codePoint, std::int32_t reason, std::int32_t* error); +void APS5_VABI UCNV_FROM_U_CALLBACK_SKIP_nid_postfix(const void* context, Icu::ConverterFromUnicodeArgs* arguments, const char16_t* codeUnits, std::int32_t length, std::int32_t codePoint, std::int32_t reason, std::int32_t* error); +void APS5_VABI UCNV_TO_U_CALLBACK_STOP_nid_postfix(const void* context, Icu::ConverterToUnicodeArgs* arguments, const char* codeUnits, std::int32_t length, std::int32_t reason, std::int32_t* error); +void APS5_VABI UCNV_TO_U_CALLBACK_SKIP_nid_postfix(const void* context, Icu::ConverterToUnicodeArgs* arguments, const char* codeUnits, std::int32_t length, std::int32_t reason, std::int32_t* error); +} diff --git a/core/libs/prx/libSceIcu/Export.cpp b/core/libs/prx/libSceIcu/Export.cpp index 4ef2b368e711..bf098b424a61 100644 --- a/core/libs/prx/libSceIcu/Export.cpp +++ b/core/libs/prx/libSceIcu/Export.cpp @@ -2,414 +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_uKBkvN84hbw_nid_no_patch() { +int APS5_VABI UCNV_FROM_U_CALLBACK_SUBSTITUTE_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("uKBkvN84hbw", sceIcuUnknown_uKBkvN84hbw_nid_no_patch); -int APS5_VABI sceIcuUnknown_JKRf_2yrIaE_nid_no_patch() { +int APS5_VABI UCNV_TO_U_CALLBACK_ESCAPE_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("JKRf+2yrIaE", sceIcuUnknown_JKRf_2yrIaE_nid_no_patch); -int APS5_VABI sceIcuUnknown_4Gv3tXZ2WKI_nid_no_patch() { +int APS5_VABI sceIcuDispatchUnknown_BufsAiaX0_plus_s_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("4Gv3tXZ2WKI", sceIcuUnknown_4Gv3tXZ2WKI_nid_no_patch); +APS5_EXPORT("BufsAiaX0+s", sceIcuDispatchUnknown_BufsAiaX0_plus_s_nid_no_patch); -int APS5_VABI sceIcuUnknown_RFnKlYsiIb0_nid_no_patch() { +int APS5_VABI sceIcuDispatchUnknown_xdF5zg0V5Oc_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("RFnKlYsiIb0", sceIcuUnknown_RFnKlYsiIb0_nid_no_patch); +APS5_EXPORT("xdF5zg0V5Oc", sceIcuDispatchUnknown_xdF5zg0V5Oc_nid_no_patch); -int APS5_VABI sceIcuUnknown_BZY5mpL0Syk_nid_no_patch() { +int APS5_VABI sceIcuDispatchUnknown_Con4H1SB3nw_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("BZY5mpL0Syk", sceIcuUnknown_BZY5mpL0Syk_nid_no_patch); +APS5_EXPORT("Con4H1SB3nw", sceIcuDispatchUnknown_Con4H1SB3nw_nid_no_patch); -int APS5_VABI sceIcuUnknown_WLoOrEfsob4_nid_no_patch() { +int APS5_VABI sceIcuDispatchUnknown_lME28PLmu54_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("WLoOrEfsob4", sceIcuUnknown_WLoOrEfsob4_nid_no_patch); +APS5_EXPORT("lME28PLmu54", sceIcuDispatchUnknown_lME28PLmu54_nid_no_patch); -int APS5_VABI sceIcuUnknown_H33ge_SDjlI_nid_no_patch() { +int APS5_VABI UCNV_TO_U_CALLBACK_SUBSTITUTE_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("H33ge+SDjlI", sceIcuUnknown_H33ge_SDjlI_nid_no_patch); -int APS5_VABI sceIcuUnknown_wlK146pHnQ4_nid_no_patch() { +int APS5_VABI locale_getKeywordsStart_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("wlK146pHnQ4", sceIcuUnknown_wlK146pHnQ4_nid_no_patch); -int APS5_VABI sceIcuUnknown_QO5iuHMTu2o_nid_no_patch() { +int APS5_VABI res_countArrayItems_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("QO5iuHMTu2o", sceIcuUnknown_QO5iuHMTu2o_nid_no_patch); -int APS5_VABI sceIcuUnknown_9TndABWg5Ds_nid_no_patch() { +int APS5_VABI res_getAlias_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("9TndABWg5Ds", sceIcuUnknown_9TndABWg5Ds_nid_no_patch); -int APS5_VABI sceIcuUnknown_tcf9HUwNaX0_nid_no_patch() { +int APS5_VABI res_getArrayItem_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 res_getBinaryNoTrace_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_getIntVectorNoTrace_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_getResource_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_getStringNoTrace_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_getTableItemByIndex_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_getTableItemByKey_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_read_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 u_caseInsensitivePrefixMatch_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("RlZwfEuRDx8", sceIcuUnknown_RlZwfEuRDx8_nid_no_patch); -int APS5_VABI sceIcuUnknown__xsbcqOIJmM_nid_no_patch() { +int APS5_VABI u_charAge_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("+xsbcqOIJmM", sceIcuUnknown__xsbcqOIJmM_nid_no_patch); -int APS5_VABI sceIcuUnknown_od0otGJ2Z3A_nid_no_patch() { +int APS5_VABI u_charDigitValue_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("od0otGJ2Z3A", sceIcuUnknown_od0otGJ2Z3A_nid_no_patch); -int APS5_VABI sceIcuUnknown_vXu991uXNUo_nid_no_patch() { +int APS5_VABI u_charDirection_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 u_charFromName_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 u_charMirror_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_charName_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_charType_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() { - NotImplemented_nid_no_patch(__func__); -} -APS5_EXPORT("4Kf0Hy8xJrI", sceIcuUnknown_4Kf0Hy8xJrI_nid_no_patch); - -int APS5_VABI sceIcuUnknown_JGkExZI3fFI_nid_no_patch() { - NotImplemented_nid_no_patch(__func__); -} -APS5_EXPORT("JGkExZI3fFI", sceIcuUnknown_JGkExZI3fFI_nid_no_patch); - -int APS5_VABI sceIcuUnknown_0cYEtBUJ5zQ_nid_no_patch() { - 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() { - 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_hasBinaryProperty_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_isIDIgnorable_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_isIDPart_nid_postfix() { NotImplemented_nid_no_patch(__func__); } -APS5_EXPORT("u8WyPl4r3Oc", sceIcuUnknown_u8WyPl4r3Oc_nid_no_patch); -int APS5_VABI sceIcuUnknown_7E_h3yiZjKw_nid_no_patch() { +int APS5_VABI u_isIDStart_nid_postfix() { 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__); @@ -436,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() { - NotImplemented_nid_no_patch(__func__); -} -APS5_EXPORT("TNZrG2iXikw", sceIcuUnknown_TNZrG2iXikw_nid_no_patch); - -int APS5_VABI sceIcuUnknown_Z5ljxAg3thw_nid_no_patch() { +int APS5_VABI u_strFoldCase_nid_postfix() { 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__); @@ -476,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__); @@ -491,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 000000000000..0be2f37e555d --- /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/Invariant.cpp b/core/libs/prx/libSceIcu/Invariant.cpp index 53501ba1d6dc..b2ab8cf01314 100644 --- a/core/libs/prx/libSceIcu/Invariant.cpp +++ b/core/libs/prx/libSceIcu/Invariant.cpp @@ -28,4 +28,28 @@ void APS5_VABI u_UCharsToChars_nid_postfix(const char16_t* units, char* chars, s } } +char* APS5_VABI u_austrcpy_nid_postfix(char* chars, const char16_t* units) { + if (!chars || !units) APS5_INVALID_ARG_EX; + std::int32_t length = 0; + while (units[length] != 0) { + if (units[length] > 0x7f) NotImplemented_nid_no_patch(__func__); + ++length; + } + for (std::int32_t index = 0; index <= length; ++index) chars[index] = static_cast(units[index]); + return chars; +} + +char* APS5_VABI u_austrncpy_nid_postfix(char* chars, const char16_t* units, std::int32_t length) { + if (length > 0 && (!chars || !units)) APS5_INVALID_ARG_EX; + if (length <= 0) return chars; + std::int32_t copied = 0; + while (copied < length && units[copied] != 0) { + if (units[copied] > 0x7f) NotImplemented_nid_no_patch(__func__); + ++copied; + } + for (std::int32_t index = 0; index < copied; ++index) chars[index] = static_cast(units[index]); + if (copied < length) chars[copied] = 0; + return chars; +} + } diff --git a/core/libs/prx/libSceIcu/Invariant.hpp b/core/libs/prx/libSceIcu/Invariant.hpp index 77e2421ef24b..8298cc795311 100644 --- a/core/libs/prx/libSceIcu/Invariant.hpp +++ b/core/libs/prx/libSceIcu/Invariant.hpp @@ -3,6 +3,8 @@ #include extern "C" { +char* APS5_VABI u_austrcpy_nid_postfix(char*, const char16_t*); +char* APS5_VABI u_austrncpy_nid_postfix(char*, const char16_t*, std::int32_t); void APS5_VABI u_charsToUChars_nid_postfix(const char*, char16_t*, std::int32_t); void APS5_VABI u_UCharsToChars_nid_postfix(const char16_t*, char*, std::int32_t); } diff --git a/core/libs/prx/libSceIcu/Iterator.hpp b/core/libs/prx/libSceIcu/Iterator.hpp new file mode 100644 index 000000000000..ba2136bb31ea --- /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 000000000000..d24879e47edf --- /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 000000000000..94aa6fe9e8cd --- /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/Utf8.cpp b/core/libs/prx/libSceIcu/Utf8.cpp new file mode 100644 index 000000000000..cd3c83ea7f53 --- /dev/null +++ b/core/libs/prx/libSceIcu/Utf8.cpp @@ -0,0 +1,147 @@ +#include "prx/libSceIcu/libSceIcu.hpp" +#include "prx/libc/include/General.hpp" +#include +#include +#include +#include + +namespace { + +bool IsTrail(std::uint8_t value) { + return value >= 0x80 && value <= 0xbf; +} + +int TrailCount(std::int32_t lead) { + if (lead < 0xc2 || lead > 0xf4) return 0; + return lead < 0xe0 ? 1 : lead < 0xf0 ? 2 : 3; +} + +bool FirstTrail(std::int32_t lead, std::uint8_t trail, bool allowSurrogate) { + if (!IsTrail(trail)) return false; + if (lead == 0xe0) return trail >= 0xa0; + if (lead == 0xed && !allowSurrogate) return trail < 0xa0; + if (lead == 0xf0) return trail >= 0x90; + if (lead == 0xf4) return trail < 0x90; + return true; +} + +bool Noncharacter(std::int32_t value) { + return (value >= 0xfdd0 && value <= 0xfdef) || (value & 0xffff) >= 0xfffe; +} + +std::int32_t ErrorValue(int trails, std::int8_t strict) { + if (strict < 0) return strict == -3 ? 0xfffd : -1; + constexpr std::array values{0x15, 0x9f, 0xffff, 0x10ffff}; + return values[trails]; +} + +std::uint8_t Read(const std::uint8_t* text, std::int32_t index) { + if (!text) APS5_INVALID_ARG_EX; + return text[index]; +} + +void Advance(std::int32_t& index) { + if (index == std::numeric_limits::max()) APS5_INVALID_ARG_EX; + ++index; +} + +struct Prefix { + std::int32_t index; + std::int32_t value = 0; + int trails = 0; + bool complete = false; +}; + +Prefix PreviousPrefix(const std::uint8_t* text, std::int32_t start, std::int32_t index, std::uint8_t last, bool allowSurrogate) { + if (!IsTrail(last)) return {index}; + std::array trails{last}; + auto position = index; + for (int count = 1; count <= 3 && position > start; ++count) { + const auto byte = Read(text, --position); + if (IsTrail(byte)) { + if (count < 3) trails[count] = byte; + continue; + } + const int needed = TrailCount(byte); + if (needed < count || !FirstTrail(byte, trails[count - 1], allowSurrogate && count == 2 && needed == 2)) break; + std::int32_t value = byte & (0x7f >> needed); + for (int trail = count - 1; trail >= 0; --trail) value = (value << 6) | (trails[trail] & 0x3f); + return {position, value, count, count == needed}; + } + return {index}; +} + +void CheckBackward(std::int32_t start, std::int32_t index) { + if (start < 0 || index < start) APS5_INVALID_ARG_EX; +} + +void Write(std::uint8_t* text, std::int32_t index, std::uint32_t value, int width) { + if (!text) APS5_INVALID_ARG_EX; + for (int offset = width - 1; offset > 0; --offset) { + text[index + offset] = static_cast(0x80 | (value & 0x3f)); + value >>= 6; + } + constexpr std::array markers{0, 0, 0xc0, 0xe0, 0xf0}; + text[index] = static_cast(markers[width] | value); +} + +} + +extern "C" { + +std::int32_t APS5_VABI utf8_nextCharSafeBody_nid_postfix(const std::uint8_t* text, std::int32_t* index, std::int32_t length, std::int32_t lead, std::int8_t strict) { + if (!index || *index < 0 || (length >= 0 && *index > length)) APS5_INVALID_ARG_EX; + const auto original = *index; + auto position = original; + const int needed = TrailCount(lead); + if (!needed || position == length) return ErrorValue(0, strict); + std::int32_t value = lead & (0x7f >> needed); + for (int trail = 0; trail < needed && position != length; ++trail) { + const auto byte = Read(text, position); + if (trail == 0 ? !FirstTrail(lead, byte, strict == -2) : !IsTrail(byte)) break; + value = (value << 6) | (byte & 0x3f); + Advance(position); + } + *index = position; + const int consumed = position - original; + if (consumed == needed && (strict <= 0 || !Noncharacter(value))) return value; + return ErrorValue(consumed, strict); +} + +std::int32_t APS5_VABI utf8_prevCharSafeBody_nid_postfix(const std::uint8_t* text, std::int32_t start, std::int32_t* index, std::int32_t trail, std::int8_t strict) { + if (!index) APS5_INVALID_ARG_EX; + CheckBackward(start, *index); + const auto prefix = PreviousPrefix(text, start, *index, static_cast(trail), strict == -2); + *index = prefix.index; + if (prefix.complete && (strict <= 0 || !Noncharacter(prefix.value))) return prefix.value; + return ErrorValue(prefix.trails, strict); +} + +std::int32_t APS5_VABI utf8_appendCharSafeBody_nid_postfix(std::uint8_t* text, std::int32_t index, std::int32_t capacity, std::int32_t value, std::int8_t* isError) { + if (index < 0) APS5_INVALID_ARG_EX; + const auto scalar = static_cast(value); + const int width = scalar <= 0x7ff ? 2 : scalar <= 0xffff ? 3 : 4; + if (scalar <= 0x10ffff && index > std::numeric_limits::max() - (width - 1)) APS5_INVALID_ARG_EX; + const std::int64_t available = static_cast(capacity) - index; + if (scalar <= 0x10ffff && (scalar < 0xd800 || scalar > 0xdfff) && available >= width) { + Write(text, index, scalar, width); + return index + width; + } + if (isError) { + *isError = 1; + } else { + if (available < std::numeric_limits::min()) APS5_INVALID_ARG_EX; + if (available <= 0) return index; + const auto count = static_cast(std::min(available, 3)); + Write(text, index, static_cast(ErrorValue(count - 1, 0)), count); + return index + count; + } + return index; +} + +std::int32_t APS5_VABI utf8_back1SafeBody_nid_postfix(const std::uint8_t* text, std::int32_t start, std::int32_t index) { + CheckBackward(start, index); + return PreviousPrefix(text, start, index, Read(text, index), false).index; +} + +} diff --git a/core/libs/prx/libSceIcu/Utf8.hpp b/core/libs/prx/libSceIcu/Utf8.hpp new file mode 100644 index 000000000000..668aa2f3d411 --- /dev/null +++ b/core/libs/prx/libSceIcu/Utf8.hpp @@ -0,0 +1,10 @@ +#pragma once +#include "prx/libc/include/general/VabiMacros.hpp" +#include + +extern "C" { +std::int32_t APS5_VABI utf8_nextCharSafeBody_nid_postfix(const std::uint8_t* text, std::int32_t* index, std::int32_t length, std::int32_t lead, std::int8_t strict); +std::int32_t APS5_VABI utf8_prevCharSafeBody_nid_postfix(const std::uint8_t* text, std::int32_t start, std::int32_t* index, std::int32_t trail, std::int8_t strict); +std::int32_t APS5_VABI utf8_appendCharSafeBody_nid_postfix(std::uint8_t* text, std::int32_t index, std::int32_t capacity, std::int32_t value, std::int8_t* isError); +std::int32_t APS5_VABI utf8_back1SafeBody_nid_postfix(const std::uint8_t* text, std::int32_t start, std::int32_t index); +} diff --git a/core/libs/prx/libSceIcu/Version.cpp b/core/libs/prx/libSceIcu/Version.cpp index 5916903a8245..3c55a14e172c 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 4963a77ed25f..7bfee06d7b09 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 000000000000..e47fb7987780 --- /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 000000000000..c1ec59189ace --- /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 3bddff6df865..300ae3ebb729 100644 --- a/core/libs/prx/libSceIcu/libSceIcu.hpp +++ b/core/libs/prx/libSceIcu/libSceIcu.hpp @@ -1,6 +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 000000000000..cf354c26a210 --- /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 000000000000..0b0ef39b15eb --- /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/libSceIdu/Export.cpp b/core/libs/prx/libSceIdu/Export.cpp index 753cc6aa8b3d..275521b6ffaf 100644 --- a/core/libs/prx/libSceIdu/Export.cpp +++ b/core/libs/prx/libSceIdu/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceIdu/include/InventoryExports.hpp" #include "prx/libSceIdu/include/Api.hpp" #include #include @@ -47,3 +49,63 @@ int APS5_VABI sceIduTerm() { } } + +extern "C" { + +int APS5_VABI sceIduGetDiscTitleInfo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceIduGetFsStats() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceIduGetHardwareId() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceIduGetPkgInstallStatus() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceIduGetTitleList() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceIduInstallRif() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceIduNotificationHide() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceIduNotificationShow() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceIduStartTitle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI libSceIduUnknown_3XKI6v75VEo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3XKI6v75VEo", libSceIduUnknown_3XKI6v75VEo_nid_no_patch); + +int APS5_VABI libSceIduUnknown_J9y431a1uM0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("J9y431a1uM0", libSceIduUnknown_J9y431a1uM0_nid_no_patch); + +int APS5_VABI libSceIduUnknown_tmeq5nZRqIs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tmeq5nZRqIs", libSceIduUnknown_tmeq5nZRqIs_nid_no_patch); + +int APS5_VABI libSceIduUnknown_uoHZCJW8Cdk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uoHZCJW8Cdk", libSceIduUnknown_uoHZCJW8Cdk_nid_no_patch); + +} diff --git a/core/libs/prx/libSceIdu/include/InventoryExports.hpp b/core/libs/prx/libSceIdu/include/InventoryExports.hpp new file mode 100644 index 000000000000..89d41423395e --- /dev/null +++ b/core/libs/prx/libSceIdu/include/InventoryExports.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceIduGetDiscTitleInfo(); +int APS5_VABI sceIduGetFsStats(); +int APS5_VABI sceIduGetHardwareId(); +int APS5_VABI sceIduGetPkgInstallStatus(); +int APS5_VABI sceIduGetTitleList(); +int APS5_VABI sceIduInstallRif(); +int APS5_VABI sceIduNotificationHide(); +int APS5_VABI sceIduNotificationShow(); +int APS5_VABI sceIduStartTitle(); +int APS5_VABI libSceIduUnknown_3XKI6v75VEo_nid_no_patch(); +int APS5_VABI libSceIduUnknown_J9y431a1uM0_nid_no_patch(); +int APS5_VABI libSceIduUnknown_tmeq5nZRqIs_nid_no_patch(); +int APS5_VABI libSceIduUnknown_uoHZCJW8Cdk_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceIdu/libSceIdu.hpp b/core/libs/prx/libSceIdu/libSceIdu.hpp index b89994020547..01a6f9ac67dd 100644 --- a/core/libs/prx/libSceIdu/libSceIdu.hpp +++ b/core/libs/prx/libSceIdu/libSceIdu.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceIdu/include/Api.hpp" +#include "prx/libSceIdu/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceImageUtil/Export.cpp b/core/libs/prx/libSceImageUtil/Export.cpp index d81f4a5e32c4..f51d208d98f3 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 000000000000..2455d281aed1 --- /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 000000000000..886da6bdd597 --- /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 6f70f09beec2..cf97765e34d9 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 2e471a09d6fd..e91845fe5a19 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) +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) @@ -43,6 +43,31 @@ if(BUILD_TESTING) "PATH=path_list_prepend:$") endif() + add_test_executable(guest_ime_modal_dialog_tests ${LIBS_INCLUDE_DIR}/tests/GuestImeModalDialog.cpp) + target_include_directories(guest_ime_modal_dialog_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_ime_modal_dialog_tests PRIVATE libSceIme libc) + configure_windows_unwind(guest_ime_modal_dialog_tests) + add_test(NAME guest_ime_modal_dialog COMMAND guest_ime_modal_dialog_tests) + if(WIN32) + set_tests_properties(guest_ime_modal_dialog PROPERTIES ENVIRONMENT_MODIFICATION + "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 6b93ad95104a..29b09103c1c6 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 000000000000..eda62cf5b314 --- /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 new file mode 100644 index 000000000000..21a2eeec5689 --- /dev/null +++ b/core/libs/prx/libSceIme/include/ModalDialog.hpp @@ -0,0 +1,55 @@ +#ifndef CORE_LIBS_PRX_LIBSCEIME_INCLUDE_MODALDIALOG_HPP +#define CORE_LIBS_PRX_LIBSCEIME_INCLUDE_MODALDIALOG_HPP + +#include +#include +#include +#include + +#include "prx/libSceIme/include/ImeInput.hpp" + +inline constexpr std::size_t ModalDialogNoButton = static_cast(-1); +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; + std::u16string message; + std::vector buttons; + std::size_t focus = 0; + std::size_t cancel = ModalDialogNoButton; +}; + +struct ModalDialogButtonView { + std::u16string label; + bool selected = false; +}; + +struct ModalDialogView { + std::u16string message; + std::vector buttons; +}; + +enum class ModalDialogState : std::uint8_t { Idle, Showing, Answered, Closed, Unshown }; + +inline constexpr std::uint32_t ModalDialogShowTimeoutMilliseconds = 3000; + +enum class ModalDialogInputKind : std::uint8_t { Previous, Next, Confirm, Cancel }; + +extern "C" void ModalDialogSetPresenter_nid_postfix(bool present); +extern "C" bool ModalDialogHasPresenter_nid_postfix(); +extern "C" void ModalDialogSetShowTimeout_nid_postfix(std::uint32_t milliseconds); +extern "C" bool ModalDialogOpen_nid_postfix(const ModalDialogRequest& request); +extern "C" ModalDialogState ModalDialogPoll_nid_postfix(std::size_t& chosen, std::uint32_t owner = ModalDialogAnyOwner); +extern "C" void ModalDialogClose_nid_postfix(std::uint32_t owner = ModalDialogAnyOwner); +extern "C" void ModalDialogReset_nid_postfix(std::uint32_t owner = ModalDialogAnyOwner); +extern "C" bool ModalDialogReadView_nid_postfix(ModalDialogView& view); +extern "C" bool ModalDialogCapturesInput_nid_postfix(); +extern "C" void ModalDialogPublishInput_nid_postfix(ModalDialogInputKind kind); +extern "C" void ModalDialogPublishPad_nid_postfix(const ImeHostPad& pad); + +#endif diff --git a/core/libs/prx/libSceIme/include/PsnDialogNotice.hpp b/core/libs/prx/libSceIme/include/PsnDialogNotice.hpp new file mode 100644 index 000000000000..c12b228f42d8 --- /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 01b649be31d5..1e26db7d6fab 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/ModalDialog.cpp b/core/libs/prx/libSceIme/src/ModalDialog.cpp new file mode 100644 index 000000000000..bc6cf72c3537 --- /dev/null +++ b/core/libs/prx/libSceIme/src/ModalDialog.cpp @@ -0,0 +1,171 @@ +#include "prx/libSceIme/include/ModalDialog.hpp" + +#include +#include +#include + +namespace { + +constexpr std::uint32_t PadButtonUp = 0x0010; +constexpr std::uint32_t PadButtonRight = 0x0020; +constexpr std::uint32_t PadButtonDown = 0x0040; +constexpr std::uint32_t PadButtonLeft = 0x0080; +constexpr std::uint32_t PadButtonCircle = 0x2000; +constexpr std::uint32_t PadButtonCross = 0x4000; +constexpr std::uint8_t StickLow = 64; +constexpr std::uint8_t StickHigh = 192; +constexpr std::uint32_t StickLeft = 0x80000000; +constexpr std::uint32_t StickRight = 0x40000000; + +struct Session { + std::uint32_t owner = ModalDialogAnyOwner; + ModalDialogState state = ModalDialogState::Idle; + ModalDialogRequest request; + std::size_t focus = 0; + std::size_t chosen = ModalDialogNoButton; + std::uint32_t held = 0; + bool armed = false; + bool drawn = false; + std::chrono::steady_clock::time_point openedAt; +}; + +std::mutex g_mutex; +Session g_session; +std::atomic g_presenter{false}; +std::atomic g_showTimeout{ModalDialogShowTimeoutMilliseconds}; + +bool InputOwnedByIme() { + return ImeCapturesKeyboard_nid_postfix() || ImeCapturesPad_nid_postfix(); +} + +bool OwnedBy(const Session& session, std::uint32_t owner) { + return owner == ModalDialogAnyOwner || session.owner == owner; +} + +void Expire(Session& session) { + if (session.state != ModalDialogState::Showing || session.drawn) return; + if (std::chrono::steady_clock::now() - session.openedAt >= std::chrono::milliseconds(g_showTimeout.load())) session.state = ModalDialogState::Unshown; +} + +void Apply(Session& session, ModalDialogInputKind kind) { + if (session.state != ModalDialogState::Showing) return; + switch (kind) { + case ModalDialogInputKind::Previous: + if (session.focus > 0) --session.focus; + break; + case ModalDialogInputKind::Next: + if (session.focus + 1 < session.request.buttons.size()) ++session.focus; + break; + case ModalDialogInputKind::Confirm: + session.chosen = session.focus; + session.state = ModalDialogState::Answered; + break; + case ModalDialogInputKind::Cancel: + if (session.request.cancel == ModalDialogNoButton) break; + session.chosen = session.request.cancel; + session.state = ModalDialogState::Answered; + break; + } +} + +} + +extern "C" { + +void ModalDialogSetPresenter_nid_postfix(bool present) { + g_presenter = present; +} + +bool ModalDialogHasPresenter_nid_postfix() { + return g_presenter.load(); +} + +void ModalDialogSetShowTimeout_nid_postfix(std::uint32_t milliseconds) { + g_showTimeout = milliseconds; +} + +bool ModalDialogOpen_nid_postfix(const ModalDialogRequest& request) { + if (!g_presenter.load()) return false; + if (request.buttons.empty() || request.buttons.size() > ModalDialogMaxButtons) return false; + if (request.focus >= request.buttons.size()) return false; + if (request.cancel != ModalDialogNoButton && request.cancel >= request.buttons.size()) return false; + std::lock_guard lock(g_mutex); + if (g_session.state == ModalDialogState::Showing) return false; + g_session = Session{}; + g_session.owner = request.owner; + g_session.request = request; + g_session.focus = request.focus; + g_session.state = ModalDialogState::Showing; + g_session.openedAt = std::chrono::steady_clock::now(); + return true; +} + +ModalDialogState ModalDialogPoll_nid_postfix(std::size_t& chosen, std::uint32_t owner) { + std::lock_guard lock(g_mutex); + Expire(g_session); + if (!OwnedBy(g_session, owner)) { + chosen = ModalDialogNoButton; + return ModalDialogState::Idle; + } + chosen = g_session.chosen; + return g_session.state; +} + +void ModalDialogClose_nid_postfix(std::uint32_t owner) { + std::lock_guard lock(g_mutex); + if (g_session.state == ModalDialogState::Showing && OwnedBy(g_session, owner)) g_session.state = ModalDialogState::Closed; +} + +void ModalDialogReset_nid_postfix(std::uint32_t owner) { + std::lock_guard lock(g_mutex); + if (OwnedBy(g_session, owner)) g_session = Session{}; +} + +bool ModalDialogReadView_nid_postfix(ModalDialogView& view) { + if (InputOwnedByIme()) return false; + std::lock_guard lock(g_mutex); + Expire(g_session); + if (g_session.state != ModalDialogState::Showing) return false; + g_session.drawn = true; + view.message = g_session.request.message; + view.buttons.clear(); + for (std::size_t index = 0; index < g_session.request.buttons.size(); ++index) { + view.buttons.push_back({g_session.request.buttons[index], index == g_session.focus}); + } + return true; +} + +bool ModalDialogCapturesInput_nid_postfix() { + if (InputOwnedByIme()) return false; + std::lock_guard lock(g_mutex); + Expire(g_session); + return g_session.state == ModalDialogState::Showing; +} + +void ModalDialogPublishInput_nid_postfix(ModalDialogInputKind kind) { + if (InputOwnedByIme()) return; + std::lock_guard lock(g_mutex); + Expire(g_session); + Apply(g_session, kind); +} + +void ModalDialogPublishPad_nid_postfix(const ImeHostPad& pad) { + if (InputOwnedByIme()) return; + std::lock_guard lock(g_mutex); + Session& session = g_session; + Expire(session); + if (session.state != ModalDialogState::Showing) return; + std::uint32_t now = pad.buttons; + if (pad.leftX < StickLow) now |= StickLeft; + if (pad.leftX > StickHigh) now |= StickRight; + const std::uint32_t pressed = now & ~session.held; + session.held = now; + if ((now & (PadButtonCross | PadButtonCircle)) == 0) session.armed = true; + if ((pressed & (PadButtonLeft | PadButtonUp | StickLeft)) != 0) Apply(session, ModalDialogInputKind::Previous); + if ((pressed & (PadButtonRight | PadButtonDown | StickRight)) != 0) Apply(session, ModalDialogInputKind::Next); + if (!session.armed) return; + if ((pressed & PadButtonCross) != 0) Apply(session, ModalDialogInputKind::Confirm); + else if ((pressed & PadButtonCircle) != 0) Apply(session, ModalDialogInputKind::Cancel); +} + +} diff --git a/core/libs/prx/libSceIme/src/PsnDialogNotice.cpp b/core/libs/prx/libSceIme/src/PsnDialogNotice.cpp new file mode 100644 index 000000000000..ee5d3fc00be9 --- /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 081f2a8da3e5..5c35d74531e4 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 313043e3c0e3..b5cc395a734e 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 56b44db4a682..a5a4393458c8 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 0b41f35ebe35..5b10dbd0fadc 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 993a1254b35a..6bd6f7016181 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 @@ -32,4 +34,223 @@ int APS5_VABI sceIpmiMgrStartDump(void) { return 0; } +int APS5_VABI sceIpmiUnknown_nJthG9040U8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nJthG9040U8", sceIpmiUnknown_nJthG9040U8_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_64umtbwiizI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("64umtbwiizI", sceIpmiUnknown_64umtbwiizI_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_X8bM2L_G59E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("X8bM2L-G59E", sceIpmiUnknown_X8bM2L_G59E_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_pLNZVjiFPKE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pLNZVjiFPKE", sceIpmiUnknown_pLNZVjiFPKE_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_exZt85cnx08_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("exZt85cnx08", sceIpmiUnknown_exZt85cnx08_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_y29rp3N5qf4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("y29rp3N5qf4", sceIpmiUnknown_y29rp3N5qf4_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_eVn6vS9O8EI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eVn6vS9O8EI", sceIpmiUnknown_eVn6vS9O8EI_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_lsbUGZCjQy8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lsbUGZCjQy8", sceIpmiUnknown_lsbUGZCjQy8_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_57XmD42P9gQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("57XmD42P9gQ", sceIpmiUnknown_57XmD42P9gQ_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_FsiuQCKSE5Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FsiuQCKSE5Q", sceIpmiUnknown_FsiuQCKSE5Q_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_8kU11lW12ss_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8kU11lW12ss", sceIpmiUnknown_8kU11lW12ss_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_cOli1uePSwY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cOli1uePSwY", sceIpmiUnknown_cOli1uePSwY_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_rU0UzNMZDIs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rU0UzNMZDIs", sceIpmiUnknown_rU0UzNMZDIs_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_vogma5QshU4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vogma5QshU4", sceIpmiUnknown_vogma5QshU4_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_R9CB6TmSpeU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("R9CB6TmSpeU", sceIpmiUnknown_R9CB6TmSpeU_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_k9ixmB0yrP4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("k9ixmB0yrP4", sceIpmiUnknown_k9ixmB0yrP4_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_o8Es_aQYa2Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("o8Es+aQYa2Q", sceIpmiUnknown_o8Es_aQYa2Q_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_N0iXfw1xf1Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("N0iXfw1xf1Q", sceIpmiUnknown_N0iXfw1xf1Q_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_EsoUVUbGMdg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EsoUVUbGMdg", sceIpmiUnknown_EsoUVUbGMdg_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_H2HLRQerr_g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("H2HLRQerr+g", sceIpmiUnknown_H2HLRQerr_g_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_lxtXq6qmrC8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lxtXq6qmrC8", sceIpmiUnknown_lxtXq6qmrC8_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_w9uM8jBkjhw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("w9uM8jBkjhw", sceIpmiUnknown_w9uM8jBkjhw_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_GIniJssLcts_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GIniJssLcts", sceIpmiUnknown_GIniJssLcts_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_O_Rk6bioKMY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("O+Rk6bioKMY", sceIpmiUnknown_O_Rk6bioKMY_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_P17jonIyIB8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("P17jonIyIB8", sceIpmiUnknown_P17jonIyIB8_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_e_OnyPe42tI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("e-OnyPe42tI", sceIpmiUnknown_e_OnyPe42tI_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_dPOHeORqhbw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dPOHeORqhbw", sceIpmiUnknown_dPOHeORqhbw_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_w_zWDsN_0bQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("w-zWDsN+0bQ", sceIpmiUnknown_w_zWDsN_0bQ_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_Gzah1AMZDS8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Gzah1AMZDS8", sceIpmiUnknown_Gzah1AMZDS8_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_2VzR2bMe3iU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2VzR2bMe3iU", sceIpmiUnknown_2VzR2bMe3iU_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_D1A_mAFwjT4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("D1A-mAFwjT4", sceIpmiUnknown_D1A_mAFwjT4_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_uMWav34mMq8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uMWav34mMq8", sceIpmiUnknown_uMWav34mMq8_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_32j2cyCl3Yo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("32j2cyCl3Yo", sceIpmiUnknown_32j2cyCl3Yo_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_bNAnspllfsc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bNAnspllfsc", sceIpmiUnknown_bNAnspllfsc_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_tFY6zzpnlOs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tFY6zzpnlOs", sceIpmiUnknown_tFY6zzpnlOs_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_vk71LUV2VVw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vk71LUV2VVw", sceIpmiUnknown_vk71LUV2VVw_nid_no_patch); + +int APS5_VABI sceIpmiUnknown__S36x8s8CAw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-S36x8s8CAw", sceIpmiUnknown__S36x8s8CAw_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_03U1u_RK3vg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("03U1u-RK3vg", sceIpmiUnknown_03U1u_RK3vg_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_AYyxvDy_SFU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AYyxvDy-SFU", sceIpmiUnknown_AYyxvDy_SFU_nid_no_patch); + +int APS5_VABI sceIpmiUnknown_r0t1NxWUNwI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +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 000000000000..3179e3820b62 --- /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 c7fc7c9a2281..1f9fd9aa5d5f 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/libSceJobManager/Export.cpp b/core/libs/prx/libSceJobManager/Export.cpp index dafdc9f89c36..abefb6f4f7b9 100644 --- a/core/libs/prx/libSceJobManager/Export.cpp +++ b/core/libs/prx/libSceJobManager/Export.cpp @@ -12,6 +12,7 @@ #include "prx/libSceAgc/Acb/include/Memory.hpp" #include "prx/libSceAgc/Acb/include/Dispatch.hpp" #include "prx/libSceAgc/Acb/include/Control.hpp" +#include #include #include #include @@ -277,6 +278,7 @@ struct Manager { std::uint32_t workerCount = 0; std::uint32_t sleepingWorkers = 0; std::uint32_t wakeTokens = 0; + std::atomic workEpoch = 0; std::uint64_t pendingInvocations = 0; std::uint64_t spinTicks = 0; std::array runQueues; @@ -300,6 +302,7 @@ static_assert(sizeof(Manager) <= StateEnd - StateOffset); thread_local Manager* currentWorker = nullptr; void WakeWorkers(Manager& manager, std::uint32_t invocations, bool publisherCanRun = true) { + manager.workEpoch.fetch_add(1, std::memory_order_release); const std::uint32_t available = invocations - (publisherCanRun && currentWorker == &manager ? 1u : 0u); manager.wakeTokens += std::min(available, manager.sleepingWorkers - manager.wakeTokens); if (manager.wakeTokens != 0) manager.work.notify_all(); @@ -813,6 +816,8 @@ bool RunOne(Manager& manager, std::unique_lock& guard) { return true; } +constexpr std::uint32_t SpinPauses = 1024; + void* APS5_VABI WorkerEntry(void* argument) { Manager& manager = *static_cast(argument); currentWorker = &manager; @@ -825,8 +830,9 @@ void* APS5_VABI WorkerEntry(void* argument) { } const bool spinning = manager.pendingInvocations != 0 && __rdtsc() - lastWork < manager.spinTicks; if (spinning || manager.sleepingWorkers >= manager.workerCount - manager.persistentThreads) { + const std::uint32_t epoch = manager.workEpoch.load(std::memory_order_acquire); guard.unlock(); - _mm_pause(); + for (std::uint32_t pause = 0; pause != SpinPauses && manager.workEpoch.load(std::memory_order_acquire) == epoch; ++pause) _mm_pause(); guard.lock(); continue; } @@ -945,6 +951,7 @@ void StopManager(Manager& manager) { { const std::lock_guard guard(manager.lock); manager.running = false; + manager.workEpoch.fetch_add(1, std::memory_order_release); manager.work.notify_all(); } while (manager.activeWorkers != 0) { @@ -1162,6 +1169,7 @@ int APS5_VABI _ZN3sce3Job10JobManager24setPersistentThreadCountEj(void* self, st if (count > manager->workerCount) return ManagerInvalidArgument; const std::lock_guard guard(manager->lock); manager->persistentThreads = count; + manager->workEpoch.fetch_add(1, std::memory_order_release); return 0; } diff --git a/core/libs/prx/libSceJsc/CMakeLists.txt b/core/libs/prx/libSceJsc/CMakeLists.txt index 73915bc4fff0..c3c478aab761 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 41ff8bf4191b..fdbbde917f91 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 000000000000..9edbab880af4 --- /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 e4c285ccf113..b5b8bfd05551 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 000000000000..a877744b90fe --- /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 28a1869c2cc1..528053545f02 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/libSceJson2/CMakeLists.txt b/core/libs/prx/libSceJson2/CMakeLists.txt index cf4780cf800f..e7b279454186 100644 --- a/core/libs/prx/libSceJson2/CMakeLists.txt +++ b/core/libs/prx/libSceJson2/CMakeLists.txt @@ -28,6 +28,7 @@ endif() if(BUILD_TESTING) add_test_executable(guest_json_copy_failure_tests ${LIBS_INCLUDE_DIR}/tests/JsonCopyFailure.cpp Export.cpp) target_include_directories(guest_json_copy_failure_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_compile_features(guest_json_copy_failure_tests PRIVATE cxx_std_23) if(WIN32) target_link_libraries(guest_json_copy_failure_tests PRIVATE libc) configure_windows_unwind(guest_json_copy_failure_tests) diff --git a/core/libs/prx/libSceJxr/CMakeLists.txt b/core/libs/prx/libSceJxr/CMakeLists.txt index c94b79373632..5d76a6870fb2 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 000000000000..cd36d73a039c --- /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 e92de5c28498..c9875fcd39e3 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 000000000000..101b32279093 --- /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 d81f4a5e32c4..bd805b6cfa84 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 000000000000..2622f0b5723a --- /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 6f70f09beec2..e3aa21055833 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/CMakeLists.txt b/core/libs/prx/libSceKeyboard/CMakeLists.txt index 6f23ed265fed..c03196441e3d 100644 --- a/core/libs/prx/libSceKeyboard/CMakeLists.txt +++ b/core/libs/prx/libSceKeyboard/CMakeLists.txt @@ -12,11 +12,23 @@ if(BUILD_TESTING) ${CMAKE_CURRENT_SOURCE_DIR}/../libSceVideoOut/src/KeyboardInput.cpp ) target_include_directories(keyboard_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_SDL2_INCLUDE_DIR}) - target_link_libraries(keyboard_tests PRIVATE libSceKeyboard libkernel libc) + target_link_libraries(keyboard_tests PRIVATE libSceKeyboard libSceIme libkernel libc) configure_windows_unwind(keyboard_tests) add_test(NAME keyboard_input COMMAND keyboard_tests) if(WIN32) set_tests_properties(keyboard_input PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") + "PATH=path_list_prepend:$;PATH=path_list_prepend:$") + endif() + add_test_executable(keyboard_dialog_tests + ${CMAKE_CURRENT_SOURCE_DIR}/tests/KeyboardDialog.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../libSceVideoOut/src/KeyboardInput.cpp + ) + target_include_directories(keyboard_dialog_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_SDL2_INCLUDE_DIR}) + target_link_libraries(keyboard_dialog_tests PRIVATE libSceKeyboard libSceIme libkernel libc) + configure_windows_unwind(keyboard_dialog_tests) + add_test(NAME keyboard_dialog COMMAND keyboard_dialog_tests) + if(WIN32) + set_tests_properties(keyboard_dialog PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$;PATH=path_list_prepend:$") endif() endif() diff --git a/core/libs/prx/libSceKeyboard/Export.cpp b/core/libs/prx/libSceKeyboard/Export.cpp index fce1492046e5..75aecad6814f 100644 --- a/core/libs/prx/libSceKeyboard/Export.cpp +++ b/core/libs/prx/libSceKeyboard/Export.cpp @@ -1,9 +1,15 @@ +#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" extern "C" { +int APS5_VABI sceDbgKeyboardGetHandle() { + NotImplemented_nid_no_patch(__func__); +} + int APS5_VABI sceKeyboardInit(void) { return Keyboard::Initialize(); } @@ -132,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/Api.hpp b/core/libs/prx/libSceKeyboard/include/Api.hpp index a44cb9ca8365..e5eb2dffb019 100644 --- a/core/libs/prx/libSceKeyboard/include/Api.hpp +++ b/core/libs/prx/libSceKeyboard/include/Api.hpp @@ -8,6 +8,8 @@ struct KeyboardProcessFocus; extern "C" { +int APS5_VABI sceDbgKeyboardGetHandle(); + int APS5_VABI sceKeyboardInit(void); int APS5_VABI sceKeyboardOpen(int userId, int32_t type, int32_t index, const void* param); int APS5_VABI sceKeyboardClose(int32_t handle); diff --git a/core/libs/prx/libSceKeyboard/include/InventoryExports.hpp b/core/libs/prx/libSceKeyboard/include/InventoryExports.hpp new file mode 100644 index 000000000000..f681e3788036 --- /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 8ab2bf1b0d93..56ec04835246 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/libSceKeyboard/tests/KeyboardDialog.cpp b/core/libs/prx/libSceKeyboard/tests/KeyboardDialog.cpp new file mode 100644 index 000000000000..cad9b2d24f8c --- /dev/null +++ b/core/libs/prx/libSceKeyboard/tests/KeyboardDialog.cpp @@ -0,0 +1,76 @@ +#include "prx/libSceKeyboard/include/Api.hpp" +#include "prx/libSceKeyboard/include/keyboard_structs.h" +#include "prx/libSceKeyboard/include/KeyboardState.hpp" +#include "prx/libSceIme/include/ModalDialog.hpp" +#include "prx/libSceVideoOut/include/KeyboardInput.hpp" +#include "SDL_events.h" +#include "SDL_keyboard.h" + +#include +#include + +namespace { + +constexpr unsigned Window = 7; + +void Require(bool value, const char* what) { + if (value) return; + std::fprintf(stderr, "keyboard dialog: %s\n", what); + std::abort(); +} + +SDL_Event Key(Uint32 type, SDL_Scancode scancode) { + SDL_Event event{}; + event.type = type; + event.key.windowID = Window; + event.key.keysym.scancode = scancode; + return event; +} + +int Read(KeyboardData* data) { + return sceKeyboardRead(KEYBOARD_HANDLE, data, 16); +} + +void OpenDialog() { + ModalDialogRequest request; + request.message = u"Choose"; + request.buttons = {u"Yes", u"No"}; + Require(ModalDialogOpen_nid_postfix(request), "the dialog did not open"); +} + +} + +int main() { + KeyboardData data[16]{}; + Require(sceKeyboardInit() == KEYBOARD_OK, "init failed"); + Require(sceKeyboardOpen(1, 0, 0, nullptr) == KEYBOARD_HANDLE, "open failed"); + Require(Read(data) == 1, "the open state was not queued"); + KeyboardInput input; + ModalDialogSetPresenter_nid_postfix(true); + + input.HandleEvent(Key(SDL_KEYDOWN, SDL_SCANCODE_B), Window); + Require(Read(data) == 1 && data[0].key_code[0] == 0x05, "a key press did not reach the title without a dialog"); + OpenDialog(); + input.HandleEvent(Key(SDL_KEYUP, SDL_SCANCODE_B), Window); + Require(Read(data) == 1 && data[0].length == 1 && data[0].key_code[0] == 0, "the held key was not released when the dialog started taking keys"); + input.HandleEvent(Key(SDL_KEYDOWN, SDL_SCANCODE_A), Window); + input.HandleEvent(Key(SDL_KEYUP, SDL_SCANCODE_A), Window); + input.HandleEvent(Key(SDL_KEYDOWN, SDL_SCANCODE_RETURN), Window); + Require(Read(data) == 0, "a key press or release reached the title while a dialog was shown"); + ModalDialogClose_nid_postfix(); + input.HandleEvent(Key(SDL_KEYDOWN, SDL_SCANCODE_A), Window); + Require(Read(data) == 1 && data[0].key_code[0] == 0x04, "a key press did not reach the title after the dialog closed"); + input.HandleEvent(Key(SDL_KEYUP, SDL_SCANCODE_A), Window); + Require(Read(data) == 1 && data[0].key_code[0] == 0, "a key release did not reach the title after the dialog closed"); + ModalDialogReset_nid_postfix(); + + OpenDialog(); + input.HandleEvent(Key(SDL_KEYDOWN, SDL_SCANCODE_A), Window); + Require(Read(data) == 1 && data[0].length == 1 && data[0].key_code[0] == 0, "a dialog that starts taking keys on a key press did not reset them"); + Require(Read(data) == 0, "the key press itself reached the title"); + ModalDialogClose_nid_postfix(); + ModalDialogReset_nid_postfix(); + + ModalDialogSetPresenter_nid_postfix(false); + Require(sceKeyboardClose(KEYBOARD_HANDLE) == KEYBOARD_OK, "close failed"); +} diff --git a/core/libs/prx/libSceLibcInternal/CMakeLists.txt b/core/libs/prx/libSceLibcInternal/CMakeLists.txt index bd4246bfcc92..1520005e796a 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/Directory.cpp b/core/libs/prx/libSceLibcInternal/Directory.cpp index 9791b3cc4237..8c7739e53858 100644 --- a/core/libs/prx/libSceLibcInternal/Directory.cpp +++ b/core/libs/prx/libSceLibcInternal/Directory.cpp @@ -24,9 +24,8 @@ extern "C" void* APS5_VABI fdopendir_nid_postfix(int fd) { } extern "C" void* APS5_VABI __opendir2_nid_postfix(const char* name, int flags) { - constexpr int HideWhiteouts = 0x1; - constexpr int NoDuplicates = 0x2; - constexpr int Rewind = 0x4; - if ((flags & ~(HideWhiteouts | NoDuplicates | Rewind)) != 0) NotImplemented_nid_no_patch("__opendir2: flags other than DTF_HIDEW, DTF_NODUP and DTF_REWIND"); + constexpr int ReadAll = 0x8; + constexpr int SkipRead = 0x10; + if ((flags & (ReadAll | SkipRead)) != 0) return nullptr; return opendir_nid_postfix(name); } diff --git a/core/libs/prx/libSceLibcInternal/Export.cpp b/core/libs/prx/libSceLibcInternal/Export.cpp index 3e3c3c5bd05a..d1d2c114af4d 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 { @@ -102,6 +1000,50 @@ void RegisterThreadExitHook() { extern "C" { +int APS5_VABI sceLibcMspaceSetMallocCallback() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceLibcPafMspaceReportMemoryBlocks() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceLibcHeapSetAddressRangeCallback() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceLibcPafMspaceTrim() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceLibcHeapMutexCalloc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceLibcInternalSetMallocCallback() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceLibcHeapSetTraceMarker() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceLibcPafMspaceCheckMemoryBounds() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceLibcHeapUnsetTraceMarker() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceLibcHeapGetAddressRanges() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceLibcHeapMutexFree() { + NotImplemented_nid_no_patch(__func__); +} + int Need_sceLibcInternal_nid_postfix = 1; const char* APS5_VABI getprogname_nid_postfix() { diff --git a/core/libs/prx/libSceLibcInternal/InventoryExports.cpp b/core/libs/prx/libSceLibcInternal/InventoryExports.cpp new file mode 100644 index 000000000000..056e657d7031 --- /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/SignalList.cpp b/core/libs/prx/libSceLibcInternal/SignalList.cpp index e33acb01fea6..80e0d481a5f2 100644 --- a/core/libs/prx/libSceLibcInternal/SignalList.cpp +++ b/core/libs/prx/libSceLibcInternal/SignalList.cpp @@ -1,3 +1,32 @@ +/* Derived from FreeBSD lib/libc/gen/siglist.c (8c639945a445) */ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * 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 above 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. + * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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/libkernel/include/Api.hpp" #include "prx/libSceLibcInternal/include/Api.hpp" #include "prx/libc/include/general/VabiMacros.hpp" diff --git a/core/libs/prx/libSceLibcInternal/include/Api.hpp b/core/libs/prx/libSceLibcInternal/include/Api.hpp index 1d8dc1eacccc..83b9b2d89821 100644 --- a/core/libs/prx/libSceLibcInternal/include/Api.hpp +++ b/core/libs/prx/libSceLibcInternal/include/Api.hpp @@ -102,4 +102,17 @@ int APS5_VABI __std_init_once_begin_initialize_clr_nid_postfix(void** once, unsi int APS5_VABI __std_init_once_complete_clr_nid_postfix(void** once, unsigned long flags, void* context); [[noreturn]] void APS5_VABI __std_init_once_link_alternate_names_and_abort_nid_postfix(); +int APS5_VABI sceLibcMspaceSetMallocCallback(); +int APS5_VABI sceLibcPafMspaceReportMemoryBlocks(); +int APS5_VABI sceLibcHeapSetAddressRangeCallback(); +int APS5_VABI sceLibcPafMspaceTrim(); +int APS5_VABI sceLibcHeapMutexCalloc(); +int APS5_VABI sceLibcInternalSetMallocCallback(); +int APS5_VABI sceLibcHeapSetTraceMarker(); +int APS5_VABI sceLibcPafMspaceCheckMemoryBounds(); +int APS5_VABI sceLibcHeapUnsetTraceMarker(); +int APS5_VABI sceLibcHeapGetAddressRanges(); +int APS5_VABI sceLibcHeapMutexFree(); + + } diff --git a/core/libs/prx/libSceLibcInternal/include/InventoryExports.hpp b/core/libs/prx/libSceLibcInternal/include/InventoryExports.hpp new file mode 100644 index 000000000000..f513e0d2648b --- /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 7da0381b0110..5640c404c849 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 a6326e2602bc..f22572c2ed59 100644 --- a/core/libs/prx/libSceLibreSsl/CMakeLists.txt +++ b/core/libs/prx/libSceLibreSsl/CMakeLists.txt @@ -130,7 +130,7 @@ if(BUILD_TESTING) add_test_executable(guest_libressl_x509_store_context_tests ${LIBS_INCLUDE_DIR}/tests/GuestLibreSslX509StoreContext.cpp) target_include_directories(guest_libressl_x509_store_context_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(guest_libressl_x509_store_context_tests PRIVATE libSceLibreSsl) + target_link_libraries(guest_libressl_x509_store_context_tests PRIVATE libSceLibreSsl libc) configure_windows_unwind(guest_libressl_x509_store_context_tests) add_test(NAME guest_libressl_x509_store_context COMMAND guest_libressl_x509_store_context_tests) set_tests_properties(guest_libressl_x509_store_context PROPERTIES TIMEOUT 30) @@ -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,8 +223,9 @@ 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) configure_windows_unwind(guest_libressl_object_allocation_tests) add_test(NAME guest_libressl_object_allocation COMMAND guest_libressl_object_allocation_tests) @@ -267,6 +268,49 @@ if(BUILD_TESTING) endif() endif() +if(BUILD_TESTING AND ANYPS5_LIBRESSL_ORACLE) + include(ExternalProject) + set(libressl_reference_build "${CMAKE_BINARY_DIR}/libressl-reference-build") + set(libressl_reference_timestamp) + if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.24) + set(libressl_reference_timestamp DOWNLOAD_EXTRACT_TIMESTAMP ON) + endif() + ExternalProject_Add(libressl_reference + URL https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.5.4.tar.gz + URL_HASH SHA256=107a5b522fbb8318d4c3be668075e5e607296f0a9255d71674caa94571336efa + ${libressl_reference_timestamp} + PREFIX "${CMAKE_BINARY_DIR}/libressl-reference" + BINARY_DIR "${libressl_reference_build}" + CMAKE_ARGS + -DCMAKE_BUILD_TYPE=Release + -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} + -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM} + -DCMAKE_POLICY_VERSION_MINIMUM=3.5 + "-DCMAKE_C_FLAGS=-D_GNU_SOURCE -Wno-error=implicit-function-declaration -Wno-error=incompatible-pointer-types -Wno-error=int-conversion -Wno-error=implicit-int" + BUILD_COMMAND ${CMAKE_COMMAND} --build --target crypto ssl + INSTALL_COMMAND "" + BUILD_BYPRODUCTS "${libressl_reference_build}/crypto/libcrypto.a" "${libressl_reference_build}/ssl/libssl.a") + ExternalProject_Get_Property(libressl_reference SOURCE_DIR) + add_test_executable(guest_libressl_oracle_tests ${CMAKE_CURRENT_SOURCE_DIR}/tests/Oracle.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/OracleReference.cpp) + add_dependencies(guest_libressl_oracle_tests libressl_reference) + set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/tests/OracleReference.cpp PROPERTIES + INCLUDE_DIRECTORIES "${SOURCE_DIR}/include" + COMPILE_DEFINITIONS "WIN32_LEAN_AND_MEAN;NOCRYPT") + target_include_directories(guest_libressl_oracle_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_libressl_oracle_tests PRIVATE libSceLibreSsl libSceLibreSsl3 libc + "${libressl_reference_build}/ssl/libssl.a" "${libressl_reference_build}/crypto/libcrypto.a") + if(WIN32) + target_link_libraries(guest_libressl_oracle_tests PRIVATE ws2_32) + endif() + configure_windows_unwind(guest_libressl_oracle_tests) + add_test(NAME guest_libressl_oracle COMMAND guest_libressl_oracle_tests) + set_tests_properties(guest_libressl_oracle PROPERTIES TIMEOUT 30) + if(WIN32) + set_tests_properties(guest_libressl_oracle PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() + if(BUILD_TESTING) add_test_executable(guest_libressl_x509_lookup_tests ${CMAKE_CURRENT_SOURCE_DIR}/tests/X509Lookup.cpp) target_include_directories(guest_libressl_x509_lookup_tests PRIVATE ${LIBS_INCLUDE_DIR}) diff --git a/core/libs/prx/libSceLibreSsl/Export.cpp b/core/libs/prx/libSceLibreSsl/Export.cpp index 8823bff1c8c8..78d3b801d218 100644 --- a/core/libs/prx/libSceLibreSsl/Export.cpp +++ b/core/libs/prx/libSceLibreSsl/Export.cpp @@ -764,16 +764,6 @@ int APS5_VABI HMAC_Update_nid_postfix(void) { return 0; } -int APS5_VABI OBJ_cleanup_nid_postfix(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -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; @@ -884,10 +874,7 @@ int APS5_VABI PEM_write_bio_X509_nid_postfix(void) { return 0; } -int APS5_VABI PKCS12_PBE_add_nid_postfix(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} +void APS5_VABI PKCS12_PBE_add_nid_postfix(void) {} int APS5_VABI PKCS12_free_nid_postfix(void) { NotImplemented_nid_no_patch(__func__); @@ -1254,10 +1241,7 @@ int APS5_VABI SSL_library_init_nid_postfix(void) { return 0; } -int APS5_VABI SSL_load_error_strings_nid_postfix(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} +void APS5_VABI SSL_load_error_strings_nid_postfix(void) {} int APS5_VABI SSL_new_nid_postfix(void) { NotImplemented_nid_no_patch(__func__); @@ -1383,11 +1367,6 @@ int APS5_VABI UI_get_string_type_nid_postfix(void) { return 0; } -int APS5_VABI UI_set_result_nid_postfix(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI X509V3_EXT_print_nid_postfix(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -1443,16 +1422,6 @@ int APS5_VABI X509_NAME_print_ex_nid_postfix(void) { return 0; } -int APS5_VABI X509_STORE_CTX_get1_chain_nid_postfix(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI X509_STORE_CTX_get_ex_data_nid_postfix(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI X509_STORE_add_cert_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 387750ab27c0..7e8b8b4d1036 100644 --- a/core/libs/prx/libSceLibreSsl/include/Api.hpp +++ b/core/libs/prx/libSceLibreSsl/include/Api.hpp @@ -151,6 +151,34 @@ struct LibreSslUiMethod { UiPromptFunction constructPrompt; }; +struct LibreSslUi { + const LibreSslUiMethod* method; + void* strings; + void* userData; + LibreSslExData exData; + std::int32_t flags; +}; + +struct LibreSslUiString { + std::int32_t type; + const char* outputString; + std::int32_t inputFlags; + char* resultBuffer; + union { + struct { + std::int32_t resultMinimum; + std::int32_t resultMaximum; + const char* testBuffer; + } stringData; + struct { + const char* actionDescription; + const char* okCharacters; + const char* cancelCharacters; + } booleanData; + } data; + std::int32_t flags; +}; + struct LibreSslRsaMethod { const char* name; void* operations[8]; @@ -184,6 +212,14 @@ struct LibreSslRsa { void* mtBlinding; }; +struct LibreSslX509 { + void* certificateInfo; + void* signatureAlgorithm; + void* signature; + std::int32_t valid; + std::int32_t references; +}; + struct LibreSslX509StoreContext { void* store; int currentMethod; @@ -368,8 +404,8 @@ int APS5_VABI HMAC_Final_nid_postfix(void); 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); -int APS5_VABI OBJ_cleanup_nid_postfix(void); -int APS5_VABI OBJ_create_nid_postfix(void); +void APS5_VABI OBJ_cleanup_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); @@ -395,7 +431,7 @@ int APS5_VABI PEM_read_bio_PrivateKey_nid_postfix(void); int APS5_VABI PEM_read_bio_X509_nid_postfix(void); int APS5_VABI PEM_read_bio_X509_AUX_nid_postfix(void); int APS5_VABI PEM_write_bio_X509_nid_postfix(void); -int APS5_VABI PKCS12_PBE_add_nid_postfix(void); +void APS5_VABI PKCS12_PBE_add_nid_postfix(void); int APS5_VABI PKCS12_free_nid_postfix(void); int APS5_VABI PKCS12_parse_nid_postfix(void); int APS5_VABI RSA_flags_nid_postfix(const LibreSslRsa* rsa); @@ -478,7 +514,7 @@ int APS5_VABI SSL_get_shutdown_nid_postfix(void); int APS5_VABI SSL_get_verify_result_nid_postfix(void); int APS5_VABI SSL_get_wbio_nid_postfix(void); int APS5_VABI SSL_library_init_nid_postfix(void); -int APS5_VABI SSL_load_error_strings_nid_postfix(void); +void APS5_VABI SSL_load_error_strings_nid_postfix(void); int APS5_VABI SSL_new_nid_postfix(void); int APS5_VABI SSL_peek_nid_postfix(void); int APS5_VABI SSL_pending_nid_postfix(void); @@ -515,7 +551,7 @@ int APS5_VABI UI_method_set_closer_nid_postfix(LibreSslUiMethod* method, UiSessi int APS5_VABI UI_method_set_opener_nid_postfix(LibreSslUiMethod* method, UiSessionFunction opener); int APS5_VABI UI_method_set_reader_nid_postfix(LibreSslUiMethod* method, UiStringFunction reader); int APS5_VABI UI_method_set_writer_nid_postfix(LibreSslUiMethod* method, UiStringFunction writer); -int APS5_VABI UI_set_result_nid_postfix(void); +int APS5_VABI UI_set_result_nid_postfix(LibreSslUi* ui, LibreSslUiString* string, const char* result); int APS5_VABI X509V3_EXT_print_nid_postfix(void); int APS5_VABI X509_EXTENSION_get_critical_nid_postfix(void); int APS5_VABI X509_EXTENSION_get_data_nid_postfix(void); @@ -528,12 +564,12 @@ int APS5_VABI X509_NAME_get_index_by_NID_nid_postfix(void); int APS5_VABI X509_NAME_get_text_by_NID_nid_postfix(void); int APS5_VABI X509_NAME_oneline_nid_postfix(void); int APS5_VABI X509_NAME_print_ex_nid_postfix(void); -int APS5_VABI X509_STORE_CTX_get1_chain_nid_postfix(void); +LibreSslStack* APS5_VABI X509_STORE_CTX_get1_chain_nid_postfix(LibreSslX509StoreContext* context); void* APS5_VABI X509_STORE_CTX_get_chain_nid_postfix(LibreSslX509StoreContext* context); void* APS5_VABI X509_STORE_CTX_get_current_cert_nid_postfix(LibreSslX509StoreContext* context); int APS5_VABI X509_STORE_CTX_get_error_nid_postfix(LibreSslX509StoreContext* context); int APS5_VABI X509_STORE_CTX_get_error_depth_nid_postfix(LibreSslX509StoreContext* context); -int APS5_VABI X509_STORE_CTX_get_ex_data_nid_postfix(void); +void* APS5_VABI X509_STORE_CTX_get_ex_data_nid_postfix(LibreSslX509StoreContext* context, int index); void APS5_VABI X509_STORE_CTX_set_error_nid_postfix(LibreSslX509StoreContext* context, int error); int APS5_VABI X509_STORE_add_cert_nid_postfix(void); int APS5_VABI X509_STORE_add_crl_nid_postfix(void); diff --git a/core/libs/prx/libSceLibreSsl/include/ObjectTable.hpp b/core/libs/prx/libSceLibreSsl/include/ObjectTable.hpp index fa770930f39b..fa072b150852 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 000000000000..bac2635cf57a --- /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 3d954047acdb..2125a23b7281 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 537988df7218..8781b9db2143 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/src/Ui.cpp b/core/libs/prx/libSceLibreSsl/src/Ui.cpp index 1cbbcdc084f1..941eb2a6592e 100644 --- a/core/libs/prx/libSceLibreSsl/src/Ui.cpp +++ b/core/libs/prx/libSceLibreSsl/src/Ui.cpp @@ -1,4 +1,5 @@ #include "prx/libSceLibreSsl/include/Api.hpp" +#include "prx/libSceLibreSsl/include/Error.hpp" #include "prx/libc/include/Api.hpp" #include #include @@ -7,6 +8,33 @@ #include "prx/libc/include/General.hpp" static_assert(sizeof(LibreSslUiMethod) == 56); +static_assert(sizeof(LibreSslUi) == 40); +static_assert(offsetof(LibreSslUi, flags) == 32); +static_assert(sizeof(LibreSslUiString) == 64); +static_assert(offsetof(LibreSslUiString, resultBuffer) == 24); +static_assert(offsetof(LibreSslUiString, data) == 32); +static_assert(offsetof(LibreSslUiString, flags) == 56); + +namespace { +constexpr int UiLibrary = 40; +constexpr int AnyFunction = 0xfff; +constexpr int ResultTooLarge = 100; +constexpr int ResultTooSmall = 101; +constexpr int NoResultBuffer = 105; +constexpr std::int32_t Redoable = 0x0001; +constexpr std::int32_t PromptString = 1; +constexpr std::int32_t VerifyString = 2; +constexpr std::int32_t BooleanString = 3; + +void PutError(int reason) { + LibreSslPutError_nid_no_patch(UiLibrary, AnyFunction, reason); +} + +const char* Characters(const char* characters, const char* function) { + if (!characters) throw std::invalid_argument(std::string(function) + ": null boolean characters"); + return characters; +} +} extern "C" { LibreSslUiMethod* APS5_VABI UI_create_method_nid_postfix(char* name) { @@ -68,4 +96,55 @@ UiSessionFunction APS5_VABI UI_method_get_closer_nid_postfix(const LibreSslUiMet return method ? method->closeSession : nullptr; } +int APS5_VABI UI_set_result_nid_postfix(LibreSslUi* ui, LibreSslUiString* string, const char* result) { + if (!result) throw std::invalid_argument(std::string(__func__) + ": null result"); + if (!ui) throw std::invalid_argument(std::string(__func__) + ": null UI"); + const auto length = static_cast(std::strlen(result)); + ui->flags &= ~Redoable; + if (!string) return -1; + switch (string->type) { + case PromptString: + case VerifyString: + if (length < string->data.stringData.resultMinimum) { + ui->flags |= Redoable; + PutError(ResultTooSmall); + return -1; + } + if (length > string->data.stringData.resultMaximum) { + ui->flags |= Redoable; + PutError(ResultTooLarge); + return -1; + } + if (!string->resultBuffer) { + PutError(NoResultBuffer); + return -1; + } + std::memcpy(string->resultBuffer, result, static_cast(length) + 1); + break; + case BooleanString: { + if (!string->resultBuffer) { + PutError(NoResultBuffer); + return -1; + } + string->resultBuffer[0] = '\0'; + for (const char* character = result; *character; ++character) { + const char* const accepted = Characters(string->data.booleanData.okCharacters, __func__); + if (std::strchr(accepted, *character)) { + string->resultBuffer[0] = accepted[0]; + break; + } + const char* const cancelled = Characters(string->data.booleanData.cancelCharacters, __func__); + if (std::strchr(cancelled, *character)) { + string->resultBuffer[0] = cancelled[0]; + break; + } + } + break; + } + default: + break; + } + return 0; +} + } diff --git a/core/libs/prx/libSceLibreSsl/src/X509StoreContext.cpp b/core/libs/prx/libSceLibreSsl/src/X509StoreContext.cpp index e028e86c4e21..a30deb4f59db 100644 --- a/core/libs/prx/libSceLibreSsl/src/X509StoreContext.cpp +++ b/core/libs/prx/libSceLibreSsl/src/X509StoreContext.cpp @@ -1,5 +1,9 @@ #include "prx/libSceLibreSsl/include/Api.hpp" +#include "prx/libc/include/Api.hpp" +#include #include +#include +#include #include #include #include "prx/libc/include/General.hpp" @@ -10,6 +14,7 @@ static_assert(offsetof(LibreSslX509StoreContext, errorDepth) == 180); static_assert(offsetof(LibreSslX509StoreContext, error) == 184); static_assert(offsetof(LibreSslX509StoreContext, currentCert) == 192); static_assert(offsetof(LibreSslX509StoreContext, exData) == 232); +static_assert(offsetof(LibreSslX509, references) == 28); namespace { @@ -18,6 +23,40 @@ LibreSslX509StoreContext* Context(LibreSslX509StoreContext* context, const char* return context; } +constexpr int MinimumNodes = 4; + +void FreeStack(LibreSslStack* stack) { + free_nid_postfix(stack->data); + free_nid_postfix(stack); +} + +LibreSslStack* Duplicate(const LibreSslStack* source) { + auto* const stack = static_cast(malloc_nid_postfix(sizeof(LibreSslStack))); + if (!stack) return nullptr; + stack->data = static_cast(malloc_nid_postfix(MinimumNodes * sizeof(char*))); + if (!stack->data) { + free_nid_postfix(stack); + return nullptr; + } + for (int index = 0; index < MinimumNodes; ++index) stack->data[index] = nullptr; + stack->comp = source->comp; + stack->numAlloc = MinimumNodes; + stack->num = 0; + stack->sorted = 0; + auto* const data = static_cast(realloc_nid_postfix(stack->data, static_cast(source->numAlloc) * sizeof(char*))); + if (!data) { + FreeStack(stack); + return nullptr; + } + stack->data = data; + stack->num = source->num; + if (source->num > 0) std::memcpy(stack->data, source->data, sizeof(char*) * static_cast(source->num)); + stack->sorted = source->sorted; + stack->numAlloc = source->numAlloc; + stack->comp = source->comp; + return stack; +} + } extern "C" { @@ -42,4 +81,26 @@ void* APS5_VABI X509_STORE_CTX_get_chain_nid_postfix(LibreSslX509StoreContext* c return Context(context, __func__)->chain; } +void* APS5_VABI X509_STORE_CTX_get_ex_data_nid_postfix(LibreSslX509StoreContext* context, int index) { + const auto* const data = static_cast(Context(context, __func__)->exData); + if (!data || index >= sk_num_nid_postfix(data)) return nullptr; + return sk_value_nid_postfix(data, index); +} + +LibreSslStack* APS5_VABI X509_STORE_CTX_get1_chain_nid_postfix(LibreSslX509StoreContext* context) { + const auto* const chain = static_cast(Context(context, __func__)->chain); + if (!chain) return nullptr; + if (chain->num < 0 || chain->num > chain->numAlloc || (chain->num > 0 && !chain->data)) throw std::invalid_argument(std::string(__func__) + ": malformed chain stack"); + for (int index = 0; index < chain->num; ++index) { + if (!chain->data[index]) throw std::invalid_argument(std::string(__func__) + ": null certificate in the chain"); + } + auto* const copy = Duplicate(chain); + if (!copy) return nullptr; + for (int index = 0; index < copy->num; ++index) { + auto* const certificate = reinterpret_cast(copy->data[index]); + std::atomic_ref(certificate->references).fetch_add(1); + } + return copy; +} + } diff --git a/core/libs/prx/libSceLibreSsl/tests/ObjectText.cpp b/core/libs/prx/libSceLibreSsl/tests/ObjectText.cpp index b0f93aa42714..cfabef2fc475 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 d18cd76455d3..6605e2d39556 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 new file mode 100644 index 000000000000..187eabe5972f --- /dev/null +++ b/core/libs/prx/libSceLibreSsl/tests/Oracle.cpp @@ -0,0 +1,421 @@ +#include "prx/libSceLibreSsl/include/Api.hpp" +#include "prx/libSceLibreSsl3/include/Api.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace LibreSslReference { +std::size_t AesKeySize(); +int AesSetEncryptKey(const unsigned char* userKey, int bits, void* key); +int AesSetDecryptKey(const unsigned char* userKey, int bits, void* key); +void AesEncrypt(const unsigned char* in, unsigned char* out, const void* key); +void AesDecrypt(const unsigned char* in, unsigned char* out, const void* key); +void AesEcb(const unsigned char* in, unsigned char* out, const void* key, int encrypt); +void AesCfb128(const unsigned char* in, unsigned char* out, std::size_t length, const void* key, unsigned char* ivec, int* num, int encrypt); +void AesCtr128(const unsigned char* in, unsigned char* out, std::size_t length, const void* key, unsigned char* ivec, unsigned char* counter, unsigned* num); +std::size_t DigestContextSize(int kind); +int DigestInit(int kind, void* context); +int DigestUpdate(int kind, void* context, const void* data, std::size_t length); +int DigestFinal(int kind, unsigned char* digest, void* context); +unsigned char* Sha256(const unsigned char* data, std::size_t length, unsigned char* digest); +unsigned char* Md5(const unsigned char* data, std::size_t length, unsigned char* digest); +unsigned char* Sha1(const unsigned char* data, std::size_t length, unsigned char* digest); +void DesSetOddParity(unsigned char* key); +const char* X509VerifyCertErrorString(long error); +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 { + +struct Count { + long cases = 0; + long differing = 0; + std::vector samples; +}; + +std::map counts; +std::mt19937_64 generator(0x5eed); + +void Record(const std::string& function, bool same, const std::function& detail) { + auto& count = counts[function]; + ++count.cases; + if (same) return; + ++count.differing; + if (count.samples.size() < 4) count.samples.push_back(detail()); +} + +std::vector Bytes(std::size_t size) { + std::vector bytes(size); + for (auto& byte : bytes) byte = static_cast(generator()); + return bytes; +} + +std::string Hex(const void* data, std::size_t size) { + static constexpr char digits[] = "0123456789abcdef"; + std::string text; + const auto* bytes = static_cast(data); + for (std::size_t i = 0; i < size; ++i) { + text += digits[bytes[i] >> 4]; + text += digits[bytes[i] & 15]; + } + return text; +} + +std::string Quoted(const char* text) { return text ? std::string("\"") + text + "\"" : std::string("null"); } + +std::string Attempt(const std::function& action) { + try { + action(); + return {}; + } catch (const std::exception& error) { + return std::string("threw: ") + error.what(); + } +} + +void CompareAesKeys() { + Record("AesKey size", sizeof(AesKey) == LibreSslReference::AesKeySize(), [] { return std::to_string(sizeof(AesKey)) + " vs " + std::to_string(LibreSslReference::AesKeySize()); }); + for (const int bits : {128, 192, 256, 0, 64, 127, 129, 255, 257, 512, -128}) { + const auto userKey = Bytes(64); + for (const bool decrypt : {false, true}) { + AesKey mine; + AesKey theirs; + std::memset(&mine, 0xa5, sizeof mine); + std::memset(&theirs, 0xa5, sizeof theirs); + int mineResult = 0; + const auto error = Attempt([&] { mineResult = decrypt ? AES_set_decrypt_key_nid_postfix(userKey.data(), bits, &mine) : AES_set_encrypt_key_nid_postfix(userKey.data(), bits, &mine); }); + const int theirResult = decrypt ? LibreSslReference::AesSetDecryptKey(userKey.data(), bits, &theirs) : LibreSslReference::AesSetEncryptKey(userKey.data(), bits, &theirs); + Record(decrypt ? "AES_set_decrypt_key" : "AES_set_encrypt_key", error.empty() && mineResult == theirResult && std::memcmp(&mine, &theirs, sizeof mine) == 0, + [&] { return "bits " + std::to_string(bits) + ": " + (error.empty() ? std::to_string(mineResult) : error) + " vs " + std::to_string(theirResult); }); + } + } + for (const int bits : {128, 192, 256}) { + for (const bool decrypt : {false, true}) { + const auto userKey = Bytes(32); + AesKey key; + int mineResult = 0; + auto error = Attempt([&] { mineResult = decrypt ? AES_set_decrypt_key_nid_postfix(nullptr, bits, &key) : AES_set_encrypt_key_nid_postfix(nullptr, bits, &key); }); + int theirResult = decrypt ? LibreSslReference::AesSetDecryptKey(nullptr, bits, &key) : LibreSslReference::AesSetEncryptKey(nullptr, bits, &key); + Record(decrypt ? "AES_set_decrypt_key" : "AES_set_encrypt_key", error.empty() && mineResult == theirResult, [&] { return "null key: " + (error.empty() ? std::to_string(mineResult) : error) + " vs " + std::to_string(theirResult); }); + error = Attempt([&] { mineResult = decrypt ? AES_set_decrypt_key_nid_postfix(userKey.data(), bits, nullptr) : AES_set_encrypt_key_nid_postfix(userKey.data(), bits, nullptr); }); + theirResult = decrypt ? LibreSslReference::AesSetDecryptKey(userKey.data(), bits, nullptr) : LibreSslReference::AesSetEncryptKey(userKey.data(), bits, nullptr); + Record(decrypt ? "AES_set_decrypt_key" : "AES_set_encrypt_key", error.empty() && mineResult == theirResult, [&] { return "null schedule: " + (error.empty() ? std::to_string(mineResult) : error) + " vs " + std::to_string(theirResult); }); + } + } +} + +void CompareAesModes() { + for (int round = 0; round < 1500; ++round) { + const int bits = 128 + 64 * (round % 3); + const auto userKey = Bytes(32); + AesKey mineEncrypt; + AesKey mineDecrypt; + AesKey theirEncrypt; + AesKey theirDecrypt; + AES_set_encrypt_key_nid_postfix(userKey.data(), bits, &mineEncrypt); + AES_set_decrypt_key_nid_postfix(userKey.data(), bits, &mineDecrypt); + LibreSslReference::AesSetEncryptKey(userKey.data(), bits, &theirEncrypt); + LibreSslReference::AesSetDecryptKey(userKey.data(), bits, &theirDecrypt); + const auto block = Bytes(16); + unsigned char mine[16]; + unsigned char theirs[16]; + AES_encrypt_nid_postfix(block.data(), mine, &mineEncrypt); + LibreSslReference::AesEncrypt(block.data(), theirs, &theirEncrypt); + Record("AES_encrypt", std::memcmp(mine, theirs, 16) == 0, [&] { return Hex(mine, 16) + " vs " + Hex(theirs, 16); }); + AES_decrypt_nid_postfix(block.data(), mine, &mineDecrypt); + LibreSslReference::AesDecrypt(block.data(), theirs, &theirDecrypt); + Record("AES_decrypt", std::memcmp(mine, theirs, 16) == 0, [&] { return Hex(mine, 16) + " vs " + Hex(theirs, 16); }); + for (const int encrypt : {0, 1}) { + AES_ecb_encrypt_nid_postfix(block.data(), mine, encrypt ? &mineEncrypt : &mineDecrypt, encrypt); + LibreSslReference::AesEcb(block.data(), theirs, encrypt ? &theirEncrypt : &theirDecrypt, encrypt); + Record("AES_ecb_encrypt", std::memcmp(mine, theirs, 16) == 0, [&] { return Hex(mine, 16) + " vs " + Hex(theirs, 16); }); + + auto mineIvec = Bytes(16); + auto theirIvec = mineIvec; + int mineNum = static_cast(generator() % 16); + int theirNum = mineNum; + const std::size_t length = generator() % 200; + const auto input = Bytes(length); + std::vector mineOut(length + 1); + std::vector theirOut(length + 1); + for (std::size_t done = 0; done < length;) { + const std::size_t chunk = std::min(length - done, generator() % 40); + AES_cfb128_encrypt_nid_postfix(input.data() + done, mineOut.data() + done, chunk, &mineEncrypt, mineIvec.data(), &mineNum, encrypt); + LibreSslReference::AesCfb128(input.data() + done, theirOut.data() + done, chunk, &theirEncrypt, theirIvec.data(), &theirNum, encrypt); + done += chunk; + } + Record("AES_cfb128_encrypt", mineOut == theirOut && mineIvec == theirIvec && mineNum == theirNum, [&] { return "length " + std::to_string(length) + " num " + std::to_string(mineNum) + " vs " + std::to_string(theirNum); }); + } + auto mineIvec = Bytes(16); + if (round % 7 == 0) std::fill(mineIvec.begin() + 8, mineIvec.end(), 0xff); + auto theirIvec = mineIvec; + unsigned char mineCounter[16] = {}; + unsigned char theirCounter[16] = {}; + unsigned mineNum = 0; + unsigned theirNum = 0; + if (round % 2) { + const auto counter = Bytes(16); + std::memcpy(mineCounter, counter.data(), 16); + std::memcpy(theirCounter, counter.data(), 16); + mineNum = theirNum = static_cast(generator() % 16); + } + const std::size_t length = generator() % 300; + const auto input = Bytes(length); + std::vector mineOut(length + 1); + std::vector theirOut(length + 1); + for (std::size_t done = 0; done < length;) { + const std::size_t chunk = std::min(length - done, generator() % 50); + AES_ctr128_encrypt_nid_postfix(input.data() + done, mineOut.data() + done, chunk, &mineEncrypt, mineIvec.data(), mineCounter, &mineNum); + LibreSslReference::AesCtr128(input.data() + done, theirOut.data() + done, chunk, &theirEncrypt, theirIvec.data(), theirCounter, &theirNum); + done += chunk; + } + Record("AES_ctr128_encrypt", mineOut == theirOut && mineIvec == theirIvec && mineNum == theirNum && std::memcmp(mineCounter, theirCounter, 16) == 0, + [&] { return "length " + std::to_string(length) + " ivec " + Hex(mineIvec.data(), 16) + " vs " + Hex(theirIvec.data(), 16); }); + } +} + +struct Digest { + const char* name; + std::size_t length; + std::size_t contextSize; + std::function init; + std::function update; + std::function final; +}; + +bool SameContext(int kind, const std::vector& mine, const std::vector& theirs) { + if (kind < 5) return mine == theirs; + const auto num = offsetof(Sha512Context, num); + const auto data = offsetof(Sha512Context, data); + std::uint32_t used = 0; + std::memcpy(&used, theirs.data() + num, sizeof used); + const std::size_t end = data + std::min(used, sizeof(Sha512Context::data)); + return std::memcmp(mine.data(), theirs.data(), end) == 0 && std::memcmp(mine.data() + num, theirs.data() + num, mine.size() - num) == 0; +} + +void CompareDigests() { + const Digest digests[] = { + {"MD4", 16, sizeof(Md4Context), [](void* c) { return MD4_Init_nid_postfix(static_cast(c)); }, [](void* c, const void* d, std::size_t n) { return MD4_Update_nid_postfix(static_cast(c), d, n); }, [](unsigned char* m, void* c) { return MD4_Final_nid_postfix(m, static_cast(c)); }}, + {"MD5", 16, sizeof(Md5Context), [](void* c) { return MD5_Init_nid_postfix(static_cast(c)); }, [](void* c, const void* d, std::size_t n) { return MD5_Update_nid_postfix(static_cast(c), d, n); }, [](unsigned char* m, void* c) { return MD5_Final_nid_postfix(m, static_cast(c)); }}, + {"SHA1", 20, sizeof(Sha1Context), [](void* c) { return SHA1_Init_nid_postfix(static_cast(c)); }, [](void* c, const void* d, std::size_t n) { return SHA1_Update_nid_postfix(static_cast(c), d, n); }, [](unsigned char* m, void* c) { return SHA1_Final_nid_postfix(m, static_cast(c)); }}, + {"SHA224", 28, sizeof(Sha256Context), [](void* c) { return SHA224_Init_nid_postfix(static_cast(c)); }, [](void* c, const void* d, std::size_t n) { return SHA224_Update_nid_postfix(static_cast(c), d, n); }, [](unsigned char* m, void* c) { return SHA224_Final_nid_postfix(m, static_cast(c)); }}, + {"SHA256", 32, sizeof(Sha256Context), [](void* c) { return SHA256_Init_nid_postfix(static_cast(c)); }, [](void* c, const void* d, std::size_t n) { return SHA256_Update_nid_postfix(static_cast(c), d, n); }, [](unsigned char* m, void* c) { return SHA256_Final_nid_postfix(m, static_cast(c)); }}, + {"SHA384", 48, sizeof(Sha512Context), [](void* c) { return SHA384_Init_nid_postfix(static_cast(c)); }, [](void* c, const void* d, std::size_t n) { return SHA384_Update_nid_postfix(static_cast(c), d, n); }, [](unsigned char* m, void* c) { return SHA384_Final_nid_postfix(m, static_cast(c)); }}, + {"SHA512", 64, sizeof(Sha512Context), [](void* c) { return SHA512_Init_nid_postfix(static_cast(c)); }, [](void* c, const void* d, std::size_t n) { return SHA512_Update_nid_postfix(static_cast(c), d, n); }, [](unsigned char* m, void* c) { return SHA512_Final_nid_postfix(m, static_cast(c)); }}, + }; + for (int kind = 0; kind < 7; ++kind) { + const auto& digest = digests[kind]; + const std::string name = digest.name; + Record(name + " context size", digest.contextSize == LibreSslReference::DigestContextSize(kind), [&] { return std::to_string(digest.contextSize) + " vs " + std::to_string(LibreSslReference::DigestContextSize(kind)); }); + for (int round = 0; round < 600; ++round) { + std::vector mine(digest.contextSize, 0xa5); + std::vector theirs(digest.contextSize, 0xa5); + int mineResult = 0; + const auto error = Attempt([&] { mineResult = digest.init(mine.data()); }); + int theirResult = LibreSslReference::DigestInit(kind, theirs.data()); + Record(name + "_Init", error.empty() && mineResult == theirResult && SameContext(kind, mine, theirs), [&] { return (error.empty() ? std::to_string(mineResult) : error) + " vs " + std::to_string(theirResult) + " context " + Hex(mine.data(), 32) + " vs " + Hex(theirs.data(), 32); }); + if (!error.empty()) continue; + const std::size_t length = round < 300 ? static_cast(round) : generator() % 5000; + const auto input = Bytes(length); + bool same = true; + std::string first; + for (std::size_t done = 0; done <= length;) { + const std::size_t chunk = done == length ? 0 : std::min(length - done, generator() % 300 + (generator() % 4 ? 1 : 0)); + mineResult = digest.update(mine.data(), input.data() + done, chunk); + theirResult = LibreSslReference::DigestUpdate(kind, theirs.data(), input.data() + done, chunk); + done += chunk; + if (same && (mineResult != theirResult || !SameContext(kind, mine, theirs))) { + same = false; + first = "after " + std::to_string(done) + " of " + std::to_string(length) + " bytes"; + } + if (chunk == 0 && done == length) break; + } + Record(name + "_Update", same, [&] { return first; }); + unsigned char mineDigest[64]; + unsigned char theirDigest[64]; + mineResult = digest.final(mineDigest, mine.data()); + theirResult = LibreSslReference::DigestFinal(kind, theirDigest, theirs.data()); + Record(name + "_Final", mineResult == theirResult && std::memcmp(mineDigest, theirDigest, digest.length) == 0 && mine == theirs, [&] { return "length " + std::to_string(length) + " " + Hex(mineDigest, digest.length) + " vs " + Hex(theirDigest, digest.length); }); + } + } + for (int round = 0; round < 300; ++round) { + const auto input = Bytes(round < 150 ? static_cast(round) : generator() % 4000); + unsigned char mine[64]; + unsigned char theirs[64]; + SHA256_nid_postfix(input.data(), input.size(), mine); + LibreSslReference::Sha256(input.data(), input.size(), theirs); + Record("SHA256", std::memcmp(mine, theirs, 32) == 0, [&] { return Hex(mine, 32) + " vs " + Hex(theirs, 32); }); + MD5_nid_postfix(input.data(), input.size(), mine); + LibreSslReference::Md5(input.data(), input.size(), theirs); + Record("MD5 (libSceLibreSsl3)", std::memcmp(mine, theirs, 16) == 0, [&] { return Hex(mine, 16) + " vs " + Hex(theirs, 16); }); + SHA1_nid_postfix(input.data(), input.size(), mine); + LibreSslReference::Sha1(input.data(), input.size(), theirs); + Record("SHA1 (libSceLibreSsl3)", std::memcmp(mine, theirs, 20) == 0, [&] { return Hex(mine, 20) + " vs " + Hex(theirs, 20); }); + } +} + +void CompareDesParity() { + for (int value = 0; value < 256; ++value) { + for (int at = 0; at < 8; ++at) { + auto mine = Bytes(8); + mine[at] = static_cast(value); + auto theirs = mine; + DES_set_odd_parity_nid_postfix(mine.data()); + LibreSslReference::DesSetOddParity(theirs.data()); + Record("DES_set_odd_parity", mine == theirs, [&] { return Hex(mine.data(), 8) + " vs " + Hex(theirs.data(), 8); }); + } + } +} + +void CompareStrings(const char* function, const std::vector& values, const std::function& mine, const std::function& theirs) { + for (const long value : values) { + const char* mineText = nullptr; + const auto error = Attempt([&] { mineText = mine(value); }); + const char* theirText = theirs(value); + const bool same = error.empty() && (mineText == nullptr) == (theirText == nullptr) && (mineText == nullptr || std::strcmp(mineText, theirText) == 0); + Record(function, same, [&] { return std::to_string(value) + ": " + (error.empty() ? Quoted(mineText) : error) + " vs " + Quoted(theirText); }); + } +} + +std::vector Range(long first, long last, std::initializer_list extra = {}) { + std::vector values; + for (long value = first; value <= last; ++value) values.push_back(value); + values.insert(values.end(), extra); + return values; +} + +void CompareStrings() { + CompareStrings("X509_verify_cert_error_string", Range(-3, 120, {1000, 0x7fffffff, -0x7fffffff - 1}), [](long v) { return X509_verify_cert_error_string_nid_postfix(v); }, LibreSslReference::X509VerifyCertErrorString); + CompareStrings("SSL_alert_desc_string_long", Range(-2, 260), [](long v) { return SSL_alert_desc_string_long_nid_postfix(static_cast(v)); }, [](long v) { return LibreSslReference::SslAlertDescStringLong(static_cast(v)); }); + CompareStrings("OCSP_cert_status_str", Range(-2, 8), [](long v) { return OCSP_cert_status_str_nid_postfix(v); }, LibreSslReference::OcspCertStatusString); + CompareStrings("OCSP_crl_reason_str", Range(-2, 14), [](long v) { return OCSP_crl_reason_str_nid_postfix(v); }, LibreSslReference::OcspCrlReasonString); + 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() { + CompareAesKeys(); + CompareAesModes(); + CompareDigests(); + CompareDesParity(); + CompareStrings(); + CompareCreatedObjects(); + long cases = 0; + long differing = 0; + for (const auto& [function, count] : counts) { + cases += count.cases; + differing += count.differing; + std::printf("%-36s %6ld cases %6ld differ\n", function.c_str(), count.cases, count.differing); + for (const auto& sample : count.samples) std::printf(" %s\n", sample.c_str()); + } + std::printf("LibreSSL 2.5.4 oracle: %ld cases, %ld differ\n", cases, differing); + return differing == 0 ? 0 : 1; +} diff --git a/core/libs/prx/libSceLibreSsl/tests/OracleReference.cpp b/core/libs/prx/libSceLibreSsl/tests/OracleReference.cpp new file mode 100644 index 000000000000..4759b2cdece3 --- /dev/null +++ b/core/libs/prx/libSceLibreSsl/tests/OracleReference.cpp @@ -0,0 +1,88 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace LibreSslReference { + +std::size_t AesKeySize() { return sizeof(AES_KEY); } +int AesSetEncryptKey(const unsigned char* userKey, int bits, void* key) { return AES_set_encrypt_key(userKey, bits, static_cast(key)); } +int AesSetDecryptKey(const unsigned char* userKey, int bits, void* key) { return AES_set_decrypt_key(userKey, bits, static_cast(key)); } +void AesEncrypt(const unsigned char* in, unsigned char* out, const void* key) { AES_encrypt(in, out, static_cast(key)); } +void AesDecrypt(const unsigned char* in, unsigned char* out, const void* key) { AES_decrypt(in, out, static_cast(key)); } +void AesEcb(const unsigned char* in, unsigned char* out, const void* key, int encrypt) { AES_ecb_encrypt(in, out, static_cast(key), encrypt); } +void AesCfb128(const unsigned char* in, unsigned char* out, std::size_t length, const void* key, unsigned char* ivec, int* num, int encrypt) { AES_cfb128_encrypt(in, out, length, static_cast(key), ivec, num, encrypt); } +void AesCtr128(const unsigned char* in, unsigned char* out, std::size_t length, const void* key, unsigned char* ivec, unsigned char* counter, unsigned* num) { AES_ctr128_encrypt(in, out, length, static_cast(key), ivec, counter, num); } + +std::size_t DigestContextSize(int kind) { + switch (kind) { + case 0: return sizeof(MD4_CTX); + case 1: return sizeof(MD5_CTX); + case 2: return sizeof(SHA_CTX); + case 3: + case 4: return sizeof(SHA256_CTX); + default: return sizeof(SHA512_CTX); + } +} + +int DigestInit(int kind, void* context) { + switch (kind) { + case 0: return MD4_Init(static_cast(context)); + case 1: return MD5_Init(static_cast(context)); + case 2: return SHA1_Init(static_cast(context)); + case 3: return SHA224_Init(static_cast(context)); + case 4: return SHA256_Init(static_cast(context)); + case 5: return SHA384_Init(static_cast(context)); + default: return SHA512_Init(static_cast(context)); + } +} + +int DigestUpdate(int kind, void* context, const void* data, std::size_t length) { + switch (kind) { + case 0: return MD4_Update(static_cast(context), data, length); + case 1: return MD5_Update(static_cast(context), data, length); + case 2: return SHA1_Update(static_cast(context), data, length); + case 3: return SHA224_Update(static_cast(context), data, length); + case 4: return SHA256_Update(static_cast(context), data, length); + case 5: return SHA384_Update(static_cast(context), data, length); + default: return SHA512_Update(static_cast(context), data, length); + } +} + +int DigestFinal(int kind, unsigned char* digest, void* context) { + switch (kind) { + case 0: return MD4_Final(digest, static_cast(context)); + case 1: return MD5_Final(digest, static_cast(context)); + case 2: return SHA1_Final(digest, static_cast(context)); + case 3: return SHA224_Final(digest, static_cast(context)); + case 4: return SHA256_Final(digest, static_cast(context)); + case 5: return SHA384_Final(digest, static_cast(context)); + default: return SHA512_Final(digest, static_cast(context)); + } +} + +unsigned char* Sha256(const unsigned char* data, std::size_t length, unsigned char* digest) { return SHA256(data, length, digest); } +unsigned char* Md5(const unsigned char* data, std::size_t length, unsigned char* digest) { return MD5(data, length, digest); } +unsigned char* Sha1(const unsigned char* data, std::size_t length, unsigned char* digest) { return SHA1(data, length, digest); } + +void DesSetOddParity(unsigned char* key) { DES_set_odd_parity(reinterpret_cast(key)); } + +const char* X509VerifyCertErrorString(long error) { return X509_verify_cert_error_string(error); } +const char* SslAlertDescStringLong(int value) { return SSL_alert_desc_string_long(value); } +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 new file mode 100644 index 000000000000..62b20995c593 --- /dev/null +++ b/core/libs/prx/libSceLibreSsl3/AdditionalExports.cpp @@ -0,0 +1,836 @@ +#include "prx/libSceLibreSsl3/include/Api.hpp" +#include "prx/libc/include/General.hpp" + +extern "C" { + +int APS5_VABI BIO_clear_flags_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI BIO_set_flags_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI BN_clear_free_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI BN_dup_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI ERR_func_error_string_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI EVP_PKEY_CTX_free_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI EVP_PKEY_assign_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI EVP_PKEY_bits_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI EVP_PKEY_derive_set_peer_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI EVP_PKEY_get0_EC_KEY_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI EVP_PKEY_verify_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI EVP_PKEY_verify_init_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI EVP_get_digestbyname_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI EVP_sha512_256_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI HKDF_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI HMAC_CTX_free_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI HMAC_CTX_new_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI OPENSSL_init_ssl_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI PEM_read_bio_PUBKEY_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI SSL_CIPHER_get_id_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI SSL_CTX_add1_chain_cert_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI SSL_CTX_set0_chain_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI SSL_CTX_set_timeout_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI SSL_SESSION_get_timeout_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI SSL_SESSION_set_time_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI SSL_do_handshake_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI SSL_get_version_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI SSL_set_accept_state_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI SSL_set_alpn_protos_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI SSL_set_info_callback_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI TLS_method_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI TLS_server_method_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI X509_EXTENSION_free_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI X509_STORE_CTX_get0_param_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI X509_STORE_load_locations_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI X509_get0_pubkey_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI d2i_SSL_SESSION_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI d2i_X509_CRL_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI i2d_SSL_SESSION_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI i2d_X509_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI tls_client_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI tls_close_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI tls_config_free_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI tls_config_new_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI tls_configure_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI tls_error_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI tls_free_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI tls_read_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI tls_server_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI tls_write_nid_postfix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI Unknown__plus__plus_b0FizBrJk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("++b0FizBrJk", Unknown__plus__plus_b0FizBrJk_nid_no_patch); + +int APS5_VABI Unknown__plus_STC2BUY9vY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+STC2BUY9vY", Unknown__plus_STC2BUY9vY_nid_no_patch); + +int APS5_VABI Unknown__plus_Tu0gXSas9s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+Tu0gXSas9s", Unknown__plus_Tu0gXSas9s_nid_no_patch); + +int APS5_VABI Unknown__plus_bQfpiUHRVk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+bQfpiUHRVk", Unknown__plus_bQfpiUHRVk_nid_no_patch); + +int APS5_VABI Unknown_0BW_plus_8jTsY54_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0BW+8jTsY54", Unknown_0BW_plus_8jTsY54_nid_no_patch); + +int APS5_VABI Unknown_0IxWzLyU8PI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0IxWzLyU8PI", Unknown_0IxWzLyU8PI_nid_no_patch); + +int APS5_VABI Unknown_13BHMSblVyY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("13BHMSblVyY", Unknown_13BHMSblVyY_nid_no_patch); + +int APS5_VABI Unknown_27Fuliv3Om8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("27Fuliv3Om8", Unknown_27Fuliv3Om8_nid_no_patch); + +int APS5_VABI Unknown_2bIZM_minus_OfE8Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2bIZM-OfE8Y", Unknown_2bIZM_minus_OfE8Y_nid_no_patch); + +int APS5_VABI Unknown_2l_plus_JidqxyZQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2l+JidqxyZQ", Unknown_2l_plus_JidqxyZQ_nid_no_patch); + +int APS5_VABI Unknown_3KZ_minus_L4y1gak_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3KZ-L4y1gak", Unknown_3KZ_minus_L4y1gak_nid_no_patch); + +int APS5_VABI Unknown_3m4CmAyOXwQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3m4CmAyOXwQ", Unknown_3m4CmAyOXwQ_nid_no_patch); + +int APS5_VABI Unknown_3tGgkjBQ82A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3tGgkjBQ82A", Unknown_3tGgkjBQ82A_nid_no_patch); + +int APS5_VABI Unknown_3v2Omd4sqcU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3v2Omd4sqcU", Unknown_3v2Omd4sqcU_nid_no_patch); + +int APS5_VABI Unknown_3wlK0tLONvk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3wlK0tLONvk", Unknown_3wlK0tLONvk_nid_no_patch); + +int APS5_VABI Unknown_409ieWBMPUk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("409ieWBMPUk", Unknown_409ieWBMPUk_nid_no_patch); + +int APS5_VABI Unknown_44M_plus_SEbpNdQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("44M+SEbpNdQ", Unknown_44M_plus_SEbpNdQ_nid_no_patch); + +int APS5_VABI Unknown_4Q3bvOy4LY8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4Q3bvOy4LY8", Unknown_4Q3bvOy4LY8_nid_no_patch); + +int APS5_VABI Unknown_4pEl_minus_5DmrrM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4pEl-5DmrrM", Unknown_4pEl_minus_5DmrrM_nid_no_patch); + +int APS5_VABI Unknown_5DhOJmgra8E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5DhOJmgra8E", Unknown_5DhOJmgra8E_nid_no_patch); + +int APS5_VABI Unknown_5NBoRJYLH0U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5NBoRJYLH0U", Unknown_5NBoRJYLH0U_nid_no_patch); + +int APS5_VABI Unknown_5PWK0cYOpHs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5PWK0cYOpHs", Unknown_5PWK0cYOpHs_nid_no_patch); + +int APS5_VABI Unknown_5ex_plus_694ri90_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5ex+694ri90", Unknown_5ex_plus_694ri90_nid_no_patch); + +int APS5_VABI Unknown_8A_minus_gU2xQfjY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8A-gU2xQfjY", Unknown_8A_minus_gU2xQfjY_nid_no_patch); + +int APS5_VABI Unknown_8AGfaSvdDq4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8AGfaSvdDq4", Unknown_8AGfaSvdDq4_nid_no_patch); + +int APS5_VABI Unknown_8kct4CSWwOA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8kct4CSWwOA", Unknown_8kct4CSWwOA_nid_no_patch); + +int APS5_VABI Unknown_A_minus_Hs_minus_8mau_plus_8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("A-Hs-8mau+8", Unknown_A_minus_Hs_minus_8mau_plus_8_nid_no_patch); + +int APS5_VABI Unknown_A0lZtFjhcTw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("A0lZtFjhcTw", Unknown_A0lZtFjhcTw_nid_no_patch); + +int APS5_VABI Unknown_A65b_plus_ZhOt9k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("A65b+ZhOt9k", Unknown_A65b_plus_ZhOt9k_nid_no_patch); + +int APS5_VABI Unknown_AiNud8LR8B4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AiNud8LR8B4", Unknown_AiNud8LR8B4_nid_no_patch); + +int APS5_VABI Unknown_Ax_plus_Uu_plus__plus_rnrA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ax+Uu++rnrA", Unknown_Ax_plus_Uu_plus__plus_rnrA_nid_no_patch); + +int APS5_VABI Unknown_BRjfzlGULmU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BRjfzlGULmU", Unknown_BRjfzlGULmU_nid_no_patch); + +int APS5_VABI Unknown_BS5yWv6X_minus_hg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BS5yWv6X-hg", Unknown_BS5yWv6X_minus_hg_nid_no_patch); + +int APS5_VABI Unknown_C7eFtWPfLdk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("C7eFtWPfLdk", Unknown_C7eFtWPfLdk_nid_no_patch); + +int APS5_VABI Unknown_CFRaBB2_plus_R_plus_s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CFRaBB2+R+s", Unknown_CFRaBB2_plus_R_plus_s_nid_no_patch); + +int APS5_VABI Unknown_DZ6fywqpaik_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DZ6fywqpaik", Unknown_DZ6fywqpaik_nid_no_patch); + +int APS5_VABI Unknown_F7jknWesBTY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("F7jknWesBTY", Unknown_F7jknWesBTY_nid_no_patch); + +int APS5_VABI Unknown_GFEaREp1UFw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GFEaREp1UFw", Unknown_GFEaREp1UFw_nid_no_patch); + +int APS5_VABI Unknown_GjO5Ap3E_minus_t4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GjO5Ap3E-t4", Unknown_GjO5Ap3E_minus_t4_nid_no_patch); + +int APS5_VABI Unknown_HE_minus_vihq_minus_KKw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HE-vihq-KKw", Unknown_HE_minus_vihq_minus_KKw_nid_no_patch); + +int APS5_VABI Unknown_IOutZPRNNPo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IOutZPRNNPo", Unknown_IOutZPRNNPo_nid_no_patch); + +int APS5_VABI Unknown_J437jVn9pjI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("J437jVn9pjI", Unknown_J437jVn9pjI_nid_no_patch); + +int APS5_VABI Unknown_J5ZLHxWkT6k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("J5ZLHxWkT6k", Unknown_J5ZLHxWkT6k_nid_no_patch); + +int APS5_VABI Unknown_JSqFTYGaWhU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JSqFTYGaWhU", Unknown_JSqFTYGaWhU_nid_no_patch); + +int APS5_VABI Unknown_JvoQz7GYOMo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JvoQz7GYOMo", Unknown_JvoQz7GYOMo_nid_no_patch); + +int APS5_VABI Unknown_Jzebx477Q3M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Jzebx477Q3M", Unknown_Jzebx477Q3M_nid_no_patch); + +int APS5_VABI Unknown_LA1MlgDx80o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LA1MlgDx80o", Unknown_LA1MlgDx80o_nid_no_patch); + +int APS5_VABI Unknown_LdGe2IfIlpI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LdGe2IfIlpI", Unknown_LdGe2IfIlpI_nid_no_patch); + +int APS5_VABI Unknown_M7ze0mz2jQM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("M7ze0mz2jQM", Unknown_M7ze0mz2jQM_nid_no_patch); + +int APS5_VABI Unknown_O9Thca3enw8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("O9Thca3enw8", Unknown_O9Thca3enw8_nid_no_patch); + +int APS5_VABI Unknown_OqtHJ7QUZg8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OqtHJ7QUZg8", Unknown_OqtHJ7QUZg8_nid_no_patch); + +int APS5_VABI Unknown_PBYz0kpXwg8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PBYz0kpXwg8", Unknown_PBYz0kpXwg8_nid_no_patch); + +int APS5_VABI Unknown_PNfwr3s6dEs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PNfwr3s6dEs", Unknown_PNfwr3s6dEs_nid_no_patch); + +int APS5_VABI Unknown_PcUZS7XHwHk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PcUZS7XHwHk", Unknown_PcUZS7XHwHk_nid_no_patch); + +int APS5_VABI Unknown_QKIOxHfZLh8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QKIOxHfZLh8", Unknown_QKIOxHfZLh8_nid_no_patch); + +int APS5_VABI Unknown_QTV9Nyi7ryg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QTV9Nyi7ryg", Unknown_QTV9Nyi7ryg_nid_no_patch); + +int APS5_VABI Unknown_QYEjNnn6PT4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QYEjNnn6PT4", Unknown_QYEjNnn6PT4_nid_no_patch); + +int APS5_VABI Unknown_QhYzE_plus_Jdvuk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QhYzE+Jdvuk", Unknown_QhYzE_plus_Jdvuk_nid_no_patch); + +int APS5_VABI Unknown_QnjD8S6Rgk4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QnjD8S6Rgk4", Unknown_QnjD8S6Rgk4_nid_no_patch); + +int APS5_VABI Unknown_R3NyckUcClU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("R3NyckUcClU", Unknown_R3NyckUcClU_nid_no_patch); + +int APS5_VABI Unknown_Sqn_plus_7yQmQWc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Sqn+7yQmQWc", Unknown_Sqn_plus_7yQmQWc_nid_no_patch); + +int APS5_VABI Unknown_Ssfu1yw4Em4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ssfu1yw4Em4", Unknown_Ssfu1yw4Em4_nid_no_patch); + +int APS5_VABI Unknown_TKGJOgbeyuA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TKGJOgbeyuA", Unknown_TKGJOgbeyuA_nid_no_patch); + +int APS5_VABI Unknown_TpBvY92mrSM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TpBvY92mrSM", Unknown_TpBvY92mrSM_nid_no_patch); + +int APS5_VABI Unknown_U1dQZ1rXHdA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U1dQZ1rXHdA", Unknown_U1dQZ1rXHdA_nid_no_patch); + +int APS5_VABI Unknown_U3AsZ_minus_9e2MI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U3AsZ-9e2MI", Unknown_U3AsZ_minus_9e2MI_nid_no_patch); + +int APS5_VABI Unknown_UT6E1YgI8mw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UT6E1YgI8mw", Unknown_UT6E1YgI8mw_nid_no_patch); + +int APS5_VABI Unknown_UmAPG5bxYYk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UmAPG5bxYYk", Unknown_UmAPG5bxYYk_nid_no_patch); + +int APS5_VABI Unknown_XK3FmaTS6pg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XK3FmaTS6pg", Unknown_XK3FmaTS6pg_nid_no_patch); + +int APS5_VABI Unknown_YJ7bfxMHniE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YJ7bfxMHniE", Unknown_YJ7bfxMHniE_nid_no_patch); + +int APS5_VABI Unknown_ZERQN8ewpgk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZERQN8ewpgk", Unknown_ZERQN8ewpgk_nid_no_patch); + +int APS5_VABI Unknown_ZFeTGo4ybcw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZFeTGo4ybcw", Unknown_ZFeTGo4ybcw_nid_no_patch); + +int APS5_VABI Unknown_ZQ3b6SakHkc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZQ3b6SakHkc", Unknown_ZQ3b6SakHkc_nid_no_patch); + +int APS5_VABI Unknown_aKGUCnoiE_plus_k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aKGUCnoiE+k", Unknown_aKGUCnoiE_plus_k_nid_no_patch); + +int APS5_VABI Unknown_aLdgrI2jAF0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aLdgrI2jAF0", Unknown_aLdgrI2jAF0_nid_no_patch); + +int APS5_VABI Unknown_aSO3Svp7umY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aSO3Svp7umY", Unknown_aSO3Svp7umY_nid_no_patch); + +int APS5_VABI Unknown_agQxMaXVE8o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("agQxMaXVE8o", Unknown_agQxMaXVE8o_nid_no_patch); + +int APS5_VABI Unknown_as_plus_t2ZOg5fw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("as+t2ZOg5fw", Unknown_as_plus_t2ZOg5fw_nid_no_patch); + +int APS5_VABI Unknown_ba4o0Ih6kSs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ba4o0Ih6kSs", Unknown_ba4o0Ih6kSs_nid_no_patch); + +int APS5_VABI Unknown_bpOQdoGE2es_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bpOQdoGE2es", Unknown_bpOQdoGE2es_nid_no_patch); + +int APS5_VABI Unknown_dQE7FIbNsUE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dQE7FIbNsUE", Unknown_dQE7FIbNsUE_nid_no_patch); + +int APS5_VABI Unknown_eyrIagsax0w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eyrIagsax0w", Unknown_eyrIagsax0w_nid_no_patch); + +int APS5_VABI Unknown_f6Pa2rYH_minus_dw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("f6Pa2rYH-dw", Unknown_f6Pa2rYH_minus_dw_nid_no_patch); + +int APS5_VABI Unknown_fR2Wat3ssHs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fR2Wat3ssHs", Unknown_fR2Wat3ssHs_nid_no_patch); + +int APS5_VABI Unknown_fdvZNUHm_minus_dE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fdvZNUHm-dE", Unknown_fdvZNUHm_minus_dE_nid_no_patch); + +int APS5_VABI Unknown_fq1vAGKJNrI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fq1vAGKJNrI", Unknown_fq1vAGKJNrI_nid_no_patch); + +int APS5_VABI Unknown_gavhu7SX2FI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gavhu7SX2FI", Unknown_gavhu7SX2FI_nid_no_patch); + +int APS5_VABI Unknown_iFlkTGEbE9k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iFlkTGEbE9k", Unknown_iFlkTGEbE9k_nid_no_patch); + +int APS5_VABI Unknown_iHetf873n_plus_4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iHetf873n+4", Unknown_iHetf873n_plus_4_nid_no_patch); + +int APS5_VABI Unknown_je_minus_ydGAbgFg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("je-ydGAbgFg", Unknown_je_minus_ydGAbgFg_nid_no_patch); + +int APS5_VABI Unknown_k1AHUWet_minus_oU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("k1AHUWet-oU", Unknown_k1AHUWet_minus_oU_nid_no_patch); + +int APS5_VABI Unknown_kO_minus_jQ3HS9kE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kO-jQ3HS9kE", Unknown_kO_minus_jQ3HS9kE_nid_no_patch); + +int APS5_VABI Unknown_kPCJUQuguzE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kPCJUQuguzE", Unknown_kPCJUQuguzE_nid_no_patch); + +int APS5_VABI Unknown_lTdt9OsPAV0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lTdt9OsPAV0", Unknown_lTdt9OsPAV0_nid_no_patch); + +int APS5_VABI Unknown_mKlCMgWMU84_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mKlCMgWMU84", Unknown_mKlCMgWMU84_nid_no_patch); + +int APS5_VABI Unknown_mXrusLhI3CI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mXrusLhI3CI", Unknown_mXrusLhI3CI_nid_no_patch); + +int APS5_VABI Unknown_mhAgol4ETgY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mhAgol4ETgY", Unknown_mhAgol4ETgY_nid_no_patch); + +int APS5_VABI Unknown_o0dpw6ZZ6K0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("o0dpw6ZZ6K0", Unknown_o0dpw6ZZ6K0_nid_no_patch); + +int APS5_VABI Unknown_o3Q8yQAMT_minus_k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("o3Q8yQAMT-k", Unknown_o3Q8yQAMT_minus_k_nid_no_patch); + +int APS5_VABI Unknown_pW329hq95Hc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pW329hq95Hc", Unknown_pW329hq95Hc_nid_no_patch); + +int APS5_VABI Unknown_pdxCm9_plus_CCc4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pdxCm9+CCc4", Unknown_pdxCm9_plus_CCc4_nid_no_patch); + +int APS5_VABI Unknown_qGsc6uT6p1E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qGsc6uT6p1E", Unknown_qGsc6uT6p1E_nid_no_patch); + +int APS5_VABI Unknown_rJZ_minus_aiNIYCA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rJZ-aiNIYCA", Unknown_rJZ_minus_aiNIYCA_nid_no_patch); + +int APS5_VABI Unknown_s8WMaKNjwvE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("s8WMaKNjwvE", Unknown_s8WMaKNjwvE_nid_no_patch); + +int APS5_VABI Unknown_sENJFZ7WbLU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sENJFZ7WbLU", Unknown_sENJFZ7WbLU_nid_no_patch); + +int APS5_VABI Unknown_tZG2VIefbX0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tZG2VIefbX0", Unknown_tZG2VIefbX0_nid_no_patch); + +int APS5_VABI Unknown_uITUdhDDAg8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uITUdhDDAg8", Unknown_uITUdhDDAg8_nid_no_patch); + +int APS5_VABI Unknown_uM9UnC8KFjY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uM9UnC8KFjY", Unknown_uM9UnC8KFjY_nid_no_patch); + +int APS5_VABI Unknown_uihDBp74nLI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uihDBp74nLI", Unknown_uihDBp74nLI_nid_no_patch); + +int APS5_VABI Unknown_v1vHv4jOJxQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("v1vHv4jOJxQ", Unknown_v1vHv4jOJxQ_nid_no_patch); + +int APS5_VABI Unknown_vLuIwBfrxrk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vLuIwBfrxrk", Unknown_vLuIwBfrxrk_nid_no_patch); + +int APS5_VABI Unknown_vR0po3nBkBs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vR0po3nBkBs", Unknown_vR0po3nBkBs_nid_no_patch); + +int APS5_VABI Unknown_vnwZHU5FvBQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vnwZHU5FvBQ", Unknown_vnwZHU5FvBQ_nid_no_patch); + +int APS5_VABI Unknown_vo_minus_cv5gnPUA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vo-cv5gnPUA", Unknown_vo_minus_cv5gnPUA_nid_no_patch); + +int APS5_VABI Unknown_vu4FgwGayHY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vu4FgwGayHY", Unknown_vu4FgwGayHY_nid_no_patch); + +int APS5_VABI Unknown_wHdymWL7CbE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wHdymWL7CbE", Unknown_wHdymWL7CbE_nid_no_patch); + +int APS5_VABI Unknown_wNQT6Zn4UG4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wNQT6Zn4UG4", Unknown_wNQT6Zn4UG4_nid_no_patch); + +int APS5_VABI Unknown_whL1IRBxFZA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("whL1IRBxFZA", Unknown_whL1IRBxFZA_nid_no_patch); + +int APS5_VABI Unknown_xBkcXV1OqWQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xBkcXV1OqWQ", Unknown_xBkcXV1OqWQ_nid_no_patch); + +int APS5_VABI Unknown_xVv3qlSRldc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xVv3qlSRldc", Unknown_xVv3qlSRldc_nid_no_patch); + +int APS5_VABI Unknown_xZ1BME5qDv0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xZ1BME5qDv0", Unknown_xZ1BME5qDv0_nid_no_patch); + +int APS5_VABI Unknown_xf6anoZpWRM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xf6anoZpWRM", Unknown_xf6anoZpWRM_nid_no_patch); + +int APS5_VABI Unknown_xpB_plus_BNkO2Z0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xpB+BNkO2Z0", Unknown_xpB_plus_BNkO2Z0_nid_no_patch); + +int APS5_VABI Unknown_yLm956jsJpc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yLm956jsJpc", Unknown_yLm956jsJpc_nid_no_patch); + +int APS5_VABI Unknown_z8fsXF8JuL0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("z8fsXF8JuL0", Unknown_z8fsXF8JuL0_nid_no_patch); + +int APS5_VABI Unknown_zCa75KLWWn4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zCa75KLWWn4", Unknown_zCa75KLWWn4_nid_no_patch); + +} diff --git a/core/libs/prx/libSceLibreSsl3/CMakeLists.txt b/core/libs/prx/libSceLibreSsl3/CMakeLists.txt index c787bccfeaa1..00f81a6be1cd 100644 --- a/core/libs/prx/libSceLibreSsl3/CMakeLists.txt +++ b/core/libs/prx/libSceLibreSsl3/CMakeLists.txt @@ -3,6 +3,15 @@ target_include_directories(libSceLibreSsl3 PRIVATE ${LIBS_INCLUDE_DIR}) target_link_libraries(libSceLibreSsl3 PRIVATE libSceLibreSsl libc) 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() + if(BUILD_TESTING) add_test_executable(guest_crypto_memcmp_tests ${LIBS_INCLUDE_DIR}/tests/GuestCryptoMemcmp.cpp) target_include_directories(guest_crypto_memcmp_tests PRIVATE ${LIBS_INCLUDE_DIR}) @@ -15,12 +24,52 @@ 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) + configure_windows_unwind(guest_libressl3_stack_tests) + add_test(NAME guest_libressl3_stack COMMAND guest_libressl3_stack_tests) + set_tests_properties(guest_libressl3_stack PROPERTIES TIMEOUT 20) + if(WIN32) + 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 0f7cb0e894c8..a299a4c7a7a5 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/ParentExports.cpp b/core/libs/prx/libSceLibreSsl3/ParentExports.cpp new file mode 100644 index 000000000000..6a933a83bc20 --- /dev/null +++ b/core/libs/prx/libSceLibreSsl3/ParentExports.cpp @@ -0,0 +1,1191 @@ +#include "prx/libc/include/general/AsmMacros.hpp" +#include "prx/libc/include/general/ExportMacros.hpp" + +extern "C" { + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ASN1_TIME_print_nid_no_patch") "jmp *__imp_ASN1_TIME_print_nid_postfix(%rip)\n"); +APS5_EXPORT("+MuYdJPypkE", libreSsl3Forward_ASN1_TIME_print_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_shutdown_nid_no_patch") "jmp *__imp_SSL_shutdown_nid_postfix(%rip)\n"); +APS5_EXPORT("-UDxVMs9h9M", libreSsl3Forward_SSL_shutdown_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_AES_cfb128_encrypt_nid_no_patch") "jmp *__imp_AES_cfb128_encrypt_nid_postfix(%rip)\n"); +APS5_EXPORT("05Uo75yDn-s", libreSsl3Forward_AES_cfb128_encrypt_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_aes_192_cbc_nid_no_patch") "jmp *__imp_EVP_aes_192_cbc_nid_postfix(%rip)\n"); +APS5_EXPORT("0X5DnA3olsk", libreSsl3Forward_EVP_aes_192_cbc_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_get_error_nid_no_patch") "jmp *__imp_SSL_get_error_nid_postfix(%rip)\n"); +APS5_EXPORT("0wGjbW+tVlc", libreSsl3Forward_SSL_get_error_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_sha256_nid_no_patch") "jmp *__imp_EVP_sha256_nid_postfix(%rip)\n"); +APS5_EXPORT("1LBVOD6fQok", libreSsl3Forward_EVP_sha256_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_UI_method_set_opener_nid_no_patch") "jmp *__imp_UI_method_set_opener_nid_postfix(%rip)\n"); +APS5_EXPORT("1OlYGRE3vcY", libreSsl3Forward_UI_method_set_opener_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_callback_ctrl_nid_no_patch") "jmp *__imp_SSL_CTX_callback_ctrl_nid_postfix(%rip)\n"); +APS5_EXPORT("1RXUUBFLawQ", libreSsl3Forward_SSL_CTX_callback_ctrl_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SHA256_Final_nid_no_patch") "jmp *__imp_SHA256_Final_nid_postfix(%rip)\n"); +APS5_EXPORT("1wZvCS-KzPs", libreSsl3Forward_SHA256_Final_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_get_ext_d2i_nid_no_patch") "jmp *__imp_X509_get_ext_d2i_nid_postfix(%rip)\n"); +APS5_EXPORT("25mefJRpH0Q", libreSsl3Forward_X509_get_ext_d2i_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_OCSP_cert_status_str_nid_no_patch") "jmp *__imp_OCSP_cert_status_str_nid_postfix(%rip)\n"); +APS5_EXPORT("2XXc6yOFres", libreSsl3Forward_OCSP_cert_status_str_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_set_verify_nid_no_patch") "jmp *__imp_SSL_set_verify_nid_postfix(%rip)\n"); +APS5_EXPORT("2k3RoQK8h0c", libreSsl3Forward_SSL_set_verify_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_get_ex_new_index_nid_no_patch") "jmp *__imp_SSL_CTX_get_ex_new_index_nid_postfix(%rip)\n"); +APS5_EXPORT("2k6m8dF7sPc", libreSsl3Forward_SSL_CTX_get_ex_new_index_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_CIPHER_CTX_free_nid_no_patch") "jmp *__imp_EVP_CIPHER_CTX_free_nid_postfix(%rip)\n"); +APS5_EXPORT("2q1DC47z1JM", libreSsl3Forward_EVP_CIPHER_CTX_free_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_set_next_proto_select_cb_nid_no_patch") "jmp *__imp_SSL_CTX_set_next_proto_select_cb_nid_postfix(%rip)\n"); +APS5_EXPORT("2zQOpCZREJk", libreSsl3Forward_SSL_CTX_set_next_proto_select_cb_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_set_cipher_list_nid_no_patch") "jmp *__imp_SSL_CTX_set_cipher_list_nid_postfix(%rip)\n"); +APS5_EXPORT("3-QFdzPv6W0", libreSsl3Forward_SSL_CTX_set_cipher_list_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CIPHER_get_bits_nid_no_patch") "jmp *__imp_SSL_CIPHER_get_bits_nid_postfix(%rip)\n"); +APS5_EXPORT("3KeAc1cF8EY", libreSsl3Forward_SSL_CIPHER_get_bits_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_load_verify_mem_nid_no_patch") "jmp *__imp_SSL_CTX_load_verify_mem_nid_postfix(%rip)\n"); +APS5_EXPORT("3Tmjg+pNxC4", libreSsl3Forward_SSL_CTX_load_verify_mem_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_use_certificate_chain_file_nid_no_patch") "jmp *__imp_SSL_CTX_use_certificate_chain_file_nid_postfix(%rip)\n"); +APS5_EXPORT("3c6eyS3Jx4Q", libreSsl3Forward_SSL_CTX_use_certificate_chain_file_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_CRYPTO_THREADID_set_callback_nid_no_patch") "jmp *__imp_CRYPTO_THREADID_set_callback_nid_postfix(%rip)\n"); +APS5_EXPORT("3enOTWb1NUo", libreSsl3Forward_CRYPTO_THREADID_set_callback_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_AES_decrypt_nid_no_patch") "jmp *__imp_AES_decrypt_nid_postfix(%rip)\n"); +APS5_EXPORT("3qGbMaLVgxY", libreSsl3Forward_AES_decrypt_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_sha512_nid_no_patch") "jmp *__imp_EVP_sha512_nid_postfix(%rip)\n"); +APS5_EXPORT("45R8R4xDgOo", libreSsl3Forward_EVP_sha512_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EC_GROUP_new_by_curve_name_nid_no_patch") "jmp *__imp_EC_GROUP_new_by_curve_name_nid_postfix(%rip)\n"); +APS5_EXPORT("47B8y-Mqy78", libreSsl3Forward_EC_GROUP_new_by_curve_name_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BN_sub_word_nid_no_patch") "jmp *__imp_BN_sub_word_nid_postfix(%rip)\n"); +APS5_EXPORT("4BERqYMNCNU", libreSsl3Forward_BN_sub_word_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SHA1_Init_nid_no_patch") "jmp *__imp_SHA1_Init_nid_postfix(%rip)\n"); +APS5_EXPORT("4N6ifdTOfoM", libreSsl3Forward_SHA1_Init_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_PEM_read_X509_nid_no_patch") "jmp *__imp_PEM_read_X509_nid_postfix(%rip)\n"); +APS5_EXPORT("4NSxjyMl-ho", libreSsl3Forward_PEM_read_X509_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BN_set_word_nid_no_patch") "jmp *__imp_BN_set_word_nid_postfix(%rip)\n"); +APS5_EXPORT("4ejAnR1Xpg8", libreSsl3Forward_BN_set_word_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_HMAC_CTX_init_nid_no_patch") "jmp *__imp_HMAC_CTX_init_nid_postfix(%rip)\n"); +APS5_EXPORT("4lffn9gHyR0", libreSsl3Forward_HMAC_CTX_init_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_INFO_free_nid_no_patch") "jmp *__imp_X509_INFO_free_nid_postfix(%rip)\n"); +APS5_EXPORT("5+U+mGZV+SM", libreSsl3Forward_X509_INFO_free_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_RAND_load_file_nid_no_patch") "jmp *__imp_RAND_load_file_nid_postfix(%rip)\n"); +APS5_EXPORT("5KUuEEmBTpo", libreSsl3Forward_RAND_load_file_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_PKEY_get1_RSA_nid_no_patch") "jmp *__imp_EVP_PKEY_get1_RSA_nid_postfix(%rip)\n"); +APS5_EXPORT("5RBpaKVkWRQ", libreSsl3Forward_EVP_PKEY_get1_RSA_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_MD_size_nid_no_patch") "jmp *__imp_EVP_MD_size_nid_postfix(%rip)\n"); +APS5_EXPORT("5VpbYYKsV38", libreSsl3Forward_EVP_MD_size_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ASN1_STRING_type_nid_no_patch") "jmp *__imp_ASN1_STRING_type_nid_postfix(%rip)\n"); +APS5_EXPORT("5XfwSMKO0lA", libreSsl3Forward_ASN1_STRING_type_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_PEM_read_bio_X509_AUX_nid_no_patch") "jmp *__imp_PEM_read_bio_X509_AUX_nid_postfix(%rip)\n"); +APS5_EXPORT("5tmv0sLeWpU", libreSsl3Forward_PEM_read_bio_X509_AUX_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_RSA_free_nid_no_patch") "jmp *__imp_RSA_free_nid_postfix(%rip)\n"); +APS5_EXPORT("5zpup0URQoc", libreSsl3Forward_RSA_free_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BN_CTX_start_nid_no_patch") "jmp *__imp_BN_CTX_start_nid_postfix(%rip)\n"); +APS5_EXPORT("6IZThsmEH7A", libreSsl3Forward_BN_CTX_start_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ENGINE_ctrl_cmd_nid_no_patch") "jmp *__imp_ENGINE_ctrl_cmd_nid_postfix(%rip)\n"); +APS5_EXPORT("6LCn0yJSOo0", libreSsl3Forward_ENGINE_ctrl_cmd_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_DigestUpdate_nid_no_patch") "jmp *__imp_EVP_DigestUpdate_nid_postfix(%rip)\n"); +APS5_EXPORT("6LrAQY0Ka4c", libreSsl3Forward_EVP_DigestUpdate_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_CMAC_Final_nid_no_patch") "jmp *__imp_CMAC_Final_nid_postfix(%rip)\n"); +APS5_EXPORT("6MM7ng9P+18", libreSsl3Forward_CMAC_Final_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_DigestVerifyFinal_nid_no_patch") "jmp *__imp_EVP_DigestVerifyFinal_nid_postfix(%rip)\n"); +APS5_EXPORT("6QfhFhAfeIo", libreSsl3Forward_EVP_DigestVerifyFinal_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ECDSA_sign_nid_no_patch") "jmp *__imp_ECDSA_sign_nid_postfix(%rip)\n"); +APS5_EXPORT("6qGhMiG+4-0", libreSsl3Forward_ECDSA_sign_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_aes_192_gcm_nid_no_patch") "jmp *__imp_EVP_aes_192_gcm_nid_postfix(%rip)\n"); +APS5_EXPORT("6qI5g0UUyRw", libreSsl3Forward_EVP_aes_192_gcm_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BN_mul_nid_no_patch") "jmp *__imp_BN_mul_nid_postfix(%rip)\n"); +APS5_EXPORT("74vuH9BYkF0", libreSsl3Forward_BN_mul_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSLv23_client_method_nid_no_patch") "jmp *__imp_SSLv23_client_method_nid_postfix(%rip)\n"); +APS5_EXPORT("766RqC9GMsw", libreSsl3Forward_SSLv23_client_method_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_RSA_flags_nid_no_patch") "jmp *__imp_RSA_flags_nid_postfix(%rip)\n"); +APS5_EXPORT("7Qe-v+V94Ic", libreSsl3Forward_RSA_flags_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSLv23_server_method_nid_no_patch") "jmp *__imp_SSLv23_server_method_nid_postfix(%rip)\n"); +APS5_EXPORT("7Xaz7BxcERA", libreSsl3Forward_SSLv23_server_method_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_load_crl_file_nid_no_patch") "jmp *__imp_X509_load_crl_file_nid_postfix(%rip)\n"); +APS5_EXPORT("7fES7D9wiJk", libreSsl3Forward_X509_load_crl_file_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_CONF_modules_load_file_nid_no_patch") "jmp *__imp_CONF_modules_load_file_nid_postfix(%rip)\n"); +APS5_EXPORT("88QdTuQS0oc", libreSsl3Forward_CONF_modules_load_file_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_library_init_nid_no_patch") "jmp *__imp_SSL_library_init_nid_postfix(%rip)\n"); +APS5_EXPORT("8Ad6pf9G7cY", libreSsl3Forward_SSL_library_init_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSLeay_nid_no_patch") "jmp *__imp_SSLeay_nid_postfix(%rip)\n"); +APS5_EXPORT("8I1tIrw0dvg", libreSsl3Forward_SSLeay_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_CIPHER_CTX_set_padding_nid_no_patch") "jmp *__imp_EVP_CIPHER_CTX_set_padding_nid_postfix(%rip)\n"); +APS5_EXPORT("8JHXNHuOCIw", libreSsl3Forward_EVP_CIPHER_CTX_set_padding_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_CipherInit_ex_nid_no_patch") "jmp *__imp_EVP_CipherInit_ex_nid_postfix(%rip)\n"); +APS5_EXPORT("8SJGJaRiCaY", libreSsl3Forward_EVP_CipherInit_ex_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ENGINE_load_private_key_nid_no_patch") "jmp *__imp_ENGINE_load_private_key_nid_postfix(%rip)\n"); +APS5_EXPORT("8WTNYVcLNFA", libreSsl3Forward_ENGINE_load_private_key_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ASN1_STRING_print_nid_no_patch") "jmp *__imp_ASN1_STRING_print_nid_postfix(%rip)\n"); +APS5_EXPORT("8ppA5Hd3FVU", libreSsl3Forward_ASN1_STRING_print_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SHA224_Final_nid_no_patch") "jmp *__imp_SHA224_Final_nid_postfix(%rip)\n"); +APS5_EXPORT("94EuReVV8c0", libreSsl3Forward_SHA224_Final_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_d2i_PKCS12_fp_nid_no_patch") "jmp *__imp_d2i_PKCS12_fp_nid_postfix(%rip)\n"); +APS5_EXPORT("985+pv1mzsA", libreSsl3Forward_d2i_PKCS12_fp_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_get_issuer_name_nid_no_patch") "jmp *__imp_X509_get_issuer_name_nid_postfix(%rip)\n"); +APS5_EXPORT("9PNhbIplSpU", libreSsl3Forward_X509_get_issuer_name_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_MD4_Final_nid_no_patch") "jmp *__imp_MD4_Final_nid_postfix(%rip)\n"); +APS5_EXPORT("9nz1W9shXQA", libreSsl3Forward_MD4_Final_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_EncryptFinal_ex_nid_no_patch") "jmp *__imp_EVP_EncryptFinal_ex_nid_postfix(%rip)\n"); +APS5_EXPORT("9x78-Zpc+XE", libreSsl3Forward_EVP_EncryptFinal_ex_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_PEM_write_bio_X509_nid_no_patch") "jmp *__imp_PEM_write_bio_X509_nid_postfix(%rip)\n"); +APS5_EXPORT("A5Hxx4-o50g", libreSsl3Forward_PEM_write_bio_X509_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_get_verify_result_nid_no_patch") "jmp *__imp_SSL_get_verify_result_nid_postfix(%rip)\n"); +APS5_EXPORT("A9aDQi3tJMI", libreSsl3Forward_SSL_get_verify_result_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_STORE_CTX_set_error_nid_no_patch") "jmp *__imp_X509_STORE_CTX_set_error_nid_postfix(%rip)\n"); +APS5_EXPORT("AC1tPOyDkpA", libreSsl3Forward_X509_STORE_CTX_set_error_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BIO_new_nid_no_patch") "jmp *__imp_BIO_new_nid_postfix(%rip)\n"); +APS5_EXPORT("ARlY6zhSacE", libreSsl3Forward_BIO_new_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ERR_peek_error_nid_no_patch") "jmp *__imp_ERR_peek_error_nid_postfix(%rip)\n"); +APS5_EXPORT("Aytjey6FPTU", libreSsl3Forward_ERR_peek_error_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ENGINE_free_nid_no_patch") "jmp *__imp_ENGINE_free_nid_postfix(%rip)\n"); +APS5_EXPORT("AzuirRhvygA", libreSsl3Forward_ENGINE_free_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_aes_256_gcm_nid_no_patch") "jmp *__imp_EVP_aes_256_gcm_nid_postfix(%rip)\n"); +APS5_EXPORT("BCvXipfsDpg", libreSsl3Forward_EVP_aes_256_gcm_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_check_private_key_nid_no_patch") "jmp *__imp_SSL_CTX_check_private_key_nid_postfix(%rip)\n"); +APS5_EXPORT("BMYA9UuBQCo", libreSsl3Forward_SSL_CTX_check_private_key_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_get_servername_nid_no_patch") "jmp *__imp_SSL_get_servername_nid_postfix(%rip)\n"); +APS5_EXPORT("BMcXei7NXB8", libreSsl3Forward_SSL_get_servername_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_CIPHER_CTX_new_nid_no_patch") "jmp *__imp_EVP_CIPHER_CTX_new_nid_postfix(%rip)\n"); +APS5_EXPORT("BZCFjYmSXCg", libreSsl3Forward_EVP_CIPHER_CTX_new_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_RAND_add_nid_no_patch") "jmp *__imp_RAND_add_nid_postfix(%rip)\n"); +APS5_EXPORT("BxZOkd4o1U8", libreSsl3Forward_RAND_add_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_print_ex_nid_no_patch") "jmp *__imp_X509_print_ex_nid_postfix(%rip)\n"); +APS5_EXPORT("CSQDgq2Ziug", libreSsl3Forward_X509_print_ex_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BN_bin2bn_nid_no_patch") "jmp *__imp_BN_bin2bn_nid_postfix(%rip)\n"); +APS5_EXPORT("ChQ8saJ2j+E", libreSsl3Forward_BN_bin2bn_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BIO_new_fp_nid_no_patch") "jmp *__imp_BIO_new_fp_nid_postfix(%rip)\n"); +APS5_EXPORT("CkP9jjPO4ic", libreSsl3Forward_BIO_new_fp_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_select_next_proto_nid_no_patch") "jmp *__imp_SSL_select_next_proto_nid_postfix(%rip)\n"); +APS5_EXPORT("CpIzEs1Q1Ug", libreSsl3Forward_SSL_select_next_proto_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_LOOKUP_file_nid_no_patch") "jmp *__imp_X509_LOOKUP_file_nid_postfix(%rip)\n"); +APS5_EXPORT("D2Vd3m4Bli8", libreSsl3Forward_X509_LOOKUP_file_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_new_nid_no_patch") "jmp *__imp_SSL_new_nid_postfix(%rip)\n"); +APS5_EXPORT("D8Br9BnZoqo", libreSsl3Forward_SSL_new_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ERR_get_error_nid_no_patch") "jmp *__imp_ERR_get_error_nid_postfix(%rip)\n"); +APS5_EXPORT("DJg+qWX1rwY", libreSsl3Forward_ERR_get_error_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EC_POINT_point2oct_nid_no_patch") "jmp *__imp_EC_POINT_point2oct_nid_postfix(%rip)\n"); +APS5_EXPORT("DWY1jnsgOQI", libreSsl3Forward_EC_POINT_point2oct_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_sceLibreSslInit_nid_no_patch") "jmp *__imp_sceLibreSslInit(%rip)\n"); +APS5_EXPORT("DWzAHSX9KW8", libreSsl3Forward_sceLibreSslInit_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_UI_method_get_writer_nid_no_patch") "jmp *__imp_UI_method_get_writer_nid_postfix(%rip)\n"); +APS5_EXPORT("Dcze1nqtPC8", libreSsl3Forward_UI_method_get_writer_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_get_subject_name_nid_no_patch") "jmp *__imp_X509_get_subject_name_nid_postfix(%rip)\n"); +APS5_EXPORT("DxjJR-ixiNE", libreSsl3Forward_X509_get_subject_name_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_CRYPTO_num_locks_nid_no_patch") "jmp *__imp_CRYPTO_num_locks_nid_postfix(%rip)\n"); +APS5_EXPORT("E4lrM+EnUjA", libreSsl3Forward_CRYPTO_num_locks_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_CIPHER_block_size_nid_no_patch") "jmp *__imp_EVP_CIPHER_block_size_nid_postfix(%rip)\n"); +APS5_EXPORT("E5bdqIaXjl0", libreSsl3Forward_EVP_CIPHER_block_size_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_get_ex_data_X509_STORE_CTX_idx_nid_no_patch") "jmp *__imp_SSL_get_ex_data_X509_STORE_CTX_idx_nid_postfix(%rip)\n"); +APS5_EXPORT("E5opvIVafTc", libreSsl3Forward_SSL_get_ex_data_X509_STORE_CTX_idx_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_set_cert_verify_callback_nid_no_patch") "jmp *__imp_SSL_CTX_set_cert_verify_callback_nid_postfix(%rip)\n"); +APS5_EXPORT("EBJv7yCl8DQ", libreSsl3Forward_SSL_CTX_set_cert_verify_callback_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_PKEY_set1_RSA_nid_no_patch") "jmp *__imp_EVP_PKEY_set1_RSA_nid_postfix(%rip)\n"); +APS5_EXPORT("Ek3df14vjDk", libreSsl3Forward_EVP_PKEY_set1_RSA_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_UI_method_get_opener_nid_no_patch") "jmp *__imp_UI_method_get_opener_nid_postfix(%rip)\n"); +APS5_EXPORT("FAKxcUW+Pqk", libreSsl3Forward_UI_method_get_opener_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SHA384_Init_nid_no_patch") "jmp *__imp_SHA384_Init_nid_postfix(%rip)\n"); +APS5_EXPORT("FEYYkBx7Yv8", libreSsl3Forward_SHA384_Init_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_get_rbio_nid_no_patch") "jmp *__imp_SSL_get_rbio_nid_postfix(%rip)\n"); +APS5_EXPORT("FJJNTde17A8", libreSsl3Forward_SSL_get_rbio_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ERR_remove_thread_state_nid_no_patch") "jmp *__imp_ERR_remove_thread_state_nid_postfix(%rip)\n"); +APS5_EXPORT("FcL+-Kw05rE", libreSsl3Forward_ERR_remove_thread_state_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_CipherFinal_ex_nid_no_patch") "jmp *__imp_EVP_CipherFinal_ex_nid_postfix(%rip)\n"); +APS5_EXPORT("FgP0jMzeUU0", libreSsl3Forward_EVP_CipherFinal_ex_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_CRYPTO_cleanup_all_ex_data_nid_no_patch") "jmp *__imp_CRYPTO_cleanup_all_ex_data_nid_postfix(%rip)\n"); +APS5_EXPORT("FnLDy4R08cQ", libreSsl3Forward_CRYPTO_cleanup_all_ex_data_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BIO_printf_nid_no_patch") "jmp *__imp_BIO_printf_nid_postfix(%rip)\n"); +APS5_EXPORT("FzqrpwhFlJw", libreSsl3Forward_BIO_printf_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_DES_set_odd_parity_nid_no_patch") "jmp *__imp_DES_set_odd_parity_nid_postfix(%rip)\n"); +APS5_EXPORT("G+XSOLKw5AI", libreSsl3Forward_DES_set_odd_parity_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_accept_nid_no_patch") "jmp *__imp_SSL_accept_nid_postfix(%rip)\n"); +APS5_EXPORT("G78CVmMDaC8", libreSsl3Forward_SSL_accept_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BIO_new_mem_buf_nid_no_patch") "jmp *__imp_BIO_new_mem_buf_nid_postfix(%rip)\n"); +APS5_EXPORT("GMzjS9jvyDQ", libreSsl3Forward_BIO_new_mem_buf_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_get_current_cipher_nid_no_patch") "jmp *__imp_SSL_get_current_cipher_nid_postfix(%rip)\n"); +APS5_EXPORT("GYYIk8cGKzw", libreSsl3Forward_SSL_get_current_cipher_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BN_mod_inverse_nid_no_patch") "jmp *__imp_BN_mod_inverse_nid_postfix(%rip)\n"); +APS5_EXPORT("Gz+I4uxmv7M", libreSsl3Forward_BN_mod_inverse_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CIPHER_get_name_nid_no_patch") "jmp *__imp_SSL_CIPHER_get_name_nid_postfix(%rip)\n"); +APS5_EXPORT("HBqaZUMi6wU", libreSsl3Forward_SSL_CIPHER_get_name_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_use_PrivateKey_ASN1_nid_no_patch") "jmp *__imp_SSL_use_PrivateKey_ASN1_nid_postfix(%rip)\n"); +APS5_EXPORT("HH8uEbhmUbg", libreSsl3Forward_SSL_use_PrivateKey_ASN1_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_d2i_OCSP_RESPONSE_nid_no_patch") "jmp *__imp_d2i_OCSP_RESPONSE_nid_postfix(%rip)\n"); +APS5_EXPORT("HQyBEpH4h+E", libreSsl3Forward_d2i_OCSP_RESPONSE_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_HMAC_nid_no_patch") "jmp *__imp_HMAC_nid_postfix(%rip)\n"); +APS5_EXPORT("HYgtW9iS5Fk", libreSsl3Forward_HMAC_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_RSA_sign_nid_no_patch") "jmp *__imp_RSA_sign_nid_postfix(%rip)\n"); +APS5_EXPORT("HohNCzDzBW0", libreSsl3Forward_RSA_sign_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ENGINE_cleanup_nid_no_patch") "jmp *__imp_ENGINE_cleanup_nid_postfix(%rip)\n"); +APS5_EXPORT("Htr6CcbIOGQ", libreSsl3Forward_ENGINE_cleanup_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_DecryptUpdate_nid_no_patch") "jmp *__imp_EVP_DecryptUpdate_nid_postfix(%rip)\n"); +APS5_EXPORT("IXiXAHDFjeU", libreSsl3Forward_EVP_DecryptUpdate_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ECDSA_verify_nid_no_patch") "jmp *__imp_ECDSA_verify_nid_postfix(%rip)\n"); +APS5_EXPORT("IkWJtQkfvZs", libreSsl3Forward_ECDSA_verify_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_i2d_X509_PUBKEY_nid_no_patch") "jmp *__imp_i2d_X509_PUBKEY_nid_postfix(%rip)\n"); +APS5_EXPORT("Inld2SiNs+E", libreSsl3Forward_i2d_X509_PUBKEY_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_EXTENSION_get_object_nid_no_patch") "jmp *__imp_X509_EXTENSION_get_object_nid_postfix(%rip)\n"); +APS5_EXPORT("Iv249kxxuiQ", libreSsl3Forward_X509_EXTENSION_get_object_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EC_POINT_free_nid_no_patch") "jmp *__imp_EC_POINT_free_nid_postfix(%rip)\n"); +APS5_EXPORT("J-JL-TLqlrI", libreSsl3Forward_EC_POINT_free_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_aes_256_cbc_nid_no_patch") "jmp *__imp_EVP_aes_256_cbc_nid_postfix(%rip)\n"); +APS5_EXPORT("J44dsZUcK4I", libreSsl3Forward_EVP_aes_256_cbc_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_MD_CTX_cleanup_nid_no_patch") "jmp *__imp_EVP_MD_CTX_cleanup_nid_postfix(%rip)\n"); +APS5_EXPORT("J8oy-Lxf1jg", libreSsl3Forward_EVP_MD_CTX_cleanup_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_CRYPTO_set_locking_callback_nid_no_patch") "jmp *__imp_CRYPTO_set_locking_callback_nid_postfix(%rip)\n"); +APS5_EXPORT("JCBQmmKJcw4", libreSsl3Forward_CRYPTO_set_locking_callback_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_OPENSSL_load_builtin_modules_nid_no_patch") "jmp *__imp_OPENSSL_load_builtin_modules_nid_postfix(%rip)\n"); +APS5_EXPORT("JWPGyyGoWdU", libreSsl3Forward_OPENSSL_load_builtin_modules_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_pending_nid_no_patch") "jmp *__imp_SSL_pending_nid_postfix(%rip)\n"); +APS5_EXPORT("JlVFd422fsQ", libreSsl3Forward_SSL_pending_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_get_serialNumber_nid_no_patch") "jmp *__imp_X509_get_serialNumber_nid_postfix(%rip)\n"); +APS5_EXPORT("KGLy4DI9vwQ", libreSsl3Forward_X509_get_serialNumber_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_UI_get_string_type_nid_no_patch") "jmp *__imp_UI_get_string_type_nid_postfix(%rip)\n"); +APS5_EXPORT("Kd9s4dhbip8", libreSsl3Forward_UI_get_string_type_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ERR_error_string_nid_no_patch") "jmp *__imp_ERR_error_string_nid_postfix(%rip)\n"); +APS5_EXPORT("KjA4JEfO6zA", libreSsl3Forward_ERR_error_string_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_PKEY_type_nid_no_patch") "jmp *__imp_EVP_PKEY_type_nid_postfix(%rip)\n"); +APS5_EXPORT("Ky8m3qWEwjE", libreSsl3Forward_EVP_PKEY_type_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_UI_destroy_method_nid_no_patch") "jmp *__imp_UI_destroy_method_nid_postfix(%rip)\n"); +APS5_EXPORT("L6H3T7sBP5U", libreSsl3Forward_UI_destroy_method_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_CMAC_Init_nid_no_patch") "jmp *__imp_CMAC_Init_nid_postfix(%rip)\n"); +APS5_EXPORT("LATrF+dIZYI", libreSsl3Forward_CMAC_Init_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_PKEY_new_nid_no_patch") "jmp *__imp_EVP_PKEY_new_nid_postfix(%rip)\n"); +APS5_EXPORT("LiZK5PkEeMY", libreSsl3Forward_EVP_PKEY_new_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SHA224_Update_nid_no_patch") "jmp *__imp_SHA224_Update_nid_postfix(%rip)\n"); +APS5_EXPORT("LvLMwrQ0tdc", libreSsl3Forward_SHA224_Update_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ASN1_INTEGER_get_nid_no_patch") "jmp *__imp_ASN1_INTEGER_get_nid_postfix(%rip)\n"); +APS5_EXPORT("LxB5h8w0zVI", libreSsl3Forward_ASN1_INTEGER_get_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_OCSP_BASICRESP_free_nid_no_patch") "jmp *__imp_OCSP_BASICRESP_free_nid_postfix(%rip)\n"); +APS5_EXPORT("M8ySIkxecJ4", libreSsl3Forward_OCSP_BASICRESP_free_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_sess_set_new_cb_nid_no_patch") "jmp *__imp_SSL_CTX_sess_set_new_cb_nid_postfix(%rip)\n"); +APS5_EXPORT("MSsQ8vWmLNY", libreSsl3Forward_SSL_CTX_sess_set_new_cb_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_STORE_free_nid_no_patch") "jmp *__imp_X509_STORE_free_nid_postfix(%rip)\n"); +APS5_EXPORT("MVRkviV4jJw", libreSsl3Forward_X509_STORE_free_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_get_cert_store_nid_no_patch") "jmp *__imp_SSL_CTX_get_cert_store_nid_postfix(%rip)\n"); +APS5_EXPORT("MsfV1B5yOIQ", libreSsl3Forward_SSL_CTX_get_cert_store_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_set_session_nid_no_patch") "jmp *__imp_SSL_set_session_nid_postfix(%rip)\n"); +APS5_EXPORT("N9KKC6Q8mhg", libreSsl3Forward_SSL_set_session_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BN_new_nid_no_patch") "jmp *__imp_BN_new_nid_postfix(%rip)\n"); +APS5_EXPORT("NDsTaWhoVQI", libreSsl3Forward_BN_new_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_RSA_generate_key_ex_nid_no_patch") "jmp *__imp_RSA_generate_key_ex_nid_postfix(%rip)\n"); +APS5_EXPORT("NOsUmPti3g4", libreSsl3Forward_RSA_generate_key_ex_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_peek_nid_no_patch") "jmp *__imp_SSL_peek_nid_postfix(%rip)\n"); +APS5_EXPORT("NUqcZ7pzVuI", libreSsl3Forward_SSL_peek_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_MD_CTX_destroy_nid_no_patch") "jmp *__imp_EVP_MD_CTX_destroy_nid_postfix(%rip)\n"); +APS5_EXPORT("NdGinrpcn5M", libreSsl3Forward_EVP_MD_CTX_destroy_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_CRYPTO_set_add_lock_callback_nid_no_patch") "jmp *__imp_CRYPTO_set_add_lock_callback_nid_postfix(%rip)\n"); +APS5_EXPORT("NkZzz2hl0e0", libreSsl3Forward_CRYPTO_set_add_lock_callback_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BN_hex2bn_nid_no_patch") "jmp *__imp_BN_hex2bn_nid_postfix(%rip)\n"); +APS5_EXPORT("Nw0ioCQ9tbc", libreSsl3Forward_BN_hex2bn_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ENGINE_init_nid_no_patch") "jmp *__imp_ENGINE_init_nid_postfix(%rip)\n"); +APS5_EXPORT("O1i2y1YXwew", libreSsl3Forward_ENGINE_init_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_load_error_strings_nid_no_patch") "jmp *__imp_SSL_load_error_strings_nid_postfix(%rip)\n"); +APS5_EXPORT("O9oxFoJ0v9M", libreSsl3Forward_SSL_load_error_strings_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EC_GROUP_get_degree_nid_no_patch") "jmp *__imp_EC_GROUP_get_degree_nid_postfix(%rip)\n"); +APS5_EXPORT("OL6P62kBuqU", libreSsl3Forward_EC_GROUP_get_degree_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_set1_groups_list_nid_no_patch") "jmp *__imp_SSL_CTX_set1_groups_list_nid_postfix(%rip)\n"); +APS5_EXPORT("OZkvQEgICVc", libreSsl3Forward_SSL_CTX_set1_groups_list_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CIPHER_get_version_nid_no_patch") "jmp *__imp_SSL_CIPHER_get_version_nid_postfix(%rip)\n"); +APS5_EXPORT("ObitwxybGKk", libreSsl3Forward_SSL_CIPHER_get_version_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_get0_param_nid_no_patch") "jmp *__imp_SSL_get0_param_nid_postfix(%rip)\n"); +APS5_EXPORT("OjlHVH8jjsw", libreSsl3Forward_SSL_get0_param_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_EncryptUpdate_nid_no_patch") "jmp *__imp_EVP_EncryptUpdate_nid_postfix(%rip)\n"); +APS5_EXPORT("OnoZKqFGNjA", libreSsl3Forward_EVP_EncryptUpdate_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_VERIFY_PARAM_set1_ip_asc_nid_no_patch") "jmp *__imp_X509_VERIFY_PARAM_set1_ip_asc_nid_postfix(%rip)\n"); +APS5_EXPORT("P+cIOdeN6ig", libreSsl3Forward_X509_VERIFY_PARAM_set1_ip_asc_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_sk_pop_free_nid_no_patch") "jmp *__imp_sk_pop_free_nid_postfix(%rip)\n"); +APS5_EXPORT("P4Z2cWdzO5o", libreSsl3Forward_sk_pop_free_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_get_shutdown_nid_no_patch") "jmp *__imp_SSL_get_shutdown_nid_postfix(%rip)\n"); +APS5_EXPORT("P9c-vF6a-hc", libreSsl3Forward_SSL_get_shutdown_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_d2i_RSA_PUBKEY_nid_no_patch") "jmp *__imp_d2i_RSA_PUBKEY_nid_postfix(%rip)\n"); +APS5_EXPORT("PFxpQ6lkQP0", libreSsl3Forward_d2i_RSA_PUBKEY_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_get_ex_new_index_nid_no_patch") "jmp *__imp_SSL_get_ex_new_index_nid_postfix(%rip)\n"); +APS5_EXPORT("PGsWNnS7CE8", libreSsl3Forward_SSL_get_ex_new_index_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EC_KEY_get0_private_key_nid_no_patch") "jmp *__imp_EC_KEY_get0_private_key_nid_postfix(%rip)\n"); +APS5_EXPORT("PZSrBx2jITw", libreSsl3Forward_EC_KEY_get0_private_key_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_RSA_verify_PKCS1_PSS_nid_no_patch") "jmp *__imp_RSA_verify_PKCS1_PSS_nid_postfix(%rip)\n"); +APS5_EXPORT("PjgFQh4K4ic", libreSsl3Forward_RSA_verify_PKCS1_PSS_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_check_private_key_nid_no_patch") "jmp *__imp_SSL_check_private_key_nid_postfix(%rip)\n"); +APS5_EXPORT("PkCPXmop-Eo", libreSsl3Forward_SSL_check_private_key_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_RAND_file_name_nid_no_patch") "jmp *__imp_RAND_file_name_nid_postfix(%rip)\n"); +APS5_EXPORT("Q+B+nBqzer4", libreSsl3Forward_RAND_file_name_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_set_msg_callback_nid_no_patch") "jmp *__imp_SSL_CTX_set_msg_callback_nid_postfix(%rip)\n"); +APS5_EXPORT("QCEx-zcrjKQ", libreSsl3Forward_SSL_CTX_set_msg_callback_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_set_session_id_context_nid_no_patch") "jmp *__imp_SSL_CTX_set_session_id_context_nid_postfix(%rip)\n"); +APS5_EXPORT("QJ6mF2xRR5w", libreSsl3Forward_SSL_CTX_set_session_id_context_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_set_client_cert_cb_nid_no_patch") "jmp *__imp_SSL_CTX_set_client_cert_cb_nid_postfix(%rip)\n"); +APS5_EXPORT("QRd10kzHzxA", libreSsl3Forward_SSL_CTX_set_client_cert_cb_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_set_default_passwd_cb_nid_no_patch") "jmp *__imp_SSL_CTX_set_default_passwd_cb_nid_postfix(%rip)\n"); +APS5_EXPORT("QcMC4x9rNsA", libreSsl3Forward_SSL_CTX_set_default_passwd_cb_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_get_ex_data_nid_no_patch") "jmp *__imp_SSL_get_ex_data_nid_postfix(%rip)\n"); +APS5_EXPORT("QuI09j4a8-k", libreSsl3Forward_SSL_get_ex_data_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_TLS_client_method_nid_no_patch") "jmp *__imp_TLS_client_method_nid_postfix(%rip)\n"); +APS5_EXPORT("R3LE7Aiw2io", libreSsl3Forward_TLS_client_method_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BIO_s_mem_nid_no_patch") "jmp *__imp_BIO_s_mem_nid_postfix(%rip)\n"); +APS5_EXPORT("R86sXhW699g", libreSsl3Forward_BIO_s_mem_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_aes_192_ctr_nid_no_patch") "jmp *__imp_EVP_aes_192_ctr_nid_postfix(%rip)\n"); +APS5_EXPORT("RD9L4eg0m-c", libreSsl3Forward_EVP_aes_192_ctr_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_write_nid_no_patch") "jmp *__imp_SSL_write_nid_postfix(%rip)\n"); +APS5_EXPORT("RG8VRsQoTls", libreSsl3Forward_SSL_write_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BIO_ctrl_nid_no_patch") "jmp *__imp_BIO_ctrl_nid_postfix(%rip)\n"); +APS5_EXPORT("RHpq9hQfTj8", libreSsl3Forward_BIO_ctrl_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_OCSP_response_status_str_nid_no_patch") "jmp *__imp_OCSP_response_status_str_nid_postfix(%rip)\n"); +APS5_EXPORT("RXfZeZ+h06Y", libreSsl3Forward_OCSP_response_status_str_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_AES_set_encrypt_key_nid_no_patch") "jmp *__imp_AES_set_encrypt_key_nid_postfix(%rip)\n"); +APS5_EXPORT("RpzLa-jjWnA", libreSsl3Forward_AES_set_encrypt_key_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SHA512_Init_nid_no_patch") "jmp *__imp_SHA512_Init_nid_postfix(%rip)\n"); +APS5_EXPORT("S2gQI2nZ8FE", libreSsl3Forward_SHA512_Init_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_PKEY_free_nid_no_patch") "jmp *__imp_EVP_PKEY_free_nid_postfix(%rip)\n"); +APS5_EXPORT("S7L4OYSnC0Q", libreSsl3Forward_EVP_PKEY_free_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_UI_method_set_closer_nid_no_patch") "jmp *__imp_UI_method_set_closer_nid_postfix(%rip)\n"); +APS5_EXPORT("SIUk+wWJO0w", libreSsl3Forward_UI_method_set_closer_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_EncryptInit_ex_nid_no_patch") "jmp *__imp_EVP_EncryptInit_ex_nid_postfix(%rip)\n"); +APS5_EXPORT("SKlr+nCivO4", libreSsl3Forward_EVP_EncryptInit_ex_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_DigestInit_ex_nid_no_patch") "jmp *__imp_EVP_DigestInit_ex_nid_postfix(%rip)\n"); +APS5_EXPORT("SX2VlKarfpU", libreSsl3Forward_EVP_DigestInit_ex_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_get0_alpn_selected_nid_no_patch") "jmp *__imp_SSL_get0_alpn_selected_nid_postfix(%rip)\n"); +APS5_EXPORT("Sgoz1K4G3xY", libreSsl3Forward_SSL_get0_alpn_selected_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EC_POINT_mul_nid_no_patch") "jmp *__imp_EC_POINT_mul_nid_postfix(%rip)\n"); +APS5_EXPORT("Sw6hs2iJZkU", libreSsl3Forward_EC_POINT_mul_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_MD4_Update_nid_no_patch") "jmp *__imp_MD4_Update_nid_postfix(%rip)\n"); +APS5_EXPORT("T1iBRWloVjg", libreSsl3Forward_MD4_Update_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_CRYPTO_malloc_nid_no_patch") "jmp *__imp_CRYPTO_malloc_nid_postfix(%rip)\n"); +APS5_EXPORT("TLIFhMZosmw", libreSsl3Forward_CRYPTO_malloc_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_get_certificate_nid_no_patch") "jmp *__imp_SSL_get_certificate_nid_postfix(%rip)\n"); +APS5_EXPORT("TUYoEUSlXss", libreSsl3Forward_SSL_get_certificate_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_CRYPTO_set_mem_functions_nid_no_patch") "jmp *__imp_CRYPTO_set_mem_functions_nid_postfix(%rip)\n"); +APS5_EXPORT("Ts1rKbGPoN4", libreSsl3Forward_CRYPTO_set_mem_functions_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EC_POINT_oct2point_nid_no_patch") "jmp *__imp_EC_POINT_oct2point_nid_postfix(%rip)\n"); +APS5_EXPORT("U4XJUmHlBk8", libreSsl3Forward_EC_POINT_oct2point_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_set_default_passwd_cb_userdata_nid_no_patch") "jmp *__imp_SSL_CTX_set_default_passwd_cb_userdata_nid_postfix(%rip)\n"); +APS5_EXPORT("U8LOoQe7z3k", libreSsl3Forward_SSL_CTX_set_default_passwd_cb_userdata_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_use_certificate_ASN1_nid_no_patch") "jmp *__imp_SSL_use_certificate_ASN1_nid_postfix(%rip)\n"); +APS5_EXPORT("UEnSKAL48eA", libreSsl3Forward_SSL_use_certificate_ASN1_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_AES_ecb_encrypt_nid_no_patch") "jmp *__imp_AES_ecb_encrypt_nid_postfix(%rip)\n"); +APS5_EXPORT("UJQisAyEvSU", libreSsl3Forward_AES_ecb_encrypt_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_OBJ_nid2sn_nid_no_patch") "jmp *__imp_OBJ_nid2sn_nid_postfix(%rip)\n"); +APS5_EXPORT("UWX7khvY9iw", libreSsl3Forward_OBJ_nid2sn_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SHA512_Update_nid_no_patch") "jmp *__imp_SHA512_Update_nid_postfix(%rip)\n"); +APS5_EXPORT("UdP5qTZTQzw", libreSsl3Forward_SHA512_Update_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ASN1_STRING_length_nid_no_patch") "jmp *__imp_ASN1_STRING_length_nid_postfix(%rip)\n"); +APS5_EXPORT("UeeYJN-SzZ8", libreSsl3Forward_ASN1_STRING_length_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_RSA_size_nid_no_patch") "jmp *__imp_RSA_size_nid_postfix(%rip)\n"); +APS5_EXPORT("UukOy6kz+VM", libreSsl3Forward_RSA_size_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_d2i_PKCS12_bio_nid_no_patch") "jmp *__imp_d2i_PKCS12_bio_nid_postfix(%rip)\n"); +APS5_EXPORT("V7q2nQQj-Ow", libreSsl3Forward_d2i_PKCS12_bio_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_set_fd_nid_no_patch") "jmp *__imp_SSL_set_fd_nid_postfix(%rip)\n"); +APS5_EXPORT("VLvKI1JQntk", libreSsl3Forward_SSL_set_fd_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_RSA_public_encrypt_nid_no_patch") "jmp *__imp_RSA_public_encrypt_nid_postfix(%rip)\n"); +APS5_EXPORT("VcKj43HAQDk", libreSsl3Forward_RSA_public_encrypt_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BN_num_bits_nid_no_patch") "jmp *__imp_BN_num_bits_nid_postfix(%rip)\n"); +APS5_EXPORT("VpW3ZH9ZKxY", libreSsl3Forward_BN_num_bits_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_set_quiet_shutdown_nid_no_patch") "jmp *__imp_SSL_CTX_set_quiet_shutdown_nid_postfix(%rip)\n"); +APS5_EXPORT("VtLCmCa4-IQ", libreSsl3Forward_SSL_CTX_set_quiet_shutdown_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_OBJ_create_nid_no_patch") "jmp *__imp_OBJ_create_nid_postfix(%rip)\n"); +APS5_EXPORT("VvDiRHz3WQk", libreSsl3Forward_OBJ_create_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_i2a_ASN1_OBJECT_nid_no_patch") "jmp *__imp_i2a_ASN1_OBJECT_nid_postfix(%rip)\n"); +APS5_EXPORT("WUZiQnZvttc", libreSsl3Forward_i2a_ASN1_OBJECT_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EC_KEY_generate_key_nid_no_patch") "jmp *__imp_EC_KEY_generate_key_nid_postfix(%rip)\n"); +APS5_EXPORT("WVDyhysv8q4", libreSsl3Forward_EC_KEY_generate_key_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_set_SSL_CTX_nid_no_patch") "jmp *__imp_SSL_set_SSL_CTX_nid_postfix(%rip)\n"); +APS5_EXPORT("WXg9MX8BXPg", libreSsl3Forward_SSL_set_SSL_CTX_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_set_verify_nid_no_patch") "jmp *__imp_SSL_CTX_set_verify_nid_postfix(%rip)\n"); +APS5_EXPORT("WgKbCCA4IHY", libreSsl3Forward_SSL_CTX_set_verify_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EC_KEY_get0_public_key_nid_no_patch") "jmp *__imp_EC_KEY_get0_public_key_nid_postfix(%rip)\n"); +APS5_EXPORT("WvdR33NV7tA", libreSsl3Forward_EC_KEY_get0_public_key_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_VERIFY_PARAM_set_hostflags_nid_no_patch") "jmp *__imp_X509_VERIFY_PARAM_set_hostflags_nid_postfix(%rip)\n"); +APS5_EXPORT("WwU55zoaAME", libreSsl3Forward_X509_VERIFY_PARAM_set_hostflags_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_RSA_public_decrypt_nid_no_patch") "jmp *__imp_RSA_public_decrypt_nid_postfix(%rip)\n"); +APS5_EXPORT("X-ncAvI14sg", libreSsl3Forward_RSA_public_decrypt_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_i2t_ASN1_OBJECT_nid_no_patch") "jmp *__imp_i2t_ASN1_OBJECT_nid_postfix(%rip)\n"); +APS5_EXPORT("X4-OCWkADJg", libreSsl3Forward_i2t_ASN1_OBJECT_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_sk_pop_nid_no_patch") "jmp *__imp_sk_pop_nid_postfix(%rip)\n"); +APS5_EXPORT("XCv0qOUtAu8", libreSsl3Forward_sk_pop_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_aes_192_cfb8_nid_no_patch") "jmp *__imp_EVP_aes_192_cfb8_nid_postfix(%rip)\n"); +APS5_EXPORT("XjdUq9LgZcU", libreSsl3Forward_EVP_aes_192_cfb8_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_CMAC_Update_nid_no_patch") "jmp *__imp_CMAC_Update_nid_postfix(%rip)\n"); +APS5_EXPORT("XpAJ1Ckg-q4", libreSsl3Forward_CMAC_Update_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_OCSP_resp_count_nid_no_patch") "jmp *__imp_OCSP_resp_count_nid_postfix(%rip)\n"); +APS5_EXPORT("Y4NRPm9miAc", libreSsl3Forward_OCSP_resp_count_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_DigestVerifyInit_nid_no_patch") "jmp *__imp_EVP_DigestVerifyInit_nid_postfix(%rip)\n"); +APS5_EXPORT("Y5ChdsxEESU", libreSsl3Forward_EVP_DigestVerifyInit_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ASN1_STRING_data_nid_no_patch") "jmp *__imp_ASN1_STRING_data_nid_postfix(%rip)\n"); +APS5_EXPORT("YcJlolMfV0k", libreSsl3Forward_ASN1_STRING_data_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_free_nid_no_patch") "jmp *__imp_X509_free_nid_postfix(%rip)\n"); +APS5_EXPORT("YgfU8FqE-38", libreSsl3Forward_X509_free_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_NAME_oneline_nid_no_patch") "jmp *__imp_X509_NAME_oneline_nid_postfix(%rip)\n"); +APS5_EXPORT("YuUcRhTYWMg", libreSsl3Forward_X509_NAME_oneline_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_aes_128_cfb8_nid_no_patch") "jmp *__imp_EVP_aes_128_cfb8_nid_postfix(%rip)\n"); +APS5_EXPORT("Yvgbj5WSi1M", libreSsl3Forward_EVP_aes_128_cfb8_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_AES_cbc_encrypt_nid_no_patch") "jmp *__imp_AES_cbc_encrypt_nid_postfix(%rip)\n"); +APS5_EXPORT("Z55J-I6291o", libreSsl3Forward_AES_cbc_encrypt_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_get_privatekey_nid_no_patch") "jmp *__imp_SSL_get_privatekey_nid_postfix(%rip)\n"); +APS5_EXPORT("ZCrqHPiB4ro", libreSsl3Forward_SSL_get_privatekey_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_UI_get_input_flags_nid_no_patch") "jmp *__imp_UI_get_input_flags_nid_postfix(%rip)\n"); +APS5_EXPORT("ZD46Jw2jyyg", libreSsl3Forward_UI_get_input_flags_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_aes_128_gcm_nid_no_patch") "jmp *__imp_EVP_aes_128_gcm_nid_postfix(%rip)\n"); +APS5_EXPORT("ZIFUDmJiS7M", libreSsl3Forward_EVP_aes_128_gcm_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BN_print_nid_no_patch") "jmp *__imp_BN_print_nid_postfix(%rip)\n"); +APS5_EXPORT("ZJvtsevwowQ", libreSsl3Forward_BN_print_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SHA256_nid_no_patch") "jmp *__imp_SHA256_nid_postfix(%rip)\n"); +APS5_EXPORT("ZUoKWZ2dJVo", libreSsl3Forward_SHA256_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_HMAC_CTX_cleanup_nid_no_patch") "jmp *__imp_HMAC_CTX_cleanup_nid_postfix(%rip)\n"); +APS5_EXPORT("Zqp-j+acPK0", libreSsl3Forward_HMAC_CTX_cleanup_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_MD_CTX_create_nid_no_patch") "jmp *__imp_EVP_MD_CTX_create_nid_postfix(%rip)\n"); +APS5_EXPORT("a81mBvClIkA", libreSsl3Forward_EVP_MD_CTX_create_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_OCSP_single_get0_status_nid_no_patch") "jmp *__imp_OCSP_single_get0_status_nid_postfix(%rip)\n"); +APS5_EXPORT("aDocnzTS+uU", libreSsl3Forward_OCSP_single_get0_status_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_check_issued_nid_no_patch") "jmp *__imp_X509_check_issued_nid_postfix(%rip)\n"); +APS5_EXPORT("aG9B1dfdD9M", libreSsl3Forward_X509_check_issued_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BN_CTX_new_nid_no_patch") "jmp *__imp_BN_CTX_new_nid_postfix(%rip)\n"); +APS5_EXPORT("aU-Pon77jAs", libreSsl3Forward_BN_CTX_new_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SHA384_Final_nid_no_patch") "jmp *__imp_SHA384_Final_nid_postfix(%rip)\n"); +APS5_EXPORT("aVt320GW3sY", libreSsl3Forward_SHA384_Final_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_STORE_CTX_get_chain_nid_no_patch") "jmp *__imp_X509_STORE_CTX_get_chain_nid_postfix(%rip)\n"); +APS5_EXPORT("ahQi-9i4dqQ", libreSsl3Forward_X509_STORE_CTX_get_chain_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_set_ex_data_nid_no_patch") "jmp *__imp_SSL_CTX_set_ex_data_nid_postfix(%rip)\n"); +APS5_EXPORT("b1Xi5gOUvJA", libreSsl3Forward_SSL_CTX_set_ex_data_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_HMAC_Update_nid_no_patch") "jmp *__imp_HMAC_Update_nid_postfix(%rip)\n"); +APS5_EXPORT("bKolEm5dHJs", libreSsl3Forward_HMAC_Update_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_RSA_private_encrypt_nid_no_patch") "jmp *__imp_RSA_private_encrypt_nid_postfix(%rip)\n"); +APS5_EXPORT("bR0UooC+SX8", libreSsl3Forward_RSA_private_encrypt_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SHA384_Update_nid_no_patch") "jmp *__imp_SHA384_Update_nid_postfix(%rip)\n"); +APS5_EXPORT("bRD04jjEhv0", libreSsl3Forward_SHA384_Update_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_NAME_get_entry_nid_no_patch") "jmp *__imp_X509_NAME_get_entry_nid_postfix(%rip)\n"); +APS5_EXPORT("bhJIfJ88riw", libreSsl3Forward_X509_NAME_get_entry_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_AES_ctr128_encrypt_nid_no_patch") "jmp *__imp_AES_ctr128_encrypt_nid_postfix(%rip)\n"); +APS5_EXPORT("bu4dl8I0Now", libreSsl3Forward_AES_ctr128_encrypt_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_OCSP_RESPONSE_free_nid_no_patch") "jmp *__imp_OCSP_RESPONSE_free_nid_postfix(%rip)\n"); +APS5_EXPORT("bznVjTfYf9U", libreSsl3Forward_OCSP_RESPONSE_free_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_UI_OpenSSL_nid_no_patch") "jmp *__imp_UI_OpenSSL_nid_postfix(%rip)\n"); +APS5_EXPORT("c+psqZtgRgA", libreSsl3Forward_UI_OpenSSL_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_CMAC_CTX_free_nid_no_patch") "jmp *__imp_CMAC_CTX_free_nid_postfix(%rip)\n"); +APS5_EXPORT("cBNGAG1DkXc", libreSsl3Forward_CMAC_CTX_free_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_PKCS12_parse_nid_no_patch") "jmp *__imp_PKCS12_parse_nid_postfix(%rip)\n"); +APS5_EXPORT("cUDs1oT5mqM", libreSsl3Forward_PKCS12_parse_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SHA512_Final_nid_no_patch") "jmp *__imp_SHA512_Final_nid_postfix(%rip)\n"); +APS5_EXPORT("chFrHZ6pJm0", libreSsl3Forward_SHA512_Final_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_Digest_nid_no_patch") "jmp *__imp_EVP_Digest_nid_postfix(%rip)\n"); +APS5_EXPORT("d95AS8gZm4w", libreSsl3Forward_EVP_Digest_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_VERIFY_PARAM_set1_host_nid_no_patch") "jmp *__imp_X509_VERIFY_PARAM_set1_host_nid_postfix(%rip)\n"); +APS5_EXPORT("dE6EbLNjC3A", libreSsl3Forward_X509_VERIFY_PARAM_set1_host_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_verify_cert_error_string_nid_no_patch") "jmp *__imp_X509_verify_cert_error_string_nid_postfix(%rip)\n"); +APS5_EXPORT("dKG2qYSn0Sc", libreSsl3Forward_X509_verify_cert_error_string_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ENGINE_finish_nid_no_patch") "jmp *__imp_ENGINE_finish_nid_postfix(%rip)\n"); +APS5_EXPORT("dMbPuG5+zI4", libreSsl3Forward_ENGINE_finish_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_CIPHER_CTX_cleanup_nid_no_patch") "jmp *__imp_EVP_CIPHER_CTX_cleanup_nid_postfix(%rip)\n"); +APS5_EXPORT("daeq2j6k3Bc", libreSsl3Forward_EVP_CIPHER_CTX_cleanup_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_set_alpn_protos_nid_no_patch") "jmp *__imp_SSL_CTX_set_alpn_protos_nid_postfix(%rip)\n"); +APS5_EXPORT("docwoXAMK24", libreSsl3Forward_SSL_CTX_set_alpn_protos_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_OCSP_response_status_nid_no_patch") "jmp *__imp_OCSP_response_status_nid_postfix(%rip)\n"); +APS5_EXPORT("eGtZan3bzYA", libreSsl3Forward_OCSP_response_status_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BIO_puts_nid_no_patch") "jmp *__imp_BIO_puts_nid_postfix(%rip)\n"); +APS5_EXPORT("eVcWmVlimPA", libreSsl3Forward_BIO_puts_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_DTLSv1_client_method_nid_no_patch") "jmp *__imp_DTLSv1_client_method_nid_postfix(%rip)\n"); +APS5_EXPORT("ef6LHi9kFVA", libreSsl3Forward_DTLSv1_client_method_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EC_KEY_set_public_key_nid_no_patch") "jmp *__imp_EC_KEY_set_public_key_nid_postfix(%rip)\n"); +APS5_EXPORT("ez2aUegdWWY", libreSsl3Forward_EC_KEY_set_public_key_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SHA256_Update_nid_no_patch") "jmp *__imp_SHA256_Update_nid_postfix(%rip)\n"); +APS5_EXPORT("ezeFkHDV4K8", libreSsl3Forward_SHA256_Update_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_STORE_set_flags_nid_no_patch") "jmp *__imp_X509_STORE_set_flags_nid_postfix(%rip)\n"); +APS5_EXPORT("fJ3lp5T2HxA", libreSsl3Forward_X509_STORE_set_flags_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ENGINE_load_builtin_engines_nid_no_patch") "jmp *__imp_ENGINE_load_builtin_engines_nid_postfix(%rip)\n"); +APS5_EXPORT("fR1b6Fe21KQ", libreSsl3Forward_ENGINE_load_builtin_engines_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_DES_ecb_encrypt_nid_no_patch") "jmp *__imp_DES_ecb_encrypt_nid_postfix(%rip)\n"); +APS5_EXPORT("fUKL6ZhILWM", libreSsl3Forward_DES_ecb_encrypt_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_STORE_CTX_get1_chain_nid_no_patch") "jmp *__imp_X509_STORE_CTX_get1_chain_nid_postfix(%rip)\n"); +APS5_EXPORT("fuCQ5xUzG2U", libreSsl3Forward_X509_STORE_CTX_get1_chain_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ERR_error_string_n_nid_no_patch") "jmp *__imp_ERR_error_string_n_nid_postfix(%rip)\n"); +APS5_EXPORT("g2Dgo0zmHL8", libreSsl3Forward_ERR_error_string_n_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SHA1_Update_nid_no_patch") "jmp *__imp_SHA1_Update_nid_postfix(%rip)\n"); +APS5_EXPORT("gAsOAG-t-7s", libreSsl3Forward_SHA1_Update_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_use_PrivateKey_nid_no_patch") "jmp *__imp_SSL_CTX_use_PrivateKey_nid_postfix(%rip)\n"); +APS5_EXPORT("gOkOm9Vnf9s", libreSsl3Forward_SSL_CTX_use_PrivateKey_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_free_nid_no_patch") "jmp *__imp_SSL_free_nid_postfix(%rip)\n"); +APS5_EXPORT("gOmQbOkqJBE", libreSsl3Forward_SSL_free_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EC_POINT_new_nid_no_patch") "jmp *__imp_EC_POINT_new_nid_postfix(%rip)\n"); +APS5_EXPORT("gW+And3d2E4", libreSsl3Forward_EC_POINT_new_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_CONF_modules_free_nid_no_patch") "jmp *__imp_CONF_modules_free_nid_postfix(%rip)\n"); +APS5_EXPORT("gWNKviFrCKg", libreSsl3Forward_CONF_modules_free_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ERR_free_strings_nid_no_patch") "jmp *__imp_ERR_free_strings_nid_postfix(%rip)\n"); +APS5_EXPORT("gdAW0ETVhxk", libreSsl3Forward_ERR_free_strings_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_want_nid_no_patch") "jmp *__imp_SSL_want_nid_postfix(%rip)\n"); +APS5_EXPORT("gidiaOjZZuQ", libreSsl3Forward_SSL_want_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_get_verify_mode_nid_no_patch") "jmp *__imp_SSL_CTX_get_verify_mode_nid_postfix(%rip)\n"); +APS5_EXPORT("gvqHrw6-Q5o", libreSsl3Forward_SSL_CTX_get_verify_mode_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_OCSP_basic_add1_cert_nid_no_patch") "jmp *__imp_OCSP_basic_add1_cert_nid_postfix(%rip)\n"); +APS5_EXPORT("h-RB8SdvX6U", libreSsl3Forward_OCSP_basic_add1_cert_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_md5_nid_no_patch") "jmp *__imp_EVP_md5_nid_postfix(%rip)\n"); +APS5_EXPORT("h1xWU1RxIG4", libreSsl3Forward_EVP_md5_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_NAME_print_ex_nid_no_patch") "jmp *__imp_X509_NAME_print_ex_nid_postfix(%rip)\n"); +APS5_EXPORT("hA5cY8jRKVE", libreSsl3Forward_X509_NAME_print_ex_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_alert_desc_string_long_nid_no_patch") "jmp *__imp_SSL_alert_desc_string_long_nid_postfix(%rip)\n"); +APS5_EXPORT("hGwz-8X0XO8", libreSsl3Forward_SSL_alert_desc_string_long_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_SESSION_free_nid_no_patch") "jmp *__imp_SSL_SESSION_free_nid_postfix(%rip)\n"); +APS5_EXPORT("hIb43mo9ubQ", libreSsl3Forward_SSL_SESSION_free_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EC_GROUP_free_nid_no_patch") "jmp *__imp_EC_GROUP_free_nid_postfix(%rip)\n"); +APS5_EXPORT("hMV6sxdqoCE", libreSsl3Forward_EC_GROUP_free_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ECDH_compute_key_nid_no_patch") "jmp *__imp_ECDH_compute_key_nid_postfix(%rip)\n"); +APS5_EXPORT("hOHLNfago9M", libreSsl3Forward_ECDH_compute_key_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_STORE_add_lookup_nid_no_patch") "jmp *__imp_X509_STORE_add_lookup_nid_postfix(%rip)\n"); +APS5_EXPORT("hfQQVK3sYeg", libreSsl3Forward_X509_STORE_add_lookup_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_OCSP_resp_get0_nid_no_patch") "jmp *__imp_OCSP_resp_get0_nid_postfix(%rip)\n"); +APS5_EXPORT("hxEUBVTHcys", libreSsl3Forward_OCSP_resp_get0_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EC_KEY_set_private_key_nid_no_patch") "jmp *__imp_EC_KEY_set_private_key_nid_postfix(%rip)\n"); +APS5_EXPORT("i0q6BKDSDQY", libreSsl3Forward_EC_KEY_set_private_key_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_connect_nid_no_patch") "jmp *__imp_SSL_connect_nid_postfix(%rip)\n"); +APS5_EXPORT("i9AvJK-l5Jk", libreSsl3Forward_SSL_connect_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BN_free_nid_no_patch") "jmp *__imp_BN_free_nid_postfix(%rip)\n"); +APS5_EXPORT("iEE4nhybTTw", libreSsl3Forward_BN_free_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_ctrl_nid_no_patch") "jmp *__imp_SSL_ctrl_nid_postfix(%rip)\n"); +APS5_EXPORT("iGuym9i4NcU", libreSsl3Forward_SSL_ctrl_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_RAND_bytes_nid_no_patch") "jmp *__imp_RAND_bytes_nid_postfix(%rip)\n"); +APS5_EXPORT("iM-jh22O6cI", libreSsl3Forward_RAND_bytes_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_STORE_CTX_get_current_cert_nid_no_patch") "jmp *__imp_X509_STORE_CTX_get_current_cert_nid_postfix(%rip)\n"); +APS5_EXPORT("iYXf-uzLKL0", libreSsl3Forward_X509_STORE_CTX_get_current_cert_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_NAME_get_index_by_NID_nid_no_patch") "jmp *__imp_X509_NAME_get_index_by_NID_nid_postfix(%rip)\n"); +APS5_EXPORT("irG0C95la6g", libreSsl3Forward_X509_NAME_get_index_by_NID_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_get_fd_nid_no_patch") "jmp *__imp_SSL_get_fd_nid_postfix(%rip)\n"); +APS5_EXPORT("irGidH1uj1g", libreSsl3Forward_SSL_get_fd_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_UI_set_result_nid_no_patch") "jmp *__imp_UI_set_result_nid_postfix(%rip)\n"); +APS5_EXPORT("itmWuKlMzFI", libreSsl3Forward_UI_set_result_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_sk_value_nid_no_patch") "jmp *__imp_sk_value_nid_postfix(%rip)\n"); +APS5_EXPORT("izfIVmcJB4o", libreSsl3Forward_sk_value_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_load_verify_locations_nid_no_patch") "jmp *__imp_SSL_CTX_load_verify_locations_nid_postfix(%rip)\n"); +APS5_EXPORT("j8yt5Jk44pk", libreSsl3Forward_SSL_CTX_load_verify_locations_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BIO_s_file_nid_no_patch") "jmp *__imp_BIO_s_file_nid_postfix(%rip)\n"); +APS5_EXPORT("jA8zOzBRX28", libreSsl3Forward_BIO_s_file_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_get_ex_data_nid_no_patch") "jmp *__imp_SSL_CTX_get_ex_data_nid_postfix(%rip)\n"); +APS5_EXPORT("jLew9e14VI8", libreSsl3Forward_SSL_CTX_get_ex_data_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_add_client_CA_nid_no_patch") "jmp *__imp_SSL_CTX_add_client_CA_nid_postfix(%rip)\n"); +APS5_EXPORT("jRon+xfcXtU", libreSsl3Forward_SSL_CTX_add_client_CA_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EC_KEY_new_nid_no_patch") "jmp *__imp_EC_KEY_new_nid_postfix(%rip)\n"); +APS5_EXPORT("jSCucWQXbRg", libreSsl3Forward_EC_KEY_new_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_d2i_X509_nid_no_patch") "jmp *__imp_d2i_X509_nid_postfix(%rip)\n"); +APS5_EXPORT("ja-Nmtu-jG8", libreSsl3Forward_d2i_X509_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_get_SSL_CTX_nid_no_patch") "jmp *__imp_SSL_get_SSL_CTX_nid_postfix(%rip)\n"); +APS5_EXPORT("jp+4L0zhE+k", libreSsl3Forward_SSL_get_SSL_CTX_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_UI_method_get_closer_nid_no_patch") "jmp *__imp_UI_method_get_closer_nid_postfix(%rip)\n"); +APS5_EXPORT("jpUjTzRbB4k", libreSsl3Forward_UI_method_get_closer_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_CRYPTO_free_nid_no_patch") "jmp *__imp_CRYPTO_free_nid_postfix(%rip)\n"); +APS5_EXPORT("jr41BgCFUZE", libreSsl3Forward_CRYPTO_free_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_sceLibreSslInitEx_nid_no_patch") "jmp *__imp_sceLibreSslInitEx(%rip)\n"); +APS5_EXPORT("jri3LyXhEGw", libreSsl3Forward_sceLibreSslInitEx_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_STORE_CTX_get_error_depth_nid_no_patch") "jmp *__imp_X509_STORE_CTX_get_error_depth_nid_postfix(%rip)\n"); +APS5_EXPORT("jyTWV0OsGc4", libreSsl3Forward_X509_STORE_CTX_get_error_depth_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_UI_method_get_reader_nid_no_patch") "jmp *__imp_UI_method_get_reader_nid_postfix(%rip)\n"); +APS5_EXPORT("k+zHwjrbxsI", libreSsl3Forward_UI_method_get_reader_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_RSA_new_nid_no_patch") "jmp *__imp_RSA_new_nid_postfix(%rip)\n"); +APS5_EXPORT("kADEz2eAE7c", libreSsl3Forward_RSA_new_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_GENERAL_NAMES_free_nid_no_patch") "jmp *__imp_GENERAL_NAMES_free_nid_postfix(%rip)\n"); +APS5_EXPORT("kKlQ4e-mbjc", libreSsl3Forward_GENERAL_NAMES_free_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_RSA_verify_nid_no_patch") "jmp *__imp_RSA_verify_nid_postfix(%rip)\n"); +APS5_EXPORT("kPVQ5FK0f24", libreSsl3Forward_RSA_verify_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_STORE_add_crl_nid_no_patch") "jmp *__imp_X509_STORE_add_crl_nid_postfix(%rip)\n"); +APS5_EXPORT("lN+8Q-cBYXQ", libreSsl3Forward_X509_STORE_add_crl_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BN_add_word_nid_no_patch") "jmp *__imp_BN_add_word_nid_postfix(%rip)\n"); +APS5_EXPORT("lVt0Ux1pAcg", libreSsl3Forward_BN_add_word_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_read_nid_no_patch") "jmp *__imp_SSL_read_nid_postfix(%rip)\n"); +APS5_EXPORT("lg5Z+eVXA-A", libreSsl3Forward_SSL_read_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_OCSP_basic_verify_nid_no_patch") "jmp *__imp_OCSP_basic_verify_nid_postfix(%rip)\n"); +APS5_EXPORT("lgmXPGgPjUY", libreSsl3Forward_OCSP_basic_verify_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_new_nid_no_patch") "jmp *__imp_SSL_CTX_new_nid_postfix(%rip)\n"); +APS5_EXPORT("lhgt7StD7RM", libreSsl3Forward_SSL_CTX_new_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_EXTENSION_get_data_nid_no_patch") "jmp *__imp_X509_EXTENSION_get_data_nid_postfix(%rip)\n"); +APS5_EXPORT("li4G2knb-vI", libreSsl3Forward_X509_EXTENSION_get_data_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_CRYPTO_THREADID_set_numeric_nid_no_patch") "jmp *__imp_CRYPTO_THREADID_set_numeric_nid_postfix(%rip)\n"); +APS5_EXPORT("ln23C1hwb5o", libreSsl3Forward_CRYPTO_THREADID_set_numeric_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_CIPHER_CTX_ctrl_nid_no_patch") "jmp *__imp_EVP_CIPHER_CTX_ctrl_nid_postfix(%rip)\n"); +APS5_EXPORT("loEDv3wwKmc", libreSsl3Forward_EVP_CIPHER_CTX_ctrl_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BIO_free_nid_no_patch") "jmp *__imp_BIO_free_nid_postfix(%rip)\n"); +APS5_EXPORT("lpJ3zhgftCg", libreSsl3Forward_BIO_free_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_MD4_Init_nid_no_patch") "jmp *__imp_MD4_Init_nid_postfix(%rip)\n"); +APS5_EXPORT("lsoHI3p77nU", libreSsl3Forward_MD4_Init_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_RAND_status_nid_no_patch") "jmp *__imp_RAND_status_nid_postfix(%rip)\n"); +APS5_EXPORT("m8AIQvFZFZQ", libreSsl3Forward_RAND_status_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_AES_encrypt_nid_no_patch") "jmp *__imp_AES_encrypt_nid_postfix(%rip)\n"); +APS5_EXPORT("m8Qg8VAe++Q", libreSsl3Forward_AES_encrypt_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BIO_new_socket_nid_no_patch") "jmp *__imp_BIO_new_socket_nid_postfix(%rip)\n"); +APS5_EXPORT("mA0RfEpzpp8", libreSsl3Forward_BIO_new_socket_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_DES_set_key_nid_no_patch") "jmp *__imp_DES_set_key_nid_postfix(%rip)\n"); +APS5_EXPORT("mVU3F9ZQgus", libreSsl3Forward_DES_set_key_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_MD5_Init_nid_no_patch") "jmp *__imp_MD5_Init_nid_postfix(%rip)\n"); +APS5_EXPORT("muak2D0KKx8", libreSsl3Forward_MD5_Init_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_CMAC_CTX_new_nid_no_patch") "jmp *__imp_CMAC_CTX_new_nid_postfix(%rip)\n"); +APS5_EXPORT("mwJYST4Bb3U", libreSsl3Forward_CMAC_CTX_new_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_sceLibreSslTerm_nid_no_patch") "jmp *__imp_sceLibreSslTerm(%rip)\n"); +APS5_EXPORT("n2fSRzuTEY4", libreSsl3Forward_sceLibreSslTerm_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_PKCS12_PBE_add_nid_no_patch") "jmp *__imp_PKCS12_PBE_add_nid_postfix(%rip)\n"); +APS5_EXPORT("n5TrUOqCmfI", libreSsl3Forward_PKCS12_PBE_add_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BIO_write_nid_no_patch") "jmp *__imp_BIO_write_nid_postfix(%rip)\n"); +APS5_EXPORT("nH7XM+HhXWc", libreSsl3Forward_BIO_write_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ENGINE_set_default_nid_no_patch") "jmp *__imp_ENGINE_set_default_nid_postfix(%rip)\n"); +APS5_EXPORT("nPlaotGlNnk", libreSsl3Forward_ENGINE_set_default_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_sha384_nid_no_patch") "jmp *__imp_EVP_sha384_nid_postfix(%rip)\n"); +APS5_EXPORT("nRYvlfcejis", libreSsl3Forward_EVP_sha384_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_NAME_get_text_by_NID_nid_no_patch") "jmp *__imp_X509_NAME_get_text_by_NID_nid_postfix(%rip)\n"); +APS5_EXPORT("nfHwXQKYceU", libreSsl3Forward_X509_NAME_get_text_by_NID_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_GENERAL_NAME_free_nid_no_patch") "jmp *__imp_GENERAL_NAME_free_nid_postfix(%rip)\n"); +APS5_EXPORT("nizs7hXvioQ", libreSsl3Forward_GENERAL_NAME_free_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EC_KEY_check_key_nid_no_patch") "jmp *__imp_EC_KEY_check_key_nid_postfix(%rip)\n"); +APS5_EXPORT("nv47rdhcTd8", libreSsl3Forward_EC_KEY_check_key_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_MD_CTX_init_nid_no_patch") "jmp *__imp_EVP_MD_CTX_init_nid_postfix(%rip)\n"); +APS5_EXPORT("nxCPeDBLP5U", libreSsl3Forward_EVP_MD_CTX_init_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_MD5_Final_nid_no_patch") "jmp *__imp_MD5_Final_nid_postfix(%rip)\n"); +APS5_EXPORT("o01rnQ1YyYI", libreSsl3Forward_MD5_Final_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_HMAC_Init_ex_nid_no_patch") "jmp *__imp_HMAC_Init_ex_nid_postfix(%rip)\n"); +APS5_EXPORT("o35I9yFo0sA", libreSsl3Forward_HMAC_Init_ex_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_aes_256_cfb8_nid_no_patch") "jmp *__imp_EVP_aes_256_cfb8_nid_postfix(%rip)\n"); +APS5_EXPORT("o5ZNfuML+b8", libreSsl3Forward_EVP_aes_256_cfb8_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_OCSP_check_validity_nid_no_patch") "jmp *__imp_OCSP_check_validity_nid_postfix(%rip)\n"); +APS5_EXPORT("o9X6YNkg0G4", libreSsl3Forward_OCSP_check_validity_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_cleanup_nid_no_patch") "jmp *__imp_EVP_cleanup_nid_postfix(%rip)\n"); +APS5_EXPORT("oS+tOQc+xHw", libreSsl3Forward_EVP_cleanup_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BIO_f_ssl_nid_no_patch") "jmp *__imp_BIO_f_ssl_nid_postfix(%rip)\n"); +APS5_EXPORT("oTAnMyqo6bI", libreSsl3Forward_BIO_f_ssl_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_MD5_Update_nid_no_patch") "jmp *__imp_MD5_Update_nid_postfix(%rip)\n"); +APS5_EXPORT("oTayTlKeUBY", libreSsl3Forward_MD5_Update_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_PKEY_copy_parameters_nid_no_patch") "jmp *__imp_EVP_PKEY_copy_parameters_nid_postfix(%rip)\n"); +APS5_EXPORT("oa8shQdXY2A", libreSsl3Forward_EVP_PKEY_copy_parameters_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_OBJ_obj2nid_nid_no_patch") "jmp *__imp_OBJ_obj2nid_nid_postfix(%rip)\n"); +APS5_EXPORT("odSR1DiNc1o", libreSsl3Forward_OBJ_obj2nid_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_sk_num_nid_no_patch") "jmp *__imp_sk_num_nid_postfix(%rip)\n"); +APS5_EXPORT("omT5ldW9X3E", libreSsl3Forward_sk_num_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_UI_method_set_reader_nid_no_patch") "jmp *__imp_UI_method_set_reader_nid_postfix(%rip)\n"); +APS5_EXPORT("omgDKNrhqrs", libreSsl3Forward_UI_method_set_reader_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_get_peer_cert_chain_nid_no_patch") "jmp *__imp_SSL_get_peer_cert_chain_nid_postfix(%rip)\n"); +APS5_EXPORT("ooPcqksbLj4", libreSsl3Forward_SSL_get_peer_cert_chain_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_get_peer_certificate_nid_no_patch") "jmp *__imp_SSL_get_peer_certificate_nid_postfix(%rip)\n"); +APS5_EXPORT("oye9egd7IbA", libreSsl3Forward_SSL_get_peer_certificate_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SHA256_Init_nid_no_patch") "jmp *__imp_SHA256_Init_nid_postfix(%rip)\n"); +APS5_EXPORT("p0Bz7Spfm3I", libreSsl3Forward_SHA256_Init_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_use_certificate_ASN1_nid_no_patch") "jmp *__imp_SSL_CTX_use_certificate_ASN1_nid_postfix(%rip)\n"); +APS5_EXPORT("p5zH+kefguU", libreSsl3Forward_SSL_CTX_use_certificate_ASN1_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EC_KEY_new_by_curve_name_nid_no_patch") "jmp *__imp_EC_KEY_new_by_curve_name_nid_postfix(%rip)\n"); +APS5_EXPORT("pICgBkuuluk", libreSsl3Forward_EC_KEY_new_by_curve_name_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_STORE_CTX_get_error_nid_no_patch") "jmp *__imp_X509_STORE_CTX_get_error_nid_postfix(%rip)\n"); +APS5_EXPORT("pWkG2yY1f8g", libreSsl3Forward_X509_STORE_CTX_get_error_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_NAME_ENTRY_get_data_nid_no_patch") "jmp *__imp_X509_NAME_ENTRY_get_data_nid_postfix(%rip)\n"); +APS5_EXPORT("pbpgXFx3OlQ", libreSsl3Forward_X509_NAME_ENTRY_get_data_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_UI_get0_user_data_nid_no_patch") "jmp *__imp_UI_get0_user_data_nid_postfix(%rip)\n"); +APS5_EXPORT("pbq4TEu+qa0", libreSsl3Forward_UI_get0_user_data_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EC_KEY_set_group_nid_no_patch") "jmp *__imp_EC_KEY_set_group_nid_postfix(%rip)\n"); +APS5_EXPORT("pn25GI6nxCY", libreSsl3Forward_EC_KEY_set_group_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_PEM_read_RSAPrivateKey_nid_no_patch") "jmp *__imp_PEM_read_RSAPrivateKey_nid_postfix(%rip)\n"); +APS5_EXPORT("psMmvmdPKds", libreSsl3Forward_PEM_read_RSAPrivateKey_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_get_wbio_nid_no_patch") "jmp *__imp_SSL_get_wbio_nid_postfix(%rip)\n"); +APS5_EXPORT("ptYKwIWRtmg", libreSsl3Forward_SSL_get_wbio_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_STORE_new_nid_no_patch") "jmp *__imp_X509_STORE_new_nid_postfix(%rip)\n"); +APS5_EXPORT("q6-H-qFeRJk", libreSsl3Forward_X509_STORE_new_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_PKEY_get1_EC_KEY_nid_no_patch") "jmp *__imp_EVP_PKEY_get1_EC_KEY_nid_postfix(%rip)\n"); +APS5_EXPORT("qB+V9Qvf9qg", libreSsl3Forward_EVP_PKEY_get1_EC_KEY_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EC_KEY_free_nid_no_patch") "jmp *__imp_EC_KEY_free_nid_postfix(%rip)\n"); +APS5_EXPORT("qBVx0vmleoc", libreSsl3Forward_EC_KEY_free_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_use_PrivateKey_ASN1_nid_no_patch") "jmp *__imp_SSL_CTX_use_PrivateKey_ASN1_nid_postfix(%rip)\n"); +APS5_EXPORT("qGJxcUrNnc4", libreSsl3Forward_SSL_CTX_use_PrivateKey_ASN1_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_aes_128_ctr_nid_no_patch") "jmp *__imp_EVP_aes_128_ctr_nid_postfix(%rip)\n"); +APS5_EXPORT("qmya3Mw0akk", libreSsl3Forward_EVP_aes_128_ctr_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_set_alpn_select_cb_nid_no_patch") "jmp *__imp_SSL_CTX_set_alpn_select_cb_nid_postfix(%rip)\n"); +APS5_EXPORT("qnoG-P8RCKg", libreSsl3Forward_SSL_CTX_set_alpn_select_cb_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_use_certificate_nid_no_patch") "jmp *__imp_SSL_CTX_use_certificate_nid_postfix(%rip)\n"); +APS5_EXPORT("qu8pjijBHbk", libreSsl3Forward_SSL_CTX_use_certificate_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_OPENSSL_add_all_algorithms_noconf_nid_no_patch") "jmp *__imp_OPENSSL_add_all_algorithms_noconf_nid_postfix(%rip)\n"); +APS5_EXPORT("qvd-b81Cb4s", libreSsl3Forward_OPENSSL_add_all_algorithms_noconf_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BN_CTX_end_nid_no_patch") "jmp *__imp_BN_CTX_end_nid_postfix(%rip)\n"); +APS5_EXPORT("qxKY6yYmLws", libreSsl3Forward_BN_CTX_end_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_PEM_read_bio_X509_nid_no_patch") "jmp *__imp_PEM_read_bio_X509_nid_postfix(%rip)\n"); +APS5_EXPORT("r2ChuXgZiXQ", libreSsl3Forward_PEM_read_bio_X509_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_free_nid_no_patch") "jmp *__imp_SSL_CTX_free_nid_postfix(%rip)\n"); +APS5_EXPORT("rCPCMV9J+kw", libreSsl3Forward_SSL_CTX_free_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BN_CTX_free_nid_no_patch") "jmp *__imp_BN_CTX_free_nid_postfix(%rip)\n"); +APS5_EXPORT("rESvbHhCMnU", libreSsl3Forward_BN_CTX_free_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_set_info_callback_nid_no_patch") "jmp *__imp_SSL_CTX_set_info_callback_nid_postfix(%rip)\n"); +APS5_EXPORT("rGgWAntk5qs", libreSsl3Forward_SSL_CTX_set_info_callback_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_sceLibreSslGetMemoryPoolStats_nid_no_patch") "jmp *__imp_sceLibreSslGetMemoryPoolStats(%rip)\n"); +APS5_EXPORT("rJFDhypHYaY", libreSsl3Forward_sceLibreSslGetMemoryPoolStats_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_aes_128_cbc_nid_no_patch") "jmp *__imp_EVP_aes_128_cbc_nid_postfix(%rip)\n"); +APS5_EXPORT("rV07jlO-+6Q", libreSsl3Forward_EVP_aes_128_cbc_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_set_bio_nid_no_patch") "jmp *__imp_SSL_set_bio_nid_postfix(%rip)\n"); +APS5_EXPORT("rXHi08e0g80", libreSsl3Forward_SSL_set_bio_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_OCSP_crl_reason_str_nid_no_patch") "jmp *__imp_OCSP_crl_reason_str_nid_postfix(%rip)\n"); +APS5_EXPORT("s0PXkgZgBYI", libreSsl3Forward_OCSP_crl_reason_str_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ENGINE_get_id_nid_no_patch") "jmp *__imp_ENGINE_get_id_nid_postfix(%rip)\n"); +APS5_EXPORT("s6NIjUCdhnM", libreSsl3Forward_ENGINE_get_id_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_RSA_padding_add_PKCS1_PSS_nid_no_patch") "jmp *__imp_RSA_padding_add_PKCS1_PSS_nid_postfix(%rip)\n"); +APS5_EXPORT("sZmUzrbtoz8", libreSsl3Forward_RSA_padding_add_PKCS1_PSS_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ERR_clear_error_nid_no_patch") "jmp *__imp_ERR_clear_error_nid_postfix(%rip)\n"); +APS5_EXPORT("sieQ--PINWg", libreSsl3Forward_ERR_clear_error_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_get1_session_nid_no_patch") "jmp *__imp_SSL_get1_session_nid_postfix(%rip)\n"); +APS5_EXPORT("soWa0pMndTM", libreSsl3Forward_SSL_get1_session_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_CIPHER_CTX_init_nid_no_patch") "jmp *__imp_EVP_CIPHER_CTX_init_nid_postfix(%rip)\n"); +APS5_EXPORT("t3HY010u9lI", libreSsl3Forward_EVP_CIPHER_CTX_init_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_set_connect_state_nid_no_patch") "jmp *__imp_SSL_set_connect_state_nid_postfix(%rip)\n"); +APS5_EXPORT("tHOriQLfXsY", libreSsl3Forward_SSL_set_connect_state_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_OBJ_sn2nid_nid_no_patch") "jmp *__imp_OBJ_sn2nid_nid_postfix(%rip)\n"); +APS5_EXPORT("tSHtCJTrxnk", libreSsl3Forward_OBJ_sn2nid_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_set_ex_data_nid_no_patch") "jmp *__imp_SSL_set_ex_data_nid_postfix(%rip)\n"); +APS5_EXPORT("tVJpWGFi-+M", libreSsl3Forward_SSL_set_ex_data_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_UI_create_method_nid_no_patch") "jmp *__imp_UI_create_method_nid_postfix(%rip)\n"); +APS5_EXPORT("tq1e1kFa2s8", libreSsl3Forward_UI_create_method_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ASN1_STRING_to_UTF8_nid_no_patch") "jmp *__imp_ASN1_STRING_to_UTF8_nid_postfix(%rip)\n"); +APS5_EXPORT("tqJIKzoCMXE", libreSsl3Forward_ASN1_STRING_to_UTF8_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_version_nid_no_patch") "jmp *__imp_SSL_version_nid_postfix(%rip)\n"); +APS5_EXPORT("u+8oP5YDJhQ", libreSsl3Forward_SSL_version_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ENGINE_by_id_nid_no_patch") "jmp *__imp_ENGINE_by_id_nid_postfix(%rip)\n"); +APS5_EXPORT("uIV7vlecUPo", libreSsl3Forward_ENGINE_by_id_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_UI_method_set_writer_nid_no_patch") "jmp *__imp_UI_method_set_writer_nid_postfix(%rip)\n"); +APS5_EXPORT("uQ4HFlHUJy0", libreSsl3Forward_UI_method_set_writer_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_PKCS12_free_nid_no_patch") "jmp *__imp_PKCS12_free_nid_postfix(%rip)\n"); +APS5_EXPORT("uVxaUTCMBiI", libreSsl3Forward_PKCS12_free_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_DigestFinal_ex_nid_no_patch") "jmp *__imp_EVP_DigestFinal_ex_nid_postfix(%rip)\n"); +APS5_EXPORT("uVzufRohxCU", libreSsl3Forward_EVP_DigestFinal_ex_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_OBJ_cleanup_nid_no_patch") "jmp *__imp_OBJ_cleanup_nid_postfix(%rip)\n"); +APS5_EXPORT("ufDDnJvofro", libreSsl3Forward_OBJ_cleanup_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SHA1_Final_nid_no_patch") "jmp *__imp_SHA1_Final_nid_postfix(%rip)\n"); +APS5_EXPORT("ukPQnpBeU2k", libreSsl3Forward_SHA1_Final_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_DecryptFinal_ex_nid_no_patch") "jmp *__imp_EVP_DecryptFinal_ex_nid_postfix(%rip)\n"); +APS5_EXPORT("urpDB9rHb4s", libreSsl3Forward_EVP_DecryptFinal_ex_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_get_session_nid_no_patch") "jmp *__imp_SSL_get_session_nid_postfix(%rip)\n"); +APS5_EXPORT("usdM3+ti5Tw", libreSsl3Forward_SSL_get_session_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_STORE_CTX_get_ex_data_nid_no_patch") "jmp *__imp_X509_STORE_CTX_get_ex_data_nid_postfix(%rip)\n"); +APS5_EXPORT("uzArIKaDDL0", libreSsl3Forward_X509_STORE_CTX_get_ex_data_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_DecryptInit_ex_nid_no_patch") "jmp *__imp_EVP_DecryptInit_ex_nid_postfix(%rip)\n"); +APS5_EXPORT("v6+-XI7oasY", libreSsl3Forward_EVP_DecryptInit_ex_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_BN_bn2bin_nid_no_patch") "jmp *__imp_BN_bn2bin_nid_postfix(%rip)\n"); +APS5_EXPORT("vDVTsfukSuU", libreSsl3Forward_BN_bn2bin_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_set_cert_store_nid_no_patch") "jmp *__imp_SSL_CTX_set_cert_store_nid_postfix(%rip)\n"); +APS5_EXPORT("vIZ550rGxVU", libreSsl3Forward_SSL_CTX_set_cert_store_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_ECDSA_size_nid_no_patch") "jmp *__imp_ECDSA_size_nid_postfix(%rip)\n"); +APS5_EXPORT("vMPn2lAhggg", libreSsl3Forward_ECDSA_size_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_get_pubkey_nid_no_patch") "jmp *__imp_X509_get_pubkey_nid_postfix(%rip)\n"); +APS5_EXPORT("vY2bEjTQwD4", libreSsl3Forward_X509_get_pubkey_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_STORE_add_cert_nid_no_patch") "jmp *__imp_X509_STORE_add_cert_nid_postfix(%rip)\n"); +APS5_EXPORT("vfV2r97B45A", libreSsl3Forward_X509_STORE_add_cert_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_PEM_read_bio_PrivateKey_nid_no_patch") "jmp *__imp_PEM_read_bio_PrivateKey_nid_postfix(%rip)\n"); +APS5_EXPORT("vn5B1QygBJM", libreSsl3Forward_PEM_read_bio_PrivateKey_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_EXTENSION_get_critical_nid_no_patch") "jmp *__imp_X509_EXTENSION_get_critical_nid_postfix(%rip)\n"); +APS5_EXPORT("w+aChZeGKxo", libreSsl3Forward_X509_EXTENSION_get_critical_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_CipherUpdate_nid_no_patch") "jmp *__imp_EVP_CipherUpdate_nid_postfix(%rip)\n"); +APS5_EXPORT("w03a1pfG8oM", libreSsl3Forward_EVP_CipherUpdate_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_use_PrivateKey_file_nid_no_patch") "jmp *__imp_SSL_CTX_use_PrivateKey_file_nid_postfix(%rip)\n"); +APS5_EXPORT("wPBtYd5mlzo", libreSsl3Forward_SSL_CTX_use_PrivateKey_file_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509_verify_cert_nid_no_patch") "jmp *__imp_X509_verify_cert_nid_postfix(%rip)\n"); +APS5_EXPORT("wUYrOBcxB34", libreSsl3Forward_X509_verify_cert_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_ctrl_nid_no_patch") "jmp *__imp_SSL_CTX_ctrl_nid_postfix(%rip)\n"); +APS5_EXPORT("wY5rQQnQWD0", libreSsl3Forward_SSL_CTX_ctrl_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_AES_set_decrypt_key_nid_no_patch") "jmp *__imp_AES_set_decrypt_key_nid_postfix(%rip)\n"); +APS5_EXPORT("wr-YBWA7pdY", libreSsl3Forward_AES_set_decrypt_key_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_HMAC_Final_nid_no_patch") "jmp *__imp_HMAC_Final_nid_postfix(%rip)\n"); +APS5_EXPORT("wt5Hku2i1nY", libreSsl3Forward_HMAC_Final_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_sceLibreSslInitEx2_nid_no_patch") "jmp *__imp_sceLibreSslInitEx2(%rip)\n"); +APS5_EXPORT("xoRfQxAhHjk", libreSsl3Forward_sceLibreSslInitEx2_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SHA224_Init_nid_no_patch") "jmp *__imp_SHA224_Init_nid_postfix(%rip)\n"); +APS5_EXPORT("xvKW01mGR+M", libreSsl3Forward_SHA224_Init_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_PKEY_id_nid_no_patch") "jmp *__imp_EVP_PKEY_id_nid_postfix(%rip)\n"); +APS5_EXPORT("yPuxTL2GJO0", libreSsl3Forward_EVP_PKEY_id_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_X509V3_EXT_print_nid_no_patch") "jmp *__imp_X509V3_EXT_print_nid_postfix(%rip)\n"); +APS5_EXPORT("yU6S1LkjfnU", libreSsl3Forward_X509V3_EXT_print_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EC_KEY_get0_group_nid_no_patch") "jmp *__imp_EC_KEY_get0_group_nid_postfix(%rip)\n"); +APS5_EXPORT("yWnTOhbW6js", libreSsl3Forward_EC_KEY_get0_group_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_EVP_aes_256_ctr_nid_no_patch") "jmp *__imp_EVP_aes_256_ctr_nid_postfix(%rip)\n"); +APS5_EXPORT("yqy2+88mUx8", libreSsl3Forward_EVP_aes_256_ctr_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_OCSP_response_get1_basic_nid_no_patch") "jmp *__imp_OCSP_response_get1_basic_nid_postfix(%rip)\n"); +APS5_EXPORT("yxIXLt4jqNE", libreSsl3Forward_OCSP_response_get1_basic_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_SSL_CTX_use_certificate_file_nid_no_patch") "jmp *__imp_SSL_CTX_use_certificate_file_nid_postfix(%rip)\n"); +APS5_EXPORT("z0tS2-PZwoE", libreSsl3Forward_SSL_CTX_use_certificate_file_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_PEM_X509_INFO_read_bio_nid_no_patch") "jmp *__imp_PEM_X509_INFO_read_bio_nid_postfix(%rip)\n"); +APS5_EXPORT("z2Sl4DL-zCc", libreSsl3Forward_PEM_X509_INFO_read_bio_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_RSA_private_decrypt_nid_no_patch") "jmp *__imp_RSA_private_decrypt_nid_postfix(%rip)\n"); +APS5_EXPORT("zYLz0S-xya0", libreSsl3Forward_RSA_private_decrypt_nid_no_patch); + +__asm__(APS5_ASM_FUNCTION("libreSsl3Forward_DTLSv1_server_method_nid_no_patch") "jmp *__imp_DTLSv1_server_method_nid_postfix(%rip)\n"); +APS5_EXPORT("znTrJH9b2h8", libreSsl3Forward_DTLSv1_server_method_nid_no_patch); + +} diff --git a/core/libs/prx/libSceLibreSsl3/include/Api.hpp b/core/libs/prx/libSceLibreSsl3/include/Api.hpp index 49ba4111889d..53b7c392b1a4 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); @@ -94,4 +95,188 @@ int APS5_VABI o2i_ECPublicKey_nid_postfix(void); unsigned char* APS5_VABI MD5_nid_postfix(const unsigned char* data, std::size_t length, unsigned char* digest); unsigned char* APS5_VABI SHA1_nid_postfix(const unsigned char* data, std::size_t length, unsigned char* digest); +int APS5_VABI BIO_clear_flags_nid_postfix(); +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(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(); +int APS5_VABI EVP_PKEY_derive_set_peer_nid_postfix(); +int APS5_VABI EVP_PKEY_get0_EC_KEY_nid_postfix(); +int APS5_VABI EVP_PKEY_verify_nid_postfix(); +int APS5_VABI EVP_PKEY_verify_init_nid_postfix(); +int APS5_VABI EVP_get_digestbyname_nid_postfix(); +int APS5_VABI EVP_sha512_256_nid_postfix(); +int APS5_VABI HKDF_nid_postfix(); +int APS5_VABI HMAC_CTX_free_nid_postfix(); +int APS5_VABI HMAC_CTX_new_nid_postfix(); +int APS5_VABI OPENSSL_init_ssl_nid_postfix(); +int APS5_VABI PEM_read_bio_PUBKEY_nid_postfix(); +int APS5_VABI SSL_CIPHER_get_id_nid_postfix(); +int APS5_VABI SSL_CTX_add1_chain_cert_nid_postfix(); +int APS5_VABI SSL_CTX_set0_chain_nid_postfix(); +int APS5_VABI SSL_CTX_set_timeout_nid_postfix(); +int APS5_VABI SSL_SESSION_get_timeout_nid_postfix(); +int APS5_VABI SSL_SESSION_set_time_nid_postfix(); +int APS5_VABI SSL_do_handshake_nid_postfix(); +int APS5_VABI SSL_get_version_nid_postfix(); +int APS5_VABI SSL_set_accept_state_nid_postfix(); +int APS5_VABI SSL_set_alpn_protos_nid_postfix(); +int APS5_VABI SSL_set_info_callback_nid_postfix(); +int APS5_VABI TLS_method_nid_postfix(); +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(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(); +int APS5_VABI i2d_SSL_SESSION_nid_postfix(); +int APS5_VABI i2d_X509_nid_postfix(); +void APS5_VABI sk_free_nid_postfix(LibreSslStack* stack); +LibreSslStack* APS5_VABI sk_new_nid_postfix(StackCompare compare); +int APS5_VABI sk_push_nid_postfix(LibreSslStack* stack, void* element); +int APS5_VABI tls_client_nid_postfix(); +int APS5_VABI tls_close_nid_postfix(); +int APS5_VABI tls_config_free_nid_postfix(); +int APS5_VABI tls_config_new_nid_postfix(); +int APS5_VABI tls_configure_nid_postfix(); +int APS5_VABI tls_error_nid_postfix(); +int APS5_VABI tls_free_nid_postfix(); +int APS5_VABI tls_read_nid_postfix(); +int APS5_VABI tls_server_nid_postfix(); +int APS5_VABI tls_write_nid_postfix(); +int APS5_VABI Unknown__plus__plus_b0FizBrJk_nid_no_patch(); +int APS5_VABI Unknown__plus_STC2BUY9vY_nid_no_patch(); +int APS5_VABI Unknown__plus_Tu0gXSas9s_nid_no_patch(); +int APS5_VABI Unknown__plus_bQfpiUHRVk_nid_no_patch(); +int APS5_VABI Unknown_0BW_plus_8jTsY54_nid_no_patch(); +int APS5_VABI Unknown_0IxWzLyU8PI_nid_no_patch(); +int APS5_VABI Unknown_13BHMSblVyY_nid_no_patch(); +int APS5_VABI Unknown_27Fuliv3Om8_nid_no_patch(); +int APS5_VABI Unknown_2bIZM_minus_OfE8Y_nid_no_patch(); +int APS5_VABI Unknown_2l_plus_JidqxyZQ_nid_no_patch(); +int APS5_VABI Unknown_3KZ_minus_L4y1gak_nid_no_patch(); +int APS5_VABI Unknown_3m4CmAyOXwQ_nid_no_patch(); +int APS5_VABI Unknown_3tGgkjBQ82A_nid_no_patch(); +int APS5_VABI Unknown_3v2Omd4sqcU_nid_no_patch(); +int APS5_VABI Unknown_3wlK0tLONvk_nid_no_patch(); +int APS5_VABI Unknown_409ieWBMPUk_nid_no_patch(); +int APS5_VABI Unknown_44M_plus_SEbpNdQ_nid_no_patch(); +int APS5_VABI Unknown_4Q3bvOy4LY8_nid_no_patch(); +int APS5_VABI Unknown_4pEl_minus_5DmrrM_nid_no_patch(); +int APS5_VABI Unknown_5DhOJmgra8E_nid_no_patch(); +int APS5_VABI Unknown_5NBoRJYLH0U_nid_no_patch(); +int APS5_VABI Unknown_5PWK0cYOpHs_nid_no_patch(); +int APS5_VABI Unknown_5ex_plus_694ri90_nid_no_patch(); +int APS5_VABI Unknown_8A_minus_gU2xQfjY_nid_no_patch(); +int APS5_VABI Unknown_8AGfaSvdDq4_nid_no_patch(); +int APS5_VABI Unknown_8kct4CSWwOA_nid_no_patch(); +int APS5_VABI Unknown_A_minus_Hs_minus_8mau_plus_8_nid_no_patch(); +int APS5_VABI Unknown_A0lZtFjhcTw_nid_no_patch(); +int APS5_VABI Unknown_A65b_plus_ZhOt9k_nid_no_patch(); +int APS5_VABI Unknown_AiNud8LR8B4_nid_no_patch(); +int APS5_VABI Unknown_Ax_plus_Uu_plus__plus_rnrA_nid_no_patch(); +int APS5_VABI Unknown_BRjfzlGULmU_nid_no_patch(); +int APS5_VABI Unknown_BS5yWv6X_minus_hg_nid_no_patch(); +int APS5_VABI Unknown_C7eFtWPfLdk_nid_no_patch(); +int APS5_VABI Unknown_CFRaBB2_plus_R_plus_s_nid_no_patch(); +int APS5_VABI Unknown_DZ6fywqpaik_nid_no_patch(); +int APS5_VABI Unknown_F7jknWesBTY_nid_no_patch(); +int APS5_VABI Unknown_GFEaREp1UFw_nid_no_patch(); +int APS5_VABI Unknown_GjO5Ap3E_minus_t4_nid_no_patch(); +int APS5_VABI Unknown_HE_minus_vihq_minus_KKw_nid_no_patch(); +int APS5_VABI Unknown_IOutZPRNNPo_nid_no_patch(); +int APS5_VABI Unknown_J437jVn9pjI_nid_no_patch(); +int APS5_VABI Unknown_J5ZLHxWkT6k_nid_no_patch(); +int APS5_VABI Unknown_JSqFTYGaWhU_nid_no_patch(); +int APS5_VABI Unknown_JvoQz7GYOMo_nid_no_patch(); +int APS5_VABI Unknown_Jzebx477Q3M_nid_no_patch(); +int APS5_VABI Unknown_LA1MlgDx80o_nid_no_patch(); +int APS5_VABI Unknown_LdGe2IfIlpI_nid_no_patch(); +int APS5_VABI Unknown_M7ze0mz2jQM_nid_no_patch(); +int APS5_VABI Unknown_O9Thca3enw8_nid_no_patch(); +int APS5_VABI Unknown_OqtHJ7QUZg8_nid_no_patch(); +int APS5_VABI Unknown_PBYz0kpXwg8_nid_no_patch(); +int APS5_VABI Unknown_PNfwr3s6dEs_nid_no_patch(); +int APS5_VABI Unknown_PcUZS7XHwHk_nid_no_patch(); +int APS5_VABI Unknown_QKIOxHfZLh8_nid_no_patch(); +int APS5_VABI Unknown_QTV9Nyi7ryg_nid_no_patch(); +int APS5_VABI Unknown_QYEjNnn6PT4_nid_no_patch(); +int APS5_VABI Unknown_QhYzE_plus_Jdvuk_nid_no_patch(); +int APS5_VABI Unknown_QnjD8S6Rgk4_nid_no_patch(); +int APS5_VABI Unknown_R3NyckUcClU_nid_no_patch(); +int APS5_VABI Unknown_Sqn_plus_7yQmQWc_nid_no_patch(); +int APS5_VABI Unknown_Ssfu1yw4Em4_nid_no_patch(); +int APS5_VABI Unknown_TKGJOgbeyuA_nid_no_patch(); +int APS5_VABI Unknown_TpBvY92mrSM_nid_no_patch(); +int APS5_VABI Unknown_U1dQZ1rXHdA_nid_no_patch(); +int APS5_VABI Unknown_U3AsZ_minus_9e2MI_nid_no_patch(); +int APS5_VABI Unknown_UT6E1YgI8mw_nid_no_patch(); +int APS5_VABI Unknown_UmAPG5bxYYk_nid_no_patch(); +int APS5_VABI Unknown_XK3FmaTS6pg_nid_no_patch(); +int APS5_VABI Unknown_YJ7bfxMHniE_nid_no_patch(); +int APS5_VABI Unknown_ZERQN8ewpgk_nid_no_patch(); +int APS5_VABI Unknown_ZFeTGo4ybcw_nid_no_patch(); +int APS5_VABI Unknown_ZQ3b6SakHkc_nid_no_patch(); +int APS5_VABI Unknown_aKGUCnoiE_plus_k_nid_no_patch(); +int APS5_VABI Unknown_aLdgrI2jAF0_nid_no_patch(); +int APS5_VABI Unknown_aSO3Svp7umY_nid_no_patch(); +int APS5_VABI Unknown_agQxMaXVE8o_nid_no_patch(); +int APS5_VABI Unknown_as_plus_t2ZOg5fw_nid_no_patch(); +int APS5_VABI Unknown_ba4o0Ih6kSs_nid_no_patch(); +int APS5_VABI Unknown_bpOQdoGE2es_nid_no_patch(); +int APS5_VABI Unknown_dQE7FIbNsUE_nid_no_patch(); +int APS5_VABI Unknown_eyrIagsax0w_nid_no_patch(); +int APS5_VABI Unknown_f6Pa2rYH_minus_dw_nid_no_patch(); +int APS5_VABI Unknown_fR2Wat3ssHs_nid_no_patch(); +int APS5_VABI Unknown_fdvZNUHm_minus_dE_nid_no_patch(); +int APS5_VABI Unknown_fq1vAGKJNrI_nid_no_patch(); +int APS5_VABI Unknown_gavhu7SX2FI_nid_no_patch(); +int APS5_VABI Unknown_iFlkTGEbE9k_nid_no_patch(); +int APS5_VABI Unknown_iHetf873n_plus_4_nid_no_patch(); +int APS5_VABI Unknown_je_minus_ydGAbgFg_nid_no_patch(); +int APS5_VABI Unknown_k1AHUWet_minus_oU_nid_no_patch(); +int APS5_VABI Unknown_kO_minus_jQ3HS9kE_nid_no_patch(); +int APS5_VABI Unknown_kPCJUQuguzE_nid_no_patch(); +int APS5_VABI Unknown_lTdt9OsPAV0_nid_no_patch(); +int APS5_VABI Unknown_mKlCMgWMU84_nid_no_patch(); +int APS5_VABI Unknown_mXrusLhI3CI_nid_no_patch(); +int APS5_VABI Unknown_mhAgol4ETgY_nid_no_patch(); +int APS5_VABI Unknown_o0dpw6ZZ6K0_nid_no_patch(); +int APS5_VABI Unknown_o3Q8yQAMT_minus_k_nid_no_patch(); +int APS5_VABI Unknown_pW329hq95Hc_nid_no_patch(); +int APS5_VABI Unknown_pdxCm9_plus_CCc4_nid_no_patch(); +int APS5_VABI Unknown_qGsc6uT6p1E_nid_no_patch(); +int APS5_VABI Unknown_rJZ_minus_aiNIYCA_nid_no_patch(); +int APS5_VABI Unknown_s8WMaKNjwvE_nid_no_patch(); +int APS5_VABI Unknown_sENJFZ7WbLU_nid_no_patch(); +int APS5_VABI Unknown_tZG2VIefbX0_nid_no_patch(); +int APS5_VABI Unknown_uITUdhDDAg8_nid_no_patch(); +int APS5_VABI Unknown_uM9UnC8KFjY_nid_no_patch(); +int APS5_VABI Unknown_uihDBp74nLI_nid_no_patch(); +int APS5_VABI Unknown_v1vHv4jOJxQ_nid_no_patch(); +int APS5_VABI Unknown_vLuIwBfrxrk_nid_no_patch(); +int APS5_VABI Unknown_vR0po3nBkBs_nid_no_patch(); +int APS5_VABI Unknown_vnwZHU5FvBQ_nid_no_patch(); +int APS5_VABI Unknown_vo_minus_cv5gnPUA_nid_no_patch(); +int APS5_VABI Unknown_vu4FgwGayHY_nid_no_patch(); +int APS5_VABI Unknown_wHdymWL7CbE_nid_no_patch(); +int APS5_VABI Unknown_wNQT6Zn4UG4_nid_no_patch(); +int APS5_VABI Unknown_whL1IRBxFZA_nid_no_patch(); +int APS5_VABI Unknown_xBkcXV1OqWQ_nid_no_patch(); +int APS5_VABI Unknown_xVv3qlSRldc_nid_no_patch(); +int APS5_VABI Unknown_xZ1BME5qDv0_nid_no_patch(); +int APS5_VABI Unknown_xf6anoZpWRM_nid_no_patch(); +int APS5_VABI Unknown_xpB_plus_BNkO2Z0_nid_no_patch(); +int APS5_VABI Unknown_yLm956jsJpc_nid_no_patch(); +int APS5_VABI Unknown_z8fsXF8JuL0_nid_no_patch(); +int APS5_VABI Unknown_zCa75KLWWn4_nid_no_patch(); + } diff --git a/core/libs/prx/libSceLibreSsl3/include/Cipher.hpp b/core/libs/prx/libSceLibreSsl3/include/Cipher.hpp new file mode 100644 index 000000000000..6980b787f529 --- /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 bc0a30168636..4dac85fd570b 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 000000000000..a3dba97b2f97 --- /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 000000000000..aba7ed2dbfdc --- /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 d5c4b7a85628..dfca8410add0 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/Stack.cpp b/core/libs/prx/libSceLibreSsl3/src/Stack.cpp new file mode 100644 index 000000000000..c4fb3189ce02 --- /dev/null +++ b/core/libs/prx/libSceLibreSsl3/src/Stack.cpp @@ -0,0 +1,112 @@ +/* $OpenBSD: stack.c,v 1.28 2024/03/02 11:20:36 tb Exp $ */ +/* 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/libSceLibreSsl3/include/Api.hpp" +#include "prx/libc/include/Api.hpp" +#include +#include + +namespace { + +constexpr int MinimumNodes = 4; + +} + +extern "C" { + +LibreSslStack* APS5_VABI sk_new_nid_postfix(StackCompare compare) { + auto* const stack = static_cast(malloc_nid_postfix(sizeof(LibreSslStack))); + if (!stack) return nullptr; + auto** const elements = static_cast(reallocarray_nid_postfix(nullptr, MinimumNodes, sizeof(char*))); + if (!elements) { + free_nid_postfix(stack); + return nullptr; + } + for (int index = 0; index < MinimumNodes; ++index) elements[index] = nullptr; + stack->data = elements; + stack->comp = compare; + stack->numAlloc = MinimumNodes; + stack->num = 0; + stack->sorted = 0; + return stack; +} + +int APS5_VABI sk_push_nid_postfix(LibreSslStack* stack, void* element) { + if (!stack) throw std::invalid_argument("sk_push: null stack"); + if (stack->num < 0) throw std::invalid_argument("sk_push: negative element count"); + if (static_cast(stack->numAlloc) <= static_cast(stack->num) + 1) { + if (stack->numAlloc > std::numeric_limits::max() / 2) throw std::length_error("sk_push: element array cannot double"); + auto** const grown = static_cast(reallocarray_nid_postfix(stack->data, stack->numAlloc, 2 * sizeof(char*))); + if (!grown) return 0; + stack->data = grown; + stack->numAlloc *= 2; + } + if (!stack->data) throw std::invalid_argument("sk_push: null element array"); + stack->data[stack->num] = static_cast(element); + ++stack->num; + stack->sorted = 0; + return stack->num; +} + +void APS5_VABI sk_free_nid_postfix(LibreSslStack* stack) { + if (!stack) return; + free_nid_postfix(stack->data); + free_nid_postfix(stack); +} + +} diff --git a/core/libs/prx/libSceLibreSsl3/src/X509VerifyParam.cpp b/core/libs/prx/libSceLibreSsl3/src/X509VerifyParam.cpp new file mode 100644 index 000000000000..b1dc4e0dafaf --- /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 000000000000..20dac414b1c1 --- /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 000000000000..c37586deb389 --- /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/Stack.cpp b/core/libs/prx/libSceLibreSsl3/tests/Stack.cpp new file mode 100644 index 000000000000..f0fd3b0548c5 --- /dev/null +++ b/core/libs/prx/libSceLibreSsl3/tests/Stack.cpp @@ -0,0 +1,143 @@ +#include "prx/libSceLibreSsl3/libSceLibreSsl3.hpp" +#include "prx/libc/libc.hpp" +#include "prx/libc/include/general/VabiMacros.hpp" +#include "prx/libc/include/ApplicationHeap.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 stack check failed at line %u\n", location.line()); + std::abort(); +} + +std::unordered_map allocations; +std::size_t freeCalls = 0; +std::size_t reallocations = 0; +bool failAllocate = false; +bool failReallocate = false; + +void* APS5_VABI Allocate_nid_no_patch(std::size_t size) { + if (failAllocate) return nullptr; + void* result = std::malloc(size); + Require(result != nullptr); + allocations.emplace(result, size); + return result; +} + +void APS5_VABI Free_nid_no_patch(void* pointer) { + if (!pointer) return; + Require(allocations.erase(pointer) == 1); + ++freeCalls; + std::free(pointer); +} + +void* APS5_VABI Reallocate_nid_no_patch(void* pointer, std::size_t size) { + if (failReallocate) return nullptr; + if (pointer) Require(allocations.erase(pointer) == 1); + void* result = std::realloc(pointer, size); + Require(result != nullptr); + allocations.emplace(result, size); + ++reallocations; + return result; +} + +void* APS5_VABI UnexpectedCalloc_nid_no_patch(std::size_t, std::size_t) { throw std::runtime_error("unexpected calloc"); } +void* APS5_VABI UnexpectedAlign_nid_no_patch(std::size_t, std::size_t) { throw std::runtime_error("unexpected aligned allocation"); } +void* APS5_VABI UnexpectedRealign_nid_no_patch(void*, std::size_t, std::size_t) { throw std::runtime_error("unexpected aligned reallocation"); } +int APS5_VABI UnexpectedPosixAlign_nid_no_patch(void**, std::size_t, std::size_t) { throw std::runtime_error("unexpected posix_memalign"); } + +int APS5_VABI Compare_nid_no_patch(const void*, const void*) { return 0; } + +std::size_t released = 0; +void APS5_VABI Release_nid_no_patch(void*) { ++released; } + +std::array items{}; + +void* Item(int index) { return &items[index]; } + +void RoundTrip() { + auto* stack = sk_new_nid_postfix(Compare_nid_no_patch); + Require(stack != nullptr); + Require(allocations.size() == 2 && allocations.at(stack) == sizeof(LibreSslStack) && allocations.at(stack->data) == 4 * sizeof(char*)); + Require(stack->num == 0 && stack->sorted == 0 && stack->numAlloc == 4 && stack->comp == Compare_nid_no_patch); + for (int index = 0; index < 4; ++index) Require(stack->data[index] == nullptr); + Require(sk_push_nid_postfix(stack, Item(0)) == 1); + stack->sorted = 1; + Require(sk_push_nid_postfix(stack, Item(1)) == 2 && stack->sorted == 0); + Require(sk_push_nid_postfix(stack, nullptr) == 3); + Require(sk_num_nid_postfix(stack) == 3); + Require(sk_value_nid_postfix(stack, 0) == Item(0) && sk_value_nid_postfix(stack, 1) == Item(1) && sk_value_nid_postfix(stack, 2) == nullptr); + Require(sk_pop_nid_postfix(stack) == nullptr && sk_pop_nid_postfix(stack) == Item(1) && sk_num_nid_postfix(stack) == 1); + Require(sk_push_nid_postfix(stack, Item(2)) == 2 && sk_value_nid_postfix(stack, 1) == Item(2)); + const std::size_t freesBefore = freeCalls; + sk_free_nid_postfix(stack); + Require(freeCalls == freesBefore + 2 && allocations.empty()); +} + +void Growth() { + auto* stack = sk_new_nid_postfix(nullptr); + Require(stack != nullptr && stack->comp == nullptr); + reallocations = 0; + for (int index = 0; index < 3; ++index) Require(sk_push_nid_postfix(stack, Item(index)) == index + 1); + Require(stack->numAlloc == 4 && reallocations == 0); + Require(sk_push_nid_postfix(stack, Item(3)) == 4); + Require(stack->numAlloc == 8 && reallocations == 1 && allocations.at(stack->data) == 8 * sizeof(char*)); + for (int index = 4; index < 7; ++index) Require(sk_push_nid_postfix(stack, Item(index)) == index + 1); + Require(stack->numAlloc == 8 && reallocations == 1); + for (int index = 7; index < 10; ++index) Require(sk_push_nid_postfix(stack, Item(index)) == index + 1); + Require(stack->numAlloc == 16 && reallocations == 2 && allocations.at(stack->data) == 16 * sizeof(char*)); + for (int index = 0; index < 10; ++index) Require(sk_value_nid_postfix(stack, index) == Item(index)); + released = 0; + sk_pop_free_nid_postfix(stack, Release_nid_no_patch); + Require(released == 10 && allocations.empty()); +} + +void FreeNull() { + const std::size_t freesBefore = freeCalls; + sk_free_nid_postfix(nullptr); + Require(freeCalls == freesBefore); +} + +void AllocationFailures() { + failAllocate = true; + Require(sk_new_nid_postfix(nullptr) == nullptr && allocations.empty()); + failAllocate = false; + failReallocate = true; + Require(sk_new_nid_postfix(nullptr) == nullptr && allocations.empty()); + failReallocate = false; + + auto* stack = sk_new_nid_postfix(nullptr); + Require(stack != nullptr); + for (int index = 0; index < 3; ++index) Require(sk_push_nid_postfix(stack, Item(index)) == index + 1); + char** const before = stack->data; + failReallocate = true; + Require(sk_push_nid_postfix(stack, Item(3)) == 0); + failReallocate = false; + Require(stack->num == 3 && stack->numAlloc == 4 && stack->data == before && sk_value_nid_postfix(stack, 2) == Item(2)); + Require(sk_push_nid_postfix(stack, Item(3)) == 4 && stack->numAlloc == 8); + sk_free_nid_postfix(stack); + Require(allocations.empty()); +} + +} + +int main() { + std::array api{ + reinterpret_cast(Allocate_nid_no_patch), reinterpret_cast(Free_nid_no_patch), reinterpret_cast(UnexpectedCalloc_nid_no_patch), + reinterpret_cast(Reallocate_nid_no_patch), reinterpret_cast(UnexpectedAlign_nid_no_patch), reinterpret_cast(UnexpectedRealign_nid_no_patch), + reinterpret_cast(UnexpectedPosixAlign_nid_no_patch)}; + ApplicationHeapRegister_nid_no_patch(api.data()); + RoundTrip(); + Growth(); + FreeNull(); + AllocationFailures(); + std::puts("libSceLibreSsl3 stack 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 000000000000..e71e219e9ca4 --- /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 8c56379312d8..12e4dea8f122 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 @@ -156,4 +158,41 @@ int APS5_VABI sceLoginMgrServerUpdateUserIdRalatedToPadUniqueId() { return 0; } +int APS5_VABI sceLoginMgrServerNotifySafetyNoticeShownForGen2Vr() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceLoginMgrServerCheckSafetyNoticeShownForGen2Vr() { + NotImplemented_nid_no_patch(__func__); +} + +} + +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/Api.hpp b/core/libs/prx/libSceLoginMgrServer/include/Api.hpp index de64daf5d942..aea98835410b 100644 --- a/core/libs/prx/libSceLoginMgrServer/include/Api.hpp +++ b/core/libs/prx/libSceLoginMgrServer/include/Api.hpp @@ -35,4 +35,7 @@ int APS5_VABI sceLoginMgrServerSetUserStatus(); int APS5_VABI sceLoginMgrServerTerminate(); int APS5_VABI sceLoginMgrServerUpdateUserIdRalatedToPadUniqueId(); +int APS5_VABI sceLoginMgrServerNotifySafetyNoticeShownForGen2Vr(); +int APS5_VABI sceLoginMgrServerCheckSafetyNoticeShownForGen2Vr(); + } diff --git a/core/libs/prx/libSceLoginMgrServer/include/InventoryExports.hpp b/core/libs/prx/libSceLoginMgrServer/include/InventoryExports.hpp new file mode 100644 index 000000000000..f03ffc8ca6fa --- /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 244b5b6a16d5..972589e59e3b 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 64de066d073f..f620a61a2929 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 000000000000..41d35ab25707 --- /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 23842cc39bc9..b403325e05e0 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/Export.cpp b/core/libs/prx/libSceMbus/Export.cpp index 5212afd40564..d748bbf439e1 100644 --- a/core/libs/prx/libSceMbus/Export.cpp +++ b/core/libs/prx/libSceMbus/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceMbus/include/InventoryExports.hpp" #include "prx/libSceMbus/include/Api.hpp" #include #include @@ -67,3 +69,27 @@ std::int32_t APS5_VABI sceDeviceServiceGetGeneration(void) { } } + +extern "C" { + +int APS5_VABI libSceMbusUnknown_0mRAu1IWNEA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0mRAu1IWNEA", libSceMbusUnknown_0mRAu1IWNEA_nid_no_patch); + +int APS5_VABI libSceMbusUnknown_2qdZlkIIFDU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2qdZlkIIFDU", libSceMbusUnknown_2qdZlkIIFDU_nid_no_patch); + +int APS5_VABI libSceMbusUnknown_RGJ3Rebmm2w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RGJ3Rebmm2w", libSceMbusUnknown_RGJ3Rebmm2w_nid_no_patch); + +int APS5_VABI libSceMbusUnknown_edYHYROxzx4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("edYHYROxzx4", libSceMbusUnknown_edYHYROxzx4_nid_no_patch); + +} diff --git a/core/libs/prx/libSceMbus/PendingExports.cpp b/core/libs/prx/libSceMbus/PendingExports.cpp index d5f6a7f0508e..c696940b17c6 100644 --- a/core/libs/prx/libSceMbus/PendingExports.cpp +++ b/core/libs/prx/libSceMbus/PendingExports.cpp @@ -2,6 +2,7 @@ #include "prx/libc/include/General.hpp" #include +#include static_assert(sizeof(MbusDeviceFunctionState) == 180); @@ -11,6 +12,10 @@ static_assert(sizeof(MbusEventCallbacks) == 16); extern "C" { +int APS5_VABI sceMbusDebugGetStringToShow() { + NotImplemented_nid_no_patch(__func__); +} + int APS5_VABI sceMbusAcquireControl(std::uint64_t control, std::int32_t first, std::int32_t second) { NotImplemented_nid_no_patch(__func__); return 0; @@ -81,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) { @@ -325,9 +334,8 @@ int APS5_VABI sceMbusEventBusStatusChangeUnsubscribe(std::uint64_t unusedSlot, s return 0; } -int APS5_VABI sceMbusEventCallbackFuncsInit_(MbusEventCallbacks* callbacks, std::uint32_t size) { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI sceMbusEventCallbackFuncsInit_(MbusEventCallbacks* callbacks, std::uint32_t size) { + if (size != 0) std::memset(callbacks, 0, size); } int APS5_VABI sceMbusEventCreate_(std::uint32_t flags, MbusEvent* buffer, std::uint32_t capacity, const MbusEventCallbacks* callbacks, void* userData) { @@ -584,4 +592,48 @@ int APS5_VABI sceMbusUserLogout(std::int32_t userId) { return 0; } +int APS5_VABI sceMbusGetCurrentChatBalanceId() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceMbusGetInitialUser() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceMbusGetSimulatedBusUsableStatusByBusType2() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceMbusSetChatBalance() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceMbusSetCronosOutputMode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceMbusSetCronosPrimaryUser() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceMbusSetHmd2SocialScreenAudioMode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceMbusSetVibrationTriggerEffectWeakWhileEmbeddedMicInUse() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceMbusSetVolumeDownForDiscPlayerFG() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceMbusStartAudioOutScreenShare() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceMbusStopAudioOutScreenShare() { + NotImplemented_nid_no_patch(__func__); +} + } diff --git a/core/libs/prx/libSceMbus/include/Api.hpp b/core/libs/prx/libSceMbus/include/Api.hpp index d31c99a8aac1..04c837f95e27 100644 --- a/core/libs/prx/libSceMbus/include/Api.hpp +++ b/core/libs/prx/libSceMbus/include/Api.hpp @@ -68,6 +68,8 @@ struct MbusPriorityInfo; extern "C" { +int APS5_VABI sceMbusDebugGetStringToShow(); + std::int32_t APS5_VABI sceDeviceServiceInitialize(std::int32_t mode, const DeviceServiceInitParam* param); std::int32_t APS5_VABI sceDeviceServiceTerminate(); std::int32_t APS5_VABI sceDeviceServiceGetEventState(std::int32_t clear); @@ -136,7 +138,7 @@ int APS5_VABI sceMbusEnableChat(std::uint32_t deviceClass); int APS5_VABI sceMbusEnterAudioOutAutoAttenuation(std::int32_t first, std::int32_t second); int APS5_VABI sceMbusEventBusStatusChangeSubscribe(std::int32_t eventHandle, std::uint32_t first, std::uint32_t second, std::uint64_t firstValue, std::uint64_t secondValue); int APS5_VABI sceMbusEventBusStatusChangeUnsubscribe(std::uint64_t unusedSlot, std::int32_t subscription); -int APS5_VABI sceMbusEventCallbackFuncsInit_(MbusEventCallbacks* callbacks, std::uint32_t size); +void APS5_VABI sceMbusEventCallbackFuncsInit_(MbusEventCallbacks* callbacks, std::uint32_t size); int APS5_VABI sceMbusEventCreate_(std::uint32_t flags, MbusEvent* buffer, std::uint32_t capacity, const MbusEventCallbacks* callbacks, void* userData); int APS5_VABI sceMbusEventDestroy(std::int32_t eventHandle); int APS5_VABI sceMbusEventReceive(std::int32_t eventHandle, MbusEvent* events, std::int32_t capacity, std::int32_t wait); @@ -188,5 +190,16 @@ int APS5_VABI sceMbusTerm(); int APS5_VABI sceMbusUnregisterDriver(std::int32_t driverId); int APS5_VABI sceMbusUserLogin(std::int32_t userId); int APS5_VABI sceMbusUserLogout(std::int32_t userId); +int APS5_VABI sceMbusGetCurrentChatBalanceId(); +int APS5_VABI sceMbusGetInitialUser(); +int APS5_VABI sceMbusGetSimulatedBusUsableStatusByBusType2(); +int APS5_VABI sceMbusSetChatBalance(); +int APS5_VABI sceMbusSetCronosOutputMode(); +int APS5_VABI sceMbusSetCronosPrimaryUser(); +int APS5_VABI sceMbusSetHmd2SocialScreenAudioMode(); +int APS5_VABI sceMbusSetVibrationTriggerEffectWeakWhileEmbeddedMicInUse(); +int APS5_VABI sceMbusSetVolumeDownForDiscPlayerFG(); +int APS5_VABI sceMbusStartAudioOutScreenShare(); +int APS5_VABI sceMbusStopAudioOutScreenShare(); } diff --git a/core/libs/prx/libSceMbus/include/InventoryExports.hpp b/core/libs/prx/libSceMbus/include/InventoryExports.hpp new file mode 100644 index 000000000000..1c9569447cb8 --- /dev/null +++ b/core/libs/prx/libSceMbus/include/InventoryExports.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI libSceMbusUnknown_0mRAu1IWNEA_nid_no_patch(); +int APS5_VABI libSceMbusUnknown_2qdZlkIIFDU_nid_no_patch(); +int APS5_VABI libSceMbusUnknown_RGJ3Rebmm2w_nid_no_patch(); +int APS5_VABI libSceMbusUnknown_edYHYROxzx4_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceMbus/libSceMbus.hpp b/core/libs/prx/libSceMbus/libSceMbus.hpp index e6b42950e325..850d84ae2d36 100644 --- a/core/libs/prx/libSceMbus/libSceMbus.hpp +++ b/core/libs/prx/libSceMbus/libSceMbus.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceMbus/include/Api.hpp" +#include "prx/libSceMbus/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceMetadataReaderWriter/Export.cpp b/core/libs/prx/libSceMetadataReaderWriter/Export.cpp index 6cdea6e0d364..256c9a2a5689 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 000000000000..6f81fdae0233 --- /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 000000000000..82eb3d65ab69 --- /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 4e504bad703d..cad0c1fa2ba9 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/libSceMouse/CMakeLists.txt b/core/libs/prx/libSceMouse/CMakeLists.txt index 160112a8ce38..cf563cd6a7c2 100644 --- a/core/libs/prx/libSceMouse/CMakeLists.txt +++ b/core/libs/prx/libSceMouse/CMakeLists.txt @@ -13,11 +13,11 @@ if(BUILD_TESTING) ${CMAKE_CURRENT_SOURCE_DIR}/../libSceVideoOut/src/MouseInput.cpp ) target_include_directories(mouse_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_SDL2_INCLUDE_DIR}) - target_link_libraries(mouse_tests PRIVATE libSceMouse libkernel libc SDL2-static) + target_link_libraries(mouse_tests PRIVATE libSceMouse libSceIme libkernel libc SDL2-static) configure_windows_unwind(mouse_tests) add_test(NAME mouse_input COMMAND mouse_tests) if(WIN32) set_tests_properties(mouse_input PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") + "PATH=path_list_prepend:$;PATH=path_list_prepend:$") endif() endif() diff --git a/core/libs/prx/libSceMouse/InventoryExports.cpp b/core/libs/prx/libSceMouse/InventoryExports.cpp index d035ccbd5277..83c4ba53428c 100644 --- a/core/libs/prx/libSceMouse/InventoryExports.cpp +++ b/core/libs/prx/libSceMouse/InventoryExports.cpp @@ -3,6 +3,10 @@ extern "C" { +int APS5_VABI sceMouseDisconnectAll() { + NotImplemented_nid_no_patch(__func__); +} + int APS5_VABI sceMouseExtensionGetCursor() { NotImplemented_nid_no_patch(__func__); } @@ -31,4 +35,16 @@ int APS5_VABI sceMouseGetHandle() { NotImplemented_nid_no_patch(__func__); } +int APS5_VABI sceMouseVirtualDeviceAddDevice() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceMouseVirtualDeviceDeleteDevice() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceMouseVirtualDeviceGetCursor() { + NotImplemented_nid_no_patch(__func__); +} + } diff --git a/core/libs/prx/libSceMouse/include/InventoryExports.hpp b/core/libs/prx/libSceMouse/include/InventoryExports.hpp index cc642d4bb4d5..3b3b422051f1 100644 --- a/core/libs/prx/libSceMouse/include/InventoryExports.hpp +++ b/core/libs/prx/libSceMouse/include/InventoryExports.hpp @@ -4,6 +4,7 @@ extern "C" { +int APS5_VABI sceMouseDisconnectAll(); int APS5_VABI sceMouseExtensionGetCursor(); int APS5_VABI sceMouseExtensionRead(); int APS5_VABI sceMouseExtensionReadState(); @@ -11,5 +12,8 @@ int APS5_VABI sceMouseExtensionScalePosition(); int APS5_VABI sceMouseExtensionSetConfig(); int APS5_VABI sceMouseExtensionSetCursor(); int APS5_VABI sceMouseGetHandle(); +int APS5_VABI sceMouseVirtualDeviceAddDevice(); +int APS5_VABI sceMouseVirtualDeviceDeleteDevice(); +int APS5_VABI sceMouseVirtualDeviceGetCursor(); } diff --git a/core/libs/prx/libSceMoveTracker/CMakeLists.txt b/core/libs/prx/libSceMoveTracker/CMakeLists.txt new file mode 100644 index 000000000000..d0b9a395522e --- /dev/null +++ b/core/libs/prx/libSceMoveTracker/CMakeLists.txt @@ -0,0 +1,14 @@ +add_library(libSceMoveTracker SHARED EXCLUDE_FROM_ALL Export.cpp) +target_include_directories(libSceMoveTracker PRIVATE ${LIBS_INCLUDE_DIR}) +configure_windows_unwind(libSceMoveTracker) + +if(BUILD_TESTING) + add_test_executable(guest_move_tracker_tests ${LIBS_INCLUDE_DIR}/tests/GuestMoveTracker.cpp) + target_include_directories(guest_move_tracker_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_move_tracker_tests PRIVATE libSceMoveTracker) + add_test(NAME guest_move_tracker COMMAND guest_move_tracker_tests) + if(WIN32) + set_tests_properties(guest_move_tracker PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceMoveTracker/Export.cpp b/core/libs/prx/libSceMoveTracker/Export.cpp index e1c32fd78129..f285fddbbf4a 100644 --- a/core/libs/prx/libSceMoveTracker/Export.cpp +++ b/core/libs/prx/libSceMoveTracker/Export.cpp @@ -46,7 +46,9 @@ int APS5_VABI sceMoveTrackerGetVersion() { } int APS5_VABI sceMoveTrackerGetWorkingMemorySize(std::uint32_t* totalSize, std::uint32_t* processingSize) { - NotImplemented_nid_no_patch(__func__); + if (totalSize == nullptr || processingSize == nullptr) return static_cast(0x80ef0003); + *totalSize = 0xa00000; + *processingSize = 0x800000; return 0; } diff --git a/core/libs/prx/libSceMsgDialog.native/CMakeLists.txt b/core/libs/prx/libSceMsgDialog.native/CMakeLists.txt index deefade5ae00..fa3ae0894869 100644 --- a/core/libs/prx/libSceMsgDialog.native/CMakeLists.txt +++ b/core/libs/prx/libSceMsgDialog.native/CMakeLists.txt @@ -1,14 +1,15 @@ add_library(libSceMsgDialog.native SHARED EXCLUDE_FROM_ALL Export.cpp) target_include_directories(libSceMsgDialog.native PRIVATE ${LIBS_INCLUDE_DIR}) +target_link_libraries(libSceMsgDialog.native PRIVATE libSceIme) configure_windows_unwind(libSceMsgDialog.native) if(BUILD_TESTING) add_test_executable(guest_msg_dialog_native_tests ${LIBS_INCLUDE_DIR}/tests/GuestMsgDialogNative.cpp) target_include_directories(guest_msg_dialog_native_tests PRIVATE ${LIBS_INCLUDE_DIR}) - target_link_libraries(guest_msg_dialog_native_tests PRIVATE libSceMsgDialog.native) + target_link_libraries(guest_msg_dialog_native_tests PRIVATE libSceMsgDialog.native libSceIme) add_test(NAME guest_msg_dialog_native COMMAND guest_msg_dialog_native_tests) if(WIN32) set_tests_properties(guest_msg_dialog_native PROPERTIES ENVIRONMENT_MODIFICATION - "PATH=path_list_prepend:$") + "PATH=path_list_prepend:$;PATH=path_list_prepend:$") endif() endif() diff --git a/core/libs/prx/libSceMsgDialog.native/Export.cpp b/core/libs/prx/libSceMsgDialog.native/Export.cpp index 52d1a1227905..71826e1fca12 100644 --- a/core/libs/prx/libSceMsgDialog.native/Export.cpp +++ b/core/libs/prx/libSceMsgDialog.native/Export.cpp @@ -1,4 +1,6 @@ #include "prx/libSceMsgDialog.native/libSceMsgDialog.native.hpp" +#include "prx/libSceMsgDialog/include/MsgDialogRequest.hpp" +#include "prx/libSceIme/include/ModalDialog.hpp" #include #include #include @@ -7,6 +9,7 @@ namespace { std::atomic g_status{0}; +std::atomic g_presented{false}; constexpr int COMMON_DIALOG_STATUS_RUNNING = 2; constexpr int COMMON_DIALOG_STATUS_FINISHED = 3; @@ -17,6 +20,22 @@ constexpr int COMMON_DIALOG_ERROR_NOT_FINISHED = static_cast(0x80B80005u); constexpr int COMMON_DIALOG_ERROR_NOT_RUNNING = static_cast(0x80B8000Bu); constexpr int COMMON_DIALOG_ERROR_ARG_NULL = static_cast(0x80B8000Du); constexpr int BUTTON_ID_OK = 1; + +std::atomic g_buttonId{BUTTON_ID_OK}; + +int Status() { + int status = g_status.load(); + if (status == COMMON_DIALOG_STATUS_RUNNING && g_presented.load()) { + std::size_t chosen = 0; + const ModalDialogState state = ModalDialogPoll_nid_postfix(chosen, ModalDialogOwnerMsgDialog); + if (state == ModalDialogState::Showing) return status; + if (state == ModalDialogState::Answered) g_buttonId = MsgDialog::ButtonIdOf(chosen); + int expected = COMMON_DIALOG_STATUS_RUNNING; + g_status.compare_exchange_strong(expected, COMMON_DIALOG_STATUS_FINISHED); + status = g_status.load(); + } + return status; +} } extern "C" { @@ -24,19 +43,21 @@ extern "C" { int SceMsgDialogNativeModuleLoaded_nid_no_patch = 1; int APS5_VABI sceMsgDialogClose(void) { + if (Status() != COMMON_DIALOG_STATUS_RUNNING) return COMMON_DIALOG_ERROR_NOT_RUNNING; + if (g_presented.load()) ModalDialogClose_nid_postfix(ModalDialogOwnerMsgDialog); int expected = COMMON_DIALOG_STATUS_RUNNING; if (!g_status.compare_exchange_strong(expected, COMMON_DIALOG_STATUS_FINISHED)) return COMMON_DIALOG_ERROR_NOT_RUNNING; return 0; } int APS5_VABI sceMsgDialogGetResult(MsgDialogResult* result) { - const int status = g_status.load(); + const int status = Status(); if (status == 0) return COMMON_DIALOG_ERROR_NOT_INITIALIZED; if (result == nullptr) return COMMON_DIALOG_ERROR_ARG_NULL; if (status != COMMON_DIALOG_STATUS_FINISHED) return COMMON_DIALOG_ERROR_NOT_FINISHED; *result = MsgDialogResult{}; result->result = COMMON_DIALOG_RESULT_OK; - result->button_id = BUTTON_ID_OK; + result->button_id = g_buttonId.load(); return 0; } @@ -50,17 +71,26 @@ int APS5_VABI sceMsgDialogOpen(const void* param) { const int status = g_status.load(); if (status == 0) return COMMON_DIALOG_ERROR_NOT_INITIALIZED; if (param == nullptr) return COMMON_DIALOG_ERROR_ARG_NULL; - g_status = COMMON_DIALOG_STATUS_FINISHED; + if (g_presented.load()) ModalDialogClose_nid_postfix(ModalDialogOwnerMsgDialog); + ModalDialogRequest request; + bool presented = MsgDialog::BuildRequest(MsgDialog::ParseParam(param), request); + request.owner = ModalDialogOwnerMsgDialog; + presented = presented && ModalDialogOpen_nid_postfix(request); + g_buttonId = BUTTON_ID_OK; + g_presented = presented; + g_status = presented ? COMMON_DIALOG_STATUS_RUNNING : COMMON_DIALOG_STATUS_FINISHED; return 0; } int APS5_VABI sceMsgDialogTerminate(void) { if (g_status.exchange(0) == 0) return COMMON_DIALOG_ERROR_NOT_INITIALIZED; + g_presented = false; + ModalDialogReset_nid_postfix(ModalDialogOwnerMsgDialog); return 0; } int APS5_VABI sceMsgDialogUpdateStatus(void) { - return g_status.load(); + return Status(); } int APS5_VABI sceMsgDialogProgressBarInc(int target, std::uint32_t delta) { @@ -82,7 +112,7 @@ int APS5_VABI sceMsgDialogProgressBarSetValue(int target, std::uint32_t rate) { } int APS5_VABI sceMsgDialogGetStatus(void) { - return g_status.load(); + return Status(); } } diff --git a/core/libs/prx/libSceMsgDialog/CMakeLists.txt b/core/libs/prx/libSceMsgDialog/CMakeLists.txt new file mode 100644 index 000000000000..78793d46da55 --- /dev/null +++ b/core/libs/prx/libSceMsgDialog/CMakeLists.txt @@ -0,0 +1,31 @@ +add_library(libSceMsgDialog SHARED EXCLUDE_FROM_ALL ${CMAKE_CURRENT_SOURCE_DIR}/Export.cpp) +target_include_directories(libSceMsgDialog PRIVATE ${LIBS_INCLUDE_DIR}) +target_link_libraries(libSceMsgDialog PRIVATE libSceIme) +configure_windows_unwind(libSceMsgDialog) + +if(BUILD_TESTING) + add_test_executable(msg_dialog_param_tests ${LIBS_INCLUDE_DIR}/tests/MsgDialogParam.cpp) + target_include_directories(msg_dialog_param_tests PRIVATE ${LIBS_INCLUDE_DIR}) + configure_host_test_executable(msg_dialog_param_tests) + add_test(NAME msg_dialog_param COMMAND msg_dialog_param_tests) + + add_test_executable(msg_dialog_text_tests ${LIBS_INCLUDE_DIR}/tests/MsgDialogText.cpp) + target_include_directories(msg_dialog_text_tests PRIVATE ${LIBS_INCLUDE_DIR}) + configure_host_test_executable(msg_dialog_text_tests) + add_test(NAME msg_dialog_text COMMAND msg_dialog_text_tests) + + add_test_executable(msg_dialog_request_tests ${LIBS_INCLUDE_DIR}/tests/MsgDialogRequest.cpp) + target_include_directories(msg_dialog_request_tests PRIVATE ${LIBS_INCLUDE_DIR}) + configure_host_test_executable(msg_dialog_request_tests) + add_test(NAME msg_dialog_request COMMAND msg_dialog_request_tests) + + add_test_executable(guest_msg_dialog_tests ${LIBS_INCLUDE_DIR}/tests/GuestMsgDialog.cpp) + target_include_directories(guest_msg_dialog_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_msg_dialog_tests PRIVATE libSceMsgDialog libSceIme libc) + configure_windows_unwind(guest_msg_dialog_tests) + add_test(NAME guest_msg_dialog COMMAND guest_msg_dialog_tests) + if(WIN32) + set_tests_properties(guest_msg_dialog PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$;PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceMsgDialog/Export.cpp b/core/libs/prx/libSceMsgDialog/Export.cpp index c9462f47b70f..802662d93131 100644 --- a/core/libs/prx/libSceMsgDialog/Export.cpp +++ b/core/libs/prx/libSceMsgDialog/Export.cpp @@ -1,4 +1,7 @@ #include "prx/libSceMsgDialog/include/Api.hpp" +#include "prx/libSceMsgDialog/include/MsgDialogParam.hpp" +#include "prx/libSceMsgDialog/include/MsgDialogRequest.hpp" +#include "prx/libSceIme/include/ModalDialog.hpp" #include #include #include @@ -11,10 +14,6 @@ #include "HitLog.hpp" #include "prx/libc/include/General.hpp" -#ifdef _WIN32 -#include -#endif - namespace { constexpr int kStatusNone = 0; constexpr int kStatusInitialized = 1; @@ -27,66 +26,40 @@ constexpr int kErrBusy = static_cast(0x80B80007u); constexpr int kErrNotRunning = static_cast(0x80B8000Bu); constexpr int kErrArgNull = static_cast(0x80B8000Du); -constexpr int kModeUserMsg = 1; -constexpr int kModeProgressBar = 2; -constexpr int kModeSystemMsg = 3; - -constexpr int kButtonTypeOk = 0; -constexpr int kButtonTypeYesNo = 1; -constexpr int kButtonTypeNone = 2; -constexpr int kButtonTypeOkCancel = 3; -constexpr int kButtonTypeYesNoFocusNo = 4; - -constexpr int kButtonIdOk = 1; -constexpr int kButtonIdNo = 2; +constexpr int kButtonIdOk = MsgDialog::ButtonIdOk; +constexpr int kButtonIdNo = MsgDialog::ButtonIdNo; +constexpr int kModeUserMsg = MsgDialog::ModeUserMsg; +constexpr int kModeProgressBar = MsgDialog::ModeProgressBar; std::mutex g_lock; int g_status = kStatusNone; int g_mode = kModeUserMsg; int g_buttonId = kButtonIdOk; int g_pollsLeft = 0; +bool g_presented = false; std::chrono::steady_clock::time_point g_openedAt; -bool Readable(const void* p, std::size_t n) { -#ifdef _WIN32 - if (p == nullptr) return false; - MEMORY_BASIC_INFORMATION mbi; - if (VirtualQuery(p, &mbi, sizeof(mbi)) == 0 || mbi.State != MEM_COMMIT) return false; - if ((mbi.Protect & (PAGE_NOACCESS | PAGE_GUARD)) != 0) return false; - const auto end = reinterpret_cast(mbi.BaseAddress) + mbi.RegionSize; - return reinterpret_cast(p) + n <= end; -#else - return p != nullptr; -#endif +void Inspect(const MsgDialog::ParsedParam& parsed) { + g_mode = parsed.mode; + g_buttonId = kButtonIdOk; + if (parsed.hasUserMessage && parsed.buttonType == MsgDialog::ButtonTypeYesNoFocusNo) g_buttonId = kButtonIdNo; } -void Inspect(const void* param) { - const std::uint8_t* bytes = static_cast(param); - g_mode = kModeUserMsg; - g_buttonId = kButtonIdOk; - if (!Readable(bytes, 0x60)) return; - std::int32_t mode = 0; - std::memcpy(&mode, bytes + 0x38, 4); - if (mode >= kModeUserMsg && mode <= kModeSystemMsg) g_mode = mode; - if (g_mode != kModeUserMsg) return; - const std::uint8_t* userMsg = nullptr; - std::memcpy(&userMsg, bytes + 0x40, 8); - if (!Readable(userMsg, 16)) return; - std::int32_t buttonType = 0; - std::memcpy(&buttonType, userMsg, 4); - const char* msg = nullptr; - std::memcpy(&msg, userMsg + 8, 8); - if (buttonType == kButtonTypeYesNoFocusNo) g_buttonId = kButtonIdNo; - if (Readable(msg, 4)) { - char text[161] = {}; - for (int i = 0; i < 160 && Readable(msg + i, 1) && msg[i] != '\0'; ++i) text[i] = (msg[i] >= 0x20 || msg[i] == '\n') ? msg[i] : '?'; - APS5_HIT("MSGDIALOG", "open: buttons=%d text=\"%s\" -> auto answer", buttonType, text); - } +bool Present(const MsgDialog::ParsedParam& parsed) { + ModalDialogRequest request; + if (!MsgDialog::BuildRequest(parsed, request)) return false; + request.owner = ModalDialogOwnerMsgDialog; + return ModalDialogOpen_nid_postfix(request); } int Poll() { std::lock_guard g(g_lock); - if (g_status == kStatusRunning) { + if (g_status == kStatusRunning && g_presented) { + std::size_t chosen = 0; + const ModalDialogState state = ModalDialogPoll_nid_postfix(chosen, ModalDialogOwnerMsgDialog); + if (state == ModalDialogState::Answered) g_buttonId = MsgDialog::ButtonIdOf(chosen); + if (state != ModalDialogState::Showing) g_status = kStatusFinished; + } else if (g_status == kStatusRunning) { bool done = false; if (g_mode == kModeProgressBar) { done = std::chrono::steady_clock::now() - g_openedAt > std::chrono::seconds(30); @@ -111,13 +84,18 @@ int APS5_VABI sceMsgDialogTerminate(void) { std::lock_guard g(g_lock); const bool was = g_status != kStatusNone; g_status = kStatusNone; + g_presented = false; + ModalDialogReset_nid_postfix(ModalDialogOwnerMsgDialog); return was ? kErrOk : kErrNotInitialized; } int APS5_VABI sceMsgDialogOpen(const void* param) { if (param == nullptr) return kErrArgNull; std::lock_guard g(g_lock); if (g_status == kStatusRunning) return kErrBusy; - Inspect(param); + const MsgDialog::ParsedParam parsed = MsgDialog::ParseParam(param); + Inspect(parsed); + g_presented = Present(parsed); + if (parsed.hasText) APS5_HIT("MSGDIALOG", "open: buttons=%d text=\"%s\" -> %s", parsed.buttonType, MsgDialog::LogText(parsed.text).c_str(), g_presented ? "shown" : "auto answer"); g_pollsLeft = 2; g_openedAt = std::chrono::steady_clock::now(); g_status = kStatusRunning; @@ -132,6 +110,7 @@ int APS5_VABI sceMsgDialogUpdateStatus(void) { int APS5_VABI sceMsgDialogClose(void) { std::lock_guard g(g_lock); if (g_status != kStatusRunning) return kErrNotRunning; + if (g_presented) ModalDialogClose_nid_postfix(ModalDialogOwnerMsgDialog); g_status = kStatusFinished; return kErrOk; } diff --git a/core/libs/prx/libSceMsgDialog/include/MsgDialogParam.hpp b/core/libs/prx/libSceMsgDialog/include/MsgDialogParam.hpp new file mode 100644 index 000000000000..c8eac452a88a --- /dev/null +++ b/core/libs/prx/libSceMsgDialog/include/MsgDialogParam.hpp @@ -0,0 +1,83 @@ +#ifndef CORE_LIBS_PRX_LIBSCEMSGDIALOG_INCLUDE_MSGDIALOGPARAM_HPP +#define CORE_LIBS_PRX_LIBSCEMSGDIALOG_INCLUDE_MSGDIALOGPARAM_HPP + +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#endif + +namespace MsgDialog { + +inline constexpr int ModeUserMsg = 1; +inline constexpr int ModeProgressBar = 2; +inline constexpr int ModeSystemMsg = 3; + +inline constexpr int ButtonTypeOk = 0; +inline constexpr int ButtonTypeYesNo = 1; +inline constexpr int ButtonTypeNone = 2; +inline constexpr int ButtonTypeOkCancel = 3; +inline constexpr int ButtonTypeYesNoFocusNo = 4; + +inline constexpr int ButtonIdOk = 1; +inline constexpr int ButtonIdNo = 2; + +inline constexpr std::size_t ParamBytes = 0x60; +inline constexpr std::size_t MaxMessageBytes = 1024; + +struct ParsedParam { + int mode = ModeUserMsg; + bool hasUserMessage = false; + bool hasText = false; + int buttonType = ButtonTypeOk; + std::string text; +}; + +inline bool Readable(const void* p, std::size_t n) { +#ifdef _WIN32 + if (p == nullptr) return false; + MEMORY_BASIC_INFORMATION mbi; + if (VirtualQuery(p, &mbi, sizeof(mbi)) == 0 || mbi.State != MEM_COMMIT) return false; + if ((mbi.Protect & (PAGE_NOACCESS | PAGE_GUARD)) != 0) return false; + const auto end = reinterpret_cast(mbi.BaseAddress) + mbi.RegionSize; + return reinterpret_cast(p) + n <= end; +#else + return p != nullptr; +#endif +} + +inline ParsedParam ParseParam(const void* param) { + ParsedParam parsed; + const std::uint8_t* bytes = static_cast(param); + if (!Readable(bytes, ParamBytes)) return parsed; + std::int32_t mode = 0; + std::memcpy(&mode, bytes + 0x38, 4); + if (mode >= ModeUserMsg && mode <= ModeSystemMsg) parsed.mode = mode; + if (parsed.mode != ModeUserMsg) return parsed; + const std::uint8_t* userMsg = nullptr; + std::memcpy(&userMsg, bytes + 0x40, 8); + if (!Readable(userMsg, 16)) return parsed; + std::int32_t buttonType = 0; + std::memcpy(&buttonType, userMsg, 4); + const char* msg = nullptr; + std::memcpy(&msg, userMsg + 8, 8); + parsed.hasUserMessage = true; + parsed.buttonType = buttonType; + if (!Readable(msg, 4)) return parsed; + parsed.hasText = true; + for (std::size_t i = 0; i < MaxMessageBytes && Readable(msg + i, 1) && msg[i] != '\0'; ++i) parsed.text.push_back(msg[i]); + return parsed; +} + +inline std::string LogText(const std::string& text) { + std::string shown; + for (std::size_t i = 0; i < text.size() && i < 160; ++i) shown.push_back((text[i] >= 0x20 || text[i] == '\n') ? text[i] : '?'); + return shown; +} + +} + +#endif diff --git a/core/libs/prx/libSceMsgDialog/include/MsgDialogRequest.hpp b/core/libs/prx/libSceMsgDialog/include/MsgDialogRequest.hpp new file mode 100644 index 000000000000..94d08d7096e9 --- /dev/null +++ b/core/libs/prx/libSceMsgDialog/include/MsgDialogRequest.hpp @@ -0,0 +1,48 @@ +#ifndef CORE_LIBS_PRX_LIBSCEMSGDIALOG_INCLUDE_MSGDIALOGREQUEST_HPP +#define CORE_LIBS_PRX_LIBSCEMSGDIALOG_INCLUDE_MSGDIALOGREQUEST_HPP + +#include +#include + +#include "prx/libSceIme/include/ModalDialog.hpp" +#include "prx/libSceMsgDialog/include/MsgDialogParam.hpp" +#include "prx/libSceMsgDialog/include/MsgDialogText.hpp" + +namespace MsgDialog { + +inline bool BuildRequest(const ParsedParam& parsed, ModalDialogRequest& request) { + if (parsed.mode != ModeUserMsg || !parsed.hasUserMessage || !parsed.hasText) return false; + ModalDialogRequest built; + switch (parsed.buttonType) { + case ButtonTypeOk: + built.buttons = {u"OK"}; + built.cancel = 0; + break; + case ButtonTypeYesNo: + built.buttons = {u"Yes", u"No"}; + built.cancel = 1; + break; + case ButtonTypeOkCancel: + built.buttons = {u"OK", u"Cancel"}; + built.cancel = 1; + break; + case ButtonTypeYesNoFocusNo: + built.buttons = {u"Yes", u"No"}; + built.focus = 1; + built.cancel = 1; + break; + default: + return false; + } + built.message = DecodeUtf8(parsed.text); + request = std::move(built); + return true; +} + +inline int ButtonIdOf(std::size_t index) { + return static_cast(index) + 1; +} + +} + +#endif diff --git a/core/libs/prx/libSceMsgDialog/include/MsgDialogText.hpp b/core/libs/prx/libSceMsgDialog/include/MsgDialogText.hpp new file mode 100644 index 000000000000..6c74307fbc15 --- /dev/null +++ b/core/libs/prx/libSceMsgDialog/include/MsgDialogText.hpp @@ -0,0 +1,58 @@ +#ifndef CORE_LIBS_PRX_LIBSCEMSGDIALOG_INCLUDE_MSGDIALOGTEXT_HPP +#define CORE_LIBS_PRX_LIBSCEMSGDIALOG_INCLUDE_MSGDIALOGTEXT_HPP + +#include +#include +#include + +namespace MsgDialog { + +inline std::u16string DecodeUtf8(const std::string& bytes) { + std::u16string text; + std::size_t index = 0; + while (index < bytes.size()) { + const auto lead = static_cast(bytes[index]); + std::size_t length = 1; + char32_t code = lead; + if (lead >= 0xC2 && lead <= 0xDF) { + length = 2; + code = lead & 0x1Fu; + } else if (lead >= 0xE0 && lead <= 0xEF) { + length = 3; + code = lead & 0x0Fu; + } else if (lead >= 0xF0 && lead <= 0xF4) { + length = 4; + code = lead & 0x07u; + } else if (lead >= 0x80) { + text.push_back(u'�'); + ++index; + continue; + } + bool valid = index + length <= bytes.size(); + for (std::size_t follow = 1; valid && follow < length; ++follow) { + const auto next = static_cast(bytes[index + follow]); + valid = (next & 0xC0u) == 0x80u; + code = (code << 6) | (next & 0x3Fu); + } + if (valid && length == 3 && (code < 0x800 || (code >= 0xD800 && code <= 0xDFFF))) valid = false; + if (valid && length == 4 && (code < 0x10000 || code > 0x10FFFF)) valid = false; + if (!valid) { + text.push_back(u'�'); + ++index; + continue; + } + if (code >= 0x10000) { + code -= 0x10000; + text.push_back(static_cast(0xD800 + (code >> 10))); + text.push_back(static_cast(0xDC00 + (code & 0x3FF))); + } else { + text.push_back(static_cast(code)); + } + index += length; + } + return text; +} + +} + +#endif diff --git a/core/libs/prx/libSceNKWeb/Export.cpp b/core/libs/prx/libSceNKWeb/Export.cpp index fdef9184da18..a3126dd71dad 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 000000000000..4b1e568b9342 --- /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 d65e49488902..bea71c4a5cc5 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/libSceNKWebCdlgInjectedBundle/Export.cpp b/core/libs/prx/libSceNKWebCdlgInjectedBundle/Export.cpp index d81f4a5e32c4..3bfc8765b334 100644 --- a/core/libs/prx/libSceNKWebCdlgInjectedBundle/Export.cpp +++ b/core/libs/prx/libSceNKWebCdlgInjectedBundle/Export.cpp @@ -7,4 +7,10 @@ extern "C" { APS5_DUMMY_FUN +int APS5_VABI sceNKWebCdlgInjectedBundleUnknown_001_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("es-hzEqlzr0", sceNKWebCdlgInjectedBundleUnknown_001_nid_no_patch); + } diff --git a/core/libs/prx/libSceNKWebKit/CMakeLists.txt b/core/libs/prx/libSceNKWebKit/CMakeLists.txt new file mode 100644 index 000000000000..9bad4ef4d076 --- /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 000000000000..ff157d6b703a --- /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 000000000000..ffec2e000027 --- /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 13fc2abd3d7e..bcadc15ba7ae 100644 --- a/core/libs/prx/libSceNKWebKit/Export.cpp +++ b/core/libs/prx/libSceNKWebKit/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceNKWebKit/include/InventoryExports.hpp" #include "prx/libSceNKWebKit/include/Api.hpp" #include #include @@ -6,604 +8,43038 @@ 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 _ZN7WebCore28InspectorFrontendClientLocal8Settings11getPropertyERKN3WTF6StringE() { +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 _ZN9Inspector21InjectedScriptManagerdaEPv() { +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 _ZN9Inspector8Protocol13BindingTraitsINS0_8Timeline13TimelineEventEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE() { +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 _ZN3JSC6JSLock12DropAllLocksC2ERNS_2VME() { +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 _ZN3WTF15BinarySemaphore6signalEv() { +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 _ZN7WebCore28InspectorFrontendClientLocal11isUnderTestEv() { +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 WKPreferencesSetStandardFontFamily() { +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 _ZN7WebCore15JSDOMWindowBaseD1Ev() { +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 _ZN9Inspector22InspectorDebuggerAgent24continueUntilNextRunLoopERN3WTF6StringE() { +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 _ZN7WebCore8Settings27setLoadsImagesAutomaticallyEb() { +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 WKPreferencesGetApplicationChromeModeEnabled() { +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 _ZN7WebCore18JSHTMLInputElementC2ERKS0_() { +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 _ZN9Inspector21InspectorConsoleAgent5resetEv() { +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 _ZN7WebCore4Node16addEventListenerERKN3WTF10AtomStringEONS1_3RefINS_13EventListenerENS1_13DumbPtrTraitsIS6_EEEERKNS_11EventTarget23AddEventListenerOptionsE() { +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 WKPreferencesSetAutostartOriginPlugInSnapshottingEnabled() { +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 _ZN7WebCore18TextureMapperLayer14paintRecursiveERKNS_25TextureMapperPaintOptionsE() { +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 _ZN7WebCore9GLContextnwEm() { +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 _ZN7WebCore18HTMLMarqueeElement14setScrollDelayEj() { +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 WKPreferencesResetTestRunnerOverrides() { +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 WKContextConfigurationSetAlwaysKeepAndReuseSwappedProcesses() { +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 _ZN3JSC9Structure40addPropertyTransitionToExistingStructureEPS0_NS_12PropertyNameEjRi() { +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 _ZN7WebCore9GLContextD0Ev() { +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 _ZN7WebCore7Element26scrollIntoViewIfNotVisibleEb() { +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 WKPreferencesSetContentChangeObserverEnabled() { +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 _ZNK3JSC18PropertyDescriptor12configurableEv() { +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 _ZN3JSC30int52AwareSpeculationFromValueENS_7JSValueE() { +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 _ZN9Inspector18InjectedScriptHost7subtypeEPN3JSC14JSGlobalObjectENS1_7JSValueE() { +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 _ZNK7WebCore24MatrixTransformOperation6matrixEv() { +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 _ZN7WebCore13HTTPHeaderMap3addERKN3WTF6StringES4_() { +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 _ZNK3WTF3URL10protocolIsEPKc() { +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 _ZN7WebCore28InspectorFrontendClientLocalC2EPNS_19InspectorControllerEPNS_4PageESt10unique_ptrINS0_8SettingsESt14default_deleteIS6_EE() { +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 _ZN7WebCore23ScaleTransformOperation5blendEPKNS_18TransformOperationEdb() { +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 _ZN7WebCore14XMLHttpRequestD1Ev() { +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 _ZN3JSC20TypedArrayControllerC2Ev() { +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 _ZN7WebCore14StaticNodeListnaEmPv() { +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 _ZN3WTF21RefCountedLeakCounter16suppressMessagesEPKc() { +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 _ZN9Inspector26LayerTreeBackendDispatcherD0Ev() { +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 _ZN3JSC49throwConstructorCannotBeCalledAsFunctionTypeErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeEPKc() { +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 WKNotificationManagerProviderDidUpdateNotificationPolicy() { +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 _ZN7WebCore29isCharacterSmartReplaceExemptEib() { +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 _ZN7WebCore26Matrix3DTransformOperationC2ERKNS_20TransformationMatrixE() { +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 _ZNK7WebCore11MediaPlayer9userAgentEv() { +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 _ZNK7WebCore8Document7fgColorEv() { +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 _ZN7WebCore28InspectorFrontendClientLocal23stopProfilingJavaScriptEv() { +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 WKWheelEventMake() { +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 _ZNK7WebCore11WindowProxy6windowEv() { +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 _ZN3WTF19addProcessPrivilegeENS_16ProcessPrivilegeE() { +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 WKPageLoadFile() { +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 _ZN3JSC13JSSetIterator14finishCreationERNS_2VMEPNS_5JSSetENS_13IterationKindE() { +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 _ZN3JSC21MarkedJSValueRefArrayC1EP15OpaqueJSContextj() { +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 _ZN3WTF14FileSystemImpl15openAndLockFileERKNS_6StringENS0_12FileOpenModeENS_9OptionSetINS0_12FileLockModeEEE() { +int APS5_VABI libSceNKWebKitLegacyUnknown_01GvW40Rco8_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("01GvW40Rco8", libSceNKWebKitLegacyUnknown_01GvW40Rco8_nid_no_patch); -int APS5_VABI _ZNK7WebCore4Page14renderTreeSizeEv() { +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 WKPreferencesSetCanvasUsesAcceleratedDrawing() { +int APS5_VABI libSceNKWebKitLegacyUnknown_031dJi8CRG4_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("031dJi8CRG4", libSceNKWebKitLegacyUnknown_031dJi8CRG4_nid_no_patch); -int APS5_VABI _ZN9Inspector22HeapFrontendDispatcher13trackingStartEdRKN3WTF6StringE() { +int APS5_VABI libSceNKWebKitLegacyUnknown_05ISb1sxzE4_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("05ISb1sxzE4", libSceNKWebKitLegacyUnknown_05ISb1sxzE4_nid_no_patch); -int APS5_VABI _ZN7WebCore11JSDOMWindow9setOpenerERN3JSC14JSGlobalObjectENS1_7JSValueE() { +int APS5_VABI libSceNKWebKitLegacyUnknown_08YRbeTpcSk_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("08YRbeTpcSk", libSceNKWebKitLegacyUnknown_08YRbeTpcSk_nid_no_patch); -int APS5_VABI _ZN7WebCore17NowPlayingManagernaEm() { +int APS5_VABI libSceNKWebKitLegacyUnknown_08u5HmSZLWI_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("08u5HmSZLWI", libSceNKWebKitLegacyUnknown_08u5HmSZLWI_nid_no_patch); -int APS5_VABI WKContextSetProcessModel() { +int APS5_VABI libSceNKWebKitLegacyUnknown_09XYbBK4zOk_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("09XYbBK4zOk", libSceNKWebKitLegacyUnknown_09XYbBK4zOk_nid_no_patch); -int APS5_VABI _ZN9Inspector15InspectorTargetD0Ev() { +int APS5_VABI libSceNKWebKitLegacyUnknown_0AVQjKBoUZQ_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("0AVQjKBoUZQ", libSceNKWebKitLegacyUnknown_0AVQjKBoUZQ_nid_no_patch); -int APS5_VABI _ZN7WebCore6Editor16pasteAsPlainTextENS0_20FromMenuOrKeyBindingE() { +int APS5_VABI libSceNKWebKitLegacyUnknown_0Asl1MoAb7Y_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("0Asl1MoAb7Y", libSceNKWebKitLegacyUnknown_0Asl1MoAb7Y_nid_no_patch); -int APS5_VABI _ZNK7WebCore6Quirks47shouldAvoidScrollingWhenFocusedContentIsVisibleEv() { +int APS5_VABI libSceNKWebKitLegacyUnknown_0C2wShXZc8Q_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("0C2wShXZc8Q", libSceNKWebKitLegacyUnknown_0C2wShXZc8Q_nid_no_patch); -int APS5_VABI _ZN7WebCore11DisplayList10DrawGlyphsD0Ev() { +int APS5_VABI libSceNKWebKitLegacyUnknown_0CXUHdlOyB0_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("0CXUHdlOyB0", libSceNKWebKitLegacyUnknown_0CXUHdlOyB0_nid_no_patch); -int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient29generatedMIMETypeForURLSchemeERKN3WTF6StringE() { +int APS5_VABI libSceNKWebKitLegacyUnknown_0D2KyH6te08_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("0D2KyH6te08", libSceNKWebKitLegacyUnknown_0D2KyH6te08_nid_no_patch); -int APS5_VABI _ZN3WTF6Thread5yieldEv() { +int APS5_VABI libSceNKWebKitLegacyUnknown_0FfP3qcsmAw_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("0FfP3qcsmAw", libSceNKWebKitLegacyUnknown_0FfP3qcsmAw_nid_no_patch); -int APS5_VABI WKPreferencesGetCaptureVideoInUIProcessEnabled() { +int APS5_VABI libSceNKWebKitLegacyUnknown_0GGFzi4CsQg_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("0GGFzi4CsQg", libSceNKWebKitLegacyUnknown_0GGFzi4CsQg_nid_no_patch); -int APS5_VABI _ZN7WebCore24DocumentMarkerController9addMarkerERKNS_11SimpleRangeENS_14DocumentMarker10MarkerTypeERKN3WTF7VariantIJNS6_6StringENS4_13DictationDataENS6_6RefPtrINS_4NodeENS6_13DumbPtrTraitsISB_EEEEEEE() { +int APS5_VABI libSceNKWebKitLegacyUnknown_0H810BYRZk0_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("0H810BYRZk0", libSceNKWebKitLegacyUnknown_0H810BYRZk0_nid_no_patch); -int APS5_VABI WTFSetLogChannelLevel() { +int APS5_VABI libSceNKWebKitLegacyUnknown_0HG6ycBGyNs_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("0HG6ycBGyNs", libSceNKWebKitLegacyUnknown_0HG6ycBGyNs_nid_no_patch); -int APS5_VABI _ZN7WebCore20SVGPathStringBuilderC1Ev() { +int APS5_VABI libSceNKWebKitLegacyUnknown_0JxNOxFh7mU_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("0JxNOxFh7mU", libSceNKWebKitLegacyUnknown_0JxNOxFh7mU_nid_no_patch); -int APS5_VABI _ZN7WebCore11DisplayList10StrokePathD0Ev() { +int APS5_VABI libSceNKWebKitLegacyUnknown_0M5xxtd3KVs_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("0M5xxtd3KVs", libSceNKWebKitLegacyUnknown_0M5xxtd3KVs_nid_no_patch); -int APS5_VABI _ZN7WebCore17PageConfigurationD2Ev() { +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 _ZN7WebCore12DOMTokenList6toggleERKN3WTF10AtomStringENS1_8OptionalIbEE() { +int APS5_VABI libSceNKWebKitLegacyUnknown_0PGKqY9wbgg_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("0PGKqY9wbgg", libSceNKWebKitLegacyUnknown_0PGKqY9wbgg_nid_no_patch); -int APS5_VABI _ZN3JSC4Heap20edenActivityCallbackEv() { +int APS5_VABI libSceNKWebKitLegacyUnknown_0Pcj1zY3QX0_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("0Pcj1zY3QX0", libSceNKWebKitLegacyUnknown_0Pcj1zY3QX0_nid_no_patch); -int APS5_VABI WKWebsitePoliciesSetAllowedAutoplayQuirks() { +int APS5_VABI libSceNKWebKitLegacyUnknown_0Vm5ZtZD8Zw_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("0Vm5ZtZD8Zw", libSceNKWebKitLegacyUnknown_0Vm5ZtZD8Zw_nid_no_patch); -int APS5_VABI _ZNK7WebCore6Editor8canPasteEv() { +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 _ZN7WebCore15DatabaseManager9singletonEv() { +int APS5_VABI libSceNKWebKitLegacyUnknown_0ZS1wR9V5NA_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("0ZS1wR9V5NA", libSceNKWebKitLegacyUnknown_0ZS1wR9V5NA_nid_no_patch); -int APS5_VABI _ZN7WebCore18TextureMapperLayer18setFixedToViewportEb() { +int APS5_VABI libSceNKWebKitLegacyUnknown_0ae0oDSPoAg_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("0ae0oDSPoAg", libSceNKWebKitLegacyUnknown_0ae0oDSPoAg_nid_no_patch); -int APS5_VABI _ZN3WTF5equalEPKNS_10StringImplES2_() { +int APS5_VABI libSceNKWebKitLegacyUnknown_0bKu3ZjjnMY_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("0bKu3ZjjnMY", libSceNKWebKitLegacyUnknown_0bKu3ZjjnMY_nid_no_patch); -int APS5_VABI WKBundleBackForwardListGetForwardListCount() { +int APS5_VABI libSceNKWebKitLegacyUnknown_0bkH4IQFtTc_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("0bkH4IQFtTc", libSceNKWebKitLegacyUnknown_0bkH4IQFtTc_nid_no_patch); -int APS5_VABI _ZN7WebCore28collectVaryingRequestHeadersEPNS_21NetworkStorageSessionERKNS_15ResourceRequestERKNS_16ResourceResponseE() { +int APS5_VABI libSceNKWebKitLegacyUnknown_0hC6Uj6W6wU_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("0hC6Uj6W6wU", libSceNKWebKitLegacyUnknown_0hC6Uj6W6wU_nid_no_patch); -int APS5_VABI _ZN7WebCore19approximateAsRegionERKNS_11RoundedRectEj() { +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 _ZN7WebCore11HistoryItem8formDataEv() { +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 _ZN3WTF9URLParser23maybeCanonicalizeSchemeERKNS_6StringE() { +int APS5_VABI libSceNKWebKitLegacyUnknown_0krKV0DRrAk_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("0krKV0DRrAk", libSceNKWebKitLegacyUnknown_0krKV0DRrAk_nid_no_patch); -int APS5_VABI _ZN3WTF21MemoryPressureHandler15setProcessStateENS_18WebsamProcessStateE() { +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 _ZThn16_N9Inspector21InspectorConsoleAgent6enableERN3WTF6StringE() { +int APS5_VABI libSceNKWebKitLegacyUnknown_0lgq0Nb5PZg_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("0lgq0Nb5PZg", libSceNKWebKitLegacyUnknown_0lgq0Nb5PZg_nid_no_patch); -int APS5_VABI _ZN7WebCore27TranslateTransformOperationC1ERKNS_6LengthES3_S3_NS_18TransformOperation13OperationTypeE() { +int APS5_VABI libSceNKWebKitLegacyUnknown_0mgFAAcQ5oc_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("0mgFAAcQ5oc", libSceNKWebKitLegacyUnknown_0mgFAAcQ5oc_nid_no_patch); -int APS5_VABI _ZN3WTF13StringBuilder12appendNumberEf() { +int APS5_VABI libSceNKWebKitLegacyUnknown_0mhooUPTcOI_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("0mhooUPTcOI", libSceNKWebKitLegacyUnknown_0mhooUPTcOI_nid_no_patch); -int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient35dispatchDidClearWindowObjectInWorldERNS_15DOMWrapperWorldE() { +int APS5_VABI libSceNKWebKitLegacyUnknown_0oR2Is0DWTQ_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("0oR2Is0DWTQ", libSceNKWebKitLegacyUnknown_0oR2Is0DWTQ_nid_no_patch); -int APS5_VABI WKDownloadCancel() { +int APS5_VABI libSceNKWebKitLegacyUnknown_0qPkXg6hR0M_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("0qPkXg6hR0M", libSceNKWebKitLegacyUnknown_0qPkXg6hR0M_nid_no_patch); -int APS5_VABI _ZNK7WebCore14SecurityOrigin20isSameSchemeHostPortERKS0_() { +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 WKErrorCopyLocalizedDescription() { +int APS5_VABI libSceNKWebKitLegacyUnknown_0w6LRl9ZOGc_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("0w6LRl9ZOGc", libSceNKWebKitLegacyUnknown_0w6LRl9ZOGc_nid_no_patch); -int APS5_VABI _ZNK7WebCore11MessagePort5derefEv() { +int APS5_VABI libSceNKWebKitLegacyUnknown_10sQaMQxi70_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("10sQaMQxi70", libSceNKWebKitLegacyUnknown_10sQaMQxi70_nid_no_patch); -int APS5_VABI _ZNK7WebCore17MouseRelatedEvent1yEv() { +int APS5_VABI libSceNKWebKitLegacyUnknown_14Zfc72Ykbc_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("14Zfc72Ykbc", libSceNKWebKitLegacyUnknown_14Zfc72Ykbc_nid_no_patch); -int APS5_VABI _ZN7WebCore9FloatRectC2ERKNS_7IntRectE() { +int APS5_VABI libSceNKWebKitLegacyUnknown_14pK67tlLag_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("14pK67tlLag", libSceNKWebKitLegacyUnknown_14pK67tlLag_nid_no_patch); -int APS5_VABI _ZN7WebCore15AffineTransform9translateERKNS_9FloatSizeE() { +int APS5_VABI libSceNKWebKitLegacyUnknown_15TtZHNz4Zg_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("15TtZHNz4Zg", libSceNKWebKitLegacyUnknown_15TtZHNz4Zg_nid_no_patch); -int APS5_VABI _ZNK3JSC18PropertyDescriptor6setterEv() { +int APS5_VABI libSceNKWebKitLegacyUnknown_195DFuuHr6U_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("195DFuuHr6U", libSceNKWebKitLegacyUnknown_195DFuuHr6U_nid_no_patch); -int APS5_VABI WKContextSetDownloadClient() { +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 _ZN9Inspector23CanvasBackendDispatcher6createERNS_17BackendDispatcherEPNS_30CanvasBackendDispatcherHandlerE() { +int APS5_VABI libSceNKWebKitLegacyUnknown_1P8wwHM7De8_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("1P8wwHM7De8", libSceNKWebKitLegacyUnknown_1P8wwHM7De8_nid_no_patch); -int APS5_VABI _ZN7WebCore15DeferredPromise12callFunctionERN3JSC14JSGlobalObjectENS0_11ResolveModeENS1_7JSValueE() { +int APS5_VABI libSceNKWebKitLegacyUnknown_1QPJreBoNXY_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("1QPJreBoNXY", libSceNKWebKitLegacyUnknown_1QPJreBoNXY_nid_no_patch); -int APS5_VABI _ZN7WebCore21PlatformKeyboardEvent24disambiguateKeyDownEventENS_13PlatformEvent4TypeEb() { +int APS5_VABI libSceNKWebKitLegacyUnknown_1QYet5c7akM_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("1QYet5c7akM", libSceNKWebKitLegacyUnknown_1QYet5c7akM_nid_no_patch); -int APS5_VABI _ZN7WebCore9JSElementD2Ev() { +int APS5_VABI libSceNKWebKitLegacyUnknown_1Wij5bpNZbk_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("1Wij5bpNZbk", libSceNKWebKitLegacyUnknown_1Wij5bpNZbk_nid_no_patch); -int APS5_VABI _ZN9Inspector14InspectorAgentC2ERNS_12AgentContextE() { +int APS5_VABI libSceNKWebKitLegacyUnknown_1a5hFKC5SdU_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("1a5hFKC5SdU", libSceNKWebKitLegacyUnknown_1a5hFKC5SdU_nid_no_patch); -int APS5_VABI _ZN7WebCore18TextureMapperLayer15setBoundsOriginERKNS_10FloatPointE() { +int APS5_VABI libSceNKWebKitLegacyUnknown_1bCfZiqfPT4_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("1bCfZiqfPT4", libSceNKWebKitLegacyUnknown_1bCfZiqfPT4_nid_no_patch); -int APS5_VABI WKWebsiteDataStoreHasAppBoundSession() { +int APS5_VABI libSceNKWebKitLegacyUnknown_1cBDX0UvFXE_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("1cBDX0UvFXE", libSceNKWebKitLegacyUnknown_1cBDX0UvFXE_nid_no_patch); -int APS5_VABI _ZN7WebCore20ResourceHandleClientD0Ev() { +int APS5_VABI libSceNKWebKitLegacyUnknown_1cqAxUdM5E4_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("1cqAxUdM5E4", libSceNKWebKitLegacyUnknown_1cqAxUdM5E4_nid_no_patch); -int APS5_VABI _ZN7WebCore7Element27dispatchMouseForceWillBeginEv() { +int APS5_VABI libSceNKWebKitLegacyUnknown_1g2ot19eUEk_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("1g2ot19eUEk", libSceNKWebKitLegacyUnknown_1g2ot19eUEk_nid_no_patch); -int APS5_VABI _ZN9Inspector21CSSFrontendDispatchernaEm() { +int APS5_VABI libSceNKWebKitLegacyUnknown_1hNKARbz3I4_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("1hNKARbz3I4", libSceNKWebKitLegacyUnknown_1hNKARbz3I4_nid_no_patch); -int APS5_VABI _ZNK7WebCore14DocumentLoader12mainResourceEv() { +int APS5_VABI libSceNKWebKitLegacyUnknown_1hPemFIVUys_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("1hPemFIVUys", libSceNKWebKitLegacyUnknown_1hPemFIVUys_nid_no_patch); -int APS5_VABI _ZN7WebCore8Document5closeEv() { +int APS5_VABI libSceNKWebKitLegacyUnknown_1kkTnF6SNog_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("1kkTnF6SNog", libSceNKWebKitLegacyUnknown_1kkTnF6SNog_nid_no_patch); -int APS5_VABI _ZN7WebCore21markerTextForListItemEPNS_7ElementE() { +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 _ZN7WebCore11MediaPlayer13addVideoTrackERNS_17VideoTrackPrivateE() { +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 _ZNK7WebCore10FloatPoint15matrixTransformERKNS_20TransformationMatrixE() { +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 _ZThn16_N9Inspector22InspectorDebuggerAgent19evaluateOnCallFrameERN3WTF6StringERKS2_S5_PS4_PKbS8_S8_S8_S8_S8_RNS1_6RefPtrINS_8Protocol7Runtime12RemoteObjectENS1_13DumbPtrTraitsISC_EEEERNS1_8OptionalIbEERNSH_IiEE() { +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 _ZNK7WebCore11CryptoKeyEC9exportRawEv() { +int APS5_VABI libSceNKWebKitLegacyUnknown_1wgLUOSOs9Q_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("1wgLUOSOs9Q", libSceNKWebKitLegacyUnknown_1wgLUOSOs9Q_nid_no_patch); -int APS5_VABI _ZN9Inspector22RemoteInspectionTargetD2Ev() { +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 _ZNK7WebCore5Color9lightenedEv() { +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 _ZN9Inspector22InspectorDebuggerAgent20setPauseOnAssertionsERN3WTF6StringEb() { +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 _ZN7WebCore14ResourceLoader5startEv() { +int APS5_VABI libSceNKWebKitLegacyUnknown_20fktvybHIM_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("20fktvybHIM", libSceNKWebKitLegacyUnknown_20fktvybHIM_nid_no_patch); -int APS5_VABI _ZNK7WebCore27TranslateTransformOperation5cloneEv() { +int APS5_VABI libSceNKWebKitLegacyUnknown_21MSzOuqZi0_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("21MSzOuqZi0", libSceNKWebKitLegacyUnknown_21MSzOuqZi0_nid_no_patch); -int APS5_VABI WKPageCanDelete() { +int APS5_VABI libSceNKWebKitLegacyUnknown_22GfJEfmVVM_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("22GfJEfmVVM", libSceNKWebKitLegacyUnknown_22GfJEfmVVM_nid_no_patch); -int APS5_VABI WKNotificationCopyDir() { +int APS5_VABI libSceNKWebKitLegacyUnknown_22ngKDr3G28_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("22ngKDr3G28", libSceNKWebKitLegacyUnknown_22ngKDr3G28_nid_no_patch); -int APS5_VABI _ZNK7WebCore9FloatRect8containsERKS0_() { +int APS5_VABI libSceNKWebKitLegacyUnknown_23jQPF1C6aE_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("23jQPF1C6aE", libSceNKWebKitLegacyUnknown_23jQPF1C6aE_nid_no_patch); -int APS5_VABI _ZN7WebCore20LegacySchemeRegistry33shouldTreatURLSchemeAsCORSEnabledERKN3WTF6StringE() { +int APS5_VABI libSceNKWebKitLegacyUnknown_27E4o5mMxTs_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("27E4o5mMxTs", libSceNKWebKitLegacyUnknown_27E4o5mMxTs_nid_no_patch); -int APS5_VABI _ZN7WebCore16MIMETypeRegistry12pdfMIMETypesEv() { +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 WKUserContentExtensionStoreRemove() { +int APS5_VABI libSceNKWebKitLegacyUnknown_2D9yfogw5bs_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("2D9yfogw5bs", libSceNKWebKitLegacyUnknown_2D9yfogw5bs_nid_no_patch); -int APS5_VABI _ZN9Inspector21InspectorRuntimeAgent6enableERN3WTF6StringE() { +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 _ZN9Inspector31NetworkBackendDispatcherHandleraSERKS0_() { +int APS5_VABI libSceNKWebKitLegacyUnknown_2EVvhVabsJM_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("2EVvhVabsJM", libSceNKWebKitLegacyUnknown_2EVvhVabsJM_nid_no_patch); -int APS5_VABI _ZN7WebCore19ResourceRequestBase17removeCredentialsEv() { +int APS5_VABI libSceNKWebKitLegacyUnknown_2GdBuLgUeSI_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("2GdBuLgUeSI", libSceNKWebKitLegacyUnknown_2GdBuLgUeSI_nid_no_patch); -int APS5_VABI WKPageSetCustomTextEncodingName() { +int APS5_VABI libSceNKWebKitLegacyUnknown_2LKVAt2Daw8_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("2LKVAt2Daw8", libSceNKWebKitLegacyUnknown_2LKVAt2Daw8_nid_no_patch); -int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager30stopAllMediaPlaybackForProcessEv() { +int APS5_VABI libSceNKWebKitLegacyUnknown_2M0ZLmwaVd8_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("2M0ZLmwaVd8", libSceNKWebKitLegacyUnknown_2M0ZLmwaVd8_nid_no_patch); -int APS5_VABI _ZN7WebCore23ApplicationCacheStorage16originsWithCacheEv() { +int APS5_VABI libSceNKWebKitLegacyUnknown_2NThFFu5XdE_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("2NThFFu5XdE", libSceNKWebKitLegacyUnknown_2NThFFu5XdE_nid_no_patch); -int APS5_VABI _ZThn16_N9Inspector21InspectorRuntimeAgent8evaluateERN3WTF6StringERKS2_PS4_PKbS8_PKiS8_S8_S8_S8_RNS1_6RefPtrINS_8Protocol7Runtime12RemoteObjectENS1_13DumbPtrTraitsISE_EEEERNS1_8OptionalIbEERNSJ_IiEE() { +int APS5_VABI libSceNKWebKitLegacyUnknown_2PX8AY1a0Eo_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("2PX8AY1a0Eo", libSceNKWebKitLegacyUnknown_2PX8AY1a0Eo_nid_no_patch); -int APS5_VABI _ZNK7WebCore27TranslateTransformOperationeqERKNS_18TransformOperationE() { +int APS5_VABI libSceNKWebKitLegacyUnknown_2QhFHIOZPNM_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("2QhFHIOZPNM", libSceNKWebKitLegacyUnknown_2QhFHIOZPNM_nid_no_patch); -int APS5_VABI _ZN7WebCore9FrameView24forceLayoutForPaginationERKNS_9FloatSizeES3_fNS_19AdjustViewSizeOrNotE() { +int APS5_VABI libSceNKWebKitLegacyUnknown_2R7sNgYqmi0_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("2R7sNgYqmi0", libSceNKWebKitLegacyUnknown_2R7sNgYqmi0_nid_no_patch); -int APS5_VABI _ZN7WebCore11DisplayList11ClearShadowD1Ev() { +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 _ZN7WebCore22EmptyFrameLoaderClient35dispatchDidChangeLocationWithinPageEv() { +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 _ZNK7WebCore6Widget25convertFromContainingViewERKNS_8IntPointE() { +int APS5_VABI libSceNKWebKitLegacyUnknown_2WqXdvWNwdY_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("2WqXdvWNwdY", libSceNKWebKitLegacyUnknown_2WqXdvWNwdY_nid_no_patch); -int APS5_VABI WKPreferencesGetLocalFileContentSniffingEnabled() { +int APS5_VABI libSceNKWebKitLegacyUnknown_2YS0DtL8qSc_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("2YS0DtL8qSc", libSceNKWebKitLegacyUnknown_2YS0DtL8qSc_nid_no_patch); -int APS5_VABI _ZNK7WebCore13HTTPHeaderMap12isolatedCopyEv() { +int APS5_VABI libSceNKWebKitLegacyUnknown_2Yc8JPHyUSY_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("2Yc8JPHyUSY", libSceNKWebKitLegacyUnknown_2Yc8JPHyUSY_nid_no_patch); -int APS5_VABI _ZN7WebCore22DefaultFilterOperationD0Ev() { +int APS5_VABI libSceNKWebKitLegacyUnknown_2aBO17Mqrpw_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("2aBO17Mqrpw", libSceNKWebKitLegacyUnknown_2aBO17Mqrpw_nid_no_patch); -int APS5_VABI _ZN7WebCore4Page15setFooterHeightEi() { +int APS5_VABI libSceNKWebKitLegacyUnknown_2awYqsMSHr0_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("2awYqsMSHr0", libSceNKWebKitLegacyUnknown_2awYqsMSHr0_nid_no_patch); -int APS5_VABI _ZN7WebCore8JSDOMURL9toWrappedERN3JSC2VMENS1_7JSValueE() { +int APS5_VABI libSceNKWebKitLegacyUnknown_2bOKQcArI2k_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("2bOKQcArI2k", libSceNKWebKitLegacyUnknown_2bOKQcArI2k_nid_no_patch); -int APS5_VABI JSObjectSetPrivate() { +int APS5_VABI libSceNKWebKitLegacyUnknown_2d1tYzrlpS8_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("2d1tYzrlpS8", libSceNKWebKitLegacyUnknown_2d1tYzrlpS8_nid_no_patch); -int APS5_VABI _ZN7WebCore21ISOTrackEncryptionBoxC1Ev() { +int APS5_VABI libSceNKWebKitLegacyUnknown_2dbm0DhmsPc_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("2dbm0DhmsPc", libSceNKWebKitLegacyUnknown_2dbm0DhmsPc_nid_no_patch); -int APS5_VABI _ZN7WebCore18PlatformTimeRangesnaEm() { +int APS5_VABI libSceNKWebKitLegacyUnknown_2dnaEy8W7Q0_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("2dnaEy8W7Q0", libSceNKWebKitLegacyUnknown_2dnaEy8W7Q0_nid_no_patch); -int APS5_VABI _ZN3JSC9Integrity22auditCellMinimallySlowERNS_2VMEPNS_6JSCellE() { +int APS5_VABI libSceNKWebKitLegacyUnknown_2hEyEaCxl8A_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("2hEyEaCxl8A", libSceNKWebKitLegacyUnknown_2hEyEaCxl8A_nid_no_patch); -int APS5_VABI _ZN9Inspector24TargetFrontendDispatchernwEm() { +int APS5_VABI libSceNKWebKitLegacyUnknown_2hoav7M2FjY_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("2hoav7M2FjY", libSceNKWebKitLegacyUnknown_2hoav7M2FjY_nid_no_patch); -int APS5_VABI _ZNK7WebCore16HTMLImageElement13naturalHeightEv() { +int APS5_VABI libSceNKWebKitLegacyUnknown_2jdQQaVWuAw_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("2jdQQaVWuAw", libSceNKWebKitLegacyUnknown_2jdQQaVWuAw_nid_no_patch); -int APS5_VABI _ZN3JSC10LinkBuffer8linkCodeERNS_14MacroAssemblerENS_20JITCompilationEffortE() { +int APS5_VABI libSceNKWebKitLegacyUnknown_2kDZb3V0F5g_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("2kDZb3V0F5g", libSceNKWebKitLegacyUnknown_2kDZb3V0F5g_nid_no_patch); -int APS5_VABI WKNotificationPermissionRequestAllow() { +int APS5_VABI libSceNKWebKitLegacyUnknown_2m3K29qJSuM_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("2m3K29qJSuM", libSceNKWebKitLegacyUnknown_2m3K29qJSuM_nid_no_patch); -int APS5_VABI _ZN7WebCore9FrameView11removeChildERNS_6WidgetE() { +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__); +} + +int APS5_VABI _ZN9Inspector21InjectedScriptManagerdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_8Timeline13TimelineEventEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC6JSLock12DropAllLocksC2ERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF15BinarySemaphore6signalEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal11isUnderTestEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSDOMWindowBaseD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent24continueUntilNextRunLoopERN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings27setLoadsImagesAutomaticallyEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPreferencesGetApplicationChromeModeEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLInputElementC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorConsoleAgent5resetEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Node16addEventListenerERKN3WTF10AtomStringEONS1_3RefINS_13EventListenerENS1_13DumbPtrTraitsIS6_EEEERKNS_11EventTarget23AddEventListenerOptionsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer14paintRecursiveERKNS_25TextureMapperPaintOptionsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9GLContextnwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18HTMLMarqueeElement14setScrollDelayEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9Structure40addPropertyTransitionToExistingStructureEPS0_NS_12PropertyNameEjRi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9GLContextD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element26scrollIntoViewIfNotVisibleEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC18PropertyDescriptor12configurableEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC30int52AwareSpeculationFromValueENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InjectedScriptHost7subtypeEPN3JSC14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13HTTPHeaderMap3addERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF3URL10protocolIsEPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocalC2EPNS_19InspectorControllerEPNS_4PageESt10unique_ptrINS0_8SettingsESt14default_deleteIS6_EE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23ScaleTransformOperation5blendEPKNS_18TransformOperationEdb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14XMLHttpRequestD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC20TypedArrayControllerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14StaticNodeListnaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF21RefCountedLeakCounter16suppressMessagesEPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26LayerTreeBackendDispatcherD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC49throwConstructorCannotBeCalledAsFunctionTypeErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeEPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKNotificationManagerProviderDidUpdateNotificationPolicy() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore29isCharacterSmartReplaceExemptEib() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26Matrix3DTransformOperationC2ERKNS_20TransformationMatrixE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer9userAgentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document7fgColorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal23stopProfilingJavaScriptEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWheelEventMake() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11WindowProxy6windowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageLoadFile() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13JSSetIterator14finishCreationERNS_2VMEPNS_5JSSetENS_13IterationKindE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC21MarkedJSValueRefArrayC1EP15OpaqueJSContextj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl15openAndLockFileERKNS_6StringENS0_12FileOpenModeENS_9OptionSetINS0_12FileLockModeEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Page14renderTreeSizeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22HeapFrontendDispatcher13trackingStartEdRKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSDOMWindow9setOpenerERN3JSC14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17NowPlayingManagernaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetProcessModel() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15InspectorTargetD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor16pasteAsPlainTextENS0_20FromMenuOrKeyBindingE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Quirks47shouldAvoidScrollingWhenFocusedContentIsVisibleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11DisplayList10DrawGlyphsD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient29generatedMIMETypeForURLSchemeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF6Thread5yieldEv() { + 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 _ZN7WebCore20SVGPathStringBuilderC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11DisplayList10StrokePathD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17PageConfigurationD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12DOMTokenList6toggleERKN3WTF10AtomStringENS1_8OptionalIbEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap20edenActivityCallbackEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Editor8canPasteEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15DatabaseManager9singletonEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer18setFixedToViewportEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleBackForwardListGetForwardListCount() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28collectVaryingRequestHeadersEPNS_21NetworkStorageSessionERKNS_15ResourceRequestERKNS_16ResourceResponseE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19approximateAsRegionERKNS_11RoundedRectEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11HistoryItem8formDataEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9URLParser23maybeCanonicalizeSchemeERKNS_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF21MemoryPressureHandler15setProcessStateENS_18WebsamProcessStateE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn16_N9Inspector21InspectorConsoleAgent6enableERN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27TranslateTransformOperationC1ERKNS_6LengthES3_S3_NS_18TransformOperation13OperationTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13StringBuilder12appendNumberEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient35dispatchDidClearWindowObjectInWorldERNS_15DOMWrapperWorldE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKDownloadCancel() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14SecurityOrigin20isSameSchemeHostPortERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MessagePort5derefEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17MouseRelatedEvent1yEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC18PropertyDescriptor6setterEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetDownloadClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector23CanvasBackendDispatcher6createERNS_17BackendDispatcherEPNS_30CanvasBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15DeferredPromise12callFunctionERN3JSC14JSGlobalObjectENS0_11ResolveModeENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21PlatformKeyboardEvent24disambiguateKeyDownEventENS_13PlatformEvent4TypeEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9JSElementD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InspectorAgentC2ERNS_12AgentContextE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer15setBoundsOriginERKNS_10FloatPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreHasAppBoundSession() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ResourceHandleClientD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element27dispatchMouseForceWillBeginEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21CSSFrontendDispatchernaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14DocumentLoader12mainResourceEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document5closeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21markerTextForListItemEPNS_7ElementE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer13addVideoTrackERNS_17VideoTrackPrivateE() { + 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__); +} + +int APS5_VABI _ZNK7WebCore11CryptoKeyEC9exportRawEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22RemoteInspectionTargetD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent20setPauseOnAssertionsERN3WTF6StringEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ResourceLoader5startEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore27TranslateTransformOperation5cloneEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageCanDelete() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKNotificationCopyDir() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry33shouldTreatURLSchemeAsCORSEnabledERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16MIMETypeRegistry12pdfMIMETypesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKUserContentExtensionStoreRemove() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgent6enableERN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31NetworkBackendDispatcherHandleraSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase17removeCredentialsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetCustomTextEncodingName() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager30stopAllMediaPlaybackForProcessEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23ApplicationCacheStorage16originsWithCacheEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn16_N9Inspector21InspectorRuntimeAgent8evaluateERN3WTF6StringERKS2_PS4_PKbS8_PKiS8_S8_S8_S8_RNS1_6RefPtrINS_8Protocol7Runtime12RemoteObjectENS1_13DumbPtrTraitsISE_EEEERNS1_8OptionalIbEERNSJ_IiEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore27TranslateTransformOperationeqERKNS_18TransformOperationE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9FrameView24forceLayoutForPaginationERKNS_9FloatSizeES3_fNS_19AdjustViewSizeOrNotE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11DisplayList11ClearShadowD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient35dispatchDidChangeLocationWithinPageEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Widget25convertFromContainingViewERKNS_8IntPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HTTPHeaderMap12isolatedCopyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22DefaultFilterOperationD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page15setFooterHeightEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8JSDOMURL9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21ISOTrackEncryptionBoxC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformTimeRangesnaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9Integrity22auditCellMinimallySlowERNS_2VMEPNS_6JSCellE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24TargetFrontendDispatchernwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLImageElement13naturalHeightEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC10LinkBuffer8linkCodeERNS_14MacroAssemblerENS_20JITCompilationEffortE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKNotificationPermissionRequestAllow() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9FrameView11removeChildERNS_6WidgetE() { + NotImplemented_nid_no_patch(__func__); +} + +} + +extern "C" { + +int APS5_VABI JSContextCreateBacktrace() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI JSRemoteInspectorDisableAutoStart() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI JSRemoteInspectorServerStart() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI JSRemoteInspectorSetLogToSystemConsole() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI JSRemoteInspectorSetParentProcessInformation() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI JSRemoteInspectorStart() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI JSRunLoop() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI JSSetOptions() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKAXObjectButtonState() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKAXObjectCopyDescription() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKAXObjectCopyHelpText() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKAXObjectCopyTitle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKAXObjectCopyURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKAXObjectFrame() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKAXObjectPage() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKAXObjectRole() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKAccessibilityCanUseSecondaryAXThread() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKAccessibilityEnableEnhancedAccessibility() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKAccessibilityEnhancedAccessibilityEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKAccessibilityFocusedObject() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKAccessibilityRootObject() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKAddMockMediaDevice() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKApplicationCacheManagerDeleteAllEntries() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKApplicationCacheManagerDeleteEntriesForOrigin() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKApplicationCacheManagerGetApplicationCacheOrigins() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKAuthenticationChallengCopyRequestURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKAuthenticationChallengeGetDecisionListener() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKAuthenticationChallengeGetPreviousFailureCount() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKAuthenticationChallengeGetProposedCredential() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKAuthenticationChallengeGetProtectionSpace() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKAuthenticationChallengeIsForMainResource() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKAuthenticationChallengeIsInMainFrame() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKAuthenticationDecisionListenerCancel() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKAuthenticationDecisionListenerRejectProtectionSpaceAndContinue() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKAuthenticationDecisionListenerUseCredential() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBackForwardListClear() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBackForwardListCopyBackListWithLimit() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBackForwardListCopyForwardListWithLimit() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBackForwardListGetBackItem() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBackForwardListGetBackListCount() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBackForwardListGetCurrentItem() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBackForwardListGetForwardItem() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBackForwardListGetForwardListCount() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBackForwardListGetItemAtIndex() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBackForwardListItemCopyOriginalURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBackForwardListItemCopyTitle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBackForwardListItemCopyURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleAddOriginAccessAllowListEntry() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleBackForwardListClear() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleBackForwardListCopyItemAtIndex() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleBackForwardListGetBackListCount() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleBackForwardListItemCopyChildren() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleBackForwardListItemCopyOriginalURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleBackForwardListItemCopyTarget() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleBackForwardListItemCopyTitle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleBackForwardListItemCopyURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleBackForwardListItemHasCachedPageExpired() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleBackForwardListItemIsInBackForwardCache() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleBackForwardListItemIsSame() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleBackForwardListItemIsTargetItem() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleClearHistoryForTesting() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleClearResourceLoadStatistics() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleCreateWKDataFromUInt8Array() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleDOMWindowExtensionCreate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleDOMWindowExtensionGetFrame() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleDOMWindowExtensionGetScriptWorld() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleExtendClassesForParameterCoder() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFileHandleCreateWithPath() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameAllowsFollowingLink() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameCallShouldCloseOnWebView() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameClearOpener() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameContainsAnyFormControls() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameContainsAnyFormElements() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameCopyChildFrames() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameCopyCounterValue() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameCopyInnerText() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameCopyLayerTreeAsText() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameCopyMIMETypeForResourceWithURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameCopyName() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameCopyProvisionalURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameCopySecurityOrigin() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameCopySuggestedFilenameForResourceWithURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameCopyURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameCopyWebArchiveFilteringSubframes() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameCopyWebArchive() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameCreateFrameHandle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameCreateHitTestResult() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameFocus() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameForJavaScriptContext() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameGetContentBounds() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameGetDocumentBackgroundColor() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameGetFrameLoadState() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameGetJavaScriptContextForWorld() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameGetJavaScriptContext() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameGetJavaScriptWrapperForFileForWorld() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameGetJavaScriptWrapperForNodeForWorld() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameGetJavaScriptWrapperForRangeForWorld() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameGetPage() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameGetParentFrame() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameGetPendingUnloadCount() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameGetScrollOffset() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameGetVisibleContentBounds() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameGetVisibleContentBoundsExcludingScrollbars() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameHandlesPageScaleGesture() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameHasHorizontalScrollbar() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameHasVerticalScrollbar() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameIsMainFrame() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameSetAccessibleName() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameSetTextDirection() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleFrameStopLoading() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleGarbageCollectJavaScriptObjectsOnAlternateThreadForDebugging() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleGarbageCollectJavaScriptObjects() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleGetApplicationConnection() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleGetJavaScriptObjectsCount() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleHitTestResultCopyAbsoluteImageURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleHitTestResultCopyAbsoluteLinkURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleHitTestResultCopyAbsoluteMediaURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleHitTestResultCopyAbsolutePDFURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleHitTestResultCopyImage() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleHitTestResultCopyLinkLabel() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleHitTestResultCopyLinkSuggestedFilename() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleHitTestResultCopyLinkTitle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleHitTestResultCopyNodeHandle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleHitTestResultCopyURLElementHandle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleHitTestResultGetFrame() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleHitTestResultGetImageRect() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleHitTestResultGetIsSelected() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleHitTestResultGetMediaType() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleHitTestResultGetTargetFrame() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleHitTestResultIsDownloadableMedia() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleHitTestResultMediaHasAudio() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleHitTestResultMediaIsInFullscreen() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleInspectorClose() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleInspectorEvaluateScriptForTest() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleInspectorSetPageProfilingEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleInspectorShow() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleIsPageBoxVisible() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleIsProcessingUserGesture() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNavigationActionCopyDownloadAttribute() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNavigationActionCopyFormElement() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNavigationActionCopyHitTestResult() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNavigationActionGetEventModifiers() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNavigationActionGetEventMouseButton() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNavigationActionGetNavigationType() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNavigationActionGetShouldOpenExternalURLs() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNavigationActionGetShouldTryAppLinks() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleCopyDocumentFrame() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleCopyDocument() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleCopyHTMLFrameElementContentFrame() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleCopyHTMLIFrameElementContentFrame() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleCopyHTMLTableCellElementCellAbove() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleCopySnapshotWithOptions() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleCopyVisibleRange() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleCreate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleGetElementBounds() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleGetHTMLInputElementAutoFillAvailable() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleGetHTMLInputElementAutoFillButtonBounds() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleGetHTMLInputElementAutoFillButtonEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleGetHTMLInputElementAutoFillButtonType() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleGetHTMLInputElementAutoFilled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleGetHTMLInputElementAutofilled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleGetHTMLInputElementLastAutoFillButtonType() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleGetHTMLInputElementLastChangeWasUserEdit() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleGetHTMLTextAreaElementLastChangeWasUserEdit() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleGetRenderRect() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleSetHTMLInputElementAutoFillAvailable() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleSetHTMLInputElementAutoFillButtonEnabledWithButtonType() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleSetHTMLInputElementAutoFillButtonEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleSetHTMLInputElementAutoFilledAndViewable() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleSetHTMLInputElementAutoFilled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleSetHTMLInputElementAutofilled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleSetHTMLInputElementSpellcheckEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNodeHandleSetHTMLInputElementValueForUser() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleNumberOfPages() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageAddUserScript() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageAddUserScriptInWorld() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageAddUserStyleSheet() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageCallAfterTasksAndTimers() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageCanHandleRequest() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageCanShowMIMEType() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageClearApplicationCacheForOrigin() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageClearApplicationCache() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageClearMainFrameName() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageClickMenuItem() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageClose() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageConfirmComposition() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageConfirmCompositionWithText() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageCopyContextMenuAtPointInWindow() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageCopyContextMenuItems() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageCopyGroupIdentifier() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageCopyOriginsWithApplicationCache() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageCopyRenderLayerTree() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageCopyRenderTree() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageCopyRenderTreeExternalRepresentationForPrinting() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageCopyRenderTreeExternalRepresentation() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageCopyTrackedRepaintRects() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageCreateScaledSnapshotInDocumentCoordinates() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageCreateSnapshotInDocumentCoordinates() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageCreateSnapshotInViewCoordinates() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageCreateSnapshotWithOptions() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageDidEnterFullScreen() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageDidExitFullScreen() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageDumpHistoryForTesting() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageExecuteEditingCommand() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageExtendIncrementalRenderingSuppression() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageFindStringMatches() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageFindString() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageFlushPendingEditorStateUpdate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageForceRepaint() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageGetAppCacheUsageForOrigin() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageGetBackForwardList() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageGetBackingScaleFactor() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageGetInspector() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageGetMainFrame() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageGetPageZoomFactor() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageGetRenderTreeSize() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageGetTextZoomFactor() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageHasComposition() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageHasLocalDataForURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageInsertNewlineInQuotedContent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageInstallPageOverlayWithAnimation() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageInstallPageOverlay() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageIsControlledByAutomation() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageIsEditingCommandEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageIsSuspended() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageIsTrackingRepaints() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageIsUsingDarkAppearance() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageIsUsingEphemeralSession() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageListenForLayoutMilestones() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageNumberForElementById() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageOverlayClear() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageOverlayCreate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageOverlayFractionFadedIn() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageOverlaySetAccessibilityClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageOverlaySetNeedsDisplay() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePagePostMessageIgnoringFullySynchronousMode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePagePostMessage() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePagePostSynchronousMessageForTesting() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageRegisterScrollOperationCompletionCallback() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageRemoveAllUserContent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageReplaceStringMatches() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageResetApplicationCacheOriginQuota() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageResetTrackedRepaints() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSetAppCacheMaximumSize() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSetApplicationCacheOriginQuota() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSetBottomOverhangImage() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSetComposition() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSetContextMenuClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSetDefersLoading() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSetEditorClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSetEventThrottlingBehaviorOverride() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSetFooterBanner() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSetFormClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSetFullScreenClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSetHeaderBanner() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSetPageLoaderClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSetPageZoomFactor() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSetPaintedObjectsCounterThreshold() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSetPolicyClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSetResourceLoadClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSetScaleAtOrigin() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSetTextZoomFactor() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSetTopOverhangImage() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSetTracksRepaints() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSetUIClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSetUseDarkAppearance() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSimulateMouseDown() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSimulateMouseMotion() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSimulateMouseUp() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageSizeAndMarginsInPixels() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageStartMonitoringScrollOperations() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageStopExtendingIncrementalRenderingSuppression() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageStopLoading() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageUninstallPageOverlay() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageUninstallPageOverlayWithAnimation() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageWillEnterFullScreen() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePageWillExitFullScreen() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePostMessage() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundlePostSynchronousMessage() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleRangeHandleCopySnapshotWithOptions() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleRangeHandleCreate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleRangeHandleGetBoundingRectInWindowCoordinates() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleReleaseMemory() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleRemoveAllWebNotificationPermissions() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleRemoveOriginAccessAllowListEntry() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleReportException() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleResetOriginAccessAllowLists() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleResourceLoadStatisticsNotifyObserver() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleScriptWorldClearWrappers() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleScriptWorldCopyName() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleScriptWorldCreateWorld() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleScriptWorldDisableOverrideBuiltinsBehavior() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleScriptWorldMakeAllShadowRootsOpen() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleScriptWorldNormalWorld() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleSetClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleSetDatabaseQuota() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleSetServiceWorkerProxyCreationCallback() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleSetTabKeyCyclesThroughElements() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKBundleSetWebNotificationPermission() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKClearMockMediaDevices() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKConnectionPostMessage() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKConnectionSetConnectionClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextAddSupportedPlugin() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextAddVisitedLink() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextAllowSpecificHTTPSCertificateForHost() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextClearCurrentModifierStateForTesting() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextClearSupportedPlugins() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextClearVisitedLinks() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextCopyPlugInAutoStartOriginHashes() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextCreate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextCreateWithConfiguration() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextCreateWithInjectedBundlePath() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextDisableProcessTermination() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextDownloadURLRequest() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextEnableProcessTermination() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextGarbageCollectJavaScriptObjects() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextGetAccessibilityEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextGetApplicationCacheManager() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextGetCacheModel() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextGetGeolocationManager() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextGetGlobalStatistics() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextGetIconDatabase() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextGetKeyValueStorageManager() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextGetMaximumNumberOfProcesses() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextGetNotificationManager() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextGetResourceCacheManager() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextGetStatisticsWithOptions() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextGetStatistics() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextGetUsesSingleWebProcess() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextGetWebsiteDataStore() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextJavaScriptConfigurationFileEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextMenuCopySubmenuItems() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextMenuItemCopyTitle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextMenuItemCreateAsAction() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextMenuItemCreateAsCheckableAction() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextMenuItemCreateAsSubmenu() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextMenuItemGetChecked() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextMenuItemGetEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextMenuItemGetTag() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextMenuItemGetType() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextMenuItemGetUserData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextMenuItemSeparatorItem() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextMenuItemSetUserData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextPostMessageToInjectedBundle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextPreconnectToServer() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextRefreshPlugIns() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextRegisterURLSchemeAsBypassingContentSecurityPolicy() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextRegisterURLSchemeAsCachePartitioned() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextRegisterURLSchemeAsCanDisplayOnlyIfCanRequest() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextRegisterURLSchemeAsEmptyDocument() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextRegisterURLSchemeAsSecure() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextResumeDownload() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetAccessibilityEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetAdditionalPluginsDirectory() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetAlwaysUsesComplexTextCodePath() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetCacheModel() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetCanHandleHTTPSServerTrustEvaluation() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetConnectionClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetCustomWebContentServiceBundleIdentifier() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetDiskCacheSpeculativeValidationEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetDomainRelaxationForbiddenForURLScheme() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetFontAllowList() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetHTTPPipeliningEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetHistoryClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetIconDatabasePath() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetInitializationUserDataForInjectedBundle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetInjectedBundleClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetInvalidMessageFunction() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetJavaScriptConfigurationFileEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetJavaScriptGarbageCollectorTimerEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetMaximumNumberOfProcesses() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetMemoryCacheDisabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetPlugInAutoStartOriginHashes() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetPlugInAutoStartOriginsFilteringOutEntriesAddedAfterTime() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetPlugInAutoStartOrigins() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetPrewarmsProcessesAutomatically() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetPrimaryWebsiteDataStore() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetUseSeparateServiceWorkerProcess() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetUsesNetworkProcess() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextSetUsesSingleWebProcess() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextStartMemorySampler() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextStopMemorySampler() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextTerminateServiceWorkers() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKContextWarmInitialProcess() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKCookieManagerDeleteAllCookies() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKCookieManagerDeleteAllCookiesModifiedAfterDate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKCookieManagerDeleteCookiesForHostname() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKCookieManagerGetHTTPCookieAcceptPolicy() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKCookieManagerGetHostnamesWithCookies() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKCookieManagerSetClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKCookieManagerSetHTTPCookieAcceptPolicy() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKCookieManagerStartObservingCookieChanges() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKCookieManagerStopObservingCookieChanges() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKDownloadCopyRequest() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKDownloadGetOriginatingPage() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKDownloadGetWasUserInitiated() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFormSubmissionListenerContinue() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFrameCanProvideSource() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFrameCanShowMIMEType() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFrameCopyMIMEType() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFrameCopyProvisionalURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFrameCopyTitle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFrameCopyURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFrameCopyUnreachableURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFrameCreateFrameHandle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFrameCreateFrameInfo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFrameGetCertificateInfo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFrameGetFrameLoadState() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFrameGetMainResourceData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFrameGetPage() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFrameGetResourceData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFrameGetWebArchive() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFrameHandleGetFrameID() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFrameInfoCreateFrameHandleRef() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFrameIsDisplayingMarkupDocument() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFrameIsDisplayingStandaloneImageDocument() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFrameIsFrameSet() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFrameIsMainFrame() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFramePolicyListenerDownload() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFramePolicyListenerIgnore() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFramePolicyListenerUseInNewProcess() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFramePolicyListenerUseInNewProcessWithPolicies() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFramePolicyListenerUse() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFramePolicyListenerUseWithPolicies() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKFrameStopLoading() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKGeolocationManagerProviderDidChangePosition() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKGeolocationManagerProviderDidFailToDeterminePosition() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKGeolocationManagerProviderDidFailToDeterminePositionWithErrorMessage() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKGeolocationManagerSetProvider() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKGeolocationPermissionRequestAllow() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKGeolocationPermissionRequestDeny() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKHTTPCookieStoreDeleteAllCookies() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKHTTPCookieStoreSetCookieForHostname() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKHTTPCookieStoreSetHTTPCookieAcceptPolicy() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKHitTestResultCopyAbsoluteImageURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKHitTestResultCopyAbsoluteLinkURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKHitTestResultCopyAbsoluteMediaURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKHitTestResultCopyAbsolutePDFURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKHitTestResultCopyLinkLabel() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKHitTestResultCopyLinkTitle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKHitTestResultCopyLookupText() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKHitTestResultGetElementBoundingBox() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKHitTestResultIsContentEditable() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKIconDatabaseCheckIntegrityBeforeOpening() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKIconDatabaseClose() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKIconDatabaseCopyIconDataForPageURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKIconDatabaseCopyIconURLForPageURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKIconDatabaseEnableDatabaseCleanup() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKIconDatabaseReleaseIconForURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKIconDatabaseRemoveAllIcons() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKIconDatabaseRetainIconForURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKIconDatabaseSetIconDataForIconURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKIconDatabaseSetIconDatabaseClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKIconDatabaseSetIconURLForPageURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKImageCreate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKImageCreateCairoSurface() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKImageCreateFromCairoSurface() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKImageGetSize() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKImeEventGetInputLanguage() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKImeEventMake() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKImeEventRelease() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKInspectorAttach() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKInspectorClose() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKInspectorConnect() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKInspectorDetach() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKInspectorGetPage() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKInspectorHide() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKInspectorIsAttached() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKInspectorIsConnected() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKInspectorIsElementSelectionActive() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKInspectorIsFront() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKInspectorIsProfilingPage() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKInspectorIsVisible() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKInspectorShowConsole() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKInspectorShowMainResourceForFrame() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKInspectorShow() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKInspectorShowResources() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKInspectorToggleElementSelection() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKInspectorTogglePageProfiling() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKKeyValueStorageManagerDeleteAllEntries() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKKeyValueStorageManagerDeleteEntriesForOrigin() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKKeyValueStorageManagerGetCreationTimeKey() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKKeyValueStorageManagerGetKeyValueStorageOrigins() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKKeyValueStorageManagerGetModificationTimeKey() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKKeyValueStorageManagerGetOriginKey() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKKeyValueStorageManagerGetStorageDetailsByOrigin() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKKeyboardEventMake() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKMessageListenerSendReply() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKMouseEventMake() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKNavigationActionShouldPerformDownload() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKNavigationDataCopyNavigationDestinationURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKNavigationDataCopyOriginalRequest() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKNavigationDataCopyTitle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKNavigationDataCopyURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKNavigationResponseCanShowMIMEType() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKNotificationCopyBody() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKNotificationCopyIconURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKNotificationCopyLang() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKNotificationCopyTag() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKNotificationCopyTitle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKNotificationGetID() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKNotificationGetSecurityOrigin() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKNotificationManagerProviderDidClickNotification() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKNotificationManagerProviderDidCloseNotifications() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKNotificationManagerProviderDidRemoveNotificationPolicies() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKNotificationManagerProviderDidShowNotification() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKNotificationManagerSetProvider() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKNotificationPermissionRequestDeny() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKOpenPanelParametersCopyAcceptedFileExtensions() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKOpenPanelParametersCopyAcceptedMIMETypes() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKOpenPanelParametersCopyAllowedMIMETypes() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKOpenPanelParametersCopyCapture() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKOpenPanelParametersCopySelectedFileNames() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKOpenPanelParametersGetAllowsDirectories() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKOpenPanelParametersGetAllowsMultipleFiles() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKOpenPanelParametersGetMediaCaptureType() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKOpenPanelResultListenerCancel() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKOpenPanelResultListenerChooseFiles() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageAreScrollbarAnimationsSuppressed() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageBackgroundExtendsBeyondPage() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageBeginPrinting() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageBlurFocusedNode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageCallAfterNextPresentationUpdate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageCanGoBack() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageCanGoForward() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageCenterSelectionInVisibleArea() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageClearLoadedSubresourceDomains() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageClearSelection() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageClearUserMediaState() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageClearWheelEventTestMonitor() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageClose() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageComputePagesForPrinting() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageCopyActiveURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageCopyApplicationNameForUserAgent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageCopyCommittedURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageCopyCustomTextEncodingName() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageCopyCustomUserAgent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageCopyPageConfiguration() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageCopyPendingAPIRequestURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageCopyProvisionalURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageCopyRelatedPages() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageCopySessionState() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageCopyStandardUserAgentWithApplicationName() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageCopyTitle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageCopyUserAgent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageCountStringMatches() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageDidAllowPointerLock() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageDidDenyPointerLock() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageEndPrinting() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageExecuteCommand() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageFindString() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageFindStringMatches() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageFixedLayoutSize() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageForceRepaint() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetAddsVisitedLinks() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetAllowsRemoteInspection() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetBackForwardList() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetBackingScaleFactor() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetBytecodeProfile() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetContentsAsMHTMLData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetContentsAsString() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetContext() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetEstimatedProgress() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetFocusedFrame() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetFrameSetLargestFrame() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetGapBetweenPages() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetImageForFindMatch() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetInspector() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetIsControlledByAutomation() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetMainFrame() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetMediaCaptureEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetMediaState() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetPageCount() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetPageGroup() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetPageLength() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetPageZoomFactor() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetPaginationBehavesLikeColumns() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetPaginationLineGridEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetPaginationMode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetProcessIdentifier() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetRenderTreeSize() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetSamplingProfilerOutput() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetScaleFactor() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetScrollPinningBehavior() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetSelectionAsWebArchiveData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetSessionBackForwardListItemValueType() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetSessionHistoryURLValueType() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetSourceForFrame() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGetTextZoomFactor() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGoBack() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGoForward() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageGoToBackForwardListItem() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageHandleImeEvent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageHandleKeyboardEvent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageHandleMouseEvent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageHandleWheelEvent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageHasHorizontalScrollbar() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageHasSelectedRange() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageHasVerticalScrollbar() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageHideFindUI() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageHorizontalRubberBandingIsEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageIsClosed() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageIsContentEditable() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageIsMockRealtimeMediaSourceCenterEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageIsPinnedToBottomSide() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageIsPinnedToLeftSide() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageIsPinnedToRightSide() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageIsPinnedToTopSide() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageIsPlayingAudio() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageListenForLayoutMilestones() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageLoadAlternateHTMLStringWithUserData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageLoadAlternateHTMLString() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageLoadData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageLoadDataWithUserData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageLoadFileWithUserData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageLoadHTMLString() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageLoadHTMLStringWithUserData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageLoadPlainTextString() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageLoadPlainTextStringWithUserData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageLoadURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageLoadURLRequest() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageLoadURLRequestWithUserData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageLoadURLWithShouldOpenExternalURLsPolicy() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageLoadURLWithUserData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageLoadWebArchiveData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageLoadWebArchiveDataWithUserData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageLoadedSubresourceDomains() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageLookUpFrameFromHandle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPagePostMessageToInjectedBundle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageReloadExpiredOnly() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageReloadFromOrigin() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageReload() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageReloadWithoutContentBlockers() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageRenderTreeExternalRepresentation() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageRequestStorageAccessConfirmResultListenerCall() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageRestoreFromSessionState() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageRestoreFromSessionStateWithoutNavigation() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageResumeActiveDOMObjectsAndAnimations() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageRubberBandsAtBottom() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageRubberBandsAtLeft() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageRubberBandsAtRight() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageRubberBandsAtTop() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageRunBeforeUnloadConfirmPanelResultListenerCall() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageRunJavaScriptAlertResultListenerCall() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageRunJavaScriptConfirmResultListenerCall() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageRunJavaScriptInMainFrame() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageRunJavaScriptPromptResultListenerCall() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSelectContextMenuItem() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSelectFindMatch() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetAddsVisitedLinks() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetAllowsRemoteInspection() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetApplicationNameForUserAgent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetBackgroundExtendsBeyondPage() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetCaretVisible() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetControlledByAutomation() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetCustomBackingScaleFactor() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetCustomUserAgent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetEnableHorizontalRubberBanding() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetEnableVerticalRubberBanding() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetFixedLayoutSize() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetGapBetweenPages() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetIgnoresViewportScaleLimits() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetMaintainsInactiveSelection() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetMayStartMediaWhenInWindow() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetMediaCaptureEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetMediaVolume() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetMockCameraOrientation() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetMuted() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetPageAndTextZoomFactors() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetPageContextMenuClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetPageDiagnosticLoggingClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetPageFindClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetPageFindMatchesClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetPageFormClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetPageInjectedBundleClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetPageLength() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetPageLoaderClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetPageNavigationClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetPagePolicyClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetPageStateClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetPageUIClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetPageZoomFactor() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetPaginationBehavesLikeColumns() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetPaginationLineGridEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetPaginationMode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetRubberBandsAtBottom() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetRubberBandsAtLeft() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetRubberBandsAtRight() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetRubberBandsAtTop() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetScaleFactor() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetScrollPinningBehavior() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetSuppressScrollbarAnimations() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetTextZoomFactor() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSetUseFixedLayout() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageStopLoading() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSupportsTextEncoding() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSupportsTextZoom() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageSuspendActiveDOMObjectsAndAnimations() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageTerminate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageTryClose() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageTryRestoreScrollPosition() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageUpdateWebsitePolicies() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageUseFixedLayout() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageValidateCommand() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageVerticalRubberBandingIsEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPageWillHandleHorizontalScrollEvents() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPlugInInformationReplacementObscuredKey() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPluginInformationBundleIdentifierKey() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPluginInformationBundleShortVersionKey() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPluginInformationBundleVersionKey() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPluginInformationDefaultLoadPolicyKey() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPluginInformationDisplayNameKey() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPluginInformationFrameURLKey() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPluginInformationHasSandboxProfileKey() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPluginInformationMIMETypeKey() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPluginInformationPageURLKey() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPluginInformationPathKey() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPluginInformationPluginURLKey() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPluginInformationPluginspageAttributeURLKey() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPluginInformationUpdatePastLastBlockedVersionIsKnownAvailableKey() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPopupMenuItemCopyText() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPopupMenuItemIsEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPopupMenuItemIsItem() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPopupMenuItemIsSeparator() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPreferencesGetAccelerated2DCanvasEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPreferencesGetQTKitEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPreferencesGetTypeID() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPreferencesSetAccelerated2DCanvasEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKPreferencesSetQTKitEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKProtectionSpaceCopyCertificateInfo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKProtectionSpaceCopyHost() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKProtectionSpaceCopyRealm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKProtectionSpaceGetAuthenticationScheme() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKProtectionSpaceGetIsProxy() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKProtectionSpaceGetPort() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKProtectionSpaceGetReceivesCredentialSecurely() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKProtectionSpaceGetServerType() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRegistrableDomainCreate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRemoveMockMediaDevice() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRenderLayerCopyElementID() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRenderLayerCopyElementTagName() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRenderLayerCopyRendererName() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRenderLayerGetAbsoluteBounds() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRenderLayerGetBackingStoreMemoryEstimate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRenderLayerGetCompositingLayerType() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRenderLayerGetElementClassNames() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRenderLayerGetFrameContentsLayer() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRenderLayerGetNegativeZOrderList() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRenderLayerGetNormalFlowList() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRenderLayerGetPositiveZOrderList() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRenderLayerGetRenderer() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRenderLayerIsClipped() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRenderLayerIsClipping() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRenderLayerIsReflection() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRenderObjectCopyElementID() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRenderObjectCopyElementTagName() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRenderObjectCopyName() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRenderObjectCopyTextSnippet() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRenderObjectGetAbsolutePosition() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRenderObjectGetChildren() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRenderObjectGetElementClassNames() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRenderObjectGetFrameRect() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRenderObjectGetTextLength() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKResetMockMediaDevices() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKResourceCacheManagerClearCacheForAllOrigins() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKResourceCacheManagerClearCacheForOrigin() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKResourceCacheManagerGetCacheOrigins() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRunLoopCallOnMainThread() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRunLoopInitializeMain() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRunLoopRunMain() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKRunLoopStopMain() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKSendDisplayConfigurationChangedMessageForTesting() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKSerializedScriptValueCreate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKSerializedScriptValueDeserialize() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKSessionStateCopyData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKSessionStateCreateFromData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKTextCheckerSetTestingMode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKURLCopyHostName() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKURLCopyLastPathComponent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKURLCopyPath() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKURLCopyScheme() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKURLCreateWithBaseURL() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKURLIsEqual() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKUserContentExtensionStoreCompile() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKUserContentExtensionStoreCreate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKUserContentExtensionStoreLookup() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKUserMediaPermissionCheckSetUserMediaAccessInfo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKUserMediaPermissionRequestAllow() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKUserMediaPermissionRequestAudioDeviceUIDs() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKUserMediaPermissionRequestDeny() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKUserMediaPermissionRequestVideoDeviceUIDs() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKViewAccessibilityFocusedObject() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKViewAccessibilityHitTest() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKViewAccessibilityRootObject() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKViewCreate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKViewDidEnterFullScreen() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKViewDidExitFullScreen() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKViewGetPage() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKViewGetPunchHoles() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKViewIsFullScreen() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKViewRequestExitFullScreen() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKViewSetActive() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKViewSetFocus() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKViewSetSize() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKViewSetViewAccessibilityClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKViewSetViewClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKViewSetViewPopupMenuClient() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKViewSetVisible() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKViewValueChangedForPopupMenu() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKViewWillEnterFullScreen() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKViewWillExitFullScreen() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreClearAllDeviceOrientationPermissions() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreClearAppBoundSession() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreClearBundleIdentifierInNetworkProcess() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreCreateNonPersistentDataStore() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreCreateWithConfiguration() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreDisableNetworkProxySettings() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreDoesStatisticsDomainIDExistInDatabase() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreDumpResourceLoadStatistics() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreEnableCustomNetworkProxySettings() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreEnableDefaultNetworkProxySettings() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreGetAllStorageAccessEntries() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreGetDefaultDataStore() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreGetFetchCacheOrigins() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreGetFetchCacheSizeForOrigin() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreGetHTTPCookieStore() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreGetResourceLoadStatisticsEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreIsStatisticsEphemeral() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreIsStatisticsGrandfathered() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreIsStatisticsHasHadUserInteraction() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreIsStatisticsOnlyInDatabaseOnce() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreIsStatisticsPrevalentResource() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreIsStatisticsRegisteredAsRedirectingTo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreIsStatisticsRegisteredAsSubFrameUnder() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreIsStatisticsRegisteredAsSubresourceUnder() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreIsStatisticsVeryPrevalentResource() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreReinitializeAppBoundDomains() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreRemoveAllFetchCaches() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreRemoveAllIndexedDatabases() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreRemoveAllServiceWorkerRegistrations() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreRemoveFetchCacheForOrigin() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreRemoveITPDataForDomain() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreRemoveLocalStorage() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreResetQuota() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetAdditionalRootCA() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetAppBoundDomainsForTesting() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetCacheModelSynchronouslyForTesting() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetClientCertificate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetPerOriginStorageQuota() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetResourceLoadStatisticsDebugModeWithCompletionHandler() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetResourceLoadStatisticsDebugMode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetResourceLoadStatisticsEnabled() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetResourceLoadStatisticsFirstPartyHostCNAMEDomainForTesting() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetResourceLoadStatisticsFirstPartyWebsiteDataRemovalModeForTesting() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetResourceLoadStatisticsPrevalentResourceForDebugMode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetResourceLoadStatisticsShouldBlockThirdPartyCookiesForTesting() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetResourceLoadStatisticsShouldDowngradeReferrerForTesting() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetResourceLoadStatisticsThirdPartyCNAMEDomainForTesting() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetResourceLoadStatisticsToSameSiteStrictCookiesForTesting() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetStatisticsCacheMaxAgeCap() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetStatisticsCrossSiteLoadWithLinkDecoration() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetStatisticsExpiredStatistic() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetStatisticsGrandfathered() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetStatisticsGrandfatheringTime() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetStatisticsHasHadUserInteraction() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetStatisticsIsRunningTest() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetStatisticsLastSeen() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetStatisticsMaxStatisticsEntries() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetStatisticsMergeStatistic() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetStatisticsMinimumTimeBetweenDataRecordsRemoval() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetStatisticsNotifyPagesWhenDataRecordsWereScanned() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetStatisticsPrevalentResource() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetStatisticsPruneEntriesDownTo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetStatisticsShouldClassifyResourcesBeforeDataRecordsRemoval() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetStatisticsSubframeUnderTopFrameOrigin() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetStatisticsSubresourceUnderTopFrameOrigin() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetStatisticsSubresourceUniqueRedirectFrom() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetStatisticsSubresourceUniqueRedirectTo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetStatisticsTimeToLiveUserInteraction() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetStatisticsTopFrameUniqueRedirectFrom() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetStatisticsTopFrameUniqueRedirectTo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreSetStatisticsVeryPrevalentResource() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreStatisticsClearInMemoryAndPersistentStoreModifiedSinceHours() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreStatisticsClearInMemoryAndPersistentStore() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreStatisticsClearThroughWebsiteDataRemoval() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreStatisticsDeleteCookiesForTesting() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreStatisticsHasIsolatedSession() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreStatisticsHasLocalStorage() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreStatisticsProcessStatisticsAndDataRecords() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreStatisticsResetToConsistentState() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreStatisticsUpdateCookieBlocking() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI WKWebsiteDataStoreUpdateBundleIdentifierInNetworkProcess() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN14OpaqueJSString9tryCreateEON3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN14OpaqueJSString9tryCreateERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC10ConfigFile14setProcessNameEPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC10ConfigFile20setParentProcessNameEPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC10ConfigFile5parseEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC10ConfigFileC1EPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC10ConfigFileC2EPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC10Identifier27checkCurrentAtomStringTableERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC10Identifier4fromERNS_2VMEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC10Identifier4fromERNS_2VMEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC10Identifier4fromERNS_2VMEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC10IsoCellSet33parallelNotEmptyMarkedBlockSourceEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC10JSCellLock10unlockSlowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC10JSCellLock8lockSlowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC10JSFunction11displayNameERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC10JSFunction21calculatedDisplayNameERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC10JSFunction4nameERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC10JSFunction6createERNS_2VMEPNS_18FunctionExecutableEPNS_7JSScopeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC10JSFunctionC1ERNS_2VMEPNS_16NativeExecutableEPNS_14JSGlobalObjectEPNS_9StructureE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC10JSFunctionC2ERNS_2VMEPNS_16NativeExecutableEPNS_14JSGlobalObjectEPNS_9StructureE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC10LinkBuffer31finalizeCodeWithDisassemblyImplEbPKcz() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC10LinkBuffer34finalizeCodeWithoutDisassemblyImplEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC10initializeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC10loadModuleEPNS_14JSGlobalObjectERKNS_10SourceCodeENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11ArrayBuffer10transferToERNS_2VMERNS_19ArrayBufferContentsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11ArrayBuffer27primitiveGigacageDestructorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11ArrayBuffer6createEONS_19ArrayBufferContentsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11ArrayBuffer6createERS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11ArrayBuffer9shareWithERNS_19ArrayBufferContentsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11ArrayBuffer9tryCreateERS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11FuzzerAgent13getPredictionEPNS_9CodeBlockERKNS_10CodeOriginEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11FuzzerAgentD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11FuzzerAgentD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11FuzzerAgentD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11IsoSubspaceD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11IsoSubspaceD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11IsoSubspaceD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11JSWithScope6createERNS_2VMEPNS_14JSGlobalObjectEPNS_7JSScopeEPNS_8JSObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11MarkedBlock13areMarksStaleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11MarkedBlock15aboutToMarkSlowEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11MarkedBlock6Handle13areMarksStaleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11ProxyObject14finishCreationERNS_2VMEPNS_14JSGlobalObjectENS_7JSValueES5_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11ProxyObject18structureForTargetEPNS_14JSGlobalObjectENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11ProxyObjectC2ERNS_2VMEPNS_9StructureE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11SlotVisitor10appendSlowEPNS_6JSCellEN3WTF10DependencyE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11SlotVisitor16appendHiddenSlowEPNS_6JSCellEN3WTF10DependencyE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11SymbolTableC1ERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11SymbolTableC2ERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11VMInspector11isValidCellEPNS_4HeapEPNS_6JSCellE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11VMInspector13dumpCallFrameEPNS_2VMEPNS_9CallFrameEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11VMInspector13dumpRegistersEPNS_9CallFrameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11VMInspector14dumpCellMemoryEPNS_6JSCellE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11VMInspector16isValidCodeBlockEPNS_2VMEPNS_9CodeBlockE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11VMInspector17codeBlockForFrameEPNS_2VMEPNS_9CallFrameEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11VMInspector18dumpSubspaceHashesEPNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11VMInspector22dumpCellMemoryToStreamEPNS_6JSCellERN3WTF11PrintStreamE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11VMInspector23currentThreadOwnsJSLockEPNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11VMInspector2gcEPNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11VMInspector6edenGCEPNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11VMInspector8isInHeapEPNS_4HeapEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11VMInspector9dumpStackEPNS_2VMEPNS_9CallFrameEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11checkSyntaxEPNS_14JSGlobalObjectERKNS_10SourceCodeEPNS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11checkSyntaxERNS_2VMERKNS_10SourceCodeERNS_11ParserErrorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11createErrorEPNS_14JSGlobalObjectENS_22ErrorTypeWithExtensionERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11createErrorEPNS_14JSGlobalObjectENS_9ErrorTypeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC11createErrorEPNS_14JSGlobalObjectERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12BigIntObject14finishCreationERNS_2VMENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12BigIntObject6createERNS_2VMEPNS_14JSGlobalObjectENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12BigIntObjectC1ERNS_2VMEPNS_9StructureE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12BigIntObjectC2ERNS_2VMEPNS_9StructureE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12CachePayload16makeEmptyPayloadEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12CachePayload17makeMallocPayloadEON3WTF9MallocPtrIhNS1_10FastMallocEEEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12CachePayload17makeMappedPayloadEON3WTF14FileSystemImpl14MappedFileDataE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12CachePayloadC1EOS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12CachePayloadC2EOS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12CachePayloadD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12DateInstance14finishCreationERNS_2VMEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12DateInstanceC1ERNS_2VMEPNS_9StructureE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12DateInstanceC2ERNS_2VMEPNS_9StructureE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12GlobalJSLockC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12GlobalJSLockC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12GlobalJSLockD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12GlobalJSLockD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12HeapAnalyzerC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12HeapAnalyzerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12HeapAnalyzerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12HeapAnalyzerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12HeapAnalyzerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12HeapAnalyzeraSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12HeapCellTypeC1ENS_14CellAttributesE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12HeapCellTypeC2ENS_14CellAttributesE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12HeapCellTypeD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12HeapCellTypeD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12HeapCellTypeD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12HeapVerifier12validateCellEPNS_8HeapCellEPNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12HeapVerifier15checkIfRecordedEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12JSLockHolderC1EPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12JSLockHolderC1EPNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12JSLockHolderC2EPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12JSLockHolderC2EPNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12JSLockHolderC2ERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12JSLockHolderD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12JSLockHolderD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12SmallStrings24singleCharacterStringRepEh() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12StackVisitor13gotoNextFrameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12StackVisitor5Frame8sourceIDEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12StackVisitorC1EPNS_9CallFrameERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12StackVisitorC2EPNS_9CallFrameERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12StringObject14finishCreationERNS_2VMEPNS_8JSStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12StringObjectC2ERNS_2VMEPNS_9StructureE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12SymbolObject14finishCreationERNS_2VMEPNS_6SymbolE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12SymbolObjectC1ERNS_2VMEPNS_9StructureE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12SymbolObjectC2ERNS_2VMEPNS_9StructureE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12addErrorInfoEPNS_14JSGlobalObjectEPNS_8JSObjectEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12isFromJSCodeEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12iteratorStepEPNS_14JSGlobalObjectENS_15IterationRecordE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12profiledCallEPNS_14JSGlobalObjectENS_15ProfilingReasonENS_7JSValueERKNS_8CallDataES3_RKNS_7ArgListERN3WTF8NakedPtrINS_9ExceptionEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC12profiledCallEPNS_14JSGlobalObjectENS_15ProfilingReasonENS_7JSValueERKNS_8CallDataES3_RKNS_7ArgListE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13BooleanObjectC1ERNS_2VMEPNS_9StructureE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13BooleanObjectC2ERNS_2VMEPNS_9StructureE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13ConsoleClient19printConsoleMessageENS_13MessageSourceENS_11MessageTypeENS_12MessageLevelERKN3WTF6StringES7_jj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13DebuggerScope6createERNS_2VMEPNS_7JSScopeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13ErrorInstance17sanitizedToStringEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13JSMapIterator14finishCreationERNS_2VMEPNS_5JSMapENS_13IterationKindE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13JSONStringifyEPNS_14JSGlobalObjectENS_7JSValueES2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13JSONStringifyEPNS_14JSGlobalObjectENS_7JSValueEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13JSSetIterator10createPairEPNS_14JSGlobalObjectENS_7JSValueES3_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13RuntimeMethod14finishCreationERNS_2VMERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13RuntimeMethod15createPrototypeERNS_2VMERNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13RuntimeMethod15createStructureERNS_2VMEPNS_14JSGlobalObjectENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13RuntimeMethod15subspaceForImplERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13RuntimeMethod4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13RuntimeMethod6createEPNS_14JSGlobalObjectES2_PNS_9StructureERKN3WTF6StringEPNS_8Bindings6MethodE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13RuntimeMethodC1ERNS_2VMEPNS_9StructureEPNS_8Bindings6MethodE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13RuntimeMethodC2ERNS_2VMEPNS_9StructureEPNS_8Bindings6MethodE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13ShadowChicken16functionsOnStackEPNS_14JSGlobalObjectEPNS_9CallFrameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13WatchpointSet11fireAllSlowERNS_2VMEPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13WatchpointSet11fireAllSlowERNS_2VMEPNS_22DeferredWatchpointFireE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13WatchpointSet11fireAllSlowERNS_2VMERKNS_10FireDetailE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13WatchpointSetC1ENS_15WatchpointStateE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13WatchpointSetC2ENS_15WatchpointStateE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13WatchpointSetD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13WatchpointSetD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC13iteratorValueEPNS_14JSGlobalObjectENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14JSGlobalObject13clearRareDataEPNS_6JSCellE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14JSGlobalObject14exposeDollarVMERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14JSGlobalObject14finishCreationERNS_2VMEPNS_8JSObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14JSGlobalObject14finishCreationERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14JSGlobalObject16addStaticGlobalsEPNS0_18GlobalPropertyInfoEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14JSGlobalObject4initERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14JSGlobalObject6createERNS_2VMEPNS_9StructureE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14JSGlobalObjectC1ERNS_2VMEPNS_9StructureEPKNS_23GlobalObjectMethodTableE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14JSGlobalObjectC2ERNS_2VMEPNS_9StructureEPKNS_23GlobalObjectMethodTableE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14JSGlobalObjectD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14JSGlobalObjectD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14JSRunLoopTimerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14JSRunLoopTimerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14JSRunLoopTimerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14ProtoCallFrame11setArgumentEmNS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14ProtoCallFrame12setCodeBlockEPNS_9CodeBlockE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14ProtoCallFrame12setThisValueENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14ProtoCallFrame15clearCurrentVPCEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14ProtoCallFrame15setGlobalObjectEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14ProtoCallFrame17setPaddedArgCountEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14ProtoCallFrame29setArgumentCountIncludingThisEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14ProtoCallFrame8argumentEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14ProtoCallFrame9setCalleeEPNS_8JSObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14ProtoCallFrameC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14ProtoCallFrameC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14ProtoCallFrameaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14SourceProvider5getIDEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14SourceProviderD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14SourceProviderD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14SourceProviderD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14StructureCache32emptyObjectStructureForPrototypeEPNS_14JSGlobalObjectEPNS_8JSObjectEjbPNS_18FunctionExecutableE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14StructureCache43emptyStructureForPrototypeFromBaseStructureEPNS_14JSGlobalObjectEPNS_8JSObjectEPNS_9StructureE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14constructArrayEPNS_14JSGlobalObjectEPNS_9StructureEPKNS_7JSValueEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14constructArrayEPNS_14JSGlobalObjectEPNS_9StructureERKNS_7ArgListE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14createURIErrorEPNS_14JSGlobalObjectERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14iteratorMethodEPNS_14JSGlobalObjectEPNS_8JSObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14setNeverInlineEPK15OpaqueJSContextPK13OpaqueJSValue() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14setNeverInlineEPNS_14JSGlobalObjectEPNS_9CallFrameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14throwTypeErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeEN3WTF12ASCIILiteralE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14throwTypeErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC14throwTypeErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC15IsoHeapCellTypeC1ENS_15DestructionModeEPFvPNS_6JSCellEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC15IsoHeapCellTypeC2ENS_15DestructionModeEPFvPNS_6JSCellEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC15TypeProfilerLog17processLogEntriesERNS_2VMERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC15WeakHandleOwner8finalizeENS_6HandleINS_7UnknownEEEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC15WeakHandleOwnerC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC15WeakHandleOwnerC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC15WeakHandleOwnerC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC15WeakHandleOwnerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC15WeakHandleOwnerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC15WeakHandleOwnerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC15WeakHandleOwnerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC15constructNumberEPNS_14JSGlobalObjectENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC15constructStringERNS_2VMEPNS_14JSGlobalObjectENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC15createEvalErrorEPNS_14JSGlobalObjectERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC15createTypeErrorEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC15createTypeErrorEPNS_14JSGlobalObjectERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC15encodeCodeBlockERNS_2VMERKNS_13SourceCodeKeyEPKNS_17UnlinkedCodeBlockE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC15encodeCodeBlockERNS_2VMERKNS_13SourceCodeKeyEPKNS_17UnlinkedCodeBlockEiRNS_18BytecodeCacheErrorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC15ordinarySetSlowEPNS_14JSGlobalObjectEPNS_8JSObjectENS_12PropertyNameENS_7JSValueES5_b() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC16CompleteSubspace12allocateSlowERNS_2VMEmPNS_17GCDeferralContextENS_21AllocationFailureModeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC16CompleteSubspace16allocatorForSlowEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC16CompleteSubspaceD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC16CompleteSubspaceD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC16CompleteSubspaceD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC16InternalFunction23createSubclassStructureEPNS_14JSGlobalObjectEPNS_8JSObjectEPNS_9StructureE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC16InternalFunction4nameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC16IsoSubspacePerVMD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC16IsoSubspacePerVMD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC16SamplingProfiler17stackTracesAsJSONEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC16SamplingProfiler18reportTopBytecodesERN3WTF11PrintStreamE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC16SamplingProfiler18reportTopBytecodesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC16SamplingProfiler18reportTopFunctionsERN3WTF11PrintStreamE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC16SamplingProfiler18reportTopFunctionsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC16SamplingProfiler39noticeCurrentThreadAsJSCExecutionThreadEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC16SamplingProfiler5startEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC16SymbolTableEntry16freeFatEntrySlowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC16createRangeErrorEPNS_14JSGlobalObjectERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC16profiledEvaluateEPNS_14JSGlobalObjectENS_15ProfilingReasonERKNS_10SourceCodeENS_7JSValueERN3WTF8NakedPtrINS_9ExceptionEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC16setNeverOptimizeEPK15OpaqueJSContextPK13OpaqueJSValue() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC16setNeverOptimizeEPNS_14JSGlobalObjectEPNS_9CallFrameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC16slowValidateCellEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC16slowValidateCellEPNS_6JSCellE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC16throwSyntaxErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC16throwSyntaxErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17CommonIdentifiers18appendExternalNameERKNS_10IdentifierES3_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17DebuggerCallFrame10invalidateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17DebuggerCallFrame11callerFrameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17DebuggerCallFrame15currentPositionERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17DebuggerCallFrame20sourceIDForCallFrameEPNS_9CallFrameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17DeferredWorkTimer10runRunLoopEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17DeferredWorkTimer14addPendingWorkERNS_2VMEPNS_8JSObjectEON3WTF6VectorINS_6StrongINS_6JSCellELNS_30ShouldStrongDestructorGrabLockE0EEELm0ENS5_15CrashOnOverflowELm16ENS5_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17DeferredWorkTimer16stopRunningTasksEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17DeferredWorkTimer6createERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17DeferredWorkTimer6doWorkERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17DeferredWorkTimerC1ERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17DeferredWorkTimerC2ERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17DeferredWorkTimerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17DeferredWorkTimerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17DeferredWorkTimerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17FuzzerPredictionsC1EPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17FuzzerPredictionsC2EPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17JSArrayBufferView14unsharedBufferEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17JSArrayBufferView18possiblySharedImplEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17JSArrayBufferView22slowDownAndWasteMemoryEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17JSArrayBufferViewC1ERNS_2VMERNS0_19ConstructionContextE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17JSInternalPromise4thenEPNS_14JSGlobalObjectEPNS_10JSFunctionES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17JSInternalPromise6createERNS_2VMEPNS_9StructureE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17MarkingConstraint17quickWorkEstimateERNS_11SlotVisitorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17MarkingConstraintC2EN3WTF7CStringES2_NS_20ConstraintVolatilityENS_21ConstraintConcurrencyENS_21ConstraintParallelismE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17MarkingConstraintD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17MarkingConstraintD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17MarkingConstraintD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17createSyntaxErrorEPNS_14JSGlobalObjectERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17hasIteratorMethodEPNS_14JSGlobalObjectENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17processConfigFileEPKcS1_S1_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC17profiledConstructEPNS_14JSGlobalObjectENS_15ProfilingReasonENS_7JSValueERKNS_8CallDataERKNS_7ArgListES3_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18BytecodeCacheErroraSERKNS0_10WriteErrorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18BytecodeCacheErroraSERKNS0_13StandardErrorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18BytecodeCacheErroraSERKNS_11ParserErrorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18ErrorHandlingScopeC1ERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18ErrorHandlingScopeC2ERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18ErrorHandlingScopeD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18ErrorHandlingScopeD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18GCActivityCallback10setEnabledEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18GCActivityCallback11didAllocateERNS_4HeapEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18GCActivityCallback11willCollectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18GCActivityCallback13scheduleTimerEN3WTF7SecondsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18GCActivityCallback18tryCreateEdenTimerEPNS_4HeapE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18GCActivityCallback6cancelEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18GCActivityCallback6doWorkERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18GCActivityCallbackC2EPNS_4HeapE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18GCActivityCallbackC2ERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18GCActivityCallbackD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18GCActivityCallbackD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18GCActivityCallbackD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18IncrementalSweeper13startSweepingERNS_4HeapE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18IncrementalSweeperC1EPNS_4HeapE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18IncrementalSweeperC2EPNS_4HeapE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18PropertyDescriptor11setWritableEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18PropertyDescriptor12setUndefinedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18PropertyDescriptor13setDescriptorENS_7JSValueEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18PropertyDescriptor13setEnumerableEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18PropertyDescriptor15setConfigurableEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18PropertyDescriptor21setAccessorDescriptorEPNS_12GetterSetterEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18PropertyDescriptor9setGetterENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC18PropertyDescriptor9setSetterENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19HeapSnapshotBuilder11analyzeNodeEPNS_6JSCellE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19HeapSnapshotBuilder13buildSnapshotEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19HeapSnapshotBuilder15setLabelForCellEPNS_6JSCellERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19HeapSnapshotBuilder16analyzeIndexEdgeEPNS_6JSCellES2_j() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19HeapSnapshotBuilder23analyzePropertyNameEdgeEPNS_6JSCellES2_PN3WTF17UniquedStringImplE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19HeapSnapshotBuilder23analyzeVariableNameEdgeEPNS_6JSCellES2_PN3WTF17UniquedStringImplE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19HeapSnapshotBuilder23getNextObjectIdentifierEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19HeapSnapshotBuilder23setWrappedObjectForCellEPNS_6JSCellEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19HeapSnapshotBuilder30previousSnapshotHasNodeForCellEPNS_6JSCellERj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19HeapSnapshotBuilder34resetNextAvailableObjectIdentifierEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19HeapSnapshotBuilder38setOpaqueRootReachabilityReasonForCellEPNS_6JSCellEPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19HeapSnapshotBuilder4jsonEN3WTF8FunctionIFbRKNS_16HeapSnapshotNodeEEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19HeapSnapshotBuilder4jsonEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19HeapSnapshotBuilderC1ERNS_12HeapProfilerENS0_12SnapshotTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19HeapSnapshotBuilderC2ERNS_12HeapProfilerENS0_12SnapshotTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19HeapSnapshotBuilderD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19HeapSnapshotBuilderD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19HeapSnapshotBuilderD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19HeapSnapshotBuilderdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19HeapSnapshotBuilderdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19HeapSnapshotBuildernaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19HeapSnapshotBuildernaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19HeapSnapshotBuildernwEm10NotNullTagPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19HeapSnapshotBuildernwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19HeapSnapshotBuildernwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19InlineWatchpointSet11inflateSlowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19InlineWatchpointSet7fireAllERNS_2VMEPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19InlineWatchpointSet7freeFatEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19SourceProviderCache5clearEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19SourceProviderCacheD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19SourceProviderCacheD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19iteratorForIterableEPNS_14JSGlobalObjectENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19iteratorForIterableEPNS_14JSGlobalObjectEPNS_8JSObjectENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19numberOfDFGCompilesENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19numberOfDFGCompilesEPK15OpaqueJSContextPK13OpaqueJSValue() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC19reifyStaticAccessorERNS_2VMERKNS_14HashTableValueERNS_8JSObjectENS_12PropertyNameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC20TypedArrayControllerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC20TypedArrayControllerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC20TypedArrayControllerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC20createReferenceErrorEPNS_14JSGlobalObjectERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC20failNextNewCodeBlockEPK15OpaqueJSContext() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC20failNextNewCodeBlockEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC21MarkedJSValueRefArrayC2EP15OpaqueJSContextj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC21MarkedJSValueRefArrayD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC21getInt8ArrayClassInfoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC21linkAndEvaluateModuleEPNS_14JSGlobalObjectERKNS_10IdentifierENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC21loadAndEvaluateModuleEPNS_14JSGlobalObjectEPNS_6SymbolENS_7JSValueES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC21loadAndEvaluateModuleEPNS_14JSGlobalObjectERKN3WTF6StringENS_7JSValueES6_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC21loadAndEvaluateModuleEPNS_14JSGlobalObjectERKNS_10SourceCodeENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC21objectConstructorSealEPNS_14JSGlobalObjectEPNS_8JSObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC21throwOutOfMemoryErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC21throwOutOfMemoryErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22ArrayAllocationProfile13updateProfileEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22DeferredWatchpointFire21takeWatchpointsToFireEPNS_13WatchpointSetE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22EdenGCActivityCallback11gcTimeSliceEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22EdenGCActivityCallback12lastGCLengthERNS_4HeapE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22EdenGCActivityCallback9deathRateERNS_4HeapE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22EdenGCActivityCallbackC1EPNS_4HeapE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22EdenGCActivityCallbackC2EPNS_4HeapE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22EdenGCActivityCallbackD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22EdenGCActivityCallbackD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22EdenGCActivityCallbackD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22FullGCActivityCallback11gcTimeSliceEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22FullGCActivityCallback12doCollectionERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22FullGCActivityCallback12lastGCLengthERNS_4HeapE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22FullGCActivityCallback16setDidGCRecentlyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22FullGCActivityCallback9deathRateERNS_4HeapE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22FullGCActivityCallbackC1EPNS_4HeapE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22FullGCActivityCallbackC2EPNS_4HeapE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22FullGCActivityCallbackD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22FullGCActivityCallbackD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22JSFinalizationRegistry9liveCountERKN3WTF6LockerINS_10JSCellLockEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22createOutOfMemoryErrorEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22createOutOfMemoryErrorEPNS_14JSGlobalObjectERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22generateModuleBytecodeERNS_2VMERKNS_10SourceCodeEiRNS_18BytecodeCacheErrorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22getInt16ArrayClassInfoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22getInt32ArrayClassInfoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22getUint8ArrayClassInfoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22globalMemoryStatisticsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22optimizeNextInvocationENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC22optimizeNextInvocationEPNS_14JSGlobalObjectEPNS_9CallFrameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC23AbstractSamplingCounter4dumpEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC23JSModuleNamespaceObjectC1ERNS_2VMEPNS_9StructureE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC23JSModuleNamespaceObjectC2ERNS_2VMEPNS_9StructureE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC23MacroAssemblerX86Common18collectCPUFeaturesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC23SimpleMarkingConstraintD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC23SimpleMarkingConstraintD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC23SimpleMarkingConstraintD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC23VariableWriteFireDetail5touchERNS_2VMEPNS_13WatchpointSetEPNS_8JSObjectERKNS_12PropertyNameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC23encodeFunctionCodeBlockERNS_2VMEPKNS_25UnlinkedFunctionCodeBlockERNS_18BytecodeCacheErrorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC23generateProgramBytecodeERNS_2VMERKNS_10SourceCodeEiRNS_18BytecodeCacheErrorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC23getUint16ArrayClassInfoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC23getUint32ArrayClassInfoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC23objectConstructorFreezeEPNS_14JSGlobalObjectEPNS_8JSObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC23setUpStaticFunctionSlotERNS_2VMEPKNS_9ClassInfoEPKNS_14HashTableValueEPNS_8JSObjectENS_12PropertyNameERNS_12PropertySlotE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC23throwStackOverflowErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC24createStackOverflowErrorEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC24getCalculatedDisplayNameERNS_2VMEPNS_8JSObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC24getExecutableForFunctionENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC24getFloat32ArrayClassInfoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC24getFloat64ArrayClassInfoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC24reportZappedCellAndCrashERNS_4HeapEPKNS_6JSCellE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC25JSSegmentedVariableObject12addVariablesEjNS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC25JSSegmentedVariableObject17findVariableIndexEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC25jsStringWithCacheSlowCaseERNS_2VMERN3WTF10StringImplE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC26createIteratorResultObjectEPNS_14JSGlobalObjectENS_7JSValueEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC26evaluateWithScopeExtensionEPNS_14JSGlobalObjectERKNS_10SourceCodeEPNS_8JSObjectERN3WTF8NakedPtrINS_9ExceptionEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC26setCannotUseOSRExitFuzzingEPNS_14JSGlobalObjectEPNS_9CallFrameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC28getHashMapBucketKeyClassInfoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC29constructArrayNegativeIndexedEPNS_14JSGlobalObjectEPNS_9StructureEPKNS_7JSValueEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC29createNotEnoughArgumentsErrorEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC29ensureGlobalFuzzerPredictionsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC29getUint8ClampedArrayClassInfoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC2VM10ClientDataD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC2VM10ClientDataD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC2VM13deleteAllCodeENS_19DeleteAllCodeEffortE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC2VM14throwExceptionEPNS_14JSGlobalObjectENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC2VM14throwExceptionEPNS_14JSGlobalObjectEPNS_8JSObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC2VM14throwExceptionEPNS_14JSGlobalObjectEPNS_9ExceptionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC2VM15canUseAssemblerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC2VM15drainMicrotasksEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC2VM17addImpurePropertyEPN3WTF17UniquedStringImplE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC2VM18ensureHeapProfilerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC2VM19deleteAllLinkedCodeENS_19DeleteAllCodeEffortE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC2VM20dumpTypeProfilerDataEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC2VM20sharedInstanceExistsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC2VM21sentinelMapBucketSlowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC2VM21sentinelSetBucketSlowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC2VM6createENS_8HeapTypeEPN3WTF7RunLoopE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC2VM8whenIdleEON3WTF8FunctionIFvvEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC2VM9tryCreateENS_8HeapTypeEPN3WTF7RunLoopE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC2VMD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC2VMD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC32JSDestructibleObjectHeapCellTypeC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC32JSDestructibleObjectHeapCellTypeC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC32JSDestructibleObjectHeapCellTypeD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC32JSDestructibleObjectHeapCellTypeD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC32JSDestructibleObjectHeapCellTypeD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC32throwDOMAttributeGetterTypeErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeEPKNS_9ClassInfoENS_12PropertyNameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC33getHashMapBucketKeyValueClassInfoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC35getSomeBaselineCodeBlockForFunctionENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC3DFG18getNumCompilationsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC41constructFunctionSkippingEvalEnabledCheckEPNS_14JSGlobalObjectERKNS_7ArgListERKNS_10IdentifierERKNS_12SourceOriginERKN3WTF6StringERKNSB_12TextPositionEiNS_24FunctionConstructionModeENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC41constructObjectFromPropertyDescriptorSlowEPNS_14JSGlobalObjectERKNS_18PropertyDescriptorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap10collectNowENS_15SynchronousnessENS_9GCRequestE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap11collectSyncENS_9GCRequestE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap11objectCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap12addFinalizerEPNS_6JSCellEN3WTF8FunctionIFvS2_EEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap12addFinalizerEPNS_6JSCellEPFvS2_E() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap12collectAsyncENS_9GCRequestE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap15extraMemorySizeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap17acquireAccessSlowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap17globalObjectCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap17releaseAccessSlowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap18addToRememberedSetEPKNS_6JSCellE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap18sweepSynchronouslyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap19stopIfNecessarySlowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap20fullActivityCallbackEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap20protectedObjectCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap20writeBarrierSlowPathEPKNS_6JSCellE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap24reportExtraMemoryVisitedEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap26protectedGlobalObjectCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap26reportAbandonedObjectGraphEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap31collectNowFullIfNotDoneRecentlyENS_15SynchronousnessE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap32setGarbageCollectionTimerEnabledEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap34reportExtraMemoryAllocatedSlowCaseEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap35deprecatedReportExtraMemorySlowCaseEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap39decrementDeferralDepthAndGCIfNeededSlowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap4sizeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap7collectENS_15SynchronousnessENS_9GCRequestE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap7protectENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap7sweeperEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap8capacityEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Heap9unprotectENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Yarr12errorMessageENS0_9ErrorCodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Yarr12errorToThrowEPNS_14JSGlobalObjectENS0_9ErrorCodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Yarr17RegularExpressionC1ERKS1_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Yarr17RegularExpressionC2ERKS1_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Yarr17RegularExpressionD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Yarr17RegularExpressionD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Yarr17RegularExpressionaSERKS1_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Yarr17RegularExpressiondaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Yarr17RegularExpressiondlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Yarr17RegularExpressionnaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Yarr17RegularExpressionnaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Yarr17RegularExpressionnwEm10NotNullTagPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Yarr17RegularExpressionnwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4Yarr17RegularExpressionnwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC4callEPNS_14JSGlobalObjectENS_7JSValueERKNS_8CallDataES2_RKNS_7ArgListE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC6Config25disableFreezingForTestingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC6JSCell14deletePropertyEPS0_PNS_14JSGlobalObjectENS_12PropertyNameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC6JSCell9getObjectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC6JSLock12DropAllLocksC1EPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC6JSLock12DropAllLocksC1EPNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC6JSLock12DropAllLocksC1ERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC6JSLock12DropAllLocksC2EPNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC6JSLock12DropAllLocksD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC6JSLock12DropAllLocksD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC6JSLock4lockEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC6JSLock6unlockEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC6JSLockD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC6JSLockD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC6RegExp5matchEPNS_14JSGlobalObjectERKN3WTF6StringEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC6RegExp5matchEPNS_14JSGlobalObjectERKN3WTF6StringEjRNS3_6VectorIiLm0ENS3_15CrashOnOverflowELm16ENS3_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC6RegExp6createERNS_2VMERKN3WTF6StringENS3_9OptionSetINS_4Yarr5FlagsEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC6Symbol6createERNS_2VMERN3WTF10SymbolImplE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC7JSArray15copyToArgumentsEPNS_14JSGlobalObjectEPNS_7JSValueEjj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC7JSArray26shiftCountWithArrayStorageERNS_2VMEjjPNS_12ArrayStorageE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC7JSArray32tryCreateUninitializedRestrictedERNS_25ObjectInitializationScopeEPNS_17GCDeferralContextEPNS_9StructureEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC7JSArray38isIteratorProtocolFastAndNonObservableEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC7JSArray3popEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC7JSArray4pushEPNS_14JSGlobalObjectENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC7JSArray9setLengthEPNS_14JSGlobalObjectEjb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC7JSValue14putToPrimitiveEPNS_14JSGlobalObjectENS_12PropertyNameES0_RNS_15PutPropertySlotE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC7JSValue21putToPrimitiveByIndexEPNS_14JSGlobalObjectEjS0_b() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC7Options10initializeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC7Options10setOptionsEPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC7Options21dumpAllOptionsInALineERN3WTF13StringBuilderE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC7WeakSet13findAllocatorENS_13CellContainerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Bindings10RootObjectD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Bindings10RootObjectD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Bindings10RootObjectD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Bindings13RuntimeObject10invalidateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Bindings13RuntimeObject14finishCreationERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Bindings13RuntimeObject15createPrototypeERNS_2VMERNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Bindings13RuntimeObject15createStructureERNS_2VMEPNS_14JSGlobalObjectENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Bindings13RuntimeObject15subspaceForImplERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Bindings13RuntimeObject4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Bindings13RuntimeObjectC1ERKS1_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Bindings13RuntimeObjectC2ERKS1_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Bindings13RuntimeObjectD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Bindings13RuntimeObjectD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Bindings13RuntimeObjectaSERKS1_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Bindings8Instance16newRuntimeObjectEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Bindings8Instance19createRuntimeObjectEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Bindings8InstanceD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Bindings8InstanceD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Bindings8InstanceD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Debugger10isAttachedEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Debugger11handlePauseEPNS_14JSGlobalObjectENS0_14ReasonForPauseE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Debugger23recompileAllJSFunctionsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Debugger23setBreakpointsActivatedEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Debugger24currentDebuggerCallFrameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Debugger6attachEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Debugger6detachEPNS_14JSGlobalObjectENS0_15ReasonForDetachE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8DebuggerC2ERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8DebuggerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8DebuggerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8DebuggerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSBigInt10createFromEPNS_14JSGlobalObjectEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSBigInt10createZeroEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSBigInt12tryRightTrimERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSBigInt13equalsToInt32Ei() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSBigInt13tryCreateZeroERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSBigInt16createWithLengthEPNS_14JSGlobalObjectEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSBigInt19tryCreateWithLengthERNS_2VMEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSBigInt6equalsEPS0_S1_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSBigInt9rightTrimEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSCalleeC1ERNS_2VMEPNS_14JSGlobalObjectEPNS_9StructureE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSCalleeC2ERNS_2VMEPNS_14JSGlobalObjectEPNS_9StructureE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSObject11hasInstanceEPNS_14JSGlobalObjectENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSObject11hasInstanceEPNS_14JSGlobalObjectENS_7JSValueES3_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSObject13putInlineSlowEPNS_14JSGlobalObjectENS_12PropertyNameENS_7JSValueERNS_15PutPropertySlotE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSObject18setPrototypeDirectERNS_2VMENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSObject19calculatedClassNameEPS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSObject19convertToDictionaryERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSObject19putDirectMayBeIndexEPNS_14JSGlobalObjectENS_12PropertyNameENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSObject22ensureArrayStorageSlowERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSObject22fillGetterPropertySlotERNS_2VMERNS_12PropertySlotEPNS_6JSCellEji() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSObject23putDirectCustomAccessorERNS_2VMENS_12PropertyNameENS_7JSValueEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSObject24getOwnPropertyDescriptorEPNS_14JSGlobalObjectENS_12PropertyNameERNS_18PropertyDescriptorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSObject24getOwnStaticPropertySlotERNS_2VMENS_12PropertyNameERNS_12PropertySlotE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSObject24putDirectBuiltinFunctionERNS_2VMEPNS_14JSGlobalObjectERKNS_12PropertyNameEPNS_18FunctionExecutableEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSObject26setPrototypeWithCycleCheckERNS_2VMEPNS_14JSGlobalObjectENS_7JSValueEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSObject28allocateMoreOutOfLineStorageERNS_2VMEmm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSObject30convertToUncacheableDictionaryERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSObject38putDirectIndexSlowOrBeyondVectorLengthEPNS_14JSGlobalObjectEjNS_7JSValueEjNS_18PutDirectIndexModeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSObject48convertDoubleToContiguousWhilePerformingSetIndexERNS_2VMEjNS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSObject4sealERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSObject55convertInt32ToDoubleOrContiguousWhilePerformingSetIndexERNS_2VMEjNS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSObject6freezeERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8JSObject9getMethodEPNS_14JSGlobalObjectERNS_8CallDataERKNS_10IdentifierERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Profiler8Database8logEventEPNS_9CodeBlockEPKcRKN3WTF7CStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Profiler8DatabaseC1ERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Profiler8DatabaseC2ERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Profiler8DatabaseD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Profiler8DatabaseD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8Subspace33parallelNotEmptyMarkedBlockSourceEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8SubspaceD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8SubspaceD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC8SubspaceD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9CallFrame13describeFrameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9CallFrame18callerSourceOriginERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9CodeBlock19baselineAlternativeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9CodeBlockD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9CodeBlockD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9Exception6createERNS_2VMENS_7JSValueENS0_18StackCaptureActionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9HandleSet4growEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9Integrity6Random29reloadAndCheckShouldAuditSlowERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9JSPromise15rejectAsHandledEPNS_14JSGlobalObjectENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9JSPromise15rejectAsHandledEPNS_14JSGlobalObjectEPNS_9ExceptionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9JSPromise15resolvedPromiseEPNS_14JSGlobalObjectENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9JSPromise6createERNS_2VMEPNS_9StructureE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9JSPromise6rejectEPNS_14JSGlobalObjectENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9JSPromise6rejectEPNS_14JSGlobalObjectEPNS_9ExceptionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9JSPromise7resolveEPNS_14JSGlobalObjectENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9Structure16allocateRareDataERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9Structure16isValidPrototypeENS_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9Structure21addPropertyTransitionERNS_2VMEPS0_NS_12PropertyNameEjRi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9Structure24addNewPropertyTransitionERNS_2VMEPS0_NS_12PropertyNameEjRiNS_15PutPropertySlot7ContextEPNS_41DeferredStructureTransitionWatchpointFireE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9Structure24materializePropertyTableERNS_2VMEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9Structure25attributeChangeTransitionERNS_2VMEPS0_NS_12PropertyNameEjPNS_41DeferredStructureTransitionWatchpointFireE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9Structure31toCacheableDictionaryTransitionERNS_2VMEPS0_PNS_41DeferredStructureTransitionWatchpointFireE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9Structure8isFrozenERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9Structure8isSealedERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9StructureC1ERNS_2VMEPNS_14JSGlobalObjectENS_7JSValueERKNS_8TypeInfoEPKNS_9ClassInfoEhj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9StructureC2ERNS_2VMEPNS_14JSGlobalObjectENS_7JSValueERKNS_8TypeInfoEPKNS_9ClassInfoEhj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3JSC9constructEPNS_14JSGlobalObjectENS_7JSValueERKNS_8CallDataERKNS_7ArgListES2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3PAL12CryptoDigest11computeHashEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3PAL12CryptoDigest8addBytesEPKvm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3PAL12CryptoDigestD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3PAL12CryptoDigestD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3PAL13SleepDisablerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3PAL13SleepDisablerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3PAL13SleepDisablerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3PAL19fileSizeDescriptionEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3PAL8KillRing16setToYankedStateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3PAL8KillRing16startNewSequenceEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3PAL8KillRing4yankEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3PAL8KillRing6appendERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3PAL8KillRing7prependERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3PAL9SessionID26enableGenerationProtectionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3PAL9SessionID26generateEphemeralSessionIDEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3PAL9SessionID27generatePersistentSessionIDEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10AtomString16fromUTF8InternalEPKcS2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10AtomString6numberEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10AtomString6numberEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10AtomString6numberEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10AtomString6numberEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10AtomString6numberEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10AtomString6numberEy() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10ParkingLot11forEachImplERKNS_12ScopedLambdaIFvRNS_6ThreadEPKvEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10ParkingLot11unparkCountEPKvj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10ParkingLot13unparkOneImplEPKvRKNS_12ScopedLambdaIFlNS0_12UnparkResultEEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10ParkingLot21parkConditionallyImplEPKvRKNS_12ScopedLambdaIFbvEEERKNS3_IFvvEEERKNS_24TimeWithDynamicClockTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10ParkingLot9unparkAllEPKv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10ParkingLot9unparkOneEPKv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10StringImpl17utf8ForCharactersEPKDsjNS_14ConversionModeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10StringImpl17utf8ForCharactersEPKhj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10StringImpl28convertToLowercaseWithLocaleERKNS_10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10StringImpl28convertToUppercaseWithLocaleERKNS_10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10StringImpl31convertToLowercaseWithoutLocaleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10StringImpl31convertToUppercaseWithoutLocaleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10StringImpl57convertToLowercaseWithoutLocaleStartingAtFailingIndex8BitEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10StringImpl5adoptEONS_12StringBufferIDsEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10StringImpl5adoptEONS_12StringBufferIhEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10StringImpl7destroyEPS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10StringImpl7replaceEDsDs() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10StringImpl7replaceEDsPKhj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10StringView11SplitResult8Iterator17findNextSubstringEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10StringView11SplitResult8IteratorppEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10StringView16GraphemeClusters8IteratorC1EOS2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10StringView16GraphemeClusters8IteratorC2EOS2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10StringView16GraphemeClusters8IteratorD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10StringView16GraphemeClusters8IteratorD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10StringView16GraphemeClusters8IteratorppEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10SymbolImpl16createNullSymbolEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10SymbolImpl17nextHashForSymbolEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10SymbolImpl6createERNS_10StringImplE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10TextStream10startGroupEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10TextStream11writeIndentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10TextStream7releaseEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10TextStream8endGroupEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10TextStream8nextLineEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10TextStreamlsEPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10TextStreamlsEPKv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10TextStreamlsERKNS_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10TextStreamlsEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10TextStreamlsEc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10TextStreamlsEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10TextStreamlsEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10TextStreamlsEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10TextStreamlsEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10TextStreamlsEl() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10TextStreamlsEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10TextStreamlsEx() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10TextStreamlsEy() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10URLHelpers14userVisibleURLERKNS_7CStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10WorkerPool8postTaskEONS_8FunctionIFvvEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10WorkerPoolC1ENS_12ASCIILiteralEjNS_7SecondsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10WorkerPoolC2ENS_12ASCIILiteralEjNS_7SecondsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10WorkerPoolD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10WorkerPoolD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF10initializeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11LogArgumentIPKvE8toStringES2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11OSAllocator18releaseDecommittedEPvm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11OSAllocator23hintMemoryNotNeededSoonEPvm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11OSAllocator6commitEPvmbb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11OSAllocator8decommitEPvm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11Persistence5CoderINS_10AtomStringEE6encodeERNS0_7EncoderERKS2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11Persistence5CoderINS_6StringEE6encodeERNS0_7EncoderERKS2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11Persistence5CoderINS_7CStringEE6encodeERNS0_7EncoderERKS2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11Persistence7Decoder14verifyChecksumEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11Persistence7DecoderD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11Persistence7DecoderD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11Persistence7Encoder14encodeChecksumEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11Persistence7EncoderC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11Persistence7EncoderC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11Persistence7EncoderD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11Persistence7EncoderD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11Persistence7EncoderlsEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11Persistence7EncoderlsEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11Persistence7EncoderlsEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11Persistence7EncoderlsEh() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11Persistence7EncoderlsEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11Persistence7EncoderlsEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11Persistence7EncoderlsEl() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11Persistence7EncoderlsEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11Persistence7EncoderlsEs() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11Persistence7EncoderlsEt() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11PrintStream20printfVariableFormatEPKcz() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11PrintStream3endEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11PrintStream5beginEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11PrintStream6printfEPKcz() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11StackBounds32currentThreadStackBoundsInternalEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11ThreadGroup3addERKNS_14AbstractLockerERNS_6ThreadE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11ThreadGroup3addERNS_6ThreadE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11ThreadGroupD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11TimingScope11scopeDidEndEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11portAllowedERKNS_3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11setDataFileEPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF11setNonBlockEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF12CountingLock10unlockSlowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF12CountingLock8lockSlowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF12isMainThreadEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13FastBitVector10clearRangeEmm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13MetaAllocator17addFreshFreeSpaceEPvm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13MetaAllocator17currentStatisticsERKNS_6LockerINS_4LockEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13MetaAllocator17freeFreeSpaceNodeEPNS0_13FreeSpaceNodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13MetaAllocator18debugFreeSpaceSizeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13MetaAllocator19isInAllocatedMemoryERKNS_14AbstractLockerEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13MetaAllocator7releaseERKNS_6LockerINS_4LockEEERNS_19MetaAllocatorHandleE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13MetaAllocator8allocateERKNS_6LockerINS_4LockEEEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13MetaAllocatorC2ERNS_4LockEmm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13MetaAllocatorD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13MetaAllocatorD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13ReadWriteLock10readUnlockEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13ReadWriteLock11writeUnlockEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13ReadWriteLock8readLockEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13ReadWriteLock9writeLockEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13StringBuilder11shrinkToFitEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13StringBuilder15reserveCapacityEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13StringBuilder16appendCharactersEPKDsj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13StringBuilder16appendCharactersEPKhj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13StringBuilder22appendQuotedJSONStringERKNS_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13aboutBlankURLEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13dumpCharacterERNS_11PrintStreamEc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13isMainRunLoopEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13normalizedNFCENS_10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13normalizedNFCERKNS_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEN3JSC14TypedArrayModeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamENS_10RawPointerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamENS_9ClockTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEPKNS_10StringImplE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEPN3JSC9CodeBlockE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamERKNS_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamERKNS_7CStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEa() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEh() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEl() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEs() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEt() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEx() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEy() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14AtomStringImpl10addLiteralEPKcj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14AtomStringImpl11addSlowCaseERNS_10StringImplE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14AtomStringImpl11addSlowCaseERNS_15AtomStringTableERNS_10StringImplE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14AtomStringImpl14lookUpSlowCaseERNS_10StringImplE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14AtomStringImpl3addEPKDsj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14AtomStringImpl3addEPKNS_10StringImpl16StaticStringImplE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14AtomStringImpl3addEPKhj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14AtomStringImpl3addEPNS_10StringImplEjj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14AtomStringImpl6lookUpEPKDsj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14AtomStringImpl6lookUpEPKhj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl10deleteFileERKNS_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl10fileExistsERKNS_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl12truncateFileEix() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl14MappedFileData13mapFileHandleEiNS0_12FileOpenModeENS0_14MappedFileModeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl14MappedFileDataC1ERKNS_6StringENS0_14MappedFileModeERb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl14MappedFileDataC1EiNS0_12FileOpenModeENS0_14MappedFileModeERb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl14MappedFileDataC1EiNS0_14MappedFileModeERb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl14MappedFileDataC2ERKNS_6StringENS0_14MappedFileModeERb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl14MappedFileDataD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl14MappedFileDataD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl14setMetadataURLERKNS_6StringES3_S3_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl17encodeForFileNameERKNS_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl18createSymbolicLinkERKNS_6StringES3_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl18decodeFromFilenameERKNS_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl18hardLinkOrCopyFileERKNS_6StringES3_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl18makeAllDirectoriesERKNS_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl18unlockAndCloseFileEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl19filesHaveSameVolumeERKNS_6StringES3_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl20deleteEmptyDirectoryERKNS_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl24fileSystemRepresentationERKNS_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl25createTemporaryZipArchiveERKNS_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl25pathByAppendingComponentsENS_10StringViewERKNS_6VectorIS1_Lm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl27isSafeToUseMemoryMapForPathERKNS_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl29makeSafeToUseMemoryMapForPathERKNS_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl30appendFileContentsToFileHandleERKNS_6StringERi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl34stringFromFileSystemRepresentationEPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl40lastComponentOfPathIgnoringTrailingSlashERKNS_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl8hardLinkERKNS_6StringES3_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl8moveFileERKNS_6StringES3_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl8openFileERKNS_6StringENS0_12FileOpenModeENS0_20FileAccessPermissionEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl8realPathERKNS_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl8seekFileEixNS0_14FileSeekOriginE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14FileSystemImpl9closeFileERi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14SymbolRegistry12symbolForKeyERKNS_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14SymbolRegistryD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14SymbolRegistryD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14aboutSrcDocURLEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14createIteratorENS_10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14dataLogFStringEPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14dupCloseOnExecEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14isVersion4UUIDENS_10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF14setCloseOnExecEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF15AtomStringTableD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF15AtomStringTableD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF15AutomaticThread11shouldSleepERKNS_14AbstractLockerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF15AutomaticThread14threadDidStartEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF15AutomaticThread16threadIsStoppingERKNS_14AbstractLockerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF15AutomaticThread4joinEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF15AutomaticThread5startERKNS_14AbstractLockerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF15AutomaticThread6notifyERKNS_14AbstractLockerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF15AutomaticThread7tryStopERKNS_14AbstractLockerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF15AutomaticThread9isWaitingERKNS_14AbstractLockerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF15AutomaticThreadD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF15AutomaticThreadD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF15AutomaticThreadD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF15BinarySemaphore9waitUntilERKNS_24TimeWithDynamicClockTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF15FilePrintStreamD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF15FilePrintStreamD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF15FilePrintStreamD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF15ThreadCondition4waitERNS_5MutexE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF15ThreadCondition6signalEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF15ThreadCondition9broadcastEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF15ThreadCondition9timedWaitERNS_5MutexENS_8WallTimeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF15ThreadConditionD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF15ThreadConditionD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF15isWordTextBreakEP14UBreakIterator() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF15memoryFootprintEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF16addSignalHandlerENS_6SignalEONS_8FunctionIFNS_12SignalActionES0_RNS_7SigInfoERNS_17PlatformRegistersEEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF16callOnMainThreadEONS_8FunctionIFvvEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF16codePointCompareENS_10StringViewES0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF16codePointCompareERKNS_6StringES2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF17GregorianDateTimeC1EdNS_15LocalTimeOffsetE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF17GregorianDateTimeC2EdNS_15LocalTimeOffsetE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF17PrivateSymbolImpl6createERNS_10StringImplE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF17StringPrintStream11tryToStringEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF17StringPrintStream26toStringWithLatin1FallbackEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF17StringPrintStream5resetEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF17StringPrintStream7vprintfEPKcP13__va_list_tag() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF17StringPrintStream8toStringEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF17StringPrintStream9toCStringEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF17StringPrintStreamC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF17StringPrintStreamC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF17StringPrintStreamD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF17StringPrintStreamD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF17StringPrintStreamD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF17callOnMainRunLoopEONS_8FunctionIFvvEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF17double_conversion23DoubleToStringConverter19EcmaScriptConverterEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF17languageDidChangeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF17wordBreakIteratorENS_10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF18ExternalStringImpl6createEPKDsjONS_8FunctionIFvPS0_PvjEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF18ExternalStringImpl6createEPKhjONS_8FunctionIFvPS0_PvjEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF18FunctionDispatcherC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF18FunctionDispatcherD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF18FunctionDispatcherD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF18FunctionDispatcherD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF18ParallelHelperPool13doSomeHelpingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF18ParallelHelperPool13ensureThreadsEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF18ParallelHelperPoolC1EONS_7CStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF18ParallelHelperPoolC2EONS_7CStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF18ParallelHelperPoolD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF18ParallelHelperPoolD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF19MetaAllocatorHandle6shrinkEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF19MetaAllocatorHandleD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF19MetaAllocatorHandleD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF19ParallelEnvironment7executeEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF19ParallelEnvironmentC1EPFvPvEmi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF19ParallelEnvironmentC2EPFvPvEmi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF19isCompilationThreadEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF19mimeTypeFromDataURLENS_10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF19numGraphemeClustersENS_10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF20ConcurrentPtrHashSet15deleteOldTablesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF20ConcurrentPtrHashSet5clearEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF20ConcurrentPtrHashSet7addSlowEPNS0_5TableEjjjPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF20ConcurrentPtrHashSetC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF20ConcurrentPtrHashSetC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF20ConcurrentPtrHashSetD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF20ConcurrentPtrHashSetD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF20ParallelHelperClient13doSomeHelpingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF20ParallelHelperClient6finishEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF20ParallelHelperClientD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF20ParallelHelperClientD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF20initializeMainThreadEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF20resetAccumulatedLogsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF21MemoryPressureHandler12setPageCountEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF21MemoryPressureHandler13releaseMemoryENS_8CriticalENS_11SynchronousE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF21MemoryPressureHandler24currentMemoryUsagePolicyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF21MemoryPressureHandler26endSimulatedMemoryPressureEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF21MemoryPressureHandler26triggerMemoryPressureEventEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF21MemoryPressureHandler28beginSimulatedMemoryPressureEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF21MemoryPressureHandler33setShouldUsePeriodicMemoryMonitorEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF21MemoryPressureHandler7installEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF21MemoryPressureHandler9singletonEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF21RefCountedLeakCounter24cancelMessageSuppressionEPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF21RefCountedLeakCounter9decrementEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF21RefCountedLeakCounter9incrementEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF21RefCountedLeakCounterC1EPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF21RefCountedLeakCounterC2EPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF21RefCountedLeakCounterD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF21RefCountedLeakCounterD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF21bootSessionUUIDStringEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF21currentSearchLocaleIDEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF21makeRFC2822DateStringEjjjjjjji() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF21sentenceBreakIteratorENS_10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF22CrossThreadTaskHandler13postTaskReplyEONS_15CrossThreadTaskE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF22CrossThreadTaskHandler21setCompletionCallbackEONS_8FunctionIFvvEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF22CrossThreadTaskHandler4killEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF22CrossThreadTaskHandler8postTaskEONS_15CrossThreadTaskE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF22CrossThreadTaskHandlerC1EPKcNS0_25AutodrainedPoolForRunLoopE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF22CrossThreadTaskHandlerC2EPKcNS0_25AutodrainedPoolForRunLoopE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF22CrossThreadTaskHandlerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF22CrossThreadTaskHandlerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF22CrossThreadTaskHandlerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF22FastBitVectorWordOwner10resizeSlowEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF22FastBitVectorWordOwner13setEqualsSlowERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF22TextBreakIteratorCache9singletonEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF22isMainThreadOrGCThreadEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF23callOnMainThreadAndWaitEONS_8FunctionIFvvEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF24AutomaticThreadCondition4waitERNS_4LockE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF24AutomaticThreadCondition7waitForERNS_4LockENS_7SecondsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF24AutomaticThreadCondition9notifyAllERKNS_14AbstractLockerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF24AutomaticThreadCondition9notifyOneERKNS_14AbstractLockerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF24AutomaticThreadConditionC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF24AutomaticThreadConditionC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF24AutomaticThreadConditionD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF24AutomaticThreadConditionD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF24callOnMainRunLoopAndWaitEONS_8FunctionIFvvEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF24currentTextBreakLocaleIDEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF24isDefaultPortForProtocolEtNS_10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF24normalizeLineEndingsToLFEONS_6VectorIhLm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF25activateSignalHandlersForENS_6SignalE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF25addLanguageChangeObserverEPvPFvS0_E() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF26getAndResetAccumulatedLogsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF26normalizeLineEndingsToCRLFEONS_6VectorIhLm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF27protocolHostAndPortAreEqualERKNS_3URLES2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF28displayNameForLanguageLocaleERKNS_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF28encodeWithURLEscapeSequencesERKNS_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF28normalizeLineEndingsToNativeEONS_6VectorIhLm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF28removeLanguageChangeObserverEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF30numCodeUnitsInGraphemeClustersENS_10StringViewEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF30overrideUserPreferredLanguagesERKNS_6VectorINS_6StringELm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF30userPreferredLanguagesOverrideEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF31NonSharedCharacterBreakIteratorC1ENS_10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF31NonSharedCharacterBreakIteratorC2ENS_10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF31NonSharedCharacterBreakIteratorD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF31NonSharedCharacterBreakIteratorD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF31equalIgnoringFragmentIdentifierERKNS_3URLES2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF33indexOfBestMatchingLanguageInListERKNS_6StringERKNS_6VectorIS0_Lm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEERb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF37canCurrentThreadAccessThreadLocalDataERNS_6ThreadE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF37parseDateFromNullTerminatedCharactersEPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF3ICU12majorVersionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF3ICU12minorVersionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF3URL11setProtocolENS_10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF3URL14setHostAndPortENS_10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF3URL15hostIsIPAddressENS_10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF3URL17removeCredentialsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF3URL21setFragmentIdentifierENS_10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF3URL23fakeURLWithRelativePartENS_10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF3URL25fileURLWithFileSystemPathENS_10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF3URL32removeQueryAndFragmentIdentifierEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF3URL7setHostENS_10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF3URL7setPathENS_10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF3URL7setUserENS_10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF3URL8setQueryENS_10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF3URLC2ERKS0_RKNS_6StringEPKNS_15URLTextEncodingE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF3absERKNS_9MediaTimeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF40clearDefaultPortForProtocolMapForTestingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF40registerDefaultPortForProtocolForTestingEtRKNS_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF4Lock10unlockSlowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF4Lock13safepointSlowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF4Lock8lockSlowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF4SHA116computeHexDigestEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF4SHA1C1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF4SHA1C2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF5Mutex4lockEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF5Mutex6unlockEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF5Mutex7tryLockEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF5MutexC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF5MutexC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF5MutexD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF5MutexD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF5sleepENS_7SecondsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF6String24numberToStringFixedWidthEdj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF6String28numberToStringFixedPrecisionEdjNS_29TrailingZerosTruncatingPolicyE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF6String28numberToStringFixedPrecisionEfjNS_29TrailingZerosTruncatingPolicyE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF6String6numberEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF6String6numberEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF6Thread13mayBeGCThreadEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF6Thread14changePriorityEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF6Thread16registerGCThreadENS_12GCThreadTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF6Thread17waitForCompletionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF6Thread20initializeCurrentTLSEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF6Thread20numberOfThreadGroupsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF6Thread27exchangeIsCompilationThreadEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF6Thread31setCurrentThreadIsUserInitiatedEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF6Thread33setCurrentThreadIsUserInteractiveEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF6Thread6detachEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF6Thread6signalEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF6ThreadD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF6ThreadD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF7RunLoop13dispatchAfterENS_7SecondsEONS_8FunctionIFvvEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF7RunLoop17setWakeUpCallbackEONS_8FunctionIFvvEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF7RunLoop38suspendFunctionDispatchForCurrentCycleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF7RunLoop3runEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF7RunLoop4mainEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF7RunLoop4stopEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF7RunLoop5cycleEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF7RunLoop7currentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF7RunLoop8dispatchEONS_8FunctionIFvvEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF7RunLoop9TimerBase4stopEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF7RunLoop9TimerBase5startENS_7SecondsEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF7RunLoop9TimerBaseC2ERS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF7RunLoop9TimerBaseD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF7RunLoop9TimerBaseD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8CollatorC1EPKcb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8CollatorC2EPKcb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8CollatorD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8CollatorD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl10ObjectBase6removeERKNS_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl5Array6createEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl5Value4nullEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl5Value6createERKNS_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl5Value6createEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl5Value6createEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl5Value6createEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl5ValueC1ENS1_4TypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl5ValueC1ERKNS_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl5ValueC1Eb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl5ValueC1Ed() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl5ValueC1Ei() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl5ValueC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl5ValueC2ENS1_4TypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl5ValueC2ERKNS_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl5ValueC2Eb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl5ValueC2Ed() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl5ValueC2Ei() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl5ValueC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl5ValueD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl5ValueD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl5ValueD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl6Object6createEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl9ArrayBase10pushDoubleEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl9ArrayBase10pushStringERKNS_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl9ArrayBase11pushBooleanEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl9ArrayBase11pushIntegerEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl9ArrayBase3endEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl9ArrayBase5beginEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl9ArrayBaseC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl9ArrayBaseC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl9ArrayBaseD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8JSONImpl9ArrayBaseD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8WordLock10unlockSlowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8WordLock8lockSlowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF8dataFileEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9BitVector11excludeSlowERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9BitVector13OutOfLineBits6createEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9BitVector13OutOfLineBits7destroyEPS1_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9BitVector6resizeEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9BitVector7setSlowERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9BitVector8clearAllEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9BitVector9mergeSlowERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9MediaTime11invalidTimeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9MediaTime12setTimeScaleEjNS0_13RoundingFlagsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9MediaTime14indefiniteTimeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9MediaTime15createWithFloatEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9MediaTime15createWithFloatEfj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9MediaTime16createWithDoubleEdj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9MediaTime16createWithDoubleEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9MediaTime20negativeInfiniteTimeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9MediaTime20positiveInfiniteTimeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9MediaTime8zeroTimeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9MediaTimeC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9MediaTimeC1Eljh() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9MediaTimeC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9MediaTimeC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9MediaTimeC2Eljh() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9MediaTimeC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9MediaTimeaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9MediaTimedaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9MediaTimedlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9MediaTimemIERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9MediaTimenaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9MediaTimenaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9MediaTimenwEm10NotNullTagPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9MediaTimenwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9MediaTimenwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9MediaTimepLERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9URLParser14allValuesEqualERKNS_3URLES3_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9URLParser19parseURLEncodedFormENS_10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9URLParser24internalValuesConsistentERKNS_3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTF9URLParser9serializeERKNS_6VectorINS_12KeyValuePairINS_6StringES3_EELm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTFlsERNS_10TextStreamENS_7SecondsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN3WTFlsERNS_10TextStreamERKNS_3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN6WebKit14WebProcessMainEiPPc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN6WebKit18NetworkProcessMainEiPPc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7Nicosia6Buffer6createERKN7WebCore7IntSizeEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7Nicosia6BufferD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7Nicosia6BufferD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7Nicosia9AnimationC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7Nicosia9AnimationC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10CookieUtil17defaultPathForURLERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10FileHandle4openERKN3WTF6StringENS1_14FileSystemImpl12FileOpenModeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10FileHandle4openEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10FileHandle4readEPvi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10FileHandle5closeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10FileHandle5writeEPKvi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10FileHandle6printfEPKcz() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10FileHandleC1EOS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10FileHandleC1ERKN3WTF6StringENS1_14FileSystemImpl12FileOpenModeENS1_9OptionSetINS5_12FileLockModeEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10FileHandleC1ERKN3WTF6StringENS1_14FileSystemImpl12FileOpenModeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10FileHandleC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10FileHandleC2EOS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10FileHandleC2ERKN3WTF6StringENS1_14FileSystemImpl12FileOpenModeENS1_9OptionSetINS5_12FileLockModeEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10FileHandleC2ERKN3WTF6StringENS1_14FileSystemImpl12FileOpenModeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10FileHandleC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10FileHandleD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10FileHandleD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10FileHandleaSEOS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10ISOFullBoxC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10ISOFullBoxC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10ISOFullBoxC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10ISOFullBoxC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10JSDocument14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10JSDocument15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10JSDocument15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10JSDocument15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10JSDocument4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10JSDocument9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10JSDocument9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10JSDocumentC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10JSDocumentC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10JSDocumentD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10JSDocumentD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10JSLocation14finishCreationERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10JSLocation14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10JSLocation15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10JSLocation15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10JSLocation15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10JSLocation4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10JSLocation9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10JSLocation9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10JSLocationC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10JSLocationC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10JSLocationD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10JSLocationD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10JSLocationaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10JSNodeList9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10OriginLockD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10OriginLockD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10Pasteboard10readOriginEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10Pasteboard10readStringERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10Pasteboard11writeMarkupERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10Pasteboard11writeStringERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10Pasteboard14readAllStringsERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10Pasteboard14writePlainTextERKN3WTF6StringENS0_18SmartReplaceOptionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10Pasteboard15canSmartReplaceEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10Pasteboard15writeCustomDataERKN3WTF6VectorINS_20PasteboardCustomDataELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10Pasteboard16fileContentStateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10Pasteboard20typesSafeForBindingsERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10Pasteboard22readStringInCustomDataERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10Pasteboard28typesForLegacyUnsafeBindingsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10Pasteboard33writeTrustworthyWebURLsPboardTypeERKNS_13PasteboardURLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10Pasteboard5clearERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10Pasteboard5clearEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10Pasteboard5writeERKNS_13PasteboardURLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10Pasteboard5writeERKNS_15PasteboardImageE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10Pasteboard5writeERKNS_20PasteboardWebContentE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10Pasteboard5writeERKNS_5ColorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10Pasteboard7hasDataEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10RenderView10compositorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10ScrollView11removeChildERNS_6WidgetE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10ScrollView15setScrollOffsetERKNS_8IntPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10ScrollView16setParentVisibleEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10ScrollView17setScrollbarModesENS_13ScrollbarModeES1_bb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10ScrollView17setUseFixedLayoutEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10ScrollView18setFixedLayoutSizeERKNS_7IntSizeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10ScrollView20setCanHaveScrollbarsEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10ScrollView21setExposedContentRectERKNS_9FloatRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10ScrollView23setPaintsEntireContentsEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10ScrollView23setScrollbarsSuppressedEbb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10ScrollView24setUnobscuredContentSizeERKNS_9FloatSizeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10ScrollView36scrollOffsetChangedViaPlatformWidgetERKNS_8IntPointES3_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10ScrollView4hideEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10ScrollView4showEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10ScrollView8addChildERNS_6WidgetE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10StorageMap10removeItemERKN3WTF6StringERS2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10StorageMap20setItemIgnoringQuotaERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10StorageMap3keyEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10StorageMap7setItemERKN3WTF6StringES4_RS2_Rb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10TimeRanges13intersectWithERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10TimeRanges3addEdd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10TimeRanges6createEdd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10TimeRanges6createEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10TimeRangesC1Edd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10TimeRangesC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10TimeRangesC2Edd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10TimeRangesC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10TreeWalker10firstChildEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10TreeWalker10parentNodeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10TreeWalker11nextSiblingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10TreeWalker12previousNodeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10TreeWalker14setCurrentNodeERNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10TreeWalker15previousSiblingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10TreeWalker8nextNodeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10TreeWalker9lastChildEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10XLinkNames4initEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10XMLNSNames4initEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10handCursorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10inSameLineERKNS_15VisiblePositionES2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore10resolveDNSERKN3WTF6StringEmONS0_17CompletionHandlerIFvONSt12experimental15fundamentals_v38expectedINS0_6VectorINS_9IPAddressELm0ENS0_15CrashOnOverflowELm16ENS0_10FastMallocEEENS_8DNSErrorEEEEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11BidiContext41copyStackRemovingUnicodeEmbeddingContextsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11BidiContext6createEh14UCharDirectionbNS_19BidiEmbeddingSourceEPS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11BitmapImageC1EPNS_13ImageObserverE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11BitmapImageC2EPNS_13ImageObserverE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11CSSPageRule15setSelectorTextERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11CSSPageRule5styleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11CachedFrame23cachedFramePlatformDataEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11CachedImage16imageForRendererEPKNS_12RenderObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11ContentType15codecsParameterEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11ContentTypeC1EON3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11ContentTypeC1ERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11ContentTypeC2EON3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11ContentTypeC2ERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11CryptoKeyEC12generatePairENS_25CryptoAlgorithmIdentifierERKN3WTF6StringEbi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11CryptoKeyEC9importRawENS_25CryptoAlgorithmIdentifierERKN3WTF6StringEONS2_6VectorIhLm0ENS2_15CrashOnOverflowELm16ENS2_10FastMallocEEEbi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11DOMRectListC1ERKN3WTF6VectorINS_9FloatQuadELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11DOMRectListC1ERKN3WTF6VectorINS_9FloatRectELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11DOMRectListC2ERKN3WTF6VectorINS_9FloatQuadELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11DOMRectListC2ERKN3WTF6VectorINS_9FloatRectELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11DOMRectListD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11DOMRectListD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11DisplayList11DisplayList5clearEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11DisplayList14DrawingContext17replayDisplayListERNS_15GraphicsContextE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11DisplayList14DrawingContext26setTracksDisplayListReplayEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11DisplayList20FillRectWithGradientC1ERKNS_9FloatRectERNS_8GradientE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11DisplayList20FillRectWithGradientC2ERKNS_9FloatRectERNS_8GradientE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11DisplayList8RecorderD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11DisplayList8RecorderD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11DisplayList8RecorderD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11DisplayList8Replayer6replayERKNS_9FloatRectEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11EditCommand18setEndingSelectionERKNS_16VisibleSelectionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11EventRegionC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11EventRegionC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11EventTarget24dispatchEventForBindingsERNS_5EventE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FetchLoaderD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FetchLoaderD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FetchLoaderD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FileChooser10chooseFileERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FileChooser11chooseFilesERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEES8_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FileChooserD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FileChooserD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FileMonitorD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FileMonitorD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FontCascade11setCodePathENS0_8CodePathE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FontCascadeC1EONS_22FontCascadeDescriptionEff() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FontCascadeC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FontCascadeC2EONS_22FontCascadeDescriptionEff() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FontCascadeC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FontCascadeaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FrameLoader11shouldCloseEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FrameLoader14detachChildrenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FrameLoader16detachFromParentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FrameLoader17HistoryController14setCurrentItemERNS_11HistoryItemE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FrameLoader17HistoryController18replaceCurrentItemEPNS_11HistoryItemE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FrameLoader17HistoryController26saveDocumentAndScrollStateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FrameLoader17HistoryController33restoreScrollPositionAndViewStateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FrameLoader17HistoryController36saveScrollPositionAndViewStateToItemEPNS_11HistoryItemE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FrameLoader17stopForUserCancelEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FrameLoader21clearTestingOverridesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FrameLoader22findFrameForNavigationERKN3WTF10AtomStringEPNS_8DocumentE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FrameLoader25detachFromAllOpenedFramesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FrameLoader26reloadWithOverrideEncodingERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FrameLoader32setOriginalURLForDownloadRequestERNS_15ResourceRequestE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FrameLoader4initEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FrameLoader4loadEONS_16FrameLoadRequestE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FrameLoader6openerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FrameLoader6reloadEN3WTF9OptionSetINS_12ReloadOptionEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11FrameLoader9setOpenerEPNS_5FrameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11HTMLElement12setDraggableEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11HTMLElement12setTranslateEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11HTMLElement13setSpellcheckEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11HTMLElement18setContentEditableERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11HTMLElement5clickEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11HTMLElement6setDirERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11HistoryItem11setReferrerERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11HistoryItem12setURLStringERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11HistoryItem15setIsTargetItemEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11HistoryItem17setAlternateTitleERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11HistoryItem17setScrollPositionERKNS_8IntPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11HistoryItem18setFormContentTypeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11HistoryItem18setPageScaleFactorEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11HistoryItem20setOriginalURLStringERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11HistoryItem30setShouldRestoreScrollPositionEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11HistoryItem31setShouldOpenExternalURLsPolicyENS_28ShouldOpenExternalURLsPolicyE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11HistoryItem8setTitleERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11HistoryItemC1ERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11HistoryItemC1ERKN3WTF6StringES4_S4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11HistoryItemC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11HistoryItemC2ERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11HistoryItemC2ERKN3WTF6StringES4_S4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11HistoryItemC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11HistoryItemD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11HistoryItemD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11ImageBufferD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11ImageBufferD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11ImageBufferD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11ImageSource10frameCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11ImageSource20frameDurationAtIndexEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11ImageSource4sizeENS_16ImageOrientationE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSDOMMatrix14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSDOMMatrix15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSDOMMatrix15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSDOMMatrix15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSDOMMatrix4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSDOMMatrix9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSDOMMatrixC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSDOMMatrixC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSDOMMatrixD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSDOMMatrixD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSDOMObjectC1EPN3JSC9StructureERNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSDOMObjectC2EPN3JSC9StructureERNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSImageData14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSImageData15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSImageData15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSImageData15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSImageData4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSImageData9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSImageData9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSImageDataC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSImageDataC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSImageDataD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSImageDataD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSImageDataaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSMediaList9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11JSTextTrack9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MathMLNames4initEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer10cancelLoadEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer10invalidateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer11invalidTimeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer11isAvailableEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer11muteChangedEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer11naturalSizeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer11rateChangedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer11sizeChangedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer11timeChangedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer12addTextTrackERNS_22InbandTextTrackPrivateE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer12networkStateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer12supportsTypeERKNS_28MediaEngineSupportParametersE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer13addAudioTrackERNS_17AudioTrackPrivateE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer13prepareToPlayEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer13tracksChangedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer13volumeChangedEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer15clearMediaCacheERKN3WTF6StringENS1_8WallTimeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer15durationChangedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer15nextMediaEngineEPKNS_18MediaPlayerFactoryE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer15removeTextTrackERNS_22InbandTextTrackPrivateE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer16removeAudioTrackERNS_17AudioTrackPrivateE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer16removeVideoTrackERNS_17VideoTrackPrivateE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer17readyStateChangedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer17resetMediaEnginesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer17seekWithToleranceERKN3WTF9MediaTimeES4_S4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer17setPreservesPitchEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer17supportsKeySystemERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer18liveUpdateIntervalEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer18mediaEngineUpdatedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer19networkStateChangedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer19nextBestMediaEngineEPKNS_18MediaPlayerFactoryE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer19originsInMediaCacheERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer19prepareForRenderingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer19syncTextTrackBoundsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer20cachedResourceLoaderEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer20createResourceLoaderEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer20playbackStateChangedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer20resourceNotSupportedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer21characteristicChangedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer21endSimulatedHDCPErrorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer21setShouldDisableSleepEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer22performTaskAtMediaTimeEON3WTF8FunctionIFvvEEERKNS1_9MediaTimeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer22setPrivateBrowsingModeEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer23beginSimulatedHDCPErrorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer23loadWithNextMediaEngineEPKNS_18MediaPlayerFactoryE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer24firstVideoFrameAvailableEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer24remoteEngineFailedToLoadEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer24setClosedCaptionsVisibleEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer25bufferedTimeRangesChangedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer25nativeImageForCurrentTimeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer25seekableTimeRangesChangedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer25shouldIgnoreIntrinsicSizeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer26activeSourceBuffersChangedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer26applicationDidBecomeActiveEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer26setTextTrackRepresentationEPNS_23TextTrackRepresentationE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer27applicationWillResignActiveEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer28setPreferredDynamicRangeModeENS_16DynamicRangeModeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer28setShouldMaintainAspectRatioEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer29acceleratedCompositingEnabledEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer32acceleratedRenderingStateChangedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer34seekableTimeRangesLastModifiedTimeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer4playEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer4seekERKN3WTF9MediaTimeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer5paintERNS_15GraphicsContextERKNS_9FloatRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer5pauseEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer6createERNS_17MediaPlayerClientE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer7repaintEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer7setRateEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer8setMutedEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayer9setVolumeEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayerC1ERNS_17MediaPlayerClientE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayerC2ERNS_17MediaPlayerClientE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayerdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayerdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayernaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayernaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayernwEm10NotNullTagPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayernwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MediaPlayernwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MemoryCache11setDisabledEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MemoryCache13getStatisticsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MemoryCache13setCapacitiesEjjj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MemoryCache14evictResourcesEN3PAL9SessionIDE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MemoryCache14evictResourcesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MemoryCache18pruneDeadResourcesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MemoryCache18pruneLiveResourcesEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MemoryCache18resourceForRequestERKNS_15ResourceRequestEN3PAL9SessionIDE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MemoryCache24pruneDeadResourcesToSizeEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MemoryCache24pruneLiveResourcesToSizeEjb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MemoryCache30destroyDecodedDataForAllImagesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MemoryCache9singletonEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MessagePort16messageAvailableEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11MessagePort22notifyMessageAvailableERKNS_21MessagePortIdentifierE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11PageOverlay15setNeedsDisplayERKNS_7IntRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11PageOverlay15setNeedsDisplayEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11PageOverlay20stopFadeOutAnimationEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11PageOverlay5clearEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11PageOverlay5layerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11PageOverlay8setFrameENS_7IntRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11PageOverlayD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11PageOverlayD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11RenderLayer21simulateFrequentPaintEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11RenderStyleD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11RenderStyleD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11RenderTheme9singletonEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11SimpleRangeC1EONS_13BoundaryPointES2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11SimpleRangeC1ERKNS_13BoundaryPointES3_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11SimpleRangeC2EONS_13BoundaryPointES2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11SimpleRangeC2ERKNS_13BoundaryPointES3_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11WindowProxy12globalObjectERNS_15DOMWrapperWorldE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11WindowProxy22releaseJSWindowProxiesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11WindowProxy40createJSWindowProxyWithInitializedScriptERNS_15DOMWrapperWorldE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11WindowProxyD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11WindowProxyD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11XPathResult11iterateNextEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11XPathResult12snapshotItemEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11XPathResultD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11XPathResultD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11iBeamCursorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11isEndOfLineERKNS_15VisiblePositionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11prefetchDNSERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11startOfLineERKNS_15VisiblePositionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore11startOfWordERKNS_15VisiblePositionENS_9EWordSideE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12BlobRegistry16blobRegistryImplEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12BlobRegistryC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12BlobRegistryC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12BlobRegistryD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12BlobRegistryD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12BlobRegistryD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12CSSStyleRule15setSelectorTextERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12CSSStyleRule5styleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12CryptoKeyAES9importRawENS_25CryptoAlgorithmIdentifierEON3WTF6VectorIhLm0ENS2_15CrashOnOverflowELm16ENS2_10FastMallocEEEbi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12DOMException11descriptionENS_13ExceptionCodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12DOMTokenList6tokensEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12DataTransferD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12DataTransferD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12EditingStyle21styleAtSelectionStartERKNS_16VisibleSelectionEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12EditingStyle8hasStyleENS_13CSSPropertyIDERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12EditingStyleC1EPKNS_19CSSStyleDeclarationE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12EditingStyleC2EPKNS_19CSSStyleDeclarationE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12EditingStyleD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12EditingStyleD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12EventHandler10mouseMovedERKNS_18PlatformMouseEventE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12EventHandler14scrollOverflowENS_15ScrollDirectionENS_17ScrollGranularityEPNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12EventHandler15handleAccessKeyERKNS_21PlatformKeyboardEventE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12EventHandler17scrollRecursivelyENS_15ScrollDirectionENS_17ScrollGranularityEPNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12EventHandler18accessKeyModifiersEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12EventHandler20sendContextMenuEventERKNS_18PlatformMouseEventE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12EventHandler21handleMousePressEventERKNS_18PlatformMouseEventE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12EventHandler21handleMousePressEventERKNS_28MouseEventWithHitTestResultsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12EventHandler23handleMouseReleaseEventERKNS_18PlatformMouseEventE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12EventHandler23handleMouseReleaseEventERKNS_28MouseEventWithHitTestResultsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12EventHandler23setImmediateActionStageENS_20ImmediateActionStageE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12EventHandler24logicalScrollRecursivelyENS_22ScrollLogicalDirectionENS_17ScrollGranularityEPNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12EventHandler26sendContextMenuEventForKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12EventHandler30dispatchFakeMouseMoveEventSoonEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12EventHandler30setCapturingMouseEventsElementEPNS_7ElementE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12EventHandler31passMouseMovedEventToScrollbarsERKNS_18PlatformMouseEventE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12EventHandler40selectionExtentRespectingEditingBoundaryERKNS_16VisibleSelectionERKNS_11LayoutPointEPNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12EventHandler47handleKeyboardSelectionMovementForAccessibilityERNS_13KeyboardEventE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12EventHandler8keyEventERKNS_21PlatformKeyboardEventE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12GCController13deleteAllCodeEN3JSC19DeleteAllCodeEffortE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12GCController17garbageCollectNowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12GCController18garbageCollectSoonEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12GCController19deleteAllLinkedCodeEN3JSC19DeleteAllCodeEffortE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12GCController34garbageCollectNowIfNotDoneRecentlyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12GCController41setJavaScriptGarbageCollectorTimerEnabledEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12GCController43garbageCollectOnAlternateThreadForDebuggingEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12GCController9singletonEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12GridPosition15setSpanPositionEiRKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12GridPosition19setExplicitPositionEiRKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12GridPosition24setMaxPositionForTestingEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12HTMLDocument5widthEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12HTMLDocument6heightEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12ISOWebVTTCue5parseERN3JSC8DataViewERj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12ISOWebVTTCueD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12ISOWebVTTCueD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12ISOWebVTTCueD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12JSAudioTrack14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12JSAudioTrack15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12JSAudioTrack15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12JSAudioTrack15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12JSAudioTrack4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12JSAudioTrack9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12JSAudioTrack9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12JSAudioTrackD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12JSAudioTrackD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12JSAudioTrackaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12JSStyleSheet9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12JSTimeRanges14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12JSTimeRanges15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12JSTimeRanges15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12JSTimeRanges15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12JSTimeRanges4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12JSTimeRanges9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12JSTimeRanges9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12JSTimeRangesC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12JSTimeRangesC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12JSTimeRangesD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12JSTimeRangesD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12JSTimeRangesaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12JSTreeWalker9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12NamedNodeMap12setNamedItemERNS_4AttrE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12NamedNodeMap15removeNamedItemERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12NamedNodeMap17removeNamedItemNSERKN3WTF10AtomStringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12NamedNodeMap3refEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12NamedNodeMap5derefEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12NodeIterator12previousNodeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12NodeIterator8nextNodeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12NodeIteratorD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12NodeIteratorD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12PrintContext16computePageRectsERKNS_9FloatRectEfffRfb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12PrintContext16computedPageSizeENS_9FloatSizeENS_9RectEdgesIfEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12PrintContext18computedPageMarginENS_9RectEdgesIfEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12PrintContext20pageNumberForElementEPNS_7ElementERKNS_9FloatSizeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12PrintContext27computeAutomaticScaleFactorERKNS_9FloatSizeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12PrintContext28computePageRectsWithPageSizeERKNS_9FloatSizeEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12PrintContext3endEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12PrintContext5beginEff() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12PrintContext9spoolPageERNS_15GraphicsContextEif() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12PrintContext9spoolRectERNS_15GraphicsContextERKNS_7IntRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12PrintContextD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12PrintContextD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12PrintContextD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12RenderObject16paintingRootRectERNS_10LayoutRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12SettingsBase26setMinimumDOMTimerIntervalEN3WTF7SecondsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12SettingsBase33platformDefaultMediaSourceEnabledEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12SettingsBase44setMediaContentTypesRequiringHardwareSupportERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12SettingsBase44setMediaContentTypesRequiringHardwareSupportERKN3WTF6VectorINS_11ContentTypeELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12SharedBufferC1EON3WTF14FileSystemImpl14MappedFileDataE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12SharedBufferC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12SharedBufferC2EON3WTF14FileSystemImpl14MappedFileDataE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12SharedBufferC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12SourceBuffer30setMaximumQueueDepthForTrackIDERKN3WTF10AtomStringEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12SourceBuffer41minimumUpcomingPresentationTimeForTrackIDERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12TextIterator7advanceEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12TextIteratorD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12TextIteratorD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12WebAnimation9instancesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12WorkerThread17workerThreadCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12blobRegistryEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore12commonVMSlowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13AXObjectCache10rootObjectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13AXObjectCache11getOrCreateEPNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13AXObjectCache19enableAccessibilityEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13AXObjectCache20disableAccessibilityEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13AXObjectCache37setEnhancedUserInterfaceAccessibilityEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13CSSStyleSheet10deleteRuleEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13CSSStyleSheet10insertRuleERKN3WTF6StringEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13CSSStyleSheet8cssRulesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13CharacterData10appendDataERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13CharacterData10deleteDataEjj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13CharacterData10insertDataEjRKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13CharacterData11replaceDataEjjRKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13CharacterData13substringDataEjj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13CharacterData7setDataERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13ContainerNode11appendChildERNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13ContainerNode11removeChildERNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13ContainerNode13querySelectorERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13ContainerNode16querySelectorAllERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13ContainerNode20getElementsByTagNameERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13ContainerNode22getElementsByClassNameERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13ContainerNode22getElementsByTagNameNSERKN3WTF10AtomStringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13ContainerNode8childrenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13GraphicsLayer11clearClientEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13GraphicsLayer12setZPositionEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13GraphicsLayer15willBeDestroyedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13GraphicsLayer16removeFromParentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13GraphicsLayer16resumeAnimationsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13GraphicsLayer17removeAllChildrenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13GraphicsLayer17suspendAnimationsEN3WTF13MonotonicTimeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13GraphicsLayer18setBackgroundColorERKNS_5ColorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13GraphicsLayer54noteDeviceOrPageScaleFactorChangedIncludingDescendantsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13GraphicsLayer6createEPNS_20GraphicsLayerFactoryERNS_19GraphicsLayerClientENS0_4TypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13GraphicsLayer7setSizeERKNS_9FloatSizeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13GraphicsLayer9setClientERNS_19GraphicsLayerClientE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13GraphicsLayerC2ENS0_4TypeERNS_19GraphicsLayerClientE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13GraphicsLayerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13GraphicsLayerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13GraphicsLayerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13HTTPHeaderMap3setERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13HTTPHeaderMap6appendERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13HTTPHeaderMap6removeENS_14HTTPHeaderNameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13HTTPHeaderMap6removeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13HTTPHeaderMapC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13HTTPHeaderMapC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13HitTestResult12setInnerNodeEPNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13HitTestResultC1ERKNS_10LayoutRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13HitTestResultC1ERKNS_11LayoutPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13HitTestResultC1ERKNS_15HitTestLocationE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13HitTestResultC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13HitTestResultC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13HitTestResultC2ERKNS_10LayoutRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13HitTestResultC2ERKNS_11LayoutPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13HitTestResultC2ERKNS_15HitTestLocationE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13HitTestResultC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13HitTestResultC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13HitTestResultD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13HitTestResultD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13HitTestResultaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13IdentifierRep3getEPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13IdentifierRep3getEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13IdentifierRep7isValidEPS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13JSCSSRuleList9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13JSDOMRectList14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13JSDOMRectList15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13JSDOMRectList15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13JSDOMRectList15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13JSDOMRectList4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13JSDOMRectList9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13JSDOMRectList9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13JSDOMRectListC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13JSDOMRectListC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13JSDOMRectListD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13JSDOMRectListD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13JSDOMRectListaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13JSHTMLElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13JSHTMLElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13JSHTMLElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13JSHTMLElement15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13JSHTMLElement4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13JSHTMLElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13JSHTMLElement9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13JSHTMLElementC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13JSHTMLElementC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13JSHTMLElementD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13JSHTMLElementD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13JSWindowProxy9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13JSXPathResult9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MIMETypeCache13canDecodeTypeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MIMETypeCache14supportedTypesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MIMETypeCache17addSupportedTypesERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MIMETypeCache21canDecodeExtendedTypeERKNS_11ContentTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MIMETypeCache21supportsContainerTypeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MIMETypeCache26isUnsupportedContainerTypeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MIMETypeCacheC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MIMETypeCacheC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MIMETypeCacheC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MIMETypeCacheC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MIMETypeCacheD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MIMETypeCacheD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MIMETypeCacheD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MIMETypeCacheaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MIMETypeCachedaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MIMETypeCachedlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MIMETypeCachenaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MIMETypeCachenaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MIMETypeCachenwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MIMETypeCachenwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MediaStrategyC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MediaStrategyC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MediaStrategyC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MediaStrategyC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MediaStrategyD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MediaStrategyD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MediaStrategyD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13MutationEvent17initMutationEventERKN3WTF10AtomStringEbbPNS_4NodeERKNS1_6StringES9_S9_t() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13NodeTraversal13deepLastChildERNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13NodeTraversal19nextAncestorSiblingERKNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13NodeTraversal19nextAncestorSiblingERKNS_4NodeEPS2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13NodeTraversal4lastERKNS_13ContainerNodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13OverflowEvent17initOverflowEventEtbb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13PathUtilities26pathWithShrinkWrappedRectsERKN3WTF6VectorINS_9FloatRectELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13PathUtilities27pathsWithShrinkWrappedRectsERKN3WTF6VectorINS_9FloatRectELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13QualifiedName17QualifiedNameImplD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13QualifiedName17QualifiedNameImplD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13QualifiedName4initEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13QualifiedNameC1ERKN3WTF10AtomStringES4_S4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13QualifiedNameC2ERKN3WTF10AtomStringES4_S4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13SleepDisablerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13SleepDisablerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13StyledElement10cssomStyleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13StyledElement22setInlineStylePropertyENS_13CSSPropertyIDEdNS_11CSSUnitTypeEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13TextIndicator15createWithRangeERKNS_11SimpleRangeEN3WTF9OptionSetINS_19TextIndicatorOptionEEENS_35TextIndicatorPresentationTransitionENS_9FloatSizeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13TextIndicator6createERKNS_17TextIndicatorDataE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13TextIndicatorD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13TextIndicatorD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13displayStringERKN3WTF6StringEPKNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13enclosingListEPNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13endOfDocumentEPKNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13endOfDocumentERKNS_15VisiblePositionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13endOfSentenceERKNS_15VisiblePositionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13getLogChannelERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13internalErrorERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13isStartOfLineERKNS_15VisiblePositionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13pointerCursorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore13releaseMemoryEN3WTF8CriticalENS0_11SynchronousENS_24MaintainBackForwardCacheENS_19MaintainMemoryCacheE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14CachedResource12removeClientERNS_20CachedResourceClientE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14CachedResource16unregisterHandleEPNS_24CachedResourceHandleBaseE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14CachedResource9addClientERNS_20CachedResourceClientE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14CredentialBase7compareERKNS_10CredentialES3_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14CredentialBaseC1ERKN3WTF6StringES4_NS_21CredentialPersistenceE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14CredentialBaseC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14CredentialBaseC2ERKN3WTF6StringES4_NS_21CredentialPersistenceE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14CredentialBaseC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14DOMCacheEngine15queryCacheMatchERKNS_15ResourceRequestES3_RKNS_16ResourceResponseERKNS_17CacheQueryOptionsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14DocumentLoader13attachToFrameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14DocumentLoader14notifyFinishedERNS_14CachedResourceERKNS_18NetworkLoadMetricsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14DocumentLoader15detachFromFrameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14DocumentLoader16redirectReceivedERNS_14CachedResourceEONS_15ResourceRequestERKNS_16ResourceResponseEON3WTF17CompletionHandlerIFvS4_EEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14DocumentLoader16responseReceivedERNS_14CachedResourceERKNS_16ResourceResponseEON3WTF17CompletionHandlerIFvvEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14DocumentLoader17addConsoleMessageEN3JSC13MessageSourceENS1_12MessageLevelERKN3WTF6StringEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14DocumentLoader21setCustomHeaderFieldsEON3WTF6VectorINS_18CustomHeaderFieldsELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14DocumentLoader22cancelMainResourceLoadERKNS_13ResourceErrorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14DocumentLoader23applyPoliciesToSettingsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14DocumentLoader8setTitleERKNS_19StringWithDirectionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14DocumentLoaderC1ERKNS_15ResourceRequestERKNS_14SubstituteDataE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14DocumentLoaderC2ERKNS_15ResourceRequestERKNS_14SubstituteDataE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14DocumentLoaderD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14DocumentLoaderD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14DocumentLoaderD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14DocumentWriter3endEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14FrameSelection12setSelectionERKNS_16VisibleSelectionEN3WTF9OptionSetINS0_18SetSelectionOptionEEENS_23AXTextStateChangeIntentENS0_19CursorAlignOnScrollENS_15TextGranularityE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14FrameSelection16updateAppearanceEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14FrameSelection19absoluteCaretBoundsEPb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14FrameSelection20setSelectionFromNoneEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14FrameSelection5clearEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14FrameSelection9selectAllEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14FrameSelectionC1EPNS_8DocumentE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14FrameSelectionC2EPNS_8DocumentE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14HTMLMapElement5areasEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSNamedNodeMap9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSNodeIterator9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSSourceBuffer14finishCreationERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSSourceBuffer14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSSourceBuffer15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSSourceBuffer15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSSourceBuffer15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSSourceBuffer9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSSourceBuffer9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSVoidCallback11handleEventEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSVoidCallback12callbackDataEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSVoidCallback6createEPN3JSC8JSObjectEPNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSVoidCallbackC1EPN3JSC8JSObjectEPNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSVoidCallbackC2EPN3JSC8JSObjectEPNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSVoidCallbackD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSVoidCallbackD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSVoidCallbackD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSWebAnimation14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSWebAnimation15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSWebAnimation15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSWebAnimation15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSWebAnimation4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSWebAnimation9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSWebAnimation9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSWebAnimationC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSWebAnimationC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSWebAnimationD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14JSWebAnimationD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14LoaderStrategyC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14LoaderStrategyC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14LoaderStrategyD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14LoaderStrategyD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14LoaderStrategyD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14LoggedInStatus13setTimeToLiveEN3WTF7SecondsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14LoggedInStatus6createERKNS_17RegistrableDomainERKN3WTF6StringENS0_19CredentialTokenTypeENS0_18AuthenticationTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14LoggedInStatus6createERKNS_17RegistrableDomainERKN3WTF6StringENS0_19CredentialTokenTypeENS0_18AuthenticationTypeENS4_7SecondsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14MicrotaskQueue26performMicrotaskCheckpointEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14MicrotaskQueueD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14MicrotaskQueueD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14PluginDocument12pluginWidgetEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ProcessWarming15initializeNamesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ProcessWarming15prewarmGloballyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ProcessWarming25collectPrewarmInformationEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ResourceHandle11clearClientEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ResourceHandle12firstRequestEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ResourceHandle16setDefersLoadingEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ResourceHandle20forceContentSniffingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ResourceHandle6cancelEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ResourceHandleD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ResourceHandleD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ResourceHandleD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ResourceLoader14cancelledErrorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ResourceLoader31didBlockAuthenticationChallengeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ResourceLoader6cancelERKNS_13ResourceErrorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ResourceLoader6cancelEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14SQLiteDatabase12lastErrorMsgEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14SQLiteDatabase14clearAllTablesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14SQLiteDatabase16runVacuumCommandEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14SQLiteDatabase20setCollationFunctionERKN3WTF6StringEONS1_8FunctionIFiiPKviS7_EEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14SQLiteDatabase27runIncrementalVacuumCommandEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14SQLiteDatabase27turnOnIncrementalAutoVacuumEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14SQLiteDatabase29setIsDatabaseOpeningForbiddenEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14SQLiteDatabase5closeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14SQLiteDatabase9interruptEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14SQLiteDatabase9lastErrorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14SQLiteDatabaseC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14SQLiteDatabaseC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14SQLiteDatabaseD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14SQLiteDatabaseD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ScrollableArea15contentsResizedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ScrollableArea15didAddScrollbarEPNS_9ScrollbarENS_20ScrollbarOrientationE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ScrollableArea17willEndLiveResizeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ScrollableArea19invalidateScrollbarERNS_9ScrollbarERKNS_7IntRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ScrollableArea19willRemoveScrollbarEPNS_9ScrollbarENS_20ScrollbarOrientationE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ScrollableArea19willStartLiveResizeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ScrollableArea21scrollbarStyleChangedENS_14ScrollbarStyleEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ScrollableArea22invalidateScrollCornerERKNS_7IntRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ScrollableArea24setScrollbarOverlayStyleENS_21ScrollbarOverlayStyleE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ScrollableArea27availableContentSizeChangedENS0_25AvailableSizeChangeReasonE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ScrollableArea27notifyScrollPositionChangedERKNS_8IntPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ScrollableArea28setScrollOffsetFromInternalsERKNS_8IntPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ScrollableArea30scrollToOffsetWithoutAnimationERKNS_10FloatPointENS_14ScrollClampingE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ScrollableArea32computeScrollbarValueAndOverhangEfffRfS1_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ScrollableArea34constrainScrollPositionForOverhangERKNS_10LayoutRectERKNS_10LayoutSizeERKNS_11LayoutPointES9_ii() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ScrollableAreaC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ScrollableAreaD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ScrollableAreaD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ScrollableAreaD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14ScrollbarTheme5themeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14SecurityOrigin16createFromStringERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14SecurityOrigin30isLocalHostOrLoopbackIPAddressEN3WTF10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14SecurityOrigin6createERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14SecurityPolicy18setLocalLoadPolicyENS0_15LocalLoadPolicyE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14SecurityPolicy18shouldHideReferrerERKN3WTF3URLERKNS1_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14SecurityPolicy27resetOriginAccessAllowlistsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14SecurityPolicy29addOriginAccessAllowlistEntryERKNS_14SecurityOriginERKN3WTF6StringES7_b() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14SecurityPolicy32removeOriginAccessAllowlistEntryERKNS_14SecurityOriginERKN3WTF6StringES7_b() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14SocketProviderC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14SocketProviderD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14SocketProviderD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14SocketProviderD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14StaticNodeListD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14StaticNodeListD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14StaticNodeListD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14StaticNodeListdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14StaticNodeListdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14StaticNodeListnaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14StaticNodeListnwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14StaticNodeListnwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14StyleSheetList4itemEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14StyleSheetListD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14StyleSheetListD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14XMLHttpRequestD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14XMLHttpRequestD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14endOfParagraphERKNS_15VisiblePositionENS_27EditingBoundaryCrossingRuleE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14foldQuoteMarksERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14stopResolveDNSEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore14valueForLengthERKNS_6LengthENS_10LayoutUnitE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15ActiveDOMObject15suspendIfNeededEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15ActiveDOMObject20queueTaskInEventLoopENS_10TaskSourceEON3WTF8FunctionIFvvEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15ActiveDOMObject4stopEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15ActiveDOMObject6resumeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15ActiveDOMObject7suspendENS_19ReasonForSuspensionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15ActiveDOMObjectC2EPNS_22ScriptExecutionContextENS0_33CheckedScriptExecutionContextTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15ActiveDOMObjectC2EPNS_22ScriptExecutionContextE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15ActiveDOMObjectC2EPNS_8DocumentE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15ActiveDOMObjectC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15ActiveDOMObjectC2ERNS_8DocumentE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15ActiveDOMObjectD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15ActiveDOMObjectD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15ActiveDOMObjectD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15AsyncFileStream11openForReadERKN3WTF6StringExx() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15AsyncFileStream5closeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15AsyncFileStream7performEON3WTF8FunctionIFNS2_IFvRNS_16FileStreamClientEEEERNS_10FileStreamEEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15AsyncFileStreamC1ERNS_16FileStreamClientE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15AsyncFileStreamC2ERNS_16FileStreamClientE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15AsyncFileStreamD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15AsyncFileStreamD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15AsyncFileStreamdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15AsyncFileStreamdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15AsyncFileStreamnaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15AsyncFileStreamnaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15AsyncFileStreamnwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15AsyncFileStreamnwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15CSSFontFaceRule5styleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15CSSGroupingRule10deleteRuleEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15CSSGroupingRule10insertRuleERKN3WTF6StringEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15DOMWrapperWorld13clearWrappersEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15DOMWrapperWorldD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15DOMWrapperWorldD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15DatabaseManager10initializeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15DatabaseManager14setIsAvailableEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15DatabaseManager16hasOpenDatabasesERNS_8DocumentE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15DatabaseManager19fullPathForDatabaseERNS_14SecurityOriginERKN3WTF6StringEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15DatabaseManager23detailsForNameAndOriginERKN3WTF6StringERNS_14SecurityOriginE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15DatabaseManager9setClientEPNS_21DatabaseManagerClientE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15DatabaseTracker12deleteOriginERKNS_18SecurityOriginDataE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15DatabaseTracker13databaseNamesERKNS_18SecurityOriginDataE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15DatabaseTracker13isInitializedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15DatabaseTracker14deleteDatabaseERKNS_18SecurityOriginDataERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15DatabaseTracker17closeAllDatabasesENS_20CurrentQueryBehaviorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15DatabaseTracker19fullPathForDatabaseERKNS_18SecurityOriginDataERKN3WTF6StringEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15DatabaseTracker28deleteDatabasesModifiedSinceEN3WTF8WallTimeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15DatabaseTracker29deleteAllDatabasesImmediatelyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15DatabaseTracker5quotaERKNS_18SecurityOriginDataE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15DatabaseTracker5usageERKNS_18SecurityOriginDataE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15DatabaseTracker7originsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15DatabaseTracker9singletonEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15DeferredPromise6rejectENS_13ExceptionCodeERKN3WTF6StringENS_15RejectAsHandledE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15DeferredPromise6rejectENS_9ExceptionENS_15RejectAsHandledE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15FocusController10setFocusedEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15FocusController15setInitialFocusENS_14FocusDirectionEPNS_13KeyboardEventE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15FocusController20nextFocusableElementERNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15FocusController23relinquishFocusToChromeENS_14FocusDirectionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15FocusController24previousFocusableElementERNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15FocusController9setActiveEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15FontDescriptionC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15FontDescriptionC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15GraphicsContext15drawImageBufferERNS_11ImageBufferERKNS_10FloatPointERKNS_20ImagePaintingOptionsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15GraphicsContext15drawLineForTextERKNS_9FloatRectEbbNS_11StrokeStyleE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15GraphicsContext20endTransparencyLayerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15GraphicsContext22beginTransparencyLayerEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15GraphicsContext4saveEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15GraphicsContext7restoreEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15GraphicsContext9drawImageERNS_5ImageERKNS_10FloatPointERKNS_20ImagePaintingOptionsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15GraphicsContext9drawImageERNS_5ImageERKNS_9FloatRectERKNS_20ImagePaintingOptionsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15GraphicsContextD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15GraphicsContextD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15HTMLBaseElement7setHrefERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15HTMLFormElement13checkValidityEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15HTMLFormElement15setAutocompleteERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15HTMLFormElement25elementsForNativeBindingsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15HTMLFormElement5resetEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15HTMLFormElement6submitEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15HTMLLinkElement14setCrossOriginERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15HTMLLinkElement5setAsERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15HTMLLinkElement7relListEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15HTTPHeaderFieldC1EON3WTF6StringES3_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15HTTPHeaderFieldC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15HTTPHeaderFieldC2EON3WTF6StringES3_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15HTTPHeaderFieldC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15HTTPHeaderFieldD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15HTTPHeaderFieldD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15HTTPHeaderFieldaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15HitTestLocationC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15HitTestLocationC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15HitTestLocationC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15HitTestLocationC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15HitTestLocationD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15HitTestLocationD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSDOMWindowBase14finishCreationERN3JSC2VMEPNS_13JSWindowProxyE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSDOMWindowBase14updateDocumentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSDOMWindowBase15createStructureERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSDOMWindowBase25willRemoveFromWindowProxyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSDOMWindowBase4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSDOMWindowBaseD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSFetchResponse14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSFetchResponse15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSFetchResponse15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSFetchResponse15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSFetchResponse4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSFetchResponse9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSFetchResponse9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSFetchResponseC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSFetchResponseC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSFetchResponseD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSFetchResponseD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSFetchResponseaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSSVGSVGElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSSVGSVGElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSSVGSVGElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSSVGSVGElement15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSSVGSVGElement4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSSVGSVGElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSSVGSVGElement9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSSVGSVGElementC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSSVGSVGElementC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSSVGSVGElementD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15JSSVGSVGElementD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15NavigatorBeacon4fromERNS_9NavigatorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15PlatformDisplay13sharedDisplayEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15PlatformDisplay16sharingGLContextEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15PlatformDisplay27sharedDisplayForCompositingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15RenderBlockFlow30findClosestTextAtAbsolutePointERKNS_10FloatPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15ResourceRequest41updateFromDelegatePreservingOldPropertiesERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15SQLiteStatement10bindDoubleEid() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15SQLiteStatement14executeCommandEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15SQLiteStatement22isColumnDeclaredAsBlobEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15SQLiteStatement4stepEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15SQLiteStatement5resetEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15SQLiteStatement7bindIntEii() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15SQLiteStatement8bindBlobEiRKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15SQLiteStatement8bindNullEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15SQLiteStatement9bindInt64Eil() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15SQLiteStatementD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15SQLiteStatementD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15StringTruncator12leftTruncateERKN3WTF6StringEfRKNS_11FontCascadeERfbf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15StringTruncator13rightTruncateERKN3WTF6StringEfRKNS_11FontCascadeERfbf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15StringTruncator13rightTruncateERKN3WTF6StringEfRKNS_11FontCascadeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15StringTruncator14centerTruncateERKN3WTF6StringEfRKNS_11FontCascadeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15StringTruncator14centerTruncateERKN3WTF6StringEfRKNS_11FontCascadeERfbf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15StringTruncator15rightClipToWordERKN3WTF6StringEfRKNS_11FontCascadeERfbfb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15StringTruncator20rightClipToCharacterERKN3WTF6StringEfRKNS_11FontCascadeERfbf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15StringTruncator5widthERKN3WTF6StringERKNS_11FontCascadeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15UserInputBridge11loadRequestEONS_16FrameLoadRequestENS_11InputSourceE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15UserInputBridge12tryClosePageENS_11InputSourceE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15UserInputBridge14handleKeyEventERKNS_21PlatformKeyboardEventENS_11InputSourceE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15UserInputBridge17scrollRecursivelyENS_15ScrollDirectionENS_17ScrollGranularityENS_11InputSourceE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15UserInputBridge20handleAccessKeyEventERKNS_21PlatformKeyboardEventENS_11InputSourceE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15UserInputBridge20handleMouseMoveEventERKNS_18PlatformMouseEventENS_11InputSourceE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15UserInputBridge21handleMouseForceEventERKNS_18PlatformMouseEventENS_11InputSourceE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15UserInputBridge21handleMousePressEventERKNS_18PlatformMouseEventENS_11InputSourceE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15UserInputBridge23handleMouseReleaseEventERKNS_18PlatformMouseEventENS_11InputSourceE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15UserInputBridge24logicalScrollRecursivelyENS_22ScrollLogicalDirectionENS_17ScrollGranularityENS_11InputSourceE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15UserInputBridge31handleMouseMoveOnScrollbarEventERKNS_18PlatformMouseEventENS_11InputSourceE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15WindowEventLoop27breakToAllowRenderingUpdateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15XPathExpression8evaluateERNS_4NodeEtPNS_11XPathResultE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15XPathExpressionD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15XPathExpressionD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15XPathNSResolverC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15XPathNSResolverD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15XPathNSResolverD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15XPathNSResolverD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15addToBackingSetERN3JSC14JSGlobalObjectERNS0_8JSObjectENS0_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15clearBackingMapERN3JSC14JSGlobalObjectERNS0_8JSObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15clearBackingSetERN3JSC14JSGlobalObjectERNS0_8JSObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15createLiveRangeERKNS_11SimpleRangeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15defaultMIMETypeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15isDraggableLinkERKNS_7ElementE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15isEndOfDocumentERKNS_15VisiblePositionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15localizedStringEPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15makeSimpleRangeERKNS_5RangeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15makeSimpleRangeERNS_4NodeERKNS_14DocumentMarkerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15setToBackingMapERN3JSC14JSGlobalObjectERNS0_8JSObjectENS0_7JSValueES5_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15startOfDocumentEPKNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15startOfDocumentERKNS_15VisiblePositionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore15startOfSentenceERKNS_15VisiblePositionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16BackForwardCache10setMaxSizeEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16BackForwardCache14addIfCacheableERNS_11HistoryItemEPNS_4PageE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16BackForwardCache14pruneToSizeNowEjNS_13PruningReasonE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16BackForwardCache6removeERNS_11HistoryItemE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16BackForwardCache9singletonEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16BlobRegistryImpl17unregisterBlobURLERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16BlobRegistryImpl18appendStorageItemsEPNS_8BlobDataERKN3WTF6VectorINS_12BlobDataItemELm0ENS3_15CrashOnOverflowELm16ENS3_10FastMallocEEExx() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16BlobRegistryImpl20createResourceHandleERKNS_15ResourceRequestEPNS_20ResourceHandleClientE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16BlobRegistryImpl27populateBlobsForFileWritingERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEERNS2_INS0_18BlobForFileWritingELm0ES4_Lm16ES5_EE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16BlobRegistryImpl8blobSizeERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16BlobRegistryImplC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16BlobRegistryImplC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16BlobRegistryImplC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16BlobRegistryImplC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16BlobRegistryImplD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16BlobRegistryImplD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16BlobRegistryImplD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16BlobRegistryImpldaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16BlobRegistryImpldlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16BlobRegistryImplnaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16BlobRegistryImplnaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16BlobRegistryImplnwEm10NotNullTagPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16BlobRegistryImplnwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16BlobRegistryImplnwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16CSSParserContextC1ERKNS_8DocumentERKN3WTF3URLERKNS4_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16CSSParserContextC2ERKNS_8DocumentERKN3WTF3URLERKNS4_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16DOMGuardedObject16contextDestroyedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16DOMGuardedObject5clearEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16DOMGuardedObjectC1ERNS_17JSDOMGlobalObjectERN3JSC6JSCellE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16DOMGuardedObjectC2ERNS_17JSDOMGlobalObjectERN3JSC6JSCellE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16DOMGuardedObjectD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16DOMGuardedObjectD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16DOMGuardedObjectD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16DatabaseProviderC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16DatabaseProviderD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16DatabaseProviderD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16DatabaseProviderD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16DeviceMotionData6createEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16FileReaderLoader5startEPNS_22ScriptExecutionContextERNS_4BlobE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16FileReaderLoader6cancelEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16FileReaderLoaderC1ENS0_8ReadTypeEPNS_22FileReaderLoaderClientE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16FileReaderLoaderC2ENS0_8ReadTypeEPNS_22FileReaderLoaderClientE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16FontCascadeFonts23realizeFallbackRangesAtERKNS_22FontCascadeDescriptionEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16FontCascadeFontsD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16FontCascadeFontsD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16FrameLoadRequestC1EOS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16FrameLoadRequestC2EOS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16FrameLoadRequestD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16FrameLoadRequestD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16FrameLoadRequestaSEOS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLImageElement14setCrossOriginERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLImageElement8setWidthEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLImageElement9setHeightEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLInputElement10setCheckedEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLInputElement11selectColorEN3WTF10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLInputElement13setAutoFilledEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLInputElement16setIndeterminateEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLInputElement16setValueAsNumberEdNS_22TextFieldEventBehaviorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLInputElement21setShowAutoFillButtonENS_18AutoFillButtonTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLInputElement24setAutoFilledAndViewableEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLInputElement5filesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLInputElement6stepUpEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLInputElement7setSizeEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLInputElement7setTypeERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLInputElement8setWidthEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLInputElement8stepDownEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLInputElement9setHeightEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement11setControlsEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement12endScrubbingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement14beginScrubbingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement14exitFullscreenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement14setCrossOriginERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement14setCurrentTimeEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement15clearMediaCacheERKN3WTF6StringENS1_8WallTimeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement15enterFullscreenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement15togglePlayStateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement16allMediaElementsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement16returnToRealtimeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement19mediaCacheDirectoryEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement19originsInMediaCacheERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement22setMediaCacheDirectoryERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement23setWebkitPreservesPitchEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement25setCurrentTimeForBindingsEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement25setVideoFullscreenStandbyEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement26didBecomeFullscreenElementEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement27purgeBufferedDataIfPossibleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement29getCurrentMediaControlsStatusEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement30setWebkitClosedCaptionsVisibleEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement32prepareForVideoFullscreenStandbyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement36setOverridePreferredDynamicRangeModeENS_16DynamicRangeModeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement4loadEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement4playEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement5pauseEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement6rewindEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement8fastSeekERKN3WTF9MediaTimeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement8fastSeekEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement8setMutedEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLMediaElement9setVolumeEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLOListElement19setStartForBindingsEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLStyleElement11setDisabledEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLTableElement11createTBodyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLTableElement11createTFootEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLTableElement11createTHeadEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLTableElement11deleteTFootEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLTableElement11deleteTHeadEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLTableElement13createCaptionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLTableElement13deleteCaptionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLTableElement4rowsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLTableElement7tBodiesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLTableElement9deleteRowEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLTableElement9insertRowEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLVideoElement20webkitExitFullscreenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLVideoElement21webkitEnterFullscreenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLVideoElement24webkitSupportsFullscreenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLVideoElement26webkitDisplayingFullscreenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16HTMLVideoElement6createERNS_8DocumentE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16ISOSchemeTypeBox11boxTypeNameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16ISOSchemeTypeBox5parseERN3JSC8DataViewERj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16ISOSchemeTypeBoxC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16ISOSchemeTypeBoxC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16ISOSchemeTypeBoxC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16ISOSchemeTypeBoxC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16ISOSchemeTypeBoxD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16ISOSchemeTypeBoxD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16ISOSchemeTypeBoxD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16JSHTMLCollection9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16JSStringCallback11handleEventERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16JSStringCallback12callbackDataEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16JSStringCallback6createEPN3JSC8JSObjectEPNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16JSStringCallbackC1EPN3JSC8JSObjectEPNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16JSStringCallbackC2EPN3JSC8JSObjectEPNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16JSStringCallbackD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16JSStringCallbackD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16JSStringCallbackD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16JSStyleSheetList9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16JSXMLHttpRequest14finishCreationERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16JSXMLHttpRequest14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16JSXMLHttpRequest15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16JSXMLHttpRequest15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16JSXMLHttpRequest15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16JSXMLHttpRequest4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16JSXMLHttpRequest9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16JSXMLHttpRequest9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16JSXMLHttpRequestC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16JSXMLHttpRequestC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16JSXMLHttpRequestD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16JSXMLHttpRequestD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16MIMETypeRegistry13isXMLMIMETypeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16MIMETypeRegistry14isTextMIMETypeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16MIMETypeRegistry15canShowMIMETypeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16MIMETypeRegistry16allowedMIMETypesERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEES8_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16MIMETypeRegistry19isXMLEntityMIMETypeEN3WTF10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16MIMETypeRegistry21allowedFileExtensionsERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEES8_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16MIMETypeRegistry21extensionsForMIMETypeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16MIMETypeRegistry23isSupportedJSONMIMETypeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16MIMETypeRegistry23supportedImageMIMETypesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16MIMETypeRegistry23supportedMediaMIMETypesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16MIMETypeRegistry24isSupportedImageMIMETypeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16MIMETypeRegistry24isSupportedMediaMIMETypeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16MIMETypeRegistry24unsupportedTextMIMETypesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16MIMETypeRegistry25isPDFOrPostScriptMIMETypeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16MIMETypeRegistry26supportedNonImageMIMETypesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16MIMETypeRegistry27isSupportedNonImageMIMETypeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16MIMETypeRegistry28isSupportedTextTrackMIMETypeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16MIMETypeRegistry29isSupportedJavaScriptMIMETypeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16MIMETypeRegistry29preferredExtensionForMIMETypeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16MIMETypeRegistry30appendFileExtensionIfNecessaryERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16MIMETypeRegistry32containsImageMIMETypeForEncodingERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEES8_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16MIMETypeRegistry33preferredImageMIMETypeForEncodingERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEES8_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16MIMETypeRegistry34isSupportedImageVideoOrSVGMIMETypeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16NavigationActionC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16NavigationActionC1ERNS_8DocumentERKNS_15ResourceRequestENS_20InitiatedByMainFrameENS_14NavigationTypeENS_28ShouldOpenExternalURLsPolicyEPNS_5EventERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16NavigationActionC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16NavigationActionC2ERNS_8DocumentERKNS_15ResourceRequestENS_20InitiatedByMainFrameENS_14NavigationTypeENS_28ShouldOpenExternalURLsPolicyEPNS_5EventERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16NavigationActionD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16NavigationActionD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16NetworkSendQueue15processMessagesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16NetworkSendQueue5clearEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16NetworkSendQueue7enqueueEON3WTF7CStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16NetworkSendQueue7enqueueERKN3JSC11ArrayBufferEjj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16NetworkSendQueue7enqueueERNS_4BlobE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16NetworkSendQueueD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16NetworkSendQueueD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16SQLiteFileSystem18deleteDatabaseFileERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16SQLiteFileSystem29ensureDatabaseDirectoryExistsERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16ScriptController11createWorldERKN3WTF6StringENS0_9WorldTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16ScriptController11windowProxyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16ScriptController13jsWindowProxyERNS_15DOMWrapperWorldE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16ScriptController16createRootObjectEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16ScriptController17bindingRootObjectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16ScriptController17canExecuteScriptsENS_33ReasonForCallingCanExecuteScriptsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16ScriptController24jsObjectForPluginElementEPNS_17HTMLPlugInElementE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16ScriptController29cleanupScriptObjectsForPluginEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16ScriptController29executeUserAgentScriptInWorldERNS_15DOMWrapperWorldERKN3WTF6StringEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16ScriptController30executeScriptIgnoringExceptionERKN3WTF6StringEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16ScriptController37executeScriptInWorldIgnoringExceptionERNS_15DOMWrapperWorldERKN3WTF6StringEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16ScriptController41executeAsynchronousUserAgentScriptInWorldERNS_15DOMWrapperWorldEONS_23RunJavaScriptParametersEON3WTF17CompletionHandlerIFvNSt12experimental15fundamentals_v38expectedIN3JSC7JSValueENS_16ExceptionDetailsEEEEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16ScriptController46executeUserAgentScriptInWorldIgnoringExceptionERNS_15DOMWrapperWorldERKN3WTF6StringEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16ThreadGlobalDataC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16ThreadGlobalDataC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16ThreadGlobalDataD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16ThreadGlobalDataD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16TrackPrivateBase13willBeRemovedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16TrackPrivateBaseC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16TrackPrivateBaseD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16TrackPrivateBaseD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16TrackPrivateBaseD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16TrackPrivateBasedaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16TrackPrivateBasedlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16TrackPrivateBasenaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16TrackPrivateBasenaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16TrackPrivateBasenwEm10NotNullTagPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16TrackPrivateBasenwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16TrackPrivateBasenwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16UserGestureToken60setMaximumIntervalForUserGestureForwardingForFetchForTestingEN3WTF7SecondsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16UserGestureTokenD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16UserGestureTokenD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16VisibleSelection20adjustPositionForEndERKNS_8PositionEPNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16VisibleSelection22adjustPositionForStartERKNS_8PositionEPNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16VisibleSelection22expandUsingGranularityENS_15TextGranularityE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16VisibleSelection27selectionFromContentsOfNodeEPNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16VisibleSelectionC1ERKNS_15VisiblePositionES3_b() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16VisibleSelectionC1ERKNS_15VisiblePositionEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16VisibleSelectionC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16VisibleSelectionC2ERKNS_15VisiblePositionES3_b() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16VisibleSelectionC2ERKNS_15VisiblePositionEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16VisibleSelectionC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16VisitedLinkStore23invalidateStylesForLinkEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16VisitedLinkStore27invalidateStylesForAllLinksEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16VisitedLinkStoreC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16VisitedLinkStoreD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16VisitedLinkStoreD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16VisitedLinkStoreD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16convertToIntegerIaEET_RN3JSC14JSGlobalObjectENS2_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16convertToIntegerIhEET_RN3JSC14JSGlobalObjectENS2_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16convertToIntegerIiEET_RN3JSC14JSGlobalObjectENS2_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16convertToIntegerIjEET_RN3JSC14JSGlobalObjectENS2_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16convertToIntegerIlEET_RN3JSC14JSGlobalObjectENS2_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16convertToIntegerImEET_RN3JSC14JSGlobalObjectENS2_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16convertToIntegerIsEET_RN3JSC14JSGlobalObjectENS2_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16convertToIntegerItEET_RN3JSC14JSGlobalObjectENS2_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16enclosingIntRectERKNS_10LayoutRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16enclosingIntRectERKNS_9FloatRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16findIntersectionERKNS_10FloatPointES2_S2_S2_RS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16isEndOfParagraphERKNS_15VisiblePositionENS_27EditingBoundaryCrossingRuleE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16nextWordPositionERKNS_15VisiblePositionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16parseHTMLIntegerEN3WTF10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16startOfParagraphERKNS_15VisiblePositionENS_27EditingBoundaryCrossingRuleE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore16valueToUSVStringERN3JSC14JSGlobalObjectENS0_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17CharacterIterator7advanceEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17CredentialStorage16clearCredentialsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17CredentialStorage24getFromPersistentStorageERKNS_15ProtectionSpaceE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17CredentialStorage27removeCredentialsWithOriginERKNS_18SecurityOriginDataE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17CredentialStorage3getERKN3WTF6StringERKNS1_3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17CredentialStorage3getERKN3WTF6StringERKNS_15ProtectionSpaceE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17CredentialStorage3setERKN3WTF6StringERKNS_10CredentialERKNS1_3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17CredentialStorage3setERKN3WTF6StringERKNS_10CredentialERKNS_15ProtectionSpaceERKNS1_3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17CredentialStorage6removeERKN3WTF6StringERKNS_15ProtectionSpaceE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17DOMImplementation19createCSSStyleSheetERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17DebugPageOverlays15settingsChangedERNS_4PageE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17FullscreenManager16cancelFullscreenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17FullscreenManager17didExitFullscreenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17FullscreenManager18didEnterFullscreenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17FullscreenManager18willExitFullscreenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17FullscreenManager19willEnterFullscreenERNS_7ElementE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17FullscreenManager22setAnimatingFullscreenEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17FullscreenManager27setFullscreenControlsHiddenEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17HTMLAnchorElement4textEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17HTMLAnchorElement7relListEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17HTMLButtonElement7setTypeERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17HTMLCanvasElement25setUsesDisplayListDrawingEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17HTMLCanvasElement8setWidthEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17HTMLCanvasElement9setHeightEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17HTMLCanvasElement9toDataURLERKN3WTF6StringEN3JSC7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17HTMLCanvasElement9toDataURLERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17HTMLOptionElement11setSelectedEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17HTMLPlugInElement14setReplacementENS_20RenderEmbeddedObject26PluginUnavailabilityReasonERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17HTMLPlugInElement21isReplacementObscuredEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17HTMLScriptElement14setCrossOriginERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17HTMLScriptElement8setAsyncEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17HTMLSelectElement16setSelectedIndexEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17HTMLSelectElement20optionSelectedByUserEibb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17HTMLSelectElement4itemEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17HTMLSelectElement6removeEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17HTMLSelectElement7optionsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17HTMLSelectElement7setSizeEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17HTMLSelectElement8setValueERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17HTMLSelectElement9namedItemERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSDOMGlobalObject12globalObjectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSDOMGlobalObject14finishCreationERN3JSC2VMEPNS1_8JSObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSDOMGlobalObject14finishCreationERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSDOMGlobalObject15createStructureERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSDOMGlobalObject17addBuiltinGlobalsERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSDOMGlobalObject21offsetOfWorldIsNormalEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSDOMGlobalObject24builtinInternalFunctionsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSDOMGlobalObject4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSDOMGlobalObject5worldEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSDOMGlobalObject6gcLockEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSDOMGlobalObjectD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSDOMGlobalObjectD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSDOMRectReadOnly14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSDOMRectReadOnly15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSDOMRectReadOnly15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSDOMRectReadOnly15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSDOMRectReadOnly4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSDOMRectReadOnly9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSDOMRectReadOnly9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSDOMRectReadOnlyC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSDOMRectReadOnlyC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSDOMRectReadOnlyD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSDOMRectReadOnlyD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSDOMRectReadOnlyaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSHTMLLinkElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSHTMLLinkElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSHTMLLinkElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSHTMLLinkElement15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSHTMLLinkElement4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSHTMLLinkElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSHTMLLinkElement9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSHTMLLinkElementC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSHTMLLinkElementC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSHTMLLinkElementD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSHTMLLinkElementD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17JSXPathExpression9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17LinkIconCollector12iconsOfTypesEN3WTF9OptionSetINS_12LinkIconTypeEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17MouseRelatedEvent7offsetXEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17MouseRelatedEvent7offsetYEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17NowPlayingManagerC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17NowPlayingManagerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17NowPlayingManagerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17NowPlayingManagerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17NowPlayingManagerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17NowPlayingManagerdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17NowPlayingManagerdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17NowPlayingManagernaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17NowPlayingManagernwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17NowPlayingManagernwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17PageConfigurationD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17PageConsoleClient10addMessageEN3JSC13MessageSourceENS1_12MessageLevelERKN3WTF6StringEmPNS_8DocumentE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17PageConsoleClient10countResetEPN3JSC14JSGlobalObjectERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17PageConsoleClient10profileEndEPN3JSC14JSGlobalObjectERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17PageConsoleClient16takeHeapSnapshotEPN3JSC14JSGlobalObjectERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17PageConsoleClient21shouldPrintExceptionsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17PageConsoleClient24setShouldPrintExceptionsEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17PageConsoleClient4muteEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17PageConsoleClient4timeEPN3JSC14JSGlobalObjectERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17PageConsoleClient5countEPN3JSC14JSGlobalObjectERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17PageConsoleClient6unmuteEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17PageConsoleClient7profileEPN3JSC14JSGlobalObjectERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17PageConsoleClient7timeEndEPN3JSC14JSGlobalObjectERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17PageConsoleClientC1ERNS_4PageE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17PageConsoleClientC2ERNS_4PageE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17PageConsoleClientD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17PageConsoleClientD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17PageConsoleClientD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17PageConsoleClientdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17PageConsoleClientdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17PageConsoleClientnaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17PageConsoleClientnaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17PageConsoleClientnwEm10NotNullTagPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17PageConsoleClientnwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17PageConsoleClientnwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17ResourceErrorBase7setTypeENS0_4TypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17SQLiteTransaction5beginEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17SQLiteTransaction6commitEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17SQLiteTransaction8rollbackEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17SQLiteTransactionC1ERNS_14SQLiteDatabaseEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17SQLiteTransactionC2ERNS_14SQLiteDatabaseEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17SQLiteTransactionD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17SQLiteTransactionD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17TextureMapperTile5paintERNS_13TextureMapperERKNS_20TransformationMatrixEfj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17cacheDOMStructureERNS_17JSDOMGlobalObjectEPN3JSC9StructureEPKNS2_9ClassInfoE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17computeCurrentAgeERKNS_16ResourceResponseEN3WTF8WallTimeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17cssValueKeywordIDEN3WTF10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17isStartOfDocumentERKNS_15VisiblePositionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17standardUserAgentERKN3WTF6StringES3_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore17valueToByteStringERN3JSC14JSGlobalObjectENS0_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18CustomHeaderFieldsC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18CustomHeaderFieldsC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18CustomHeaderFieldsC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18CustomHeaderFieldsC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18CustomHeaderFieldsD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18CustomHeaderFieldsD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18CustomHeaderFieldsaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18DOMWindowExtensionD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18DOMWindowExtensionD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18DOMWindowExtensionD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18EventLoopTaskGroup14queueMicrotaskEON3WTF8FunctionIFvvEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18EventLoopTaskGroup9queueTaskENS_10TaskSourceEON3WTF8FunctionIFvvEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18HTMLMarqueeElement15setScrollAmountEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18HTMLMarqueeElement4stopEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18HTMLMarqueeElement5startEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18HTMLMarqueeElement7setLoopEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18ImageBufferBackend19sinkIntoNativeImageEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18ImageBufferBackend22convertToLuminanceMaskEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18ImageBufferBackendD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18ImageBufferBackendD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18ImageBufferBackendD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18InspectorPageAgent7frameIdEPNS_5FrameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLImageElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLImageElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLImageElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLImageElement15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLImageElement4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLImageElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLImageElement9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLImageElementC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLImageElementC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLImageElementD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLImageElementD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLInputElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLInputElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLInputElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLInputElement15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLInputElement4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLInputElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLInputElement9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLInputElementC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLInputElementD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLInputElementD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLMediaElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLMediaElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLMediaElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLMediaElement15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLMediaElement4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLMediaElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLMediaElement9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLMediaElementC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLMediaElementC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLMediaElementD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLMediaElementD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLVideoElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLVideoElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLVideoElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLVideoElement15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLVideoElement4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLVideoElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLVideoElement9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLVideoElementC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLVideoElementC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLVideoElementD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18JSHTMLVideoElementD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18ParsedContentRangeC1ERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18ParsedContentRangeC1Elll() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18ParsedContentRangeC2ERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18ParsedContentRangeC2Elll() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PerformanceLogging21memoryUsageStatisticsENS_34ShouldIncludeExpensiveComputationsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PerformanceLogging22javaScriptObjectCountsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformPasteboard5writeERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformPasteboard5writeERKN3WTF6VectorINS_20PasteboardCustomDataELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformPasteboard5writeERKNS_20PasteboardCustomDataE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformPasteboard5writeERKNS_20PasteboardWebContentE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformPasteboardC1ERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformPasteboardC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformPasteboardC2ERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformPasteboardC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformTimeRanges13intersectWithERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformTimeRanges3addERKN3WTF9MediaTimeES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformTimeRanges5clearEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformTimeRanges6invertEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformTimeRanges9unionWithERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformTimeRangesC1EON3WTF6VectorINS0_5RangeELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformTimeRangesC1ERKN3WTF9MediaTimeES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformTimeRangesC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformTimeRangesC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformTimeRangesC2EON3WTF6VectorINS0_5RangeELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformTimeRangesC2ERKN3WTF9MediaTimeES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformTimeRangesC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformTimeRangesC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformTimeRangesD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformTimeRangesD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformTimeRangesaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformTimeRangesdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformTimeRangesdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformTimeRangesnaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformTimeRangesnwEm10NotNullTagPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformTimeRangesnwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PlatformTimeRangesnwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PluginInfoProvider10removePageERNS_4PageE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PluginInfoProvider20clearPagesPluginDataEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PluginInfoProvider7addPageERNS_4PageE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PluginInfoProvider7refreshEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PluginInfoProviderC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PluginInfoProviderD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PluginInfoProviderD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PluginInfoProviderD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PrewarmInformationC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PrewarmInformationC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PrewarmInformationC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PrewarmInformationC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PrewarmInformationD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PrewarmInformationD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PrewarmInformationaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PrewarmInformationdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PrewarmInformationdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PrewarmInformationnaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PrewarmInformationnwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18PrewarmInformationnwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18RenderLayerBacking25setUsesDisplayListDrawingEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18RenderLayerBacking30setIsTrackingDisplayListReplayEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18StyleSheetContents11parseStringERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18StyleSheetContentsC1EPNS_15StyleRuleImportERKN3WTF6StringERKNS_16CSSParserContextE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18StyleSheetContentsC2EPNS_15StyleRuleImportERKN3WTF6StringERKNS_16CSSParserContextE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18StyleSheetContentsD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18StyleSheetContentsD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer10setFiltersERKNS_16FilterOperationsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer10setOpacityEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer11setChildrenERKN3WTF6VectorIPS0_Lm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer11setPositionERKNS_10FloatPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer12setMaskLayerEPS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer12setTransformERKNS_20TransformationMatrixE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer12sortByZOrderERN3WTF6VectorIPS0_Lm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer13setAnimationsERKN7Nicosia10AnimationsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer13setSolidColorERKNS_5ColorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer14setAnchorPointERKNS_12FloatPoint3DE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer14setPreserves3DEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer14syncAnimationsEN3WTF13MonotonicTimeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer15setBackingStoreEPNS_25TextureMapperBackingStoreE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer15setContentsRectERKNS_9FloatRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer15setDebugVisualsEbRKNS_5ColorEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer15setDrawsContentEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer15setReplicaLayerEPS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer16removeFromParentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer16replicaTransformEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer16setBackdropLayerEPS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer16setContentsLayerEPNS_26TextureMapperPlatformLayerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer16setMasksToBoundsEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer17removeAllChildrenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer17setContentsOpaqueEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer17setRepaintCounterEbi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer18setContentsVisibleEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer19setContentsTileSizeERKNS_9FloatSizeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer20setChildrenTransformERKNS_20TransformationMatrixE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer20setContentsTilePhaseERKNS_9FloatSizeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer21setBackfaceVisibilityEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer23setContentsClippingRectERKNS_16FloatRoundedRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer26applyAnimationsRecursivelyEN3WTF13MonotonicTimeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer29setAnimatedBackingStoreClientEPN7Nicosia26AnimatedBackingStoreClientE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer2idEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer5setIDEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer7setSizeERKNS_9FloatSizeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayer8addChildEPS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayerC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayerdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayerdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayernaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayernaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayernwEm10NotNullTagPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayernwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18TextureMapperLayernwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18composedTreeAsTextERNS_13ContainerNodeENS_22ComposedTreeAsTextModeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18documentTypeStringERKNS_8DocumentE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18isEditablePositionERKNS_8PositionENS_12EditableTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18isStartOfParagraphERKNS_15VisiblePositionENS_27EditingBoundaryCrossingRuleE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18isValidContentTypeERKN3WTF6StringENS_4ModeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18platformStrategiesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18pluginScriptObjectEPN3JSC14JSGlobalObjectEPNS_13JSHTMLElementE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18pluginTooSmallTextEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore18throwThisTypeErrorERN3JSC14JSGlobalObjectERNS0_10ThrowScopeEPKcS6_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19AccessibilityObject13isARIAControlENS_17AccessibilityRoleE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19AccessibilityObject21ariaRoleToWebCoreRoleERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19BlurFilterOperation6createENS_6LengthE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19BlurFilterOperationC1ENS_6LengthE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19BlurFilterOperationC2ENS_6LengthE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19BlurFilterOperationD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19BlurFilterOperationD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19BlurFilterOperationD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19HTMLTableColElement7setSpanEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19HTMLTableRowElement10deleteCellEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19HTMLTableRowElement10insertCellEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19HTMLTableRowElement5cellsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19HTMLTextAreaElement7setColsEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19HTMLTextAreaElement7setRowsEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19InspectorController13setIndicatingEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19InspectorController15connectFrontendERN9Inspector15FrontendChannelEbb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19InspectorController15ensurePageAgentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19InspectorController18disconnectFrontendERN9Inspector15FrontendChannelE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19InspectorController22disconnectAllFrontendsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19InspectorController25evaluateForTestInFrontendERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19InspectorController26setInspectorFrontendClientEPNS_23InspectorFrontendClientE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19InspectorController27dispatchMessageFromFrontendERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19InspectorController4showEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSAnimationTimeline14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSAnimationTimeline15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSAnimationTimeline15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSAnimationTimeline15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSAnimationTimeline4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSAnimationTimeline9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSAnimationTimeline9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSAnimationTimelineC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSAnimationTimelineC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSAnimationTimelineD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSAnimationTimelineD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSAnimationTimelineaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSDOMImplementation9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSDOMMatrixReadOnly14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSDOMMatrixReadOnly15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSDOMMatrixReadOnly15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSDOMMatrixReadOnly15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSDOMMatrixReadOnly4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSDOMMatrixReadOnly9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSDOMMatrixReadOnly9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSDOMMatrixReadOnlyC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSDOMMatrixReadOnlyC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSDOMMatrixReadOnlyD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSDOMMatrixReadOnlyD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSDOMMatrixReadOnlyaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSHTMLSelectElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSHTMLSelectElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSHTMLSelectElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSHTMLSelectElement15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSHTMLSelectElement4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSHTMLSelectElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSHTMLSelectElement9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSHTMLSelectElementC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSHTMLSelectElementC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSHTMLSelectElementD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19JSHTMLSelectElementD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19MediaElementSession22addBehaviorRestrictionEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19MediaElementSession25removeBehaviorRestrictionEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19MediaElementSession25updateMediaUsageIfChangedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19MediaResourceLoader25recordResponsesForTestingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19MediaResourceLoaderD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19MediaResourceLoaderD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19MediaResourceLoaderD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ProtectionSpaceBase7compareERKNS_15ProtectionSpaceES3_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase11setPriorityENS_20ResourceLoadPriorityE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase12clearPurposeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase12setIsTopSiteEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase13partitionNameERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase13setHTTPMethodERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase13setIsSameSiteEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase14setCachePolicyENS_26ResourceRequestCachePolicyE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase15clearHTTPOriginEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase15setHTTPReferrerERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase16setHTTPUserAgentERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase17clearHTTPReferrerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase17makeUnconditionalEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase17setAsIsolatedCopyERKNS_15ResourceRequestE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase17setCachePartitionERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase18addHTTPHeaderFieldENS_14HTTPHeaderNameERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase18addHTTPHeaderFieldERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase18setHTTPContentTypeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase18setHTTPHeaderFieldENS_14HTTPHeaderNameERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase18setHTTPHeaderFieldERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase19setHTTPHeaderFieldsENS_13HTTPHeaderMapE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase20clearHTTPContentTypeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase22clearHTTPAuthorizationEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase22defaultTimeoutIntervalEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase23setFirstPartyForCookiesERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase25setDefaultTimeoutIntervalEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase30addHTTPHeaderFieldIfNotPresentENS_14HTTPHeaderNameERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase37setExistingHTTPReferrerToOriginStringEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase50setResponseContentDispositionEncodingFallbackArrayERKN3WTF6StringES4_S4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase5equalERKNS_15ResourceRequestES3_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19ResourceRequestBase6setURLERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19StorageQuotaManager20resetQuotaForTestingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19StorageQuotaManager24requestSpaceOnMainThreadEmON3WTF17CompletionHandlerIFvNS0_8DecisionEEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19StorageQuotaManager30requestSpaceOnBackgroundThreadEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19StorageQuotaManager39resetQuotaUpdatedBasedOnUsageForTestingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19TextResourceDecoder14decodeAndFlushEPKcm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19TextResourceDecoder5flushEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19TextResourceDecoder6decodeEPKcm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19TextResourceDecoderD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19TextResourceDecoderD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19TextTrackCueGeneric6createERNS_22ScriptExecutionContextERKN3WTF9MediaTimeES6_RKNS3_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19UserContentProvider54invalidateInjectedStyleSheetCacheInAllFramesInAllPagesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19UserContentProvider60invalidateAllRegisteredUserMessageHandlerInvalidationClientsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19UserContentProviderC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19UserContentProviderD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19UserContentProviderD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19UserContentProviderD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19enclosingLayoutRectERKNS_9FloatRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19floatValueForLengthERKNS_6LengthEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19makeMapBetweenRectsERKNS_9FloatRectES2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19serializationForCSSERKNS_5ColorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19toAutofillFieldNameERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19unitedBoundingBoxesERKN3WTF6VectorINS_9FloatQuadELm0ENS0_15CrashOnOverflowELm16ENS0_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore19watchAdaptationNameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ApplicationCacheHost17maybeLoadResourceERNS_14ResourceLoaderERKNS_15ResourceRequestERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ApplicationCacheHost25maybeLoadFallbackForErrorEPNS_14ResourceLoaderERKNS_13ResourceErrorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ApplicationCacheHost28maybeLoadFallbackForRedirectEPNS_14ResourceLoaderERNS_15ResourceRequestERKNS_16ResourceResponseE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ApplicationCacheHost28maybeLoadFallbackForResponseEPNS_14ResourceLoaderERKNS_16ResourceResponseE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20CanvasActivityRecord27recordWrittenOrMeasuredTextERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20FocusNavigationScope7scopeOfERNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20HTMLFrameElementBase11setLocationERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20HTMLTableCellElement10setColSpanEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20HTMLTableCellElement21setRowSpanForBindingsEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20HTMLTableCellElement8setScopeERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ISOOriginalFormatBox11boxTypeNameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ISOOriginalFormatBox5parseERN3JSC8DataViewERj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ISOOriginalFormatBoxC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ISOOriginalFormatBoxC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ISOOriginalFormatBoxC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ISOOriginalFormatBoxC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ISOOriginalFormatBoxD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ISOOriginalFormatBoxD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ISOOriginalFormatBoxD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ISOOriginalFormatBoxaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry15isBuiltinSchemeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry24registerURLSchemeAsLocalERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry25registerURLSchemeAsSecureERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry27registerURLSchemeAsNoAccessERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry30registerURLSchemeAsCORSEnabledERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry32registerURLSchemeAsEmptyDocumentERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry34registerURLSchemeAsDisplayIsolatedERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry35registerURLSchemeAsCachePartitionedERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry36allURLSchemesRegisteredAsCORSEnabledEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry36registerAsCanDisplayOnlyIfCanRequestERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry36registerURLSchemeAsAlwaysRevalidatedERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry40setDomainRelaxationForbiddenForURLSchemeEbRKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry49registerURLSchemeAsBypassingContentSecurityPolicyERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry57removeURLSchemeRegisteredAsBypassingContentSecurityPolicyERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry58registerURLSchemeAsAllowingDatabaseAccessInPrivateBrowsingERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20LowPowerModeNotifierC1EON3WTF8FunctionIFvbEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20LowPowerModeNotifierC2EON3WTF8FunctionIFvbEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20LowPowerModeNotifierD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20LowPowerModeNotifierD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20NetworkStateNotifier11addListenerEON3WTF8FunctionIFvbEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20NetworkStateNotifier6onLineEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20NetworkStateNotifier9singletonEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardCustomData16fromSharedBufferERKNS_12SharedBufferE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardCustomData22fromPersistenceDecoderEON3WTF11Persistence7DecoderE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardCustomData5EntryC1EOS1_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardCustomData5EntryC1ERKS1_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardCustomData5EntryC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardCustomData5EntryC2EOS1_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardCustomData5EntryC2ERKS1_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardCustomData5EntryC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardCustomData5EntryaSEOS1_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardCustomData5EntryaSERKS1_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardCustomDataC1EON3WTF6StringEONS1_6VectorINS0_5EntryELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardCustomDataC1EOS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardCustomDataC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardCustomDataC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardCustomDataC2EON3WTF6StringEONS1_6VectorINS0_5EntryELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardCustomDataC2EOS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardCustomDataC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardCustomDataC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardCustomDataD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardCustomDataD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardCustomDataaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardWriterData10WebContentD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardWriterData10WebContentD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardWriterDataC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardWriterDataC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardWriterDataD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20PasteboardWriterDataD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20RenderEmbeddedObject29setPluginUnavailabilityReasonENS0_26PluginUnavailabilityReasonE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20RenderEmbeddedObject37setUnavailablePluginIndicatorIsHiddenEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20RenderEmbeddedObject44setPluginUnavailabilityReasonWithDescriptionENS0_26PluginUnavailabilityReasonERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ResourceHandleClientC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ResourceHandleClientD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ResourceHandleClientD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ResourceLoadObserver14sharedIfExistsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ResourceLoadObserver6sharedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ResourceLoadObserver9setSharedERS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ResourceResponseBase17setHTTPStatusCodeEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ResourceResponseBase18addHTTPHeaderFieldENS_14HTTPHeaderNameERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ResourceResponseBase18addHTTPHeaderFieldERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ResourceResponseBase18setHTTPHeaderFieldENS_14HTTPHeaderNameERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ResourceResponseBase18setHTTPHeaderFieldERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ResourceResponseBase24sanitizeHTTPHeaderFieldsENS0_16SanitizationTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ResourceResponseBase24setExpectedContentLengthEx() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ResourceResponseBase25sanitizeSuggestedFilenameERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ResourceResponseBase25syntheticRedirectResponseERKN3WTF3URLES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ResourceResponseBase6setURLERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ResourceResponseBase7setTypeENS0_4TypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ResourceResponseBaseC1ERKN3WTF3URLERKNS1_6StringExS7_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ResourceResponseBaseC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ResourceResponseBaseC2ERKN3WTF3URLERKNS1_6StringExS7_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ResourceResponseBaseC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20SVGPathStringBuilder12curveToCubicERKNS_10FloatPointES3_S3_NS_18PathCoordinateModeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20SVGPathStringBuilder16curveToQuadraticERKNS_10FloatPointES3_NS_18PathCoordinateModeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20SVGPathStringBuilder6lineToERKNS_10FloatPointENS_18PathCoordinateModeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20SVGPathStringBuilder6moveToERKNS_10FloatPointEbNS_18PathCoordinateModeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20SVGPathStringBuilder6resultEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20SVGPathStringBuilder9closePathEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20SVGPathStringBuilderC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20SVGPathStringBuilderD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20SVGPathStringBuilderD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20SVGPathStringBuilderD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ScrollingCoordinator13pageDestroyedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20ScrollingCoordinator45setForceSynchronousScrollLayerPositionUpdatesEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20UserGestureIndicator18currentUserGestureEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20UserGestureIndicator29processingUserGestureForMediaEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20UserGestureIndicatorD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20UserGestureIndicatorD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20endOfEditableContentERKNS_15VisiblePositionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20findClosestPlainTextERKNS_11SimpleRangeERKN3WTF6StringENS3_9OptionSetINS_14FindOptionFlagEEEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20httpHeaderNameStringENS_14HTTPHeaderNameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20lastOffsetForEditingERKNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20nextSentencePositionERKNS_15VisiblePositionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20previousWordPositionERKNS_15VisiblePositionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore20serializationForHTMLERKNS_5ColorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21AudioHardwareListener6createERNS0_6ClientE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21BackForwardController11currentItemEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21BackForwardController11forwardItemEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21BackForwardController11itemAtIndexEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21BackForwardController6goBackEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21BackForwardController8backItemEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21BackForwardController9goForwardEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21BlobDataFileReference16revokeFileAccessEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21BlobDataFileReference20prepareForFileAccessEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21BlobDataFileReference26startTrackingModificationsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21BlobDataFileReference4pathEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21BlobDataFileReference4sizeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21BlobDataFileReference6createERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21BlobDataFileReferenceC1ERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21BlobDataFileReferenceC2ERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21BlobDataFileReferenceD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21BlobDataFileReferenceD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21BlobDataFileReferenceD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21ComplexTextController14ComplexTextRunC1ERKN3WTF6VectorINS_9FloatSizeELm0ENS2_15CrashOnOverflowELm16ENS2_10FastMallocEEERKNS3_INS_10FloatPointELm0ES5_Lm16ES6_EERKNS3_ItLm0ES5_Lm16ES6_EERKNS3_IjLm0ES5_Lm16ES6_EES4_RKNS_4FontEPKDsjjjjb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21ComplexTextController14ComplexTextRunC2ERKN3WTF6VectorINS_9FloatSizeELm0ENS2_15CrashOnOverflowELm16ENS2_10FastMallocEEERKNS3_INS_10FloatPointELm0ES5_Lm16ES6_EERKNS3_ItLm0ES5_Lm16ES6_EERKNS3_IjLm0ES5_Lm16ES6_EES4_RKNS_4FontEPKDsjjjjb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21ContentSecurityPolicy17didReceiveHeadersERKNS_36ContentSecurityPolicyResponseHeadersEON3WTF6StringENS0_19ReportParsingErrorsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21ContentSecurityPolicyD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21ContentSecurityPolicyD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys10webViewKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys11cpuUsageKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys11inactiveKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys11occurredKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys11timedOutKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys12retrievalKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys13webGLStateKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys14streamingMediaEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys15isAttachmentKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys15networkCacheKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys15revalidatingKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys16internalErrorKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys16notHTTPFamilyKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys17userZoomActionKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys18neverSeenBeforeKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys18noLongerInCacheKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys18nonVisibleStateKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys18unlikelyToReuseKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys19invalidSessionIDKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys19retrievalRequestKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys20needsRevalidationKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys20telemetryPageLoadKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys21domainCausingCrashKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys21simulatedPageCrashKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys22backNavigationDeltaKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys22cacheControlNoStoreKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys22domainCausingJetsamKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys22unknownEntryRequestKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys23isConditionalRequestKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys24activeInForegroundTabKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys24networkProcessCrashedKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys24uncacheableStatusCodeKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys24unsupportedHTTPMethodKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys24varyingHeaderMismatchKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys24visibleAndActiveStateKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys24visibleNonActiveStateKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys25failedLessThan2SecondsKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys25failedLessThan5SecondsKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys25missingValidatorFieldsKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys26entryRightlyNotWarmedUpKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys26entryWronglyNotWarmedUpKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys26failedLessThan20SecondsKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys26failedMoreThan20SecondsKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys27canceledLessThan2SecondsKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys27canceledLessThan5SecondsKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys27createSharedBufferFailedKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys27networkCacheReuseFailureKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys27networkCacheUnusedReasonKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys27synchronousMessageFailedKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys28activeInBackgroundTabOnlyKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys28canceledLessThan20SecondsKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys28canceledMoreThan20SecondsKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys28exceededActiveMemoryLimitKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys28isReloadIgnoringCacheDataKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys28networkCacheFailureReasonKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys28succeededLessThan2SecondsKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys28succeededLessThan5SecondsKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys29exceededBackgroundCPULimitKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys29succeededLessThan20SecondsKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys29succeededMoreThan20SecondsKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys30exceededInactiveMemoryLimitKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys33memoryUsageToDiagnosticLoggingKeyEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys40backgroundCPUUsageToDiagnosticLoggingKeyEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys40foregroundCPUUsageToDiagnosticLoggingKeyEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys42wastedSpeculativeWarmupWithRevalidationKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys45wastedSpeculativeWarmupWithoutRevalidationKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys46successfulSpeculativeWarmupWithRevalidationKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys49successfulSpeculativeWarmupWithoutRevalidationKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys8otherKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys9unusedKeyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DisplayRefreshMonitorC2Ej() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DisplayRefreshMonitorD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DisplayRefreshMonitorD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21DisplayRefreshMonitorD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21HTMLOptionsCollection16setSelectedIndexEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21HTMLOptionsCollection6removeEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21HTMLOptionsCollection9setLengthEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21ISOTrackEncryptionBox11boxTypeNameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21ISOTrackEncryptionBox5parseERN3JSC8DataViewERj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21ISOTrackEncryptionBoxC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21ISOTrackEncryptionBoxC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21ISOTrackEncryptionBoxC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21ISOTrackEncryptionBoxD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21ISOTrackEncryptionBoxD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21ISOTrackEncryptionBoxD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21InspectorFrontendHost16disconnectClientEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21InspectorFrontendHost28addSelfToGlobalObjectInWorldERNS_15DOMWrapperWorldE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21InspectorFrontendHostC1EPNS_23InspectorFrontendClientEPNS_4PageE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21InspectorFrontendHostC2EPNS_23InspectorFrontendClientEPNS_4PageE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21InspectorFrontendHostD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21InspectorFrontendHostD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21JSCSSStyleDeclaration14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21JSCSSStyleDeclaration15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21JSCSSStyleDeclaration15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21JSCSSStyleDeclaration15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21JSCSSStyleDeclaration4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21JSCSSStyleDeclaration9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21JSCSSStyleDeclaration9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21JSCSSStyleDeclarationC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21JSCSSStyleDeclarationC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21JSCSSStyleDeclarationD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21JSCSSStyleDeclarationD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21JSCSSStyleDeclarationaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21JSDeprecatedCSSOMRect9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21JSRemoteDOMWindowBase4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21JSRemoteDOMWindowBaseD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21JSRemoteDOMWindowBaseD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21JSTextTrackCueGeneric15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21JSTextTrackCueGeneric15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21JSTextTrackCueGeneric15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21JSTextTrackCueGeneric4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21JSTextTrackCueGeneric9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21JSTextTrackCueGeneric9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21JSTextTrackCueGenericD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21JSTextTrackCueGenericD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21MediaRecorderProviderC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21MediaRecorderProviderC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21MediaRecorderProviderC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21MediaRecorderProviderC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21MediaRecorderProviderD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21MediaRecorderProviderD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21MediaRecorderProviderD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21MediaRecorderProvideraSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21MediaRecorderProviderdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21MediaRecorderProviderdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21MediaRecorderProvidernaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21MediaRecorderProvidernaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21MediaRecorderProvidernwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21MediaRecorderProvidernwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21NetworkStorageSession10getCookiesERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21NetworkStorageSession10setCookiesERKN3WTF6VectorINS_6CookieELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEERKNS1_3URLESB_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21NetworkStorageSession13getAllCookiesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21NetworkStorageSession17domCookiesForHostERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21NetworkStorageSession22processMayUseCookieAPIEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21NetworkStorageSession22removeAllStorageAccessEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21NetworkStorageSession27permitProcessToUseCookieAPIEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21NetworkStorageSession29setAllCookiesToSameSiteStrictERKNS_17RegistrableDomainEON3WTF17CompletionHandlerIFvvEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21NetworkStorageSession31setThirdPartyCookieBlockingModeENS_28ThirdPartyCookieBlockingModeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21NetworkStorageSession38setCacheMaxAgeCapForPrevalentResourcesEN3WTF7SecondsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21NetworkStorageSession40resetCacheMaxAgeCapForPrevalentResourcesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21NetworkStorageSession41setDomainsWithUserInteractionAsFirstPartyERKN3WTF6VectorINS_17RegistrableDomainELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21NetworkStorageSession43setPrevalentDomainsToBlockButKeepCookiesForERKN3WTF6VectorINS_17RegistrableDomainELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21NetworkStorageSession45setPrevalentDomainsToBlockAndDeleteCookiesForERKN3WTF6VectorINS_17RegistrableDomainELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21NetworkStorageSession47resetCrossSiteLoadsWithLinkDecorationForTestingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21NetworkStorageSession9setCookieERKNS_6CookieE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21NetworkStorageSessionD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21NetworkStorageSessionD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21PageOverlayController18installPageOverlayERNS_11PageOverlayENS1_8FadeModeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21PageOverlayController20uninstallPageOverlayERNS_11PageOverlayENS1_8FadeModeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21PageOverlayController26didChangeDeviceScaleFactorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21PageOverlayController32copyAccessibilityAttributesNamesEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21PageOverlayController43copyAccessibilityAttributeBoolValueForPointEN3WTF6StringENS_10FloatPointERb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21PageOverlayController45copyAccessibilityAttributeStringValueForPointEN3WTF6StringENS_10FloatPointERS2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21PlatformKeyboardEvent20currentCapsLockStateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21PlatformKeyboardEvent23getCurrentModifierStateERbS1_S1_S1_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21RemoteCommandListener6createERNS_27RemoteCommandListenerClientE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21SQLiteDatabaseTracker24hasTransactionInProgressEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21SQLiteDatabaseTracker35decrementTransactionInProgressCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21SQLiteDatabaseTracker35incrementTransactionInProgressCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21SQLiteDatabaseTracker9setClientEPNS_27SQLiteDatabaseTrackerClientE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21SerializedScriptValue11deserializeEPK15OpaqueJSContextPPK13OpaqueJSValue() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21SerializedScriptValue6createEN3WTF10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21SerializedScriptValue6createEPK15OpaqueJSContextPK13OpaqueJSValuePS6_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21SerializedScriptValueD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21SerializedScriptValueD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21UserContentController16removeUserScriptERNS_15DOMWrapperWorldERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21UserContentController17removeUserScriptsERNS_15DOMWrapperWorldE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21UserContentController20removeAllUserContentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21UserContentController20removeUserStyleSheetERNS_15DOMWrapperWorldERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21UserContentController21removeUserStyleSheetsERNS_15DOMWrapperWorldE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21UserContentController6createEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21UserContentControllerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21UserContentControllerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21UserContentControllerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21WebKitFontFamilyNames4initEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21WheelEventTestMonitor14deferForReasonEPKvNS0_11DeferReasonE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21WheelEventTestMonitor21clearAllTestDeferralsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21WheelEventTestMonitor23removeDeferralForReasonEPKvNS0_11DeferReasonE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21WheelEventTestMonitor33setTestCallbackAndStartMonitoringEbbON3WTF8FunctionIFvvEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21convertToIntegerClampIaEET_RN3JSC14JSGlobalObjectENS2_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21convertToIntegerClampIhEET_RN3JSC14JSGlobalObjectENS2_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21convertToIntegerClampIiEET_RN3JSC14JSGlobalObjectENS2_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21convertToIntegerClampIjEET_RN3JSC14JSGlobalObjectENS2_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21convertToIntegerClampIlEET_RN3JSC14JSGlobalObjectENS2_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21convertToIntegerClampImEET_RN3JSC14JSGlobalObjectENS2_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21convertToIntegerClampIsEET_RN3JSC14JSGlobalObjectENS2_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21convertToIntegerClampItEET_RN3JSC14JSGlobalObjectENS2_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21identifierToUSVStringERN3JSC14JSGlobalObjectERKNS0_10IdentifierE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21mainThreadNormalWorldEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore21setPlatformStrategiesEPNS_18PlatformStrategiesE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22CanvasRenderingContext5derefEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22CryptoAlgorithmAES_CBC15platformDecryptERKNS_30CryptoAlgorithmAesCbcCfbParamsERKNS_12CryptoKeyAESERKN3WTF6VectorIhLm0ENS7_15CrashOnOverflowELm16ENS7_10FastMallocEEENS0_7PaddingE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22CryptoAlgorithmAES_CBC15platformEncryptERKNS_30CryptoAlgorithmAesCbcCfbParamsERKNS_12CryptoKeyAESERKN3WTF6VectorIhLm0ENS7_15CrashOnOverflowELm16ENS7_10FastMallocEEENS0_7PaddingE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22DefaultFilterOperationD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22DefaultFilterOperationD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient10sendH2PingERKN3WTF3URLEONS1_17CompletionHandlerIFvONSt12experimental15fundamentals_v38expectedINS1_7SecondsENS_13ResourceErrorEEEEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient11prefetchDNSERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient12dispatchShowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient13didFinishLoadEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient13startDownloadERKNS_15ResourceRequestERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient14didChangeTitleEPNS_14DocumentLoaderE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient15finishedLoadingEPNS_14DocumentLoaderE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient15willChangeTitleEPNS_14DocumentLoaderE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient16restoreViewStateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient17cancelPolicyCheckEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient17dispatchWillCloseEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient17objectContentTypeERKN3WTF3URLERKNS1_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient17setCopiesOnScrollEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient18frameLoadCompletedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient18makeRepresentationEPNS_14DocumentLoaderE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient19detachedFromParent2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient19detachedFromParent3Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient19dispatchDidFailLoadERKNS_13ResourceErrorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient19saveViewStateToItemERNS_11HistoryItemE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient19updateGlobalHistoryEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient20createDocumentLoaderERKNS_15ResourceRequestERKNS_14SubstituteDataE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient20redirectDataToPluginERNS_6WidgetE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient20setMainDocumentErrorEPNS_14DocumentLoaderERKNS_13ResourceErrorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient21didRunInsecureContentERNS_14SecurityOriginERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient21dispatchDidFinishLoadEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient21forceLayoutForNonHTMLEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient22dispatchWillSubmitFormERNS_9FormStateEON3WTF17CompletionHandlerIFvvEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient22provisionalLoadStartedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient23createNetworkingContextEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient23dispatchDidReceiveTitleERKNS_19StringWithDirectionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient24revertToProvisionalStateEPNS_14DocumentLoaderE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient25didDisplayInsecureContentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient25setMainFrameDocumentReadyEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient26didReplaceMultipartContentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient26updateCachedDocumentLoaderERNS_14DocumentLoaderE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient27willReplaceMultipartContentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient29dispatchDidFinishDocumentLoadEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient29dispatchDidPopStateWithinPageEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient29hasFrameSpecificStorageAccessEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient29savePlatformDataToCachedFrameEPNS_11CachedFrameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient30didRestoreFromBackForwardCacheEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient30dispatchDidPushStateWithinPageEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient31dispatchDidCancelClientRedirectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient31dispatchDidDispatchOnloadEventsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient31dispatchDidReachLayoutMilestoneEN3WTF9OptionSetINS_15LayoutMilestoneEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient31dispatchDidStartProvisionalLoadEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient31dispatchUnableToImplementPolicyERKNS_13ResourceErrorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient31prepareForDataSourceReplacementEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient31transitionToCommittedForNewPageEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient32updateGlobalHistoryRedirectLinksEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient33convertMainResourceLoadToDownloadEPNS_14DocumentLoaderERKNS_15ResourceRequestERKNS_16ResourceResponseE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient33dispatchDidReplaceStateWithinPageEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient33dispatchWillPerformClientRedirectERKN3WTF3URLEdNS1_8WallTimeENS_19LockBackForwardListE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient36transitionToCommittedFromCachedFrameEPNS_11CachedFrameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient37dispatchDidReachVisuallyNonEmptyStateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient38dispatchDidLoadResourceFromMemoryCacheEPNS_14DocumentLoaderERKNS_15ResourceRequestERKNS_16ResourceResponseEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient50dispatchDidReceiveServerRedirectForProvisionalLoadEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient8setTitleERKNS_19StringWithDirectionERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClientC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClientC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClientC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClientC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClientD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClientD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClientD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClientaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22FontCascadeDescriptionC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22FontCascadeDescriptionC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22GraphicsLayerTransformC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22GraphicsLayerTransformC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22HTMLFormControlElement13setFormActionERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22HistoricalVelocityData18velocityForNewDataENS_10FloatPointEdN3WTF13MonotonicTimeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22JSDeprecatedCSSOMValue9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22MutableStyleProperties25ensureCSSStyleDeclarationEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22MutableStylePropertiesD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22MutableStylePropertiesD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22ResourceLoadStatistics20reduceTimeResolutionEN3WTF8WallTimeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22ResourceLoadStatistics5mergeERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22ResourceLoadStatistics6decodeERNS_12KeyedDecoderEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22counterValueForElementEPNS_7ElementE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22createFragmentFromTextERKNS_11SimpleRangeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22externalRepresentationEPNS_7ElementEN3WTF9OptionSetINS_16RenderAsTextFlagEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22identifierToByteStringERN3JSC14JSGlobalObjectERKNS0_10IdentifierE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22multipleFileUploadTextEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22startOfEditableContentERKNS_15VisiblePositionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22strictCSSParserContextEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22throwArgumentTypeErrorERN3JSC14JSGlobalObjectERNS0_10ThrowScopeEjPKcS6_S6_S6_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore22throwSequenceTypeErrorERN3JSC14JSGlobalObjectERNS0_10ThrowScopeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23ApplicationCacheStorage14setMaximumSizeEl() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23ApplicationCacheStorage15deleteAllCachesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23ApplicationCacheStorage16deleteAllEntriesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23ApplicationCacheStorage21setDefaultOriginQuotaEl() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23ApplicationCacheStorage23calculateQuotaForOriginERKNS_14SecurityOriginERl() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23ApplicationCacheStorage26storeUpdatedQuotaForOriginEPKNS_14SecurityOriginEl() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23ApplicationCacheStorage5emptyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23ApplicationCacheStorageC1ERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23ApplicationCacheStorageC2ERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23HTMLTableSectionElement4rowsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23HTMLTableSectionElement9deleteRowEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23HTMLTableSectionElement9insertRowEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23ISOSchemeInformationBox11boxTypeNameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23ISOSchemeInformationBox5parseERN3JSC8DataViewERj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23ISOSchemeInformationBoxC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23ISOSchemeInformationBoxC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23ISOSchemeInformationBoxD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23ISOSchemeInformationBoxD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23ISOSchemeInformationBoxD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23JSHTMLOptionsCollection9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23MediaQueryParserContextC1ERKNS_8DocumentE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23MediaQueryParserContextC2ERKNS_8DocumentE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23SynchronousLoaderClient24platformBadResponseErrorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23TextureMapperFPSCounter19updateFPSAndDisplayERNS_13TextureMapperERKNS_10FloatPointERKNS_20TransformationMatrixE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23TextureMapperFPSCounterC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23TextureMapperFPSCounterC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23atBoundaryOfGranularityERKNS_15VisiblePositionENS_15TextGranularityENS_18SelectionDirectionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23computeSharedStringHashEPKDsj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23computeSharedStringHashERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23standardUserAgentForURLERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23throwNonFiniteTypeErrorERN3JSC14JSGlobalObjectERNS0_10ThrowScopeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore23wrapSerializedCryptoKeyERKN3WTF6VectorIhLm0ENS0_15CrashOnOverflowELm16ENS0_10FastMallocEEES6_RS4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CachedResourceHandleBase11setResourceEPNS_14CachedResourceE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CachedResourceHandleBaseC1EPNS_14CachedResourceE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CachedResourceHandleBaseC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CachedResourceHandleBaseC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CachedResourceHandleBaseC2EPNS_14CachedResourceE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CachedResourceHandleBaseC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CachedResourceHandleBaseC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CachedResourceHandleBaseD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CachedResourceHandleBaseD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CachedResourceHandleBaseaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer10setFiltersERKNS_16FilterOperationsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer10setOpacityEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer11setPositionERKNS_10FloatPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer12addAnimationERKNS_17KeyframeValueListERKNS_9FloatSizeEPKNS_9AnimationERKN3WTF6StringEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer12setTransformERKNS_20TransformationMatrixE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer12syncPositionERKNS_10FloatPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer14pauseAnimationERKN3WTF6StringEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer14setAnchorPointERKNS_12FloatPoint3DE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer14setDebugBorderERKNS_5ColorEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer14setPreserves3DEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer15removeAnimationERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer15setBoundsOriginERKNS_10FloatPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer15setContentsRectERKNS_9FloatRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer15setDrawsContentEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer15setNeedsDisplayEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer16didChangeFiltersEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer16removeFromParentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer16resumeAnimationsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer16setMasksToBoundsEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer16syncBoundsOriginERKNS_10FloatPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer17didChangeChildrenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer17didChangeGeometryENS0_17FlushNotificationE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer17setContentsOpaqueEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer17suspendAnimationsEN3WTF13MonotonicTimeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer18purgeBackingStoresEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer18setBackdropFiltersERKNS_16FilterOperationsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer18setContentsToImageEPNS_5ImageE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer18setContentsVisibleEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer18setShowDebugBorderEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer19didChangeAnimationsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer19notifyFlushRequiredEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer19setContentsTileSizeERKNS_9FloatSizeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer19updatePlatformLayerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer20didUpdateTileBuffersEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer20setChildrenTransformERKNS_20TransformationMatrixE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer20setContentsTilePhaseERKNS_9FloatSizeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer20updateContentBuffersEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer21computePixelAlignmentERNS_10FloatPointERNS_9FloatSizeERNS_12FloatPoint3DES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer21flushCompositingStateERKNS_9FloatRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer21invalidateCoordinatorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer21setBackfaceVisibilityEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer21setNeedsDisplayInRectERKNS_9FloatRectENS_13GraphicsLayer17ShouldClipToLayerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer21setShowRepaintCounterEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer22effectiveContentsScaleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer22setBackdropFiltersRectERKNS_16FloatRoundedRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer22transformedVisibleRectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer23setContentsClippingRectERKNS_16FloatRoundedRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer23setContentsNeedsDisplayEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer23setContentsToSolidColorERKNS_5ColorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer24didChangeBackdropFiltersEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer25requestBackingStoreUpdateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer26setContentsToPlatformLayerEPN7Nicosia13PlatformLayerENS_13GraphicsLayer20ContentsLayerPurposeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer26setShouldUpdateVisibleRectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer28didChangeBackdropFiltersRectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer29computePositionRelativeToBaseEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer29computeTransformedVisibleRectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer29setNeedsVisibleRectAdjustmentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer30deviceOrPageScaleFactorChangedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer37flushCompositingStateForThisLayerOnlyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer37selfOrAncestorHaveNonAffineTransformsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer38updateContentBuffersIncludingSubLayersEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer40setCoordinatorIncludingSubLayersIfNeededEPNS_30CoordinatedGraphicsLayerClientE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer41syncPendingStateChangesIncludingSubLayersEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer7setSizeERKNS_9FloatSizeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayerC1ENS_13GraphicsLayer4TypeERNS_19GraphicsLayerClientE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayerC2ENS_13GraphicsLayer4TypeERNS_19GraphicsLayerClientE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24DeprecatedGlobalSettings24setMockScrollbarsEnabledEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24DeprecatedGlobalSettings24setUsesOverlayScrollbarsEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24DeprecatedGlobalSettings26setAllowsAnySSLCertificateEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24DocumentMarkerController10markersForERNS_4NodeEN3WTF9OptionSetINS_14DocumentMarker10MarkerTypeEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24DocumentMarkerController13removeMarkersEN3WTF9OptionSetINS_14DocumentMarker10MarkerTypeEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24DocumentMarkerController13removeMarkersERKNS_11SimpleRangeEN3WTF9OptionSetINS_14DocumentMarker10MarkerTypeEEENS_32RemovePartiallyOverlappingMarkerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24DocumentMarkerController14markersInRangeERKNS_11SimpleRangeEN3WTF9OptionSetINS_14DocumentMarker10MarkerTypeEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24DocumentMarkerController23renderedRectsForMarkersENS_14DocumentMarker10MarkerTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24DocumentMarkerController38updateRectsForInvalidatedMarkersOfTypeENS_14DocumentMarker10MarkerTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24DocumentParserYieldTokenC1ERNS_8DocumentE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24DocumentParserYieldTokenC2ERNS_8DocumentE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24DocumentParserYieldTokenD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24DocumentParserYieldTokenD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24FrameDestructionObserver14frameDestroyedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24FrameDestructionObserver14willDetachPageEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24FrameDestructionObserverD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24FrameDestructionObserverD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24FrameDestructionObserverD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24ImmutableStylePropertiesD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24ImmutableStylePropertiesD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24JSDeprecatedCSSOMCounter9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24MatrixTransformOperation6createERKNS_20TransformationMatrixE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24PerformanceLoggingClient35synchronousScrollingReasonsAsStringEN3WTF9OptionSetINS_26SynchronousScrollingReasonEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24StorageNamespaceProvider21localStorageNamespaceEN3PAL9SessionIDE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24StorageNamespaceProviderC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24StorageNamespaceProviderD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24StorageNamespaceProviderD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24StorageNamespaceProviderD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24TemporarySelectionChangeD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24TemporarySelectionChangeD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24charactersAroundPositionERKNS_15VisiblePositionERiS3_S3_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24distanceBetweenPositionsERKNS_15VisiblePositionES2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24passesAccessControlCheckERKNS_16ResourceResponseENS_23StoredCredentialsPolicyERKNS_14SecurityOriginEPKNS_37CrossOriginAccessControlCheckDisablerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24presentingApplicationPIDEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24previousSentencePositionERKNS_15VisiblePositionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore24redirectChainAllowsReuseENS_24RedirectChainCacheStatusENS_28ReuseExpiredRedirectionOrNotE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore25ArchiveResourceCollection21archiveResourceForURLERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore25DropShadowFilterOperation6createERKNS_8IntPointEiRKNS_5ColorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore25DropShadowFilterOperationC1ERKNS_8IntPointEiRKNS_5ColorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore25DropShadowFilterOperationC2ERKNS_8IntPointEiRKNS_5ColorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore25DropShadowFilterOperationD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore25DropShadowFilterOperationD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore25DropShadowFilterOperationD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore25JSDeprecatedCSSOMRGBColor9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore25TextureMapperBackingStore25calculateExposedTileEdgesERKNS_9FloatRectES3_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore25WebSocketChannelInspectorC1ERNS_8DocumentE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore25WebSocketChannelInspectorC2ERNS_8DocumentE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore25computeViewportAttributesENS_17ViewportArgumentsEiiifNS_7IntSizeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore25directionOfEnclosingBlockERKNS_8PositionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore25encloseRectToDevicePixelsERKNS_9FloatRectEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore25enclosingBlockFlowElementERKNS_15VisiblePositionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore25getOutOfLineCachedWrapperEPNS_17JSDOMGlobalObjectERNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore25unwrapSerializedCryptoKeyERKN3WTF6VectorIhLm0ENS0_15CrashOnOverflowELm16ENS0_10FastMallocEEES6_RS4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore25updateRedirectChainStatusERNS_24RedirectChainCacheStatusERKNS_16ResourceResponseE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26ContextDestructionObserver16contextDestroyedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26ContextDestructionObserverC1EPNS_22ScriptExecutionContextE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26ContextDestructionObserverC2EPNS_22ScriptExecutionContextE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26ContextDestructionObserverD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26ContextDestructionObserverD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26ContextDestructionObserverD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26CustomElementReactionStack12processQueueEPN3JSC14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26HTMLTextFormControlElement12setMaxLengthEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26HTMLTextFormControlElement21setCanShowPlaceholderEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26HTMLTextFormControlElement21setSelectionDirectionERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26HTMLTextFormControlElement6selectENS_19SelectionRevealModeERKNS_23AXTextStateChangeIntentE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26ISOProtectionSchemeInfoBox11boxTypeNameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26ISOProtectionSchemeInfoBox5parseERN3JSC8DataViewERj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26ISOProtectionSchemeInfoBoxC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26ISOProtectionSchemeInfoBoxC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26ISOProtectionSchemeInfoBoxD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26ISOProtectionSchemeInfoBoxD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26ISOProtectionSchemeInfoBoxD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26IdentityTransformOperation6createEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26Matrix3DTransformOperation6createERKNS_20TransformationMatrixE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26MessagePortChannelProvider17setSharedProviderERS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26MessagePortChannelRegistry19didCloseMessagePortERKNS_21MessagePortIdentifierE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26MessagePortChannelRegistry22didPostMessageToRemoteEONS_23MessageWithMessagePortsERKNS_21MessagePortIdentifierE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26MessagePortChannelRegistry25didDisentangleMessagePortERKNS_21MessagePortIdentifierE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26MessagePortChannelRegistry25messagePortChannelCreatedERNS_18MessagePortChannelE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26MessagePortChannelRegistry27didCreateMessagePortChannelERKNS_21MessagePortIdentifierES3_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26MessagePortChannelRegistry27messagePortChannelDestroyedERNS_18MessagePortChannelE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26MessagePortChannelRegistry29existingChannelContainingPortERKNS_21MessagePortIdentifierE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26MessagePortChannelRegistryD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26MessagePortChannelRegistryD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26UserTypingGestureIndicator27processingUserTypingGestureEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26UserTypingGestureIndicator28focusedElementAtGestureStartEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26UserTypingGestureIndicatorD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26UserTypingGestureIndicatorD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore26propagateExceptionSlowPathERN3JSC14JSGlobalObjectERNS0_10ThrowScopeEONS_9ExceptionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27AuthenticationChallengeBase7nullifyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27AuthenticationChallengeBaseC1ERKNS_15ProtectionSpaceERKNS_10CredentialEjRKNS_16ResourceResponseERKNS_13ResourceErrorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27AuthenticationChallengeBaseC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27AuthenticationChallengeBaseC2ERKNS_15ProtectionSpaceERKNS_10CredentialEjRKNS_16ResourceResponseERKNS_13ResourceErrorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27AuthenticationChallengeBaseC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27CSSComputedStyleDeclaration3refEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27CSSComputedStyleDeclaration5derefEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27CSSComputedStyleDeclaration6createERNS_7ElementEbN3WTF10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27ContentSecurityPolicyClientC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27ContentSecurityPolicyClientC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27ContentSecurityPolicyClientD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27ContentSecurityPolicyClientD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27ContentSecurityPolicyClientD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27ContentSecurityPolicyClientaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27DeviceOrientationClientMockC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27DeviceOrientationClientMockC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27DocumentTimelinesController16resumeAnimationsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27DocumentTimelinesController17suspendAnimationsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager12restrictionsENS_20PlatformMediaSession9MediaTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager13sharedManagerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager14addRestrictionENS_20PlatformMediaSession9MediaTypeEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager15endInterruptionENS_20PlatformMediaSession20EndInterruptionFlagsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager16processDidResumeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager17beginInterruptionENS_20PlatformMediaSession16InterruptionTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager17removeRestrictionENS_20PlatformMediaSession9MediaTypeEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager18processWillSuspendEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager20processSystemDidWakeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager21addAudioCaptureSourceERNS_20PlatformMediaSession18AudioCaptureSourceE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager21sharedManagerIfExistsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager22processSystemWillSleepEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager24removeAudioCaptureSourceERNS_20PlatformMediaSession18AudioCaptureSourceE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager26applicationDidBecomeActiveEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager28shouldDeactivateAudioSessionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager29applicationDidEnterBackgroundEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager29applicationWillBecomeInactiveEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager30applicationWillEnterForegroundEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager31setShouldDeactivateAudioSessionEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager32setIsPlayingToAutomotiveHeadUnitEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27parseCacheControlDirectivesERKNS_13HTTPHeaderMapE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27parseHTMLNonNegativeIntegerEN3WTF10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27screenSupportsExtendedColorEPNS_6WidgetE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore27withinTextUnitOfGranularityERKNS_15VisiblePositionENS_15TextGranularityENS_18SelectionDirectionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28BackingStoreBackendCairoImplC1ERKNS_7IntSizeEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28BackingStoreBackendCairoImplC2ERKNS_7IntSizeEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28BackingStoreBackendCairoImplD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28BackingStoreBackendCairoImplD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28BackingStoreBackendCairoImplD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28DisplayRefreshMonitorManager13sharedManagerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal10resetStateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal11showConsoleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal12moveWindowByEff() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal13showResourcesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal14frontendLoadedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal15canAttachWindowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal15changeSheetRectERKNS_9FloatRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal17setAttachedWindowENS_23InspectorFrontendClient8DockSideE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal18isDebuggingEnabledEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal18requestSetDockSideENS_23InspectorFrontendClient8DockSideE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal19setDebuggingEnabledEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal19windowObjectClearedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal20sendMessageToBackendERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal21isProfilingJavaScriptEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal21setDockingUnavailableEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal24startProfilingJavaScriptEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal25changeAttachedWindowWidthEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal26changeAttachedWindowHeightEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal26isTimelineProfilingEnabledEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal27restoreAttachedWindowHeightEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal27setTimelineProfilingEnabledEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal30constrainedAttachedWindowWidthEjj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal31constrainedAttachedWindowHeightEjj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8Settings11setPropertyERKN3WTF6StringES5_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8Settings14deletePropertyERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsC1ERKS1_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsC2ERKS1_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsaSERKS1_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsnaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsnaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsnwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsnwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocalD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocalD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocalD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28convertToIntegerEnforceRangeIaEET_RN3JSC14JSGlobalObjectENS2_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28convertToIntegerEnforceRangeIhEET_RN3JSC14JSGlobalObjectENS2_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28convertToIntegerEnforceRangeIiEET_RN3JSC14JSGlobalObjectENS2_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28convertToIntegerEnforceRangeIjEET_RN3JSC14JSGlobalObjectENS2_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28convertToIntegerEnforceRangeIlEET_RN3JSC14JSGlobalObjectENS2_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28convertToIntegerEnforceRangeImEET_RN3JSC14JSGlobalObjectENS2_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28convertToIntegerEnforceRangeIsEET_RN3JSC14JSGlobalObjectENS2_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28convertToIntegerEnforceRangeItEET_RN3JSC14JSGlobalObjectENS2_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28throwArgumentMustBeEnumErrorERN3JSC14JSGlobalObjectERNS0_10ThrowScopeEjPKcS6_S6_S6_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28throwRequiredMemberTypeErrorERN3JSC14JSGlobalObjectERNS0_10ThrowScopeEPKcS6_S6_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore28topPrivatelyControlledDomainERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore29SQLiteStatementAutoResetScopeC1EOS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore29SQLiteStatementAutoResetScopeC1EPNS_15SQLiteStatementE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore29SQLiteStatementAutoResetScopeC2EOS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore29SQLiteStatementAutoResetScopeC2EPNS_15SQLiteStatementE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore29SQLiteStatementAutoResetScopeD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore29SQLiteStatementAutoResetScopeD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore29SQLiteStatementAutoResetScopeaSEOS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore29createDefaultParagraphElementERNS_8DocumentE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore29updateRequestForAccessControlERNS_15ResourceRequestERNS_14SecurityOriginENS_23StoredCredentialsPolicyE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore30InspectorInstrumentationPublic12hasFrontendsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore30InspectorInstrumentationWebKit16interceptRequestERNS_14ResourceLoaderEON3WTF8FunctionIFvRKNS_15ResourceRequestEEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore30InspectorInstrumentationWebKit24interceptRequestInternalERNS_14ResourceLoaderEON3WTF8FunctionIFvRKNS_15ResourceRequestEEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore30InvertLightnessFilterOperation6createEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore30InvertLightnessFilterOperationC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore30InvertLightnessFilterOperationC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore30InvertLightnessFilterOperationD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore30InvertLightnessFilterOperationD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore30InvertLightnessFilterOperationD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore30closestWordBoundaryForPositionERKNS_15VisiblePositionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore30forwardForEachCallToBackingMapERNS_17JSDOMGlobalObjectERN3JSC9CallFrameERNS2_8JSObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore30forwardForEachCallToBackingSetERNS_17JSDOMGlobalObjectERN3JSC9CallFrameERNS2_8JSObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore30makeRangeSelectingNodeContentsERNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore30rejectPromiseWithThisTypeErrorERN3JSC14JSGlobalObjectEPKcS4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore30rejectPromiseWithThisTypeErrorERNS_15DeferredPromiseEPKcS3_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore30throwArgumentMustBeObjectErrorERN3JSC14JSGlobalObjectERNS0_10ThrowScopeEjPKcS6_S6_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore31BasicColorMatrixFilterOperationD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore31BasicColorMatrixFilterOperationD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore31BasicColorMatrixFilterOperationD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore31CrossOriginPreflightResultCache5clearEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore31CrossOriginPreflightResultCache9singletonEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore31MediaEngineConfigurationFactory10enableMockEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore31MediaEngineConfigurationFactory11disableMockEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore31SimplifiedBackwardsTextIterator7advanceEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore31SimplifiedBackwardsTextIteratorC1ERKNS_11SimpleRangeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore31SimplifiedBackwardsTextIteratorC2ERKNS_11SimpleRangeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore31forwardFunctionCallToBackingMapERN3JSC14JSGlobalObjectERNS0_9CallFrameERNS0_8JSObjectERKNS0_10IdentifierE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore31forwardFunctionCallToBackingSetERN3JSC14JSGlobalObjectERNS0_9CallFrameERNS0_8JSObjectERKNS0_10IdentifierE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore31rejectPromiseWithExceptionIfAnyERN3JSC14JSGlobalObjectERNS_17JSDOMGlobalObjectERNS0_9JSPromiseERNS0_10CatchScopeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore32WorkerThreadableWebSocketChannelC1ERNS_17WorkerGlobalScopeERNS_22WebSocketChannelClientERKN3WTF6StringERNS_14SocketProviderE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore32WorkerThreadableWebSocketChannelC2ERNS_17WorkerGlobalScopeERNS_22WebSocketChannelClientERKN3WTF6StringERNS_14SocketProviderE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore32isSimpleCrossOriginAccessRequestERKN3WTF6StringERKNS_13HTTPHeaderMapE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore32serializationForRenderTreeAsTextERKNS_5ColorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore32throwArgumentMustBeFunctionErrorERN3JSC14JSGlobalObjectERNS0_10ThrowScopeEjPKcS6_S6_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore32useBlockedPlugInContextMenuTitleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore33testPreloadScannerViewportSupportEPNS_8DocumentE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore34forwardAttributeGetterToBackingMapERN3JSC14JSGlobalObjectERNS0_8JSObjectERKNS0_10IdentifierE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore34forwardAttributeGetterToBackingSetERN3JSC14JSGlobalObjectERNS0_8JSObjectERKNS0_10IdentifierE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore35isEndOfEditableOrNonEditableContentERKNS_15VisiblePositionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore35positionOfNextBoundaryOfGranularityERKNS_15VisiblePositionENS_15TextGranularityENS_18SelectionDirectionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore35serializePreservingVisualAppearanceERKNS_11SimpleRangeEPN3WTF6VectorIPNS_4NodeELm0ENS3_15CrashOnOverflowELm16ENS3_10FastMallocEEENS_22AnnotateForInterchangeENS_22ConvertBlocksToInlinesENS_11ResolveURLsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore36ContentSecurityPolicyResponseHeadersC1ERKNS_16ResourceResponseE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore36ContentSecurityPolicyResponseHeadersC2ERKNS_16ResourceResponseE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore36ISOProtectionSystemSpecificHeaderBox11boxTypeNameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore36ISOProtectionSystemSpecificHeaderBox5parseERN3JSC8DataViewERj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore36parseCrossOriginResourcePolicyHeaderEN3WTF10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore36registerMemoryReleaseNotifyCallbacksEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore36visiblePositionForPositionWithOffsetERKNS_15VisiblePositionEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore37BasicComponentTransferFilterOperationD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore37BasicComponentTransferFilterOperationD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore37BasicComponentTransferFilterOperationD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore37CrossOriginAccessControlCheckDisabler39setCrossOriginAccessControlCheckEnabledEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore37CrossOriginAccessControlCheckDisabler9singletonEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore37CrossOriginAccessControlCheckDisablerC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore37CrossOriginAccessControlCheckDisablerC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore37CrossOriginAccessControlCheckDisablerC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore37CrossOriginAccessControlCheckDisablerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore37CrossOriginAccessControlCheckDisablerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore37CrossOriginAccessControlCheckDisablerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore37CrossOriginAccessControlCheckDisablerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore37CrossOriginAccessControlCheckDisableraSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore37WidgetHierarchyUpdatesSuspensionScope11moveWidgetsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore37computeFreshnessLifetimeForHTTPFamilyERKNS_16ResourceResponseEN3WTF8WallTimeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore38updateResponseHeadersAfterRevalidationERNS_16ResourceResponseERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore39cleanHTTPRequestHeadersForAccessControlERNS_15ResourceRequestEN3WTF9OptionSetINS_29HTTPHeadersToKeepFromCleaningEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore40restrictMinimumScaleFactorToViewportSizeERNS_18ViewportAttributesENS_7IntSizeEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore44computeMinimumScaleFactorForContentContainedERKNS_18ViewportAttributesERKNS_7IntSizeES5_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore46visibleImageElementsInRangeWithNonLoadedImagesERKNS_11SimpleRangeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore48closestEditablePositionInElementForAbsolutePointERKNS_7ElementERKNS_8IntPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore49reportExtraMemoryAllocatedForCollectionIndexCacheEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Attr5styleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Attr8setValueERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4BlobC1EPNS_22ScriptExecutionContextE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4BlobC2EPNS_22ScriptExecutionContextE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4FontD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4FontD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Icon18createIconForFilesERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4IconD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4IconD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Node10childNodesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Node10renderRectEPb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Node11appendChildERS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Node11removeChildERS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Node12insertBeforeERS0_PS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Node12replaceChildERS0_S1_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Node14removedLastRefEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Node17stopIgnoringLeaksEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Node18dispatchInputEventEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Node18startIgnoringLeaksEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Node20cloneNodeForBindingsEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Node23compareDocumentPositionERS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Node6removeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Node7inspectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Node9normalizeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page10findStringERKN3WTF6StringENS1_9OptionSetINS_14FindOptionFlagEEEPNS_7DidWrapE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page10pluginDataEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page11forEachPageERKN3WTF8FunctionIFvRS0_EEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page12setGroupNameERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page12setIsVisibleEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page12setSessionIDEN3PAL9SessionIDE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page12whenUnnestedEON3WTF8FunctionIFvvEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page13setIsInWindowEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page13setPaginationERKNS_10PaginationE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page14layoutIfNeededEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page14setIsPrerenderEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page14setMediaVolumeEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page15setHeaderHeightEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page15updateRenderingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page16countFindMatchesERKN3WTF6StringENS1_9OptionSetINS_14FindOptionFlagEEEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page16setCanStartMediaEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page16setDefersLoadingEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page16userAgentChangedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page18setPageScaleFactorEfRKNS_8IntPointEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page18setTopContentInsetEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page18setViewScaleFactorEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page19addLayoutMilestonesEN3WTF9OptionSetINS_15LayoutMilestoneEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page19appearanceDidChangeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page19setDelegatesScalingEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page19setFullscreenInsetsERKNS_9RectEdgesIfEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page19userContentProviderEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page20injectUserStyleSheetERNS_14UserStyleSheetE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page20scrollingCoordinatorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page20setDeviceScaleFactorEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page20unmarkAllTextMatchesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page21markAllMatchesForTextERKN3WTF6StringENS1_9OptionSetINS_14FindOptionFlagEEEbj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page21replaceRangesWithTextERKN3WTF6VectorINS_11SimpleRangeELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEERKNS1_6StringEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page21resumeAnimatingImagesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page22removeLayoutMilestonesEN3WTF9OptionSetINS_15LayoutMilestoneEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page22resumeAllMediaPlaybackEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page22revealCurrentSelectionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page22setUseSystemAppearanceEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page23clearUndoRedoOperationsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page23dispatchAfterPrintEventEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page23finalizeRenderingUpdateEN3WTF9OptionSetINS_28FinalizeRenderingUpdateFlagsEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page23invalidateStylesForLinkEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page23resumeAllMediaBufferingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page23suspendAllMediaPlaybackEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page24dispatchBeforePrintEventEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page24replaceSelectionWithTextERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page24resumeScriptedAnimationsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page24scrollingStateTreeAsTextEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page24setCORSDisablingPatternsEON3WTF6VectorINS_21UserContentURLPatternELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page24suspendAllMediaBufferingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page25notifyToInjectUserScriptsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page25screenPropertiesDidChangeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page25suspendScriptedAnimationsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page26applicationDidBecomeActiveEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page26clearWheelEventTestMonitorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page26startMonitoringWheelEventsEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page27applicationWillResignActiveEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page27enableICECandidateFilteringEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page27invalidateStylesForAllLinksEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page27setFullscreenControlsHiddenEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page27setUnobscuredSafeAreaInsetsERKNS_9RectEdgesIfEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page27setVerticalScrollElasticityENS_16ScrollElasticityE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page27setZoomedOutPageScaleFactorEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page28disableICECandidateFilteringEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page28effectiveAppearanceDidChangeEbb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page28removeInjectedUserStyleSheetERNS_14UserStyleSheetE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page29applicationDidEnterBackgroundEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page29clearPreviousItemFromAllPagesEPNS_11HistoryItemE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page29setFullscreenAutoHideDurationEN3WTF7SecondsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page29setHorizontalScrollElasticityENS_16ScrollElasticityE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page29startTrackingRenderingUpdatesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page30accessibilitySettingsDidChangeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page30addActivityStateChangeObserverERNS_27ActivityStateChangeObserverE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page30applicationWillEnterForegroundEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page30setNeedsRecalcStyleInAllFramesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page31setRemoteInspectionNameOverrideERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page31setUserInterfaceLayoutDirectionENS_28UserInterfaceLayoutDirectionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page32nonFastScrollableRectsForTestingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page32setMemoryCacheClientCallsEnabledEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page33removeActivityStateChangeObserverERNS_27ActivityStateChangeObserverE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page33synchronousScrollingReasonsAsTextEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page34setInitialScaleIgnoringContentSizeEf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page35resumeActiveDOMObjectsAndAnimationsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page36setAllowsMediaDocumentInlinePlaybackEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page36setShouldSuppressScrollbarAnimationsEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page36suspendActiveDOMObjectsAndAnimationsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page37setInLowQualityImageInterpolationModeEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page40passiveTouchEventListenerRectsForTestingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page40updateMediaElementRateChangeRestrictionsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page41setDOMTimerAlignmentIntervalIncreaseLimitEN3WTF7SecondsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page45setOutsideViewportThrottlingEnabledForTestingEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page52updateStyleForAllPagesAfterGlobalChangeInEnvironmentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page8goToItemERNS_11HistoryItemENS_13FrameLoadTypeENS_27ShouldTreatAsContinuingLoadE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Page9initGroupEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4PageC1EONS_17PageConfigurationE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4PageC2EONS_17PageConfigurationE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4PageD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4PageD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Path12closeSubpathEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Path14addQuadCurveToERKNS_10FloatPointES3_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Path6moveToERKNS_10FloatPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Path9addLineToERKNS_10FloatPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4PathC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4PathC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4PathaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Text16replaceWholeTextERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4Text9splitTextEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_10AudioTrackE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_10TimeRangesE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_11DOMRectListE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_12SourceBufferE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_12WebAnimationE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_13FetchResponseE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_14XMLHttpRequestE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_15DOMRectReadOnlyE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_16HTMLImageElementE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_17AnimationTimelineE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_17DOMMatrixReadOnlyE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_19CSSStyleDeclarationE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_19TextTrackCueGenericE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_4FileE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_5RangeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_6DOMURLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_6Path2DE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_7DOMRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_7ElementE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_8DocumentE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_8LocationE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_9DOMMatrixE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_9ImageDataE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectERNS_11WindowProxyE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4toJSERNS_12VoidCallbackE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore4toJSERNS_14StringCallbackE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore50restrictScaleFactorToInitialScaleIfNotUserScalableERNS_18ViewportAttributesE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5Cairo11ShadowStateC1ERKNS_20GraphicsContextStateE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5Cairo11ShadowStateC2ERKNS_20GraphicsContextStateE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5Event9initEventERKN3WTF10AtomStringEbb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5Image12supportsTypeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5Image20loadPlatformResourceEPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5Image6createERNS_13ImageObserverE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5Image9nullImageEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5Range10selectNodeERNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5Range11setEndAfterERNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5Range12setEndBeforeERNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5Range13cloneContentsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5Range13setStartAfterERNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5Range14deleteContentsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5Range14isPointInRangeERNS_4NodeEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5Range14setStartBeforeERNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5Range15extractContentsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5Range16surroundContentsERNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5Range18selectNodeContentsERNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5Range24createContextualFragmentERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5Range6createERNS_8DocumentE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5Range6expandERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5Range8collapseEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5RangeD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5RangeD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5Style5Scope22flushPendingSelfUpdateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5Style5Scope29flushPendingDescendantUpdatesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5Style5Scope30didChangeStyleSheetEnvironmentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore5Style5Scope8resolverEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Chrome23enableSuddenTerminationEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Chrome24disableSuddenTerminationEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Cursor8fromTypeENS0_4TypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6CursorC1EPNS_5ImageERKNS_8IntPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6CursorC2EPNS_5ImageERKNS_8IntPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor10applyStyleEPNS_15StylePropertiesENS_10EditActionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor10findStringERKN3WTF6StringENS1_9OptionSetINS_14FindOptionFlagEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor10insertTextERKN3WTF6StringEPNS_5EventENS_18TextEventInputTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor13canDHTMLPasteEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor13performDeleteEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor14simplifyMarkupEPNS_4NodeES2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor16pasteAsPlainTextERKN3WTF6StringEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor17cancelCompositionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor17insertOrderedListEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor18confirmCompositionERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor18confirmCompositionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor18insertDictatedTextERKN3WTF6StringERKNS1_6VectorINS_20DictationAlternativeELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEEPNS_5EventE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor19deleteWithDirectionENS_18SelectionDirectionENS_15TextGranularityEbb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor19insertUnorderedListEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor20canSmartCopyOrDeleteEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor21applyStyleToSelectionEPNS_15StylePropertiesENS_10EditActionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor21insertTextPlaceholderERKNS_7IntSizeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor21removeTextPlaceholderERNS_22TextPlaceholderElementE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor22writeImageToPasteboardERNS_10PasteboardERNS_7ElementERKN3WTF3URLERKNS5_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor23changeSelectionListTypeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor23handleAcceptedCandidateENS_18TextCheckingResultE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor23setBaseWritingDirectionENS_16WritingDirectionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor24advanceToNextMisspellingEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor24computeAndSetTypingStyleERNS_15StylePropertiesENS_10EditActionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor24replaceSelectionWithTextERKN3WTF6StringENS0_17SelectReplacementENS0_12SmartReplaceENS_10EditActionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor25setIgnoreSelectionChangesEbNS0_15RevealSelectionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor26changeBackToReplacedStringERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor26decreaseSelectionListLevelEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor26increaseSelectionListLevelEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor26toggleOverwriteModeEnabledEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor26writeSelectionToPasteboardERNS_10PasteboardE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor28replaceRangeForSpellCheckingERKNS_11SimpleRangeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor28replaceSelectionWithFragmentERNS_16DocumentFragmentENS0_17SelectReplacementENS0_12SmartReplaceENS0_10MatchStyleENS_10EditActionENS_22MailBlockquoteHandlingE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor28updateEditorUINowIfScheduledEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor29canDecreaseSelectionListLevelEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor29canIncreaseSelectionListLevelEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor29handleAlternativeTextUIResultERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor29toggleContinuousSpellCheckingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor30deleteSelectionWithSmartDeleteEbNS_10EditActionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor30pasteAsPlainTextBypassingDHTMLEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor33increaseSelectionListLevelOrderedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor33markMisspellingsAfterTypingToWordERKNS_15VisiblePositionERKNS_16VisibleSelectionEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor34setMarkedTextMatchesAreHighlightedEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor35increaseSelectionListLevelUnorderedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor38commandIsSupportedFromMenuOrKeyBindingERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor39insertParagraphSeparatorInQuotedContentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor3cutENS0_20FromMenuOrKeyBindingE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor4copyENS0_20FromMenuOrKeyBindingE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor5pasteENS0_20FromMenuOrKeyBindingE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor6indentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor7CommandC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor7CommandC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor7commandERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor7copyURLERKN3WTF3URLERKNS1_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor7outdentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Editor9copyImageERKNS_13HitTestResultE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6ISOBox4readERN3JSC8DataViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6ISOBoxC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6ISOBoxC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6ISOBoxC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6ISOBoxC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6ISOBoxD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6ISOBoxD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6ISOBoxD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6JSFile14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6JSFile15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6JSFile15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6JSFile15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6JSFile4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6JSFile9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6JSFile9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6JSFileC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6JSFileC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6JSFileD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6JSFileD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6JSNode14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6JSNode15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6JSNode15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6JSNode15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6JSNode4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6JSNode9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6JSNode9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6JSNodeC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6JSNodeC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6JSNodeD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6JSNodeD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6JSNodeaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Path2D6createERKNS_4PathE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Path2D6createERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Path2D6createEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Path2D7addPathERS0_ONS_15DOMMatrix2DInitE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Path2DC1ERKNS_4PathE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Path2DC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Path2DC2ERKNS_4PathE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Path2DC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Path2DD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Path2DD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Path2DD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Path2DdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Path2DdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Path2DnaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Path2DnaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Path2DnwEm10NotNullTagPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Path2DnwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Path2DnwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Region5Shape9translateERKNS_7IntSizeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Region5uniteERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Region8subtractERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Region9intersectERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Region9translateERKNS_7IntSizeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6RegionC1EOS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6RegionC1ERKNS_7IntRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6RegionC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6RegionC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6RegionC2EOS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6RegionC2ERKNS_7IntRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6RegionC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6RegionC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6RegionD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6RegionD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6RegionaSEOS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6RegionaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Widget12setFrameRectERKNS_7IntRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Widget16removeFromParentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Widget4hideEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Widget4showEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Widget8setFocusEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6Widget9setParentEPNS_10ScrollViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6WidgetC2EPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6WidgetD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6WidgetD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore6WidgetD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7CSSRule10setCssTextERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element10clientLeftEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element10offsetLeftEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element11clientWidthEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element11offsetWidthEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element12clientHeightEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element12offsetHeightEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element12setAttributeERKN3WTF10AtomStringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element12setAttributeERKNS_13QualifiedNameERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element12setInnerHTMLERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element12setOuterHTMLERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element13scrollByLinesEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element13scrollByPagesEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element14getClientRectsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element14scrollIntoViewEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element14setAttributeNSERKN3WTF10AtomStringES4_S4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element15removeAttributeERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element16getAttributeNodeERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element16setAttributeNodeERNS_4AttrE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element17removeAttributeNSERKN3WTF10AtomStringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element18boundingClientRectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element18getAttributeNodeNSERKN3WTF10AtomStringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element18insertAdjacentHTMLERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element18setAttributeNodeNSERNS_4AttrE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element19removeAttributeNodeERNS_4AttrE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element19setBooleanAttributeERKNS_13QualifiedNameEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element20offsetTopForBindingsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element20setIntegralAttributeERKNS_13QualifiedNameEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element21boundsInRootViewSpaceEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element21insertAdjacentElementERKN3WTF6StringERS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element21offsetLeftForBindingsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element22scrollIntoViewIfNeededEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element22setTabIndexForBindingsEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element23offsetParentForBindingsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element23webkitRequestFullscreenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element25ensureUserAgentShadowRootEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element28setUnsignedIntegralAttributeERKNS_13QualifiedNameEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element34invalidateStyleAndLayerCompositionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element34setAttributeWithoutSynchronizationERKNS_13QualifiedNameERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element7closestERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element7matchesERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element9classListEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element9clientTopEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element9innerTextEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element9offsetTopEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element9outerTextEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Element9setPseudoERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7JSEvent9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7JSRange14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7JSRange15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7JSRange15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7JSRange15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7JSRange4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7JSRange9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7JSRange9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7JSRangeC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7JSRangeC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7JSRangeD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7JSRangeD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7JSRangeaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7PatternD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7PatternD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore7Process10identifierEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8DOMTimerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8DOMTimerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8DOMTimerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document10importNodeERNS_4NodeEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document10setCharsetERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document11createEventERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document11createRangeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document11execCommandERKN3WTF6StringEbS4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document11styleSheetsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document12allDocumentsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document12updateLayoutEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document13activeElementEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document13createElementERKNS_13QualifiedNameEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document13setDesignModeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document13setXMLVersionERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document14implementationEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document14setDocumentURIERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document15allDocumentsMapEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document15openForBindingsEPS0_RKN3WTF6StringES5_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document16addAudioProducerERNS_13MediaProducerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document16closeForBindingsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document16createNSResolverERNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document16isPageBoxVisibleEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document16scrollingElementEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document16setXMLStandaloneEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document17addConsoleMessageEN3JSC13MessageSourceENS1_12MessageLevelERKN3WTF6StringEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document17queryCommandStateERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document17queryCommandValueERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document18registerCollectionERNS_14HTMLCollectionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document19accessSVGExtensionsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document19caretRangeFromPointEii() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document19dispatchWindowEventERNS_5EventEPNS_11EventTargetE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document19queryCommandEnabledERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document19removeAudioProducerERNS_13MediaProducerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document19updateStyleIfNeededEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document20queryCommandIndetermERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document21queryCommandSupportedERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document22createDocumentFragmentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document22scrollingElementForAPIEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document23setAsRunningUserScriptsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document24addMediaCanStartListenerERNS_21MediaCanStartListenerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document24createElementForBindingsERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document24scheduleFullStyleRebuildEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document24setShouldCreateRenderersEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document25createCSSStyleDeclarationEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document25ensureTimelinesControllerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document25startTrackingStyleRecalcsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document26pageSizeAndMarginsInPixelsEiRNS_7IntSizeERiS3_S3_S3_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document26textManipulationControllerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document27removeMediaCanStartListenerERNS_21MediaCanStartListenerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document28setNeedsDOMWindowResizeEventEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document36updateLayoutIgnorePendingStylesheetsENS0_18RunPostLayoutTasksE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document46wasLoadedWithDataTransferFromPrevalentResourceEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document4headEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document4openEPS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document56hasRequestedPageSpecificStorageAccessWithUserInteractionERKNS_17RegistrableDomainE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document59setHasRequestedPageSpecificStorageAccessWithUserInteractionERKNS_17RegistrableDomainE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document5formsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document5linksEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document6cookieEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document6embedsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document6imagesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document6setDirERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document7anchorsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document7appletsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document7hitTestERKNS_14HitTestRequestERNS_13HitTestResultE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document7pluginsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document7scriptsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document8postTaskEONS_22ScriptExecutionContext4TaskE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document8referrerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document8timelineEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document9adoptNodeERNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Document9setCookieERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8FormData10appendBlobERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8FormData10appendDataEPKvm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8FormData16prepareForUploadEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8FormData21resolveBlobReferencesEPNS_16BlobRegistryImplE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8FormData6createEPKvm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8FormData6createEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8FormDataD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8FormDataD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8JSDOMURL14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8JSDOMURL15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8JSDOMURL15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8JSDOMURL15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8JSDOMURL4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8JSDOMURL9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8JSDOMURLC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8JSDOMURLC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8JSDOMURLD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8JSDOMURLD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8JSDOMURLaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8JSPath2D14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8JSPath2D15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8JSPath2D15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8JSPath2D15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8JSPath2D4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8JSPath2D9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8JSPath2D9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8JSPath2DC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8JSPath2DC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8JSPath2DD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8JSPath2DD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8JSPath2DaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8PositionC1EPNS_4NodeENS0_10AnchorTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8PositionC1EPNS_4NodeEjNS0_10AnchorTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8PositionC1EPNS_4NodeEjNS0_25LegacyEditingPositionFlagE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8PositionC2EPNS_4NodeENS0_10AnchorTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8PositionC2EPNS_4NodeEjNS0_10AnchorTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8PositionC2EPNS_4NodeEjNS0_25LegacyEditingPositionFlagE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8SVGNames4initEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8SVGTests27hasFeatureForLegacyBindingsERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings16setImagesEnabledEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings17setPluginsEnabledEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings18setFrameFlatteningENS_15FrameFlatteningE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings19setShowDebugBordersEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings20setCoreMathMLEnabledEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings20setMediaTypeOverrideERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings21setColorFilterEnabledEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings21setShowRepaintCounterEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings23setUsesBackForwardCacheEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings24setDNSPrefetchingEnabledEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings24setTextAreasAreResizableEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings24setVisualViewportEnabledEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings25setUserStyleSheetLocationERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings29setAsyncFrameScrollingEnabledEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings29setAuthorAndUserStylesEnabledEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings30setResourceUsageOverlayVisibleEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings31setICECandidateFilteringEnabledEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings32setAcceleratedCompositingEnabledEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings32setAsyncOverflowScrollingEnabledEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings32setShouldAllowUserInstalledFontsEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings33setFontFallbackPrefersPictographsEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings35setBackgroundShouldExtendBeyondPageEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings37setPunchOutWhiteBackgroundsInDarkModeEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings38setHiddenPageDOMTimerThrottlingEnabledEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings38setLayoutViewportHeightExpansionFactorEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings41setAcceleratedCompositedAnimationsEnabledEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings42setHiddenPageCSSAnimationSuspensionEnabledEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings44setClientCoordinatesRelativeToLayoutViewportEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8Settings44setHiddenPageDOMTimerThrottlingAutoIncreasesEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore8XMLNames4initEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9AnimationC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9AnimationC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9AnimationD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9AnimationD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9CSSParser16parseDeclarationERNS_22MutableStylePropertiesERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9CSSParserC1ERKNS_16CSSParserContextE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9CSSParserC2ERKNS_16CSSParserContextE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9CSSParserD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9CSSParserD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9CookieJar10clearCacheEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9CookieJar10setCookiesERNS_8DocumentERKN3WTF3URLERKNS3_6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9CookieJar12setRawCookieERKNS_8DocumentERKNS_6CookieE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9CookieJar17clearCacheForHostERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9CookieJar26shouldIncludeSecureCookiesERKNS_8DocumentERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9CookieJar29cookieRequestHeaderFieldProxyERKNS_8DocumentERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9CookieJarD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9CookieJarD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9CookieJarD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9DragImageC1EOS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9DragImageC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9DragImageC2EOS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9DragImageC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9DragImageD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9DragImageD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9DragImageaSEOS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9FontCache17inactiveFontCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9FontCache19fontForPlatformDataERKNS_16FontPlatformDataE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9FontCache21purgeInactiveFontDataEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9FontCache22lastResortFallbackFontERKNS_15FontDescriptionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9FontCache9fontCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9FrameTree11appendChildERNS_5FrameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9FrameTree9clearNameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9GLContext18makeContextCurrentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9GLContextD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9GLContextD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9HTMLNames4initEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9ImageData6createERKNS_7IntSizeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9JSCSSRule9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9JSDOMRect14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9JSDOMRect15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9JSDOMRect15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9JSDOMRect15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9JSDOMRect4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9JSDOMRect9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9JSDOMRectC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9JSDOMRectC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9JSDOMRectD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9JSDOMRectD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9JSElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9JSElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9JSElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9JSElement15subspaceForImplERN3JSC2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9JSElement4infoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9JSElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9JSElement9toWrappedERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9JSElementC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9JSElementC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9JSElementD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9MediaList12appendMediumERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9MediaList12deleteMediumERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9MediaList12setMediaTextERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9MediaListD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9MediaListD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9PageGroup25captionPreferencesChangedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9PageGroup9pageGroupERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9PageGroupC1ERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9PageGroupC2ERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9SampleMap12removeSampleEPNS_11MediaSampleE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9SampleMap5clearEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9SampleMap9addSampleERNS_11MediaSampleE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9Scrollbar10mouseMovedERKNS_18PlatformMouseEventE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9Scrollbar11mouseExitedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9Scrollbar12mouseEnteredEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9Scrollbar13setProportionEii() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9Scrollbar22maxOverlapBetweenPagesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9Scrollbar7mouseUpERKNS_18PlatformMouseEventE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9Scrollbar8setStepsEiii() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9Scrollbar9mouseDownERKNS_18PlatformMouseEventE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9TimerBase4stopEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9TimerBase5startEN3WTF7SecondsES2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9TimerBaseC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9TimerBaseD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9TimerBaseD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9TimerBaseD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9TreeScope16elementFromPointEdd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9TreeScope17elementsFromPointERKNS_10FloatPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9TreeScope17elementsFromPointEdd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9endOfLineERKNS_15VisiblePositionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9endOfWordERKNS_15VisiblePositionENS_9EWordSideE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCore9unionRectERKN3WTF6VectorINS_9FloatRectELm0ENS0_15CrashOnOverflowELm16ENS0_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCoreeqERKNS_18SecurityOriginDataES2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_10ColorSpaceE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_10ScrollTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_11TouchActionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_14ScrollClampingE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_15ScrollAlignment8BehaviorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_17CompositeOperatorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_17ScrollingNodeTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_21ViewportRectStabilityE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_22AlphaPremultiplicationE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_24ScrollableAreaParametersE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_25ScrollPositioningBehaviorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_26GraphicsLayerPaintingPhaseE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_28ScrollingLayerPositionActionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_30ScrollBehaviorForFixedElementsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_7LineCapE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_8LineJoinE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_8WindRuleE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_9BlendModeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_10FloatPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_10LayoutRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_10LayoutSizeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_10LayoutUnitE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_11EventRegionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_11LayoutPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_12FilterEffectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_12FloatPoint3DE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_12VelocityDataE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_13GraphicsLayer16CustomAppearanceE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_14TimingFunctionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_15AffineTransformE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_15FilterOperationE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_15ScrollAlignmentE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_15VisiblePositionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_16FilterOperationsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_16FloatRoundedRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_16VisibleSelectionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_20TransformationMatrixE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_27AbsolutePositionConstraintsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_32FixedPositionViewportConstraintsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_33StickyPositionViewportConstraintsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_5ColorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_6RegionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_7IntRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_7IntSizeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_8IntPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_9FloatRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_9FloatSizeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_9ImageDataE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_9RectEdgesIfEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc11AllIsoHeaps3addEPNS_15IsoHeapImplBaseE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc11AllIsoHeaps4headEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc11Deallocator18deallocateSlowCaseEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc11IsoPageBase18allocatePageMemoryEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc11IsoTLSEntryC2Em() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc11IsoTLSEntryD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc11IsoTLSEntryD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc11IsoTLSEntryD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc11IsoTLSEntrydlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc11IsoTLSEntrynaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc11IsoTLSEntrynaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc11IsoTLSEntrynwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc11IsoTLSEntrynwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc12IsoTLSLayout3addEPNS_11IsoTLSEntryE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc13IsoSharedPage9tryCreateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc15IsoHeapImplBase11didDecommitEPvm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc15IsoHeapImplBase11scavengeNowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc15IsoHeapImplBase13isNowFreeableEPvm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc15IsoHeapImplBase14freeableMemoryEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc15IsoHeapImplBase16addToAllIsoHeapsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc15IsoHeapImplBase16finishScavengingERNS_6VectorINS_16DeferredDecommitEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc15IsoHeapImplBase18isNoLongerFreeableEPvm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc15IsoHeapImplBase9didCommitEPvm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc15IsoHeapImplBase9footprintEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc15IsoHeapImplBaseC2ERNS_5MutexE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc15IsoHeapImplBaseD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc15IsoHeapImplBaseD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc15IsoHeapImplBaseD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc15IsoHeapImplBasedlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc15IsoHeapImplBasenaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc15IsoHeapImplBasenaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc15IsoHeapImplBasenwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc17getPerProcessDataEjPKcmm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc5Cache25allocateSlowCaseNullCacheENS_8HeapKindEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc5Cache25allocateSlowCaseNullCacheENS_8HeapKindEmm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc5Cache27deallocateSlowCaseNullCacheENS_8HeapKindEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc5Cache27reallocateSlowCaseNullCacheENS_8HeapKindEPvm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc5Cache28tryAllocateSlowCaseNullCacheENS_8HeapKindEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc5Cache28tryAllocateSlowCaseNullCacheENS_8HeapKindEmm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc5Cache30tryReallocateSlowCaseNullCacheENS_8HeapKindEPvm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc5Cache8scavengeENS_8HeapKindE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc6IsoTLS13ensureEntriesEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc6IsoTLS8scavengeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc8FreeList14initializeBumpEPcj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc8FreeList14initializeListEPNS_8FreeCellEmj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc8FreeList5clearEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc8FreeListC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc8FreeListD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc9Allocator12allocateImplEmmNS_13FailureActionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc9Scavenger29scheduleIfUnderMemoryPressureEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN7bmalloc9Scavenger8scheduleEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector13AgentRegistry13discardValuesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector13AgentRegistry27didCreateFrontendAndBackendEPNS_14FrontendRouterEPNS_17BackendDispatcherE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector13AgentRegistry29willDestroyFrontendAndBackendENS_16DisconnectReasonE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector13AgentRegistryC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector13AgentRegistryD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector13AgentRegistryD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14ConsoleMessage13addToFrontendERNS_25ConsoleFrontendDispatcherERNS_21InjectedScriptManagerEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14ConsoleMessage14incrementCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14ConsoleMessage20autogenerateMetadataEPN3JSC14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14ConsoleMessage26updateRepeatCountInConsoleERNS_25ConsoleFrontendDispatcherE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14ConsoleMessage5clearEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14ConsoleMessageD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14ConsoleMessageD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14ConsoleMessagedaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14ConsoleMessagedlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14ConsoleMessagenaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14ConsoleMessagenaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14ConsoleMessagenwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14ConsoleMessagenwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14FrontendRouter15connectFrontendERNS_15FrontendChannelE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14FrontendRouter18disconnectFrontendERNS_15FrontendChannelE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14FrontendRouter22disconnectAllFrontendsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14FrontendRouter6createEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14FrontendRouterC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14FrontendRouterC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14FrontendRouterD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14FrontendRouterD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InjectedScript13inspectObjectEN3JSC7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InjectedScript13releaseObjectERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InjectedScript13setEventValueEN3JSC7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InjectedScript15arrayFromVectorEON3WTF6VectorIN3JSC7JSValueELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InjectedScript15clearEventValueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InjectedScript17setExceptionValueEN3JSC7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InjectedScript18releaseObjectGroupERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InjectedScript19clearExceptionValueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InjectedScriptC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InjectedScriptC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InjectedScriptC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InjectedScriptC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InjectedScriptD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InjectedScriptD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InjectedScriptD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InjectedScriptaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InspectorAgent25evaluateForTestInFrontendERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InspectorAgent27didCreateFrontendAndBackendEPNS_14FrontendRouterEPNS_17BackendDispatcherE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InspectorAgentD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InspectorAgentD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InspectorAgentdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InspectorAgentdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InspectorAgentnaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InspectorAgentnwEm10NotNullTagPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InspectorAgentnwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector14InspectorAgentnwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15AsyncStackTrace18didCancelAsyncCallEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15AsyncStackTrace20didDispatchAsyncCallEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15AsyncStackTrace21willDispatchAsyncCallEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15AsyncStackTrace6removeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15AsyncStackTrace8truncateEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15AsyncStackTraceD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15AsyncStackTraceD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15InspectorTarget17setResumeCallbackEON3WTF8FunctionIFvvEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15InspectorTarget5pauseEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15InspectorTarget6resumeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15InspectorTargetC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15InspectorTargetD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15InspectorTargetD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector11setupFailedEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector12stopInternalENS0_10StopSourceE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector12updateTargetEPNS_24RemoteControllableTargetE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector13startDisabledEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector14registerTargetEPNS_24RemoteControllableTargetE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector14setupCompletedEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector15pushListingsNowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector15updateTargetMapEPNS_24RemoteControllableTargetE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector16pushListingsSoonEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector16unregisterTargetEPNS_24RemoteControllableTargetE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector19sendMessageToRemoteEjRKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector19sendMessageToTargetEjPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector19updateTargetListingERKNS_24RemoteControllableTargetE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector19updateTargetListingEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector24updateClientCapabilitiesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector27clientCapabilitiesDidChangeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector27updateHasActiveDebugSessionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector29nextAvailableTargetIdentifierEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector29waitingForAutomaticInspectionEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector34updateAutomaticInspectionCandidateEPNS_22RemoteInspectionTargetE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector4stopEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector5setupEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector5startEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector6ClientC2ERKS1_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector6ClientC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector6ClientD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector6ClientD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector6ClientD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspector7connectEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspectorC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspectorC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspectorD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspectorD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15RemoteInspectorD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15ScriptArguments6createEPN3JSC14JSGlobalObjectEON3WTF6VectorINS1_6StrongINS1_7UnknownELNS1_30ShouldStrongDestructorGrabLockE0EEELm0ENS4_15CrashOnOverflowELm16ENS4_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15ScriptArgumentsC1EPN3JSC14JSGlobalObjectEON3WTF6VectorINS1_6StrongINS1_7UnknownELNS1_30ShouldStrongDestructorGrabLockE0EEELm0ENS4_15CrashOnOverflowELm16ENS4_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15ScriptArgumentsC2EPN3JSC14JSGlobalObjectEON3WTF6VectorINS1_6StrongINS1_7UnknownELNS1_30ShouldStrongDestructorGrabLockE0EEELm0ENS4_15CrashOnOverflowELm16ENS4_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15ScriptArgumentsD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15ScriptArgumentsD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15ScriptCallFrameC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15ScriptCallFrameC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15ScriptCallFrameD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15ScriptCallFrameD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15ScriptCallFrameaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15ScriptCallStack6createEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15ScriptCallStackC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15ScriptCallStackC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15ScriptCallStackD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector15ScriptCallStackD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector16toInspectorValueEPN3JSC14JSGlobalObjectENS0_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector17BackendDispatcher12CallbackBase11sendFailureERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector17BackendDispatcher12CallbackBase7disableEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector17BackendDispatcher12CallbackBaseD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector17BackendDispatcher12CallbackBaseD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector17BackendDispatcher17sendPendingErrorsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector17BackendDispatcher19reportProtocolErrorENS0_15CommonErrorCodeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector17BackendDispatcher27registerDispatcherForDomainERKN3WTF6StringEPNS_29SupplementalBackendDispatcherE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector17BackendDispatcher8dispatchERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector17BackendDispatcherD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector17BackendDispatcherD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18IdentifiersFactory16createIdentifierEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18IdentifiersFactory9requestIdEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InjectedScriptBaseC1ERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InjectedScriptBaseC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InjectedScriptBaseC2ERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InjectedScriptBaseC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InjectedScriptBaseD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InjectedScriptBaseD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InjectedScriptBaseD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InjectedScriptBaseaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InjectedScriptHost16clearAllWrappersEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InjectedScriptHost19isHTMLAllCollectionERN3JSC2VMENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InjectedScriptHost21getInternalPropertiesERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InjectedScriptHost6createEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InjectedScriptHost7wrapperEPN3JSC14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InjectedScriptHostC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InjectedScriptHostC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InjectedScriptHostD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InjectedScriptHostD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InjectedScriptHostD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InspectorHeapAgent17didGarbageCollectEN3JSC15CollectionScopeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InspectorHeapAgent18clearHeapSnapshotsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InspectorHeapAgent18willGarbageCollectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InspectorHeapAgent27didCreateFrontendAndBackendEPNS_14FrontendRouterEPNS_17BackendDispatcherE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InspectorHeapAgent29dispatchGarbageCollectedEventENS_8Protocol4Heap17GarbageCollection4TypeEN3WTF7SecondsES6_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InspectorHeapAgent29willDestroyFrontendAndBackendENS_16DisconnectReasonE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InspectorHeapAgentC1ERNS_12AgentContextE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InspectorHeapAgentC2ERNS_12AgentContextE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InspectorHeapAgentD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InspectorHeapAgentD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InspectorHeapAgentD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InspectorHeapAgentdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InspectorHeapAgentdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InspectorHeapAgentnaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InspectorHeapAgentnaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InspectorHeapAgentnwEm10NotNullTagPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InspectorHeapAgentnwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector18InspectorHeapAgentnwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector19InspectorAuditAgent11muteConsoleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector19InspectorAuditAgent13unmuteConsoleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector19InspectorAuditAgent19populateAuditObjectEPN3JSC14JSGlobalObjectERNS1_6StrongINS1_8JSObjectELNS1_30ShouldStrongDestructorGrabLockE0EEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector19InspectorAuditAgent21injectedScriptManagerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector19InspectorAuditAgent27didCreateFrontendAndBackendEPNS_14FrontendRouterEPNS_17BackendDispatcherE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector19InspectorAuditAgent29willDestroyFrontendAndBackendENS_16DisconnectReasonE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector19InspectorAuditAgentC2ERNS_12AgentContextE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector19InspectorAuditAgentD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector19InspectorAuditAgentD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector19InspectorAuditAgentD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector19InspectorAuditAgentdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector19InspectorAuditAgentdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector19InspectorAuditAgentnaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector19InspectorAuditAgentnaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector19InspectorAuditAgentnwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector19InspectorAuditAgentnwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20CSSBackendDispatcher6createERNS_17BackendDispatcherEPNS_27CSSBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20CSSBackendDispatcherC1ERNS_17BackendDispatcherEPNS_27CSSBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20CSSBackendDispatcherC2ERNS_17BackendDispatcherEPNS_27CSSBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20CSSBackendDispatcherD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20CSSBackendDispatcherD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20CSSBackendDispatcherD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20DOMBackendDispatcher6createERNS_17BackendDispatcherEPNS_27DOMBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20DOMBackendDispatcherC1ERNS_17BackendDispatcherEPNS_27DOMBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20DOMBackendDispatcherC2ERNS_17BackendDispatcherEPNS_27DOMBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20DOMBackendDispatcherD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20DOMBackendDispatcherD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20DOMBackendDispatcherD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20InjectedScriptModule14ensureInjectedEPNS_21InjectedScriptManagerEPN3JSC14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20InjectedScriptModule14ensureInjectedEPNS_21InjectedScriptManagerERKNS_14InjectedScriptE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20InjectedScriptModuleC2ERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20InjectedScriptModuleC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20InjectedScriptModuleD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20InjectedScriptModuleD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20InjectedScriptModuleD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20InspectorTargetAgent13targetCreatedERNS_15InspectorTargetE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20InspectorTargetAgent15targetDestroyedERNS_15InspectorTargetE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20InspectorTargetAgent16connectToTargetsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20InspectorTargetAgent21disconnectFromTargetsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20InspectorTargetAgent26didCommitProvisionalTargetERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20InspectorTargetAgent27didCreateFrontendAndBackendEPNS_14FrontendRouterEPNS_17BackendDispatcherE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20InspectorTargetAgent29willDestroyFrontendAndBackendENS_16DisconnectReasonE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20InspectorTargetAgent31sendMessageFromTargetToFrontendERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20InspectorTargetAgentC1ERNS_14FrontendRouterERNS_17BackendDispatcherE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20InspectorTargetAgentC2ERNS_14FrontendRouterERNS_17BackendDispatcherE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20InspectorTargetAgentD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20InspectorTargetAgentD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20InspectorTargetAgentD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20InspectorTargetAgentdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20InspectorTargetAgentdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20InspectorTargetAgentnaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20InspectorTargetAgentnaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20InspectorTargetAgentnwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector20InspectorTargetAgentnwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21CSSFrontendDispatcher17styleSheetChangedERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21CSSFrontendDispatcher17styleSheetRemovedERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21CSSFrontendDispatcher23mediaQueryResultChangedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21CSSFrontendDispatcherC1ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21CSSFrontendDispatcherC2ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21CSSFrontendDispatcherdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21CSSFrontendDispatcherdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21CSSFrontendDispatchernaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21CSSFrontendDispatchernwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21CSSFrontendDispatchernwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcher15documentUpdatedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcher16attributeRemovedEiRKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcher16childNodeRemovedEii() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcher16shadowRootPoppedEii() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcher17attributeModifiedEiRKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcher19didAddEventListenerEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcher20pseudoElementRemovedEii() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcher21characterDataModifiedEiRKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcher21childNodeCountUpdatedEii() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcher23willRemoveEventListenerEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcher25customElementStateChangedEiNS_8Protocol3DOM18CustomElementStateE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcher34powerEfficientPlaybackStateChangedEidb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcher7inspectEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcherC1ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcherC2ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcherdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcherdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21DOMFrontendDispatchernaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21DOMFrontendDispatchernaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21DOMFrontendDispatchernwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21DOMFrontendDispatchernwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21HeapBackendDispatcherC1ERNS_17BackendDispatcherEPNS_28HeapBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21HeapBackendDispatcherC2ERNS_17BackendDispatcherEPNS_28HeapBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21HeapBackendDispatcherD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21HeapBackendDispatcherD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InjectedScriptManager10disconnectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InjectedScriptManager15clearEventValueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InjectedScriptManager17injectedScriptForEPN3JSC14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InjectedScriptManager18injectedScriptHostEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InjectedScriptManager18releaseObjectGroupERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InjectedScriptManager19clearExceptionValueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InjectedScriptManager19injectedScriptForIdEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InjectedScriptManager19injectedScriptIdForEPN3JSC14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InjectedScriptManager22discardInjectedScriptsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InjectedScriptManager23didCreateInjectedScriptERKNS_14InjectedScriptE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InjectedScriptManager25injectedScriptForObjectIdERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InjectedScriptManager7connectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InjectedScriptManagerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InjectedScriptManagerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InjectedScriptManagerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InjectedScriptManagerdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InjectedScriptManagernaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InjectedScriptManagernaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InjectedScriptManagernwEm10NotNullTagPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InjectedScriptManagernwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InjectedScriptManagernwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorConsoleAgent10countResetEPN3JSC14JSGlobalObjectERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorConsoleAgent10stopTimingEPN3JSC14JSGlobalObjectERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorConsoleAgent12setHeapAgentEPNS_18InspectorHeapAgentE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorConsoleAgent13discardValuesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorConsoleAgent16takeHeapSnapshotERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorConsoleAgent27didCreateFrontendAndBackendEPNS_14FrontendRouterEPNS_17BackendDispatcherE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorConsoleAgent29willDestroyFrontendAndBackendENS_16DisconnectReasonE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorConsoleAgent5countEPN3JSC14JSGlobalObjectERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorConsoleAgentC1ERNS_12AgentContextE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorConsoleAgentC2ERNS_12AgentContextE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorConsoleAgentD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorConsoleAgentD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorConsoleAgentD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorConsoleAgentdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorConsoleAgentdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorConsoleAgentnaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorConsoleAgentnaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorConsoleAgentnwEm10NotNullTagPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorConsoleAgentnwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorConsoleAgentnwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgent21injectedScriptManagerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgent27didCreateFrontendAndBackendEPNS_14FrontendRouterEPNS_17BackendDispatcherE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgent27setTypeProfilerEnabledStateEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgent29willDestroyFrontendAndBackendENS_16DisconnectReasonE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgent34setControlFlowProfilerEnabledStateEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgentC2ERNS_12AgentContextE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgentD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgentD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgentD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgentdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgentdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgentnaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgentnaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgentnwEm10NotNullTagPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgentnwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgentnwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21PageBackendDispatcher6createERNS_17BackendDispatcherEPNS_28PageBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21PageBackendDispatcherC1ERNS_17BackendDispatcherEPNS_28PageBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21PageBackendDispatcherC2ERNS_17BackendDispatcherEPNS_28PageBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21PageBackendDispatcherD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21PageBackendDispatcherD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21RemoteInspectorServer5startEPKct() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21RemoteInspectorServer9singletonEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21createScriptArgumentsEPN3JSC14JSGlobalObjectEPNS0_9CallFrameEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector21createScriptCallStackEPN3JSC14JSGlobalObjectEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22AuditBackendDispatcher6createERNS_17BackendDispatcherEPNS_29AuditBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22AuditBackendDispatcherC1ERNS_17BackendDispatcherEPNS_29AuditBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22AuditBackendDispatcherC2ERNS_17BackendDispatcherEPNS_29AuditBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22AuditBackendDispatcherD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22AuditBackendDispatcherD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22AuditBackendDispatcherD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22ContentSearchUtilities19searchInTextByLinesERKN3WTF6StringES4_bb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22ContentSearchUtilities22textPositionFromOffsetEmRKN3WTF6VectorImLm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22ContentSearchUtilities26findStylesheetSourceMapURLERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22ContentSearchUtilities29countRegularExpressionMatchesERKN3JSC4Yarr17RegularExpressionERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22ContentSearchUtilities38createRegularExpressionForSearchStringERKN3WTF6StringEbNS0_16SearchStringTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22HeapFrontendDispatcher16trackingCompleteEdRKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22HeapFrontendDispatcherC1ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22HeapFrontendDispatcherC2ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22HeapFrontendDispatcherdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22HeapFrontendDispatcherdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22HeapFrontendDispatchernaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22HeapFrontendDispatchernaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22HeapFrontendDispatchernwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22HeapFrontendDispatchernwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent11addListenerERNS0_8ListenerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent11didContinueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent12assertPausedERN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent13didBecomeIdleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent14removeListenerERNS0_8ListenerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent17clearPauseDetailsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent17currentCallFramesERKNS_14InjectedScriptE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent19clearExceptionValueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent19failedToParseSourceERKN3WTF6StringES4_iiS4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent19handleConsoleAssertERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent19registerIdleHandlerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent20didClearGlobalObjectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent20setSuppressAllPausesEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent21breakpointActionSoundEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent24clearAsyncStackTraceDataEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent24willStepAndMayBecomeIdleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent25buildExceptionPauseReasonEN3JSC7JSValueERKNS_14InjectedScriptE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent26buildBreakpointPauseReasonEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent27didClearAsyncStackTraceDataEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent27scriptExecutionBlockedByCSPERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent28clearDebuggerBreakpointStateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent29clearInspectorBreakpointStateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent29willDestroyFrontendAndBackendENS_16DisconnectReasonE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent6enableEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgentC2ERNS_12AgentContextE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgentD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgentD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgentD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgentdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgentdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgentnaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgentnwEm10NotNullTagPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgentnwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22PageFrontendDispatcher13frameDetachedERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22PageFrontendDispatcher14loadEventFiredEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22PageFrontendDispatcher19frameStartedLoadingERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22PageFrontendDispatcher19frameStoppedLoadingERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22PageFrontendDispatcher20domContentEventFiredEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22PageFrontendDispatcher24frameScheduledNavigationERKN3WTF6StringEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22PageFrontendDispatcherC1ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22PageFrontendDispatcherC2ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22PageFrontendDispatcherdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22PageFrontendDispatcherdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22PageFrontendDispatchernaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22PageFrontendDispatchernaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22PageFrontendDispatchernwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22PageFrontendDispatchernwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22RemoteAutomationTarget11setIsPairedEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22RemoteAutomationTargetC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22RemoteAutomationTargetD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22RemoteAutomationTargetD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22RemoteAutomationTargetD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22RemoteInspectionTarget13setIndicatingEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22RemoteInspectionTarget30unpauseForInitializedInspectorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22RemoteInspectionTargetC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22RemoteInspectionTargetC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22RemoteInspectionTargetD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector22RemoteInspectionTargetaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector23CanvasBackendDispatcherC1ERNS_17BackendDispatcherEPNS_30CanvasBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector23CanvasBackendDispatcherD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector23CanvasBackendDispatcherD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector23CanvasBackendDispatcherD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector23TargetBackendDispatcher6createERNS_17BackendDispatcherEPNS_30TargetBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector23TargetBackendDispatcherC1ERNS_17BackendDispatcherEPNS_30TargetBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector23TargetBackendDispatcherC2ERNS_17BackendDispatcherEPNS_30TargetBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector23TargetBackendDispatcherD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector23TargetBackendDispatcherD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector23TargetBackendDispatcherD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector23WorkerBackendDispatcher6createERNS_17BackendDispatcherEPNS_30WorkerBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector23WorkerBackendDispatcherC1ERNS_17BackendDispatcherEPNS_30WorkerBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector23WorkerBackendDispatcherC2ERNS_17BackendDispatcherEPNS_30WorkerBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector23WorkerBackendDispatcherD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector23WorkerBackendDispatcherD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector23WorkerBackendDispatcherD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24BrowserBackendDispatcher6createERNS_17BackendDispatcherEPNS_31BrowserBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24BrowserBackendDispatcherC1ERNS_17BackendDispatcherEPNS_31BrowserBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24BrowserBackendDispatcherC2ERNS_17BackendDispatcherEPNS_31BrowserBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24BrowserBackendDispatcherD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24BrowserBackendDispatcherD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24BrowserBackendDispatcherD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24CanvasFrontendDispatcher13canvasRemovedERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24CanvasFrontendDispatcher16extensionEnabledERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24CanvasFrontendDispatcher16recordingStartedERKN3WTF6StringENS_8Protocol9Recording9InitiatorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24CanvasFrontendDispatcher18clientNodesChangedERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24CanvasFrontendDispatcher19canvasMemoryChangedERKN3WTF6StringEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24CanvasFrontendDispatcherC1ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24CanvasFrontendDispatcherC2ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24CanvasFrontendDispatcherdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24CanvasFrontendDispatcherdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24CanvasFrontendDispatchernaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24CanvasFrontendDispatchernaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24CanvasFrontendDispatchernwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24CanvasFrontendDispatchernwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24ConsoleBackendDispatcher6createERNS_17BackendDispatcherEPNS_31ConsoleBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24ConsoleBackendDispatcherC1ERNS_17BackendDispatcherEPNS_31ConsoleBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24ConsoleBackendDispatcherC2ERNS_17BackendDispatcherEPNS_31ConsoleBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24ConsoleBackendDispatcherD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24ConsoleBackendDispatcherD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24NetworkBackendDispatcher6createERNS_17BackendDispatcherEPNS_31NetworkBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24NetworkBackendDispatcherC1ERNS_17BackendDispatcherEPNS_31NetworkBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24NetworkBackendDispatcherC2ERNS_17BackendDispatcherEPNS_31NetworkBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24NetworkBackendDispatcherD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24NetworkBackendDispatcherD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24NetworkBackendDispatcherD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24RemoteControllableTarget19setTargetIdentifierEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24RemoteControllableTarget4initEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24RemoteControllableTarget6updateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24RemoteControllableTargetC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24RemoteControllableTargetC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24RemoteControllableTargetD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24RemoteControllableTargetD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24RemoteControllableTargetD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24RemoteControllableTargetaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24RuntimeBackendDispatcher6createERNS_17BackendDispatcherEPNS_31RuntimeBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24RuntimeBackendDispatcherC1ERNS_17BackendDispatcherEPNS_31RuntimeBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24RuntimeBackendDispatcherC2ERNS_17BackendDispatcherEPNS_31RuntimeBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24RuntimeBackendDispatcherD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24RuntimeBackendDispatcherD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24RuntimeBackendDispatcherD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24TargetFrontendDispatcher15targetDestroyedERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24TargetFrontendDispatcher25dispatchMessageFromTargetERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24TargetFrontendDispatcher26didCommitProvisionalTargetERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24TargetFrontendDispatcherC1ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24TargetFrontendDispatcherC2ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24TargetFrontendDispatcherdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24TargetFrontendDispatcherdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24TargetFrontendDispatchernaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24TargetFrontendDispatchernaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24TargetFrontendDispatchernwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24WorkerFrontendDispatcher13workerCreatedERKN3WTF6StringES4_S4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24WorkerFrontendDispatcher16workerTerminatedERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24WorkerFrontendDispatcher25dispatchMessageFromWorkerERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24WorkerFrontendDispatcherC1ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24WorkerFrontendDispatcherC2ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24WorkerFrontendDispatcherdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24WorkerFrontendDispatcherdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24WorkerFrontendDispatchernaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24WorkerFrontendDispatchernaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24WorkerFrontendDispatchernwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector24WorkerFrontendDispatchernwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25BrowserFrontendDispatcherC1ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25BrowserFrontendDispatcherC2ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25BrowserFrontendDispatcherdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25BrowserFrontendDispatcherdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25BrowserFrontendDispatchernaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25BrowserFrontendDispatchernaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25BrowserFrontendDispatchernwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25BrowserFrontendDispatchernwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25ConsoleFrontendDispatcherC1ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25ConsoleFrontendDispatcherC2ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25ConsoleFrontendDispatcherdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25ConsoleFrontendDispatcherdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25ConsoleFrontendDispatchernaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25ConsoleFrontendDispatchernaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25ConsoleFrontendDispatchernwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25ConsoleFrontendDispatchernwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25DatabaseBackendDispatcher6createERNS_17BackendDispatcherEPNS_32DatabaseBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25DatabaseBackendDispatcherC1ERNS_17BackendDispatcherEPNS_32DatabaseBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25DatabaseBackendDispatcherC2ERNS_17BackendDispatcherEPNS_32DatabaseBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25DatabaseBackendDispatcherD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25DatabaseBackendDispatcherD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25DatabaseBackendDispatcherD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25DebuggerBackendDispatcher6createERNS_17BackendDispatcherEPNS_32DebuggerBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25DebuggerBackendDispatcherC1ERNS_17BackendDispatcherEPNS_32DebuggerBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25DebuggerBackendDispatcherC2ERNS_17BackendDispatcherEPNS_32DebuggerBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25DebuggerBackendDispatcherD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25DebuggerBackendDispatcherD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25DebuggerBackendDispatcherD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25NetworkFrontendDispatcher12dataReceivedERKN3WTF6StringEdii() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25NetworkFrontendDispatcher15webSocketClosedERKN3WTF6StringEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25NetworkFrontendDispatcher16webSocketCreatedERKN3WTF6StringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25NetworkFrontendDispatcher19webSocketFrameErrorERKN3WTF6StringEdS4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25NetworkFrontendDispatcherC1ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25NetworkFrontendDispatcherC2ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25NetworkFrontendDispatcherdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25NetworkFrontendDispatcherdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25NetworkFrontendDispatchernaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25NetworkFrontendDispatchernaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25NetworkFrontendDispatchernwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25NetworkFrontendDispatchernwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25RuntimeFrontendDispatcherC1ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25RuntimeFrontendDispatcherC2ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25RuntimeFrontendDispatcherdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25RuntimeFrontendDispatcherdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25RuntimeFrontendDispatchernaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25RuntimeFrontendDispatchernaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25RuntimeFrontendDispatchernwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25RuntimeFrontendDispatchernwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25TimelineBackendDispatcher6createERNS_17BackendDispatcherEPNS_32TimelineBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25TimelineBackendDispatcherC1ERNS_17BackendDispatcherEPNS_32TimelineBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25TimelineBackendDispatcherC2ERNS_17BackendDispatcherEPNS_32TimelineBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25TimelineBackendDispatcherD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25TimelineBackendDispatcherD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector25TimelineBackendDispatcherD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26AnimationBackendDispatcher6createERNS_17BackendDispatcherEPNS_33AnimationBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26AnimationBackendDispatcherC1ERNS_17BackendDispatcherEPNS_33AnimationBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26AnimationBackendDispatcherC2ERNS_17BackendDispatcherEPNS_33AnimationBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26AnimationBackendDispatcherD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26AnimationBackendDispatcherD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26AnimationBackendDispatcherD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26DatabaseFrontendDispatcherC1ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26DatabaseFrontendDispatcherC2ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26DatabaseFrontendDispatcherdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26DatabaseFrontendDispatcherdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26DatabaseFrontendDispatchernaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26DatabaseFrontendDispatchernaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26DatabaseFrontendDispatchernwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26DatabaseFrontendDispatchernwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26DebuggerFrontendDispatcher19globalObjectClearedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26DebuggerFrontendDispatcher19scriptFailedToParseERKN3WTF6StringES4_iiS4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26DebuggerFrontendDispatcher25playBreakpointActionSoundEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26DebuggerFrontendDispatcher7resumedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26DebuggerFrontendDispatcherC1ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26DebuggerFrontendDispatcherC2ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26DebuggerFrontendDispatcherdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26DebuggerFrontendDispatcherdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26DebuggerFrontendDispatchernaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26DebuggerFrontendDispatchernaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26DebuggerFrontendDispatchernwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26DebuggerFrontendDispatchernwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26InspectorBackendDispatcher6createERNS_17BackendDispatcherEPNS_33InspectorBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26InspectorBackendDispatcherC1ERNS_17BackendDispatcherEPNS_33InspectorBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26InspectorBackendDispatcherC2ERNS_17BackendDispatcherEPNS_33InspectorBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26InspectorBackendDispatcherD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26InspectorBackendDispatcherD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26InspectorBackendDispatcherD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26LayerTreeBackendDispatcher6createERNS_17BackendDispatcherEPNS_33LayerTreeBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26LayerTreeBackendDispatcherC1ERNS_17BackendDispatcherEPNS_33LayerTreeBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26LayerTreeBackendDispatcherC2ERNS_17BackendDispatcherEPNS_33LayerTreeBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26LayerTreeBackendDispatcherD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26LayerTreeBackendDispatcherD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26TimelineFrontendDispatcher16recordingStartedEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26TimelineFrontendDispatcher16recordingStoppedEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26TimelineFrontendDispatcher18autoCaptureStartedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26TimelineFrontendDispatcherC1ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26TimelineFrontendDispatcherC2ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26TimelineFrontendDispatcherdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26TimelineFrontendDispatcherdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26TimelineFrontendDispatchernaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26TimelineFrontendDispatchernaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26TimelineFrontendDispatchernwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector26TimelineFrontendDispatchernwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27AnimationFrontendDispatcher13targetChangedERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27AnimationFrontendDispatcher13trackingStartEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27AnimationFrontendDispatcher16trackingCompleteEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27AnimationFrontendDispatcher18animationDestroyedERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27AnimationFrontendDispatcherC1ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27AnimationFrontendDispatcherC2ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27AnimationFrontendDispatcherdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27AnimationFrontendDispatcherdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27AnimationFrontendDispatchernaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27AnimationFrontendDispatchernaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27AnimationFrontendDispatchernwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27AnimationFrontendDispatchernwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27CSSBackendDispatcherHandlerC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27CSSBackendDispatcherHandlerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27CSSBackendDispatcherHandlerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27CSSBackendDispatcherHandlerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27CSSBackendDispatcherHandlerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27DOMBackendDispatcherHandlerC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27DOMBackendDispatcherHandlerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27DOMBackendDispatcherHandlerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27DOMBackendDispatcherHandlerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27DOMBackendDispatcherHandlerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27DOMStorageBackendDispatcher6createERNS_17BackendDispatcherEPNS_34DOMStorageBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27DOMStorageBackendDispatcherC1ERNS_17BackendDispatcherEPNS_34DOMStorageBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27DOMStorageBackendDispatcherC2ERNS_17BackendDispatcherEPNS_34DOMStorageBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27DOMStorageBackendDispatcherD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27DOMStorageBackendDispatcherD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27DOMStorageBackendDispatcherD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27InspectorFrontendDispatcher25evaluateForTestInFrontendERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27InspectorFrontendDispatcherC1ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27InspectorFrontendDispatcherC2ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27InspectorFrontendDispatcherdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27InspectorFrontendDispatcherdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27InspectorFrontendDispatchernaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27InspectorFrontendDispatchernaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27InspectorFrontendDispatchernwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27InspectorFrontendDispatchernwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27LayerTreeFrontendDispatcher18layerTreeDidChangeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27LayerTreeFrontendDispatcherC1ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27LayerTreeFrontendDispatcherC2ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27LayerTreeFrontendDispatcherdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27LayerTreeFrontendDispatcherdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27LayerTreeFrontendDispatchernaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27LayerTreeFrontendDispatchernaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27LayerTreeFrontendDispatchernwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27LayerTreeFrontendDispatchernwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27PerGlobalObjectWrapperWorld10addWrapperEPN3JSC14JSGlobalObjectEPNS1_8JSObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27PerGlobalObjectWrapperWorld10getWrapperEPN3JSC14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27PerGlobalObjectWrapperWorld16clearAllWrappersEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27PerGlobalObjectWrapperWorldC1ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27PerGlobalObjectWrapperWorldC1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27PerGlobalObjectWrapperWorldC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27PerGlobalObjectWrapperWorldC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27PerGlobalObjectWrapperWorldD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27PerGlobalObjectWrapperWorldD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector27PerGlobalObjectWrapperWorldaSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28DOMDebuggerBackendDispatcher6createERNS_17BackendDispatcherEPNS_35DOMDebuggerBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28DOMDebuggerBackendDispatcherC1ERNS_17BackendDispatcherEPNS_35DOMDebuggerBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28DOMDebuggerBackendDispatcherC2ERNS_17BackendDispatcherEPNS_35DOMDebuggerBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28DOMDebuggerBackendDispatcherD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28DOMDebuggerBackendDispatcherD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28DOMStorageFrontendDispatcherC1ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28DOMStorageFrontendDispatcherC2ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28DOMStorageFrontendDispatcherdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28DOMStorageFrontendDispatcherdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28DOMStorageFrontendDispatchernaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28DOMStorageFrontendDispatchernaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28DOMStorageFrontendDispatchernwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28DOMStorageFrontendDispatchernwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28HeapBackendDispatcherHandlerC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28HeapBackendDispatcherHandlerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28HeapBackendDispatcherHandlerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28HeapBackendDispatcherHandlerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28HeapBackendDispatcherHandlerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgent16trackingCompleteEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgent17didEvaluateScriptEN3WTF7SecondsEN3JSC15ProfilingReasonE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgent18willEvaluateScriptEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgent27didCreateFrontendAndBackendEPNS_14FrontendRouterEPNS_17BackendDispatcherE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgent29stopSamplingWhenDisconnectingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgent29willDestroyFrontendAndBackendENS_16DisconnectReasonE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgent8addEventEN3WTF7SecondsES2_N3JSC15ProfilingReasonE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgentC1ERNS_12AgentContextE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgentC2ERNS_12AgentContextE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgentD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgentD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgentdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgentdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgentnaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgentnaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgentnwEm10NotNullTagPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgentnwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgentnwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28PageBackendDispatcherHandlerC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28PageBackendDispatcherHandlerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28PageBackendDispatcherHandlerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28PageBackendDispatcherHandlerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector28PageBackendDispatcherHandlerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector29AuditBackendDispatcherHandlerC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector29AuditBackendDispatcherHandlerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector29AuditBackendDispatcherHandlerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector29AuditBackendDispatcherHandlerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector29AuditBackendDispatcherHandlerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector29SupplementalBackendDispatcherC2ERNS_17BackendDispatcherE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector29SupplementalBackendDispatcherD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector29SupplementalBackendDispatcherD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector29SupplementalBackendDispatcherD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector30CanvasBackendDispatcherHandlerC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector30CanvasBackendDispatcherHandlerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector30CanvasBackendDispatcherHandlerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector30CanvasBackendDispatcherHandlerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector30CanvasBackendDispatcherHandlerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector30TargetBackendDispatcherHandlerC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector30TargetBackendDispatcherHandlerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector30TargetBackendDispatcherHandlerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector30TargetBackendDispatcherHandlerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector30TargetBackendDispatcherHandlerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector30WorkerBackendDispatcherHandlerC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector30WorkerBackendDispatcherHandlerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector30WorkerBackendDispatcherHandlerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector30WorkerBackendDispatcherHandlerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector30WorkerBackendDispatcherHandlerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31BrowserBackendDispatcherHandlerC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31BrowserBackendDispatcherHandlerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31BrowserBackendDispatcherHandlerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31BrowserBackendDispatcherHandlerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31BrowserBackendDispatcherHandlerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31ConsoleBackendDispatcherHandlerC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31ConsoleBackendDispatcherHandlerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31ConsoleBackendDispatcherHandlerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31ConsoleBackendDispatcherHandlerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31ConsoleBackendDispatcherHandlerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31NetworkBackendDispatcherHandler20LoadResourceCallback11sendSuccessERKN3WTF6StringES5_i() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31NetworkBackendDispatcherHandler20LoadResourceCallbackD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31NetworkBackendDispatcherHandlerC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31NetworkBackendDispatcherHandlerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31NetworkBackendDispatcherHandlerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31NetworkBackendDispatcherHandlerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31NetworkBackendDispatcherHandlerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31RuntimeBackendDispatcherHandlerC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31RuntimeBackendDispatcherHandlerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31RuntimeBackendDispatcherHandlerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31RuntimeBackendDispatcherHandlerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31RuntimeBackendDispatcherHandlerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31ScriptProfilerBackendDispatcher6createERNS_17BackendDispatcherEPNS_38ScriptProfilerBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31ScriptProfilerBackendDispatcherC1ERNS_17BackendDispatcherEPNS_38ScriptProfilerBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31ScriptProfilerBackendDispatcherC2ERNS_17BackendDispatcherEPNS_38ScriptProfilerBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31ScriptProfilerBackendDispatcherD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31ScriptProfilerBackendDispatcherD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31ScriptProfilerBackendDispatcherD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector31createScriptCallStackForConsoleEPN3JSC14JSGlobalObjectEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector32DatabaseBackendDispatcherHandler18ExecuteSQLCallbackD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector32DatabaseBackendDispatcherHandler18ExecuteSQLCallbackD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector32DatabaseBackendDispatcherHandlerC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector32DatabaseBackendDispatcherHandlerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector32DatabaseBackendDispatcherHandlerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector32DatabaseBackendDispatcherHandlerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector32DatabaseBackendDispatcherHandlerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector32DatabaseBackendDispatcherHandleraSERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector32DebuggerBackendDispatcherHandlerC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector32DebuggerBackendDispatcherHandlerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector32DebuggerBackendDispatcherHandlerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector32DebuggerBackendDispatcherHandlerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector32ScriptProfilerFrontendDispatcher13trackingStartEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector32ScriptProfilerFrontendDispatcherC1ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector32ScriptProfilerFrontendDispatcherC2ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector32ScriptProfilerFrontendDispatcherdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector32ScriptProfilerFrontendDispatcherdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector32ScriptProfilerFrontendDispatchernaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector32ScriptProfilerFrontendDispatchernaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector32ScriptProfilerFrontendDispatchernwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector32ScriptProfilerFrontendDispatchernwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector32TimelineBackendDispatcherHandlerC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector32TimelineBackendDispatcherHandlerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector33AnimationBackendDispatcherHandlerC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector33AnimationBackendDispatcherHandlerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector33AnimationBackendDispatcherHandlerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector33AnimationBackendDispatcherHandlerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector33AnimationBackendDispatcherHandlerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector33ApplicationCacheBackendDispatcher6createERNS_17BackendDispatcherEPNS_40ApplicationCacheBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector33ApplicationCacheBackendDispatcherC1ERNS_17BackendDispatcherEPNS_40ApplicationCacheBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector33ApplicationCacheBackendDispatcherC2ERNS_17BackendDispatcherEPNS_40ApplicationCacheBackendDispatcherHandlerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector33ApplicationCacheBackendDispatcherD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector33ApplicationCacheBackendDispatcherD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector33ApplicationCacheBackendDispatcherD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector33InspectorBackendDispatcherHandlerC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector33InspectorBackendDispatcherHandlerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector33InspectorBackendDispatcherHandlerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector33InspectorBackendDispatcherHandlerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector33InspectorBackendDispatcherHandlerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector33LayerTreeBackendDispatcherHandlerC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector33LayerTreeBackendDispatcherHandlerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector33LayerTreeBackendDispatcherHandlerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector33LayerTreeBackendDispatcherHandlerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector33LayerTreeBackendDispatcherHandlerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector34ApplicationCacheFrontendDispatcher19networkStateUpdatedEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector34ApplicationCacheFrontendDispatcher29applicationCacheStatusUpdatedERKN3WTF6StringES4_i() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector34ApplicationCacheFrontendDispatcherC1ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector34ApplicationCacheFrontendDispatcherC2ERNS_14FrontendRouterE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector34ApplicationCacheFrontendDispatcherdaEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector34ApplicationCacheFrontendDispatcherdlEPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector34ApplicationCacheFrontendDispatchernaEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector34ApplicationCacheFrontendDispatchernaEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector34ApplicationCacheFrontendDispatchernwEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector34ApplicationCacheFrontendDispatchernwEmPv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector34DOMStorageBackendDispatcherHandlerC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector34DOMStorageBackendDispatcherHandlerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector34DOMStorageBackendDispatcherHandlerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector34DOMStorageBackendDispatcherHandlerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector34DOMStorageBackendDispatcherHandlerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector34createScriptCallStackFromExceptionEPN3JSC14JSGlobalObjectEPNS0_9ExceptionEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector35DOMDebuggerBackendDispatcherHandlerC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector35DOMDebuggerBackendDispatcherHandlerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector35DOMDebuggerBackendDispatcherHandlerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector35DOMDebuggerBackendDispatcherHandlerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector35DOMDebuggerBackendDispatcherHandlerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector38ScriptProfilerBackendDispatcherHandlerC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector38ScriptProfilerBackendDispatcherHandlerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector38ScriptProfilerBackendDispatcherHandlerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector38ScriptProfilerBackendDispatcherHandlerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector38ScriptProfilerBackendDispatcherHandlerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector40ApplicationCacheBackendDispatcherHandlerC2ERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector40ApplicationCacheBackendDispatcherHandlerC2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector40ApplicationCacheBackendDispatcherHandlerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector40ApplicationCacheBackendDispatcherHandlerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector40ApplicationCacheBackendDispatcherHandlerD2Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime12EntryPreviewEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime12RemoteObject4TypeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime12RemoteObject7SubtypeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime12RemoteObjectEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime13ObjectPreview4TypeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime13ObjectPreview7SubtypeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime13ObjectPreviewEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime15CollectionEntryEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime15PropertyPreview4TypeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime15PropertyPreview7SubtypeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime15PropertyPreviewEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime18PropertyDescriptorEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime26InternalPropertyDescriptorEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_8Debugger15FunctionDetailsEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_8Debugger5Scope4TypeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_8Debugger5ScopeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_8Debugger8LocationEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_8Debugger9CallFrameEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_8Timeline9EventTypeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK14OpaqueJSString6stringEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC10CodeOrigin4dumpERN3WTF11PrintStreamE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC10JSFunction10sourceCodeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC10JSFunction23isHostFunctionNonInlineEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC11ArrayBuffer5sliceEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC11ArrayBuffer5sliceEdd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC12JSRopeString11resolveRopeEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC12JSRopeString23resolveRopeToAtomStringEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC12JSRopeString31resolveRopeToExistingAtomStringEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC12PropertySlot14functionGetterEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC12StackVisitor5Frame12functionNameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC12StackVisitor5Frame20computeLineAndColumnERjS2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC12StackVisitor5Frame8toStringEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC12StackVisitor5Frame9sourceURLEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC13JSArrayBuffer8isSharedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC13RuntimeMethod6methodEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC14CachedBytecode13commitUpdatesERKN3WTF8FunctionIFvlPKvmEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC14CellAttributes4dumpERN3WTF11PrintStreamE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC14FullCodeOrigin4dumpERN3WTF11PrintStreamE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC14ProtoCallFrame13argumentCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC14ProtoCallFrame26argumentCountIncludingThisEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC14ProtoCallFrame6calleeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC14ProtoCallFrame9thisValueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC16ScriptExecutable8lastLineEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC16ScriptExecutable9endColumnEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC17DebuggerCallFrame8positionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC17DebuggerCallFrame8sourceIDEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC17DebuggerCallFrame9thisValueERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC18BasicBlockLocation8dumpDataEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC18BytecodeCacheError7isValidEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC18BytecodeCacheError7messageEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC18GCActivityCallback9isEnabledEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC18PropertyDescriptor10enumerableEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC18PropertyDescriptor16isDataDescriptorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC18PropertyDescriptor20isAccessorDescriptorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC18PropertyDescriptor6getterEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC18PropertyDescriptor8writableEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC19CacheableIdentifier4dumpERN3WTF11PrintStreamE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC19ControlFlowProfiler8dumpDataEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC19HeapSnapshotBuilder18descriptionForCellEPNS_6JSCellE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC22FullGCActivityCallback13didGCRecentlyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC23VariableWriteFireDetail4dumpERN3WTF11PrintStreamE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC2VM29deprecatedVMEntryGlobalObjectEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC4Yarr17RegularExpression13matchedLengthEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC6DOMJIT9HeapRange4dumpERN3WTF11PrintStreamE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC6JSCell11toPrimitiveEPNS_14JSGlobalObjectENS_22PreferredPrimitiveTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC6JSCell12toObjectSlowEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC6JSCell8toNumberEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC6JSCell9getStringEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC6JSCell9getStringEPNS_14JSGlobalObjectERN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC7ArgList8getSliceEiRS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC7JSValue16toNumberSlowCaseEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC7JSValue16toObjectSlowCaseEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC7JSValue16toStringSlowCaseEPNS_14JSGlobalObjectEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC7JSValue19synthesizePrototypeEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC7JSValue19toWTFStringSlowCaseEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC7JSValue20toIntegerPreserveNaNEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC7JSValue4dumpERN3WTF11PrintStreamE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC8Bindings10RootObject12globalObjectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC8Bindings13RuntimeObject19getInternalInstanceEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC8FreeList4dumpERN3WTF11PrintStreamE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC8JSObject11hasPropertyEPNS_14JSGlobalObjectENS_12PropertyNameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC8JSObject11hasPropertyEPNS_14JSGlobalObjectEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC8JSObject11toPrimitiveEPNS_14JSGlobalObjectENS_22PreferredPrimitiveTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC8JSObject8toNumberEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC8JSObject8toStringEPNS_14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC8JSString13equalSlowCaseEPNS_14JSGlobalObjectEPS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC8Profiler8Database4saveEPKc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC9CallFrame10codeOriginEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC9CallFrame11callerFrameERPNS_10EntryFrameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC9ClassInfo4dumpERN3WTF11PrintStreamE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC9CodeBlock26reoptimizationRetryCounterEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC9CodeBlock4dumpERN3WTF11PrintStreamE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC9JSPromise6resultERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC9JSPromise6statusERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3JSC9JSPromise9isHandledERNS_2VME() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF10AtomString23convertToASCIILowercaseEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF10AtomString23convertToASCIIUppercaseEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF10StringView16GraphemeClusters8IteratordeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF10StringView16GraphemeClusters8IteratoreqERKS2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF11Persistence7Decoder28bufferIsLargeEnoughToContainEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF12ASCIILiteral4dumpERNS_11PrintStreamE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF13MonotonicTime4dumpERNS_11PrintStreamE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF13StringBuilder11reifyStringEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF14MediaTimeRange12toJSONStringEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF15AutomaticThread19hasUnderlyingThreadERKNS_14AbstractLockerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF15AutomaticThread4nameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF17double_conversion23DoubleToStringConverter13ToExponentialEdiPNS0_13StringBuilderE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF19MetaAllocatorHandle4dumpERNS_11PrintStreamE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF24TimeWithDynamicClockType4dumpERNS_11PrintStreamE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF3URL11hostAndPortEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF3URL14fileSystemPathEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF3URL16isMatchingDomainENS_10StringViewE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF3URL17lastPathComponentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF3URL19protocolHostAndPortEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF3URL21truncatedForUseAsBaseEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF3URL24strippedForUseAsReferrerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF3URL30stringCenterEllipsizedToLengthEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF3URL4dumpERNS_11PrintStreamE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF3URL4userEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF3URL8passwordEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF6Logger17LogSiteIdentifier8toStringEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF6String18simplifyWhiteSpaceEPFbDsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF6String25splitAllowingEmptyEntriesEDs() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF6String28convertToLowercaseWithLocaleERKNS_10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF6String28convertToUppercaseWithLocaleERKNS_10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF6String29charactersWithNullTerminationEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF6String31convertToLowercaseWithoutLocaleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF6String31convertToUppercaseWithoutLocaleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF6String57convertToLowercaseWithoutLocaleStartingAtFailingIndex8BitEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF6String5splitEDs() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF6String7toFloatEPb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF6String8foldCaseEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF6String8toDoubleEPb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF6Thread4dumpERNS_11PrintStreamE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF7RunLoop9TimerBase16secondsUntilFireEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF7RunLoop9TimerBase8isActiveEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF7Seconds4dumpERNS_11PrintStreamE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF8Collator11collateUTF8EPKcS2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF8Collator7collateENS_10StringViewES1_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF8JSONImpl10ObjectBase10memoryCostEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF8JSONImpl10ObjectBase9getStringERKNS_6StringERS2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF8JSONImpl5Value10memoryCostEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF8JSONImpl5Value12toJSONStringEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF8JSONImpl5Value4typeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF8JSONImpl5Value6isNullEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF8JSONImpl5Value8asDoubleERd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF8JSONImpl5Value9asIntegerERi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF8JSONImpl5Value9writeJSONERNS_13StringBuilderE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF8JSONImpl9ArrayBase10memoryCostEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF8JSONImpl9ArrayBase3getEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF8JSONImpl9ArrayBase5beginEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF8JSONImpl9ArrayBase9writeJSONERNS_13StringBuilderE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF8WallTime4dumpERNS_11PrintStreamE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9BitVector11isEmptySlowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9BitVector12bitCountSlowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9BitVector12hashSlowCaseEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9BitVector14equalsSlowCaseERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9BitVector4dumpERNS_11PrintStreamE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTime11toTimeScaleEjNS0_13RoundingFlagsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTime12isIndefiniteEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTime12toJSONObjectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTime12toJSONStringEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTime14hasBeenRoundedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTime14hasDoubleValueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTime18isNegativeInfiniteEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTime18isPositiveInfiniteEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTime4dumpERNS_11PrintStreamE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTime7compareERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTime7isValidEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTime7toFloatEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTime8toDoubleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTime8toStringEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTime9isBetweenERKS0_S2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTime9isInvalidEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTime9timeFlagsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTime9timeScaleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTime9timeValueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTimecvbEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTimeeqERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTimegeERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTimegtERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTimeleERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTimeltERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTimemiERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTimemlEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTimengEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTimentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK3WTF9MediaTimeplERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10FileHandlecvbEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10FontRanges16fontForCharacterEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10FontRanges17fontForFirstRangeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10FontRanges21glyphDataForCharacterEiNS_30ExternalResourceDownloadPolicyE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10JSDocument7wrappedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10MouseEvent11fromElementEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10MouseEvent9toElementEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10PluginData16supportsMimeTypeERKN3WTF6StringENS0_18AllowedPluginTypesE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10PluginData17webVisiblePluginsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10PluginData19webVisibleMimeTypesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10PluginData26supportsWebVisibleMimeTypeERKN3WTF6StringENS0_18AllowedPluginTypesE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10PluginData32supportsWebVisibleMimeTypeForURLERKN3WTF6StringENS0_18AllowedPluginTypesERKNS1_3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10RenderText16firstRunLocationEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10RenderText16linesBoundingBoxEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10RenderText8textNodeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10RenderView12documentRectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10RenderView15usesCompositingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10RenderView20unscaledDocumentRectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10ScrollView10layoutSizeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10ScrollView12contentsSizeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10ScrollView14scrollbarModesERNS_13ScrollbarModeES2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10ScrollView14useFixedLayoutEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10ScrollView15fixedLayoutSizeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10ScrollView16contentsToScreenERKNS_7IntRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10ScrollView16contentsToWindowERKNS_7IntRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10ScrollView16contentsToWindowERKNS_8IntPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10ScrollView16windowToContentsERKNS_7IntRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10ScrollView16windowToContentsERKNS_8IntPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10ScrollView18contentsToRootViewERKNS_10FloatPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10ScrollView18contentsToRootViewERKNS_7IntRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10ScrollView18contentsToRootViewERKNS_8IntPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10ScrollView18contentsToRootViewERKNS_9FloatRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10ScrollView18exposedContentRectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10ScrollView18rootViewToContentsERKNS_10FloatPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10ScrollView18rootViewToContentsERKNS_7IntRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10ScrollView18rootViewToContentsERKNS_8IntPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10ScrollView18rootViewToContentsERKNS_9FloatRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10ScrollView21unobscuredContentRectENS_14ScrollableArea36VisibleContentRectIncludesScrollbarsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10ScrollView21unobscuredContentSizeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10ScrollView22contentsScrollPositionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10ScrollView23rootViewToTotalContentsERKNS_8IntPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10ScrollView29unobscuredContentRectInternalENS_14ScrollableArea36VisibleContentRectIncludesScrollbarsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10ScrollView42documentScrollPositionRelativeToViewOriginEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10StorageMap6lengthEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10StorageMap7getItemERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10StorageMap8containsERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10TimeRanges3endEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10TimeRanges4copyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10TimeRanges5startEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10TimeRanges6lengthEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore10TimeRanges7nearestEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11BitmapImage21decodeCountForTestingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11CSSPageRule12selectorTextEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11CachedImage20imageSizeForRendererEPKNS_13RenderElementENS0_8SizeTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11ContentType13containerTypeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11ContentType9parameterERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11EventRegioneqERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11FontCascadeeqERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11FontChanges18createEditingStyleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11FrameLoader10isCompleteEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11FrameLoader14cancelledErrorERKNS_15ResourceRequestE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11FrameLoader14frameHasLoadedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11FrameLoader16outgoingReferrerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11FrameLoader17networkingContextEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11FrameLoader20activeDocumentLoaderEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11FrameLoader27numPendingOrLoadingRequestsEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11FrameLoader28blockedByContentBlockerErrorERKNS_15ResourceRequestE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11FrameLoader7frameIDEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11FrameLoader8loadTypeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11HTMLElement10spellcheckEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11HTMLElement15contentEditableEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11HTMLElement18canonicalInputModeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11HTMLElement21canonicalEnterKeyHintEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11HTMLElement3dirEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11HTMLElement5titleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11HTMLElement9translateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11HistoryItem11hasChildrenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11HistoryItem11originalURLEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11HistoryItem12isTargetItemEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11HistoryItem13documentStateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11HistoryItem14alternateTitleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11HistoryItem14scrollPositionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11HistoryItem15formContentTypeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11HistoryItem15pageScaleFactorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11HistoryItem17originalURLStringEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11HistoryItem20hasCachedPageExpiredEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11HistoryItem27shouldRestoreScrollPositionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11HistoryItem28shouldOpenExternalURLsPolicyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11HistoryItem3urlEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11HistoryItem4copyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11HistoryItem5titleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11HistoryItem6targetEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11HistoryItem8childrenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11HistoryItem8referrerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11HistoryItem9urlStringEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11JSDOMMatrix7wrappedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer11currentTimeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer11initialTimeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer12getStartDateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer13isVideoPlayerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer13movieLoadTypeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer13platformLayerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer13playerPrivateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer13requestedRateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer14preservesPitchEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer15contentMIMETypeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer15extraMemoryCostEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer16canSaveMediaDataEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer16supportsScanningEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer17contentTypeCodecsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer17decodedFrameCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer17doesHaveAttributeERKN3WTF10AtomStringEPS2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer17droppedFrameCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer17engineDescriptionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer17hasClosedCaptionsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer17platformErrorCodeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer18maxFastForwardRateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer18minFastReverseRateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer18shouldDisableSleepEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer18supportsFullscreenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer19mediaCacheDirectoryEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer19playerContentsScaleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer20playerContentBoxRectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer20renderingModeChangedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer21audioDecodedByteCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer21mediaTimeForTimeValueERKN3WTF9MediaTimeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer21videoDecodedByteCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer22didPassCORSAccessCheckEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer22documentSecurityOriginEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer22hasAvailableVideoFrameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer24shouldUsePersistentCacheEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer24supportsPictureInPictureEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer25preferredDynamicRangeModeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer25renderingCanBeAcceleratedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer26shouldCheckHardwareSupportEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer27languageOfPrimaryAudioTrackEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer27sourceApplicationIdentifierEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer28requiresImmediateCompositingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer28supportsAcceleratedRenderingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer29preferredAudioCharacteristicsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer31maximumDurationToCacheMediaTimeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer31requiresTextTrackRepresentationEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer35platformVolumeConfigurationRequiredEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer39contentMIMETypeWasInferredFromExtensionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer41mediaContentTypesRequiringHardwareSupportEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer4rateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer5endedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer5mutedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer6clientEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer6pausedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer6volumeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer7preloadEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer7seekingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer8durationEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer8fileSizeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer8hasAudioEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer8hasVideoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer8referrerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer9isLoopingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MediaPlayer9startTimeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MemoryCache16originsWithCacheEN3PAL9SessionIDE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11MessagePort3refEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11PageOverlay10controllerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11PageOverlay19viewToOverlayOffsetEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11PageOverlay5frameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11PageOverlay6boundsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11RenderLayer19absoluteBoundingBoxEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11RenderLayer35isTransparentRespectingParentFramesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11RenderStyle10lineHeightEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11RenderStyle11fontCascadeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11RenderStyle15fontDescriptionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11RenderStyle18computedLineHeightEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11RenderStyle26colorByApplyingColorFilterERKNS_5ColorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11RenderVideo8videoBoxEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11XPathResult10resultTypeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11XPathResult11numberValueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11XPathResult11stringValueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11XPathResult12booleanValueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11XPathResult14snapshotLengthEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11XPathResult15singleNodeValueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore11XPathResult20invalidIteratorStateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12BlobDataItem6lengthEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12CSSMediaRule5mediaEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12CSSStyleRule12selectorTextEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12DOMTokenList5valueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12DOMTokenList8containsERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12EventHandler27capsLockStateMayHaveChangedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12GridPosition12spanPositionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12GridPosition15integerPositionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12NamedNodeMap12getNamedItemERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12NamedNodeMap14getNamedItemNSERKN3WTF10AtomStringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12NamedNodeMap4itemEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12NamedNodeMap6lengthEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12RenderInline16linesBoundingBoxEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12RenderObject12enclosingBoxEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12RenderObject14enclosingLayerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12RenderObject15containingBlockEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12RenderObject16repaintRectangleERKNS_10LayoutRectEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12RenderObject17useDarkAppearanceEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12RenderObject23absoluteBoundingBoxRectEbPb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12RenderObject39pixelSnappedAbsoluteClippedOverflowRectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12RenderObject44hasNonEmptyVisibleRectRespectingParentFramesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12RenderObject7childAtEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12RenderWidget14windowClipRectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12SettingsBase15fixedFontFamilyE11UScriptCode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12SettingsBase15serifFontFamilyE11UScriptCode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12SettingsBase17cursiveFontFamilyE11UScriptCode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12SettingsBase17fantasyFontFamilyE11UScriptCode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12SettingsBase18standardFontFamilyE11UScriptCode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12SettingsBase19sansSerifFontFamilyE11UScriptCode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12SettingsBase20pictographFontFamilyE11UScriptCode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12SharedBuffer4dataEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12TextIterator4nodeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12TextIterator5rangeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore12WebAnimation14timeToNextTickEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13CSSImportRule10styleSheetEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13CSSImportRule4hrefEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13CSSImportRule5mediaEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13ContainerNode15countChildNodesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13ContainerNode16lastElementChildEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13ContainerNode17childElementCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13ContainerNode17firstElementChildEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13ContainerNode17traverseToChildAtEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13FetchResponse16resourceResponseEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13GraphicsLayer18getDebugBorderInfoERNS_5ColorERf() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13GraphicsLayer26backingStoreMemoryEstimateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HTTPHeaderMap3getENS_14HTTPHeaderNameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HTTPHeaderMap8containsENS_14HTTPHeaderNameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HTTPHeaderMap8containsERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HitTestResult10isSelectedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HitTestResult10targetNodeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HitTestResult11targetFrameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HitTestResult11textContentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HitTestResult12mediaIsVideoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HitTestResult12selectedTextEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HitTestResult13mediaHasAudioEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HitTestResult13targetElementEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HitTestResult14absolutePDFURLEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HitTestResult14innerNodeFrameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HitTestResult15absoluteLinkURLEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HitTestResult15spellingToolTipERNS_13TextDirectionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HitTestResult16absoluteImageURLEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HitTestResult16absoluteMediaURLEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HitTestResult16altDisplayStringEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HitTestResult17isContentEditableEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HitTestResult18titleDisplayStringEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HitTestResult19isDownloadableMediaEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HitTestResult19listBasedTestResultEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HitTestResult19mediaIsInFullscreenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HitTestResult21innerNonSharedElementEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HitTestResult21linkSuggestedFilenameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HitTestResult34isOverTextInsideFormControlElementEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HitTestResult5imageEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HitTestResult5titleERNS_13TextDirectionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13HitTestResult9imageRectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13ImageDocument12imageElementEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13JSHTMLElement21pushEventHandlerScopeEPN3JSC14JSGlobalObjectEPNS1_7JSScopeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13JSHTMLElement7wrappedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13KeyboardEvent7keyCodeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13KeyboardEvent8charCodeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13MIMETypeCache11isAvailableEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13MIMETypeCache7isEmptyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13RenderElement16imageOrientationEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore13ScriptElement13scriptContentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14CredentialBase11hasPasswordEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14CredentialBase11persistenceEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14CredentialBase4userEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14CredentialBase7isEmptyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14CredentialBase8passwordEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14DOMCacheEngine6Record4copyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14DocumentLoader11frameLoaderEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14DocumentLoader11subresourceERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14DocumentLoader12subresourcesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14DocumentLoader13urlForHistoryEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14DocumentLoader16mainResourceDataEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14DocumentLoader16mouseEventPolicyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14DocumentLoader18mainResourceLoaderEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14DocumentLoader19isLoadingInAPISenseEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14DocumentLoader21archiveResourceForURLERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14DocumentLoader28urlForHistoryReflectsFailureEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14DocumentLoader9isLoadingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14FrameSelection11currentFormEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14FrameSelection15copyTypingStyleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14FrameSelection18isFocusedAndActiveEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14FrameSelection31getClippedVisibleTextRectanglesERN3WTF6VectorINS_9FloatRectELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEENS0_19TextRectangleHeightE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14FrameSelection36rootEditableElementOrDocumentElementEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14HTMLCollection13namedItemSlowERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14JSVoidCallback22scriptExecutionContextEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14JSWebAnimation7wrappedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14LoaderStrategy11usePingLoadEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14LoaderStrategy12ongoingLoadsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14LoaderStrategy27havePerformedSecurityChecksERKNS_16ResourceResponseE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14LoaderStrategy27shouldPerformSecurityChecksEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14LoggedInStatus10hasExpiredEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14LoggedInStatus6expiryEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14ResourceHandle6clientEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14ResourceLoader11frameLoaderEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14ResourceLoader28shouldIncludeCertificateInfoEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14ResourceLoader32isAllowedToAskUserForCredentialsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14ScrollableArea12scrollOffsetEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14ScrollableArea13scrolledToTopEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14ScrollableArea14scrollAnimatorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14ScrollableArea14scrolledToLeftEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14ScrollableArea15scrolledToRightEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14ScrollableArea16scrolledToBottomEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14ScrollableArea17totalContentsSizeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14ScrollableArea18scrollbarIntrusionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14ScrollableArea18visibleContentRectENS0_26VisibleContentRectBehaviorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14ScrollableArea20contentAreaWillPaintEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14ScrollableArea21mouseEnteredScrollbarEPNS_9ScrollbarE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14ScrollableArea21scrollbarsCanBeActiveEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14ScrollableArea22mouseExitedContentAreaEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14ScrollableArea23mouseEnteredContentAreaEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14ScrollableArea23mouseMovedInContentAreaEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14ScrollableArea24scrollOffsetFromPositionENS_8IntPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14ScrollableArea24scrollPositionFromOffsetENS_8IntPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14ScrollableArea26reachableTotalContentsSizeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14ScrollableArea26visibleContentRectInternalENS0_36VisibleContentRectIncludesScrollbarsENS0_26VisibleContentRectBehaviorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14ScrollableArea32verticalScrollbarStateForTestingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14ScrollableArea34horizontalScrollbarStateForTestingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14ScrollableArea37visibleContentRectIncludingScrollbarsENS0_26VisibleContentRectBehaviorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14SecurityOrigin11toRawStringEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14SecurityOrigin12isolatedCopyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14SecurityOrigin14isSameOriginAsERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14SecurityOrigin23domainForCachePartitionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14SecurityOrigin33isMatchingRegistrableDomainSuffixERKN3WTF6StringEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14SecurityOrigin5equalEPKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14SecurityOrigin8toStringEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14StaticNodeList4itemEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14StaticNodeList6lengthEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore14StyleSheetList6lengthEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15ActiveDOMObject16isContextStoppedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15ActiveDOMObject18hasPendingActivityEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15ActiveDOMObject20isAllowedToRunScriptEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15ActiveDOMObject25virtualHasPendingActivityEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15ActiveDOMObject30assertSuspendIfNeededWasCalledEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15AffineTransform9mapRegionERKNS_6RegionE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15CSSGroupingRule8cssRulesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15CertificateInfo12isolatedCopyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15FocusController18focusedOrMainFrameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15HTMLAreaElement11computeRectEPNS_12RenderObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15HTMLAreaElement12imageElementEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15HTMLBaseElement4hrefEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15HTMLFormElement12autocompleteEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15HTMLFormElement6actionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15HTMLFormElement6lengthEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15HTMLFormElement6methodEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15HTMLLinkElement11crossOriginEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15HTMLLinkElement2asEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15HTMLLinkElement3relEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15HTTPHeaderField4nameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15HTTPHeaderField5valueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15JSDOMWindowBase17printErrorMessageERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15JSDOMWindowBase22scriptExecutionContextEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15JSDOMWindowBase5proxyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15JSDOMWindowBase7wrappedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15JSSVGSVGElement7wrappedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15ProgressTracker17estimatedProgressEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15SQLiteStatement18bindParameterCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15SecurityContext14securityOriginEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15StyleProperties11mutableCopyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15StyleProperties16getPropertyValueENS_13CSSPropertyIDE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15StyleProperties19getPropertyCSSValueENS_13CSSPropertyIDE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15VisiblePosition14characterAfterEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15VisiblePosition19absoluteCaretBoundsEPb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15VisiblePosition30absoluteSelectionBoundsForLineEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15VisiblePosition45lineDirectionPointForBlockDirectionNavigationEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15VisiblePosition4leftEbPb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15VisiblePosition4nextENS_27EditingBoundaryCrossingRuleEPb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15VisiblePosition5rightEbPb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore15VisiblePosition8previousENS_27EditingBoundaryCrossingRuleEPb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16BackForwardCache10frameCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16BlobRegistryImpl11filesInBlobERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16BlobRegistryImpl18getBlobDataFromURLERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16DOMGuardedObject11isSuspendedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16DOMGuardedObject12globalObjectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16DOMGuardedObject13guardedObjectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16DOMGuardedObject7isEmptyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16DocumentFragment14getElementByIdERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16DocumentTimeline17animationIntervalEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16DocumentTimeline34numberOfActiveAnimationsForTestingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16DocumentTimeline48numberOfAnimationTimelineInvalidationsForTestingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16FileReaderLoader17arrayBufferResultEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLImageElement11cachedImageEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLImageElement11crossOriginEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLImageElement12naturalWidthEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLImageElement1xEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLImageElement1yEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLImageElement36pendingDecodePromisesCountForTestingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLImageElement3altEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLImageElement8completeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLInputElement10isURLFieldEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLInputElement11isDateFieldEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLInputElement11isTextFieldEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLInputElement11isTimeFieldEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLInputElement11isWeekFieldEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLInputElement11valueAsDateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLInputElement12defaultValueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLInputElement12isEmailFieldEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLInputElement12isFileUploadEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLInputElement12isMonthFieldEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLInputElement13isNumberFieldEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLInputElement13isSearchFieldEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLInputElement13valueAsNumberEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLInputElement15isPasswordFieldEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLInputElement15suggestedColorsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLInputElement16isTelephoneFieldEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLInputElement17validationMessageEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLInputElement18shouldAutocompleteEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLInputElement20isDateTimeLocalFieldEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLInputElement21autoFillButtonElementEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLInputElement3altEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLInputElement5valueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLInputElement5widthEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLInputElement6heightEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLInputElement6isTextEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLInputElement8multipleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLLabelElement4formEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLLabelElement7controlEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLMediaElement11canPlayTypeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLMediaElement11crossOriginEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLMediaElement11currentTimeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLMediaElement12getStartDateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLMediaElement12isFullscreenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLMediaElement12networkStateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLMediaElement12playbackRateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLMediaElement15bufferingPolicyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLMediaElement20webkitPreservesPitchEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLMediaElement23webkitHasClosedCaptionsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLMediaElement27webkitClosedCaptionsVisibleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLMediaElement33lastMediaResourceLoaderForTestingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLMediaElement5endedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLMediaElement5errorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLMediaElement5mutedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLMediaElement6pausedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLMediaElement6volumeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLMediaElement7canPlayEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLMediaElement7preloadEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLMediaElement7seekingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLMediaElement8controlsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLMediaElement8durationEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLOListElement9itemCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLStyleElement8disabledEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLTableElement5tFootEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLTableElement5tHeadEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLTableElement7captionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLTitleElement4textEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLVideoElement10videoWidthEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16HTMLVideoElement11videoHeightEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16ISOSchemeTypeBox10schemeTypeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16ISOSchemeTypeBox13schemeVersionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16JSStringCallback22scriptExecutionContextEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16JSXMLHttpRequest7wrappedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16JSXMLHttpRequest8responseERN3JSC14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16TrackPrivateBase10trackIndexEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16TrackPrivateBase17startTimeVarianceEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16TrackPrivateBase2idEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16TrackPrivateBase5labelEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16TrackPrivateBase8languageEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16URLDecomposition4hashEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16URLDecomposition4hostEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16URLDecomposition4portEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16URLDecomposition6searchEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16URLDecomposition8hostnameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16URLDecomposition8pathnameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16URLDecomposition8protocolEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16VisibleSelection16hasEditableStyleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16VisibleSelection17isContentEditableEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16VisibleSelection17isInPasswordFieldEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16VisibleSelection19rootEditableElementEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16VisibleSelection23isContentRichlyEditableEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore16VisibleSelection5isAllENS_27EditingBoundaryCrossingRuleE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17ActiveDOMCallback17canInvokeCallbackEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17ActiveDOMCallback25activeDOMObjectAreStoppedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17ActiveDOMCallback28activeDOMObjectsAreSuspendedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17CSSPrimitiveValue11stringValueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17CharacterIterator5rangeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17CredentialStorage22originsWithCredentialsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17FullscreenManager19isFullscreenEnabledEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17FullscreenManager21isAnimatingFullscreenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17FullscreenManager27areFullscreenControlsHiddenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17HTMLAnchorElement4hrefEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17HTMLAnchorElement6originEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17HTMLLegendElement4formEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17HTMLOptionElement18ownerSelectElementEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17HTMLOptionElement21isDisabledFormControlEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17HTMLOptionElement4textEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17HTMLOptionElement5indexEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17HTMLOptionElement5labelEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17HTMLOptionElement5valueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17HTMLPlugInElement12pluginWidgetENS0_19PluginLoadingPolicyE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17HTMLScriptElement11crossOriginEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17HTMLScriptElement5asyncEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17HTMLSelectElement13selectedIndexEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17HTMLSelectElement5valueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17HTMLSelectElement6lengthEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17HTMLSelectElement9listItemsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17JSDOMGlobalObject13worldIsNormalEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17JSDOMGlobalObject22scriptExecutionContextEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17JSHTMLLinkElement7wrappedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17MouseRelatedEvent1xEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17MouseRelatedEvent29locationInRootViewCoordinatesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17ParsedContentType9serializeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17RenderTextControl22textFormControlElementEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17ResourceErrorBase12isolatedCopyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17ResourceErrorBase8lazyInitEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17SMILTimeContainer19animationFrameDelayEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17SubresourceLoader15originalHeadersEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore17TiledBackingStore13mapToContentsERKNS_7IntRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18CustomHeaderFields22thirdPartyDomainsMatchERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18DOMWindowExtension5frameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18HTMLMarqueeElement11scrollDelayEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18HTMLMarqueeElement12scrollAmountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18HTMLMarqueeElement4loopEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18JSHTMLImageElement7wrappedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18JSHTMLInputElement7wrappedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18JSHTMLMediaElement7wrappedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18JSHTMLVideoElement7wrappedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18MessagePortChannel31hasAnyMessagesPendingOrInFlightEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18ParsedContentRange11headerValueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18PlatformPasteboard10readStringEmRKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18PlatformPasteboard29typesSafeForDOMToReadAndWriteERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18PlatformTimeRanges13totalDurationEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18PlatformTimeRanges19maximumBufferedTimeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18PlatformTimeRanges3endEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18PlatformTimeRanges3endEjRb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18PlatformTimeRanges4dumpERN3WTF11PrintStreamE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18PlatformTimeRanges4findERKN3WTF9MediaTimeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18PlatformTimeRanges5startEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18PlatformTimeRanges5startEjRb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18PlatformTimeRanges6lengthEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18PlatformTimeRanges7containERKN3WTF9MediaTimeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18PlatformTimeRanges7nearestERKN3WTF9MediaTimeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18PlatformTimeRanges8durationEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18RenderLayerBacking11contentsBoxEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18RenderLayerBacking12tiledBackingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18RenderLayerBacking20compositingLayerTypeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18RenderLayerBacking26backingStoreMemoryEstimateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18SecurityOriginData14securityOriginEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18SecurityOriginData18databaseIdentifierEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18SecurityOriginData8toStringEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18StyleSheetContents21isLoadingSubresourcesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18TextureMapperLayer10hasFiltersEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18TextureMapperLayer11shouldBlendEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18TextureMapperLayer12drawsContentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18TextureMapperLayer18contentsAreVisibleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18TextureMapperLayer38descendantsOrSelfHaveRunningAnimationsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18TextureMapperLayer4sizeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18TextureMapperLayer7opacityEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18TextureMapperLayer8childrenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18TextureMapperLayer9isVisibleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18TextureMapperLayer9layerRectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18TextureMapperLayer9rootLayerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore18TextureMapperLayer9transformEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19BlurFilterOperation11movesPixelsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19BlurFilterOperation12stdDeviationEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19BlurFilterOperation14affectsOpacityEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19BlurFilterOperation5cloneEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19BlurFilterOperationeqERKNS_15FilterOperationE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19DragCaretController23isContentRichlyEditableEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19DragCaretController30caretRectInRootViewCoordinatesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19DragCaretController40editableElementRectInRootViewCoordinatesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19HTMLOptGroupElement14groupLabelTextEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19HTMLOptGroupElement18ownerSelectElementEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19HTMLTableRowElement15sectionRowIndexEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19HTMLTableRowElement8rowIndexEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19HTMLTextAreaElement12defaultValueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19HTMLTextAreaElement5valueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19InspectorController13drawHighlightERNS_15GraphicsContextE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19InspectorController17shouldShowOverlayEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19JSHTMLSelectElement7wrappedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19MediaElementSession20behaviorRestrictionsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19MediaElementSession22allowsPictureInPictureEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19ProtectionSpaceBase15isPasswordBasedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19ProtectionSpaceBase26receivesCredentialSecurelyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19ProtectionSpaceBase7isProxyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19ResourceRequestBase10httpMethodEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19ResourceRequestBase10httpOriginEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19ResourceRequestBase10isSameSiteEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19ResourceRequestBase11cachePolicyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19ResourceRequestBase12httpReferrerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19ResourceRequestBase12isolatedCopyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19ResourceRequestBase13httpUserAgentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19ResourceRequestBase13isConditionalEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19ResourceRequestBase15httpContentTypeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19ResourceRequestBase15httpHeaderFieldENS_14HTTPHeaderNameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19ResourceRequestBase15timeoutIntervalEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19ResourceRequestBase16httpHeaderFieldsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19ResourceRequestBase18hasHTTPHeaderFieldENS_14HTTPHeaderNameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19ResourceRequestBase20firstPartyForCookiesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19ResourceRequestBase3urlEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19ResourceRequestBase6isNullEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19ResourceRequestBase7isEmptyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19ResourceRequestBase8httpBodyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19ResourceRequestBase8priorityEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19ResourceRequestBase9hasUploadEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19ResourceRequestBase9isTopSiteEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore19UIEventWithKeyState16getModifierStateERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20CachedResourceLoader11isPreloadedERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20DeprecatedCSSOMValue12cssValueTypeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20DeprecatedCSSOMValue7cssTextEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20FontAttributeChanges10editActionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20FontAttributeChanges18createEditingStyleEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20HTMLTableCellElement18rowSpanForBindingsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20HTMLTableCellElement5scopeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20HTMLTableCellElement7colSpanEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20HTMLTableCellElement9cellAboveEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20HTMLTableCellElement9cellIndexEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20ISOOriginalFormatBox10dataFormatEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20LowPowerModeNotifier21isLowPowerModeEnabledEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20PasteboardCustomData18createSharedBufferEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20PasteboardWriterData7isEmptyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20RenderBoxModelObject18inlineContinuationEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20ResourceResponseBase11httpVersionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20ResourceResponseBase12isAttachmentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20ResourceResponseBase12isSuccessfulEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20ResourceResponseBase13isRedirectionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20ResourceResponseBase14httpStatusCodeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20ResourceResponseBase14httpStatusTextEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20ResourceResponseBase14isInHTTPFamilyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20ResourceResponseBase15httpHeaderFieldENS_14HTTPHeaderNameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20ResourceResponseBase16httpHeaderFieldsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20ResourceResponseBase16textEncodingNameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20ResourceResponseBase17suggestedFilenameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20ResourceResponseBase21expectedContentLengthEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20ResourceResponseBase23hasCacheValidatorFieldsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20ResourceResponseBase24isAttachmentWithFilenameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20ResourceResponseBase27cacheControlContainsNoCacheEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20ResourceResponseBase27cacheControlContainsNoStoreEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20ResourceResponseBase29cacheControlContainsImmutableEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20ResourceResponseBase34cacheControlContainsMustRevalidateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20ResourceResponseBase3urlEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20ResourceResponseBase6sourceEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20ResourceResponseBase8isHTTP09Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20ResourceResponseBase8lazyInitENS0_9InitLevelE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20ResourceResponseBase8mimeTypeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20ScrollingCoordinator25scrollableContainerNodeIDERKNS_12RenderObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore20ScrollingCoordinator36coordinatesScrollingForOverflowLayerERKNS_11RenderLayerE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21BackForwardController12forwardCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21BackForwardController18canGoBackOrForwardEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21BackForwardController9backCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21ContentSecurityPolicy15responseHeadersEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21ContentSecurityPolicy22overridesXFrameOptionsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21ContentSecurityPolicy30upgradeInsecureRequestIfNeededERN3WTF3URLENS0_19InsecureRequestTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21ContentSecurityPolicy30upgradeInsecureRequestIfNeededERNS_15ResourceRequestENS0_19InsecureRequestTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21HTMLFrameOwnerElement13contentWindowEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21HTMLFrameOwnerElement15contentDocumentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21HTMLOptionsCollection13selectedIndexEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21ISOTrackEncryptionBox10defaultKIDEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21ISOTrackEncryptionBox17defaultConstantIVEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21ISOTrackEncryptionBox18defaultIsProtectedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21ISOTrackEncryptionBox22defaultPerSampleIVSizeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21JSRemoteDOMWindowBase7wrappedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21JSTextTrackCueGeneric7wrappedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21NetworkStorageSession10hasCookiesERKNS_17RegistrableDomainEON3WTF17CompletionHandlerIFvbEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21NetworkStorageSession18cookieAcceptPolicyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21NetworkStorageSession26getAllStorageAccessEntriesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21NetworkStorageSession28shouldBlockThirdPartyCookiesERKNS_17RegistrableDomainE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21NetworkStorageSession33hasHadUserInteractionAsFirstPartyERKNS_17RegistrableDomainE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21NetworkStorageSession55shouldBlockThirdPartyCookiesButKeepFirstPartyCookiesForERKNS_17RegistrableDomainE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21PageOverlayController20viewOverlayRootLayerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21PageOverlayController24documentOverlayRootLayerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21RenderLayerCompositor15rootRenderLayerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21WheelEventDeltaFilter13filteredDeltaEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore21WheelEventDeltaFilter16filteredVelocityEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22DefaultFilterOperation15representedTypeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22DefaultFilterOperation5cloneEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22DefaultFilterOperationeqERKNS_15FilterOperationE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient10hasWebViewEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient12blockedErrorERKNS_15ResourceRequestE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient12canCachePageEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient14cancelledErrorERKNS_15ResourceRequestE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient14shouldFallBackERKNS_13ResourceErrorE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient15canShowMIMETypeERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient16canHandleRequestERKNS_15ResourceRequestE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient17overrideMediaTypeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient18cannotShowURLErrorERKNS_15ResourceRequestE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient21canShowMIMETypeAsHTMLERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient21fileDoesNotExistErrorERKNS_16ResourceResponseE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient21shouldGoToHistoryItemERNS_11HistoryItemE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient23cannotShowMIMETypeErrorERKNS_16ResourceResponseE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient24isEmptyFrameLoaderClientEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient25pluginWillHandleLoadErrorERKNS_16ResourceResponseE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient28blockedByContentBlockerErrorERKNS_15ResourceRequestE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient31interruptedForPolicyChangeErrorERKNS_15ResourceRequestE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient9userAgentERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22HTMLFormControlElement10formActionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22HTMLFormControlElement10formMethodEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22HTMLFormControlElement11formEnctypeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22HTMLFormControlElement12autocompleteEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22HTMLFormControlElement12autofillDataEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22ResourceLoadStatistics6encodeERNS_12KeyedEncoderE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22ResourceLoadStatistics8toStringEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore22ScriptExecutionContext23domainForCachePartitionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore23ApplicationCacheStorage11maximumSizeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore23FrameLoaderStateMachine15firstLayoutDoneEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore23FrameLoaderStateMachine23committingFirstRealLoadEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore23FrameLoaderStateMachine28creatingInitialEmptyDocumentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore23FrameLoaderStateMachine32isDisplayingInitialEmptyDocumentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore23ISOSchemeInformationBox18schemeSpecificDataEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore24CachedResourceHandleBase3getEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore24CachedResourceHandleBasecvMS0_PNS_14CachedResourceEEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore24CachedResourceHandleBasentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore24CoordinatedGraphicsLayer13platformLayerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore24CoordinatedGraphicsLayer14primaryLayerIDEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore24CoordinatedGraphicsLayer16compositionLayerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore24CoordinatedGraphicsLayer17usesContentsLayerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore24CoordinatedGraphicsLayer22filtersCanBeCompositedERKNS_16FilterOperationsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore24CoordinatedGraphicsLayer22shouldHaveBackingStoreEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore24CoordinatedGraphicsLayer26isCoordinatedGraphicsLayerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore24CoordinatedGraphicsLayer28shouldDirectlyCompositeImageEPNS_5ImageE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore24CoordinatedGraphicsLayer2idEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore24CoordinatedGraphicsLayer41selfOrAncestorHasActiveTransformAnimationEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore25DropShadowFilterOperation11movesPixelsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore25DropShadowFilterOperation12stdDeviationEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore25DropShadowFilterOperation14affectsOpacityEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore25DropShadowFilterOperation1xEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore25DropShadowFilterOperation1yEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore25DropShadowFilterOperation5cloneEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore25DropShadowFilterOperation5colorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore25DropShadowFilterOperation8locationEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore25DropShadowFilterOperationeqERKNS_15FilterOperationE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore26HTMLTextFormControlElement12selectionEndEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore26HTMLTextFormControlElement14selectionStartEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore26HTMLTextFormControlElement18selectionDirectionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore26HTMLTextFormControlElement21lastChangeWasUserEditEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore26HTMLTextFormControlElement23visiblePositionForIndexEi() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore26HTMLTextFormControlElement26isInnerTextElementEditableEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore26ISOProtectionSchemeInfoBox13schemeTypeBoxEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore26ISOProtectionSchemeInfoBox17originalFormatBoxEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore26ISOProtectionSchemeInfoBox20schemeInformationBoxEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore26NetscapePlugInStreamLoader6isDoneEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore27AuthenticationChallengeBase15failureResponseEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore27AuthenticationChallengeBase15protectionSpaceEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore27AuthenticationChallengeBase18proposedCredentialEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore27AuthenticationChallengeBase20previousFailureCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore27AuthenticationChallengeBase5errorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore27AuthenticationChallengeBase6isNullEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore27ScriptedAnimationController17throttlingReasonsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore27ScriptedAnimationController8intervalEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore28InspectorFrontendClientLocal13inspectedPageEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore28InspectorFrontendClientLocal15inspectionLevelEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore28InspectorFrontendClientLocal28userInterfaceLayoutDirectionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore29DeprecatedCSSOMPrimitiveValue12getRectValueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore29DeprecatedCSSOMPrimitiveValue13getFloatValueEt() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore29DeprecatedCSSOMPrimitiveValue13primitiveTypeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore29DeprecatedCSSOMPrimitiveValue14getStringValueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore29DeprecatedCSSOMPrimitiveValue15getCounterValueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore29DeprecatedCSSOMPrimitiveValue16getRGBColorValueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore30InvertLightnessFilterOperation5cloneEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore30InvertLightnessFilterOperationeqERKNS_15FilterOperationE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore31BasicColorMatrixFilterOperation17passthroughAmountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore31BasicColorMatrixFilterOperation5cloneEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore31BasicColorMatrixFilterOperation6amountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore31BasicColorMatrixFilterOperationeqERKNS_15FilterOperationE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore31SimplifiedBackwardsTextIterator5rangeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore32FixedPositionViewportConstraints28layerPositionForViewportRectERKNS_9FloatRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore33StickyPositionViewportConstraints32layerPositionForConstrainingRectERKNS_9FloatRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore36ISOProtectionSystemSpecificHeaderBox4dataEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore36ISOProtectionSystemSpecificHeaderBox6keyIDsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore36ISOProtectionSystemSpecificHeaderBox8systemIDEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore37BasicComponentTransferFilterOperation14affectsOpacityEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore37BasicComponentTransferFilterOperation17passthroughAmountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore37BasicComponentTransferFilterOperation5cloneEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore37BasicComponentTransferFilterOperation6amountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore37BasicComponentTransferFilterOperationeqERKNS_15FilterOperationE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore37CrossOriginAccessControlCheckDisabler36crossOriginAccessControlCheckEnabledEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Attr5valueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Blob4sizeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4File12lastModifiedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Node10shadowHostEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Node11isEqualNodeEPS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Node11textContentEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Node12lookupPrefixERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Node13ownerDocumentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Node14isDescendantOfERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Node16computeNodeIndexEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Node18computeEditabilityENS0_22UserSelectAllTreatmentENS0_17ShouldUpdateStyleE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Node18isDefaultNamespaceERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Node18lookupNamespaceURIERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Node18nextElementSiblingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Node19rootEditableElementEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Node21isRootEditableElementEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Node22previousElementSiblingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Node26containsIncludingShadowDOMEPKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Node7baseURIEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Node9renderBoxEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Page15forEachDocumentERKN3WTF8FunctionIFvRNS_8DocumentEEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Page15visibilityStateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Page16hasSeenAnyPluginEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Page17useDarkAppearanceEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Page17viewportArgumentsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Page19disabledAdaptationsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Page20renderingUpdateCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Page21wheelEventTestMonitorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Page22editableElementsInRectERKNS_9FloatRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Page23diagnosticLoggingClientEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Page23isMonitoringWheelEventsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Page27pageExtendedBackgroundColorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Page28remoteInspectionNameOverrideEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Page34inLowQualityImageInterpolationModeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Page9groupNameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Page9pageCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Page9selectionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Page9sessionIDEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Path16fastBoundingRectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore4Text9wholeTextEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore5Range10cloneRangeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore5Range11compareNodeERNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore5Range12comparePointERNS_4NodeEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore5Range14intersectsNodeERNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore5Range8toStringEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Chrome10windowRectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Cookie4hashEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6CookieeqERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Cursor14platformCursorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Cursor19setAsPlatformCursorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Editor11textCheckerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Editor12selectedTextEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Editor13canEditRichlyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Editor16hasBidiSelectionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Editor17firstRectForRangeERKNS_11SimpleRangeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Editor17selectionHasStyleENS_13CSSPropertyIDERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Editor23getCompositionSelectionERjS1_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Editor25stringForCandidateRequestEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Editor26selectionStartHasMarkerForENS_14DocumentMarker10MarkerTypeEii() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Editor30applyEditingStyleToBodyElementEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Editor32isContinuousSpellCheckingEnabledEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Editor37baseWritingDirectionForSelectionStartEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Editor6canCutEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Editor6clientEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Editor7Command11isSupportedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Editor7Command15isTextInsertionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Editor7Command26allowExecutionWhenDisabledEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Editor7Command5stateEPNS_5EventE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Editor7Command7executeEPNS_5EventE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Editor7Command7executeERKN3WTF6StringEPNS_5EventE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Editor7Command9isEnabledEPNS_5EventE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Editor7canCopyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Editor7canEditEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Editor9canDeleteEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6JSFile7wrappedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6JSNode21pushEventHandlerScopeEPN3JSC14JSGlobalObjectEPNS1_7JSScopeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6JSNode7wrappedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6JSNode8nodeTypeERN3JSC14JSGlobalObjectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Length3refEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Length5derefEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Path2D4pathEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Quirks25needsYouTubeMouseOutQuirkEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Quirks29shouldAvoidUsingIOS13ForGmailEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Quirks32isNeverRichlyEditableForTouchBarEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Quirks44shouldAvoidResizingWhenInputViewBoundsChangeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Quirks47shouldIgnoreContentObservationForSyntheticClickEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Quirks49isTouchBarUpdateSupressedForHiddenContentEditableEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Quirks50shouldIgnoreAriaForFastPathContentObservationCheckEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Quirks56shouldDispatchSyntheticMouseEventsWhenModifyingSelectionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Quirks61shouldUseLegacySelectPopoverDismissalBehaviorInDataActivationEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Quirks62shouldLayOutAtMinimumWindowWidthWhenIgnoringScalingConstraintsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Region10intersectsERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Region5rectsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Region8containsERKNS_8IntPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Region8containsERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Region9totalAreaEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Widget14platformWidgetEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Widget17convertToRootViewERKNS_7IntRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Widget23convertToContainingViewERKNS_10FloatPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Widget23convertToContainingViewERKNS_7IntRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Widget23convertToContainingViewERKNS_8IntPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Widget23convertToContainingViewERKNS_9FloatRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Widget25convertFromContainingViewERKNS_10FloatPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Widget25convertFromContainingViewERKNS_7IntRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Widget25convertFromContainingViewERKNS_9FloatRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Widget25convertToContainingWindowERKNS_7IntRectE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Widget25convertToContainingWindowERKNS_8IntPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Widget6parentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore6Widget9frameRectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore7Element10attributesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore7Element10screenRectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore7Element12getAttributeERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore7Element12getAttributeERKNS_13QualifiedNameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore7Element12hasAttributeERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore7Element12hasAttributeERKNS_13QualifiedNameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore7Element13hasAttributesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore7Element14getAttributeNSERKN3WTF10AtomStringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore7Element14hasAttributeNSERKN3WTF10AtomStringES4_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore7Element15absoluteLinkURLEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore7Element15getURLAttributeERKNS_13QualifiedNameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore7Element18afterPseudoElementEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore7Element19beforePseudoElementEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore7Element20getIntegralAttributeERKNS_13QualifiedNameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore7Element28getUnsignedIntegralAttributeERKNS_13QualifiedNameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore7Element9innerHTMLEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore7Element9outerHTMLEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8DOMTimer24intervalClampedToMinimumEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document10alinkColorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document10compatModeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document10designModeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document10vlinkColorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document11completeURLERKN3WTF6StringENS_22ScriptExecutionContext9ForceUTF8E() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document11contentTypeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document11topDocumentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document11windowProxyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document12lastModifiedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document13axObjectCacheEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document14bodyOrFramesetEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document15visibilityStateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document16styleRecalcCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document17useDarkAppearanceEPKNS_11RenderStyleE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document17viewportArgumentsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document18monotonicTimestampEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document19useSystemAppearanceEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document20isRunningUserScriptsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document20linkColorForBindingsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document21haveStylesheetsLoadedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document22touchEventHandlerCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document22wheelEventHandlerCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document28characterSetWithUTF8FallbackEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document29originIdentifierForPasteboardEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document29useElevatedUserInterfaceLevelEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document31defaultCharsetForLegacyBindingsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document31displayStringModifiedByEncodingERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document3dirEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document42shouldBypassMainWorldContentSecurityPolicyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document4bodyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document6domainEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document6hiddenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document6loaderEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document7bgColorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document7doctypeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Document8hasFocusEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8FileList4itemEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8FormData12isolatedCopyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8FormData13lengthInBytesEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8FormData14asSharedBufferEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8FormData7flattenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8FormData9asBlobURLEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Location4hostEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Position10downstreamENS_27EditingBoundaryCrossingRuleE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Position13containerNodeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Position24computeNodeAfterPositionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Position24parentAnchoredEquivalentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Position25computeNodeBeforePositionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Position28offsetForPositionAfterAnchorEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Position4nextENS_16PositionMoveTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Position8previousENS_16PositionMoveTypeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Position8upstreamENS_27EditingBoundaryCrossingRuleE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Settings15isScriptEnabledEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Settings16areImagesEnabledEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Settings16showDebugBordersEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Settings18showRepaintCounterEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Settings18webSecurityEnabledEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Settings23needsSiteSpecificQuirksEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Settings26authorAndUserStylesEnabledEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore8Settings28iceCandidateFilteringEnabledEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9CookieJar13getRawCookiesERKNS_8DocumentERKN3WTF3URLERNS4_6VectorINS_6CookieELm0ENS4_15CrashOnOverflowELm16ENS4_10FastMallocEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9CookieJar14cookiesEnabledERKNS_8DocumentE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9CookieJar29cookieRequestHeaderFieldValueERNS_8DocumentERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9CookieJar7cookiesERNS_8DocumentERKN3WTF3URLE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9FrameTree10childCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9FrameTree11scopedChildEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9FrameTree12traverseNextENS_7CanWrapEPNS_7DidWrapE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9FrameTree12traverseNextEPKNS_5FrameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9FrameTree14isDescendantOfEPKNS_5FrameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9FrameTree16traversePreviousENS_7CanWrapEPNS_7DidWrapE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9FrameTree20traverseNextRenderedEPKNS_5FrameE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9FrameTree3topEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9FrameTree6parentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9JSDOMRect7wrappedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9JSElement7wrappedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9MediaList4itemEj() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9RenderBox11borderRadiiEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9RenderBox11clientWidthEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9RenderBox12clientHeightEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9RenderBox19absoluteContentQuadEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9RenderBox20flippedClientBoxRectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9RenderBox22verticalScrollbarWidthEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9RenderBox25horizontalScrollbarHeightEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9RenderBox33canBeScrolledAndHasScrollableAreaEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9SampleMap5emptyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9TimerBase16nextFireIntervalEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9TreeScope14getElementByIdERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9TreeScope14getElementByIdERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9TreeScope16getElementByNameERKN3WTF10AtomStringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9TreeScope23ancestorNodeInThisScopeEPNS_4NodeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7WebCore9TreeScope26ancestorElementInThisScopeEPNS_7ElementE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7bmalloc11IsoTLSEntry4sizeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7bmalloc11IsoTLSEntry6extentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7bmalloc11IsoTLSEntry6offsetEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK7bmalloc11IsoTLSEntry9alignmentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector14ConsoleMessage12globalObjectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector14ConsoleMessage13argumentCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector14ConsoleMessage3urlEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector14ConsoleMessage4lineEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector14ConsoleMessage4typeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector14ConsoleMessage5levelEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector14ConsoleMessage6columnEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector14ConsoleMessage6sourceEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector14ConsoleMessage7isEqualEPS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector14ConsoleMessage7messageEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector14ConsoleMessage9argumentsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector14FrontendRouter12hasFrontendsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector14FrontendRouter12sendResponseERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector14FrontendRouter13frontendCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector14FrontendRouter16hasLocalFrontendEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector14FrontendRouter17hasRemoteFrontendEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector14FrontendRouter9sendEventERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector14InjectedScript10wrapObjectEN3JSC7JSValueERKN3WTF6StringEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector14InjectedScript12previewValueEN3JSC7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector14InjectedScript14findObjectByIdERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector14InjectedScript14wrapCallFramesEN3JSC7JSValueE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector14InjectedScript14wrapJSONStringERKN3WTF6StringES4_b() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector14InjectedScript9wrapTableEN3JSC7JSValueES2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15AsyncStackTrace20buildInspectorObjectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15AsyncStackTrace8isLockedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15AsyncStackTrace9isPendingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15InspectorTarget13isProvisionalEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15InspectorTarget8isPausedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15RemoteInspector16listingForTargetERKNS_24RemoteControllableTargetE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15RemoteInspector21hasActiveDebugSessionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15RemoteInspector26listingForInspectionTargetERKNS_22RemoteInspectionTargetE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15RemoteInspector6Client11browserNameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15RemoteInspector6Client14browserVersionEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15RemoteInspector6clientEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15RemoteInspector7enabledEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15ScriptArguments10argumentAtEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15ScriptArguments12globalObjectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15ScriptArguments13argumentCountEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15ScriptArguments24getFirstArgumentAsStringERN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15ScriptArguments7isEqualERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15ScriptCallFrame10lineNumberEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15ScriptCallFrame12columnNumberEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15ScriptCallFrame12functionNameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15ScriptCallFrame20buildInspectorObjectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15ScriptCallFrame7isEqualERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15ScriptCallFrame8isNativeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15ScriptCallFrame8sourceIDEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15ScriptCallFrame9sourceURLEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15ScriptCallFrameeqERKS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15ScriptCallStack19buildInspectorArrayEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15ScriptCallStack23firstNonNativeCallFrameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15ScriptCallStack2atEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15ScriptCallStack4sizeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector15ScriptCallStack7isEqualEPS0_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector17BackendDispatcher12CallbackBase8isActiveEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector17BackendDispatcher17hasProtocolErrorsEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector17BackendDispatcher8isActiveEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector18InjectedScriptBase10hasNoValueEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector18InjectedScriptBase12globalObjectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector18InjectedScriptBase20injectedScriptObjectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector18InjectedScriptBase20inspectorEnvironmentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector18InjectedScriptBase31hasAccessToInspectedScriptStateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector18InjectedScriptBase4nameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector19InspectorAuditAgent14hasActiveAuditEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector20InspectorTargetAgent14connectionTypeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector21InjectedScriptManager20inspectorEnvironmentEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector21InspectorConsoleAgent22developerExtrasEnabledEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector21InspectorConsoleAgent7enabledEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector22InspectorDebuggerAgent17breakpointsActiveEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector22InspectorDebuggerAgent17shouldBlackboxURLERKN3WTF6StringE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector22InspectorDebuggerAgent21injectedScriptManagerEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector22InspectorDebuggerAgent27pauseOnNextStatementEnabledEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector22InspectorDebuggerAgent7enabledEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector22InspectorDebuggerAgent8isPausedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector22RemoteAutomationTarget4typeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector22RemoteAutomationTarget8isPairedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector22RemoteInspectionTarget20remoteControlAllowedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector22RemoteInspectionTarget26automaticInspectionAllowedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector22RemoteInspectionTarget3urlEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector22RemoteInspectionTarget4nameEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector24RemoteControllableTarget16targetIdentifierEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNK9Inspector28InspectorScriptProfilerAgent18isAlreadyProfilingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNKR3WTF6String12isolatedCopyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZNO3WTF6String12isolatedCopyEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn112_N7WebCore18HTMLMarqueeElement4stopEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn112_NK7WebCore16HTMLInputElement17validationMessageEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn136_N7WebCore16HTMLMediaElement12endScrubbingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn136_N7WebCore16HTMLMediaElement14beginScrubbingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn136_N7WebCore16HTMLMediaElement14setCurrentTimeEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn136_N7WebCore16HTMLMediaElement15enterFullscreenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn136_N7WebCore16HTMLMediaElement16returnToRealtimeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn136_N7WebCore16HTMLMediaElement4playEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn136_N7WebCore16HTMLMediaElement5pauseEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn136_N7WebCore16HTMLMediaElement8setMutedEb() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn136_N7WebCore16HTMLMediaElement9setVolumeEd() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn136_NK7WebCore16HTMLMediaElement11currentTimeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn136_NK7WebCore16HTMLMediaElement12isFullscreenEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn136_NK7WebCore16HTMLMediaElement12playbackRateEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn136_NK7WebCore16HTMLMediaElement5mutedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn136_NK7WebCore16HTMLMediaElement6pausedEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn136_NK7WebCore16HTMLMediaElement6volumeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn136_NK7WebCore16HTMLMediaElement7canPlayEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn136_NK7WebCore16HTMLMediaElement8durationEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn16_N9Inspector14InspectorAgentD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn16_N9Inspector14InspectorAgentD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn16_N9Inspector18InspectorHeapAgentD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn16_N9Inspector18InspectorHeapAgentD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn16_N9Inspector19InspectorAuditAgentD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn16_N9Inspector20InspectorTargetAgentD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn16_N9Inspector20InspectorTargetAgentD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn16_N9Inspector21InspectorConsoleAgentD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn16_N9Inspector21InspectorConsoleAgentD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn16_N9Inspector21InspectorRuntimeAgentD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn16_N9Inspector21InspectorRuntimeAgentD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn16_N9Inspector22InspectorDebuggerAgentD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn16_N9Inspector22InspectorDebuggerAgentD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn16_N9Inspector28InspectorScriptProfilerAgentD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn16_N9Inspector28InspectorScriptProfilerAgentD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn24_N7WebCore14DocumentLoader17addConsoleMessageEN3JSC13MessageSourceENS1_12MessageLevelERKN3WTF6StringEm() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn24_N7WebCore14DocumentLoaderD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn24_N7WebCore14DocumentLoaderD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn24_N7WebCore19MediaResourceLoaderD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn24_N7WebCore19MediaResourceLoaderD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn24_N9Inspector18InspectorHeapAgent17didGarbageCollectEN3JSC15CollectionScopeE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn24_N9Inspector18InspectorHeapAgent18willGarbageCollectEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn24_N9Inspector18InspectorHeapAgentD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn24_N9Inspector22InspectorDebuggerAgentD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn24_N9Inspector22InspectorDebuggerAgentD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn24_N9Inspector28InspectorScriptProfilerAgent17didEvaluateScriptEN3WTF7SecondsEN3JSC15ProfilingReasonE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn24_N9Inspector28InspectorScriptProfilerAgent18willEvaluateScriptEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn24_N9Inspector28InspectorScriptProfilerAgentD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn24_N9Inspector28InspectorScriptProfilerAgentD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn24_NK9Inspector28InspectorScriptProfilerAgent18isAlreadyProfilingEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn32_N7WebCore14DocumentLoader14notifyFinishedERNS_14CachedResourceERKNS_18NetworkLoadMetricsE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn32_N7WebCore14DocumentLoader16redirectReceivedERNS_14CachedResourceEONS_15ResourceRequestERKNS_16ResourceResponseEON3WTF17CompletionHandlerIFvS4_EEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn32_N7WebCore14DocumentLoader16responseReceivedERNS_14CachedResourceERKNS_16ResourceResponseEON3WTF17CompletionHandlerIFvvEEE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn32_N7WebCore14DocumentLoaderD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn32_N7WebCore14DocumentLoaderD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn32_N7WebCore14XMLHttpRequestD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn32_N7WebCore14XMLHttpRequestD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn40_N7WebCore8DOMTimerD0Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn40_N7WebCore8DOMTimerD1Ev() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn64_N7WebCore10ScrollView15setScrollOffsetERKNS_8IntPointE() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI _ZThn64_NK7WebCore10ScrollView12contentsSizeEv() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI libSceNKWebKitUnknown__plus_H5DiAmt0Wg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+H5DiAmt0Wg", libSceNKWebKitUnknown__plus_H5DiAmt0Wg_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown__plus_dfBTQ1j6Js_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+dfBTQ1j6Js", libSceNKWebKitUnknown__plus_dfBTQ1j6Js_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown__plus_iT2E6TqDRA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+iT2E6TqDRA", libSceNKWebKitUnknown__plus_iT2E6TqDRA_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown__plus_jMtDhtTFk4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+jMtDhtTFk4", libSceNKWebKitUnknown__plus_jMtDhtTFk4_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown__plus_lO_plus_dHJcs8s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+lO+dHJcs8s", libSceNKWebKitUnknown__plus_lO_plus_dHJcs8s_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown__plus_ngYlUyHe4E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+ngYlUyHe4E", libSceNKWebKitUnknown__plus_ngYlUyHe4E_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown__plus_obB7JQzFPQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+obB7JQzFPQ", libSceNKWebKitUnknown__plus_obB7JQzFPQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown__plus_pjCBeSm_plus_Mo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+pjCBeSm+Mo", libSceNKWebKitUnknown__plus_pjCBeSm_plus_Mo_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown__minus_f9D0krLNVY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-f9D0krLNVY", libSceNKWebKitUnknown__minus_f9D0krLNVY_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown__minus_iWQeHsj1dE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-iWQeHsj1dE", libSceNKWebKitUnknown__minus_iWQeHsj1dE_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_0bXmnUq4gwI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0bXmnUq4gwI", libSceNKWebKitUnknown_0bXmnUq4gwI_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_0huQF0dbE0o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0huQF0dbE0o", libSceNKWebKitUnknown_0huQF0dbE0o_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_0mmhAX7HkfE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0mmhAX7HkfE", libSceNKWebKitUnknown_0mmhAX7HkfE_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_10YPt3GqbxY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("10YPt3GqbxY", libSceNKWebKitUnknown_10YPt3GqbxY_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_19_minus_F55ZVpzU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("19-F55ZVpzU", libSceNKWebKitUnknown_19_minus_F55ZVpzU_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_1Xyu2Y_plus_DRxk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1Xyu2Y+DRxk", libSceNKWebKitUnknown_1Xyu2Y_plus_DRxk_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_1txZExqLvYw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1txZExqLvYw", libSceNKWebKitUnknown_1txZExqLvYw_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_1u18UyZ7bHY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1u18UyZ7bHY", libSceNKWebKitUnknown_1u18UyZ7bHY_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_24IjD9uyTSU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("24IjD9uyTSU", libSceNKWebKitUnknown_24IjD9uyTSU_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_2F_minus_oNXA1MXc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2F-oNXA1MXc", libSceNKWebKitUnknown_2F_minus_oNXA1MXc_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_2FxExcQ9PYE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2FxExcQ9PYE", libSceNKWebKitUnknown_2FxExcQ9PYE_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_2rJ8CmSDM5o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2rJ8CmSDM5o", libSceNKWebKitUnknown_2rJ8CmSDM5o_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_2sfEbx4JS38_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2sfEbx4JS38", libSceNKWebKitUnknown_2sfEbx4JS38_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_3Oj6rYJvl7s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3Oj6rYJvl7s", libSceNKWebKitUnknown_3Oj6rYJvl7s_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_3bBJrqsgl1U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3bBJrqsgl1U", libSceNKWebKitUnknown_3bBJrqsgl1U_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_3qBM_plus_viOLME_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3qBM+viOLME", libSceNKWebKitUnknown_3qBM_plus_viOLME_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_4zR_minus_a4gyEvc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4zR-a4gyEvc", libSceNKWebKitUnknown_4zR_minus_a4gyEvc_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_52A38mxHq6w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("52A38mxHq6w", libSceNKWebKitUnknown_52A38mxHq6w_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_5vUkf_minus_djbu4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5vUkf-djbu4", libSceNKWebKitUnknown_5vUkf_minus_djbu4_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_5xmf8qd0G3k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5xmf8qd0G3k", libSceNKWebKitUnknown_5xmf8qd0G3k_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_62Yoy7tQOL0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("62Yoy7tQOL0", libSceNKWebKitUnknown_62Yoy7tQOL0_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_66IkT_plus_JzKhw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("66IkT+JzKhw", libSceNKWebKitUnknown_66IkT_plus_JzKhw_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_6tgXhVYoYlY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6tgXhVYoYlY", libSceNKWebKitUnknown_6tgXhVYoYlY_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_6vb9oUDGcQo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("6vb9oUDGcQo", libSceNKWebKitUnknown_6vb9oUDGcQo_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_7_plus_n3DMXSzSE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7+n3DMXSzSE", libSceNKWebKitUnknown_7_plus_n3DMXSzSE_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_7E9sTJnkGUA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7E9sTJnkGUA", libSceNKWebKitUnknown_7E9sTJnkGUA_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_7ECLZAHhILg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7ECLZAHhILg", libSceNKWebKitUnknown_7ECLZAHhILg_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_7o1fdnbBqO8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7o1fdnbBqO8", libSceNKWebKitUnknown_7o1fdnbBqO8_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_93nt7EIfhlE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("93nt7EIfhlE", libSceNKWebKitUnknown_93nt7EIfhlE_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_97tJ0PznsuU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("97tJ0PznsuU", libSceNKWebKitUnknown_97tJ0PznsuU_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_9GZlzGiHmiI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9GZlzGiHmiI", libSceNKWebKitUnknown_9GZlzGiHmiI_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_9L1qYllxgbc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9L1qYllxgbc", libSceNKWebKitUnknown_9L1qYllxgbc_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_9TW5grDg3v0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9TW5grDg3v0", libSceNKWebKitUnknown_9TW5grDg3v0_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_9cP_plus_chWmYl8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9cP+chWmYl8", libSceNKWebKitUnknown_9cP_plus_chWmYl8_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_A_minus_SF0B_minus_Wgzk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("A-SF0B-Wgzk", libSceNKWebKitUnknown_A_minus_SF0B_minus_Wgzk_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_AiYZXV2DRdQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AiYZXV2DRdQ", libSceNKWebKitUnknown_AiYZXV2DRdQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_Ar4Na2HZO8g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ar4Na2HZO8g", libSceNKWebKitUnknown_Ar4Na2HZO8g_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_B4M_minus_2hTd0W4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("B4M-2hTd0W4", libSceNKWebKitUnknown_B4M_minus_2hTd0W4_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_BGTXdn5vfxg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BGTXdn5vfxg", libSceNKWebKitUnknown_BGTXdn5vfxg_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_BhG0O6haZXQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BhG0O6haZXQ", libSceNKWebKitUnknown_BhG0O6haZXQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_Br_minus_D2BUR_minus_Iw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Br-D2BUR-Iw", libSceNKWebKitUnknown_Br_minus_D2BUR_minus_Iw_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_Bxf0zoi3GY4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Bxf0zoi3GY4", libSceNKWebKitUnknown_Bxf0zoi3GY4_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_C_plus_MZtiNSLBs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("C+MZtiNSLBs", libSceNKWebKitUnknown_C_plus_MZtiNSLBs_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_C8SexpcEgQ4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("C8SexpcEgQ4", libSceNKWebKitUnknown_C8SexpcEgQ4_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_CGvkW2Az0X4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CGvkW2Az0X4", libSceNKWebKitUnknown_CGvkW2Az0X4_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_CP_plus_qopfXoYQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CP+qopfXoYQ", libSceNKWebKitUnknown_CP_plus_qopfXoYQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_CQ_plus_q4JsAm_minus_w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CQ+q4JsAm-w", libSceNKWebKitUnknown_CQ_plus_q4JsAm_minus_w_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_CgfCLhQfJLQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("CgfCLhQfJLQ", libSceNKWebKitUnknown_CgfCLhQfJLQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_D0QOURyc7aQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("D0QOURyc7aQ", libSceNKWebKitUnknown_D0QOURyc7aQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_D3wxDn5e0xg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("D3wxDn5e0xg", libSceNKWebKitUnknown_D3wxDn5e0xg_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_DCWpYGMshdw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DCWpYGMshdw", libSceNKWebKitUnknown_DCWpYGMshdw_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_DN41lb55zW4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DN41lb55zW4", libSceNKWebKitUnknown_DN41lb55zW4_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_DT0eiz4BN20_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DT0eiz4BN20", libSceNKWebKitUnknown_DT0eiz4BN20_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_DgtgDTeMzF8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DgtgDTeMzF8", libSceNKWebKitUnknown_DgtgDTeMzF8_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_DkwdxsYZRYQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DkwdxsYZRYQ", libSceNKWebKitUnknown_DkwdxsYZRYQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_E8ePwwwNRsQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("E8ePwwwNRsQ", libSceNKWebKitUnknown_E8ePwwwNRsQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_EgPhZKt_minus_1lQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EgPhZKt-1lQ", libSceNKWebKitUnknown_EgPhZKt_minus_1lQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_EiSQq9E9PtE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EiSQq9E9PtE", libSceNKWebKitUnknown_EiSQq9E9PtE_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_EoSAdnIx72g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EoSAdnIx72g", libSceNKWebKitUnknown_EoSAdnIx72g_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_ErgQM8_plus__plus_hcc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ErgQM8++hcc", libSceNKWebKitUnknown_ErgQM8_plus__plus_hcc_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_FG4XeXSkFqY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FG4XeXSkFqY", libSceNKWebKitUnknown_FG4XeXSkFqY_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_FN_minus_0fRyWoqM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FN-0fRyWoqM", libSceNKWebKitUnknown_FN_minus_0fRyWoqM_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_FVC6kJsyKJY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FVC6kJsyKJY", libSceNKWebKitUnknown_FVC6kJsyKJY_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_FYDuVX3thgU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("FYDuVX3thgU", libSceNKWebKitUnknown_FYDuVX3thgU_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_GI9q6I2Qeos_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GI9q6I2Qeos", libSceNKWebKitUnknown_GI9q6I2Qeos_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_GLBjWBPNUQ8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GLBjWBPNUQ8", libSceNKWebKitUnknown_GLBjWBPNUQ8_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_Gjr9DWbY1bQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Gjr9DWbY1bQ", libSceNKWebKitUnknown_Gjr9DWbY1bQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_GmRdv8ApCm4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GmRdv8ApCm4", libSceNKWebKitUnknown_GmRdv8ApCm4_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_GzDzGfYhw0I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GzDzGfYhw0I", libSceNKWebKitUnknown_GzDzGfYhw0I_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_Himr5mdF6Bw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Himr5mdF6Bw", libSceNKWebKitUnknown_Himr5mdF6Bw_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_HlAUGg263Vg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HlAUGg263Vg", libSceNKWebKitUnknown_HlAUGg263Vg_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_Hx6YjhwHCiM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Hx6YjhwHCiM", libSceNKWebKitUnknown_Hx6YjhwHCiM_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_I21gB8IitFM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("I21gB8IitFM", libSceNKWebKitUnknown_I21gB8IitFM_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_I4M3ZZ1zZwA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("I4M3ZZ1zZwA", libSceNKWebKitUnknown_I4M3ZZ1zZwA_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_I9zB3lkeKUY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("I9zB3lkeKUY", libSceNKWebKitUnknown_I9zB3lkeKUY_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_IKozz2ee2QI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IKozz2ee2QI", libSceNKWebKitUnknown_IKozz2ee2QI_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_IbWVb5T_minus_4sg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IbWVb5T-4sg", libSceNKWebKitUnknown_IbWVb5T_minus_4sg_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_InD3pJjwRIg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("InD3pJjwRIg", libSceNKWebKitUnknown_InD3pJjwRIg_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_IryOBuDL8AA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IryOBuDL8AA", libSceNKWebKitUnknown_IryOBuDL8AA_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_IvZO_plus_CDouSY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IvZO+CDouSY", libSceNKWebKitUnknown_IvZO_plus_CDouSY_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_JFp1Q4L92AQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JFp1Q4L92AQ", libSceNKWebKitUnknown_JFp1Q4L92AQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_JG6Capn3giE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JG6Capn3giE", libSceNKWebKitUnknown_JG6Capn3giE_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_JnoPIZMkoPw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JnoPIZMkoPw", libSceNKWebKitUnknown_JnoPIZMkoPw_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_K7nvR_plus_Og0IE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("K7nvR+Og0IE", libSceNKWebKitUnknown_K7nvR_plus_Og0IE_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_KF_minus_xR65HsDM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KF-xR65HsDM", libSceNKWebKitUnknown_KF_minus_xR65HsDM_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_KQopY6r3_minus_WI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KQopY6r3-WI", libSceNKWebKitUnknown_KQopY6r3_minus_WI_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_KfHDmVh2QZs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KfHDmVh2QZs", libSceNKWebKitUnknown_KfHDmVh2QZs_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_KwQfk41GCp4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KwQfk41GCp4", libSceNKWebKitUnknown_KwQfk41GCp4_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_KxSMJdyXAxs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("KxSMJdyXAxs", libSceNKWebKitUnknown_KxSMJdyXAxs_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_Lkwzsov_plus_QQA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Lkwzsov+QQA", libSceNKWebKitUnknown_Lkwzsov_plus_QQA_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_M_plus_laxFpMQ3U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("M+laxFpMQ3U", libSceNKWebKitUnknown_M_plus_laxFpMQ3U_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_MC5MbWLEZ_plus_w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MC5MbWLEZ+w", libSceNKWebKitUnknown_MC5MbWLEZ_plus_w_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_MCk9_plus_s_minus_Cubg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MCk9+s-Cubg", libSceNKWebKitUnknown_MCk9_plus_s_minus_Cubg_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_MFj9kn_minus_GNfU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MFj9kn-GNfU", libSceNKWebKitUnknown_MFj9kn_minus_GNfU_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_MQ58Akv23e8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MQ58Akv23e8", libSceNKWebKitUnknown_MQ58Akv23e8_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_MXxNWED0LrM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MXxNWED0LrM", libSceNKWebKitUnknown_MXxNWED0LrM_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_MYg_minus_Fz6MYtw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MYg-Fz6MYtw", libSceNKWebKitUnknown_MYg_minus_Fz6MYtw_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_MaTAqdYSJyU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MaTAqdYSJyU", libSceNKWebKitUnknown_MaTAqdYSJyU_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_Mslf2tqdBfU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Mslf2tqdBfU", libSceNKWebKitUnknown_Mslf2tqdBfU_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_N0i04lmGs4o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("N0i04lmGs4o", libSceNKWebKitUnknown_N0i04lmGs4o_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_NcQfxPPgBPU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NcQfxPPgBPU", libSceNKWebKitUnknown_NcQfxPPgBPU_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_O_plus_V6Vy5G_minus_yA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("O+V6Vy5G-yA", libSceNKWebKitUnknown_O_plus_V6Vy5G_minus_yA_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_OPBo8z7aVME_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OPBo8z7aVME", libSceNKWebKitUnknown_OPBo8z7aVME_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_P4DTWOYuot0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("P4DTWOYuot0", libSceNKWebKitUnknown_P4DTWOYuot0_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_PL1EHt_plus_qRcY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PL1EHt+qRcY", libSceNKWebKitUnknown_PL1EHt_plus_qRcY_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_POLEsspzXmY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("POLEsspzXmY", libSceNKWebKitUnknown_POLEsspzXmY_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_PRRF5Nmoaa4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PRRF5Nmoaa4", libSceNKWebKitUnknown_PRRF5Nmoaa4_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_PqqDSc9iQ3U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PqqDSc9iQ3U", libSceNKWebKitUnknown_PqqDSc9iQ3U_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_QTSb0ybillk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QTSb0ybillk", libSceNKWebKitUnknown_QTSb0ybillk_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_QUsmkyWDf6U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QUsmkyWDf6U", libSceNKWebKitUnknown_QUsmkyWDf6U_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_Qj6ArxlMxX4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Qj6ArxlMxX4", libSceNKWebKitUnknown_Qj6ArxlMxX4_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_ROMVKpYxnTg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ROMVKpYxnTg", libSceNKWebKitUnknown_ROMVKpYxnTg_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_Rm5k66YadKA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Rm5k66YadKA", libSceNKWebKitUnknown_Rm5k66YadKA_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_Rq9ndxzAB5I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Rq9ndxzAB5I", libSceNKWebKitUnknown_Rq9ndxzAB5I_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_Rt1kyGp7vvI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Rt1kyGp7vvI", libSceNKWebKitUnknown_Rt1kyGp7vvI_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_RyZ_plus_H8AVDrw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RyZ+H8AVDrw", libSceNKWebKitUnknown_RyZ_plus_H8AVDrw_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_S8qb5wE_plus_Igg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("S8qb5wE+Igg", libSceNKWebKitUnknown_S8qb5wE_plus_Igg_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_T_minus_8QMcPvuMc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("T-8QMcPvuMc", libSceNKWebKitUnknown_T_minus_8QMcPvuMc_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_T7dBbW1f580_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("T7dBbW1f580", libSceNKWebKitUnknown_T7dBbW1f580_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_THqjfA0aAvA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("THqjfA0aAvA", libSceNKWebKitUnknown_THqjfA0aAvA_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_Tc3t6jAA0os_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Tc3t6jAA0os", libSceNKWebKitUnknown_Tc3t6jAA0os_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_U2f0i_minus_WrUkM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("U2f0i-WrUkM", libSceNKWebKitUnknown_U2f0i_minus_WrUkM_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_UF7HRHKcccs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UF7HRHKcccs", libSceNKWebKitUnknown_UF7HRHKcccs_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_UJtrfCZVn7k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UJtrfCZVn7k", libSceNKWebKitUnknown_UJtrfCZVn7k_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_Up3kMId_plus_acM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Up3kMId+acM", libSceNKWebKitUnknown_Up3kMId_plus_acM_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_V_plus_MPxUiaORk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("V+MPxUiaORk", libSceNKWebKitUnknown_V_plus_MPxUiaORk_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_VGtnWbWhDhY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VGtnWbWhDhY", libSceNKWebKitUnknown_VGtnWbWhDhY_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_VJmxbf8istY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VJmxbf8istY", libSceNKWebKitUnknown_VJmxbf8istY_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_VeLInYDKa7A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VeLInYDKa7A", libSceNKWebKitUnknown_VeLInYDKa7A_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_W53m431Ss7s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("W53m431Ss7s", libSceNKWebKitUnknown_W53m431Ss7s_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_WUsnAZlX1Dg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WUsnAZlX1Dg", libSceNKWebKitUnknown_WUsnAZlX1Dg_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_X2yLKCepV_minus_k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("X2yLKCepV-k", libSceNKWebKitUnknown_X2yLKCepV_minus_k_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_XixW5lX0CgU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XixW5lX0CgU", libSceNKWebKitUnknown_XixW5lX0CgU_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_YKete9tBjsY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YKete9tBjsY", libSceNKWebKitUnknown_YKete9tBjsY_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_YvcO2G5lKoQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YvcO2G5lKoQ", libSceNKWebKitUnknown_YvcO2G5lKoQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_Z6atenHrfkE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Z6atenHrfkE", libSceNKWebKitUnknown_Z6atenHrfkE_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_ZXy6SJ2Riao_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZXy6SJ2Riao", libSceNKWebKitUnknown_ZXy6SJ2Riao_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_ZvAYTmLyhdI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ZvAYTmLyhdI", libSceNKWebKitUnknown_ZvAYTmLyhdI_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_aI7kkH5Z_minus_lI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aI7kkH5Z-lI", libSceNKWebKitUnknown_aI7kkH5Z_minus_lI_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_aziZFf3SDqw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aziZFf3SDqw", libSceNKWebKitUnknown_aziZFf3SDqw_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_b2IK7rPPt8E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("b2IK7rPPt8E", libSceNKWebKitUnknown_b2IK7rPPt8E_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_b3RFtTnv8Fg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("b3RFtTnv8Fg", libSceNKWebKitUnknown_b3RFtTnv8Fg_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_blJN0lVQvZI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("blJN0lVQvZI", libSceNKWebKitUnknown_blJN0lVQvZI_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_btUJuALscxA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("btUJuALscxA", libSceNKWebKitUnknown_btUJuALscxA_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_budC85CToRw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("budC85CToRw", libSceNKWebKitUnknown_budC85CToRw_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_c0N9i6oV7IM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("c0N9i6oV7IM", libSceNKWebKitUnknown_c0N9i6oV7IM_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_cH_minus_aumPCdHM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cH-aumPCdHM", libSceNKWebKitUnknown_cH_minus_aumPCdHM_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_cXEDVAQX3Fc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cXEDVAQX3Fc", libSceNKWebKitUnknown_cXEDVAQX3Fc_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_cgHFzzG_minus_vSI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cgHFzzG-vSI", libSceNKWebKitUnknown_cgHFzzG_minus_vSI_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_cr2QQgRG6GM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cr2QQgRG6GM", libSceNKWebKitUnknown_cr2QQgRG6GM_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_d15ogzvwTrk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("d15ogzvwTrk", libSceNKWebKitUnknown_d15ogzvwTrk_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_dK49_plus_WeN_minus_gk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dK49+WeN-gk", libSceNKWebKitUnknown_dK49_plus_WeN_minus_gk_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_dSgDlyiYnYY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dSgDlyiYnYY", libSceNKWebKitUnknown_dSgDlyiYnYY_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_dkGhdrkxhrs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dkGhdrkxhrs", libSceNKWebKitUnknown_dkGhdrkxhrs_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_eQjQ_plus_S3U2uk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eQjQ+S3U2uk", libSceNKWebKitUnknown_eQjQ_plus_S3U2uk_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_eeMQkJtbsig_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("eeMQkJtbsig", libSceNKWebKitUnknown_eeMQkJtbsig_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_fB6zdl3zD6E_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fB6zdl3zD6E", libSceNKWebKitUnknown_fB6zdl3zD6E_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_fBfcr_plus_qmDEo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fBfcr+qmDEo", libSceNKWebKitUnknown_fBfcr_plus_qmDEo_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_fCvXNSyUEuE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fCvXNSyUEuE", libSceNKWebKitUnknown_fCvXNSyUEuE_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_gAnW2Yr6n0g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gAnW2Yr6n0g", libSceNKWebKitUnknown_gAnW2Yr6n0g_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_gTdmADaMRe0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gTdmADaMRe0", libSceNKWebKitUnknown_gTdmADaMRe0_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_gujdrhsDcMs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gujdrhsDcMs", libSceNKWebKitUnknown_gujdrhsDcMs_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_h_minus_e3_minus_Qg2Ono_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("h-e3-Qg2Ono", libSceNKWebKitUnknown_h_minus_e3_minus_Qg2Ono_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_h6sZ3gbVGX8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("h6sZ3gbVGX8", libSceNKWebKitUnknown_h6sZ3gbVGX8_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_hEGmhPYapBY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hEGmhPYapBY", libSceNKWebKitUnknown_hEGmhPYapBY_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_hFNrqlvAkXc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hFNrqlvAkXc", libSceNKWebKitUnknown_hFNrqlvAkXc_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_hTGCEc48Zj4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hTGCEc48Zj4", libSceNKWebKitUnknown_hTGCEc48Zj4_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_iKRrgYVp6S0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iKRrgYVp6S0", libSceNKWebKitUnknown_iKRrgYVp6S0_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_iNYe3UoflbY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iNYe3UoflbY", libSceNKWebKitUnknown_iNYe3UoflbY_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_iSdZVLoB2kE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iSdZVLoB2kE", libSceNKWebKitUnknown_iSdZVLoB2kE_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_ilXDl9dNrrM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ilXDl9dNrrM", libSceNKWebKitUnknown_ilXDl9dNrrM_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_irUfhteXKrA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("irUfhteXKrA", libSceNKWebKitUnknown_irUfhteXKrA_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_iwgB7OzeXUo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iwgB7OzeXUo", libSceNKWebKitUnknown_iwgB7OzeXUo_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_jQ4nDAtS_minus_PM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jQ4nDAtS-PM", libSceNKWebKitUnknown_jQ4nDAtS_minus_PM_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_jjK6N_plus_E8_plus_Cg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jjK6N+E8+Cg", libSceNKWebKitUnknown_jjK6N_plus_E8_plus_Cg_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_kNTNOi2_minus_U7o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kNTNOi2-U7o", libSceNKWebKitUnknown_kNTNOi2_minus_U7o_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_kOvGLeFNGdc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kOvGLeFNGdc", libSceNKWebKitUnknown_kOvGLeFNGdc_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_kaCNhe3QpYg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kaCNhe3QpYg", libSceNKWebKitUnknown_kaCNhe3QpYg_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_kvu7hliEMys_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kvu7hliEMys", libSceNKWebKitUnknown_kvu7hliEMys_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_kz6X0pS4SG8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kz6X0pS4SG8", libSceNKWebKitUnknown_kz6X0pS4SG8_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_l9srnyCetFE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("l9srnyCetFE", libSceNKWebKitUnknown_l9srnyCetFE_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_leK1TrejUUw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("leK1TrejUUw", libSceNKWebKitUnknown_leK1TrejUUw_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_llM_minus_dpRB7Mw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("llM-dpRB7Mw", libSceNKWebKitUnknown_llM_minus_dpRB7Mw_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_m1XFXFjVpNw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("m1XFXFjVpNw", libSceNKWebKitUnknown_m1XFXFjVpNw_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_mFaisQfUAAg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mFaisQfUAAg", libSceNKWebKitUnknown_mFaisQfUAAg_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_mOoh3Od4g3Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mOoh3Od4g3Q", libSceNKWebKitUnknown_mOoh3Od4g3Q_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_mT506d_plus_sCAQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mT506d+sCAQ", libSceNKWebKitUnknown_mT506d_plus_sCAQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_nP556DHyidA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nP556DHyidA", libSceNKWebKitUnknown_nP556DHyidA_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_nhq2F3w9E2I_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nhq2F3w9E2I", libSceNKWebKitUnknown_nhq2F3w9E2I_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_oMuplmK3nAU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oMuplmK3nAU", libSceNKWebKitUnknown_oMuplmK3nAU_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_oc6iPxX9C_plus_c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oc6iPxX9C+c", libSceNKWebKitUnknown_oc6iPxX9C_plus_c_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_p1i6MDRD28k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("p1i6MDRD28k", libSceNKWebKitUnknown_p1i6MDRD28k_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_p8Ut5oFbuxM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("p8Ut5oFbuxM", libSceNKWebKitUnknown_p8Ut5oFbuxM_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_pBix1_minus_RkB9A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pBix1-RkB9A", libSceNKWebKitUnknown_pBix1_minus_RkB9A_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_pHIzm0yagek_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pHIzm0yagek", libSceNKWebKitUnknown_pHIzm0yagek_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_pM6ykA_plus_YtCk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pM6ykA+YtCk", libSceNKWebKitUnknown_pM6ykA_plus_YtCk_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_pQIRD5SWwj4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pQIRD5SWwj4", libSceNKWebKitUnknown_pQIRD5SWwj4_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_pWefH_minus_dpMBA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pWefH-dpMBA", libSceNKWebKitUnknown_pWefH_minus_dpMBA_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_pXakmlfsmRk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pXakmlfsmRk", libSceNKWebKitUnknown_pXakmlfsmRk_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_pr1UlGaL88w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pr1UlGaL88w", libSceNKWebKitUnknown_pr1UlGaL88w_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_q3BuDxwPFHU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("q3BuDxwPFHU", libSceNKWebKitUnknown_q3BuDxwPFHU_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_r_minus_zAYe_plus_5gog_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("r-zAYe+5gog", libSceNKWebKitUnknown_r_minus_zAYe_plus_5gog_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_r24cilB09mA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("r24cilB09mA", libSceNKWebKitUnknown_r24cilB09mA_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_rmA5tn4jLdQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rmA5tn4jLdQ", libSceNKWebKitUnknown_rmA5tn4jLdQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_s9wqBPkorek_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("s9wqBPkorek", libSceNKWebKitUnknown_s9wqBPkorek_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_sAg_plus_FMnYByg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sAg+FMnYByg", libSceNKWebKitUnknown_sAg_plus_FMnYByg_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_seSrrrKdnHw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("seSrrrKdnHw", libSceNKWebKitUnknown_seSrrrKdnHw_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_t3DFHfo_minus_p_plus_Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("t3DFHfo-p+Y", libSceNKWebKitUnknown_t3DFHfo_minus_p_plus_Y_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_t4n17VBUIls_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("t4n17VBUIls", libSceNKWebKitUnknown_t4n17VBUIls_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_tTZjpnAVThM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tTZjpnAVThM", libSceNKWebKitUnknown_tTZjpnAVThM_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_tf8dixrssQ0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tf8dixrssQ0", libSceNKWebKitUnknown_tf8dixrssQ0_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_thYkFBIuGH4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("thYkFBIuGH4", libSceNKWebKitUnknown_thYkFBIuGH4_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_u3kBISGMpIQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("u3kBISGMpIQ", libSceNKWebKitUnknown_u3kBISGMpIQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_ucyMIuaVk5s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ucyMIuaVk5s", libSceNKWebKitUnknown_ucyMIuaVk5s_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_uelAYhLRe_minus_w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uelAYhLRe-w", libSceNKWebKitUnknown_uelAYhLRe_minus_w_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_urEMhc69pFU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("urEMhc69pFU", libSceNKWebKitUnknown_urEMhc69pFU_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_vNFtHXo1Ed4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vNFtHXo1Ed4", libSceNKWebKitUnknown_vNFtHXo1Ed4_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_vfJ_minus_ijvltjg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vfJ-ijvltjg", libSceNKWebKitUnknown_vfJ_minus_ijvltjg_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_vluz6M8UkvM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vluz6M8UkvM", libSceNKWebKitUnknown_vluz6M8UkvM_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_wBCHSy0aDjI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wBCHSy0aDjI", libSceNKWebKitUnknown_wBCHSy0aDjI_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_wsVwohWrtTs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wsVwohWrtTs", libSceNKWebKitUnknown_wsVwohWrtTs_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_wtMtCOBdzgk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wtMtCOBdzgk", libSceNKWebKitUnknown_wtMtCOBdzgk_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_x_minus_YR8cjXcBA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("x-YR8cjXcBA", libSceNKWebKitUnknown_x_minus_YR8cjXcBA_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_xQDhxDsfSjE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xQDhxDsfSjE", libSceNKWebKitUnknown_xQDhxDsfSjE_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_xhsbzHioskg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xhsbzHioskg", libSceNKWebKitUnknown_xhsbzHioskg_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_xsj_plus_huJK6VQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xsj+huJK6VQ", libSceNKWebKitUnknown_xsj_plus_huJK6VQ_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_y5leGuMayQk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("y5leGuMayQk", libSceNKWebKitUnknown_y5leGuMayQk_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_yoIiwgv1oCk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yoIiwgv1oCk", libSceNKWebKitUnknown_yoIiwgv1oCk_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_yq6071CQAqo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yq6071CQAqo", libSceNKWebKitUnknown_yq6071CQAqo_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_ysn78y77zN0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ysn78y77zN0", libSceNKWebKitUnknown_ysn78y77zN0_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_zdn8pgeNnEY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zdn8pgeNnEY", libSceNKWebKitUnknown_zdn8pgeNnEY_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_ziXF7YQDRhY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ziXF7YQDRhY", libSceNKWebKitUnknown_ziXF7YQDRhY_nid_no_patch); + +int APS5_VABI libSceNKWebKitUnknown_zpeJoENXwDY_nid_no_patch() { NotImplemented_nid_no_patch(__func__); } +APS5_EXPORT("zpeJoENXwDY", libSceNKWebKitUnknown_zpeJoENXwDY_nid_no_patch); } diff --git a/core/libs/prx/libSceNKWebKit/include/Api.hpp b/core/libs/prx/libSceNKWebKit/include/Api.hpp index 0c5184f943ec..017fe05615fc 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 new file mode 100644 index 000000000000..602bd5e8e3ad --- /dev/null +++ b/core/libs/prx/libSceNKWebKit/include/InventoryExports.hpp @@ -0,0 +1,7593 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +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 JSRemoteInspectorDisableAutoStart(); +int APS5_VABI JSRemoteInspectorServerStart(); +int APS5_VABI JSRemoteInspectorSetLogToSystemConsole(); +int APS5_VABI JSRemoteInspectorSetParentProcessInformation(); +int APS5_VABI JSRemoteInspectorStart(); +int APS5_VABI JSRunLoop(); +int APS5_VABI JSSetOptions(); +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 WKAXObjectPage(); +int APS5_VABI WKAXObjectRole(); +int APS5_VABI WKAccessibilityCanUseSecondaryAXThread(); +int APS5_VABI WKAccessibilityEnableEnhancedAccessibility(); +int APS5_VABI WKAccessibilityEnhancedAccessibilityEnabled(); +int APS5_VABI WKAccessibilityFocusedObject(); +int APS5_VABI WKAccessibilityRootObject(); +int APS5_VABI WKAddMockMediaDevice(); +int APS5_VABI WKApplicationCacheManagerDeleteAllEntries(); +int APS5_VABI WKApplicationCacheManagerDeleteEntriesForOrigin(); +int APS5_VABI WKApplicationCacheManagerGetApplicationCacheOrigins(); +int APS5_VABI WKAuthenticationChallengCopyRequestURL(); +int APS5_VABI WKAuthenticationChallengeGetDecisionListener(); +int APS5_VABI WKAuthenticationChallengeGetPreviousFailureCount(); +int APS5_VABI WKAuthenticationChallengeGetProposedCredential(); +int APS5_VABI WKAuthenticationChallengeGetProtectionSpace(); +int APS5_VABI WKAuthenticationChallengeIsForMainResource(); +int APS5_VABI WKAuthenticationChallengeIsInMainFrame(); +int APS5_VABI WKAuthenticationDecisionListenerCancel(); +int APS5_VABI WKAuthenticationDecisionListenerRejectProtectionSpaceAndContinue(); +int APS5_VABI WKAuthenticationDecisionListenerUseCredential(); +int APS5_VABI WKBackForwardListClear(); +int APS5_VABI WKBackForwardListCopyBackListWithLimit(); +int APS5_VABI WKBackForwardListCopyForwardListWithLimit(); +int APS5_VABI WKBackForwardListGetBackItem(); +int APS5_VABI WKBackForwardListGetBackListCount(); +int APS5_VABI WKBackForwardListGetCurrentItem(); +int APS5_VABI WKBackForwardListGetForwardItem(); +int APS5_VABI WKBackForwardListGetForwardListCount(); +int APS5_VABI WKBackForwardListGetItemAtIndex(); +int APS5_VABI WKBackForwardListItemCopyOriginalURL(); +int APS5_VABI WKBackForwardListItemCopyTitle(); +int APS5_VABI WKBackForwardListItemCopyURL(); +int APS5_VABI WKBundleAddOriginAccessAllowListEntry(); +int APS5_VABI WKBundleBackForwardListClear(); +int APS5_VABI WKBundleBackForwardListCopyItemAtIndex(); +int APS5_VABI WKBundleBackForwardListGetBackListCount(); +int APS5_VABI WKBundleBackForwardListItemCopyChildren(); +int APS5_VABI WKBundleBackForwardListItemCopyOriginalURL(); +int APS5_VABI WKBundleBackForwardListItemCopyTarget(); +int APS5_VABI WKBundleBackForwardListItemCopyTitle(); +int APS5_VABI WKBundleBackForwardListItemCopyURL(); +int APS5_VABI WKBundleBackForwardListItemHasCachedPageExpired(); +int APS5_VABI WKBundleBackForwardListItemIsInBackForwardCache(); +int APS5_VABI WKBundleBackForwardListItemIsSame(); +int APS5_VABI WKBundleBackForwardListItemIsTargetItem(); +int APS5_VABI WKBundleClearHistoryForTesting(); +int APS5_VABI WKBundleClearResourceLoadStatistics(); +int APS5_VABI WKBundleCreateWKDataFromUInt8Array(); +int APS5_VABI WKBundleDOMWindowExtensionCreate(); +int APS5_VABI WKBundleDOMWindowExtensionGetFrame(); +int APS5_VABI WKBundleDOMWindowExtensionGetScriptWorld(); +int APS5_VABI WKBundleExtendClassesForParameterCoder(); +int APS5_VABI WKBundleFileHandleCreateWithPath(); +int APS5_VABI WKBundleFrameAllowsFollowingLink(); +int APS5_VABI WKBundleFrameCallShouldCloseOnWebView(); +int APS5_VABI WKBundleFrameClearOpener(); +int APS5_VABI WKBundleFrameContainsAnyFormControls(); +int APS5_VABI WKBundleFrameContainsAnyFormElements(); +int APS5_VABI WKBundleFrameCopyChildFrames(); +int APS5_VABI WKBundleFrameCopyCounterValue(); +int APS5_VABI WKBundleFrameCopyInnerText(); +int APS5_VABI WKBundleFrameCopyLayerTreeAsText(); +int APS5_VABI WKBundleFrameCopyMIMETypeForResourceWithURL(); +int APS5_VABI WKBundleFrameCopyName(); +int APS5_VABI WKBundleFrameCopyProvisionalURL(); +int APS5_VABI WKBundleFrameCopySecurityOrigin(); +int APS5_VABI WKBundleFrameCopySuggestedFilenameForResourceWithURL(); +int APS5_VABI WKBundleFrameCopyURL(); +int APS5_VABI WKBundleFrameCopyWebArchiveFilteringSubframes(); +int APS5_VABI WKBundleFrameCopyWebArchive(); +int APS5_VABI WKBundleFrameCreateFrameHandle(); +int APS5_VABI WKBundleFrameCreateHitTestResult(); +int APS5_VABI WKBundleFrameFocus(); +int APS5_VABI WKBundleFrameForJavaScriptContext(); +int APS5_VABI WKBundleFrameGetContentBounds(); +int APS5_VABI WKBundleFrameGetDocumentBackgroundColor(); +int APS5_VABI WKBundleFrameGetFrameLoadState(); +int APS5_VABI WKBundleFrameGetJavaScriptContextForWorld(); +int APS5_VABI WKBundleFrameGetJavaScriptContext(); +int APS5_VABI WKBundleFrameGetJavaScriptWrapperForFileForWorld(); +int APS5_VABI WKBundleFrameGetJavaScriptWrapperForNodeForWorld(); +int APS5_VABI WKBundleFrameGetJavaScriptWrapperForRangeForWorld(); +int APS5_VABI WKBundleFrameGetPage(); +int APS5_VABI WKBundleFrameGetParentFrame(); +int APS5_VABI WKBundleFrameGetPendingUnloadCount(); +int APS5_VABI WKBundleFrameGetScrollOffset(); +int APS5_VABI WKBundleFrameGetVisibleContentBounds(); +int APS5_VABI WKBundleFrameGetVisibleContentBoundsExcludingScrollbars(); +int APS5_VABI WKBundleFrameHandlesPageScaleGesture(); +int APS5_VABI WKBundleFrameHasHorizontalScrollbar(); +int APS5_VABI WKBundleFrameHasVerticalScrollbar(); +int APS5_VABI WKBundleFrameIsMainFrame(); +int APS5_VABI WKBundleFrameSetAccessibleName(); +int APS5_VABI WKBundleFrameSetTextDirection(); +int APS5_VABI WKBundleFrameStopLoading(); +int APS5_VABI WKBundleGarbageCollectJavaScriptObjectsOnAlternateThreadForDebugging(); +int APS5_VABI WKBundleGarbageCollectJavaScriptObjects(); +int APS5_VABI WKBundleGetApplicationConnection(); +int APS5_VABI WKBundleGetJavaScriptObjectsCount(); +int APS5_VABI WKBundleHitTestResultCopyAbsoluteImageURL(); +int APS5_VABI WKBundleHitTestResultCopyAbsoluteLinkURL(); +int APS5_VABI WKBundleHitTestResultCopyAbsoluteMediaURL(); +int APS5_VABI WKBundleHitTestResultCopyAbsolutePDFURL(); +int APS5_VABI WKBundleHitTestResultCopyImage(); +int APS5_VABI WKBundleHitTestResultCopyLinkLabel(); +int APS5_VABI WKBundleHitTestResultCopyLinkSuggestedFilename(); +int APS5_VABI WKBundleHitTestResultCopyLinkTitle(); +int APS5_VABI WKBundleHitTestResultCopyNodeHandle(); +int APS5_VABI WKBundleHitTestResultCopyURLElementHandle(); +int APS5_VABI WKBundleHitTestResultGetFrame(); +int APS5_VABI WKBundleHitTestResultGetImageRect(); +int APS5_VABI WKBundleHitTestResultGetIsSelected(); +int APS5_VABI WKBundleHitTestResultGetMediaType(); +int APS5_VABI WKBundleHitTestResultGetTargetFrame(); +int APS5_VABI WKBundleHitTestResultIsDownloadableMedia(); +int APS5_VABI WKBundleHitTestResultMediaHasAudio(); +int APS5_VABI WKBundleHitTestResultMediaIsInFullscreen(); +int APS5_VABI WKBundleInspectorClose(); +int APS5_VABI WKBundleInspectorEvaluateScriptForTest(); +int APS5_VABI WKBundleInspectorSetPageProfilingEnabled(); +int APS5_VABI WKBundleInspectorShow(); +int APS5_VABI WKBundleIsPageBoxVisible(); +int APS5_VABI WKBundleIsProcessingUserGesture(); +int APS5_VABI WKBundleNavigationActionCopyDownloadAttribute(); +int APS5_VABI WKBundleNavigationActionCopyFormElement(); +int APS5_VABI WKBundleNavigationActionCopyHitTestResult(); +int APS5_VABI WKBundleNavigationActionGetEventModifiers(); +int APS5_VABI WKBundleNavigationActionGetEventMouseButton(); +int APS5_VABI WKBundleNavigationActionGetNavigationType(); +int APS5_VABI WKBundleNavigationActionGetShouldOpenExternalURLs(); +int APS5_VABI WKBundleNavigationActionGetShouldTryAppLinks(); +int APS5_VABI WKBundleNodeHandleCopyDocumentFrame(); +int APS5_VABI WKBundleNodeHandleCopyDocument(); +int APS5_VABI WKBundleNodeHandleCopyHTMLFrameElementContentFrame(); +int APS5_VABI WKBundleNodeHandleCopyHTMLIFrameElementContentFrame(); +int APS5_VABI WKBundleNodeHandleCopyHTMLTableCellElementCellAbove(); +int APS5_VABI WKBundleNodeHandleCopySnapshotWithOptions(); +int APS5_VABI WKBundleNodeHandleCopyVisibleRange(); +int APS5_VABI WKBundleNodeHandleCreate(); +int APS5_VABI WKBundleNodeHandleGetElementBounds(); +int APS5_VABI WKBundleNodeHandleGetHTMLInputElementAutoFillAvailable(); +int APS5_VABI WKBundleNodeHandleGetHTMLInputElementAutoFillButtonBounds(); +int APS5_VABI WKBundleNodeHandleGetHTMLInputElementAutoFillButtonEnabled(); +int APS5_VABI WKBundleNodeHandleGetHTMLInputElementAutoFillButtonType(); +int APS5_VABI WKBundleNodeHandleGetHTMLInputElementAutoFilled(); +int APS5_VABI WKBundleNodeHandleGetHTMLInputElementAutofilled(); +int APS5_VABI WKBundleNodeHandleGetHTMLInputElementLastAutoFillButtonType(); +int APS5_VABI WKBundleNodeHandleGetHTMLInputElementLastChangeWasUserEdit(); +int APS5_VABI WKBundleNodeHandleGetHTMLTextAreaElementLastChangeWasUserEdit(); +int APS5_VABI WKBundleNodeHandleGetRenderRect(); +int APS5_VABI WKBundleNodeHandleSetHTMLInputElementAutoFillAvailable(); +int APS5_VABI WKBundleNodeHandleSetHTMLInputElementAutoFillButtonEnabledWithButtonType(); +int APS5_VABI WKBundleNodeHandleSetHTMLInputElementAutoFillButtonEnabled(); +int APS5_VABI WKBundleNodeHandleSetHTMLInputElementAutoFilledAndViewable(); +int APS5_VABI WKBundleNodeHandleSetHTMLInputElementAutoFilled(); +int APS5_VABI WKBundleNodeHandleSetHTMLInputElementAutofilled(); +int APS5_VABI WKBundleNodeHandleSetHTMLInputElementSpellcheckEnabled(); +int APS5_VABI WKBundleNodeHandleSetHTMLInputElementValueForUser(); +int APS5_VABI WKBundleNumberOfPages(); +int APS5_VABI WKBundlePageAddUserScript(); +int APS5_VABI WKBundlePageAddUserScriptInWorld(); +int APS5_VABI WKBundlePageAddUserStyleSheet(); +int APS5_VABI WKBundlePageCallAfterTasksAndTimers(); +int APS5_VABI WKBundlePageCanHandleRequest(); +int APS5_VABI WKBundlePageCanShowMIMEType(); +int APS5_VABI WKBundlePageClearApplicationCacheForOrigin(); +int APS5_VABI WKBundlePageClearApplicationCache(); +int APS5_VABI WKBundlePageClearMainFrameName(); +int APS5_VABI WKBundlePageClickMenuItem(); +int APS5_VABI WKBundlePageClose(); +int APS5_VABI WKBundlePageConfirmComposition(); +int APS5_VABI WKBundlePageConfirmCompositionWithText(); +int APS5_VABI WKBundlePageCopyContextMenuAtPointInWindow(); +int APS5_VABI WKBundlePageCopyContextMenuItems(); +int APS5_VABI WKBundlePageCopyGroupIdentifier(); +int APS5_VABI WKBundlePageCopyOriginsWithApplicationCache(); +int APS5_VABI WKBundlePageCopyRenderLayerTree(); +int APS5_VABI WKBundlePageCopyRenderTree(); +int APS5_VABI WKBundlePageCopyRenderTreeExternalRepresentationForPrinting(); +int APS5_VABI WKBundlePageCopyRenderTreeExternalRepresentation(); +int APS5_VABI WKBundlePageCopyTrackedRepaintRects(); +int APS5_VABI WKBundlePageCreateScaledSnapshotInDocumentCoordinates(); +int APS5_VABI WKBundlePageCreateSnapshotInDocumentCoordinates(); +int APS5_VABI WKBundlePageCreateSnapshotInViewCoordinates(); +int APS5_VABI WKBundlePageCreateSnapshotWithOptions(); +int APS5_VABI WKBundlePageDidEnterFullScreen(); +int APS5_VABI WKBundlePageDidExitFullScreen(); +int APS5_VABI WKBundlePageDumpHistoryForTesting(); +int APS5_VABI WKBundlePageExecuteEditingCommand(); +int APS5_VABI WKBundlePageExtendIncrementalRenderingSuppression(); +int APS5_VABI WKBundlePageFindStringMatches(); +int APS5_VABI WKBundlePageFindString(); +int APS5_VABI WKBundlePageFlushPendingEditorStateUpdate(); +int APS5_VABI WKBundlePageForceRepaint(); +int APS5_VABI WKBundlePageGetAppCacheUsageForOrigin(); +int APS5_VABI WKBundlePageGetBackForwardList(); +int APS5_VABI WKBundlePageGetBackingScaleFactor(); +int APS5_VABI WKBundlePageGetInspector(); +int APS5_VABI WKBundlePageGetMainFrame(); +int APS5_VABI WKBundlePageGetPageZoomFactor(); +int APS5_VABI WKBundlePageGetRenderTreeSize(); +int APS5_VABI WKBundlePageGetTextZoomFactor(); +int APS5_VABI WKBundlePageHasComposition(); +int APS5_VABI WKBundlePageHasLocalDataForURL(); +int APS5_VABI WKBundlePageInsertNewlineInQuotedContent(); +int APS5_VABI WKBundlePageInstallPageOverlayWithAnimation(); +int APS5_VABI WKBundlePageInstallPageOverlay(); +int APS5_VABI WKBundlePageIsControlledByAutomation(); +int APS5_VABI WKBundlePageIsEditingCommandEnabled(); +int APS5_VABI WKBundlePageIsSuspended(); +int APS5_VABI WKBundlePageIsTrackingRepaints(); +int APS5_VABI WKBundlePageIsUsingDarkAppearance(); +int APS5_VABI WKBundlePageIsUsingEphemeralSession(); +int APS5_VABI WKBundlePageListenForLayoutMilestones(); +int APS5_VABI WKBundlePageNumberForElementById(); +int APS5_VABI WKBundlePageOverlayClear(); +int APS5_VABI WKBundlePageOverlayCreate(); +int APS5_VABI WKBundlePageOverlayFractionFadedIn(); +int APS5_VABI WKBundlePageOverlaySetAccessibilityClient(); +int APS5_VABI WKBundlePageOverlaySetNeedsDisplay(); +int APS5_VABI WKBundlePagePostMessageIgnoringFullySynchronousMode(); +int APS5_VABI WKBundlePagePostMessage(); +int APS5_VABI WKBundlePagePostSynchronousMessageForTesting(); +int APS5_VABI WKBundlePageRegisterScrollOperationCompletionCallback(); +int APS5_VABI WKBundlePageRemoveAllUserContent(); +int APS5_VABI WKBundlePageReplaceStringMatches(); +int APS5_VABI WKBundlePageResetApplicationCacheOriginQuota(); +int APS5_VABI WKBundlePageResetTrackedRepaints(); +int APS5_VABI WKBundlePageSetAppCacheMaximumSize(); +int APS5_VABI WKBundlePageSetApplicationCacheOriginQuota(); +int APS5_VABI WKBundlePageSetBottomOverhangImage(); +int APS5_VABI WKBundlePageSetComposition(); +int APS5_VABI WKBundlePageSetContextMenuClient(); +int APS5_VABI WKBundlePageSetDefersLoading(); +int APS5_VABI WKBundlePageSetEditorClient(); +int APS5_VABI WKBundlePageSetEventThrottlingBehaviorOverride(); +int APS5_VABI WKBundlePageSetFooterBanner(); +int APS5_VABI WKBundlePageSetFormClient(); +int APS5_VABI WKBundlePageSetFullScreenClient(); +int APS5_VABI WKBundlePageSetHeaderBanner(); +int APS5_VABI WKBundlePageSetPageLoaderClient(); +int APS5_VABI WKBundlePageSetPageZoomFactor(); +int APS5_VABI WKBundlePageSetPaintedObjectsCounterThreshold(); +int APS5_VABI WKBundlePageSetPolicyClient(); +int APS5_VABI WKBundlePageSetResourceLoadClient(); +int APS5_VABI WKBundlePageSetScaleAtOrigin(); +int APS5_VABI WKBundlePageSetTextZoomFactor(); +int APS5_VABI WKBundlePageSetTopOverhangImage(); +int APS5_VABI WKBundlePageSetTracksRepaints(); +int APS5_VABI WKBundlePageSetUIClient(); +int APS5_VABI WKBundlePageSetUseDarkAppearance(); +int APS5_VABI WKBundlePageSimulateMouseDown(); +int APS5_VABI WKBundlePageSimulateMouseMotion(); +int APS5_VABI WKBundlePageSimulateMouseUp(); +int APS5_VABI WKBundlePageSizeAndMarginsInPixels(); +int APS5_VABI WKBundlePageStartMonitoringScrollOperations(); +int APS5_VABI WKBundlePageStopExtendingIncrementalRenderingSuppression(); +int APS5_VABI WKBundlePageStopLoading(); +int APS5_VABI WKBundlePageUninstallPageOverlay(); +int APS5_VABI WKBundlePageUninstallPageOverlayWithAnimation(); +int APS5_VABI WKBundlePageWillEnterFullScreen(); +int APS5_VABI WKBundlePageWillExitFullScreen(); +int APS5_VABI WKBundlePostMessage(); +int APS5_VABI WKBundlePostSynchronousMessage(); +int APS5_VABI WKBundleRangeHandleCopySnapshotWithOptions(); +int APS5_VABI WKBundleRangeHandleCreate(); +int APS5_VABI WKBundleRangeHandleGetBoundingRectInWindowCoordinates(); +int APS5_VABI WKBundleReleaseMemory(); +int APS5_VABI WKBundleRemoveAllWebNotificationPermissions(); +int APS5_VABI WKBundleRemoveOriginAccessAllowListEntry(); +int APS5_VABI WKBundleReportException(); +int APS5_VABI WKBundleResetOriginAccessAllowLists(); +int APS5_VABI WKBundleResourceLoadStatisticsNotifyObserver(); +int APS5_VABI WKBundleScriptWorldClearWrappers(); +int APS5_VABI WKBundleScriptWorldCopyName(); +int APS5_VABI WKBundleScriptWorldCreateWorld(); +int APS5_VABI WKBundleScriptWorldDisableOverrideBuiltinsBehavior(); +int APS5_VABI WKBundleScriptWorldMakeAllShadowRootsOpen(); +int APS5_VABI WKBundleScriptWorldNormalWorld(); +int APS5_VABI WKBundleSetClient(); +int APS5_VABI WKBundleSetDatabaseQuota(); +int APS5_VABI WKBundleSetServiceWorkerProxyCreationCallback(); +int APS5_VABI WKBundleSetTabKeyCyclesThroughElements(); +int APS5_VABI WKBundleSetWebNotificationPermission(); +int APS5_VABI WKClearMockMediaDevices(); +int APS5_VABI WKConnectionPostMessage(); +int APS5_VABI WKConnectionSetConnectionClient(); +int APS5_VABI WKContextAddSupportedPlugin(); +int APS5_VABI WKContextAddVisitedLink(); +int APS5_VABI WKContextAllowSpecificHTTPSCertificateForHost(); +int APS5_VABI WKContextClearCurrentModifierStateForTesting(); +int APS5_VABI WKContextClearSupportedPlugins(); +int APS5_VABI WKContextClearVisitedLinks(); +int APS5_VABI WKContextCopyPlugInAutoStartOriginHashes(); +int APS5_VABI WKContextCreate(); +int APS5_VABI WKContextCreateWithConfiguration(); +int APS5_VABI WKContextCreateWithInjectedBundlePath(); +int APS5_VABI WKContextDisableProcessTermination(); +int APS5_VABI WKContextDownloadURLRequest(); +int APS5_VABI WKContextEnableProcessTermination(); +int APS5_VABI WKContextGarbageCollectJavaScriptObjects(); +int APS5_VABI WKContextGetAccessibilityEnabled(); +int APS5_VABI WKContextGetApplicationCacheManager(); +int APS5_VABI WKContextGetCacheModel(); +int APS5_VABI WKContextGetGeolocationManager(); +int APS5_VABI WKContextGetGlobalStatistics(); +int APS5_VABI WKContextGetIconDatabase(); +int APS5_VABI WKContextGetKeyValueStorageManager(); +int APS5_VABI WKContextGetMaximumNumberOfProcesses(); +int APS5_VABI WKContextGetNotificationManager(); +int APS5_VABI WKContextGetResourceCacheManager(); +int APS5_VABI WKContextGetStatisticsWithOptions(); +int APS5_VABI WKContextGetStatistics(); +int APS5_VABI WKContextGetUsesSingleWebProcess(); +int APS5_VABI WKContextGetWebsiteDataStore(); +int APS5_VABI WKContextJavaScriptConfigurationFileEnabled(); +int APS5_VABI WKContextMenuCopySubmenuItems(); +int APS5_VABI WKContextMenuItemCopyTitle(); +int APS5_VABI WKContextMenuItemCreateAsAction(); +int APS5_VABI WKContextMenuItemCreateAsCheckableAction(); +int APS5_VABI WKContextMenuItemCreateAsSubmenu(); +int APS5_VABI WKContextMenuItemGetChecked(); +int APS5_VABI WKContextMenuItemGetEnabled(); +int APS5_VABI WKContextMenuItemGetTag(); +int APS5_VABI WKContextMenuItemGetType(); +int APS5_VABI WKContextMenuItemGetUserData(); +int APS5_VABI WKContextMenuItemSeparatorItem(); +int APS5_VABI WKContextMenuItemSetUserData(); +int APS5_VABI WKContextPostMessageToInjectedBundle(); +int APS5_VABI WKContextPreconnectToServer(); +int APS5_VABI WKContextRefreshPlugIns(); +int APS5_VABI WKContextRegisterURLSchemeAsBypassingContentSecurityPolicy(); +int APS5_VABI WKContextRegisterURLSchemeAsCachePartitioned(); +int APS5_VABI WKContextRegisterURLSchemeAsCanDisplayOnlyIfCanRequest(); +int APS5_VABI WKContextRegisterURLSchemeAsEmptyDocument(); +int APS5_VABI WKContextRegisterURLSchemeAsSecure(); +int APS5_VABI WKContextResumeDownload(); +int APS5_VABI WKContextSetAccessibilityEnabled(); +int APS5_VABI WKContextSetAdditionalPluginsDirectory(); +int APS5_VABI WKContextSetAlwaysUsesComplexTextCodePath(); +int APS5_VABI WKContextSetCacheModel(); +int APS5_VABI WKContextSetCanHandleHTTPSServerTrustEvaluation(); +int APS5_VABI WKContextSetClient(); +int APS5_VABI WKContextSetConnectionClient(); +int APS5_VABI WKContextSetCustomWebContentServiceBundleIdentifier(); +int APS5_VABI WKContextSetDiskCacheSpeculativeValidationEnabled(); +int APS5_VABI WKContextSetDomainRelaxationForbiddenForURLScheme(); +int APS5_VABI WKContextSetFontAllowList(); +int APS5_VABI WKContextSetHTTPPipeliningEnabled(); +int APS5_VABI WKContextSetHistoryClient(); +int APS5_VABI WKContextSetIconDatabasePath(); +int APS5_VABI WKContextSetInitializationUserDataForInjectedBundle(); +int APS5_VABI WKContextSetInjectedBundleClient(); +int APS5_VABI WKContextSetInvalidMessageFunction(); +int APS5_VABI WKContextSetJavaScriptConfigurationFileEnabled(); +int APS5_VABI WKContextSetJavaScriptGarbageCollectorTimerEnabled(); +int APS5_VABI WKContextSetMaximumNumberOfProcesses(); +int APS5_VABI WKContextSetMemoryCacheDisabled(); +int APS5_VABI WKContextSetPlugInAutoStartOriginHashes(); +int APS5_VABI WKContextSetPlugInAutoStartOriginsFilteringOutEntriesAddedAfterTime(); +int APS5_VABI WKContextSetPlugInAutoStartOrigins(); +int APS5_VABI WKContextSetPrewarmsProcessesAutomatically(); +int APS5_VABI WKContextSetPrimaryWebsiteDataStore(); +int APS5_VABI WKContextSetUseSeparateServiceWorkerProcess(); +int APS5_VABI WKContextSetUsesNetworkProcess(); +int APS5_VABI WKContextSetUsesSingleWebProcess(); +int APS5_VABI WKContextStartMemorySampler(); +int APS5_VABI WKContextStopMemorySampler(); +int APS5_VABI WKContextTerminateServiceWorkers(); +int APS5_VABI WKContextWarmInitialProcess(); +int APS5_VABI WKCookieManagerDeleteAllCookies(); +int APS5_VABI WKCookieManagerDeleteAllCookiesModifiedAfterDate(); +int APS5_VABI WKCookieManagerDeleteCookiesForHostname(); +int APS5_VABI WKCookieManagerGetHTTPCookieAcceptPolicy(); +int APS5_VABI WKCookieManagerGetHostnamesWithCookies(); +int APS5_VABI WKCookieManagerSetClient(); +int APS5_VABI WKCookieManagerSetHTTPCookieAcceptPolicy(); +int APS5_VABI WKCookieManagerStartObservingCookieChanges(); +int APS5_VABI WKCookieManagerStopObservingCookieChanges(); +int APS5_VABI WKDownloadCopyRequest(); +int APS5_VABI WKDownloadGetOriginatingPage(); +int APS5_VABI WKDownloadGetWasUserInitiated(); +int APS5_VABI WKFormSubmissionListenerContinue(); +int APS5_VABI WKFrameCanProvideSource(); +int APS5_VABI WKFrameCanShowMIMEType(); +int APS5_VABI WKFrameCopyMIMEType(); +int APS5_VABI WKFrameCopyProvisionalURL(); +int APS5_VABI WKFrameCopyTitle(); +int APS5_VABI WKFrameCopyURL(); +int APS5_VABI WKFrameCopyUnreachableURL(); +int APS5_VABI WKFrameCreateFrameHandle(); +int APS5_VABI WKFrameCreateFrameInfo(); +int APS5_VABI WKFrameGetCertificateInfo(); +int APS5_VABI WKFrameGetFrameLoadState(); +int APS5_VABI WKFrameGetMainResourceData(); +int APS5_VABI WKFrameGetPage(); +int APS5_VABI WKFrameGetResourceData(); +int APS5_VABI WKFrameGetWebArchive(); +int APS5_VABI WKFrameHandleGetFrameID(); +int APS5_VABI WKFrameInfoCreateFrameHandleRef(); +int APS5_VABI WKFrameIsDisplayingMarkupDocument(); +int APS5_VABI WKFrameIsDisplayingStandaloneImageDocument(); +int APS5_VABI WKFrameIsFrameSet(); +int APS5_VABI WKFrameIsMainFrame(); +int APS5_VABI WKFramePolicyListenerDownload(); +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 WKGeolocationManagerProviderDidChangePosition(); +int APS5_VABI WKGeolocationManagerProviderDidFailToDeterminePosition(); +int APS5_VABI WKGeolocationManagerProviderDidFailToDeterminePositionWithErrorMessage(); +int APS5_VABI WKGeolocationManagerSetProvider(); +int APS5_VABI WKGeolocationPermissionRequestAllow(); +int APS5_VABI WKGeolocationPermissionRequestDeny(); +int APS5_VABI WKHTTPCookieStoreDeleteAllCookies(); +int APS5_VABI WKHTTPCookieStoreSetCookieForHostname(); +int APS5_VABI WKHTTPCookieStoreSetHTTPCookieAcceptPolicy(); +int APS5_VABI WKHitTestResultCopyAbsoluteImageURL(); +int APS5_VABI WKHitTestResultCopyAbsoluteLinkURL(); +int APS5_VABI WKHitTestResultCopyAbsoluteMediaURL(); +int APS5_VABI WKHitTestResultCopyAbsolutePDFURL(); +int APS5_VABI WKHitTestResultCopyLinkLabel(); +int APS5_VABI WKHitTestResultCopyLinkTitle(); +int APS5_VABI WKHitTestResultCopyLookupText(); +int APS5_VABI WKHitTestResultGetElementBoundingBox(); +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 WKIconDatabaseReleaseIconForURL(); +int APS5_VABI WKIconDatabaseRemoveAllIcons(); +int APS5_VABI WKIconDatabaseRetainIconForURL(); +int APS5_VABI WKIconDatabaseSetIconDataForIconURL(); +int APS5_VABI WKIconDatabaseSetIconDatabaseClient(); +int APS5_VABI WKIconDatabaseSetIconURLForPageURL(); +int APS5_VABI WKImageCreate(); +int APS5_VABI WKImageCreateCairoSurface(); +int APS5_VABI WKImageCreateFromCairoSurface(); +int APS5_VABI WKImageGetSize(); +int APS5_VABI WKImeEventGetInputLanguage(); +int APS5_VABI WKImeEventMake(); +int APS5_VABI WKImeEventRelease(); +int APS5_VABI WKInspectorAttach(); +int APS5_VABI WKInspectorClose(); +int APS5_VABI WKInspectorConnect(); +int APS5_VABI WKInspectorDetach(); +int APS5_VABI WKInspectorGetPage(); +int APS5_VABI WKInspectorHide(); +int APS5_VABI WKInspectorIsAttached(); +int APS5_VABI WKInspectorIsConnected(); +int APS5_VABI WKInspectorIsElementSelectionActive(); +int APS5_VABI WKInspectorIsFront(); +int APS5_VABI WKInspectorIsProfilingPage(); +int APS5_VABI WKInspectorIsVisible(); +int APS5_VABI WKInspectorShowConsole(); +int APS5_VABI WKInspectorShowMainResourceForFrame(); +int APS5_VABI WKInspectorShow(); +int APS5_VABI WKInspectorShowResources(); +int APS5_VABI WKInspectorToggleElementSelection(); +int APS5_VABI WKInspectorTogglePageProfiling(); +int APS5_VABI WKKeyValueStorageManagerDeleteAllEntries(); +int APS5_VABI WKKeyValueStorageManagerDeleteEntriesForOrigin(); +int APS5_VABI WKKeyValueStorageManagerGetCreationTimeKey(); +int APS5_VABI WKKeyValueStorageManagerGetKeyValueStorageOrigins(); +int APS5_VABI WKKeyValueStorageManagerGetModificationTimeKey(); +int APS5_VABI WKKeyValueStorageManagerGetOriginKey(); +int APS5_VABI WKKeyValueStorageManagerGetStorageDetailsByOrigin(); +int APS5_VABI WKKeyboardEventMake(); +int APS5_VABI WKMessageListenerSendReply(); +int APS5_VABI WKMouseEventMake(); +int APS5_VABI WKNavigationActionShouldPerformDownload(); +int APS5_VABI WKNavigationDataCopyNavigationDestinationURL(); +int APS5_VABI WKNavigationDataCopyOriginalRequest(); +int APS5_VABI WKNavigationDataCopyTitle(); +int APS5_VABI WKNavigationDataCopyURL(); +int APS5_VABI WKNavigationResponseCanShowMIMEType(); +int APS5_VABI WKNotificationCopyBody(); +int APS5_VABI WKNotificationCopyIconURL(); +int APS5_VABI WKNotificationCopyLang(); +int APS5_VABI WKNotificationCopyTag(); +int APS5_VABI WKNotificationCopyTitle(); +int APS5_VABI WKNotificationGetID(); +int APS5_VABI WKNotificationGetSecurityOrigin(); +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 WKOpenPanelParametersCopyAcceptedFileExtensions(); +int APS5_VABI WKOpenPanelParametersCopyAcceptedMIMETypes(); +int APS5_VABI WKOpenPanelParametersCopyAllowedMIMETypes(); +int APS5_VABI WKOpenPanelParametersCopyCapture(); +int APS5_VABI WKOpenPanelParametersCopySelectedFileNames(); +int APS5_VABI WKOpenPanelParametersGetAllowsDirectories(); +int APS5_VABI WKOpenPanelParametersGetAllowsMultipleFiles(); +int APS5_VABI WKOpenPanelParametersGetMediaCaptureType(); +int APS5_VABI WKOpenPanelResultListenerCancel(); +int APS5_VABI WKOpenPanelResultListenerChooseFiles(); +int APS5_VABI WKPageAreScrollbarAnimationsSuppressed(); +int APS5_VABI WKPageBackgroundExtendsBeyondPage(); +int APS5_VABI WKPageBeginPrinting(); +int APS5_VABI WKPageBlurFocusedNode(); +int APS5_VABI WKPageCallAfterNextPresentationUpdate(); +int APS5_VABI WKPageCanGoBack(); +int APS5_VABI WKPageCanGoForward(); +int APS5_VABI WKPageCenterSelectionInVisibleArea(); +int APS5_VABI WKPageClearLoadedSubresourceDomains(); +int APS5_VABI WKPageClearSelection(); +int APS5_VABI WKPageClearUserMediaState(); +int APS5_VABI WKPageClearWheelEventTestMonitor(); +int APS5_VABI WKPageClose(); +int APS5_VABI WKPageComputePagesForPrinting(); +int APS5_VABI WKPageCopyActiveURL(); +int APS5_VABI WKPageCopyApplicationNameForUserAgent(); +int APS5_VABI WKPageCopyCommittedURL(); +int APS5_VABI WKPageCopyCustomTextEncodingName(); +int APS5_VABI WKPageCopyCustomUserAgent(); +int APS5_VABI WKPageCopyPageConfiguration(); +int APS5_VABI WKPageCopyPendingAPIRequestURL(); +int APS5_VABI WKPageCopyProvisionalURL(); +int APS5_VABI WKPageCopyRelatedPages(); +int APS5_VABI WKPageCopySessionState(); +int APS5_VABI WKPageCopyStandardUserAgentWithApplicationName(); +int APS5_VABI WKPageCopyTitle(); +int APS5_VABI WKPageCopyUserAgent(); +int APS5_VABI WKPageCountStringMatches(); +int APS5_VABI WKPageDidAllowPointerLock(); +int APS5_VABI WKPageDidDenyPointerLock(); +int APS5_VABI WKPageEndPrinting(); +int APS5_VABI WKPageExecuteCommand(); +int APS5_VABI WKPageFindString(); +int APS5_VABI WKPageFindStringMatches(); +int APS5_VABI WKPageFixedLayoutSize(); +int APS5_VABI WKPageForceRepaint(); +int APS5_VABI WKPageGetAddsVisitedLinks(); +int APS5_VABI WKPageGetAllowsRemoteInspection(); +int APS5_VABI WKPageGetBackForwardList(); +int APS5_VABI WKPageGetBackingScaleFactor(); +int APS5_VABI WKPageGetBytecodeProfile(); +int APS5_VABI WKPageGetContentsAsMHTMLData(); +int APS5_VABI WKPageGetContentsAsString(); +int APS5_VABI WKPageGetContext(); +int APS5_VABI WKPageGetEstimatedProgress(); +int APS5_VABI WKPageGetFocusedFrame(); +int APS5_VABI WKPageGetFrameSetLargestFrame(); +int APS5_VABI WKPageGetGapBetweenPages(); +int APS5_VABI WKPageGetImageForFindMatch(); +int APS5_VABI WKPageGetInspector(); +int APS5_VABI WKPageGetIsControlledByAutomation(); +int APS5_VABI WKPageGetMainFrame(); +int APS5_VABI WKPageGetMediaCaptureEnabled(); +int APS5_VABI WKPageGetMediaState(); +int APS5_VABI WKPageGetPageCount(); +int APS5_VABI WKPageGetPageGroup(); +int APS5_VABI WKPageGetPageLength(); +int APS5_VABI WKPageGetPageZoomFactor(); +int APS5_VABI WKPageGetPaginationBehavesLikeColumns(); +int APS5_VABI WKPageGetPaginationLineGridEnabled(); +int APS5_VABI WKPageGetPaginationMode(); +int APS5_VABI WKPageGetProcessIdentifier(); +int APS5_VABI WKPageGetRenderTreeSize(); +int APS5_VABI WKPageGetSamplingProfilerOutput(); +int APS5_VABI WKPageGetScaleFactor(); +int APS5_VABI WKPageGetScrollPinningBehavior(); +int APS5_VABI WKPageGetSelectionAsWebArchiveData(); +int APS5_VABI WKPageGetSessionBackForwardListItemValueType(); +int APS5_VABI WKPageGetSessionHistoryURLValueType(); +int APS5_VABI WKPageGetSourceForFrame(); +int APS5_VABI WKPageGetTextZoomFactor(); +int APS5_VABI WKPageGoBack(); +int APS5_VABI WKPageGoForward(); +int APS5_VABI WKPageGoToBackForwardListItem(); +int APS5_VABI WKPageHandleImeEvent(); +int APS5_VABI WKPageHandleKeyboardEvent(); +int APS5_VABI WKPageHandleMouseEvent(); +int APS5_VABI WKPageHandleWheelEvent(); +int APS5_VABI WKPageHasHorizontalScrollbar(); +int APS5_VABI WKPageHasSelectedRange(); +int APS5_VABI WKPageHasVerticalScrollbar(); +int APS5_VABI WKPageHideFindUI(); +int APS5_VABI WKPageHorizontalRubberBandingIsEnabled(); +int APS5_VABI WKPageIsClosed(); +int APS5_VABI WKPageIsContentEditable(); +int APS5_VABI WKPageIsMockRealtimeMediaSourceCenterEnabled(); +int APS5_VABI WKPageIsPinnedToBottomSide(); +int APS5_VABI WKPageIsPinnedToLeftSide(); +int APS5_VABI WKPageIsPinnedToRightSide(); +int APS5_VABI WKPageIsPinnedToTopSide(); +int APS5_VABI WKPageIsPlayingAudio(); +int APS5_VABI WKPageListenForLayoutMilestones(); +int APS5_VABI WKPageLoadAlternateHTMLStringWithUserData(); +int APS5_VABI WKPageLoadAlternateHTMLString(); +int APS5_VABI WKPageLoadData(); +int APS5_VABI WKPageLoadDataWithUserData(); +int APS5_VABI WKPageLoadFileWithUserData(); +int APS5_VABI WKPageLoadHTMLString(); +int APS5_VABI WKPageLoadHTMLStringWithUserData(); +int APS5_VABI WKPageLoadPlainTextString(); +int APS5_VABI WKPageLoadPlainTextStringWithUserData(); +int APS5_VABI WKPageLoadURL(); +int APS5_VABI WKPageLoadURLRequest(); +int APS5_VABI WKPageLoadURLRequestWithUserData(); +int APS5_VABI WKPageLoadURLWithShouldOpenExternalURLsPolicy(); +int APS5_VABI WKPageLoadURLWithUserData(); +int APS5_VABI WKPageLoadWebArchiveData(); +int APS5_VABI WKPageLoadWebArchiveDataWithUserData(); +int APS5_VABI WKPageLoadedSubresourceDomains(); +int APS5_VABI WKPageLookUpFrameFromHandle(); +int APS5_VABI WKPagePostMessageToInjectedBundle(); +int APS5_VABI WKPageReloadExpiredOnly(); +int APS5_VABI WKPageReloadFromOrigin(); +int APS5_VABI WKPageReload(); +int APS5_VABI WKPageReloadWithoutContentBlockers(); +int APS5_VABI WKPageRenderTreeExternalRepresentation(); +int APS5_VABI WKPageRequestStorageAccessConfirmResultListenerCall(); +int APS5_VABI WKPageRestoreFromSessionState(); +int APS5_VABI WKPageRestoreFromSessionStateWithoutNavigation(); +int APS5_VABI WKPageResumeActiveDOMObjectsAndAnimations(); +int APS5_VABI WKPageRubberBandsAtBottom(); +int APS5_VABI WKPageRubberBandsAtLeft(); +int APS5_VABI WKPageRubberBandsAtRight(); +int APS5_VABI WKPageRubberBandsAtTop(); +int APS5_VABI WKPageRunBeforeUnloadConfirmPanelResultListenerCall(); +int APS5_VABI WKPageRunJavaScriptAlertResultListenerCall(); +int APS5_VABI WKPageRunJavaScriptConfirmResultListenerCall(); +int APS5_VABI WKPageRunJavaScriptInMainFrame(); +int APS5_VABI WKPageRunJavaScriptPromptResultListenerCall(); +int APS5_VABI WKPageSelectContextMenuItem(); +int APS5_VABI WKPageSelectFindMatch(); +int APS5_VABI WKPageSetAddsVisitedLinks(); +int APS5_VABI WKPageSetAllowsRemoteInspection(); +int APS5_VABI WKPageSetApplicationNameForUserAgent(); +int APS5_VABI WKPageSetBackgroundExtendsBeyondPage(); +int APS5_VABI WKPageSetCaretVisible(); +int APS5_VABI WKPageSetControlledByAutomation(); +int APS5_VABI WKPageSetCustomBackingScaleFactor(); +int APS5_VABI WKPageSetCustomUserAgent(); +int APS5_VABI WKPageSetEnableHorizontalRubberBanding(); +int APS5_VABI WKPageSetEnableVerticalRubberBanding(); +int APS5_VABI WKPageSetFixedLayoutSize(); +int APS5_VABI WKPageSetGapBetweenPages(); +int APS5_VABI WKPageSetIgnoresViewportScaleLimits(); +int APS5_VABI WKPageSetMaintainsInactiveSelection(); +int APS5_VABI WKPageSetMayStartMediaWhenInWindow(); +int APS5_VABI WKPageSetMediaCaptureEnabled(); +int APS5_VABI WKPageSetMediaVolume(); +int APS5_VABI WKPageSetMockCameraOrientation(); +int APS5_VABI WKPageSetMuted(); +int APS5_VABI WKPageSetPageAndTextZoomFactors(); +int APS5_VABI WKPageSetPageContextMenuClient(); +int APS5_VABI WKPageSetPageDiagnosticLoggingClient(); +int APS5_VABI WKPageSetPageFindClient(); +int APS5_VABI WKPageSetPageFindMatchesClient(); +int APS5_VABI WKPageSetPageFormClient(); +int APS5_VABI WKPageSetPageInjectedBundleClient(); +int APS5_VABI WKPageSetPageLength(); +int APS5_VABI WKPageSetPageLoaderClient(); +int APS5_VABI WKPageSetPageNavigationClient(); +int APS5_VABI WKPageSetPagePolicyClient(); +int APS5_VABI WKPageSetPageStateClient(); +int APS5_VABI WKPageSetPageUIClient(); +int APS5_VABI WKPageSetPageZoomFactor(); +int APS5_VABI WKPageSetPaginationBehavesLikeColumns(); +int APS5_VABI WKPageSetPaginationLineGridEnabled(); +int APS5_VABI WKPageSetPaginationMode(); +int APS5_VABI WKPageSetRubberBandsAtBottom(); +int APS5_VABI WKPageSetRubberBandsAtLeft(); +int APS5_VABI WKPageSetRubberBandsAtRight(); +int APS5_VABI WKPageSetRubberBandsAtTop(); +int APS5_VABI WKPageSetScaleFactor(); +int APS5_VABI WKPageSetScrollPinningBehavior(); +int APS5_VABI WKPageSetSuppressScrollbarAnimations(); +int APS5_VABI WKPageSetTextZoomFactor(); +int APS5_VABI WKPageSetUseFixedLayout(); +int APS5_VABI WKPageStopLoading(); +int APS5_VABI WKPageSupportsTextEncoding(); +int APS5_VABI WKPageSupportsTextZoom(); +int APS5_VABI WKPageSuspendActiveDOMObjectsAndAnimations(); +int APS5_VABI WKPageTerminate(); +int APS5_VABI WKPageTryClose(); +int APS5_VABI WKPageTryRestoreScrollPosition(); +int APS5_VABI WKPageUpdateWebsitePolicies(); +int APS5_VABI WKPageUseFixedLayout(); +int APS5_VABI WKPageValidateCommand(); +int APS5_VABI WKPageVerticalRubberBandingIsEnabled(); +int APS5_VABI WKPageWillHandleHorizontalScrollEvents(); +int APS5_VABI WKPlugInInformationReplacementObscuredKey(); +int APS5_VABI WKPluginInformationBundleIdentifierKey(); +int APS5_VABI WKPluginInformationBundleShortVersionKey(); +int APS5_VABI WKPluginInformationBundleVersionKey(); +int APS5_VABI WKPluginInformationDefaultLoadPolicyKey(); +int APS5_VABI WKPluginInformationDisplayNameKey(); +int APS5_VABI WKPluginInformationFrameURLKey(); +int APS5_VABI WKPluginInformationHasSandboxProfileKey(); +int APS5_VABI WKPluginInformationMIMETypeKey(); +int APS5_VABI WKPluginInformationPageURLKey(); +int APS5_VABI WKPluginInformationPathKey(); +int APS5_VABI WKPluginInformationPluginURLKey(); +int APS5_VABI WKPluginInformationPluginspageAttributeURLKey(); +int APS5_VABI WKPluginInformationUpdatePastLastBlockedVersionIsKnownAvailableKey(); +int APS5_VABI WKPopupMenuItemCopyText(); +int APS5_VABI WKPopupMenuItemIsEnabled(); +int APS5_VABI WKPopupMenuItemIsItem(); +int APS5_VABI WKPopupMenuItemIsSeparator(); +int APS5_VABI WKPreferencesGetAccelerated2DCanvasEnabled(); +int APS5_VABI WKPreferencesGetQTKitEnabled(); +int APS5_VABI WKPreferencesGetTypeID(); +int APS5_VABI WKPreferencesSetAccelerated2DCanvasEnabled(); +int APS5_VABI WKPreferencesSetQTKitEnabled(); +int APS5_VABI WKProtectionSpaceCopyCertificateInfo(); +int APS5_VABI WKProtectionSpaceCopyHost(); +int APS5_VABI WKProtectionSpaceCopyRealm(); +int APS5_VABI WKProtectionSpaceGetAuthenticationScheme(); +int APS5_VABI WKProtectionSpaceGetIsProxy(); +int APS5_VABI WKProtectionSpaceGetPort(); +int APS5_VABI WKProtectionSpaceGetReceivesCredentialSecurely(); +int APS5_VABI WKProtectionSpaceGetServerType(); +int APS5_VABI WKRegistrableDomainCreate(); +int APS5_VABI WKRemoveMockMediaDevice(); +int APS5_VABI WKRenderLayerCopyElementID(); +int APS5_VABI WKRenderLayerCopyElementTagName(); +int APS5_VABI WKRenderLayerCopyRendererName(); +int APS5_VABI WKRenderLayerGetAbsoluteBounds(); +int APS5_VABI WKRenderLayerGetBackingStoreMemoryEstimate(); +int APS5_VABI WKRenderLayerGetCompositingLayerType(); +int APS5_VABI WKRenderLayerGetElementClassNames(); +int APS5_VABI WKRenderLayerGetFrameContentsLayer(); +int APS5_VABI WKRenderLayerGetNegativeZOrderList(); +int APS5_VABI WKRenderLayerGetNormalFlowList(); +int APS5_VABI WKRenderLayerGetPositiveZOrderList(); +int APS5_VABI WKRenderLayerGetRenderer(); +int APS5_VABI WKRenderLayerIsClipped(); +int APS5_VABI WKRenderLayerIsClipping(); +int APS5_VABI WKRenderLayerIsReflection(); +int APS5_VABI WKRenderObjectCopyElementID(); +int APS5_VABI WKRenderObjectCopyElementTagName(); +int APS5_VABI WKRenderObjectCopyName(); +int APS5_VABI WKRenderObjectCopyTextSnippet(); +int APS5_VABI WKRenderObjectGetAbsolutePosition(); +int APS5_VABI WKRenderObjectGetChildren(); +int APS5_VABI WKRenderObjectGetElementClassNames(); +int APS5_VABI WKRenderObjectGetFrameRect(); +int APS5_VABI WKRenderObjectGetTextLength(); +int APS5_VABI WKResetMockMediaDevices(); +int APS5_VABI WKResourceCacheManagerClearCacheForAllOrigins(); +int APS5_VABI WKResourceCacheManagerClearCacheForOrigin(); +int APS5_VABI WKResourceCacheManagerGetCacheOrigins(); +int APS5_VABI WKRunLoopCallOnMainThread(); +int APS5_VABI WKRunLoopInitializeMain(); +int APS5_VABI WKRunLoopRunMain(); +int APS5_VABI WKRunLoopStopMain(); +int APS5_VABI WKSendDisplayConfigurationChangedMessageForTesting(); +int APS5_VABI WKSerializedScriptValueCreate(); +int APS5_VABI WKSerializedScriptValueDeserialize(); +int APS5_VABI WKSessionStateCopyData(); +int APS5_VABI WKSessionStateCreateFromData(); +int APS5_VABI WKTextCheckerSetTestingMode(); +int APS5_VABI WKURLCopyHostName(); +int APS5_VABI WKURLCopyLastPathComponent(); +int APS5_VABI WKURLCopyPath(); +int APS5_VABI WKURLCopyScheme(); +int APS5_VABI WKURLCreateWithBaseURL(); +int APS5_VABI WKURLIsEqual(); +int APS5_VABI WKUserContentExtensionStoreCompile(); +int APS5_VABI WKUserContentExtensionStoreCreate(); +int APS5_VABI WKUserContentExtensionStoreLookup(); +int APS5_VABI WKUserMediaPermissionCheckSetUserMediaAccessInfo(); +int APS5_VABI WKUserMediaPermissionRequestAllow(); +int APS5_VABI WKUserMediaPermissionRequestAudioDeviceUIDs(); +int APS5_VABI WKUserMediaPermissionRequestDeny(); +int APS5_VABI WKUserMediaPermissionRequestVideoDeviceUIDs(); +int APS5_VABI WKViewAccessibilityFocusedObject(); +int APS5_VABI WKViewAccessibilityHitTest(); +int APS5_VABI WKViewAccessibilityRootObject(); +int APS5_VABI WKViewCreate(); +int APS5_VABI WKViewDidEnterFullScreen(); +int APS5_VABI WKViewDidExitFullScreen(); +int APS5_VABI WKViewGetPage(); +int APS5_VABI WKViewGetPunchHoles(); +int APS5_VABI WKViewIsFullScreen(); +int APS5_VABI WKViewRequestExitFullScreen(); +int APS5_VABI WKViewSetActive(); +int APS5_VABI WKViewSetFocus(); +int APS5_VABI WKViewSetSize(); +int APS5_VABI WKViewSetViewAccessibilityClient(); +int APS5_VABI WKViewSetViewClient(); +int APS5_VABI WKViewSetViewPopupMenuClient(); +int APS5_VABI WKViewSetVisible(); +int APS5_VABI WKViewValueChangedForPopupMenu(); +int APS5_VABI WKViewWillEnterFullScreen(); +int APS5_VABI WKViewWillExitFullScreen(); +int APS5_VABI WKWebsiteDataStoreClearAllDeviceOrientationPermissions(); +int APS5_VABI WKWebsiteDataStoreClearAppBoundSession(); +int APS5_VABI WKWebsiteDataStoreClearBundleIdentifierInNetworkProcess(); +int APS5_VABI WKWebsiteDataStoreCreateNonPersistentDataStore(); +int APS5_VABI WKWebsiteDataStoreCreateWithConfiguration(); +int APS5_VABI WKWebsiteDataStoreDisableNetworkProxySettings(); +int APS5_VABI WKWebsiteDataStoreDoesStatisticsDomainIDExistInDatabase(); +int APS5_VABI WKWebsiteDataStoreDumpResourceLoadStatistics(); +int APS5_VABI WKWebsiteDataStoreEnableCustomNetworkProxySettings(); +int APS5_VABI WKWebsiteDataStoreEnableDefaultNetworkProxySettings(); +int APS5_VABI WKWebsiteDataStoreGetAllStorageAccessEntries(); +int APS5_VABI WKWebsiteDataStoreGetDefaultDataStore(); +int APS5_VABI WKWebsiteDataStoreGetFetchCacheOrigins(); +int APS5_VABI WKWebsiteDataStoreGetFetchCacheSizeForOrigin(); +int APS5_VABI WKWebsiteDataStoreGetHTTPCookieStore(); +int APS5_VABI WKWebsiteDataStoreGetResourceLoadStatisticsEnabled(); +int APS5_VABI WKWebsiteDataStoreIsStatisticsEphemeral(); +int APS5_VABI WKWebsiteDataStoreIsStatisticsGrandfathered(); +int APS5_VABI WKWebsiteDataStoreIsStatisticsHasHadUserInteraction(); +int APS5_VABI WKWebsiteDataStoreIsStatisticsOnlyInDatabaseOnce(); +int APS5_VABI WKWebsiteDataStoreIsStatisticsPrevalentResource(); +int APS5_VABI WKWebsiteDataStoreIsStatisticsRegisteredAsRedirectingTo(); +int APS5_VABI WKWebsiteDataStoreIsStatisticsRegisteredAsSubFrameUnder(); +int APS5_VABI WKWebsiteDataStoreIsStatisticsRegisteredAsSubresourceUnder(); +int APS5_VABI WKWebsiteDataStoreIsStatisticsVeryPrevalentResource(); +int APS5_VABI WKWebsiteDataStoreReinitializeAppBoundDomains(); +int APS5_VABI WKWebsiteDataStoreRemoveAllFetchCaches(); +int APS5_VABI WKWebsiteDataStoreRemoveAllIndexedDatabases(); +int APS5_VABI WKWebsiteDataStoreRemoveAllServiceWorkerRegistrations(); +int APS5_VABI WKWebsiteDataStoreRemoveFetchCacheForOrigin(); +int APS5_VABI WKWebsiteDataStoreRemoveITPDataForDomain(); +int APS5_VABI WKWebsiteDataStoreRemoveLocalStorage(); +int APS5_VABI WKWebsiteDataStoreResetQuota(); +int APS5_VABI WKWebsiteDataStoreSetAdditionalRootCA(); +int APS5_VABI WKWebsiteDataStoreSetAppBoundDomainsForTesting(); +int APS5_VABI WKWebsiteDataStoreSetCacheModelSynchronouslyForTesting(); +int APS5_VABI WKWebsiteDataStoreSetClientCertificate(); +int APS5_VABI WKWebsiteDataStoreSetPerOriginStorageQuota(); +int APS5_VABI WKWebsiteDataStoreSetResourceLoadStatisticsDebugModeWithCompletionHandler(); +int APS5_VABI WKWebsiteDataStoreSetResourceLoadStatisticsDebugMode(); +int APS5_VABI WKWebsiteDataStoreSetResourceLoadStatisticsEnabled(); +int APS5_VABI WKWebsiteDataStoreSetResourceLoadStatisticsFirstPartyHostCNAMEDomainForTesting(); +int APS5_VABI WKWebsiteDataStoreSetResourceLoadStatisticsFirstPartyWebsiteDataRemovalModeForTesting(); +int APS5_VABI WKWebsiteDataStoreSetResourceLoadStatisticsPrevalentResourceForDebugMode(); +int APS5_VABI WKWebsiteDataStoreSetResourceLoadStatisticsShouldBlockThirdPartyCookiesForTesting(); +int APS5_VABI WKWebsiteDataStoreSetResourceLoadStatisticsShouldDowngradeReferrerForTesting(); +int APS5_VABI WKWebsiteDataStoreSetResourceLoadStatisticsThirdPartyCNAMEDomainForTesting(); +int APS5_VABI WKWebsiteDataStoreSetResourceLoadStatisticsToSameSiteStrictCookiesForTesting(); +int APS5_VABI WKWebsiteDataStoreSetStatisticsCacheMaxAgeCap(); +int APS5_VABI WKWebsiteDataStoreSetStatisticsCrossSiteLoadWithLinkDecoration(); +int APS5_VABI WKWebsiteDataStoreSetStatisticsExpiredStatistic(); +int APS5_VABI WKWebsiteDataStoreSetStatisticsGrandfathered(); +int APS5_VABI WKWebsiteDataStoreSetStatisticsGrandfatheringTime(); +int APS5_VABI WKWebsiteDataStoreSetStatisticsHasHadUserInteraction(); +int APS5_VABI WKWebsiteDataStoreSetStatisticsIsRunningTest(); +int APS5_VABI WKWebsiteDataStoreSetStatisticsLastSeen(); +int APS5_VABI WKWebsiteDataStoreSetStatisticsMaxStatisticsEntries(); +int APS5_VABI WKWebsiteDataStoreSetStatisticsMergeStatistic(); +int APS5_VABI WKWebsiteDataStoreSetStatisticsMinimumTimeBetweenDataRecordsRemoval(); +int APS5_VABI WKWebsiteDataStoreSetStatisticsNotifyPagesWhenDataRecordsWereScanned(); +int APS5_VABI WKWebsiteDataStoreSetStatisticsPrevalentResource(); +int APS5_VABI WKWebsiteDataStoreSetStatisticsPruneEntriesDownTo(); +int APS5_VABI WKWebsiteDataStoreSetStatisticsShouldClassifyResourcesBeforeDataRecordsRemoval(); +int APS5_VABI WKWebsiteDataStoreSetStatisticsSubframeUnderTopFrameOrigin(); +int APS5_VABI WKWebsiteDataStoreSetStatisticsSubresourceUnderTopFrameOrigin(); +int APS5_VABI WKWebsiteDataStoreSetStatisticsSubresourceUniqueRedirectFrom(); +int APS5_VABI WKWebsiteDataStoreSetStatisticsSubresourceUniqueRedirectTo(); +int APS5_VABI WKWebsiteDataStoreSetStatisticsTimeToLiveUserInteraction(); +int APS5_VABI WKWebsiteDataStoreSetStatisticsTopFrameUniqueRedirectFrom(); +int APS5_VABI WKWebsiteDataStoreSetStatisticsTopFrameUniqueRedirectTo(); +int APS5_VABI WKWebsiteDataStoreSetStatisticsVeryPrevalentResource(); +int APS5_VABI WKWebsiteDataStoreStatisticsClearInMemoryAndPersistentStoreModifiedSinceHours(); +int APS5_VABI WKWebsiteDataStoreStatisticsClearInMemoryAndPersistentStore(); +int APS5_VABI WKWebsiteDataStoreStatisticsClearThroughWebsiteDataRemoval(); +int APS5_VABI WKWebsiteDataStoreStatisticsDeleteCookiesForTesting(); +int APS5_VABI WKWebsiteDataStoreStatisticsHasIsolatedSession(); +int APS5_VABI WKWebsiteDataStoreStatisticsHasLocalStorage(); +int APS5_VABI WKWebsiteDataStoreStatisticsProcessStatisticsAndDataRecords(); +int APS5_VABI WKWebsiteDataStoreStatisticsResetToConsistentState(); +int APS5_VABI WKWebsiteDataStoreStatisticsUpdateCookieBlocking(); +int APS5_VABI WKWebsiteDataStoreUpdateBundleIdentifierInNetworkProcess(); +int APS5_VABI _ZN14OpaqueJSString9tryCreateEON3WTF6StringE(); +int APS5_VABI _ZN14OpaqueJSString9tryCreateERKN3WTF6StringE(); +int APS5_VABI _ZN3JSC10ConfigFile14setProcessNameEPKc(); +int APS5_VABI _ZN3JSC10ConfigFile20setParentProcessNameEPKc(); +int APS5_VABI _ZN3JSC10ConfigFile5parseEv(); +int APS5_VABI _ZN3JSC10ConfigFileC1EPKc(); +int APS5_VABI _ZN3JSC10ConfigFileC2EPKc(); +int APS5_VABI _ZN3JSC10Identifier27checkCurrentAtomStringTableERNS_2VME(); +int APS5_VABI _ZN3JSC10Identifier4fromERNS_2VMEd(); +int APS5_VABI _ZN3JSC10Identifier4fromERNS_2VMEi(); +int APS5_VABI _ZN3JSC10Identifier4fromERNS_2VMEj(); +int APS5_VABI _ZN3JSC10IsoCellSet33parallelNotEmptyMarkedBlockSourceEv(); +int APS5_VABI _ZN3JSC10JSCellLock10unlockSlowEv(); +int APS5_VABI _ZN3JSC10JSCellLock8lockSlowEv(); +int APS5_VABI _ZN3JSC10JSFunction11displayNameERNS_2VME(); +int APS5_VABI _ZN3JSC10JSFunction21calculatedDisplayNameERNS_2VME(); +int APS5_VABI _ZN3JSC10JSFunction4nameERNS_2VME(); +int APS5_VABI _ZN3JSC10JSFunction6createERNS_2VMEPNS_18FunctionExecutableEPNS_7JSScopeE(); +int APS5_VABI _ZN3JSC10JSFunctionC1ERNS_2VMEPNS_16NativeExecutableEPNS_14JSGlobalObjectEPNS_9StructureE(); +int APS5_VABI _ZN3JSC10JSFunctionC2ERNS_2VMEPNS_16NativeExecutableEPNS_14JSGlobalObjectEPNS_9StructureE(); +int APS5_VABI _ZN3JSC10LinkBuffer31finalizeCodeWithDisassemblyImplEbPKcz(); +int APS5_VABI _ZN3JSC10LinkBuffer34finalizeCodeWithoutDisassemblyImplEv(); +int APS5_VABI _ZN3JSC10initializeEv(); +int APS5_VABI _ZN3JSC10loadModuleEPNS_14JSGlobalObjectERKNS_10SourceCodeENS_7JSValueE(); +int APS5_VABI _ZN3JSC11ArrayBuffer10transferToERNS_2VMERNS_19ArrayBufferContentsE(); +int APS5_VABI _ZN3JSC11ArrayBuffer27primitiveGigacageDestructorEv(); +int APS5_VABI _ZN3JSC11ArrayBuffer6createEONS_19ArrayBufferContentsE(); +int APS5_VABI _ZN3JSC11ArrayBuffer6createERS0_(); +int APS5_VABI _ZN3JSC11ArrayBuffer9shareWithERNS_19ArrayBufferContentsE(); +int APS5_VABI _ZN3JSC11ArrayBuffer9tryCreateERS0_(); +int APS5_VABI _ZN3JSC11FuzzerAgent13getPredictionEPNS_9CodeBlockERKNS_10CodeOriginEm(); +int APS5_VABI _ZN3JSC11FuzzerAgentD0Ev(); +int APS5_VABI _ZN3JSC11FuzzerAgentD1Ev(); +int APS5_VABI _ZN3JSC11FuzzerAgentD2Ev(); +int APS5_VABI _ZN3JSC11IsoSubspaceD0Ev(); +int APS5_VABI _ZN3JSC11IsoSubspaceD1Ev(); +int APS5_VABI _ZN3JSC11IsoSubspaceD2Ev(); +int APS5_VABI _ZN3JSC11JSWithScope6createERNS_2VMEPNS_14JSGlobalObjectEPNS_7JSScopeEPNS_8JSObjectE(); +int APS5_VABI _ZN3JSC11MarkedBlock13areMarksStaleEv(); +int APS5_VABI _ZN3JSC11MarkedBlock15aboutToMarkSlowEj(); +int APS5_VABI _ZN3JSC11MarkedBlock6Handle13areMarksStaleEv(); +int APS5_VABI _ZN3JSC11ProxyObject14finishCreationERNS_2VMEPNS_14JSGlobalObjectENS_7JSValueES5_(); +int APS5_VABI _ZN3JSC11ProxyObject18structureForTargetEPNS_14JSGlobalObjectENS_7JSValueE(); +int APS5_VABI _ZN3JSC11ProxyObjectC2ERNS_2VMEPNS_9StructureE(); +int APS5_VABI _ZN3JSC11SlotVisitor10appendSlowEPNS_6JSCellEN3WTF10DependencyE(); +int APS5_VABI _ZN3JSC11SlotVisitor16appendHiddenSlowEPNS_6JSCellEN3WTF10DependencyE(); +int APS5_VABI _ZN3JSC11SymbolTableC1ERNS_2VME(); +int APS5_VABI _ZN3JSC11SymbolTableC2ERNS_2VME(); +int APS5_VABI _ZN3JSC11VMInspector11isValidCellEPNS_4HeapEPNS_6JSCellE(); +int APS5_VABI _ZN3JSC11VMInspector13dumpCallFrameEPNS_2VMEPNS_9CallFrameEj(); +int APS5_VABI _ZN3JSC11VMInspector13dumpRegistersEPNS_9CallFrameE(); +int APS5_VABI _ZN3JSC11VMInspector14dumpCellMemoryEPNS_6JSCellE(); +int APS5_VABI _ZN3JSC11VMInspector16isValidCodeBlockEPNS_2VMEPNS_9CodeBlockE(); +int APS5_VABI _ZN3JSC11VMInspector17codeBlockForFrameEPNS_2VMEPNS_9CallFrameEj(); +int APS5_VABI _ZN3JSC11VMInspector18dumpSubspaceHashesEPNS_2VME(); +int APS5_VABI _ZN3JSC11VMInspector22dumpCellMemoryToStreamEPNS_6JSCellERN3WTF11PrintStreamE(); +int APS5_VABI _ZN3JSC11VMInspector23currentThreadOwnsJSLockEPNS_2VME(); +int APS5_VABI _ZN3JSC11VMInspector2gcEPNS_2VME(); +int APS5_VABI _ZN3JSC11VMInspector6edenGCEPNS_2VME(); +int APS5_VABI _ZN3JSC11VMInspector8isInHeapEPNS_4HeapEPv(); +int APS5_VABI _ZN3JSC11VMInspector9dumpStackEPNS_2VMEPNS_9CallFrameEj(); +int APS5_VABI _ZN3JSC11checkSyntaxEPNS_14JSGlobalObjectERKNS_10SourceCodeEPNS_7JSValueE(); +int APS5_VABI _ZN3JSC11checkSyntaxERNS_2VMERKNS_10SourceCodeERNS_11ParserErrorE(); +int APS5_VABI _ZN3JSC11createErrorEPNS_14JSGlobalObjectENS_22ErrorTypeWithExtensionERKN3WTF6StringE(); +int APS5_VABI _ZN3JSC11createErrorEPNS_14JSGlobalObjectENS_9ErrorTypeERKN3WTF6StringE(); +int APS5_VABI _ZN3JSC11createErrorEPNS_14JSGlobalObjectERKN3WTF6StringE(); +int APS5_VABI _ZN3JSC12BigIntObject14finishCreationERNS_2VMENS_7JSValueE(); +int APS5_VABI _ZN3JSC12BigIntObject6createERNS_2VMEPNS_14JSGlobalObjectENS_7JSValueE(); +int APS5_VABI _ZN3JSC12BigIntObjectC1ERNS_2VMEPNS_9StructureE(); +int APS5_VABI _ZN3JSC12BigIntObjectC2ERNS_2VMEPNS_9StructureE(); +int APS5_VABI _ZN3JSC12CachePayload16makeEmptyPayloadEv(); +int APS5_VABI _ZN3JSC12CachePayload17makeMallocPayloadEON3WTF9MallocPtrIhNS1_10FastMallocEEEm(); +int APS5_VABI _ZN3JSC12CachePayload17makeMappedPayloadEON3WTF14FileSystemImpl14MappedFileDataE(); +int APS5_VABI _ZN3JSC12CachePayloadC1EOS0_(); +int APS5_VABI _ZN3JSC12CachePayloadC2EOS0_(); +int APS5_VABI _ZN3JSC12CachePayloadD1Ev(); +int APS5_VABI _ZN3JSC12DateInstance14finishCreationERNS_2VMEd(); +int APS5_VABI _ZN3JSC12DateInstanceC1ERNS_2VMEPNS_9StructureE(); +int APS5_VABI _ZN3JSC12DateInstanceC2ERNS_2VMEPNS_9StructureE(); +int APS5_VABI _ZN3JSC12GlobalJSLockC1Ev(); +int APS5_VABI _ZN3JSC12GlobalJSLockC2Ev(); +int APS5_VABI _ZN3JSC12GlobalJSLockD1Ev(); +int APS5_VABI _ZN3JSC12GlobalJSLockD2Ev(); +int APS5_VABI _ZN3JSC12HeapAnalyzerC2ERKS0_(); +int APS5_VABI _ZN3JSC12HeapAnalyzerC2Ev(); +int APS5_VABI _ZN3JSC12HeapAnalyzerD0Ev(); +int APS5_VABI _ZN3JSC12HeapAnalyzerD1Ev(); +int APS5_VABI _ZN3JSC12HeapAnalyzerD2Ev(); +int APS5_VABI _ZN3JSC12HeapAnalyzeraSERKS0_(); +int APS5_VABI _ZN3JSC12HeapCellTypeC1ENS_14CellAttributesE(); +int APS5_VABI _ZN3JSC12HeapCellTypeC2ENS_14CellAttributesE(); +int APS5_VABI _ZN3JSC12HeapCellTypeD0Ev(); +int APS5_VABI _ZN3JSC12HeapCellTypeD1Ev(); +int APS5_VABI _ZN3JSC12HeapCellTypeD2Ev(); +int APS5_VABI _ZN3JSC12HeapVerifier12validateCellEPNS_8HeapCellEPNS_2VME(); +int APS5_VABI _ZN3JSC12HeapVerifier15checkIfRecordedEm(); +int APS5_VABI _ZN3JSC12JSLockHolderC1EPNS_14JSGlobalObjectE(); +int APS5_VABI _ZN3JSC12JSLockHolderC1EPNS_2VME(); +int APS5_VABI _ZN3JSC12JSLockHolderC2EPNS_14JSGlobalObjectE(); +int APS5_VABI _ZN3JSC12JSLockHolderC2EPNS_2VME(); +int APS5_VABI _ZN3JSC12JSLockHolderC2ERNS_2VME(); +int APS5_VABI _ZN3JSC12JSLockHolderD1Ev(); +int APS5_VABI _ZN3JSC12JSLockHolderD2Ev(); +int APS5_VABI _ZN3JSC12SmallStrings24singleCharacterStringRepEh(); +int APS5_VABI _ZN3JSC12StackVisitor13gotoNextFrameEv(); +int APS5_VABI _ZN3JSC12StackVisitor5Frame8sourceIDEv(); +int APS5_VABI _ZN3JSC12StackVisitorC1EPNS_9CallFrameERNS_2VME(); +int APS5_VABI _ZN3JSC12StackVisitorC2EPNS_9CallFrameERNS_2VME(); +int APS5_VABI _ZN3JSC12StringObject14finishCreationERNS_2VMEPNS_8JSStringE(); +int APS5_VABI _ZN3JSC12StringObjectC2ERNS_2VMEPNS_9StructureE(); +int APS5_VABI _ZN3JSC12SymbolObject14finishCreationERNS_2VMEPNS_6SymbolE(); +int APS5_VABI _ZN3JSC12SymbolObjectC1ERNS_2VMEPNS_9StructureE(); +int APS5_VABI _ZN3JSC12SymbolObjectC2ERNS_2VMEPNS_9StructureE(); +int APS5_VABI _ZN3JSC12addErrorInfoEPNS_14JSGlobalObjectEPNS_8JSObjectEb(); +int APS5_VABI _ZN3JSC12isFromJSCodeEPv(); +int APS5_VABI _ZN3JSC12iteratorStepEPNS_14JSGlobalObjectENS_15IterationRecordE(); +int APS5_VABI _ZN3JSC12profiledCallEPNS_14JSGlobalObjectENS_15ProfilingReasonENS_7JSValueERKNS_8CallDataES3_RKNS_7ArgListERN3WTF8NakedPtrINS_9ExceptionEEE(); +int APS5_VABI _ZN3JSC12profiledCallEPNS_14JSGlobalObjectENS_15ProfilingReasonENS_7JSValueERKNS_8CallDataES3_RKNS_7ArgListE(); +int APS5_VABI _ZN3JSC13BooleanObjectC1ERNS_2VMEPNS_9StructureE(); +int APS5_VABI _ZN3JSC13BooleanObjectC2ERNS_2VMEPNS_9StructureE(); +int APS5_VABI _ZN3JSC13ConsoleClient19printConsoleMessageENS_13MessageSourceENS_11MessageTypeENS_12MessageLevelERKN3WTF6StringES7_jj(); +int APS5_VABI _ZN3JSC13DebuggerScope6createERNS_2VMEPNS_7JSScopeE(); +int APS5_VABI _ZN3JSC13ErrorInstance17sanitizedToStringEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZN3JSC13JSMapIterator14finishCreationERNS_2VMEPNS_5JSMapENS_13IterationKindE(); +int APS5_VABI _ZN3JSC13JSONStringifyEPNS_14JSGlobalObjectENS_7JSValueES2_(); +int APS5_VABI _ZN3JSC13JSONStringifyEPNS_14JSGlobalObjectENS_7JSValueEj(); +int APS5_VABI _ZN3JSC13JSSetIterator10createPairEPNS_14JSGlobalObjectENS_7JSValueES3_(); +int APS5_VABI _ZN3JSC13RuntimeMethod14finishCreationERNS_2VMERKN3WTF6StringE(); +int APS5_VABI _ZN3JSC13RuntimeMethod15createPrototypeERNS_2VMERNS_14JSGlobalObjectE(); +int APS5_VABI _ZN3JSC13RuntimeMethod15createStructureERNS_2VMEPNS_14JSGlobalObjectENS_7JSValueE(); +int APS5_VABI _ZN3JSC13RuntimeMethod15subspaceForImplERNS_2VME(); +int APS5_VABI _ZN3JSC13RuntimeMethod4infoEv(); +int APS5_VABI _ZN3JSC13RuntimeMethod6createEPNS_14JSGlobalObjectES2_PNS_9StructureERKN3WTF6StringEPNS_8Bindings6MethodE(); +int APS5_VABI _ZN3JSC13RuntimeMethodC1ERNS_2VMEPNS_9StructureEPNS_8Bindings6MethodE(); +int APS5_VABI _ZN3JSC13RuntimeMethodC2ERNS_2VMEPNS_9StructureEPNS_8Bindings6MethodE(); +int APS5_VABI _ZN3JSC13ShadowChicken16functionsOnStackEPNS_14JSGlobalObjectEPNS_9CallFrameE(); +int APS5_VABI _ZN3JSC13WatchpointSet11fireAllSlowERNS_2VMEPKc(); +int APS5_VABI _ZN3JSC13WatchpointSet11fireAllSlowERNS_2VMEPNS_22DeferredWatchpointFireE(); +int APS5_VABI _ZN3JSC13WatchpointSet11fireAllSlowERNS_2VMERKNS_10FireDetailE(); +int APS5_VABI _ZN3JSC13WatchpointSetC1ENS_15WatchpointStateE(); +int APS5_VABI _ZN3JSC13WatchpointSetC2ENS_15WatchpointStateE(); +int APS5_VABI _ZN3JSC13WatchpointSetD1Ev(); +int APS5_VABI _ZN3JSC13WatchpointSetD2Ev(); +int APS5_VABI _ZN3JSC13iteratorValueEPNS_14JSGlobalObjectENS_7JSValueE(); +int APS5_VABI _ZN3JSC14JSGlobalObject13clearRareDataEPNS_6JSCellE(); +int APS5_VABI _ZN3JSC14JSGlobalObject14exposeDollarVMERNS_2VME(); +int APS5_VABI _ZN3JSC14JSGlobalObject14finishCreationERNS_2VMEPNS_8JSObjectE(); +int APS5_VABI _ZN3JSC14JSGlobalObject14finishCreationERNS_2VME(); +int APS5_VABI _ZN3JSC14JSGlobalObject16addStaticGlobalsEPNS0_18GlobalPropertyInfoEi(); +int APS5_VABI _ZN3JSC14JSGlobalObject4initERNS_2VME(); +int APS5_VABI _ZN3JSC14JSGlobalObject6createERNS_2VMEPNS_9StructureE(); +int APS5_VABI _ZN3JSC14JSGlobalObjectC1ERNS_2VMEPNS_9StructureEPKNS_23GlobalObjectMethodTableE(); +int APS5_VABI _ZN3JSC14JSGlobalObjectC2ERNS_2VMEPNS_9StructureEPKNS_23GlobalObjectMethodTableE(); +int APS5_VABI _ZN3JSC14JSGlobalObjectD1Ev(); +int APS5_VABI _ZN3JSC14JSGlobalObjectD2Ev(); +int APS5_VABI _ZN3JSC14JSRunLoopTimerD0Ev(); +int APS5_VABI _ZN3JSC14JSRunLoopTimerD1Ev(); +int APS5_VABI _ZN3JSC14JSRunLoopTimerD2Ev(); +int APS5_VABI _ZN3JSC14ProtoCallFrame11setArgumentEmNS_7JSValueE(); +int APS5_VABI _ZN3JSC14ProtoCallFrame12setCodeBlockEPNS_9CodeBlockE(); +int APS5_VABI _ZN3JSC14ProtoCallFrame12setThisValueENS_7JSValueE(); +int APS5_VABI _ZN3JSC14ProtoCallFrame15clearCurrentVPCEv(); +int APS5_VABI _ZN3JSC14ProtoCallFrame15setGlobalObjectEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZN3JSC14ProtoCallFrame17setPaddedArgCountEj(); +int APS5_VABI _ZN3JSC14ProtoCallFrame29setArgumentCountIncludingThisEi(); +int APS5_VABI _ZN3JSC14ProtoCallFrame8argumentEm(); +int APS5_VABI _ZN3JSC14ProtoCallFrame9setCalleeEPNS_8JSObjectE(); +int APS5_VABI _ZN3JSC14ProtoCallFrameC1Ev(); +int APS5_VABI _ZN3JSC14ProtoCallFrameC2Ev(); +int APS5_VABI _ZN3JSC14ProtoCallFrameaSERKS0_(); +int APS5_VABI _ZN3JSC14SourceProvider5getIDEv(); +int APS5_VABI _ZN3JSC14SourceProviderD0Ev(); +int APS5_VABI _ZN3JSC14SourceProviderD1Ev(); +int APS5_VABI _ZN3JSC14SourceProviderD2Ev(); +int APS5_VABI _ZN3JSC14StructureCache32emptyObjectStructureForPrototypeEPNS_14JSGlobalObjectEPNS_8JSObjectEjbPNS_18FunctionExecutableE(); +int APS5_VABI _ZN3JSC14StructureCache43emptyStructureForPrototypeFromBaseStructureEPNS_14JSGlobalObjectEPNS_8JSObjectEPNS_9StructureE(); +int APS5_VABI _ZN3JSC14constructArrayEPNS_14JSGlobalObjectEPNS_9StructureEPKNS_7JSValueEj(); +int APS5_VABI _ZN3JSC14constructArrayEPNS_14JSGlobalObjectEPNS_9StructureERKNS_7ArgListE(); +int APS5_VABI _ZN3JSC14createURIErrorEPNS_14JSGlobalObjectERKN3WTF6StringE(); +int APS5_VABI _ZN3JSC14iteratorMethodEPNS_14JSGlobalObjectEPNS_8JSObjectE(); +int APS5_VABI _ZN3JSC14setNeverInlineEPK15OpaqueJSContextPK13OpaqueJSValue(); +int APS5_VABI _ZN3JSC14setNeverInlineEPNS_14JSGlobalObjectEPNS_9CallFrameE(); +int APS5_VABI _ZN3JSC14throwTypeErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeEN3WTF12ASCIILiteralE(); +int APS5_VABI _ZN3JSC14throwTypeErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeERKN3WTF6StringE(); +int APS5_VABI _ZN3JSC14throwTypeErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeE(); +int APS5_VABI _ZN3JSC15IsoHeapCellTypeC1ENS_15DestructionModeEPFvPNS_6JSCellEE(); +int APS5_VABI _ZN3JSC15IsoHeapCellTypeC2ENS_15DestructionModeEPFvPNS_6JSCellEE(); +int APS5_VABI _ZN3JSC15TypeProfilerLog17processLogEntriesERNS_2VMERKN3WTF6StringE(); +int APS5_VABI _ZN3JSC15WeakHandleOwner8finalizeENS_6HandleINS_7UnknownEEEPv(); +int APS5_VABI _ZN3JSC15WeakHandleOwnerC1ERKS0_(); +int APS5_VABI _ZN3JSC15WeakHandleOwnerC1Ev(); +int APS5_VABI _ZN3JSC15WeakHandleOwnerC2ERKS0_(); +int APS5_VABI _ZN3JSC15WeakHandleOwnerC2Ev(); +int APS5_VABI _ZN3JSC15WeakHandleOwnerD0Ev(); +int APS5_VABI _ZN3JSC15WeakHandleOwnerD1Ev(); +int APS5_VABI _ZN3JSC15WeakHandleOwnerD2Ev(); +int APS5_VABI _ZN3JSC15constructNumberEPNS_14JSGlobalObjectENS_7JSValueE(); +int APS5_VABI _ZN3JSC15constructStringERNS_2VMEPNS_14JSGlobalObjectENS_7JSValueE(); +int APS5_VABI _ZN3JSC15createEvalErrorEPNS_14JSGlobalObjectERKN3WTF6StringE(); +int APS5_VABI _ZN3JSC15createTypeErrorEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZN3JSC15createTypeErrorEPNS_14JSGlobalObjectERKN3WTF6StringE(); +int APS5_VABI _ZN3JSC15encodeCodeBlockERNS_2VMERKNS_13SourceCodeKeyEPKNS_17UnlinkedCodeBlockE(); +int APS5_VABI _ZN3JSC15encodeCodeBlockERNS_2VMERKNS_13SourceCodeKeyEPKNS_17UnlinkedCodeBlockEiRNS_18BytecodeCacheErrorE(); +int APS5_VABI _ZN3JSC15ordinarySetSlowEPNS_14JSGlobalObjectEPNS_8JSObjectENS_12PropertyNameENS_7JSValueES5_b(); +int APS5_VABI _ZN3JSC16CompleteSubspace12allocateSlowERNS_2VMEmPNS_17GCDeferralContextENS_21AllocationFailureModeE(); +int APS5_VABI _ZN3JSC16CompleteSubspace16allocatorForSlowEm(); +int APS5_VABI _ZN3JSC16CompleteSubspaceD0Ev(); +int APS5_VABI _ZN3JSC16CompleteSubspaceD1Ev(); +int APS5_VABI _ZN3JSC16CompleteSubspaceD2Ev(); +int APS5_VABI _ZN3JSC16InternalFunction23createSubclassStructureEPNS_14JSGlobalObjectEPNS_8JSObjectEPNS_9StructureE(); +int APS5_VABI _ZN3JSC16InternalFunction4nameEv(); +int APS5_VABI _ZN3JSC16IsoSubspacePerVMD1Ev(); +int APS5_VABI _ZN3JSC16IsoSubspacePerVMD2Ev(); +int APS5_VABI _ZN3JSC16SamplingProfiler17stackTracesAsJSONEv(); +int APS5_VABI _ZN3JSC16SamplingProfiler18reportTopBytecodesERN3WTF11PrintStreamE(); +int APS5_VABI _ZN3JSC16SamplingProfiler18reportTopBytecodesEv(); +int APS5_VABI _ZN3JSC16SamplingProfiler18reportTopFunctionsERN3WTF11PrintStreamE(); +int APS5_VABI _ZN3JSC16SamplingProfiler18reportTopFunctionsEv(); +int APS5_VABI _ZN3JSC16SamplingProfiler39noticeCurrentThreadAsJSCExecutionThreadEv(); +int APS5_VABI _ZN3JSC16SamplingProfiler5startEv(); +int APS5_VABI _ZN3JSC16SymbolTableEntry16freeFatEntrySlowEv(); +int APS5_VABI _ZN3JSC16createRangeErrorEPNS_14JSGlobalObjectERKN3WTF6StringE(); +int APS5_VABI _ZN3JSC16profiledEvaluateEPNS_14JSGlobalObjectENS_15ProfilingReasonERKNS_10SourceCodeENS_7JSValueERN3WTF8NakedPtrINS_9ExceptionEEE(); +int APS5_VABI _ZN3JSC16setNeverOptimizeEPK15OpaqueJSContextPK13OpaqueJSValue(); +int APS5_VABI _ZN3JSC16setNeverOptimizeEPNS_14JSGlobalObjectEPNS_9CallFrameE(); +int APS5_VABI _ZN3JSC16slowValidateCellEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZN3JSC16slowValidateCellEPNS_6JSCellE(); +int APS5_VABI _ZN3JSC16throwSyntaxErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeE(); +int APS5_VABI _ZN3JSC16throwSyntaxErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeERKN3WTF6StringE(); +int APS5_VABI _ZN3JSC17CommonIdentifiers18appendExternalNameERKNS_10IdentifierES3_(); +int APS5_VABI _ZN3JSC17DebuggerCallFrame10invalidateEv(); +int APS5_VABI _ZN3JSC17DebuggerCallFrame11callerFrameEv(); +int APS5_VABI _ZN3JSC17DebuggerCallFrame15currentPositionERNS_2VME(); +int APS5_VABI _ZN3JSC17DebuggerCallFrame20sourceIDForCallFrameEPNS_9CallFrameE(); +int APS5_VABI _ZN3JSC17DeferredWorkTimer10runRunLoopEv(); +int APS5_VABI _ZN3JSC17DeferredWorkTimer14addPendingWorkERNS_2VMEPNS_8JSObjectEON3WTF6VectorINS_6StrongINS_6JSCellELNS_30ShouldStrongDestructorGrabLockE0EEELm0ENS5_15CrashOnOverflowELm16ENS5_10FastMallocEEE(); +int APS5_VABI _ZN3JSC17DeferredWorkTimer16stopRunningTasksEv(); +int APS5_VABI _ZN3JSC17DeferredWorkTimer6createERNS_2VME(); +int APS5_VABI _ZN3JSC17DeferredWorkTimer6doWorkERNS_2VME(); +int APS5_VABI _ZN3JSC17DeferredWorkTimerC1ERNS_2VME(); +int APS5_VABI _ZN3JSC17DeferredWorkTimerC2ERNS_2VME(); +int APS5_VABI _ZN3JSC17DeferredWorkTimerD0Ev(); +int APS5_VABI _ZN3JSC17DeferredWorkTimerD1Ev(); +int APS5_VABI _ZN3JSC17DeferredWorkTimerD2Ev(); +int APS5_VABI _ZN3JSC17FuzzerPredictionsC1EPKc(); +int APS5_VABI _ZN3JSC17FuzzerPredictionsC2EPKc(); +int APS5_VABI _ZN3JSC17JSArrayBufferView14unsharedBufferEv(); +int APS5_VABI _ZN3JSC17JSArrayBufferView18possiblySharedImplEv(); +int APS5_VABI _ZN3JSC17JSArrayBufferView22slowDownAndWasteMemoryEv(); +int APS5_VABI _ZN3JSC17JSArrayBufferViewC1ERNS_2VMERNS0_19ConstructionContextE(); +int APS5_VABI _ZN3JSC17JSInternalPromise4thenEPNS_14JSGlobalObjectEPNS_10JSFunctionES4_(); +int APS5_VABI _ZN3JSC17JSInternalPromise6createERNS_2VMEPNS_9StructureE(); +int APS5_VABI _ZN3JSC17MarkingConstraint17quickWorkEstimateERNS_11SlotVisitorE(); +int APS5_VABI _ZN3JSC17MarkingConstraintC2EN3WTF7CStringES2_NS_20ConstraintVolatilityENS_21ConstraintConcurrencyENS_21ConstraintParallelismE(); +int APS5_VABI _ZN3JSC17MarkingConstraintD0Ev(); +int APS5_VABI _ZN3JSC17MarkingConstraintD1Ev(); +int APS5_VABI _ZN3JSC17MarkingConstraintD2Ev(); +int APS5_VABI _ZN3JSC17createSyntaxErrorEPNS_14JSGlobalObjectERKN3WTF6StringE(); +int APS5_VABI _ZN3JSC17hasIteratorMethodEPNS_14JSGlobalObjectENS_7JSValueE(); +int APS5_VABI _ZN3JSC17processConfigFileEPKcS1_S1_(); +int APS5_VABI _ZN3JSC17profiledConstructEPNS_14JSGlobalObjectENS_15ProfilingReasonENS_7JSValueERKNS_8CallDataERKNS_7ArgListES3_(); +int APS5_VABI _ZN3JSC18BytecodeCacheErroraSERKNS0_10WriteErrorE(); +int APS5_VABI _ZN3JSC18BytecodeCacheErroraSERKNS0_13StandardErrorE(); +int APS5_VABI _ZN3JSC18BytecodeCacheErroraSERKNS_11ParserErrorE(); +int APS5_VABI _ZN3JSC18ErrorHandlingScopeC1ERNS_2VME(); +int APS5_VABI _ZN3JSC18ErrorHandlingScopeC2ERNS_2VME(); +int APS5_VABI _ZN3JSC18ErrorHandlingScopeD1Ev(); +int APS5_VABI _ZN3JSC18ErrorHandlingScopeD2Ev(); +int APS5_VABI _ZN3JSC18GCActivityCallback10setEnabledEb(); +int APS5_VABI _ZN3JSC18GCActivityCallback11didAllocateERNS_4HeapEm(); +int APS5_VABI _ZN3JSC18GCActivityCallback11willCollectEv(); +int APS5_VABI _ZN3JSC18GCActivityCallback13scheduleTimerEN3WTF7SecondsE(); +int APS5_VABI _ZN3JSC18GCActivityCallback18tryCreateEdenTimerEPNS_4HeapE(); +int APS5_VABI _ZN3JSC18GCActivityCallback6cancelEv(); +int APS5_VABI _ZN3JSC18GCActivityCallback6doWorkERNS_2VME(); +int APS5_VABI _ZN3JSC18GCActivityCallbackC2EPNS_4HeapE(); +int APS5_VABI _ZN3JSC18GCActivityCallbackC2ERNS_2VME(); +int APS5_VABI _ZN3JSC18GCActivityCallbackD0Ev(); +int APS5_VABI _ZN3JSC18GCActivityCallbackD1Ev(); +int APS5_VABI _ZN3JSC18GCActivityCallbackD2Ev(); +int APS5_VABI _ZN3JSC18IncrementalSweeper13startSweepingERNS_4HeapE(); +int APS5_VABI _ZN3JSC18IncrementalSweeperC1EPNS_4HeapE(); +int APS5_VABI _ZN3JSC18IncrementalSweeperC2EPNS_4HeapE(); +int APS5_VABI _ZN3JSC18PropertyDescriptor11setWritableEb(); +int APS5_VABI _ZN3JSC18PropertyDescriptor12setUndefinedEv(); +int APS5_VABI _ZN3JSC18PropertyDescriptor13setDescriptorENS_7JSValueEj(); +int APS5_VABI _ZN3JSC18PropertyDescriptor13setEnumerableEb(); +int APS5_VABI _ZN3JSC18PropertyDescriptor15setConfigurableEb(); +int APS5_VABI _ZN3JSC18PropertyDescriptor21setAccessorDescriptorEPNS_12GetterSetterEj(); +int APS5_VABI _ZN3JSC18PropertyDescriptor9setGetterENS_7JSValueE(); +int APS5_VABI _ZN3JSC18PropertyDescriptor9setSetterENS_7JSValueE(); +int APS5_VABI _ZN3JSC19HeapSnapshotBuilder11analyzeNodeEPNS_6JSCellE(); +int APS5_VABI _ZN3JSC19HeapSnapshotBuilder13buildSnapshotEv(); +int APS5_VABI _ZN3JSC19HeapSnapshotBuilder15setLabelForCellEPNS_6JSCellERKN3WTF6StringE(); +int APS5_VABI _ZN3JSC19HeapSnapshotBuilder16analyzeIndexEdgeEPNS_6JSCellES2_j(); +int APS5_VABI _ZN3JSC19HeapSnapshotBuilder23analyzePropertyNameEdgeEPNS_6JSCellES2_PN3WTF17UniquedStringImplE(); +int APS5_VABI _ZN3JSC19HeapSnapshotBuilder23analyzeVariableNameEdgeEPNS_6JSCellES2_PN3WTF17UniquedStringImplE(); +int APS5_VABI _ZN3JSC19HeapSnapshotBuilder23getNextObjectIdentifierEv(); +int APS5_VABI _ZN3JSC19HeapSnapshotBuilder23setWrappedObjectForCellEPNS_6JSCellEPv(); +int APS5_VABI _ZN3JSC19HeapSnapshotBuilder30previousSnapshotHasNodeForCellEPNS_6JSCellERj(); +int APS5_VABI _ZN3JSC19HeapSnapshotBuilder34resetNextAvailableObjectIdentifierEv(); +int APS5_VABI _ZN3JSC19HeapSnapshotBuilder38setOpaqueRootReachabilityReasonForCellEPNS_6JSCellEPKc(); +int APS5_VABI _ZN3JSC19HeapSnapshotBuilder4jsonEN3WTF8FunctionIFbRKNS_16HeapSnapshotNodeEEEE(); +int APS5_VABI _ZN3JSC19HeapSnapshotBuilder4jsonEv(); +int APS5_VABI _ZN3JSC19HeapSnapshotBuilderC1ERNS_12HeapProfilerENS0_12SnapshotTypeE(); +int APS5_VABI _ZN3JSC19HeapSnapshotBuilderC2ERNS_12HeapProfilerENS0_12SnapshotTypeE(); +int APS5_VABI _ZN3JSC19HeapSnapshotBuilderD0Ev(); +int APS5_VABI _ZN3JSC19HeapSnapshotBuilderD1Ev(); +int APS5_VABI _ZN3JSC19HeapSnapshotBuilderD2Ev(); +int APS5_VABI _ZN3JSC19HeapSnapshotBuilderdaEPv(); +int APS5_VABI _ZN3JSC19HeapSnapshotBuilderdlEPv(); +int APS5_VABI _ZN3JSC19HeapSnapshotBuildernaEm(); +int APS5_VABI _ZN3JSC19HeapSnapshotBuildernaEmPv(); +int APS5_VABI _ZN3JSC19HeapSnapshotBuildernwEm10NotNullTagPv(); +int APS5_VABI _ZN3JSC19HeapSnapshotBuildernwEmPv(); +int APS5_VABI _ZN3JSC19HeapSnapshotBuildernwEm(); +int APS5_VABI _ZN3JSC19InlineWatchpointSet11inflateSlowEv(); +int APS5_VABI _ZN3JSC19InlineWatchpointSet7fireAllERNS_2VMEPKc(); +int APS5_VABI _ZN3JSC19InlineWatchpointSet7freeFatEv(); +int APS5_VABI _ZN3JSC19SourceProviderCache5clearEv(); +int APS5_VABI _ZN3JSC19SourceProviderCacheD1Ev(); +int APS5_VABI _ZN3JSC19SourceProviderCacheD2Ev(); +int APS5_VABI _ZN3JSC19iteratorForIterableEPNS_14JSGlobalObjectENS_7JSValueE(); +int APS5_VABI _ZN3JSC19iteratorForIterableEPNS_14JSGlobalObjectEPNS_8JSObjectENS_7JSValueE(); +int APS5_VABI _ZN3JSC19numberOfDFGCompilesENS_7JSValueE(); +int APS5_VABI _ZN3JSC19numberOfDFGCompilesEPK15OpaqueJSContextPK13OpaqueJSValue(); +int APS5_VABI _ZN3JSC19reifyStaticAccessorERNS_2VMERKNS_14HashTableValueERNS_8JSObjectENS_12PropertyNameE(); +int APS5_VABI _ZN3JSC20TypedArrayControllerD0Ev(); +int APS5_VABI _ZN3JSC20TypedArrayControllerD1Ev(); +int APS5_VABI _ZN3JSC20TypedArrayControllerD2Ev(); +int APS5_VABI _ZN3JSC20createReferenceErrorEPNS_14JSGlobalObjectERKN3WTF6StringE(); +int APS5_VABI _ZN3JSC20failNextNewCodeBlockEPK15OpaqueJSContext(); +int APS5_VABI _ZN3JSC20failNextNewCodeBlockEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZN3JSC21MarkedJSValueRefArrayC2EP15OpaqueJSContextj(); +int APS5_VABI _ZN3JSC21MarkedJSValueRefArrayD1Ev(); +int APS5_VABI _ZN3JSC21getInt8ArrayClassInfoEv(); +int APS5_VABI _ZN3JSC21linkAndEvaluateModuleEPNS_14JSGlobalObjectERKNS_10IdentifierENS_7JSValueE(); +int APS5_VABI _ZN3JSC21loadAndEvaluateModuleEPNS_14JSGlobalObjectEPNS_6SymbolENS_7JSValueES4_(); +int APS5_VABI _ZN3JSC21loadAndEvaluateModuleEPNS_14JSGlobalObjectERKN3WTF6StringENS_7JSValueES6_(); +int APS5_VABI _ZN3JSC21loadAndEvaluateModuleEPNS_14JSGlobalObjectERKNS_10SourceCodeENS_7JSValueE(); +int APS5_VABI _ZN3JSC21objectConstructorSealEPNS_14JSGlobalObjectEPNS_8JSObjectE(); +int APS5_VABI _ZN3JSC21throwOutOfMemoryErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeERKN3WTF6StringE(); +int APS5_VABI _ZN3JSC21throwOutOfMemoryErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeE(); +int APS5_VABI _ZN3JSC22ArrayAllocationProfile13updateProfileEv(); +int APS5_VABI _ZN3JSC22DeferredWatchpointFire21takeWatchpointsToFireEPNS_13WatchpointSetE(); +int APS5_VABI _ZN3JSC22EdenGCActivityCallback11gcTimeSliceEm(); +int APS5_VABI _ZN3JSC22EdenGCActivityCallback12lastGCLengthERNS_4HeapE(); +int APS5_VABI _ZN3JSC22EdenGCActivityCallback9deathRateERNS_4HeapE(); +int APS5_VABI _ZN3JSC22EdenGCActivityCallbackC1EPNS_4HeapE(); +int APS5_VABI _ZN3JSC22EdenGCActivityCallbackC2EPNS_4HeapE(); +int APS5_VABI _ZN3JSC22EdenGCActivityCallbackD0Ev(); +int APS5_VABI _ZN3JSC22EdenGCActivityCallbackD1Ev(); +int APS5_VABI _ZN3JSC22EdenGCActivityCallbackD2Ev(); +int APS5_VABI _ZN3JSC22FullGCActivityCallback11gcTimeSliceEm(); +int APS5_VABI _ZN3JSC22FullGCActivityCallback12doCollectionERNS_2VME(); +int APS5_VABI _ZN3JSC22FullGCActivityCallback12lastGCLengthERNS_4HeapE(); +int APS5_VABI _ZN3JSC22FullGCActivityCallback16setDidGCRecentlyEv(); +int APS5_VABI _ZN3JSC22FullGCActivityCallback9deathRateERNS_4HeapE(); +int APS5_VABI _ZN3JSC22FullGCActivityCallbackC1EPNS_4HeapE(); +int APS5_VABI _ZN3JSC22FullGCActivityCallbackC2EPNS_4HeapE(); +int APS5_VABI _ZN3JSC22FullGCActivityCallbackD1Ev(); +int APS5_VABI _ZN3JSC22FullGCActivityCallbackD2Ev(); +int APS5_VABI _ZN3JSC22JSFinalizationRegistry9liveCountERKN3WTF6LockerINS_10JSCellLockEEE(); +int APS5_VABI _ZN3JSC22createOutOfMemoryErrorEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZN3JSC22createOutOfMemoryErrorEPNS_14JSGlobalObjectERKN3WTF6StringE(); +int APS5_VABI _ZN3JSC22generateModuleBytecodeERNS_2VMERKNS_10SourceCodeEiRNS_18BytecodeCacheErrorE(); +int APS5_VABI _ZN3JSC22getInt16ArrayClassInfoEv(); +int APS5_VABI _ZN3JSC22getInt32ArrayClassInfoEv(); +int APS5_VABI _ZN3JSC22getUint8ArrayClassInfoEv(); +int APS5_VABI _ZN3JSC22globalMemoryStatisticsEv(); +int APS5_VABI _ZN3JSC22optimizeNextInvocationENS_7JSValueE(); +int APS5_VABI _ZN3JSC22optimizeNextInvocationEPNS_14JSGlobalObjectEPNS_9CallFrameE(); +int APS5_VABI _ZN3JSC23AbstractSamplingCounter4dumpEv(); +int APS5_VABI _ZN3JSC23JSModuleNamespaceObjectC1ERNS_2VMEPNS_9StructureE(); +int APS5_VABI _ZN3JSC23JSModuleNamespaceObjectC2ERNS_2VMEPNS_9StructureE(); +int APS5_VABI _ZN3JSC23MacroAssemblerX86Common18collectCPUFeaturesEv(); +int APS5_VABI _ZN3JSC23SimpleMarkingConstraintD0Ev(); +int APS5_VABI _ZN3JSC23SimpleMarkingConstraintD1Ev(); +int APS5_VABI _ZN3JSC23SimpleMarkingConstraintD2Ev(); +int APS5_VABI _ZN3JSC23VariableWriteFireDetail5touchERNS_2VMEPNS_13WatchpointSetEPNS_8JSObjectERKNS_12PropertyNameE(); +int APS5_VABI _ZN3JSC23encodeFunctionCodeBlockERNS_2VMEPKNS_25UnlinkedFunctionCodeBlockERNS_18BytecodeCacheErrorE(); +int APS5_VABI _ZN3JSC23generateProgramBytecodeERNS_2VMERKNS_10SourceCodeEiRNS_18BytecodeCacheErrorE(); +int APS5_VABI _ZN3JSC23getUint16ArrayClassInfoEv(); +int APS5_VABI _ZN3JSC23getUint32ArrayClassInfoEv(); +int APS5_VABI _ZN3JSC23objectConstructorFreezeEPNS_14JSGlobalObjectEPNS_8JSObjectE(); +int APS5_VABI _ZN3JSC23setUpStaticFunctionSlotERNS_2VMEPKNS_9ClassInfoEPKNS_14HashTableValueEPNS_8JSObjectENS_12PropertyNameERNS_12PropertySlotE(); +int APS5_VABI _ZN3JSC23throwStackOverflowErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeE(); +int APS5_VABI _ZN3JSC24createStackOverflowErrorEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZN3JSC24getCalculatedDisplayNameERNS_2VMEPNS_8JSObjectE(); +int APS5_VABI _ZN3JSC24getExecutableForFunctionENS_7JSValueE(); +int APS5_VABI _ZN3JSC24getFloat32ArrayClassInfoEv(); +int APS5_VABI _ZN3JSC24getFloat64ArrayClassInfoEv(); +int APS5_VABI _ZN3JSC24reportZappedCellAndCrashERNS_4HeapEPKNS_6JSCellE(); +int APS5_VABI _ZN3JSC25JSSegmentedVariableObject12addVariablesEjNS_7JSValueE(); +int APS5_VABI _ZN3JSC25JSSegmentedVariableObject17findVariableIndexEPv(); +int APS5_VABI _ZN3JSC25jsStringWithCacheSlowCaseERNS_2VMERN3WTF10StringImplE(); +int APS5_VABI _ZN3JSC26createIteratorResultObjectEPNS_14JSGlobalObjectENS_7JSValueEb(); +int APS5_VABI _ZN3JSC26evaluateWithScopeExtensionEPNS_14JSGlobalObjectERKNS_10SourceCodeEPNS_8JSObjectERN3WTF8NakedPtrINS_9ExceptionEEE(); +int APS5_VABI _ZN3JSC26setCannotUseOSRExitFuzzingEPNS_14JSGlobalObjectEPNS_9CallFrameE(); +int APS5_VABI _ZN3JSC28getHashMapBucketKeyClassInfoEv(); +int APS5_VABI _ZN3JSC29constructArrayNegativeIndexedEPNS_14JSGlobalObjectEPNS_9StructureEPKNS_7JSValueEj(); +int APS5_VABI _ZN3JSC29createNotEnoughArgumentsErrorEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZN3JSC29ensureGlobalFuzzerPredictionsEv(); +int APS5_VABI _ZN3JSC29getUint8ClampedArrayClassInfoEv(); +int APS5_VABI _ZN3JSC2VM10ClientDataD0Ev(); +int APS5_VABI _ZN3JSC2VM10ClientDataD2Ev(); +int APS5_VABI _ZN3JSC2VM13deleteAllCodeENS_19DeleteAllCodeEffortE(); +int APS5_VABI _ZN3JSC2VM14throwExceptionEPNS_14JSGlobalObjectENS_7JSValueE(); +int APS5_VABI _ZN3JSC2VM14throwExceptionEPNS_14JSGlobalObjectEPNS_8JSObjectE(); +int APS5_VABI _ZN3JSC2VM14throwExceptionEPNS_14JSGlobalObjectEPNS_9ExceptionE(); +int APS5_VABI _ZN3JSC2VM15canUseAssemblerEv(); +int APS5_VABI _ZN3JSC2VM15drainMicrotasksEv(); +int APS5_VABI _ZN3JSC2VM17addImpurePropertyEPN3WTF17UniquedStringImplE(); +int APS5_VABI _ZN3JSC2VM18ensureHeapProfilerEv(); +int APS5_VABI _ZN3JSC2VM19deleteAllLinkedCodeENS_19DeleteAllCodeEffortE(); +int APS5_VABI _ZN3JSC2VM20dumpTypeProfilerDataEv(); +int APS5_VABI _ZN3JSC2VM20sharedInstanceExistsEv(); +int APS5_VABI _ZN3JSC2VM21sentinelMapBucketSlowEv(); +int APS5_VABI _ZN3JSC2VM21sentinelSetBucketSlowEv(); +int APS5_VABI _ZN3JSC2VM6createENS_8HeapTypeEPN3WTF7RunLoopE(); +int APS5_VABI _ZN3JSC2VM8whenIdleEON3WTF8FunctionIFvvEEE(); +int APS5_VABI _ZN3JSC2VM9tryCreateENS_8HeapTypeEPN3WTF7RunLoopE(); +int APS5_VABI _ZN3JSC2VMD1Ev(); +int APS5_VABI _ZN3JSC2VMD2Ev(); +int APS5_VABI _ZN3JSC32JSDestructibleObjectHeapCellTypeC1Ev(); +int APS5_VABI _ZN3JSC32JSDestructibleObjectHeapCellTypeC2Ev(); +int APS5_VABI _ZN3JSC32JSDestructibleObjectHeapCellTypeD0Ev(); +int APS5_VABI _ZN3JSC32JSDestructibleObjectHeapCellTypeD1Ev(); +int APS5_VABI _ZN3JSC32JSDestructibleObjectHeapCellTypeD2Ev(); +int APS5_VABI _ZN3JSC32throwDOMAttributeGetterTypeErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeEPKNS_9ClassInfoENS_12PropertyNameE(); +int APS5_VABI _ZN3JSC33getHashMapBucketKeyValueClassInfoEv(); +int APS5_VABI _ZN3JSC35getSomeBaselineCodeBlockForFunctionENS_7JSValueE(); +int APS5_VABI _ZN3JSC3DFG18getNumCompilationsEv(); +int APS5_VABI _ZN3JSC41constructFunctionSkippingEvalEnabledCheckEPNS_14JSGlobalObjectERKNS_7ArgListERKNS_10IdentifierERKNS_12SourceOriginERKN3WTF6StringERKNSB_12TextPositionEiNS_24FunctionConstructionModeENS_7JSValueE(); +int APS5_VABI _ZN3JSC41constructObjectFromPropertyDescriptorSlowEPNS_14JSGlobalObjectERKNS_18PropertyDescriptorE(); +int APS5_VABI _ZN3JSC4Heap10collectNowENS_15SynchronousnessENS_9GCRequestE(); +int APS5_VABI _ZN3JSC4Heap11collectSyncENS_9GCRequestE(); +int APS5_VABI _ZN3JSC4Heap11objectCountEv(); +int APS5_VABI _ZN3JSC4Heap12addFinalizerEPNS_6JSCellEN3WTF8FunctionIFvS2_EEE(); +int APS5_VABI _ZN3JSC4Heap12addFinalizerEPNS_6JSCellEPFvS2_E(); +int APS5_VABI _ZN3JSC4Heap12collectAsyncENS_9GCRequestE(); +int APS5_VABI _ZN3JSC4Heap15extraMemorySizeEv(); +int APS5_VABI _ZN3JSC4Heap17acquireAccessSlowEv(); +int APS5_VABI _ZN3JSC4Heap17globalObjectCountEv(); +int APS5_VABI _ZN3JSC4Heap17releaseAccessSlowEv(); +int APS5_VABI _ZN3JSC4Heap18addToRememberedSetEPKNS_6JSCellE(); +int APS5_VABI _ZN3JSC4Heap18sweepSynchronouslyEv(); +int APS5_VABI _ZN3JSC4Heap19stopIfNecessarySlowEv(); +int APS5_VABI _ZN3JSC4Heap20fullActivityCallbackEv(); +int APS5_VABI _ZN3JSC4Heap20protectedObjectCountEv(); +int APS5_VABI _ZN3JSC4Heap20writeBarrierSlowPathEPKNS_6JSCellE(); +int APS5_VABI _ZN3JSC4Heap24reportExtraMemoryVisitedEm(); +int APS5_VABI _ZN3JSC4Heap26protectedGlobalObjectCountEv(); +int APS5_VABI _ZN3JSC4Heap26reportAbandonedObjectGraphEv(); +int APS5_VABI _ZN3JSC4Heap31collectNowFullIfNotDoneRecentlyENS_15SynchronousnessE(); +int APS5_VABI _ZN3JSC4Heap32setGarbageCollectionTimerEnabledEb(); +int APS5_VABI _ZN3JSC4Heap34reportExtraMemoryAllocatedSlowCaseEm(); +int APS5_VABI _ZN3JSC4Heap35deprecatedReportExtraMemorySlowCaseEm(); +int APS5_VABI _ZN3JSC4Heap39decrementDeferralDepthAndGCIfNeededSlowEv(); +int APS5_VABI _ZN3JSC4Heap4sizeEv(); +int APS5_VABI _ZN3JSC4Heap7collectENS_15SynchronousnessENS_9GCRequestE(); +int APS5_VABI _ZN3JSC4Heap7protectENS_7JSValueE(); +int APS5_VABI _ZN3JSC4Heap7sweeperEv(); +int APS5_VABI _ZN3JSC4Heap8capacityEv(); +int APS5_VABI _ZN3JSC4Heap9unprotectENS_7JSValueE(); +int APS5_VABI _ZN3JSC4Yarr12errorMessageENS0_9ErrorCodeE(); +int APS5_VABI _ZN3JSC4Yarr12errorToThrowEPNS_14JSGlobalObjectENS0_9ErrorCodeE(); +int APS5_VABI _ZN3JSC4Yarr17RegularExpressionC1ERKS1_(); +int APS5_VABI _ZN3JSC4Yarr17RegularExpressionC2ERKS1_(); +int APS5_VABI _ZN3JSC4Yarr17RegularExpressionD1Ev(); +int APS5_VABI _ZN3JSC4Yarr17RegularExpressionD2Ev(); +int APS5_VABI _ZN3JSC4Yarr17RegularExpressionaSERKS1_(); +int APS5_VABI _ZN3JSC4Yarr17RegularExpressiondaEPv(); +int APS5_VABI _ZN3JSC4Yarr17RegularExpressiondlEPv(); +int APS5_VABI _ZN3JSC4Yarr17RegularExpressionnaEm(); +int APS5_VABI _ZN3JSC4Yarr17RegularExpressionnaEmPv(); +int APS5_VABI _ZN3JSC4Yarr17RegularExpressionnwEm10NotNullTagPv(); +int APS5_VABI _ZN3JSC4Yarr17RegularExpressionnwEm(); +int APS5_VABI _ZN3JSC4Yarr17RegularExpressionnwEmPv(); +int APS5_VABI _ZN3JSC4callEPNS_14JSGlobalObjectENS_7JSValueERKNS_8CallDataES2_RKNS_7ArgListE(); +int APS5_VABI _ZN3JSC6Config25disableFreezingForTestingEv(); +int APS5_VABI _ZN3JSC6JSCell14deletePropertyEPS0_PNS_14JSGlobalObjectENS_12PropertyNameE(); +int APS5_VABI _ZN3JSC6JSCell9getObjectEv(); +int APS5_VABI _ZN3JSC6JSLock12DropAllLocksC1EPNS_14JSGlobalObjectE(); +int APS5_VABI _ZN3JSC6JSLock12DropAllLocksC1EPNS_2VME(); +int APS5_VABI _ZN3JSC6JSLock12DropAllLocksC1ERNS_2VME(); +int APS5_VABI _ZN3JSC6JSLock12DropAllLocksC2EPNS_2VME(); +int APS5_VABI _ZN3JSC6JSLock12DropAllLocksD1Ev(); +int APS5_VABI _ZN3JSC6JSLock12DropAllLocksD2Ev(); +int APS5_VABI _ZN3JSC6JSLock4lockEv(); +int APS5_VABI _ZN3JSC6JSLock6unlockEv(); +int APS5_VABI _ZN3JSC6JSLockD1Ev(); +int APS5_VABI _ZN3JSC6JSLockD2Ev(); +int APS5_VABI _ZN3JSC6RegExp5matchEPNS_14JSGlobalObjectERKN3WTF6StringEj(); +int APS5_VABI _ZN3JSC6RegExp5matchEPNS_14JSGlobalObjectERKN3WTF6StringEjRNS3_6VectorIiLm0ENS3_15CrashOnOverflowELm16ENS3_10FastMallocEEE(); +int APS5_VABI _ZN3JSC6RegExp6createERNS_2VMERKN3WTF6StringENS3_9OptionSetINS_4Yarr5FlagsEEE(); +int APS5_VABI _ZN3JSC6Symbol6createERNS_2VMERN3WTF10SymbolImplE(); +int APS5_VABI _ZN3JSC7JSArray15copyToArgumentsEPNS_14JSGlobalObjectEPNS_7JSValueEjj(); +int APS5_VABI _ZN3JSC7JSArray26shiftCountWithArrayStorageERNS_2VMEjjPNS_12ArrayStorageE(); +int APS5_VABI _ZN3JSC7JSArray32tryCreateUninitializedRestrictedERNS_25ObjectInitializationScopeEPNS_17GCDeferralContextEPNS_9StructureEj(); +int APS5_VABI _ZN3JSC7JSArray38isIteratorProtocolFastAndNonObservableEv(); +int APS5_VABI _ZN3JSC7JSArray3popEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZN3JSC7JSArray4pushEPNS_14JSGlobalObjectENS_7JSValueE(); +int APS5_VABI _ZN3JSC7JSArray9setLengthEPNS_14JSGlobalObjectEjb(); +int APS5_VABI _ZN3JSC7JSValue14putToPrimitiveEPNS_14JSGlobalObjectENS_12PropertyNameES0_RNS_15PutPropertySlotE(); +int APS5_VABI _ZN3JSC7JSValue21putToPrimitiveByIndexEPNS_14JSGlobalObjectEjS0_b(); +int APS5_VABI _ZN3JSC7Options10initializeEv(); +int APS5_VABI _ZN3JSC7Options10setOptionsEPKc(); +int APS5_VABI _ZN3JSC7Options21dumpAllOptionsInALineERN3WTF13StringBuilderE(); +int APS5_VABI _ZN3JSC7WeakSet13findAllocatorENS_13CellContainerE(); +int APS5_VABI _ZN3JSC8Bindings10RootObjectD0Ev(); +int APS5_VABI _ZN3JSC8Bindings10RootObjectD1Ev(); +int APS5_VABI _ZN3JSC8Bindings10RootObjectD2Ev(); +int APS5_VABI _ZN3JSC8Bindings13RuntimeObject10invalidateEv(); +int APS5_VABI _ZN3JSC8Bindings13RuntimeObject14finishCreationERNS_2VME(); +int APS5_VABI _ZN3JSC8Bindings13RuntimeObject15createPrototypeERNS_2VMERNS_14JSGlobalObjectE(); +int APS5_VABI _ZN3JSC8Bindings13RuntimeObject15createStructureERNS_2VMEPNS_14JSGlobalObjectENS_7JSValueE(); +int APS5_VABI _ZN3JSC8Bindings13RuntimeObject15subspaceForImplERNS_2VME(); +int APS5_VABI _ZN3JSC8Bindings13RuntimeObject4infoEv(); +int APS5_VABI _ZN3JSC8Bindings13RuntimeObjectC1ERKS1_(); +int APS5_VABI _ZN3JSC8Bindings13RuntimeObjectC2ERKS1_(); +int APS5_VABI _ZN3JSC8Bindings13RuntimeObjectD1Ev(); +int APS5_VABI _ZN3JSC8Bindings13RuntimeObjectD2Ev(); +int APS5_VABI _ZN3JSC8Bindings13RuntimeObjectaSERKS1_(); +int APS5_VABI _ZN3JSC8Bindings8Instance16newRuntimeObjectEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZN3JSC8Bindings8Instance19createRuntimeObjectEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZN3JSC8Bindings8InstanceD0Ev(); +int APS5_VABI _ZN3JSC8Bindings8InstanceD1Ev(); +int APS5_VABI _ZN3JSC8Bindings8InstanceD2Ev(); +int APS5_VABI _ZN3JSC8Debugger10isAttachedEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZN3JSC8Debugger11handlePauseEPNS_14JSGlobalObjectENS0_14ReasonForPauseE(); +int APS5_VABI _ZN3JSC8Debugger23recompileAllJSFunctionsEv(); +int APS5_VABI _ZN3JSC8Debugger23setBreakpointsActivatedEb(); +int APS5_VABI _ZN3JSC8Debugger24currentDebuggerCallFrameEv(); +int APS5_VABI _ZN3JSC8Debugger6attachEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZN3JSC8Debugger6detachEPNS_14JSGlobalObjectENS0_15ReasonForDetachE(); +int APS5_VABI _ZN3JSC8DebuggerC2ERNS_2VME(); +int APS5_VABI _ZN3JSC8DebuggerD0Ev(); +int APS5_VABI _ZN3JSC8DebuggerD1Ev(); +int APS5_VABI _ZN3JSC8DebuggerD2Ev(); +int APS5_VABI _ZN3JSC8JSBigInt10createFromEPNS_14JSGlobalObjectEi(); +int APS5_VABI _ZN3JSC8JSBigInt10createZeroEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZN3JSC8JSBigInt12tryRightTrimERNS_2VME(); +int APS5_VABI _ZN3JSC8JSBigInt13equalsToInt32Ei(); +int APS5_VABI _ZN3JSC8JSBigInt13tryCreateZeroERNS_2VME(); +int APS5_VABI _ZN3JSC8JSBigInt16createWithLengthEPNS_14JSGlobalObjectEj(); +int APS5_VABI _ZN3JSC8JSBigInt19tryCreateWithLengthERNS_2VMEj(); +int APS5_VABI _ZN3JSC8JSBigInt6equalsEPS0_S1_(); +int APS5_VABI _ZN3JSC8JSBigInt9rightTrimEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZN3JSC8JSCalleeC1ERNS_2VMEPNS_14JSGlobalObjectEPNS_9StructureE(); +int APS5_VABI _ZN3JSC8JSCalleeC2ERNS_2VMEPNS_14JSGlobalObjectEPNS_9StructureE(); +int APS5_VABI _ZN3JSC8JSObject11hasInstanceEPNS_14JSGlobalObjectENS_7JSValueE(); +int APS5_VABI _ZN3JSC8JSObject11hasInstanceEPNS_14JSGlobalObjectENS_7JSValueES3_(); +int APS5_VABI _ZN3JSC8JSObject13putInlineSlowEPNS_14JSGlobalObjectENS_12PropertyNameENS_7JSValueERNS_15PutPropertySlotE(); +int APS5_VABI _ZN3JSC8JSObject18setPrototypeDirectERNS_2VMENS_7JSValueE(); +int APS5_VABI _ZN3JSC8JSObject19calculatedClassNameEPS0_(); +int APS5_VABI _ZN3JSC8JSObject19convertToDictionaryERNS_2VME(); +int APS5_VABI _ZN3JSC8JSObject19putDirectMayBeIndexEPNS_14JSGlobalObjectENS_12PropertyNameENS_7JSValueE(); +int APS5_VABI _ZN3JSC8JSObject22ensureArrayStorageSlowERNS_2VME(); +int APS5_VABI _ZN3JSC8JSObject22fillGetterPropertySlotERNS_2VMERNS_12PropertySlotEPNS_6JSCellEji(); +int APS5_VABI _ZN3JSC8JSObject23putDirectCustomAccessorERNS_2VMENS_12PropertyNameENS_7JSValueEj(); +int APS5_VABI _ZN3JSC8JSObject24getOwnPropertyDescriptorEPNS_14JSGlobalObjectENS_12PropertyNameERNS_18PropertyDescriptorE(); +int APS5_VABI _ZN3JSC8JSObject24getOwnStaticPropertySlotERNS_2VMENS_12PropertyNameERNS_12PropertySlotE(); +int APS5_VABI _ZN3JSC8JSObject24putDirectBuiltinFunctionERNS_2VMEPNS_14JSGlobalObjectERKNS_12PropertyNameEPNS_18FunctionExecutableEj(); +int APS5_VABI _ZN3JSC8JSObject26setPrototypeWithCycleCheckERNS_2VMEPNS_14JSGlobalObjectENS_7JSValueEb(); +int APS5_VABI _ZN3JSC8JSObject28allocateMoreOutOfLineStorageERNS_2VMEmm(); +int APS5_VABI _ZN3JSC8JSObject30convertToUncacheableDictionaryERNS_2VME(); +int APS5_VABI _ZN3JSC8JSObject38putDirectIndexSlowOrBeyondVectorLengthEPNS_14JSGlobalObjectEjNS_7JSValueEjNS_18PutDirectIndexModeE(); +int APS5_VABI _ZN3JSC8JSObject48convertDoubleToContiguousWhilePerformingSetIndexERNS_2VMEjNS_7JSValueE(); +int APS5_VABI _ZN3JSC8JSObject4sealERNS_2VME(); +int APS5_VABI _ZN3JSC8JSObject55convertInt32ToDoubleOrContiguousWhilePerformingSetIndexERNS_2VMEjNS_7JSValueE(); +int APS5_VABI _ZN3JSC8JSObject6freezeERNS_2VME(); +int APS5_VABI _ZN3JSC8JSObject9getMethodEPNS_14JSGlobalObjectERNS_8CallDataERKNS_10IdentifierERKN3WTF6StringE(); +int APS5_VABI _ZN3JSC8Profiler8Database8logEventEPNS_9CodeBlockEPKcRKN3WTF7CStringE(); +int APS5_VABI _ZN3JSC8Profiler8DatabaseC1ERNS_2VME(); +int APS5_VABI _ZN3JSC8Profiler8DatabaseC2ERNS_2VME(); +int APS5_VABI _ZN3JSC8Profiler8DatabaseD1Ev(); +int APS5_VABI _ZN3JSC8Profiler8DatabaseD2Ev(); +int APS5_VABI _ZN3JSC8Subspace33parallelNotEmptyMarkedBlockSourceEv(); +int APS5_VABI _ZN3JSC8SubspaceD0Ev(); +int APS5_VABI _ZN3JSC8SubspaceD1Ev(); +int APS5_VABI _ZN3JSC8SubspaceD2Ev(); +int APS5_VABI _ZN3JSC9CallFrame13describeFrameEv(); +int APS5_VABI _ZN3JSC9CallFrame18callerSourceOriginERNS_2VME(); +int APS5_VABI _ZN3JSC9CodeBlock19baselineAlternativeEv(); +int APS5_VABI _ZN3JSC9CodeBlockD1Ev(); +int APS5_VABI _ZN3JSC9CodeBlockD2Ev(); +int APS5_VABI _ZN3JSC9Exception6createERNS_2VMENS_7JSValueENS0_18StackCaptureActionE(); +int APS5_VABI _ZN3JSC9HandleSet4growEv(); +int APS5_VABI _ZN3JSC9Integrity6Random29reloadAndCheckShouldAuditSlowERNS_2VME(); +int APS5_VABI _ZN3JSC9JSPromise15rejectAsHandledEPNS_14JSGlobalObjectENS_7JSValueE(); +int APS5_VABI _ZN3JSC9JSPromise15rejectAsHandledEPNS_14JSGlobalObjectEPNS_9ExceptionE(); +int APS5_VABI _ZN3JSC9JSPromise15resolvedPromiseEPNS_14JSGlobalObjectENS_7JSValueE(); +int APS5_VABI _ZN3JSC9JSPromise6createERNS_2VMEPNS_9StructureE(); +int APS5_VABI _ZN3JSC9JSPromise6rejectEPNS_14JSGlobalObjectENS_7JSValueE(); +int APS5_VABI _ZN3JSC9JSPromise6rejectEPNS_14JSGlobalObjectEPNS_9ExceptionE(); +int APS5_VABI _ZN3JSC9JSPromise7resolveEPNS_14JSGlobalObjectENS_7JSValueE(); +int APS5_VABI _ZN3JSC9Structure16allocateRareDataERNS_2VME(); +int APS5_VABI _ZN3JSC9Structure16isValidPrototypeENS_7JSValueE(); +int APS5_VABI _ZN3JSC9Structure21addPropertyTransitionERNS_2VMEPS0_NS_12PropertyNameEjRi(); +int APS5_VABI _ZN3JSC9Structure24addNewPropertyTransitionERNS_2VMEPS0_NS_12PropertyNameEjRiNS_15PutPropertySlot7ContextEPNS_41DeferredStructureTransitionWatchpointFireE(); +int APS5_VABI _ZN3JSC9Structure24materializePropertyTableERNS_2VMEb(); +int APS5_VABI _ZN3JSC9Structure25attributeChangeTransitionERNS_2VMEPS0_NS_12PropertyNameEjPNS_41DeferredStructureTransitionWatchpointFireE(); +int APS5_VABI _ZN3JSC9Structure31toCacheableDictionaryTransitionERNS_2VMEPS0_PNS_41DeferredStructureTransitionWatchpointFireE(); +int APS5_VABI _ZN3JSC9Structure8isFrozenERNS_2VME(); +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 _ZN3PAL12CryptoDigest11computeHashEv(); +int APS5_VABI _ZN3PAL12CryptoDigest8addBytesEPKvm(); +int APS5_VABI _ZN3PAL12CryptoDigestD1Ev(); +int APS5_VABI _ZN3PAL12CryptoDigestD2Ev(); +int APS5_VABI _ZN3PAL13SleepDisablerD0Ev(); +int APS5_VABI _ZN3PAL13SleepDisablerD1Ev(); +int APS5_VABI _ZN3PAL13SleepDisablerD2Ev(); +int APS5_VABI _ZN3PAL19fileSizeDescriptionEm(); +int APS5_VABI _ZN3PAL8KillRing16setToYankedStateEv(); +int APS5_VABI _ZN3PAL8KillRing16startNewSequenceEv(); +int APS5_VABI _ZN3PAL8KillRing4yankEv(); +int APS5_VABI _ZN3PAL8KillRing6appendERKN3WTF6StringE(); +int APS5_VABI _ZN3PAL8KillRing7prependERKN3WTF6StringE(); +int APS5_VABI _ZN3PAL9SessionID26enableGenerationProtectionEv(); +int APS5_VABI _ZN3PAL9SessionID26generateEphemeralSessionIDEv(); +int APS5_VABI _ZN3PAL9SessionID27generatePersistentSessionIDEv(); +int APS5_VABI _ZN3WTF10AtomString16fromUTF8InternalEPKcS2_(); +int APS5_VABI _ZN3WTF10AtomString6numberEd(); +int APS5_VABI _ZN3WTF10AtomString6numberEf(); +int APS5_VABI _ZN3WTF10AtomString6numberEi(); +int APS5_VABI _ZN3WTF10AtomString6numberEj(); +int APS5_VABI _ZN3WTF10AtomString6numberEm(); +int APS5_VABI _ZN3WTF10AtomString6numberEy(); +int APS5_VABI _ZN3WTF10ParkingLot11forEachImplERKNS_12ScopedLambdaIFvRNS_6ThreadEPKvEEE(); +int APS5_VABI _ZN3WTF10ParkingLot11unparkCountEPKvj(); +int APS5_VABI _ZN3WTF10ParkingLot13unparkOneImplEPKvRKNS_12ScopedLambdaIFlNS0_12UnparkResultEEEE(); +int APS5_VABI _ZN3WTF10ParkingLot21parkConditionallyImplEPKvRKNS_12ScopedLambdaIFbvEEERKNS3_IFvvEEERKNS_24TimeWithDynamicClockTypeE(); +int APS5_VABI _ZN3WTF10ParkingLot9unparkAllEPKv(); +int APS5_VABI _ZN3WTF10ParkingLot9unparkOneEPKv(); +int APS5_VABI _ZN3WTF10StringImpl17utf8ForCharactersEPKDsjNS_14ConversionModeE(); +int APS5_VABI _ZN3WTF10StringImpl17utf8ForCharactersEPKhj(); +int APS5_VABI _ZN3WTF10StringImpl28convertToLowercaseWithLocaleERKNS_10AtomStringE(); +int APS5_VABI _ZN3WTF10StringImpl28convertToUppercaseWithLocaleERKNS_10AtomStringE(); +int APS5_VABI _ZN3WTF10StringImpl31convertToLowercaseWithoutLocaleEv(); +int APS5_VABI _ZN3WTF10StringImpl31convertToUppercaseWithoutLocaleEv(); +int APS5_VABI _ZN3WTF10StringImpl57convertToLowercaseWithoutLocaleStartingAtFailingIndex8BitEj(); +int APS5_VABI _ZN3WTF10StringImpl5adoptEONS_12StringBufferIDsEE(); +int APS5_VABI _ZN3WTF10StringImpl5adoptEONS_12StringBufferIhEE(); +int APS5_VABI _ZN3WTF10StringImpl7destroyEPS0_(); +int APS5_VABI _ZN3WTF10StringImpl7replaceEDsDs(); +int APS5_VABI _ZN3WTF10StringImpl7replaceEDsPKhj(); +int APS5_VABI _ZN3WTF10StringView11SplitResult8Iterator17findNextSubstringEv(); +int APS5_VABI _ZN3WTF10StringView11SplitResult8IteratorppEv(); +int APS5_VABI _ZN3WTF10StringView16GraphemeClusters8IteratorC1EOS2_(); +int APS5_VABI _ZN3WTF10StringView16GraphemeClusters8IteratorC2EOS2_(); +int APS5_VABI _ZN3WTF10StringView16GraphemeClusters8IteratorD1Ev(); +int APS5_VABI _ZN3WTF10StringView16GraphemeClusters8IteratorD2Ev(); +int APS5_VABI _ZN3WTF10StringView16GraphemeClusters8IteratorppEv(); +int APS5_VABI _ZN3WTF10SymbolImpl16createNullSymbolEv(); +int APS5_VABI _ZN3WTF10SymbolImpl17nextHashForSymbolEv(); +int APS5_VABI _ZN3WTF10SymbolImpl6createERNS_10StringImplE(); +int APS5_VABI _ZN3WTF10TextStream10startGroupEv(); +int APS5_VABI _ZN3WTF10TextStream11writeIndentEv(); +int APS5_VABI _ZN3WTF10TextStream7releaseEv(); +int APS5_VABI _ZN3WTF10TextStream8endGroupEv(); +int APS5_VABI _ZN3WTF10TextStream8nextLineEv(); +int APS5_VABI _ZN3WTF10TextStreamlsEPKc(); +int APS5_VABI _ZN3WTF10TextStreamlsEPKv(); +int APS5_VABI _ZN3WTF10TextStreamlsERKNS_6StringE(); +int APS5_VABI _ZN3WTF10TextStreamlsEb(); +int APS5_VABI _ZN3WTF10TextStreamlsEc(); +int APS5_VABI _ZN3WTF10TextStreamlsEd(); +int APS5_VABI _ZN3WTF10TextStreamlsEf(); +int APS5_VABI _ZN3WTF10TextStreamlsEi(); +int APS5_VABI _ZN3WTF10TextStreamlsEj(); +int APS5_VABI _ZN3WTF10TextStreamlsEl(); +int APS5_VABI _ZN3WTF10TextStreamlsEm(); +int APS5_VABI _ZN3WTF10TextStreamlsEx(); +int APS5_VABI _ZN3WTF10TextStreamlsEy(); +int APS5_VABI _ZN3WTF10URLHelpers14userVisibleURLERKNS_7CStringE(); +int APS5_VABI _ZN3WTF10WorkerPool8postTaskEONS_8FunctionIFvvEEE(); +int APS5_VABI _ZN3WTF10WorkerPoolC1ENS_12ASCIILiteralEjNS_7SecondsE(); +int APS5_VABI _ZN3WTF10WorkerPoolC2ENS_12ASCIILiteralEjNS_7SecondsE(); +int APS5_VABI _ZN3WTF10WorkerPoolD1Ev(); +int APS5_VABI _ZN3WTF10WorkerPoolD2Ev(); +int APS5_VABI _ZN3WTF10initializeEv(); +int APS5_VABI _ZN3WTF11LogArgumentIPKvE8toStringES2_(); +int APS5_VABI _ZN3WTF11OSAllocator18releaseDecommittedEPvm(); +int APS5_VABI _ZN3WTF11OSAllocator23hintMemoryNotNeededSoonEPvm(); +int APS5_VABI _ZN3WTF11OSAllocator6commitEPvmbb(); +int APS5_VABI _ZN3WTF11OSAllocator8decommitEPvm(); +int APS5_VABI _ZN3WTF11Persistence5CoderINS_10AtomStringEE6encodeERNS0_7EncoderERKS2_(); +int APS5_VABI _ZN3WTF11Persistence5CoderINS_6StringEE6encodeERNS0_7EncoderERKS2_(); +int APS5_VABI _ZN3WTF11Persistence5CoderINS_7CStringEE6encodeERNS0_7EncoderERKS2_(); +int APS5_VABI _ZN3WTF11Persistence7Decoder14verifyChecksumEv(); +int APS5_VABI _ZN3WTF11Persistence7DecoderD1Ev(); +int APS5_VABI _ZN3WTF11Persistence7DecoderD2Ev(); +int APS5_VABI _ZN3WTF11Persistence7Encoder14encodeChecksumEv(); +int APS5_VABI _ZN3WTF11Persistence7EncoderC1Ev(); +int APS5_VABI _ZN3WTF11Persistence7EncoderC2Ev(); +int APS5_VABI _ZN3WTF11Persistence7EncoderD1Ev(); +int APS5_VABI _ZN3WTF11Persistence7EncoderD2Ev(); +int APS5_VABI _ZN3WTF11Persistence7EncoderlsEb(); +int APS5_VABI _ZN3WTF11Persistence7EncoderlsEd(); +int APS5_VABI _ZN3WTF11Persistence7EncoderlsEf(); +int APS5_VABI _ZN3WTF11Persistence7EncoderlsEh(); +int APS5_VABI _ZN3WTF11Persistence7EncoderlsEi(); +int APS5_VABI _ZN3WTF11Persistence7EncoderlsEj(); +int APS5_VABI _ZN3WTF11Persistence7EncoderlsEl(); +int APS5_VABI _ZN3WTF11Persistence7EncoderlsEm(); +int APS5_VABI _ZN3WTF11Persistence7EncoderlsEs(); +int APS5_VABI _ZN3WTF11Persistence7EncoderlsEt(); +int APS5_VABI _ZN3WTF11PrintStream20printfVariableFormatEPKcz(); +int APS5_VABI _ZN3WTF11PrintStream3endEv(); +int APS5_VABI _ZN3WTF11PrintStream5beginEv(); +int APS5_VABI _ZN3WTF11PrintStream6printfEPKcz(); +int APS5_VABI _ZN3WTF11StackBounds32currentThreadStackBoundsInternalEv(); +int APS5_VABI _ZN3WTF11ThreadGroup3addERKNS_14AbstractLockerERNS_6ThreadE(); +int APS5_VABI _ZN3WTF11ThreadGroup3addERNS_6ThreadE(); +int APS5_VABI _ZN3WTF11ThreadGroupD2Ev(); +int APS5_VABI _ZN3WTF11TimingScope11scopeDidEndEv(); +int APS5_VABI _ZN3WTF11portAllowedERKNS_3URLE(); +int APS5_VABI _ZN3WTF11setDataFileEPKc(); +int APS5_VABI _ZN3WTF11setNonBlockEi(); +int APS5_VABI _ZN3WTF12CountingLock10unlockSlowEv(); +int APS5_VABI _ZN3WTF12CountingLock8lockSlowEv(); +int APS5_VABI _ZN3WTF12isMainThreadEv(); +int APS5_VABI _ZN3WTF13FastBitVector10clearRangeEmm(); +int APS5_VABI _ZN3WTF13MetaAllocator17addFreshFreeSpaceEPvm(); +int APS5_VABI _ZN3WTF13MetaAllocator17currentStatisticsERKNS_6LockerINS_4LockEEE(); +int APS5_VABI _ZN3WTF13MetaAllocator17freeFreeSpaceNodeEPNS0_13FreeSpaceNodeE(); +int APS5_VABI _ZN3WTF13MetaAllocator18debugFreeSpaceSizeEv(); +int APS5_VABI _ZN3WTF13MetaAllocator19isInAllocatedMemoryERKNS_14AbstractLockerEPv(); +int APS5_VABI _ZN3WTF13MetaAllocator7releaseERKNS_6LockerINS_4LockEEERNS_19MetaAllocatorHandleE(); +int APS5_VABI _ZN3WTF13MetaAllocator8allocateERKNS_6LockerINS_4LockEEEm(); +int APS5_VABI _ZN3WTF13MetaAllocatorC2ERNS_4LockEmm(); +int APS5_VABI _ZN3WTF13MetaAllocatorD0Ev(); +int APS5_VABI _ZN3WTF13MetaAllocatorD2Ev(); +int APS5_VABI _ZN3WTF13ReadWriteLock10readUnlockEv(); +int APS5_VABI _ZN3WTF13ReadWriteLock11writeUnlockEv(); +int APS5_VABI _ZN3WTF13ReadWriteLock8readLockEv(); +int APS5_VABI _ZN3WTF13ReadWriteLock9writeLockEv(); +int APS5_VABI _ZN3WTF13StringBuilder11shrinkToFitEv(); +int APS5_VABI _ZN3WTF13StringBuilder15reserveCapacityEj(); +int APS5_VABI _ZN3WTF13StringBuilder16appendCharactersEPKDsj(); +int APS5_VABI _ZN3WTF13StringBuilder16appendCharactersEPKhj(); +int APS5_VABI _ZN3WTF13StringBuilder22appendQuotedJSONStringERKNS_6StringE(); +int APS5_VABI _ZN3WTF13aboutBlankURLEv(); +int APS5_VABI _ZN3WTF13dumpCharacterERNS_11PrintStreamEc(); +int APS5_VABI _ZN3WTF13isMainRunLoopEv(); +int APS5_VABI _ZN3WTF13normalizedNFCENS_10StringViewE(); +int APS5_VABI _ZN3WTF13normalizedNFCERKNS_6StringE(); +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEN3JSC14TypedArrayModeE(); +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamENS_10RawPointerE(); +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamENS_9ClockTypeE(); +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEPKNS_10StringImplE(); +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEPKc(); +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEPN3JSC9CodeBlockE(); +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamERKNS_6StringE(); +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamERKNS_7CStringE(); +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEa(); +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEb(); +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEd(); +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEf(); +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEh(); +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEi(); +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEj(); +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEl(); +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEm(); +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEs(); +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEt(); +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEx(); +int APS5_VABI _ZN3WTF13printInternalERNS_11PrintStreamEy(); +int APS5_VABI _ZN3WTF14AtomStringImpl10addLiteralEPKcj(); +int APS5_VABI _ZN3WTF14AtomStringImpl11addSlowCaseERNS_10StringImplE(); +int APS5_VABI _ZN3WTF14AtomStringImpl11addSlowCaseERNS_15AtomStringTableERNS_10StringImplE(); +int APS5_VABI _ZN3WTF14AtomStringImpl14lookUpSlowCaseERNS_10StringImplE(); +int APS5_VABI _ZN3WTF14AtomStringImpl3addEPKDsj(); +int APS5_VABI _ZN3WTF14AtomStringImpl3addEPKNS_10StringImpl16StaticStringImplE(); +int APS5_VABI _ZN3WTF14AtomStringImpl3addEPKhj(); +int APS5_VABI _ZN3WTF14AtomStringImpl3addEPNS_10StringImplEjj(); +int APS5_VABI _ZN3WTF14AtomStringImpl6lookUpEPKDsj(); +int APS5_VABI _ZN3WTF14AtomStringImpl6lookUpEPKhj(); +int APS5_VABI _ZN3WTF14FileSystemImpl10deleteFileERKNS_6StringE(); +int APS5_VABI _ZN3WTF14FileSystemImpl10fileExistsERKNS_6StringE(); +int APS5_VABI _ZN3WTF14FileSystemImpl12truncateFileEix(); +int APS5_VABI _ZN3WTF14FileSystemImpl14MappedFileData13mapFileHandleEiNS0_12FileOpenModeENS0_14MappedFileModeE(); +int APS5_VABI _ZN3WTF14FileSystemImpl14MappedFileDataC1ERKNS_6StringENS0_14MappedFileModeERb(); +int APS5_VABI _ZN3WTF14FileSystemImpl14MappedFileDataC1EiNS0_12FileOpenModeENS0_14MappedFileModeERb(); +int APS5_VABI _ZN3WTF14FileSystemImpl14MappedFileDataC1EiNS0_14MappedFileModeERb(); +int APS5_VABI _ZN3WTF14FileSystemImpl14MappedFileDataC2ERKNS_6StringENS0_14MappedFileModeERb(); +int APS5_VABI _ZN3WTF14FileSystemImpl14MappedFileDataD1Ev(); +int APS5_VABI _ZN3WTF14FileSystemImpl14MappedFileDataD2Ev(); +int APS5_VABI _ZN3WTF14FileSystemImpl14setMetadataURLERKNS_6StringES3_S3_(); +int APS5_VABI _ZN3WTF14FileSystemImpl17encodeForFileNameERKNS_6StringE(); +int APS5_VABI _ZN3WTF14FileSystemImpl18createSymbolicLinkERKNS_6StringES3_(); +int APS5_VABI _ZN3WTF14FileSystemImpl18decodeFromFilenameERKNS_6StringE(); +int APS5_VABI _ZN3WTF14FileSystemImpl18hardLinkOrCopyFileERKNS_6StringES3_(); +int APS5_VABI _ZN3WTF14FileSystemImpl18makeAllDirectoriesERKNS_6StringE(); +int APS5_VABI _ZN3WTF14FileSystemImpl18unlockAndCloseFileEi(); +int APS5_VABI _ZN3WTF14FileSystemImpl19filesHaveSameVolumeERKNS_6StringES3_(); +int APS5_VABI _ZN3WTF14FileSystemImpl20deleteEmptyDirectoryERKNS_6StringE(); +int APS5_VABI _ZN3WTF14FileSystemImpl24fileSystemRepresentationERKNS_6StringE(); +int APS5_VABI _ZN3WTF14FileSystemImpl25createTemporaryZipArchiveERKNS_6StringE(); +int APS5_VABI _ZN3WTF14FileSystemImpl25pathByAppendingComponentsENS_10StringViewERKNS_6VectorIS1_Lm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEE(); +int APS5_VABI _ZN3WTF14FileSystemImpl27isSafeToUseMemoryMapForPathERKNS_6StringE(); +int APS5_VABI _ZN3WTF14FileSystemImpl29makeSafeToUseMemoryMapForPathERKNS_6StringE(); +int APS5_VABI _ZN3WTF14FileSystemImpl30appendFileContentsToFileHandleERKNS_6StringERi(); +int APS5_VABI _ZN3WTF14FileSystemImpl34stringFromFileSystemRepresentationEPKc(); +int APS5_VABI _ZN3WTF14FileSystemImpl40lastComponentOfPathIgnoringTrailingSlashERKNS_6StringE(); +int APS5_VABI _ZN3WTF14FileSystemImpl8hardLinkERKNS_6StringES3_(); +int APS5_VABI _ZN3WTF14FileSystemImpl8moveFileERKNS_6StringES3_(); +int APS5_VABI _ZN3WTF14FileSystemImpl8openFileERKNS_6StringENS0_12FileOpenModeENS0_20FileAccessPermissionEb(); +int APS5_VABI _ZN3WTF14FileSystemImpl8realPathERKNS_6StringE(); +int APS5_VABI _ZN3WTF14FileSystemImpl8seekFileEixNS0_14FileSeekOriginE(); +int APS5_VABI _ZN3WTF14FileSystemImpl9closeFileERi(); +int APS5_VABI _ZN3WTF14SymbolRegistry12symbolForKeyERKNS_6StringE(); +int APS5_VABI _ZN3WTF14SymbolRegistryD1Ev(); +int APS5_VABI _ZN3WTF14SymbolRegistryD2Ev(); +int APS5_VABI _ZN3WTF14aboutSrcDocURLEv(); +int APS5_VABI _ZN3WTF14createIteratorENS_10StringViewE(); +int APS5_VABI _ZN3WTF14dataLogFStringEPKc(); +int APS5_VABI _ZN3WTF14dupCloseOnExecEi(); +int APS5_VABI _ZN3WTF14isVersion4UUIDENS_10StringViewE(); +int APS5_VABI _ZN3WTF14setCloseOnExecEi(); +int APS5_VABI _ZN3WTF15AtomStringTableD1Ev(); +int APS5_VABI _ZN3WTF15AtomStringTableD2Ev(); +int APS5_VABI _ZN3WTF15AutomaticThread11shouldSleepERKNS_14AbstractLockerE(); +int APS5_VABI _ZN3WTF15AutomaticThread14threadDidStartEv(); +int APS5_VABI _ZN3WTF15AutomaticThread16threadIsStoppingERKNS_14AbstractLockerE(); +int APS5_VABI _ZN3WTF15AutomaticThread4joinEv(); +int APS5_VABI _ZN3WTF15AutomaticThread5startERKNS_14AbstractLockerE(); +int APS5_VABI _ZN3WTF15AutomaticThread6notifyERKNS_14AbstractLockerE(); +int APS5_VABI _ZN3WTF15AutomaticThread7tryStopERKNS_14AbstractLockerE(); +int APS5_VABI _ZN3WTF15AutomaticThread9isWaitingERKNS_14AbstractLockerE(); +int APS5_VABI _ZN3WTF15AutomaticThreadD0Ev(); +int APS5_VABI _ZN3WTF15AutomaticThreadD1Ev(); +int APS5_VABI _ZN3WTF15AutomaticThreadD2Ev(); +int APS5_VABI _ZN3WTF15BinarySemaphore9waitUntilERKNS_24TimeWithDynamicClockTypeE(); +int APS5_VABI _ZN3WTF15FilePrintStreamD0Ev(); +int APS5_VABI _ZN3WTF15FilePrintStreamD1Ev(); +int APS5_VABI _ZN3WTF15FilePrintStreamD2Ev(); +int APS5_VABI _ZN3WTF15ThreadCondition4waitERNS_5MutexE(); +int APS5_VABI _ZN3WTF15ThreadCondition6signalEv(); +int APS5_VABI _ZN3WTF15ThreadCondition9broadcastEv(); +int APS5_VABI _ZN3WTF15ThreadCondition9timedWaitERNS_5MutexENS_8WallTimeE(); +int APS5_VABI _ZN3WTF15ThreadConditionD1Ev(); +int APS5_VABI _ZN3WTF15ThreadConditionD2Ev(); +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 _ZN3WTF17GregorianDateTimeC1EdNS_15LocalTimeOffsetE(); +int APS5_VABI _ZN3WTF17GregorianDateTimeC2EdNS_15LocalTimeOffsetE(); +int APS5_VABI _ZN3WTF17PrivateSymbolImpl6createERNS_10StringImplE(); +int APS5_VABI _ZN3WTF17StringPrintStream11tryToStringEv(); +int APS5_VABI _ZN3WTF17StringPrintStream26toStringWithLatin1FallbackEv(); +int APS5_VABI _ZN3WTF17StringPrintStream5resetEv(); +int APS5_VABI _ZN3WTF17StringPrintStream7vprintfEPKcP13__va_list_tag(); +int APS5_VABI _ZN3WTF17StringPrintStream8toStringEv(); +int APS5_VABI _ZN3WTF17StringPrintStream9toCStringEv(); +int APS5_VABI _ZN3WTF17StringPrintStreamC1Ev(); +int APS5_VABI _ZN3WTF17StringPrintStreamC2Ev(); +int APS5_VABI _ZN3WTF17StringPrintStreamD0Ev(); +int APS5_VABI _ZN3WTF17StringPrintStreamD1Ev(); +int APS5_VABI _ZN3WTF17StringPrintStreamD2Ev(); +int APS5_VABI _ZN3WTF17callOnMainRunLoopEONS_8FunctionIFvvEEE(); +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(); +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(); +int APS5_VABI _ZN3WTF18ExternalStringImpl6createEPKhjONS_8FunctionIFvPS0_PvjEEE(); +int APS5_VABI _ZN3WTF18FunctionDispatcherC2Ev(); +int APS5_VABI _ZN3WTF18FunctionDispatcherD0Ev(); +int APS5_VABI _ZN3WTF18FunctionDispatcherD1Ev(); +int APS5_VABI _ZN3WTF18FunctionDispatcherD2Ev(); +int APS5_VABI _ZN3WTF18ParallelHelperPool13doSomeHelpingEv(); +int APS5_VABI _ZN3WTF18ParallelHelperPool13ensureThreadsEj(); +int APS5_VABI _ZN3WTF18ParallelHelperPoolC1EONS_7CStringE(); +int APS5_VABI _ZN3WTF18ParallelHelperPoolC2EONS_7CStringE(); +int APS5_VABI _ZN3WTF18ParallelHelperPoolD1Ev(); +int APS5_VABI _ZN3WTF18ParallelHelperPoolD2Ev(); +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 _ZN3WTF19isCompilationThreadEv(); +int APS5_VABI _ZN3WTF19mimeTypeFromDataURLENS_10StringViewE(); +int APS5_VABI _ZN3WTF19numGraphemeClustersENS_10StringViewE(); +int APS5_VABI _ZN3WTF20ConcurrentPtrHashSet15deleteOldTablesEv(); +int APS5_VABI _ZN3WTF20ConcurrentPtrHashSet5clearEv(); +int APS5_VABI _ZN3WTF20ConcurrentPtrHashSet7addSlowEPNS0_5TableEjjjPv(); +int APS5_VABI _ZN3WTF20ConcurrentPtrHashSetC1Ev(); +int APS5_VABI _ZN3WTF20ConcurrentPtrHashSetC2Ev(); +int APS5_VABI _ZN3WTF20ConcurrentPtrHashSetD1Ev(); +int APS5_VABI _ZN3WTF20ConcurrentPtrHashSetD2Ev(); +int APS5_VABI _ZN3WTF20ParallelHelperClient13doSomeHelpingEv(); +int APS5_VABI _ZN3WTF20ParallelHelperClient6finishEv(); +int APS5_VABI _ZN3WTF20ParallelHelperClientD1Ev(); +int APS5_VABI _ZN3WTF20ParallelHelperClientD2Ev(); +int APS5_VABI _ZN3WTF20initializeMainThreadEv(); +int APS5_VABI _ZN3WTF20resetAccumulatedLogsEv(); +int APS5_VABI _ZN3WTF21MemoryPressureHandler12setPageCountEj(); +int APS5_VABI _ZN3WTF21MemoryPressureHandler13releaseMemoryENS_8CriticalENS_11SynchronousE(); +int APS5_VABI _ZN3WTF21MemoryPressureHandler24currentMemoryUsagePolicyEv(); +int APS5_VABI _ZN3WTF21MemoryPressureHandler26endSimulatedMemoryPressureEv(); +int APS5_VABI _ZN3WTF21MemoryPressureHandler26triggerMemoryPressureEventEb(); +int APS5_VABI _ZN3WTF21MemoryPressureHandler28beginSimulatedMemoryPressureEv(); +int APS5_VABI _ZN3WTF21MemoryPressureHandler33setShouldUsePeriodicMemoryMonitorEb(); +int APS5_VABI _ZN3WTF21MemoryPressureHandler7installEv(); +int APS5_VABI _ZN3WTF21MemoryPressureHandler9singletonEv(); +int APS5_VABI _ZN3WTF21RefCountedLeakCounter24cancelMessageSuppressionEPKc(); +int APS5_VABI _ZN3WTF21RefCountedLeakCounter9decrementEv(); +int APS5_VABI _ZN3WTF21RefCountedLeakCounter9incrementEv(); +int APS5_VABI _ZN3WTF21RefCountedLeakCounterC1EPKc(); +int APS5_VABI _ZN3WTF21RefCountedLeakCounterC2EPKc(); +int APS5_VABI _ZN3WTF21RefCountedLeakCounterD1Ev(); +int APS5_VABI _ZN3WTF21RefCountedLeakCounterD2Ev(); +int APS5_VABI _ZN3WTF21bootSessionUUIDStringEv(); +int APS5_VABI _ZN3WTF21currentSearchLocaleIDEv(); +int APS5_VABI _ZN3WTF21makeRFC2822DateStringEjjjjjjji(); +int APS5_VABI _ZN3WTF21sentenceBreakIteratorENS_10StringViewE(); +int APS5_VABI _ZN3WTF22CrossThreadTaskHandler13postTaskReplyEONS_15CrossThreadTaskE(); +int APS5_VABI _ZN3WTF22CrossThreadTaskHandler21setCompletionCallbackEONS_8FunctionIFvvEEE(); +int APS5_VABI _ZN3WTF22CrossThreadTaskHandler4killEv(); +int APS5_VABI _ZN3WTF22CrossThreadTaskHandler8postTaskEONS_15CrossThreadTaskE(); +int APS5_VABI _ZN3WTF22CrossThreadTaskHandlerC1EPKcNS0_25AutodrainedPoolForRunLoopE(); +int APS5_VABI _ZN3WTF22CrossThreadTaskHandlerC2EPKcNS0_25AutodrainedPoolForRunLoopE(); +int APS5_VABI _ZN3WTF22CrossThreadTaskHandlerD0Ev(); +int APS5_VABI _ZN3WTF22CrossThreadTaskHandlerD1Ev(); +int APS5_VABI _ZN3WTF22CrossThreadTaskHandlerD2Ev(); +int APS5_VABI _ZN3WTF22FastBitVectorWordOwner10resizeSlowEm(); +int APS5_VABI _ZN3WTF22FastBitVectorWordOwner13setEqualsSlowERKS0_(); +int APS5_VABI _ZN3WTF22TextBreakIteratorCache9singletonEv(); +int APS5_VABI _ZN3WTF22isMainThreadOrGCThreadEv(); +int APS5_VABI _ZN3WTF23callOnMainThreadAndWaitEONS_8FunctionIFvvEEE(); +int APS5_VABI _ZN3WTF24AutomaticThreadCondition4waitERNS_4LockE(); +int APS5_VABI _ZN3WTF24AutomaticThreadCondition7waitForERNS_4LockENS_7SecondsE(); +int APS5_VABI _ZN3WTF24AutomaticThreadCondition9notifyAllERKNS_14AbstractLockerE(); +int APS5_VABI _ZN3WTF24AutomaticThreadCondition9notifyOneERKNS_14AbstractLockerE(); +int APS5_VABI _ZN3WTF24AutomaticThreadConditionC1Ev(); +int APS5_VABI _ZN3WTF24AutomaticThreadConditionC2Ev(); +int APS5_VABI _ZN3WTF24AutomaticThreadConditionD1Ev(); +int APS5_VABI _ZN3WTF24AutomaticThreadConditionD2Ev(); +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 _ZN3WTF26getAndResetAccumulatedLogsEv(); +int APS5_VABI _ZN3WTF26normalizeLineEndingsToCRLFEONS_6VectorIhLm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEE(); +int APS5_VABI _ZN3WTF27protocolHostAndPortAreEqualERKNS_3URLES2_(); +int APS5_VABI _ZN3WTF28displayNameForLanguageLocaleERKNS_6StringE(); +int APS5_VABI _ZN3WTF28encodeWithURLEscapeSequencesERKNS_6StringE(); +int APS5_VABI _ZN3WTF28normalizeLineEndingsToNativeEONS_6VectorIhLm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEE(); +int APS5_VABI _ZN3WTF28removeLanguageChangeObserverEPv(); +int APS5_VABI _ZN3WTF30numCodeUnitsInGraphemeClustersENS_10StringViewEj(); +int APS5_VABI _ZN3WTF30overrideUserPreferredLanguagesERKNS_6VectorINS_6StringELm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEE(); +int APS5_VABI _ZN3WTF30userPreferredLanguagesOverrideEv(); +int APS5_VABI _ZN3WTF31NonSharedCharacterBreakIteratorC1ENS_10StringViewE(); +int APS5_VABI _ZN3WTF31NonSharedCharacterBreakIteratorC2ENS_10StringViewE(); +int APS5_VABI _ZN3WTF31NonSharedCharacterBreakIteratorD1Ev(); +int APS5_VABI _ZN3WTF31NonSharedCharacterBreakIteratorD2Ev(); +int APS5_VABI _ZN3WTF31equalIgnoringFragmentIdentifierERKNS_3URLES2_(); +int APS5_VABI _ZN3WTF33indexOfBestMatchingLanguageInListERKNS_6StringERKNS_6VectorIS0_Lm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEERb(); +int APS5_VABI _ZN3WTF37canCurrentThreadAccessThreadLocalDataERNS_6ThreadE(); +int APS5_VABI _ZN3WTF37parseDateFromNullTerminatedCharactersEPKc(); +double APS5_VABI _ZN3WTF37parseDateFromNullTerminatedCharactersEPKcRb(const char* dateString, bool* isLocalTime); +int APS5_VABI _ZN3WTF3ICU12majorVersionEv(); +int APS5_VABI _ZN3WTF3ICU12minorVersionEv(); +int APS5_VABI _ZN3WTF3URL11setProtocolENS_10StringViewE(); +int APS5_VABI _ZN3WTF3URL14setHostAndPortENS_10StringViewE(); +int APS5_VABI _ZN3WTF3URL15hostIsIPAddressENS_10StringViewE(); +int APS5_VABI _ZN3WTF3URL17removeCredentialsEv(); +int APS5_VABI _ZN3WTF3URL21setFragmentIdentifierENS_10StringViewE(); +int APS5_VABI _ZN3WTF3URL23fakeURLWithRelativePartENS_10StringViewE(); +int APS5_VABI _ZN3WTF3URL25fileURLWithFileSystemPathENS_10StringViewE(); +int APS5_VABI _ZN3WTF3URL32removeQueryAndFragmentIdentifierEv(); +int APS5_VABI _ZN3WTF3URL7setHostENS_10StringViewE(); +int APS5_VABI _ZN3WTF3URL7setPathENS_10StringViewE(); +int APS5_VABI _ZN3WTF3URL7setUserENS_10StringViewE(); +int APS5_VABI _ZN3WTF3URL8setQueryENS_10StringViewE(); +int APS5_VABI _ZN3WTF3URLC2ERKS0_RKNS_6StringEPKNS_15URLTextEncodingE(); +int APS5_VABI _ZN3WTF3absERKNS_9MediaTimeE(); +int APS5_VABI _ZN3WTF40clearDefaultPortForProtocolMapForTestingEv(); +int APS5_VABI _ZN3WTF40registerDefaultPortForProtocolForTestingEtRKNS_6StringE(); +int APS5_VABI _ZN3WTF4Lock10unlockSlowEv(); +int APS5_VABI _ZN3WTF4Lock13safepointSlowEv(); +int APS5_VABI _ZN3WTF4Lock8lockSlowEv(); +int APS5_VABI _ZN3WTF4SHA116computeHexDigestEv(); +int APS5_VABI _ZN3WTF4SHA1C1Ev(); +int APS5_VABI _ZN3WTF4SHA1C2Ev(); +int APS5_VABI _ZN3WTF5Mutex4lockEv(); +int APS5_VABI _ZN3WTF5Mutex6unlockEv(); +int APS5_VABI _ZN3WTF5Mutex7tryLockEv(); +int APS5_VABI _ZN3WTF5MutexC1Ev(); +int APS5_VABI _ZN3WTF5MutexC2Ev(); +int APS5_VABI _ZN3WTF5MutexD1Ev(); +int APS5_VABI _ZN3WTF5MutexD2Ev(); +int APS5_VABI _ZN3WTF5sleepENS_7SecondsE(); +int APS5_VABI _ZN3WTF6String24numberToStringFixedWidthEdj(); +int APS5_VABI _ZN3WTF6String28numberToStringFixedPrecisionEdjNS_29TrailingZerosTruncatingPolicyE(); +int APS5_VABI _ZN3WTF6String28numberToStringFixedPrecisionEfjNS_29TrailingZerosTruncatingPolicyE(); +int APS5_VABI _ZN3WTF6String6numberEd(); +int APS5_VABI _ZN3WTF6String6numberEf(); +int APS5_VABI _ZN3WTF6Thread13mayBeGCThreadEv(); +int APS5_VABI _ZN3WTF6Thread14changePriorityEi(); +int APS5_VABI _ZN3WTF6Thread16registerGCThreadENS_12GCThreadTypeE(); +int APS5_VABI _ZN3WTF6Thread17waitForCompletionEv(); +int APS5_VABI _ZN3WTF6Thread20initializeCurrentTLSEv(); +int APS5_VABI _ZN3WTF6Thread20numberOfThreadGroupsEv(); +int APS5_VABI _ZN3WTF6Thread27exchangeIsCompilationThreadEb(); +int APS5_VABI _ZN3WTF6Thread31setCurrentThreadIsUserInitiatedEi(); +int APS5_VABI _ZN3WTF6Thread33setCurrentThreadIsUserInteractiveEi(); +int APS5_VABI _ZN3WTF6Thread6detachEv(); +int APS5_VABI _ZN3WTF6Thread6signalEi(); +int APS5_VABI _ZN3WTF6ThreadD1Ev(); +int APS5_VABI _ZN3WTF6ThreadD2Ev(); +int APS5_VABI _ZN3WTF7RunLoop13dispatchAfterENS_7SecondsEONS_8FunctionIFvvEEE(); +int APS5_VABI _ZN3WTF7RunLoop17setWakeUpCallbackEONS_8FunctionIFvvEEE(); +int APS5_VABI _ZN3WTF7RunLoop38suspendFunctionDispatchForCurrentCycleEv(); +int APS5_VABI _ZN3WTF7RunLoop3runEv(); +int APS5_VABI _ZN3WTF7RunLoop4mainEv(); +int APS5_VABI _ZN3WTF7RunLoop4stopEv(); +int APS5_VABI _ZN3WTF7RunLoop5cycleEj(); +int APS5_VABI _ZN3WTF7RunLoop7currentEv(); +int APS5_VABI _ZN3WTF7RunLoop8dispatchEONS_8FunctionIFvvEEE(); +int APS5_VABI _ZN3WTF7RunLoop9TimerBase4stopEv(); +int APS5_VABI _ZN3WTF7RunLoop9TimerBase5startENS_7SecondsEb(); +int APS5_VABI _ZN3WTF7RunLoop9TimerBaseC2ERS0_(); +int APS5_VABI _ZN3WTF7RunLoop9TimerBaseD1Ev(); +int APS5_VABI _ZN3WTF7RunLoop9TimerBaseD2Ev(); +int APS5_VABI _ZN3WTF8CollatorC1EPKcb(); +int APS5_VABI _ZN3WTF8CollatorC2EPKcb(); +int APS5_VABI _ZN3WTF8CollatorD1Ev(); +int APS5_VABI _ZN3WTF8CollatorD2Ev(); +int APS5_VABI _ZN3WTF8JSONImpl10ObjectBase6removeERKNS_6StringE(); +int APS5_VABI _ZN3WTF8JSONImpl5Array6createEv(); +int APS5_VABI _ZN3WTF8JSONImpl5Value4nullEv(); +int APS5_VABI _ZN3WTF8JSONImpl5Value6createERKNS_6StringE(); +int APS5_VABI _ZN3WTF8JSONImpl5Value6createEb(); +int APS5_VABI _ZN3WTF8JSONImpl5Value6createEd(); +int APS5_VABI _ZN3WTF8JSONImpl5Value6createEi(); +int APS5_VABI _ZN3WTF8JSONImpl5ValueC1ENS1_4TypeE(); +int APS5_VABI _ZN3WTF8JSONImpl5ValueC1ERKNS_6StringE(); +int APS5_VABI _ZN3WTF8JSONImpl5ValueC1Eb(); +int APS5_VABI _ZN3WTF8JSONImpl5ValueC1Ed(); +int APS5_VABI _ZN3WTF8JSONImpl5ValueC1Ei(); +int APS5_VABI _ZN3WTF8JSONImpl5ValueC1Ev(); +int APS5_VABI _ZN3WTF8JSONImpl5ValueC2ENS1_4TypeE(); +int APS5_VABI _ZN3WTF8JSONImpl5ValueC2ERKNS_6StringE(); +int APS5_VABI _ZN3WTF8JSONImpl5ValueC2Eb(); +int APS5_VABI _ZN3WTF8JSONImpl5ValueC2Ed(); +int APS5_VABI _ZN3WTF8JSONImpl5ValueC2Ei(); +int APS5_VABI _ZN3WTF8JSONImpl5ValueC2Ev(); +int APS5_VABI _ZN3WTF8JSONImpl5ValueD0Ev(); +int APS5_VABI _ZN3WTF8JSONImpl5ValueD1Ev(); +int APS5_VABI _ZN3WTF8JSONImpl5ValueD2Ev(); +int APS5_VABI _ZN3WTF8JSONImpl6Object6createEv(); +int APS5_VABI _ZN3WTF8JSONImpl9ArrayBase10pushDoubleEd(); +int APS5_VABI _ZN3WTF8JSONImpl9ArrayBase10pushStringERKNS_6StringE(); +int APS5_VABI _ZN3WTF8JSONImpl9ArrayBase11pushBooleanEb(); +int APS5_VABI _ZN3WTF8JSONImpl9ArrayBase11pushIntegerEi(); +int APS5_VABI _ZN3WTF8JSONImpl9ArrayBase3endEv(); +int APS5_VABI _ZN3WTF8JSONImpl9ArrayBase5beginEv(); +int APS5_VABI _ZN3WTF8JSONImpl9ArrayBaseC1Ev(); +int APS5_VABI _ZN3WTF8JSONImpl9ArrayBaseC2Ev(); +int APS5_VABI _ZN3WTF8JSONImpl9ArrayBaseD0Ev(); +int APS5_VABI _ZN3WTF8JSONImpl9ArrayBaseD1Ev(); +int APS5_VABI _ZN3WTF8WordLock10unlockSlowEv(); +int APS5_VABI _ZN3WTF8WordLock8lockSlowEv(); +int APS5_VABI _ZN3WTF8dataFileEv(); +int APS5_VABI _ZN3WTF9BitVector11excludeSlowERKS0_(); +int APS5_VABI _ZN3WTF9BitVector13OutOfLineBits6createEm(); +int APS5_VABI _ZN3WTF9BitVector13OutOfLineBits7destroyEPS1_(); +int APS5_VABI _ZN3WTF9BitVector6resizeEm(); +int APS5_VABI _ZN3WTF9BitVector7setSlowERKS0_(); +int APS5_VABI _ZN3WTF9BitVector8clearAllEv(); +int APS5_VABI _ZN3WTF9BitVector9mergeSlowERKS0_(); +int APS5_VABI _ZN3WTF9MediaTime11invalidTimeEv(); +int APS5_VABI _ZN3WTF9MediaTime12setTimeScaleEjNS0_13RoundingFlagsE(); +int APS5_VABI _ZN3WTF9MediaTime14indefiniteTimeEv(); +int APS5_VABI _ZN3WTF9MediaTime15createWithFloatEf(); +int APS5_VABI _ZN3WTF9MediaTime15createWithFloatEfj(); +int APS5_VABI _ZN3WTF9MediaTime16createWithDoubleEdj(); +int APS5_VABI _ZN3WTF9MediaTime16createWithDoubleEd(); +int APS5_VABI _ZN3WTF9MediaTime20negativeInfiniteTimeEv(); +int APS5_VABI _ZN3WTF9MediaTime20positiveInfiniteTimeEv(); +int APS5_VABI _ZN3WTF9MediaTime8zeroTimeEv(); +int APS5_VABI _ZN3WTF9MediaTimeC1ERKS0_(); +int APS5_VABI _ZN3WTF9MediaTimeC1Eljh(); +int APS5_VABI _ZN3WTF9MediaTimeC1Ev(); +int APS5_VABI _ZN3WTF9MediaTimeC2ERKS0_(); +int APS5_VABI _ZN3WTF9MediaTimeC2Eljh(); +int APS5_VABI _ZN3WTF9MediaTimeC2Ev(); +int APS5_VABI _ZN3WTF9MediaTimeaSERKS0_(); +int APS5_VABI _ZN3WTF9MediaTimedaEPv(); +int APS5_VABI _ZN3WTF9MediaTimedlEPv(); +int APS5_VABI _ZN3WTF9MediaTimemIERKS0_(); +int APS5_VABI _ZN3WTF9MediaTimenaEm(); +int APS5_VABI _ZN3WTF9MediaTimenaEmPv(); +int APS5_VABI _ZN3WTF9MediaTimenwEm10NotNullTagPv(); +int APS5_VABI _ZN3WTF9MediaTimenwEmPv(); +int APS5_VABI _ZN3WTF9MediaTimenwEm(); +int APS5_VABI _ZN3WTF9MediaTimepLERKS0_(); +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 _ZN3WTFlsERNS_10TextStreamENS_7SecondsE(); +int APS5_VABI _ZN3WTFlsERNS_10TextStreamERKNS_3URLE(); +int APS5_VABI _ZN6WebKit14WebProcessMainEiPPc(); +int APS5_VABI _ZN6WebKit18NetworkProcessMainEiPPc(); +int APS5_VABI _ZN7Nicosia6Buffer6createERKN7WebCore7IntSizeEj(); +int APS5_VABI _ZN7Nicosia6BufferD1Ev(); +int APS5_VABI _ZN7Nicosia6BufferD2Ev(); +int APS5_VABI _ZN7Nicosia9AnimationC1ERKS0_(); +int APS5_VABI _ZN7Nicosia9AnimationC2ERKS0_(); +int APS5_VABI _ZN7WebCore10CookieUtil17defaultPathForURLERKN3WTF3URLE(); +int APS5_VABI _ZN7WebCore10FileHandle4openERKN3WTF6StringENS1_14FileSystemImpl12FileOpenModeE(); +int APS5_VABI _ZN7WebCore10FileHandle4openEv(); +int APS5_VABI _ZN7WebCore10FileHandle4readEPvi(); +int APS5_VABI _ZN7WebCore10FileHandle5closeEv(); +int APS5_VABI _ZN7WebCore10FileHandle5writeEPKvi(); +int APS5_VABI _ZN7WebCore10FileHandle6printfEPKcz(); +int APS5_VABI _ZN7WebCore10FileHandleC1EOS0_(); +int APS5_VABI _ZN7WebCore10FileHandleC1ERKN3WTF6StringENS1_14FileSystemImpl12FileOpenModeENS1_9OptionSetINS5_12FileLockModeEEE(); +int APS5_VABI _ZN7WebCore10FileHandleC1ERKN3WTF6StringENS1_14FileSystemImpl12FileOpenModeE(); +int APS5_VABI _ZN7WebCore10FileHandleC1Ev(); +int APS5_VABI _ZN7WebCore10FileHandleC2EOS0_(); +int APS5_VABI _ZN7WebCore10FileHandleC2ERKN3WTF6StringENS1_14FileSystemImpl12FileOpenModeENS1_9OptionSetINS5_12FileLockModeEEE(); +int APS5_VABI _ZN7WebCore10FileHandleC2ERKN3WTF6StringENS1_14FileSystemImpl12FileOpenModeE(); +int APS5_VABI _ZN7WebCore10FileHandleC2Ev(); +int APS5_VABI _ZN7WebCore10FileHandleD1Ev(); +int APS5_VABI _ZN7WebCore10FileHandleD2Ev(); +int APS5_VABI _ZN7WebCore10FileHandleaSEOS0_(); +int APS5_VABI _ZN7WebCore10ISOFullBoxC1ERKS0_(); +int APS5_VABI _ZN7WebCore10ISOFullBoxC1Ev(); +int APS5_VABI _ZN7WebCore10ISOFullBoxC2ERKS0_(); +int APS5_VABI _ZN7WebCore10ISOFullBoxC2Ev(); +int APS5_VABI _ZN7WebCore10JSDocument14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore10JSDocument15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore10JSDocument15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore10JSDocument15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore10JSDocument4infoEv(); +int APS5_VABI _ZN7WebCore10JSDocument9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore10JSDocument9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore10JSDocumentC1ERKS0_(); +int APS5_VABI _ZN7WebCore10JSDocumentC2ERKS0_(); +int APS5_VABI _ZN7WebCore10JSDocumentD1Ev(); +int APS5_VABI _ZN7WebCore10JSDocumentD2Ev(); +int APS5_VABI _ZN7WebCore10JSLocation14finishCreationERN3JSC2VME(); +int APS5_VABI _ZN7WebCore10JSLocation14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore10JSLocation15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore10JSLocation15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore10JSLocation15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore10JSLocation4infoEv(); +int APS5_VABI _ZN7WebCore10JSLocation9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore10JSLocation9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore10JSLocationC1ERKS0_(); +int APS5_VABI _ZN7WebCore10JSLocationC2ERKS0_(); +int APS5_VABI _ZN7WebCore10JSLocationD1Ev(); +int APS5_VABI _ZN7WebCore10JSLocationD2Ev(); +int APS5_VABI _ZN7WebCore10JSLocationaSERKS0_(); +int APS5_VABI _ZN7WebCore10JSNodeList9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore10OriginLockD1Ev(); +int APS5_VABI _ZN7WebCore10OriginLockD2Ev(); +int APS5_VABI _ZN7WebCore10Pasteboard10readOriginEv(); +int APS5_VABI _ZN7WebCore10Pasteboard10readStringERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore10Pasteboard11writeMarkupERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore10Pasteboard11writeStringERKN3WTF6StringES4_(); +int APS5_VABI _ZN7WebCore10Pasteboard14readAllStringsERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore10Pasteboard14writePlainTextERKN3WTF6StringENS0_18SmartReplaceOptionE(); +int APS5_VABI _ZN7WebCore10Pasteboard15canSmartReplaceEv(); +int APS5_VABI _ZN7WebCore10Pasteboard15writeCustomDataERKN3WTF6VectorINS_20PasteboardCustomDataELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE(); +int APS5_VABI _ZN7WebCore10Pasteboard16fileContentStateEv(); +int APS5_VABI _ZN7WebCore10Pasteboard20typesSafeForBindingsERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore10Pasteboard22readStringInCustomDataERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore10Pasteboard28typesForLegacyUnsafeBindingsEv(); +int APS5_VABI _ZN7WebCore10Pasteboard33writeTrustworthyWebURLsPboardTypeERKNS_13PasteboardURLE(); +int APS5_VABI _ZN7WebCore10Pasteboard5clearERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore10Pasteboard5clearEv(); +int APS5_VABI _ZN7WebCore10Pasteboard5writeERKNS_13PasteboardURLE(); +int APS5_VABI _ZN7WebCore10Pasteboard5writeERKNS_15PasteboardImageE(); +int APS5_VABI _ZN7WebCore10Pasteboard5writeERKNS_20PasteboardWebContentE(); +int APS5_VABI _ZN7WebCore10Pasteboard5writeERKNS_5ColorE(); +int APS5_VABI _ZN7WebCore10Pasteboard7hasDataEv(); +int APS5_VABI _ZN7WebCore10RenderView10compositorEv(); +int APS5_VABI _ZN7WebCore10ScrollView11removeChildERNS_6WidgetE(); +int APS5_VABI _ZN7WebCore10ScrollView15setScrollOffsetERKNS_8IntPointE(); +int APS5_VABI _ZN7WebCore10ScrollView16setParentVisibleEb(); +int APS5_VABI _ZN7WebCore10ScrollView17setScrollbarModesENS_13ScrollbarModeES1_bb(); +int APS5_VABI _ZN7WebCore10ScrollView17setUseFixedLayoutEb(); +int APS5_VABI _ZN7WebCore10ScrollView18setFixedLayoutSizeERKNS_7IntSizeE(); +int APS5_VABI _ZN7WebCore10ScrollView20setCanHaveScrollbarsEb(); +int APS5_VABI _ZN7WebCore10ScrollView21setExposedContentRectERKNS_9FloatRectE(); +int APS5_VABI _ZN7WebCore10ScrollView23setPaintsEntireContentsEb(); +int APS5_VABI _ZN7WebCore10ScrollView23setScrollbarsSuppressedEbb(); +int APS5_VABI _ZN7WebCore10ScrollView24setUnobscuredContentSizeERKNS_9FloatSizeE(); +int APS5_VABI _ZN7WebCore10ScrollView36scrollOffsetChangedViaPlatformWidgetERKNS_8IntPointES3_(); +int APS5_VABI _ZN7WebCore10ScrollView4hideEv(); +int APS5_VABI _ZN7WebCore10ScrollView4showEv(); +int APS5_VABI _ZN7WebCore10ScrollView8addChildERNS_6WidgetE(); +int APS5_VABI _ZN7WebCore10StorageMap10removeItemERKN3WTF6StringERS2_(); +int APS5_VABI _ZN7WebCore10StorageMap20setItemIgnoringQuotaERKN3WTF6StringES4_(); +int APS5_VABI _ZN7WebCore10StorageMap3keyEj(); +int APS5_VABI _ZN7WebCore10StorageMap7setItemERKN3WTF6StringES4_RS2_Rb(); +int APS5_VABI _ZN7WebCore10TimeRanges13intersectWithERKS0_(); +int APS5_VABI _ZN7WebCore10TimeRanges3addEdd(); +int APS5_VABI _ZN7WebCore10TimeRanges6createEdd(); +int APS5_VABI _ZN7WebCore10TimeRanges6createEv(); +int APS5_VABI _ZN7WebCore10TimeRangesC1Edd(); +int APS5_VABI _ZN7WebCore10TimeRangesC1Ev(); +int APS5_VABI _ZN7WebCore10TimeRangesC2Edd(); +int APS5_VABI _ZN7WebCore10TimeRangesC2Ev(); +int APS5_VABI _ZN7WebCore10TreeWalker10firstChildEv(); +int APS5_VABI _ZN7WebCore10TreeWalker10parentNodeEv(); +int APS5_VABI _ZN7WebCore10TreeWalker11nextSiblingEv(); +int APS5_VABI _ZN7WebCore10TreeWalker12previousNodeEv(); +int APS5_VABI _ZN7WebCore10TreeWalker14setCurrentNodeERNS_4NodeE(); +int APS5_VABI _ZN7WebCore10TreeWalker15previousSiblingEv(); +int APS5_VABI _ZN7WebCore10TreeWalker8nextNodeEv(); +int APS5_VABI _ZN7WebCore10TreeWalker9lastChildEv(); +int APS5_VABI _ZN7WebCore10XLinkNames4initEv(); +int APS5_VABI _ZN7WebCore10XMLNSNames4initEv(); +int APS5_VABI _ZN7WebCore10handCursorEv(); +int APS5_VABI _ZN7WebCore10inSameLineERKNS_15VisiblePositionES2_(); +int APS5_VABI _ZN7WebCore10resolveDNSERKN3WTF6StringEmONS0_17CompletionHandlerIFvONSt12experimental15fundamentals_v38expectedINS0_6VectorINS_9IPAddressELm0ENS0_15CrashOnOverflowELm16ENS0_10FastMallocEEENS_8DNSErrorEEEEEE(); +int APS5_VABI _ZN7WebCore11BidiContext41copyStackRemovingUnicodeEmbeddingContextsEv(); +int APS5_VABI _ZN7WebCore11BidiContext6createEh14UCharDirectionbNS_19BidiEmbeddingSourceEPS0_(); +int APS5_VABI _ZN7WebCore11BitmapImageC1EPNS_13ImageObserverE(); +int APS5_VABI _ZN7WebCore11BitmapImageC2EPNS_13ImageObserverE(); +int APS5_VABI _ZN7WebCore11CSSPageRule15setSelectorTextERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore11CSSPageRule5styleEv(); +int APS5_VABI _ZN7WebCore11CachedFrame23cachedFramePlatformDataEv(); +int APS5_VABI _ZN7WebCore11CachedImage16imageForRendererEPKNS_12RenderObjectE(); +int APS5_VABI _ZN7WebCore11ContentType15codecsParameterEv(); +int APS5_VABI _ZN7WebCore11ContentTypeC1EON3WTF6StringE(); +int APS5_VABI _ZN7WebCore11ContentTypeC1ERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore11ContentTypeC2EON3WTF6StringE(); +int APS5_VABI _ZN7WebCore11ContentTypeC2ERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore11CryptoKeyEC12generatePairENS_25CryptoAlgorithmIdentifierERKN3WTF6StringEbi(); +int APS5_VABI _ZN7WebCore11CryptoKeyEC9importRawENS_25CryptoAlgorithmIdentifierERKN3WTF6StringEONS2_6VectorIhLm0ENS2_15CrashOnOverflowELm16ENS2_10FastMallocEEEbi(); +int APS5_VABI _ZN7WebCore11DOMRectListC1ERKN3WTF6VectorINS_9FloatQuadELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE(); +int APS5_VABI _ZN7WebCore11DOMRectListC1ERKN3WTF6VectorINS_9FloatRectELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE(); +int APS5_VABI _ZN7WebCore11DOMRectListC2ERKN3WTF6VectorINS_9FloatQuadELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE(); +int APS5_VABI _ZN7WebCore11DOMRectListC2ERKN3WTF6VectorINS_9FloatRectELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE(); +int APS5_VABI _ZN7WebCore11DOMRectListD1Ev(); +int APS5_VABI _ZN7WebCore11DOMRectListD2Ev(); +int APS5_VABI _ZN7WebCore11DisplayList11DisplayList5clearEv(); +int APS5_VABI _ZN7WebCore11DisplayList14DrawingContext17replayDisplayListERNS_15GraphicsContextE(); +int APS5_VABI _ZN7WebCore11DisplayList14DrawingContext26setTracksDisplayListReplayEb(); +int APS5_VABI _ZN7WebCore11DisplayList20FillRectWithGradientC1ERKNS_9FloatRectERNS_8GradientE(); +int APS5_VABI _ZN7WebCore11DisplayList20FillRectWithGradientC2ERKNS_9FloatRectERNS_8GradientE(); +int APS5_VABI _ZN7WebCore11DisplayList8RecorderD0Ev(); +int APS5_VABI _ZN7WebCore11DisplayList8RecorderD1Ev(); +int APS5_VABI _ZN7WebCore11DisplayList8RecorderD2Ev(); +int APS5_VABI _ZN7WebCore11DisplayList8Replayer6replayERKNS_9FloatRectEb(); +int APS5_VABI _ZN7WebCore11EditCommand18setEndingSelectionERKNS_16VisibleSelectionE(); +int APS5_VABI _ZN7WebCore11EventRegionC1Ev(); +int APS5_VABI _ZN7WebCore11EventRegionC2Ev(); +int APS5_VABI _ZN7WebCore11EventTarget24dispatchEventForBindingsERNS_5EventE(); +int APS5_VABI _ZN7WebCore11FetchLoaderD0Ev(); +int APS5_VABI _ZN7WebCore11FetchLoaderD1Ev(); +int APS5_VABI _ZN7WebCore11FetchLoaderD2Ev(); +int APS5_VABI _ZN7WebCore11FileChooser10chooseFileERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore11FileChooser11chooseFilesERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEES8_(); +int APS5_VABI _ZN7WebCore11FileChooserD1Ev(); +int APS5_VABI _ZN7WebCore11FileChooserD2Ev(); +int APS5_VABI _ZN7WebCore11FileMonitorD1Ev(); +int APS5_VABI _ZN7WebCore11FileMonitorD2Ev(); +int APS5_VABI _ZN7WebCore11FontCascade11setCodePathENS0_8CodePathE(); +int APS5_VABI _ZN7WebCore11FontCascadeC1EONS_22FontCascadeDescriptionEff(); +int APS5_VABI _ZN7WebCore11FontCascadeC1Ev(); +int APS5_VABI _ZN7WebCore11FontCascadeC2EONS_22FontCascadeDescriptionEff(); +int APS5_VABI _ZN7WebCore11FontCascadeC2Ev(); +int APS5_VABI _ZN7WebCore11FontCascadeaSERKS0_(); +int APS5_VABI _ZN7WebCore11FrameLoader11shouldCloseEv(); +int APS5_VABI _ZN7WebCore11FrameLoader14detachChildrenEv(); +int APS5_VABI _ZN7WebCore11FrameLoader16detachFromParentEv(); +int APS5_VABI _ZN7WebCore11FrameLoader17HistoryController14setCurrentItemERNS_11HistoryItemE(); +int APS5_VABI _ZN7WebCore11FrameLoader17HistoryController18replaceCurrentItemEPNS_11HistoryItemE(); +int APS5_VABI _ZN7WebCore11FrameLoader17HistoryController26saveDocumentAndScrollStateEv(); +int APS5_VABI _ZN7WebCore11FrameLoader17HistoryController33restoreScrollPositionAndViewStateEv(); +int APS5_VABI _ZN7WebCore11FrameLoader17HistoryController36saveScrollPositionAndViewStateToItemEPNS_11HistoryItemE(); +int APS5_VABI _ZN7WebCore11FrameLoader17stopForUserCancelEb(); +int APS5_VABI _ZN7WebCore11FrameLoader21clearTestingOverridesEv(); +int APS5_VABI _ZN7WebCore11FrameLoader22findFrameForNavigationERKN3WTF10AtomStringEPNS_8DocumentE(); +int APS5_VABI _ZN7WebCore11FrameLoader25detachFromAllOpenedFramesEv(); +int APS5_VABI _ZN7WebCore11FrameLoader26reloadWithOverrideEncodingERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore11FrameLoader32setOriginalURLForDownloadRequestERNS_15ResourceRequestE(); +int APS5_VABI _ZN7WebCore11FrameLoader4initEv(); +int APS5_VABI _ZN7WebCore11FrameLoader4loadEONS_16FrameLoadRequestE(); +int APS5_VABI _ZN7WebCore11FrameLoader6openerEv(); +int APS5_VABI _ZN7WebCore11FrameLoader6reloadEN3WTF9OptionSetINS_12ReloadOptionEEE(); +int APS5_VABI _ZN7WebCore11FrameLoader9setOpenerEPNS_5FrameE(); +int APS5_VABI _ZN7WebCore11HTMLElement12setDraggableEb(); +int APS5_VABI _ZN7WebCore11HTMLElement12setTranslateEb(); +int APS5_VABI _ZN7WebCore11HTMLElement13setSpellcheckEb(); +int APS5_VABI _ZN7WebCore11HTMLElement18setContentEditableERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore11HTMLElement5clickEv(); +int APS5_VABI _ZN7WebCore11HTMLElement6setDirERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore11HistoryItem11setReferrerERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore11HistoryItem12setURLStringERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore11HistoryItem15setIsTargetItemEb(); +int APS5_VABI _ZN7WebCore11HistoryItem17setAlternateTitleERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore11HistoryItem17setScrollPositionERKNS_8IntPointE(); +int APS5_VABI _ZN7WebCore11HistoryItem18setFormContentTypeERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore11HistoryItem18setPageScaleFactorEf(); +int APS5_VABI _ZN7WebCore11HistoryItem20setOriginalURLStringERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore11HistoryItem30setShouldRestoreScrollPositionEb(); +int APS5_VABI _ZN7WebCore11HistoryItem31setShouldOpenExternalURLsPolicyENS_28ShouldOpenExternalURLsPolicyE(); +int APS5_VABI _ZN7WebCore11HistoryItem8setTitleERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore11HistoryItemC1ERKN3WTF6StringES4_(); +int APS5_VABI _ZN7WebCore11HistoryItemC1ERKN3WTF6StringES4_S4_(); +int APS5_VABI _ZN7WebCore11HistoryItemC1Ev(); +int APS5_VABI _ZN7WebCore11HistoryItemC2ERKN3WTF6StringES4_(); +int APS5_VABI _ZN7WebCore11HistoryItemC2ERKN3WTF6StringES4_S4_(); +int APS5_VABI _ZN7WebCore11HistoryItemC2Ev(); +int APS5_VABI _ZN7WebCore11HistoryItemD1Ev(); +int APS5_VABI _ZN7WebCore11HistoryItemD2Ev(); +int APS5_VABI _ZN7WebCore11ImageBufferD0Ev(); +int APS5_VABI _ZN7WebCore11ImageBufferD1Ev(); +int APS5_VABI _ZN7WebCore11ImageBufferD2Ev(); +int APS5_VABI _ZN7WebCore11ImageSource10frameCountEv(); +int APS5_VABI _ZN7WebCore11ImageSource20frameDurationAtIndexEm(); +int APS5_VABI _ZN7WebCore11ImageSource4sizeENS_16ImageOrientationE(); +int APS5_VABI _ZN7WebCore11JSDOMMatrix14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore11JSDOMMatrix15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore11JSDOMMatrix15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore11JSDOMMatrix15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore11JSDOMMatrix4infoEv(); +int APS5_VABI _ZN7WebCore11JSDOMMatrix9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore11JSDOMMatrixC1ERKS0_(); +int APS5_VABI _ZN7WebCore11JSDOMMatrixC2ERKS0_(); +int APS5_VABI _ZN7WebCore11JSDOMMatrixD1Ev(); +int APS5_VABI _ZN7WebCore11JSDOMMatrixD2Ev(); +int APS5_VABI _ZN7WebCore11JSDOMObjectC1EPN3JSC9StructureERNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore11JSDOMObjectC2EPN3JSC9StructureERNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore11JSImageData14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore11JSImageData15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore11JSImageData15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore11JSImageData15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore11JSImageData4infoEv(); +int APS5_VABI _ZN7WebCore11JSImageData9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore11JSImageData9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore11JSImageDataC1ERKS0_(); +int APS5_VABI _ZN7WebCore11JSImageDataC2ERKS0_(); +int APS5_VABI _ZN7WebCore11JSImageDataD1Ev(); +int APS5_VABI _ZN7WebCore11JSImageDataD2Ev(); +int APS5_VABI _ZN7WebCore11JSImageDataaSERKS0_(); +int APS5_VABI _ZN7WebCore11JSMediaList9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore11JSTextTrack9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore11MathMLNames4initEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer10cancelLoadEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer10invalidateEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer11invalidTimeEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer11isAvailableEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer11muteChangedEb(); +int APS5_VABI _ZN7WebCore11MediaPlayer11naturalSizeEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer11rateChangedEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer11sizeChangedEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer11timeChangedEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer12addTextTrackERNS_22InbandTextTrackPrivateE(); +int APS5_VABI _ZN7WebCore11MediaPlayer12networkStateEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer12supportsTypeERKNS_28MediaEngineSupportParametersE(); +int APS5_VABI _ZN7WebCore11MediaPlayer13addAudioTrackERNS_17AudioTrackPrivateE(); +int APS5_VABI _ZN7WebCore11MediaPlayer13prepareToPlayEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer13tracksChangedEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer13volumeChangedEd(); +int APS5_VABI _ZN7WebCore11MediaPlayer15clearMediaCacheERKN3WTF6StringENS1_8WallTimeE(); +int APS5_VABI _ZN7WebCore11MediaPlayer15durationChangedEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer15nextMediaEngineEPKNS_18MediaPlayerFactoryE(); +int APS5_VABI _ZN7WebCore11MediaPlayer15removeTextTrackERNS_22InbandTextTrackPrivateE(); +int APS5_VABI _ZN7WebCore11MediaPlayer16removeAudioTrackERNS_17AudioTrackPrivateE(); +int APS5_VABI _ZN7WebCore11MediaPlayer16removeVideoTrackERNS_17VideoTrackPrivateE(); +int APS5_VABI _ZN7WebCore11MediaPlayer17readyStateChangedEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer17resetMediaEnginesEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer17seekWithToleranceERKN3WTF9MediaTimeES4_S4_(); +int APS5_VABI _ZN7WebCore11MediaPlayer17setPreservesPitchEb(); +int APS5_VABI _ZN7WebCore11MediaPlayer17supportsKeySystemERKN3WTF6StringES4_(); +int APS5_VABI _ZN7WebCore11MediaPlayer18liveUpdateIntervalEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer18mediaEngineUpdatedEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer19networkStateChangedEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer19nextBestMediaEngineEPKNS_18MediaPlayerFactoryE(); +int APS5_VABI _ZN7WebCore11MediaPlayer19originsInMediaCacheERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore11MediaPlayer19prepareForRenderingEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer19syncTextTrackBoundsEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer20cachedResourceLoaderEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer20createResourceLoaderEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer20playbackStateChangedEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer20resourceNotSupportedEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer21characteristicChangedEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer21endSimulatedHDCPErrorEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer21setShouldDisableSleepEb(); +int APS5_VABI _ZN7WebCore11MediaPlayer22performTaskAtMediaTimeEON3WTF8FunctionIFvvEEERKNS1_9MediaTimeE(); +int APS5_VABI _ZN7WebCore11MediaPlayer22setPrivateBrowsingModeEb(); +int APS5_VABI _ZN7WebCore11MediaPlayer23beginSimulatedHDCPErrorEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer23loadWithNextMediaEngineEPKNS_18MediaPlayerFactoryE(); +int APS5_VABI _ZN7WebCore11MediaPlayer24firstVideoFrameAvailableEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer24remoteEngineFailedToLoadEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer24setClosedCaptionsVisibleEb(); +int APS5_VABI _ZN7WebCore11MediaPlayer25bufferedTimeRangesChangedEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer25nativeImageForCurrentTimeEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer25seekableTimeRangesChangedEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer25shouldIgnoreIntrinsicSizeEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer26activeSourceBuffersChangedEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer26applicationDidBecomeActiveEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer26setTextTrackRepresentationEPNS_23TextTrackRepresentationE(); +int APS5_VABI _ZN7WebCore11MediaPlayer27applicationWillResignActiveEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer28setPreferredDynamicRangeModeENS_16DynamicRangeModeE(); +int APS5_VABI _ZN7WebCore11MediaPlayer28setShouldMaintainAspectRatioEb(); +int APS5_VABI _ZN7WebCore11MediaPlayer29acceleratedCompositingEnabledEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer32acceleratedRenderingStateChangedEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer34seekableTimeRangesLastModifiedTimeEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer4playEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer4seekERKN3WTF9MediaTimeE(); +int APS5_VABI _ZN7WebCore11MediaPlayer5paintERNS_15GraphicsContextERKNS_9FloatRectE(); +int APS5_VABI _ZN7WebCore11MediaPlayer5pauseEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer6createERNS_17MediaPlayerClientE(); +int APS5_VABI _ZN7WebCore11MediaPlayer7repaintEv(); +int APS5_VABI _ZN7WebCore11MediaPlayer7setRateEd(); +int APS5_VABI _ZN7WebCore11MediaPlayer8setMutedEb(); +int APS5_VABI _ZN7WebCore11MediaPlayer9setVolumeEd(); +int APS5_VABI _ZN7WebCore11MediaPlayerC1ERNS_17MediaPlayerClientE(); +int APS5_VABI _ZN7WebCore11MediaPlayerC2ERNS_17MediaPlayerClientE(); +int APS5_VABI _ZN7WebCore11MediaPlayerD1Ev(); +int APS5_VABI _ZN7WebCore11MediaPlayerD2Ev(); +int APS5_VABI _ZN7WebCore11MediaPlayerdaEPv(); +int APS5_VABI _ZN7WebCore11MediaPlayerdlEPv(); +int APS5_VABI _ZN7WebCore11MediaPlayernaEmPv(); +int APS5_VABI _ZN7WebCore11MediaPlayernaEm(); +int APS5_VABI _ZN7WebCore11MediaPlayernwEm10NotNullTagPv(); +int APS5_VABI _ZN7WebCore11MediaPlayernwEm(); +int APS5_VABI _ZN7WebCore11MediaPlayernwEmPv(); +int APS5_VABI _ZN7WebCore11MemoryCache11setDisabledEb(); +int APS5_VABI _ZN7WebCore11MemoryCache13getStatisticsEv(); +int APS5_VABI _ZN7WebCore11MemoryCache13setCapacitiesEjjj(); +int APS5_VABI _ZN7WebCore11MemoryCache14evictResourcesEN3PAL9SessionIDE(); +int APS5_VABI _ZN7WebCore11MemoryCache14evictResourcesEv(); +int APS5_VABI _ZN7WebCore11MemoryCache18pruneDeadResourcesEv(); +int APS5_VABI _ZN7WebCore11MemoryCache18pruneLiveResourcesEb(); +int APS5_VABI _ZN7WebCore11MemoryCache18resourceForRequestERKNS_15ResourceRequestEN3PAL9SessionIDE(); +int APS5_VABI _ZN7WebCore11MemoryCache24pruneDeadResourcesToSizeEj(); +int APS5_VABI _ZN7WebCore11MemoryCache24pruneLiveResourcesToSizeEjb(); +int APS5_VABI _ZN7WebCore11MemoryCache30destroyDecodedDataForAllImagesEv(); +int APS5_VABI _ZN7WebCore11MemoryCache9singletonEv(); +int APS5_VABI _ZN7WebCore11MessagePort16messageAvailableEv(); +int APS5_VABI _ZN7WebCore11MessagePort22notifyMessageAvailableERKNS_21MessagePortIdentifierE(); +int APS5_VABI _ZN7WebCore11PageOverlay15setNeedsDisplayERKNS_7IntRectE(); +int APS5_VABI _ZN7WebCore11PageOverlay15setNeedsDisplayEv(); +int APS5_VABI _ZN7WebCore11PageOverlay20stopFadeOutAnimationEv(); +int APS5_VABI _ZN7WebCore11PageOverlay5clearEv(); +int APS5_VABI _ZN7WebCore11PageOverlay5layerEv(); +int APS5_VABI _ZN7WebCore11PageOverlay8setFrameENS_7IntRectE(); +int APS5_VABI _ZN7WebCore11PageOverlayD1Ev(); +int APS5_VABI _ZN7WebCore11PageOverlayD2Ev(); +int APS5_VABI _ZN7WebCore11RenderLayer21simulateFrequentPaintEv(); +int APS5_VABI _ZN7WebCore11RenderStyleD1Ev(); +int APS5_VABI _ZN7WebCore11RenderStyleD2Ev(); +int APS5_VABI _ZN7WebCore11RenderTheme9singletonEv(); +int APS5_VABI _ZN7WebCore11SimpleRangeC1EONS_13BoundaryPointES2_(); +int APS5_VABI _ZN7WebCore11SimpleRangeC1ERKNS_13BoundaryPointES3_(); +int APS5_VABI _ZN7WebCore11SimpleRangeC2EONS_13BoundaryPointES2_(); +int APS5_VABI _ZN7WebCore11SimpleRangeC2ERKNS_13BoundaryPointES3_(); +int APS5_VABI _ZN7WebCore11WindowProxy12globalObjectERNS_15DOMWrapperWorldE(); +int APS5_VABI _ZN7WebCore11WindowProxy22releaseJSWindowProxiesEv(); +int APS5_VABI _ZN7WebCore11WindowProxy40createJSWindowProxyWithInitializedScriptERNS_15DOMWrapperWorldE(); +int APS5_VABI _ZN7WebCore11WindowProxyD1Ev(); +int APS5_VABI _ZN7WebCore11WindowProxyD2Ev(); +int APS5_VABI _ZN7WebCore11XPathResult11iterateNextEv(); +int APS5_VABI _ZN7WebCore11XPathResult12snapshotItemEj(); +int APS5_VABI _ZN7WebCore11XPathResultD1Ev(); +int APS5_VABI _ZN7WebCore11XPathResultD2Ev(); +int APS5_VABI _ZN7WebCore11iBeamCursorEv(); +int APS5_VABI _ZN7WebCore11isEndOfLineERKNS_15VisiblePositionE(); +int APS5_VABI _ZN7WebCore11prefetchDNSERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore11startOfLineERKNS_15VisiblePositionE(); +int APS5_VABI _ZN7WebCore11startOfWordERKNS_15VisiblePositionENS_9EWordSideE(); +int APS5_VABI _ZN7WebCore12BlobRegistry16blobRegistryImplEv(); +int APS5_VABI _ZN7WebCore12BlobRegistryC2ERKS0_(); +int APS5_VABI _ZN7WebCore12BlobRegistryC2Ev(); +int APS5_VABI _ZN7WebCore12BlobRegistryD0Ev(); +int APS5_VABI _ZN7WebCore12BlobRegistryD1Ev(); +int APS5_VABI _ZN7WebCore12BlobRegistryD2Ev(); +int APS5_VABI _ZN7WebCore12CSSStyleRule15setSelectorTextERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore12CSSStyleRule5styleEv(); +int APS5_VABI _ZN7WebCore12CryptoKeyAES9importRawENS_25CryptoAlgorithmIdentifierEON3WTF6VectorIhLm0ENS2_15CrashOnOverflowELm16ENS2_10FastMallocEEEbi(); +int APS5_VABI _ZN7WebCore12DOMException11descriptionENS_13ExceptionCodeE(); +int APS5_VABI _ZN7WebCore12DOMTokenList6tokensEv(); +int APS5_VABI _ZN7WebCore12DataTransferD1Ev(); +int APS5_VABI _ZN7WebCore12DataTransferD2Ev(); +int APS5_VABI _ZN7WebCore12EditingStyle21styleAtSelectionStartERKNS_16VisibleSelectionEb(); +int APS5_VABI _ZN7WebCore12EditingStyle8hasStyleENS_13CSSPropertyIDERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore12EditingStyleC1EPKNS_19CSSStyleDeclarationE(); +int APS5_VABI _ZN7WebCore12EditingStyleC2EPKNS_19CSSStyleDeclarationE(); +int APS5_VABI _ZN7WebCore12EditingStyleD1Ev(); +int APS5_VABI _ZN7WebCore12EditingStyleD2Ev(); +int APS5_VABI _ZN7WebCore12EventHandler10mouseMovedERKNS_18PlatformMouseEventE(); +int APS5_VABI _ZN7WebCore12EventHandler14scrollOverflowENS_15ScrollDirectionENS_17ScrollGranularityEPNS_4NodeE(); +int APS5_VABI _ZN7WebCore12EventHandler15handleAccessKeyERKNS_21PlatformKeyboardEventE(); +int APS5_VABI _ZN7WebCore12EventHandler17scrollRecursivelyENS_15ScrollDirectionENS_17ScrollGranularityEPNS_4NodeE(); +int APS5_VABI _ZN7WebCore12EventHandler18accessKeyModifiersEv(); +int APS5_VABI _ZN7WebCore12EventHandler20sendContextMenuEventERKNS_18PlatformMouseEventE(); +int APS5_VABI _ZN7WebCore12EventHandler21handleMousePressEventERKNS_18PlatformMouseEventE(); +int APS5_VABI _ZN7WebCore12EventHandler21handleMousePressEventERKNS_28MouseEventWithHitTestResultsE(); +int APS5_VABI _ZN7WebCore12EventHandler23handleMouseReleaseEventERKNS_18PlatformMouseEventE(); +int APS5_VABI _ZN7WebCore12EventHandler23handleMouseReleaseEventERKNS_28MouseEventWithHitTestResultsE(); +int APS5_VABI _ZN7WebCore12EventHandler23setImmediateActionStageENS_20ImmediateActionStageE(); +int APS5_VABI _ZN7WebCore12EventHandler24logicalScrollRecursivelyENS_22ScrollLogicalDirectionENS_17ScrollGranularityEPNS_4NodeE(); +int APS5_VABI _ZN7WebCore12EventHandler26sendContextMenuEventForKeyEv(); +int APS5_VABI _ZN7WebCore12EventHandler30dispatchFakeMouseMoveEventSoonEv(); +int APS5_VABI _ZN7WebCore12EventHandler30setCapturingMouseEventsElementEPNS_7ElementE(); +int APS5_VABI _ZN7WebCore12EventHandler31passMouseMovedEventToScrollbarsERKNS_18PlatformMouseEventE(); +int APS5_VABI _ZN7WebCore12EventHandler40selectionExtentRespectingEditingBoundaryERKNS_16VisibleSelectionERKNS_11LayoutPointEPNS_4NodeE(); +int APS5_VABI _ZN7WebCore12EventHandler47handleKeyboardSelectionMovementForAccessibilityERNS_13KeyboardEventE(); +int APS5_VABI _ZN7WebCore12EventHandler8keyEventERKNS_21PlatformKeyboardEventE(); +int APS5_VABI _ZN7WebCore12GCController13deleteAllCodeEN3JSC19DeleteAllCodeEffortE(); +int APS5_VABI _ZN7WebCore12GCController17garbageCollectNowEv(); +int APS5_VABI _ZN7WebCore12GCController18garbageCollectSoonEv(); +int APS5_VABI _ZN7WebCore12GCController19deleteAllLinkedCodeEN3JSC19DeleteAllCodeEffortE(); +int APS5_VABI _ZN7WebCore12GCController34garbageCollectNowIfNotDoneRecentlyEv(); +int APS5_VABI _ZN7WebCore12GCController41setJavaScriptGarbageCollectorTimerEnabledEb(); +int APS5_VABI _ZN7WebCore12GCController43garbageCollectOnAlternateThreadForDebuggingEb(); +int APS5_VABI _ZN7WebCore12GCController9singletonEv(); +int APS5_VABI _ZN7WebCore12GridPosition15setSpanPositionEiRKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore12GridPosition19setExplicitPositionEiRKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore12GridPosition24setMaxPositionForTestingEj(); +int APS5_VABI _ZN7WebCore12HTMLDocument5widthEv(); +int APS5_VABI _ZN7WebCore12HTMLDocument6heightEv(); +int APS5_VABI _ZN7WebCore12ISOWebVTTCue5parseERN3JSC8DataViewERj(); +int APS5_VABI _ZN7WebCore12ISOWebVTTCueD0Ev(); +int APS5_VABI _ZN7WebCore12ISOWebVTTCueD1Ev(); +int APS5_VABI _ZN7WebCore12ISOWebVTTCueD2Ev(); +int APS5_VABI _ZN7WebCore12JSAudioTrack14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore12JSAudioTrack15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore12JSAudioTrack15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore12JSAudioTrack15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore12JSAudioTrack4infoEv(); +int APS5_VABI _ZN7WebCore12JSAudioTrack9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore12JSAudioTrack9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore12JSAudioTrackD1Ev(); +int APS5_VABI _ZN7WebCore12JSAudioTrackD2Ev(); +int APS5_VABI _ZN7WebCore12JSAudioTrackaSERKS0_(); +int APS5_VABI _ZN7WebCore12JSStyleSheet9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore12JSTimeRanges14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore12JSTimeRanges15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore12JSTimeRanges15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore12JSTimeRanges15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore12JSTimeRanges4infoEv(); +int APS5_VABI _ZN7WebCore12JSTimeRanges9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore12JSTimeRanges9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore12JSTimeRangesC1ERKS0_(); +int APS5_VABI _ZN7WebCore12JSTimeRangesC2ERKS0_(); +int APS5_VABI _ZN7WebCore12JSTimeRangesD1Ev(); +int APS5_VABI _ZN7WebCore12JSTimeRangesD2Ev(); +int APS5_VABI _ZN7WebCore12JSTimeRangesaSERKS0_(); +int APS5_VABI _ZN7WebCore12JSTreeWalker9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore12NamedNodeMap12setNamedItemERNS_4AttrE(); +int APS5_VABI _ZN7WebCore12NamedNodeMap15removeNamedItemERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore12NamedNodeMap17removeNamedItemNSERKN3WTF10AtomStringES4_(); +int APS5_VABI _ZN7WebCore12NamedNodeMap3refEv(); +int APS5_VABI _ZN7WebCore12NamedNodeMap5derefEv(); +int APS5_VABI _ZN7WebCore12NodeIterator12previousNodeEv(); +int APS5_VABI _ZN7WebCore12NodeIterator8nextNodeEv(); +int APS5_VABI _ZN7WebCore12NodeIteratorD1Ev(); +int APS5_VABI _ZN7WebCore12NodeIteratorD2Ev(); +int APS5_VABI _ZN7WebCore12PrintContext16computePageRectsERKNS_9FloatRectEfffRfb(); +int APS5_VABI _ZN7WebCore12PrintContext16computedPageSizeENS_9FloatSizeENS_9RectEdgesIfEE(); +int APS5_VABI _ZN7WebCore12PrintContext18computedPageMarginENS_9RectEdgesIfEE(); +int APS5_VABI _ZN7WebCore12PrintContext20pageNumberForElementEPNS_7ElementERKNS_9FloatSizeE(); +int APS5_VABI _ZN7WebCore12PrintContext27computeAutomaticScaleFactorERKNS_9FloatSizeE(); +int APS5_VABI _ZN7WebCore12PrintContext28computePageRectsWithPageSizeERKNS_9FloatSizeEb(); +int APS5_VABI _ZN7WebCore12PrintContext3endEv(); +int APS5_VABI _ZN7WebCore12PrintContext5beginEff(); +int APS5_VABI _ZN7WebCore12PrintContext9spoolPageERNS_15GraphicsContextEif(); +int APS5_VABI _ZN7WebCore12PrintContext9spoolRectERNS_15GraphicsContextERKNS_7IntRectE(); +int APS5_VABI _ZN7WebCore12PrintContextD0Ev(); +int APS5_VABI _ZN7WebCore12PrintContextD1Ev(); +int APS5_VABI _ZN7WebCore12PrintContextD2Ev(); +int APS5_VABI _ZN7WebCore12RenderObject16paintingRootRectERNS_10LayoutRectE(); +int APS5_VABI _ZN7WebCore12SettingsBase26setMinimumDOMTimerIntervalEN3WTF7SecondsE(); +int APS5_VABI _ZN7WebCore12SettingsBase33platformDefaultMediaSourceEnabledEv(); +int APS5_VABI _ZN7WebCore12SettingsBase44setMediaContentTypesRequiringHardwareSupportERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore12SettingsBase44setMediaContentTypesRequiringHardwareSupportERKN3WTF6VectorINS_11ContentTypeELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE(); +int APS5_VABI _ZN7WebCore12SharedBufferC1EON3WTF14FileSystemImpl14MappedFileDataE(); +int APS5_VABI _ZN7WebCore12SharedBufferC1Ev(); +int APS5_VABI _ZN7WebCore12SharedBufferC2EON3WTF14FileSystemImpl14MappedFileDataE(); +int APS5_VABI _ZN7WebCore12SharedBufferC2Ev(); +int APS5_VABI _ZN7WebCore12SourceBuffer30setMaximumQueueDepthForTrackIDERKN3WTF10AtomStringEm(); +int APS5_VABI _ZN7WebCore12SourceBuffer41minimumUpcomingPresentationTimeForTrackIDERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore12TextIterator7advanceEv(); +int APS5_VABI _ZN7WebCore12TextIteratorD1Ev(); +int APS5_VABI _ZN7WebCore12TextIteratorD2Ev(); +int APS5_VABI _ZN7WebCore12WebAnimation9instancesEv(); +int APS5_VABI _ZN7WebCore12WorkerThread17workerThreadCountEv(); +int APS5_VABI _ZN7WebCore12blobRegistryEv(); +int APS5_VABI _ZN7WebCore12commonVMSlowEv(); +int APS5_VABI _ZN7WebCore13AXObjectCache10rootObjectEv(); +int APS5_VABI _ZN7WebCore13AXObjectCache11getOrCreateEPNS_4NodeE(); +int APS5_VABI _ZN7WebCore13AXObjectCache19enableAccessibilityEv(); +int APS5_VABI _ZN7WebCore13AXObjectCache20disableAccessibilityEv(); +int APS5_VABI _ZN7WebCore13AXObjectCache37setEnhancedUserInterfaceAccessibilityEb(); +int APS5_VABI _ZN7WebCore13CSSStyleSheet10deleteRuleEj(); +int APS5_VABI _ZN7WebCore13CSSStyleSheet10insertRuleERKN3WTF6StringEj(); +int APS5_VABI _ZN7WebCore13CSSStyleSheet8cssRulesEv(); +int APS5_VABI _ZN7WebCore13CharacterData10appendDataERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore13CharacterData10deleteDataEjj(); +int APS5_VABI _ZN7WebCore13CharacterData10insertDataEjRKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore13CharacterData11replaceDataEjjRKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore13CharacterData13substringDataEjj(); +int APS5_VABI _ZN7WebCore13CharacterData7setDataERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore13ContainerNode11appendChildERNS_4NodeE(); +int APS5_VABI _ZN7WebCore13ContainerNode11removeChildERNS_4NodeE(); +int APS5_VABI _ZN7WebCore13ContainerNode13querySelectorERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore13ContainerNode16querySelectorAllERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore13ContainerNode20getElementsByTagNameERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore13ContainerNode22getElementsByClassNameERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore13ContainerNode22getElementsByTagNameNSERKN3WTF10AtomStringES4_(); +int APS5_VABI _ZN7WebCore13ContainerNode8childrenEv(); +int APS5_VABI _ZN7WebCore13GraphicsLayer11clearClientEv(); +int APS5_VABI _ZN7WebCore13GraphicsLayer12setZPositionEf(); +int APS5_VABI _ZN7WebCore13GraphicsLayer15willBeDestroyedEv(); +int APS5_VABI _ZN7WebCore13GraphicsLayer16removeFromParentEv(); +int APS5_VABI _ZN7WebCore13GraphicsLayer16resumeAnimationsEv(); +int APS5_VABI _ZN7WebCore13GraphicsLayer17removeAllChildrenEv(); +int APS5_VABI _ZN7WebCore13GraphicsLayer17suspendAnimationsEN3WTF13MonotonicTimeE(); +int APS5_VABI _ZN7WebCore13GraphicsLayer18setBackgroundColorERKNS_5ColorE(); +int APS5_VABI _ZN7WebCore13GraphicsLayer54noteDeviceOrPageScaleFactorChangedIncludingDescendantsEv(); +int APS5_VABI _ZN7WebCore13GraphicsLayer6createEPNS_20GraphicsLayerFactoryERNS_19GraphicsLayerClientENS0_4TypeE(); +int APS5_VABI _ZN7WebCore13GraphicsLayer7setSizeERKNS_9FloatSizeE(); +int APS5_VABI _ZN7WebCore13GraphicsLayer9setClientERNS_19GraphicsLayerClientE(); +int APS5_VABI _ZN7WebCore13GraphicsLayerC2ENS0_4TypeERNS_19GraphicsLayerClientE(); +int APS5_VABI _ZN7WebCore13GraphicsLayerD0Ev(); +int APS5_VABI _ZN7WebCore13GraphicsLayerD1Ev(); +int APS5_VABI _ZN7WebCore13GraphicsLayerD2Ev(); +int APS5_VABI _ZN7WebCore13HTTPHeaderMap3setERKN3WTF6StringES4_(); +int APS5_VABI _ZN7WebCore13HTTPHeaderMap6appendERKN3WTF6StringES4_(); +int APS5_VABI _ZN7WebCore13HTTPHeaderMap6removeENS_14HTTPHeaderNameE(); +int APS5_VABI _ZN7WebCore13HTTPHeaderMap6removeERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore13HTTPHeaderMapC1Ev(); +int APS5_VABI _ZN7WebCore13HTTPHeaderMapC2Ev(); +int APS5_VABI _ZN7WebCore13HitTestResult12setInnerNodeEPNS_4NodeE(); +int APS5_VABI _ZN7WebCore13HitTestResultC1ERKNS_10LayoutRectE(); +int APS5_VABI _ZN7WebCore13HitTestResultC1ERKNS_11LayoutPointE(); +int APS5_VABI _ZN7WebCore13HitTestResultC1ERKNS_15HitTestLocationE(); +int APS5_VABI _ZN7WebCore13HitTestResultC1ERKS0_(); +int APS5_VABI _ZN7WebCore13HitTestResultC1Ev(); +int APS5_VABI _ZN7WebCore13HitTestResultC2ERKNS_10LayoutRectE(); +int APS5_VABI _ZN7WebCore13HitTestResultC2ERKNS_11LayoutPointE(); +int APS5_VABI _ZN7WebCore13HitTestResultC2ERKNS_15HitTestLocationE(); +int APS5_VABI _ZN7WebCore13HitTestResultC2ERKS0_(); +int APS5_VABI _ZN7WebCore13HitTestResultC2Ev(); +int APS5_VABI _ZN7WebCore13HitTestResultD1Ev(); +int APS5_VABI _ZN7WebCore13HitTestResultD2Ev(); +int APS5_VABI _ZN7WebCore13HitTestResultaSERKS0_(); +int APS5_VABI _ZN7WebCore13IdentifierRep3getEPKc(); +int APS5_VABI _ZN7WebCore13IdentifierRep3getEi(); +int APS5_VABI _ZN7WebCore13IdentifierRep7isValidEPS0_(); +int APS5_VABI _ZN7WebCore13JSCSSRuleList9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore13JSDOMRectList14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore13JSDOMRectList15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore13JSDOMRectList15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore13JSDOMRectList15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore13JSDOMRectList4infoEv(); +int APS5_VABI _ZN7WebCore13JSDOMRectList9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore13JSDOMRectList9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore13JSDOMRectListC1ERKS0_(); +int APS5_VABI _ZN7WebCore13JSDOMRectListC2ERKS0_(); +int APS5_VABI _ZN7WebCore13JSDOMRectListD1Ev(); +int APS5_VABI _ZN7WebCore13JSDOMRectListD2Ev(); +int APS5_VABI _ZN7WebCore13JSDOMRectListaSERKS0_(); +int APS5_VABI _ZN7WebCore13JSHTMLElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore13JSHTMLElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore13JSHTMLElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore13JSHTMLElement15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore13JSHTMLElement4infoEv(); +int APS5_VABI _ZN7WebCore13JSHTMLElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore13JSHTMLElement9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore13JSHTMLElementC1ERKS0_(); +int APS5_VABI _ZN7WebCore13JSHTMLElementC2ERKS0_(); +int APS5_VABI _ZN7WebCore13JSHTMLElementD1Ev(); +int APS5_VABI _ZN7WebCore13JSHTMLElementD2Ev(); +int APS5_VABI _ZN7WebCore13JSWindowProxy9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore13JSXPathResult9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore13MIMETypeCache13canDecodeTypeERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore13MIMETypeCache14supportedTypesEv(); +int APS5_VABI _ZN7WebCore13MIMETypeCache17addSupportedTypesERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE(); +int APS5_VABI _ZN7WebCore13MIMETypeCache21canDecodeExtendedTypeERKNS_11ContentTypeE(); +int APS5_VABI _ZN7WebCore13MIMETypeCache21supportsContainerTypeERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore13MIMETypeCache26isUnsupportedContainerTypeERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore13MIMETypeCacheC1ERKS0_(); +int APS5_VABI _ZN7WebCore13MIMETypeCacheC1Ev(); +int APS5_VABI _ZN7WebCore13MIMETypeCacheC2ERKS0_(); +int APS5_VABI _ZN7WebCore13MIMETypeCacheC2Ev(); +int APS5_VABI _ZN7WebCore13MIMETypeCacheD0Ev(); +int APS5_VABI _ZN7WebCore13MIMETypeCacheD1Ev(); +int APS5_VABI _ZN7WebCore13MIMETypeCacheD2Ev(); +int APS5_VABI _ZN7WebCore13MIMETypeCacheaSERKS0_(); +int APS5_VABI _ZN7WebCore13MIMETypeCachedaEPv(); +int APS5_VABI _ZN7WebCore13MIMETypeCachedlEPv(); +int APS5_VABI _ZN7WebCore13MIMETypeCachenaEmPv(); +int APS5_VABI _ZN7WebCore13MIMETypeCachenaEm(); +int APS5_VABI _ZN7WebCore13MIMETypeCachenwEm(); +int APS5_VABI _ZN7WebCore13MIMETypeCachenwEmPv(); +int APS5_VABI _ZN7WebCore13MediaStrategyC1ERKS0_(); +int APS5_VABI _ZN7WebCore13MediaStrategyC1Ev(); +int APS5_VABI _ZN7WebCore13MediaStrategyC2ERKS0_(); +int APS5_VABI _ZN7WebCore13MediaStrategyC2Ev(); +int APS5_VABI _ZN7WebCore13MediaStrategyD0Ev(); +int APS5_VABI _ZN7WebCore13MediaStrategyD1Ev(); +int APS5_VABI _ZN7WebCore13MediaStrategyD2Ev(); +int APS5_VABI _ZN7WebCore13MutationEvent17initMutationEventERKN3WTF10AtomStringEbbPNS_4NodeERKNS1_6StringES9_S9_t(); +int APS5_VABI _ZN7WebCore13NodeTraversal13deepLastChildERNS_4NodeE(); +int APS5_VABI _ZN7WebCore13NodeTraversal19nextAncestorSiblingERKNS_4NodeE(); +int APS5_VABI _ZN7WebCore13NodeTraversal19nextAncestorSiblingERKNS_4NodeEPS2_(); +int APS5_VABI _ZN7WebCore13NodeTraversal4lastERKNS_13ContainerNodeE(); +int APS5_VABI _ZN7WebCore13OverflowEvent17initOverflowEventEtbb(); +int APS5_VABI _ZN7WebCore13PathUtilities26pathWithShrinkWrappedRectsERKN3WTF6VectorINS_9FloatRectELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEEf(); +int APS5_VABI _ZN7WebCore13PathUtilities27pathsWithShrinkWrappedRectsERKN3WTF6VectorINS_9FloatRectELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEEf(); +int APS5_VABI _ZN7WebCore13QualifiedName17QualifiedNameImplD1Ev(); +int APS5_VABI _ZN7WebCore13QualifiedName17QualifiedNameImplD2Ev(); +int APS5_VABI _ZN7WebCore13QualifiedName4initEv(); +int APS5_VABI _ZN7WebCore13QualifiedNameC1ERKN3WTF10AtomStringES4_S4_(); +int APS5_VABI _ZN7WebCore13QualifiedNameC2ERKN3WTF10AtomStringES4_S4_(); +int APS5_VABI _ZN7WebCore13SleepDisablerD1Ev(); +int APS5_VABI _ZN7WebCore13SleepDisablerD2Ev(); +int APS5_VABI _ZN7WebCore13StyledElement10cssomStyleEv(); +int APS5_VABI _ZN7WebCore13StyledElement22setInlineStylePropertyENS_13CSSPropertyIDEdNS_11CSSUnitTypeEb(); +int APS5_VABI _ZN7WebCore13TextIndicator15createWithRangeERKNS_11SimpleRangeEN3WTF9OptionSetINS_19TextIndicatorOptionEEENS_35TextIndicatorPresentationTransitionENS_9FloatSizeE(); +int APS5_VABI _ZN7WebCore13TextIndicator6createERKNS_17TextIndicatorDataE(); +int APS5_VABI _ZN7WebCore13TextIndicatorD1Ev(); +int APS5_VABI _ZN7WebCore13TextIndicatorD2Ev(); +int APS5_VABI _ZN7WebCore13displayStringERKN3WTF6StringEPKNS_4NodeE(); +int APS5_VABI _ZN7WebCore13enclosingListEPNS_4NodeE(); +int APS5_VABI _ZN7WebCore13endOfDocumentEPKNS_4NodeE(); +int APS5_VABI _ZN7WebCore13endOfDocumentERKNS_15VisiblePositionE(); +int APS5_VABI _ZN7WebCore13endOfSentenceERKNS_15VisiblePositionE(); +int APS5_VABI _ZN7WebCore13getLogChannelERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore13internalErrorERKN3WTF3URLE(); +int APS5_VABI _ZN7WebCore13isStartOfLineERKNS_15VisiblePositionE(); +int APS5_VABI _ZN7WebCore13pointerCursorEv(); +int APS5_VABI _ZN7WebCore13releaseMemoryEN3WTF8CriticalENS0_11SynchronousENS_24MaintainBackForwardCacheENS_19MaintainMemoryCacheE(); +int APS5_VABI _ZN7WebCore14CachedResource12removeClientERNS_20CachedResourceClientE(); +int APS5_VABI _ZN7WebCore14CachedResource16unregisterHandleEPNS_24CachedResourceHandleBaseE(); +int APS5_VABI _ZN7WebCore14CachedResource9addClientERNS_20CachedResourceClientE(); +int APS5_VABI _ZN7WebCore14CredentialBase7compareERKNS_10CredentialES3_(); +int APS5_VABI _ZN7WebCore14CredentialBaseC1ERKN3WTF6StringES4_NS_21CredentialPersistenceE(); +int APS5_VABI _ZN7WebCore14CredentialBaseC1Ev(); +int APS5_VABI _ZN7WebCore14CredentialBaseC2ERKN3WTF6StringES4_NS_21CredentialPersistenceE(); +int APS5_VABI _ZN7WebCore14CredentialBaseC2Ev(); +int APS5_VABI _ZN7WebCore14DOMCacheEngine15queryCacheMatchERKNS_15ResourceRequestES3_RKNS_16ResourceResponseERKNS_17CacheQueryOptionsE(); +int APS5_VABI _ZN7WebCore14DocumentLoader13attachToFrameEv(); +int APS5_VABI _ZN7WebCore14DocumentLoader14notifyFinishedERNS_14CachedResourceERKNS_18NetworkLoadMetricsE(); +int APS5_VABI _ZN7WebCore14DocumentLoader15detachFromFrameEv(); +int APS5_VABI _ZN7WebCore14DocumentLoader16redirectReceivedERNS_14CachedResourceEONS_15ResourceRequestERKNS_16ResourceResponseEON3WTF17CompletionHandlerIFvS4_EEE(); +int APS5_VABI _ZN7WebCore14DocumentLoader16responseReceivedERNS_14CachedResourceERKNS_16ResourceResponseEON3WTF17CompletionHandlerIFvvEEE(); +int APS5_VABI _ZN7WebCore14DocumentLoader17addConsoleMessageEN3JSC13MessageSourceENS1_12MessageLevelERKN3WTF6StringEm(); +int APS5_VABI _ZN7WebCore14DocumentLoader21setCustomHeaderFieldsEON3WTF6VectorINS_18CustomHeaderFieldsELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE(); +int APS5_VABI _ZN7WebCore14DocumentLoader22cancelMainResourceLoadERKNS_13ResourceErrorE(); +int APS5_VABI _ZN7WebCore14DocumentLoader23applyPoliciesToSettingsEv(); +int APS5_VABI _ZN7WebCore14DocumentLoader8setTitleERKNS_19StringWithDirectionE(); +int APS5_VABI _ZN7WebCore14DocumentLoaderC1ERKNS_15ResourceRequestERKNS_14SubstituteDataE(); +int APS5_VABI _ZN7WebCore14DocumentLoaderC2ERKNS_15ResourceRequestERKNS_14SubstituteDataE(); +int APS5_VABI _ZN7WebCore14DocumentLoaderD0Ev(); +int APS5_VABI _ZN7WebCore14DocumentLoaderD1Ev(); +int APS5_VABI _ZN7WebCore14DocumentLoaderD2Ev(); +int APS5_VABI _ZN7WebCore14DocumentWriter3endEv(); +int APS5_VABI _ZN7WebCore14FrameSelection12setSelectionERKNS_16VisibleSelectionEN3WTF9OptionSetINS0_18SetSelectionOptionEEENS_23AXTextStateChangeIntentENS0_19CursorAlignOnScrollENS_15TextGranularityE(); +int APS5_VABI _ZN7WebCore14FrameSelection16updateAppearanceEv(); +int APS5_VABI _ZN7WebCore14FrameSelection19absoluteCaretBoundsEPb(); +int APS5_VABI _ZN7WebCore14FrameSelection20setSelectionFromNoneEv(); +int APS5_VABI _ZN7WebCore14FrameSelection5clearEv(); +int APS5_VABI _ZN7WebCore14FrameSelection9selectAllEv(); +int APS5_VABI _ZN7WebCore14FrameSelectionC1EPNS_8DocumentE(); +int APS5_VABI _ZN7WebCore14FrameSelectionC2EPNS_8DocumentE(); +int APS5_VABI _ZN7WebCore14HTMLMapElement5areasEv(); +int APS5_VABI _ZN7WebCore14JSNamedNodeMap9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore14JSNodeIterator9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore14JSSourceBuffer14finishCreationERN3JSC2VME(); +int APS5_VABI _ZN7WebCore14JSSourceBuffer14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore14JSSourceBuffer15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore14JSSourceBuffer15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore14JSSourceBuffer15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore14JSSourceBuffer9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore14JSSourceBuffer9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore14JSVoidCallback11handleEventEv(); +int APS5_VABI _ZN7WebCore14JSVoidCallback12callbackDataEv(); +int APS5_VABI _ZN7WebCore14JSVoidCallback6createEPN3JSC8JSObjectEPNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore14JSVoidCallbackC1EPN3JSC8JSObjectEPNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore14JSVoidCallbackC2EPN3JSC8JSObjectEPNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore14JSVoidCallbackD0Ev(); +int APS5_VABI _ZN7WebCore14JSVoidCallbackD1Ev(); +int APS5_VABI _ZN7WebCore14JSVoidCallbackD2Ev(); +int APS5_VABI _ZN7WebCore14JSWebAnimation14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore14JSWebAnimation15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore14JSWebAnimation15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore14JSWebAnimation15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore14JSWebAnimation4infoEv(); +int APS5_VABI _ZN7WebCore14JSWebAnimation9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore14JSWebAnimation9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore14JSWebAnimationC1ERKS0_(); +int APS5_VABI _ZN7WebCore14JSWebAnimationC2ERKS0_(); +int APS5_VABI _ZN7WebCore14JSWebAnimationD1Ev(); +int APS5_VABI _ZN7WebCore14JSWebAnimationD2Ev(); +int APS5_VABI _ZN7WebCore14LoaderStrategyC2ERKS0_(); +int APS5_VABI _ZN7WebCore14LoaderStrategyC2Ev(); +int APS5_VABI _ZN7WebCore14LoaderStrategyD0Ev(); +int APS5_VABI _ZN7WebCore14LoaderStrategyD1Ev(); +int APS5_VABI _ZN7WebCore14LoaderStrategyD2Ev(); +int APS5_VABI _ZN7WebCore14LoggedInStatus13setTimeToLiveEN3WTF7SecondsE(); +int APS5_VABI _ZN7WebCore14LoggedInStatus6createERKNS_17RegistrableDomainERKN3WTF6StringENS0_19CredentialTokenTypeENS0_18AuthenticationTypeE(); +int APS5_VABI _ZN7WebCore14LoggedInStatus6createERKNS_17RegistrableDomainERKN3WTF6StringENS0_19CredentialTokenTypeENS0_18AuthenticationTypeENS4_7SecondsE(); +int APS5_VABI _ZN7WebCore14MicrotaskQueue26performMicrotaskCheckpointEv(); +int APS5_VABI _ZN7WebCore14MicrotaskQueueD1Ev(); +int APS5_VABI _ZN7WebCore14MicrotaskQueueD2Ev(); +int APS5_VABI _ZN7WebCore14PluginDocument12pluginWidgetEv(); +int APS5_VABI _ZN7WebCore14ProcessWarming15initializeNamesEv(); +int APS5_VABI _ZN7WebCore14ProcessWarming15prewarmGloballyEv(); +int APS5_VABI _ZN7WebCore14ProcessWarming25collectPrewarmInformationEv(); +int APS5_VABI _ZN7WebCore14ResourceHandle11clearClientEv(); +int APS5_VABI _ZN7WebCore14ResourceHandle12firstRequestEv(); +int APS5_VABI _ZN7WebCore14ResourceHandle16setDefersLoadingEb(); +int APS5_VABI _ZN7WebCore14ResourceHandle20forceContentSniffingEv(); +int APS5_VABI _ZN7WebCore14ResourceHandle6cancelEv(); +int APS5_VABI _ZN7WebCore14ResourceHandleD0Ev(); +int APS5_VABI _ZN7WebCore14ResourceHandleD1Ev(); +int APS5_VABI _ZN7WebCore14ResourceHandleD2Ev(); +int APS5_VABI _ZN7WebCore14ResourceLoader14cancelledErrorEv(); +int APS5_VABI _ZN7WebCore14ResourceLoader31didBlockAuthenticationChallengeEv(); +int APS5_VABI _ZN7WebCore14ResourceLoader6cancelERKNS_13ResourceErrorE(); +int APS5_VABI _ZN7WebCore14ResourceLoader6cancelEv(); +int APS5_VABI _ZN7WebCore14SQLiteDatabase12lastErrorMsgEv(); +int APS5_VABI _ZN7WebCore14SQLiteDatabase14clearAllTablesEv(); +int APS5_VABI _ZN7WebCore14SQLiteDatabase16runVacuumCommandEv(); +int APS5_VABI _ZN7WebCore14SQLiteDatabase20setCollationFunctionERKN3WTF6StringEONS1_8FunctionIFiiPKviS7_EEE(); +int APS5_VABI _ZN7WebCore14SQLiteDatabase27runIncrementalVacuumCommandEv(); +int APS5_VABI _ZN7WebCore14SQLiteDatabase27turnOnIncrementalAutoVacuumEv(); +int APS5_VABI _ZN7WebCore14SQLiteDatabase29setIsDatabaseOpeningForbiddenEb(); +int APS5_VABI _ZN7WebCore14SQLiteDatabase5closeEv(); +int APS5_VABI _ZN7WebCore14SQLiteDatabase9interruptEv(); +int APS5_VABI _ZN7WebCore14SQLiteDatabase9lastErrorEv(); +int APS5_VABI _ZN7WebCore14SQLiteDatabaseC1Ev(); +int APS5_VABI _ZN7WebCore14SQLiteDatabaseC2Ev(); +int APS5_VABI _ZN7WebCore14SQLiteDatabaseD1Ev(); +int APS5_VABI _ZN7WebCore14SQLiteDatabaseD2Ev(); +int APS5_VABI _ZN7WebCore14ScrollableArea15contentsResizedEv(); +int APS5_VABI _ZN7WebCore14ScrollableArea15didAddScrollbarEPNS_9ScrollbarENS_20ScrollbarOrientationE(); +int APS5_VABI _ZN7WebCore14ScrollableArea17willEndLiveResizeEv(); +int APS5_VABI _ZN7WebCore14ScrollableArea19invalidateScrollbarERNS_9ScrollbarERKNS_7IntRectE(); +int APS5_VABI _ZN7WebCore14ScrollableArea19willRemoveScrollbarEPNS_9ScrollbarENS_20ScrollbarOrientationE(); +int APS5_VABI _ZN7WebCore14ScrollableArea19willStartLiveResizeEv(); +int APS5_VABI _ZN7WebCore14ScrollableArea21scrollbarStyleChangedENS_14ScrollbarStyleEb(); +int APS5_VABI _ZN7WebCore14ScrollableArea22invalidateScrollCornerERKNS_7IntRectE(); +int APS5_VABI _ZN7WebCore14ScrollableArea24setScrollbarOverlayStyleENS_21ScrollbarOverlayStyleE(); +int APS5_VABI _ZN7WebCore14ScrollableArea27availableContentSizeChangedENS0_25AvailableSizeChangeReasonE(); +int APS5_VABI _ZN7WebCore14ScrollableArea27notifyScrollPositionChangedERKNS_8IntPointE(); +int APS5_VABI _ZN7WebCore14ScrollableArea28setScrollOffsetFromInternalsERKNS_8IntPointE(); +int APS5_VABI _ZN7WebCore14ScrollableArea30scrollToOffsetWithoutAnimationERKNS_10FloatPointENS_14ScrollClampingE(); +int APS5_VABI _ZN7WebCore14ScrollableArea32computeScrollbarValueAndOverhangEfffRfS1_(); +int APS5_VABI _ZN7WebCore14ScrollableArea34constrainScrollPositionForOverhangERKNS_10LayoutRectERKNS_10LayoutSizeERKNS_11LayoutPointES9_ii(); +int APS5_VABI _ZN7WebCore14ScrollableAreaC2Ev(); +int APS5_VABI _ZN7WebCore14ScrollableAreaD0Ev(); +int APS5_VABI _ZN7WebCore14ScrollableAreaD1Ev(); +int APS5_VABI _ZN7WebCore14ScrollableAreaD2Ev(); +int APS5_VABI _ZN7WebCore14ScrollbarTheme5themeEv(); +int APS5_VABI _ZN7WebCore14SecurityOrigin16createFromStringERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore14SecurityOrigin30isLocalHostOrLoopbackIPAddressEN3WTF10StringViewE(); +int APS5_VABI _ZN7WebCore14SecurityOrigin6createERKN3WTF3URLE(); +int APS5_VABI _ZN7WebCore14SecurityPolicy18setLocalLoadPolicyENS0_15LocalLoadPolicyE(); +int APS5_VABI _ZN7WebCore14SecurityPolicy18shouldHideReferrerERKN3WTF3URLERKNS1_6StringE(); +int APS5_VABI _ZN7WebCore14SecurityPolicy27resetOriginAccessAllowlistsEv(); +int APS5_VABI _ZN7WebCore14SecurityPolicy29addOriginAccessAllowlistEntryERKNS_14SecurityOriginERKN3WTF6StringES7_b(); +int APS5_VABI _ZN7WebCore14SecurityPolicy32removeOriginAccessAllowlistEntryERKNS_14SecurityOriginERKN3WTF6StringES7_b(); +int APS5_VABI _ZN7WebCore14SocketProviderC2Ev(); +int APS5_VABI _ZN7WebCore14SocketProviderD0Ev(); +int APS5_VABI _ZN7WebCore14SocketProviderD1Ev(); +int APS5_VABI _ZN7WebCore14SocketProviderD2Ev(); +int APS5_VABI _ZN7WebCore14StaticNodeListD0Ev(); +int APS5_VABI _ZN7WebCore14StaticNodeListD1Ev(); +int APS5_VABI _ZN7WebCore14StaticNodeListD2Ev(); +int APS5_VABI _ZN7WebCore14StaticNodeListdaEPv(); +int APS5_VABI _ZN7WebCore14StaticNodeListdlEPv(); +int APS5_VABI _ZN7WebCore14StaticNodeListnaEm(); +int APS5_VABI _ZN7WebCore14StaticNodeListnwEm(); +int APS5_VABI _ZN7WebCore14StaticNodeListnwEmPv(); +int APS5_VABI _ZN7WebCore14StyleSheetList4itemEj(); +int APS5_VABI _ZN7WebCore14StyleSheetListD1Ev(); +int APS5_VABI _ZN7WebCore14StyleSheetListD2Ev(); +int APS5_VABI _ZN7WebCore14XMLHttpRequestD0Ev(); +int APS5_VABI _ZN7WebCore14XMLHttpRequestD2Ev(); +int APS5_VABI _ZN7WebCore14endOfParagraphERKNS_15VisiblePositionENS_27EditingBoundaryCrossingRuleE(); +int APS5_VABI _ZN7WebCore14foldQuoteMarksERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore14stopResolveDNSEm(); +int APS5_VABI _ZN7WebCore14valueForLengthERKNS_6LengthENS_10LayoutUnitE(); +int APS5_VABI _ZN7WebCore15ActiveDOMObject15suspendIfNeededEv(); +int APS5_VABI _ZN7WebCore15ActiveDOMObject20queueTaskInEventLoopENS_10TaskSourceEON3WTF8FunctionIFvvEEE(); +int APS5_VABI _ZN7WebCore15ActiveDOMObject4stopEv(); +int APS5_VABI _ZN7WebCore15ActiveDOMObject6resumeEv(); +int APS5_VABI _ZN7WebCore15ActiveDOMObject7suspendENS_19ReasonForSuspensionE(); +int APS5_VABI _ZN7WebCore15ActiveDOMObjectC2EPNS_22ScriptExecutionContextENS0_33CheckedScriptExecutionContextTypeE(); +int APS5_VABI _ZN7WebCore15ActiveDOMObjectC2EPNS_22ScriptExecutionContextE(); +int APS5_VABI _ZN7WebCore15ActiveDOMObjectC2EPNS_8DocumentE(); +int APS5_VABI _ZN7WebCore15ActiveDOMObjectC2ERKS0_(); +int APS5_VABI _ZN7WebCore15ActiveDOMObjectC2ERNS_8DocumentE(); +int APS5_VABI _ZN7WebCore15ActiveDOMObjectD0Ev(); +int APS5_VABI _ZN7WebCore15ActiveDOMObjectD1Ev(); +int APS5_VABI _ZN7WebCore15ActiveDOMObjectD2Ev(); +int APS5_VABI _ZN7WebCore15AsyncFileStream11openForReadERKN3WTF6StringExx(); +int APS5_VABI _ZN7WebCore15AsyncFileStream5closeEv(); +int APS5_VABI _ZN7WebCore15AsyncFileStream7performEON3WTF8FunctionIFNS2_IFvRNS_16FileStreamClientEEEERNS_10FileStreamEEEE(); +int APS5_VABI _ZN7WebCore15AsyncFileStreamC1ERNS_16FileStreamClientE(); +int APS5_VABI _ZN7WebCore15AsyncFileStreamC2ERNS_16FileStreamClientE(); +int APS5_VABI _ZN7WebCore15AsyncFileStreamD1Ev(); +int APS5_VABI _ZN7WebCore15AsyncFileStreamD2Ev(); +int APS5_VABI _ZN7WebCore15AsyncFileStreamdaEPv(); +int APS5_VABI _ZN7WebCore15AsyncFileStreamdlEPv(); +int APS5_VABI _ZN7WebCore15AsyncFileStreamnaEmPv(); +int APS5_VABI _ZN7WebCore15AsyncFileStreamnaEm(); +int APS5_VABI _ZN7WebCore15AsyncFileStreamnwEm(); +int APS5_VABI _ZN7WebCore15AsyncFileStreamnwEmPv(); +int APS5_VABI _ZN7WebCore15CSSFontFaceRule5styleEv(); +int APS5_VABI _ZN7WebCore15CSSGroupingRule10deleteRuleEj(); +int APS5_VABI _ZN7WebCore15CSSGroupingRule10insertRuleERKN3WTF6StringEj(); +int APS5_VABI _ZN7WebCore15DOMWrapperWorld13clearWrappersEv(); +int APS5_VABI _ZN7WebCore15DOMWrapperWorldD1Ev(); +int APS5_VABI _ZN7WebCore15DOMWrapperWorldD2Ev(); +int APS5_VABI _ZN7WebCore15DatabaseManager10initializeERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore15DatabaseManager14setIsAvailableEb(); +int APS5_VABI _ZN7WebCore15DatabaseManager16hasOpenDatabasesERNS_8DocumentE(); +int APS5_VABI _ZN7WebCore15DatabaseManager19fullPathForDatabaseERNS_14SecurityOriginERKN3WTF6StringEb(); +int APS5_VABI _ZN7WebCore15DatabaseManager23detailsForNameAndOriginERKN3WTF6StringERNS_14SecurityOriginE(); +int APS5_VABI _ZN7WebCore15DatabaseManager9setClientEPNS_21DatabaseManagerClientE(); +int APS5_VABI _ZN7WebCore15DatabaseTracker12deleteOriginERKNS_18SecurityOriginDataE(); +int APS5_VABI _ZN7WebCore15DatabaseTracker13databaseNamesERKNS_18SecurityOriginDataE(); +int APS5_VABI _ZN7WebCore15DatabaseTracker13isInitializedEv(); +int APS5_VABI _ZN7WebCore15DatabaseTracker14deleteDatabaseERKNS_18SecurityOriginDataERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore15DatabaseTracker17closeAllDatabasesENS_20CurrentQueryBehaviorE(); +int APS5_VABI _ZN7WebCore15DatabaseTracker19fullPathForDatabaseERKNS_18SecurityOriginDataERKN3WTF6StringEb(); +int APS5_VABI _ZN7WebCore15DatabaseTracker28deleteDatabasesModifiedSinceEN3WTF8WallTimeE(); +int APS5_VABI _ZN7WebCore15DatabaseTracker29deleteAllDatabasesImmediatelyEv(); +int APS5_VABI _ZN7WebCore15DatabaseTracker5quotaERKNS_18SecurityOriginDataE(); +int APS5_VABI _ZN7WebCore15DatabaseTracker5usageERKNS_18SecurityOriginDataE(); +int APS5_VABI _ZN7WebCore15DatabaseTracker7originsEv(); +int APS5_VABI _ZN7WebCore15DatabaseTracker9singletonEv(); +int APS5_VABI _ZN7WebCore15DeferredPromise6rejectENS_13ExceptionCodeERKN3WTF6StringENS_15RejectAsHandledE(); +int APS5_VABI _ZN7WebCore15DeferredPromise6rejectENS_9ExceptionENS_15RejectAsHandledE(); +int APS5_VABI _ZN7WebCore15FocusController10setFocusedEb(); +int APS5_VABI _ZN7WebCore15FocusController15setInitialFocusENS_14FocusDirectionEPNS_13KeyboardEventE(); +int APS5_VABI _ZN7WebCore15FocusController20nextFocusableElementERNS_4NodeE(); +int APS5_VABI _ZN7WebCore15FocusController23relinquishFocusToChromeENS_14FocusDirectionE(); +int APS5_VABI _ZN7WebCore15FocusController24previousFocusableElementERNS_4NodeE(); +int APS5_VABI _ZN7WebCore15FocusController9setActiveEb(); +int APS5_VABI _ZN7WebCore15FontDescriptionC1Ev(); +int APS5_VABI _ZN7WebCore15FontDescriptionC2Ev(); +int APS5_VABI _ZN7WebCore15GraphicsContext15drawImageBufferERNS_11ImageBufferERKNS_10FloatPointERKNS_20ImagePaintingOptionsE(); +int APS5_VABI _ZN7WebCore15GraphicsContext15drawLineForTextERKNS_9FloatRectEbbNS_11StrokeStyleE(); +int APS5_VABI _ZN7WebCore15GraphicsContext20endTransparencyLayerEv(); +int APS5_VABI _ZN7WebCore15GraphicsContext22beginTransparencyLayerEf(); +int APS5_VABI _ZN7WebCore15GraphicsContext4saveEv(); +int APS5_VABI _ZN7WebCore15GraphicsContext7restoreEv(); +int APS5_VABI _ZN7WebCore15GraphicsContext9drawImageERNS_5ImageERKNS_10FloatPointERKNS_20ImagePaintingOptionsE(); +int APS5_VABI _ZN7WebCore15GraphicsContext9drawImageERNS_5ImageERKNS_9FloatRectERKNS_20ImagePaintingOptionsE(); +int APS5_VABI _ZN7WebCore15GraphicsContextD1Ev(); +int APS5_VABI _ZN7WebCore15GraphicsContextD2Ev(); +int APS5_VABI _ZN7WebCore15HTMLBaseElement7setHrefERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore15HTMLFormElement13checkValidityEv(); +int APS5_VABI _ZN7WebCore15HTMLFormElement15setAutocompleteERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore15HTMLFormElement25elementsForNativeBindingsEv(); +int APS5_VABI _ZN7WebCore15HTMLFormElement5resetEv(); +int APS5_VABI _ZN7WebCore15HTMLFormElement6submitEv(); +int APS5_VABI _ZN7WebCore15HTMLLinkElement14setCrossOriginERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore15HTMLLinkElement5setAsERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore15HTMLLinkElement7relListEv(); +int APS5_VABI _ZN7WebCore15HTTPHeaderFieldC1EON3WTF6StringES3_(); +int APS5_VABI _ZN7WebCore15HTTPHeaderFieldC1ERKS0_(); +int APS5_VABI _ZN7WebCore15HTTPHeaderFieldC2EON3WTF6StringES3_(); +int APS5_VABI _ZN7WebCore15HTTPHeaderFieldC2ERKS0_(); +int APS5_VABI _ZN7WebCore15HTTPHeaderFieldD1Ev(); +int APS5_VABI _ZN7WebCore15HTTPHeaderFieldD2Ev(); +int APS5_VABI _ZN7WebCore15HTTPHeaderFieldaSERKS0_(); +int APS5_VABI _ZN7WebCore15HitTestLocationC1ERKS0_(); +int APS5_VABI _ZN7WebCore15HitTestLocationC1Ev(); +int APS5_VABI _ZN7WebCore15HitTestLocationC2ERKS0_(); +int APS5_VABI _ZN7WebCore15HitTestLocationC2Ev(); +int APS5_VABI _ZN7WebCore15HitTestLocationD1Ev(); +int APS5_VABI _ZN7WebCore15HitTestLocationD2Ev(); +int APS5_VABI _ZN7WebCore15JSDOMWindowBase14finishCreationERN3JSC2VMEPNS_13JSWindowProxyE(); +int APS5_VABI _ZN7WebCore15JSDOMWindowBase14updateDocumentEv(); +int APS5_VABI _ZN7WebCore15JSDOMWindowBase15createStructureERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore15JSDOMWindowBase25willRemoveFromWindowProxyEv(); +int APS5_VABI _ZN7WebCore15JSDOMWindowBase4infoEv(); +int APS5_VABI _ZN7WebCore15JSDOMWindowBaseD2Ev(); +int APS5_VABI _ZN7WebCore15JSFetchResponse14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore15JSFetchResponse15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore15JSFetchResponse15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore15JSFetchResponse15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore15JSFetchResponse4infoEv(); +int APS5_VABI _ZN7WebCore15JSFetchResponse9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore15JSFetchResponse9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore15JSFetchResponseC1ERKS0_(); +int APS5_VABI _ZN7WebCore15JSFetchResponseC2ERKS0_(); +int APS5_VABI _ZN7WebCore15JSFetchResponseD1Ev(); +int APS5_VABI _ZN7WebCore15JSFetchResponseD2Ev(); +int APS5_VABI _ZN7WebCore15JSFetchResponseaSERKS0_(); +int APS5_VABI _ZN7WebCore15JSSVGSVGElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore15JSSVGSVGElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore15JSSVGSVGElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore15JSSVGSVGElement15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore15JSSVGSVGElement4infoEv(); +int APS5_VABI _ZN7WebCore15JSSVGSVGElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore15JSSVGSVGElement9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore15JSSVGSVGElementC1ERKS0_(); +int APS5_VABI _ZN7WebCore15JSSVGSVGElementC2ERKS0_(); +int APS5_VABI _ZN7WebCore15JSSVGSVGElementD1Ev(); +int APS5_VABI _ZN7WebCore15JSSVGSVGElementD2Ev(); +int APS5_VABI _ZN7WebCore15NavigatorBeacon4fromERNS_9NavigatorE(); +int APS5_VABI _ZN7WebCore15PlatformDisplay13sharedDisplayEv(); +int APS5_VABI _ZN7WebCore15PlatformDisplay16sharingGLContextEv(); +int APS5_VABI _ZN7WebCore15PlatformDisplay27sharedDisplayForCompositingEv(); +int APS5_VABI _ZN7WebCore15RenderBlockFlow30findClosestTextAtAbsolutePointERKNS_10FloatPointE(); +int APS5_VABI _ZN7WebCore15ResourceRequest41updateFromDelegatePreservingOldPropertiesERKS0_(); +int APS5_VABI _ZN7WebCore15SQLiteStatement10bindDoubleEid(); +int APS5_VABI _ZN7WebCore15SQLiteStatement14executeCommandEv(); +int APS5_VABI _ZN7WebCore15SQLiteStatement22isColumnDeclaredAsBlobEi(); +int APS5_VABI _ZN7WebCore15SQLiteStatement4stepEv(); +int APS5_VABI _ZN7WebCore15SQLiteStatement5resetEv(); +int APS5_VABI _ZN7WebCore15SQLiteStatement7bindIntEii(); +int APS5_VABI _ZN7WebCore15SQLiteStatement8bindBlobEiRKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore15SQLiteStatement8bindNullEi(); +int APS5_VABI _ZN7WebCore15SQLiteStatement9bindInt64Eil(); +int APS5_VABI _ZN7WebCore15SQLiteStatementD1Ev(); +int APS5_VABI _ZN7WebCore15SQLiteStatementD2Ev(); +int APS5_VABI _ZN7WebCore15StringTruncator12leftTruncateERKN3WTF6StringEfRKNS_11FontCascadeERfbf(); +int APS5_VABI _ZN7WebCore15StringTruncator13rightTruncateERKN3WTF6StringEfRKNS_11FontCascadeERfbf(); +int APS5_VABI _ZN7WebCore15StringTruncator13rightTruncateERKN3WTF6StringEfRKNS_11FontCascadeE(); +int APS5_VABI _ZN7WebCore15StringTruncator14centerTruncateERKN3WTF6StringEfRKNS_11FontCascadeE(); +int APS5_VABI _ZN7WebCore15StringTruncator14centerTruncateERKN3WTF6StringEfRKNS_11FontCascadeERfbf(); +int APS5_VABI _ZN7WebCore15StringTruncator15rightClipToWordERKN3WTF6StringEfRKNS_11FontCascadeERfbfb(); +int APS5_VABI _ZN7WebCore15StringTruncator20rightClipToCharacterERKN3WTF6StringEfRKNS_11FontCascadeERfbf(); +int APS5_VABI _ZN7WebCore15StringTruncator5widthERKN3WTF6StringERKNS_11FontCascadeE(); +int APS5_VABI _ZN7WebCore15UserInputBridge11loadRequestEONS_16FrameLoadRequestENS_11InputSourceE(); +int APS5_VABI _ZN7WebCore15UserInputBridge12tryClosePageENS_11InputSourceE(); +int APS5_VABI _ZN7WebCore15UserInputBridge14handleKeyEventERKNS_21PlatformKeyboardEventENS_11InputSourceE(); +int APS5_VABI _ZN7WebCore15UserInputBridge17scrollRecursivelyENS_15ScrollDirectionENS_17ScrollGranularityENS_11InputSourceE(); +int APS5_VABI _ZN7WebCore15UserInputBridge20handleAccessKeyEventERKNS_21PlatformKeyboardEventENS_11InputSourceE(); +int APS5_VABI _ZN7WebCore15UserInputBridge20handleMouseMoveEventERKNS_18PlatformMouseEventENS_11InputSourceE(); +int APS5_VABI _ZN7WebCore15UserInputBridge21handleMouseForceEventERKNS_18PlatformMouseEventENS_11InputSourceE(); +int APS5_VABI _ZN7WebCore15UserInputBridge21handleMousePressEventERKNS_18PlatformMouseEventENS_11InputSourceE(); +int APS5_VABI _ZN7WebCore15UserInputBridge23handleMouseReleaseEventERKNS_18PlatformMouseEventENS_11InputSourceE(); +int APS5_VABI _ZN7WebCore15UserInputBridge24logicalScrollRecursivelyENS_22ScrollLogicalDirectionENS_17ScrollGranularityENS_11InputSourceE(); +int APS5_VABI _ZN7WebCore15UserInputBridge31handleMouseMoveOnScrollbarEventERKNS_18PlatformMouseEventENS_11InputSourceE(); +int APS5_VABI _ZN7WebCore15WindowEventLoop27breakToAllowRenderingUpdateEv(); +int APS5_VABI _ZN7WebCore15XPathExpression8evaluateERNS_4NodeEtPNS_11XPathResultE(); +int APS5_VABI _ZN7WebCore15XPathExpressionD1Ev(); +int APS5_VABI _ZN7WebCore15XPathExpressionD2Ev(); +int APS5_VABI _ZN7WebCore15XPathNSResolverC2Ev(); +int APS5_VABI _ZN7WebCore15XPathNSResolverD0Ev(); +int APS5_VABI _ZN7WebCore15XPathNSResolverD1Ev(); +int APS5_VABI _ZN7WebCore15XPathNSResolverD2Ev(); +int APS5_VABI _ZN7WebCore15addToBackingSetERN3JSC14JSGlobalObjectERNS0_8JSObjectENS0_7JSValueE(); +int APS5_VABI _ZN7WebCore15clearBackingMapERN3JSC14JSGlobalObjectERNS0_8JSObjectE(); +int APS5_VABI _ZN7WebCore15clearBackingSetERN3JSC14JSGlobalObjectERNS0_8JSObjectE(); +int APS5_VABI _ZN7WebCore15createLiveRangeERKNS_11SimpleRangeE(); +int APS5_VABI _ZN7WebCore15defaultMIMETypeEv(); +int APS5_VABI _ZN7WebCore15isDraggableLinkERKNS_7ElementE(); +int APS5_VABI _ZN7WebCore15isEndOfDocumentERKNS_15VisiblePositionE(); +int APS5_VABI _ZN7WebCore15localizedStringEPKc(); +int APS5_VABI _ZN7WebCore15makeSimpleRangeERKNS_5RangeE(); +int APS5_VABI _ZN7WebCore15makeSimpleRangeERNS_4NodeERKNS_14DocumentMarkerE(); +int APS5_VABI _ZN7WebCore15setToBackingMapERN3JSC14JSGlobalObjectERNS0_8JSObjectENS0_7JSValueES5_(); +int APS5_VABI _ZN7WebCore15startOfDocumentEPKNS_4NodeE(); +int APS5_VABI _ZN7WebCore15startOfDocumentERKNS_15VisiblePositionE(); +int APS5_VABI _ZN7WebCore15startOfSentenceERKNS_15VisiblePositionE(); +int APS5_VABI _ZN7WebCore16BackForwardCache10setMaxSizeEj(); +int APS5_VABI _ZN7WebCore16BackForwardCache14addIfCacheableERNS_11HistoryItemEPNS_4PageE(); +int APS5_VABI _ZN7WebCore16BackForwardCache14pruneToSizeNowEjNS_13PruningReasonE(); +int APS5_VABI _ZN7WebCore16BackForwardCache6removeERNS_11HistoryItemE(); +int APS5_VABI _ZN7WebCore16BackForwardCache9singletonEv(); +int APS5_VABI _ZN7WebCore16BlobRegistryImpl17unregisterBlobURLERKN3WTF3URLE(); +int APS5_VABI _ZN7WebCore16BlobRegistryImpl18appendStorageItemsEPNS_8BlobDataERKN3WTF6VectorINS_12BlobDataItemELm0ENS3_15CrashOnOverflowELm16ENS3_10FastMallocEEExx(); +int APS5_VABI _ZN7WebCore16BlobRegistryImpl20createResourceHandleERKNS_15ResourceRequestEPNS_20ResourceHandleClientE(); +int APS5_VABI _ZN7WebCore16BlobRegistryImpl27populateBlobsForFileWritingERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEERNS2_INS0_18BlobForFileWritingELm0ES4_Lm16ES5_EE(); +int APS5_VABI _ZN7WebCore16BlobRegistryImpl8blobSizeERKN3WTF3URLE(); +int APS5_VABI _ZN7WebCore16BlobRegistryImplC1ERKS0_(); +int APS5_VABI _ZN7WebCore16BlobRegistryImplC1Ev(); +int APS5_VABI _ZN7WebCore16BlobRegistryImplC2ERKS0_(); +int APS5_VABI _ZN7WebCore16BlobRegistryImplC2Ev(); +int APS5_VABI _ZN7WebCore16BlobRegistryImplD0Ev(); +int APS5_VABI _ZN7WebCore16BlobRegistryImplD1Ev(); +int APS5_VABI _ZN7WebCore16BlobRegistryImplD2Ev(); +int APS5_VABI _ZN7WebCore16BlobRegistryImpldaEPv(); +int APS5_VABI _ZN7WebCore16BlobRegistryImpldlEPv(); +int APS5_VABI _ZN7WebCore16BlobRegistryImplnaEm(); +int APS5_VABI _ZN7WebCore16BlobRegistryImplnaEmPv(); +int APS5_VABI _ZN7WebCore16BlobRegistryImplnwEm10NotNullTagPv(); +int APS5_VABI _ZN7WebCore16BlobRegistryImplnwEm(); +int APS5_VABI _ZN7WebCore16BlobRegistryImplnwEmPv(); +int APS5_VABI _ZN7WebCore16CSSParserContextC1ERKNS_8DocumentERKN3WTF3URLERKNS4_6StringE(); +int APS5_VABI _ZN7WebCore16CSSParserContextC2ERKNS_8DocumentERKN3WTF3URLERKNS4_6StringE(); +int APS5_VABI _ZN7WebCore16DOMGuardedObject16contextDestroyedEv(); +int APS5_VABI _ZN7WebCore16DOMGuardedObject5clearEv(); +int APS5_VABI _ZN7WebCore16DOMGuardedObjectC1ERNS_17JSDOMGlobalObjectERN3JSC6JSCellE(); +int APS5_VABI _ZN7WebCore16DOMGuardedObjectC2ERNS_17JSDOMGlobalObjectERN3JSC6JSCellE(); +int APS5_VABI _ZN7WebCore16DOMGuardedObjectD0Ev(); +int APS5_VABI _ZN7WebCore16DOMGuardedObjectD1Ev(); +int APS5_VABI _ZN7WebCore16DOMGuardedObjectD2Ev(); +int APS5_VABI _ZN7WebCore16DatabaseProviderC2Ev(); +int APS5_VABI _ZN7WebCore16DatabaseProviderD0Ev(); +int APS5_VABI _ZN7WebCore16DatabaseProviderD1Ev(); +int APS5_VABI _ZN7WebCore16DatabaseProviderD2Ev(); +int APS5_VABI _ZN7WebCore16DeviceMotionData6createEv(); +int APS5_VABI _ZN7WebCore16FileReaderLoader5startEPNS_22ScriptExecutionContextERNS_4BlobE(); +int APS5_VABI _ZN7WebCore16FileReaderLoader6cancelEv(); +int APS5_VABI _ZN7WebCore16FileReaderLoaderC1ENS0_8ReadTypeEPNS_22FileReaderLoaderClientE(); +int APS5_VABI _ZN7WebCore16FileReaderLoaderC2ENS0_8ReadTypeEPNS_22FileReaderLoaderClientE(); +int APS5_VABI _ZN7WebCore16FontCascadeFonts23realizeFallbackRangesAtERKNS_22FontCascadeDescriptionEj(); +int APS5_VABI _ZN7WebCore16FontCascadeFontsD1Ev(); +int APS5_VABI _ZN7WebCore16FontCascadeFontsD2Ev(); +int APS5_VABI _ZN7WebCore16FrameLoadRequestC1EOS0_(); +int APS5_VABI _ZN7WebCore16FrameLoadRequestC2EOS0_(); +int APS5_VABI _ZN7WebCore16FrameLoadRequestD1Ev(); +int APS5_VABI _ZN7WebCore16FrameLoadRequestD2Ev(); +int APS5_VABI _ZN7WebCore16FrameLoadRequestaSEOS0_(); +int APS5_VABI _ZN7WebCore16HTMLImageElement14setCrossOriginERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore16HTMLImageElement8setWidthEj(); +int APS5_VABI _ZN7WebCore16HTMLImageElement9setHeightEj(); +int APS5_VABI _ZN7WebCore16HTMLInputElement10setCheckedEb(); +int APS5_VABI _ZN7WebCore16HTMLInputElement11selectColorEN3WTF10StringViewE(); +int APS5_VABI _ZN7WebCore16HTMLInputElement13setAutoFilledEb(); +int APS5_VABI _ZN7WebCore16HTMLInputElement16setIndeterminateEb(); +int APS5_VABI _ZN7WebCore16HTMLInputElement16setValueAsNumberEdNS_22TextFieldEventBehaviorE(); +int APS5_VABI _ZN7WebCore16HTMLInputElement21setShowAutoFillButtonENS_18AutoFillButtonTypeE(); +int APS5_VABI _ZN7WebCore16HTMLInputElement24setAutoFilledAndViewableEb(); +int APS5_VABI _ZN7WebCore16HTMLInputElement5filesEv(); +int APS5_VABI _ZN7WebCore16HTMLInputElement6stepUpEi(); +int APS5_VABI _ZN7WebCore16HTMLInputElement7setSizeEj(); +int APS5_VABI _ZN7WebCore16HTMLInputElement7setTypeERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore16HTMLInputElement8setWidthEj(); +int APS5_VABI _ZN7WebCore16HTMLInputElement8stepDownEi(); +int APS5_VABI _ZN7WebCore16HTMLInputElement9setHeightEj(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement11setControlsEb(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement12endScrubbingEv(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement14beginScrubbingEv(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement14exitFullscreenEv(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement14setCrossOriginERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement14setCurrentTimeEd(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement15clearMediaCacheERKN3WTF6StringENS1_8WallTimeE(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement15enterFullscreenEv(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement15togglePlayStateEv(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement16allMediaElementsEv(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement16returnToRealtimeEv(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement19mediaCacheDirectoryEv(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement19originsInMediaCacheERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement22setMediaCacheDirectoryERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement23setWebkitPreservesPitchEb(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement25setCurrentTimeForBindingsEd(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement25setVideoFullscreenStandbyEb(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement26didBecomeFullscreenElementEv(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement27purgeBufferedDataIfPossibleEv(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement29getCurrentMediaControlsStatusEv(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement30setWebkitClosedCaptionsVisibleEb(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement32prepareForVideoFullscreenStandbyEv(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement36setOverridePreferredDynamicRangeModeENS_16DynamicRangeModeE(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement4loadEv(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement4playEv(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement5pauseEv(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement6rewindEd(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement8fastSeekERKN3WTF9MediaTimeE(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement8fastSeekEd(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement8setMutedEb(); +int APS5_VABI _ZN7WebCore16HTMLMediaElement9setVolumeEd(); +int APS5_VABI _ZN7WebCore16HTMLOListElement19setStartForBindingsEi(); +int APS5_VABI _ZN7WebCore16HTMLStyleElement11setDisabledEb(); +int APS5_VABI _ZN7WebCore16HTMLTableElement11createTBodyEv(); +int APS5_VABI _ZN7WebCore16HTMLTableElement11createTFootEv(); +int APS5_VABI _ZN7WebCore16HTMLTableElement11createTHeadEv(); +int APS5_VABI _ZN7WebCore16HTMLTableElement11deleteTFootEv(); +int APS5_VABI _ZN7WebCore16HTMLTableElement11deleteTHeadEv(); +int APS5_VABI _ZN7WebCore16HTMLTableElement13createCaptionEv(); +int APS5_VABI _ZN7WebCore16HTMLTableElement13deleteCaptionEv(); +int APS5_VABI _ZN7WebCore16HTMLTableElement4rowsEv(); +int APS5_VABI _ZN7WebCore16HTMLTableElement7tBodiesEv(); +int APS5_VABI _ZN7WebCore16HTMLTableElement9deleteRowEi(); +int APS5_VABI _ZN7WebCore16HTMLTableElement9insertRowEi(); +int APS5_VABI _ZN7WebCore16HTMLVideoElement20webkitExitFullscreenEv(); +int APS5_VABI _ZN7WebCore16HTMLVideoElement21webkitEnterFullscreenEv(); +int APS5_VABI _ZN7WebCore16HTMLVideoElement24webkitSupportsFullscreenEv(); +int APS5_VABI _ZN7WebCore16HTMLVideoElement26webkitDisplayingFullscreenEv(); +int APS5_VABI _ZN7WebCore16HTMLVideoElement6createERNS_8DocumentE(); +int APS5_VABI _ZN7WebCore16ISOSchemeTypeBox11boxTypeNameEv(); +int APS5_VABI _ZN7WebCore16ISOSchemeTypeBox5parseERN3JSC8DataViewERj(); +int APS5_VABI _ZN7WebCore16ISOSchemeTypeBoxC1ERKS0_(); +int APS5_VABI _ZN7WebCore16ISOSchemeTypeBoxC1Ev(); +int APS5_VABI _ZN7WebCore16ISOSchemeTypeBoxC2ERKS0_(); +int APS5_VABI _ZN7WebCore16ISOSchemeTypeBoxC2Ev(); +int APS5_VABI _ZN7WebCore16ISOSchemeTypeBoxD0Ev(); +int APS5_VABI _ZN7WebCore16ISOSchemeTypeBoxD1Ev(); +int APS5_VABI _ZN7WebCore16ISOSchemeTypeBoxD2Ev(); +int APS5_VABI _ZN7WebCore16JSHTMLCollection9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore16JSStringCallback11handleEventERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore16JSStringCallback12callbackDataEv(); +int APS5_VABI _ZN7WebCore16JSStringCallback6createEPN3JSC8JSObjectEPNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore16JSStringCallbackC1EPN3JSC8JSObjectEPNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore16JSStringCallbackC2EPN3JSC8JSObjectEPNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore16JSStringCallbackD0Ev(); +int APS5_VABI _ZN7WebCore16JSStringCallbackD1Ev(); +int APS5_VABI _ZN7WebCore16JSStringCallbackD2Ev(); +int APS5_VABI _ZN7WebCore16JSStyleSheetList9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore16JSXMLHttpRequest14finishCreationERN3JSC2VME(); +int APS5_VABI _ZN7WebCore16JSXMLHttpRequest14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore16JSXMLHttpRequest15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore16JSXMLHttpRequest15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore16JSXMLHttpRequest15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore16JSXMLHttpRequest4infoEv(); +int APS5_VABI _ZN7WebCore16JSXMLHttpRequest9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore16JSXMLHttpRequest9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore16JSXMLHttpRequestC1ERKS0_(); +int APS5_VABI _ZN7WebCore16JSXMLHttpRequestC2ERKS0_(); +int APS5_VABI _ZN7WebCore16JSXMLHttpRequestD1Ev(); +int APS5_VABI _ZN7WebCore16JSXMLHttpRequestD2Ev(); +int APS5_VABI _ZN7WebCore16MIMETypeRegistry13isXMLMIMETypeERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore16MIMETypeRegistry14isTextMIMETypeERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore16MIMETypeRegistry15canShowMIMETypeERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore16MIMETypeRegistry16allowedMIMETypesERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEES8_(); +int APS5_VABI _ZN7WebCore16MIMETypeRegistry19isXMLEntityMIMETypeEN3WTF10StringViewE(); +int APS5_VABI _ZN7WebCore16MIMETypeRegistry21allowedFileExtensionsERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEES8_(); +int APS5_VABI _ZN7WebCore16MIMETypeRegistry21extensionsForMIMETypeERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore16MIMETypeRegistry23isSupportedJSONMIMETypeERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore16MIMETypeRegistry23supportedImageMIMETypesEv(); +int APS5_VABI _ZN7WebCore16MIMETypeRegistry23supportedMediaMIMETypesEv(); +int APS5_VABI _ZN7WebCore16MIMETypeRegistry24isSupportedImageMIMETypeERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore16MIMETypeRegistry24isSupportedMediaMIMETypeERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore16MIMETypeRegistry24unsupportedTextMIMETypesEv(); +int APS5_VABI _ZN7WebCore16MIMETypeRegistry25isPDFOrPostScriptMIMETypeERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore16MIMETypeRegistry26supportedNonImageMIMETypesEv(); +int APS5_VABI _ZN7WebCore16MIMETypeRegistry27isSupportedNonImageMIMETypeERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore16MIMETypeRegistry28isSupportedTextTrackMIMETypeERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore16MIMETypeRegistry29isSupportedJavaScriptMIMETypeERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore16MIMETypeRegistry29preferredExtensionForMIMETypeERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore16MIMETypeRegistry30appendFileExtensionIfNecessaryERKN3WTF6StringES4_(); +int APS5_VABI _ZN7WebCore16MIMETypeRegistry32containsImageMIMETypeForEncodingERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEES8_(); +int APS5_VABI _ZN7WebCore16MIMETypeRegistry33preferredImageMIMETypeForEncodingERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEES8_(); +int APS5_VABI _ZN7WebCore16MIMETypeRegistry34isSupportedImageVideoOrSVGMIMETypeERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore16NavigationActionC1ERKS0_(); +int APS5_VABI _ZN7WebCore16NavigationActionC1ERNS_8DocumentERKNS_15ResourceRequestENS_20InitiatedByMainFrameENS_14NavigationTypeENS_28ShouldOpenExternalURLsPolicyEPNS_5EventERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore16NavigationActionC2ERKS0_(); +int APS5_VABI _ZN7WebCore16NavigationActionC2ERNS_8DocumentERKNS_15ResourceRequestENS_20InitiatedByMainFrameENS_14NavigationTypeENS_28ShouldOpenExternalURLsPolicyEPNS_5EventERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore16NavigationActionD1Ev(); +int APS5_VABI _ZN7WebCore16NavigationActionD2Ev(); +int APS5_VABI _ZN7WebCore16NetworkSendQueue15processMessagesEv(); +int APS5_VABI _ZN7WebCore16NetworkSendQueue5clearEv(); +int APS5_VABI _ZN7WebCore16NetworkSendQueue7enqueueEON3WTF7CStringE(); +int APS5_VABI _ZN7WebCore16NetworkSendQueue7enqueueERKN3JSC11ArrayBufferEjj(); +int APS5_VABI _ZN7WebCore16NetworkSendQueue7enqueueERNS_4BlobE(); +int APS5_VABI _ZN7WebCore16NetworkSendQueueD1Ev(); +int APS5_VABI _ZN7WebCore16NetworkSendQueueD2Ev(); +int APS5_VABI _ZN7WebCore16SQLiteFileSystem18deleteDatabaseFileERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore16SQLiteFileSystem29ensureDatabaseDirectoryExistsERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore16ScriptController11createWorldERKN3WTF6StringENS0_9WorldTypeE(); +int APS5_VABI _ZN7WebCore16ScriptController11windowProxyEv(); +int APS5_VABI _ZN7WebCore16ScriptController13jsWindowProxyERNS_15DOMWrapperWorldE(); +int APS5_VABI _ZN7WebCore16ScriptController16createRootObjectEPv(); +int APS5_VABI _ZN7WebCore16ScriptController17bindingRootObjectEv(); +int APS5_VABI _ZN7WebCore16ScriptController17canExecuteScriptsENS_33ReasonForCallingCanExecuteScriptsE(); +int APS5_VABI _ZN7WebCore16ScriptController24jsObjectForPluginElementEPNS_17HTMLPlugInElementE(); +int APS5_VABI _ZN7WebCore16ScriptController29cleanupScriptObjectsForPluginEPv(); +int APS5_VABI _ZN7WebCore16ScriptController29executeUserAgentScriptInWorldERNS_15DOMWrapperWorldERKN3WTF6StringEb(); +int APS5_VABI _ZN7WebCore16ScriptController30executeScriptIgnoringExceptionERKN3WTF6StringEb(); +int APS5_VABI _ZN7WebCore16ScriptController37executeScriptInWorldIgnoringExceptionERNS_15DOMWrapperWorldERKN3WTF6StringEb(); +int APS5_VABI _ZN7WebCore16ScriptController41executeAsynchronousUserAgentScriptInWorldERNS_15DOMWrapperWorldEONS_23RunJavaScriptParametersEON3WTF17CompletionHandlerIFvNSt12experimental15fundamentals_v38expectedIN3JSC7JSValueENS_16ExceptionDetailsEEEEEE(); +int APS5_VABI _ZN7WebCore16ScriptController46executeUserAgentScriptInWorldIgnoringExceptionERNS_15DOMWrapperWorldERKN3WTF6StringEb(); +int APS5_VABI _ZN7WebCore16ThreadGlobalDataC1Ev(); +int APS5_VABI _ZN7WebCore16ThreadGlobalDataC2Ev(); +int APS5_VABI _ZN7WebCore16ThreadGlobalDataD1Ev(); +int APS5_VABI _ZN7WebCore16ThreadGlobalDataD2Ev(); +int APS5_VABI _ZN7WebCore16TrackPrivateBase13willBeRemovedEv(); +int APS5_VABI _ZN7WebCore16TrackPrivateBaseC2Ev(); +int APS5_VABI _ZN7WebCore16TrackPrivateBaseD0Ev(); +int APS5_VABI _ZN7WebCore16TrackPrivateBaseD1Ev(); +int APS5_VABI _ZN7WebCore16TrackPrivateBaseD2Ev(); +int APS5_VABI _ZN7WebCore16TrackPrivateBasedaEPv(); +int APS5_VABI _ZN7WebCore16TrackPrivateBasedlEPv(); +int APS5_VABI _ZN7WebCore16TrackPrivateBasenaEmPv(); +int APS5_VABI _ZN7WebCore16TrackPrivateBasenaEm(); +int APS5_VABI _ZN7WebCore16TrackPrivateBasenwEm10NotNullTagPv(); +int APS5_VABI _ZN7WebCore16TrackPrivateBasenwEmPv(); +int APS5_VABI _ZN7WebCore16TrackPrivateBasenwEm(); +int APS5_VABI _ZN7WebCore16UserGestureToken60setMaximumIntervalForUserGestureForwardingForFetchForTestingEN3WTF7SecondsE(); +int APS5_VABI _ZN7WebCore16UserGestureTokenD1Ev(); +int APS5_VABI _ZN7WebCore16UserGestureTokenD2Ev(); +int APS5_VABI _ZN7WebCore16VisibleSelection20adjustPositionForEndERKNS_8PositionEPNS_4NodeE(); +int APS5_VABI _ZN7WebCore16VisibleSelection22adjustPositionForStartERKNS_8PositionEPNS_4NodeE(); +int APS5_VABI _ZN7WebCore16VisibleSelection22expandUsingGranularityENS_15TextGranularityE(); +int APS5_VABI _ZN7WebCore16VisibleSelection27selectionFromContentsOfNodeEPNS_4NodeE(); +int APS5_VABI _ZN7WebCore16VisibleSelectionC1ERKNS_15VisiblePositionES3_b(); +int APS5_VABI _ZN7WebCore16VisibleSelectionC1ERKNS_15VisiblePositionEb(); +int APS5_VABI _ZN7WebCore16VisibleSelectionC1Ev(); +int APS5_VABI _ZN7WebCore16VisibleSelectionC2ERKNS_15VisiblePositionES3_b(); +int APS5_VABI _ZN7WebCore16VisibleSelectionC2ERKNS_15VisiblePositionEb(); +int APS5_VABI _ZN7WebCore16VisibleSelectionC2Ev(); +int APS5_VABI _ZN7WebCore16VisitedLinkStore23invalidateStylesForLinkEj(); +int APS5_VABI _ZN7WebCore16VisitedLinkStore27invalidateStylesForAllLinksEv(); +int APS5_VABI _ZN7WebCore16VisitedLinkStoreC2Ev(); +int APS5_VABI _ZN7WebCore16VisitedLinkStoreD0Ev(); +int APS5_VABI _ZN7WebCore16VisitedLinkStoreD1Ev(); +int APS5_VABI _ZN7WebCore16VisitedLinkStoreD2Ev(); +int APS5_VABI _ZN7WebCore16convertToIntegerIaEET_RN3JSC14JSGlobalObjectENS2_7JSValueE(); +int APS5_VABI _ZN7WebCore16convertToIntegerIhEET_RN3JSC14JSGlobalObjectENS2_7JSValueE(); +int APS5_VABI _ZN7WebCore16convertToIntegerIiEET_RN3JSC14JSGlobalObjectENS2_7JSValueE(); +int APS5_VABI _ZN7WebCore16convertToIntegerIjEET_RN3JSC14JSGlobalObjectENS2_7JSValueE(); +int APS5_VABI _ZN7WebCore16convertToIntegerIlEET_RN3JSC14JSGlobalObjectENS2_7JSValueE(); +int APS5_VABI _ZN7WebCore16convertToIntegerImEET_RN3JSC14JSGlobalObjectENS2_7JSValueE(); +int APS5_VABI _ZN7WebCore16convertToIntegerIsEET_RN3JSC14JSGlobalObjectENS2_7JSValueE(); +int APS5_VABI _ZN7WebCore16convertToIntegerItEET_RN3JSC14JSGlobalObjectENS2_7JSValueE(); +int APS5_VABI _ZN7WebCore16enclosingIntRectERKNS_10LayoutRectE(); +int APS5_VABI _ZN7WebCore16enclosingIntRectERKNS_9FloatRectE(); +int APS5_VABI _ZN7WebCore16findIntersectionERKNS_10FloatPointES2_S2_S2_RS0_(); +int APS5_VABI _ZN7WebCore16isEndOfParagraphERKNS_15VisiblePositionENS_27EditingBoundaryCrossingRuleE(); +int APS5_VABI _ZN7WebCore16nextWordPositionERKNS_15VisiblePositionE(); +int APS5_VABI _ZN7WebCore16parseHTMLIntegerEN3WTF10StringViewE(); +int APS5_VABI _ZN7WebCore16startOfParagraphERKNS_15VisiblePositionENS_27EditingBoundaryCrossingRuleE(); +int APS5_VABI _ZN7WebCore16valueToUSVStringERN3JSC14JSGlobalObjectENS0_7JSValueE(); +int APS5_VABI _ZN7WebCore17CharacterIterator7advanceEi(); +int APS5_VABI _ZN7WebCore17CredentialStorage16clearCredentialsEv(); +int APS5_VABI _ZN7WebCore17CredentialStorage24getFromPersistentStorageERKNS_15ProtectionSpaceE(); +int APS5_VABI _ZN7WebCore17CredentialStorage27removeCredentialsWithOriginERKNS_18SecurityOriginDataE(); +int APS5_VABI _ZN7WebCore17CredentialStorage3getERKN3WTF6StringERKNS1_3URLE(); +int APS5_VABI _ZN7WebCore17CredentialStorage3getERKN3WTF6StringERKNS_15ProtectionSpaceE(); +int APS5_VABI _ZN7WebCore17CredentialStorage3setERKN3WTF6StringERKNS_10CredentialERKNS1_3URLE(); +int APS5_VABI _ZN7WebCore17CredentialStorage3setERKN3WTF6StringERKNS_10CredentialERKNS_15ProtectionSpaceERKNS1_3URLE(); +int APS5_VABI _ZN7WebCore17CredentialStorage6removeERKN3WTF6StringERKNS_15ProtectionSpaceE(); +int APS5_VABI _ZN7WebCore17DOMImplementation19createCSSStyleSheetERKN3WTF6StringES4_(); +int APS5_VABI _ZN7WebCore17DebugPageOverlays15settingsChangedERNS_4PageE(); +int APS5_VABI _ZN7WebCore17FullscreenManager16cancelFullscreenEv(); +int APS5_VABI _ZN7WebCore17FullscreenManager17didExitFullscreenEv(); +int APS5_VABI _ZN7WebCore17FullscreenManager18didEnterFullscreenEv(); +int APS5_VABI _ZN7WebCore17FullscreenManager18willExitFullscreenEv(); +int APS5_VABI _ZN7WebCore17FullscreenManager19willEnterFullscreenERNS_7ElementE(); +int APS5_VABI _ZN7WebCore17FullscreenManager22setAnimatingFullscreenEb(); +int APS5_VABI _ZN7WebCore17FullscreenManager27setFullscreenControlsHiddenEb(); +int APS5_VABI _ZN7WebCore17HTMLAnchorElement4textEv(); +int APS5_VABI _ZN7WebCore17HTMLAnchorElement7relListEv(); +int APS5_VABI _ZN7WebCore17HTMLButtonElement7setTypeERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore17HTMLCanvasElement25setUsesDisplayListDrawingEb(); +int APS5_VABI _ZN7WebCore17HTMLCanvasElement8setWidthEj(); +int APS5_VABI _ZN7WebCore17HTMLCanvasElement9setHeightEj(); +int APS5_VABI _ZN7WebCore17HTMLCanvasElement9toDataURLERKN3WTF6StringEN3JSC7JSValueE(); +int APS5_VABI _ZN7WebCore17HTMLCanvasElement9toDataURLERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore17HTMLOptionElement11setSelectedEb(); +int APS5_VABI _ZN7WebCore17HTMLPlugInElement14setReplacementENS_20RenderEmbeddedObject26PluginUnavailabilityReasonERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore17HTMLPlugInElement21isReplacementObscuredEv(); +int APS5_VABI _ZN7WebCore17HTMLScriptElement14setCrossOriginERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore17HTMLScriptElement8setAsyncEb(); +int APS5_VABI _ZN7WebCore17HTMLSelectElement16setSelectedIndexEi(); +int APS5_VABI _ZN7WebCore17HTMLSelectElement20optionSelectedByUserEibb(); +int APS5_VABI _ZN7WebCore17HTMLSelectElement4itemEj(); +int APS5_VABI _ZN7WebCore17HTMLSelectElement6removeEi(); +int APS5_VABI _ZN7WebCore17HTMLSelectElement7optionsEv(); +int APS5_VABI _ZN7WebCore17HTMLSelectElement7setSizeEj(); +int APS5_VABI _ZN7WebCore17HTMLSelectElement8setValueERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore17HTMLSelectElement9namedItemERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore17JSDOMGlobalObject12globalObjectEv(); +int APS5_VABI _ZN7WebCore17JSDOMGlobalObject14finishCreationERN3JSC2VMEPNS1_8JSObjectE(); +int APS5_VABI _ZN7WebCore17JSDOMGlobalObject14finishCreationERN3JSC2VME(); +int APS5_VABI _ZN7WebCore17JSDOMGlobalObject15createStructureERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore17JSDOMGlobalObject17addBuiltinGlobalsERN3JSC2VME(); +int APS5_VABI _ZN7WebCore17JSDOMGlobalObject21offsetOfWorldIsNormalEv(); +int APS5_VABI _ZN7WebCore17JSDOMGlobalObject24builtinInternalFunctionsEv(); +int APS5_VABI _ZN7WebCore17JSDOMGlobalObject4infoEv(); +int APS5_VABI _ZN7WebCore17JSDOMGlobalObject5worldEv(); +int APS5_VABI _ZN7WebCore17JSDOMGlobalObject6gcLockEv(); +int APS5_VABI _ZN7WebCore17JSDOMGlobalObjectD1Ev(); +int APS5_VABI _ZN7WebCore17JSDOMGlobalObjectD2Ev(); +int APS5_VABI _ZN7WebCore17JSDOMRectReadOnly14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore17JSDOMRectReadOnly15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore17JSDOMRectReadOnly15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore17JSDOMRectReadOnly15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore17JSDOMRectReadOnly4infoEv(); +int APS5_VABI _ZN7WebCore17JSDOMRectReadOnly9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore17JSDOMRectReadOnly9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore17JSDOMRectReadOnlyC1ERKS0_(); +int APS5_VABI _ZN7WebCore17JSDOMRectReadOnlyC2ERKS0_(); +int APS5_VABI _ZN7WebCore17JSDOMRectReadOnlyD1Ev(); +int APS5_VABI _ZN7WebCore17JSDOMRectReadOnlyD2Ev(); +int APS5_VABI _ZN7WebCore17JSDOMRectReadOnlyaSERKS0_(); +int APS5_VABI _ZN7WebCore17JSHTMLLinkElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore17JSHTMLLinkElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore17JSHTMLLinkElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore17JSHTMLLinkElement15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore17JSHTMLLinkElement4infoEv(); +int APS5_VABI _ZN7WebCore17JSHTMLLinkElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore17JSHTMLLinkElement9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore17JSHTMLLinkElementC1ERKS0_(); +int APS5_VABI _ZN7WebCore17JSHTMLLinkElementC2ERKS0_(); +int APS5_VABI _ZN7WebCore17JSHTMLLinkElementD1Ev(); +int APS5_VABI _ZN7WebCore17JSHTMLLinkElementD2Ev(); +int APS5_VABI _ZN7WebCore17JSXPathExpression9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore17LinkIconCollector12iconsOfTypesEN3WTF9OptionSetINS_12LinkIconTypeEEE(); +int APS5_VABI _ZN7WebCore17MouseRelatedEvent7offsetXEv(); +int APS5_VABI _ZN7WebCore17MouseRelatedEvent7offsetYEv(); +int APS5_VABI _ZN7WebCore17NowPlayingManagerC1Ev(); +int APS5_VABI _ZN7WebCore17NowPlayingManagerC2Ev(); +int APS5_VABI _ZN7WebCore17NowPlayingManagerD0Ev(); +int APS5_VABI _ZN7WebCore17NowPlayingManagerD1Ev(); +int APS5_VABI _ZN7WebCore17NowPlayingManagerD2Ev(); +int APS5_VABI _ZN7WebCore17NowPlayingManagerdaEPv(); +int APS5_VABI _ZN7WebCore17NowPlayingManagerdlEPv(); +int APS5_VABI _ZN7WebCore17NowPlayingManagernaEmPv(); +int APS5_VABI _ZN7WebCore17NowPlayingManagernwEm(); +int APS5_VABI _ZN7WebCore17NowPlayingManagernwEmPv(); +int APS5_VABI _ZN7WebCore17PageConfigurationD1Ev(); +int APS5_VABI _ZN7WebCore17PageConsoleClient10addMessageEN3JSC13MessageSourceENS1_12MessageLevelERKN3WTF6StringEmPNS_8DocumentE(); +int APS5_VABI _ZN7WebCore17PageConsoleClient10countResetEPN3JSC14JSGlobalObjectERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore17PageConsoleClient10profileEndEPN3JSC14JSGlobalObjectERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore17PageConsoleClient16takeHeapSnapshotEPN3JSC14JSGlobalObjectERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore17PageConsoleClient21shouldPrintExceptionsEv(); +int APS5_VABI _ZN7WebCore17PageConsoleClient24setShouldPrintExceptionsEb(); +int APS5_VABI _ZN7WebCore17PageConsoleClient4muteEv(); +int APS5_VABI _ZN7WebCore17PageConsoleClient4timeEPN3JSC14JSGlobalObjectERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore17PageConsoleClient5countEPN3JSC14JSGlobalObjectERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore17PageConsoleClient6unmuteEv(); +int APS5_VABI _ZN7WebCore17PageConsoleClient7profileEPN3JSC14JSGlobalObjectERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore17PageConsoleClient7timeEndEPN3JSC14JSGlobalObjectERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore17PageConsoleClientC1ERNS_4PageE(); +int APS5_VABI _ZN7WebCore17PageConsoleClientC2ERNS_4PageE(); +int APS5_VABI _ZN7WebCore17PageConsoleClientD0Ev(); +int APS5_VABI _ZN7WebCore17PageConsoleClientD1Ev(); +int APS5_VABI _ZN7WebCore17PageConsoleClientD2Ev(); +int APS5_VABI _ZN7WebCore17PageConsoleClientdaEPv(); +int APS5_VABI _ZN7WebCore17PageConsoleClientdlEPv(); +int APS5_VABI _ZN7WebCore17PageConsoleClientnaEmPv(); +int APS5_VABI _ZN7WebCore17PageConsoleClientnaEm(); +int APS5_VABI _ZN7WebCore17PageConsoleClientnwEm10NotNullTagPv(); +int APS5_VABI _ZN7WebCore17PageConsoleClientnwEmPv(); +int APS5_VABI _ZN7WebCore17PageConsoleClientnwEm(); +int APS5_VABI _ZN7WebCore17ResourceErrorBase7setTypeENS0_4TypeE(); +int APS5_VABI _ZN7WebCore17SQLiteTransaction5beginEv(); +int APS5_VABI _ZN7WebCore17SQLiteTransaction6commitEv(); +int APS5_VABI _ZN7WebCore17SQLiteTransaction8rollbackEv(); +int APS5_VABI _ZN7WebCore17SQLiteTransactionC1ERNS_14SQLiteDatabaseEb(); +int APS5_VABI _ZN7WebCore17SQLiteTransactionC2ERNS_14SQLiteDatabaseEb(); +int APS5_VABI _ZN7WebCore17SQLiteTransactionD1Ev(); +int APS5_VABI _ZN7WebCore17SQLiteTransactionD2Ev(); +int APS5_VABI _ZN7WebCore17TextureMapperTile5paintERNS_13TextureMapperERKNS_20TransformationMatrixEfj(); +int APS5_VABI _ZN7WebCore17cacheDOMStructureERNS_17JSDOMGlobalObjectEPN3JSC9StructureEPKNS2_9ClassInfoE(); +int APS5_VABI _ZN7WebCore17computeCurrentAgeERKNS_16ResourceResponseEN3WTF8WallTimeE(); +int APS5_VABI _ZN7WebCore17cssValueKeywordIDEN3WTF10StringViewE(); +int APS5_VABI _ZN7WebCore17isStartOfDocumentERKNS_15VisiblePositionE(); +int APS5_VABI _ZN7WebCore17standardUserAgentERKN3WTF6StringES3_(); +int APS5_VABI _ZN7WebCore17valueToByteStringERN3JSC14JSGlobalObjectENS0_7JSValueE(); +int APS5_VABI _ZN7WebCore18CustomHeaderFieldsC1ERKS0_(); +int APS5_VABI _ZN7WebCore18CustomHeaderFieldsC1Ev(); +int APS5_VABI _ZN7WebCore18CustomHeaderFieldsC2ERKS0_(); +int APS5_VABI _ZN7WebCore18CustomHeaderFieldsC2Ev(); +int APS5_VABI _ZN7WebCore18CustomHeaderFieldsD1Ev(); +int APS5_VABI _ZN7WebCore18CustomHeaderFieldsD2Ev(); +int APS5_VABI _ZN7WebCore18CustomHeaderFieldsaSERKS0_(); +int APS5_VABI _ZN7WebCore18DOMWindowExtensionD0Ev(); +int APS5_VABI _ZN7WebCore18DOMWindowExtensionD1Ev(); +int APS5_VABI _ZN7WebCore18DOMWindowExtensionD2Ev(); +int APS5_VABI _ZN7WebCore18EventLoopTaskGroup14queueMicrotaskEON3WTF8FunctionIFvvEEE(); +int APS5_VABI _ZN7WebCore18EventLoopTaskGroup9queueTaskENS_10TaskSourceEON3WTF8FunctionIFvvEEE(); +int APS5_VABI _ZN7WebCore18HTMLMarqueeElement15setScrollAmountEj(); +int APS5_VABI _ZN7WebCore18HTMLMarqueeElement4stopEv(); +int APS5_VABI _ZN7WebCore18HTMLMarqueeElement5startEv(); +int APS5_VABI _ZN7WebCore18HTMLMarqueeElement7setLoopEi(); +int APS5_VABI _ZN7WebCore18ImageBufferBackend19sinkIntoNativeImageEv(); +int APS5_VABI _ZN7WebCore18ImageBufferBackend22convertToLuminanceMaskEv(); +int APS5_VABI _ZN7WebCore18ImageBufferBackendD0Ev(); +int APS5_VABI _ZN7WebCore18ImageBufferBackendD1Ev(); +int APS5_VABI _ZN7WebCore18ImageBufferBackendD2Ev(); +int APS5_VABI _ZN7WebCore18InspectorPageAgent7frameIdEPNS_5FrameE(); +int APS5_VABI _ZN7WebCore18JSHTMLImageElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore18JSHTMLImageElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore18JSHTMLImageElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore18JSHTMLImageElement15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore18JSHTMLImageElement4infoEv(); +int APS5_VABI _ZN7WebCore18JSHTMLImageElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore18JSHTMLImageElement9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore18JSHTMLImageElementC1ERKS0_(); +int APS5_VABI _ZN7WebCore18JSHTMLImageElementC2ERKS0_(); +int APS5_VABI _ZN7WebCore18JSHTMLImageElementD1Ev(); +int APS5_VABI _ZN7WebCore18JSHTMLImageElementD2Ev(); +int APS5_VABI _ZN7WebCore18JSHTMLInputElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore18JSHTMLInputElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore18JSHTMLInputElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore18JSHTMLInputElement15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore18JSHTMLInputElement4infoEv(); +int APS5_VABI _ZN7WebCore18JSHTMLInputElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore18JSHTMLInputElement9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore18JSHTMLInputElementC1ERKS0_(); +int APS5_VABI _ZN7WebCore18JSHTMLInputElementD1Ev(); +int APS5_VABI _ZN7WebCore18JSHTMLInputElementD2Ev(); +int APS5_VABI _ZN7WebCore18JSHTMLMediaElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore18JSHTMLMediaElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore18JSHTMLMediaElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore18JSHTMLMediaElement15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore18JSHTMLMediaElement4infoEv(); +int APS5_VABI _ZN7WebCore18JSHTMLMediaElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore18JSHTMLMediaElement9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore18JSHTMLMediaElementC1ERKS0_(); +int APS5_VABI _ZN7WebCore18JSHTMLMediaElementC2ERKS0_(); +int APS5_VABI _ZN7WebCore18JSHTMLMediaElementD1Ev(); +int APS5_VABI _ZN7WebCore18JSHTMLMediaElementD2Ev(); +int APS5_VABI _ZN7WebCore18JSHTMLVideoElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore18JSHTMLVideoElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore18JSHTMLVideoElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore18JSHTMLVideoElement15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore18JSHTMLVideoElement4infoEv(); +int APS5_VABI _ZN7WebCore18JSHTMLVideoElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore18JSHTMLVideoElement9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore18JSHTMLVideoElementC1ERKS0_(); +int APS5_VABI _ZN7WebCore18JSHTMLVideoElementC2ERKS0_(); +int APS5_VABI _ZN7WebCore18JSHTMLVideoElementD1Ev(); +int APS5_VABI _ZN7WebCore18JSHTMLVideoElementD2Ev(); +int APS5_VABI _ZN7WebCore18ParsedContentRangeC1ERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore18ParsedContentRangeC1Elll(); +int APS5_VABI _ZN7WebCore18ParsedContentRangeC2ERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore18ParsedContentRangeC2Elll(); +int APS5_VABI _ZN7WebCore18PerformanceLogging21memoryUsageStatisticsENS_34ShouldIncludeExpensiveComputationsE(); +int APS5_VABI _ZN7WebCore18PerformanceLogging22javaScriptObjectCountsEv(); +int APS5_VABI _ZN7WebCore18PlatformPasteboard5writeERKN3WTF6StringES4_(); +int APS5_VABI _ZN7WebCore18PlatformPasteboard5writeERKN3WTF6VectorINS_20PasteboardCustomDataELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE(); +int APS5_VABI _ZN7WebCore18PlatformPasteboard5writeERKNS_20PasteboardCustomDataE(); +int APS5_VABI _ZN7WebCore18PlatformPasteboard5writeERKNS_20PasteboardWebContentE(); +int APS5_VABI _ZN7WebCore18PlatformPasteboardC1ERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore18PlatformPasteboardC1Ev(); +int APS5_VABI _ZN7WebCore18PlatformPasteboardC2ERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore18PlatformPasteboardC2Ev(); +int APS5_VABI _ZN7WebCore18PlatformTimeRanges13intersectWithERKS0_(); +int APS5_VABI _ZN7WebCore18PlatformTimeRanges3addERKN3WTF9MediaTimeES4_(); +int APS5_VABI _ZN7WebCore18PlatformTimeRanges5clearEv(); +int APS5_VABI _ZN7WebCore18PlatformTimeRanges6invertEv(); +int APS5_VABI _ZN7WebCore18PlatformTimeRanges9unionWithERKS0_(); +int APS5_VABI _ZN7WebCore18PlatformTimeRangesC1EON3WTF6VectorINS0_5RangeELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE(); +int APS5_VABI _ZN7WebCore18PlatformTimeRangesC1ERKN3WTF9MediaTimeES4_(); +int APS5_VABI _ZN7WebCore18PlatformTimeRangesC1ERKS0_(); +int APS5_VABI _ZN7WebCore18PlatformTimeRangesC1Ev(); +int APS5_VABI _ZN7WebCore18PlatformTimeRangesC2EON3WTF6VectorINS0_5RangeELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE(); +int APS5_VABI _ZN7WebCore18PlatformTimeRangesC2ERKN3WTF9MediaTimeES4_(); +int APS5_VABI _ZN7WebCore18PlatformTimeRangesC2ERKS0_(); +int APS5_VABI _ZN7WebCore18PlatformTimeRangesC2Ev(); +int APS5_VABI _ZN7WebCore18PlatformTimeRangesD1Ev(); +int APS5_VABI _ZN7WebCore18PlatformTimeRangesD2Ev(); +int APS5_VABI _ZN7WebCore18PlatformTimeRangesaSERKS0_(); +int APS5_VABI _ZN7WebCore18PlatformTimeRangesdaEPv(); +int APS5_VABI _ZN7WebCore18PlatformTimeRangesdlEPv(); +int APS5_VABI _ZN7WebCore18PlatformTimeRangesnaEmPv(); +int APS5_VABI _ZN7WebCore18PlatformTimeRangesnwEm10NotNullTagPv(); +int APS5_VABI _ZN7WebCore18PlatformTimeRangesnwEm(); +int APS5_VABI _ZN7WebCore18PlatformTimeRangesnwEmPv(); +int APS5_VABI _ZN7WebCore18PluginInfoProvider10removePageERNS_4PageE(); +int APS5_VABI _ZN7WebCore18PluginInfoProvider20clearPagesPluginDataEv(); +int APS5_VABI _ZN7WebCore18PluginInfoProvider7addPageERNS_4PageE(); +int APS5_VABI _ZN7WebCore18PluginInfoProvider7refreshEb(); +int APS5_VABI _ZN7WebCore18PluginInfoProviderC2Ev(); +int APS5_VABI _ZN7WebCore18PluginInfoProviderD0Ev(); +int APS5_VABI _ZN7WebCore18PluginInfoProviderD1Ev(); +int APS5_VABI _ZN7WebCore18PluginInfoProviderD2Ev(); +int APS5_VABI _ZN7WebCore18PrewarmInformationC1ERKS0_(); +int APS5_VABI _ZN7WebCore18PrewarmInformationC1Ev(); +int APS5_VABI _ZN7WebCore18PrewarmInformationC2ERKS0_(); +int APS5_VABI _ZN7WebCore18PrewarmInformationC2Ev(); +int APS5_VABI _ZN7WebCore18PrewarmInformationD1Ev(); +int APS5_VABI _ZN7WebCore18PrewarmInformationD2Ev(); +int APS5_VABI _ZN7WebCore18PrewarmInformationaSERKS0_(); +int APS5_VABI _ZN7WebCore18PrewarmInformationdaEPv(); +int APS5_VABI _ZN7WebCore18PrewarmInformationdlEPv(); +int APS5_VABI _ZN7WebCore18PrewarmInformationnaEm(); +int APS5_VABI _ZN7WebCore18PrewarmInformationnwEmPv(); +int APS5_VABI _ZN7WebCore18PrewarmInformationnwEm(); +int APS5_VABI _ZN7WebCore18RenderLayerBacking25setUsesDisplayListDrawingEb(); +int APS5_VABI _ZN7WebCore18RenderLayerBacking30setIsTrackingDisplayListReplayEb(); +int APS5_VABI _ZN7WebCore18StyleSheetContents11parseStringERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore18StyleSheetContentsC1EPNS_15StyleRuleImportERKN3WTF6StringERKNS_16CSSParserContextE(); +int APS5_VABI _ZN7WebCore18StyleSheetContentsC2EPNS_15StyleRuleImportERKN3WTF6StringERKNS_16CSSParserContextE(); +int APS5_VABI _ZN7WebCore18StyleSheetContentsD1Ev(); +int APS5_VABI _ZN7WebCore18StyleSheetContentsD2Ev(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer10setFiltersERKNS_16FilterOperationsE(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer10setOpacityEf(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer11setChildrenERKN3WTF6VectorIPS0_Lm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer11setPositionERKNS_10FloatPointE(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer12setMaskLayerEPS0_(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer12setTransformERKNS_20TransformationMatrixE(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer12sortByZOrderERN3WTF6VectorIPS0_Lm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer13setAnimationsERKN7Nicosia10AnimationsE(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer13setSolidColorERKNS_5ColorE(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer14setAnchorPointERKNS_12FloatPoint3DE(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer14setPreserves3DEb(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer14syncAnimationsEN3WTF13MonotonicTimeE(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer15setBackingStoreEPNS_25TextureMapperBackingStoreE(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer15setContentsRectERKNS_9FloatRectE(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer15setDebugVisualsEbRKNS_5ColorEf(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer15setDrawsContentEb(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer15setReplicaLayerEPS0_(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer16removeFromParentEv(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer16replicaTransformEv(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer16setBackdropLayerEPS0_(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer16setContentsLayerEPNS_26TextureMapperPlatformLayerE(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer16setMasksToBoundsEb(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer17removeAllChildrenEv(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer17setContentsOpaqueEb(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer17setRepaintCounterEbi(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer18setContentsVisibleEb(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer19setContentsTileSizeERKNS_9FloatSizeE(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer20setChildrenTransformERKNS_20TransformationMatrixE(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer20setContentsTilePhaseERKNS_9FloatSizeE(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer21setBackfaceVisibilityEb(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer23setContentsClippingRectERKNS_16FloatRoundedRectE(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer26applyAnimationsRecursivelyEN3WTF13MonotonicTimeE(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer29setAnimatedBackingStoreClientEPN7Nicosia26AnimatedBackingStoreClientE(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer2idEv(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer5setIDEj(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer7setSizeERKNS_9FloatSizeE(); +int APS5_VABI _ZN7WebCore18TextureMapperLayer8addChildEPS0_(); +int APS5_VABI _ZN7WebCore18TextureMapperLayerC1Ev(); +int APS5_VABI _ZN7WebCore18TextureMapperLayerC2Ev(); +int APS5_VABI _ZN7WebCore18TextureMapperLayerD0Ev(); +int APS5_VABI _ZN7WebCore18TextureMapperLayerD1Ev(); +int APS5_VABI _ZN7WebCore18TextureMapperLayerD2Ev(); +int APS5_VABI _ZN7WebCore18TextureMapperLayerdaEPv(); +int APS5_VABI _ZN7WebCore18TextureMapperLayerdlEPv(); +int APS5_VABI _ZN7WebCore18TextureMapperLayernaEmPv(); +int APS5_VABI _ZN7WebCore18TextureMapperLayernaEm(); +int APS5_VABI _ZN7WebCore18TextureMapperLayernwEm10NotNullTagPv(); +int APS5_VABI _ZN7WebCore18TextureMapperLayernwEmPv(); +int APS5_VABI _ZN7WebCore18TextureMapperLayernwEm(); +int APS5_VABI _ZN7WebCore18composedTreeAsTextERNS_13ContainerNodeENS_22ComposedTreeAsTextModeE(); +int APS5_VABI _ZN7WebCore18documentTypeStringERKNS_8DocumentE(); +int APS5_VABI _ZN7WebCore18isEditablePositionERKNS_8PositionENS_12EditableTypeE(); +int APS5_VABI _ZN7WebCore18isStartOfParagraphERKNS_15VisiblePositionENS_27EditingBoundaryCrossingRuleE(); +int APS5_VABI _ZN7WebCore18isValidContentTypeERKN3WTF6StringENS_4ModeE(); +int APS5_VABI _ZN7WebCore18platformStrategiesEv(); +int APS5_VABI _ZN7WebCore18pluginScriptObjectEPN3JSC14JSGlobalObjectEPNS_13JSHTMLElementE(); +int APS5_VABI _ZN7WebCore18pluginTooSmallTextEv(); +int APS5_VABI _ZN7WebCore18throwThisTypeErrorERN3JSC14JSGlobalObjectERNS0_10ThrowScopeEPKcS6_(); +int APS5_VABI _ZN7WebCore19AccessibilityObject13isARIAControlENS_17AccessibilityRoleE(); +int APS5_VABI _ZN7WebCore19AccessibilityObject21ariaRoleToWebCoreRoleERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore19BlurFilterOperation6createENS_6LengthE(); +int APS5_VABI _ZN7WebCore19BlurFilterOperationC1ENS_6LengthE(); +int APS5_VABI _ZN7WebCore19BlurFilterOperationC2ENS_6LengthE(); +int APS5_VABI _ZN7WebCore19BlurFilterOperationD0Ev(); +int APS5_VABI _ZN7WebCore19BlurFilterOperationD1Ev(); +int APS5_VABI _ZN7WebCore19BlurFilterOperationD2Ev(); +int APS5_VABI _ZN7WebCore19HTMLTableColElement7setSpanEj(); +int APS5_VABI _ZN7WebCore19HTMLTableRowElement10deleteCellEi(); +int APS5_VABI _ZN7WebCore19HTMLTableRowElement10insertCellEi(); +int APS5_VABI _ZN7WebCore19HTMLTableRowElement5cellsEv(); +int APS5_VABI _ZN7WebCore19HTMLTextAreaElement7setColsEj(); +int APS5_VABI _ZN7WebCore19HTMLTextAreaElement7setRowsEj(); +int APS5_VABI _ZN7WebCore19InspectorController13setIndicatingEb(); +int APS5_VABI _ZN7WebCore19InspectorController15connectFrontendERN9Inspector15FrontendChannelEbb(); +int APS5_VABI _ZN7WebCore19InspectorController15ensurePageAgentEv(); +int APS5_VABI _ZN7WebCore19InspectorController18disconnectFrontendERN9Inspector15FrontendChannelE(); +int APS5_VABI _ZN7WebCore19InspectorController22disconnectAllFrontendsEv(); +int APS5_VABI _ZN7WebCore19InspectorController25evaluateForTestInFrontendERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore19InspectorController26setInspectorFrontendClientEPNS_23InspectorFrontendClientE(); +int APS5_VABI _ZN7WebCore19InspectorController27dispatchMessageFromFrontendERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore19InspectorController4showEv(); +int APS5_VABI _ZN7WebCore19JSAnimationTimeline14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore19JSAnimationTimeline15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore19JSAnimationTimeline15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore19JSAnimationTimeline15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore19JSAnimationTimeline4infoEv(); +int APS5_VABI _ZN7WebCore19JSAnimationTimeline9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore19JSAnimationTimeline9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore19JSAnimationTimelineC1ERKS0_(); +int APS5_VABI _ZN7WebCore19JSAnimationTimelineC2ERKS0_(); +int APS5_VABI _ZN7WebCore19JSAnimationTimelineD1Ev(); +int APS5_VABI _ZN7WebCore19JSAnimationTimelineD2Ev(); +int APS5_VABI _ZN7WebCore19JSAnimationTimelineaSERKS0_(); +int APS5_VABI _ZN7WebCore19JSDOMImplementation9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore19JSDOMMatrixReadOnly14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore19JSDOMMatrixReadOnly15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore19JSDOMMatrixReadOnly15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore19JSDOMMatrixReadOnly15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore19JSDOMMatrixReadOnly4infoEv(); +int APS5_VABI _ZN7WebCore19JSDOMMatrixReadOnly9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore19JSDOMMatrixReadOnly9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore19JSDOMMatrixReadOnlyC1ERKS0_(); +int APS5_VABI _ZN7WebCore19JSDOMMatrixReadOnlyC2ERKS0_(); +int APS5_VABI _ZN7WebCore19JSDOMMatrixReadOnlyD1Ev(); +int APS5_VABI _ZN7WebCore19JSDOMMatrixReadOnlyD2Ev(); +int APS5_VABI _ZN7WebCore19JSDOMMatrixReadOnlyaSERKS0_(); +int APS5_VABI _ZN7WebCore19JSHTMLSelectElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore19JSHTMLSelectElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore19JSHTMLSelectElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore19JSHTMLSelectElement15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore19JSHTMLSelectElement4infoEv(); +int APS5_VABI _ZN7WebCore19JSHTMLSelectElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore19JSHTMLSelectElement9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore19JSHTMLSelectElementC1ERKS0_(); +int APS5_VABI _ZN7WebCore19JSHTMLSelectElementC2ERKS0_(); +int APS5_VABI _ZN7WebCore19JSHTMLSelectElementD1Ev(); +int APS5_VABI _ZN7WebCore19JSHTMLSelectElementD2Ev(); +int APS5_VABI _ZN7WebCore19MediaElementSession22addBehaviorRestrictionEj(); +int APS5_VABI _ZN7WebCore19MediaElementSession25removeBehaviorRestrictionEj(); +int APS5_VABI _ZN7WebCore19MediaElementSession25updateMediaUsageIfChangedEv(); +int APS5_VABI _ZN7WebCore19MediaResourceLoader25recordResponsesForTestingEv(); +int APS5_VABI _ZN7WebCore19MediaResourceLoaderD0Ev(); +int APS5_VABI _ZN7WebCore19MediaResourceLoaderD1Ev(); +int APS5_VABI _ZN7WebCore19MediaResourceLoaderD2Ev(); +int APS5_VABI _ZN7WebCore19ProtectionSpaceBase7compareERKNS_15ProtectionSpaceES3_(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase11setPriorityENS_20ResourceLoadPriorityE(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase12clearPurposeEv(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase12setIsTopSiteEb(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase13partitionNameERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase13setHTTPMethodERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase13setIsSameSiteEb(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase14setCachePolicyENS_26ResourceRequestCachePolicyE(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase15clearHTTPOriginEv(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase15setHTTPReferrerERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase16setHTTPUserAgentERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase17clearHTTPReferrerEv(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase17makeUnconditionalEv(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase17setAsIsolatedCopyERKNS_15ResourceRequestE(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase17setCachePartitionERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase18addHTTPHeaderFieldENS_14HTTPHeaderNameERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase18addHTTPHeaderFieldERKN3WTF6StringES4_(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase18setHTTPContentTypeERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase18setHTTPHeaderFieldENS_14HTTPHeaderNameERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase18setHTTPHeaderFieldERKN3WTF6StringES4_(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase19setHTTPHeaderFieldsENS_13HTTPHeaderMapE(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase20clearHTTPContentTypeEv(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase22clearHTTPAuthorizationEv(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase22defaultTimeoutIntervalEv(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase23setFirstPartyForCookiesERKN3WTF3URLE(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase25setDefaultTimeoutIntervalEd(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase30addHTTPHeaderFieldIfNotPresentENS_14HTTPHeaderNameERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase37setExistingHTTPReferrerToOriginStringEv(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase50setResponseContentDispositionEncodingFallbackArrayERKN3WTF6StringES4_S4_(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase5equalERKNS_15ResourceRequestES3_(); +int APS5_VABI _ZN7WebCore19ResourceRequestBase6setURLERKN3WTF3URLE(); +int APS5_VABI _ZN7WebCore19StorageQuotaManager20resetQuotaForTestingEv(); +int APS5_VABI _ZN7WebCore19StorageQuotaManager24requestSpaceOnMainThreadEmON3WTF17CompletionHandlerIFvNS0_8DecisionEEEE(); +int APS5_VABI _ZN7WebCore19StorageQuotaManager30requestSpaceOnBackgroundThreadEm(); +int APS5_VABI _ZN7WebCore19StorageQuotaManager39resetQuotaUpdatedBasedOnUsageForTestingEv(); +int APS5_VABI _ZN7WebCore19TextResourceDecoder14decodeAndFlushEPKcm(); +int APS5_VABI _ZN7WebCore19TextResourceDecoder5flushEv(); +int APS5_VABI _ZN7WebCore19TextResourceDecoder6decodeEPKcm(); +int APS5_VABI _ZN7WebCore19TextResourceDecoderD1Ev(); +int APS5_VABI _ZN7WebCore19TextResourceDecoderD2Ev(); +int APS5_VABI _ZN7WebCore19TextTrackCueGeneric6createERNS_22ScriptExecutionContextERKN3WTF9MediaTimeES6_RKNS3_6StringE(); +int APS5_VABI _ZN7WebCore19UserContentProvider54invalidateInjectedStyleSheetCacheInAllFramesInAllPagesEv(); +int APS5_VABI _ZN7WebCore19UserContentProvider60invalidateAllRegisteredUserMessageHandlerInvalidationClientsEv(); +int APS5_VABI _ZN7WebCore19UserContentProviderC2Ev(); +int APS5_VABI _ZN7WebCore19UserContentProviderD0Ev(); +int APS5_VABI _ZN7WebCore19UserContentProviderD1Ev(); +int APS5_VABI _ZN7WebCore19UserContentProviderD2Ev(); +int APS5_VABI _ZN7WebCore19enclosingLayoutRectERKNS_9FloatRectE(); +int APS5_VABI _ZN7WebCore19floatValueForLengthERKNS_6LengthEf(); +int APS5_VABI _ZN7WebCore19makeMapBetweenRectsERKNS_9FloatRectES2_(); +int APS5_VABI _ZN7WebCore19serializationForCSSERKNS_5ColorE(); +int APS5_VABI _ZN7WebCore19toAutofillFieldNameERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore19unitedBoundingBoxesERKN3WTF6VectorINS_9FloatQuadELm0ENS0_15CrashOnOverflowELm16ENS0_10FastMallocEEE(); +int APS5_VABI _ZN7WebCore19watchAdaptationNameEv(); +int APS5_VABI _ZN7WebCore20ApplicationCacheHost17maybeLoadResourceERNS_14ResourceLoaderERKNS_15ResourceRequestERKN3WTF3URLE(); +int APS5_VABI _ZN7WebCore20ApplicationCacheHost25maybeLoadFallbackForErrorEPNS_14ResourceLoaderERKNS_13ResourceErrorE(); +int APS5_VABI _ZN7WebCore20ApplicationCacheHost28maybeLoadFallbackForRedirectEPNS_14ResourceLoaderERNS_15ResourceRequestERKNS_16ResourceResponseE(); +int APS5_VABI _ZN7WebCore20ApplicationCacheHost28maybeLoadFallbackForResponseEPNS_14ResourceLoaderERKNS_16ResourceResponseE(); +int APS5_VABI _ZN7WebCore20CanvasActivityRecord27recordWrittenOrMeasuredTextERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore20FocusNavigationScope7scopeOfERNS_4NodeE(); +int APS5_VABI _ZN7WebCore20HTMLFrameElementBase11setLocationERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore20HTMLTableCellElement10setColSpanEj(); +int APS5_VABI _ZN7WebCore20HTMLTableCellElement21setRowSpanForBindingsEj(); +int APS5_VABI _ZN7WebCore20HTMLTableCellElement8setScopeERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore20ISOOriginalFormatBox11boxTypeNameEv(); +int APS5_VABI _ZN7WebCore20ISOOriginalFormatBox5parseERN3JSC8DataViewERj(); +int APS5_VABI _ZN7WebCore20ISOOriginalFormatBoxC1ERKS0_(); +int APS5_VABI _ZN7WebCore20ISOOriginalFormatBoxC1Ev(); +int APS5_VABI _ZN7WebCore20ISOOriginalFormatBoxC2ERKS0_(); +int APS5_VABI _ZN7WebCore20ISOOriginalFormatBoxC2Ev(); +int APS5_VABI _ZN7WebCore20ISOOriginalFormatBoxD0Ev(); +int APS5_VABI _ZN7WebCore20ISOOriginalFormatBoxD1Ev(); +int APS5_VABI _ZN7WebCore20ISOOriginalFormatBoxD2Ev(); +int APS5_VABI _ZN7WebCore20ISOOriginalFormatBoxaSERKS0_(); +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry15isBuiltinSchemeERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry24registerURLSchemeAsLocalERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry25registerURLSchemeAsSecureERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry27registerURLSchemeAsNoAccessERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry30registerURLSchemeAsCORSEnabledERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry32registerURLSchemeAsEmptyDocumentERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry34registerURLSchemeAsDisplayIsolatedERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry35registerURLSchemeAsCachePartitionedERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry36allURLSchemesRegisteredAsCORSEnabledEv(); +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry36registerAsCanDisplayOnlyIfCanRequestERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry36registerURLSchemeAsAlwaysRevalidatedERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry40setDomainRelaxationForbiddenForURLSchemeEbRKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry49registerURLSchemeAsBypassingContentSecurityPolicyERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry57removeURLSchemeRegisteredAsBypassingContentSecurityPolicyERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore20LegacySchemeRegistry58registerURLSchemeAsAllowingDatabaseAccessInPrivateBrowsingERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore20LowPowerModeNotifierC1EON3WTF8FunctionIFvbEEE(); +int APS5_VABI _ZN7WebCore20LowPowerModeNotifierC2EON3WTF8FunctionIFvbEEE(); +int APS5_VABI _ZN7WebCore20LowPowerModeNotifierD1Ev(); +int APS5_VABI _ZN7WebCore20LowPowerModeNotifierD2Ev(); +int APS5_VABI _ZN7WebCore20NetworkStateNotifier11addListenerEON3WTF8FunctionIFvbEEE(); +int APS5_VABI _ZN7WebCore20NetworkStateNotifier6onLineEv(); +int APS5_VABI _ZN7WebCore20NetworkStateNotifier9singletonEv(); +int APS5_VABI _ZN7WebCore20PasteboardCustomData16fromSharedBufferERKNS_12SharedBufferE(); +int APS5_VABI _ZN7WebCore20PasteboardCustomData22fromPersistenceDecoderEON3WTF11Persistence7DecoderE(); +int APS5_VABI _ZN7WebCore20PasteboardCustomData5EntryC1EOS1_(); +int APS5_VABI _ZN7WebCore20PasteboardCustomData5EntryC1ERKS1_(); +int APS5_VABI _ZN7WebCore20PasteboardCustomData5EntryC1Ev(); +int APS5_VABI _ZN7WebCore20PasteboardCustomData5EntryC2EOS1_(); +int APS5_VABI _ZN7WebCore20PasteboardCustomData5EntryC2ERKS1_(); +int APS5_VABI _ZN7WebCore20PasteboardCustomData5EntryC2Ev(); +int APS5_VABI _ZN7WebCore20PasteboardCustomData5EntryaSEOS1_(); +int APS5_VABI _ZN7WebCore20PasteboardCustomData5EntryaSERKS1_(); +int APS5_VABI _ZN7WebCore20PasteboardCustomDataC1EON3WTF6StringEONS1_6VectorINS0_5EntryELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE(); +int APS5_VABI _ZN7WebCore20PasteboardCustomDataC1EOS0_(); +int APS5_VABI _ZN7WebCore20PasteboardCustomDataC1ERKS0_(); +int APS5_VABI _ZN7WebCore20PasteboardCustomDataC1Ev(); +int APS5_VABI _ZN7WebCore20PasteboardCustomDataC2EON3WTF6StringEONS1_6VectorINS0_5EntryELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE(); +int APS5_VABI _ZN7WebCore20PasteboardCustomDataC2EOS0_(); +int APS5_VABI _ZN7WebCore20PasteboardCustomDataC2ERKS0_(); +int APS5_VABI _ZN7WebCore20PasteboardCustomDataC2Ev(); +int APS5_VABI _ZN7WebCore20PasteboardCustomDataD1Ev(); +int APS5_VABI _ZN7WebCore20PasteboardCustomDataD2Ev(); +int APS5_VABI _ZN7WebCore20PasteboardCustomDataaSERKS0_(); +int APS5_VABI _ZN7WebCore20PasteboardWriterData10WebContentD1Ev(); +int APS5_VABI _ZN7WebCore20PasteboardWriterData10WebContentD2Ev(); +int APS5_VABI _ZN7WebCore20PasteboardWriterDataC1Ev(); +int APS5_VABI _ZN7WebCore20PasteboardWriterDataC2Ev(); +int APS5_VABI _ZN7WebCore20PasteboardWriterDataD1Ev(); +int APS5_VABI _ZN7WebCore20PasteboardWriterDataD2Ev(); +int APS5_VABI _ZN7WebCore20RenderEmbeddedObject29setPluginUnavailabilityReasonENS0_26PluginUnavailabilityReasonE(); +int APS5_VABI _ZN7WebCore20RenderEmbeddedObject37setUnavailablePluginIndicatorIsHiddenEb(); +int APS5_VABI _ZN7WebCore20RenderEmbeddedObject44setPluginUnavailabilityReasonWithDescriptionENS0_26PluginUnavailabilityReasonERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore20ResourceHandleClientC2Ev(); +int APS5_VABI _ZN7WebCore20ResourceHandleClientD1Ev(); +int APS5_VABI _ZN7WebCore20ResourceHandleClientD2Ev(); +int APS5_VABI _ZN7WebCore20ResourceLoadObserver14sharedIfExistsEv(); +int APS5_VABI _ZN7WebCore20ResourceLoadObserver6sharedEv(); +int APS5_VABI _ZN7WebCore20ResourceLoadObserver9setSharedERS0_(); +int APS5_VABI _ZN7WebCore20ResourceResponseBase17setHTTPStatusCodeEi(); +int APS5_VABI _ZN7WebCore20ResourceResponseBase18addHTTPHeaderFieldENS_14HTTPHeaderNameERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore20ResourceResponseBase18addHTTPHeaderFieldERKN3WTF6StringES4_(); +int APS5_VABI _ZN7WebCore20ResourceResponseBase18setHTTPHeaderFieldENS_14HTTPHeaderNameERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore20ResourceResponseBase18setHTTPHeaderFieldERKN3WTF6StringES4_(); +int APS5_VABI _ZN7WebCore20ResourceResponseBase24sanitizeHTTPHeaderFieldsENS0_16SanitizationTypeE(); +int APS5_VABI _ZN7WebCore20ResourceResponseBase24setExpectedContentLengthEx(); +int APS5_VABI _ZN7WebCore20ResourceResponseBase25sanitizeSuggestedFilenameERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore20ResourceResponseBase25syntheticRedirectResponseERKN3WTF3URLES4_(); +int APS5_VABI _ZN7WebCore20ResourceResponseBase6setURLERKN3WTF3URLE(); +int APS5_VABI _ZN7WebCore20ResourceResponseBase7setTypeENS0_4TypeE(); +int APS5_VABI _ZN7WebCore20ResourceResponseBaseC1ERKN3WTF3URLERKNS1_6StringExS7_(); +int APS5_VABI _ZN7WebCore20ResourceResponseBaseC1Ev(); +int APS5_VABI _ZN7WebCore20ResourceResponseBaseC2ERKN3WTF3URLERKNS1_6StringExS7_(); +int APS5_VABI _ZN7WebCore20ResourceResponseBaseC2Ev(); +int APS5_VABI _ZN7WebCore20SVGPathStringBuilder12curveToCubicERKNS_10FloatPointES3_S3_NS_18PathCoordinateModeE(); +int APS5_VABI _ZN7WebCore20SVGPathStringBuilder16curveToQuadraticERKNS_10FloatPointES3_NS_18PathCoordinateModeE(); +int APS5_VABI _ZN7WebCore20SVGPathStringBuilder6lineToERKNS_10FloatPointENS_18PathCoordinateModeE(); +int APS5_VABI _ZN7WebCore20SVGPathStringBuilder6moveToERKNS_10FloatPointEbNS_18PathCoordinateModeE(); +int APS5_VABI _ZN7WebCore20SVGPathStringBuilder6resultEv(); +int APS5_VABI _ZN7WebCore20SVGPathStringBuilder9closePathEv(); +int APS5_VABI _ZN7WebCore20SVGPathStringBuilderC2Ev(); +int APS5_VABI _ZN7WebCore20SVGPathStringBuilderD0Ev(); +int APS5_VABI _ZN7WebCore20SVGPathStringBuilderD1Ev(); +int APS5_VABI _ZN7WebCore20SVGPathStringBuilderD2Ev(); +int APS5_VABI _ZN7WebCore20ScrollingCoordinator13pageDestroyedEv(); +int APS5_VABI _ZN7WebCore20ScrollingCoordinator45setForceSynchronousScrollLayerPositionUpdatesEb(); +int APS5_VABI _ZN7WebCore20UserGestureIndicator18currentUserGestureEv(); +int APS5_VABI _ZN7WebCore20UserGestureIndicator29processingUserGestureForMediaEv(); +int APS5_VABI _ZN7WebCore20UserGestureIndicatorD1Ev(); +int APS5_VABI _ZN7WebCore20UserGestureIndicatorD2Ev(); +int APS5_VABI _ZN7WebCore20endOfEditableContentERKNS_15VisiblePositionE(); +int APS5_VABI _ZN7WebCore20findClosestPlainTextERKNS_11SimpleRangeERKN3WTF6StringENS3_9OptionSetINS_14FindOptionFlagEEEm(); +int APS5_VABI _ZN7WebCore20httpHeaderNameStringENS_14HTTPHeaderNameE(); +int APS5_VABI _ZN7WebCore20lastOffsetForEditingERKNS_4NodeE(); +int APS5_VABI _ZN7WebCore20nextSentencePositionERKNS_15VisiblePositionE(); +int APS5_VABI _ZN7WebCore20previousWordPositionERKNS_15VisiblePositionE(); +int APS5_VABI _ZN7WebCore20serializationForHTMLERKNS_5ColorE(); +int APS5_VABI _ZN7WebCore21AudioHardwareListener6createERNS0_6ClientE(); +int APS5_VABI _ZN7WebCore21BackForwardController11currentItemEv(); +int APS5_VABI _ZN7WebCore21BackForwardController11forwardItemEv(); +int APS5_VABI _ZN7WebCore21BackForwardController11itemAtIndexEi(); +int APS5_VABI _ZN7WebCore21BackForwardController6goBackEv(); +int APS5_VABI _ZN7WebCore21BackForwardController8backItemEv(); +int APS5_VABI _ZN7WebCore21BackForwardController9goForwardEv(); +int APS5_VABI _ZN7WebCore21BlobDataFileReference16revokeFileAccessEv(); +int APS5_VABI _ZN7WebCore21BlobDataFileReference20prepareForFileAccessEv(); +int APS5_VABI _ZN7WebCore21BlobDataFileReference26startTrackingModificationsEv(); +int APS5_VABI _ZN7WebCore21BlobDataFileReference4pathEv(); +int APS5_VABI _ZN7WebCore21BlobDataFileReference4sizeEv(); +int APS5_VABI _ZN7WebCore21BlobDataFileReference6createERKN3WTF6StringES4_(); +int APS5_VABI _ZN7WebCore21BlobDataFileReferenceC1ERKN3WTF6StringES4_(); +int APS5_VABI _ZN7WebCore21BlobDataFileReferenceC2ERKN3WTF6StringES4_(); +int APS5_VABI _ZN7WebCore21BlobDataFileReferenceD0Ev(); +int APS5_VABI _ZN7WebCore21BlobDataFileReferenceD1Ev(); +int APS5_VABI _ZN7WebCore21BlobDataFileReferenceD2Ev(); +int APS5_VABI _ZN7WebCore21ComplexTextController14ComplexTextRunC1ERKN3WTF6VectorINS_9FloatSizeELm0ENS2_15CrashOnOverflowELm16ENS2_10FastMallocEEERKNS3_INS_10FloatPointELm0ES5_Lm16ES6_EERKNS3_ItLm0ES5_Lm16ES6_EERKNS3_IjLm0ES5_Lm16ES6_EES4_RKNS_4FontEPKDsjjjjb(); +int APS5_VABI _ZN7WebCore21ComplexTextController14ComplexTextRunC2ERKN3WTF6VectorINS_9FloatSizeELm0ENS2_15CrashOnOverflowELm16ENS2_10FastMallocEEERKNS3_INS_10FloatPointELm0ES5_Lm16ES6_EERKNS3_ItLm0ES5_Lm16ES6_EERKNS3_IjLm0ES5_Lm16ES6_EES4_RKNS_4FontEPKDsjjjjb(); +int APS5_VABI _ZN7WebCore21ContentSecurityPolicy17didReceiveHeadersERKNS_36ContentSecurityPolicyResponseHeadersEON3WTF6StringENS0_19ReportParsingErrorsE(); +int APS5_VABI _ZN7WebCore21ContentSecurityPolicyD1Ev(); +int APS5_VABI _ZN7WebCore21ContentSecurityPolicyD2Ev(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys10webViewKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys11cpuUsageKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys11inactiveKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys11occurredKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys11timedOutKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys12retrievalKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys13webGLStateKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys14streamingMediaEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys15isAttachmentKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys15networkCacheKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys15revalidatingKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys16internalErrorKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys16notHTTPFamilyKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys17userZoomActionKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys18neverSeenBeforeKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys18noLongerInCacheKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys18nonVisibleStateKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys18unlikelyToReuseKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys19invalidSessionIDKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys19retrievalRequestKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys20needsRevalidationKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys20telemetryPageLoadKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys21domainCausingCrashKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys21simulatedPageCrashKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys22backNavigationDeltaKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys22cacheControlNoStoreKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys22domainCausingJetsamKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys22unknownEntryRequestKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys23isConditionalRequestKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys24activeInForegroundTabKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys24networkProcessCrashedKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys24uncacheableStatusCodeKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys24unsupportedHTTPMethodKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys24varyingHeaderMismatchKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys24visibleAndActiveStateKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys24visibleNonActiveStateKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys25failedLessThan2SecondsKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys25failedLessThan5SecondsKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys25missingValidatorFieldsKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys26entryRightlyNotWarmedUpKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys26entryWronglyNotWarmedUpKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys26failedLessThan20SecondsKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys26failedMoreThan20SecondsKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys27canceledLessThan2SecondsKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys27canceledLessThan5SecondsKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys27createSharedBufferFailedKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys27networkCacheReuseFailureKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys27networkCacheUnusedReasonKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys27synchronousMessageFailedKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys28activeInBackgroundTabOnlyKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys28canceledLessThan20SecondsKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys28canceledMoreThan20SecondsKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys28exceededActiveMemoryLimitKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys28isReloadIgnoringCacheDataKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys28networkCacheFailureReasonKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys28succeededLessThan2SecondsKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys28succeededLessThan5SecondsKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys29exceededBackgroundCPULimitKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys29succeededLessThan20SecondsKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys29succeededMoreThan20SecondsKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys30exceededInactiveMemoryLimitKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys33memoryUsageToDiagnosticLoggingKeyEm(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys40backgroundCPUUsageToDiagnosticLoggingKeyEd(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys40foregroundCPUUsageToDiagnosticLoggingKeyEd(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys42wastedSpeculativeWarmupWithRevalidationKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys45wastedSpeculativeWarmupWithoutRevalidationKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys46successfulSpeculativeWarmupWithRevalidationKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys49successfulSpeculativeWarmupWithoutRevalidationKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys8otherKeyEv(); +int APS5_VABI _ZN7WebCore21DiagnosticLoggingKeys9unusedKeyEv(); +int APS5_VABI _ZN7WebCore21DisplayRefreshMonitorC2Ej(); +int APS5_VABI _ZN7WebCore21DisplayRefreshMonitorD0Ev(); +int APS5_VABI _ZN7WebCore21DisplayRefreshMonitorD1Ev(); +int APS5_VABI _ZN7WebCore21DisplayRefreshMonitorD2Ev(); +int APS5_VABI _ZN7WebCore21HTMLOptionsCollection16setSelectedIndexEi(); +int APS5_VABI _ZN7WebCore21HTMLOptionsCollection6removeEi(); +int APS5_VABI _ZN7WebCore21HTMLOptionsCollection9setLengthEj(); +int APS5_VABI _ZN7WebCore21ISOTrackEncryptionBox11boxTypeNameEv(); +int APS5_VABI _ZN7WebCore21ISOTrackEncryptionBox5parseERN3JSC8DataViewERj(); +int APS5_VABI _ZN7WebCore21ISOTrackEncryptionBoxC1ERKS0_(); +int APS5_VABI _ZN7WebCore21ISOTrackEncryptionBoxC2ERKS0_(); +int APS5_VABI _ZN7WebCore21ISOTrackEncryptionBoxC2Ev(); +int APS5_VABI _ZN7WebCore21ISOTrackEncryptionBoxD0Ev(); +int APS5_VABI _ZN7WebCore21ISOTrackEncryptionBoxD1Ev(); +int APS5_VABI _ZN7WebCore21ISOTrackEncryptionBoxD2Ev(); +int APS5_VABI _ZN7WebCore21InspectorFrontendHost16disconnectClientEv(); +int APS5_VABI _ZN7WebCore21InspectorFrontendHost28addSelfToGlobalObjectInWorldERNS_15DOMWrapperWorldE(); +int APS5_VABI _ZN7WebCore21InspectorFrontendHostC1EPNS_23InspectorFrontendClientEPNS_4PageE(); +int APS5_VABI _ZN7WebCore21InspectorFrontendHostC2EPNS_23InspectorFrontendClientEPNS_4PageE(); +int APS5_VABI _ZN7WebCore21InspectorFrontendHostD1Ev(); +int APS5_VABI _ZN7WebCore21InspectorFrontendHostD2Ev(); +int APS5_VABI _ZN7WebCore21JSCSSStyleDeclaration14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore21JSCSSStyleDeclaration15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore21JSCSSStyleDeclaration15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore21JSCSSStyleDeclaration15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore21JSCSSStyleDeclaration4infoEv(); +int APS5_VABI _ZN7WebCore21JSCSSStyleDeclaration9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore21JSCSSStyleDeclaration9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore21JSCSSStyleDeclarationC1ERKS0_(); +int APS5_VABI _ZN7WebCore21JSCSSStyleDeclarationC2ERKS0_(); +int APS5_VABI _ZN7WebCore21JSCSSStyleDeclarationD1Ev(); +int APS5_VABI _ZN7WebCore21JSCSSStyleDeclarationD2Ev(); +int APS5_VABI _ZN7WebCore21JSCSSStyleDeclarationaSERKS0_(); +int APS5_VABI _ZN7WebCore21JSDeprecatedCSSOMRect9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore21JSRemoteDOMWindowBase4infoEv(); +int APS5_VABI _ZN7WebCore21JSRemoteDOMWindowBaseD1Ev(); +int APS5_VABI _ZN7WebCore21JSRemoteDOMWindowBaseD2Ev(); +int APS5_VABI _ZN7WebCore21JSTextTrackCueGeneric15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore21JSTextTrackCueGeneric15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore21JSTextTrackCueGeneric15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore21JSTextTrackCueGeneric4infoEv(); +int APS5_VABI _ZN7WebCore21JSTextTrackCueGeneric9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore21JSTextTrackCueGeneric9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore21JSTextTrackCueGenericD1Ev(); +int APS5_VABI _ZN7WebCore21JSTextTrackCueGenericD2Ev(); +int APS5_VABI _ZN7WebCore21MediaRecorderProviderC1ERKS0_(); +int APS5_VABI _ZN7WebCore21MediaRecorderProviderC1Ev(); +int APS5_VABI _ZN7WebCore21MediaRecorderProviderC2ERKS0_(); +int APS5_VABI _ZN7WebCore21MediaRecorderProviderC2Ev(); +int APS5_VABI _ZN7WebCore21MediaRecorderProviderD0Ev(); +int APS5_VABI _ZN7WebCore21MediaRecorderProviderD1Ev(); +int APS5_VABI _ZN7WebCore21MediaRecorderProviderD2Ev(); +int APS5_VABI _ZN7WebCore21MediaRecorderProvideraSERKS0_(); +int APS5_VABI _ZN7WebCore21MediaRecorderProviderdaEPv(); +int APS5_VABI _ZN7WebCore21MediaRecorderProviderdlEPv(); +int APS5_VABI _ZN7WebCore21MediaRecorderProvidernaEm(); +int APS5_VABI _ZN7WebCore21MediaRecorderProvidernaEmPv(); +int APS5_VABI _ZN7WebCore21MediaRecorderProvidernwEmPv(); +int APS5_VABI _ZN7WebCore21MediaRecorderProvidernwEm(); +int APS5_VABI _ZN7WebCore21NetworkStorageSession10getCookiesERKN3WTF3URLE(); +int APS5_VABI _ZN7WebCore21NetworkStorageSession10setCookiesERKN3WTF6VectorINS_6CookieELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEERKNS1_3URLESB_(); +int APS5_VABI _ZN7WebCore21NetworkStorageSession13getAllCookiesEv(); +int APS5_VABI _ZN7WebCore21NetworkStorageSession17domCookiesForHostERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore21NetworkStorageSession22processMayUseCookieAPIEv(); +int APS5_VABI _ZN7WebCore21NetworkStorageSession22removeAllStorageAccessEv(); +int APS5_VABI _ZN7WebCore21NetworkStorageSession27permitProcessToUseCookieAPIEb(); +int APS5_VABI _ZN7WebCore21NetworkStorageSession29setAllCookiesToSameSiteStrictERKNS_17RegistrableDomainEON3WTF17CompletionHandlerIFvvEEE(); +int APS5_VABI _ZN7WebCore21NetworkStorageSession31setThirdPartyCookieBlockingModeENS_28ThirdPartyCookieBlockingModeE(); +int APS5_VABI _ZN7WebCore21NetworkStorageSession38setCacheMaxAgeCapForPrevalentResourcesEN3WTF7SecondsE(); +int APS5_VABI _ZN7WebCore21NetworkStorageSession40resetCacheMaxAgeCapForPrevalentResourcesEv(); +int APS5_VABI _ZN7WebCore21NetworkStorageSession41setDomainsWithUserInteractionAsFirstPartyERKN3WTF6VectorINS_17RegistrableDomainELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE(); +int APS5_VABI _ZN7WebCore21NetworkStorageSession43setPrevalentDomainsToBlockButKeepCookiesForERKN3WTF6VectorINS_17RegistrableDomainELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE(); +int APS5_VABI _ZN7WebCore21NetworkStorageSession45setPrevalentDomainsToBlockAndDeleteCookiesForERKN3WTF6VectorINS_17RegistrableDomainELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE(); +int APS5_VABI _ZN7WebCore21NetworkStorageSession47resetCrossSiteLoadsWithLinkDecorationForTestingEv(); +int APS5_VABI _ZN7WebCore21NetworkStorageSession9setCookieERKNS_6CookieE(); +int APS5_VABI _ZN7WebCore21NetworkStorageSessionD1Ev(); +int APS5_VABI _ZN7WebCore21NetworkStorageSessionD2Ev(); +int APS5_VABI _ZN7WebCore21PageOverlayController18installPageOverlayERNS_11PageOverlayENS1_8FadeModeE(); +int APS5_VABI _ZN7WebCore21PageOverlayController20uninstallPageOverlayERNS_11PageOverlayENS1_8FadeModeE(); +int APS5_VABI _ZN7WebCore21PageOverlayController26didChangeDeviceScaleFactorEv(); +int APS5_VABI _ZN7WebCore21PageOverlayController32copyAccessibilityAttributesNamesEb(); +int APS5_VABI _ZN7WebCore21PageOverlayController43copyAccessibilityAttributeBoolValueForPointEN3WTF6StringENS_10FloatPointERb(); +int APS5_VABI _ZN7WebCore21PageOverlayController45copyAccessibilityAttributeStringValueForPointEN3WTF6StringENS_10FloatPointERS2_(); +int APS5_VABI _ZN7WebCore21PlatformKeyboardEvent20currentCapsLockStateEv(); +int APS5_VABI _ZN7WebCore21PlatformKeyboardEvent23getCurrentModifierStateERbS1_S1_S1_(); +int APS5_VABI _ZN7WebCore21RemoteCommandListener6createERNS_27RemoteCommandListenerClientE(); +int APS5_VABI _ZN7WebCore21SQLiteDatabaseTracker24hasTransactionInProgressEv(); +int APS5_VABI _ZN7WebCore21SQLiteDatabaseTracker35decrementTransactionInProgressCountEv(); +int APS5_VABI _ZN7WebCore21SQLiteDatabaseTracker35incrementTransactionInProgressCountEv(); +int APS5_VABI _ZN7WebCore21SQLiteDatabaseTracker9setClientEPNS_27SQLiteDatabaseTrackerClientE(); +int APS5_VABI _ZN7WebCore21SerializedScriptValue11deserializeEPK15OpaqueJSContextPPK13OpaqueJSValue(); +int APS5_VABI _ZN7WebCore21SerializedScriptValue6createEN3WTF10StringViewE(); +int APS5_VABI _ZN7WebCore21SerializedScriptValue6createEPK15OpaqueJSContextPK13OpaqueJSValuePS6_(); +int APS5_VABI _ZN7WebCore21SerializedScriptValueD1Ev(); +int APS5_VABI _ZN7WebCore21SerializedScriptValueD2Ev(); +int APS5_VABI _ZN7WebCore21UserContentController16removeUserScriptERNS_15DOMWrapperWorldERKN3WTF3URLE(); +int APS5_VABI _ZN7WebCore21UserContentController17removeUserScriptsERNS_15DOMWrapperWorldE(); +int APS5_VABI _ZN7WebCore21UserContentController20removeAllUserContentEv(); +int APS5_VABI _ZN7WebCore21UserContentController20removeUserStyleSheetERNS_15DOMWrapperWorldERKN3WTF3URLE(); +int APS5_VABI _ZN7WebCore21UserContentController21removeUserStyleSheetsERNS_15DOMWrapperWorldE(); +int APS5_VABI _ZN7WebCore21UserContentController6createEv(); +int APS5_VABI _ZN7WebCore21UserContentControllerD0Ev(); +int APS5_VABI _ZN7WebCore21UserContentControllerD1Ev(); +int APS5_VABI _ZN7WebCore21UserContentControllerD2Ev(); +int APS5_VABI _ZN7WebCore21WebKitFontFamilyNames4initEv(); +int APS5_VABI _ZN7WebCore21WheelEventTestMonitor14deferForReasonEPKvNS0_11DeferReasonE(); +int APS5_VABI _ZN7WebCore21WheelEventTestMonitor21clearAllTestDeferralsEv(); +int APS5_VABI _ZN7WebCore21WheelEventTestMonitor23removeDeferralForReasonEPKvNS0_11DeferReasonE(); +int APS5_VABI _ZN7WebCore21WheelEventTestMonitor33setTestCallbackAndStartMonitoringEbbON3WTF8FunctionIFvvEEE(); +int APS5_VABI _ZN7WebCore21convertToIntegerClampIaEET_RN3JSC14JSGlobalObjectENS2_7JSValueE(); +int APS5_VABI _ZN7WebCore21convertToIntegerClampIhEET_RN3JSC14JSGlobalObjectENS2_7JSValueE(); +int APS5_VABI _ZN7WebCore21convertToIntegerClampIiEET_RN3JSC14JSGlobalObjectENS2_7JSValueE(); +int APS5_VABI _ZN7WebCore21convertToIntegerClampIjEET_RN3JSC14JSGlobalObjectENS2_7JSValueE(); +int APS5_VABI _ZN7WebCore21convertToIntegerClampIlEET_RN3JSC14JSGlobalObjectENS2_7JSValueE(); +int APS5_VABI _ZN7WebCore21convertToIntegerClampImEET_RN3JSC14JSGlobalObjectENS2_7JSValueE(); +int APS5_VABI _ZN7WebCore21convertToIntegerClampIsEET_RN3JSC14JSGlobalObjectENS2_7JSValueE(); +int APS5_VABI _ZN7WebCore21convertToIntegerClampItEET_RN3JSC14JSGlobalObjectENS2_7JSValueE(); +int APS5_VABI _ZN7WebCore21identifierToUSVStringERN3JSC14JSGlobalObjectERKNS0_10IdentifierE(); +int APS5_VABI _ZN7WebCore21mainThreadNormalWorldEv(); +int APS5_VABI _ZN7WebCore21setPlatformStrategiesEPNS_18PlatformStrategiesE(); +int APS5_VABI _ZN7WebCore22CanvasRenderingContext5derefEv(); +int APS5_VABI _ZN7WebCore22CryptoAlgorithmAES_CBC15platformDecryptERKNS_30CryptoAlgorithmAesCbcCfbParamsERKNS_12CryptoKeyAESERKN3WTF6VectorIhLm0ENS7_15CrashOnOverflowELm16ENS7_10FastMallocEEENS0_7PaddingE(); +int APS5_VABI _ZN7WebCore22CryptoAlgorithmAES_CBC15platformEncryptERKNS_30CryptoAlgorithmAesCbcCfbParamsERKNS_12CryptoKeyAESERKN3WTF6VectorIhLm0ENS7_15CrashOnOverflowELm16ENS7_10FastMallocEEENS0_7PaddingE(); +int APS5_VABI _ZN7WebCore22DefaultFilterOperationD1Ev(); +int APS5_VABI _ZN7WebCore22DefaultFilterOperationD2Ev(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient10sendH2PingERKN3WTF3URLEONS1_17CompletionHandlerIFvONSt12experimental15fundamentals_v38expectedINS1_7SecondsENS_13ResourceErrorEEEEEE(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient11prefetchDNSERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient12dispatchShowEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient13didFinishLoadEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient13startDownloadERKNS_15ResourceRequestERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient14didChangeTitleEPNS_14DocumentLoaderE(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient15finishedLoadingEPNS_14DocumentLoaderE(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient15willChangeTitleEPNS_14DocumentLoaderE(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient16restoreViewStateEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient17cancelPolicyCheckEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient17dispatchWillCloseEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient17objectContentTypeERKN3WTF3URLERKNS1_6StringE(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient17setCopiesOnScrollEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient18frameLoadCompletedEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient18makeRepresentationEPNS_14DocumentLoaderE(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient19detachedFromParent2Ev(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient19detachedFromParent3Ev(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient19dispatchDidFailLoadERKNS_13ResourceErrorE(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient19saveViewStateToItemERNS_11HistoryItemE(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient19updateGlobalHistoryEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient20createDocumentLoaderERKNS_15ResourceRequestERKNS_14SubstituteDataE(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient20redirectDataToPluginERNS_6WidgetE(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient20setMainDocumentErrorEPNS_14DocumentLoaderERKNS_13ResourceErrorE(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient21didRunInsecureContentERNS_14SecurityOriginERKN3WTF3URLE(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient21dispatchDidFinishLoadEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient21forceLayoutForNonHTMLEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient22dispatchWillSubmitFormERNS_9FormStateEON3WTF17CompletionHandlerIFvvEEE(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient22provisionalLoadStartedEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient23createNetworkingContextEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient23dispatchDidReceiveTitleERKNS_19StringWithDirectionE(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient24revertToProvisionalStateEPNS_14DocumentLoaderE(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient25didDisplayInsecureContentEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient25setMainFrameDocumentReadyEb(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient26didReplaceMultipartContentEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient26updateCachedDocumentLoaderERNS_14DocumentLoaderE(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient27willReplaceMultipartContentEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient29dispatchDidFinishDocumentLoadEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient29dispatchDidPopStateWithinPageEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient29hasFrameSpecificStorageAccessEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient29savePlatformDataToCachedFrameEPNS_11CachedFrameE(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient30didRestoreFromBackForwardCacheEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient30dispatchDidPushStateWithinPageEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient31dispatchDidCancelClientRedirectEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient31dispatchDidDispatchOnloadEventsEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient31dispatchDidReachLayoutMilestoneEN3WTF9OptionSetINS_15LayoutMilestoneEEE(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient31dispatchDidStartProvisionalLoadEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient31dispatchUnableToImplementPolicyERKNS_13ResourceErrorE(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient31prepareForDataSourceReplacementEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient31transitionToCommittedForNewPageEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient32updateGlobalHistoryRedirectLinksEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient33convertMainResourceLoadToDownloadEPNS_14DocumentLoaderERKNS_15ResourceRequestERKNS_16ResourceResponseE(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient33dispatchDidReplaceStateWithinPageEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient33dispatchWillPerformClientRedirectERKN3WTF3URLEdNS1_8WallTimeENS_19LockBackForwardListE(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient36transitionToCommittedFromCachedFrameEPNS_11CachedFrameE(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient37dispatchDidReachVisuallyNonEmptyStateEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient38dispatchDidLoadResourceFromMemoryCacheEPNS_14DocumentLoaderERKNS_15ResourceRequestERKNS_16ResourceResponseEi(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient50dispatchDidReceiveServerRedirectForProvisionalLoadEv(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClient8setTitleERKNS_19StringWithDirectionERKN3WTF3URLE(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClientC1ERKS0_(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClientC1Ev(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClientC2ERKS0_(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClientC2Ev(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClientD0Ev(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClientD1Ev(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClientD2Ev(); +int APS5_VABI _ZN7WebCore22EmptyFrameLoaderClientaSERKS0_(); +int APS5_VABI _ZN7WebCore22FontCascadeDescriptionC1Ev(); +int APS5_VABI _ZN7WebCore22FontCascadeDescriptionC2Ev(); +int APS5_VABI _ZN7WebCore22GraphicsLayerTransformC1Ev(); +int APS5_VABI _ZN7WebCore22GraphicsLayerTransformC2Ev(); +int APS5_VABI _ZN7WebCore22HTMLFormControlElement13setFormActionERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore22HistoricalVelocityData18velocityForNewDataENS_10FloatPointEdN3WTF13MonotonicTimeE(); +int APS5_VABI _ZN7WebCore22JSDeprecatedCSSOMValue9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore22MutableStyleProperties25ensureCSSStyleDeclarationEv(); +int APS5_VABI _ZN7WebCore22MutableStylePropertiesD1Ev(); +int APS5_VABI _ZN7WebCore22MutableStylePropertiesD2Ev(); +int APS5_VABI _ZN7WebCore22ResourceLoadStatistics20reduceTimeResolutionEN3WTF8WallTimeE(); +int APS5_VABI _ZN7WebCore22ResourceLoadStatistics5mergeERKS0_(); +int APS5_VABI _ZN7WebCore22ResourceLoadStatistics6decodeERNS_12KeyedDecoderEj(); +int APS5_VABI _ZN7WebCore22counterValueForElementEPNS_7ElementE(); +int APS5_VABI _ZN7WebCore22createFragmentFromTextERKNS_11SimpleRangeERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore22externalRepresentationEPNS_7ElementEN3WTF9OptionSetINS_16RenderAsTextFlagEEE(); +int APS5_VABI _ZN7WebCore22identifierToByteStringERN3JSC14JSGlobalObjectERKNS0_10IdentifierE(); +int APS5_VABI _ZN7WebCore22multipleFileUploadTextEj(); +int APS5_VABI _ZN7WebCore22startOfEditableContentERKNS_15VisiblePositionE(); +int APS5_VABI _ZN7WebCore22strictCSSParserContextEv(); +int APS5_VABI _ZN7WebCore22throwArgumentTypeErrorERN3JSC14JSGlobalObjectERNS0_10ThrowScopeEjPKcS6_S6_S6_(); +int APS5_VABI _ZN7WebCore22throwSequenceTypeErrorERN3JSC14JSGlobalObjectERNS0_10ThrowScopeE(); +int APS5_VABI _ZN7WebCore23ApplicationCacheStorage14setMaximumSizeEl(); +int APS5_VABI _ZN7WebCore23ApplicationCacheStorage15deleteAllCachesEv(); +int APS5_VABI _ZN7WebCore23ApplicationCacheStorage16deleteAllEntriesEv(); +int APS5_VABI _ZN7WebCore23ApplicationCacheStorage21setDefaultOriginQuotaEl(); +int APS5_VABI _ZN7WebCore23ApplicationCacheStorage23calculateQuotaForOriginERKNS_14SecurityOriginERl(); +int APS5_VABI _ZN7WebCore23ApplicationCacheStorage26storeUpdatedQuotaForOriginEPKNS_14SecurityOriginEl(); +int APS5_VABI _ZN7WebCore23ApplicationCacheStorage5emptyEv(); +int APS5_VABI _ZN7WebCore23ApplicationCacheStorageC1ERKN3WTF6StringES4_(); +int APS5_VABI _ZN7WebCore23ApplicationCacheStorageC2ERKN3WTF6StringES4_(); +int APS5_VABI _ZN7WebCore23HTMLTableSectionElement4rowsEv(); +int APS5_VABI _ZN7WebCore23HTMLTableSectionElement9deleteRowEi(); +int APS5_VABI _ZN7WebCore23HTMLTableSectionElement9insertRowEi(); +int APS5_VABI _ZN7WebCore23ISOSchemeInformationBox11boxTypeNameEv(); +int APS5_VABI _ZN7WebCore23ISOSchemeInformationBox5parseERN3JSC8DataViewERj(); +int APS5_VABI _ZN7WebCore23ISOSchemeInformationBoxC1Ev(); +int APS5_VABI _ZN7WebCore23ISOSchemeInformationBoxC2Ev(); +int APS5_VABI _ZN7WebCore23ISOSchemeInformationBoxD0Ev(); +int APS5_VABI _ZN7WebCore23ISOSchemeInformationBoxD1Ev(); +int APS5_VABI _ZN7WebCore23ISOSchemeInformationBoxD2Ev(); +int APS5_VABI _ZN7WebCore23JSHTMLOptionsCollection9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore23MediaQueryParserContextC1ERKNS_8DocumentE(); +int APS5_VABI _ZN7WebCore23MediaQueryParserContextC2ERKNS_8DocumentE(); +int APS5_VABI _ZN7WebCore23SynchronousLoaderClient24platformBadResponseErrorEv(); +int APS5_VABI _ZN7WebCore23TextureMapperFPSCounter19updateFPSAndDisplayERNS_13TextureMapperERKNS_10FloatPointERKNS_20TransformationMatrixE(); +int APS5_VABI _ZN7WebCore23TextureMapperFPSCounterC1Ev(); +int APS5_VABI _ZN7WebCore23TextureMapperFPSCounterC2Ev(); +int APS5_VABI _ZN7WebCore23atBoundaryOfGranularityERKNS_15VisiblePositionENS_15TextGranularityENS_18SelectionDirectionE(); +int APS5_VABI _ZN7WebCore23computeSharedStringHashEPKDsj(); +int APS5_VABI _ZN7WebCore23computeSharedStringHashERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore23standardUserAgentForURLERKN3WTF3URLE(); +int APS5_VABI _ZN7WebCore23throwNonFiniteTypeErrorERN3JSC14JSGlobalObjectERNS0_10ThrowScopeE(); +int APS5_VABI _ZN7WebCore23wrapSerializedCryptoKeyERKN3WTF6VectorIhLm0ENS0_15CrashOnOverflowELm16ENS0_10FastMallocEEES6_RS4_(); +int APS5_VABI _ZN7WebCore24CachedResourceHandleBase11setResourceEPNS_14CachedResourceE(); +int APS5_VABI _ZN7WebCore24CachedResourceHandleBaseC1EPNS_14CachedResourceE(); +int APS5_VABI _ZN7WebCore24CachedResourceHandleBaseC1ERKS0_(); +int APS5_VABI _ZN7WebCore24CachedResourceHandleBaseC1Ev(); +int APS5_VABI _ZN7WebCore24CachedResourceHandleBaseC2EPNS_14CachedResourceE(); +int APS5_VABI _ZN7WebCore24CachedResourceHandleBaseC2ERKS0_(); +int APS5_VABI _ZN7WebCore24CachedResourceHandleBaseC2Ev(); +int APS5_VABI _ZN7WebCore24CachedResourceHandleBaseD1Ev(); +int APS5_VABI _ZN7WebCore24CachedResourceHandleBaseD2Ev(); +int APS5_VABI _ZN7WebCore24CachedResourceHandleBaseaSERKS0_(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer10setFiltersERKNS_16FilterOperationsE(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer10setOpacityEf(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer11setPositionERKNS_10FloatPointE(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer12addAnimationERKNS_17KeyframeValueListERKNS_9FloatSizeEPKNS_9AnimationERKN3WTF6StringEd(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer12setTransformERKNS_20TransformationMatrixE(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer12syncPositionERKNS_10FloatPointE(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer14pauseAnimationERKN3WTF6StringEd(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer14setAnchorPointERKNS_12FloatPoint3DE(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer14setDebugBorderERKNS_5ColorEf(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer14setPreserves3DEb(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer15removeAnimationERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer15setBoundsOriginERKNS_10FloatPointE(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer15setContentsRectERKNS_9FloatRectE(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer15setDrawsContentEb(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer15setNeedsDisplayEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer16didChangeFiltersEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer16removeFromParentEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer16resumeAnimationsEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer16setMasksToBoundsEb(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer16syncBoundsOriginERKNS_10FloatPointE(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer17didChangeChildrenEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer17didChangeGeometryENS0_17FlushNotificationE(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer17setContentsOpaqueEb(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer17suspendAnimationsEN3WTF13MonotonicTimeE(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer18purgeBackingStoresEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer18setBackdropFiltersERKNS_16FilterOperationsE(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer18setContentsToImageEPNS_5ImageE(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer18setContentsVisibleEb(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer18setShowDebugBorderEb(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer19didChangeAnimationsEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer19notifyFlushRequiredEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer19setContentsTileSizeERKNS_9FloatSizeE(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer19updatePlatformLayerEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer20didUpdateTileBuffersEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer20setChildrenTransformERKNS_20TransformationMatrixE(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer20setContentsTilePhaseERKNS_9FloatSizeE(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer20updateContentBuffersEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer21computePixelAlignmentERNS_10FloatPointERNS_9FloatSizeERNS_12FloatPoint3DES4_(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer21flushCompositingStateERKNS_9FloatRectE(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer21invalidateCoordinatorEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer21setBackfaceVisibilityEb(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer21setNeedsDisplayInRectERKNS_9FloatRectENS_13GraphicsLayer17ShouldClipToLayerE(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer21setShowRepaintCounterEb(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer22effectiveContentsScaleEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer22setBackdropFiltersRectERKNS_16FloatRoundedRectE(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer22transformedVisibleRectEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer23setContentsClippingRectERKNS_16FloatRoundedRectE(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer23setContentsNeedsDisplayEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer23setContentsToSolidColorERKNS_5ColorE(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer24didChangeBackdropFiltersEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer25requestBackingStoreUpdateEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer26setContentsToPlatformLayerEPN7Nicosia13PlatformLayerENS_13GraphicsLayer20ContentsLayerPurposeE(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer26setShouldUpdateVisibleRectEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer28didChangeBackdropFiltersRectEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer29computePositionRelativeToBaseEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer29computeTransformedVisibleRectEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer29setNeedsVisibleRectAdjustmentEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer30deviceOrPageScaleFactorChangedEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer37flushCompositingStateForThisLayerOnlyEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer37selfOrAncestorHaveNonAffineTransformsEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer38updateContentBuffersIncludingSubLayersEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer40setCoordinatorIncludingSubLayersIfNeededEPNS_30CoordinatedGraphicsLayerClientE(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer41syncPendingStateChangesIncludingSubLayersEv(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayer7setSizeERKNS_9FloatSizeE(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayerC1ENS_13GraphicsLayer4TypeERNS_19GraphicsLayerClientE(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayerC2ENS_13GraphicsLayer4TypeERNS_19GraphicsLayerClientE(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayerD0Ev(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayerD1Ev(); +int APS5_VABI _ZN7WebCore24CoordinatedGraphicsLayerD2Ev(); +int APS5_VABI _ZN7WebCore24DeprecatedGlobalSettings24setMockScrollbarsEnabledEb(); +int APS5_VABI _ZN7WebCore24DeprecatedGlobalSettings24setUsesOverlayScrollbarsEb(); +int APS5_VABI _ZN7WebCore24DeprecatedGlobalSettings26setAllowsAnySSLCertificateEb(); +int APS5_VABI _ZN7WebCore24DocumentMarkerController10markersForERNS_4NodeEN3WTF9OptionSetINS_14DocumentMarker10MarkerTypeEEE(); +int APS5_VABI _ZN7WebCore24DocumentMarkerController13removeMarkersEN3WTF9OptionSetINS_14DocumentMarker10MarkerTypeEEE(); +int APS5_VABI _ZN7WebCore24DocumentMarkerController13removeMarkersERKNS_11SimpleRangeEN3WTF9OptionSetINS_14DocumentMarker10MarkerTypeEEENS_32RemovePartiallyOverlappingMarkerE(); +int APS5_VABI _ZN7WebCore24DocumentMarkerController14markersInRangeERKNS_11SimpleRangeEN3WTF9OptionSetINS_14DocumentMarker10MarkerTypeEEE(); +int APS5_VABI _ZN7WebCore24DocumentMarkerController23renderedRectsForMarkersENS_14DocumentMarker10MarkerTypeE(); +int APS5_VABI _ZN7WebCore24DocumentMarkerController38updateRectsForInvalidatedMarkersOfTypeENS_14DocumentMarker10MarkerTypeE(); +int APS5_VABI _ZN7WebCore24DocumentParserYieldTokenC1ERNS_8DocumentE(); +int APS5_VABI _ZN7WebCore24DocumentParserYieldTokenC2ERNS_8DocumentE(); +int APS5_VABI _ZN7WebCore24DocumentParserYieldTokenD1Ev(); +int APS5_VABI _ZN7WebCore24DocumentParserYieldTokenD2Ev(); +int APS5_VABI _ZN7WebCore24FrameDestructionObserver14frameDestroyedEv(); +int APS5_VABI _ZN7WebCore24FrameDestructionObserver14willDetachPageEv(); +int APS5_VABI _ZN7WebCore24FrameDestructionObserverD0Ev(); +int APS5_VABI _ZN7WebCore24FrameDestructionObserverD1Ev(); +int APS5_VABI _ZN7WebCore24FrameDestructionObserverD2Ev(); +int APS5_VABI _ZN7WebCore24ImmutableStylePropertiesD1Ev(); +int APS5_VABI _ZN7WebCore24ImmutableStylePropertiesD2Ev(); +int APS5_VABI _ZN7WebCore24JSDeprecatedCSSOMCounter9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore24MatrixTransformOperation6createERKNS_20TransformationMatrixE(); +int APS5_VABI _ZN7WebCore24PerformanceLoggingClient35synchronousScrollingReasonsAsStringEN3WTF9OptionSetINS_26SynchronousScrollingReasonEEE(); +int APS5_VABI _ZN7WebCore24StorageNamespaceProvider21localStorageNamespaceEN3PAL9SessionIDE(); +int APS5_VABI _ZN7WebCore24StorageNamespaceProviderC2Ev(); +int APS5_VABI _ZN7WebCore24StorageNamespaceProviderD0Ev(); +int APS5_VABI _ZN7WebCore24StorageNamespaceProviderD1Ev(); +int APS5_VABI _ZN7WebCore24StorageNamespaceProviderD2Ev(); +int APS5_VABI _ZN7WebCore24TemporarySelectionChangeD1Ev(); +int APS5_VABI _ZN7WebCore24TemporarySelectionChangeD2Ev(); +int APS5_VABI _ZN7WebCore24charactersAroundPositionERKNS_15VisiblePositionERiS3_S3_(); +int APS5_VABI _ZN7WebCore24distanceBetweenPositionsERKNS_15VisiblePositionES2_(); +int APS5_VABI _ZN7WebCore24passesAccessControlCheckERKNS_16ResourceResponseENS_23StoredCredentialsPolicyERKNS_14SecurityOriginEPKNS_37CrossOriginAccessControlCheckDisablerE(); +int APS5_VABI _ZN7WebCore24presentingApplicationPIDEv(); +int APS5_VABI _ZN7WebCore24previousSentencePositionERKNS_15VisiblePositionE(); +int APS5_VABI _ZN7WebCore24redirectChainAllowsReuseENS_24RedirectChainCacheStatusENS_28ReuseExpiredRedirectionOrNotE(); +int APS5_VABI _ZN7WebCore25ArchiveResourceCollection21archiveResourceForURLERKN3WTF3URLE(); +int APS5_VABI _ZN7WebCore25DropShadowFilterOperation6createERKNS_8IntPointEiRKNS_5ColorE(); +int APS5_VABI _ZN7WebCore25DropShadowFilterOperationC1ERKNS_8IntPointEiRKNS_5ColorE(); +int APS5_VABI _ZN7WebCore25DropShadowFilterOperationC2ERKNS_8IntPointEiRKNS_5ColorE(); +int APS5_VABI _ZN7WebCore25DropShadowFilterOperationD0Ev(); +int APS5_VABI _ZN7WebCore25DropShadowFilterOperationD1Ev(); +int APS5_VABI _ZN7WebCore25DropShadowFilterOperationD2Ev(); +int APS5_VABI _ZN7WebCore25JSDeprecatedCSSOMRGBColor9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore25TextureMapperBackingStore25calculateExposedTileEdgesERKNS_9FloatRectES3_(); +int APS5_VABI _ZN7WebCore25WebSocketChannelInspectorC1ERNS_8DocumentE(); +int APS5_VABI _ZN7WebCore25WebSocketChannelInspectorC2ERNS_8DocumentE(); +int APS5_VABI _ZN7WebCore25computeViewportAttributesENS_17ViewportArgumentsEiiifNS_7IntSizeE(); +int APS5_VABI _ZN7WebCore25directionOfEnclosingBlockERKNS_8PositionE(); +int APS5_VABI _ZN7WebCore25encloseRectToDevicePixelsERKNS_9FloatRectEf(); +int APS5_VABI _ZN7WebCore25enclosingBlockFlowElementERKNS_15VisiblePositionE(); +int APS5_VABI _ZN7WebCore25getOutOfLineCachedWrapperEPNS_17JSDOMGlobalObjectERNS_4NodeE(); +int APS5_VABI _ZN7WebCore25unwrapSerializedCryptoKeyERKN3WTF6VectorIhLm0ENS0_15CrashOnOverflowELm16ENS0_10FastMallocEEES6_RS4_(); +int APS5_VABI _ZN7WebCore25updateRedirectChainStatusERNS_24RedirectChainCacheStatusERKNS_16ResourceResponseE(); +int APS5_VABI _ZN7WebCore26ContextDestructionObserver16contextDestroyedEv(); +int APS5_VABI _ZN7WebCore26ContextDestructionObserverC1EPNS_22ScriptExecutionContextE(); +int APS5_VABI _ZN7WebCore26ContextDestructionObserverC2EPNS_22ScriptExecutionContextE(); +int APS5_VABI _ZN7WebCore26ContextDestructionObserverD0Ev(); +int APS5_VABI _ZN7WebCore26ContextDestructionObserverD1Ev(); +int APS5_VABI _ZN7WebCore26ContextDestructionObserverD2Ev(); +int APS5_VABI _ZN7WebCore26CustomElementReactionStack12processQueueEPN3JSC14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore26HTMLTextFormControlElement12setMaxLengthEi(); +int APS5_VABI _ZN7WebCore26HTMLTextFormControlElement21setCanShowPlaceholderEb(); +int APS5_VABI _ZN7WebCore26HTMLTextFormControlElement21setSelectionDirectionERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore26HTMLTextFormControlElement6selectENS_19SelectionRevealModeERKNS_23AXTextStateChangeIntentE(); +int APS5_VABI _ZN7WebCore26ISOProtectionSchemeInfoBox11boxTypeNameEv(); +int APS5_VABI _ZN7WebCore26ISOProtectionSchemeInfoBox5parseERN3JSC8DataViewERj(); +int APS5_VABI _ZN7WebCore26ISOProtectionSchemeInfoBoxC1Ev(); +int APS5_VABI _ZN7WebCore26ISOProtectionSchemeInfoBoxC2Ev(); +int APS5_VABI _ZN7WebCore26ISOProtectionSchemeInfoBoxD0Ev(); +int APS5_VABI _ZN7WebCore26ISOProtectionSchemeInfoBoxD1Ev(); +int APS5_VABI _ZN7WebCore26ISOProtectionSchemeInfoBoxD2Ev(); +int APS5_VABI _ZN7WebCore26IdentityTransformOperation6createEv(); +int APS5_VABI _ZN7WebCore26Matrix3DTransformOperation6createERKNS_20TransformationMatrixE(); +int APS5_VABI _ZN7WebCore26MessagePortChannelProvider17setSharedProviderERS0_(); +int APS5_VABI _ZN7WebCore26MessagePortChannelRegistry19didCloseMessagePortERKNS_21MessagePortIdentifierE(); +int APS5_VABI _ZN7WebCore26MessagePortChannelRegistry22didPostMessageToRemoteEONS_23MessageWithMessagePortsERKNS_21MessagePortIdentifierE(); +int APS5_VABI _ZN7WebCore26MessagePortChannelRegistry25didDisentangleMessagePortERKNS_21MessagePortIdentifierE(); +int APS5_VABI _ZN7WebCore26MessagePortChannelRegistry25messagePortChannelCreatedERNS_18MessagePortChannelE(); +int APS5_VABI _ZN7WebCore26MessagePortChannelRegistry27didCreateMessagePortChannelERKNS_21MessagePortIdentifierES3_(); +int APS5_VABI _ZN7WebCore26MessagePortChannelRegistry27messagePortChannelDestroyedERNS_18MessagePortChannelE(); +int APS5_VABI _ZN7WebCore26MessagePortChannelRegistry29existingChannelContainingPortERKNS_21MessagePortIdentifierE(); +int APS5_VABI _ZN7WebCore26MessagePortChannelRegistryD1Ev(); +int APS5_VABI _ZN7WebCore26MessagePortChannelRegistryD2Ev(); +int APS5_VABI _ZN7WebCore26UserTypingGestureIndicator27processingUserTypingGestureEv(); +int APS5_VABI _ZN7WebCore26UserTypingGestureIndicator28focusedElementAtGestureStartEv(); +int APS5_VABI _ZN7WebCore26UserTypingGestureIndicatorD1Ev(); +int APS5_VABI _ZN7WebCore26UserTypingGestureIndicatorD2Ev(); +int APS5_VABI _ZN7WebCore26propagateExceptionSlowPathERN3JSC14JSGlobalObjectERNS0_10ThrowScopeEONS_9ExceptionE(); +int APS5_VABI _ZN7WebCore27AuthenticationChallengeBase7nullifyEv(); +int APS5_VABI _ZN7WebCore27AuthenticationChallengeBaseC1ERKNS_15ProtectionSpaceERKNS_10CredentialEjRKNS_16ResourceResponseERKNS_13ResourceErrorE(); +int APS5_VABI _ZN7WebCore27AuthenticationChallengeBaseC1Ev(); +int APS5_VABI _ZN7WebCore27AuthenticationChallengeBaseC2ERKNS_15ProtectionSpaceERKNS_10CredentialEjRKNS_16ResourceResponseERKNS_13ResourceErrorE(); +int APS5_VABI _ZN7WebCore27AuthenticationChallengeBaseC2Ev(); +int APS5_VABI _ZN7WebCore27CSSComputedStyleDeclaration3refEv(); +int APS5_VABI _ZN7WebCore27CSSComputedStyleDeclaration5derefEv(); +int APS5_VABI _ZN7WebCore27CSSComputedStyleDeclaration6createERNS_7ElementEbN3WTF10StringViewE(); +int APS5_VABI _ZN7WebCore27ContentSecurityPolicyClientC2ERKS0_(); +int APS5_VABI _ZN7WebCore27ContentSecurityPolicyClientC2Ev(); +int APS5_VABI _ZN7WebCore27ContentSecurityPolicyClientD0Ev(); +int APS5_VABI _ZN7WebCore27ContentSecurityPolicyClientD1Ev(); +int APS5_VABI _ZN7WebCore27ContentSecurityPolicyClientD2Ev(); +int APS5_VABI _ZN7WebCore27ContentSecurityPolicyClientaSERKS0_(); +int APS5_VABI _ZN7WebCore27DeviceOrientationClientMockC1Ev(); +int APS5_VABI _ZN7WebCore27DeviceOrientationClientMockC2Ev(); +int APS5_VABI _ZN7WebCore27DocumentTimelinesController16resumeAnimationsEv(); +int APS5_VABI _ZN7WebCore27DocumentTimelinesController17suspendAnimationsEv(); +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager12restrictionsENS_20PlatformMediaSession9MediaTypeE(); +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager13sharedManagerEv(); +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager14addRestrictionENS_20PlatformMediaSession9MediaTypeEj(); +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager15endInterruptionENS_20PlatformMediaSession20EndInterruptionFlagsE(); +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager16processDidResumeEv(); +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager17beginInterruptionENS_20PlatformMediaSession16InterruptionTypeE(); +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager17removeRestrictionENS_20PlatformMediaSession9MediaTypeEj(); +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager18processWillSuspendEv(); +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager20processSystemDidWakeEv(); +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager21addAudioCaptureSourceERNS_20PlatformMediaSession18AudioCaptureSourceE(); +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager21sharedManagerIfExistsEv(); +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager22processSystemWillSleepEv(); +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager24removeAudioCaptureSourceERNS_20PlatformMediaSession18AudioCaptureSourceE(); +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager26applicationDidBecomeActiveEv(); +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager28shouldDeactivateAudioSessionEv(); +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager29applicationDidEnterBackgroundEb(); +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager29applicationWillBecomeInactiveEv(); +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager30applicationWillEnterForegroundEb(); +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager31setShouldDeactivateAudioSessionEb(); +int APS5_VABI _ZN7WebCore27PlatformMediaSessionManager32setIsPlayingToAutomotiveHeadUnitEb(); +int APS5_VABI _ZN7WebCore27parseCacheControlDirectivesERKNS_13HTTPHeaderMapE(); +int APS5_VABI _ZN7WebCore27parseHTMLNonNegativeIntegerEN3WTF10StringViewE(); +int APS5_VABI _ZN7WebCore27screenSupportsExtendedColorEPNS_6WidgetE(); +int APS5_VABI _ZN7WebCore27withinTextUnitOfGranularityERKNS_15VisiblePositionENS_15TextGranularityENS_18SelectionDirectionE(); +int APS5_VABI _ZN7WebCore28BackingStoreBackendCairoImplC1ERKNS_7IntSizeEf(); +int APS5_VABI _ZN7WebCore28BackingStoreBackendCairoImplC2ERKNS_7IntSizeEf(); +int APS5_VABI _ZN7WebCore28BackingStoreBackendCairoImplD0Ev(); +int APS5_VABI _ZN7WebCore28BackingStoreBackendCairoImplD1Ev(); +int APS5_VABI _ZN7WebCore28BackingStoreBackendCairoImplD2Ev(); +int APS5_VABI _ZN7WebCore28DisplayRefreshMonitorManager13sharedManagerEv(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal10resetStateEv(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal11showConsoleEv(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal12moveWindowByEff(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal13showResourcesEv(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal14frontendLoadedEv(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal15canAttachWindowEv(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal15changeSheetRectERKNS_9FloatRectE(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal17setAttachedWindowENS_23InspectorFrontendClient8DockSideE(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal18isDebuggingEnabledEv(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal18requestSetDockSideENS_23InspectorFrontendClient8DockSideE(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal19setDebuggingEnabledEb(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal19windowObjectClearedEv(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal20sendMessageToBackendERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal21isProfilingJavaScriptEv(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal21setDockingUnavailableEb(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal24startProfilingJavaScriptEv(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal25changeAttachedWindowWidthEj(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal26changeAttachedWindowHeightEj(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal26isTimelineProfilingEnabledEv(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal27restoreAttachedWindowHeightEv(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal27setTimelineProfilingEnabledEb(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal30constrainedAttachedWindowWidthEjj(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal31constrainedAttachedWindowHeightEjj(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8Settings11setPropertyERKN3WTF6StringES5_(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8Settings14deletePropertyERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsC1ERKS1_(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsC1Ev(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsC2ERKS1_(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsC2Ev(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsD0Ev(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsD1Ev(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsD2Ev(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsaSERKS1_(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsdaEPv(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsdlEPv(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsnaEmPv(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsnaEm(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsnwEmPv(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocal8SettingsnwEm(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocalD0Ev(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocalD1Ev(); +int APS5_VABI _ZN7WebCore28InspectorFrontendClientLocalD2Ev(); +int APS5_VABI _ZN7WebCore28convertToIntegerEnforceRangeIaEET_RN3JSC14JSGlobalObjectENS2_7JSValueE(); +int APS5_VABI _ZN7WebCore28convertToIntegerEnforceRangeIhEET_RN3JSC14JSGlobalObjectENS2_7JSValueE(); +int APS5_VABI _ZN7WebCore28convertToIntegerEnforceRangeIiEET_RN3JSC14JSGlobalObjectENS2_7JSValueE(); +int APS5_VABI _ZN7WebCore28convertToIntegerEnforceRangeIjEET_RN3JSC14JSGlobalObjectENS2_7JSValueE(); +int APS5_VABI _ZN7WebCore28convertToIntegerEnforceRangeIlEET_RN3JSC14JSGlobalObjectENS2_7JSValueE(); +int APS5_VABI _ZN7WebCore28convertToIntegerEnforceRangeImEET_RN3JSC14JSGlobalObjectENS2_7JSValueE(); +int APS5_VABI _ZN7WebCore28convertToIntegerEnforceRangeIsEET_RN3JSC14JSGlobalObjectENS2_7JSValueE(); +int APS5_VABI _ZN7WebCore28convertToIntegerEnforceRangeItEET_RN3JSC14JSGlobalObjectENS2_7JSValueE(); +int APS5_VABI _ZN7WebCore28throwArgumentMustBeEnumErrorERN3JSC14JSGlobalObjectERNS0_10ThrowScopeEjPKcS6_S6_S6_(); +int APS5_VABI _ZN7WebCore28throwRequiredMemberTypeErrorERN3JSC14JSGlobalObjectERNS0_10ThrowScopeEPKcS6_S6_(); +int APS5_VABI _ZN7WebCore28topPrivatelyControlledDomainERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore29SQLiteStatementAutoResetScopeC1EOS0_(); +int APS5_VABI _ZN7WebCore29SQLiteStatementAutoResetScopeC1EPNS_15SQLiteStatementE(); +int APS5_VABI _ZN7WebCore29SQLiteStatementAutoResetScopeC2EOS0_(); +int APS5_VABI _ZN7WebCore29SQLiteStatementAutoResetScopeC2EPNS_15SQLiteStatementE(); +int APS5_VABI _ZN7WebCore29SQLiteStatementAutoResetScopeD1Ev(); +int APS5_VABI _ZN7WebCore29SQLiteStatementAutoResetScopeD2Ev(); +int APS5_VABI _ZN7WebCore29SQLiteStatementAutoResetScopeaSEOS0_(); +int APS5_VABI _ZN7WebCore29createDefaultParagraphElementERNS_8DocumentE(); +int APS5_VABI _ZN7WebCore29updateRequestForAccessControlERNS_15ResourceRequestERNS_14SecurityOriginENS_23StoredCredentialsPolicyE(); +int APS5_VABI _ZN7WebCore30InspectorInstrumentationPublic12hasFrontendsEv(); +int APS5_VABI _ZN7WebCore30InspectorInstrumentationWebKit16interceptRequestERNS_14ResourceLoaderEON3WTF8FunctionIFvRKNS_15ResourceRequestEEEE(); +int APS5_VABI _ZN7WebCore30InspectorInstrumentationWebKit24interceptRequestInternalERNS_14ResourceLoaderEON3WTF8FunctionIFvRKNS_15ResourceRequestEEEE(); +int APS5_VABI _ZN7WebCore30InvertLightnessFilterOperation6createEv(); +int APS5_VABI _ZN7WebCore30InvertLightnessFilterOperationC1Ev(); +int APS5_VABI _ZN7WebCore30InvertLightnessFilterOperationC2Ev(); +int APS5_VABI _ZN7WebCore30InvertLightnessFilterOperationD0Ev(); +int APS5_VABI _ZN7WebCore30InvertLightnessFilterOperationD1Ev(); +int APS5_VABI _ZN7WebCore30InvertLightnessFilterOperationD2Ev(); +int APS5_VABI _ZN7WebCore30closestWordBoundaryForPositionERKNS_15VisiblePositionE(); +int APS5_VABI _ZN7WebCore30forwardForEachCallToBackingMapERNS_17JSDOMGlobalObjectERN3JSC9CallFrameERNS2_8JSObjectE(); +int APS5_VABI _ZN7WebCore30forwardForEachCallToBackingSetERNS_17JSDOMGlobalObjectERN3JSC9CallFrameERNS2_8JSObjectE(); +int APS5_VABI _ZN7WebCore30makeRangeSelectingNodeContentsERNS_4NodeE(); +int APS5_VABI _ZN7WebCore30rejectPromiseWithThisTypeErrorERN3JSC14JSGlobalObjectEPKcS4_(); +int APS5_VABI _ZN7WebCore30rejectPromiseWithThisTypeErrorERNS_15DeferredPromiseEPKcS3_(); +int APS5_VABI _ZN7WebCore30throwArgumentMustBeObjectErrorERN3JSC14JSGlobalObjectERNS0_10ThrowScopeEjPKcS6_S6_(); +int APS5_VABI _ZN7WebCore31BasicColorMatrixFilterOperationD0Ev(); +int APS5_VABI _ZN7WebCore31BasicColorMatrixFilterOperationD1Ev(); +int APS5_VABI _ZN7WebCore31BasicColorMatrixFilterOperationD2Ev(); +int APS5_VABI _ZN7WebCore31CrossOriginPreflightResultCache5clearEv(); +int APS5_VABI _ZN7WebCore31CrossOriginPreflightResultCache9singletonEv(); +int APS5_VABI _ZN7WebCore31MediaEngineConfigurationFactory10enableMockEv(); +int APS5_VABI _ZN7WebCore31MediaEngineConfigurationFactory11disableMockEv(); +int APS5_VABI _ZN7WebCore31SimplifiedBackwardsTextIterator7advanceEv(); +int APS5_VABI _ZN7WebCore31SimplifiedBackwardsTextIteratorC1ERKNS_11SimpleRangeE(); +int APS5_VABI _ZN7WebCore31SimplifiedBackwardsTextIteratorC2ERKNS_11SimpleRangeE(); +int APS5_VABI _ZN7WebCore31forwardFunctionCallToBackingMapERN3JSC14JSGlobalObjectERNS0_9CallFrameERNS0_8JSObjectERKNS0_10IdentifierE(); +int APS5_VABI _ZN7WebCore31forwardFunctionCallToBackingSetERN3JSC14JSGlobalObjectERNS0_9CallFrameERNS0_8JSObjectERKNS0_10IdentifierE(); +int APS5_VABI _ZN7WebCore31rejectPromiseWithExceptionIfAnyERN3JSC14JSGlobalObjectERNS_17JSDOMGlobalObjectERNS0_9JSPromiseERNS0_10CatchScopeE(); +int APS5_VABI _ZN7WebCore32WorkerThreadableWebSocketChannelC1ERNS_17WorkerGlobalScopeERNS_22WebSocketChannelClientERKN3WTF6StringERNS_14SocketProviderE(); +int APS5_VABI _ZN7WebCore32WorkerThreadableWebSocketChannelC2ERNS_17WorkerGlobalScopeERNS_22WebSocketChannelClientERKN3WTF6StringERNS_14SocketProviderE(); +int APS5_VABI _ZN7WebCore32isSimpleCrossOriginAccessRequestERKN3WTF6StringERKNS_13HTTPHeaderMapE(); +int APS5_VABI _ZN7WebCore32serializationForRenderTreeAsTextERKNS_5ColorE(); +int APS5_VABI _ZN7WebCore32throwArgumentMustBeFunctionErrorERN3JSC14JSGlobalObjectERNS0_10ThrowScopeEjPKcS6_S6_(); +int APS5_VABI _ZN7WebCore32useBlockedPlugInContextMenuTitleEv(); +int APS5_VABI _ZN7WebCore33testPreloadScannerViewportSupportEPNS_8DocumentE(); +int APS5_VABI _ZN7WebCore34forwardAttributeGetterToBackingMapERN3JSC14JSGlobalObjectERNS0_8JSObjectERKNS0_10IdentifierE(); +int APS5_VABI _ZN7WebCore34forwardAttributeGetterToBackingSetERN3JSC14JSGlobalObjectERNS0_8JSObjectERKNS0_10IdentifierE(); +int APS5_VABI _ZN7WebCore35isEndOfEditableOrNonEditableContentERKNS_15VisiblePositionE(); +int APS5_VABI _ZN7WebCore35positionOfNextBoundaryOfGranularityERKNS_15VisiblePositionENS_15TextGranularityENS_18SelectionDirectionE(); +int APS5_VABI _ZN7WebCore35serializePreservingVisualAppearanceERKNS_11SimpleRangeEPN3WTF6VectorIPNS_4NodeELm0ENS3_15CrashOnOverflowELm16ENS3_10FastMallocEEENS_22AnnotateForInterchangeENS_22ConvertBlocksToInlinesENS_11ResolveURLsE(); +int APS5_VABI _ZN7WebCore36ContentSecurityPolicyResponseHeadersC1ERKNS_16ResourceResponseE(); +int APS5_VABI _ZN7WebCore36ContentSecurityPolicyResponseHeadersC2ERKNS_16ResourceResponseE(); +int APS5_VABI _ZN7WebCore36ISOProtectionSystemSpecificHeaderBox11boxTypeNameEv(); +int APS5_VABI _ZN7WebCore36ISOProtectionSystemSpecificHeaderBox5parseERN3JSC8DataViewERj(); +int APS5_VABI _ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxC1ERKS0_(); +int APS5_VABI _ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxC1Ev(); +int APS5_VABI _ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxC2ERKS0_(); +int APS5_VABI _ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxC2Ev(); +int APS5_VABI _ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxD0Ev(); +int APS5_VABI _ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxD1Ev(); +int APS5_VABI _ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxD2Ev(); +int APS5_VABI _ZN7WebCore36parseCrossOriginResourcePolicyHeaderEN3WTF10StringViewE(); +int APS5_VABI _ZN7WebCore36registerMemoryReleaseNotifyCallbacksEv(); +int APS5_VABI _ZN7WebCore36visiblePositionForPositionWithOffsetERKNS_15VisiblePositionEi(); +int APS5_VABI _ZN7WebCore37BasicComponentTransferFilterOperationD0Ev(); +int APS5_VABI _ZN7WebCore37BasicComponentTransferFilterOperationD1Ev(); +int APS5_VABI _ZN7WebCore37BasicComponentTransferFilterOperationD2Ev(); +int APS5_VABI _ZN7WebCore37CrossOriginAccessControlCheckDisabler39setCrossOriginAccessControlCheckEnabledEb(); +int APS5_VABI _ZN7WebCore37CrossOriginAccessControlCheckDisabler9singletonEv(); +int APS5_VABI _ZN7WebCore37CrossOriginAccessControlCheckDisablerC1ERKS0_(); +int APS5_VABI _ZN7WebCore37CrossOriginAccessControlCheckDisablerC1Ev(); +int APS5_VABI _ZN7WebCore37CrossOriginAccessControlCheckDisablerC2ERKS0_(); +int APS5_VABI _ZN7WebCore37CrossOriginAccessControlCheckDisablerC2Ev(); +int APS5_VABI _ZN7WebCore37CrossOriginAccessControlCheckDisablerD0Ev(); +int APS5_VABI _ZN7WebCore37CrossOriginAccessControlCheckDisablerD1Ev(); +int APS5_VABI _ZN7WebCore37CrossOriginAccessControlCheckDisablerD2Ev(); +int APS5_VABI _ZN7WebCore37CrossOriginAccessControlCheckDisableraSERKS0_(); +int APS5_VABI _ZN7WebCore37WidgetHierarchyUpdatesSuspensionScope11moveWidgetsEv(); +int APS5_VABI _ZN7WebCore37computeFreshnessLifetimeForHTTPFamilyERKNS_16ResourceResponseEN3WTF8WallTimeE(); +int APS5_VABI _ZN7WebCore38updateResponseHeadersAfterRevalidationERNS_16ResourceResponseERKS0_(); +int APS5_VABI _ZN7WebCore39cleanHTTPRequestHeadersForAccessControlERNS_15ResourceRequestEN3WTF9OptionSetINS_29HTTPHeadersToKeepFromCleaningEEE(); +int APS5_VABI _ZN7WebCore40restrictMinimumScaleFactorToViewportSizeERNS_18ViewportAttributesENS_7IntSizeEf(); +int APS5_VABI _ZN7WebCore44computeMinimumScaleFactorForContentContainedERKNS_18ViewportAttributesERKNS_7IntSizeES5_(); +int APS5_VABI _ZN7WebCore46visibleImageElementsInRangeWithNonLoadedImagesERKNS_11SimpleRangeE(); +int APS5_VABI _ZN7WebCore48closestEditablePositionInElementForAbsolutePointERKNS_7ElementERKNS_8IntPointE(); +int APS5_VABI _ZN7WebCore49reportExtraMemoryAllocatedForCollectionIndexCacheEm(); +int APS5_VABI _ZN7WebCore4Attr5styleEv(); +int APS5_VABI _ZN7WebCore4Attr8setValueERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore4BlobC1EPNS_22ScriptExecutionContextE(); +int APS5_VABI _ZN7WebCore4BlobC2EPNS_22ScriptExecutionContextE(); +int APS5_VABI _ZN7WebCore4FontD1Ev(); +int APS5_VABI _ZN7WebCore4FontD2Ev(); +int APS5_VABI _ZN7WebCore4Icon18createIconForFilesERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE(); +int APS5_VABI _ZN7WebCore4IconD1Ev(); +int APS5_VABI _ZN7WebCore4IconD2Ev(); +int APS5_VABI _ZN7WebCore4Node10childNodesEv(); +int APS5_VABI _ZN7WebCore4Node10renderRectEPb(); +int APS5_VABI _ZN7WebCore4Node11appendChildERS0_(); +int APS5_VABI _ZN7WebCore4Node11removeChildERS0_(); +int APS5_VABI _ZN7WebCore4Node12insertBeforeERS0_PS0_(); +int APS5_VABI _ZN7WebCore4Node12replaceChildERS0_S1_(); +int APS5_VABI _ZN7WebCore4Node14removedLastRefEv(); +int APS5_VABI _ZN7WebCore4Node17stopIgnoringLeaksEv(); +int APS5_VABI _ZN7WebCore4Node18dispatchInputEventEv(); +int APS5_VABI _ZN7WebCore4Node18startIgnoringLeaksEv(); +int APS5_VABI _ZN7WebCore4Node20cloneNodeForBindingsEb(); +int APS5_VABI _ZN7WebCore4Node23compareDocumentPositionERS0_(); +int APS5_VABI _ZN7WebCore4Node6removeEv(); +int APS5_VABI _ZN7WebCore4Node7inspectEv(); +int APS5_VABI _ZN7WebCore4Node9normalizeEv(); +int APS5_VABI _ZN7WebCore4Page10findStringERKN3WTF6StringENS1_9OptionSetINS_14FindOptionFlagEEEPNS_7DidWrapE(); +int APS5_VABI _ZN7WebCore4Page10pluginDataEv(); +int APS5_VABI _ZN7WebCore4Page11forEachPageERKN3WTF8FunctionIFvRS0_EEE(); +int APS5_VABI _ZN7WebCore4Page12setGroupNameERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore4Page12setIsVisibleEb(); +int APS5_VABI _ZN7WebCore4Page12setSessionIDEN3PAL9SessionIDE(); +int APS5_VABI _ZN7WebCore4Page12whenUnnestedEON3WTF8FunctionIFvvEEE(); +int APS5_VABI _ZN7WebCore4Page13setIsInWindowEb(); +int APS5_VABI _ZN7WebCore4Page13setPaginationERKNS_10PaginationE(); +int APS5_VABI _ZN7WebCore4Page14layoutIfNeededEv(); +int APS5_VABI _ZN7WebCore4Page14setIsPrerenderEv(); +int APS5_VABI _ZN7WebCore4Page14setMediaVolumeEf(); +int APS5_VABI _ZN7WebCore4Page15setHeaderHeightEi(); +int APS5_VABI _ZN7WebCore4Page15updateRenderingEv(); +int APS5_VABI _ZN7WebCore4Page16countFindMatchesERKN3WTF6StringENS1_9OptionSetINS_14FindOptionFlagEEEj(); +int APS5_VABI _ZN7WebCore4Page16setCanStartMediaEb(); +int APS5_VABI _ZN7WebCore4Page16setDefersLoadingEb(); +int APS5_VABI _ZN7WebCore4Page16userAgentChangedEv(); +int APS5_VABI _ZN7WebCore4Page18setPageScaleFactorEfRKNS_8IntPointEb(); +int APS5_VABI _ZN7WebCore4Page18setTopContentInsetEf(); +int APS5_VABI _ZN7WebCore4Page18setViewScaleFactorEf(); +int APS5_VABI _ZN7WebCore4Page19addLayoutMilestonesEN3WTF9OptionSetINS_15LayoutMilestoneEEE(); +int APS5_VABI _ZN7WebCore4Page19appearanceDidChangeEv(); +int APS5_VABI _ZN7WebCore4Page19setDelegatesScalingEb(); +int APS5_VABI _ZN7WebCore4Page19setFullscreenInsetsERKNS_9RectEdgesIfEE(); +int APS5_VABI _ZN7WebCore4Page19userContentProviderEv(); +int APS5_VABI _ZN7WebCore4Page20injectUserStyleSheetERNS_14UserStyleSheetE(); +int APS5_VABI _ZN7WebCore4Page20scrollingCoordinatorEv(); +int APS5_VABI _ZN7WebCore4Page20setDeviceScaleFactorEf(); +int APS5_VABI _ZN7WebCore4Page20unmarkAllTextMatchesEv(); +int APS5_VABI _ZN7WebCore4Page21markAllMatchesForTextERKN3WTF6StringENS1_9OptionSetINS_14FindOptionFlagEEEbj(); +int APS5_VABI _ZN7WebCore4Page21replaceRangesWithTextERKN3WTF6VectorINS_11SimpleRangeELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEERKNS1_6StringEb(); +int APS5_VABI _ZN7WebCore4Page21resumeAnimatingImagesEv(); +int APS5_VABI _ZN7WebCore4Page22removeLayoutMilestonesEN3WTF9OptionSetINS_15LayoutMilestoneEEE(); +int APS5_VABI _ZN7WebCore4Page22resumeAllMediaPlaybackEv(); +int APS5_VABI _ZN7WebCore4Page22revealCurrentSelectionEv(); +int APS5_VABI _ZN7WebCore4Page22setUseSystemAppearanceEb(); +int APS5_VABI _ZN7WebCore4Page23clearUndoRedoOperationsEv(); +int APS5_VABI _ZN7WebCore4Page23dispatchAfterPrintEventEv(); +int APS5_VABI _ZN7WebCore4Page23finalizeRenderingUpdateEN3WTF9OptionSetINS_28FinalizeRenderingUpdateFlagsEEE(); +int APS5_VABI _ZN7WebCore4Page23invalidateStylesForLinkEj(); +int APS5_VABI _ZN7WebCore4Page23resumeAllMediaBufferingEv(); +int APS5_VABI _ZN7WebCore4Page23suspendAllMediaPlaybackEv(); +int APS5_VABI _ZN7WebCore4Page24dispatchBeforePrintEventEv(); +int APS5_VABI _ZN7WebCore4Page24replaceSelectionWithTextERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore4Page24resumeScriptedAnimationsEv(); +int APS5_VABI _ZN7WebCore4Page24scrollingStateTreeAsTextEv(); +int APS5_VABI _ZN7WebCore4Page24setCORSDisablingPatternsEON3WTF6VectorINS_21UserContentURLPatternELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE(); +int APS5_VABI _ZN7WebCore4Page24suspendAllMediaBufferingEv(); +int APS5_VABI _ZN7WebCore4Page25notifyToInjectUserScriptsEv(); +int APS5_VABI _ZN7WebCore4Page25screenPropertiesDidChangeEv(); +int APS5_VABI _ZN7WebCore4Page25suspendScriptedAnimationsEv(); +int APS5_VABI _ZN7WebCore4Page26applicationDidBecomeActiveEv(); +int APS5_VABI _ZN7WebCore4Page26clearWheelEventTestMonitorEv(); +int APS5_VABI _ZN7WebCore4Page26startMonitoringWheelEventsEb(); +int APS5_VABI _ZN7WebCore4Page27applicationWillResignActiveEv(); +int APS5_VABI _ZN7WebCore4Page27enableICECandidateFilteringEv(); +int APS5_VABI _ZN7WebCore4Page27invalidateStylesForAllLinksEv(); +int APS5_VABI _ZN7WebCore4Page27setFullscreenControlsHiddenEb(); +int APS5_VABI _ZN7WebCore4Page27setUnobscuredSafeAreaInsetsERKNS_9RectEdgesIfEE(); +int APS5_VABI _ZN7WebCore4Page27setVerticalScrollElasticityENS_16ScrollElasticityE(); +int APS5_VABI _ZN7WebCore4Page27setZoomedOutPageScaleFactorEf(); +int APS5_VABI _ZN7WebCore4Page28disableICECandidateFilteringEv(); +int APS5_VABI _ZN7WebCore4Page28effectiveAppearanceDidChangeEbb(); +int APS5_VABI _ZN7WebCore4Page28removeInjectedUserStyleSheetERNS_14UserStyleSheetE(); +int APS5_VABI _ZN7WebCore4Page29applicationDidEnterBackgroundEv(); +int APS5_VABI _ZN7WebCore4Page29clearPreviousItemFromAllPagesEPNS_11HistoryItemE(); +int APS5_VABI _ZN7WebCore4Page29setFullscreenAutoHideDurationEN3WTF7SecondsE(); +int APS5_VABI _ZN7WebCore4Page29setHorizontalScrollElasticityENS_16ScrollElasticityE(); +int APS5_VABI _ZN7WebCore4Page29startTrackingRenderingUpdatesEv(); +int APS5_VABI _ZN7WebCore4Page30accessibilitySettingsDidChangeEv(); +int APS5_VABI _ZN7WebCore4Page30addActivityStateChangeObserverERNS_27ActivityStateChangeObserverE(); +int APS5_VABI _ZN7WebCore4Page30applicationWillEnterForegroundEv(); +int APS5_VABI _ZN7WebCore4Page30setNeedsRecalcStyleInAllFramesEv(); +int APS5_VABI _ZN7WebCore4Page31setRemoteInspectionNameOverrideERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore4Page31setUserInterfaceLayoutDirectionENS_28UserInterfaceLayoutDirectionE(); +int APS5_VABI _ZN7WebCore4Page32nonFastScrollableRectsForTestingEv(); +int APS5_VABI _ZN7WebCore4Page32setMemoryCacheClientCallsEnabledEb(); +int APS5_VABI _ZN7WebCore4Page33removeActivityStateChangeObserverERNS_27ActivityStateChangeObserverE(); +int APS5_VABI _ZN7WebCore4Page33synchronousScrollingReasonsAsTextEv(); +int APS5_VABI _ZN7WebCore4Page34setInitialScaleIgnoringContentSizeEf(); +int APS5_VABI _ZN7WebCore4Page35resumeActiveDOMObjectsAndAnimationsEv(); +int APS5_VABI _ZN7WebCore4Page36setAllowsMediaDocumentInlinePlaybackEb(); +int APS5_VABI _ZN7WebCore4Page36setShouldSuppressScrollbarAnimationsEb(); +int APS5_VABI _ZN7WebCore4Page36suspendActiveDOMObjectsAndAnimationsEv(); +int APS5_VABI _ZN7WebCore4Page37setInLowQualityImageInterpolationModeEb(); +int APS5_VABI _ZN7WebCore4Page40passiveTouchEventListenerRectsForTestingEv(); +int APS5_VABI _ZN7WebCore4Page40updateMediaElementRateChangeRestrictionsEv(); +int APS5_VABI _ZN7WebCore4Page41setDOMTimerAlignmentIntervalIncreaseLimitEN3WTF7SecondsE(); +int APS5_VABI _ZN7WebCore4Page45setOutsideViewportThrottlingEnabledForTestingEb(); +int APS5_VABI _ZN7WebCore4Page52updateStyleForAllPagesAfterGlobalChangeInEnvironmentEv(); +int APS5_VABI _ZN7WebCore4Page8goToItemERNS_11HistoryItemENS_13FrameLoadTypeENS_27ShouldTreatAsContinuingLoadE(); +int APS5_VABI _ZN7WebCore4Page9initGroupEv(); +int APS5_VABI _ZN7WebCore4PageC1EONS_17PageConfigurationE(); +int APS5_VABI _ZN7WebCore4PageC2EONS_17PageConfigurationE(); +int APS5_VABI _ZN7WebCore4PageD1Ev(); +int APS5_VABI _ZN7WebCore4PageD2Ev(); +int APS5_VABI _ZN7WebCore4Path12closeSubpathEv(); +int APS5_VABI _ZN7WebCore4Path14addQuadCurveToERKNS_10FloatPointES3_(); +int APS5_VABI _ZN7WebCore4Path6moveToERKNS_10FloatPointE(); +int APS5_VABI _ZN7WebCore4Path9addLineToERKNS_10FloatPointE(); +int APS5_VABI _ZN7WebCore4PathC1ERKS0_(); +int APS5_VABI _ZN7WebCore4PathC2ERKS0_(); +int APS5_VABI _ZN7WebCore4PathaSERKS0_(); +int APS5_VABI _ZN7WebCore4Text16replaceWholeTextERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore4Text9splitTextEj(); +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_10AudioTrackE(); +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_10TimeRangesE(); +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_11DOMRectListE(); +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_12SourceBufferE(); +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_12WebAnimationE(); +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_13FetchResponseE(); +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_14XMLHttpRequestE(); +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_15DOMRectReadOnlyE(); +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_16HTMLImageElementE(); +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_17AnimationTimelineE(); +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_17DOMMatrixReadOnlyE(); +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_19CSSStyleDeclarationE(); +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_19TextTrackCueGenericE(); +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_4FileE(); +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_5RangeE(); +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_6DOMURLE(); +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_6Path2DE(); +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_7DOMRectE(); +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_7ElementE(); +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_8DocumentE(); +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_8LocationE(); +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_9DOMMatrixE(); +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_9ImageDataE(); +int APS5_VABI _ZN7WebCore4toJSEPN3JSC14JSGlobalObjectERNS_11WindowProxyE(); +int APS5_VABI _ZN7WebCore4toJSERNS_12VoidCallbackE(); +int APS5_VABI _ZN7WebCore4toJSERNS_14StringCallbackE(); +int APS5_VABI _ZN7WebCore50restrictScaleFactorToInitialScaleIfNotUserScalableERNS_18ViewportAttributesE(); +int APS5_VABI _ZN7WebCore5Cairo11ShadowStateC1ERKNS_20GraphicsContextStateE(); +int APS5_VABI _ZN7WebCore5Cairo11ShadowStateC2ERKNS_20GraphicsContextStateE(); +int APS5_VABI _ZN7WebCore5Event9initEventERKN3WTF10AtomStringEbb(); +int APS5_VABI _ZN7WebCore5Image12supportsTypeERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore5Image20loadPlatformResourceEPKc(); +int APS5_VABI _ZN7WebCore5Image6createERNS_13ImageObserverE(); +int APS5_VABI _ZN7WebCore5Image9nullImageEv(); +int APS5_VABI _ZN7WebCore5Range10selectNodeERNS_4NodeE(); +int APS5_VABI _ZN7WebCore5Range11setEndAfterERNS_4NodeE(); +int APS5_VABI _ZN7WebCore5Range12setEndBeforeERNS_4NodeE(); +int APS5_VABI _ZN7WebCore5Range13cloneContentsEv(); +int APS5_VABI _ZN7WebCore5Range13setStartAfterERNS_4NodeE(); +int APS5_VABI _ZN7WebCore5Range14deleteContentsEv(); +int APS5_VABI _ZN7WebCore5Range14isPointInRangeERNS_4NodeEj(); +int APS5_VABI _ZN7WebCore5Range14setStartBeforeERNS_4NodeE(); +int APS5_VABI _ZN7WebCore5Range15extractContentsEv(); +int APS5_VABI _ZN7WebCore5Range16surroundContentsERNS_4NodeE(); +int APS5_VABI _ZN7WebCore5Range18selectNodeContentsERNS_4NodeE(); +int APS5_VABI _ZN7WebCore5Range24createContextualFragmentERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore5Range6createERNS_8DocumentE(); +int APS5_VABI _ZN7WebCore5Range6expandERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore5Range8collapseEb(); +int APS5_VABI _ZN7WebCore5RangeD1Ev(); +int APS5_VABI _ZN7WebCore5RangeD2Ev(); +int APS5_VABI _ZN7WebCore5Style5Scope22flushPendingSelfUpdateEv(); +int APS5_VABI _ZN7WebCore5Style5Scope29flushPendingDescendantUpdatesEv(); +int APS5_VABI _ZN7WebCore5Style5Scope30didChangeStyleSheetEnvironmentEv(); +int APS5_VABI _ZN7WebCore5Style5Scope8resolverEv(); +int APS5_VABI _ZN7WebCore6Chrome23enableSuddenTerminationEv(); +int APS5_VABI _ZN7WebCore6Chrome24disableSuddenTerminationEv(); +int APS5_VABI _ZN7WebCore6Cursor8fromTypeENS0_4TypeE(); +int APS5_VABI _ZN7WebCore6CursorC1EPNS_5ImageERKNS_8IntPointE(); +int APS5_VABI _ZN7WebCore6CursorC2EPNS_5ImageERKNS_8IntPointE(); +int APS5_VABI _ZN7WebCore6Editor10applyStyleEPNS_15StylePropertiesENS_10EditActionE(); +int APS5_VABI _ZN7WebCore6Editor10findStringERKN3WTF6StringENS1_9OptionSetINS_14FindOptionFlagEEE(); +int APS5_VABI _ZN7WebCore6Editor10insertTextERKN3WTF6StringEPNS_5EventENS_18TextEventInputTypeE(); +int APS5_VABI _ZN7WebCore6Editor13canDHTMLPasteEv(); +int APS5_VABI _ZN7WebCore6Editor13performDeleteEv(); +int APS5_VABI _ZN7WebCore6Editor14simplifyMarkupEPNS_4NodeES2_(); +int APS5_VABI _ZN7WebCore6Editor16pasteAsPlainTextERKN3WTF6StringEb(); +int APS5_VABI _ZN7WebCore6Editor17cancelCompositionEv(); +int APS5_VABI _ZN7WebCore6Editor17insertOrderedListEv(); +int APS5_VABI _ZN7WebCore6Editor18confirmCompositionERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore6Editor18confirmCompositionEv(); +int APS5_VABI _ZN7WebCore6Editor18insertDictatedTextERKN3WTF6StringERKNS1_6VectorINS_20DictationAlternativeELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEEPNS_5EventE(); +int APS5_VABI _ZN7WebCore6Editor19deleteWithDirectionENS_18SelectionDirectionENS_15TextGranularityEbb(); +int APS5_VABI _ZN7WebCore6Editor19insertUnorderedListEv(); +int APS5_VABI _ZN7WebCore6Editor20canSmartCopyOrDeleteEv(); +int APS5_VABI _ZN7WebCore6Editor21applyStyleToSelectionEPNS_15StylePropertiesENS_10EditActionE(); +int APS5_VABI _ZN7WebCore6Editor21insertTextPlaceholderERKNS_7IntSizeE(); +int APS5_VABI _ZN7WebCore6Editor21removeTextPlaceholderERNS_22TextPlaceholderElementE(); +int APS5_VABI _ZN7WebCore6Editor22writeImageToPasteboardERNS_10PasteboardERNS_7ElementERKN3WTF3URLERKNS5_6StringE(); +int APS5_VABI _ZN7WebCore6Editor23changeSelectionListTypeEv(); +int APS5_VABI _ZN7WebCore6Editor23handleAcceptedCandidateENS_18TextCheckingResultE(); +int APS5_VABI _ZN7WebCore6Editor23setBaseWritingDirectionENS_16WritingDirectionE(); +int APS5_VABI _ZN7WebCore6Editor24advanceToNextMisspellingEb(); +int APS5_VABI _ZN7WebCore6Editor24computeAndSetTypingStyleERNS_15StylePropertiesENS_10EditActionE(); +int APS5_VABI _ZN7WebCore6Editor24replaceSelectionWithTextERKN3WTF6StringENS0_17SelectReplacementENS0_12SmartReplaceENS_10EditActionE(); +int APS5_VABI _ZN7WebCore6Editor25setIgnoreSelectionChangesEbNS0_15RevealSelectionE(); +int APS5_VABI _ZN7WebCore6Editor26changeBackToReplacedStringERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore6Editor26decreaseSelectionListLevelEv(); +int APS5_VABI _ZN7WebCore6Editor26increaseSelectionListLevelEv(); +int APS5_VABI _ZN7WebCore6Editor26toggleOverwriteModeEnabledEv(); +int APS5_VABI _ZN7WebCore6Editor26writeSelectionToPasteboardERNS_10PasteboardE(); +int APS5_VABI _ZN7WebCore6Editor28replaceRangeForSpellCheckingERKNS_11SimpleRangeERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore6Editor28replaceSelectionWithFragmentERNS_16DocumentFragmentENS0_17SelectReplacementENS0_12SmartReplaceENS0_10MatchStyleENS_10EditActionENS_22MailBlockquoteHandlingE(); +int APS5_VABI _ZN7WebCore6Editor28updateEditorUINowIfScheduledEv(); +int APS5_VABI _ZN7WebCore6Editor29canDecreaseSelectionListLevelEv(); +int APS5_VABI _ZN7WebCore6Editor29canIncreaseSelectionListLevelEv(); +int APS5_VABI _ZN7WebCore6Editor29handleAlternativeTextUIResultERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore6Editor29toggleContinuousSpellCheckingEv(); +int APS5_VABI _ZN7WebCore6Editor30deleteSelectionWithSmartDeleteEbNS_10EditActionE(); +int APS5_VABI _ZN7WebCore6Editor30pasteAsPlainTextBypassingDHTMLEv(); +int APS5_VABI _ZN7WebCore6Editor33increaseSelectionListLevelOrderedEv(); +int APS5_VABI _ZN7WebCore6Editor33markMisspellingsAfterTypingToWordERKNS_15VisiblePositionERKNS_16VisibleSelectionEb(); +int APS5_VABI _ZN7WebCore6Editor34setMarkedTextMatchesAreHighlightedEb(); +int APS5_VABI _ZN7WebCore6Editor35increaseSelectionListLevelUnorderedEv(); +int APS5_VABI _ZN7WebCore6Editor38commandIsSupportedFromMenuOrKeyBindingERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore6Editor39insertParagraphSeparatorInQuotedContentEv(); +int APS5_VABI _ZN7WebCore6Editor3cutENS0_20FromMenuOrKeyBindingE(); +int APS5_VABI _ZN7WebCore6Editor4copyENS0_20FromMenuOrKeyBindingE(); +int APS5_VABI _ZN7WebCore6Editor5pasteENS0_20FromMenuOrKeyBindingE(); +int APS5_VABI _ZN7WebCore6Editor6indentEv(); +int APS5_VABI _ZN7WebCore6Editor7CommandC1Ev(); +int APS5_VABI _ZN7WebCore6Editor7CommandC2Ev(); +int APS5_VABI _ZN7WebCore6Editor7commandERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore6Editor7copyURLERKN3WTF3URLERKNS1_6StringE(); +int APS5_VABI _ZN7WebCore6Editor7outdentEv(); +int APS5_VABI _ZN7WebCore6Editor9copyImageERKNS_13HitTestResultE(); +int APS5_VABI _ZN7WebCore6ISOBox4readERN3JSC8DataViewE(); +int APS5_VABI _ZN7WebCore6ISOBoxC1ERKS0_(); +int APS5_VABI _ZN7WebCore6ISOBoxC1Ev(); +int APS5_VABI _ZN7WebCore6ISOBoxC2ERKS0_(); +int APS5_VABI _ZN7WebCore6ISOBoxC2Ev(); +int APS5_VABI _ZN7WebCore6ISOBoxD0Ev(); +int APS5_VABI _ZN7WebCore6ISOBoxD1Ev(); +int APS5_VABI _ZN7WebCore6ISOBoxD2Ev(); +int APS5_VABI _ZN7WebCore6JSFile14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore6JSFile15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore6JSFile15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore6JSFile15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore6JSFile4infoEv(); +int APS5_VABI _ZN7WebCore6JSFile9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore6JSFile9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore6JSFileC1ERKS0_(); +int APS5_VABI _ZN7WebCore6JSFileC2ERKS0_(); +int APS5_VABI _ZN7WebCore6JSFileD1Ev(); +int APS5_VABI _ZN7WebCore6JSFileD2Ev(); +int APS5_VABI _ZN7WebCore6JSNode14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore6JSNode15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore6JSNode15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore6JSNode15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore6JSNode4infoEv(); +int APS5_VABI _ZN7WebCore6JSNode9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore6JSNode9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore6JSNodeC1ERKS0_(); +int APS5_VABI _ZN7WebCore6JSNodeC2ERKS0_(); +int APS5_VABI _ZN7WebCore6JSNodeD1Ev(); +int APS5_VABI _ZN7WebCore6JSNodeD2Ev(); +int APS5_VABI _ZN7WebCore6JSNodeaSERKS0_(); +int APS5_VABI _ZN7WebCore6Path2D6createERKNS_4PathE(); +int APS5_VABI _ZN7WebCore6Path2D6createERKS0_(); +int APS5_VABI _ZN7WebCore6Path2D6createEv(); +int APS5_VABI _ZN7WebCore6Path2D7addPathERS0_ONS_15DOMMatrix2DInitE(); +int APS5_VABI _ZN7WebCore6Path2DC1ERKNS_4PathE(); +int APS5_VABI _ZN7WebCore6Path2DC1Ev(); +int APS5_VABI _ZN7WebCore6Path2DC2ERKNS_4PathE(); +int APS5_VABI _ZN7WebCore6Path2DC2Ev(); +int APS5_VABI _ZN7WebCore6Path2DD0Ev(); +int APS5_VABI _ZN7WebCore6Path2DD1Ev(); +int APS5_VABI _ZN7WebCore6Path2DD2Ev(); +int APS5_VABI _ZN7WebCore6Path2DdaEPv(); +int APS5_VABI _ZN7WebCore6Path2DdlEPv(); +int APS5_VABI _ZN7WebCore6Path2DnaEm(); +int APS5_VABI _ZN7WebCore6Path2DnaEmPv(); +int APS5_VABI _ZN7WebCore6Path2DnwEm10NotNullTagPv(); +int APS5_VABI _ZN7WebCore6Path2DnwEm(); +int APS5_VABI _ZN7WebCore6Path2DnwEmPv(); +int APS5_VABI _ZN7WebCore6Region5Shape9translateERKNS_7IntSizeE(); +int APS5_VABI _ZN7WebCore6Region5uniteERKS0_(); +int APS5_VABI _ZN7WebCore6Region8subtractERKS0_(); +int APS5_VABI _ZN7WebCore6Region9intersectERKS0_(); +int APS5_VABI _ZN7WebCore6Region9translateERKNS_7IntSizeE(); +int APS5_VABI _ZN7WebCore6RegionC1EOS0_(); +int APS5_VABI _ZN7WebCore6RegionC1ERKNS_7IntRectE(); +int APS5_VABI _ZN7WebCore6RegionC1ERKS0_(); +int APS5_VABI _ZN7WebCore6RegionC1Ev(); +int APS5_VABI _ZN7WebCore6RegionC2EOS0_(); +int APS5_VABI _ZN7WebCore6RegionC2ERKNS_7IntRectE(); +int APS5_VABI _ZN7WebCore6RegionC2ERKS0_(); +int APS5_VABI _ZN7WebCore6RegionC2Ev(); +int APS5_VABI _ZN7WebCore6RegionD1Ev(); +int APS5_VABI _ZN7WebCore6RegionD2Ev(); +int APS5_VABI _ZN7WebCore6RegionaSEOS0_(); +int APS5_VABI _ZN7WebCore6RegionaSERKS0_(); +int APS5_VABI _ZN7WebCore6Widget12setFrameRectERKNS_7IntRectE(); +int APS5_VABI _ZN7WebCore6Widget16removeFromParentEv(); +int APS5_VABI _ZN7WebCore6Widget4hideEv(); +int APS5_VABI _ZN7WebCore6Widget4showEv(); +int APS5_VABI _ZN7WebCore6Widget8setFocusEb(); +int APS5_VABI _ZN7WebCore6Widget9setParentEPNS_10ScrollViewE(); +int APS5_VABI _ZN7WebCore6WidgetC2EPv(); +int APS5_VABI _ZN7WebCore6WidgetD0Ev(); +int APS5_VABI _ZN7WebCore6WidgetD1Ev(); +int APS5_VABI _ZN7WebCore6WidgetD2Ev(); +int APS5_VABI _ZN7WebCore7CSSRule10setCssTextERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore7Element10clientLeftEv(); +int APS5_VABI _ZN7WebCore7Element10offsetLeftEv(); +int APS5_VABI _ZN7WebCore7Element11clientWidthEv(); +int APS5_VABI _ZN7WebCore7Element11offsetWidthEv(); +int APS5_VABI _ZN7WebCore7Element12clientHeightEv(); +int APS5_VABI _ZN7WebCore7Element12offsetHeightEv(); +int APS5_VABI _ZN7WebCore7Element12setAttributeERKN3WTF10AtomStringES4_(); +int APS5_VABI _ZN7WebCore7Element12setAttributeERKNS_13QualifiedNameERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore7Element12setInnerHTMLERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore7Element12setOuterHTMLERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore7Element13scrollByLinesEi(); +int APS5_VABI _ZN7WebCore7Element13scrollByPagesEi(); +int APS5_VABI _ZN7WebCore7Element14getClientRectsEv(); +int APS5_VABI _ZN7WebCore7Element14scrollIntoViewEb(); +int APS5_VABI _ZN7WebCore7Element14setAttributeNSERKN3WTF10AtomStringES4_S4_(); +int APS5_VABI _ZN7WebCore7Element15removeAttributeERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore7Element16getAttributeNodeERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore7Element16setAttributeNodeERNS_4AttrE(); +int APS5_VABI _ZN7WebCore7Element17removeAttributeNSERKN3WTF10AtomStringES4_(); +int APS5_VABI _ZN7WebCore7Element18boundingClientRectEv(); +int APS5_VABI _ZN7WebCore7Element18getAttributeNodeNSERKN3WTF10AtomStringES4_(); +int APS5_VABI _ZN7WebCore7Element18insertAdjacentHTMLERKN3WTF6StringES4_(); +int APS5_VABI _ZN7WebCore7Element18setAttributeNodeNSERNS_4AttrE(); +int APS5_VABI _ZN7WebCore7Element19removeAttributeNodeERNS_4AttrE(); +int APS5_VABI _ZN7WebCore7Element19setBooleanAttributeERKNS_13QualifiedNameEb(); +int APS5_VABI _ZN7WebCore7Element20offsetTopForBindingsEv(); +int APS5_VABI _ZN7WebCore7Element20setIntegralAttributeERKNS_13QualifiedNameEi(); +int APS5_VABI _ZN7WebCore7Element21boundsInRootViewSpaceEv(); +int APS5_VABI _ZN7WebCore7Element21insertAdjacentElementERKN3WTF6StringERS0_(); +int APS5_VABI _ZN7WebCore7Element21offsetLeftForBindingsEv(); +int APS5_VABI _ZN7WebCore7Element22scrollIntoViewIfNeededEb(); +int APS5_VABI _ZN7WebCore7Element22setTabIndexForBindingsEi(); +int APS5_VABI _ZN7WebCore7Element23offsetParentForBindingsEv(); +int APS5_VABI _ZN7WebCore7Element23webkitRequestFullscreenEv(); +int APS5_VABI _ZN7WebCore7Element25ensureUserAgentShadowRootEv(); +int APS5_VABI _ZN7WebCore7Element28setUnsignedIntegralAttributeERKNS_13QualifiedNameEj(); +int APS5_VABI _ZN7WebCore7Element34invalidateStyleAndLayerCompositionEv(); +int APS5_VABI _ZN7WebCore7Element34setAttributeWithoutSynchronizationERKNS_13QualifiedNameERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore7Element7closestERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore7Element7matchesERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore7Element9classListEv(); +int APS5_VABI _ZN7WebCore7Element9clientTopEv(); +int APS5_VABI _ZN7WebCore7Element9innerTextEv(); +int APS5_VABI _ZN7WebCore7Element9offsetTopEv(); +int APS5_VABI _ZN7WebCore7Element9outerTextEv(); +int APS5_VABI _ZN7WebCore7Element9setPseudoERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore7JSEvent9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore7JSRange14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore7JSRange15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore7JSRange15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore7JSRange15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore7JSRange4infoEv(); +int APS5_VABI _ZN7WebCore7JSRange9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore7JSRange9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore7JSRangeC1ERKS0_(); +int APS5_VABI _ZN7WebCore7JSRangeC2ERKS0_(); +int APS5_VABI _ZN7WebCore7JSRangeD1Ev(); +int APS5_VABI _ZN7WebCore7JSRangeD2Ev(); +int APS5_VABI _ZN7WebCore7JSRangeaSERKS0_(); +int APS5_VABI _ZN7WebCore7PatternD1Ev(); +int APS5_VABI _ZN7WebCore7PatternD2Ev(); +int APS5_VABI _ZN7WebCore7Process10identifierEv(); +int APS5_VABI _ZN7WebCore8DOMTimerD0Ev(); +int APS5_VABI _ZN7WebCore8DOMTimerD1Ev(); +int APS5_VABI _ZN7WebCore8DOMTimerD2Ev(); +int APS5_VABI _ZN7WebCore8Document10importNodeERNS_4NodeEb(); +int APS5_VABI _ZN7WebCore8Document10setCharsetERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore8Document11createEventERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore8Document11createRangeEv(); +int APS5_VABI _ZN7WebCore8Document11execCommandERKN3WTF6StringEbS4_(); +int APS5_VABI _ZN7WebCore8Document11styleSheetsEv(); +int APS5_VABI _ZN7WebCore8Document12allDocumentsEv(); +int APS5_VABI _ZN7WebCore8Document12updateLayoutEv(); +int APS5_VABI _ZN7WebCore8Document13activeElementEv(); +int APS5_VABI _ZN7WebCore8Document13createElementERKNS_13QualifiedNameEb(); +int APS5_VABI _ZN7WebCore8Document13setDesignModeERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore8Document13setXMLVersionERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore8Document14implementationEv(); +int APS5_VABI _ZN7WebCore8Document14setDocumentURIERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore8Document15allDocumentsMapEv(); +int APS5_VABI _ZN7WebCore8Document15openForBindingsEPS0_RKN3WTF6StringES5_(); +int APS5_VABI _ZN7WebCore8Document16addAudioProducerERNS_13MediaProducerE(); +int APS5_VABI _ZN7WebCore8Document16closeForBindingsEv(); +int APS5_VABI _ZN7WebCore8Document16createNSResolverERNS_4NodeE(); +int APS5_VABI _ZN7WebCore8Document16isPageBoxVisibleEi(); +int APS5_VABI _ZN7WebCore8Document16scrollingElementEv(); +int APS5_VABI _ZN7WebCore8Document16setXMLStandaloneEb(); +int APS5_VABI _ZN7WebCore8Document17addConsoleMessageEN3JSC13MessageSourceENS1_12MessageLevelERKN3WTF6StringEm(); +int APS5_VABI _ZN7WebCore8Document17queryCommandStateERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore8Document17queryCommandValueERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore8Document18registerCollectionERNS_14HTMLCollectionE(); +int APS5_VABI _ZN7WebCore8Document19accessSVGExtensionsEv(); +int APS5_VABI _ZN7WebCore8Document19caretRangeFromPointEii(); +int APS5_VABI _ZN7WebCore8Document19dispatchWindowEventERNS_5EventEPNS_11EventTargetE(); +int APS5_VABI _ZN7WebCore8Document19queryCommandEnabledERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore8Document19removeAudioProducerERNS_13MediaProducerE(); +int APS5_VABI _ZN7WebCore8Document19updateStyleIfNeededEv(); +int APS5_VABI _ZN7WebCore8Document20queryCommandIndetermERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore8Document21queryCommandSupportedERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore8Document22createDocumentFragmentEv(); +int APS5_VABI _ZN7WebCore8Document22scrollingElementForAPIEv(); +int APS5_VABI _ZN7WebCore8Document23setAsRunningUserScriptsEv(); +int APS5_VABI _ZN7WebCore8Document24addMediaCanStartListenerERNS_21MediaCanStartListenerE(); +int APS5_VABI _ZN7WebCore8Document24createElementForBindingsERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore8Document24scheduleFullStyleRebuildEv(); +int APS5_VABI _ZN7WebCore8Document24setShouldCreateRenderersEb(); +int APS5_VABI _ZN7WebCore8Document25createCSSStyleDeclarationEv(); +int APS5_VABI _ZN7WebCore8Document25ensureTimelinesControllerEv(); +int APS5_VABI _ZN7WebCore8Document25startTrackingStyleRecalcsEv(); +int APS5_VABI _ZN7WebCore8Document26pageSizeAndMarginsInPixelsEiRNS_7IntSizeERiS3_S3_S3_(); +int APS5_VABI _ZN7WebCore8Document26textManipulationControllerEv(); +int APS5_VABI _ZN7WebCore8Document27removeMediaCanStartListenerERNS_21MediaCanStartListenerE(); +int APS5_VABI _ZN7WebCore8Document28setNeedsDOMWindowResizeEventEv(); +int APS5_VABI _ZN7WebCore8Document36updateLayoutIgnorePendingStylesheetsENS0_18RunPostLayoutTasksE(); +int APS5_VABI _ZN7WebCore8Document46wasLoadedWithDataTransferFromPrevalentResourceEv(); +int APS5_VABI _ZN7WebCore8Document4headEv(); +int APS5_VABI _ZN7WebCore8Document4openEPS0_(); +int APS5_VABI _ZN7WebCore8Document56hasRequestedPageSpecificStorageAccessWithUserInteractionERKNS_17RegistrableDomainE(); +int APS5_VABI _ZN7WebCore8Document59setHasRequestedPageSpecificStorageAccessWithUserInteractionERKNS_17RegistrableDomainE(); +int APS5_VABI _ZN7WebCore8Document5formsEv(); +int APS5_VABI _ZN7WebCore8Document5linksEv(); +int APS5_VABI _ZN7WebCore8Document6cookieEv(); +int APS5_VABI _ZN7WebCore8Document6embedsEv(); +int APS5_VABI _ZN7WebCore8Document6imagesEv(); +int APS5_VABI _ZN7WebCore8Document6setDirERKN3WTF10AtomStringE(); +int APS5_VABI _ZN7WebCore8Document7anchorsEv(); +int APS5_VABI _ZN7WebCore8Document7appletsEv(); +int APS5_VABI _ZN7WebCore8Document7hitTestERKNS_14HitTestRequestERNS_13HitTestResultE(); +int APS5_VABI _ZN7WebCore8Document7pluginsEv(); +int APS5_VABI _ZN7WebCore8Document7scriptsEv(); +int APS5_VABI _ZN7WebCore8Document8postTaskEONS_22ScriptExecutionContext4TaskE(); +int APS5_VABI _ZN7WebCore8Document8referrerEv(); +int APS5_VABI _ZN7WebCore8Document8timelineEv(); +int APS5_VABI _ZN7WebCore8Document9adoptNodeERNS_4NodeE(); +int APS5_VABI _ZN7WebCore8Document9setCookieERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore8FormData10appendBlobERKN3WTF3URLE(); +int APS5_VABI _ZN7WebCore8FormData10appendDataEPKvm(); +int APS5_VABI _ZN7WebCore8FormData16prepareForUploadEv(); +int APS5_VABI _ZN7WebCore8FormData21resolveBlobReferencesEPNS_16BlobRegistryImplE(); +int APS5_VABI _ZN7WebCore8FormData6createEPKvm(); +int APS5_VABI _ZN7WebCore8FormData6createEv(); +int APS5_VABI _ZN7WebCore8FormDataD1Ev(); +int APS5_VABI _ZN7WebCore8FormDataD2Ev(); +int APS5_VABI _ZN7WebCore8JSDOMURL14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore8JSDOMURL15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore8JSDOMURL15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore8JSDOMURL15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore8JSDOMURL4infoEv(); +int APS5_VABI _ZN7WebCore8JSDOMURL9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore8JSDOMURLC1ERKS0_(); +int APS5_VABI _ZN7WebCore8JSDOMURLC2ERKS0_(); +int APS5_VABI _ZN7WebCore8JSDOMURLD1Ev(); +int APS5_VABI _ZN7WebCore8JSDOMURLD2Ev(); +int APS5_VABI _ZN7WebCore8JSDOMURLaSERKS0_(); +int APS5_VABI _ZN7WebCore8JSPath2D14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore8JSPath2D15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore8JSPath2D15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore8JSPath2D15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore8JSPath2D4infoEv(); +int APS5_VABI _ZN7WebCore8JSPath2D9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore8JSPath2D9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore8JSPath2DC1ERKS0_(); +int APS5_VABI _ZN7WebCore8JSPath2DC2ERKS0_(); +int APS5_VABI _ZN7WebCore8JSPath2DD1Ev(); +int APS5_VABI _ZN7WebCore8JSPath2DD2Ev(); +int APS5_VABI _ZN7WebCore8JSPath2DaSERKS0_(); +int APS5_VABI _ZN7WebCore8PositionC1EPNS_4NodeENS0_10AnchorTypeE(); +int APS5_VABI _ZN7WebCore8PositionC1EPNS_4NodeEjNS0_10AnchorTypeE(); +int APS5_VABI _ZN7WebCore8PositionC1EPNS_4NodeEjNS0_25LegacyEditingPositionFlagE(); +int APS5_VABI _ZN7WebCore8PositionC2EPNS_4NodeENS0_10AnchorTypeE(); +int APS5_VABI _ZN7WebCore8PositionC2EPNS_4NodeEjNS0_10AnchorTypeE(); +int APS5_VABI _ZN7WebCore8PositionC2EPNS_4NodeEjNS0_25LegacyEditingPositionFlagE(); +int APS5_VABI _ZN7WebCore8SVGNames4initEv(); +int APS5_VABI _ZN7WebCore8SVGTests27hasFeatureForLegacyBindingsERKN3WTF6StringES4_(); +int APS5_VABI _ZN7WebCore8Settings16setImagesEnabledEb(); +int APS5_VABI _ZN7WebCore8Settings17setPluginsEnabledEb(); +int APS5_VABI _ZN7WebCore8Settings18setFrameFlatteningENS_15FrameFlatteningE(); +int APS5_VABI _ZN7WebCore8Settings19setShowDebugBordersEb(); +int APS5_VABI _ZN7WebCore8Settings20setCoreMathMLEnabledEb(); +int APS5_VABI _ZN7WebCore8Settings20setMediaTypeOverrideERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore8Settings21setColorFilterEnabledEb(); +int APS5_VABI _ZN7WebCore8Settings21setShowRepaintCounterEb(); +int APS5_VABI _ZN7WebCore8Settings23setUsesBackForwardCacheEb(); +int APS5_VABI _ZN7WebCore8Settings24setDNSPrefetchingEnabledEb(); +int APS5_VABI _ZN7WebCore8Settings24setTextAreasAreResizableEb(); +int APS5_VABI _ZN7WebCore8Settings24setVisualViewportEnabledEb(); +int APS5_VABI _ZN7WebCore8Settings25setUserStyleSheetLocationERKN3WTF3URLE(); +int APS5_VABI _ZN7WebCore8Settings29setAsyncFrameScrollingEnabledEb(); +int APS5_VABI _ZN7WebCore8Settings29setAuthorAndUserStylesEnabledEb(); +int APS5_VABI _ZN7WebCore8Settings30setResourceUsageOverlayVisibleEb(); +int APS5_VABI _ZN7WebCore8Settings31setICECandidateFilteringEnabledEb(); +int APS5_VABI _ZN7WebCore8Settings32setAcceleratedCompositingEnabledEb(); +int APS5_VABI _ZN7WebCore8Settings32setAsyncOverflowScrollingEnabledEb(); +int APS5_VABI _ZN7WebCore8Settings32setShouldAllowUserInstalledFontsEb(); +int APS5_VABI _ZN7WebCore8Settings33setFontFallbackPrefersPictographsEb(); +int APS5_VABI _ZN7WebCore8Settings35setBackgroundShouldExtendBeyondPageEb(); +int APS5_VABI _ZN7WebCore8Settings37setPunchOutWhiteBackgroundsInDarkModeEb(); +int APS5_VABI _ZN7WebCore8Settings38setHiddenPageDOMTimerThrottlingEnabledEb(); +int APS5_VABI _ZN7WebCore8Settings38setLayoutViewportHeightExpansionFactorEd(); +int APS5_VABI _ZN7WebCore8Settings41setAcceleratedCompositedAnimationsEnabledEb(); +int APS5_VABI _ZN7WebCore8Settings42setHiddenPageCSSAnimationSuspensionEnabledEb(); +int APS5_VABI _ZN7WebCore8Settings44setClientCoordinatesRelativeToLayoutViewportEb(); +int APS5_VABI _ZN7WebCore8Settings44setHiddenPageDOMTimerThrottlingAutoIncreasesEb(); +int APS5_VABI _ZN7WebCore8XMLNames4initEv(); +int APS5_VABI _ZN7WebCore9AnimationC1Ev(); +int APS5_VABI _ZN7WebCore9AnimationC2Ev(); +int APS5_VABI _ZN7WebCore9AnimationD1Ev(); +int APS5_VABI _ZN7WebCore9AnimationD2Ev(); +int APS5_VABI _ZN7WebCore9CSSParser16parseDeclarationERNS_22MutableStylePropertiesERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore9CSSParserC1ERKNS_16CSSParserContextE(); +int APS5_VABI _ZN7WebCore9CSSParserC2ERKNS_16CSSParserContextE(); +int APS5_VABI _ZN7WebCore9CSSParserD1Ev(); +int APS5_VABI _ZN7WebCore9CSSParserD2Ev(); +int APS5_VABI _ZN7WebCore9CookieJar10clearCacheEv(); +int APS5_VABI _ZN7WebCore9CookieJar10setCookiesERNS_8DocumentERKN3WTF3URLERKNS3_6StringE(); +int APS5_VABI _ZN7WebCore9CookieJar12setRawCookieERKNS_8DocumentERKNS_6CookieE(); +int APS5_VABI _ZN7WebCore9CookieJar17clearCacheForHostERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore9CookieJar26shouldIncludeSecureCookiesERKNS_8DocumentERKN3WTF3URLE(); +int APS5_VABI _ZN7WebCore9CookieJar29cookieRequestHeaderFieldProxyERKNS_8DocumentERKN3WTF3URLE(); +int APS5_VABI _ZN7WebCore9CookieJarD0Ev(); +int APS5_VABI _ZN7WebCore9CookieJarD1Ev(); +int APS5_VABI _ZN7WebCore9CookieJarD2Ev(); +int APS5_VABI _ZN7WebCore9DragImageC1EOS0_(); +int APS5_VABI _ZN7WebCore9DragImageC1Ev(); +int APS5_VABI _ZN7WebCore9DragImageC2EOS0_(); +int APS5_VABI _ZN7WebCore9DragImageC2Ev(); +int APS5_VABI _ZN7WebCore9DragImageD1Ev(); +int APS5_VABI _ZN7WebCore9DragImageD2Ev(); +int APS5_VABI _ZN7WebCore9DragImageaSEOS0_(); +int APS5_VABI _ZN7WebCore9FontCache17inactiveFontCountEv(); +int APS5_VABI _ZN7WebCore9FontCache19fontForPlatformDataERKNS_16FontPlatformDataE(); +int APS5_VABI _ZN7WebCore9FontCache21purgeInactiveFontDataEj(); +int APS5_VABI _ZN7WebCore9FontCache22lastResortFallbackFontERKNS_15FontDescriptionE(); +int APS5_VABI _ZN7WebCore9FontCache9fontCountEv(); +int APS5_VABI _ZN7WebCore9FrameTree11appendChildERNS_5FrameE(); +int APS5_VABI _ZN7WebCore9FrameTree9clearNameEv(); +int APS5_VABI _ZN7WebCore9GLContext18makeContextCurrentEv(); +int APS5_VABI _ZN7WebCore9GLContextD1Ev(); +int APS5_VABI _ZN7WebCore9GLContextD2Ev(); +int APS5_VABI _ZN7WebCore9HTMLNames4initEv(); +int APS5_VABI _ZN7WebCore9ImageData6createERKNS_7IntSizeE(); +int APS5_VABI _ZN7WebCore9JSCSSRule9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore9JSDOMRect14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore9JSDOMRect15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore9JSDOMRect15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore9JSDOMRect15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore9JSDOMRect4infoEv(); +int APS5_VABI _ZN7WebCore9JSDOMRect9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore9JSDOMRectC1ERKS0_(); +int APS5_VABI _ZN7WebCore9JSDOMRectC2ERKS0_(); +int APS5_VABI _ZN7WebCore9JSDOMRectD1Ev(); +int APS5_VABI _ZN7WebCore9JSDOMRectD2Ev(); +int APS5_VABI _ZN7WebCore9JSElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE(); +int APS5_VABI _ZN7WebCore9JSElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore9JSElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore9JSElement15subspaceForImplERN3JSC2VME(); +int APS5_VABI _ZN7WebCore9JSElement4infoEv(); +int APS5_VABI _ZN7WebCore9JSElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE(); +int APS5_VABI _ZN7WebCore9JSElement9toWrappedERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN7WebCore9JSElementC1ERKS0_(); +int APS5_VABI _ZN7WebCore9JSElementC2ERKS0_(); +int APS5_VABI _ZN7WebCore9JSElementD1Ev(); +int APS5_VABI _ZN7WebCore9MediaList12appendMediumERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore9MediaList12deleteMediumERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore9MediaList12setMediaTextERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore9MediaListD1Ev(); +int APS5_VABI _ZN7WebCore9MediaListD2Ev(); +int APS5_VABI _ZN7WebCore9PageGroup25captionPreferencesChangedEv(); +int APS5_VABI _ZN7WebCore9PageGroup9pageGroupERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore9PageGroupC1ERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore9PageGroupC2ERKN3WTF6StringE(); +int APS5_VABI _ZN7WebCore9SampleMap12removeSampleEPNS_11MediaSampleE(); +int APS5_VABI _ZN7WebCore9SampleMap5clearEv(); +int APS5_VABI _ZN7WebCore9SampleMap9addSampleERNS_11MediaSampleE(); +int APS5_VABI _ZN7WebCore9Scrollbar10mouseMovedERKNS_18PlatformMouseEventE(); +int APS5_VABI _ZN7WebCore9Scrollbar11mouseExitedEv(); +int APS5_VABI _ZN7WebCore9Scrollbar12mouseEnteredEv(); +int APS5_VABI _ZN7WebCore9Scrollbar13setProportionEii(); +int APS5_VABI _ZN7WebCore9Scrollbar22maxOverlapBetweenPagesEv(); +int APS5_VABI _ZN7WebCore9Scrollbar7mouseUpERKNS_18PlatformMouseEventE(); +int APS5_VABI _ZN7WebCore9Scrollbar8setStepsEiii(); +int APS5_VABI _ZN7WebCore9Scrollbar9mouseDownERKNS_18PlatformMouseEventE(); +int APS5_VABI _ZN7WebCore9TimerBase4stopEv(); +int APS5_VABI _ZN7WebCore9TimerBase5startEN3WTF7SecondsES2_(); +int APS5_VABI _ZN7WebCore9TimerBaseC2Ev(); +int APS5_VABI _ZN7WebCore9TimerBaseD0Ev(); +int APS5_VABI _ZN7WebCore9TimerBaseD1Ev(); +int APS5_VABI _ZN7WebCore9TimerBaseD2Ev(); +int APS5_VABI _ZN7WebCore9TreeScope16elementFromPointEdd(); +int APS5_VABI _ZN7WebCore9TreeScope17elementsFromPointERKNS_10FloatPointE(); +int APS5_VABI _ZN7WebCore9TreeScope17elementsFromPointEdd(); +int APS5_VABI _ZN7WebCore9endOfLineERKNS_15VisiblePositionE(); +int APS5_VABI _ZN7WebCore9endOfWordERKNS_15VisiblePositionENS_9EWordSideE(); +int APS5_VABI _ZN7WebCore9unionRectERKN3WTF6VectorINS_9FloatRectELm0ENS0_15CrashOnOverflowELm16ENS0_10FastMallocEEE(); +int APS5_VABI _ZN7WebCoreeqERKNS_18SecurityOriginDataES2_(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_10ColorSpaceE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_10ScrollTypeE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_11TouchActionE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_14ScrollClampingE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_15ScrollAlignment8BehaviorE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_17CompositeOperatorE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_17ScrollingNodeTypeE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_21ViewportRectStabilityE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_22AlphaPremultiplicationE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_24ScrollableAreaParametersE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_25ScrollPositioningBehaviorE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_26GraphicsLayerPaintingPhaseE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_28ScrollingLayerPositionActionE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_30ScrollBehaviorForFixedElementsE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_7LineCapE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_8LineJoinE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_8WindRuleE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamENS_9BlendModeE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_10FloatPointE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_10LayoutRectE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_10LayoutSizeE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_10LayoutUnitE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_11EventRegionE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_11LayoutPointE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_12FilterEffectE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_12FloatPoint3DE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_12VelocityDataE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_13GraphicsLayer16CustomAppearanceE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_14TimingFunctionE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_15AffineTransformE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_15FilterOperationE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_15ScrollAlignmentE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_15VisiblePositionE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_16FilterOperationsE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_16FloatRoundedRectE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_16VisibleSelectionE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_20TransformationMatrixE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_27AbsolutePositionConstraintsE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_32FixedPositionViewportConstraintsE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_33StickyPositionViewportConstraintsE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_5ColorE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_6RegionE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_7IntRectE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_7IntSizeE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_8IntPointE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_9FloatRectE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_9FloatSizeE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_9ImageDataE(); +int APS5_VABI _ZN7WebCorelsERN3WTF10TextStreamERKNS_9RectEdgesIfEE(); +int APS5_VABI _ZN7bmalloc11AllIsoHeaps3addEPNS_15IsoHeapImplBaseE(); +int APS5_VABI _ZN7bmalloc11AllIsoHeaps4headEv(); +int APS5_VABI _ZN7bmalloc11Deallocator18deallocateSlowCaseEPv(); +int APS5_VABI _ZN7bmalloc11IsoPageBase18allocatePageMemoryEv(); +int APS5_VABI _ZN7bmalloc11IsoTLSEntryC2Em(); +int APS5_VABI _ZN7bmalloc11IsoTLSEntryD0Ev(); +int APS5_VABI _ZN7bmalloc11IsoTLSEntryD1Ev(); +int APS5_VABI _ZN7bmalloc11IsoTLSEntryD2Ev(); +int APS5_VABI _ZN7bmalloc11IsoTLSEntrydlEPv(); +int APS5_VABI _ZN7bmalloc11IsoTLSEntrynaEmPv(); +int APS5_VABI _ZN7bmalloc11IsoTLSEntrynaEm(); +int APS5_VABI _ZN7bmalloc11IsoTLSEntrynwEmPv(); +int APS5_VABI _ZN7bmalloc11IsoTLSEntrynwEm(); +int APS5_VABI _ZN7bmalloc12IsoTLSLayout3addEPNS_11IsoTLSEntryE(); +int APS5_VABI _ZN7bmalloc13IsoSharedPage9tryCreateEv(); +int APS5_VABI _ZN7bmalloc15IsoHeapImplBase11didDecommitEPvm(); +int APS5_VABI _ZN7bmalloc15IsoHeapImplBase11scavengeNowEv(); +int APS5_VABI _ZN7bmalloc15IsoHeapImplBase13isNowFreeableEPvm(); +int APS5_VABI _ZN7bmalloc15IsoHeapImplBase14freeableMemoryEv(); +int APS5_VABI _ZN7bmalloc15IsoHeapImplBase16addToAllIsoHeapsEv(); +int APS5_VABI _ZN7bmalloc15IsoHeapImplBase16finishScavengingERNS_6VectorINS_16DeferredDecommitEEE(); +int APS5_VABI _ZN7bmalloc15IsoHeapImplBase18isNoLongerFreeableEPvm(); +int APS5_VABI _ZN7bmalloc15IsoHeapImplBase9didCommitEPvm(); +int APS5_VABI _ZN7bmalloc15IsoHeapImplBase9footprintEv(); +int APS5_VABI _ZN7bmalloc15IsoHeapImplBaseC2ERNS_5MutexE(); +int APS5_VABI _ZN7bmalloc15IsoHeapImplBaseD0Ev(); +int APS5_VABI _ZN7bmalloc15IsoHeapImplBaseD1Ev(); +int APS5_VABI _ZN7bmalloc15IsoHeapImplBaseD2Ev(); +int APS5_VABI _ZN7bmalloc15IsoHeapImplBasedlEPv(); +int APS5_VABI _ZN7bmalloc15IsoHeapImplBasenaEmPv(); +int APS5_VABI _ZN7bmalloc15IsoHeapImplBasenaEm(); +int APS5_VABI _ZN7bmalloc15IsoHeapImplBasenwEm(); +int APS5_VABI _ZN7bmalloc17getPerProcessDataEjPKcmm(); +int APS5_VABI _ZN7bmalloc5Cache25allocateSlowCaseNullCacheENS_8HeapKindEm(); +int APS5_VABI _ZN7bmalloc5Cache25allocateSlowCaseNullCacheENS_8HeapKindEmm(); +int APS5_VABI _ZN7bmalloc5Cache27deallocateSlowCaseNullCacheENS_8HeapKindEPv(); +int APS5_VABI _ZN7bmalloc5Cache27reallocateSlowCaseNullCacheENS_8HeapKindEPvm(); +int APS5_VABI _ZN7bmalloc5Cache28tryAllocateSlowCaseNullCacheENS_8HeapKindEm(); +int APS5_VABI _ZN7bmalloc5Cache28tryAllocateSlowCaseNullCacheENS_8HeapKindEmm(); +int APS5_VABI _ZN7bmalloc5Cache30tryReallocateSlowCaseNullCacheENS_8HeapKindEPvm(); +int APS5_VABI _ZN7bmalloc5Cache8scavengeENS_8HeapKindE(); +int APS5_VABI _ZN7bmalloc6IsoTLS13ensureEntriesEj(); +int APS5_VABI _ZN7bmalloc6IsoTLS8scavengeEv(); +int APS5_VABI _ZN7bmalloc8FreeList14initializeBumpEPcj(); +int APS5_VABI _ZN7bmalloc8FreeList14initializeListEPNS_8FreeCellEmj(); +int APS5_VABI _ZN7bmalloc8FreeList5clearEv(); +int APS5_VABI _ZN7bmalloc8FreeListC1Ev(); +int APS5_VABI _ZN7bmalloc8FreeListD1Ev(); +int APS5_VABI _ZN7bmalloc9Allocator12allocateImplEmmNS_13FailureActionE(); +int APS5_VABI _ZN7bmalloc9Scavenger29scheduleIfUnderMemoryPressureEm(); +int APS5_VABI _ZN7bmalloc9Scavenger8scheduleEm(); +int APS5_VABI _ZN9Inspector13AgentRegistry13discardValuesEv(); +int APS5_VABI _ZN9Inspector13AgentRegistry27didCreateFrontendAndBackendEPNS_14FrontendRouterEPNS_17BackendDispatcherE(); +int APS5_VABI _ZN9Inspector13AgentRegistry29willDestroyFrontendAndBackendENS_16DisconnectReasonE(); +int APS5_VABI _ZN9Inspector13AgentRegistryC2Ev(); +int APS5_VABI _ZN9Inspector13AgentRegistryD1Ev(); +int APS5_VABI _ZN9Inspector13AgentRegistryD2Ev(); +int APS5_VABI _ZN9Inspector14ConsoleMessage13addToFrontendERNS_25ConsoleFrontendDispatcherERNS_21InjectedScriptManagerEb(); +int APS5_VABI _ZN9Inspector14ConsoleMessage14incrementCountEv(); +int APS5_VABI _ZN9Inspector14ConsoleMessage20autogenerateMetadataEPN3JSC14JSGlobalObjectE(); +int APS5_VABI _ZN9Inspector14ConsoleMessage26updateRepeatCountInConsoleERNS_25ConsoleFrontendDispatcherE(); +int APS5_VABI _ZN9Inspector14ConsoleMessage5clearEv(); +int APS5_VABI _ZN9Inspector14ConsoleMessageD1Ev(); +int APS5_VABI _ZN9Inspector14ConsoleMessageD2Ev(); +int APS5_VABI _ZN9Inspector14ConsoleMessagedaEPv(); +int APS5_VABI _ZN9Inspector14ConsoleMessagedlEPv(); +int APS5_VABI _ZN9Inspector14ConsoleMessagenaEmPv(); +int APS5_VABI _ZN9Inspector14ConsoleMessagenaEm(); +int APS5_VABI _ZN9Inspector14ConsoleMessagenwEmPv(); +int APS5_VABI _ZN9Inspector14ConsoleMessagenwEm(); +int APS5_VABI _ZN9Inspector14FrontendRouter15connectFrontendERNS_15FrontendChannelE(); +int APS5_VABI _ZN9Inspector14FrontendRouter18disconnectFrontendERNS_15FrontendChannelE(); +int APS5_VABI _ZN9Inspector14FrontendRouter22disconnectAllFrontendsEv(); +int APS5_VABI _ZN9Inspector14FrontendRouter6createEv(); +int APS5_VABI _ZN9Inspector14FrontendRouterC1Ev(); +int APS5_VABI _ZN9Inspector14FrontendRouterC2Ev(); +int APS5_VABI _ZN9Inspector14FrontendRouterD1Ev(); +int APS5_VABI _ZN9Inspector14FrontendRouterD2Ev(); +int APS5_VABI _ZN9Inspector14InjectedScript13inspectObjectEN3JSC7JSValueE(); +int APS5_VABI _ZN9Inspector14InjectedScript13releaseObjectERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector14InjectedScript13setEventValueEN3JSC7JSValueE(); +int APS5_VABI _ZN9Inspector14InjectedScript15arrayFromVectorEON3WTF6VectorIN3JSC7JSValueELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE(); +int APS5_VABI _ZN9Inspector14InjectedScript15clearEventValueEv(); +int APS5_VABI _ZN9Inspector14InjectedScript17setExceptionValueEN3JSC7JSValueE(); +int APS5_VABI _ZN9Inspector14InjectedScript18releaseObjectGroupERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector14InjectedScript19clearExceptionValueEv(); +int APS5_VABI _ZN9Inspector14InjectedScriptC1ERKS0_(); +int APS5_VABI _ZN9Inspector14InjectedScriptC1Ev(); +int APS5_VABI _ZN9Inspector14InjectedScriptC2ERKS0_(); +int APS5_VABI _ZN9Inspector14InjectedScriptC2Ev(); +int APS5_VABI _ZN9Inspector14InjectedScriptD0Ev(); +int APS5_VABI _ZN9Inspector14InjectedScriptD1Ev(); +int APS5_VABI _ZN9Inspector14InjectedScriptD2Ev(); +int APS5_VABI _ZN9Inspector14InjectedScriptaSERKS0_(); +int APS5_VABI _ZN9Inspector14InspectorAgent25evaluateForTestInFrontendERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector14InspectorAgent27didCreateFrontendAndBackendEPNS_14FrontendRouterEPNS_17BackendDispatcherE(); +int APS5_VABI _ZN9Inspector14InspectorAgentD0Ev(); +int APS5_VABI _ZN9Inspector14InspectorAgentD2Ev(); +int APS5_VABI _ZN9Inspector14InspectorAgentdaEPv(); +int APS5_VABI _ZN9Inspector14InspectorAgentdlEPv(); +int APS5_VABI _ZN9Inspector14InspectorAgentnaEmPv(); +int APS5_VABI _ZN9Inspector14InspectorAgentnwEm10NotNullTagPv(); +int APS5_VABI _ZN9Inspector14InspectorAgentnwEmPv(); +int APS5_VABI _ZN9Inspector14InspectorAgentnwEm(); +int APS5_VABI _ZN9Inspector15AsyncStackTrace18didCancelAsyncCallEv(); +int APS5_VABI _ZN9Inspector15AsyncStackTrace20didDispatchAsyncCallEv(); +int APS5_VABI _ZN9Inspector15AsyncStackTrace21willDispatchAsyncCallEm(); +int APS5_VABI _ZN9Inspector15AsyncStackTrace6removeEv(); +int APS5_VABI _ZN9Inspector15AsyncStackTrace8truncateEm(); +int APS5_VABI _ZN9Inspector15AsyncStackTraceD1Ev(); +int APS5_VABI _ZN9Inspector15AsyncStackTraceD2Ev(); +int APS5_VABI _ZN9Inspector15InspectorTarget17setResumeCallbackEON3WTF8FunctionIFvvEEE(); +int APS5_VABI _ZN9Inspector15InspectorTarget5pauseEv(); +int APS5_VABI _ZN9Inspector15InspectorTarget6resumeEv(); +int APS5_VABI _ZN9Inspector15InspectorTargetC2Ev(); +int APS5_VABI _ZN9Inspector15InspectorTargetD1Ev(); +int APS5_VABI _ZN9Inspector15InspectorTargetD2Ev(); +int APS5_VABI _ZN9Inspector15RemoteInspector11setupFailedEj(); +int APS5_VABI _ZN9Inspector15RemoteInspector12stopInternalENS0_10StopSourceE(); +int APS5_VABI _ZN9Inspector15RemoteInspector12updateTargetEPNS_24RemoteControllableTargetE(); +int APS5_VABI _ZN9Inspector15RemoteInspector13startDisabledEv(); +int APS5_VABI _ZN9Inspector15RemoteInspector14registerTargetEPNS_24RemoteControllableTargetE(); +int APS5_VABI _ZN9Inspector15RemoteInspector14setupCompletedEj(); +int APS5_VABI _ZN9Inspector15RemoteInspector15pushListingsNowEv(); +int APS5_VABI _ZN9Inspector15RemoteInspector15updateTargetMapEPNS_24RemoteControllableTargetE(); +int APS5_VABI _ZN9Inspector15RemoteInspector16pushListingsSoonEv(); +int APS5_VABI _ZN9Inspector15RemoteInspector16unregisterTargetEPNS_24RemoteControllableTargetE(); +int APS5_VABI _ZN9Inspector15RemoteInspector19sendMessageToRemoteEjRKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector15RemoteInspector19sendMessageToTargetEjPKc(); +int APS5_VABI _ZN9Inspector15RemoteInspector19updateTargetListingERKNS_24RemoteControllableTargetE(); +int APS5_VABI _ZN9Inspector15RemoteInspector19updateTargetListingEj(); +int APS5_VABI _ZN9Inspector15RemoteInspector24updateClientCapabilitiesEv(); +int APS5_VABI _ZN9Inspector15RemoteInspector27clientCapabilitiesDidChangeEv(); +int APS5_VABI _ZN9Inspector15RemoteInspector27updateHasActiveDebugSessionEv(); +int APS5_VABI _ZN9Inspector15RemoteInspector29nextAvailableTargetIdentifierEv(); +int APS5_VABI _ZN9Inspector15RemoteInspector29waitingForAutomaticInspectionEj(); +int APS5_VABI _ZN9Inspector15RemoteInspector34updateAutomaticInspectionCandidateEPNS_22RemoteInspectionTargetE(); +int APS5_VABI _ZN9Inspector15RemoteInspector4stopEv(); +int APS5_VABI _ZN9Inspector15RemoteInspector5setupEj(); +int APS5_VABI _ZN9Inspector15RemoteInspector5startEv(); +int APS5_VABI _ZN9Inspector15RemoteInspector6ClientC2ERKS1_(); +int APS5_VABI _ZN9Inspector15RemoteInspector6ClientC2Ev(); +int APS5_VABI _ZN9Inspector15RemoteInspector6ClientD0Ev(); +int APS5_VABI _ZN9Inspector15RemoteInspector6ClientD1Ev(); +int APS5_VABI _ZN9Inspector15RemoteInspector6ClientD2Ev(); +int APS5_VABI _ZN9Inspector15RemoteInspector7connectEj(); +int APS5_VABI _ZN9Inspector15RemoteInspectorC1Ev(); +int APS5_VABI _ZN9Inspector15RemoteInspectorC2Ev(); +int APS5_VABI _ZN9Inspector15RemoteInspectorD0Ev(); +int APS5_VABI _ZN9Inspector15RemoteInspectorD1Ev(); +int APS5_VABI _ZN9Inspector15RemoteInspectorD2Ev(); +int APS5_VABI _ZN9Inspector15ScriptArguments6createEPN3JSC14JSGlobalObjectEON3WTF6VectorINS1_6StrongINS1_7UnknownELNS1_30ShouldStrongDestructorGrabLockE0EEELm0ENS4_15CrashOnOverflowELm16ENS4_10FastMallocEEE(); +int APS5_VABI _ZN9Inspector15ScriptArgumentsC1EPN3JSC14JSGlobalObjectEON3WTF6VectorINS1_6StrongINS1_7UnknownELNS1_30ShouldStrongDestructorGrabLockE0EEELm0ENS4_15CrashOnOverflowELm16ENS4_10FastMallocEEE(); +int APS5_VABI _ZN9Inspector15ScriptArgumentsC2EPN3JSC14JSGlobalObjectEON3WTF6VectorINS1_6StrongINS1_7UnknownELNS1_30ShouldStrongDestructorGrabLockE0EEELm0ENS4_15CrashOnOverflowELm16ENS4_10FastMallocEEE(); +int APS5_VABI _ZN9Inspector15ScriptArgumentsD1Ev(); +int APS5_VABI _ZN9Inspector15ScriptArgumentsD2Ev(); +int APS5_VABI _ZN9Inspector15ScriptCallFrameC1ERKS0_(); +int APS5_VABI _ZN9Inspector15ScriptCallFrameC2ERKS0_(); +int APS5_VABI _ZN9Inspector15ScriptCallFrameD1Ev(); +int APS5_VABI _ZN9Inspector15ScriptCallFrameD2Ev(); +int APS5_VABI _ZN9Inspector15ScriptCallFrameaSERKS0_(); +int APS5_VABI _ZN9Inspector15ScriptCallStack6createEv(); +int APS5_VABI _ZN9Inspector15ScriptCallStackC1Ev(); +int APS5_VABI _ZN9Inspector15ScriptCallStackC2Ev(); +int APS5_VABI _ZN9Inspector15ScriptCallStackD1Ev(); +int APS5_VABI _ZN9Inspector15ScriptCallStackD2Ev(); +int APS5_VABI _ZN9Inspector16toInspectorValueEPN3JSC14JSGlobalObjectENS0_7JSValueE(); +int APS5_VABI _ZN9Inspector17BackendDispatcher12CallbackBase11sendFailureERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector17BackendDispatcher12CallbackBase7disableEv(); +int APS5_VABI _ZN9Inspector17BackendDispatcher12CallbackBaseD1Ev(); +int APS5_VABI _ZN9Inspector17BackendDispatcher12CallbackBaseD2Ev(); +int APS5_VABI _ZN9Inspector17BackendDispatcher17sendPendingErrorsEv(); +int APS5_VABI _ZN9Inspector17BackendDispatcher19reportProtocolErrorENS0_15CommonErrorCodeERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector17BackendDispatcher27registerDispatcherForDomainERKN3WTF6StringEPNS_29SupplementalBackendDispatcherE(); +int APS5_VABI _ZN9Inspector17BackendDispatcher8dispatchERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector17BackendDispatcherD1Ev(); +int APS5_VABI _ZN9Inspector17BackendDispatcherD2Ev(); +int APS5_VABI _ZN9Inspector18IdentifiersFactory16createIdentifierEv(); +int APS5_VABI _ZN9Inspector18IdentifiersFactory9requestIdEm(); +int APS5_VABI _ZN9Inspector18InjectedScriptBaseC1ERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector18InjectedScriptBaseC1ERKS0_(); +int APS5_VABI _ZN9Inspector18InjectedScriptBaseC2ERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector18InjectedScriptBaseC2ERKS0_(); +int APS5_VABI _ZN9Inspector18InjectedScriptBaseD0Ev(); +int APS5_VABI _ZN9Inspector18InjectedScriptBaseD1Ev(); +int APS5_VABI _ZN9Inspector18InjectedScriptBaseD2Ev(); +int APS5_VABI _ZN9Inspector18InjectedScriptBaseaSERKS0_(); +int APS5_VABI _ZN9Inspector18InjectedScriptHost16clearAllWrappersEv(); +int APS5_VABI _ZN9Inspector18InjectedScriptHost19isHTMLAllCollectionERN3JSC2VMENS1_7JSValueE(); +int APS5_VABI _ZN9Inspector18InjectedScriptHost21getInternalPropertiesERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE(); +int APS5_VABI _ZN9Inspector18InjectedScriptHost6createEv(); +int APS5_VABI _ZN9Inspector18InjectedScriptHost7wrapperEPN3JSC14JSGlobalObjectE(); +int APS5_VABI _ZN9Inspector18InjectedScriptHostC1Ev(); +int APS5_VABI _ZN9Inspector18InjectedScriptHostC2Ev(); +int APS5_VABI _ZN9Inspector18InjectedScriptHostD0Ev(); +int APS5_VABI _ZN9Inspector18InjectedScriptHostD1Ev(); +int APS5_VABI _ZN9Inspector18InjectedScriptHostD2Ev(); +int APS5_VABI _ZN9Inspector18InspectorHeapAgent17didGarbageCollectEN3JSC15CollectionScopeE(); +int APS5_VABI _ZN9Inspector18InspectorHeapAgent18clearHeapSnapshotsEv(); +int APS5_VABI _ZN9Inspector18InspectorHeapAgent18willGarbageCollectEv(); +int APS5_VABI _ZN9Inspector18InspectorHeapAgent27didCreateFrontendAndBackendEPNS_14FrontendRouterEPNS_17BackendDispatcherE(); +int APS5_VABI _ZN9Inspector18InspectorHeapAgent29dispatchGarbageCollectedEventENS_8Protocol4Heap17GarbageCollection4TypeEN3WTF7SecondsES6_(); +int APS5_VABI _ZN9Inspector18InspectorHeapAgent29willDestroyFrontendAndBackendENS_16DisconnectReasonE(); +int APS5_VABI _ZN9Inspector18InspectorHeapAgentC1ERNS_12AgentContextE(); +int APS5_VABI _ZN9Inspector18InspectorHeapAgentC2ERNS_12AgentContextE(); +int APS5_VABI _ZN9Inspector18InspectorHeapAgentD0Ev(); +int APS5_VABI _ZN9Inspector18InspectorHeapAgentD1Ev(); +int APS5_VABI _ZN9Inspector18InspectorHeapAgentD2Ev(); +int APS5_VABI _ZN9Inspector18InspectorHeapAgentdaEPv(); +int APS5_VABI _ZN9Inspector18InspectorHeapAgentdlEPv(); +int APS5_VABI _ZN9Inspector18InspectorHeapAgentnaEm(); +int APS5_VABI _ZN9Inspector18InspectorHeapAgentnaEmPv(); +int APS5_VABI _ZN9Inspector18InspectorHeapAgentnwEm10NotNullTagPv(); +int APS5_VABI _ZN9Inspector18InspectorHeapAgentnwEm(); +int APS5_VABI _ZN9Inspector18InspectorHeapAgentnwEmPv(); +int APS5_VABI _ZN9Inspector19InspectorAuditAgent11muteConsoleEv(); +int APS5_VABI _ZN9Inspector19InspectorAuditAgent13unmuteConsoleEv(); +int APS5_VABI _ZN9Inspector19InspectorAuditAgent19populateAuditObjectEPN3JSC14JSGlobalObjectERNS1_6StrongINS1_8JSObjectELNS1_30ShouldStrongDestructorGrabLockE0EEE(); +int APS5_VABI _ZN9Inspector19InspectorAuditAgent21injectedScriptManagerEv(); +int APS5_VABI _ZN9Inspector19InspectorAuditAgent27didCreateFrontendAndBackendEPNS_14FrontendRouterEPNS_17BackendDispatcherE(); +int APS5_VABI _ZN9Inspector19InspectorAuditAgent29willDestroyFrontendAndBackendENS_16DisconnectReasonE(); +int APS5_VABI _ZN9Inspector19InspectorAuditAgentC2ERNS_12AgentContextE(); +int APS5_VABI _ZN9Inspector19InspectorAuditAgentD0Ev(); +int APS5_VABI _ZN9Inspector19InspectorAuditAgentD1Ev(); +int APS5_VABI _ZN9Inspector19InspectorAuditAgentD2Ev(); +int APS5_VABI _ZN9Inspector19InspectorAuditAgentdaEPv(); +int APS5_VABI _ZN9Inspector19InspectorAuditAgentdlEPv(); +int APS5_VABI _ZN9Inspector19InspectorAuditAgentnaEmPv(); +int APS5_VABI _ZN9Inspector19InspectorAuditAgentnaEm(); +int APS5_VABI _ZN9Inspector19InspectorAuditAgentnwEm(); +int APS5_VABI _ZN9Inspector19InspectorAuditAgentnwEmPv(); +int APS5_VABI _ZN9Inspector20CSSBackendDispatcher6createERNS_17BackendDispatcherEPNS_27CSSBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector20CSSBackendDispatcherC1ERNS_17BackendDispatcherEPNS_27CSSBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector20CSSBackendDispatcherC2ERNS_17BackendDispatcherEPNS_27CSSBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector20CSSBackendDispatcherD0Ev(); +int APS5_VABI _ZN9Inspector20CSSBackendDispatcherD1Ev(); +int APS5_VABI _ZN9Inspector20CSSBackendDispatcherD2Ev(); +int APS5_VABI _ZN9Inspector20DOMBackendDispatcher6createERNS_17BackendDispatcherEPNS_27DOMBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector20DOMBackendDispatcherC1ERNS_17BackendDispatcherEPNS_27DOMBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector20DOMBackendDispatcherC2ERNS_17BackendDispatcherEPNS_27DOMBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector20DOMBackendDispatcherD0Ev(); +int APS5_VABI _ZN9Inspector20DOMBackendDispatcherD1Ev(); +int APS5_VABI _ZN9Inspector20DOMBackendDispatcherD2Ev(); +int APS5_VABI _ZN9Inspector20InjectedScriptModule14ensureInjectedEPNS_21InjectedScriptManagerEPN3JSC14JSGlobalObjectE(); +int APS5_VABI _ZN9Inspector20InjectedScriptModule14ensureInjectedEPNS_21InjectedScriptManagerERKNS_14InjectedScriptE(); +int APS5_VABI _ZN9Inspector20InjectedScriptModuleC2ERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector20InjectedScriptModuleC2ERKS0_(); +int APS5_VABI _ZN9Inspector20InjectedScriptModuleD0Ev(); +int APS5_VABI _ZN9Inspector20InjectedScriptModuleD1Ev(); +int APS5_VABI _ZN9Inspector20InjectedScriptModuleD2Ev(); +int APS5_VABI _ZN9Inspector20InspectorTargetAgent13targetCreatedERNS_15InspectorTargetE(); +int APS5_VABI _ZN9Inspector20InspectorTargetAgent15targetDestroyedERNS_15InspectorTargetE(); +int APS5_VABI _ZN9Inspector20InspectorTargetAgent16connectToTargetsEv(); +int APS5_VABI _ZN9Inspector20InspectorTargetAgent21disconnectFromTargetsEv(); +int APS5_VABI _ZN9Inspector20InspectorTargetAgent26didCommitProvisionalTargetERKN3WTF6StringES4_(); +int APS5_VABI _ZN9Inspector20InspectorTargetAgent27didCreateFrontendAndBackendEPNS_14FrontendRouterEPNS_17BackendDispatcherE(); +int APS5_VABI _ZN9Inspector20InspectorTargetAgent29willDestroyFrontendAndBackendENS_16DisconnectReasonE(); +int APS5_VABI _ZN9Inspector20InspectorTargetAgent31sendMessageFromTargetToFrontendERKN3WTF6StringES4_(); +int APS5_VABI _ZN9Inspector20InspectorTargetAgentC1ERNS_14FrontendRouterERNS_17BackendDispatcherE(); +int APS5_VABI _ZN9Inspector20InspectorTargetAgentC2ERNS_14FrontendRouterERNS_17BackendDispatcherE(); +int APS5_VABI _ZN9Inspector20InspectorTargetAgentD0Ev(); +int APS5_VABI _ZN9Inspector20InspectorTargetAgentD1Ev(); +int APS5_VABI _ZN9Inspector20InspectorTargetAgentD2Ev(); +int APS5_VABI _ZN9Inspector20InspectorTargetAgentdaEPv(); +int APS5_VABI _ZN9Inspector20InspectorTargetAgentdlEPv(); +int APS5_VABI _ZN9Inspector20InspectorTargetAgentnaEm(); +int APS5_VABI _ZN9Inspector20InspectorTargetAgentnaEmPv(); +int APS5_VABI _ZN9Inspector20InspectorTargetAgentnwEmPv(); +int APS5_VABI _ZN9Inspector20InspectorTargetAgentnwEm(); +int APS5_VABI _ZN9Inspector21CSSFrontendDispatcher17styleSheetChangedERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector21CSSFrontendDispatcher17styleSheetRemovedERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector21CSSFrontendDispatcher23mediaQueryResultChangedEv(); +int APS5_VABI _ZN9Inspector21CSSFrontendDispatcherC1ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector21CSSFrontendDispatcherC2ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector21CSSFrontendDispatcherdaEPv(); +int APS5_VABI _ZN9Inspector21CSSFrontendDispatcherdlEPv(); +int APS5_VABI _ZN9Inspector21CSSFrontendDispatchernaEmPv(); +int APS5_VABI _ZN9Inspector21CSSFrontendDispatchernwEm(); +int APS5_VABI _ZN9Inspector21CSSFrontendDispatchernwEmPv(); +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcher15documentUpdatedEv(); +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcher16attributeRemovedEiRKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcher16childNodeRemovedEii(); +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcher16shadowRootPoppedEii(); +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcher17attributeModifiedEiRKN3WTF6StringES4_(); +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcher19didAddEventListenerEi(); +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcher20pseudoElementRemovedEii(); +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcher21characterDataModifiedEiRKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcher21childNodeCountUpdatedEii(); +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcher23willRemoveEventListenerEi(); +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcher25customElementStateChangedEiNS_8Protocol3DOM18CustomElementStateE(); +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcher34powerEfficientPlaybackStateChangedEidb(); +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcher7inspectEi(); +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcherC1ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcherC2ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcherdaEPv(); +int APS5_VABI _ZN9Inspector21DOMFrontendDispatcherdlEPv(); +int APS5_VABI _ZN9Inspector21DOMFrontendDispatchernaEmPv(); +int APS5_VABI _ZN9Inspector21DOMFrontendDispatchernaEm(); +int APS5_VABI _ZN9Inspector21DOMFrontendDispatchernwEm(); +int APS5_VABI _ZN9Inspector21DOMFrontendDispatchernwEmPv(); +int APS5_VABI _ZN9Inspector21HeapBackendDispatcherC1ERNS_17BackendDispatcherEPNS_28HeapBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector21HeapBackendDispatcherC2ERNS_17BackendDispatcherEPNS_28HeapBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector21HeapBackendDispatcherD1Ev(); +int APS5_VABI _ZN9Inspector21HeapBackendDispatcherD2Ev(); +int APS5_VABI _ZN9Inspector21InjectedScriptManager10disconnectEv(); +int APS5_VABI _ZN9Inspector21InjectedScriptManager15clearEventValueEv(); +int APS5_VABI _ZN9Inspector21InjectedScriptManager17injectedScriptForEPN3JSC14JSGlobalObjectE(); +int APS5_VABI _ZN9Inspector21InjectedScriptManager18injectedScriptHostEv(); +int APS5_VABI _ZN9Inspector21InjectedScriptManager18releaseObjectGroupERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector21InjectedScriptManager19clearExceptionValueEv(); +int APS5_VABI _ZN9Inspector21InjectedScriptManager19injectedScriptForIdEi(); +int APS5_VABI _ZN9Inspector21InjectedScriptManager19injectedScriptIdForEPN3JSC14JSGlobalObjectE(); +int APS5_VABI _ZN9Inspector21InjectedScriptManager22discardInjectedScriptsEv(); +int APS5_VABI _ZN9Inspector21InjectedScriptManager23didCreateInjectedScriptERKNS_14InjectedScriptE(); +int APS5_VABI _ZN9Inspector21InjectedScriptManager25injectedScriptForObjectIdERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector21InjectedScriptManager7connectEv(); +int APS5_VABI _ZN9Inspector21InjectedScriptManagerD0Ev(); +int APS5_VABI _ZN9Inspector21InjectedScriptManagerD1Ev(); +int APS5_VABI _ZN9Inspector21InjectedScriptManagerD2Ev(); +int APS5_VABI _ZN9Inspector21InjectedScriptManagerdlEPv(); +int APS5_VABI _ZN9Inspector21InjectedScriptManagernaEm(); +int APS5_VABI _ZN9Inspector21InjectedScriptManagernaEmPv(); +int APS5_VABI _ZN9Inspector21InjectedScriptManagernwEm10NotNullTagPv(); +int APS5_VABI _ZN9Inspector21InjectedScriptManagernwEmPv(); +int APS5_VABI _ZN9Inspector21InjectedScriptManagernwEm(); +int APS5_VABI _ZN9Inspector21InspectorConsoleAgent10countResetEPN3JSC14JSGlobalObjectERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector21InspectorConsoleAgent10stopTimingEPN3JSC14JSGlobalObjectERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector21InspectorConsoleAgent12setHeapAgentEPNS_18InspectorHeapAgentE(); +int APS5_VABI _ZN9Inspector21InspectorConsoleAgent13discardValuesEv(); +int APS5_VABI _ZN9Inspector21InspectorConsoleAgent16takeHeapSnapshotERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector21InspectorConsoleAgent27didCreateFrontendAndBackendEPNS_14FrontendRouterEPNS_17BackendDispatcherE(); +int APS5_VABI _ZN9Inspector21InspectorConsoleAgent29willDestroyFrontendAndBackendENS_16DisconnectReasonE(); +int APS5_VABI _ZN9Inspector21InspectorConsoleAgent5countEPN3JSC14JSGlobalObjectERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector21InspectorConsoleAgentC1ERNS_12AgentContextE(); +int APS5_VABI _ZN9Inspector21InspectorConsoleAgentC2ERNS_12AgentContextE(); +int APS5_VABI _ZN9Inspector21InspectorConsoleAgentD0Ev(); +int APS5_VABI _ZN9Inspector21InspectorConsoleAgentD1Ev(); +int APS5_VABI _ZN9Inspector21InspectorConsoleAgentD2Ev(); +int APS5_VABI _ZN9Inspector21InspectorConsoleAgentdaEPv(); +int APS5_VABI _ZN9Inspector21InspectorConsoleAgentdlEPv(); +int APS5_VABI _ZN9Inspector21InspectorConsoleAgentnaEm(); +int APS5_VABI _ZN9Inspector21InspectorConsoleAgentnaEmPv(); +int APS5_VABI _ZN9Inspector21InspectorConsoleAgentnwEm10NotNullTagPv(); +int APS5_VABI _ZN9Inspector21InspectorConsoleAgentnwEmPv(); +int APS5_VABI _ZN9Inspector21InspectorConsoleAgentnwEm(); +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgent21injectedScriptManagerEv(); +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgent27didCreateFrontendAndBackendEPNS_14FrontendRouterEPNS_17BackendDispatcherE(); +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgent27setTypeProfilerEnabledStateEb(); +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgent29willDestroyFrontendAndBackendENS_16DisconnectReasonE(); +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgent34setControlFlowProfilerEnabledStateEb(); +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgentC2ERNS_12AgentContextE(); +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgentD0Ev(); +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgentD1Ev(); +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgentD2Ev(); +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgentdaEPv(); +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgentdlEPv(); +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgentnaEmPv(); +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgentnaEm(); +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgentnwEm10NotNullTagPv(); +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgentnwEm(); +int APS5_VABI _ZN9Inspector21InspectorRuntimeAgentnwEmPv(); +int APS5_VABI _ZN9Inspector21PageBackendDispatcher6createERNS_17BackendDispatcherEPNS_28PageBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector21PageBackendDispatcherC1ERNS_17BackendDispatcherEPNS_28PageBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector21PageBackendDispatcherC2ERNS_17BackendDispatcherEPNS_28PageBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector21PageBackendDispatcherD1Ev(); +int APS5_VABI _ZN9Inspector21PageBackendDispatcherD2Ev(); +int APS5_VABI _ZN9Inspector21RemoteInspectorServer5startEPKct(); +int APS5_VABI _ZN9Inspector21RemoteInspectorServer9singletonEv(); +int APS5_VABI _ZN9Inspector21createScriptArgumentsEPN3JSC14JSGlobalObjectEPNS0_9CallFrameEj(); +int APS5_VABI _ZN9Inspector21createScriptCallStackEPN3JSC14JSGlobalObjectEm(); +int APS5_VABI _ZN9Inspector22AuditBackendDispatcher6createERNS_17BackendDispatcherEPNS_29AuditBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector22AuditBackendDispatcherC1ERNS_17BackendDispatcherEPNS_29AuditBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector22AuditBackendDispatcherC2ERNS_17BackendDispatcherEPNS_29AuditBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector22AuditBackendDispatcherD0Ev(); +int APS5_VABI _ZN9Inspector22AuditBackendDispatcherD1Ev(); +int APS5_VABI _ZN9Inspector22AuditBackendDispatcherD2Ev(); +int APS5_VABI _ZN9Inspector22ContentSearchUtilities19searchInTextByLinesERKN3WTF6StringES4_bb(); +int APS5_VABI _ZN9Inspector22ContentSearchUtilities22textPositionFromOffsetEmRKN3WTF6VectorImLm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE(); +int APS5_VABI _ZN9Inspector22ContentSearchUtilities26findStylesheetSourceMapURLERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector22ContentSearchUtilities29countRegularExpressionMatchesERKN3JSC4Yarr17RegularExpressionERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector22ContentSearchUtilities38createRegularExpressionForSearchStringERKN3WTF6StringEbNS0_16SearchStringTypeE(); +int APS5_VABI _ZN9Inspector22HeapFrontendDispatcher16trackingCompleteEdRKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector22HeapFrontendDispatcherC1ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector22HeapFrontendDispatcherC2ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector22HeapFrontendDispatcherdaEPv(); +int APS5_VABI _ZN9Inspector22HeapFrontendDispatcherdlEPv(); +int APS5_VABI _ZN9Inspector22HeapFrontendDispatchernaEmPv(); +int APS5_VABI _ZN9Inspector22HeapFrontendDispatchernaEm(); +int APS5_VABI _ZN9Inspector22HeapFrontendDispatchernwEm(); +int APS5_VABI _ZN9Inspector22HeapFrontendDispatchernwEmPv(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent11addListenerERNS0_8ListenerE(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent11didContinueEv(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent12assertPausedERN3WTF6StringE(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent13didBecomeIdleEv(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent14removeListenerERNS0_8ListenerE(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent17clearPauseDetailsEv(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent17currentCallFramesERKNS_14InjectedScriptE(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent19clearExceptionValueEv(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent19failedToParseSourceERKN3WTF6StringES4_iiS4_(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent19handleConsoleAssertERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent19registerIdleHandlerEv(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent20didClearGlobalObjectEv(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent20setSuppressAllPausesEb(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent21breakpointActionSoundEi(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent24clearAsyncStackTraceDataEv(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent24willStepAndMayBecomeIdleEv(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent25buildExceptionPauseReasonEN3JSC7JSValueERKNS_14InjectedScriptE(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent26buildBreakpointPauseReasonEm(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent27didClearAsyncStackTraceDataEv(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent27scriptExecutionBlockedByCSPERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent28clearDebuggerBreakpointStateEv(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent29clearInspectorBreakpointStateEv(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent29willDestroyFrontendAndBackendENS_16DisconnectReasonE(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgent6enableEv(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgentC2ERNS_12AgentContextE(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgentD0Ev(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgentD1Ev(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgentD2Ev(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgentdaEPv(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgentdlEPv(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgentnaEmPv(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgentnwEm10NotNullTagPv(); +int APS5_VABI _ZN9Inspector22InspectorDebuggerAgentnwEm(); +int APS5_VABI _ZN9Inspector22PageFrontendDispatcher13frameDetachedERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector22PageFrontendDispatcher14loadEventFiredEd(); +int APS5_VABI _ZN9Inspector22PageFrontendDispatcher19frameStartedLoadingERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector22PageFrontendDispatcher19frameStoppedLoadingERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector22PageFrontendDispatcher20domContentEventFiredEd(); +int APS5_VABI _ZN9Inspector22PageFrontendDispatcher24frameScheduledNavigationERKN3WTF6StringEd(); +int APS5_VABI _ZN9Inspector22PageFrontendDispatcherC1ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector22PageFrontendDispatcherC2ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector22PageFrontendDispatcherdaEPv(); +int APS5_VABI _ZN9Inspector22PageFrontendDispatcherdlEPv(); +int APS5_VABI _ZN9Inspector22PageFrontendDispatchernaEmPv(); +int APS5_VABI _ZN9Inspector22PageFrontendDispatchernaEm(); +int APS5_VABI _ZN9Inspector22PageFrontendDispatchernwEm(); +int APS5_VABI _ZN9Inspector22PageFrontendDispatchernwEmPv(); +int APS5_VABI _ZN9Inspector22RemoteAutomationTarget11setIsPairedEb(); +int APS5_VABI _ZN9Inspector22RemoteAutomationTargetC2Ev(); +int APS5_VABI _ZN9Inspector22RemoteAutomationTargetD0Ev(); +int APS5_VABI _ZN9Inspector22RemoteAutomationTargetD1Ev(); +int APS5_VABI _ZN9Inspector22RemoteAutomationTargetD2Ev(); +int APS5_VABI _ZN9Inspector22RemoteInspectionTarget13setIndicatingEb(); +int APS5_VABI _ZN9Inspector22RemoteInspectionTarget30unpauseForInitializedInspectorEv(); +int APS5_VABI _ZN9Inspector22RemoteInspectionTargetC2ERKS0_(); +int APS5_VABI _ZN9Inspector22RemoteInspectionTargetC2Ev(); +int APS5_VABI _ZN9Inspector22RemoteInspectionTargetD1Ev(); +int APS5_VABI _ZN9Inspector22RemoteInspectionTargetaSERKS0_(); +int APS5_VABI _ZN9Inspector23CanvasBackendDispatcherC1ERNS_17BackendDispatcherEPNS_30CanvasBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector23CanvasBackendDispatcherD0Ev(); +int APS5_VABI _ZN9Inspector23CanvasBackendDispatcherD1Ev(); +int APS5_VABI _ZN9Inspector23CanvasBackendDispatcherD2Ev(); +int APS5_VABI _ZN9Inspector23TargetBackendDispatcher6createERNS_17BackendDispatcherEPNS_30TargetBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector23TargetBackendDispatcherC1ERNS_17BackendDispatcherEPNS_30TargetBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector23TargetBackendDispatcherC2ERNS_17BackendDispatcherEPNS_30TargetBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector23TargetBackendDispatcherD0Ev(); +int APS5_VABI _ZN9Inspector23TargetBackendDispatcherD1Ev(); +int APS5_VABI _ZN9Inspector23TargetBackendDispatcherD2Ev(); +int APS5_VABI _ZN9Inspector23WorkerBackendDispatcher6createERNS_17BackendDispatcherEPNS_30WorkerBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector23WorkerBackendDispatcherC1ERNS_17BackendDispatcherEPNS_30WorkerBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector23WorkerBackendDispatcherC2ERNS_17BackendDispatcherEPNS_30WorkerBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector23WorkerBackendDispatcherD0Ev(); +int APS5_VABI _ZN9Inspector23WorkerBackendDispatcherD1Ev(); +int APS5_VABI _ZN9Inspector23WorkerBackendDispatcherD2Ev(); +int APS5_VABI _ZN9Inspector24BrowserBackendDispatcher6createERNS_17BackendDispatcherEPNS_31BrowserBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector24BrowserBackendDispatcherC1ERNS_17BackendDispatcherEPNS_31BrowserBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector24BrowserBackendDispatcherC2ERNS_17BackendDispatcherEPNS_31BrowserBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector24BrowserBackendDispatcherD0Ev(); +int APS5_VABI _ZN9Inspector24BrowserBackendDispatcherD1Ev(); +int APS5_VABI _ZN9Inspector24BrowserBackendDispatcherD2Ev(); +int APS5_VABI _ZN9Inspector24CanvasFrontendDispatcher13canvasRemovedERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector24CanvasFrontendDispatcher16extensionEnabledERKN3WTF6StringES4_(); +int APS5_VABI _ZN9Inspector24CanvasFrontendDispatcher16recordingStartedERKN3WTF6StringENS_8Protocol9Recording9InitiatorE(); +int APS5_VABI _ZN9Inspector24CanvasFrontendDispatcher18clientNodesChangedERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector24CanvasFrontendDispatcher19canvasMemoryChangedERKN3WTF6StringEd(); +int APS5_VABI _ZN9Inspector24CanvasFrontendDispatcherC1ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector24CanvasFrontendDispatcherC2ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector24CanvasFrontendDispatcherdaEPv(); +int APS5_VABI _ZN9Inspector24CanvasFrontendDispatcherdlEPv(); +int APS5_VABI _ZN9Inspector24CanvasFrontendDispatchernaEmPv(); +int APS5_VABI _ZN9Inspector24CanvasFrontendDispatchernaEm(); +int APS5_VABI _ZN9Inspector24CanvasFrontendDispatchernwEm(); +int APS5_VABI _ZN9Inspector24CanvasFrontendDispatchernwEmPv(); +int APS5_VABI _ZN9Inspector24ConsoleBackendDispatcher6createERNS_17BackendDispatcherEPNS_31ConsoleBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector24ConsoleBackendDispatcherC1ERNS_17BackendDispatcherEPNS_31ConsoleBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector24ConsoleBackendDispatcherC2ERNS_17BackendDispatcherEPNS_31ConsoleBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector24ConsoleBackendDispatcherD1Ev(); +int APS5_VABI _ZN9Inspector24ConsoleBackendDispatcherD2Ev(); +int APS5_VABI _ZN9Inspector24NetworkBackendDispatcher6createERNS_17BackendDispatcherEPNS_31NetworkBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector24NetworkBackendDispatcherC1ERNS_17BackendDispatcherEPNS_31NetworkBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector24NetworkBackendDispatcherC2ERNS_17BackendDispatcherEPNS_31NetworkBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector24NetworkBackendDispatcherD0Ev(); +int APS5_VABI _ZN9Inspector24NetworkBackendDispatcherD1Ev(); +int APS5_VABI _ZN9Inspector24NetworkBackendDispatcherD2Ev(); +int APS5_VABI _ZN9Inspector24RemoteControllableTarget19setTargetIdentifierEj(); +int APS5_VABI _ZN9Inspector24RemoteControllableTarget4initEv(); +int APS5_VABI _ZN9Inspector24RemoteControllableTarget6updateEv(); +int APS5_VABI _ZN9Inspector24RemoteControllableTargetC2ERKS0_(); +int APS5_VABI _ZN9Inspector24RemoteControllableTargetC2Ev(); +int APS5_VABI _ZN9Inspector24RemoteControllableTargetD0Ev(); +int APS5_VABI _ZN9Inspector24RemoteControllableTargetD1Ev(); +int APS5_VABI _ZN9Inspector24RemoteControllableTargetD2Ev(); +int APS5_VABI _ZN9Inspector24RemoteControllableTargetaSERKS0_(); +int APS5_VABI _ZN9Inspector24RuntimeBackendDispatcher6createERNS_17BackendDispatcherEPNS_31RuntimeBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector24RuntimeBackendDispatcherC1ERNS_17BackendDispatcherEPNS_31RuntimeBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector24RuntimeBackendDispatcherC2ERNS_17BackendDispatcherEPNS_31RuntimeBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector24RuntimeBackendDispatcherD0Ev(); +int APS5_VABI _ZN9Inspector24RuntimeBackendDispatcherD1Ev(); +int APS5_VABI _ZN9Inspector24RuntimeBackendDispatcherD2Ev(); +int APS5_VABI _ZN9Inspector24TargetFrontendDispatcher15targetDestroyedERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector24TargetFrontendDispatcher25dispatchMessageFromTargetERKN3WTF6StringES4_(); +int APS5_VABI _ZN9Inspector24TargetFrontendDispatcher26didCommitProvisionalTargetERKN3WTF6StringES4_(); +int APS5_VABI _ZN9Inspector24TargetFrontendDispatcherC1ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector24TargetFrontendDispatcherC2ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector24TargetFrontendDispatcherdaEPv(); +int APS5_VABI _ZN9Inspector24TargetFrontendDispatcherdlEPv(); +int APS5_VABI _ZN9Inspector24TargetFrontendDispatchernaEmPv(); +int APS5_VABI _ZN9Inspector24TargetFrontendDispatchernaEm(); +int APS5_VABI _ZN9Inspector24TargetFrontendDispatchernwEmPv(); +int APS5_VABI _ZN9Inspector24WorkerFrontendDispatcher13workerCreatedERKN3WTF6StringES4_S4_(); +int APS5_VABI _ZN9Inspector24WorkerFrontendDispatcher16workerTerminatedERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector24WorkerFrontendDispatcher25dispatchMessageFromWorkerERKN3WTF6StringES4_(); +int APS5_VABI _ZN9Inspector24WorkerFrontendDispatcherC1ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector24WorkerFrontendDispatcherC2ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector24WorkerFrontendDispatcherdaEPv(); +int APS5_VABI _ZN9Inspector24WorkerFrontendDispatcherdlEPv(); +int APS5_VABI _ZN9Inspector24WorkerFrontendDispatchernaEmPv(); +int APS5_VABI _ZN9Inspector24WorkerFrontendDispatchernaEm(); +int APS5_VABI _ZN9Inspector24WorkerFrontendDispatchernwEmPv(); +int APS5_VABI _ZN9Inspector24WorkerFrontendDispatchernwEm(); +int APS5_VABI _ZN9Inspector25BrowserFrontendDispatcherC1ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector25BrowserFrontendDispatcherC2ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector25BrowserFrontendDispatcherdaEPv(); +int APS5_VABI _ZN9Inspector25BrowserFrontendDispatcherdlEPv(); +int APS5_VABI _ZN9Inspector25BrowserFrontendDispatchernaEmPv(); +int APS5_VABI _ZN9Inspector25BrowserFrontendDispatchernaEm(); +int APS5_VABI _ZN9Inspector25BrowserFrontendDispatchernwEm(); +int APS5_VABI _ZN9Inspector25BrowserFrontendDispatchernwEmPv(); +int APS5_VABI _ZN9Inspector25ConsoleFrontendDispatcherC1ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector25ConsoleFrontendDispatcherC2ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector25ConsoleFrontendDispatcherdaEPv(); +int APS5_VABI _ZN9Inspector25ConsoleFrontendDispatcherdlEPv(); +int APS5_VABI _ZN9Inspector25ConsoleFrontendDispatchernaEmPv(); +int APS5_VABI _ZN9Inspector25ConsoleFrontendDispatchernaEm(); +int APS5_VABI _ZN9Inspector25ConsoleFrontendDispatchernwEmPv(); +int APS5_VABI _ZN9Inspector25ConsoleFrontendDispatchernwEm(); +int APS5_VABI _ZN9Inspector25DatabaseBackendDispatcher6createERNS_17BackendDispatcherEPNS_32DatabaseBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector25DatabaseBackendDispatcherC1ERNS_17BackendDispatcherEPNS_32DatabaseBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector25DatabaseBackendDispatcherC2ERNS_17BackendDispatcherEPNS_32DatabaseBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector25DatabaseBackendDispatcherD0Ev(); +int APS5_VABI _ZN9Inspector25DatabaseBackendDispatcherD1Ev(); +int APS5_VABI _ZN9Inspector25DatabaseBackendDispatcherD2Ev(); +int APS5_VABI _ZN9Inspector25DebuggerBackendDispatcher6createERNS_17BackendDispatcherEPNS_32DebuggerBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector25DebuggerBackendDispatcherC1ERNS_17BackendDispatcherEPNS_32DebuggerBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector25DebuggerBackendDispatcherC2ERNS_17BackendDispatcherEPNS_32DebuggerBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector25DebuggerBackendDispatcherD0Ev(); +int APS5_VABI _ZN9Inspector25DebuggerBackendDispatcherD1Ev(); +int APS5_VABI _ZN9Inspector25DebuggerBackendDispatcherD2Ev(); +int APS5_VABI _ZN9Inspector25NetworkFrontendDispatcher12dataReceivedERKN3WTF6StringEdii(); +int APS5_VABI _ZN9Inspector25NetworkFrontendDispatcher15webSocketClosedERKN3WTF6StringEd(); +int APS5_VABI _ZN9Inspector25NetworkFrontendDispatcher16webSocketCreatedERKN3WTF6StringES4_(); +int APS5_VABI _ZN9Inspector25NetworkFrontendDispatcher19webSocketFrameErrorERKN3WTF6StringEdS4_(); +int APS5_VABI _ZN9Inspector25NetworkFrontendDispatcherC1ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector25NetworkFrontendDispatcherC2ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector25NetworkFrontendDispatcherdaEPv(); +int APS5_VABI _ZN9Inspector25NetworkFrontendDispatcherdlEPv(); +int APS5_VABI _ZN9Inspector25NetworkFrontendDispatchernaEm(); +int APS5_VABI _ZN9Inspector25NetworkFrontendDispatchernaEmPv(); +int APS5_VABI _ZN9Inspector25NetworkFrontendDispatchernwEm(); +int APS5_VABI _ZN9Inspector25NetworkFrontendDispatchernwEmPv(); +int APS5_VABI _ZN9Inspector25RuntimeFrontendDispatcherC1ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector25RuntimeFrontendDispatcherC2ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector25RuntimeFrontendDispatcherdaEPv(); +int APS5_VABI _ZN9Inspector25RuntimeFrontendDispatcherdlEPv(); +int APS5_VABI _ZN9Inspector25RuntimeFrontendDispatchernaEmPv(); +int APS5_VABI _ZN9Inspector25RuntimeFrontendDispatchernaEm(); +int APS5_VABI _ZN9Inspector25RuntimeFrontendDispatchernwEm(); +int APS5_VABI _ZN9Inspector25RuntimeFrontendDispatchernwEmPv(); +int APS5_VABI _ZN9Inspector25TimelineBackendDispatcher6createERNS_17BackendDispatcherEPNS_32TimelineBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector25TimelineBackendDispatcherC1ERNS_17BackendDispatcherEPNS_32TimelineBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector25TimelineBackendDispatcherC2ERNS_17BackendDispatcherEPNS_32TimelineBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector25TimelineBackendDispatcherD0Ev(); +int APS5_VABI _ZN9Inspector25TimelineBackendDispatcherD1Ev(); +int APS5_VABI _ZN9Inspector25TimelineBackendDispatcherD2Ev(); +int APS5_VABI _ZN9Inspector26AnimationBackendDispatcher6createERNS_17BackendDispatcherEPNS_33AnimationBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector26AnimationBackendDispatcherC1ERNS_17BackendDispatcherEPNS_33AnimationBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector26AnimationBackendDispatcherC2ERNS_17BackendDispatcherEPNS_33AnimationBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector26AnimationBackendDispatcherD0Ev(); +int APS5_VABI _ZN9Inspector26AnimationBackendDispatcherD1Ev(); +int APS5_VABI _ZN9Inspector26AnimationBackendDispatcherD2Ev(); +int APS5_VABI _ZN9Inspector26DatabaseFrontendDispatcherC1ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector26DatabaseFrontendDispatcherC2ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector26DatabaseFrontendDispatcherdaEPv(); +int APS5_VABI _ZN9Inspector26DatabaseFrontendDispatcherdlEPv(); +int APS5_VABI _ZN9Inspector26DatabaseFrontendDispatchernaEmPv(); +int APS5_VABI _ZN9Inspector26DatabaseFrontendDispatchernaEm(); +int APS5_VABI _ZN9Inspector26DatabaseFrontendDispatchernwEm(); +int APS5_VABI _ZN9Inspector26DatabaseFrontendDispatchernwEmPv(); +int APS5_VABI _ZN9Inspector26DebuggerFrontendDispatcher19globalObjectClearedEv(); +int APS5_VABI _ZN9Inspector26DebuggerFrontendDispatcher19scriptFailedToParseERKN3WTF6StringES4_iiS4_(); +int APS5_VABI _ZN9Inspector26DebuggerFrontendDispatcher25playBreakpointActionSoundEi(); +int APS5_VABI _ZN9Inspector26DebuggerFrontendDispatcher7resumedEv(); +int APS5_VABI _ZN9Inspector26DebuggerFrontendDispatcherC1ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector26DebuggerFrontendDispatcherC2ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector26DebuggerFrontendDispatcherdaEPv(); +int APS5_VABI _ZN9Inspector26DebuggerFrontendDispatcherdlEPv(); +int APS5_VABI _ZN9Inspector26DebuggerFrontendDispatchernaEm(); +int APS5_VABI _ZN9Inspector26DebuggerFrontendDispatchernaEmPv(); +int APS5_VABI _ZN9Inspector26DebuggerFrontendDispatchernwEmPv(); +int APS5_VABI _ZN9Inspector26DebuggerFrontendDispatchernwEm(); +int APS5_VABI _ZN9Inspector26InspectorBackendDispatcher6createERNS_17BackendDispatcherEPNS_33InspectorBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector26InspectorBackendDispatcherC1ERNS_17BackendDispatcherEPNS_33InspectorBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector26InspectorBackendDispatcherC2ERNS_17BackendDispatcherEPNS_33InspectorBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector26InspectorBackendDispatcherD0Ev(); +int APS5_VABI _ZN9Inspector26InspectorBackendDispatcherD1Ev(); +int APS5_VABI _ZN9Inspector26InspectorBackendDispatcherD2Ev(); +int APS5_VABI _ZN9Inspector26LayerTreeBackendDispatcher6createERNS_17BackendDispatcherEPNS_33LayerTreeBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector26LayerTreeBackendDispatcherC1ERNS_17BackendDispatcherEPNS_33LayerTreeBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector26LayerTreeBackendDispatcherC2ERNS_17BackendDispatcherEPNS_33LayerTreeBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector26LayerTreeBackendDispatcherD1Ev(); +int APS5_VABI _ZN9Inspector26LayerTreeBackendDispatcherD2Ev(); +int APS5_VABI _ZN9Inspector26TimelineFrontendDispatcher16recordingStartedEd(); +int APS5_VABI _ZN9Inspector26TimelineFrontendDispatcher16recordingStoppedEd(); +int APS5_VABI _ZN9Inspector26TimelineFrontendDispatcher18autoCaptureStartedEv(); +int APS5_VABI _ZN9Inspector26TimelineFrontendDispatcherC1ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector26TimelineFrontendDispatcherC2ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector26TimelineFrontendDispatcherdaEPv(); +int APS5_VABI _ZN9Inspector26TimelineFrontendDispatcherdlEPv(); +int APS5_VABI _ZN9Inspector26TimelineFrontendDispatchernaEm(); +int APS5_VABI _ZN9Inspector26TimelineFrontendDispatchernaEmPv(); +int APS5_VABI _ZN9Inspector26TimelineFrontendDispatchernwEmPv(); +int APS5_VABI _ZN9Inspector26TimelineFrontendDispatchernwEm(); +int APS5_VABI _ZN9Inspector27AnimationFrontendDispatcher13targetChangedERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector27AnimationFrontendDispatcher13trackingStartEd(); +int APS5_VABI _ZN9Inspector27AnimationFrontendDispatcher16trackingCompleteEd(); +int APS5_VABI _ZN9Inspector27AnimationFrontendDispatcher18animationDestroyedERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector27AnimationFrontendDispatcherC1ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector27AnimationFrontendDispatcherC2ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector27AnimationFrontendDispatcherdaEPv(); +int APS5_VABI _ZN9Inspector27AnimationFrontendDispatcherdlEPv(); +int APS5_VABI _ZN9Inspector27AnimationFrontendDispatchernaEm(); +int APS5_VABI _ZN9Inspector27AnimationFrontendDispatchernaEmPv(); +int APS5_VABI _ZN9Inspector27AnimationFrontendDispatchernwEmPv(); +int APS5_VABI _ZN9Inspector27AnimationFrontendDispatchernwEm(); +int APS5_VABI _ZN9Inspector27CSSBackendDispatcherHandlerC2ERKS0_(); +int APS5_VABI _ZN9Inspector27CSSBackendDispatcherHandlerC2Ev(); +int APS5_VABI _ZN9Inspector27CSSBackendDispatcherHandlerD0Ev(); +int APS5_VABI _ZN9Inspector27CSSBackendDispatcherHandlerD1Ev(); +int APS5_VABI _ZN9Inspector27CSSBackendDispatcherHandlerD2Ev(); +int APS5_VABI _ZN9Inspector27DOMBackendDispatcherHandlerC2ERKS0_(); +int APS5_VABI _ZN9Inspector27DOMBackendDispatcherHandlerC2Ev(); +int APS5_VABI _ZN9Inspector27DOMBackendDispatcherHandlerD0Ev(); +int APS5_VABI _ZN9Inspector27DOMBackendDispatcherHandlerD1Ev(); +int APS5_VABI _ZN9Inspector27DOMBackendDispatcherHandlerD2Ev(); +int APS5_VABI _ZN9Inspector27DOMStorageBackendDispatcher6createERNS_17BackendDispatcherEPNS_34DOMStorageBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector27DOMStorageBackendDispatcherC1ERNS_17BackendDispatcherEPNS_34DOMStorageBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector27DOMStorageBackendDispatcherC2ERNS_17BackendDispatcherEPNS_34DOMStorageBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector27DOMStorageBackendDispatcherD0Ev(); +int APS5_VABI _ZN9Inspector27DOMStorageBackendDispatcherD1Ev(); +int APS5_VABI _ZN9Inspector27DOMStorageBackendDispatcherD2Ev(); +int APS5_VABI _ZN9Inspector27InspectorFrontendDispatcher25evaluateForTestInFrontendERKN3WTF6StringE(); +int APS5_VABI _ZN9Inspector27InspectorFrontendDispatcherC1ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector27InspectorFrontendDispatcherC2ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector27InspectorFrontendDispatcherdaEPv(); +int APS5_VABI _ZN9Inspector27InspectorFrontendDispatcherdlEPv(); +int APS5_VABI _ZN9Inspector27InspectorFrontendDispatchernaEmPv(); +int APS5_VABI _ZN9Inspector27InspectorFrontendDispatchernaEm(); +int APS5_VABI _ZN9Inspector27InspectorFrontendDispatchernwEm(); +int APS5_VABI _ZN9Inspector27InspectorFrontendDispatchernwEmPv(); +int APS5_VABI _ZN9Inspector27LayerTreeFrontendDispatcher18layerTreeDidChangeEv(); +int APS5_VABI _ZN9Inspector27LayerTreeFrontendDispatcherC1ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector27LayerTreeFrontendDispatcherC2ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector27LayerTreeFrontendDispatcherdaEPv(); +int APS5_VABI _ZN9Inspector27LayerTreeFrontendDispatcherdlEPv(); +int APS5_VABI _ZN9Inspector27LayerTreeFrontendDispatchernaEm(); +int APS5_VABI _ZN9Inspector27LayerTreeFrontendDispatchernaEmPv(); +int APS5_VABI _ZN9Inspector27LayerTreeFrontendDispatchernwEm(); +int APS5_VABI _ZN9Inspector27LayerTreeFrontendDispatchernwEmPv(); +int APS5_VABI _ZN9Inspector27PerGlobalObjectWrapperWorld10addWrapperEPN3JSC14JSGlobalObjectEPNS1_8JSObjectE(); +int APS5_VABI _ZN9Inspector27PerGlobalObjectWrapperWorld10getWrapperEPN3JSC14JSGlobalObjectE(); +int APS5_VABI _ZN9Inspector27PerGlobalObjectWrapperWorld16clearAllWrappersEv(); +int APS5_VABI _ZN9Inspector27PerGlobalObjectWrapperWorldC1ERKS0_(); +int APS5_VABI _ZN9Inspector27PerGlobalObjectWrapperWorldC1Ev(); +int APS5_VABI _ZN9Inspector27PerGlobalObjectWrapperWorldC2ERKS0_(); +int APS5_VABI _ZN9Inspector27PerGlobalObjectWrapperWorldC2Ev(); +int APS5_VABI _ZN9Inspector27PerGlobalObjectWrapperWorldD1Ev(); +int APS5_VABI _ZN9Inspector27PerGlobalObjectWrapperWorldD2Ev(); +int APS5_VABI _ZN9Inspector27PerGlobalObjectWrapperWorldaSERKS0_(); +int APS5_VABI _ZN9Inspector28DOMDebuggerBackendDispatcher6createERNS_17BackendDispatcherEPNS_35DOMDebuggerBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector28DOMDebuggerBackendDispatcherC1ERNS_17BackendDispatcherEPNS_35DOMDebuggerBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector28DOMDebuggerBackendDispatcherC2ERNS_17BackendDispatcherEPNS_35DOMDebuggerBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector28DOMDebuggerBackendDispatcherD1Ev(); +int APS5_VABI _ZN9Inspector28DOMDebuggerBackendDispatcherD2Ev(); +int APS5_VABI _ZN9Inspector28DOMStorageFrontendDispatcherC1ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector28DOMStorageFrontendDispatcherC2ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector28DOMStorageFrontendDispatcherdaEPv(); +int APS5_VABI _ZN9Inspector28DOMStorageFrontendDispatcherdlEPv(); +int APS5_VABI _ZN9Inspector28DOMStorageFrontendDispatchernaEm(); +int APS5_VABI _ZN9Inspector28DOMStorageFrontendDispatchernaEmPv(); +int APS5_VABI _ZN9Inspector28DOMStorageFrontendDispatchernwEm(); +int APS5_VABI _ZN9Inspector28DOMStorageFrontendDispatchernwEmPv(); +int APS5_VABI _ZN9Inspector28HeapBackendDispatcherHandlerC2ERKS0_(); +int APS5_VABI _ZN9Inspector28HeapBackendDispatcherHandlerC2Ev(); +int APS5_VABI _ZN9Inspector28HeapBackendDispatcherHandlerD0Ev(); +int APS5_VABI _ZN9Inspector28HeapBackendDispatcherHandlerD1Ev(); +int APS5_VABI _ZN9Inspector28HeapBackendDispatcherHandlerD2Ev(); +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgent16trackingCompleteEv(); +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgent17didEvaluateScriptEN3WTF7SecondsEN3JSC15ProfilingReasonE(); +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgent18willEvaluateScriptEv(); +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgent27didCreateFrontendAndBackendEPNS_14FrontendRouterEPNS_17BackendDispatcherE(); +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgent29stopSamplingWhenDisconnectingEv(); +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgent29willDestroyFrontendAndBackendENS_16DisconnectReasonE(); +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgent8addEventEN3WTF7SecondsES2_N3JSC15ProfilingReasonE(); +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgentC1ERNS_12AgentContextE(); +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgentC2ERNS_12AgentContextE(); +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgentD0Ev(); +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgentD1Ev(); +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgentdaEPv(); +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgentdlEPv(); +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgentnaEmPv(); +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgentnaEm(); +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgentnwEm10NotNullTagPv(); +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgentnwEmPv(); +int APS5_VABI _ZN9Inspector28InspectorScriptProfilerAgentnwEm(); +int APS5_VABI _ZN9Inspector28PageBackendDispatcherHandlerC2ERKS0_(); +int APS5_VABI _ZN9Inspector28PageBackendDispatcherHandlerC2Ev(); +int APS5_VABI _ZN9Inspector28PageBackendDispatcherHandlerD0Ev(); +int APS5_VABI _ZN9Inspector28PageBackendDispatcherHandlerD1Ev(); +int APS5_VABI _ZN9Inspector28PageBackendDispatcherHandlerD2Ev(); +int APS5_VABI _ZN9Inspector29AuditBackendDispatcherHandlerC2ERKS0_(); +int APS5_VABI _ZN9Inspector29AuditBackendDispatcherHandlerC2Ev(); +int APS5_VABI _ZN9Inspector29AuditBackendDispatcherHandlerD0Ev(); +int APS5_VABI _ZN9Inspector29AuditBackendDispatcherHandlerD1Ev(); +int APS5_VABI _ZN9Inspector29AuditBackendDispatcherHandlerD2Ev(); +int APS5_VABI _ZN9Inspector29SupplementalBackendDispatcherC2ERNS_17BackendDispatcherE(); +int APS5_VABI _ZN9Inspector29SupplementalBackendDispatcherD0Ev(); +int APS5_VABI _ZN9Inspector29SupplementalBackendDispatcherD1Ev(); +int APS5_VABI _ZN9Inspector29SupplementalBackendDispatcherD2Ev(); +int APS5_VABI _ZN9Inspector30CanvasBackendDispatcherHandlerC2ERKS0_(); +int APS5_VABI _ZN9Inspector30CanvasBackendDispatcherHandlerC2Ev(); +int APS5_VABI _ZN9Inspector30CanvasBackendDispatcherHandlerD0Ev(); +int APS5_VABI _ZN9Inspector30CanvasBackendDispatcherHandlerD1Ev(); +int APS5_VABI _ZN9Inspector30CanvasBackendDispatcherHandlerD2Ev(); +int APS5_VABI _ZN9Inspector30TargetBackendDispatcherHandlerC2ERKS0_(); +int APS5_VABI _ZN9Inspector30TargetBackendDispatcherHandlerC2Ev(); +int APS5_VABI _ZN9Inspector30TargetBackendDispatcherHandlerD0Ev(); +int APS5_VABI _ZN9Inspector30TargetBackendDispatcherHandlerD1Ev(); +int APS5_VABI _ZN9Inspector30TargetBackendDispatcherHandlerD2Ev(); +int APS5_VABI _ZN9Inspector30WorkerBackendDispatcherHandlerC2ERKS0_(); +int APS5_VABI _ZN9Inspector30WorkerBackendDispatcherHandlerC2Ev(); +int APS5_VABI _ZN9Inspector30WorkerBackendDispatcherHandlerD0Ev(); +int APS5_VABI _ZN9Inspector30WorkerBackendDispatcherHandlerD1Ev(); +int APS5_VABI _ZN9Inspector30WorkerBackendDispatcherHandlerD2Ev(); +int APS5_VABI _ZN9Inspector31BrowserBackendDispatcherHandlerC2ERKS0_(); +int APS5_VABI _ZN9Inspector31BrowserBackendDispatcherHandlerC2Ev(); +int APS5_VABI _ZN9Inspector31BrowserBackendDispatcherHandlerD0Ev(); +int APS5_VABI _ZN9Inspector31BrowserBackendDispatcherHandlerD1Ev(); +int APS5_VABI _ZN9Inspector31BrowserBackendDispatcherHandlerD2Ev(); +int APS5_VABI _ZN9Inspector31ConsoleBackendDispatcherHandlerC2ERKS0_(); +int APS5_VABI _ZN9Inspector31ConsoleBackendDispatcherHandlerC2Ev(); +int APS5_VABI _ZN9Inspector31ConsoleBackendDispatcherHandlerD0Ev(); +int APS5_VABI _ZN9Inspector31ConsoleBackendDispatcherHandlerD1Ev(); +int APS5_VABI _ZN9Inspector31ConsoleBackendDispatcherHandlerD2Ev(); +int APS5_VABI _ZN9Inspector31NetworkBackendDispatcherHandler20LoadResourceCallback11sendSuccessERKN3WTF6StringES5_i(); +int APS5_VABI _ZN9Inspector31NetworkBackendDispatcherHandler20LoadResourceCallbackD1Ev(); +int APS5_VABI _ZN9Inspector31NetworkBackendDispatcherHandlerC2ERKS0_(); +int APS5_VABI _ZN9Inspector31NetworkBackendDispatcherHandlerC2Ev(); +int APS5_VABI _ZN9Inspector31NetworkBackendDispatcherHandlerD0Ev(); +int APS5_VABI _ZN9Inspector31NetworkBackendDispatcherHandlerD1Ev(); +int APS5_VABI _ZN9Inspector31NetworkBackendDispatcherHandlerD2Ev(); +int APS5_VABI _ZN9Inspector31RuntimeBackendDispatcherHandlerC2ERKS0_(); +int APS5_VABI _ZN9Inspector31RuntimeBackendDispatcherHandlerC2Ev(); +int APS5_VABI _ZN9Inspector31RuntimeBackendDispatcherHandlerD0Ev(); +int APS5_VABI _ZN9Inspector31RuntimeBackendDispatcherHandlerD1Ev(); +int APS5_VABI _ZN9Inspector31RuntimeBackendDispatcherHandlerD2Ev(); +int APS5_VABI _ZN9Inspector31ScriptProfilerBackendDispatcher6createERNS_17BackendDispatcherEPNS_38ScriptProfilerBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector31ScriptProfilerBackendDispatcherC1ERNS_17BackendDispatcherEPNS_38ScriptProfilerBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector31ScriptProfilerBackendDispatcherC2ERNS_17BackendDispatcherEPNS_38ScriptProfilerBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector31ScriptProfilerBackendDispatcherD0Ev(); +int APS5_VABI _ZN9Inspector31ScriptProfilerBackendDispatcherD1Ev(); +int APS5_VABI _ZN9Inspector31ScriptProfilerBackendDispatcherD2Ev(); +int APS5_VABI _ZN9Inspector31createScriptCallStackForConsoleEPN3JSC14JSGlobalObjectEm(); +int APS5_VABI _ZN9Inspector32DatabaseBackendDispatcherHandler18ExecuteSQLCallbackD1Ev(); +int APS5_VABI _ZN9Inspector32DatabaseBackendDispatcherHandler18ExecuteSQLCallbackD2Ev(); +int APS5_VABI _ZN9Inspector32DatabaseBackendDispatcherHandlerC2ERKS0_(); +int APS5_VABI _ZN9Inspector32DatabaseBackendDispatcherHandlerC2Ev(); +int APS5_VABI _ZN9Inspector32DatabaseBackendDispatcherHandlerD0Ev(); +int APS5_VABI _ZN9Inspector32DatabaseBackendDispatcherHandlerD1Ev(); +int APS5_VABI _ZN9Inspector32DatabaseBackendDispatcherHandlerD2Ev(); +int APS5_VABI _ZN9Inspector32DatabaseBackendDispatcherHandleraSERKS0_(); +int APS5_VABI _ZN9Inspector32DebuggerBackendDispatcherHandlerC2ERKS0_(); +int APS5_VABI _ZN9Inspector32DebuggerBackendDispatcherHandlerC2Ev(); +int APS5_VABI _ZN9Inspector32DebuggerBackendDispatcherHandlerD0Ev(); +int APS5_VABI _ZN9Inspector32DebuggerBackendDispatcherHandlerD1Ev(); +int APS5_VABI _ZN9Inspector32ScriptProfilerFrontendDispatcher13trackingStartEd(); +int APS5_VABI _ZN9Inspector32ScriptProfilerFrontendDispatcherC1ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector32ScriptProfilerFrontendDispatcherC2ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector32ScriptProfilerFrontendDispatcherdaEPv(); +int APS5_VABI _ZN9Inspector32ScriptProfilerFrontendDispatcherdlEPv(); +int APS5_VABI _ZN9Inspector32ScriptProfilerFrontendDispatchernaEmPv(); +int APS5_VABI _ZN9Inspector32ScriptProfilerFrontendDispatchernaEm(); +int APS5_VABI _ZN9Inspector32ScriptProfilerFrontendDispatchernwEmPv(); +int APS5_VABI _ZN9Inspector32ScriptProfilerFrontendDispatchernwEm(); +int APS5_VABI _ZN9Inspector32TimelineBackendDispatcherHandlerC2ERKS0_(); +int APS5_VABI _ZN9Inspector32TimelineBackendDispatcherHandlerD2Ev(); +int APS5_VABI _ZN9Inspector33AnimationBackendDispatcherHandlerC2ERKS0_(); +int APS5_VABI _ZN9Inspector33AnimationBackendDispatcherHandlerC2Ev(); +int APS5_VABI _ZN9Inspector33AnimationBackendDispatcherHandlerD0Ev(); +int APS5_VABI _ZN9Inspector33AnimationBackendDispatcherHandlerD1Ev(); +int APS5_VABI _ZN9Inspector33AnimationBackendDispatcherHandlerD2Ev(); +int APS5_VABI _ZN9Inspector33ApplicationCacheBackendDispatcher6createERNS_17BackendDispatcherEPNS_40ApplicationCacheBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector33ApplicationCacheBackendDispatcherC1ERNS_17BackendDispatcherEPNS_40ApplicationCacheBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector33ApplicationCacheBackendDispatcherC2ERNS_17BackendDispatcherEPNS_40ApplicationCacheBackendDispatcherHandlerE(); +int APS5_VABI _ZN9Inspector33ApplicationCacheBackendDispatcherD0Ev(); +int APS5_VABI _ZN9Inspector33ApplicationCacheBackendDispatcherD1Ev(); +int APS5_VABI _ZN9Inspector33ApplicationCacheBackendDispatcherD2Ev(); +int APS5_VABI _ZN9Inspector33InspectorBackendDispatcherHandlerC2ERKS0_(); +int APS5_VABI _ZN9Inspector33InspectorBackendDispatcherHandlerC2Ev(); +int APS5_VABI _ZN9Inspector33InspectorBackendDispatcherHandlerD0Ev(); +int APS5_VABI _ZN9Inspector33InspectorBackendDispatcherHandlerD1Ev(); +int APS5_VABI _ZN9Inspector33InspectorBackendDispatcherHandlerD2Ev(); +int APS5_VABI _ZN9Inspector33LayerTreeBackendDispatcherHandlerC2ERKS0_(); +int APS5_VABI _ZN9Inspector33LayerTreeBackendDispatcherHandlerC2Ev(); +int APS5_VABI _ZN9Inspector33LayerTreeBackendDispatcherHandlerD0Ev(); +int APS5_VABI _ZN9Inspector33LayerTreeBackendDispatcherHandlerD1Ev(); +int APS5_VABI _ZN9Inspector33LayerTreeBackendDispatcherHandlerD2Ev(); +int APS5_VABI _ZN9Inspector34ApplicationCacheFrontendDispatcher19networkStateUpdatedEb(); +int APS5_VABI _ZN9Inspector34ApplicationCacheFrontendDispatcher29applicationCacheStatusUpdatedERKN3WTF6StringES4_i(); +int APS5_VABI _ZN9Inspector34ApplicationCacheFrontendDispatcherC1ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector34ApplicationCacheFrontendDispatcherC2ERNS_14FrontendRouterE(); +int APS5_VABI _ZN9Inspector34ApplicationCacheFrontendDispatcherdaEPv(); +int APS5_VABI _ZN9Inspector34ApplicationCacheFrontendDispatcherdlEPv(); +int APS5_VABI _ZN9Inspector34ApplicationCacheFrontendDispatchernaEmPv(); +int APS5_VABI _ZN9Inspector34ApplicationCacheFrontendDispatchernaEm(); +int APS5_VABI _ZN9Inspector34ApplicationCacheFrontendDispatchernwEm(); +int APS5_VABI _ZN9Inspector34ApplicationCacheFrontendDispatchernwEmPv(); +int APS5_VABI _ZN9Inspector34DOMStorageBackendDispatcherHandlerC2ERKS0_(); +int APS5_VABI _ZN9Inspector34DOMStorageBackendDispatcherHandlerC2Ev(); +int APS5_VABI _ZN9Inspector34DOMStorageBackendDispatcherHandlerD0Ev(); +int APS5_VABI _ZN9Inspector34DOMStorageBackendDispatcherHandlerD1Ev(); +int APS5_VABI _ZN9Inspector34DOMStorageBackendDispatcherHandlerD2Ev(); +int APS5_VABI _ZN9Inspector34createScriptCallStackFromExceptionEPN3JSC14JSGlobalObjectEPNS0_9ExceptionEm(); +int APS5_VABI _ZN9Inspector35DOMDebuggerBackendDispatcherHandlerC2ERKS0_(); +int APS5_VABI _ZN9Inspector35DOMDebuggerBackendDispatcherHandlerC2Ev(); +int APS5_VABI _ZN9Inspector35DOMDebuggerBackendDispatcherHandlerD0Ev(); +int APS5_VABI _ZN9Inspector35DOMDebuggerBackendDispatcherHandlerD1Ev(); +int APS5_VABI _ZN9Inspector35DOMDebuggerBackendDispatcherHandlerD2Ev(); +int APS5_VABI _ZN9Inspector38ScriptProfilerBackendDispatcherHandlerC2ERKS0_(); +int APS5_VABI _ZN9Inspector38ScriptProfilerBackendDispatcherHandlerC2Ev(); +int APS5_VABI _ZN9Inspector38ScriptProfilerBackendDispatcherHandlerD0Ev(); +int APS5_VABI _ZN9Inspector38ScriptProfilerBackendDispatcherHandlerD1Ev(); +int APS5_VABI _ZN9Inspector38ScriptProfilerBackendDispatcherHandlerD2Ev(); +int APS5_VABI _ZN9Inspector40ApplicationCacheBackendDispatcherHandlerC2ERKS0_(); +int APS5_VABI _ZN9Inspector40ApplicationCacheBackendDispatcherHandlerC2Ev(); +int APS5_VABI _ZN9Inspector40ApplicationCacheBackendDispatcherHandlerD0Ev(); +int APS5_VABI _ZN9Inspector40ApplicationCacheBackendDispatcherHandlerD1Ev(); +int APS5_VABI _ZN9Inspector40ApplicationCacheBackendDispatcherHandlerD2Ev(); +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime12EntryPreviewEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE(); +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime12RemoteObject4TypeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE(); +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime12RemoteObject7SubtypeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE(); +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime12RemoteObjectEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE(); +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime13ObjectPreview4TypeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE(); +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime13ObjectPreview7SubtypeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE(); +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime13ObjectPreviewEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE(); +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime15CollectionEntryEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE(); +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime15PropertyPreview4TypeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE(); +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime15PropertyPreview7SubtypeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE(); +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime15PropertyPreviewEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE(); +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime18PropertyDescriptorEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE(); +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime26InternalPropertyDescriptorEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE(); +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_8Debugger15FunctionDetailsEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE(); +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_8Debugger5Scope4TypeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE(); +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_8Debugger5ScopeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE(); +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_8Debugger8LocationEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE(); +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_8Debugger9CallFrameEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE(); +int APS5_VABI _ZN9Inspector8Protocol13BindingTraitsINS0_8Timeline9EventTypeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE(); +int APS5_VABI _ZNK14OpaqueJSString6stringEv(); +int APS5_VABI _ZNK3JSC10CodeOrigin4dumpERN3WTF11PrintStreamE(); +int APS5_VABI _ZNK3JSC10JSFunction10sourceCodeEv(); +int APS5_VABI _ZNK3JSC10JSFunction23isHostFunctionNonInlineEv(); +int APS5_VABI _ZNK3JSC11ArrayBuffer5sliceEd(); +int APS5_VABI _ZNK3JSC11ArrayBuffer5sliceEdd(); +int APS5_VABI _ZNK3JSC12JSRopeString11resolveRopeEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZNK3JSC12JSRopeString23resolveRopeToAtomStringEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZNK3JSC12JSRopeString31resolveRopeToExistingAtomStringEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZNK3JSC12PropertySlot14functionGetterEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZNK3JSC12StackVisitor5Frame12functionNameEv(); +int APS5_VABI _ZNK3JSC12StackVisitor5Frame20computeLineAndColumnERjS2_(); +int APS5_VABI _ZNK3JSC12StackVisitor5Frame8toStringEv(); +int APS5_VABI _ZNK3JSC12StackVisitor5Frame9sourceURLEv(); +int APS5_VABI _ZNK3JSC13JSArrayBuffer8isSharedEv(); +int APS5_VABI _ZNK3JSC13RuntimeMethod6methodEv(); +int APS5_VABI _ZNK3JSC14CachedBytecode13commitUpdatesERKN3WTF8FunctionIFvlPKvmEEE(); +int APS5_VABI _ZNK3JSC14CellAttributes4dumpERN3WTF11PrintStreamE(); +int APS5_VABI _ZNK3JSC14FullCodeOrigin4dumpERN3WTF11PrintStreamE(); +int APS5_VABI _ZNK3JSC14ProtoCallFrame13argumentCountEv(); +int APS5_VABI _ZNK3JSC14ProtoCallFrame26argumentCountIncludingThisEv(); +int APS5_VABI _ZNK3JSC14ProtoCallFrame6calleeEv(); +int APS5_VABI _ZNK3JSC14ProtoCallFrame9thisValueEv(); +int APS5_VABI _ZNK3JSC16ScriptExecutable8lastLineEv(); +int APS5_VABI _ZNK3JSC16ScriptExecutable9endColumnEv(); +int APS5_VABI _ZNK3JSC17DebuggerCallFrame8positionEv(); +int APS5_VABI _ZNK3JSC17DebuggerCallFrame8sourceIDEv(); +int APS5_VABI _ZNK3JSC17DebuggerCallFrame9thisValueERNS_2VME(); +int APS5_VABI _ZNK3JSC18BasicBlockLocation8dumpDataEv(); +int APS5_VABI _ZNK3JSC18BytecodeCacheError7isValidEv(); +int APS5_VABI _ZNK3JSC18BytecodeCacheError7messageEv(); +int APS5_VABI _ZNK3JSC18GCActivityCallback9isEnabledEv(); +int APS5_VABI _ZNK3JSC18PropertyDescriptor10enumerableEv(); +int APS5_VABI _ZNK3JSC18PropertyDescriptor16isDataDescriptorEv(); +int APS5_VABI _ZNK3JSC18PropertyDescriptor20isAccessorDescriptorEv(); +int APS5_VABI _ZNK3JSC18PropertyDescriptor6getterEv(); +int APS5_VABI _ZNK3JSC18PropertyDescriptor8writableEv(); +int APS5_VABI _ZNK3JSC19CacheableIdentifier4dumpERN3WTF11PrintStreamE(); +int APS5_VABI _ZNK3JSC19ControlFlowProfiler8dumpDataEv(); +int APS5_VABI _ZNK3JSC19HeapSnapshotBuilder18descriptionForCellEPNS_6JSCellE(); +int APS5_VABI _ZNK3JSC22FullGCActivityCallback13didGCRecentlyEv(); +int APS5_VABI _ZNK3JSC23VariableWriteFireDetail4dumpERN3WTF11PrintStreamE(); +int APS5_VABI _ZNK3JSC2VM29deprecatedVMEntryGlobalObjectEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZNK3JSC4Yarr17RegularExpression13matchedLengthEv(); +int APS5_VABI _ZNK3JSC6DOMJIT9HeapRange4dumpERN3WTF11PrintStreamE(); +int APS5_VABI _ZNK3JSC6JSCell11toPrimitiveEPNS_14JSGlobalObjectENS_22PreferredPrimitiveTypeE(); +int APS5_VABI _ZNK3JSC6JSCell12toObjectSlowEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZNK3JSC6JSCell8toNumberEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZNK3JSC6JSCell9getStringEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZNK3JSC6JSCell9getStringEPNS_14JSGlobalObjectERN3WTF6StringE(); +int APS5_VABI _ZNK3JSC7ArgList8getSliceEiRS0_(); +int APS5_VABI _ZNK3JSC7JSValue16toNumberSlowCaseEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZNK3JSC7JSValue16toObjectSlowCaseEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZNK3JSC7JSValue16toStringSlowCaseEPNS_14JSGlobalObjectEb(); +int APS5_VABI _ZNK3JSC7JSValue19synthesizePrototypeEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZNK3JSC7JSValue19toWTFStringSlowCaseEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZNK3JSC7JSValue20toIntegerPreserveNaNEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZNK3JSC7JSValue4dumpERN3WTF11PrintStreamE(); +int APS5_VABI _ZNK3JSC8Bindings10RootObject12globalObjectEv(); +int APS5_VABI _ZNK3JSC8Bindings13RuntimeObject19getInternalInstanceEv(); +int APS5_VABI _ZNK3JSC8FreeList4dumpERN3WTF11PrintStreamE(); +int APS5_VABI _ZNK3JSC8JSObject11hasPropertyEPNS_14JSGlobalObjectENS_12PropertyNameE(); +int APS5_VABI _ZNK3JSC8JSObject11hasPropertyEPNS_14JSGlobalObjectEj(); +int APS5_VABI _ZNK3JSC8JSObject11toPrimitiveEPNS_14JSGlobalObjectENS_22PreferredPrimitiveTypeE(); +int APS5_VABI _ZNK3JSC8JSObject8toNumberEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZNK3JSC8JSObject8toStringEPNS_14JSGlobalObjectE(); +int APS5_VABI _ZNK3JSC8JSString13equalSlowCaseEPNS_14JSGlobalObjectEPS0_(); +int APS5_VABI _ZNK3JSC8Profiler8Database4saveEPKc(); +int APS5_VABI _ZNK3JSC9CallFrame10codeOriginEv(); +int APS5_VABI _ZNK3JSC9CallFrame11callerFrameERPNS_10EntryFrameE(); +int APS5_VABI _ZNK3JSC9ClassInfo4dumpERN3WTF11PrintStreamE(); +int APS5_VABI _ZNK3JSC9CodeBlock26reoptimizationRetryCounterEv(); +int APS5_VABI _ZNK3JSC9CodeBlock4dumpERN3WTF11PrintStreamE(); +int APS5_VABI _ZNK3JSC9JSPromise6resultERNS_2VME(); +int APS5_VABI _ZNK3JSC9JSPromise6statusERNS_2VME(); +int APS5_VABI _ZNK3JSC9JSPromise9isHandledERNS_2VME(); +int APS5_VABI _ZNK3WTF10AtomString23convertToASCIILowercaseEv(); +int APS5_VABI _ZNK3WTF10AtomString23convertToASCIIUppercaseEv(); +int APS5_VABI _ZNK3WTF10StringView16GraphemeClusters8IteratordeEv(); +int APS5_VABI _ZNK3WTF10StringView16GraphemeClusters8IteratoreqERKS2_(); +int APS5_VABI _ZNK3WTF11Persistence7Decoder28bufferIsLargeEnoughToContainEm(); +int APS5_VABI _ZNK3WTF12ASCIILiteral4dumpERNS_11PrintStreamE(); +int APS5_VABI _ZNK3WTF13MonotonicTime4dumpERNS_11PrintStreamE(); +int APS5_VABI _ZNK3WTF13StringBuilder11reifyStringEv(); +int APS5_VABI _ZNK3WTF14MediaTimeRange12toJSONStringEv(); +int APS5_VABI _ZNK3WTF15AutomaticThread19hasUnderlyingThreadERKNS_14AbstractLockerE(); +int APS5_VABI _ZNK3WTF15AutomaticThread4nameEv(); +int APS5_VABI _ZNK3WTF17double_conversion23DoubleToStringConverter13ToExponentialEdiPNS0_13StringBuilderE(); +int APS5_VABI _ZNK3WTF19MetaAllocatorHandle4dumpERNS_11PrintStreamE(); +int APS5_VABI _ZNK3WTF24TimeWithDynamicClockType4dumpERNS_11PrintStreamE(); +int APS5_VABI _ZNK3WTF3URL11hostAndPortEv(); +int APS5_VABI _ZNK3WTF3URL14fileSystemPathEv(); +int APS5_VABI _ZNK3WTF3URL16isMatchingDomainENS_10StringViewE(); +int APS5_VABI _ZNK3WTF3URL17lastPathComponentEv(); +int APS5_VABI _ZNK3WTF3URL19protocolHostAndPortEv(); +int APS5_VABI _ZNK3WTF3URL21truncatedForUseAsBaseEv(); +int APS5_VABI _ZNK3WTF3URL24strippedForUseAsReferrerEv(); +int APS5_VABI _ZNK3WTF3URL30stringCenterEllipsizedToLengthEj(); +int APS5_VABI _ZNK3WTF3URL4dumpERNS_11PrintStreamE(); +int APS5_VABI _ZNK3WTF3URL4userEv(); +int APS5_VABI _ZNK3WTF3URL8passwordEv(); +int APS5_VABI _ZNK3WTF6Logger17LogSiteIdentifier8toStringEv(); +int APS5_VABI _ZNK3WTF6String18simplifyWhiteSpaceEPFbDsE(); +int APS5_VABI _ZNK3WTF6String25splitAllowingEmptyEntriesEDs(); +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 _ZNK3WTF6String57convertToLowercaseWithoutLocaleStartingAtFailingIndex8BitEj(); +int APS5_VABI _ZNK3WTF6String5splitEDs(); +int APS5_VABI _ZNK3WTF6String7toFloatEPb(); +int APS5_VABI _ZNK3WTF6String8foldCaseEv(); +int APS5_VABI _ZNK3WTF6String8toDoubleEPb(); +int APS5_VABI _ZNK3WTF6Thread4dumpERNS_11PrintStreamE(); +int APS5_VABI _ZNK3WTF7RunLoop9TimerBase16secondsUntilFireEv(); +int APS5_VABI _ZNK3WTF7RunLoop9TimerBase8isActiveEv(); +int APS5_VABI _ZNK3WTF7Seconds4dumpERNS_11PrintStreamE(); +int APS5_VABI _ZNK3WTF8Collator11collateUTF8EPKcS2_(); +int APS5_VABI _ZNK3WTF8Collator7collateENS_10StringViewES1_(); +int APS5_VABI _ZNK3WTF8JSONImpl10ObjectBase10memoryCostEv(); +int APS5_VABI _ZNK3WTF8JSONImpl10ObjectBase9getStringERKNS_6StringERS2_(); +int APS5_VABI _ZNK3WTF8JSONImpl5Value10memoryCostEv(); +int APS5_VABI _ZNK3WTF8JSONImpl5Value12toJSONStringEv(); +int APS5_VABI _ZNK3WTF8JSONImpl5Value4typeEv(); +int APS5_VABI _ZNK3WTF8JSONImpl5Value6isNullEv(); +int APS5_VABI _ZNK3WTF8JSONImpl5Value8asDoubleERd(); +int APS5_VABI _ZNK3WTF8JSONImpl5Value9asIntegerERi(); +int APS5_VABI _ZNK3WTF8JSONImpl5Value9writeJSONERNS_13StringBuilderE(); +int APS5_VABI _ZNK3WTF8JSONImpl9ArrayBase10memoryCostEv(); +int APS5_VABI _ZNK3WTF8JSONImpl9ArrayBase3getEm(); +int APS5_VABI _ZNK3WTF8JSONImpl9ArrayBase5beginEv(); +int APS5_VABI _ZNK3WTF8JSONImpl9ArrayBase9writeJSONERNS_13StringBuilderE(); +int APS5_VABI _ZNK3WTF8WallTime4dumpERNS_11PrintStreamE(); +int APS5_VABI _ZNK3WTF9BitVector11isEmptySlowEv(); +int APS5_VABI _ZNK3WTF9BitVector12bitCountSlowEv(); +int APS5_VABI _ZNK3WTF9BitVector12hashSlowCaseEv(); +int APS5_VABI _ZNK3WTF9BitVector14equalsSlowCaseERKS0_(); +int APS5_VABI _ZNK3WTF9BitVector4dumpERNS_11PrintStreamE(); +int APS5_VABI _ZNK3WTF9MediaTime11toTimeScaleEjNS0_13RoundingFlagsE(); +int APS5_VABI _ZNK3WTF9MediaTime12isIndefiniteEv(); +int APS5_VABI _ZNK3WTF9MediaTime12toJSONObjectEv(); +int APS5_VABI _ZNK3WTF9MediaTime12toJSONStringEv(); +int APS5_VABI _ZNK3WTF9MediaTime14hasBeenRoundedEv(); +int APS5_VABI _ZNK3WTF9MediaTime14hasDoubleValueEv(); +int APS5_VABI _ZNK3WTF9MediaTime18isNegativeInfiniteEv(); +int APS5_VABI _ZNK3WTF9MediaTime18isPositiveInfiniteEv(); +int APS5_VABI _ZNK3WTF9MediaTime4dumpERNS_11PrintStreamE(); +int APS5_VABI _ZNK3WTF9MediaTime7compareERKS0_(); +int APS5_VABI _ZNK3WTF9MediaTime7isValidEv(); +int APS5_VABI _ZNK3WTF9MediaTime7toFloatEv(); +int APS5_VABI _ZNK3WTF9MediaTime8toDoubleEv(); +int APS5_VABI _ZNK3WTF9MediaTime8toStringEv(); +int APS5_VABI _ZNK3WTF9MediaTime9isBetweenERKS0_S2_(); +int APS5_VABI _ZNK3WTF9MediaTime9isInvalidEv(); +int APS5_VABI _ZNK3WTF9MediaTime9timeFlagsEv(); +int APS5_VABI _ZNK3WTF9MediaTime9timeScaleEv(); +int APS5_VABI _ZNK3WTF9MediaTime9timeValueEv(); +int APS5_VABI _ZNK3WTF9MediaTimecvbEv(); +int APS5_VABI _ZNK3WTF9MediaTimeeqERKS0_(); +int APS5_VABI _ZNK3WTF9MediaTimegeERKS0_(); +int APS5_VABI _ZNK3WTF9MediaTimegtERKS0_(); +int APS5_VABI _ZNK3WTF9MediaTimeleERKS0_(); +int APS5_VABI _ZNK3WTF9MediaTimeltERKS0_(); +int APS5_VABI _ZNK3WTF9MediaTimemiERKS0_(); +int APS5_VABI _ZNK3WTF9MediaTimemlEi(); +int APS5_VABI _ZNK3WTF9MediaTimengEv(); +int APS5_VABI _ZNK3WTF9MediaTimentEv(); +int APS5_VABI _ZNK3WTF9MediaTimeplERKS0_(); +int APS5_VABI _ZNK7WebCore10FileHandlecvbEv(); +int APS5_VABI _ZNK7WebCore10FontRanges16fontForCharacterEi(); +int APS5_VABI _ZNK7WebCore10FontRanges17fontForFirstRangeEv(); +int APS5_VABI _ZNK7WebCore10FontRanges21glyphDataForCharacterEiNS_30ExternalResourceDownloadPolicyE(); +int APS5_VABI _ZNK7WebCore10JSDocument7wrappedEv(); +int APS5_VABI _ZNK7WebCore10MouseEvent11fromElementEv(); +int APS5_VABI _ZNK7WebCore10MouseEvent9toElementEv(); +int APS5_VABI _ZNK7WebCore10PluginData16supportsMimeTypeERKN3WTF6StringENS0_18AllowedPluginTypesE(); +int APS5_VABI _ZNK7WebCore10PluginData17webVisiblePluginsEv(); +int APS5_VABI _ZNK7WebCore10PluginData19webVisibleMimeTypesEv(); +int APS5_VABI _ZNK7WebCore10PluginData26supportsWebVisibleMimeTypeERKN3WTF6StringENS0_18AllowedPluginTypesE(); +int APS5_VABI _ZNK7WebCore10PluginData32supportsWebVisibleMimeTypeForURLERKN3WTF6StringENS0_18AllowedPluginTypesERKNS1_3URLE(); +int APS5_VABI _ZNK7WebCore10RenderText16firstRunLocationEv(); +int APS5_VABI _ZNK7WebCore10RenderText16linesBoundingBoxEv(); +int APS5_VABI _ZNK7WebCore10RenderText8textNodeEv(); +int APS5_VABI _ZNK7WebCore10RenderView12documentRectEv(); +int APS5_VABI _ZNK7WebCore10RenderView15usesCompositingEv(); +int APS5_VABI _ZNK7WebCore10RenderView20unscaledDocumentRectEv(); +int APS5_VABI _ZNK7WebCore10ScrollView10layoutSizeEv(); +int APS5_VABI _ZNK7WebCore10ScrollView12contentsSizeEv(); +int APS5_VABI _ZNK7WebCore10ScrollView14scrollbarModesERNS_13ScrollbarModeES2_(); +int APS5_VABI _ZNK7WebCore10ScrollView14useFixedLayoutEv(); +int APS5_VABI _ZNK7WebCore10ScrollView15fixedLayoutSizeEv(); +int APS5_VABI _ZNK7WebCore10ScrollView16contentsToScreenERKNS_7IntRectE(); +int APS5_VABI _ZNK7WebCore10ScrollView16contentsToWindowERKNS_7IntRectE(); +int APS5_VABI _ZNK7WebCore10ScrollView16contentsToWindowERKNS_8IntPointE(); +int APS5_VABI _ZNK7WebCore10ScrollView16windowToContentsERKNS_7IntRectE(); +int APS5_VABI _ZNK7WebCore10ScrollView16windowToContentsERKNS_8IntPointE(); +int APS5_VABI _ZNK7WebCore10ScrollView18contentsToRootViewERKNS_10FloatPointE(); +int APS5_VABI _ZNK7WebCore10ScrollView18contentsToRootViewERKNS_7IntRectE(); +int APS5_VABI _ZNK7WebCore10ScrollView18contentsToRootViewERKNS_8IntPointE(); +int APS5_VABI _ZNK7WebCore10ScrollView18contentsToRootViewERKNS_9FloatRectE(); +int APS5_VABI _ZNK7WebCore10ScrollView18exposedContentRectEv(); +int APS5_VABI _ZNK7WebCore10ScrollView18rootViewToContentsERKNS_10FloatPointE(); +int APS5_VABI _ZNK7WebCore10ScrollView18rootViewToContentsERKNS_7IntRectE(); +int APS5_VABI _ZNK7WebCore10ScrollView18rootViewToContentsERKNS_8IntPointE(); +int APS5_VABI _ZNK7WebCore10ScrollView18rootViewToContentsERKNS_9FloatRectE(); +int APS5_VABI _ZNK7WebCore10ScrollView21unobscuredContentRectENS_14ScrollableArea36VisibleContentRectIncludesScrollbarsE(); +int APS5_VABI _ZNK7WebCore10ScrollView21unobscuredContentSizeEv(); +int APS5_VABI _ZNK7WebCore10ScrollView22contentsScrollPositionEv(); +int APS5_VABI _ZNK7WebCore10ScrollView23rootViewToTotalContentsERKNS_8IntPointE(); +int APS5_VABI _ZNK7WebCore10ScrollView29unobscuredContentRectInternalENS_14ScrollableArea36VisibleContentRectIncludesScrollbarsE(); +int APS5_VABI _ZNK7WebCore10ScrollView42documentScrollPositionRelativeToViewOriginEv(); +int APS5_VABI _ZNK7WebCore10StorageMap6lengthEv(); +int APS5_VABI _ZNK7WebCore10StorageMap7getItemERKN3WTF6StringE(); +int APS5_VABI _ZNK7WebCore10StorageMap8containsERKN3WTF6StringE(); +int APS5_VABI _ZNK7WebCore10TimeRanges3endEj(); +int APS5_VABI _ZNK7WebCore10TimeRanges4copyEv(); +int APS5_VABI _ZNK7WebCore10TimeRanges5startEj(); +int APS5_VABI _ZNK7WebCore10TimeRanges6lengthEv(); +int APS5_VABI _ZNK7WebCore10TimeRanges7nearestEd(); +int APS5_VABI _ZNK7WebCore11BitmapImage21decodeCountForTestingEv(); +int APS5_VABI _ZNK7WebCore11CSSPageRule12selectorTextEv(); +int APS5_VABI _ZNK7WebCore11CachedImage20imageSizeForRendererEPKNS_13RenderElementENS0_8SizeTypeE(); +int APS5_VABI _ZNK7WebCore11ContentType13containerTypeEv(); +int APS5_VABI _ZNK7WebCore11ContentType9parameterERKN3WTF6StringE(); +int APS5_VABI _ZNK7WebCore11EventRegioneqERKS0_(); +int APS5_VABI _ZNK7WebCore11FontCascadeeqERKS0_(); +int APS5_VABI _ZNK7WebCore11FontChanges18createEditingStyleEv(); +int APS5_VABI _ZNK7WebCore11FrameLoader10isCompleteEv(); +int APS5_VABI _ZNK7WebCore11FrameLoader14cancelledErrorERKNS_15ResourceRequestE(); +int APS5_VABI _ZNK7WebCore11FrameLoader14frameHasLoadedEv(); +int APS5_VABI _ZNK7WebCore11FrameLoader16outgoingReferrerEv(); +int APS5_VABI _ZNK7WebCore11FrameLoader17networkingContextEv(); +int APS5_VABI _ZNK7WebCore11FrameLoader20activeDocumentLoaderEv(); +int APS5_VABI _ZNK7WebCore11FrameLoader27numPendingOrLoadingRequestsEb(); +int APS5_VABI _ZNK7WebCore11FrameLoader28blockedByContentBlockerErrorERKNS_15ResourceRequestE(); +int APS5_VABI _ZNK7WebCore11FrameLoader7frameIDEv(); +int APS5_VABI _ZNK7WebCore11FrameLoader8loadTypeEv(); +int APS5_VABI _ZNK7WebCore11HTMLElement10spellcheckEv(); +int APS5_VABI _ZNK7WebCore11HTMLElement15contentEditableEv(); +int APS5_VABI _ZNK7WebCore11HTMLElement18canonicalInputModeEv(); +int APS5_VABI _ZNK7WebCore11HTMLElement21canonicalEnterKeyHintEv(); +int APS5_VABI _ZNK7WebCore11HTMLElement3dirEv(); +int APS5_VABI _ZNK7WebCore11HTMLElement5titleEv(); +int APS5_VABI _ZNK7WebCore11HTMLElement9translateEv(); +int APS5_VABI _ZNK7WebCore11HistoryItem11hasChildrenEv(); +int APS5_VABI _ZNK7WebCore11HistoryItem11originalURLEv(); +int APS5_VABI _ZNK7WebCore11HistoryItem12isTargetItemEv(); +int APS5_VABI _ZNK7WebCore11HistoryItem13documentStateEv(); +int APS5_VABI _ZNK7WebCore11HistoryItem14alternateTitleEv(); +int APS5_VABI _ZNK7WebCore11HistoryItem14scrollPositionEv(); +int APS5_VABI _ZNK7WebCore11HistoryItem15formContentTypeEv(); +int APS5_VABI _ZNK7WebCore11HistoryItem15pageScaleFactorEv(); +int APS5_VABI _ZNK7WebCore11HistoryItem17originalURLStringEv(); +int APS5_VABI _ZNK7WebCore11HistoryItem20hasCachedPageExpiredEv(); +int APS5_VABI _ZNK7WebCore11HistoryItem27shouldRestoreScrollPositionEv(); +int APS5_VABI _ZNK7WebCore11HistoryItem28shouldOpenExternalURLsPolicyEv(); +int APS5_VABI _ZNK7WebCore11HistoryItem3urlEv(); +int APS5_VABI _ZNK7WebCore11HistoryItem4copyEv(); +int APS5_VABI _ZNK7WebCore11HistoryItem5titleEv(); +int APS5_VABI _ZNK7WebCore11HistoryItem6targetEv(); +int APS5_VABI _ZNK7WebCore11HistoryItem8childrenEv(); +int APS5_VABI _ZNK7WebCore11HistoryItem8referrerEv(); +int APS5_VABI _ZNK7WebCore11HistoryItem9urlStringEv(); +int APS5_VABI _ZNK7WebCore11JSDOMMatrix7wrappedEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer11currentTimeEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer11initialTimeEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer12getStartDateEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer13isVideoPlayerEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer13movieLoadTypeEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer13platformLayerEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer13playerPrivateEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer13requestedRateEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer14preservesPitchEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer15contentMIMETypeEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer15extraMemoryCostEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer16canSaveMediaDataEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer16supportsScanningEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer17contentTypeCodecsEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer17decodedFrameCountEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer17doesHaveAttributeERKN3WTF10AtomStringEPS2_(); +int APS5_VABI _ZNK7WebCore11MediaPlayer17droppedFrameCountEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer17engineDescriptionEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer17hasClosedCaptionsEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer17platformErrorCodeEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer18maxFastForwardRateEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer18minFastReverseRateEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer18shouldDisableSleepEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer18supportsFullscreenEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer19mediaCacheDirectoryEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer19playerContentsScaleEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer20playerContentBoxRectEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer20renderingModeChangedEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer21audioDecodedByteCountEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer21mediaTimeForTimeValueERKN3WTF9MediaTimeE(); +int APS5_VABI _ZNK7WebCore11MediaPlayer21videoDecodedByteCountEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer22didPassCORSAccessCheckEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer22documentSecurityOriginEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer22hasAvailableVideoFrameEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer24shouldUsePersistentCacheEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer24supportsPictureInPictureEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer25preferredDynamicRangeModeEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer25renderingCanBeAcceleratedEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer26shouldCheckHardwareSupportEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer27languageOfPrimaryAudioTrackEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer27sourceApplicationIdentifierEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer28requiresImmediateCompositingEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer28supportsAcceleratedRenderingEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer29preferredAudioCharacteristicsEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer31maximumDurationToCacheMediaTimeEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer31requiresTextTrackRepresentationEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer35platformVolumeConfigurationRequiredEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer39contentMIMETypeWasInferredFromExtensionEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer41mediaContentTypesRequiringHardwareSupportEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer4rateEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer5endedEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer5mutedEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer6clientEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer6pausedEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer6volumeEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer7preloadEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer7seekingEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer8durationEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer8fileSizeEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer8hasAudioEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer8hasVideoEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer8referrerEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer9isLoopingEv(); +int APS5_VABI _ZNK7WebCore11MediaPlayer9startTimeEv(); +int APS5_VABI _ZNK7WebCore11MemoryCache16originsWithCacheEN3PAL9SessionIDE(); +int APS5_VABI _ZNK7WebCore11MessagePort3refEv(); +int APS5_VABI _ZNK7WebCore11PageOverlay10controllerEv(); +int APS5_VABI _ZNK7WebCore11PageOverlay19viewToOverlayOffsetEv(); +int APS5_VABI _ZNK7WebCore11PageOverlay5frameEv(); +int APS5_VABI _ZNK7WebCore11PageOverlay6boundsEv(); +int APS5_VABI _ZNK7WebCore11RenderLayer19absoluteBoundingBoxEv(); +int APS5_VABI _ZNK7WebCore11RenderLayer35isTransparentRespectingParentFramesEv(); +int APS5_VABI _ZNK7WebCore11RenderStyle10lineHeightEv(); +int APS5_VABI _ZNK7WebCore11RenderStyle11fontCascadeEv(); +int APS5_VABI _ZNK7WebCore11RenderStyle15fontDescriptionEv(); +int APS5_VABI _ZNK7WebCore11RenderStyle18computedLineHeightEv(); +int APS5_VABI _ZNK7WebCore11RenderStyle26colorByApplyingColorFilterERKNS_5ColorE(); +int APS5_VABI _ZNK7WebCore11RenderVideo8videoBoxEv(); +int APS5_VABI _ZNK7WebCore11XPathResult10resultTypeEv(); +int APS5_VABI _ZNK7WebCore11XPathResult11numberValueEv(); +int APS5_VABI _ZNK7WebCore11XPathResult11stringValueEv(); +int APS5_VABI _ZNK7WebCore11XPathResult12booleanValueEv(); +int APS5_VABI _ZNK7WebCore11XPathResult14snapshotLengthEv(); +int APS5_VABI _ZNK7WebCore11XPathResult15singleNodeValueEv(); +int APS5_VABI _ZNK7WebCore11XPathResult20invalidIteratorStateEv(); +int APS5_VABI _ZNK7WebCore12BlobDataItem6lengthEv(); +int APS5_VABI _ZNK7WebCore12CSSMediaRule5mediaEv(); +int APS5_VABI _ZNK7WebCore12CSSStyleRule12selectorTextEv(); +int APS5_VABI _ZNK7WebCore12DOMTokenList5valueEv(); +int APS5_VABI _ZNK7WebCore12DOMTokenList8containsERKN3WTF10AtomStringE(); +int APS5_VABI _ZNK7WebCore12EventHandler27capsLockStateMayHaveChangedEv(); +int APS5_VABI _ZNK7WebCore12GridPosition12spanPositionEv(); +int APS5_VABI _ZNK7WebCore12GridPosition15integerPositionEv(); +int APS5_VABI _ZNK7WebCore12NamedNodeMap12getNamedItemERKN3WTF10AtomStringE(); +int APS5_VABI _ZNK7WebCore12NamedNodeMap14getNamedItemNSERKN3WTF10AtomStringES4_(); +int APS5_VABI _ZNK7WebCore12NamedNodeMap4itemEj(); +int APS5_VABI _ZNK7WebCore12NamedNodeMap6lengthEv(); +int APS5_VABI _ZNK7WebCore12RenderInline16linesBoundingBoxEv(); +int APS5_VABI _ZNK7WebCore12RenderObject12enclosingBoxEv(); +int APS5_VABI _ZNK7WebCore12RenderObject14enclosingLayerEv(); +int APS5_VABI _ZNK7WebCore12RenderObject15containingBlockEv(); +int APS5_VABI _ZNK7WebCore12RenderObject16repaintRectangleERKNS_10LayoutRectEb(); +int APS5_VABI _ZNK7WebCore12RenderObject17useDarkAppearanceEv(); +int APS5_VABI _ZNK7WebCore12RenderObject23absoluteBoundingBoxRectEbPb(); +int APS5_VABI _ZNK7WebCore12RenderObject39pixelSnappedAbsoluteClippedOverflowRectEv(); +int APS5_VABI _ZNK7WebCore12RenderObject44hasNonEmptyVisibleRectRespectingParentFramesEv(); +int APS5_VABI _ZNK7WebCore12RenderObject7childAtEj(); +int APS5_VABI _ZNK7WebCore12RenderWidget14windowClipRectEv(); +int APS5_VABI _ZNK7WebCore12SettingsBase15fixedFontFamilyE11UScriptCode(); +int APS5_VABI _ZNK7WebCore12SettingsBase15serifFontFamilyE11UScriptCode(); +int APS5_VABI _ZNK7WebCore12SettingsBase17cursiveFontFamilyE11UScriptCode(); +int APS5_VABI _ZNK7WebCore12SettingsBase17fantasyFontFamilyE11UScriptCode(); +int APS5_VABI _ZNK7WebCore12SettingsBase18standardFontFamilyE11UScriptCode(); +int APS5_VABI _ZNK7WebCore12SettingsBase19sansSerifFontFamilyE11UScriptCode(); +int APS5_VABI _ZNK7WebCore12SettingsBase20pictographFontFamilyE11UScriptCode(); +int APS5_VABI _ZNK7WebCore12SharedBuffer4dataEv(); +int APS5_VABI _ZNK7WebCore12TextIterator4nodeEv(); +int APS5_VABI _ZNK7WebCore12TextIterator5rangeEv(); +int APS5_VABI _ZNK7WebCore12WebAnimation14timeToNextTickEv(); +int APS5_VABI _ZNK7WebCore13CSSImportRule10styleSheetEv(); +int APS5_VABI _ZNK7WebCore13CSSImportRule4hrefEv(); +int APS5_VABI _ZNK7WebCore13CSSImportRule5mediaEv(); +int APS5_VABI _ZNK7WebCore13ContainerNode15countChildNodesEv(); +int APS5_VABI _ZNK7WebCore13ContainerNode16lastElementChildEv(); +int APS5_VABI _ZNK7WebCore13ContainerNode17childElementCountEv(); +int APS5_VABI _ZNK7WebCore13ContainerNode17firstElementChildEv(); +int APS5_VABI _ZNK7WebCore13ContainerNode17traverseToChildAtEj(); +int APS5_VABI _ZNK7WebCore13FetchResponse16resourceResponseEv(); +int APS5_VABI _ZNK7WebCore13GraphicsLayer18getDebugBorderInfoERNS_5ColorERf(); +int APS5_VABI _ZNK7WebCore13GraphicsLayer26backingStoreMemoryEstimateEv(); +int APS5_VABI _ZNK7WebCore13HTTPHeaderMap3getENS_14HTTPHeaderNameE(); +int APS5_VABI _ZNK7WebCore13HTTPHeaderMap8containsENS_14HTTPHeaderNameE(); +int APS5_VABI _ZNK7WebCore13HTTPHeaderMap8containsERKN3WTF6StringE(); +int APS5_VABI _ZNK7WebCore13HitTestResult10isSelectedEv(); +int APS5_VABI _ZNK7WebCore13HitTestResult10targetNodeEv(); +int APS5_VABI _ZNK7WebCore13HitTestResult11targetFrameEv(); +int APS5_VABI _ZNK7WebCore13HitTestResult11textContentEv(); +int APS5_VABI _ZNK7WebCore13HitTestResult12mediaIsVideoEv(); +int APS5_VABI _ZNK7WebCore13HitTestResult12selectedTextEv(); +int APS5_VABI _ZNK7WebCore13HitTestResult13mediaHasAudioEv(); +int APS5_VABI _ZNK7WebCore13HitTestResult13targetElementEv(); +int APS5_VABI _ZNK7WebCore13HitTestResult14absolutePDFURLEv(); +int APS5_VABI _ZNK7WebCore13HitTestResult14innerNodeFrameEv(); +int APS5_VABI _ZNK7WebCore13HitTestResult15absoluteLinkURLEv(); +int APS5_VABI _ZNK7WebCore13HitTestResult15spellingToolTipERNS_13TextDirectionE(); +int APS5_VABI _ZNK7WebCore13HitTestResult16absoluteImageURLEv(); +int APS5_VABI _ZNK7WebCore13HitTestResult16absoluteMediaURLEv(); +int APS5_VABI _ZNK7WebCore13HitTestResult16altDisplayStringEv(); +int APS5_VABI _ZNK7WebCore13HitTestResult17isContentEditableEv(); +int APS5_VABI _ZNK7WebCore13HitTestResult18titleDisplayStringEv(); +int APS5_VABI _ZNK7WebCore13HitTestResult19isDownloadableMediaEv(); +int APS5_VABI _ZNK7WebCore13HitTestResult19listBasedTestResultEv(); +int APS5_VABI _ZNK7WebCore13HitTestResult19mediaIsInFullscreenEv(); +int APS5_VABI _ZNK7WebCore13HitTestResult21innerNonSharedElementEv(); +int APS5_VABI _ZNK7WebCore13HitTestResult21linkSuggestedFilenameEv(); +int APS5_VABI _ZNK7WebCore13HitTestResult34isOverTextInsideFormControlElementEv(); +int APS5_VABI _ZNK7WebCore13HitTestResult5imageEv(); +int APS5_VABI _ZNK7WebCore13HitTestResult5titleERNS_13TextDirectionE(); +int APS5_VABI _ZNK7WebCore13HitTestResult9imageRectEv(); +int APS5_VABI _ZNK7WebCore13ImageDocument12imageElementEv(); +int APS5_VABI _ZNK7WebCore13JSHTMLElement21pushEventHandlerScopeEPN3JSC14JSGlobalObjectEPNS1_7JSScopeE(); +int APS5_VABI _ZNK7WebCore13JSHTMLElement7wrappedEv(); +int APS5_VABI _ZNK7WebCore13KeyboardEvent7keyCodeEv(); +int APS5_VABI _ZNK7WebCore13KeyboardEvent8charCodeEv(); +int APS5_VABI _ZNK7WebCore13MIMETypeCache11isAvailableEv(); +int APS5_VABI _ZNK7WebCore13MIMETypeCache7isEmptyEv(); +int APS5_VABI _ZNK7WebCore13RenderElement16imageOrientationEv(); +int APS5_VABI _ZNK7WebCore13ScriptElement13scriptContentEv(); +int APS5_VABI _ZNK7WebCore14CredentialBase11hasPasswordEv(); +int APS5_VABI _ZNK7WebCore14CredentialBase11persistenceEv(); +int APS5_VABI _ZNK7WebCore14CredentialBase4userEv(); +int APS5_VABI _ZNK7WebCore14CredentialBase7isEmptyEv(); +int APS5_VABI _ZNK7WebCore14CredentialBase8passwordEv(); +int APS5_VABI _ZNK7WebCore14DOMCacheEngine6Record4copyEv(); +int APS5_VABI _ZNK7WebCore14DocumentLoader11frameLoaderEv(); +int APS5_VABI _ZNK7WebCore14DocumentLoader11subresourceERKN3WTF3URLE(); +int APS5_VABI _ZNK7WebCore14DocumentLoader12subresourcesEv(); +int APS5_VABI _ZNK7WebCore14DocumentLoader13urlForHistoryEv(); +int APS5_VABI _ZNK7WebCore14DocumentLoader16mainResourceDataEv(); +int APS5_VABI _ZNK7WebCore14DocumentLoader16mouseEventPolicyEv(); +int APS5_VABI _ZNK7WebCore14DocumentLoader18mainResourceLoaderEv(); +int APS5_VABI _ZNK7WebCore14DocumentLoader19isLoadingInAPISenseEv(); +int APS5_VABI _ZNK7WebCore14DocumentLoader21archiveResourceForURLERKN3WTF3URLE(); +int APS5_VABI _ZNK7WebCore14DocumentLoader28urlForHistoryReflectsFailureEv(); +int APS5_VABI _ZNK7WebCore14DocumentLoader9isLoadingEv(); +int APS5_VABI _ZNK7WebCore14FrameSelection11currentFormEv(); +int APS5_VABI _ZNK7WebCore14FrameSelection15copyTypingStyleEv(); +int APS5_VABI _ZNK7WebCore14FrameSelection18isFocusedAndActiveEv(); +int APS5_VABI _ZNK7WebCore14FrameSelection31getClippedVisibleTextRectanglesERN3WTF6VectorINS_9FloatRectELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEENS0_19TextRectangleHeightE(); +int APS5_VABI _ZNK7WebCore14FrameSelection36rootEditableElementOrDocumentElementEv(); +int APS5_VABI _ZNK7WebCore14HTMLCollection13namedItemSlowERKN3WTF10AtomStringE(); +int APS5_VABI _ZNK7WebCore14JSVoidCallback22scriptExecutionContextEv(); +int APS5_VABI _ZNK7WebCore14JSWebAnimation7wrappedEv(); +int APS5_VABI _ZNK7WebCore14LoaderStrategy11usePingLoadEv(); +int APS5_VABI _ZNK7WebCore14LoaderStrategy12ongoingLoadsEv(); +int APS5_VABI _ZNK7WebCore14LoaderStrategy27havePerformedSecurityChecksERKNS_16ResourceResponseE(); +int APS5_VABI _ZNK7WebCore14LoaderStrategy27shouldPerformSecurityChecksEv(); +int APS5_VABI _ZNK7WebCore14LoggedInStatus10hasExpiredEv(); +int APS5_VABI _ZNK7WebCore14LoggedInStatus6expiryEv(); +int APS5_VABI _ZNK7WebCore14ResourceHandle6clientEv(); +int APS5_VABI _ZNK7WebCore14ResourceLoader11frameLoaderEv(); +int APS5_VABI _ZNK7WebCore14ResourceLoader28shouldIncludeCertificateInfoEv(); +int APS5_VABI _ZNK7WebCore14ResourceLoader32isAllowedToAskUserForCredentialsEv(); +int APS5_VABI _ZNK7WebCore14ScrollableArea12scrollOffsetEv(); +int APS5_VABI _ZNK7WebCore14ScrollableArea13scrolledToTopEv(); +int APS5_VABI _ZNK7WebCore14ScrollableArea14scrollAnimatorEv(); +int APS5_VABI _ZNK7WebCore14ScrollableArea14scrolledToLeftEv(); +int APS5_VABI _ZNK7WebCore14ScrollableArea15scrolledToRightEv(); +int APS5_VABI _ZNK7WebCore14ScrollableArea16scrolledToBottomEv(); +int APS5_VABI _ZNK7WebCore14ScrollableArea17totalContentsSizeEv(); +int APS5_VABI _ZNK7WebCore14ScrollableArea18scrollbarIntrusionEv(); +int APS5_VABI _ZNK7WebCore14ScrollableArea18visibleContentRectENS0_26VisibleContentRectBehaviorE(); +int APS5_VABI _ZNK7WebCore14ScrollableArea20contentAreaWillPaintEv(); +int APS5_VABI _ZNK7WebCore14ScrollableArea21mouseEnteredScrollbarEPNS_9ScrollbarE(); +int APS5_VABI _ZNK7WebCore14ScrollableArea21scrollbarsCanBeActiveEv(); +int APS5_VABI _ZNK7WebCore14ScrollableArea22mouseExitedContentAreaEv(); +int APS5_VABI _ZNK7WebCore14ScrollableArea23mouseEnteredContentAreaEv(); +int APS5_VABI _ZNK7WebCore14ScrollableArea23mouseMovedInContentAreaEv(); +int APS5_VABI _ZNK7WebCore14ScrollableArea24scrollOffsetFromPositionENS_8IntPointE(); +int APS5_VABI _ZNK7WebCore14ScrollableArea24scrollPositionFromOffsetENS_8IntPointE(); +int APS5_VABI _ZNK7WebCore14ScrollableArea26reachableTotalContentsSizeEv(); +int APS5_VABI _ZNK7WebCore14ScrollableArea26visibleContentRectInternalENS0_36VisibleContentRectIncludesScrollbarsENS0_26VisibleContentRectBehaviorE(); +int APS5_VABI _ZNK7WebCore14ScrollableArea32verticalScrollbarStateForTestingEv(); +int APS5_VABI _ZNK7WebCore14ScrollableArea34horizontalScrollbarStateForTestingEv(); +int APS5_VABI _ZNK7WebCore14ScrollableArea37visibleContentRectIncludingScrollbarsENS0_26VisibleContentRectBehaviorE(); +int APS5_VABI _ZNK7WebCore14SecurityOrigin11toRawStringEv(); +int APS5_VABI _ZNK7WebCore14SecurityOrigin12isolatedCopyEv(); +int APS5_VABI _ZNK7WebCore14SecurityOrigin14isSameOriginAsERKS0_(); +int APS5_VABI _ZNK7WebCore14SecurityOrigin23domainForCachePartitionEv(); +int APS5_VABI _ZNK7WebCore14SecurityOrigin33isMatchingRegistrableDomainSuffixERKN3WTF6StringEb(); +int APS5_VABI _ZNK7WebCore14SecurityOrigin5equalEPKS0_(); +int APS5_VABI _ZNK7WebCore14SecurityOrigin8toStringEv(); +int APS5_VABI _ZNK7WebCore14StaticNodeList4itemEj(); +int APS5_VABI _ZNK7WebCore14StaticNodeList6lengthEv(); +int APS5_VABI _ZNK7WebCore14StyleSheetList6lengthEv(); +int APS5_VABI _ZNK7WebCore15ActiveDOMObject16isContextStoppedEv(); +int APS5_VABI _ZNK7WebCore15ActiveDOMObject18hasPendingActivityEv(); +int APS5_VABI _ZNK7WebCore15ActiveDOMObject20isAllowedToRunScriptEv(); +int APS5_VABI _ZNK7WebCore15ActiveDOMObject25virtualHasPendingActivityEv(); +int APS5_VABI _ZNK7WebCore15ActiveDOMObject30assertSuspendIfNeededWasCalledEv(); +int APS5_VABI _ZNK7WebCore15AffineTransform9mapRegionERKNS_6RegionE(); +int APS5_VABI _ZNK7WebCore15CSSGroupingRule8cssRulesEv(); +int APS5_VABI _ZNK7WebCore15CertificateInfo12isolatedCopyEv(); +int APS5_VABI _ZNK7WebCore15FocusController18focusedOrMainFrameEv(); +int APS5_VABI _ZNK7WebCore15HTMLAreaElement11computeRectEPNS_12RenderObjectE(); +int APS5_VABI _ZNK7WebCore15HTMLAreaElement12imageElementEv(); +int APS5_VABI _ZNK7WebCore15HTMLBaseElement4hrefEv(); +int APS5_VABI _ZNK7WebCore15HTMLFormElement12autocompleteEv(); +int APS5_VABI _ZNK7WebCore15HTMLFormElement6actionEv(); +int APS5_VABI _ZNK7WebCore15HTMLFormElement6lengthEv(); +int APS5_VABI _ZNK7WebCore15HTMLFormElement6methodEv(); +int APS5_VABI _ZNK7WebCore15HTMLLinkElement11crossOriginEv(); +int APS5_VABI _ZNK7WebCore15HTMLLinkElement2asEv(); +int APS5_VABI _ZNK7WebCore15HTMLLinkElement3relEv(); +int APS5_VABI _ZNK7WebCore15HTTPHeaderField4nameEv(); +int APS5_VABI _ZNK7WebCore15HTTPHeaderField5valueEv(); +int APS5_VABI _ZNK7WebCore15JSDOMWindowBase17printErrorMessageERKN3WTF6StringE(); +int APS5_VABI _ZNK7WebCore15JSDOMWindowBase22scriptExecutionContextEv(); +int APS5_VABI _ZNK7WebCore15JSDOMWindowBase5proxyEv(); +int APS5_VABI _ZNK7WebCore15JSDOMWindowBase7wrappedEv(); +int APS5_VABI _ZNK7WebCore15JSSVGSVGElement7wrappedEv(); +int APS5_VABI _ZNK7WebCore15ProgressTracker17estimatedProgressEv(); +int APS5_VABI _ZNK7WebCore15SQLiteStatement18bindParameterCountEv(); +int APS5_VABI _ZNK7WebCore15SecurityContext14securityOriginEv(); +int APS5_VABI _ZNK7WebCore15StyleProperties11mutableCopyEv(); +int APS5_VABI _ZNK7WebCore15StyleProperties16getPropertyValueENS_13CSSPropertyIDE(); +int APS5_VABI _ZNK7WebCore15StyleProperties19getPropertyCSSValueENS_13CSSPropertyIDE(); +int APS5_VABI _ZNK7WebCore15VisiblePosition14characterAfterEv(); +int APS5_VABI _ZNK7WebCore15VisiblePosition19absoluteCaretBoundsEPb(); +int APS5_VABI _ZNK7WebCore15VisiblePosition30absoluteSelectionBoundsForLineEv(); +int APS5_VABI _ZNK7WebCore15VisiblePosition45lineDirectionPointForBlockDirectionNavigationEv(); +int APS5_VABI _ZNK7WebCore15VisiblePosition4leftEbPb(); +int APS5_VABI _ZNK7WebCore15VisiblePosition4nextENS_27EditingBoundaryCrossingRuleEPb(); +int APS5_VABI _ZNK7WebCore15VisiblePosition5rightEbPb(); +int APS5_VABI _ZNK7WebCore15VisiblePosition8previousENS_27EditingBoundaryCrossingRuleEPb(); +int APS5_VABI _ZNK7WebCore16BackForwardCache10frameCountEv(); +int APS5_VABI _ZNK7WebCore16BlobRegistryImpl11filesInBlobERKN3WTF3URLE(); +int APS5_VABI _ZNK7WebCore16BlobRegistryImpl18getBlobDataFromURLERKN3WTF3URLE(); +int APS5_VABI _ZNK7WebCore16DOMGuardedObject11isSuspendedEv(); +int APS5_VABI _ZNK7WebCore16DOMGuardedObject12globalObjectEv(); +int APS5_VABI _ZNK7WebCore16DOMGuardedObject13guardedObjectEv(); +int APS5_VABI _ZNK7WebCore16DOMGuardedObject7isEmptyEv(); +int APS5_VABI _ZNK7WebCore16DocumentFragment14getElementByIdERKN3WTF10AtomStringE(); +int APS5_VABI _ZNK7WebCore16DocumentTimeline17animationIntervalEv(); +int APS5_VABI _ZNK7WebCore16DocumentTimeline34numberOfActiveAnimationsForTestingEv(); +int APS5_VABI _ZNK7WebCore16DocumentTimeline48numberOfAnimationTimelineInvalidationsForTestingEv(); +int APS5_VABI _ZNK7WebCore16FileReaderLoader17arrayBufferResultEv(); +int APS5_VABI _ZNK7WebCore16HTMLImageElement11cachedImageEv(); +int APS5_VABI _ZNK7WebCore16HTMLImageElement11crossOriginEv(); +int APS5_VABI _ZNK7WebCore16HTMLImageElement12naturalWidthEv(); +int APS5_VABI _ZNK7WebCore16HTMLImageElement1xEv(); +int APS5_VABI _ZNK7WebCore16HTMLImageElement1yEv(); +int APS5_VABI _ZNK7WebCore16HTMLImageElement36pendingDecodePromisesCountForTestingEv(); +int APS5_VABI _ZNK7WebCore16HTMLImageElement3altEv(); +int APS5_VABI _ZNK7WebCore16HTMLImageElement8completeEv(); +int APS5_VABI _ZNK7WebCore16HTMLInputElement10isURLFieldEv(); +int APS5_VABI _ZNK7WebCore16HTMLInputElement11isDateFieldEv(); +int APS5_VABI _ZNK7WebCore16HTMLInputElement11isTextFieldEv(); +int APS5_VABI _ZNK7WebCore16HTMLInputElement11isTimeFieldEv(); +int APS5_VABI _ZNK7WebCore16HTMLInputElement11isWeekFieldEv(); +int APS5_VABI _ZNK7WebCore16HTMLInputElement11valueAsDateEv(); +int APS5_VABI _ZNK7WebCore16HTMLInputElement12defaultValueEv(); +int APS5_VABI _ZNK7WebCore16HTMLInputElement12isEmailFieldEv(); +int APS5_VABI _ZNK7WebCore16HTMLInputElement12isFileUploadEv(); +int APS5_VABI _ZNK7WebCore16HTMLInputElement12isMonthFieldEv(); +int APS5_VABI _ZNK7WebCore16HTMLInputElement13isNumberFieldEv(); +int APS5_VABI _ZNK7WebCore16HTMLInputElement13isSearchFieldEv(); +int APS5_VABI _ZNK7WebCore16HTMLInputElement13valueAsNumberEv(); +int APS5_VABI _ZNK7WebCore16HTMLInputElement15isPasswordFieldEv(); +int APS5_VABI _ZNK7WebCore16HTMLInputElement15suggestedColorsEv(); +int APS5_VABI _ZNK7WebCore16HTMLInputElement16isTelephoneFieldEv(); +int APS5_VABI _ZNK7WebCore16HTMLInputElement17validationMessageEv(); +int APS5_VABI _ZNK7WebCore16HTMLInputElement18shouldAutocompleteEv(); +int APS5_VABI _ZNK7WebCore16HTMLInputElement20isDateTimeLocalFieldEv(); +int APS5_VABI _ZNK7WebCore16HTMLInputElement21autoFillButtonElementEv(); +int APS5_VABI _ZNK7WebCore16HTMLInputElement3altEv(); +int APS5_VABI _ZNK7WebCore16HTMLInputElement5valueEv(); +int APS5_VABI _ZNK7WebCore16HTMLInputElement5widthEv(); +int APS5_VABI _ZNK7WebCore16HTMLInputElement6heightEv(); +int APS5_VABI _ZNK7WebCore16HTMLInputElement6isTextEv(); +int APS5_VABI _ZNK7WebCore16HTMLInputElement8multipleEv(); +int APS5_VABI _ZNK7WebCore16HTMLLabelElement4formEv(); +int APS5_VABI _ZNK7WebCore16HTMLLabelElement7controlEv(); +int APS5_VABI _ZNK7WebCore16HTMLMediaElement11canPlayTypeERKN3WTF6StringE(); +int APS5_VABI _ZNK7WebCore16HTMLMediaElement11crossOriginEv(); +int APS5_VABI _ZNK7WebCore16HTMLMediaElement11currentTimeEv(); +int APS5_VABI _ZNK7WebCore16HTMLMediaElement12getStartDateEv(); +int APS5_VABI _ZNK7WebCore16HTMLMediaElement12isFullscreenEv(); +int APS5_VABI _ZNK7WebCore16HTMLMediaElement12networkStateEv(); +int APS5_VABI _ZNK7WebCore16HTMLMediaElement12playbackRateEv(); +int APS5_VABI _ZNK7WebCore16HTMLMediaElement15bufferingPolicyEv(); +int APS5_VABI _ZNK7WebCore16HTMLMediaElement20webkitPreservesPitchEv(); +int APS5_VABI _ZNK7WebCore16HTMLMediaElement23webkitHasClosedCaptionsEv(); +int APS5_VABI _ZNK7WebCore16HTMLMediaElement27webkitClosedCaptionsVisibleEv(); +int APS5_VABI _ZNK7WebCore16HTMLMediaElement33lastMediaResourceLoaderForTestingEv(); +int APS5_VABI _ZNK7WebCore16HTMLMediaElement5endedEv(); +int APS5_VABI _ZNK7WebCore16HTMLMediaElement5errorEv(); +int APS5_VABI _ZNK7WebCore16HTMLMediaElement5mutedEv(); +int APS5_VABI _ZNK7WebCore16HTMLMediaElement6pausedEv(); +int APS5_VABI _ZNK7WebCore16HTMLMediaElement6volumeEv(); +int APS5_VABI _ZNK7WebCore16HTMLMediaElement7canPlayEv(); +int APS5_VABI _ZNK7WebCore16HTMLMediaElement7preloadEv(); +int APS5_VABI _ZNK7WebCore16HTMLMediaElement7seekingEv(); +int APS5_VABI _ZNK7WebCore16HTMLMediaElement8controlsEv(); +int APS5_VABI _ZNK7WebCore16HTMLMediaElement8durationEv(); +int APS5_VABI _ZNK7WebCore16HTMLOListElement9itemCountEv(); +int APS5_VABI _ZNK7WebCore16HTMLStyleElement8disabledEv(); +int APS5_VABI _ZNK7WebCore16HTMLTableElement5tFootEv(); +int APS5_VABI _ZNK7WebCore16HTMLTableElement5tHeadEv(); +int APS5_VABI _ZNK7WebCore16HTMLTableElement7captionEv(); +int APS5_VABI _ZNK7WebCore16HTMLTitleElement4textEv(); +int APS5_VABI _ZNK7WebCore16HTMLVideoElement10videoWidthEv(); +int APS5_VABI _ZNK7WebCore16HTMLVideoElement11videoHeightEv(); +int APS5_VABI _ZNK7WebCore16ISOSchemeTypeBox10schemeTypeEv(); +int APS5_VABI _ZNK7WebCore16ISOSchemeTypeBox13schemeVersionEv(); +int APS5_VABI _ZNK7WebCore16JSStringCallback22scriptExecutionContextEv(); +int APS5_VABI _ZNK7WebCore16JSXMLHttpRequest7wrappedEv(); +int APS5_VABI _ZNK7WebCore16JSXMLHttpRequest8responseERN3JSC14JSGlobalObjectE(); +int APS5_VABI _ZNK7WebCore16TrackPrivateBase10trackIndexEv(); +int APS5_VABI _ZNK7WebCore16TrackPrivateBase17startTimeVarianceEv(); +int APS5_VABI _ZNK7WebCore16TrackPrivateBase2idEv(); +int APS5_VABI _ZNK7WebCore16TrackPrivateBase5labelEv(); +int APS5_VABI _ZNK7WebCore16TrackPrivateBase8languageEv(); +int APS5_VABI _ZNK7WebCore16URLDecomposition4hashEv(); +int APS5_VABI _ZNK7WebCore16URLDecomposition4hostEv(); +int APS5_VABI _ZNK7WebCore16URLDecomposition4portEv(); +int APS5_VABI _ZNK7WebCore16URLDecomposition6searchEv(); +int APS5_VABI _ZNK7WebCore16URLDecomposition8hostnameEv(); +int APS5_VABI _ZNK7WebCore16URLDecomposition8pathnameEv(); +int APS5_VABI _ZNK7WebCore16URLDecomposition8protocolEv(); +int APS5_VABI _ZNK7WebCore16VisibleSelection16hasEditableStyleEv(); +int APS5_VABI _ZNK7WebCore16VisibleSelection17isContentEditableEv(); +int APS5_VABI _ZNK7WebCore16VisibleSelection17isInPasswordFieldEv(); +int APS5_VABI _ZNK7WebCore16VisibleSelection19rootEditableElementEv(); +int APS5_VABI _ZNK7WebCore16VisibleSelection23isContentRichlyEditableEv(); +int APS5_VABI _ZNK7WebCore16VisibleSelection5isAllENS_27EditingBoundaryCrossingRuleE(); +int APS5_VABI _ZNK7WebCore17ActiveDOMCallback17canInvokeCallbackEv(); +int APS5_VABI _ZNK7WebCore17ActiveDOMCallback25activeDOMObjectAreStoppedEv(); +int APS5_VABI _ZNK7WebCore17ActiveDOMCallback28activeDOMObjectsAreSuspendedEv(); +int APS5_VABI _ZNK7WebCore17CSSPrimitiveValue11stringValueEv(); +int APS5_VABI _ZNK7WebCore17CharacterIterator5rangeEv(); +int APS5_VABI _ZNK7WebCore17CredentialStorage22originsWithCredentialsEv(); +int APS5_VABI _ZNK7WebCore17FullscreenManager19isFullscreenEnabledEv(); +int APS5_VABI _ZNK7WebCore17FullscreenManager21isAnimatingFullscreenEv(); +int APS5_VABI _ZNK7WebCore17FullscreenManager27areFullscreenControlsHiddenEv(); +int APS5_VABI _ZNK7WebCore17HTMLAnchorElement4hrefEv(); +int APS5_VABI _ZNK7WebCore17HTMLAnchorElement6originEv(); +int APS5_VABI _ZNK7WebCore17HTMLLegendElement4formEv(); +int APS5_VABI _ZNK7WebCore17HTMLOptionElement18ownerSelectElementEv(); +int APS5_VABI _ZNK7WebCore17HTMLOptionElement21isDisabledFormControlEv(); +int APS5_VABI _ZNK7WebCore17HTMLOptionElement4textEv(); +int APS5_VABI _ZNK7WebCore17HTMLOptionElement5indexEv(); +int APS5_VABI _ZNK7WebCore17HTMLOptionElement5labelEv(); +int APS5_VABI _ZNK7WebCore17HTMLOptionElement5valueEv(); +int APS5_VABI _ZNK7WebCore17HTMLPlugInElement12pluginWidgetENS0_19PluginLoadingPolicyE(); +int APS5_VABI _ZNK7WebCore17HTMLScriptElement11crossOriginEv(); +int APS5_VABI _ZNK7WebCore17HTMLScriptElement5asyncEv(); +int APS5_VABI _ZNK7WebCore17HTMLSelectElement13selectedIndexEv(); +int APS5_VABI _ZNK7WebCore17HTMLSelectElement5valueEv(); +int APS5_VABI _ZNK7WebCore17HTMLSelectElement6lengthEv(); +int APS5_VABI _ZNK7WebCore17HTMLSelectElement9listItemsEv(); +int APS5_VABI _ZNK7WebCore17JSDOMGlobalObject13worldIsNormalEv(); +int APS5_VABI _ZNK7WebCore17JSDOMGlobalObject22scriptExecutionContextEv(); +int APS5_VABI _ZNK7WebCore17JSHTMLLinkElement7wrappedEv(); +int APS5_VABI _ZNK7WebCore17MouseRelatedEvent1xEv(); +int APS5_VABI _ZNK7WebCore17MouseRelatedEvent29locationInRootViewCoordinatesEv(); +int APS5_VABI _ZNK7WebCore17ParsedContentType9serializeEv(); +int APS5_VABI _ZNK7WebCore17RenderTextControl22textFormControlElementEv(); +int APS5_VABI _ZNK7WebCore17ResourceErrorBase12isolatedCopyEv(); +int APS5_VABI _ZNK7WebCore17ResourceErrorBase8lazyInitEv(); +int APS5_VABI _ZNK7WebCore17SMILTimeContainer19animationFrameDelayEv(); +int APS5_VABI _ZNK7WebCore17SubresourceLoader15originalHeadersEv(); +int APS5_VABI _ZNK7WebCore17TiledBackingStore13mapToContentsERKNS_7IntRectE(); +int APS5_VABI _ZNK7WebCore18CustomHeaderFields22thirdPartyDomainsMatchERKN3WTF3URLE(); +int APS5_VABI _ZNK7WebCore18DOMWindowExtension5frameEv(); +int APS5_VABI _ZNK7WebCore18HTMLMarqueeElement11scrollDelayEv(); +int APS5_VABI _ZNK7WebCore18HTMLMarqueeElement12scrollAmountEv(); +int APS5_VABI _ZNK7WebCore18HTMLMarqueeElement4loopEv(); +int APS5_VABI _ZNK7WebCore18JSHTMLImageElement7wrappedEv(); +int APS5_VABI _ZNK7WebCore18JSHTMLInputElement7wrappedEv(); +int APS5_VABI _ZNK7WebCore18JSHTMLMediaElement7wrappedEv(); +int APS5_VABI _ZNK7WebCore18JSHTMLVideoElement7wrappedEv(); +int APS5_VABI _ZNK7WebCore18MessagePortChannel31hasAnyMessagesPendingOrInFlightEv(); +int APS5_VABI _ZNK7WebCore18ParsedContentRange11headerValueEv(); +int APS5_VABI _ZNK7WebCore18PlatformPasteboard10readStringEmRKN3WTF6StringE(); +int APS5_VABI _ZNK7WebCore18PlatformPasteboard29typesSafeForDOMToReadAndWriteERKN3WTF6StringE(); +int APS5_VABI _ZNK7WebCore18PlatformTimeRanges13totalDurationEv(); +int APS5_VABI _ZNK7WebCore18PlatformTimeRanges19maximumBufferedTimeEv(); +int APS5_VABI _ZNK7WebCore18PlatformTimeRanges3endEj(); +int APS5_VABI _ZNK7WebCore18PlatformTimeRanges3endEjRb(); +int APS5_VABI _ZNK7WebCore18PlatformTimeRanges4dumpERN3WTF11PrintStreamE(); +int APS5_VABI _ZNK7WebCore18PlatformTimeRanges4findERKN3WTF9MediaTimeE(); +int APS5_VABI _ZNK7WebCore18PlatformTimeRanges5startEj(); +int APS5_VABI _ZNK7WebCore18PlatformTimeRanges5startEjRb(); +int APS5_VABI _ZNK7WebCore18PlatformTimeRanges6lengthEv(); +int APS5_VABI _ZNK7WebCore18PlatformTimeRanges7containERKN3WTF9MediaTimeE(); +int APS5_VABI _ZNK7WebCore18PlatformTimeRanges7nearestERKN3WTF9MediaTimeE(); +int APS5_VABI _ZNK7WebCore18PlatformTimeRanges8durationEj(); +int APS5_VABI _ZNK7WebCore18RenderLayerBacking11contentsBoxEv(); +int APS5_VABI _ZNK7WebCore18RenderLayerBacking12tiledBackingEv(); +int APS5_VABI _ZNK7WebCore18RenderLayerBacking20compositingLayerTypeEv(); +int APS5_VABI _ZNK7WebCore18RenderLayerBacking26backingStoreMemoryEstimateEv(); +int APS5_VABI _ZNK7WebCore18SecurityOriginData14securityOriginEv(); +int APS5_VABI _ZNK7WebCore18SecurityOriginData18databaseIdentifierEv(); +int APS5_VABI _ZNK7WebCore18SecurityOriginData8toStringEv(); +int APS5_VABI _ZNK7WebCore18StyleSheetContents21isLoadingSubresourcesEv(); +int APS5_VABI _ZNK7WebCore18TextureMapperLayer10hasFiltersEv(); +int APS5_VABI _ZNK7WebCore18TextureMapperLayer11shouldBlendEv(); +int APS5_VABI _ZNK7WebCore18TextureMapperLayer12drawsContentEv(); +int APS5_VABI _ZNK7WebCore18TextureMapperLayer18contentsAreVisibleEv(); +int APS5_VABI _ZNK7WebCore18TextureMapperLayer38descendantsOrSelfHaveRunningAnimationsEv(); +int APS5_VABI _ZNK7WebCore18TextureMapperLayer4sizeEv(); +int APS5_VABI _ZNK7WebCore18TextureMapperLayer7opacityEv(); +int APS5_VABI _ZNK7WebCore18TextureMapperLayer8childrenEv(); +int APS5_VABI _ZNK7WebCore18TextureMapperLayer9isVisibleEv(); +int APS5_VABI _ZNK7WebCore18TextureMapperLayer9layerRectEv(); +int APS5_VABI _ZNK7WebCore18TextureMapperLayer9rootLayerEv(); +int APS5_VABI _ZNK7WebCore18TextureMapperLayer9transformEv(); +int APS5_VABI _ZNK7WebCore19BlurFilterOperation11movesPixelsEv(); +int APS5_VABI _ZNK7WebCore19BlurFilterOperation12stdDeviationEv(); +int APS5_VABI _ZNK7WebCore19BlurFilterOperation14affectsOpacityEv(); +int APS5_VABI _ZNK7WebCore19BlurFilterOperation5cloneEv(); +int APS5_VABI _ZNK7WebCore19BlurFilterOperationeqERKNS_15FilterOperationE(); +int APS5_VABI _ZNK7WebCore19DragCaretController23isContentRichlyEditableEv(); +int APS5_VABI _ZNK7WebCore19DragCaretController30caretRectInRootViewCoordinatesEv(); +int APS5_VABI _ZNK7WebCore19DragCaretController40editableElementRectInRootViewCoordinatesEv(); +int APS5_VABI _ZNK7WebCore19HTMLOptGroupElement14groupLabelTextEv(); +int APS5_VABI _ZNK7WebCore19HTMLOptGroupElement18ownerSelectElementEv(); +int APS5_VABI _ZNK7WebCore19HTMLTableRowElement15sectionRowIndexEv(); +int APS5_VABI _ZNK7WebCore19HTMLTableRowElement8rowIndexEv(); +int APS5_VABI _ZNK7WebCore19HTMLTextAreaElement12defaultValueEv(); +int APS5_VABI _ZNK7WebCore19HTMLTextAreaElement5valueEv(); +int APS5_VABI _ZNK7WebCore19InspectorController13drawHighlightERNS_15GraphicsContextE(); +int APS5_VABI _ZNK7WebCore19InspectorController17shouldShowOverlayEv(); +int APS5_VABI _ZNK7WebCore19JSHTMLSelectElement7wrappedEv(); +int APS5_VABI _ZNK7WebCore19MediaElementSession20behaviorRestrictionsEv(); +int APS5_VABI _ZNK7WebCore19MediaElementSession22allowsPictureInPictureEv(); +int APS5_VABI _ZNK7WebCore19ProtectionSpaceBase15isPasswordBasedEv(); +int APS5_VABI _ZNK7WebCore19ProtectionSpaceBase26receivesCredentialSecurelyEv(); +int APS5_VABI _ZNK7WebCore19ProtectionSpaceBase7isProxyEv(); +int APS5_VABI _ZNK7WebCore19ResourceRequestBase10httpMethodEv(); +int APS5_VABI _ZNK7WebCore19ResourceRequestBase10httpOriginEv(); +int APS5_VABI _ZNK7WebCore19ResourceRequestBase10isSameSiteEv(); +int APS5_VABI _ZNK7WebCore19ResourceRequestBase11cachePolicyEv(); +int APS5_VABI _ZNK7WebCore19ResourceRequestBase12httpReferrerEv(); +int APS5_VABI _ZNK7WebCore19ResourceRequestBase12isolatedCopyEv(); +int APS5_VABI _ZNK7WebCore19ResourceRequestBase13httpUserAgentEv(); +int APS5_VABI _ZNK7WebCore19ResourceRequestBase13isConditionalEv(); +int APS5_VABI _ZNK7WebCore19ResourceRequestBase15httpContentTypeEv(); +int APS5_VABI _ZNK7WebCore19ResourceRequestBase15httpHeaderFieldENS_14HTTPHeaderNameE(); +int APS5_VABI _ZNK7WebCore19ResourceRequestBase15timeoutIntervalEv(); +int APS5_VABI _ZNK7WebCore19ResourceRequestBase16httpHeaderFieldsEv(); +int APS5_VABI _ZNK7WebCore19ResourceRequestBase18hasHTTPHeaderFieldENS_14HTTPHeaderNameE(); +int APS5_VABI _ZNK7WebCore19ResourceRequestBase20firstPartyForCookiesEv(); +int APS5_VABI _ZNK7WebCore19ResourceRequestBase3urlEv(); +int APS5_VABI _ZNK7WebCore19ResourceRequestBase6isNullEv(); +int APS5_VABI _ZNK7WebCore19ResourceRequestBase7isEmptyEv(); +int APS5_VABI _ZNK7WebCore19ResourceRequestBase8httpBodyEv(); +int APS5_VABI _ZNK7WebCore19ResourceRequestBase8priorityEv(); +int APS5_VABI _ZNK7WebCore19ResourceRequestBase9hasUploadEv(); +int APS5_VABI _ZNK7WebCore19ResourceRequestBase9isTopSiteEv(); +int APS5_VABI _ZNK7WebCore19UIEventWithKeyState16getModifierStateERKN3WTF6StringE(); +int APS5_VABI _ZNK7WebCore20CachedResourceLoader11isPreloadedERKN3WTF6StringE(); +int APS5_VABI _ZNK7WebCore20DeprecatedCSSOMValue12cssValueTypeEv(); +int APS5_VABI _ZNK7WebCore20DeprecatedCSSOMValue7cssTextEv(); +int APS5_VABI _ZNK7WebCore20FontAttributeChanges10editActionEv(); +int APS5_VABI _ZNK7WebCore20FontAttributeChanges18createEditingStyleEv(); +int APS5_VABI _ZNK7WebCore20HTMLTableCellElement18rowSpanForBindingsEv(); +int APS5_VABI _ZNK7WebCore20HTMLTableCellElement5scopeEv(); +int APS5_VABI _ZNK7WebCore20HTMLTableCellElement7colSpanEv(); +int APS5_VABI _ZNK7WebCore20HTMLTableCellElement9cellAboveEv(); +int APS5_VABI _ZNK7WebCore20HTMLTableCellElement9cellIndexEv(); +int APS5_VABI _ZNK7WebCore20ISOOriginalFormatBox10dataFormatEv(); +int APS5_VABI _ZNK7WebCore20LowPowerModeNotifier21isLowPowerModeEnabledEv(); +int APS5_VABI _ZNK7WebCore20PasteboardCustomData18createSharedBufferEv(); +int APS5_VABI _ZNK7WebCore20PasteboardWriterData7isEmptyEv(); +int APS5_VABI _ZNK7WebCore20RenderBoxModelObject18inlineContinuationEv(); +int APS5_VABI _ZNK7WebCore20ResourceResponseBase11httpVersionEv(); +int APS5_VABI _ZNK7WebCore20ResourceResponseBase12isAttachmentEv(); +int APS5_VABI _ZNK7WebCore20ResourceResponseBase12isSuccessfulEv(); +int APS5_VABI _ZNK7WebCore20ResourceResponseBase13isRedirectionEv(); +int APS5_VABI _ZNK7WebCore20ResourceResponseBase14httpStatusCodeEv(); +int APS5_VABI _ZNK7WebCore20ResourceResponseBase14httpStatusTextEv(); +int APS5_VABI _ZNK7WebCore20ResourceResponseBase14isInHTTPFamilyEv(); +int APS5_VABI _ZNK7WebCore20ResourceResponseBase15httpHeaderFieldENS_14HTTPHeaderNameE(); +int APS5_VABI _ZNK7WebCore20ResourceResponseBase16httpHeaderFieldsEv(); +int APS5_VABI _ZNK7WebCore20ResourceResponseBase16textEncodingNameEv(); +int APS5_VABI _ZNK7WebCore20ResourceResponseBase17suggestedFilenameEv(); +int APS5_VABI _ZNK7WebCore20ResourceResponseBase21expectedContentLengthEv(); +int APS5_VABI _ZNK7WebCore20ResourceResponseBase23hasCacheValidatorFieldsEv(); +int APS5_VABI _ZNK7WebCore20ResourceResponseBase24isAttachmentWithFilenameEv(); +int APS5_VABI _ZNK7WebCore20ResourceResponseBase27cacheControlContainsNoCacheEv(); +int APS5_VABI _ZNK7WebCore20ResourceResponseBase27cacheControlContainsNoStoreEv(); +int APS5_VABI _ZNK7WebCore20ResourceResponseBase29cacheControlContainsImmutableEv(); +int APS5_VABI _ZNK7WebCore20ResourceResponseBase34cacheControlContainsMustRevalidateEv(); +int APS5_VABI _ZNK7WebCore20ResourceResponseBase3urlEv(); +int APS5_VABI _ZNK7WebCore20ResourceResponseBase6sourceEv(); +int APS5_VABI _ZNK7WebCore20ResourceResponseBase8isHTTP09Ev(); +int APS5_VABI _ZNK7WebCore20ResourceResponseBase8lazyInitENS0_9InitLevelE(); +int APS5_VABI _ZNK7WebCore20ResourceResponseBase8mimeTypeEv(); +int APS5_VABI _ZNK7WebCore20ScrollingCoordinator25scrollableContainerNodeIDERKNS_12RenderObjectE(); +int APS5_VABI _ZNK7WebCore20ScrollingCoordinator36coordinatesScrollingForOverflowLayerERKNS_11RenderLayerE(); +int APS5_VABI _ZNK7WebCore21BackForwardController12forwardCountEv(); +int APS5_VABI _ZNK7WebCore21BackForwardController18canGoBackOrForwardEi(); +int APS5_VABI _ZNK7WebCore21BackForwardController9backCountEv(); +int APS5_VABI _ZNK7WebCore21ContentSecurityPolicy15responseHeadersEv(); +int APS5_VABI _ZNK7WebCore21ContentSecurityPolicy22overridesXFrameOptionsEv(); +int APS5_VABI _ZNK7WebCore21ContentSecurityPolicy30upgradeInsecureRequestIfNeededERN3WTF3URLENS0_19InsecureRequestTypeE(); +int APS5_VABI _ZNK7WebCore21ContentSecurityPolicy30upgradeInsecureRequestIfNeededERNS_15ResourceRequestENS0_19InsecureRequestTypeE(); +int APS5_VABI _ZNK7WebCore21HTMLFrameOwnerElement13contentWindowEv(); +int APS5_VABI _ZNK7WebCore21HTMLFrameOwnerElement15contentDocumentEv(); +int APS5_VABI _ZNK7WebCore21HTMLOptionsCollection13selectedIndexEv(); +int APS5_VABI _ZNK7WebCore21ISOTrackEncryptionBox10defaultKIDEv(); +int APS5_VABI _ZNK7WebCore21ISOTrackEncryptionBox17defaultConstantIVEv(); +int APS5_VABI _ZNK7WebCore21ISOTrackEncryptionBox18defaultIsProtectedEv(); +int APS5_VABI _ZNK7WebCore21ISOTrackEncryptionBox22defaultPerSampleIVSizeEv(); +int APS5_VABI _ZNK7WebCore21JSRemoteDOMWindowBase7wrappedEv(); +int APS5_VABI _ZNK7WebCore21JSTextTrackCueGeneric7wrappedEv(); +int APS5_VABI _ZNK7WebCore21NetworkStorageSession10hasCookiesERKNS_17RegistrableDomainEON3WTF17CompletionHandlerIFvbEEE(); +int APS5_VABI _ZNK7WebCore21NetworkStorageSession18cookieAcceptPolicyEv(); +int APS5_VABI _ZNK7WebCore21NetworkStorageSession26getAllStorageAccessEntriesEv(); +int APS5_VABI _ZNK7WebCore21NetworkStorageSession28shouldBlockThirdPartyCookiesERKNS_17RegistrableDomainE(); +int APS5_VABI _ZNK7WebCore21NetworkStorageSession33hasHadUserInteractionAsFirstPartyERKNS_17RegistrableDomainE(); +int APS5_VABI _ZNK7WebCore21NetworkStorageSession55shouldBlockThirdPartyCookiesButKeepFirstPartyCookiesForERKNS_17RegistrableDomainE(); +int APS5_VABI _ZNK7WebCore21PageOverlayController20viewOverlayRootLayerEv(); +int APS5_VABI _ZNK7WebCore21PageOverlayController24documentOverlayRootLayerEv(); +int APS5_VABI _ZNK7WebCore21RenderLayerCompositor15rootRenderLayerEv(); +int APS5_VABI _ZNK7WebCore21WheelEventDeltaFilter13filteredDeltaEv(); +int APS5_VABI _ZNK7WebCore21WheelEventDeltaFilter16filteredVelocityEv(); +int APS5_VABI _ZNK7WebCore22DefaultFilterOperation15representedTypeEv(); +int APS5_VABI _ZNK7WebCore22DefaultFilterOperation5cloneEv(); +int APS5_VABI _ZNK7WebCore22DefaultFilterOperationeqERKNS_15FilterOperationE(); +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient10hasWebViewEv(); +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient12blockedErrorERKNS_15ResourceRequestE(); +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient12canCachePageEv(); +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient14cancelledErrorERKNS_15ResourceRequestE(); +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient14shouldFallBackERKNS_13ResourceErrorE(); +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient15canShowMIMETypeERKN3WTF6StringE(); +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient16canHandleRequestERKNS_15ResourceRequestE(); +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient17overrideMediaTypeEv(); +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient18cannotShowURLErrorERKNS_15ResourceRequestE(); +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient21canShowMIMETypeAsHTMLERKN3WTF6StringE(); +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient21fileDoesNotExistErrorERKNS_16ResourceResponseE(); +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient21shouldGoToHistoryItemERNS_11HistoryItemE(); +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient23cannotShowMIMETypeErrorERKNS_16ResourceResponseE(); +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient24isEmptyFrameLoaderClientEv(); +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient25pluginWillHandleLoadErrorERKNS_16ResourceResponseE(); +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient28blockedByContentBlockerErrorERKNS_15ResourceRequestE(); +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient31interruptedForPolicyChangeErrorERKNS_15ResourceRequestE(); +int APS5_VABI _ZNK7WebCore22EmptyFrameLoaderClient9userAgentERKN3WTF3URLE(); +int APS5_VABI _ZNK7WebCore22HTMLFormControlElement10formActionEv(); +int APS5_VABI _ZNK7WebCore22HTMLFormControlElement10formMethodEv(); +int APS5_VABI _ZNK7WebCore22HTMLFormControlElement11formEnctypeEv(); +int APS5_VABI _ZNK7WebCore22HTMLFormControlElement12autocompleteEv(); +int APS5_VABI _ZNK7WebCore22HTMLFormControlElement12autofillDataEv(); +int APS5_VABI _ZNK7WebCore22ResourceLoadStatistics6encodeERNS_12KeyedEncoderE(); +int APS5_VABI _ZNK7WebCore22ResourceLoadStatistics8toStringEv(); +int APS5_VABI _ZNK7WebCore22ScriptExecutionContext23domainForCachePartitionEv(); +int APS5_VABI _ZNK7WebCore23ApplicationCacheStorage11maximumSizeEv(); +int APS5_VABI _ZNK7WebCore23FrameLoaderStateMachine15firstLayoutDoneEv(); +int APS5_VABI _ZNK7WebCore23FrameLoaderStateMachine23committingFirstRealLoadEv(); +int APS5_VABI _ZNK7WebCore23FrameLoaderStateMachine28creatingInitialEmptyDocumentEv(); +int APS5_VABI _ZNK7WebCore23FrameLoaderStateMachine32isDisplayingInitialEmptyDocumentEv(); +int APS5_VABI _ZNK7WebCore23ISOSchemeInformationBox18schemeSpecificDataEv(); +int APS5_VABI _ZNK7WebCore24CachedResourceHandleBase3getEv(); +int APS5_VABI _ZNK7WebCore24CachedResourceHandleBasecvMS0_PNS_14CachedResourceEEv(); +int APS5_VABI _ZNK7WebCore24CachedResourceHandleBasentEv(); +int APS5_VABI _ZNK7WebCore24CoordinatedGraphicsLayer13platformLayerEv(); +int APS5_VABI _ZNK7WebCore24CoordinatedGraphicsLayer14primaryLayerIDEv(); +int APS5_VABI _ZNK7WebCore24CoordinatedGraphicsLayer16compositionLayerEv(); +int APS5_VABI _ZNK7WebCore24CoordinatedGraphicsLayer17usesContentsLayerEv(); +int APS5_VABI _ZNK7WebCore24CoordinatedGraphicsLayer22filtersCanBeCompositedERKNS_16FilterOperationsE(); +int APS5_VABI _ZNK7WebCore24CoordinatedGraphicsLayer22shouldHaveBackingStoreEv(); +int APS5_VABI _ZNK7WebCore24CoordinatedGraphicsLayer26isCoordinatedGraphicsLayerEv(); +int APS5_VABI _ZNK7WebCore24CoordinatedGraphicsLayer28shouldDirectlyCompositeImageEPNS_5ImageE(); +int APS5_VABI _ZNK7WebCore24CoordinatedGraphicsLayer2idEv(); +int APS5_VABI _ZNK7WebCore24CoordinatedGraphicsLayer41selfOrAncestorHasActiveTransformAnimationEv(); +int APS5_VABI _ZNK7WebCore25DropShadowFilterOperation11movesPixelsEv(); +int APS5_VABI _ZNK7WebCore25DropShadowFilterOperation12stdDeviationEv(); +int APS5_VABI _ZNK7WebCore25DropShadowFilterOperation14affectsOpacityEv(); +int APS5_VABI _ZNK7WebCore25DropShadowFilterOperation1xEv(); +int APS5_VABI _ZNK7WebCore25DropShadowFilterOperation1yEv(); +int APS5_VABI _ZNK7WebCore25DropShadowFilterOperation5cloneEv(); +int APS5_VABI _ZNK7WebCore25DropShadowFilterOperation5colorEv(); +int APS5_VABI _ZNK7WebCore25DropShadowFilterOperation8locationEv(); +int APS5_VABI _ZNK7WebCore25DropShadowFilterOperationeqERKNS_15FilterOperationE(); +int APS5_VABI _ZNK7WebCore26HTMLTextFormControlElement12selectionEndEv(); +int APS5_VABI _ZNK7WebCore26HTMLTextFormControlElement14selectionStartEv(); +int APS5_VABI _ZNK7WebCore26HTMLTextFormControlElement18selectionDirectionEv(); +int APS5_VABI _ZNK7WebCore26HTMLTextFormControlElement21lastChangeWasUserEditEv(); +int APS5_VABI _ZNK7WebCore26HTMLTextFormControlElement23visiblePositionForIndexEi(); +int APS5_VABI _ZNK7WebCore26HTMLTextFormControlElement26isInnerTextElementEditableEv(); +int APS5_VABI _ZNK7WebCore26ISOProtectionSchemeInfoBox13schemeTypeBoxEv(); +int APS5_VABI _ZNK7WebCore26ISOProtectionSchemeInfoBox17originalFormatBoxEv(); +int APS5_VABI _ZNK7WebCore26ISOProtectionSchemeInfoBox20schemeInformationBoxEv(); +int APS5_VABI _ZNK7WebCore26NetscapePlugInStreamLoader6isDoneEv(); +int APS5_VABI _ZNK7WebCore27AuthenticationChallengeBase15failureResponseEv(); +int APS5_VABI _ZNK7WebCore27AuthenticationChallengeBase15protectionSpaceEv(); +int APS5_VABI _ZNK7WebCore27AuthenticationChallengeBase18proposedCredentialEv(); +int APS5_VABI _ZNK7WebCore27AuthenticationChallengeBase20previousFailureCountEv(); +int APS5_VABI _ZNK7WebCore27AuthenticationChallengeBase5errorEv(); +int APS5_VABI _ZNK7WebCore27AuthenticationChallengeBase6isNullEv(); +int APS5_VABI _ZNK7WebCore27ScriptedAnimationController17throttlingReasonsEv(); +int APS5_VABI _ZNK7WebCore27ScriptedAnimationController8intervalEv(); +int APS5_VABI _ZNK7WebCore28InspectorFrontendClientLocal13inspectedPageEv(); +int APS5_VABI _ZNK7WebCore28InspectorFrontendClientLocal15inspectionLevelEv(); +int APS5_VABI _ZNK7WebCore28InspectorFrontendClientLocal28userInterfaceLayoutDirectionEv(); +int APS5_VABI _ZNK7WebCore29DeprecatedCSSOMPrimitiveValue12getRectValueEv(); +int APS5_VABI _ZNK7WebCore29DeprecatedCSSOMPrimitiveValue13getFloatValueEt(); +int APS5_VABI _ZNK7WebCore29DeprecatedCSSOMPrimitiveValue13primitiveTypeEv(); +int APS5_VABI _ZNK7WebCore29DeprecatedCSSOMPrimitiveValue14getStringValueEv(); +int APS5_VABI _ZNK7WebCore29DeprecatedCSSOMPrimitiveValue15getCounterValueEv(); +int APS5_VABI _ZNK7WebCore29DeprecatedCSSOMPrimitiveValue16getRGBColorValueEv(); +int APS5_VABI _ZNK7WebCore30InvertLightnessFilterOperation5cloneEv(); +int APS5_VABI _ZNK7WebCore30InvertLightnessFilterOperationeqERKNS_15FilterOperationE(); +int APS5_VABI _ZNK7WebCore31BasicColorMatrixFilterOperation17passthroughAmountEv(); +int APS5_VABI _ZNK7WebCore31BasicColorMatrixFilterOperation5cloneEv(); +int APS5_VABI _ZNK7WebCore31BasicColorMatrixFilterOperation6amountEv(); +int APS5_VABI _ZNK7WebCore31BasicColorMatrixFilterOperationeqERKNS_15FilterOperationE(); +int APS5_VABI _ZNK7WebCore31SimplifiedBackwardsTextIterator5rangeEv(); +int APS5_VABI _ZNK7WebCore32FixedPositionViewportConstraints28layerPositionForViewportRectERKNS_9FloatRectE(); +int APS5_VABI _ZNK7WebCore33StickyPositionViewportConstraints32layerPositionForConstrainingRectERKNS_9FloatRectE(); +int APS5_VABI _ZNK7WebCore36ISOProtectionSystemSpecificHeaderBox4dataEv(); +int APS5_VABI _ZNK7WebCore36ISOProtectionSystemSpecificHeaderBox6keyIDsEv(); +int APS5_VABI _ZNK7WebCore36ISOProtectionSystemSpecificHeaderBox8systemIDEv(); +int APS5_VABI _ZNK7WebCore37BasicComponentTransferFilterOperation14affectsOpacityEv(); +int APS5_VABI _ZNK7WebCore37BasicComponentTransferFilterOperation17passthroughAmountEv(); +int APS5_VABI _ZNK7WebCore37BasicComponentTransferFilterOperation5cloneEv(); +int APS5_VABI _ZNK7WebCore37BasicComponentTransferFilterOperation6amountEv(); +int APS5_VABI _ZNK7WebCore37BasicComponentTransferFilterOperationeqERKNS_15FilterOperationE(); +int APS5_VABI _ZNK7WebCore37CrossOriginAccessControlCheckDisabler36crossOriginAccessControlCheckEnabledEv(); +int APS5_VABI _ZNK7WebCore4Attr5valueEv(); +int APS5_VABI _ZNK7WebCore4Blob4sizeEv(); +int APS5_VABI _ZNK7WebCore4File12lastModifiedEv(); +int APS5_VABI _ZNK7WebCore4Node10shadowHostEv(); +int APS5_VABI _ZNK7WebCore4Node11isEqualNodeEPS0_(); +int APS5_VABI _ZNK7WebCore4Node11textContentEb(); +int APS5_VABI _ZNK7WebCore4Node12lookupPrefixERKN3WTF10AtomStringE(); +int APS5_VABI _ZNK7WebCore4Node13ownerDocumentEv(); +int APS5_VABI _ZNK7WebCore4Node14isDescendantOfERKS0_(); +int APS5_VABI _ZNK7WebCore4Node16computeNodeIndexEv(); +int APS5_VABI _ZNK7WebCore4Node18computeEditabilityENS0_22UserSelectAllTreatmentENS0_17ShouldUpdateStyleE(); +int APS5_VABI _ZNK7WebCore4Node18isDefaultNamespaceERKN3WTF10AtomStringE(); +int APS5_VABI _ZNK7WebCore4Node18lookupNamespaceURIERKN3WTF10AtomStringE(); +int APS5_VABI _ZNK7WebCore4Node18nextElementSiblingEv(); +int APS5_VABI _ZNK7WebCore4Node19rootEditableElementEv(); +int APS5_VABI _ZNK7WebCore4Node21isRootEditableElementEv(); +int APS5_VABI _ZNK7WebCore4Node22previousElementSiblingEv(); +int APS5_VABI _ZNK7WebCore4Node26containsIncludingShadowDOMEPKS0_(); +int APS5_VABI _ZNK7WebCore4Node7baseURIEv(); +int APS5_VABI _ZNK7WebCore4Node9renderBoxEv(); +int APS5_VABI _ZNK7WebCore4Page15forEachDocumentERKN3WTF8FunctionIFvRNS_8DocumentEEEE(); +int APS5_VABI _ZNK7WebCore4Page15visibilityStateEv(); +int APS5_VABI _ZNK7WebCore4Page16hasSeenAnyPluginEv(); +int APS5_VABI _ZNK7WebCore4Page17useDarkAppearanceEv(); +int APS5_VABI _ZNK7WebCore4Page17viewportArgumentsEv(); +int APS5_VABI _ZNK7WebCore4Page19disabledAdaptationsEv(); +int APS5_VABI _ZNK7WebCore4Page20renderingUpdateCountEv(); +int APS5_VABI _ZNK7WebCore4Page21wheelEventTestMonitorEv(); +int APS5_VABI _ZNK7WebCore4Page22editableElementsInRectERKNS_9FloatRectE(); +int APS5_VABI _ZNK7WebCore4Page23diagnosticLoggingClientEv(); +int APS5_VABI _ZNK7WebCore4Page23isMonitoringWheelEventsEv(); +int APS5_VABI _ZNK7WebCore4Page27pageExtendedBackgroundColorEv(); +int APS5_VABI _ZNK7WebCore4Page28remoteInspectionNameOverrideEv(); +int APS5_VABI _ZNK7WebCore4Page34inLowQualityImageInterpolationModeEv(); +int APS5_VABI _ZNK7WebCore4Page9groupNameEv(); +int APS5_VABI _ZNK7WebCore4Page9pageCountEv(); +int APS5_VABI _ZNK7WebCore4Page9selectionEv(); +int APS5_VABI _ZNK7WebCore4Page9sessionIDEv(); +int APS5_VABI _ZNK7WebCore4Path16fastBoundingRectEv(); +int APS5_VABI _ZNK7WebCore4Text9wholeTextEv(); +int APS5_VABI _ZNK7WebCore5Range10cloneRangeEv(); +int APS5_VABI _ZNK7WebCore5Range11compareNodeERNS_4NodeE(); +int APS5_VABI _ZNK7WebCore5Range12comparePointERNS_4NodeEj(); +int APS5_VABI _ZNK7WebCore5Range14intersectsNodeERNS_4NodeE(); +int APS5_VABI _ZNK7WebCore5Range8toStringEv(); +int APS5_VABI _ZNK7WebCore6Chrome10windowRectEv(); +int APS5_VABI _ZNK7WebCore6Cookie4hashEv(); +int APS5_VABI _ZNK7WebCore6CookieeqERKS0_(); +int APS5_VABI _ZNK7WebCore6Cursor14platformCursorEv(); +int APS5_VABI _ZNK7WebCore6Cursor19setAsPlatformCursorEv(); +int APS5_VABI _ZNK7WebCore6Editor11textCheckerEv(); +int APS5_VABI _ZNK7WebCore6Editor12selectedTextEv(); +int APS5_VABI _ZNK7WebCore6Editor13canEditRichlyEv(); +int APS5_VABI _ZNK7WebCore6Editor16hasBidiSelectionEv(); +int APS5_VABI _ZNK7WebCore6Editor17firstRectForRangeERKNS_11SimpleRangeE(); +int APS5_VABI _ZNK7WebCore6Editor17selectionHasStyleENS_13CSSPropertyIDERKN3WTF6StringE(); +int APS5_VABI _ZNK7WebCore6Editor23getCompositionSelectionERjS1_(); +int APS5_VABI _ZNK7WebCore6Editor25stringForCandidateRequestEv(); +int APS5_VABI _ZNK7WebCore6Editor26selectionStartHasMarkerForENS_14DocumentMarker10MarkerTypeEii(); +int APS5_VABI _ZNK7WebCore6Editor30applyEditingStyleToBodyElementEv(); +int APS5_VABI _ZNK7WebCore6Editor32isContinuousSpellCheckingEnabledEv(); +int APS5_VABI _ZNK7WebCore6Editor37baseWritingDirectionForSelectionStartEv(); +int APS5_VABI _ZNK7WebCore6Editor6canCutEv(); +int APS5_VABI _ZNK7WebCore6Editor6clientEv(); +int APS5_VABI _ZNK7WebCore6Editor7Command11isSupportedEv(); +int APS5_VABI _ZNK7WebCore6Editor7Command15isTextInsertionEv(); +int APS5_VABI _ZNK7WebCore6Editor7Command26allowExecutionWhenDisabledEv(); +int APS5_VABI _ZNK7WebCore6Editor7Command5stateEPNS_5EventE(); +int APS5_VABI _ZNK7WebCore6Editor7Command7executeEPNS_5EventE(); +int APS5_VABI _ZNK7WebCore6Editor7Command7executeERKN3WTF6StringEPNS_5EventE(); +int APS5_VABI _ZNK7WebCore6Editor7Command9isEnabledEPNS_5EventE(); +int APS5_VABI _ZNK7WebCore6Editor7canCopyEv(); +int APS5_VABI _ZNK7WebCore6Editor7canEditEv(); +int APS5_VABI _ZNK7WebCore6Editor9canDeleteEv(); +int APS5_VABI _ZNK7WebCore6JSFile7wrappedEv(); +int APS5_VABI _ZNK7WebCore6JSNode21pushEventHandlerScopeEPN3JSC14JSGlobalObjectEPNS1_7JSScopeE(); +int APS5_VABI _ZNK7WebCore6JSNode7wrappedEv(); +int APS5_VABI _ZNK7WebCore6JSNode8nodeTypeERN3JSC14JSGlobalObjectE(); +int APS5_VABI _ZNK7WebCore6Length3refEv(); +int APS5_VABI _ZNK7WebCore6Length5derefEv(); +int APS5_VABI _ZNK7WebCore6Path2D4pathEv(); +int APS5_VABI _ZNK7WebCore6Quirks25needsYouTubeMouseOutQuirkEv(); +int APS5_VABI _ZNK7WebCore6Quirks29shouldAvoidUsingIOS13ForGmailEv(); +int APS5_VABI _ZNK7WebCore6Quirks32isNeverRichlyEditableForTouchBarEv(); +int APS5_VABI _ZNK7WebCore6Quirks44shouldAvoidResizingWhenInputViewBoundsChangeEv(); +int APS5_VABI _ZNK7WebCore6Quirks47shouldIgnoreContentObservationForSyntheticClickEb(); +int APS5_VABI _ZNK7WebCore6Quirks49isTouchBarUpdateSupressedForHiddenContentEditableEv(); +int APS5_VABI _ZNK7WebCore6Quirks50shouldIgnoreAriaForFastPathContentObservationCheckEv(); +int APS5_VABI _ZNK7WebCore6Quirks56shouldDispatchSyntheticMouseEventsWhenModifyingSelectionEv(); +int APS5_VABI _ZNK7WebCore6Quirks61shouldUseLegacySelectPopoverDismissalBehaviorInDataActivationEv(); +int APS5_VABI _ZNK7WebCore6Quirks62shouldLayOutAtMinimumWindowWidthWhenIgnoringScalingConstraintsEv(); +int APS5_VABI _ZNK7WebCore6Region10intersectsERKS0_(); +int APS5_VABI _ZNK7WebCore6Region5rectsEv(); +int APS5_VABI _ZNK7WebCore6Region8containsERKNS_8IntPointE(); +int APS5_VABI _ZNK7WebCore6Region8containsERKS0_(); +int APS5_VABI _ZNK7WebCore6Region9totalAreaEv(); +int APS5_VABI _ZNK7WebCore6Widget14platformWidgetEv(); +int APS5_VABI _ZNK7WebCore6Widget17convertToRootViewERKNS_7IntRectE(); +int APS5_VABI _ZNK7WebCore6Widget23convertToContainingViewERKNS_10FloatPointE(); +int APS5_VABI _ZNK7WebCore6Widget23convertToContainingViewERKNS_7IntRectE(); +int APS5_VABI _ZNK7WebCore6Widget23convertToContainingViewERKNS_8IntPointE(); +int APS5_VABI _ZNK7WebCore6Widget23convertToContainingViewERKNS_9FloatRectE(); +int APS5_VABI _ZNK7WebCore6Widget25convertFromContainingViewERKNS_10FloatPointE(); +int APS5_VABI _ZNK7WebCore6Widget25convertFromContainingViewERKNS_7IntRectE(); +int APS5_VABI _ZNK7WebCore6Widget25convertFromContainingViewERKNS_9FloatRectE(); +int APS5_VABI _ZNK7WebCore6Widget25convertToContainingWindowERKNS_7IntRectE(); +int APS5_VABI _ZNK7WebCore6Widget25convertToContainingWindowERKNS_8IntPointE(); +int APS5_VABI _ZNK7WebCore6Widget6parentEv(); +int APS5_VABI _ZNK7WebCore6Widget9frameRectEv(); +int APS5_VABI _ZNK7WebCore7Element10attributesEv(); +int APS5_VABI _ZNK7WebCore7Element10screenRectEv(); +int APS5_VABI _ZNK7WebCore7Element12getAttributeERKN3WTF10AtomStringE(); +int APS5_VABI _ZNK7WebCore7Element12getAttributeERKNS_13QualifiedNameE(); +int APS5_VABI _ZNK7WebCore7Element12hasAttributeERKN3WTF10AtomStringE(); +int APS5_VABI _ZNK7WebCore7Element12hasAttributeERKNS_13QualifiedNameE(); +int APS5_VABI _ZNK7WebCore7Element13hasAttributesEv(); +int APS5_VABI _ZNK7WebCore7Element14getAttributeNSERKN3WTF10AtomStringES4_(); +int APS5_VABI _ZNK7WebCore7Element14hasAttributeNSERKN3WTF10AtomStringES4_(); +int APS5_VABI _ZNK7WebCore7Element15absoluteLinkURLEv(); +int APS5_VABI _ZNK7WebCore7Element15getURLAttributeERKNS_13QualifiedNameE(); +int APS5_VABI _ZNK7WebCore7Element18afterPseudoElementEv(); +int APS5_VABI _ZNK7WebCore7Element19beforePseudoElementEv(); +int APS5_VABI _ZNK7WebCore7Element20getIntegralAttributeERKNS_13QualifiedNameE(); +int APS5_VABI _ZNK7WebCore7Element28getUnsignedIntegralAttributeERKNS_13QualifiedNameE(); +int APS5_VABI _ZNK7WebCore7Element9innerHTMLEv(); +int APS5_VABI _ZNK7WebCore7Element9outerHTMLEv(); +int APS5_VABI _ZNK7WebCore8DOMTimer24intervalClampedToMinimumEv(); +int APS5_VABI _ZNK7WebCore8Document10alinkColorEv(); +int APS5_VABI _ZNK7WebCore8Document10compatModeEv(); +int APS5_VABI _ZNK7WebCore8Document10designModeEv(); +int APS5_VABI _ZNK7WebCore8Document10vlinkColorEv(); +int APS5_VABI _ZNK7WebCore8Document11completeURLERKN3WTF6StringENS_22ScriptExecutionContext9ForceUTF8E(); +int APS5_VABI _ZNK7WebCore8Document11contentTypeEv(); +int APS5_VABI _ZNK7WebCore8Document11topDocumentEv(); +int APS5_VABI _ZNK7WebCore8Document11windowProxyEv(); +int APS5_VABI _ZNK7WebCore8Document12lastModifiedEv(); +int APS5_VABI _ZNK7WebCore8Document13axObjectCacheEv(); +int APS5_VABI _ZNK7WebCore8Document14bodyOrFramesetEv(); +int APS5_VABI _ZNK7WebCore8Document15visibilityStateEv(); +int APS5_VABI _ZNK7WebCore8Document16styleRecalcCountEv(); +int APS5_VABI _ZNK7WebCore8Document17useDarkAppearanceEPKNS_11RenderStyleE(); +int APS5_VABI _ZNK7WebCore8Document17viewportArgumentsEv(); +int APS5_VABI _ZNK7WebCore8Document18monotonicTimestampEv(); +int APS5_VABI _ZNK7WebCore8Document19useSystemAppearanceEv(); +int APS5_VABI _ZNK7WebCore8Document20isRunningUserScriptsEv(); +int APS5_VABI _ZNK7WebCore8Document20linkColorForBindingsEv(); +int APS5_VABI _ZNK7WebCore8Document21haveStylesheetsLoadedEv(); +int APS5_VABI _ZNK7WebCore8Document22touchEventHandlerCountEv(); +int APS5_VABI _ZNK7WebCore8Document22wheelEventHandlerCountEv(); +int APS5_VABI _ZNK7WebCore8Document28characterSetWithUTF8FallbackEv(); +int APS5_VABI _ZNK7WebCore8Document29originIdentifierForPasteboardEv(); +int APS5_VABI _ZNK7WebCore8Document29useElevatedUserInterfaceLevelEv(); +int APS5_VABI _ZNK7WebCore8Document31defaultCharsetForLegacyBindingsEv(); +int APS5_VABI _ZNK7WebCore8Document31displayStringModifiedByEncodingERKN3WTF6StringE(); +int APS5_VABI _ZNK7WebCore8Document3dirEv(); +int APS5_VABI _ZNK7WebCore8Document42shouldBypassMainWorldContentSecurityPolicyEv(); +int APS5_VABI _ZNK7WebCore8Document4bodyEv(); +int APS5_VABI _ZNK7WebCore8Document6domainEv(); +int APS5_VABI _ZNK7WebCore8Document6hiddenEv(); +int APS5_VABI _ZNK7WebCore8Document6loaderEv(); +int APS5_VABI _ZNK7WebCore8Document7bgColorEv(); +int APS5_VABI _ZNK7WebCore8Document7doctypeEv(); +int APS5_VABI _ZNK7WebCore8Document8hasFocusEv(); +int APS5_VABI _ZNK7WebCore8FileList4itemEj(); +int APS5_VABI _ZNK7WebCore8FormData12isolatedCopyEv(); +int APS5_VABI _ZNK7WebCore8FormData13lengthInBytesEv(); +int APS5_VABI _ZNK7WebCore8FormData14asSharedBufferEv(); +int APS5_VABI _ZNK7WebCore8FormData7flattenEv(); +int APS5_VABI _ZNK7WebCore8FormData9asBlobURLEv(); +int APS5_VABI _ZNK7WebCore8Location4hostEv(); +int APS5_VABI _ZNK7WebCore8Position10downstreamENS_27EditingBoundaryCrossingRuleE(); +int APS5_VABI _ZNK7WebCore8Position13containerNodeEv(); +int APS5_VABI _ZNK7WebCore8Position24computeNodeAfterPositionEv(); +int APS5_VABI _ZNK7WebCore8Position24parentAnchoredEquivalentEv(); +int APS5_VABI _ZNK7WebCore8Position25computeNodeBeforePositionEv(); +int APS5_VABI _ZNK7WebCore8Position28offsetForPositionAfterAnchorEv(); +int APS5_VABI _ZNK7WebCore8Position4nextENS_16PositionMoveTypeE(); +int APS5_VABI _ZNK7WebCore8Position8previousENS_16PositionMoveTypeE(); +int APS5_VABI _ZNK7WebCore8Position8upstreamENS_27EditingBoundaryCrossingRuleE(); +int APS5_VABI _ZNK7WebCore8Settings15isScriptEnabledEv(); +int APS5_VABI _ZNK7WebCore8Settings16areImagesEnabledEv(); +int APS5_VABI _ZNK7WebCore8Settings16showDebugBordersEv(); +int APS5_VABI _ZNK7WebCore8Settings18showRepaintCounterEv(); +int APS5_VABI _ZNK7WebCore8Settings18webSecurityEnabledEv(); +int APS5_VABI _ZNK7WebCore8Settings23needsSiteSpecificQuirksEv(); +int APS5_VABI _ZNK7WebCore8Settings26authorAndUserStylesEnabledEv(); +int APS5_VABI _ZNK7WebCore8Settings28iceCandidateFilteringEnabledEv(); +int APS5_VABI _ZNK7WebCore9CookieJar13getRawCookiesERKNS_8DocumentERKN3WTF3URLERNS4_6VectorINS_6CookieELm0ENS4_15CrashOnOverflowELm16ENS4_10FastMallocEEE(); +int APS5_VABI _ZNK7WebCore9CookieJar14cookiesEnabledERKNS_8DocumentE(); +int APS5_VABI _ZNK7WebCore9CookieJar29cookieRequestHeaderFieldValueERNS_8DocumentERKN3WTF3URLE(); +int APS5_VABI _ZNK7WebCore9CookieJar7cookiesERNS_8DocumentERKN3WTF3URLE(); +int APS5_VABI _ZNK7WebCore9FrameTree10childCountEv(); +int APS5_VABI _ZNK7WebCore9FrameTree11scopedChildEj(); +int APS5_VABI _ZNK7WebCore9FrameTree12traverseNextENS_7CanWrapEPNS_7DidWrapE(); +int APS5_VABI _ZNK7WebCore9FrameTree12traverseNextEPKNS_5FrameE(); +int APS5_VABI _ZNK7WebCore9FrameTree14isDescendantOfEPKNS_5FrameE(); +int APS5_VABI _ZNK7WebCore9FrameTree16traversePreviousENS_7CanWrapEPNS_7DidWrapE(); +int APS5_VABI _ZNK7WebCore9FrameTree20traverseNextRenderedEPKNS_5FrameE(); +int APS5_VABI _ZNK7WebCore9FrameTree3topEv(); +int APS5_VABI _ZNK7WebCore9FrameTree6parentEv(); +int APS5_VABI _ZNK7WebCore9JSDOMRect7wrappedEv(); +int APS5_VABI _ZNK7WebCore9JSElement7wrappedEv(); +int APS5_VABI _ZNK7WebCore9MediaList4itemEj(); +int APS5_VABI _ZNK7WebCore9RenderBox11borderRadiiEv(); +int APS5_VABI _ZNK7WebCore9RenderBox11clientWidthEv(); +int APS5_VABI _ZNK7WebCore9RenderBox12clientHeightEv(); +int APS5_VABI _ZNK7WebCore9RenderBox19absoluteContentQuadEv(); +int APS5_VABI _ZNK7WebCore9RenderBox20flippedClientBoxRectEv(); +int APS5_VABI _ZNK7WebCore9RenderBox22verticalScrollbarWidthEv(); +int APS5_VABI _ZNK7WebCore9RenderBox25horizontalScrollbarHeightEv(); +int APS5_VABI _ZNK7WebCore9RenderBox33canBeScrolledAndHasScrollableAreaEv(); +int APS5_VABI _ZNK7WebCore9SampleMap5emptyEv(); +int APS5_VABI _ZNK7WebCore9TimerBase16nextFireIntervalEv(); +int APS5_VABI _ZNK7WebCore9TreeScope14getElementByIdERKN3WTF10AtomStringE(); +int APS5_VABI _ZNK7WebCore9TreeScope14getElementByIdERKN3WTF6StringE(); +int APS5_VABI _ZNK7WebCore9TreeScope16getElementByNameERKN3WTF10AtomStringE(); +int APS5_VABI _ZNK7WebCore9TreeScope23ancestorNodeInThisScopeEPNS_4NodeE(); +int APS5_VABI _ZNK7WebCore9TreeScope26ancestorElementInThisScopeEPNS_7ElementE(); +int APS5_VABI _ZNK7bmalloc11IsoTLSEntry4sizeEv(); +int APS5_VABI _ZNK7bmalloc11IsoTLSEntry6extentEv(); +int APS5_VABI _ZNK7bmalloc11IsoTLSEntry6offsetEv(); +int APS5_VABI _ZNK7bmalloc11IsoTLSEntry9alignmentEv(); +int APS5_VABI _ZNK9Inspector14ConsoleMessage12globalObjectEv(); +int APS5_VABI _ZNK9Inspector14ConsoleMessage13argumentCountEv(); +int APS5_VABI _ZNK9Inspector14ConsoleMessage3urlEv(); +int APS5_VABI _ZNK9Inspector14ConsoleMessage4lineEv(); +int APS5_VABI _ZNK9Inspector14ConsoleMessage4typeEv(); +int APS5_VABI _ZNK9Inspector14ConsoleMessage5levelEv(); +int APS5_VABI _ZNK9Inspector14ConsoleMessage6columnEv(); +int APS5_VABI _ZNK9Inspector14ConsoleMessage6sourceEv(); +int APS5_VABI _ZNK9Inspector14ConsoleMessage7isEqualEPS0_(); +int APS5_VABI _ZNK9Inspector14ConsoleMessage7messageEv(); +int APS5_VABI _ZNK9Inspector14ConsoleMessage9argumentsEv(); +int APS5_VABI _ZNK9Inspector14FrontendRouter12hasFrontendsEv(); +int APS5_VABI _ZNK9Inspector14FrontendRouter12sendResponseERKN3WTF6StringE(); +int APS5_VABI _ZNK9Inspector14FrontendRouter13frontendCountEv(); +int APS5_VABI _ZNK9Inspector14FrontendRouter16hasLocalFrontendEv(); +int APS5_VABI _ZNK9Inspector14FrontendRouter17hasRemoteFrontendEv(); +int APS5_VABI _ZNK9Inspector14FrontendRouter9sendEventERKN3WTF6StringE(); +int APS5_VABI _ZNK9Inspector14InjectedScript10wrapObjectEN3JSC7JSValueERKN3WTF6StringEb(); +int APS5_VABI _ZNK9Inspector14InjectedScript12previewValueEN3JSC7JSValueE(); +int APS5_VABI _ZNK9Inspector14InjectedScript14findObjectByIdERKN3WTF6StringE(); +int APS5_VABI _ZNK9Inspector14InjectedScript14wrapCallFramesEN3JSC7JSValueE(); +int APS5_VABI _ZNK9Inspector14InjectedScript14wrapJSONStringERKN3WTF6StringES4_b(); +int APS5_VABI _ZNK9Inspector14InjectedScript9wrapTableEN3JSC7JSValueES2_(); +int APS5_VABI _ZNK9Inspector15AsyncStackTrace20buildInspectorObjectEv(); +int APS5_VABI _ZNK9Inspector15AsyncStackTrace8isLockedEv(); +int APS5_VABI _ZNK9Inspector15AsyncStackTrace9isPendingEv(); +int APS5_VABI _ZNK9Inspector15InspectorTarget13isProvisionalEv(); +int APS5_VABI _ZNK9Inspector15InspectorTarget8isPausedEv(); +int APS5_VABI _ZNK9Inspector15RemoteInspector16listingForTargetERKNS_24RemoteControllableTargetE(); +int APS5_VABI _ZNK9Inspector15RemoteInspector21hasActiveDebugSessionEv(); +int APS5_VABI _ZNK9Inspector15RemoteInspector26listingForInspectionTargetERKNS_22RemoteInspectionTargetE(); +int APS5_VABI _ZNK9Inspector15RemoteInspector6Client11browserNameEv(); +int APS5_VABI _ZNK9Inspector15RemoteInspector6Client14browserVersionEv(); +int APS5_VABI _ZNK9Inspector15RemoteInspector6clientEv(); +int APS5_VABI _ZNK9Inspector15RemoteInspector7enabledEv(); +int APS5_VABI _ZNK9Inspector15ScriptArguments10argumentAtEm(); +int APS5_VABI _ZNK9Inspector15ScriptArguments12globalObjectEv(); +int APS5_VABI _ZNK9Inspector15ScriptArguments13argumentCountEv(); +int APS5_VABI _ZNK9Inspector15ScriptArguments24getFirstArgumentAsStringERN3WTF6StringE(); +int APS5_VABI _ZNK9Inspector15ScriptArguments7isEqualERKS0_(); +int APS5_VABI _ZNK9Inspector15ScriptCallFrame10lineNumberEv(); +int APS5_VABI _ZNK9Inspector15ScriptCallFrame12columnNumberEv(); +int APS5_VABI _ZNK9Inspector15ScriptCallFrame12functionNameEv(); +int APS5_VABI _ZNK9Inspector15ScriptCallFrame20buildInspectorObjectEv(); +int APS5_VABI _ZNK9Inspector15ScriptCallFrame7isEqualERKS0_(); +int APS5_VABI _ZNK9Inspector15ScriptCallFrame8isNativeEv(); +int APS5_VABI _ZNK9Inspector15ScriptCallFrame8sourceIDEv(); +int APS5_VABI _ZNK9Inspector15ScriptCallFrame9sourceURLEv(); +int APS5_VABI _ZNK9Inspector15ScriptCallFrameeqERKS0_(); +int APS5_VABI _ZNK9Inspector15ScriptCallStack19buildInspectorArrayEv(); +int APS5_VABI _ZNK9Inspector15ScriptCallStack23firstNonNativeCallFrameEv(); +int APS5_VABI _ZNK9Inspector15ScriptCallStack2atEm(); +int APS5_VABI _ZNK9Inspector15ScriptCallStack4sizeEv(); +int APS5_VABI _ZNK9Inspector15ScriptCallStack7isEqualEPS0_(); +int APS5_VABI _ZNK9Inspector17BackendDispatcher12CallbackBase8isActiveEv(); +int APS5_VABI _ZNK9Inspector17BackendDispatcher17hasProtocolErrorsEv(); +int APS5_VABI _ZNK9Inspector17BackendDispatcher8isActiveEv(); +int APS5_VABI _ZNK9Inspector18InjectedScriptBase10hasNoValueEv(); +int APS5_VABI _ZNK9Inspector18InjectedScriptBase12globalObjectEv(); +int APS5_VABI _ZNK9Inspector18InjectedScriptBase20injectedScriptObjectEv(); +int APS5_VABI _ZNK9Inspector18InjectedScriptBase20inspectorEnvironmentEv(); +int APS5_VABI _ZNK9Inspector18InjectedScriptBase31hasAccessToInspectedScriptStateEv(); +int APS5_VABI _ZNK9Inspector18InjectedScriptBase4nameEv(); +int APS5_VABI _ZNK9Inspector19InspectorAuditAgent14hasActiveAuditEv(); +int APS5_VABI _ZNK9Inspector20InspectorTargetAgent14connectionTypeEv(); +int APS5_VABI _ZNK9Inspector21InjectedScriptManager20inspectorEnvironmentEv(); +int APS5_VABI _ZNK9Inspector21InspectorConsoleAgent22developerExtrasEnabledEv(); +int APS5_VABI _ZNK9Inspector21InspectorConsoleAgent7enabledEv(); +int APS5_VABI _ZNK9Inspector22InspectorDebuggerAgent17breakpointsActiveEv(); +int APS5_VABI _ZNK9Inspector22InspectorDebuggerAgent17shouldBlackboxURLERKN3WTF6StringE(); +int APS5_VABI _ZNK9Inspector22InspectorDebuggerAgent21injectedScriptManagerEv(); +int APS5_VABI _ZNK9Inspector22InspectorDebuggerAgent27pauseOnNextStatementEnabledEv(); +int APS5_VABI _ZNK9Inspector22InspectorDebuggerAgent7enabledEv(); +int APS5_VABI _ZNK9Inspector22InspectorDebuggerAgent8isPausedEv(); +int APS5_VABI _ZNK9Inspector22RemoteAutomationTarget4typeEv(); +int APS5_VABI _ZNK9Inspector22RemoteAutomationTarget8isPairedEv(); +int APS5_VABI _ZNK9Inspector22RemoteInspectionTarget20remoteControlAllowedEv(); +int APS5_VABI _ZNK9Inspector22RemoteInspectionTarget26automaticInspectionAllowedEv(); +int APS5_VABI _ZNK9Inspector22RemoteInspectionTarget3urlEv(); +int APS5_VABI _ZNK9Inspector22RemoteInspectionTarget4nameEv(); +int APS5_VABI _ZNK9Inspector24RemoteControllableTarget16targetIdentifierEv(); +int APS5_VABI _ZNK9Inspector28InspectorScriptProfilerAgent18isAlreadyProfilingEv(); +int APS5_VABI _ZNKR3WTF6String12isolatedCopyEv(); +int APS5_VABI _ZNO3WTF6String12isolatedCopyEv(); +int APS5_VABI _ZThn112_N7WebCore18HTMLMarqueeElement4stopEv(); +int APS5_VABI _ZThn112_NK7WebCore16HTMLInputElement17validationMessageEv(); +int APS5_VABI _ZThn136_N7WebCore16HTMLMediaElement12endScrubbingEv(); +int APS5_VABI _ZThn136_N7WebCore16HTMLMediaElement14beginScrubbingEv(); +int APS5_VABI _ZThn136_N7WebCore16HTMLMediaElement14setCurrentTimeEd(); +int APS5_VABI _ZThn136_N7WebCore16HTMLMediaElement15enterFullscreenEv(); +int APS5_VABI _ZThn136_N7WebCore16HTMLMediaElement16returnToRealtimeEv(); +int APS5_VABI _ZThn136_N7WebCore16HTMLMediaElement4playEv(); +int APS5_VABI _ZThn136_N7WebCore16HTMLMediaElement5pauseEv(); +int APS5_VABI _ZThn136_N7WebCore16HTMLMediaElement8setMutedEb(); +int APS5_VABI _ZThn136_N7WebCore16HTMLMediaElement9setVolumeEd(); +int APS5_VABI _ZThn136_NK7WebCore16HTMLMediaElement11currentTimeEv(); +int APS5_VABI _ZThn136_NK7WebCore16HTMLMediaElement12isFullscreenEv(); +int APS5_VABI _ZThn136_NK7WebCore16HTMLMediaElement12playbackRateEv(); +int APS5_VABI _ZThn136_NK7WebCore16HTMLMediaElement5mutedEv(); +int APS5_VABI _ZThn136_NK7WebCore16HTMLMediaElement6pausedEv(); +int APS5_VABI _ZThn136_NK7WebCore16HTMLMediaElement6volumeEv(); +int APS5_VABI _ZThn136_NK7WebCore16HTMLMediaElement7canPlayEv(); +int APS5_VABI _ZThn136_NK7WebCore16HTMLMediaElement8durationEv(); +int APS5_VABI _ZThn16_N9Inspector14InspectorAgentD0Ev(); +int APS5_VABI _ZThn16_N9Inspector14InspectorAgentD1Ev(); +int APS5_VABI _ZThn16_N9Inspector18InspectorHeapAgentD0Ev(); +int APS5_VABI _ZThn16_N9Inspector18InspectorHeapAgentD1Ev(); +int APS5_VABI _ZThn16_N9Inspector19InspectorAuditAgentD0Ev(); +int APS5_VABI _ZThn16_N9Inspector20InspectorTargetAgentD0Ev(); +int APS5_VABI _ZThn16_N9Inspector20InspectorTargetAgentD1Ev(); +int APS5_VABI _ZThn16_N9Inspector21InspectorConsoleAgentD0Ev(); +int APS5_VABI _ZThn16_N9Inspector21InspectorConsoleAgentD1Ev(); +int APS5_VABI _ZThn16_N9Inspector21InspectorRuntimeAgentD0Ev(); +int APS5_VABI _ZThn16_N9Inspector21InspectorRuntimeAgentD1Ev(); +int APS5_VABI _ZThn16_N9Inspector22InspectorDebuggerAgentD0Ev(); +int APS5_VABI _ZThn16_N9Inspector22InspectorDebuggerAgentD1Ev(); +int APS5_VABI _ZThn16_N9Inspector28InspectorScriptProfilerAgentD0Ev(); +int APS5_VABI _ZThn16_N9Inspector28InspectorScriptProfilerAgentD1Ev(); +int APS5_VABI _ZThn24_N7WebCore14DocumentLoader17addConsoleMessageEN3JSC13MessageSourceENS1_12MessageLevelERKN3WTF6StringEm(); +int APS5_VABI _ZThn24_N7WebCore14DocumentLoaderD0Ev(); +int APS5_VABI _ZThn24_N7WebCore14DocumentLoaderD1Ev(); +int APS5_VABI _ZThn24_N7WebCore19MediaResourceLoaderD0Ev(); +int APS5_VABI _ZThn24_N7WebCore19MediaResourceLoaderD1Ev(); +int APS5_VABI _ZThn24_N9Inspector18InspectorHeapAgent17didGarbageCollectEN3JSC15CollectionScopeE(); +int APS5_VABI _ZThn24_N9Inspector18InspectorHeapAgent18willGarbageCollectEv(); +int APS5_VABI _ZThn24_N9Inspector18InspectorHeapAgentD1Ev(); +int APS5_VABI _ZThn24_N9Inspector22InspectorDebuggerAgentD0Ev(); +int APS5_VABI _ZThn24_N9Inspector22InspectorDebuggerAgentD1Ev(); +int APS5_VABI _ZThn24_N9Inspector28InspectorScriptProfilerAgent17didEvaluateScriptEN3WTF7SecondsEN3JSC15ProfilingReasonE(); +int APS5_VABI _ZThn24_N9Inspector28InspectorScriptProfilerAgent18willEvaluateScriptEv(); +int APS5_VABI _ZThn24_N9Inspector28InspectorScriptProfilerAgentD0Ev(); +int APS5_VABI _ZThn24_N9Inspector28InspectorScriptProfilerAgentD1Ev(); +int APS5_VABI _ZThn24_NK9Inspector28InspectorScriptProfilerAgent18isAlreadyProfilingEv(); +int APS5_VABI _ZThn32_N7WebCore14DocumentLoader14notifyFinishedERNS_14CachedResourceERKNS_18NetworkLoadMetricsE(); +int APS5_VABI _ZThn32_N7WebCore14DocumentLoader16redirectReceivedERNS_14CachedResourceEONS_15ResourceRequestERKNS_16ResourceResponseEON3WTF17CompletionHandlerIFvS4_EEE(); +int APS5_VABI _ZThn32_N7WebCore14DocumentLoader16responseReceivedERNS_14CachedResourceERKNS_16ResourceResponseEON3WTF17CompletionHandlerIFvvEEE(); +int APS5_VABI _ZThn32_N7WebCore14DocumentLoaderD0Ev(); +int APS5_VABI _ZThn32_N7WebCore14DocumentLoaderD1Ev(); +int APS5_VABI _ZThn32_N7WebCore14XMLHttpRequestD0Ev(); +int APS5_VABI _ZThn32_N7WebCore14XMLHttpRequestD1Ev(); +int APS5_VABI _ZThn40_N7WebCore8DOMTimerD0Ev(); +int APS5_VABI _ZThn40_N7WebCore8DOMTimerD1Ev(); +int APS5_VABI _ZThn64_N7WebCore10ScrollView15setScrollOffsetERKNS_8IntPointE(); +int APS5_VABI _ZThn64_NK7WebCore10ScrollView12contentsSizeEv(); +int APS5_VABI libSceNKWebKitUnknown__plus_H5DiAmt0Wg_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown__plus_dfBTQ1j6Js_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown__plus_iT2E6TqDRA_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown__plus_jMtDhtTFk4_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown__plus_lO_plus_dHJcs8s_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown__plus_ngYlUyHe4E_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown__plus_obB7JQzFPQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown__plus_pjCBeSm_plus_Mo_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown__minus_f9D0krLNVY_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown__minus_iWQeHsj1dE_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_0bXmnUq4gwI_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_0huQF0dbE0o_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_0mmhAX7HkfE_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_10YPt3GqbxY_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_19_minus_F55ZVpzU_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_1Xyu2Y_plus_DRxk_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_1txZExqLvYw_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_1u18UyZ7bHY_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_24IjD9uyTSU_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_2F_minus_oNXA1MXc_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_2FxExcQ9PYE_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_2rJ8CmSDM5o_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_2sfEbx4JS38_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_3Oj6rYJvl7s_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_3bBJrqsgl1U_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_3qBM_plus_viOLME_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_4zR_minus_a4gyEvc_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_52A38mxHq6w_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_5vUkf_minus_djbu4_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_5xmf8qd0G3k_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_62Yoy7tQOL0_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_66IkT_plus_JzKhw_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_6tgXhVYoYlY_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_6vb9oUDGcQo_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_7_plus_n3DMXSzSE_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_7E9sTJnkGUA_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_7ECLZAHhILg_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_7o1fdnbBqO8_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_93nt7EIfhlE_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_97tJ0PznsuU_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_9GZlzGiHmiI_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_9L1qYllxgbc_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_9TW5grDg3v0_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_9cP_plus_chWmYl8_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_A_minus_SF0B_minus_Wgzk_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_AiYZXV2DRdQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_Ar4Na2HZO8g_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_B4M_minus_2hTd0W4_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_BGTXdn5vfxg_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_BhG0O6haZXQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_Br_minus_D2BUR_minus_Iw_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_Bxf0zoi3GY4_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_C_plus_MZtiNSLBs_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_C8SexpcEgQ4_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_CGvkW2Az0X4_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_CP_plus_qopfXoYQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_CQ_plus_q4JsAm_minus_w_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_CgfCLhQfJLQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_D0QOURyc7aQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_D3wxDn5e0xg_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_DCWpYGMshdw_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_DN41lb55zW4_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_DT0eiz4BN20_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_DgtgDTeMzF8_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_DkwdxsYZRYQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_E8ePwwwNRsQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_EgPhZKt_minus_1lQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_EiSQq9E9PtE_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_EoSAdnIx72g_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_ErgQM8_plus__plus_hcc_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_FG4XeXSkFqY_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_FN_minus_0fRyWoqM_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_FVC6kJsyKJY_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_FYDuVX3thgU_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_GI9q6I2Qeos_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_GLBjWBPNUQ8_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_Gjr9DWbY1bQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_GmRdv8ApCm4_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_GzDzGfYhw0I_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_Himr5mdF6Bw_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_HlAUGg263Vg_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_Hx6YjhwHCiM_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_I21gB8IitFM_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_I4M3ZZ1zZwA_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_I9zB3lkeKUY_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_IKozz2ee2QI_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_IbWVb5T_minus_4sg_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_InD3pJjwRIg_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_IryOBuDL8AA_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_IvZO_plus_CDouSY_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_JFp1Q4L92AQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_JG6Capn3giE_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_JnoPIZMkoPw_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_K7nvR_plus_Og0IE_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_KF_minus_xR65HsDM_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_KQopY6r3_minus_WI_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_KfHDmVh2QZs_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_KwQfk41GCp4_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_KxSMJdyXAxs_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_Lkwzsov_plus_QQA_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_M_plus_laxFpMQ3U_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_MC5MbWLEZ_plus_w_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_MCk9_plus_s_minus_Cubg_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_MFj9kn_minus_GNfU_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_MQ58Akv23e8_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_MXxNWED0LrM_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_MYg_minus_Fz6MYtw_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_MaTAqdYSJyU_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_Mslf2tqdBfU_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_N0i04lmGs4o_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_NcQfxPPgBPU_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_O_plus_V6Vy5G_minus_yA_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_OPBo8z7aVME_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_P4DTWOYuot0_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_PL1EHt_plus_qRcY_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_POLEsspzXmY_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_PRRF5Nmoaa4_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_PqqDSc9iQ3U_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_QTSb0ybillk_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_QUsmkyWDf6U_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_Qj6ArxlMxX4_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_ROMVKpYxnTg_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_Rm5k66YadKA_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_Rq9ndxzAB5I_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_Rt1kyGp7vvI_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_RyZ_plus_H8AVDrw_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_S8qb5wE_plus_Igg_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_T_minus_8QMcPvuMc_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_T7dBbW1f580_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_THqjfA0aAvA_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_Tc3t6jAA0os_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_U2f0i_minus_WrUkM_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_UF7HRHKcccs_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_UJtrfCZVn7k_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_Up3kMId_plus_acM_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_V_plus_MPxUiaORk_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_VGtnWbWhDhY_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_VJmxbf8istY_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_VeLInYDKa7A_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_W53m431Ss7s_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_WUsnAZlX1Dg_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_X2yLKCepV_minus_k_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_XixW5lX0CgU_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_YKete9tBjsY_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_YvcO2G5lKoQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_Z6atenHrfkE_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_ZXy6SJ2Riao_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_ZvAYTmLyhdI_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_aI7kkH5Z_minus_lI_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_aziZFf3SDqw_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_b2IK7rPPt8E_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_b3RFtTnv8Fg_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_blJN0lVQvZI_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_btUJuALscxA_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_budC85CToRw_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_c0N9i6oV7IM_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_cH_minus_aumPCdHM_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_cXEDVAQX3Fc_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_cgHFzzG_minus_vSI_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_cr2QQgRG6GM_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_d15ogzvwTrk_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_dK49_plus_WeN_minus_gk_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_dSgDlyiYnYY_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_dkGhdrkxhrs_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_eQjQ_plus_S3U2uk_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_eeMQkJtbsig_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_fB6zdl3zD6E_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_fBfcr_plus_qmDEo_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_fCvXNSyUEuE_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_gAnW2Yr6n0g_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_gTdmADaMRe0_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_gujdrhsDcMs_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_h_minus_e3_minus_Qg2Ono_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_h6sZ3gbVGX8_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_hEGmhPYapBY_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_hFNrqlvAkXc_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_hTGCEc48Zj4_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_iKRrgYVp6S0_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_iNYe3UoflbY_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_iSdZVLoB2kE_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_ilXDl9dNrrM_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_irUfhteXKrA_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_iwgB7OzeXUo_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_jQ4nDAtS_minus_PM_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_jjK6N_plus_E8_plus_Cg_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_kNTNOi2_minus_U7o_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_kOvGLeFNGdc_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_kaCNhe3QpYg_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_kvu7hliEMys_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_kz6X0pS4SG8_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_l9srnyCetFE_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_leK1TrejUUw_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_llM_minus_dpRB7Mw_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_m1XFXFjVpNw_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_mFaisQfUAAg_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_mOoh3Od4g3Q_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_mT506d_plus_sCAQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_nP556DHyidA_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_nhq2F3w9E2I_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_oMuplmK3nAU_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_oc6iPxX9C_plus_c_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_p1i6MDRD28k_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_p8Ut5oFbuxM_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_pBix1_minus_RkB9A_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_pHIzm0yagek_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_pM6ykA_plus_YtCk_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_pQIRD5SWwj4_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_pWefH_minus_dpMBA_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_pXakmlfsmRk_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_pr1UlGaL88w_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_q3BuDxwPFHU_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_r_minus_zAYe_plus_5gog_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_r24cilB09mA_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_rmA5tn4jLdQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_s9wqBPkorek_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_sAg_plus_FMnYByg_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_seSrrrKdnHw_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_t3DFHfo_minus_p_plus_Y_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_t4n17VBUIls_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_tTZjpnAVThM_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_tf8dixrssQ0_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_thYkFBIuGH4_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_u3kBISGMpIQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_ucyMIuaVk5s_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_uelAYhLRe_minus_w_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_urEMhc69pFU_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_vNFtHXo1Ed4_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_vfJ_minus_ijvltjg_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_vluz6M8UkvM_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_wBCHSy0aDjI_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_wsVwohWrtTs_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_wtMtCOBdzgk_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_x_minus_YR8cjXcBA_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_xQDhxDsfSjE_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_xhsbzHioskg_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_xsj_plus_huJK6VQ_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_y5leGuMayQk_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_yoIiwgv1oCk_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_yq6071CQAqo_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_ysn78y77zN0_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_zdn8pgeNnEY_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_ziXF7YQDRhY_nid_no_patch(); +int APS5_VABI libSceNKWebKitUnknown_zpeJoENXwDY_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceNKWebKit/include/JscExports.hpp b/core/libs/prx/libSceNKWebKit/include/JscExports.hpp new file mode 100644 index 000000000000..625cb18b6fbd --- /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 000000000000..936070e26804 --- /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 000000000000..48cf75cbdd86 --- /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 000000000000..4750c0539d1f --- /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 000000000000..9721d392e967 --- /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 000000000000..000dd5a287ce --- /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 f291edcd57aa..2f12efa55771 100644 --- a/core/libs/prx/libSceNKWebKit/libSceNKWebKit.hpp +++ b/core/libs/prx/libSceNKWebKit/libSceNKWebKit.hpp @@ -1,3 +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 000000000000..c7260bb381a8 --- /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 000000000000..36743be4305d --- /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 000000000000..7a61bcd9d832 --- /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 000000000000..b447064e3be1 --- /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 000000000000..dd9ea1145caa --- /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 000000000000..4620f0422755 --- /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 000000000000..f293adf0bfe2 --- /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 000000000000..50f025336b2f --- /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 000000000000..f662a7b9236e --- /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 000000000000..e0b8349cbcc9 --- /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 000000000000..432d078ef5ec --- /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 000000000000..ea48cabbd83f --- /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 000000000000..d2975f8fd4a2 --- /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 000000000000..77e2db18b108 --- /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 000000000000..aa6287285bfd --- /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 000000000000..73df9a3f57bf --- /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 000000000000..3b85019460b6 --- /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 000000000000..ae4b51aebadc --- /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 000000000000..ec906aa2b536 --- /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 000000000000..9765a9761673 --- /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 000000000000..5ceed12d1957 --- /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 000000000000..e0421e801a84 --- /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 000000000000..8c5561292a19 --- /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 000000000000..e9352ef83aa0 --- /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 000000000000..7f9c5f0128b8 --- /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 000000000000..7fcecfe6d034 --- /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 000000000000..17f3535704e6 --- /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 000000000000..1301eb3469ae --- /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 000000000000..6f01c9f8122b --- /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 000000000000..15ae844f6508 --- /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 000000000000..2fdb9cb2acdc --- /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 000000000000..b8ca95990316 --- /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 000000000000..5477bcb8a172 --- /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 000000000000..e30ceb853e82 --- /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 000000000000..aefe75504d83 --- /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 000000000000..58148f199477 --- /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 000000000000..e8100eb27ce3 --- /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 000000000000..2c342a8cf212 --- /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 000000000000..05c4193369a9 --- /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 000000000000..4daa6e0f6e0a --- /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 000000000000..132273a9febe --- /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 000000000000..2eda5c91bc67 --- /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 000000000000..c49ac2a26a37 --- /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 000000000000..208695f34553 --- /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 000000000000..21fc02db16ae --- /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 000000000000..72b70c720891 --- /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 000000000000..1f4bdc17e651 --- /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 000000000000..c994a003340f --- /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 000000000000..35d00eb60217 --- /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 000000000000..1dc2ab9b41a6 --- /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 000000000000..8d8c8043fcb7 --- /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 000000000000..d632923f295b --- /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 000000000000..aa2d65520c8d --- /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 000000000000..03d0d4aa1b1e --- /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 000000000000..5767504b9007 --- /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 000000000000..5d0ac3dcb9f7 --- /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 d81f4a5e32c4..94923081f54c 100644 --- a/core/libs/prx/libSceNKWebKitRequirements/Export.cpp +++ b/core/libs/prx/libSceNKWebKitRequirements/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceNKWebKitRequirements/include/InventoryExports.hpp" #include #include #include "SceTypes.hpp" @@ -5,6 +7,834 @@ extern "C" { -APS5_DUMMY_FUN + +int APS5_VABI sceNKWebKitRequirementsUnknown_K4M0IhFb88Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("K4M0IhFb88Q", sceNKWebKitRequirementsUnknown_K4M0IhFb88Q_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_sPU6b2LaPqg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sPU6b2LaPqg", sceNKWebKitRequirementsUnknown_sPU6b2LaPqg_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_gnWUEMlAxZY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gnWUEMlAxZY", sceNKWebKitRequirementsUnknown_gnWUEMlAxZY_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_VCIAd_nrADw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VCIAd+nrADw", sceNKWebKitRequirementsUnknown_VCIAd_nrADw_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_Z0pL_Tae6N4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Z0pL-Tae6N4", sceNKWebKitRequirementsUnknown_Z0pL_Tae6N4_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_fKk7unahoVM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fKk7unahoVM", sceNKWebKitRequirementsUnknown_fKk7unahoVM_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_mhD00YrjSbg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mhD00YrjSbg", sceNKWebKitRequirementsUnknown_mhD00YrjSbg_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_dbDvWQUel6A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dbDvWQUel6A", sceNKWebKitRequirementsUnknown_dbDvWQUel6A_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_XVx6JyC0Mv4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XVx6JyC0Mv4", sceNKWebKitRequirementsUnknown_XVx6JyC0Mv4_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_MM_aVBE7p_A_nid_no_patch() { + 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() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sUO777nQSTQ", sceNKWebKitRequirementsUnknown_sUO777nQSTQ_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_RZdBACKeudU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RZdBACKeudU", sceNKWebKitRequirementsUnknown_RZdBACKeudU_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_TPplvBxaj8w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TPplvBxaj8w", sceNKWebKitRequirementsUnknown_TPplvBxaj8w_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_4QrIS2z8_EI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4QrIS2z8+EI", sceNKWebKitRequirementsUnknown_4QrIS2z8_EI_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_VXRQVSn69Ow_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VXRQVSn69Ow", sceNKWebKitRequirementsUnknown_VXRQVSn69Ow_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_z_M1pu_ssOM_nid_no_patch() { + 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() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("h6fqSoAmmFQ", sceNKWebKitRequirementsUnknown_h6fqSoAmmFQ_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_fUEoU29MwzA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fUEoU29MwzA", sceNKWebKitRequirementsUnknown_fUEoU29MwzA_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_hijfwtuVJT4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hijfwtuVJT4", sceNKWebKitRequirementsUnknown_hijfwtuVJT4_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_i3EU0fCS8j8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("i3EU0fCS8j8", sceNKWebKitRequirementsUnknown_i3EU0fCS8j8_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_t0W8_TBYlXc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("t0W8-TBYlXc", sceNKWebKitRequirementsUnknown_t0W8_TBYlXc_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_wrb3I3Ze1C8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wrb3I3Ze1C8", sceNKWebKitRequirementsUnknown_wrb3I3Ze1C8_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_MhdUhQtAIYk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MhdUhQtAIYk", sceNKWebKitRequirementsUnknown_MhdUhQtAIYk_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_APAcjNNVeDQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("APAcjNNVeDQ", sceNKWebKitRequirementsUnknown_APAcjNNVeDQ_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_kgLz9IuqGvA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kgLz9IuqGvA", sceNKWebKitRequirementsUnknown_kgLz9IuqGvA_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_Atq_9b5btSU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Atq+9b5btSU", sceNKWebKitRequirementsUnknown_Atq_9b5btSU_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_vYQLyTYE6nw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vYQLyTYE6nw", sceNKWebKitRequirementsUnknown_vYQLyTYE6nw_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_xNxRXaItFE0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xNxRXaItFE0", sceNKWebKitRequirementsUnknown_xNxRXaItFE0_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_bEQToAEGGxQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("bEQToAEGGxQ", sceNKWebKitRequirementsUnknown_bEQToAEGGxQ_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown__yNC7DPGH2g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+yNC7DPGH2g", sceNKWebKitRequirementsUnknown__yNC7DPGH2g_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_pHt_cpjRGfI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pHt-cpjRGfI", sceNKWebKitRequirementsUnknown_pHt_cpjRGfI_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_dbR9oqRLeH8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("dbR9oqRLeH8", sceNKWebKitRequirementsUnknown_dbR9oqRLeH8_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_pbUudIEKcm8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pbUudIEKcm8", sceNKWebKitRequirementsUnknown_pbUudIEKcm8_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown__gJRMHTKjwI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-gJRMHTKjwI", sceNKWebKitRequirementsUnknown__gJRMHTKjwI_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_vcDMMUBBG_g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vcDMMUBBG+g", sceNKWebKitRequirementsUnknown_vcDMMUBBG_g_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_h_wtQ0Jvjh4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("h+wtQ0Jvjh4", sceNKWebKitRequirementsUnknown_h_wtQ0Jvjh4_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_f79Y3ZlfBQk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("f79Y3ZlfBQk", sceNKWebKitRequirementsUnknown_f79Y3ZlfBQk_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_IwmVVM5dPhM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IwmVVM5dPhM", sceNKWebKitRequirementsUnknown_IwmVVM5dPhM_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_fqBbFOBcJHU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fqBbFOBcJHU", sceNKWebKitRequirementsUnknown_fqBbFOBcJHU_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_toXPpb5jhhk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("toXPpb5jhhk", sceNKWebKitRequirementsUnknown_toXPpb5jhhk_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_PGLtQ31bblg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PGLtQ31bblg", sceNKWebKitRequirementsUnknown_PGLtQ31bblg_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_rymOrz6HZAs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rymOrz6HZAs", sceNKWebKitRequirementsUnknown_rymOrz6HZAs_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_H5kLCyRw33Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("H5kLCyRw33Y", sceNKWebKitRequirementsUnknown_H5kLCyRw33Y_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_QLufrpMhxjM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QLufrpMhxjM", sceNKWebKitRequirementsUnknown_QLufrpMhxjM_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_RguMBf_bBTc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RguMBf+bBTc", sceNKWebKitRequirementsUnknown_RguMBf_bBTc_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown__ZY_4CCqv7Y_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-ZY+4CCqv7Y", sceNKWebKitRequirementsUnknown__ZY_4CCqv7Y_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_Vy6tew6SeVU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Vy6tew6SeVU", sceNKWebKitRequirementsUnknown_Vy6tew6SeVU_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_YW0nCl9fJK0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("YW0nCl9fJK0", sceNKWebKitRequirementsUnknown_YW0nCl9fJK0_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_JvvQKXNn0HQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JvvQKXNn0HQ", sceNKWebKitRequirementsUnknown_JvvQKXNn0HQ_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_etHgBXWnWn8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("etHgBXWnWn8", sceNKWebKitRequirementsUnknown_etHgBXWnWn8_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_7Wb0Jv2wCO0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7Wb0Jv2wCO0", sceNKWebKitRequirementsUnknown_7Wb0Jv2wCO0_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_I1J4AmgICLM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("I1J4AmgICLM", sceNKWebKitRequirementsUnknown_I1J4AmgICLM_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_qmDH4PGK8vQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qmDH4PGK8vQ", sceNKWebKitRequirementsUnknown_qmDH4PGK8vQ_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_92RMcC5IfeE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("92RMcC5IfeE", sceNKWebKitRequirementsUnknown_92RMcC5IfeE_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_XeIRR713LsI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XeIRR713LsI", sceNKWebKitRequirementsUnknown_XeIRR713LsI_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_wo6_V7jxzG0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wo6+V7jxzG0", sceNKWebKitRequirementsUnknown_wo6_V7jxzG0_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_LferlGyfxiw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LferlGyfxiw", sceNKWebKitRequirementsUnknown_LferlGyfxiw_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_cJl4lpQr_TA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cJl4lpQr+TA", sceNKWebKitRequirementsUnknown_cJl4lpQr_TA_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_L6QRY1pl3xc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("L6QRY1pl3xc", sceNKWebKitRequirementsUnknown_L6QRY1pl3xc_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_u38IZ8Z7qYY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("u38IZ8Z7qYY", sceNKWebKitRequirementsUnknown_u38IZ8Z7qYY_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_qfdBMD8tNKs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qfdBMD8tNKs", sceNKWebKitRequirementsUnknown_qfdBMD8tNKs_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_e9TbTZXq_w8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("e9TbTZXq-w8", sceNKWebKitRequirementsUnknown_e9TbTZXq_w8_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_NPzB4u7iNOw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NPzB4u7iNOw", sceNKWebKitRequirementsUnknown_NPzB4u7iNOw_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_Gk_8gCXwG_E_nid_no_patch() { + 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() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("AnQQM55IXDQ", sceNKWebKitRequirementsUnknown_AnQQM55IXDQ_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_PPOQBfvrMIQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PPOQBfvrMIQ", sceNKWebKitRequirementsUnknown_PPOQBfvrMIQ_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_5xDT5s6gCgg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5xDT5s6gCgg", sceNKWebKitRequirementsUnknown_5xDT5s6gCgg_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_iWYXKx6f2r4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iWYXKx6f2r4", sceNKWebKitRequirementsUnknown_iWYXKx6f2r4_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_0y370_q87ug_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0y370-q87ug", sceNKWebKitRequirementsUnknown_0y370_q87ug_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_c6OcNEPqsOE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("c6OcNEPqsOE", sceNKWebKitRequirementsUnknown_c6OcNEPqsOE_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_kxmCA67rtog_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kxmCA67rtog", sceNKWebKitRequirementsUnknown_kxmCA67rtog_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_WTOiJ2zqWjk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WTOiJ2zqWjk", sceNKWebKitRequirementsUnknown_WTOiJ2zqWjk_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_8y1Cv7BS6dg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8y1Cv7BS6dg", sceNKWebKitRequirementsUnknown_8y1Cv7BS6dg_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_G_Lq53FSulk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("G+Lq53FSulk", sceNKWebKitRequirementsUnknown_G_Lq53FSulk_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_V0N1qq7ikUc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("V0N1qq7ikUc", sceNKWebKitRequirementsUnknown_V0N1qq7ikUc_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_WOjpm4i__Y4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WOjpm4i--Y4", sceNKWebKitRequirementsUnknown_WOjpm4i__Y4_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_0_24WRoyyAg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0-24WRoyyAg", sceNKWebKitRequirementsUnknown_0_24WRoyyAg_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_lMGV4bOhOx8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lMGV4bOhOx8", sceNKWebKitRequirementsUnknown_lMGV4bOhOx8_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_O1Djg3YeTLU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("O1Djg3YeTLU", sceNKWebKitRequirementsUnknown_O1Djg3YeTLU_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_mkmgHfPc6_o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mkmgHfPc6+o", sceNKWebKitRequirementsUnknown_mkmgHfPc6_o_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_zsxq8S_s6og_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zsxq8S+s6og", sceNKWebKitRequirementsUnknown_zsxq8S_s6og_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_kLDgEC1CtLw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("kLDgEC1CtLw", sceNKWebKitRequirementsUnknown_kLDgEC1CtLw_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_RvvvsJ_ilks_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RvvvsJ-ilks", sceNKWebKitRequirementsUnknown_RvvvsJ_ilks_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_hMPqBxgdqd4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("hMPqBxgdqd4", sceNKWebKitRequirementsUnknown_hMPqBxgdqd4_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_q5V1eZmYXKo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("q5V1eZmYXKo", sceNKWebKitRequirementsUnknown_q5V1eZmYXKo_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_f7_5WlpEqp8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("f7-5WlpEqp8", sceNKWebKitRequirementsUnknown_f7_5WlpEqp8_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_0Uek9fMv9z4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0Uek9fMv9z4", sceNKWebKitRequirementsUnknown_0Uek9fMv9z4_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_gFXm4KsdCOg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gFXm4KsdCOg", sceNKWebKitRequirementsUnknown_gFXm4KsdCOg_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_0OeraXVXfzM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0OeraXVXfzM", sceNKWebKitRequirementsUnknown_0OeraXVXfzM_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_03w8Wi7eD_A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("03w8Wi7eD-A", sceNKWebKitRequirementsUnknown_03w8Wi7eD_A_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_ILCa64n_L8U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ILCa64n-L8U", sceNKWebKitRequirementsUnknown_ILCa64n_L8U_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_ovdabH7tKu0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ovdabH7tKu0", sceNKWebKitRequirementsUnknown_ovdabH7tKu0_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_9SRRU8yTt04_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9SRRU8yTt04", sceNKWebKitRequirementsUnknown_9SRRU8yTt04_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_EyvrFZ67_fo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EyvrFZ67-fo", sceNKWebKitRequirementsUnknown_EyvrFZ67_fo_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_qRLpm_alR90_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qRLpm-alR90", sceNKWebKitRequirementsUnknown_qRLpm_alR90_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_71eCBabjnWU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("71eCBabjnWU", sceNKWebKitRequirementsUnknown_71eCBabjnWU_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_LbstfuAwMhQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LbstfuAwMhQ", sceNKWebKitRequirementsUnknown_LbstfuAwMhQ_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_72wZB0MqDcg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("72wZB0MqDcg", sceNKWebKitRequirementsUnknown_72wZB0MqDcg_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_ROw6faazl58_nid_no_patch() { + 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__); +} +APS5_EXPORT("YFlXC+lRh0A", sceNKWebKitRequirementsUnknown_YFlXC_lRh0A_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_5i_J_lV6oNw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5i+J+lV6oNw", sceNKWebKitRequirementsUnknown_5i_J_lV6oNw_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_D9Yd1YkgPsI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("D9Yd1YkgPsI", sceNKWebKitRequirementsUnknown_D9Yd1YkgPsI_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_9DAe2g9wzX4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9DAe2g9wzX4", sceNKWebKitRequirementsUnknown_9DAe2g9wzX4_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_5X4b5KyyNp4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("5X4b5KyyNp4", sceNKWebKitRequirementsUnknown_5X4b5KyyNp4_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown__4JKB5YW3Bk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("+4JKB5YW3Bk", sceNKWebKitRequirementsUnknown__4JKB5YW3Bk_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_P6lAFGsZE9Q_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("P6lAFGsZE9Q", sceNKWebKitRequirementsUnknown_P6lAFGsZE9Q_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_DtKdjqIP18U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("DtKdjqIP18U", sceNKWebKitRequirementsUnknown_DtKdjqIP18U_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_Xntd0cTWi0o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Xntd0cTWi0o", sceNKWebKitRequirementsUnknown_Xntd0cTWi0o_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_mpUUmn9tbKs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("mpUUmn9tbKs", sceNKWebKitRequirementsUnknown_mpUUmn9tbKs_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_uVoRmKYYtcI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("uVoRmKYYtcI", sceNKWebKitRequirementsUnknown_uVoRmKYYtcI_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_HnfoQSPjI7o_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("HnfoQSPjI7o", sceNKWebKitRequirementsUnknown_HnfoQSPjI7o_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_sPxTZD_Xqdk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sPxTZD-Xqdk", sceNKWebKitRequirementsUnknown_sPxTZD_Xqdk_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_WMpTxKngZOg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WMpTxKngZOg", sceNKWebKitRequirementsUnknown_WMpTxKngZOg_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_jVg6F_8c6oo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jVg6F-8c6oo", sceNKWebKitRequirementsUnknown_jVg6F_8c6oo_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_pzl_F73sa6k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pzl-F73sa6k", sceNKWebKitRequirementsUnknown_pzl_F73sa6k_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_8hi6_rkfY2M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8hi6-rkfY2M", sceNKWebKitRequirementsUnknown_8hi6_rkfY2M_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_yB_1wOOpQIU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yB+1wOOpQIU", sceNKWebKitRequirementsUnknown_yB_1wOOpQIU_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_QtfzmrF_Gpc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QtfzmrF+Gpc", sceNKWebKitRequirementsUnknown_QtfzmrF_Gpc_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_O4uuDAmh9Jk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("O4uuDAmh9Jk", sceNKWebKitRequirementsUnknown_O4uuDAmh9Jk_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_2XNpG4ZDT4s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2XNpG4ZDT4s", sceNKWebKitRequirementsUnknown_2XNpG4ZDT4s_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_WR19W1gFzTc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("WR19W1gFzTc", sceNKWebKitRequirementsUnknown_WR19W1gFzTc_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_ks4vjG1O3Aw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ks4vjG1O3Aw", sceNKWebKitRequirementsUnknown_ks4vjG1O3Aw_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_GKOdtyJINIc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("GKOdtyJINIc", sceNKWebKitRequirementsUnknown_GKOdtyJINIc_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_IHQRMDrYqts_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IHQRMDrYqts", sceNKWebKitRequirementsUnknown_IHQRMDrYqts_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_3at8rFY_PRk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3at8rFY+PRk", sceNKWebKitRequirementsUnknown_3at8rFY_PRk_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_Hb45BVZ1WVQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Hb45BVZ1WVQ", sceNKWebKitRequirementsUnknown_Hb45BVZ1WVQ_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_1AYeyBFz_eM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1AYeyBFz+eM", sceNKWebKitRequirementsUnknown_1AYeyBFz_eM_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_Fj7T2VY7xg4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Fj7T2VY7xg4", sceNKWebKitRequirementsUnknown_Fj7T2VY7xg4_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_lCU9IGT_MN8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("lCU9IGT-MN8", sceNKWebKitRequirementsUnknown_lCU9IGT_MN8_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_0NzQg1z_fGM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0NzQg1z-fGM", sceNKWebKitRequirementsUnknown_0NzQg1z_fGM_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_IO92NEwJXT8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IO92NEwJXT8", sceNKWebKitRequirementsUnknown_IO92NEwJXT8_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_zuQqTYaKNl4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("zuQqTYaKNl4", sceNKWebKitRequirementsUnknown_zuQqTYaKNl4_nid_no_patch); + +int APS5_VABI sceNKWebKitRequirementsUnknown_Kzy7yDwocns_nid_no_patch() { + 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/InventoryExports.hpp b/core/libs/prx/libSceNKWebKitRequirements/include/InventoryExports.hpp new file mode 100644 index 000000000000..c681f38d1382 --- /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 6f70f09beec2..ddad13d6ed1b 100644 --- a/core/libs/prx/libSceNKWebKitRequirements/libSceNKWebKitRequirements.hpp +++ b/core/libs/prx/libSceNKWebKitRequirements/libSceNKWebKitRequirements.hpp @@ -1 +1,2 @@ #pragma once +#include "prx/libSceNKWebKitRequirements/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceNet/CMakeLists.txt b/core/libs/prx/libSceNet/CMakeLists.txt index 10ad0db42ad3..f5a380e27735 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 6feaf0d52481..fed529568f13 100644 --- a/core/libs/prx/libSceNet/Export.cpp +++ b/core/libs/prx/libSceNet/Export.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #endif @@ -742,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 000000000000..1285b54c5845 --- /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 86205fa855eb..78acb3553939 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 b82230ac78dc..fd2218367a99 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 000000000000..719c1743715d --- /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 d60a79d958fa..d6ff532a8618 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 6b41d07e4700..82f135f7b967 100644 --- a/core/libs/prx/libSceNgs2.native/include/Ngs2Types.hpp +++ b/core/libs/prx/libSceNgs2.native/include/Ngs2Types.hpp @@ -29,9 +29,12 @@ static constexpr int SCE_NGS2_ERROR_INVALID_PAN_MATRIX_FORMAT = static_cast static constexpr int SCE_NGS2_ERROR_INVALID_PAN_WORK = static_cast(0x804A8453); static constexpr int SCE_NGS2_ERROR_INVALID_PAN_PARAM = static_cast(0x804A8454); static constexpr int SCE_NGS2_ERROR_INVALID_VOICE_HANDLE = static_cast(0x804A8203); +static constexpr int SCE_NGS2_ERROR_PS4_INVALID_VOICE_HANDLE = static_cast(0x804A0300); +static constexpr int SCE_NGS2_ERROR_PS4_INVALID_STATE_SIZE = static_cast(0x804A0054); 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/Atrac9.cpp b/core/libs/prx/libSceNgs2.native/src/Atrac9.cpp index abdb3b9c4135..71c988fb9b8c 100644 --- a/core/libs/prx/libSceNgs2.native/src/Atrac9.cpp +++ b/core/libs/prx/libSceNgs2.native/src/Atrac9.cpp @@ -116,10 +116,21 @@ void Ngs2SetupAtrac9(Ngs2Voice& voice, const Ngs2WaveformFormat& format) { voice.atrac9.window.reserve(static_cast(info.frameSamples) * info.channels); } -std::size_t Ngs2Atrac9BlockBytes(const Ngs2Voice& voice, const Ngs2WaveformBlock& block) { +bool Ngs2Atrac9FrameInfo(const Ngs2WaveformFormat& format, Ngs2Atrac9Frame& frame) { + Atrac9CodecInfo info{}; + if (!MatchingCodecInfo(format, info)) return false; + frame = {static_cast(info.frameSamples), static_cast(info.framesInSuperframe), static_cast(info.superframeSize)}; + return true; +} + +std::size_t Ngs2Atrac9BlockBytes(const Ngs2Atrac9Frame& frame, const Ngs2WaveformBlock& block) { const std::uint64_t samples = static_cast(block.num_skip_samples) + block.num_samples; - const std::uint64_t superframeSamples = static_cast(voice.atrac9.frameSamples) * voice.atrac9.framesInSuperframe; - return static_cast((samples + superframeSamples - 1) / superframeSamples * voice.atrac9.superframeBytes); + const std::uint64_t superframeSamples = static_cast(frame.frameSamples) * frame.framesInSuperframe; + return static_cast((samples + superframeSamples - 1) / superframeSamples * frame.superframeBytes); +} + +std::size_t Ngs2Atrac9BlockBytes(const Ngs2Voice& voice, const Ngs2WaveformBlock& block) { + return Ngs2Atrac9BlockBytes(Ngs2Atrac9Frame{voice.atrac9.frameSamples, voice.atrac9.framesInSuperframe, voice.atrac9.superframeBytes}, block); } void Ngs2RestartAtrac9(Ngs2Voice& voice) { @@ -484,14 +495,13 @@ int APS5_VABI sceNgs2GetWaveformFrameInfo(const Ngs2WaveformFormat* format, uint if (format == nullptr || format->num_channels == 0 || format->num_channels > NGS2_MAX_CHANNELS || format->sample_rate == 0 || format->sample_rate > MAX_SAMPLE_RATE) { return SCE_NGS2_ERROR_INVALID_WAVEFORM_FORMAT; } - if (format->waveform_type == SCE_NGS2_WAVEFORM_TYPE_PCM_I16L) { - *out_frame_size = format->num_channels * sizeof(std::int16_t); + if (format->waveform_type != SCE_NGS2_WAVEFORM_TYPE_ATRAC9) { + *out_frame_size = static_cast(format->num_channels * Ngs2PcmSampleBytes(format->waveform_type)); *out_num_frame_samples = 1; *out_units_per_frame = 1; *out_num_delay_samples = 0; return SCE_NGS2_OK; } - if (format->waveform_type != SCE_NGS2_WAVEFORM_TYPE_ATRAC9) throw std::runtime_error("NGS2: the frame info of waveform type " + Ngs2Hex(format->waveform_type) + " is not implemented"); Atrac9CodecInfo codec{}; if (!MatchingCodecInfo(*format, codec)) return SCE_NGS2_ERROR_INVALID_WAVEFORM_FORMAT; *out_frame_size = static_cast(codec.superframeSize); diff --git a/core/libs/prx/libSceNgs2.native/src/Custom.cpp b/core/libs/prx/libSceNgs2.native/src/Custom.cpp index 14de7135ac1c..c1391acb0e72 100644 --- a/core/libs/prx/libSceNgs2.native/src/Custom.cpp +++ b/core/libs/prx/libSceNgs2.native/src/Custom.cpp @@ -213,7 +213,7 @@ void Ngs2ResetUserFx2(Ngs2Voice& voice) { static void SetupCustomSubmixer(Ngs2Voice& voice, const Ngs2CustomSubmixerVoiceSetupParam& setup) { if (setup.flags != 0) throw std::runtime_error("NGS2: custom submixer setup flags are not implemented"); if (setup.num_input_channels != setup.num_output_channels) throw std::runtime_error("NGS2: custom submixer channel conversion is not implemented"); - if (setup.num_input_channels == 0 || setup.num_input_channels > voice.rack->maxChannels) APS5_INVALID_ARG_EX; + if (setup.num_input_channels == 0 || setup.num_input_channels > voice.rack->maxChannels || setup.num_input_channels > NGS2_MAX_CHANNELS) APS5_INVALID_ARG_EX; if (Ngs2HasPitchShift(voice)) voice.ResetSetup(); else Ngs2ResetUserFx2(voice); for (auto& gain : voice.customGain) if (gain.configured) gain.lifecycleUnknown = true; @@ -404,7 +404,7 @@ void Ngs2ProcessUserFx(Ngs2Voice& voice, std::uint32_t grain, std::uint32_t samp void Ngs2ProcessLegacyUserFx(Ngs2Voice& voice, std::uint32_t grain, std::uint32_t sampleRate) { if (voice.userFxHandler == nullptr) return; - std::array channels{}; + std::array channels{}; for (std::uint32_t c = 0; c < voice.channels; ++c) channels[c] = voice.samples.data() + static_cast(c) * grain; Ngs2UserFxProcessContext context{channels.data(), voice.userFxData[0], voice.userFxData[1], voice.userFxData[2], voice.UserFxFlags(voice.userFxFlags), voice.channels, grain, sampleRate}; diff --git a/core/libs/prx/libSceNgs2.native/src/Ngs2Internal.hpp b/core/libs/prx/libSceNgs2.native/src/Ngs2Internal.hpp index 4a67db03a36f..d7d81928c6f0 100644 --- a/core/libs/prx/libSceNgs2.native/src/Ngs2Internal.hpp +++ b/core/libs/prx/libSceNgs2.native/src/Ngs2Internal.hpp @@ -18,6 +18,7 @@ #include "PitchShift.hpp" static constexpr std::uint32_t NGS2_MAX_CHANNELS = 8; +static constexpr std::uint32_t NGS2_MAX_RACK_CHANNELS = SCE_NGS2_CUSTOM_SUBMIXER_MAX_CHANNELS; static constexpr std::uint32_t MIN_GRAIN_SAMPLES = 64; struct Ngs2System; @@ -135,8 +136,21 @@ struct Ngs2UserFxControl { std::vector param; }; +struct Ngs2ParamControl { + std::vector param; + std::vector blocks; + bool destDestroyed = false; +}; + +struct Ngs2Atrac9Frame { + std::uint32_t frameSamples = 0; + std::uint32_t framesInSuperframe = 0; + std::uint32_t superframeBytes = 0; +}; + using Ngs2PendingControl = std::variant; + Ngs2MatrixControl, Ngs2SamplerVoicePitchParam, Ngs2MasteringVoiceGainParam, Ngs2CustomVoicePitchShiftParam, Ngs2SubmixerVoiceUserFxParam, Ngs2CustomVoiceUserFxParam, Ngs2UserFxControl, + Ngs2ParamControl>; struct Ngs2Voice { Ngs2Rack* rack = nullptr; @@ -163,6 +177,10 @@ struct Ngs2Voice { std::uint32_t samplerWritePosition = 0; std::deque blocks; bool acceptsBlocks = true; + alignas(std::atomic_ref::required_alignment) mutable std::uint32_t queuedBlocks = 0; + const std::uint8_t* queuedTailEnd = nullptr; + std::uintptr_t queuedTailUserData = 0; + bool decodePendingAtGrain = false; std::vector pendingControls; bool pendingPlay = false; std::thread::id controlOwner{}; @@ -325,6 +343,12 @@ int Ngs2ReleaseBuffer(const Ngs2BufferAllocator& allocator, Ngs2ContextBufferInf void Ngs2SetupAtrac9(Ngs2Voice& voice, const Ngs2WaveformFormat& format); void Ngs2SetFilter(Ngs2Voice& voice, const Ngs2SamplerVoiceFilterParam& param); std::size_t Ngs2Atrac9BlockBytes(const Ngs2Voice& voice, const Ngs2WaveformBlock& block); +std::size_t Ngs2Atrac9BlockBytes(const Ngs2Atrac9Frame& frame, const Ngs2WaveformBlock& block); +bool Ngs2Atrac9FrameInfo(const Ngs2WaveformFormat& format, Ngs2Atrac9Frame& frame); +void Ngs2PublishBlockCount(Ngs2Voice& voice); +void Ngs2PublishBlockQueue(Ngs2Voice& voice); +bool Ngs2DecodePending(const Ngs2Voice& voice); +void Ngs2DetachPendingPatches(Ngs2Voice& voice, const Ngs2Rack& rack); void Ngs2RestartAtrac9(Ngs2Voice& voice); bool Ngs2FinishBlock(Ngs2Voice& voice); void Ngs2BindSamplerBlock(Ngs2Voice& voice, bool restartDecoder); @@ -353,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 f59c436bc9be..e3ad5c7d2ed3 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/Rack.cpp b/core/libs/prx/libSceNgs2.native/src/Rack.cpp index 9e48df5ec831..60a74c96fc42 100644 --- a/core/libs/prx/libSceNgs2.native/src/Rack.cpp +++ b/core/libs/prx/libSceNgs2.native/src/Rack.cpp @@ -114,9 +114,9 @@ static int CheckedRackOption(std::uint32_t rackId, const Ngs2RackOption* option, if (rackId == SCE_NGS2_RACK_ID_CUSTOM_SUBMIXER || rackId == SCE_NGS2_RACK_ID_CUSTOM_MASTERING) result = Ngs2CheckCustomRack(rackId, options.customSubmixer.custom_rack_option, options.customSubmixer.max_inputs); if (result != SCE_NGS2_OK) return result; if (rackId == SCE_NGS2_RACK_ID_CUSTOM_SAMPLER && options.customSampler.max_waveform_blocks == 0) return static_cast(0x804A8053u); - if (maxChannels > NGS2_MAX_CHANNELS) { - if (rackId == SCE_NGS2_RACK_ID_CUSTOM_SUBMIXER || rackId == SCE_NGS2_RACK_ID_CUSTOM_MASTERING) { - throw std::runtime_error("NGS2: custom submixer racks with " + std::to_string(maxChannels) + " channels are not implemented"); + if (maxChannels > NGS2_MAX_CHANNELS && rackId != SCE_NGS2_RACK_ID_CUSTOM_SUBMIXER) { + if (rackId == SCE_NGS2_RACK_ID_CUSTOM_MASTERING) { + throw std::runtime_error("NGS2: custom mastering racks with " + std::to_string(maxChannels) + " channels are not implemented"); } throw std::invalid_argument("NGS2: invalid rack voice or channel count"); } @@ -220,6 +220,7 @@ int Ngs2DestroyRack(Ngs2Rack& rack, Ngs2ContextBufferInfo* outBufferInfo) { for (auto& port : voice.ports) { if (port.dest != nullptr && port.dest->rack == &rack) port.dest = nullptr; } + Ngs2DetachPendingPatches(voice, rack); } } rack.system = nullptr; diff --git a/core/libs/prx/libSceNgs2.native/src/Render.cpp b/core/libs/prx/libSceNgs2.native/src/Render.cpp index 8aa184d9db50..181b81fba086 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); @@ -61,6 +67,7 @@ bool Ngs2FinishBlock(Ngs2Voice& voice) { }; if (!repeat) { voice.blocks.pop_front(); + Ngs2PublishBlockCount(voice); Ngs2BindSamplerBlock(voice, true); } const auto revision = voice.waveformRevision; @@ -175,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}, @@ -187,13 +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) { - 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]; @@ -203,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) { @@ -453,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, @@ -462,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"); } @@ -478,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)); } } @@ -512,6 +622,7 @@ void Ngs2RenderSystem(Ngs2System& system, const Ngs2RenderBufferInfo* bufferInfo for (auto* rack : system.racks) { for (auto& voice : rack->voices) { voice.ApplyPendingControls(); + voice.decodePendingAtGrain = Ngs2DecodePending(voice); voice.rendered = false; Ngs2PublishSamplerState(voice); voices.push_back(&voice); @@ -534,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 ab3849fbddba..4946f8de9ae6 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/Sampler.cpp b/core/libs/prx/libSceNgs2.native/src/Sampler.cpp index c46837fe5cb9..a728230b2acd 100644 --- a/core/libs/prx/libSceNgs2.native/src/Sampler.cpp +++ b/core/libs/prx/libSceNgs2.native/src/Sampler.cpp @@ -58,6 +58,7 @@ void Ngs2ReplaySampler(Ngs2Voice& voice) { voice.waveformUserData = 0; if (voice.waveformType == SCE_NGS2_WAVEFORM_TYPE_ATRAC9) Ngs2RestartAtrac9(voice); Ngs2RestartSampler(voice); + Ngs2PublishBlockQueue(voice); } void Ngs2PrepareSampler(Ngs2Voice& voice) { diff --git a/core/libs/prx/libSceNgs2.native/src/System.cpp b/core/libs/prx/libSceNgs2.native/src/System.cpp index 89adb0d88296..b1141fa2fc73 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; @@ -466,7 +469,7 @@ int APS5_VABI sceNgs2SystemSetGrainSamples(uintptr_t system_handle, uint32_t num auto* system = Ngs2FindSystem(system_handle); if (system == nullptr) return SCE_NGS2_ERROR_INVALID_SYSTEM_HANDLE; if (system->jobsExecuting) throw std::runtime_error("NGS2: changing grain size from an active job handler is not implemented"); - if (num_samples == 0 || num_samples > system->option.max_grain_samples) return SCE_NGS2_ERROR_INVALID_NUM_GRAIN_SAMPLES; + if (!ValidGrainSamples(num_samples, system->option.max_grain_samples)) return SCE_NGS2_ERROR_INVALID_NUM_GRAIN_SAMPLES; system->option.num_grain_samples = num_samples; return SCE_NGS2_OK; } @@ -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 dacc3402715f..21e60462aa7e 100644 --- a/core/libs/prx/libSceNgs2.native/src/Voice.cpp +++ b/core/libs/prx/libSceNgs2.native/src/Voice.cpp @@ -16,11 +16,18 @@ 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; static constexpr float MAX_MATRIX_LEVEL = 4.0f; static constexpr float MAX_MASTERING_GAIN = 32.0f; +#ifdef APS5_NGS2_PS4_LIBRARY +static constexpr bool PS4_LIBRARY = true; +#else +static constexpr bool PS4_LIBRARY = false; +#endif struct Ngs2ReturnCode { int code; @@ -170,8 +177,10 @@ void Ngs2Voice::SetEvent(std::uint32_t eventId) { } } +static std::uint32_t PendingChannels(const Ngs2Voice& voice); + static void ValidateDeferredEvent(const Ngs2Voice& voice, std::uint32_t event) { - if (event == SCE_NGS2_VOICE_EVENT_PLAY && voice.channels == 0) throw Ngs2ReturnCode{SCE_NGS2_ERROR_INVALID_VOICE_ACCESS}; + if (event == SCE_NGS2_VOICE_EVENT_PLAY && PendingChannels(voice) == 0) throw Ngs2ReturnCode{SCE_NGS2_ERROR_INVALID_VOICE_ACCESS}; if (!voice.IsSampler() && !voice.IsMixer()) throw std::runtime_error("NGS2: deferred events for this voice configuration are not implemented"); switch (event) { case SCE_NGS2_VOICE_EVENT_PLAY: @@ -227,6 +236,7 @@ void Ngs2Voice::ResetSetup() { samplerReplayBlocks.clear(); samplerWritePosition = 0; acceptsBlocks = true; + Ngs2PublishBlockQueue(*this); decodedSamples = 0; decodedBytes = 0; waveformData = nullptr; @@ -258,7 +268,7 @@ static void SetMatrixLevels(Ngs2Voice& voice, std::uint32_t matrixId, const floa voice.matrices[matrixId].clear(); return; } - if (matrixId >= voice.matrices.size() || numLevels == 0 || numLevels > NGS2_MAX_CHANNELS * NGS2_MAX_CHANNELS || levels == nullptr) { + if (matrixId >= voice.matrices.size() || numLevels == 0 || numLevels > NGS2_MAX_RACK_CHANNELS * NGS2_MAX_RACK_CHANNELS || levels == nullptr) { APS5_INVALID_ARG_EX; } auto& matrix = voice.matrices[matrixId]; @@ -271,8 +281,213 @@ static void SetPortMatrix(Ngs2Voice& voice, std::uint32_t port, std::int32_t mat PortAt(voice, port).matrix = matrixId; } +static bool EmptySamplerFormat(const Ngs2WaveformFormat& format) { + return format.waveform_type == 0 && format.num_channels == 0 && format.sample_rate == 0; +} + +static void ValidateSamplerFormat(const Ngs2WaveformFormat& format) { + if (format.waveform_type != SCE_NGS2_WAVEFORM_TYPE_ATRAC9) Ngs2PcmSampleBytes(format.waveform_type); + if (format.waveform_type != SCE_NGS2_WAVEFORM_TYPE_PCM_I16L && format.waveform_type != SCE_NGS2_WAVEFORM_TYPE_ATRAC9 && format.config_data != 0) { + throw std::runtime_error("NGS2: configured PCM waveforms are not implemented"); + } + if (format.frame_offset != 0 || format.frame_margin != 0) throw std::runtime_error("NGS2: waveform frame offset and margin are not implemented"); + if (format.num_channels == 0 || format.num_channels > NGS2_MAX_CHANNELS || format.sample_rate == 0) APS5_INVALID_ARG_EX; + Ngs2Atrac9Frame frame; + if (format.waveform_type == SCE_NGS2_WAVEFORM_TYPE_ATRAC9 && !Ngs2Atrac9FrameInfo(format, frame)) { + throw std::invalid_argument("NGS2: the ATRAC9 config does not match the waveform format"); + } +} + +static void ValidateBlocks(std::uint32_t channels, const Ngs2SamplerVoiceWaveformBlocksParam& param) { + constexpr std::uint32_t knownFlags = SCE_NGS2_WAVEFORM_BLOCKS_FLAG_CONTINUE | SCE_NGS2_WAVEFORM_BLOCKS_FLAG_APPEND | SCE_NGS2_WAVEFORM_BLOCKS_FLAG_RESET | SCE_NGS2_WAVEFORM_BLOCKS_FLAG_SILENCE; + if ((param.flags & ~knownFlags) != 0) throw std::runtime_error("NGS2: waveform block flags " + Ngs2Hex(param.flags) + " are not implemented"); + if ((param.num_blocks != 0 && (channels == 0 || param.blocks == nullptr || param.data == nullptr)) || (channels == 0 && (param.flags & SCE_NGS2_WAVEFORM_BLOCKS_FLAG_APPEND) != 0)) APS5_INVALID_ARG_EX; +} + +struct Ngs2SamplerShape { + std::uint32_t channels; + std::uint32_t waveformType; + Ngs2Atrac9Frame frame; + std::size_t blocks; + bool accepts; + const std::uint8_t* end; + std::uintptr_t lastUserData; + bool decodePending; +}; + +static bool IsAddBlocks(const Ngs2Voice& voice, std::uint32_t id) { + return (id >> 16) == voice.rack->rackId && (id == SCE_NGS2_SAMPLER_VOICE_PARAM_ADD_WAVEFORM_BLOCKS || id == SCE_NGS2_CUSTOM_SAMPLER_VOICE_PARAM_ADD_WAVEFORM_BLOCKS); +} + +static bool IsSamplerSetup(const Ngs2Voice& voice, std::uint32_t id) { + return voice.IsSampler() && (id >> 16) == voice.rack->rackId && (id == SCE_NGS2_SAMPLER_VOICE_PARAM_SETUP || id == SCE_NGS2_CUSTOM_SAMPLER_VOICE_PARAM_SETUP); +} + +bool Ngs2DecodePending(const Ngs2Voice& voice) { + return voice.waveformType == SCE_NGS2_WAVEFORM_TYPE_ATRAC9 ? voice.atrac9.remainingSamples != 0 : voice.pcmRemaining != 0; +} + +void Ngs2PublishBlockCount(Ngs2Voice& voice) { + std::atomic_ref(voice.queuedBlocks).store(static_cast(voice.blocks.size()), std::memory_order_release); +} + +void Ngs2PublishBlockQueue(Ngs2Voice& voice) { + voice.queuedTailEnd = nullptr; + voice.queuedTailUserData = 0; + if (!voice.blocks.empty()) { + const auto& last = voice.blocks.back(); + voice.queuedTailEnd = last.data != nullptr ? last.data + last.info.data_size : nullptr; + voice.queuedTailUserData = last.info.user_data; + } + Ngs2PublishBlockCount(voice); +} + +static Ngs2SamplerShape CurrentShape(const Ngs2Voice& voice) { + const bool jobs = voice.rack->system != nullptr && voice.rack->system->jobsExecuting; + return {voice.channels, voice.waveformType, {voice.atrac9.frameSamples, voice.atrac9.framesInSuperframe, voice.atrac9.superframeBytes}, + std::atomic_ref(voice.queuedBlocks).load(std::memory_order_acquire), voice.acceptsBlocks, voice.queuedTailEnd, voice.queuedTailUserData, + jobs ? voice.decodePendingAtGrain : Ngs2DecodePending(voice)}; +} + +static bool QueueBlocks(Ngs2SamplerShape& shape, const Ngs2SamplerVoiceWaveformBlocksParam& blocks, std::uint32_t maxBlocks) { + const bool reset = (blocks.flags & SCE_NGS2_WAVEFORM_BLOCKS_FLAG_RESET) != 0; + if (!shape.accepts && !reset) return false; + std::size_t size = reset ? 0 : shape.blocks; + const auto* end = size != 0 ? shape.end : nullptr; + auto lastUserData = size != 0 ? shape.lastUserData : 0; + for (std::uint32_t i = 0; blocks.blocks != nullptr && i < blocks.num_blocks; ++i) { + const auto& block = blocks.blocks[i]; + const auto* data = blocks.data == nullptr ? nullptr : static_cast(blocks.data) + block.data_offset; + if (block.data_size == 0 && block.num_samples == 0) continue; + if ((blocks.flags & SCE_NGS2_WAVEFORM_BLOCKS_FLAG_APPEND) == 0 || data != end || block.user_data != lastUserData) { + ++size; + } + end = data == nullptr ? nullptr : data + block.data_size; + lastUserData = block.user_data; + } + if (size > std::max(1u, maxBlocks)) return false; + shape.blocks = size; + shape.accepts = (blocks.flags & SCE_NGS2_WAVEFORM_BLOCKS_FLAG_CONTINUE) != 0; + shape.end = end; + shape.lastUserData = lastUserData; + return true; +} + +static void CheckBlocks(const Ngs2SamplerShape& shape, const Ngs2SamplerVoiceWaveformBlocksParam& param) { + ValidateBlocks(shape.channels, param); + const bool reset = (param.flags & SCE_NGS2_WAVEFORM_BLOCKS_FLAG_RESET) != 0; + if (!shape.accepts && !reset) throw std::invalid_argument("NGS2: the voice waveform was already closed"); + const bool compressed = shape.waveformType == SCE_NGS2_WAVEFORM_TYPE_ATRAC9; + const std::size_t frameBytes = shape.channels == 0 || compressed ? 0 : shape.channels * Ngs2PcmSampleBytes(shape.waveformType); + if ((param.flags & SCE_NGS2_WAVEFORM_BLOCKS_FLAG_APPEND) != 0) { + if ((reset || shape.blocks == 0) && !shape.decodePending) throw std::invalid_argument("NGS2: appending data requires a waveform"); + for (std::uint32_t i = 0; i < param.num_blocks; ++i) { + if (param.blocks[i].data_size != 0 && !compressed && param.blocks[i].data_size % frameBytes != 0) { + throw std::runtime_error("NGS2: appending a partial PCM frame is not implemented"); + } + } + return; + } + const bool accepts = (param.flags & SCE_NGS2_WAVEFORM_BLOCKS_FLAG_CONTINUE) != 0; + const bool allowsSilence = (param.flags & SCE_NGS2_WAVEFORM_BLOCKS_FLAG_SILENCE) != 0; + for (std::uint32_t i = 0; i < param.num_blocks; i++) { + const auto& block = param.blocks[i]; + if (block.num_samples == 0 && block.data_size == 0) continue; + if (allowsSilence && block.data_size == 0) { + if (shape.waveformType != SCE_NGS2_WAVEFORM_TYPE_PCM_I16L) throw std::runtime_error("NGS2: a dataless waveform block under the silence flag is not implemented for this format"); + continue; + } + const std::uint64_t bytes = compressed ? Ngs2Atrac9BlockBytes(shape.frame, block) : (static_cast(block.num_skip_samples) + block.num_samples) * frameBytes; + const bool streaming = block.num_samples != 0 && bytes > block.data_size && shape.waveformType == SCE_NGS2_WAVEFORM_TYPE_PCM_I16L && + block.num_skip_samples == 0 && block.num_repeats == 0 && block.data_size >= frameBytes && block.data_size % frameBytes == 0; + const bool compressedStream = compressed && accepts && block.num_repeats == 0; + if (block.num_samples == 0 || (bytes > block.data_size && !streaming && !compressedStream)) { + throw std::invalid_argument("NGS2: waveform block " + std::to_string(i) + " does not fit its data"); + } + } +} + +static const Ngs2VoiceParamHeader& PendingParam(const Ngs2ParamControl& control) { + return *reinterpret_cast(control.param.data()); +} + +static bool AdvanceSetup(const Ngs2Voice& voice, const Ngs2VoiceParamHeader& param, std::uint32_t& channels) { + if (IsSamplerSetup(voice, param.id)) { + const auto& format = reinterpret_cast(param).format; + if (EmptySamplerFormat(format) && channels != 0) return false; + channels = format.num_channels; + return true; + } + if (param.id == SCE_NGS2_SUBMIXER_VOICE_PARAM_SETUP) { + channels = reinterpret_cast(param).num_io_channels; + return true; + } + return false; +} + +static Ngs2SamplerShape PendingShape(const Ngs2Voice& voice) { + auto shape = CurrentShape(voice); + for (const auto& control : voice.pendingControls) { + const auto* value = std::get_if(&control); + if (value == nullptr) continue; + const auto& param = PendingParam(*value); + if (AdvanceSetup(voice, param, shape.channels)) { + Ngs2Atrac9Frame frame; + if (IsSamplerSetup(voice, param.id) && shape.channels != 0) { + const auto& format = reinterpret_cast(param).format; + if (format.waveform_type == SCE_NGS2_WAVEFORM_TYPE_ATRAC9) Ngs2Atrac9FrameInfo(format, frame); + shape = {shape.channels, format.waveform_type, frame, 0, true, nullptr, 0, false}; + } else shape = {shape.channels, 0, frame, 0, true, nullptr, 0, false}; + } else if (IsAddBlocks(voice, param.id) && shape.channels != 0) { + auto blocks = reinterpret_cast(param); + if (blocks.blocks != nullptr) blocks.blocks = value->blocks.data(); + QueueBlocks(shape, blocks, voice.rack->maxWaveformBlocks); + } + } + return shape; +} + +static std::uint32_t PendingChannels(const Ngs2Voice& voice) { + auto channels = voice.channels; + for (const auto& control : voice.pendingControls) + if (const auto* value = std::get_if(&control)) AdvanceSetup(voice, PendingParam(*value), channels); + return channels; +} + +static Ngs2Voice* FindPatchDest(Ngs2Handle handle) { + if (auto* dest = Ngs2FindVoice(handle)) return dest; + auto* rack = Ngs2FindRack(handle); + return rack != nullptr && !rack->voices.empty() ? &rack->voices.front() : nullptr; +} + +static bool PatchDestGone(const Ngs2ParamControl& control) { + const auto& patch = reinterpret_cast(PendingParam(control)); + return control.destDestroyed || (patch.dest_handle != 0 && FindPatchDest(patch.dest_handle) == nullptr); +} + +void Ngs2DetachPendingPatches(Ngs2Voice& voice, const Ngs2Rack& rack) { + for (auto& control : voice.pendingControls) { + auto* value = std::get_if(&control); + if (value == nullptr || PendingParam(*value).id != SCE_NGS2_VOICE_PARAM_PATCH) continue; + const auto handle = reinterpret_cast(PendingParam(*value)).dest_handle; + const bool named = handle == reinterpret_cast(&rack) || std::any_of(rack.voices.begin(), rack.voices.end(), [&](const Ngs2Voice& dest) { + return handle == reinterpret_cast(&dest); + }); + if (named) value->destDestroyed = true; + } +} + +static Ngs2ParamControl CopyParam(const Ngs2VoiceParamHeader& param) { + const auto* bytes = reinterpret_cast(¶m); + return {{bytes, bytes + param.size}}; +} + +static bool SetupPending(const Ngs2Voice& voice) { + return std::any_of(voice.pendingControls.begin(), voice.pendingControls.end(), [](const auto& control) { return std::holds_alternative(control); }); +} + static Ngs2MatrixControl CaptureMatrixControl(const Ngs2Voice& voice, std::uint32_t index, const float* levels, std::uint32_t count) { - if (index >= voice.matrices.size() || count == 0 || count > NGS2_MAX_CHANNELS * NGS2_MAX_CHANNELS || levels == nullptr) APS5_INVALID_ARG_EX; + if (index >= voice.matrices.size() || count == 0 || count > NGS2_MAX_RACK_CHANNELS * NGS2_MAX_RACK_CHANNELS || levels == nullptr) APS5_INVALID_ARG_EX; Ngs2MatrixControl result{index, {levels, levels + count}}; for (auto& level : result.levels) level = std::clamp(level, -MAX_MATRIX_LEVEL, MAX_MATRIX_LEVEL); return result; @@ -301,6 +516,8 @@ static int ControlUserFx2(Ngs2Voice& voice, std::uint32_t index, const Ngs2Custo return SCE_NGS2_OK; } +static Ngs2Voice* PatchDest(const Ngs2Voice& voice, const Ngs2VoicePatchParam& patch); + static Ngs2PendingControl CaptureParamControl(Ngs2Voice& voice, const Ngs2VoiceParamHeader& param) { if (param.id == SCE_NGS2_VOICE_PARAM_EVENT) { const auto event = ParamAs(param).event_id; @@ -308,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) { @@ -342,6 +560,36 @@ static Ngs2PendingControl CaptureParamControl(Ngs2Voice& voice, const Ngs2VoiceP } if (voice.rack->rackId == SCE_NGS2_RACK_ID_SUBMIXER && param.id == SCE_NGS2_SUBMIXER_VOICE_PARAM_USER_FX) return ParamAs(param); + if (voice.rack->rackId == SCE_NGS2_RACK_ID_SUBMIXER && param.id == SCE_NGS2_SUBMIXER_VOICE_PARAM_SETUP) { + const auto& value = ParamAs(param); + if (value.flags != 0) throw std::runtime_error("NGS2: submixer setup flags are not implemented"); + if (value.num_io_channels == 0 || value.num_io_channels > voice.rack->maxChannels) APS5_INVALID_ARG_EX; + return CopyParam(param); + } + if (IsSamplerSetup(voice, param.id)) { + const auto& format = ParamAs(param).format; + if (!EmptySamplerFormat(format)) ValidateSamplerFormat(format); + return CopyParam(param); + } + if (voice.IsSampler() && IsAddBlocks(voice, param.id)) { + const auto& blocks = ParamAs(param); + const auto shape = PendingShape(voice); + if (auto queue = shape; shape.channels != 0 && !QueueBlocks(queue, blocks, voice.rack->maxWaveformBlocks)) throw Ngs2ReturnCode{static_cast(0x804A8054u)}; + CheckBlocks(shape, blocks); + auto result = CopyParam(param); + if (blocks.blocks != nullptr) result.blocks.assign(blocks.blocks, blocks.blocks + blocks.num_blocks); + return result; + } + if (param.id == SCE_NGS2_VOICE_PARAM_PATCH) { + const auto& patch = ParamAs(param); + PortAt(voice, patch.port); + PatchDest(voice, patch); + return CopyParam(param); + } + if (param.id == SCE_NGS2_VOICE_PARAM_CALLBACK) { + ParamAs(param); + return CopyParam(param); + } if (voice.rack->rackId == SCE_NGS2_RACK_ID_CUSTOM_SUBMIXER && (param.id & ~0x1fu) == SCE_NGS2_CUSTOM_VOICE_PARAM_USER_FX) { const auto index = param.id & 0x1fu; if (index >= voice.customUserFx.size() || voice.rack->customModuleIds[index] != SCE_NGS2_CUSTOM_MODULE_ID_USER_FX) APS5_INVALID_ARG_EX; @@ -372,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); @@ -386,73 +634,102 @@ static Ngs2PendingControl CaptureCommandControl(Ngs2Voice& voice, const Ngs2Voic throw std::runtime_error("NGS2: this buffered voice command is not implemented"); } +static void ApplyParam(Ngs2Voice& voice, const Ngs2VoiceParamHeader& param); + void Ngs2Voice::ApplyPendingControls() { Ngs2PrepareControlMix(*this); bool restart = false, stop = false, kill = false; std::uint32_t pause = 0; - for (auto& control : pendingControls) std::visit([&](auto& value) { - using TValue = std::decay_t; - if constexpr (std::is_same_v) { - if (value == SCE_NGS2_VOICE_EVENT_PLAY) { - restart = true; - stop = kill = false; - pause = 0; - } else if (value == SCE_NGS2_VOICE_EVENT_KILL) { - restart = stop = false; - kill = true; - pause = 0; - } else if (value == SCE_NGS2_VOICE_EVENT_STOP || value == SCE_NGS2_VOICE_EVENT_STOP_IMM) stop = true; - else pause = value; - } else if constexpr (std::is_same_v) ports[value.port].volume = value.level; - else if constexpr (std::is_same_v) ports[value.port].matrix = value.matrix_id; - else if constexpr (std::is_same_v) matrices[value.index] = std::move(value.levels); - else if constexpr (std::is_same_v) pitch = value.ratio; - else if constexpr (std::is_same_v) { fbwLevel = value.fbw_level; lfeLevel = value.lfe_level; } - else if constexpr (std::is_same_v) { - userFxHandler = value.handler; - userFxData = {value.user_data0, value.user_data1, value.user_data2}; - userFxFlags = value.handler ? 2 : 0; - } else if constexpr (std::is_same_v) { - std::copy(value.param.begin(), value.param.end(), userFx[value.index].param.begin()); - userFx[value.index].active = true; - userFx[value.index].flags |= 2; - } else Ngs2ApplyCustomParam(*this, value.header); - }, control); - if (kill) { - SetEvent(SCE_NGS2_VOICE_EVENT_KILL); - outputTransition = Ngs2VoiceTransition::Kill; - } - else { - if (restart) { - if (state != Ngs2PlayState::Empty) state = Ngs2PlayState::Stopped; - SetEvent(SCE_NGS2_VOICE_EVENT_PLAY); + const auto applyEvents = [&] { + if (kill) { + SetEvent(SCE_NGS2_VOICE_EVENT_KILL); + outputTransition = Ngs2VoiceTransition::Kill; + } else { + if (restart) { + if (state != Ngs2PlayState::Empty) state = Ngs2PlayState::Stopped; + SetEvent(SCE_NGS2_VOICE_EVENT_PLAY); + } + if (stop) SetEvent(SCE_NGS2_VOICE_EVENT_STOP); + else if (pause != 0) SetEvent(pause); + if (restart && pause == SCE_NGS2_VOICE_EVENT_PAUSE && !stop) { + outputTransition = Ngs2VoiceTransition::None; + stateFlags = SCE_NGS2_VOICE_STATE_FLAG_INUSE | SCE_NGS2_VOICE_STATE_FLAG_PAUSED; + } } - if (stop) SetEvent(SCE_NGS2_VOICE_EVENT_STOP); - else if (pause != 0) SetEvent(pause); - if (restart && pause == SCE_NGS2_VOICE_EVENT_PAUSE && !stop) { - outputTransition = Ngs2VoiceTransition::None; - stateFlags = SCE_NGS2_VOICE_STATE_FLAG_INUSE | SCE_NGS2_VOICE_STATE_FLAG_PAUSED; + restart = stop = kill = false; + pause = 0; + }; + std::size_t applied = 0; + try { + for (auto& control : pendingControls) { + std::visit([&](auto& value) { + using TValue = std::decay_t; + if constexpr (std::is_same_v) { + if (value == SCE_NGS2_VOICE_EVENT_PLAY) { + restart = true; + stop = kill = false; + pause = 0; + } else if (value == SCE_NGS2_VOICE_EVENT_KILL) { + restart = stop = false; + kill = true; + pause = 0; + } else if (value == SCE_NGS2_VOICE_EVENT_STOP || value == SCE_NGS2_VOICE_EVENT_STOP_IMM) stop = true; + else pause = value; + } else if constexpr (std::is_same_v) ports[value.port].volume = value.level; + else if constexpr (std::is_same_v) ports[value.port].matrix = value.matrix_id; + else if constexpr (std::is_same_v) matrices[value.index] = std::move(value.levels); + else if constexpr (std::is_same_v) pitch = value.ratio; + else if constexpr (std::is_same_v) { fbwLevel = value.fbw_level; lfeLevel = value.lfe_level; } + else if constexpr (std::is_same_v) { + userFxHandler = value.handler; + userFxData = {value.user_data0, value.user_data1, value.user_data2}; + userFxFlags = value.handler ? 2 : 0; + } else if constexpr (std::is_same_v) { + std::copy(value.param.begin(), value.param.end(), userFx[value.index].param.begin()); + userFx[value.index].active = true; + userFx[value.index].flags |= 2; + } else if constexpr (std::is_same_v) { + applyEvents(); + auto& param = *reinterpret_cast(value.param.data()); + if (IsAddBlocks(*this, param.id)) { + auto& blocks = reinterpret_cast(param); + if (blocks.blocks != nullptr) blocks.blocks = value.blocks.data(); + } + if (param.id == SCE_NGS2_VOICE_PARAM_PATCH && PatchDestGone(value)) { + const auto& patch = reinterpret_cast(param); + auto& port = ports[patch.port]; + port.dest = nullptr; + port.detachedDest = 0; + port.destInput = patch.dest_input_id; + } else ApplyParam(*this, param); + if (param.id == SCE_NGS2_VOICE_PARAM_PATCH) ports[reinterpret_cast(param).port].rampFrom.clear(); + } else Ngs2ApplyCustomParam(*this, value.header); + }, control); + ++applied; } + } catch (...) { + applyEvents(); + pendingControls.erase(pendingControls.begin(), pendingControls.begin() + static_cast(std::min(applied + 1, pendingControls.size()))); + pendingPlay = false; + KillForRender(false); + for (const auto& control : pendingControls) PublishPendingEvent(*this, control); + throw; } + applyEvents(); pendingControls.clear(); pendingPlay = false; KillForRender(false); } -static void Patch(Ngs2Voice& voice, const Ngs2VoicePatchParam& patch) { - auto& port = PortAt(voice, patch.port); +static Ngs2Voice* PatchDest(const Ngs2Voice& voice, const Ngs2VoicePatchParam& patch) { if (patch.dest_handle == 0) { if (patch.dest_input_id != 0) throw std::runtime_error("NGS2: a disconnected port with a nonzero input id is not implemented"); - port.dest = nullptr; - port.detachedDest = 0; - port.destInput = 0; - return; + return nullptr; } auto* dest = Ngs2FindVoice(patch.dest_handle); if (dest == nullptr) { if (patch.dest_input_id != 0) throw std::runtime_error("NGS2: a rack destination with a nonzero input id is not implemented"); - auto* rack = Ngs2FindRack(patch.dest_handle); - if (rack != nullptr && !rack->voices.empty()) dest = &rack->voices.front(); + dest = FindPatchDest(patch.dest_handle); } if (dest == nullptr || dest->rack->system != voice.rack->system || dest->rack->rackId == SCE_NGS2_RACK_ID_SAMPLER || dest->rack->rackId == SCE_NGS2_RACK_ID_CUSTOM_SAMPLER) { @@ -462,7 +739,12 @@ static void Patch(Ngs2Voice& voice, const Ngs2VoicePatchParam& patch) { (dest->rack->rackId != SCE_NGS2_RACK_ID_CUSTOM_SUBMIXER || patch.dest_input_id >= dest->rack->maxInputs)) { throw std::runtime_error("NGS2: voice input " + std::to_string(patch.dest_input_id) + " is not implemented for this rack"); } - port.dest = dest; + return dest; +} + +static void Patch(Ngs2Voice& voice, const Ngs2VoicePatchParam& patch) { + auto& port = PortAt(voice, patch.port); + port.dest = PatchDest(voice, patch); port.detachedDest = 0; port.destInput = patch.dest_input_id; } @@ -476,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: { @@ -504,17 +786,12 @@ static void ApplyCommonParam(Ngs2Voice& voice, const Ngs2VoiceParamHeader& param } static void SetupSampler(Ngs2Voice& voice, const Ngs2WaveformFormat& format) { - if (format.waveform_type == 0 && format.num_channels == 0 && format.sample_rate == 0) { + if (EmptySamplerFormat(format)) { if (voice.channels == 0) voice.ResetSetup(); return; } voice.ResetSetup(); - if (format.waveform_type != SCE_NGS2_WAVEFORM_TYPE_ATRAC9) Ngs2PcmSampleBytes(format.waveform_type); - if (format.waveform_type != SCE_NGS2_WAVEFORM_TYPE_PCM_I16L && format.waveform_type != SCE_NGS2_WAVEFORM_TYPE_ATRAC9 && format.config_data != 0) { - throw std::runtime_error("NGS2: configured PCM waveforms are not implemented"); - } - if (format.frame_offset != 0 || format.frame_margin != 0) throw std::runtime_error("NGS2: waveform frame offset and margin are not implemented"); - if (format.num_channels == 0 || format.num_channels > NGS2_MAX_CHANNELS || format.sample_rate == 0) APS5_INVALID_ARG_EX; + ValidateSamplerFormat(format); voice.channels = format.num_channels; voice.sampleRate = format.sample_rate; voice.waveformType = format.waveform_type; @@ -522,14 +799,10 @@ static void SetupSampler(Ngs2Voice& voice, const Ngs2WaveformFormat& format) { Ngs2PrepareSampler(voice); } -static void AppendStreamData(Ngs2Voice& voice, const Ngs2SamplerVoiceWaveformBlocksParam& param, std::size_t frameBytes) { - const bool compressed = voice.waveformType == SCE_NGS2_WAVEFORM_TYPE_ATRAC9; - const bool pending = !voice.blocks.empty() || (compressed ? voice.atrac9.remainingSamples != 0 : voice.pcmRemaining != 0); - if (!pending) throw std::invalid_argument("NGS2: appending data requires a waveform"); +static void AppendStreamData(Ngs2Voice& voice, const Ngs2SamplerVoiceWaveformBlocksParam& param) { for (std::uint32_t i = 0; i < param.num_blocks; ++i) { auto info = param.blocks[i]; if (info.data_size == 0) continue; - if (!compressed && info.data_size % frameBytes != 0) throw std::runtime_error("NGS2: appending a partial PCM frame is not implemented"); const auto* data = static_cast(param.data) + info.data_offset; if (!voice.blocks.empty() && voice.blocks.back().data + voice.blocks.back().info.data_size == data && voice.blocks.back().info.user_data == info.user_data) { voice.blocks.back().info.data_size += info.data_size; @@ -548,26 +821,23 @@ static void AppendStreamData(Ngs2Voice& voice, const Ngs2SamplerVoiceWaveformBlo } static void AddWaveformBlocks(Ngs2Voice& voice, const Ngs2SamplerVoiceWaveformBlocksParam& param) { - constexpr std::uint32_t knownFlags = SCE_NGS2_WAVEFORM_BLOCKS_FLAG_CONTINUE | SCE_NGS2_WAVEFORM_BLOCKS_FLAG_APPEND | SCE_NGS2_WAVEFORM_BLOCKS_FLAG_RESET | SCE_NGS2_WAVEFORM_BLOCKS_FLAG_SILENCE; - if ((param.flags & ~knownFlags) != 0) throw std::runtime_error("NGS2: waveform block flags " + Ngs2Hex(param.flags) + " are not implemented"); - if ((param.num_blocks != 0 && (voice.channels == 0 || param.blocks == nullptr || param.data == nullptr)) || (voice.channels == 0 && (param.flags & SCE_NGS2_WAVEFORM_BLOCKS_FLAG_APPEND) != 0)) APS5_INVALID_ARG_EX; + CheckBlocks(CurrentShape(voice), param); const bool reset = (param.flags & SCE_NGS2_WAVEFORM_BLOCKS_FLAG_RESET) != 0; const auto pcmCursor = reset && !voice.blocks.empty() ? voice.blocks.front().dataCursor : 0u; const bool preservePcm = reset && voice.waveformType == SCE_NGS2_WAVEFORM_TYPE_PCM_I16L && !voice.blocks.empty() && voice.blocks.front().started; const bool preserveCodec = reset && voice.waveformType == SCE_NGS2_WAVEFORM_TYPE_ATRAC9 && ((!voice.blocks.empty() && voice.blocks.front().started) || voice.atrac9.remainingSamples != 0); std::uint64_t codecCursor = 0; if (preserveCodec && !voice.blocks.empty()) codecCursor = voice.blocks.front().dataCursor; - if (!voice.acceptsBlocks && !reset) throw std::invalid_argument("NGS2: the voice waveform was already closed"); if (reset) { ++voice.waveformRevision; voice.blocks.clear(); voice.samplerReplayBlocks.clear(); voice.samplerWritePosition = 0; } - const std::size_t frameBytes = voice.channels == 0 || voice.waveformType == SCE_NGS2_WAVEFORM_TYPE_ATRAC9 ? 0 : voice.channels * Ngs2PcmSampleBytes(voice.waveformType); if ((param.flags & SCE_NGS2_WAVEFORM_BLOCKS_FLAG_APPEND) != 0) { - AppendStreamData(voice, param, frameBytes); + AppendStreamData(voice, param); voice.acceptsBlocks = (param.flags & SCE_NGS2_WAVEFORM_BLOCKS_FLAG_CONTINUE) != 0; + Ngs2PublishBlockQueue(voice); return; } voice.acceptsBlocks = (param.flags & SCE_NGS2_WAVEFORM_BLOCKS_FLAG_CONTINUE) != 0; @@ -576,19 +846,10 @@ static void AddWaveformBlocks(Ngs2Voice& voice, const Ngs2SamplerVoiceWaveformBl const auto& block = param.blocks[i]; if (block.num_samples == 0 && block.data_size == 0) continue; if (allowsSilence && block.data_size == 0) { - if (voice.waveformType != SCE_NGS2_WAVEFORM_TYPE_PCM_I16L) throw std::runtime_error("NGS2: a dataless waveform block under the silence flag is not implemented for this format"); voice.blocks.push_back({nullptr, block}); Ngs2SaveSamplerBlock(voice, voice.blocks.back()); continue; } - const std::uint64_t bytes = voice.waveformType == SCE_NGS2_WAVEFORM_TYPE_ATRAC9 ? Ngs2Atrac9BlockBytes(voice, block) - : (static_cast(block.num_skip_samples) + block.num_samples) * frameBytes; - const bool streaming = block.num_samples != 0 && bytes > block.data_size && voice.waveformType == SCE_NGS2_WAVEFORM_TYPE_PCM_I16L && - block.num_skip_samples == 0 && block.num_repeats == 0 && block.data_size >= frameBytes && block.data_size % frameBytes == 0; - const bool compressedStream = voice.waveformType == SCE_NGS2_WAVEFORM_TYPE_ATRAC9 && voice.acceptsBlocks && block.num_repeats == 0; - if (block.num_samples == 0 || (bytes > block.data_size && !streaming && !compressedStream)) { - throw std::invalid_argument("NGS2: waveform block " + std::to_string(i) + " does not fit its data"); - } voice.blocks.push_back({static_cast(param.data) + block.data_offset, block}); Ngs2SaveSamplerBlock(voice, voice.blocks.back()); } @@ -601,6 +862,7 @@ static void AddWaveformBlocks(Ngs2Voice& voice, const Ngs2SamplerVoiceWaveformBl voice.blocks.front().dataCursor = codecCursor; voice.blocks.front().started = true; } + Ngs2PublishBlockQueue(voice); } void Ngs2SetFilter(Ngs2Voice& voice, const Ngs2SamplerVoiceFilterParam& param) { @@ -799,29 +1061,14 @@ int APS5_VABI sceNgs2VoiceControl(uintptr_t voice_handle, const Ngs2VoiceParamHe continue; } } - if (DeferringControls(voice) && param->id != SCE_NGS2_VOICE_PARAM_CALLBACK) { + if (DeferringControls(voice) && (param->id != SCE_NGS2_VOICE_PARAM_CALLBACK || SetupPending(voice))) { EnqueueControl(voice, CaptureParamControl(voice, *param)); if (param->next == 0) break; continue; } - if (voice.channels != 0 && (param->id >> 16) == voice.rack->rackId && (param->id == SCE_NGS2_SAMPLER_VOICE_PARAM_ADD_WAVEFORM_BLOCKS || param->id == SCE_NGS2_CUSTOM_SAMPLER_VOICE_PARAM_ADD_WAVEFORM_BLOCKS)) { - const auto& blocks = ParamAs(*param); - const bool reset = (blocks.flags & SCE_NGS2_WAVEFORM_BLOCKS_FLAG_RESET) != 0; - if (!voice.acceptsBlocks && !reset) return static_cast(0x804A8054u); - std::size_t size = reset ? 0 : voice.blocks.size(); - const auto* end = size != 0 && voice.blocks.back().data != nullptr ? voice.blocks.back().data + voice.blocks.back().info.data_size : nullptr; - auto lastUserData = size != 0 ? voice.blocks.back().info.user_data : 0; - for (std::uint32_t i = 0; blocks.blocks != nullptr && i < blocks.num_blocks; ++i) { - const auto& block = blocks.blocks[i]; - const auto* data = blocks.data == nullptr ? nullptr : static_cast(blocks.data) + block.data_offset; - if (block.data_size == 0 && block.num_samples == 0) continue; - if ((blocks.flags & SCE_NGS2_WAVEFORM_BLOCKS_FLAG_APPEND) == 0 || data != end || block.user_data != lastUserData) { - ++size; - } - end = data == nullptr ? nullptr : data + block.data_size; - lastUserData = block.user_data; - } - if (size > std::max(1u, voice.rack->maxWaveformBlocks)) return static_cast(0x804A8054u); + if (voice.channels != 0 && IsAddBlocks(voice, param->id)) { + auto queue = CurrentShape(voice); + if (!QueueBlocks(queue, ParamAs(*param), voice.rack->maxWaveformBlocks)) return static_cast(0x804A8054u); } if ((param->id & ~0xffu) == SCE_NGS2_CUSTOM_VOICE_PARAM_GAIN) { const auto result = Ngs2ApplyCustomGainParam(voice, *param); @@ -844,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; @@ -866,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) { @@ -878,10 +1128,11 @@ int APS5_VABI sceNgs2VoiceRunCommands(uintptr_t voice_handle, const Ngs2VoiceCom } int APS5_VABI sceNgs2VoiceGetState(uintptr_t voice_handle, Ngs2VoiceState* state, size_t state_size) { + if (PS4_LIBRARY && state_size < sizeof(state->state_flags)) return SCE_NGS2_ERROR_PS4_INVALID_STATE_SIZE; const Ngs2Lock lock; const Ngs2VoiceAccess access(voice_handle); auto* found = access.voice; - if (found == nullptr) return SCE_NGS2_ERROR_INVALID_VOICE_HANDLE; + if (found == nullptr) return PS4_LIBRARY ? SCE_NGS2_ERROR_PS4_INVALID_VOICE_HANDLE : SCE_NGS2_ERROR_INVALID_VOICE_HANDLE; if (state_size < sizeof(Ngs2VoiceState)) return SCE_NGS2_ERROR_INVALID_OUT_SIZE; if (state == nullptr) return SCE_NGS2_ERROR_INVALID_OUT_ADDRESS; const auto& voice = *found; @@ -951,15 +1202,31 @@ int APS5_VABI sceNgs2VoiceGetPortInfo(uintptr_t voice_handle, uint32_t port, Ngs const auto& source = PortAt(voice, port); auto volume = source.volume; auto matrix = source.matrix; + auto dest = source.dest == nullptr ? source.detachedDest : reinterpret_cast(source.dest); + auto input = source.destInput; + auto channels = voice.channels; for (const auto& control : voice.pendingControls) { if (const auto* value = std::get_if(&control); value && value->port == port) volume = value->level; if (const auto* value = std::get_if(&control); value && value->port == port) matrix = value->matrix_id; + const auto* value = std::get_if(&control); + if (value == nullptr) continue; + const auto& param = PendingParam(*value); + if (param.id == SCE_NGS2_VOICE_PARAM_PATCH && reinterpret_cast(param).port == port) { + const auto& patch = reinterpret_cast(param); + dest = PatchDestGone(*value) ? 0 : reinterpret_cast(PatchDest(voice, patch)); + input = patch.dest_input_id; + } else if (AdvanceSetup(voice, param, channels)) { + volume = 1.0f; + matrix = -1; + dest = 0; + input = 0; + } } *info = {}; info->matrix_id = matrix; info->volume = volume; - info->dest_handle = source.dest == nullptr ? source.detachedDest : reinterpret_cast(source.dest); - info->dest_input_id = source.destInput; + info->dest_handle = dest; + info->dest_input_id = input; return SCE_NGS2_OK; } @@ -985,6 +1252,10 @@ int APS5_VABI sceNgs2VoiceGetStateFlags(uintptr_t voice_handle, uint32_t* state_ const Ngs2Lock lock; const Ngs2VoiceAccess access(voice_handle); const auto* found = access.voice; + if (found == nullptr && PS4_LIBRARY) { + *state_flags = 0; + return SCE_NGS2_ERROR_PS4_INVALID_VOICE_HANDLE; + } if (found == nullptr) return SCE_NGS2_ERROR_INVALID_VOICE_HANDLE; *state_flags = found->pendingPlay ? SCE_NGS2_VOICE_STATE_FLAG_INUSE : found->stateFlags; return SCE_NGS2_OK; diff --git a/core/libs/prx/libSceNgs2.native/tests/Ngs2Custom.cpp b/core/libs/prx/libSceNgs2.native/tests/Ngs2Custom.cpp index 1201d70b1704..fb50c9324b20 100644 --- a/core/libs/prx/libSceNgs2.native/tests/Ngs2Custom.cpp +++ b/core/libs/prx/libSceNgs2.native/tests/Ngs2Custom.cpp @@ -214,6 +214,49 @@ static void TestUserFxChain() { Require(sceNgs2SystemDestroy(system, nullptr) == SCE_NGS2_OK); } +static void TestWideCustomSubmixer() { + calls = {}; + const auto system = CreateSystem(); + const auto master = Mastering(system, 2); + auto option = RackOption(nullptr, 0); + option.max_channels = 12; + const auto rack = CustomRack(system, option); + const auto custom = Voice(rack); + Require(ControlThrows(custom, SCE_NGS2_CUSTOM_SUBMIXER_VOICE_PARAM_SETUP, Ngs2CustomSubmixerVoiceSetupParam{{}, 12, 12, 0, 0})); + Control(custom, SCE_NGS2_CUSTOM_SUBMIXER_VOICE_PARAM_SETUP, Ngs2CustomSubmixerVoiceSetupParam{{}, 8, 8, 0, 0}); + const std::vector toMaster { + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + }; + Control(custom, SCE_NGS2_VOICE_PARAM_MATRIX_LEVELS, Ngs2VoiceMatrixLevelsParam{{}, 0, static_cast(toMaster.size()), toMaster.data()}); + Patch(custom, master); + Control(custom, SCE_NGS2_VOICE_PARAM_PORT_MATRIX, Ngs2VoicePortMatrixParam{{}, 0, 0}); + Event(custom, SCE_NGS2_VOICE_EVENT_PLAY); + + std::vector pcm(Grain * 2 * 8, 16384); + const auto sampler = Sampler(system, pcm); + const std::vector toCustom { + 1, 0, + 0, 1, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + }; + Control(sampler, SCE_NGS2_VOICE_PARAM_MATRIX_LEVELS, Ngs2VoiceMatrixLevelsParam{{}, 0, static_cast(toCustom.size()), toCustom.data()}); + Patch(sampler, custom); + Control(sampler, SCE_NGS2_VOICE_PARAM_PORT_MATRIX, Ngs2VoicePortMatrixParam{{}, 0, 0}); + Event(sampler, SCE_NGS2_VOICE_EVENT_PLAY); + + auto out = Render(system); + for (std::uint32_t i = 0; i < Grain; i++) Require(out[i * 2] == (i < 3 ? 0.0f : 0.5f) && out[i * 2 + 1] == (i < 3 ? 0.0f : 0.5f)); + + Require(sceNgs2RackDestroy(rack, nullptr) == SCE_NGS2_OK); + Require(sceNgs2SystemDestroy(system, nullptr) == SCE_NGS2_OK); +} + static void TestRackOptions() { calls = {}; const auto system = CreateSystem(); @@ -520,10 +563,12 @@ static void TestCustomRackChecks() { option = good; option.max_channels = SCE_NGS2_CUSTOM_SUBMIXER_MAX_CHANNELS + 1; Require(create(option) == SCE_NGS2_ERROR_INVALID_NUM_CHANNELS); + option = good; + option.custom_rack_option.num_modules = 0; option.max_channels = 16; - Require(CreateThrows(option)); + Require(sceNgs2RackDestroy(CustomRack(system, option), nullptr) == SCE_NGS2_OK); option.max_channels = SCE_NGS2_CUSTOM_SUBMIXER_MAX_CHANNELS; - Require(CreateThrows(option)); + Require(sceNgs2RackDestroy(CustomRack(system, option), nullptr) == SCE_NGS2_OK); Require(create(BuiltInRackOption(userFx2, 0x19, nullptr, 4)) == SCE_NGS2_ERROR_INVALID_STATE_SIZE); Require(!CreateThrows(BuiltInRackOption(userFx2, SCE_NGS2_CUSTOM_MODULE_ID_GAIN, nullptr, 0))); @@ -978,6 +1023,7 @@ int main() { } } TestUserFxChain(); + TestWideCustomSubmixer(); TestRackOptions(); TestCustomRackChecks(); TestCustomFilterResetIndex(); diff --git a/core/libs/prx/libSceNgs2.native/tests/Ngs2Gain.cpp b/core/libs/prx/libSceNgs2.native/tests/Ngs2Gain.cpp index 961b5d14fa30..0ea112814a8d 100644 --- a/core/libs/prx/libSceNgs2.native/tests/Ngs2Gain.cpp +++ b/core/libs/prx/libSceNgs2.native/tests/Ngs2Gain.cpp @@ -73,12 +73,13 @@ struct GainGraph { } }; -static void ExpectChannels(const std::vector& out, std::initializer_list> channels) { - std::size_t c = 0; - for (const auto& samples : channels) { - Require(out.size() == samples.size() * channels.size()); - for (std::size_t i = 0; i < samples.size(); i++) Require(out[i * channels.size() + c] == samples[i]); - c++; +static void ExpectRamp(const std::vector& out, std::initializer_list from, std::initializer_list to) { + Require(from.size() == to.size() && out.size() == Grain * from.size()); + for (std::size_t c = 0; c < from.size(); ++c) { + for (std::size_t i = 0; i < Grain; ++i) { + const float expected = from.begin()[c] + (to.begin()[c] - from.begin()[c]) * static_cast(i) / Grain; + Require(out[i * from.size() + c] == expected); + } } } @@ -96,16 +97,16 @@ static void TestRamps() { GainGraph graph; graph.Set({64.0f, -64.0f}); graph.Set({8.0f, -16.0f}); - ExpectChannels(graph.Render(), {{0, 0.5f, 1, 1.5f, 2, 2.5f, 3, 3.5f}, {0, 0.5f, 1, 1.5f, 2, 2.5f, 3, 3.5f}}); + ExpectRamp(graph.Render(), {0, 0}, {4, 4}); ExpectConstant(graph.Render(), {4, 4}); graph.Set({8.0f, -16.0f}); ExpectConstant(graph.Render(), {4, 4}); graph.Set({16.0f, 16.0f}); graph.Set({-80.0f, 96.0f}); - ExpectChannels(graph.Render(), {{4, -1.5f, -7, -12.5f, -18, -23.5f, -29, -34.5f}, {4, 0.5f, -3, -6.5f, -10, -13.5f, -17, -20.5f}}); + ExpectRamp(graph.Render(), {4, 4}, {-40, -24}); ExpectConstant(graph.Render(), {-40, -24}); graph.Set({0, 0}); - ExpectChannels(graph.Render(), {{-40, -35, -30, -25, -20, -15, -10, -5}, {-24, -21, -18, -15, -12, -9, -6, -3}}); + ExpectRamp(graph.Render(), {-40, -24}, {0, 0}); ExpectConstant(graph.Render(), {0, 0}); } @@ -114,8 +115,9 @@ static void TestEightChannels() { graph.Set({2, 8, 24, 64, 160, 384, 896, 2048}); const auto out = graph.Render(); ExpectFrame(out, 0, {0, 0, 0, 0, 0, 0, 0, 0}); - ExpectFrame(out, 4, {0.5f, -1, 1.5f, -2, 2.5f, -3, 3.5f, -4}); - ExpectFrame(out, 7, {7.0f / 8, -7.0f / 4, 21.0f / 8, -7.0f / 2, 35.0f / 8, -21.0f / 4, 49.0f / 8, -7}); + ExpectFrame(out, Grain / 2, {0.5f, -1, 1.5f, -2, 2.5f, -3, 3.5f, -4}); + const float last = static_cast(Grain - 1) / Grain; + ExpectFrame(out, Grain - 1, {last, -2 * last, 3 * last, -4 * last, 5 * last, -6 * last, 7 * last, -8 * last}); ExpectConstant(graph.Render(), {1, -2, 3, -4, 5, -6, 7, -8}); } @@ -191,7 +193,7 @@ static void TestParameterPositions() { param.header.id = SCE_NGS2_CUSTOM_VOICE_PARAM_GAIN | position; Require(sceNgs2VoiceControl(graph.voices[0], ¶m.header) == SCE_NGS2_ERROR_INVALID_PARAM_ID); } - ExpectChannels(graph.Render(), {{0, 0.5f, 1, 1.5f, 2, 2.5f, 3, 3.5f}}); + ExpectRamp(graph.Render(), {0}, {4}); ExpectConstant(graph.Render(), {4}); } @@ -204,7 +206,7 @@ static void TestLinkedParameters() { params[2].gain[0] = 16; params[2].header.next = 0; Require(sceNgs2VoiceControl(graph.voices[0], ¶ms[0].header) == SCE_NGS2_ERROR_INVALID_PARAM_ID); - ExpectChannels(graph.Render(), {{0, 0.5f, 1, 1.5f, 2, 2.5f, 3, 3.5f}}); + ExpectRamp(graph.Render(), {0}, {4}); ExpectConstant(graph.Render(), {4}); } @@ -216,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 0ac4af1ecdbe..e0000ba149ea 100644 --- a/core/libs/prx/libSceNgs2.native/tests/Ngs2HandleErrors.cpp +++ b/core/libs/prx/libSceNgs2.native/tests/Ngs2HandleErrors.cpp @@ -374,7 +374,7 @@ static void CheckSetGrainSamples() { Status(sceNgs2SystemGetInfo(system, &info, sizeof(info)), SCE_NGS2_OK, "system info failed"); Require(info.num_grain_samples == grain); } - for (const std::uint32_t grain : {0u, 513u, 576u, 2048u, 0xffffffffu}) { + for (const std::uint32_t grain : {0u, 1u, 8u, 63u, 65u, 511u, 513u, 576u, 2048u, 0xffffffffu}) { Status(sceNgs2SystemSetGrainSamples(system, grain), grainError, "an invalid grain was accepted"); Status(sceNgs2SystemGetInfo(system, &info, sizeof(info)), SCE_NGS2_OK, "system info failed"); Require(info.num_grain_samples == 512); @@ -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 17161044372f..577a5b00a168 100644 --- a/core/libs/prx/libSceNgs2.native/tests/Ngs2JobBuffer.cpp +++ b/core/libs/prx/libSceNgs2.native/tests/Ngs2JobBuffer.cpp @@ -4,8 +4,12 @@ #include #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; @@ -71,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; @@ -203,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; @@ -229,7 +266,442 @@ static void TestBuffer(Update update, bool custom, bool commands, unsigned order ResetBuffers(firstBuffer); } -int main() { +enum class SetupOrder { SetupOnly, PlaySetup, SetupPlay }; +struct SetupState { + std::uintptr_t target; + SetupOrder order; + unsigned tick = 0; +}; + +static int APS5_VABI SetupPeer(Ngs2UserFxProcessContext* context) { + auto& state = *reinterpret_cast(context->user_data0); + if (state.tick++ == 0) { + bool rejected = false; + try { + Control(state.target, SCE_NGS2_SUBMIXER_VOICE_PARAM_SETUP, Ngs2SubmixerVoiceSetupParam{{}, 0, 0}); + } catch (const std::invalid_argument&) { + rejected = true; + } + Require(rejected); + if (state.order == SetupOrder::PlaySetup) Event(state.target, SCE_NGS2_VOICE_EVENT_PLAY); + Control(state.target, SCE_NGS2_SUBMIXER_VOICE_PARAM_SETUP, Ngs2SubmixerVoiceSetupParam{{}, 1, 0}); + if (state.order == SetupOrder::SetupPlay) Event(state.target, SCE_NGS2_VOICE_EVENT_PLAY); + } + std::fill_n(context->channel_data[0], context->num_grain_samples, 0.0f); + return SCE_NGS2_OK; +} + +static void TestBufferedSetup(SetupOrder order) { + const auto firstBuffer = usedBuffers; + Ngs2SystemOption option{}; + option.size = sizeof(option); + option.max_grain_samples = 512; + option.num_grain_samples = 64; + option.sample_rate = 48000; + option.max_voice_channels = 8; + Ngs2ContextBufferInfo query{}; + Require(sceNgs2SystemQueryBufferSize(&option, &query) == SCE_NGS2_OK); + const auto buffer = Buffer(query); + std::uintptr_t system = 0; + Require(sceNgs2SystemCreate(&option, &buffer, &system) == SCE_NGS2_OK); + const auto master = Mastering(system, 1); + const auto sender = Voice(CreateRack(system, SCE_NGS2_RACK_ID_SUBMIXER)); + const auto target = Voice(CreateRack(system, SCE_NGS2_RACK_ID_SUBMIXER)); + for (const auto voice : {sender, target}) Control(voice, SCE_NGS2_SUBMIXER_VOICE_PARAM_SETUP, Ngs2SubmixerVoiceSetupParam{{}, 1, 0}); + const auto voice = Sampler(system, false); + Control(voice, SCE_NGS2_SAMPLER_VOICE_PARAM_SETUP, Ngs2SamplerVoiceSetupParam{{}, {SCE_NGS2_WAVEFORM_TYPE_PCM_I16L, 1, 48000, 0, 0, 0}}); + std::array pcm{}; + pcm.fill(1000); + const Ngs2WaveformBlock block{0, sizeof(pcm), 0, 0, pcm.size(), 0, 0}; + Control(voice, SCE_NGS2_SAMPLER_VOICE_PARAM_ADD_WAVEFORM_BLOCKS, Ngs2SamplerVoiceWaveformBlocksParam{{}, pcm.data(), 0, 1, &block}); + SetupState state{target, order}; + Control(sender, SCE_NGS2_SUBMIXER_VOICE_PARAM_USER_FX, Ngs2SubmixerVoiceUserFxParam{{}, SetupPeer, reinterpret_cast(&state), 0, 0}); + Patch(voice, target); + Patch(target, master); + Patch(sender, master); + for (const auto source : {voice, sender, target}) Event(source, SCE_NGS2_VOICE_EVENT_PLAY); + std::array samples{}; + const Ngs2RenderBufferInfo output{samples.data(), sizeof(samples), SCE_NGS2_WAVEFORM_TYPE_PCM_F32L, 1}; + for (unsigned grain = 0; grain < 3; ++grain) { + samples.fill(-1234.0f); + Require(sceNgs2SystemRender(system, &output, 1) == SCE_NGS2_OK); + for (unsigned i = 0; i < 64; ++i) Require(samples[i] == (grain == 0 && i >= 3 ? 1000.0f / 32768.0f : 0.0f)); + Require(samples[64] == -1234.0f); + if (grain == 0) continue; + Require(Flags(target) == (order == SetupOrder::SetupPlay ? static_cast(SCE_NGS2_VOICE_STATE_FLAG_INUSE | SCE_NGS2_VOICE_STATE_FLAG_PLAYING) : 0u)); + Ngs2VoicePortInfo info{}; + Require(sceNgs2VoiceGetPortInfo(target, 0, &info, sizeof(info)) == SCE_NGS2_OK && info.dest_handle == 0); + } + Require(state.tick == 3 && sceNgs2SystemDestroy(system, nullptr) == SCE_NGS2_OK); + ResetBuffers(firstBuffer); +} + +struct SamplerSetupState { + std::uintptr_t voice; + std::uintptr_t mixer; + std::uintptr_t master; + const std::int16_t* pcm; + unsigned tick = 0; + unsigned blockEnds = 0; +}; + +static void APS5_VABI CountBlockEnd(const Ngs2VoiceCallbackInfo* info) { + auto& state = *reinterpret_cast(info->callback_data); + Require(info->flag == SCE_NGS2_VOICE_CALLBACK_FLAG_BLOCK_END); + ++state.blockEnds; +} + +static int APS5_VABI SetupSamplerPeer(Ngs2UserFxProcessContext* context) { + auto& state = *reinterpret_cast(context->user_data0); + if (state.tick++ == 0) { + Control(state.voice, SCE_NGS2_SAMPLER_VOICE_PARAM_SETUP, Ngs2SamplerVoiceSetupParam{{}, {SCE_NGS2_WAVEFORM_TYPE_PCM_I16L, 1, 48000, 0, 0, 0}}); + Control(state.voice, SCE_NGS2_VOICE_PARAM_CALLBACK, + Ngs2VoiceCallbackParam{{}, CountBlockEnd, reinterpret_cast(&state), SCE_NGS2_VOICE_CALLBACK_FLAG_BLOCK_END, 0}); + Patch(state.voice, state.master); + Ngs2VoicePortInfo info{}; + Require(sceNgs2VoiceGetPortInfo(state.voice, 0, &info, sizeof(info)) == SCE_NGS2_OK && info.dest_handle == state.master); + std::array blocks{{{0, 256, 0, 0, 128, 0, 0}}}; + Control(state.voice, SCE_NGS2_SAMPLER_VOICE_PARAM_ADD_WAVEFORM_BLOCKS, Ngs2SamplerVoiceWaveformBlocksParam{{}, state.pcm, 0, 1, blocks.data()}); + blocks.fill({}); + const Ngs2WaveformBlock extra{0, 256, 0, 0, 128, 0, 0}; + Ngs2SamplerVoiceWaveformBlocksParam closed{{sizeof(closed), 0, SCE_NGS2_SAMPLER_VOICE_PARAM_ADD_WAVEFORM_BLOCKS}, state.pcm, 0, 1, &extra}; + Require(sceNgs2VoiceControl(state.voice, &closed.header) == static_cast(0x804A8054u)); + Event(state.voice, SCE_NGS2_VOICE_EVENT_PLAY); + Control(state.mixer, SCE_NGS2_SUBMIXER_VOICE_PARAM_SETUP, Ngs2SubmixerVoiceSetupParam{{}, 1, 0}); + Event(state.mixer, SCE_NGS2_VOICE_EVENT_PLAY); + } + std::fill_n(context->channel_data[0], context->num_grain_samples, 0.0f); + return SCE_NGS2_OK; +} + +static void TestBufferedSamplerSetup() { + const auto firstBuffer = usedBuffers; + Ngs2SystemOption option{}; + option.size = sizeof(option); + option.max_grain_samples = 512; + option.num_grain_samples = 64; + option.sample_rate = 48000; + option.max_voice_channels = 8; + Ngs2ContextBufferInfo query{}; + Require(sceNgs2SystemQueryBufferSize(&option, &query) == SCE_NGS2_OK); + const auto buffer = Buffer(query); + std::uintptr_t system = 0; + Require(sceNgs2SystemCreate(&option, &buffer, &system) == SCE_NGS2_OK); + const auto master = Mastering(system, 1); + const auto sender = Voice(CreateRack(system, SCE_NGS2_RACK_ID_SUBMIXER)); + Control(sender, SCE_NGS2_SUBMIXER_VOICE_PARAM_SETUP, Ngs2SubmixerVoiceSetupParam{{}, 1, 0}); + const auto mixer = Voice(CreateRack(system, SCE_NGS2_RACK_ID_SUBMIXER)); + const auto voice = Sampler(system, false); + std::array pcm{}; + pcm.fill(1000); + SamplerSetupState state{voice, mixer, master, pcm.data()}; + Control(sender, SCE_NGS2_SUBMIXER_VOICE_PARAM_USER_FX, Ngs2SubmixerVoiceUserFxParam{{}, SetupSamplerPeer, reinterpret_cast(&state), 0, 0}); + Patch(sender, master); + Event(sender, SCE_NGS2_VOICE_EVENT_PLAY); + std::array samples{}; + const Ngs2RenderBufferInfo output{samples.data(), sizeof(samples), SCE_NGS2_WAVEFORM_TYPE_PCM_F32L, 1}; + for (unsigned grain = 0; grain < 6; ++grain) { + samples.fill(-1234.0f); + Require(sceNgs2SystemRender(system, &output, 1) == SCE_NGS2_OK); + for (unsigned i = 0; grain < 3 && i < 64; ++i) Require(samples[i] == (grain == 2 || (grain == 1 && i >= 3) ? 1000.0f / 32768.0f : 0.0f)); + Require(samples[64] == -1234.0f); + Require(Flags(mixer) == (grain == 0 ? static_cast(SCE_NGS2_VOICE_STATE_FLAG_INUSE) : static_cast(SCE_NGS2_VOICE_STATE_FLAG_INUSE | SCE_NGS2_VOICE_STATE_FLAG_PLAYING))); + } + Require(state.tick == 6 && state.blockEnds == 1 && sceNgs2SystemDestroy(system, nullptr) == SCE_NGS2_OK); + ResetBuffers(firstBuffer); +} + +struct PeerAction { + std::function action; + unsigned tick = 0; +}; + +static int APS5_VABI RunPeerAction(Ngs2UserFxProcessContext* context) { + auto& peer = *reinterpret_cast(context->user_data0); + peer.action(peer.tick++); + std::fill_n(context->channel_data[0], context->num_grain_samples, 0.0f); + return SCE_NGS2_OK; +} + +struct PeerSystem { + std::uintptr_t system; + std::uintptr_t master; +}; + +static PeerSystem CreatePeerSystem(PeerAction& peer, const Ngs2JobSchedulerOption* scheduler = nullptr) { + Ngs2SystemOption option{}; + option.size = sizeof(option); + option.max_grain_samples = 512; + option.num_grain_samples = 64; + option.sample_rate = 48000; + option.max_voice_channels = 8; + if (scheduler != nullptr) option.job_scheduler_options[0] = reinterpret_cast(scheduler); + Ngs2ContextBufferInfo query{}; + Require(sceNgs2SystemQueryBufferSize(&option, &query) == SCE_NGS2_OK); + const auto buffer = Buffer(query); + std::uintptr_t system = 0; + Require(sceNgs2SystemCreate(&option, &buffer, &system) == SCE_NGS2_OK); + const auto master = Mastering(system, 1); + const auto sender = Voice(CreateRack(system, SCE_NGS2_RACK_ID_SUBMIXER)); + Control(sender, SCE_NGS2_SUBMIXER_VOICE_PARAM_SETUP, Ngs2SubmixerVoiceSetupParam{{}, 1, 0}); + Control(sender, SCE_NGS2_SUBMIXER_VOICE_PARAM_USER_FX, Ngs2SubmixerVoiceUserFxParam{{}, RunPeerAction, reinterpret_cast(&peer), 0, 0}); + Patch(sender, master); + Event(sender, SCE_NGS2_VOICE_EVENT_PLAY); + return {system, master}; +} + +static std::uintptr_t MonoSampler(std::uintptr_t system, std::uint32_t waveformType = SCE_NGS2_WAVEFORM_TYPE_PCM_I16L) { + const auto voice = Sampler(system, false); + Control(voice, SCE_NGS2_SAMPLER_VOICE_PARAM_SETUP, Ngs2SamplerVoiceSetupParam{{}, {waveformType, 1, 48000, 0, 0, 0}}); + return voice; +} + +static int AddBlocks(std::uintptr_t voice, const void* data, std::uint32_t flags, const Ngs2WaveformBlock& block) { + Ngs2SamplerVoiceWaveformBlocksParam param{{sizeof(param), 0, SCE_NGS2_SAMPLER_VOICE_PARAM_ADD_WAVEFORM_BLOCKS}, data, flags, 1, &block}; + return sceNgs2VoiceControl(voice, ¶m.header); +} + +template +static void RequireThrows(TAction action) { + bool thrown = false; + try { action(); } catch (const TError&) { thrown = true; } + Require(thrown); +} + +template +static void ExpectRejected(unsigned& accepted, const char* name, TAction action) { + bool thrown = false; + try { action(); } catch (const TError&) { thrown = true; } + if (thrown) return; + std::fprintf(stderr, "NGS2 capture validation: %s was accepted\n", name); + ++accepted; +} + +static void RenderGrain(std::uintptr_t system) { + std::array samples{}; + const Ngs2RenderBufferInfo output{samples.data(), sizeof(samples), SCE_NGS2_WAVEFORM_TYPE_PCM_F32L, 1}; + Require(sceNgs2SystemRender(system, &output, 1) == SCE_NGS2_OK); +} + +static void TestCaptureValidation() { + const auto firstBuffer = usedBuffers; + std::array pcm{}; + pcm.fill(1000); + PeerAction peer; + const auto setup = CreatePeerSystem(peer); + const auto configured = MonoSampler(setup.system); + const auto stream = MonoSampler(setup.system); + Require(AddBlocks(stream, pcm.data(), SCE_NGS2_WAVEFORM_BLOCKS_FLAG_CONTINUE, {0, 64, 0, 0, 4096, 0, 0}) == SCE_NGS2_OK); + const auto f32 = MonoSampler(setup.system, SCE_NGS2_WAVEFORM_TYPE_PCM_F32L); + const auto atrac9 = Sampler(setup.system, false); + const auto fresh = Sampler(setup.system, false); + unsigned checked = 0; + unsigned accepted = 0; + peer.action = [&](unsigned tick) { + if (tick != 0) return; + ExpectRejected(accepted, "a block whose data does not fit", [&] { AddBlocks(configured, pcm.data(), 0, {0, 1, 0, 0, 2, 0, 0}); }); + ExpectRejected(accepted, "an append with no waveform", [&] { AddBlocks(configured, pcm.data(), SCE_NGS2_WAVEFORM_BLOCKS_FLAG_APPEND, {0, 2, 0, 0, 0, 0, 0}); }); + ExpectRejected(accepted, "a partial-frame append", [&] { + AddBlocks(stream, pcm.data(), SCE_NGS2_WAVEFORM_BLOCKS_FLAG_APPEND | SCE_NGS2_WAVEFORM_BLOCKS_FLAG_CONTINUE, {64, 3, 0, 0, 0, 0, 0}); + }); + ExpectRejected(accepted, "a dataless silence block on a float voice", [&] { AddBlocks(f32, pcm.data(), SCE_NGS2_WAVEFORM_BLOCKS_FLAG_SILENCE, {0, 0, 0, 0, 16, 0, 0}); }); + ExpectRejected(accepted, "an ATRAC9 setup with a mismatched config", [&] { + Control(atrac9, SCE_NGS2_SAMPLER_VOICE_PARAM_SETUP, Ngs2SamplerVoiceSetupParam{{}, {SCE_NGS2_WAVEFORM_TYPE_ATRAC9, 1, 48000, 0, 0, 0}}); + }); + Control(fresh, SCE_NGS2_SAMPLER_VOICE_PARAM_SETUP, Ngs2SamplerVoiceSetupParam{{}, {SCE_NGS2_WAVEFORM_TYPE_PCM_I16L, 1, 48000, 0, 0, 0}}); + ExpectRejected(accepted, "a block that does not fit a buffered setup", [&] { AddBlocks(fresh, pcm.data(), 0, {0, 1, 0, 0, 2, 0, 0}); }); + Require(accepted == 0); + Require(AddBlocks(fresh, pcm.data(), 0, {0, 4, 0, 0, 2, 0, 0}) == SCE_NGS2_OK); + Require(AddBlocks(stream, pcm.data(), SCE_NGS2_WAVEFORM_BLOCKS_FLAG_APPEND | SCE_NGS2_WAVEFORM_BLOCKS_FLAG_CONTINUE, {64, 4, 0, 0, 0, 0, 0}) == SCE_NGS2_OK); + ++checked; + }; + for (unsigned grain = 0; grain < 3; ++grain) RenderGrain(setup.system); + Require(checked == 1 && sceNgs2SystemDestroy(setup.system, nullptr) == SCE_NGS2_OK); + ResetBuffers(firstBuffer); +} + +static void TestApplyFailureRecovers() { + const auto firstBuffer = usedBuffers; + std::array pcm{}; + pcm.fill(1000); + PeerAction peer; + const auto setup = CreatePeerSystem(peer); + const auto voice = MonoSampler(setup.system); + Require(AddBlocks(voice, pcm.data(), SCE_NGS2_WAVEFORM_BLOCKS_FLAG_CONTINUE, {0, 32, 0, 0, 16, 0, 0}) == SCE_NGS2_OK); + Patch(voice, setup.master); + Event(voice, SCE_NGS2_VOICE_EVENT_PLAY); + peer.action = [&](unsigned tick) { + if (tick != 0) return; + Require(AddBlocks(voice, pcm.data(), SCE_NGS2_WAVEFORM_BLOCKS_FLAG_APPEND | SCE_NGS2_WAVEFORM_BLOCKS_FLAG_CONTINUE, {32, 32, 0, 0, 0, 0, 0}) == SCE_NGS2_OK); + Control(voice, SCE_NGS2_VOICE_PARAM_PORT_VOLUME, Ngs2VoicePortVolumeParam{{}, 0, 0.5f}); + Event(voice, SCE_NGS2_VOICE_EVENT_PLAY); + }; + RenderGrain(setup.system); + RequireThrows([&] { RenderGrain(setup.system); }); + Require(Flags(voice) == SCE_NGS2_VOICE_STATE_FLAG_INUSE); + RenderGrain(setup.system); + RenderGrain(setup.system); + Ngs2VoicePortInfo info{}; + Require(sceNgs2VoiceGetPortInfo(voice, 0, &info, sizeof(info)) == SCE_NGS2_OK && info.volume == 0.5f && info.dest_handle == setup.master); + Require(sceNgs2SystemDestroy(setup.system, nullptr) == SCE_NGS2_OK); + ResetBuffers(firstBuffer); +} + +static void RequirePort(std::uintptr_t voice, std::uintptr_t dest, float volume) { + Ngs2VoicePortInfo info{}; + Require(sceNgs2VoiceGetPortInfo(voice, 0, &info, sizeof(info)) == SCE_NGS2_OK); + Require(info.dest_handle == dest && info.volume == volume && info.matrix_id == -1 && info.dest_input_id == 0); +} + +static void TestEmptySetupPort() { + const auto firstBuffer = usedBuffers; + PeerAction peer; + const auto setup = CreatePeerSystem(peer); + const auto configured = MonoSampler(setup.system); + const auto bare = Sampler(setup.system, false); + for (const auto voice : {configured, bare}) { + Patch(voice, setup.master); + Control(voice, SCE_NGS2_VOICE_PARAM_PORT_VOLUME, Ngs2VoicePortVolumeParam{{}, 0, 0.25f}); + } + peer.action = [&](unsigned tick) { + if (tick != 0) return; + for (const auto voice : {configured, bare}) Control(voice, SCE_NGS2_SAMPLER_VOICE_PARAM_SETUP, Ngs2SamplerVoiceSetupParam{}); + RequirePort(configured, setup.master, 0.25f); + RequirePort(bare, 0, 1.0f); + }; + for (unsigned grain = 0; grain < 2; ++grain) { + RenderGrain(setup.system); + RequirePort(configured, setup.master, 0.25f); + RequirePort(bare, 0, 1.0f); + } + Require(sceNgs2SystemDestroy(setup.system, nullptr) == SCE_NGS2_OK); + ResetBuffers(firstBuffer); +} + +static void TestPendingPatchDestroyedDest() { + const auto firstBuffer = usedBuffers; + PeerAction peer; + const auto setup = CreatePeerSystem(peer); + const auto source = Voice(CreateRack(setup.system, SCE_NGS2_RACK_ID_SUBMIXER)); + Control(source, SCE_NGS2_SUBMIXER_VOICE_PARAM_SETUP, Ngs2SubmixerVoiceSetupParam{{}, 1, 0}); + Ngs2ContextBufferInfo query{}; + Require(sceNgs2RackQueryBufferSize(SCE_NGS2_RACK_ID_SUBMIXER, nullptr, &query) == SCE_NGS2_OK); + const auto destBuffer = Buffer(query); + std::uintptr_t destRack = 0; + Require(TestRackCreate(setup.system, SCE_NGS2_RACK_ID_SUBMIXER, nullptr, &destBuffer, &destRack) == SCE_NGS2_OK); + const auto dest = Voice(destRack); + Control(dest, SCE_NGS2_SUBMIXER_VOICE_PARAM_SETUP, Ngs2SubmixerVoiceSetupParam{{}, 1, 0}); + const auto rackSource = Voice(CreateRack(setup.system, SCE_NGS2_RACK_ID_SUBMIXER)); + Control(rackSource, SCE_NGS2_SUBMIXER_VOICE_PARAM_SETUP, Ngs2SubmixerVoiceSetupParam{{}, 1, 0}); + peer.action = [&](unsigned tick) { + if (tick != 0) return; + Patch(source, dest); + Patch(rackSource, destRack); + RequirePort(source, dest, 1.0f); + RequirePort(rackSource, dest, 1.0f); + }; + RenderGrain(setup.system); + RequirePort(source, dest, 1.0f); + Require(sceNgs2RackDestroy(destRack, nullptr) == SCE_NGS2_OK); + RequirePort(source, 0, 1.0f); + std::uintptr_t reused = 0; + Require(TestRackCreate(setup.system, SCE_NGS2_RACK_ID_SUBMIXER, nullptr, &destBuffer, &reused) == SCE_NGS2_OK && reused == destRack); + RequirePort(source, 0, 1.0f); + RequirePort(rackSource, 0, 1.0f); + RenderGrain(setup.system); + RequirePort(source, 0, 1.0f); + RequirePort(rackSource, 0, 1.0f); + Require(sceNgs2SystemDestroy(setup.system, nullptr) == SCE_NGS2_OK); + ResetBuffers(firstBuffer); +} + +struct RaceManager { + Manager base; + std::function control; + bool started = false; +}; + +static int APS5_VABI RaceSubmit(std::uintptr_t handle, Ngs2JobHandler handler, void* context, std::uint32_t count) { + reinterpret_cast(handle)->base.batches.push_back({handler, context, count}); + return SCE_NGS2_OK; +} + +static int APS5_VABI RaceComplete(std::uintptr_t handle) { + auto& manager = *reinterpret_cast(handle); + std::thread control; + if (!manager.started && !manager.base.batches.empty() && manager.control) { + manager.started = true; + control = std::thread(manager.control); + } + for (const auto& batch : manager.base.batches) { + std::vector workers; + for (std::uint32_t i = 0; i < batch.count; ++i) workers.emplace_back([&, i] { batch.handler(batch.context, i); }); + for (auto& worker : workers) worker.join(); + } + manager.base.batches.clear(); + if (control.joinable()) control.join(); + return SCE_NGS2_OK; +} + +static int APS5_VABI RaceDestroy(std::uintptr_t handle) { + Require(reinterpret_cast(handle)->base.batches.empty()); + return SCE_NGS2_OK; +} + +static void TestBlockQueueRace() { + const auto firstBuffer = usedBuffers; + RaceManager manager{{{}, 2}, {}, false}; + Ngs2JobSchedulerOption scheduler{}; + scheduler.size = sizeof(scheduler); + scheduler.user_data = reinterpret_cast(&manager); + scheduler.query_handler = Query; + scheduler.init_handler = Initialize; + scheduler.destroy_handler = RaceDestroy; + scheduler.submit_handler = RaceSubmit; + scheduler.flush_handler = RaceComplete; + scheduler.join_handler = RaceComplete; + scheduler.num_workers = 2; + scheduler.max_jobs = 16; + PeerAction peer; + peer.action = [](unsigned) {}; + const auto setup = CreatePeerSystem(peer, &scheduler); + const auto voice = MonoSampler(setup.system); + std::array pcm{}; + pcm.fill(1000); + Require(AddBlocks(voice, pcm.data(), 0, {0, 32, 0, 0, 16, 0, 0}) == SCE_NGS2_OK); + Patch(voice, setup.master); + Event(voice, SCE_NGS2_VOICE_EVENT_PLAY); + bool controlled = false; + manager.control = [&] { + Require(AddBlocks(voice, pcm.data(), SCE_NGS2_WAVEFORM_BLOCKS_FLAG_RESET, {0, sizeof(pcm), 0, 0, pcm.size(), 0, 0}) == SCE_NGS2_OK); + Event(voice, SCE_NGS2_VOICE_EVENT_PLAY); + controlled = true; + }; + std::array samples{}; + const Ngs2RenderBufferInfo output{samples.data(), sizeof(samples), SCE_NGS2_WAVEFORM_TYPE_PCM_F32L, 1}; + for (unsigned grain = 0; grain < 3; ++grain) { + samples.fill(-1234.0f); + Require(sceNgs2SystemRender(setup.system, &output, 1) == SCE_NGS2_OK); + if (grain == 2) for (const float sample : samples) Require(sample == 1000.0f / 32768.0f); + } + Require(manager.started && controlled && Flags(voice) == static_cast(SCE_NGS2_VOICE_STATE_FLAG_INUSE | SCE_NGS2_VOICE_STATE_FLAG_PLAYING)); + Require(sceNgs2SystemDestroy(setup.system, nullptr) == SCE_NGS2_OK); + ResetBuffers(firstBuffer); +} + +int main(int argc, char** argv) { + if (argc > 1) { + const std::pair scenarios[] = {{"validation", TestCaptureValidation}, {"recover", TestApplyFailureRecovers}, + {"emptysetup", TestEmptySetupPort}, {"destroyed", TestPendingPatchDestroyedDest}, {"race", TestBlockQueueRace}}; + for (const auto& [name, run] : scenarios) { + if (std::strcmp(argv[1], name) != 0) continue; + run(); + std::printf("NGS2 worker buffering: %s scenario passed\n", name); + return 0; + } + std::fprintf(stderr, "unknown scenario %s\n", argv[1]); + return 2; + } unsigned cases = 0; for (bool custom : {false, true}) for (unsigned order = 0; order < 3; ++order) for (auto update : {Update::Play, Update::Start, Update::Pause, Update::Kill, Update::Volume, Update::Matrix, Update::Combined, Update::Pitch, Update::Gain}) { @@ -245,6 +717,10 @@ int main() { } } 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); @@ -258,6 +734,18 @@ int main() { } Require(changed); cases += 3; + for (auto order : {SetupOrder::SetupOnly, SetupOrder::PlaySetup, SetupOrder::SetupPlay}) { + TestBufferedSetup(order); + ++cases; + } + TestBufferedSamplerSetup(); + ++cases; + TestCaptureValidation(); + TestApplyFailureRecovers(); + TestEmptySetupPort(); + TestPendingPatchDestroyedDest(); + TestBlockQueueRace(); + cases += 5; std::printf("NGS2 worker buffering: %u scenarios passed\n", cases + 1); return 0; } diff --git a/core/libs/prx/libSceNgs2.native/tests/Ngs2Parse.cpp b/core/libs/prx/libSceNgs2.native/tests/Ngs2Parse.cpp index ddc412134c26..6e7e2d269427 100644 --- a/core/libs/prx/libSceNgs2.native/tests/Ngs2Parse.cpp +++ b/core/libs/prx/libSceNgs2.native/tests/Ngs2Parse.cpp @@ -186,17 +186,25 @@ static void TestParseFileBank() { } static void TestFrameInfoPcm() { - for (std::uint32_t channels = 1; channels <= 8; channels++) { - for (const std::uint32_t rate : {1u, 22050u, 48000u, 192000u}) { - const Ngs2WaveformFormat format{SCE_NGS2_WAVEFORM_TYPE_PCM_I16L, channels, rate, 0, 0, 0}; - std::uint32_t frameSize = 0xa1, frameSamples = 0xa2, units = 0xa3, delay = 0xa4; - Require(sceNgs2GetWaveformFrameInfo(&format, &frameSize, &frameSamples, &units, &delay) == SCE_NGS2_OK); - Require(frameSize == channels * 2 && frameSamples == 1 && units == 1 && delay == 0); - const auto file = PcmFile(channels, rate, 16, 10); - Ngs2WaveformInfo info{}; - Require(sceNgs2ParseWaveformData(file.data(), file.size(), &info) == SCE_NGS2_OK); - Require(info.audio_frame_size == frameSize && info.num_audio_frame_samples == frameSamples); - Require(info.num_audio_unit_per_frame == units && info.num_delay_samples == delay); + const std::pair types[] = { + {SCE_NGS2_WAVEFORM_TYPE_PCM_U8, 1}, {SCE_NGS2_WAVEFORM_TYPE_PCM_I16L, 2}, + {SCE_NGS2_WAVEFORM_TYPE_PCM_I24L, 3}, {SCE_NGS2_WAVEFORM_TYPE_PCM_I32L, 4}, + {SCE_NGS2_WAVEFORM_TYPE_PCM_F32L, 4}, {SCE_NGS2_WAVEFORM_TYPE_PCM_F64L, 8}, + }; + for (const auto& [type, bytes] : types) { + for (std::uint32_t channels = 1; channels <= 8; channels++) { + for (const std::uint32_t rate : {1u, 22050u, 48000u, 192000u}) { + const Ngs2WaveformFormat format{type, channels, rate, 0, 0, 0}; + std::uint32_t frameSize = 0xa1, frameSamples = 0xa2, units = 0xa3, delay = 0xa4; + Require(sceNgs2GetWaveformFrameInfo(&format, &frameSize, &frameSamples, &units, &delay) == SCE_NGS2_OK); + Require(frameSize == channels * bytes && frameSamples == 1 && units == 1 && delay == 0); + if (type != SCE_NGS2_WAVEFORM_TYPE_PCM_I16L) continue; + const auto file = PcmFile(channels, rate, 16, 10); + Ngs2WaveformInfo info{}; + Require(sceNgs2ParseWaveformData(file.data(), file.size(), &info) == SCE_NGS2_OK); + Require(info.audio_frame_size == frameSize && info.num_audio_frame_samples == frameSamples); + Require(info.num_audio_unit_per_frame == units && info.num_delay_samples == delay); + } } } const Ngs2WaveformFormat ignored{SCE_NGS2_WAVEFORM_TYPE_PCM_I16L, 2, 48000, 0x12345678, 3, 5}; @@ -228,13 +236,41 @@ static void TestFrameInfoErrors() { Require(sceNgs2GetWaveformFrameInfo(&format, &values[0], &values[1], &values[2], &values[3]) == SCE_NGS2_ERROR_INVALID_WAVEFORM_FORMAT); Require(untouched()); } - for (const std::uint32_t type : {0u, 0x10u, 0x11u, 0x13u, 0x14u, 0x16u, SCE_NGS2_WAVEFORM_TYPE_PCM_F32L, 0x19u, 0x41u, 0xffffffffu}) { + for (const std::uint32_t type : {0u, 0x10u, 0x13u, 0x19u, 0x41u, 0xffffffffu}) { Require(FrameInfoThrows({type, 2, 48000, 0, 0, 0})); } } +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/Ngs2Ps4VoiceState.cpp b/core/libs/prx/libSceNgs2.native/tests/Ngs2Ps4VoiceState.cpp new file mode 100644 index 000000000000..9926d09f596c --- /dev/null +++ b/core/libs/prx/libSceNgs2.native/tests/Ngs2Ps4VoiceState.cpp @@ -0,0 +1,47 @@ +#include "Ngs2Test.hpp" +#include "prx/libSceNgs2.native/include/Api.hpp" + +#include +#include +#include +#include +#include + +static bool Untouched(const std::array& buffer) { + return std::all_of(buffer.begin(), buffer.end(), [](auto byte) { return byte == 0xaa; }); +} + +static void InvalidVoice(uintptr_t voice) { + std::uint32_t flags = 0xaaaaaaaa; + Require(sceNgs2VoiceGetStateFlags(voice, &flags) == SCE_NGS2_ERROR_PS4_INVALID_VOICE_HANDLE && flags == 0); + for (const std::size_t size : {std::size_t{64}, std::size_t{4}, std::size_t{0}, std::size_t{3}}) { + alignas(16) std::array buffer; + buffer.fill(0xaa); + const int expected = size < 4 ? SCE_NGS2_ERROR_PS4_INVALID_STATE_SIZE : SCE_NGS2_ERROR_PS4_INVALID_VOICE_HANDLE; + Require(sceNgs2VoiceGetState(voice, reinterpret_cast(buffer.data()), size) == expected); + Require(Untouched(buffer)); + } +} + +int main() { + try { + alignas(16) static std::array zeroedVoice{}; + InvalidVoice(reinterpret_cast(zeroedVoice.data())); + InvalidVoice(0x1234); + const auto system = CreateSystem(); + const auto rack = CreateRack(system, SCE_NGS2_RACK_ID_SAMPLER); + const auto voice = Voice(rack); + std::uint32_t flags = 0xaaaaaaaa; + Require(sceNgs2VoiceGetStateFlags(voice, &flags) == SCE_NGS2_OK && flags == 0); + Ngs2SamplerVoiceState state{}; + Require(sceNgs2VoiceGetState(voice, &state.voice_state, sizeof(state)) == SCE_NGS2_OK); + Require(sceNgs2RackDestroy(rack, nullptr) == SCE_NGS2_OK); + InvalidVoice(voice); + Require(sceNgs2SystemDestroy(system, nullptr) == SCE_NGS2_OK); + std::cout << "NGS2 PS4 voice state errors checked\n"; + return 0; + } catch (const std::exception& error) { + std::cerr << error.what() << '\n'; + return 1; + } +} diff --git a/core/libs/prx/libSceNgs2.native/tests/Ngs2Render.cpp b/core/libs/prx/libSceNgs2.native/tests/Ngs2Render.cpp index 4960b3a68d6f..34d94907fbbe 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); @@ -104,7 +114,7 @@ static void TestPcmBlockEnd() { const auto system = CreateSystem(); const auto master = Mastering(system, 1); std::vector pcm; - for (int i = 0; i < 12; i++) pcm.push_back(static_cast(i * 1000 - 4000)); + for (int i = 0; i < static_cast(Grain) + 4; i++) pcm.push_back(static_cast(i * 1000 - 4000)); const auto sampler = Sampler(system, pcm, 0); Patch(sampler, master); Ngs2VoicePortInfo portInfo{}; @@ -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,20 +391,15 @@ static void TestPitchAndRepeat() { Event(sampler, SCE_NGS2_VOICE_EVENT_PLAY); callbackFlags.clear(); - const std::int16_t first[Grain] = {0, 0, 0, 0, 0, -30, 0, 470}; + 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] == first[i]); - Require(callbackFlags.size() == 1 && callbackFlags[0] == SCE_NGS2_VOICE_CALLBACK_FLAG_BLOCK_REPEAT); - - const std::int16_t second[Grain] = {1000, 1500, 2000, 2621, 3000, 1500, 0, 379}; - out = RenderI16(system); - for (std::uint32_t i = 0; i < Grain; i++) Require(out[i] == second[i]); - Require(callbackFlags.size() == 2 && callbackFlags[1] == SCE_NGS2_VOICE_CALLBACK_FLAG_BLOCK_END); + 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})); out = RenderI16(system); - const std::int16_t tail[Grain] = {1000, 1500, 2000, 2621, 3000, 1530, 0, -91}; - for (std::uint32_t i = 0; i < Grain; ++i) Require(out[i] == tail[i]); - Require(callbackFlags.size() == 2 && callbackFlags[1] == SCE_NGS2_VOICE_CALLBACK_FLAG_BLOCK_END); - Require(Flags(sampler) == 0); + for (const auto sample : out) Require(sample == 0); + Require(callbackFlags.size() == 2 && Flags(sampler) == 0); Require(sceNgs2SystemDestroy(system, nullptr) == SCE_NGS2_OK); } @@ -412,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}}); @@ -422,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); } @@ -462,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); @@ -492,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); @@ -556,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{}; @@ -565,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); @@ -860,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); @@ -1130,9 +1233,11 @@ 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[Grain] = {0, 0, 0, 0, 0, -30, 0, 470}; + 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] == expected[i]); + 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); } @@ -1163,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 ? 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}) { @@ -1276,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); } @@ -1766,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; @@ -1798,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); @@ -1829,10 +1989,166 @@ 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() { @@ -1876,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(); @@ -2048,6 +2425,9 @@ int main() { TestMasteringGainClampedLikePs5(); TestSystemOptionFlags(); + + if (!Ps4Library) TestDefaultMapLikePs5(); + TestUserData(); TestPcmCallbackReset(); TestPcmCallbackRefill(); @@ -2055,6 +2435,9 @@ int main() { TestSetupClearsCallback(); TestMasteringGain(); TestMatrixLevelClamp(); + + TestPortVolumeClampedLikePs5(); + TestStereoIntoSurround(); TestLock(); TestRackLockLeavesQueries(); @@ -2064,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 ad5d5b4c1fef..57fc53084e0b 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 353d659a9926..e413d91a8599 100644 --- a/core/libs/prx/libSceNgs2.native/tests/Ngs2Stream.cpp +++ b/core/libs/prx/libSceNgs2.native/tests/Ngs2Stream.cpp @@ -44,34 +44,34 @@ static void TestStreamEndsAtDeclaredSamples() { const auto master = Mastering(system, 1); const auto rack = CreateRack(system, SCE_NGS2_RACK_ID_SAMPLER); const auto voice = StreamVoice(rack, 0, master); - const std::vector first(6, 16384); - const std::vector second(8, 8192); - const std::vector last(6, 4096); + const std::vector first(Grain - 2, 16384); + const std::vector second(Grain, 8192); + const std::vector last(Grain - 2, 4096); - AddBlock(voice, first.data(), first.size() * 2, 20, SCE_NGS2_WAVEFORM_BLOCKS_FLAG_CONTINUE); + 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 == 6 && state.decoded_data_size == 12 && state.waveform_data == first.data() + 6); + 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 == 6 && state.decoded_data_size == 12); + Require(state.num_decoded_samples == first.size() && state.decoded_data_size == first.size() * 2); - AddBlock(voice, second.data(), second.size() * 2, 20, 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() + 6); + 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 < 7 ? 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 == 14 && state.decoded_data_size == 28 && state.waveform_data == second.data() + 8); + 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, 20, SCE_NGS2_WAVEFORM_BLOCKS_FLAG_APPEND); + 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 < 5 ? 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); @@ -83,17 +83,17 @@ static void TestStreamClosedBeforeDeclaredSamples() { const auto master = Mastering(system, 1); const auto rack = CreateRack(system, SCE_NGS2_RACK_ID_SAMPLER); const auto voice = StreamVoice(rack, 0, master); - const std::vector first(6, 16384); + const std::vector first(Grain - 2, 16384); const std::vector closing(4, 8192); AddBlock(voice, first.data(), first.size() * 2, 1000, SCE_NGS2_WAVEFORM_BLOCKS_FLAG_CONTINUE); 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 80bf2089fea8..38fc0e432ebd 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*); @@ -80,7 +80,7 @@ inline bool FrameInfoThrows(const Ngs2WaveformFormat& format) { #if defined(NGS2_TEST_GRAIN) inline constexpr std::uint32_t Grain = NGS2_TEST_GRAIN; #else -inline constexpr std::uint32_t Grain = 8; +inline constexpr std::uint32_t Grain = 64; #endif template diff --git a/core/libs/prx/libSceNgs2/CMakeLists.txt b/core/libs/prx/libSceNgs2/CMakeLists.txt index d64e678c3ef2..7fcf07b212e0 100644 --- a/core/libs/prx/libSceNgs2/CMakeLists.txt +++ b/core/libs/prx/libSceNgs2/CMakeLists.txt @@ -1,5 +1,6 @@ include(${CMAKE_CURRENT_SOURCE_DIR}/../libSceNgs2.native/Ngs2Library.cmake) add_sce_ngs2_library(libSceNgs2) +target_compile_definitions(libSceNgs2 PRIVATE APS5_NGS2_PS4_LIBRARY) target_sources(libSceNgs2 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/PendingExports.cpp) set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/PendingExports.cpp PROPERTIES COMPILE_OPTIONS -fvisibility=default) @@ -21,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) @@ -31,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) @@ -38,4 +43,5 @@ if(BUILD_TESTING) "PATH=path_list_prepend:$") endif() add_sce_ngs2_test(libSceNgs2 ngs2_core_pcm Ngs2Pcm.cpp) + add_sce_ngs2_test(libSceNgs2 ngs2_core_ps4_voice_state Ngs2Ps4VoiceState.cpp) endif() diff --git a/core/libs/prx/libSceNgs2/PendingExports.cpp b/core/libs/prx/libSceNgs2/PendingExports.cpp index e1942c492329..4e1bc5c883a5 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 3398761ed6b2..de4b3c023d71 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/libSceNpAuth/Export.cpp b/core/libs/prx/libSceNpAuth/Export.cpp index 2d2b89ec9d4d..026144f14cd5 100644 --- a/core/libs/prx/libSceNpAuth/Export.cpp +++ b/core/libs/prx/libSceNpAuth/Export.cpp @@ -121,6 +121,7 @@ int APS5_VABI sceNpAuthGetIdToken(int req_id, const void* param, void* id_token) } int APS5_VABI sceNpAuthPollAsync(int req_id, int* result) { + if (!result) return ORBIS_NP_AUTH_ERROR_INVALID_ARGUMENT; std::lock_guard lock(g_requestMutex); auto it = g_requests.find(req_id); if (it == g_requests.end()) return ORBIS_NP_AUTH_ERROR_REQUEST_NOT_FOUND; @@ -129,7 +130,7 @@ int APS5_VABI sceNpAuthPollAsync(int req_id, int* result) { it->second.polled = true; return NP_POLL_ASYNC_RUNNING; } - if (result) *result = it->second.result; + *result = it->second.result; return NP_POLL_ASYNC_FINISHED; } diff --git a/core/libs/prx/libSceNpAuthAuthorizedAppDialog/CMakeLists.txt b/core/libs/prx/libSceNpAuthAuthorizedAppDialog/CMakeLists.txt index 15dcbb4f2e6e..e8d6b871fd5a 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 e483fc0a9dd3..55718664f4f1 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 1c59d8375280..dfd5e7d90a0e 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 a94c5c9e82ec..e964c0be971d 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 d4cc13ef6505..c438c9db8bef 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 77a7b33fc94b..d32ce8ed7cf7 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 000000000000..a03085914997 --- /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 b6479f111b75..718ddf19b7f9 100644 --- a/core/libs/prx/libSceNpCommon/PendingExports.cpp +++ b/core/libs/prx/libSceNpCommon/PendingExports.cpp @@ -6,52 +6,30 @@ extern "C" { -int APS5_VABI sceNpCloseSema(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceNpGetNavSdkVersion(void) { +int APS5_VABI sceNpGetSandboxMode() { NotImplemented_nid_no_patch(__func__); - return 0; } -int APS5_VABI sceNpIntGetPlatformType(void) { +int APS5_VABI sceNpUtilGetSandboxMode() { NotImplemented_nid_no_patch(__func__); - return 0; } -int APS5_VABI sceNpIntSetPlatformType(void) { - NotImplemented_nid_no_patch(__func__); - 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) { +int APS5_VABI sceNpCloseSema(void) { NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI sceNpJsonParseEx(void) { +int APS5_VABI sceNpGetNavSdkVersion(void) { NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI sceNpJsonParseExInit(void) { +int APS5_VABI sceNpIntGetPlatformType(void) { NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI sceNpJsonParseInit(void) { +int APS5_VABI sceNpIntSetPlatformType(void) { NotImplemented_nid_no_patch(__func__); return 0; } @@ -61,31 +39,6 @@ int APS5_VABI sceNpOpenSema(void) { 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 4ae852c42478..f0f9d3e111c7 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; @@ -131,11 +121,6 @@ int APS5_VABI _ZN3sce2np9JsonArray12AddItemArrayEPPS1_(void) { return 0; } -int APS5_VABI _ZN3sce2np6ObjectdaEPv(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI _ZN3sce2np14CalloutContextD0Ev(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -201,16 +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 _ZN3sce2np9NpTitleId5ParseEPS1_PKcm(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI _ZN3sce2np20BufferedStreamReaderD1Ev(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -246,11 +221,6 @@ int APS5_VABI sceNpUtilParseJid(void) { return 0; } -int APS5_VABI _ZN3sce2np6ObjectnaEmR16SceNpAllocatorEx(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI _ZN3sce2np9Semaphore6CreateEiiPKc(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -346,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; @@ -371,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; @@ -391,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; @@ -496,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; @@ -521,11 +471,6 @@ int APS5_VABI _ZN3sce2np14JsonDocBuilderC1ERKNS0_9JsonValueE(void) { return 0; } -int APS5_VABI _ZN3sce2np6ObjectdlEPvR16SceNpAllocatorEx(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI _ZN3sce2np9HttpTransD2Ev(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -536,11 +481,6 @@ int APS5_VABI _ZN3sce2np12HttpTemplateC2Ev(void) { return 0; } -int APS5_VABI _ZN3sce2np6ObjectdaEPvR14SceNpAllocator(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI _ZN3sce2np9EventFlag6CreateEPKcj(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -561,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; @@ -601,11 +526,6 @@ int APS5_VABI _ZN3sce2np7RingBufD0Ev(void) { return 0; } -int APS5_VABI _ZN3sce2np6ObjectnwEmR16SceNpAllocatorEx(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI _sceNpHeapMalloc(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -626,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; @@ -651,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; @@ -671,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 +606,6 @@ int APS5_VABI _ZN3sce2np4Time8AddHoursEl(void) { return 0; } -int APS5_VABI _ZN3sce2np9NpTitleIdC2ERK12SceNpTitleId(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI _ZN3sce2np12WorkerThreadD0Ev(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -736,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 25ddc8153517..4d559d4a0c60 100644 --- a/core/libs/prx/libSceNpCommon/Runtime.cpp +++ b/core/libs/prx/libSceNpCommon/Runtime.cpp @@ -94,6 +94,59 @@ bool IsOnlineIdText(const char* text) { } constexpr int NP_ERROR_BUFFER_TOO_SMALL = static_cast(0x80558008); + +constexpr int NP_ERROR_TITLE_ID_INVALID = static_cast(0x80559E11); +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), +}; + +bool SameTitleId(const char* lhs, const char* rhs) { + return std::strncmp(lhs, rhs, NP_TITLE_ID_LENGTH) == 0; +} + +bool IsTitleIdLetter(char c) { + return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'); +} + +bool IsTitleIdDigit(char c) { + return c >= '0' && c <= '9'; +} + +int StoreTitleId(NpTitleIdObject* out, const char* text, std::size_t length, std::size_t expected) { + if (length != expected) return NP_ERROR_TITLE_ID_INVALID; + if (!std::all_of(text, text + 4, IsTitleIdLetter) || !std::all_of(text + 4, text + NP_TITLE_ID_CODE_LENGTH, IsTitleIdDigit)) + return NP_ERROR_TITLE_ID_INVALID; + if (expected == NP_TITLE_ID_LENGTH && (text[9] != '_' || !IsTitleIdDigit(text[10]) || !IsTitleIdDigit(text[11]))) + return NP_ERROR_TITLE_ID_INVALID; + out->titleId = {}; + std::memcpy(out->titleId.data, text, NP_TITLE_ID_CODE_LENGTH); + 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; @@ -199,6 +252,153 @@ NpAllocator MemoryHeapAllocator(NpMemoryHeap* heap) { return {MemoryHeapAllocate, MemoryHeapReallocate, MemoryHeapRelease, 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; + std::memcpy(header, &allocator, sizeof(allocator)); + return header + NP_OBJECT_HEADER_SIZE; +} + +void ReleaseObject(void* object) { + if (object == nullptr) return; + auto* header = static_cast(object) - NP_OBJECT_HEADER_SIZE; + NpAllocator* allocator = nullptr; + std::memcpy(&allocator, header, sizeof(allocator)); + allocator->release(header, allocator->context); +} + constexpr int NP_ERROR_NOT_INITIALIZED = static_cast(0x80558001); constexpr int NP_ERROR_ALREADY_INITIALIZED = static_cast(0x80558002); constexpr int NP_ERROR_ALREADY_QUEUED = static_cast(0x80558006); @@ -507,6 +707,46 @@ NpAllocatorEx* APS5_VABI sceNpGlobalHeapGetAllocatorExPtr(void) { return &g_globalAllocatorEx; } +void* APS5_VABI _ZN3sce2np6ObjectnwEmR14SceNpAllocator(std::size_t size, NpAllocator* allocator) { + return AllocateObject(size, allocator); +} + +void* APS5_VABI _ZN3sce2np6ObjectnaEmR14SceNpAllocator(std::size_t size, NpAllocator* allocator) { + return AllocateObject(size, allocator); +} + +void APS5_VABI _ZN3sce2np6ObjectdlEPvR14SceNpAllocator(void* object, NpAllocator*) { + ReleaseObject(object); +} + +void APS5_VABI _ZN3sce2np6ObjectdaEPvR14SceNpAllocator(void* object, NpAllocator*) { + ReleaseObject(object); +} + +void* APS5_VABI _ZN3sce2np6ObjectnwEmR16SceNpAllocatorEx(std::size_t size, NpAllocatorEx* allocator) { + return AllocateObject(size, &allocator->allocator); +} + +void* APS5_VABI _ZN3sce2np6ObjectnaEmR16SceNpAllocatorEx(std::size_t size, NpAllocatorEx* allocator) { + return AllocateObject(size, &allocator->allocator); +} + +void APS5_VABI _ZN3sce2np6ObjectdlEPvR16SceNpAllocatorEx(void* object, NpAllocatorEx*) { + ReleaseObject(object); +} + +void APS5_VABI _ZN3sce2np6ObjectdaEPvR16SceNpAllocatorEx(void* object, NpAllocatorEx*) { + ReleaseObject(object); +} + +void APS5_VABI _ZN3sce2np6ObjectdlEPv(void* object) { + ReleaseObject(object); +} + +void APS5_VABI _ZN3sce2np6ObjectdaEPv(void* object) { + ReleaseObject(object); +} + int APS5_VABI sceNpAllocateKernelMemoryNoAlignment(std::uint64_t size, const char* name, void** address, NpKernelMemory* memory) { if (memory == nullptr) return NP_ERROR_NULL_OBJECT; const int result = MapKernelMemory(memory, size, name); @@ -771,4 +1011,365 @@ 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]; + self->titleId = {}; +} + +void APS5_VABI _ZN3sce2np9NpTitleIdC2Ev(NpTitleIdObject* self) { + _ZN3sce2np9NpTitleIdC1Ev(self); +} + +void APS5_VABI _ZN3sce2np9NpTitleIdC1ERKS1_(NpTitleIdObject* self, const NpTitleIdObject* other) { + self->vtable = &NpTitleIdVtable[2]; + self->titleId = other->titleId; +} + +void APS5_VABI _ZN3sce2np9NpTitleIdC2ERKS1_(NpTitleIdObject* self, const NpTitleIdObject* other) { + _ZN3sce2np9NpTitleIdC1ERKS1_(self, other); +} + +void APS5_VABI _ZN3sce2np9NpTitleIdC1ERK12SceNpTitleId(NpTitleIdObject* self, const NpTitleId* titleId) { + self->vtable = &NpTitleIdVtable[2]; + self->titleId = *titleId; +} + +void APS5_VABI _ZN3sce2np9NpTitleIdC2ERK12SceNpTitleId(NpTitleIdObject* self, const NpTitleId* titleId) { + _ZN3sce2np9NpTitleIdC1ERK12SceNpTitleId(self, titleId); +} + +void APS5_VABI _ZN3sce2np9NpTitleIdD1Ev(NpTitleIdObject*) {} + +void APS5_VABI _ZN3sce2np9NpTitleIdD2Ev(NpTitleIdObject*) {} + +void APS5_VABI _ZN3sce2np9NpTitleIdD0Ev(NpTitleIdObject* self) { + _ZN3sce2np6ObjectdlEPv(self); +} + +NpTitleIdObject* APS5_VABI _ZN3sce2np9NpTitleIdaSERKS1_(NpTitleIdObject* self, const NpTitleIdObject* other) { + self->titleId = other->titleId; + return self; +} + +void APS5_VABI _ZN3sce2np9NpTitleId5ClearEv(NpTitleIdObject* self) { + self->titleId = {}; +} + +bool APS5_VABI _ZNK3sce2np9NpTitleId7IsEmptyEv(const NpTitleIdObject* self) { + return self->titleId.data[0] == '\0'; +} + +bool APS5_VABI _ZNK3sce2np9NpTitleId6EqualsEPKc(const NpTitleIdObject* self, const char* titleId) { + return SameTitleId(self->titleId.data, titleId); +} + +bool APS5_VABI _ZNK3sce2np9NpTitleId6EqualsERKS1_(const NpTitleIdObject* self, const NpTitleIdObject* other) { + return SameTitleId(self->titleId.data, other->titleId.data); +} + +bool APS5_VABI _ZNK3sce2np9NpTitleId6EqualsERK12SceNpTitleId(const NpTitleIdObject* self, const NpTitleId* titleId) { + return SameTitleId(self->titleId.data, titleId->data); +} + +int APS5_VABI _ZN3sce2np9NpTitleId20ConstructFromTitleIdEPS1_PKc(NpTitleIdObject* out, const char* text) { + return StoreTitleId(out, text, std::strlen(text), NP_TITLE_ID_CODE_LENGTH); +} + +int APS5_VABI _ZN3sce2np9NpTitleId20ConstructFromTitleIdEPS1_PKcm(NpTitleIdObject* out, const char* text, std::size_t length) { + return StoreTitleId(out, text, length, NP_TITLE_ID_CODE_LENGTH); +} + +int APS5_VABI _ZN3sce2np9NpTitleId5ParseEPS1_PKc(NpTitleIdObject* out, const char* text) { + return StoreTitleId(out, text, std::strlen(text), NP_TITLE_ID_LENGTH); +} + +int APS5_VABI _ZN3sce2np9NpTitleId5ParseEPS1_PKcm(NpTitleIdObject* out, const char* text, std::size_t length) { + return StoreTitleId(out, text, length, NP_TITLE_ID_LENGTH); +} + +int APS5_VABI _ZN3sce2np9NpTitleId5BuildERKS1_Pcm(const NpTitleIdObject* titleId, char* text, std::size_t size) { + if (size <= NP_TITLE_ID_LENGTH) return NP_ERROR_TITLE_ID_BUFFER_TOO_SMALL; + std::memset(text, 0, size); + std::memcpy(text, titleId->titleId.data, NP_TITLE_ID_LENGTH + 1); + return 0; +} + +bool APS5_VABI _ZN3sce2npeqERKNS0_9NpTitleIdES3_(const NpTitleIdObject* lhs, const NpTitleIdObject* rhs) { + return SameTitleId(lhs->titleId.data, rhs->titleId.data); +} + +bool APS5_VABI _ZN3sce2npeqERKNS0_9NpTitleIdERK12SceNpTitleId(const NpTitleIdObject* lhs, const NpTitleId* rhs) { + return SameTitleId(lhs->titleId.data, rhs->data); +} + +bool APS5_VABI _ZN3sce2npneERKNS0_9NpTitleIdES3_(const NpTitleIdObject* lhs, const NpTitleIdObject* rhs) { + return !SameTitleId(lhs->titleId.data, rhs->titleId.data); +} + +bool APS5_VABI _ZN3sce2npneERK12SceNpTitleIdRKNS0_9NpTitleIdE(const NpTitleId* lhs, const NpTitleIdObject* rhs) { + return !SameTitleId(lhs->data, rhs->titleId.data); +} + +bool APS5_VABI _ZN3sce2npneERKNS0_9NpTitleIdERK12SceNpTitleId(const NpTitleIdObject* lhs, const NpTitleId* rhs) { + 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/Strings.cpp b/core/libs/prx/libSceNpCommon/Strings.cpp index bda070c212d8..79d4b8641e69 100644 --- a/core/libs/prx/libSceNpCommon/Strings.cpp +++ b/core/libs/prx/libSceNpCommon/Strings.cpp @@ -131,8 +131,10 @@ int ParseHex(const char* hex, std::size_t length, std::uint8_t* out, std::size_t if (capacity < length / 2) return NP_ERROR_BUFFER_TOO_SMALL; for (std::size_t i = 0; i < length; i += 2) { const int high = HexValue(hex[i]); + if (high < 0) return NP_ERROR_INVALID_ARGUMENT; + out[i / 2] = static_cast(high << 4); const int low = HexValue(hex[i + 1]); - if (high < 0 || low < 0) return NP_ERROR_INVALID_ARGUMENT; + if (low < 0) return NP_ERROR_INVALID_ARGUMENT; out[i / 2] = static_cast((high << 4) | low); } return 0; diff --git a/core/libs/prx/libSceNpCommon/include/Api.hpp b/core/libs/prx/libSceNpCommon/include/Api.hpp index 1cae74d9d897..02ca7ce914ec 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,14 +74,70 @@ 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; +}; + 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); @@ -91,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); @@ -166,6 +241,16 @@ void APS5_VABI sceNpGlobalHeapGetAllocator(NpAllocator* allocator); void APS5_VABI sceNpGlobalHeapGetAllocatorEx(NpAllocatorEx* allocator); NpAllocator* APS5_VABI sceNpGlobalHeapGetAllocatorPtr(void); NpAllocatorEx* APS5_VABI sceNpGlobalHeapGetAllocatorExPtr(void); +void* APS5_VABI _ZN3sce2np6ObjectnwEmR14SceNpAllocator(std::size_t size, NpAllocator* allocator); +void* APS5_VABI _ZN3sce2np6ObjectnaEmR14SceNpAllocator(std::size_t size, NpAllocator* allocator); +void APS5_VABI _ZN3sce2np6ObjectdlEPvR14SceNpAllocator(void* object, NpAllocator* allocator); +void APS5_VABI _ZN3sce2np6ObjectdaEPvR14SceNpAllocator(void* object, NpAllocator* allocator); +void* APS5_VABI _ZN3sce2np6ObjectnwEmR16SceNpAllocatorEx(std::size_t size, NpAllocatorEx* allocator); +void* APS5_VABI _ZN3sce2np6ObjectnaEmR16SceNpAllocatorEx(std::size_t size, NpAllocatorEx* allocator); +void APS5_VABI _ZN3sce2np6ObjectdlEPvR16SceNpAllocatorEx(void* object, NpAllocatorEx* allocator); +void APS5_VABI _ZN3sce2np6ObjectdaEPvR16SceNpAllocatorEx(void* object, NpAllocatorEx* allocator); +void APS5_VABI _ZN3sce2np6ObjectdlEPv(void* object); +void APS5_VABI _ZN3sce2np6ObjectdaEPv(void* object); int APS5_VABI sceNpAllocateKernelMemoryNoAlignment(std::uint64_t size, const char* name, void** address, NpKernelMemory* memory); int APS5_VABI sceNpAllocateKernelMemoryWithAlignment(std::uint64_t size, const char* name, void** address, NpKernelMemory* memory); int APS5_VABI sceNpFreeKernelMemory(NpKernelMemory* memory); @@ -224,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); @@ -238,11 +322,9 @@ 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); -int APS5_VABI _ZN3sce2np6ObjectdaEPv(void); int APS5_VABI _ZN3sce2np14CalloutContextD0Ev(void); int APS5_VABI _ZN3sce2np9Semaphore4WaitEj(void); int APS5_VABI _ZN3sce2npeqERKNS0_4TimeES3_(void); @@ -256,8 +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 _ZN3sce2np9NpTitleId5ParseEPS1_PKcm(void); int APS5_VABI _ZN3sce2np20BufferedStreamReaderD1Ev(void); int APS5_VABI _ZN3sce2np3ipc10IpmiClient7ConnectEPKvm(void); int APS5_VABI _ZN3sce2np4Cond4InitEPKcPNS0_5MutexE(void); @@ -265,7 +345,6 @@ int APS5_VABI _ZN3sce2np3ipc17ServiceIpmiClient10DisconnectEv(void); int APS5_VABI _ZN3sce2np3ipc10IpmiClient11IsConnectedEv(void); int APS5_VABI _ZN3sce2np12HttpTemplate19SetAuthInfoCallbackEPFii15SceHttpAuthTypePKcPcS5_iPPhPmPiPvESA_(void); int APS5_VABI sceNpUtilParseJid(void); -int APS5_VABI _ZN3sce2np6ObjectnaEmR16SceNpAllocatorEx(void); int APS5_VABI _ZN3sce2np9Semaphore6CreateEiiPKc(void); int APS5_VABI _ZN3sce2npleERKNS0_4TimeERK10SceRtcTick(void); int APS5_VABI sceNpUtilXmlUnescape(void); @@ -285,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); @@ -315,59 +391,130 @@ 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); int APS5_VABI _ZN3sce2np14JsonDocBuilderC1ERKNS0_9JsonValueE(void); -int APS5_VABI _ZN3sce2np6ObjectdlEPvR16SceNpAllocatorEx(void); int APS5_VABI _ZN3sce2np9HttpTransD2Ev(void); int APS5_VABI _ZN3sce2np12HttpTemplateC2Ev(void); -int APS5_VABI _ZN3sce2np6ObjectdaEPvR14SceNpAllocator(void); 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); -int APS5_VABI _ZN3sce2np6ObjectnwEmR16SceNpAllocatorEx(void); 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); int APS5_VABI _ZN3sce2np6Thread4dtorEv(void); int APS5_VABI _ZN3sce2np4Time8AddHoursEl(void); -int APS5_VABI _ZN3sce2np9NpTitleIdC2ERK12SceNpTitleId(void); int APS5_VABI _ZN3sce2np12WorkerThreadD0Ev(void); int APS5_VABI _ZN3sce2np13RingBufMemoryD0Ev(void); 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); +void APS5_VABI _ZN3sce2np9NpTitleIdC2ERKS1_(NpTitleIdObject* self, const NpTitleIdObject* other); +void APS5_VABI _ZN3sce2np9NpTitleIdC1ERK12SceNpTitleId(NpTitleIdObject* self, const NpTitleId* titleId); +void APS5_VABI _ZN3sce2np9NpTitleIdC2ERK12SceNpTitleId(NpTitleIdObject* self, const NpTitleId* titleId); +void APS5_VABI _ZN3sce2np9NpTitleIdD1Ev(NpTitleIdObject* self); +void APS5_VABI _ZN3sce2np9NpTitleIdD2Ev(NpTitleIdObject* self); +void APS5_VABI _ZN3sce2np9NpTitleIdD0Ev(NpTitleIdObject* self); +NpTitleIdObject* APS5_VABI _ZN3sce2np9NpTitleIdaSERKS1_(NpTitleIdObject* self, const NpTitleIdObject* other); +void APS5_VABI _ZN3sce2np9NpTitleId5ClearEv(NpTitleIdObject* self); +bool APS5_VABI _ZNK3sce2np9NpTitleId7IsEmptyEv(const NpTitleIdObject* self); +bool APS5_VABI _ZNK3sce2np9NpTitleId6EqualsEPKc(const NpTitleIdObject* self, const char* titleId); +bool APS5_VABI _ZNK3sce2np9NpTitleId6EqualsERKS1_(const NpTitleIdObject* self, const NpTitleIdObject* other); +bool APS5_VABI _ZNK3sce2np9NpTitleId6EqualsERK12SceNpTitleId(const NpTitleIdObject* self, const NpTitleId* titleId); +int APS5_VABI _ZN3sce2np9NpTitleId20ConstructFromTitleIdEPS1_PKc(NpTitleIdObject* out, const char* text); +int APS5_VABI _ZN3sce2np9NpTitleId20ConstructFromTitleIdEPS1_PKcm(NpTitleIdObject* out, const char* text, std::size_t length); +int APS5_VABI _ZN3sce2np9NpTitleId5ParseEPS1_PKc(NpTitleIdObject* out, const char* text); +int APS5_VABI _ZN3sce2np9NpTitleId5ParseEPS1_PKcm(NpTitleIdObject* out, const char* text, std::size_t length); +int APS5_VABI _ZN3sce2np9NpTitleId5BuildERKS1_Pcm(const NpTitleIdObject* titleId, char* text, std::size_t size); +bool APS5_VABI _ZN3sce2npeqERKNS0_9NpTitleIdES3_(const NpTitleIdObject* lhs, const NpTitleIdObject* rhs); +bool APS5_VABI _ZN3sce2npeqERKNS0_9NpTitleIdERK12SceNpTitleId(const NpTitleIdObject* lhs, const NpTitleId* rhs); +bool APS5_VABI _ZN3sce2npneERKNS0_9NpTitleIdES3_(const NpTitleIdObject* lhs, const NpTitleIdObject* rhs); +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 d3ffa1ac9ec1..c6c7e4e41d01 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 2e1e6f0c2595..33b677ea4b32 100644 --- a/core/libs/prx/libSceNpCppWebApi/Export.cpp +++ b/core/libs/prx/libSceNpCppWebApi/Export.cpp @@ -260,3415 +260,5710 @@ static int InitializeParameterWithBody(void* self, const std::uint64_t* context, return ParameterBodyMissing; } -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); -} - -int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi23ParameterToDownloadData9terminateEv(void* self) { - return TerminateParameter(self); -} - -int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi23ParameterToDownloadDataC1Ev(void* self) { - ConstructParameter(self); - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi23ParameterToDownloadDataD1Ev(void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead19getPlayerAttributesEv(void* self) { (void)self; + NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common10InitParamsC1Ev(void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V115LocationFactory6createEPNS1_6Common10LibContextEPNS5_12IntrusivePtrINS3_8LocationEEE(void* self) { (void)self; - return 0; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common10InitParamsD1Ev(void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V116AttributeFactory6createEPNS1_6Common10LibContextEPKcNS3_13AttributeTypeES9_PNS5_12IntrusivePtrINS3_9AttributeEEE(void* self) { (void)self; - return 0; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common10LibContextC1Ev(uint64_t* self) { - *self = 0; +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody10getPlayersEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); return 0; } -// Initialization succeeds as on an offline console (see libSceJson2); individual requests fail. -int APS5_VABI _ZN3sce2Np9CppWebApi6Common10initializeERKNS2_10InitParamsERNS2_10LibContextE(const void* params, uint64_t* context) { - (void)params; - if (context) *context = 1; +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody10getPlayersEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody19getTicketAttributesEv(void* self) { (void)self; + NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V121PlayerForTicketCreate10setNatTypeERKi(void* self) { (void)self; return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEENS4_INS6_9RecordApi26RecordScoreResponseHeadersEEEEC1Ev(void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V121PlayerForTicketCreate11setTeamNameEPKc(void* self) { (void)self; return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEENS4_INS6_9RecordApi26RecordScoreResponseHeadersEEEED1Ev(void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V121PlayerForTicketCreate19setPlayerAttributesERKNS1_6Common6VectorINS5_12IntrusivePtrINS3_9AttributeEEEEE(void* self) { (void)self; return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V123SubmitTicketRequestBody11setLocationERKNS1_6Common12IntrusivePtrINS3_8LocationEEE(void* self) { (void)self; return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V123SubmitTicketRequestBody19setTicketAttributesERKNS1_6Common6VectorINS5_12IntrusivePtrINS3_9AttributeEEEEE(void* self) { (void)self; return 0; } -static_assert(sizeof(IntrusivePtr) == 0x18); - -static constexpr std::size_t ReferenceCountOffset = 0; -static constexpr std::size_t VectorReferenceCountOffset = 0x30; - -static std::atomic_ref ReferenceCount(void* object, const std::size_t offset) { - return std::atomic_ref(*reinterpret_cast(static_cast(object) + offset)); -} - -static void CopyIntrusivePtr(IntrusivePtr* self, const IntrusivePtr* source, const std::size_t referenceCountOffset) { - *self = *source; - if (self->object) ReferenceCount(self->object, referenceCountOffset).fetch_add(1); -} - -static void ReleaseIntrusivePtr(IntrusivePtr* self, const std::size_t referenceCountOffset, const char* function) { - if (!self->object) return; - if (ReferenceCount(self->object, referenceCountOffset).fetch_sub(1) != 1) return; - if (!self->deleter) NotImplemented_nid_no_patch(function); - self->deleter(self->object); - self->object = nullptr; - self->deleter = nullptr; -} - -static void AssignIntrusivePtr(IntrusivePtr* self, const IntrusivePtr* source, const std::size_t referenceCountOffset, const char* function) { - if (self->object == source->object) return; - ReleaseIntrusivePtr(self, referenceCountOffset, function); - CopyIntrusivePtr(self, source, referenceCountOffset); -} - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V121GetRankingRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { - CopyIntrusivePtr(self, source, ReferenceCountOffset); -} - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V121GetRankingRequestBodyEEC1Ev(IntrusivePtr* self) { - *self = {}; +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V128PlayerForTicketCreateFactory6createEPNS1_6Common10LibContextERKmNS3_8PlatformEPNS5_12IntrusivePtrINS3_21PlayerForTicketCreateEEE(void* self) { + (void)self; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V121GetRankingRequestBodyEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V130SubmitTicketRequestBodyFactory6createEPNS1_6Common10LibContextEPKcRKNS5_6VectorINS5_12IntrusivePtrINS3_21PlayerForTicketCreateEEEEEPNSB_INS3_23SubmitTicketRequestBodyEEE(void* self) { + (void)self; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEC1Ev(IntrusivePtr* self) { - *self = {}; +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api12cancelTicketEiRKNS4_23ParameterToCancelTicketERNS1_6Common11TransactionINS8_15DefaultResponseENS8_12IntrusivePtrINS8_18ResponseHeaderBaseEEEEE(void* self) { + (void)self; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api12submitTicketEiRKNS4_23ParameterToSubmitTicketERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_24SubmitTicketResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE(void* self) { + (void)self; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { - CopyIntrusivePtr(self, source, ReferenceCountOffset); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api19ParameterToGetOffer10initializeEPNS1_6Common10LibContextEPKc(void* self, const std::uint64_t* context, const char* id) { + return InitializeParameter(self, context, id != nullptr); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEEC1Ev(IntrusivePtr* self) { - *self = {}; +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api19ParameterToGetOffer9terminateEv(void* self) { + return TerminateParameter(self); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api19ParameterToGetOfferC1Ev(void* self) { + ConstructParameter(self); + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEC1Ev(IntrusivePtr* self) { - *self = {}; +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api19ParameterToGetOfferD1Ev(void* self) { + (void)self; + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api20ParameterToGetTicket10initializeEPNS1_6Common10LibContextEPKc(void* self, const std::uint64_t* context, const char* id) { + return InitializeParameter(self, context, id != nullptr); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEEC1Ev(IntrusivePtr* self) { - *self = {}; +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api20ParameterToGetTicket7setviewEPKc(void* self, const char* view) { + return SetParameterText(self, view); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api20ParameterToGetTicket9terminateEv(void* self) { + return TerminateParameter(self); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V14UserEEC1Ev(IntrusivePtr* self) { - *self = {}; +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api20ParameterToGetTicketC1Ev(void* self) { + ConstructParameter(self); + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V14UserEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api20ParameterToGetTicketD1Ev(void* self) { + (void)self; + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V19RecordApi26RecordScoreResponseHeadersEEC1Ev(IntrusivePtr* self) { - *self = {}; +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToCancelTicket10initializeEPNS1_6Common10LibContextEPKc(void* self, const std::uint64_t* context, const char* id) { + return InitializeParameter(self, context, id != nullptr); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V19RecordApi26RecordScoreResponseHeadersEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToCancelTicket9terminateEv(void* self) { + return TerminateParameter(self); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_12Leaderboards2V15EntryEEEEEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, VectorReferenceCountOffset, __func__); +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToCancelTicketC1Ev(void* self) { + ConstructParameter(self); + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common13ConstIteratorINS2_12IntrusivePtrINS1_12Leaderboards2V15EntryEEEED2Ev(void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToCancelTicketD1Ev(void* self) { (void)self; return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { - return TransactionNotStarted; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEENS4_INS6_9RecordApi26RecordScoreResponseHeadersEEEE5startEPNS2_10LibContextE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEENS4_INS6_9RecordApi26RecordScoreResponseHeadersEEEE6finishEv() { - return TransactionNotStarted; +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 _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V127RecordLargeDataResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { - return TransactionNotStarted; +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToSubmitTicket9terminateEv(void* self) { + return TerminateParameter(self); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToSubmitTicketC1Ev(void* self) { + ConstructParameter(self); + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { - return TransactionNotStarted; +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V13Api23ParameterToSubmitTicketD1Ev(void* self) { + (void)self; + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common19UpStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V127RecordLargeDataResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextEm() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +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 _ZN3sce2Np9CppWebApi6Common19UpStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V127RecordLargeDataResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE8sendDataEPKvm() { - 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 _ZN3sce2Np9CppWebApi6Common19UpStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V127RecordLargeDataResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi11Matchmaking2V18Location16setGameSessionIdEPKc(void* self) { (void)self; return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common19UpStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V127RecordLargeDataResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead11getOnlineIdEv(void* self) { (void)self; + NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V17ViewApi37GetLargeDataByObjectIdResponseHeadersEEEE5startEPNS2_10LibContextE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V17ViewApi37GetLargeDataByObjectIdResponseHeadersEEEE6finishEv() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V17ViewApi37GetLargeDataByObjectIdResponseHeadersEEEE8readDataEPcm() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V17ViewApi37GetLargeDataByObjectIdResponseHeadersEEEEC1Ev(void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead11getPlatformEv(void* self) { (void)self; + NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V17ViewApi37GetLargeDataByObjectIdResponseHeadersEEEED1Ev(void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead11getTeamNameEv(void* self) { (void)self; + NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi27DownloadDataResponseHeadersEEEE5startEPNS2_10LibContextE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi27DownloadDataResponseHeadersEEEE6finishEv() { - return 0; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi27DownloadDataResponseHeadersEEEE8readDataEPcm() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead12getAccountIdEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi27DownloadDataResponseHeadersEEEEC1Ev(void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead13onlineIdIsSetEv(void* self) { (void)self; + NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi27DownloadDataResponseHeadersEEEED1Ev(void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead13platformIsSetEv(void* self) { (void)self; + NotImplemented_nid_no_patch(__func__); return 0; } -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; +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead13teamNameIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6StringD1Ev(CommonString* self) { - std::free(self->buffer); - self->buffer = nullptr; - self->bufferSize = 0; +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead14accountIdIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_12Leaderboards2V14UserEEEE8pushBackERKS8_() { - return 0; +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V113PlayerForRead21playerAttributesIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_12Leaderboards2V14UserEEEEC1EPNS2_10LibContextE(void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead11getOnlineIdEv(void* self) { (void)self; + NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_12Leaderboards2V14UserEEEED1Ev(void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead11getPlatformEv(void* self) { (void)self; + NotImplemented_nid_no_patch(__func__); return 0; } -void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_12Leaderboards2V15EntryEEEE3endEv(void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead11getTeamNameEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); - return nullptr; + return 0; } -void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_12Leaderboards2V15EntryEEEE5beginEv(void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead11getTicketIdEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); - return nullptr; + return 0; } -void* APS5_VABI _ZN3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_12Leaderboards2V15EntryEEEEppEv(void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead12getAccountIdEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); - return nullptr; + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common9terminateERNS2_10LibContextE(uint64_t* context) { - *context = 0; +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead13onlineIdIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); return 0; } -const void* APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V122GetRankingResponseBody22getLastUpdatedDateTimeEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead13platformIsSetEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); - return nullptr; + return 0; } -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V123RecordScoreResponseBody10getTmpRankEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead13teamNameIsSetEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); return 0; } -std::uint32_t APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V123RecordScoreResponseBody16getTmpSerialRankEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead13ticketIdIsSetEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody11getSortModeEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V118PlayerForOfferRead14accountIdIsSetEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); return 0; } -std::uint32_t APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody13getEntryLimitEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody10getOfferIdEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody13getUpdateModeEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody11getLocationEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); return 0; } -bool APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody13sortModeIsSetEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody11statusIsSetEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); - return false; + return 0; } -bool APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody15entryLimitIsSetEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody12offerIdIsSetEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); - return false; + return 0; } -bool APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody15updateModeIsSetEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody12playersIsSetEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); - return false; + return 0; } -std::int64_t APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody16getMaxScoreLimitEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody13locationIsSetEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); return 0; } -std::int64_t APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody16getMinScoreLimitEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody14getRulesetNameEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); return 0; } -bool APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody18maxScoreLimitIsSetEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody16rulesetNameIsSetEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); - return false; + return 0; } -bool APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody18minScoreLimitIsSetEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody18getCreatedDateTimeEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); - return false; + return 0; } -std::uint32_t APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody20getLargeDataNumLimitEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody18getUpdatedDateTimeEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); return 0; } -std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody21getLargeDataSizeLimitEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody20createdDateTimeIsSetEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); return 0; } -bool APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody22largeDataNumLimitIsSetEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody20updatedDateTimeIsSetEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); - return false; + return 0; } -bool APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody23largeDataSizeLimitIsSetEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V120GetOfferResponseBody9getStatusEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); - return false; + return 0; } -const char* APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry10getCommentEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody11getTicketIdEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); - return nullptr; + return 0; } -const char* APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry11getObjectIdEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody11statusIsSetEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); - return nullptr; + return 0; } -const char* APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry11getOnlineIdEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody12getSubmitterEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); - return nullptr; + return 0; } -bool APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry12commentIsSetEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody12playersIsSetEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); - return false; + return 0; } -std::uint64_t APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry12getAccountIdEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody13ticketIdIsSetEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); return 0; } -const void* APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry12getSmallDataEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody14getRulesetNameEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); - return nullptr; + return 0; } -std::uint32_t APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry13getSerialRankEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody14submitterIsSetEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); return 0; } -bool APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry13objectIdIsSetEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody16rulesetNameIsSetEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); - return false; + return 0; } -std::uint32_t APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry14getHighestRankEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody18getCreatedDateTimeEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); return 0; } -bool APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry14smallDataIsSetEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody18getUpdatedDateTimeEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); - return false; + return 0; } -std::uint32_t APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry20getHighestSerialRankEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody20createdDateTimeIsSetEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry7getPcIdEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody20updatedDateTimeIsSetEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); return 0; } -std::uint32_t APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry7getRankEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody21ticketAttributesIsSetEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); return 0; } -std::int64_t APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry8getScoreEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V121GetTicketResponseBody9getStatusEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); return 0; } -const char* APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V19RecordApi26RecordScoreResponseHeaders24getXPsnAtomicOperationIdEv(const void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V124SubmitTicketResponseBody11getTicketIdEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); - return nullptr; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; + return 0; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEENS4_INS6_9RecordApi26RecordScoreResponseHeadersEEEE11getResponseERS8_() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V124SubmitTicketResponseBody13ticketIdIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V18Location16getGameSessionIdEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V121GetRankingRequestBodyEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V18Location18gameSessionIdIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V19Attribute7getNameEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V19Attribute7getTypeEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V19Attribute8getValueEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V19Submitter11getPlatformEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V14UserEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V19Submitter12getAccountIdEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V15EntryEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V19Submitter13platformIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V19RecordApi26RecordScoreResponseHeadersEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZNK3sce2Np9CppWebApi11Matchmaking2V19Submitter14accountIdIsSetEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6BinaryEEptEv(const IntrusivePtr* self) { - return self->object; +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); } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_12Leaderboards2V15EntryEEEEEEdeEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi23ParameterToDownloadData9terminateEv(void* self) { + return TerminateParameter(self); } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEENS4_INS6_9RecordApi26RecordScoreResponseHeadersEEEE18getResponseHeadersERSB_() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi23ParameterToDownloadDataC1Ev(void* self) { + ConstructParameter(self); + return 0; } -std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6Binary4sizeEv(const void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi23ParameterToDownloadDataD1Ev(void* self) { (void)self; - NotImplemented_nid_no_patch(__func__); return 0; } -const void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common6Binary9getBinaryEv(const void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V129SetDataInfoRequestBodyFactory6createEPNS1_6Common10LibContextEPvmPNS5_12IntrusivePtrINS3_22SetDataInfoRequestBodyEEE(void* self) { (void)self; - NotImplemented_nid_no_patch(__func__); - return nullptr; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -const char* APS5_VABI _ZNK3sce2Np9CppWebApi6Common6String5c_strEv(const CommonString* self) { - return self->buffer != nullptr ? self->buffer : ""; +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi10uploadDataEiRKNS4_21ParameterToUploadDataERNS1_6Common19UpStreamTransactionINS8_12IntrusivePtrINS3_22UploadDataResponseBodyEEENSA_INS4_25UploadDataResponseHeadersEEEEE(void* self) { + (void)self; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_12Leaderboards2V15EntryEEEEdeEv(const void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi10uploadDataEiRKNS4_42ParameterWithBinaryRequestBodyToUploadDataERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_22UploadDataResponseBodyEEENSA_INS4_25UploadDataResponseHeadersEEEEE(void* self) { (void)self; - NotImplemented_nid_no_patch(__func__); - return nullptr; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -bool APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_12Leaderboards2V15EntryEEEEneERKS9_(const void* self, const void* other) { +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi11setDataInfoEiRKNS4_22ParameterToSetDataInfoERNS1_6Common11TransactionINS8_15DefaultResponseENS8_12IntrusivePtrINS4_26SetDataInfoResponseHeadersEEEEE(void* self) { (void)self; - (void)other; - NotImplemented_nid_no_patch(__func__); - return false; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -// Shared vector bodies. A Vector handle is an IntrusivePtr whose object is a body; -// bodies adopted from a title through the pointer/deleter constructor keep their -// 32-bit reference count at 0x30, so bodies created here do the same. -static constexpr std::uint64_t VectorBodyMagic = 0x434e507056656342ULL; -struct VectorBody { - std::uint64_t magic; - std::uint8_t reserved[0x28]; - std::int32_t referenceCount; - std::int32_t elementKind; // 1 = IntrusivePtr elements, 2 = String elements - void* elements; - std::uint64_t size; - std::uint64_t capacity; -}; -static_assert(sizeof(VectorBody) == 0x50 && offsetof(VectorBody, referenceCount) == 0x30); - -static void APS5_VABI DestroyVectorBody(void* object) { - auto* body = static_cast(object); - if (body->elementKind == 1) { - auto* elements = static_cast(body->elements); - for (std::uint64_t index = 0; index < body->size; ++index) { - ReleaseIntrusivePtr(&elements[index], 0x00, __func__); - } - } else if (body->elementKind == 2) { - auto* elements = static_cast(body->elements); - for (std::uint64_t index = 0; index < body->size; ++index) { - std::free(elements[index].buffer); - } - } - std::free(body->elements); - std::free(body); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi12downloadDataEiRKNS4_23ParameterToDownloadDataERNS1_6Common11TransactionINS8_12IntrusivePtrINS8_6BinaryEEENSA_INS4_27DownloadDataResponseHeadersEEEEE(void* self) { + (void)self; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -static VectorBody* VectorBodyFor(IntrusivePtr* self, const std::int32_t elementKind, const char* function) { - auto* body = static_cast(self->object); - if (body == nullptr) { - body = static_cast(std::calloc(1, sizeof(VectorBody))); - if (body == nullptr) return nullptr; - body->magic = VectorBodyMagic; - body->referenceCount = 1; - body->elementKind = elementKind; - self->object = body; - self->deleter = &DestroyVectorBody; - return body; - } - if (body->magic != VectorBodyMagic || body->elementKind != elementKind) { - // appending to a title-provided body needs its element layout, which is unknown - NotImplemented_nid_no_patch(function); - return nullptr; - } - return body; +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); } -static bool VectorGrow(VectorBody* body, const std::size_t elementSize) { - if (body->size < body->capacity) return true; - const std::uint64_t capacity = body->capacity != 0 ? body->capacity * 2 : 4; - void* elements = std::realloc(body->elements, static_cast(capacity) * elementSize); - if (elements == nullptr) return false; - body->elements = elements; - body->capacity = capacity; - return true; +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadData21setxPsnNpServiceLabelEj(void* self) { + (void)self; + return 0; } -static std::uint64_t HostVectorSize(const void* self, const char* function) { - const auto* body = static_cast(static_cast(self)->object); - if (body == nullptr) return 0; - if (body->magic != VectorBodyMagic) NotImplemented_nid_no_patch(function); - return body->size; +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadData22setxPsnAtomicOperationENS5_19XPsnAtomicOperationE(void* self) { + (void)self; + return 0; } -static IntrusivePtr* HostVectorElement(void* self, const std::uint64_t index, const char* function) { - auto* body = static_cast(static_cast(self)->object); - if (body == nullptr || body->magic != VectorBodyMagic || body->elementKind != 1) NotImplemented_nid_no_patch(function); - return static_cast(body->elements) + index; +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadData9terminateEv(void* self) { + return TerminateParameter(self); } -static int VectorPushBackIntrusivePtr(IntrusivePtr* self, const IntrusivePtr* element) { - VectorBody* body = VectorBodyFor(self, 1, __func__); - if (body == nullptr) return -1; - const IntrusivePtr copy = *element; - if (!VectorGrow(body, sizeof(IntrusivePtr))) return -1; - auto* elements = static_cast(body->elements); - elements[body->size] = copy; - if (copy.object != nullptr) ReferenceCount(copy.object, ReferenceCountOffset).fetch_add(1); - body->size += 1; +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadDataC1Ev(void* self) { + ConstructParameter(self); return 0; } -static int VectorPushBackString(IntrusivePtr* self, const CommonString* element) { - VectorBody* body = VectorBodyFor(self, 2, __func__); - if (body == nullptr) return -1; - CommonString copy = *element; - copy.referenceCount = 0; - copy.buffer = nullptr; - copy.bufferSize = 0; - if (element->buffer != nullptr) { - const std::size_t length = std::strlen(element->buffer) + 1; - copy.buffer = static_cast(std::malloc(length)); - if (copy.buffer == nullptr) return -1; - std::memcpy(copy.buffer, element->buffer, length); - copy.bufferSize = length; - } - if (!VectorGrow(body, sizeof(CommonString))) { - std::free(copy.buffer); - return -1; - } - static_cast(body->elements)[body->size] = copy; - body->size += 1; +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21ParameterToUploadDataD1Ev(void* self) { + (void)self; return 0; } -// -------------------------------------------------------------------------- -// SessionManager2V1 and extra Common symbols, from a title dump whose modules lack -// libSceNpCppWebApi.prx. -// -------------------------------------------------------------------------- -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V115LocalizedStringEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { - CopyIntrusivePtr(self, source, 0x00); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi21deleteMultiDataByUserEiRKNS4_32ParameterToDeleteMultiDataByUserERNS1_6Common11TransactionINS8_15DefaultResponseENS8_12IntrusivePtrINS8_18ResponseHeaderBaseEEEEE(void* self) { + (void)self; + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V120RequestPlayerSessionEEptEv(const IntrusivePtr* self) { - return self->object; +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 _ZN3sce2Np9CppWebApi14SessionManager2V120RequestPlayerSession16setMaxSpectatorsERKi() { +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi22ParameterToSetDataInfo22setxPsnAtomicOperationENS5_19XPsnAtomicOperationE(void* self) { + (void)self; return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V139RequestPlayerSessionMemberPlayerFactory6createEPNS1_6Common10LibContextERKNS5_6VectorINS5_12IntrusivePtrINS3_32RequestCreatePlayerSessionPlayerEEEEEPNS9_INS3_32RequestPlayerSessionMemberPlayerEEE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi22ParameterToSetDataInfo24setxPsnAtomicOperationIdEPKc(void* self, const char* text) { + return SetParameterText(self, text); } -void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V136UsersPlayerSessionsInvitationForReadEEEE3endEv(void* self) { - (void)self; - NotImplemented_nid_no_patch(__func__); - return nullptr; +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi22ParameterToSetDataInfo9terminateEv(void* self) { + return TerminateParameter(self); } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi36ParameterToJoinPlayerSessionAsPlayerD1Ev(void* self) { - (void)self; +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi22ParameterToSetDataInfoC1Ev(void* self) { + ConstructParameter(self); return 0; } -const char* APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V110FromMember11getOnlineIdEv(const void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi22ParameterToSetDataInfoD1Ev(void* self) { (void)self; - NotImplemented_nid_no_patch(__func__); - return nullptr; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi38ParameterToGetPlayerSessionInvitations26setinvitationInvalidFilterEPKc(void* self, const char* filter) { - return SetParameterText(self, filter); -} - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V120RequestPlayerSessionEEC1Ev(IntrusivePtr* self) { - *self = {}; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; + return 0; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V126RequestPlayerSessionPlayerEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi23ParameterToDownloadData17setnpServiceLabelEj(void* self) { + (void)self; + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V151PostPlayerSessionsSessionIdMemberPlayersRequestBodyEEC1Ev(IntrusivePtr* self) { - *self = {}; +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 _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi29ParameterToLeavePlayerSessionD1Ev(void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi32ParameterToDeleteMultiDataByUser17setnpServiceLabelEj(void* self) { (void)self; return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V122LocalizedStringFactory6createEPNS1_6Common10LibContextEPKcNS_4Json6ObjectEPNS5_12IntrusivePtrINS3_15LocalizedStringEEE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; -} - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V151PostPlayerSessionsSessionIdMemberPlayersRequestBodyEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi32ParameterToDeleteMultiDataByUser9terminateEv(void* self) { + return TerminateParameter(self); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V132RequestCreatePlayerSessionPlayerEEEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x30, __func__); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi32ParameterToDeleteMultiDataByUserC1Ev(void* self) { + ConstructParameter(self); + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common13ConstIteratorINS2_12IntrusivePtrINS1_14SessionManager2V136UsersPlayerSessionsInvitationForReadEEEED2Ev(void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi32ParameterToDeleteMultiDataByUserD1Ev(void* self) { (void)self; return 0; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V113PlayerSessionEEptEv(const IntrusivePtr* self) { - return self->object; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V120RequestPlayerSession20setInvitableUserTypeERKNS3_17InvitableUserTypeE() { +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi37ParameterToGetMultiDataStatusesByUser17setnpServiceLabelEj(void* self) { + (void)self; return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V132RequestCreatePlayerSessionPlayerEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { - self->object = nullptr; - self->deleter = nullptr; - self->libContext = libContext; +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); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V132RequestCreatePlayerSessionPlayerEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +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; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_6StringEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { - self->object = nullptr; - self->deleter = nullptr; - self->libContext = libContext; +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi42ParameterWithBinaryRequestBodyToUploadData9terminateEv(void* self) { + return TerminateParameter(self); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V120RequestPlayerSessionEEEE8pushBackERKS8_(IntrusivePtr* self, const void* element) { - return VectorPushBackIntrusivePtr(self, static_cast(element)); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi42ParameterWithBinaryRequestBodyToUploadDataC1Ev(void* self) { + ConstructParameter(self); + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi42ParameterWithBinaryRequestBodyToUploadDataD1Ev(void* self) { + (void)self; + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_6StringEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x30, __func__); +int APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V110DataStatus22getLastUpdatedDateTimeEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V136UsersPlayerSessionsInvitationForReadEEEE5beginEv(void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V110DataStatus7getInfoEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); - return nullptr; + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V129PostPlayerSessionsRequestBodyEEC1Ev(IntrusivePtr* self) { - *self = {}; +int APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi25UploadDataResponseHeaders24getXPsnAtomicOperationIdEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V136UsersPlayerSessionsInvitationForReadEEEEEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x30, __func__); +int APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi25UploadDataResponseHeaders24hasXPsnAtomicOperationIdEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V136UsersPlayerSessionsInvitationForReadEEEEEEdeEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common10InitParamsC1Ev(void* self) { + (void)self; + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common10InitParamsD1Ev(void* self) { (void)self; return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V126RequestPlayerSessionPlayerEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common10LibContextC1Ev(uint64_t* self) { + *self = 0; + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V115LocalizedStringEEC1Ev(IntrusivePtr* self) { - *self = {}; +// Initialization succeeds as on an offline console (see libSceJson2); individual requests fail. +int APS5_VABI _ZN3sce2Np9CppWebApi6Common10initializeERKNS2_10InitParamsERNS2_10LibContextE(const void* params, uint64_t* context) { + (void)params; + if (context) *context = 1; + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V154GetUsersAccountIdPlayerSessionsInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { (void)self; return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V151PostPlayerSessionsSessionIdMemberPlayersRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { - CopyIntrusivePtr(self, source, 0x00); -} - -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi25joinPlayerSessionAsPlayerEiRKNS4_36ParameterToJoinPlayerSessionAsPlayerERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_52PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { + (void)self; + return 0; } -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); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEENS4_INS6_9RecordApi26RecordScoreResponseHeadersEEEEC1Ev(void* self) { + (void)self; return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V132RequestCreatePlayerSessionPlayerEEEE8pushBackERKS8_(IntrusivePtr* self, const void* element) { - return VectorPushBackIntrusivePtr(self, static_cast(element)); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEENS4_INS6_9RecordApi26RecordScoreResponseHeadersEEEED1Ev(void* self) { + (void)self; + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15DefaultResponseC1Ev(void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { (void)self; return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi36ParameterToJoinPlayerSessionAsPlayer9terminateEv(void* self) { - return TerminateParameter(self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { + (void)self; + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi31ParameterToCreatePlayerSessions10initializeEPNS1_6Common10LibContextENS6_12IntrusivePtrINS3_29PostPlayerSessionsRequestBodyEEE(void* self, const std::uint64_t* context, const IntrusivePtr* body) { - return InitializeParameterWithBody(self, context, true, body); -} +static_assert(sizeof(IntrusivePtr) == 0x18); -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V110FromMemberEEptEv(const IntrusivePtr* self) { - return self->object; -} +static constexpr std::size_t ReferenceCountOffset = 0; +static constexpr std::size_t VectorReferenceCountOffset = 0x30; -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V132RequestPlayerSessionMemberPlayerEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +static std::atomic_ref ReferenceCount(void* object, const std::size_t offset) { + return std::atomic_ref(*reinterpret_cast(static_cast(object) + offset)); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { - (void)self; - return 0; +static void CopyIntrusivePtr(IntrusivePtr* self, const IntrusivePtr* source, const std::size_t referenceCountOffset) { + *self = *source; + if (self->object) ReferenceCount(self->object, referenceCountOffset).fetch_add(1); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V126RequestPlayerSessionPlayerEEEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x30, __func__); +static void ReleaseIntrusivePtr(IntrusivePtr* self, const std::size_t referenceCountOffset, const char* function) { + if (!self->object) return; + if (ReferenceCount(self->object, referenceCountOffset).fetch_sub(1) != 1) return; + if (!self->deleter) NotImplemented_nid_no_patch(function); + self->deleter(self->object); + self->object = nullptr; + self->deleter = nullptr; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi29ParameterToLeavePlayerSessionC1Ev(void* self) { - ConstructParameter(self); - return 0; +static void AssignIntrusivePtr(IntrusivePtr* self, const IntrusivePtr* source, const std::size_t referenceCountOffset, const char* function) { + if (self->object == source->object) return; + ReleaseIntrusivePtr(self, referenceCountOffset, function); + CopyIntrusivePtr(self, source, referenceCountOffset); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V121GetRankingRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V126RequestPlayerSessionPlayerEEC1Ev(IntrusivePtr* self) { +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V121GetRankingRequestBodyEEC1Ev(IntrusivePtr* self) { *self = {}; } -const char* APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V136UsersPlayerSessionsInvitationForRead12getSessionIdEv(const void* self) { - (void)self; - NotImplemented_nid_no_patch(__func__); - return nullptr; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V121GetRankingRequestBodyEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -void* APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V136UsersPlayerSessionsInvitationForRead7getFromEv(const void* self) { - (void)self; - NotImplemented_nid_no_patch(__func__); - return nullptr; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEC1Ev(IntrusivePtr* self) { + *self = {}; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V129PostPlayerSessionsRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { - CopyIntrusivePtr(self, source, 0x00); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -void* APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V130PostPlayerSessionsResponseBody17getPlayerSessionsEv(void* self) { - (void)self; - NotImplemented_nid_no_patch(__func__); - return nullptr; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi18leavePlayerSessionEiRKNS4_29ParameterToLeavePlayerSessionERNS1_6Common11TransactionINS8_15DefaultResponseENS8_12IntrusivePtrINS8_18ResponseHeaderBaseEEEEE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEEC1Ev(IntrusivePtr* self) { + *self = {}; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V124PlayerSessionPushContextEEEE8pushBackERKS8_(IntrusivePtr* self, const void* element) { - return VectorPushBackIntrusivePtr(self, static_cast(element)); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEC1Ev(IntrusivePtr* self) { + *self = {}; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi31ParameterToCreatePlayerSessionsD1Ev(void* self) { - (void)self; - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi27getPlayerSessionInvitationsEiRKNS4_38ParameterToGetPlayerSessionInvitationsERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_54GetUsersAccountIdPlayerSessionsInvitationsResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEEC1Ev(IntrusivePtr* self) { + *self = {}; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V132RequestPlayerSessionMemberPlayerEEC1Ev(IntrusivePtr* self) { - *self = {}; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V120RequestPlayerSessionEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V14UserEEC1Ev(IntrusivePtr* self) { + *self = {}; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V113PlayerSessionEEEEEEdeEv(const IntrusivePtr* self) { - return self->object; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V14UserEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V124PlayerSessionPushContextEEC1Ev(IntrusivePtr* self) { +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V19RecordApi26RecordScoreResponseHeadersEEC1Ev(IntrusivePtr* self) { *self = {}; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEC1Ev(IntrusivePtr* self) { - *self = {}; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V19RecordApi26RecordScoreResponseHeadersEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V110FromMemberEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_12Leaderboards2V15EntryEEEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, VectorReferenceCountOffset, __func__); } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V154GetUsersAccountIdPlayerSessionsInvitationsResponseBodyEEptEv(const IntrusivePtr* self) { - return self->object; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi38ParameterToGetPlayerSessionInvitationsC1Ev(void* self) { - ConstructParameter(self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common13ConstIteratorINS2_12IntrusivePtrINS1_12Leaderboards2V15EntryEEEED2Ev(void* self) { + (void)self; return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V126RequestPlayerSessionPlayerEEEE8pushBackERKS8_(IntrusivePtr* self, const void* element) { - return VectorPushBackIntrusivePtr(self, static_cast(element)); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -void* APS5_VABI _ZN3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_14SessionManager2V136UsersPlayerSessionsInvitationForReadEEEEppEv(void* self) { - (void)self; - NotImplemented_nid_no_patch(__func__); - return nullptr; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { - (void)self; - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEENS4_INS6_9RecordApi26RecordScoreResponseHeadersEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V120RequestPlayerSession19setJoinableUserTypeERKNS3_16JoinableUserTypeE() { - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEENS4_INS6_9RecordApi26RecordScoreResponseHeadersEEEE6finishEv() { + return TransactionNotStarted; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V154GetUsersAccountIdPlayerSessionsInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V127RecordLargeDataResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi38ParameterToGetPlayerSessionInvitationsD1Ev(void* self) { - (void)self; - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V113PlayerSessionEEEEEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x30, __func__); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V132RequestPlayerSessionMemberPlayerEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { - CopyIntrusivePtr(self, source, 0x00); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common19UpStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V127RecordLargeDataResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextEm() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { - return TransactionNotStarted; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common19UpStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V127RecordLargeDataResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE8sendDataEPKvm() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V136UsersPlayerSessionsInvitationForRead14sessionIdIsSetEv(const void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common19UpStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V127RecordLargeDataResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { (void)self; - NotImplemented_nid_no_patch(__func__); - return false; + return 0; } -bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V136UsersPlayerSessionsInvitationForRead17invitationIdIsSetEv(const void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common19UpStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V127RecordLargeDataResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { (void)self; - NotImplemented_nid_no_patch(__func__); - return false; + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V154GetUsersAccountIdPlayerSessionsInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V17ViewApi37GetLargeDataByObjectIdResponseHeadersEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi31ParameterToCreatePlayerSessionsC1Ev(void* self) { - ConstructParameter(self); - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V17ViewApi37GetLargeDataByObjectIdResponseHeadersEEEE6finishEv() { + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi36ParameterToJoinPlayerSessionAsPlayer10initializeEPNS1_6Common10LibContextEPKcNS6_12IntrusivePtrINS3_51PostPlayerSessionsSessionIdMemberPlayersRequestBodyEEE(void* self, const std::uint64_t* context, const char* sessionId, const IntrusivePtr* body) { - return InitializeParameterWithBody(self, context, sessionId != nullptr, body); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V17ViewApi37GetLargeDataByObjectIdResponseHeadersEEEE8readDataEPcm() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V154GetUsersAccountIdPlayerSessionsInvitationsResponseBody16invitationsIsSetEv(const void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V17ViewApi37GetLargeDataByObjectIdResponseHeadersEEEEC1Ev(void* self) { (void)self; - NotImplemented_nid_no_patch(__func__); - return false; + return 0; } -void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V113PlayerSessionEEEEixEm(void* self, std::uint64_t index) { - return HostVectorElement(self, index, __func__); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_12Leaderboards2V17ViewApi37GetLargeDataByObjectIdResponseHeadersEEEED1Ev(void* self) { + (void)self; + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi29ParameterToLeavePlayerSession10initializeEPNS1_6Common10LibContextEPKcSA_(void* self, const std::uint64_t* context, const char* sessionId, const char* accountId) { - return InitializeParameter(self, context, sessionId != nullptr && accountId != nullptr); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi27DownloadDataResponseHeadersEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V115LocalizedStringEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi27DownloadDataResponseHeadersEEEE6finishEv() { + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS2_6StringEEEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { - CopyIntrusivePtr(self, source, 0x30); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi27DownloadDataResponseHeadersEEEE8readDataEPcm() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_14SessionManager2V136UsersPlayerSessionsInvitationForReadEEEEdeEv(const void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi27DownloadDataResponseHeadersEEEEC1Ev(void* self) { (void)self; - NotImplemented_nid_no_patch(__func__); - return nullptr; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi38ParameterToGetPlayerSessionInvitations9setfieldsENS1_6Common12IntrusivePtrINS6_6VectorINS6_6StringEEEEE() { return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15DefaultResponseD1Ev(void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common21DownStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi27DownloadDataResponseHeadersEEEED1Ev(void* self) { (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; -} +static_assert(sizeof(CommonString) == 0x20 && offsetof(CommonString, buffer) == 0x08); +static_assert(offsetof(CommonString, bufferSize) == 0x10 && offsetof(CommonString, libContext) == 0x18); -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V120RequestPlayerSessionEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { - self->object = nullptr; - self->deleter = nullptr; - self->libContext = libContext; -} -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V133RequestPlayerSessionPlayerFactory6createEPNS1_6Common10LibContextEPKcS9_PNS5_12IntrusivePtrINS3_26RequestPlayerSessionPlayerEEE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_12Leaderboards2V14UserEEEE8pushBackERKS8_() { + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi20createPlayerSessionsEiRKNS4_31ParameterToCreatePlayerSessionsERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_30PostPlayerSessionsResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_12Leaderboards2V14UserEEEEC1EPNS2_10LibContextE(void* self) { + (void)self; + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi36ParameterToJoinPlayerSessionAsPlayerC1Ev(void* self) { - ConstructParameter(self); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_12Leaderboards2V14UserEEEED1Ev(void* self) { + (void)self; return 0; } -bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V136UsersPlayerSessionsInvitationForRead9fromIsSetEv(const void* self) { +void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_12Leaderboards2V15EntryEEEE3endEv(void* self) { (void)self; NotImplemented_nid_no_patch(__func__); - return false; + return nullptr; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V126RequestPlayerSessionPlayer15setPushContextsERKNS1_6Common6VectorINS5_12IntrusivePtrINS3_24PlayerSessionPushContextEEEEE() { - return 0; +void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_12Leaderboards2V15EntryEEEE5beginEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V127RequestPlayerSessionFactory6createEPNS1_6Common10LibContextEiNS5_12IntrusivePtrINS3_32RequestPlayerSessionMemberPlayerEEERKNS5_6VectorINS5_6StringEEENS8_INS3_15LocalizedStringEEEPNS8_INS3_20RequestPlayerSessionEEE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +void* APS5_VABI _ZN3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_12Leaderboards2V15EntryEEEEppEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common9terminateERNS2_10LibContextE(uint64_t* context) { + *context = 0; + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V126RequestPlayerSessionPlayerEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { - self->object = nullptr; - self->deleter = nullptr; - self->libContext = libContext; +const void* APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V122GetRankingResponseBody22getLastUpdatedDateTimeEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V124PlayerSessionPushContextEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V123RecordScoreResponseBody10getTmpRankEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V131PlayerSessionPushContextFactory6createEPNS1_6Common10LibContextEPKcPNS5_12IntrusivePtrINS3_24PlayerSessionPushContextEEE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +std::uint32_t APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V123RecordScoreResponseBody16getTmpSerialRankEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V129PostPlayerSessionsRequestBodyEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody11getSortModeEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V154GetUsersAccountIdPlayerSessionsInvitationsResponseBodyEEC1Ev(IntrusivePtr* self) { - *self = {}; +std::uint32_t APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody13getEntryLimitEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_6StringEE8pushBackERKS4_(IntrusivePtr* self, const void* element) { - return VectorPushBackString(self, static_cast(element)); +int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody13getUpdateModeEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -bool APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_14SessionManager2V136UsersPlayerSessionsInvitationForReadEEEEneERKS9_(const void* self, const void* other) { +bool APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody13sortModeIsSetEv(const void* self) { (void)self; - (void)other; NotImplemented_nid_no_patch(__func__); return false; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi38ParameterToGetPlayerSessionInvitations10initializeEPNS1_6Common10LibContextEPKc(void* self, const std::uint64_t* context, const char* accountId) { - return InitializeParameter(self, context, accountId != nullptr); +bool APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody15entryLimitIsSetEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return false; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEptEv(const IntrusivePtr* self) { - return self->object; +bool APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody15updateModeIsSetEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return false; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V154GetUsersAccountIdPlayerSessionsInvitationsResponseBodyEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +std::int64_t APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody16getMaxScoreLimitEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS2_6StringEEEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x30, __func__); +std::int64_t APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody16getMinScoreLimitEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -void* APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V154GetUsersAccountIdPlayerSessionsInvitationsResponseBody14getInvitationsEv(void* self) { +bool APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody18maxScoreLimitIsSetEv(const void* self) { (void)self; NotImplemented_nid_no_patch(__func__); - return nullptr; + return false; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V132RequestCreatePlayerSessionPlayerEEC1Ev(IntrusivePtr* self) { - *self = {}; +bool APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody18minScoreLimitIsSetEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return false; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { - return TransactionNotStarted; +std::uint32_t APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody20getLargeDataNumLimitEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody21getLargeDataSizeLimitEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEE6finishEv() { - return TransactionNotStarted; +bool APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody22largeDataNumLimitIsSetEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return false; } -bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V136UsersPlayerSessionsInvitationForRead22receivedTimestampIsSetEv(const void* self) { +bool APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V130GetBoardDefinitionResponseBody23largeDataSizeLimitIsSetEv(const void* self) { (void)self; NotImplemented_nid_no_patch(__func__); return false; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { +const char* APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry10getCommentEv(const void* self) { (void)self; - return 0; + NotImplemented_nid_no_patch(__func__); + return nullptr; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V120RequestPlayerSessionEEEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x30, __func__); +const char* APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry11getObjectIdEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V154GetUsersAccountIdPlayerSessionsInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { - return TransactionNotStarted; +const char* APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry11getOnlineIdEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +bool APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry12commentIsSetEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return false; +} + +std::uint64_t APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry12getAccountIdEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +const void* APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry12getSmallDataEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +std::uint32_t APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry13getSerialRankEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +bool APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry13objectIdIsSetEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return false; +} + +std::uint32_t APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry14getHighestRankEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +bool APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry14smallDataIsSetEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return false; +} + +std::uint32_t APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry20getHighestSerialRankEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry7getPcIdEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +std::uint32_t APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry7getRankEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +std::int64_t APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V15Entry8getScoreEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +const char* APS5_VABI _ZNK3sce2Np9CppWebApi12Leaderboards2V19RecordApi26RecordScoreResponseHeaders24getXPsnAtomicOperationIdEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEENS4_INS6_9RecordApi26RecordScoreResponseHeadersEEEE11getResponseERS8_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V121GetRankingRequestBodyEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V122RecordScoreRequestBodyEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V130GetBoardDefinitionResponseBodyEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V14UserEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V15EntryEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V19RecordApi26RecordScoreResponseHeadersEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6BinaryEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_12Leaderboards2V15EntryEEEEEEdeEv(const IntrusivePtr* self) { + return self->object; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEENS4_INS6_9RecordApi26RecordScoreResponseHeadersEEEE18getResponseHeadersERSB_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6Binary4sizeEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +const void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common6Binary9getBinaryEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_12Leaderboards2V15EntryEEEEdeEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +bool APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_12Leaderboards2V15EntryEEEEneERKS9_(const void* self, const void* other) { + (void)self; + (void)other; + NotImplemented_nid_no_patch(__func__); + return false; +} + +// Shared vector bodies. A Vector handle is an IntrusivePtr whose object is a body; +// bodies adopted from a title through the pointer/deleter constructor keep their +// 32-bit reference count at 0x30, so bodies created here do the same. +static constexpr std::uint64_t VectorBodyMagic = 0x434e507056656342ULL; +struct VectorBody { + std::uint64_t magic; + std::uint8_t reserved[0x28]; + std::int32_t referenceCount; + std::int32_t elementKind; // 1 = IntrusivePtr elements, 2 = String elements + void* elements; + std::uint64_t size; + std::uint64_t capacity; +}; +static_assert(sizeof(VectorBody) == 0x50 && offsetof(VectorBody, referenceCount) == 0x30); + +static void APS5_VABI DestroyVectorBody(void* object) { + auto* body = static_cast(object); + if (body->elementKind == 1) { + auto* elements = static_cast(body->elements); + for (std::uint64_t index = 0; index < body->size; ++index) { + ReleaseIntrusivePtr(&elements[index], 0x00, __func__); + } + } else if (body->elementKind == 2) { + auto* elements = static_cast(body->elements); + for (std::uint64_t index = 0; index < body->size; ++index) { + std::free(elements[index].buffer); + } + } + std::free(body->elements); + std::free(body); +} + +static VectorBody* VectorBodyFor(IntrusivePtr* self, const std::int32_t elementKind, const char* function) { + auto* body = static_cast(self->object); + if (body == nullptr) { + body = static_cast(std::calloc(1, sizeof(VectorBody))); + if (body == nullptr) return nullptr; + body->magic = VectorBodyMagic; + body->referenceCount = 1; + body->elementKind = elementKind; + self->object = body; + self->deleter = &DestroyVectorBody; + return body; + } + if (body->magic != VectorBodyMagic || body->elementKind != elementKind) { + // appending to a title-provided body needs its element layout, which is unknown + NotImplemented_nid_no_patch(function); + return nullptr; + } + return body; +} + +static bool VectorGrow(VectorBody* body, const std::size_t elementSize) { + if (body->size < body->capacity) return true; + const std::uint64_t capacity = body->capacity != 0 ? body->capacity * 2 : 4; + void* elements = std::realloc(body->elements, static_cast(capacity) * elementSize); + if (elements == nullptr) return false; + body->elements = elements; + body->capacity = capacity; + return true; +} + +static std::uint64_t HostVectorSize(const void* self, const char* function) { + const auto* body = static_cast(static_cast(self)->object); + if (body == nullptr) return 0; + if (body->magic != VectorBodyMagic) NotImplemented_nid_no_patch(function); + return body->size; +} + +static IntrusivePtr* HostVectorElement(void* self, const std::uint64_t index, const char* function) { + auto* body = static_cast(static_cast(self)->object); + if (body == nullptr || body->magic != VectorBodyMagic || body->elementKind != 1) NotImplemented_nid_no_patch(function); + return static_cast(body->elements) + index; +} + +static int VectorPushBackIntrusivePtr(IntrusivePtr* self, const IntrusivePtr* element) { + VectorBody* body = VectorBodyFor(self, 1, __func__); + if (body == nullptr) return -1; + const IntrusivePtr copy = *element; + if (!VectorGrow(body, sizeof(IntrusivePtr))) return -1; + auto* elements = static_cast(body->elements); + elements[body->size] = copy; + if (copy.object != nullptr) ReferenceCount(copy.object, ReferenceCountOffset).fetch_add(1); + body->size += 1; + return 0; +} + +static int VectorPushBackString(IntrusivePtr* self, const CommonString* element) { + VectorBody* body = VectorBodyFor(self, 2, __func__); + if (body == nullptr) return -1; + CommonString copy = *element; + copy.referenceCount = 0; + copy.buffer = nullptr; + copy.bufferSize = 0; + if (element->buffer != nullptr) { + const std::size_t length = std::strlen(element->buffer) + 1; + copy.buffer = static_cast(std::malloc(length)); + if (copy.buffer == nullptr) return -1; + std::memcpy(copy.buffer, element->buffer, length); + copy.bufferSize = length; + } + if (!VectorGrow(body, sizeof(CommonString))) { + std::free(copy.buffer); + return -1; + } + static_cast(body->elements)[body->size] = copy; + body->size += 1; + return 0; +} +// -------------------------------------------------------------------------- +// SessionManager2V1 and extra Common symbols, from a title dump whose modules lack +// libSceNpCppWebApi.prx. +// -------------------------------------------------------------------------- + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V115LocalizedStringEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, 0x00); +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V120RequestPlayerSessionEEptEv(const IntrusivePtr* self) { + return self->object; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V120RequestPlayerSession16setMaxSpectatorsERKi() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V139RequestPlayerSessionMemberPlayerFactory6createEPNS1_6Common10LibContextERKNS5_6VectorINS5_12IntrusivePtrINS3_32RequestCreatePlayerSessionPlayerEEEEEPNS9_INS3_32RequestPlayerSessionMemberPlayerEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V136UsersPlayerSessionsInvitationForReadEEEE3endEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi36ParameterToJoinPlayerSessionAsPlayerD1Ev(void* self) { + (void)self; + return 0; +} + +const char* APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V110FromMember11getOnlineIdEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi38ParameterToGetPlayerSessionInvitations26setinvitationInvalidFilterEPKc(void* self, const char* filter) { + return SetParameterText(self, filter); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V120RequestPlayerSessionEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V126RequestPlayerSessionPlayerEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V151PostPlayerSessionsSessionIdMemberPlayersRequestBodyEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi29ParameterToLeavePlayerSessionD1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V122LocalizedStringFactory6createEPNS1_6Common10LibContextEPKcNS_4Json6ObjectEPNS5_12IntrusivePtrINS3_15LocalizedStringEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V151PostPlayerSessionsSessionIdMemberPlayersRequestBodyEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V132RequestCreatePlayerSessionPlayerEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common13ConstIteratorINS2_12IntrusivePtrINS1_14SessionManager2V136UsersPlayerSessionsInvitationForReadEEEED2Ev(void* self) { + (void)self; + return 0; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V113PlayerSessionEEptEv(const IntrusivePtr* self) { + return self->object; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V120RequestPlayerSession20setInvitableUserTypeERKNS3_17InvitableUserTypeE() { + return 0; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V132RequestCreatePlayerSessionPlayerEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V132RequestCreatePlayerSessionPlayerEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_6StringEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V120RequestPlayerSessionEEEE8pushBackERKS8_(IntrusivePtr* self, const void* element) { + return VectorPushBackIntrusivePtr(self, static_cast(element)); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_6StringEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V136UsersPlayerSessionsInvitationForReadEEEE5beginEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V129PostPlayerSessionsRequestBodyEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V136UsersPlayerSessionsInvitationForReadEEEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V136UsersPlayerSessionsInvitationForReadEEEEEEdeEv(const IntrusivePtr* self) { + return self->object; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { + (void)self; + return 0; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V126RequestPlayerSessionPlayerEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V115LocalizedStringEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V154GetUsersAccountIdPlayerSessionsInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { + (void)self; + return 0; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V151PostPlayerSessionsSessionIdMemberPlayersRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, 0x00); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi25joinPlayerSessionAsPlayerEiRKNS4_36ParameterToJoinPlayerSessionAsPlayerERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_52PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V132RequestCreatePlayerSessionPlayerEEEE8pushBackERKS8_(IntrusivePtr* self, const void* element) { + return VectorPushBackIntrusivePtr(self, static_cast(element)); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15DefaultResponseC1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi36ParameterToJoinPlayerSessionAsPlayer9terminateEv(void* self) { + return TerminateParameter(self); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi31ParameterToCreatePlayerSessions10initializeEPNS1_6Common10LibContextENS6_12IntrusivePtrINS3_29PostPlayerSessionsRequestBodyEEE(void* self, const std::uint64_t* context, const IntrusivePtr* body) { + return InitializeParameterWithBody(self, context, true, body); +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V110FromMemberEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V132RequestPlayerSessionMemberPlayerEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { + (void)self; + return 0; +} + + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi29ParameterToLeavePlayerSessionC1Ev(void* self) { + ConstructParameter(self); + return 0; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V126RequestPlayerSessionPlayerEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +const char* APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V136UsersPlayerSessionsInvitationForRead12getSessionIdEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V136UsersPlayerSessionsInvitationForRead7getFromEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V129PostPlayerSessionsRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, 0x00); +} + +void* APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V130PostPlayerSessionsResponseBody17getPlayerSessionsEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi18leavePlayerSessionEiRKNS4_29ParameterToLeavePlayerSessionERNS1_6Common11TransactionINS8_15DefaultResponseENS8_12IntrusivePtrINS8_18ResponseHeaderBaseEEEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V124PlayerSessionPushContextEEEE8pushBackERKS8_(IntrusivePtr* self, const void* element) { + return VectorPushBackIntrusivePtr(self, static_cast(element)); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi31ParameterToCreatePlayerSessionsD1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi27getPlayerSessionInvitationsEiRKNS4_38ParameterToGetPlayerSessionInvitationsERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_54GetUsersAccountIdPlayerSessionsInvitationsResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V132RequestPlayerSessionMemberPlayerEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V120RequestPlayerSessionEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V113PlayerSessionEEEEEEdeEv(const IntrusivePtr* self) { + return self->object; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V124PlayerSessionPushContextEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V110FromMemberEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V154GetUsersAccountIdPlayerSessionsInvitationsResponseBodyEEptEv(const IntrusivePtr* self) { + return self->object; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi38ParameterToGetPlayerSessionInvitationsC1Ev(void* self) { + ConstructParameter(self); + return 0; +} + + +void* APS5_VABI _ZN3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_14SessionManager2V136UsersPlayerSessionsInvitationForReadEEEEppEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V120RequestPlayerSession19setJoinableUserTypeERKNS3_16JoinableUserTypeE() { + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V154GetUsersAccountIdPlayerSessionsInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi38ParameterToGetPlayerSessionInvitationsD1Ev(void* self) { + (void)self; + return 0; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V113PlayerSessionEEEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V132RequestPlayerSessionMemberPlayerEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, 0x00); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; +} + +bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V136UsersPlayerSessionsInvitationForRead14sessionIdIsSetEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return false; +} + +bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V136UsersPlayerSessionsInvitationForRead17invitationIdIsSetEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return false; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V154GetUsersAccountIdPlayerSessionsInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi31ParameterToCreatePlayerSessionsC1Ev(void* self) { + ConstructParameter(self); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi36ParameterToJoinPlayerSessionAsPlayer10initializeEPNS1_6Common10LibContextEPKcNS6_12IntrusivePtrINS3_51PostPlayerSessionsSessionIdMemberPlayersRequestBodyEEE(void* self, const std::uint64_t* context, const char* sessionId, const IntrusivePtr* body) { + return InitializeParameterWithBody(self, context, sessionId != nullptr, body); +} + +bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V154GetUsersAccountIdPlayerSessionsInvitationsResponseBody16invitationsIsSetEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return false; +} + +void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V113PlayerSessionEEEEixEm(void* self, std::uint64_t index) { + return HostVectorElement(self, index, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi29ParameterToLeavePlayerSession10initializeEPNS1_6Common10LibContextEPKcSA_(void* self, const std::uint64_t* context, const char* sessionId, const char* accountId) { + return InitializeParameter(self, context, sessionId != nullptr && accountId != nullptr); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V115LocalizedStringEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_14SessionManager2V136UsersPlayerSessionsInvitationForReadEEEEdeEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi38ParameterToGetPlayerSessionInvitations9setfieldsENS1_6Common12IntrusivePtrINS6_6VectorINS6_6StringEEEEE() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15DefaultResponseD1Ev(void* self) { + (void)self; + return 0; +} + + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V120RequestPlayerSessionEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V133RequestPlayerSessionPlayerFactory6createEPNS1_6Common10LibContextEPKcS9_PNS5_12IntrusivePtrINS3_26RequestPlayerSessionPlayerEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi20createPlayerSessionsEiRKNS4_31ParameterToCreatePlayerSessionsERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_30PostPlayerSessionsResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi36ParameterToJoinPlayerSessionAsPlayerC1Ev(void* self) { + ConstructParameter(self); + return 0; +} + +bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V136UsersPlayerSessionsInvitationForRead9fromIsSetEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return false; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V126RequestPlayerSessionPlayer15setPushContextsERKNS1_6Common6VectorINS5_12IntrusivePtrINS3_24PlayerSessionPushContextEEEEE() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V127RequestPlayerSessionFactory6createEPNS1_6Common10LibContextEiNS5_12IntrusivePtrINS3_32RequestPlayerSessionMemberPlayerEEERKNS5_6VectorINS5_6StringEEENS8_INS3_15LocalizedStringEEEPNS8_INS3_20RequestPlayerSessionEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V124PlayerSessionPushContextEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V131PlayerSessionPushContextFactory6createEPNS1_6Common10LibContextEPKcPNS5_12IntrusivePtrINS3_24PlayerSessionPushContextEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V129PostPlayerSessionsRequestBodyEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V154GetUsersAccountIdPlayerSessionsInvitationsResponseBodyEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_6StringEE8pushBackERKS4_(IntrusivePtr* self, const void* element) { + return VectorPushBackString(self, static_cast(element)); +} + +bool APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_14SessionManager2V136UsersPlayerSessionsInvitationForReadEEEEneERKS9_(const void* self, const void* other) { + (void)self; + (void)other; + NotImplemented_nid_no_patch(__func__); + return false; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi38ParameterToGetPlayerSessionInvitations10initializeEPNS1_6Common10LibContextEPKc(void* self, const std::uint64_t* context, const char* accountId) { + return InitializeParameter(self, context, accountId != nullptr); +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V154GetUsersAccountIdPlayerSessionsInvitationsResponseBodyEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + + +void* APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V154GetUsersAccountIdPlayerSessionsInvitationsResponseBody14getInvitationsEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V132RequestCreatePlayerSessionPlayerEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; +} + +bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V136UsersPlayerSessionsInvitationForRead22receivedTimestampIsSetEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return false; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { + (void)self; + return 0; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V120RequestPlayerSessionEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V154GetUsersAccountIdPlayerSessionsInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEE11getResponseERS4_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V154GetUsersAccountIdPlayerSessionsInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V139RequestCreatePlayerSessionPlayerFactory6createEPNS1_6Common10LibContextEPKcS9_RKNS5_6VectorINS5_12IntrusivePtrINS3_24PlayerSessionPushContextEEEEEPNSB_INS3_32RequestCreatePlayerSessionPlayerEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { + (void)self; + return 0; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V124PlayerSessionPushContextEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V124PlayerSessionPushContextEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V136UsersPlayerSessionsInvitationForReadEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +const char* APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V113PlayerSession12getSessionIdEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V158PostPlayerSessionsSessionIdMemberPlayersRequestBodyFactory6createEPNS1_6Common10LibContextERKNS5_6VectorINS5_12IntrusivePtrINS3_26RequestPlayerSessionPlayerEEEEEPNS9_INS3_51PostPlayerSessionsSessionIdMemberPlayersRequestBodyEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V136PostPlayerSessionsRequestBodyFactory6createEPNS1_6Common10LibContextERKNS5_6VectorINS5_12IntrusivePtrINS3_20RequestPlayerSessionEEEEEPNS9_INS3_29PostPlayerSessionsRequestBodyEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V120RequestPlayerSession28setExclusiveLeaderPrivilegesERKNS1_6Common6VectorINS5_6StringEEE() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEED1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common13ConstIteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V57ProductEEEED2Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common13ConstIteratorINS2_12IntrusivePtrINS1_17TitleCloudStorage2V110DataStatusEEEED2Ev(void* self) { + (void)self; + return 0; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V59ContainerEEEEEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V59ContainerEEEEEEdeEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V59ContainerEEEEEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V59ContainerEEEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V57ProductEEEEEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V57ProductEEEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V53SkuEEEEEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V53SkuEEEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_17TitleCloudStorage2V110DataStatusEEEEEEdeEv(const IntrusivePtr* self) { + return self->object; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_17TitleCloudStorage2V110DataStatusEEEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_13InGameCatalog2V59ContainerEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, 0x00); +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_13InGameCatalog2V59ContainerEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_13InGameCatalog2V59ContainerEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_13InGameCatalog2V57ProductEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, 0x00); +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_13InGameCatalog2V57ProductEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_13InGameCatalog2V57ProductEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V110DataStatusEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V132GetMultiDataStatusesResponseBodyEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V132GetMultiDataStatusesResponseBodyEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V132GetMultiDataStatusesResponseBodyEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V15OwnerEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V15OwnerEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + +bool APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V57ProductEEEEneERKS9_(const void* self, const void* other) { + (void)self; + (void)other; + NotImplemented_nid_no_patch(__func__); + return false; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V57ProductEEEEdeEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +void* APS5_VABI _ZN3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V57ProductEEEEppEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +bool APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_17TitleCloudStorage2V110DataStatusEEEEneERKS9_(const void* self, const void* other) { + (void)self; + (void)other; + NotImplemented_nid_no_patch(__func__); + return false; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_17TitleCloudStorage2V110DataStatusEEEEdeEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +void* APS5_VABI _ZN3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_17TitleCloudStorage2V110DataStatusEEEEppEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS2_6VectorINS4_INS1_13InGameCatalog2V59ContainerEEEEEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { + std::memset(self, 0, 0x10); +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS2_6VectorINS4_INS1_13InGameCatalog2V59ContainerEEEEEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERSB_(const void* self, void* response) { + (void)self; + (void)response; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS2_6VectorINS4_INS1_13InGameCatalog2V59ContainerEEEEEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { + (void)self; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V132GetMultiDataStatusesResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { + std::memset(self, 0, 0x10); +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V132GetMultiDataStatusesResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_(const void* self, void* response) { + (void)self; + (void)response; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V132GetMultiDataStatusesResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { + (void)self; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS2_6VectorINS4_INS1_13InGameCatalog2V59ContainerEEEEEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv(void* self) { + (void)self; + return TransactionNotStarted; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS2_6VectorINS4_INS1_13InGameCatalog2V59ContainerEEEEEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE(void* self, void* context) { + (void)self; + (void)context; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_17TitleCloudStorage2V132GetMultiDataStatusesResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv(void* self) { + (void)self; + return TransactionNotStarted; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_17TitleCloudStorage2V132GetMultiDataStatusesResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE(void* self, void* context) { + (void)self; + (void)context; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_13InGameCatalog2V59ContainerEEEEixEm(void* self, std::uint64_t index) { + return HostVectorElement(self, index, __func__); +} + +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_13InGameCatalog2V59ContainerEEEE4sizeEv(const void* self) { + return HostVectorSize(self, __func__); +} + +void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_13InGameCatalog2V57ProductEEEE5beginEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_13InGameCatalog2V57ProductEEEE3endEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_13InGameCatalog2V53SkuEEEE4sizeEv(const void* self) { + return HostVectorSize(self, __func__); +} + +void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_17TitleCloudStorage2V110DataStatusEEEE5beginEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_17TitleCloudStorage2V110DataStatusEEEE3endEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +void* APS5_VABI _ZN3sce2Np9CppWebApi13InGameCatalog2V59Container11getChildrenEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi13InGameCatalog2V512ContainerApi23ParameterToGetContainerC1Ev(void* self) { + ConstructParameter(self); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi13InGameCatalog2V512ContainerApi23ParameterToGetContainer10initializeEPNS1_6Common10LibContextE(void* self, const std::uint64_t* context) { + return InitializeParameter(self, context, true); +} + +bool APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V512ContainerApi23ParameterToGetContainer13isInitializedEv(const void* self) { + return static_cast(self)->implementation != nullptr; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi13InGameCatalog2V512ContainerApi23ParameterToGetContainer15setserviceLabelEi(void* self, int serviceLabel) { + (void)self; + (void)serviceLabel; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi13InGameCatalog2V512ContainerApi23ParameterToGetContainer9terminateEv(void* self) { + return TerminateParameter(self); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi13InGameCatalog2V512ContainerApi23ParameterToGetContainerD1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi13InGameCatalog2V512ContainerApi12getContainerEiRKNS4_23ParameterToGetContainerERNS1_6Common11TransactionINS8_12IntrusivePtrINS8_6VectorINSA_INS3_9ContainerEEEEEEENSA_INS8_18ResponseHeaderBaseEEEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +const char* APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V57Product8getLabelEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +void* APS5_VABI _ZN3sce2Np9CppWebApi13InGameCatalog2V57Product7getSkusEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V57Product7getTypeEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +bool APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V57Product9skusIsSetEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return false; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi23ParameterToDownloadData11setobjectIdEPKc(void* self, const char* objectId) { + return SetParameterText(self, objectId); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi37ParameterToGetMultiDataStatusesByUserC1Ev(void* self) { + ConstructParameter(self); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi37ParameterToGetMultiDataStatusesByUser10initializeEPNS1_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 _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi37ParameterToGetMultiDataStatusesByUser9setfieldsEPKc(void* self, const char* fields) { + return SetParameterText(self, fields); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi37ParameterToGetMultiDataStatusesByUser9terminateEv(void* self) { + return TerminateParameter(self); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi37ParameterToGetMultiDataStatusesByUserD1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi26getMultiDataStatusesByUserEiRKNS4_37ParameterToGetMultiDataStatusesByUserERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_32GetMultiDataStatusesResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V110DataStatus11getDataSizeEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +const char* APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V110DataStatus11getObjectIdEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V110DataStatus8getOwnerEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V110DataStatus9getSlotIdEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +void* APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V132GetMultiDataStatusesResponseBody17getDataStatusListEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return nullptr; +} + +std::uint32_t APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V132GetMultiDataStatusesResponseBody23getTotalDataStatusCountEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +std::uint64_t APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V15Owner12getAccountIdEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi10getFriendsEiRKNS4_21ParameterToGetFriendsERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_18GetFriendsResponseEEENSA_INS8_18ResponseHeaderBaseEEEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriends10initializeEPNS1_6Common10LibContextEPKc(void* self, const std::uint64_t* context, const char* accountId) { + return InitializeParameter(self, context, accountId != nullptr); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriends9terminateEv(void* self) { + return TerminateParameter(self); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriendsC1Ev(void* self) { + ConstructParameter(self); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriendsD1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi17getBasicPresencesEiRKNS4_28ParameterToGetBasicPresencesERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_25GetBasicPresencesResponseEEENSA_INS8_18ResponseHeaderBaseEEEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi28ParameterToGetBasicPresences10initializeEPNS1_6Common10LibContextEPKc(void* self, const std::uint64_t* context, const char* accountIds) { + return InitializeParameter(self, context, accountIds != nullptr); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi28ParameterToGetBasicPresences9terminateEv(void* self) { + return TerminateParameter(self); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi28ParameterToGetBasicPresencesC1Ev(void* self) { + ConstructParameter(self); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi28ParameterToGetBasicPresencesD1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V118GetFriendsResponse10getFriendsEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +// -------------------------------------------------------------------------- +// SessionManager2V1 PlayerSessionsApi + InGameCatalog2V5 ContainerApi and Common +// container helpers imported by titles whose dumps lack libSceNpCppWebApi.prx: +// request entry points and transactions fail SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN +// offline; parameter bookkeeping succeeds; response accessors stay unimplemented. +// -------------------------------------------------------------------------- + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V149PostPlayerSessionsSessionIdInvitationsRequestBody14setInvitationsERKNS1_6Common6VectorINS5_12IntrusivePtrINS3_30RequestPlayerSessionInvitationEEEEE() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi28sendPlayerSessionInvitationsEiRKNS4_39ParameterToSendPlayerSessionInvitationsERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_50PostPlayerSessionsSessionIdInvitationsResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi17getPlayerSessionsEiRKNS4_28ParameterToGetPlayerSessionsERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_29GetPlayerSessionsResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V120RequestPlayerSession14setCustomData2EPKvm() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi49ParameterToAddPlayerSessionJoinableSpecifiedUsers10initializeEPNS1_6Common10LibContextEPKcNS6_12IntrusivePtrINS3_60PostPlayerSessionsSessionIdJoinableSpecifiedUsersRequestBodyEEE() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi37ParameterToSetPlayerSessionProperties10initializeEPNS1_6Common10LibContextEPKcNS6_12IntrusivePtrINS3_39PatchPlayerSessionsSessionIdRequestBodyEEE() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi36ParameterToChangePlayerSessionLeader9terminateEv() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi37ParameterToSetPlayerSessionPropertiesC1Ev() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi49ParameterToAddPlayerSessionJoinableSpecifiedUsers9terminateEv() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V120RequestPlayerSession14setCustomData1EPKvm() { + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V120PlayerSessionForRead16customData2IsSetEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V124GetBlockingUsersResponse9getBlocksEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi37ParameterToSetPlayerSessionPropertiesD1Ev() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi39ParameterToSendPlayerSessionInvitations10initializeEPNS1_6Common10LibContextEPKcNS6_12IntrusivePtrINS3_49PostPlayerSessionsSessionIdInvitationsRequestBodyEEE() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V146PatchPlayerSessionsSessionIdRequestBodyFactory6createEPNS1_6Common10LibContextEPNS5_12IntrusivePtrINS3_39PatchPlayerSessionsSessionIdRequestBodyEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V137RequestPlayerSessionInvitationFactory6createEPNS1_6Common10LibContextENS5_12IntrusivePtrINS3_2ToEEEPNS8_INS3_30RequestPlayerSessionInvitationEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V139PatchPlayerSessionsSessionIdRequestBody19setJoinableUserTypeERKNS3_22CustomJoinableUserTypeE() { + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V127ResponsePlayerSessionPlayer11getPlatformEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V125GetBasicPresencesResponse17getBasicPresencesEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi28ParameterToGetPlayerSessions9setfieldsENS1_6Common12IntrusivePtrINS6_6VectorINS6_6StringEEEEE() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi28ParameterToGetPlayerSessions9terminateEv() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi29ParameterToLeavePlayerSession9terminateEv(void* self) { + return TerminateParameter(self); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi39ParameterToSendPlayerSessionInvitationsD1Ev() { + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V120PlayerSessionForRead14getCustomData1Ev() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi16getBlockingUsersEiRKNS4_27ParameterToGetBlockingUsersERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_24GetBlockingUsersResponseEEENSA_INS8_18ResponseHeaderBaseEEEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsers10initializeEPNS1_6Common10LibContextE(void* self, const std::uint64_t* context) { + return InitializeParameter(self, context, true); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsers9terminateEv(void* self) { + return TerminateParameter(self); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsersC1Ev(void* self) { + ConstructParameter(self); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi31ParameterToCreatePlayerSessions9terminateEv(void* self) { + return TerminateParameter(self); +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V120PlayerSessionForRead16customData1IsSetEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi38addPlayerSessionJoinableSpecifiedUsersEiRKNS4_49ParameterToAddPlayerSessionJoinableSpecifiedUsersERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_61PostPlayerSessionsSessionIdJoinableSpecifiedUsersResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V120PlayerSessionForRead9getLeaderEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi39ParameterToSendPlayerSessionInvitationsC1Ev() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi28ParameterToGetPlayerSessionsD1Ev() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V120PlayerSessionForRead28getExclusiveLeaderPrivilegesEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi26setPlayerSessionPropertiesEiRKNS4_37ParameterToSetPlayerSessionPropertiesERNS1_6Common11TransactionINS8_15DefaultResponseENS8_12IntrusivePtrINS8_18ResponseHeaderBaseEEEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi25changePlayerSessionLeaderEiRKNS4_36ParameterToChangePlayerSessionLeaderERNS1_6Common11TransactionINS8_15DefaultResponseENS8_12IntrusivePtrINS8_18ResponseHeaderBaseEEEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V150PutPlayerSessionsSessionIdLeaderRequestBodyFactory6createEPNS1_6Common10LibContextERKNS_4Json5ValueEPNS5_12IntrusivePtrINS3_43PutPlayerSessionsSessionIdLeaderRequestBodyEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V119JoinableUserFactory6createEPNS1_6Common10LibContextERKmPNS5_12IntrusivePtrINS3_12JoinableUserEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi36ParameterToChangePlayerSessionLeaderD1Ev() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V156PostPlayerSessionsSessionIdInvitationsRequestBodyFactory6createEPNS1_6Common10LibContextEPNS5_12IntrusivePtrINS3_49PostPlayerSessionsSessionIdInvitationsRequestBodyEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi39ParameterToSendPlayerSessionInvitations9terminateEv() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi28ParameterToGetPlayerSessions10initializeEPNS1_6Common10LibContextEPKc() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi28ParameterToGetPlayerSessionsC1Ev() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V133ResponsePlayerSessionMemberPlayer10getPlayersEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V139PatchPlayerSessionsSessionIdRequestBody28setExclusiveLeaderPrivilegesERKNS1_6Common6VectorINS5_6StringEEE() { + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V113PlayerSession9getMemberEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V19ToFactory6createEPNS1_6Common10LibContextERKmPNS5_12IntrusivePtrINS3_2ToEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi49ParameterToAddPlayerSessionJoinableSpecifiedUsersD1Ev() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi36ParameterToChangePlayerSessionLeader10initializeEPNS1_6Common10LibContextEPKcNS6_12IntrusivePtrINS3_43PutPlayerSessionsSessionIdLeaderRequestBodyEEE() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V167PostPlayerSessionsSessionIdJoinableSpecifiedUsersRequestBodyFactory6createEPNS1_6Common10LibContextERKNS5_6VectorINS5_12IntrusivePtrINS3_12JoinableUserEEEEEPNS9_INS3_60PostPlayerSessionsSessionIdJoinableSpecifiedUsersRequestBodyEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi36ParameterToChangePlayerSessionLeaderC1Ev() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi37ParameterToSetPlayerSessionProperties9terminateEv() { + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118LeaderWithOnlineId12getAccountIdEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V139PatchPlayerSessionsSessionIdRequestBody20setInvitableUserTypeERKNS3_23CustomInvitableUserTypeE() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V129GetPlayerSessionsResponseBody17getPlayerSessionsEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi49ParameterToAddPlayerSessionJoinableSpecifiedUsersC1Ev() { + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V120PlayerSessionForRead14getCustomData2Ev() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V127ResponsePlayerSessionPlayer12getAccountIdEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11hasResponseEv() { + return 0; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V112JoinableUserEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsersD1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi15filterProfanityEiRKNS4_26ParameterToFilterProfanityERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_23FilterProfanityResponseEEENSA_INS8_18ResponseHeaderBaseEEEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi26ParameterToFilterProfanity10initializeEPNS1_6Common10LibContextEPKcSA_NS6_12IntrusivePtrINS3_19WebApiFilterRequestEEE(void* self, const std::uint64_t* context, const char* locale, const char* serviceLabel, const IntrusivePtr* body) { + return InitializeParameterWithBody(self, context, locale != nullptr && serviceLabel != nullptr, body); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi26ParameterToFilterProfanity9terminateEv(void* self) { + return TerminateParameter(self); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi26ParameterToFilterProfanityC1Ev(void* self) { + ConstructParameter(self); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi26ParameterToFilterProfanityD1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi15ProfanityFilter2V226WebApiFilterRequestFactory6createEPNS1_6Common10LibContextEPKcPNS5_12IntrusivePtrINS3_19WebApiFilterRequestEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi33getCommunicationRestrictionStatusEiRKNS4_44ParameterToGetCommunicationRestrictionStatusERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_38CommunicationRestrictionStatusResponseEEENSA_INS8_18ResponseHeaderBaseEEEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi44ParameterToGetCommunicationRestrictionStatus10initializeEPNS1_6Common10LibContextEm(void* self, const std::uint64_t* context, std::uint64_t accountId) { + (void)accountId; + return InitializeParameter(self, context, true); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi44ParameterToGetCommunicationRestrictionStatus9terminateEv(void* self) { + return TerminateParameter(self); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi44ParameterToGetCommunicationRestrictionStatusC1Ev(void* self) { + ConstructParameter(self); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi44ParameterToGetCommunicationRestrictionStatusD1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { + (void)self; + return 0; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_15ProfanityFilter2V219WebApiFilterRequestEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_15ProfanityFilter2V219WebApiFilterRequestEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_15ProfanityFilter2V219WebApiFilterRequestEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_18ResponseHeaderBaseEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_18ResponseHeaderBaseEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6StringEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6StringEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_11UserProfile2V113BasicPresenceEEEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, VectorReferenceCountOffset, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common13ConstIteratorINS2_12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEEEED2Ev(void* self) { + (void)self; + return 0; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V112JoinableUserEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_14SessionManager2V120PlayerSessionForReadEEEEdeEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118LeaderWithOnlineIdEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V112JoinableUserEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11hasResponseEv() { + return 0; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V160PostPlayerSessionsSessionIdJoinableSpecifiedUsersRequestBodyEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V143PutPlayerSessionsSessionIdLeaderRequestBodyEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common13ConstIteratorImED2Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V161PostPlayerSessionsSessionIdJoinableSpecifiedUsersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V127ResponsePlayerSessionPlayerEEEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5abortEv() { + return TransactionNotStarted; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V149PostPlayerSessionsSessionIdInvitationsRequestBodyEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V112JoinableUserEEEE8pushBackERKS8_(IntrusivePtr* self, const void* element) { + return VectorPushBackIntrusivePtr(self, static_cast(element)); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V149PostPlayerSessionsSessionIdInvitationsRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, 0x00); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V113PlayerSessionEEaSERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + AssignIntrusivePtr(self, source, 0x00, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V12ToEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V160PostPlayerSessionsSessionIdJoinableSpecifiedUsersRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, 0x00); +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V120PlayerSessionForReadEEEEEEptEv(const IntrusivePtr* self) { + return self->object; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V161PostPlayerSessionsSessionIdJoinableSpecifiedUsersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common18ResponseHeaderBase14getHeaderValueEPKcRNS2_12IntrusivePtrINS2_6StringEEE() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5abortEv() { + return TransactionNotStarted; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEEEE3endEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEEEE5beginEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorImE3endEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorImE5beginEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEEEEppEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common8IteratorImEppEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V113BasicPresence12getAccountIdEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V113BasicPresence12getInContextEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V113BasicPresence15getOnlineStatusEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi15ProfanityFilter2V223FilterProfanityResponse10getMessageEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponse13getRestrictedEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_18ResponseHeaderBaseEE3getEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_18ResponseHeaderBaseEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6StringEE3getEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6StringEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_11UserProfile2V113BasicPresenceEEEEEEdeEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_11UserProfile2V113BasicPresenceEEEEEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorImEEEdeEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorImEEEptEv(const IntrusivePtr* self) { + return self->object; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V120PlayerSessionForReadEEEE5emptyEv(const IntrusivePtr* self) { + const auto* body = static_cast(self->object); + if (body == nullptr) return 1; + if (body->magic != VectorBodyMagic) { + NotImplemented_nid_no_patch(__func__); + return 0; + } + return body->size == 0; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V143PutPlayerSessionsSessionIdLeaderRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, 0x00); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V139PatchPlayerSessionsSessionIdRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, 0x00); +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V127ResponsePlayerSessionPlayerEEptEv(const IntrusivePtr* self) { + return self->object; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V139PatchPlayerSessionsSessionIdRequestBodyEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V113PlayerSessionEEEEEEaSERKSA_(IntrusivePtr* self, const IntrusivePtr* source) { + AssignIntrusivePtr(self, source, 0x30, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V12ToEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, 0x00); +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V113PlayerSessionEEEEEE3getEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V149PostPlayerSessionsSessionIdInvitationsRequestBodyEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V127ResponsePlayerSessionPlayerEEEEEE3getEv(const IntrusivePtr* self) { + return self->object; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V112JoinableUserEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V130RequestPlayerSessionInvitationEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V127ResponsePlayerSessionPlayerEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V160PostPlayerSessionsSessionIdJoinableSpecifiedUsersRequestBodyEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V12ToEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V161PostPlayerSessionsSessionIdJoinableSpecifiedUsersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5abortEv() { + return TransactionNotStarted; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorImE4sizeEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +std::int64_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5getIdEv() { + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEEEEdeEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11hasResponseEv() { + return 0; +} + +void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V127ResponsePlayerSessionPlayerEEEEixEm(IntrusivePtr* self, unsigned long index) { + auto* body = static_cast(self->object); + if (body == nullptr || body->magic != VectorBodyMagic || body->elementKind != 1) { + NotImplemented_nid_no_patch(__func__); + return nullptr; + } + return static_cast(body->elements) + index; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V127ResponsePlayerSessionPlayerEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common13ConstIteratorINS2_12IntrusivePtrINS1_14SessionManager2V120PlayerSessionForReadEEEED2Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { + (void)self; + return 0; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V143PutPlayerSessionsSessionIdLeaderRequestBodyEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V161PostPlayerSessionsSessionIdJoinableSpecifiedUsersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5abortEv() { + return TransactionNotStarted; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEEEEneERKS9_() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V139PatchPlayerSessionsSessionIdRequestBodyEEptEv(const IntrusivePtr* self) { + return self->object; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V113PlayerSessionEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V139PatchPlayerSessionsSessionIdRequestBodyEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V113PlayerSessionEE3getEv(const IntrusivePtr* self) { + return self->object; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V161PostPlayerSessionsSessionIdJoinableSpecifiedUsersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11hasResponseEv() { + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11hasResponseEv() { + return 0; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V133ResponsePlayerSessionMemberPlayerEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V130RequestPlayerSessionInvitationEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V133ResponsePlayerSessionMemberPlayerEEptEv(const IntrusivePtr* self) { + return self->object; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V113PlayerSessionEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V130RequestPlayerSessionInvitationEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; +} + +std::int64_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V161PostPlayerSessionsSessionIdJoinableSpecifiedUsersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5getIdEv() { + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorImEdeEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118LeaderWithOnlineIdEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + +std::int64_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5getIdEv() { + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorImEneERKS4_() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +std::uint64_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V127ResponsePlayerSessionPlayerEEEE4sizeEv(const IntrusivePtr* self) { + const auto* body = static_cast(self->object); + if (body == nullptr) return 0; + if (body->magic != VectorBodyMagic) { + NotImplemented_nid_no_patch(__func__); + return 0; + } + return body->size; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V120PlayerSessionForReadEEEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V120PlayerSessionForReadEEEE5beginEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V130RequestPlayerSessionInvitationEEEE8pushBackERKS8_(IntrusivePtr* self, const void* element) { + return VectorPushBackIntrusivePtr(self, static_cast(element)); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V161PostPlayerSessionsSessionIdJoinableSpecifiedUsersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5abortEv() { + return TransactionNotStarted; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V149PostPlayerSessionsSessionIdInvitationsRequestBodyEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEE11getResponseERS4_() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V130RequestPlayerSessionInvitationEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V154GetUsersAccountIdPlayerSessionsInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V120PlayerSessionForReadEEptEv(const IntrusivePtr* self) { + return self->object; +} + +std::int64_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5getIdEv() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V127ResponsePlayerSessionPlayerEEEE8copyFromERKS9_() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V113PlayerSessionEEEEEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku10labelIsSetEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku10priceIsSetEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku8getPriceEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku15getDisplayPriceEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi13InGameCatalog2V512ContainerApi23ParameterToGetContainer7setsortENS5_4SortE() { + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku18originalPriceIsSetEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V57Product14getDescriptionEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V57Product14getReleaseDateEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku23getDisplayOriginalPriceEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V57Product14getDisplayNameEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku16getOriginalPriceEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku25displayOriginalPriceIsSetEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku8getLabelEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi13InGameCatalog2V512ContainerApi23ParameterToGetContainer9setoffsetEi() { + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V57Product16releaseDateIsSetEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi13InGameCatalog2V512ContainerApi23ParameterToGetContainer15setcontainerIdsEPKc(void* self, const char* containerIds) { + return SetParameterText(self, containerIds); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi13InGameCatalog2V512ContainerApi23ParameterToGetContainer8setlimitEi() { + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku17displayPriceIsSetEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V57Product5getIdEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS2_6VectorINS4_INS1_13InGameCatalog2V59ContainerEEEEEEENS4_INS2_18ResponseHeaderBaseEEEE11hasResponseEv() { + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS2_6VectorINS4_INS1_13InGameCatalog2V59ContainerEEEEEEENS4_INS2_18ResponseHeaderBaseEEEEaSERKSE_() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V59ContainerEEEEppEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_13InGameCatalog2V57ProductEEEE5emptyEv(const IntrusivePtr* self) { + const auto* body = static_cast(self->object); + if (body == nullptr) return 1; + if (body->magic != VectorBodyMagic) { + NotImplemented_nid_no_patch(__func__); + return 0; + } + return body->size == 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V59ContainerEEEEneERKS9_() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_13InGameCatalog2V53SkuEEEE5beginEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V53SkuEEEEneERKS9_() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V57ProductEEEEEEdeEv(const IntrusivePtr* self) { + return self->object; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_13InGameCatalog2V53SkuEEptEv(const IntrusivePtr* self) { + return self->object; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common13ConstIteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V53SkuEEEED2Ev(void* self) { (void)self; return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V139RequestCreatePlayerSessionPlayerFactory6createEPNS1_6Common10LibContextEPKcS9_RKNS5_6VectorINS5_12IntrusivePtrINS3_24PlayerSessionPushContextEEEEEPNSB_INS3_32RequestCreatePlayerSessionPlayerEEE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_13InGameCatalog2V59ContainerEEEE3endEv() { + NotImplemented_nid_no_patch(__func__); + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V59ContainerEEEEdeEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V53SkuEEEEdeEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V59ContainerEEEEEEC1ERKSA_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, 0x30); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS2_6VectorINS4_INS1_13InGameCatalog2V59ContainerEEEEEEENS4_INS2_18ResponseHeaderBaseEEEEC1ERKSE_(void* self) { (void)self; return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V124PlayerSessionPushContextEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { - self->object = nullptr; - self->deleter = nullptr; - self->libContext = libContext; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common13ConstIteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V59ContainerEEEED2Ev(void* self) { + (void)self; + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V124PlayerSessionPushContextEEEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x30, __func__); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_13InGameCatalog2V59ContainerEEEE5beginEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_13InGameCatalog2V53SkuEEEE3endEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V53SkuEEEEEEdeEv(const IntrusivePtr* self) { + return self->object; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V53SkuEEEEppEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_13InGameCatalog2V59ContainerEEEE5emptyEv(const IntrusivePtr* self) { + const auto* body = static_cast(self->object); + if (body == nullptr) return 1; + if (body->magic != VectorBodyMagic) { + NotImplemented_nid_no_patch(__func__); + return 0; + } + return body->size == 0; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V59ContainerEEEEEEaSERKSA_(IntrusivePtr* self, const IntrusivePtr* source) { + AssignIntrusivePtr(self, source, 0x30, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common8IteratorINS2_6StringEEppEv() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorImEEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common13ConstIteratorINS2_6StringEED2Ev(void* self) { + (void)self; + return 0; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_6StringEE8copyFromERKS5_() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorImEEE3getEv(const IntrusivePtr* self) { + return self->object; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_6StringEEneERKS5_() { + NotImplemented_nid_no_patch(__func__); + return 0; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V136UsersPlayerSessionsInvitationForReadEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEE11hasResponseEv() { + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEC1Ev(IntrusivePtr* self) { - *self = {}; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS2_6StringEEEEptEv(const IntrusivePtr* self) { + return self->object; } -const char* APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V113PlayerSession12getSessionIdEv(const void* self) { - (void)self; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_6StringEE3endEv() { NotImplemented_nid_no_patch(__func__); - return nullptr; + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V158PostPlayerSessionsSessionIdMemberPlayersRequestBodyFactory6createEPNS1_6Common10LibContextERKNS5_6VectorINS5_12IntrusivePtrINS3_26RequestPlayerSessionPlayerEEEEEPNS9_INS3_51PostPlayerSessionsSessionIdMemberPlayersRequestBodyEEE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6StringeqEPKc(const CommonString* self, const char* other) { + return other != nullptr && std::strcmp(self->buffer != nullptr ? self->buffer : "", other) == 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V136PostPlayerSessionsRequestBodyFactory6createEPNS1_6Common10LibContextERKNS5_6VectorINS5_12IntrusivePtrINS3_20RequestPlayerSessionEEEEEPNS9_INS3_29PostPlayerSessionsRequestBodyEEE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +std::int64_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEE5getIdEv() { + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEE5abortEv() { + return TransactionNotStarted; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V120RequestPlayerSession28setExclusiveLeaderPrivilegesERKNS1_6Common6VectorINS5_6StringEEE() { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_6StringEE5beginEv() { + NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEED1Ev(void* self) { - (void)self; + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS2_6StringEEEE3getEv(const IntrusivePtr* self) { + return self->object; +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_6StringEEdeEv() { + NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common13ConstIteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V57ProductEEEED2Ev(void* self) { - (void)self; +// -------------------------------------------------------------------------- +// UserProfile2V1 model accessors, CommunicationRestrictionStatus plumbing and +// the remaining Common instantiations, from the same dump whose modules lack +// libSceNpCppWebApi.prx. +// -------------------------------------------------------------------------- + +int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V112BasicProfile19personalDetailIsSetEv() { + NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common13ConstIteratorINS2_12IntrusivePtrINS1_17TitleCloudStorage2V110DataStatusEEEED2Ev(void* self) { - (void)self; +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V115BasicProfileApi28ParameterToGetPublicProfiles9terminateEv() { return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V59ContainerEEEEEEC1Ev(IntrusivePtr* self) { - *self = {}; +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V112BasicProfileC1EPNS1_6Common10LibContextE() { + return 0; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V59ContainerEEEEEEdeEv(const IntrusivePtr* self) { - return self->object; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V59ContainerEEEEEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEE11hasResponseEv() { + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V59ContainerEEEEEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x30, __func__); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V57ProductEEEEEEptEv(const IntrusivePtr* self) { - return self->object; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEC1Ev(IntrusivePtr* self) { + *self = {}; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V57ProductEEEEEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x30, __func__); +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V115BasicProfileApi28ParameterToGetPublicProfiles10initializeEPNS1_6Common10LibContextEPKc() { + return 0; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V53SkuEEEEEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { + (void)self; + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V53SkuEEEEEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x30, __func__); +int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V112BasicProfile25isOfficiallyVerifiedIsSetEv() { + NotImplemented_nid_no_patch(__func__); + return 0; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_17TitleCloudStorage2V110DataStatusEEEEEEdeEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V113BasicPresence14accountIdIsSetEv() { + NotImplemented_nid_no_patch(__func__); + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_17TitleCloudStorage2V110DataStatusEEEEEED1Ev(IntrusivePtr* self) { +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_11UserProfile2V112BasicProfileEEEEEED1Ev(IntrusivePtr* self) { ReleaseIntrusivePtr(self, 0x30, __func__); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_13InGameCatalog2V59ContainerEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { - CopyIntrusivePtr(self, source, 0x00); +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V113BasicPresence12setAccountIdERKm() { + return 0; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_13InGameCatalog2V59ContainerEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V113BasicPresenceC1EPNS1_6Common10LibContextE() { + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_13InGameCatalog2V59ContainerEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5abortEv() { + NotImplemented_nid_no_patch(__func__); + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_13InGameCatalog2V57ProductEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { - CopyIntrusivePtr(self, source, 0x00); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V114PersonalDetailEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_13InGameCatalog2V57ProductEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5getIdEv() { + NotImplemented_nid_no_patch(__func__); + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_13InGameCatalog2V57ProductEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEE11hasResponseEv() { + return 0; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V110DataStatusEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V113BasicPresence12setInContextERKb() { + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V132GetMultiDataStatusesResponseBodyEEC1Ev(IntrusivePtr* self) { +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_11UserProfile2V112BasicProfileEEEEEEC1Ev(IntrusivePtr* self) { *self = {}; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V132GetMultiDataStatusesResponseBodyEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEENS4_INS2_18ResponseHeaderBaseEEEE11hasResponseEv() { + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V132GetMultiDataStatusesResponseBodyEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V15OwnerEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriends9setoffsetEi() { + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V15OwnerEED1Ev(IntrusivePtr* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return 0; +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEED1Ev(IntrusivePtr* self) { ReleaseIntrusivePtr(self, 0x00, __func__); } -bool APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V57ProductEEEEneERKS9_(const void* self, const void* other) { - (void)self; - (void)other; - NotImplemented_nid_no_patch(__func__); - return false; +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V112BasicProfile11setOnlineIdERK13SceNpOnlineId() { + return 0; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V57ProductEEEEdeEv(const void* self) { - (void)self; - NotImplemented_nid_no_patch(__func__); - return nullptr; +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -void* APS5_VABI _ZN3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V57ProductEEEEppEv(void* self) { - (void)self; - NotImplemented_nid_no_patch(__func__); - return nullptr; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_11UserProfile2V113BasicPresenceEEEEEE3getEv(const IntrusivePtr* self) { + return self->object; } -bool APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_17TitleCloudStorage2V110DataStatusEEEEneERKS9_(const void* self, const void* other) { - (void)self; - (void)other; - NotImplemented_nid_no_patch(__func__); - return false; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_17TitleCloudStorage2V110DataStatusEEEEdeEv(const void* self) { - (void)self; +int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V112BasicProfile17getPersonalDetailEv() { NotImplemented_nid_no_patch(__func__); - return nullptr; + return 0; } -void* APS5_VABI _ZN3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_17TitleCloudStorage2V110DataStatusEEEEppEv(void* self) { +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEC1Ev(IntrusivePtr* self) { + *self = {}; +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEENS4_INS2_18ResponseHeaderBaseEEEEC1ERKSB_(void* self) { (void)self; - NotImplemented_nid_no_patch(__func__); - return nullptr; + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS2_6VectorINS4_INS1_13InGameCatalog2V59ContainerEEEEEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { - std::memset(self, 0, 0x10); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_11UserProfile2V112BasicProfileEEEEEEptEv(const IntrusivePtr* self) { + return self->object; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS2_6VectorINS4_INS1_13InGameCatalog2V59ContainerEEEEEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERSB_(const void* self, void* response) { - (void)self; - (void)response; +int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V112BasicProfile11getOnlineIdEv() { NotImplemented_nid_no_patch(__func__); return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS2_6VectorINS4_INS1_13InGameCatalog2V59ContainerEEEEEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { - (void)self; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_11UserProfile2V113BasicPresenceEEEEEEaSERKSA_(IntrusivePtr* self, const IntrusivePtr* source) { + ReleaseIntrusivePtr(self, 0x30, __func__); + CopyIntrusivePtr(self, source, 0x30); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V132GetMultiDataStatusesResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { - std::memset(self, 0, 0x10); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11UserProfile2V112BasicProfileEEEE5beginEv() { + NotImplemented_nid_no_patch(__func__); + return 0; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V132GetMultiDataStatusesResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_(const void* self, void* response) { - (void)self; - (void)response; +int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V114PersonalDetail14getDisplayNameEv() { NotImplemented_nid_no_patch(__func__); return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V132GetMultiDataStatusesResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { - (void)self; +int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V112BasicProfile13onlineIdIsSetEv() { + NotImplemented_nid_no_patch(__func__); + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS2_6VectorINS4_INS1_13InGameCatalog2V59ContainerEEEEEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv(void* self) { - (void)self; - return TransactionNotStarted; +int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V113BasicPresence14inContextIsSetEv() { + NotImplemented_nid_no_patch(__func__); + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS2_6VectorINS4_INS1_13InGameCatalog2V59ContainerEEEEEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE(void* self, void* context) { - (void)self; - (void)context; - NotImplemented_nid_no_patch(__func__); +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE11hasResponseEv() { return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_17TitleCloudStorage2V132GetMultiDataStatusesResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv(void* self) { - (void)self; - return TransactionNotStarted; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V114PersonalDetailEEptEv(const IntrusivePtr* self) { + return self->object; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_17TitleCloudStorage2V132GetMultiDataStatusesResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE(void* self, void* context) { - (void)self; - (void)context; - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEC1ERKS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, 0x00); } -void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_13InGameCatalog2V59ContainerEEEEixEm(void* self, std::uint64_t index) { - return HostVectorElement(self, index, __func__); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V112BasicProfileEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); } -std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_13InGameCatalog2V59ContainerEEEE4sizeEv(const void* self) { - return HostVectorSize(self, __func__); +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V112BasicProfileD1Ev() { + return 0; } -void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_13InGameCatalog2V57ProductEEEE5beginEv(void* self) { - (void)self; +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_11UserProfile2V112BasicProfileEEEEneERKS9_() { NotImplemented_nid_no_patch(__func__); - return nullptr; + return 0; } -void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_13InGameCatalog2V57ProductEEEE3endEv(void* self) { - (void)self; - NotImplemented_nid_no_patch(__func__); - return nullptr; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, 0x00); } -std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_13InGameCatalog2V53SkuEEEE4sizeEv(const void* self) { - return HostVectorSize(self, __func__); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEC1Ev(IntrusivePtr* self) { + *self = {}; } -void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_17TitleCloudStorage2V110DataStatusEEEE5beginEv(void* self) { - (void)self; +int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V112BasicProfile23getIsOfficiallyVerifiedEv() { NotImplemented_nid_no_patch(__func__); - return nullptr; + return 0; } -void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_17TitleCloudStorage2V110DataStatusEEEE3endEv(void* self) { - (void)self; - NotImplemented_nid_no_patch(__func__); - return nullptr; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_11UserProfile2V112BasicProfileEEEEEE3getEv(const IntrusivePtr* self) { + return self->object; } -void* APS5_VABI _ZN3sce2Np9CppWebApi13InGameCatalog2V59Container11getChildrenEv(void* self) { - (void)self; - NotImplemented_nid_no_patch(__func__); - return nullptr; +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZN3sce2Np9CppWebApi13InGameCatalog2V512ContainerApi23ParameterToGetContainerC1Ev(void* self) { - ConstructParameter(self); - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V115BasicProfileApi17getPublicProfilesEiRKNS4_28ParameterToGetPublicProfilesERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_25GetPublicProfilesResponseEEENSA_INS8_18ResponseHeaderBaseEEEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZN3sce2Np9CppWebApi13InGameCatalog2V512ContainerApi23ParameterToGetContainer10initializeEPNS1_6Common10LibContextE(void* self, const std::uint64_t* context) { - return InitializeParameter(self, context, true); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_11UserProfile2V113BasicPresenceEEEEEEC1Ev(IntrusivePtr* self) { + *self = {}; } -bool APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V512ContainerApi23ParameterToGetContainer13isInitializedEv(const void* self) { - return static_cast(self)->implementation != nullptr; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEC1Ev(IntrusivePtr* self) { + *self = {}; } -int APS5_VABI _ZN3sce2Np9CppWebApi13InGameCatalog2V512ContainerApi23ParameterToGetContainer15setserviceLabelEi(void* self, int serviceLabel) { - (void)self; - (void)serviceLabel; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_11UserProfile2V112BasicProfileEEEEEEaSERKSA_(IntrusivePtr* self, const IntrusivePtr* source) { + ReleaseIntrusivePtr(self, 0x30, __func__); + CopyIntrusivePtr(self, source, 0x30); +} + +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE11hasResponseEv() { return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi13InGameCatalog2V512ContainerApi23ParameterToGetContainer9terminateEv(void* self) { - return TerminateParameter(self); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEptEv(const IntrusivePtr* self) { + return self->object; } -int APS5_VABI _ZN3sce2Np9CppWebApi13InGameCatalog2V512ContainerApi23ParameterToGetContainerD1Ev(void* self) { - (void)self; - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi13InGameCatalog2V512ContainerApi12getContainerEiRKNS4_23ParameterToGetContainerERNS1_6Common11TransactionINS8_12IntrusivePtrINS8_6VectorINSA_INS3_9ContainerEEEEEEENSA_INS8_18ResponseHeaderBaseEEEEE() { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -const char* APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V57Product8getLabelEv(const void* self) { - (void)self; - NotImplemented_nid_no_patch(__func__); - return nullptr; +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -void* APS5_VABI _ZN3sce2Np9CppWebApi13InGameCatalog2V57Product7getSkusEv(void* self) { - (void)self; - NotImplemented_nid_no_patch(__func__); - return nullptr; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V112BasicProfileEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, 0x00); } -int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V57Product7getTypeEv(const void* self) { - (void)self; +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V125GetPublicProfilesResponse11getProfilesEv() { NotImplemented_nid_no_patch(__func__); return 0; } -bool APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V57Product9skusIsSetEv(const void* self) { - (void)self; +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5getIdEv() { NotImplemented_nid_no_patch(__func__); - return false; + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi23ParameterToDownloadData11setobjectIdEPKc(void* self, const char* objectId) { - return SetParameterText(self, objectId); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_11UserProfile2V112BasicProfileEEEEppEv() { + NotImplemented_nid_no_patch(__func__); + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi37ParameterToGetMultiDataStatusesByUserC1Ev(void* self) { - ConstructParameter(self); +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriends8setlimitEi() { return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi37ParameterToGetMultiDataStatusesByUser10initializeEPNS1_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 _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5abortEv() { + NotImplemented_nid_no_patch(__func__); + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi37ParameterToGetMultiDataStatusesByUser9setfieldsEPKc(void* self, const char* fields) { - return SetParameterText(self, fields); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEC1Ev(IntrusivePtr* self) { + *self = {}; } -int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi37ParameterToGetMultiDataStatusesByUser9terminateEv(void* self) { - return TerminateParameter(self); +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V112BasicProfile23setIsOfficiallyVerifiedERKb() { + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi37ParameterToGetMultiDataStatusesByUserD1Ev(void* self) { - (void)self; +int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V113BasicPresence17onlineStatusIsSetEv() { + NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V17DataApi26getMultiDataStatusesByUserEiRKNS4_37ParameterToGetMultiDataStatusesByUserERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_32GetMultiDataStatusesResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE(void) { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V115BasicProfileApi28ParameterToGetPublicProfilesD1Ev() { return 0; } -std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V110DataStatus11getDataSizeEv(const void* self) { - (void)self; - NotImplemented_nid_no_patch(__func__); +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V115BasicProfileApi28ParameterToGetPublicProfilesC1Ev() { return 0; } -const char* APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V110DataStatus11getObjectIdEv(const void* self) { - (void)self; - NotImplemented_nid_no_patch(__func__); - return nullptr; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEaSERKS7_(IntrusivePtr* self, const IntrusivePtr* source) { + ReleaseIntrusivePtr(self, 0x00, __func__); + CopyIntrusivePtr(self, source, 0x00); } -void* APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V110DataStatus8getOwnerEv(const void* self) { - (void)self; +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5getIdEv() { NotImplemented_nid_no_patch(__func__); - return nullptr; + return 0; } -int APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V110DataStatus9getSlotIdEv(const void* self) { - (void)self; - NotImplemented_nid_no_patch(__func__); +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V113BasicPresenceD1Ev() { return 0; } -void* APS5_VABI _ZN3sce2Np9CppWebApi17TitleCloudStorage2V132GetMultiDataStatusesResponseBody17getDataStatusListEv(void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { (void)self; - NotImplemented_nid_no_patch(__func__); - return nullptr; + return 0; } -std::uint32_t APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V132GetMultiDataStatusesResponseBody23getTotalDataStatusCountEv(const void* self) { +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x00, __func__); +} + +int APS5_VABI _ZN3sce2Np9CppWebApi6Common13ConstIteratorINS2_12IntrusivePtrINS1_11UserProfile2V112BasicProfileEEEED2Ev(void* self) { (void)self; - NotImplemented_nid_no_patch(__func__); return 0; } -std::uint64_t APS5_VABI _ZNK3sce2Np9CppWebApi17TitleCloudStorage2V15Owner12getAccountIdEv(const void* self) { - (void)self; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5abortEv() { NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi10getFriendsEiRKNS4_21ParameterToGetFriendsERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_18GetFriendsResponseEEENSA_INS8_18ResponseHeaderBaseEEEEE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsers8setlimitEi() { + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriends10initializeEPNS1_6Common10LibContextEPKc() { - return 0; +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5getIdEv() { + NotImplemented_nid_no_patch(__func__); + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriends9terminateEv() { - return 0; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V112BasicProfileEEptEv(const IntrusivePtr* self) { + return self->object; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriendsC1Ev(void* self) { - (void)self; +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsers9setoffsetEi() { return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriendsD1Ev(void* self) { - (void)self; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11UserProfile2V112BasicProfileEEEE3endEv() { + NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi17getBasicPresencesEiRKNS4_28ParameterToGetBasicPresencesERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_25GetBasicPresencesResponseEEENSA_INS8_18ResponseHeaderBaseEEEEE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V113BasicPresence15setOnlineStatusERKNS3_12OnlineStatusE() { + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi28ParameterToGetBasicPresences10initializeEPNS1_6Common10LibContextEPKc() { - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5abortEv() { + NotImplemented_nid_no_patch(__func__); + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi28ParameterToGetBasicPresences9terminateEv() { - return 0; +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_11UserProfile2V112BasicProfileEEEEdeEv() { + NotImplemented_nid_no_patch(__func__); + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi28ParameterToGetBasicPresencesC1Ev(void* self) { - (void)self; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEENS4_INS2_18ResponseHeaderBaseEEEEaSERKSB_() { + NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi28ParameterToGetBasicPresencesD1Ev(void* self) { - (void)self; - return 0; +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V118GetFriendsResponse10getFriendsEv() { - NotImplemented_nid_no_patch(__func__); - return 0; + + + +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi15getGameSessionsEiRKNS4_26ParameterToGetGameSessionsERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_27GetGameSessionsResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -// -------------------------------------------------------------------------- -// SessionManager2V1 PlayerSessionsApi + InGameCatalog2V5 ContainerApi and Common -// container helpers imported by titles whose dumps lack libSceNpCppWebApi.prx: -// request entry points and transactions fail SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN -// offline; parameter bookkeeping succeeds; response accessors stay unimplemented. -// -------------------------------------------------------------------------- +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi16leaveGameSessionEiRKNS4_27ParameterToLeaveGameSessionERNS1_6Common11TransactionINS8_15DefaultResponseENS8_12IntrusivePtrINS8_18ResponseHeaderBaseEEEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +} -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V149PostPlayerSessionsSessionIdInvitationsRequestBody14setInvitationsERKNS1_6Common6VectorINS5_12IntrusivePtrINS3_30RequestPlayerSessionInvitationEEEEE() { - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi18createGameSessionsEiRKNS4_29ParameterToCreateGameSessionsERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_28PostGameSessionsResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi28sendPlayerSessionInvitationsEiRKNS4_39ParameterToSendPlayerSessionInvitationsERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_50PostPlayerSessionsSessionIdInvitationsResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE() { +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi23joinGameSessionAsPlayerEiRKNS4_34ParameterToJoinGameSessionAsPlayerERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_50PostGameSessionsSessionIdMemberPlayersResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE() { return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi17getPlayerSessionsEiRKNS4_28ParameterToGetPlayerSessionsERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_29GetPlayerSessionsResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE() { +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi24setGameSessionPropertiesEiRKNS4_35ParameterToSetGameSessionPropertiesERNS1_6Common11TransactionINS8_15DefaultResponseENS8_12IntrusivePtrINS8_18ResponseHeaderBaseEEEEE() { return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V120RequestPlayerSession14setCustomData2EPKvm() { - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi26ParameterToGetGameSessions10initializeEPNS1_6Common10LibContextEPKc(void* self, const std::uint64_t* context, const char* a1) { + return InitializeParameter(self, context, a1 != nullptr); } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi49ParameterToAddPlayerSessionJoinableSpecifiedUsers10initializeEPNS1_6Common10LibContextEPKcNS6_12IntrusivePtrINS3_60PostPlayerSessionsSessionIdJoinableSpecifiedUsersRequestBodyEEE() { +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi26ParameterToGetGameSessions9setfieldsENS1_6Common12IntrusivePtrINS6_6VectorINS6_6StringEEEEE() { return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi37ParameterToSetPlayerSessionProperties10initializeEPNS1_6Common10LibContextEPKcNS6_12IntrusivePtrINS3_39PatchPlayerSessionsSessionIdRequestBodyEEE() { - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi26ParameterToGetGameSessions9terminateEv(void* self) { + return TerminateParameter(self); } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi36ParameterToChangePlayerSessionLeader9terminateEv() { +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi26ParameterToGetGameSessionsC1Ev(void* self) { + ConstructParameter(self); return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi37ParameterToSetPlayerSessionPropertiesC1Ev() { +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi26ParameterToGetGameSessionsD1Ev(void* self) { + (void)self; return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi49ParameterToAddPlayerSessionJoinableSpecifiedUsers9terminateEv() { - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi27ParameterToLeaveGameSession10initializeEPNS1_6Common10LibContextEPKcSA_(void* self, const std::uint64_t* context, ...) { + return InitializeParameter(self, context, true); } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V120RequestPlayerSession14setCustomData1EPKvm() { - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi27ParameterToLeaveGameSession9terminateEv(void* self) { + return TerminateParameter(self); } -int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V120PlayerSessionForRead16customData2IsSetEv() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi27ParameterToLeaveGameSessionC1Ev(void* self) { + ConstructParameter(self); return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V124GetBlockingUsersResponse9getBlocksEv() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi27ParameterToLeaveGameSessionD1Ev(void* self) { + (void)self; return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi37ParameterToSetPlayerSessionPropertiesD1Ev() { +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 _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi39ParameterToSendPlayerSessionInvitations10initializeEPNS1_6Common10LibContextEPKcNS6_12IntrusivePtrINS3_49PostPlayerSessionsSessionIdInvitationsRequestBodyEEE() { +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi29ParameterToCreateGameSessionsD1Ev(void* self) { + (void)self; return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V146PatchPlayerSessionsSessionIdRequestBodyFactory6createEPNS1_6Common10LibContextEPNS5_12IntrusivePtrINS3_39PatchPlayerSessionsSessionIdRequestBodyEEE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi34ParameterToJoinGameSessionAsPlayer10initializeEPNS1_6Common10LibContextEPKcNS6_12IntrusivePtrINS3_49PostGameSessionsSessionIdMemberPlayersRequestBodyEEE(void* self, const std::uint64_t* context, ...) { + return InitializeParameter(self, context, true); } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V137RequestPlayerSessionInvitationFactory6createEPNS1_6Common10LibContextENS5_12IntrusivePtrINS3_2ToEEEPNS8_INS3_30RequestPlayerSessionInvitationEEE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi34ParameterToJoinGameSessionAsPlayer9terminateEv(void* self) { + return TerminateParameter(self); } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V139PatchPlayerSessionsSessionIdRequestBody19setJoinableUserTypeERKNS3_22CustomJoinableUserTypeE() { +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi34ParameterToJoinGameSessionAsPlayerC1Ev(void* self) { + ConstructParameter(self); return 0; } -int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V127ResponsePlayerSessionPlayer11getPlatformEv() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi34ParameterToJoinGameSessionAsPlayerD1Ev(void* self) { + (void)self; return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V125GetBasicPresencesResponse17getBasicPresencesEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi35ParameterToSetGameSessionProperties10initializeEPNS1_6Common10LibContextEPKcNS6_12IntrusivePtrINS3_37PatchGameSessionsSessionIdRequestBodyEEE(void* self, const std::uint64_t* context, ...) { + return InitializeParameter(self, context, true); } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi28ParameterToGetPlayerSessions9setfieldsENS1_6Common12IntrusivePtrINS6_6VectorINS6_6StringEEEEE() { - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi35ParameterToSetGameSessionProperties9terminateEv(void* self) { + return TerminateParameter(self); } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi28ParameterToGetPlayerSessions9terminateEv() { +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi35ParameterToSetGameSessionPropertiesC1Ev(void* self) { + ConstructParameter(self); return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi29ParameterToLeavePlayerSession9terminateEv(void* self) { - return TerminateParameter(self); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V115GameSessionsApi35ParameterToSetGameSessionPropertiesD1Ev(void* self) { + (void)self; + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi39ParameterToSendPlayerSessionInvitationsD1Ev() { +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V118RequestGameSession14setCustomData1EPKvm() { return 0; } -int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V120PlayerSessionForRead14getCustomData1Ev() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V118RequestGameSession14setCustomData2EPKvm() { return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi16getBlockingUsersEiRKNS4_27ParameterToGetBlockingUsersERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_24GetBlockingUsersResponseEEENSA_INS8_18ResponseHeaderBaseEEEEE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V118RequestGameSession16setMaxSpectatorsERKi() { + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsers10initializeEPNS1_6Common10LibContextE() { - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V118RequestGameSession19setUsePlayerSessionERKb() { + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsers9terminateEv() { - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V120RequestPlayerSession16setSwapSupportedERKb() { + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsersC1Ev(void* self) { - (void)self; +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V120RequestPlayerSession19setLeaderPrivilegesERKNS1_6Common6VectorINS5_6StringEEE() { return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi31ParameterToCreatePlayerSessions9terminateEv(void* self) { - return TerminateParameter(self); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V124RequestGameSessionPlayer12setJoinStateERKNS3_16InitialJoinStateE() { + return 0; } -int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V120PlayerSessionForRead16customData1IsSetEv() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V124RequestGameSessionPlayer15setPushContextsERKNS1_6Common6VectorINS5_12IntrusivePtrINS3_22GameSessionPushContextEEEEE() { return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi38addPlayerSessionJoinableSpecifiedUsersEiRKNS4_49ParameterToAddPlayerSessionJoinableSpecifiedUsersERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_61PostPlayerSessionsSessionIdJoinableSpecifiedUsersResponseBodyEEENSA_INS8_18ResponseHeaderBaseEEEEE() { +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V125RequestGameSessionFactory6createEPNS1_6Common10LibContextEiNS5_12IntrusivePtrINS3_30RequestGameSessionMemberPlayerEEERKNS5_6VectorINS5_6StringEEEPNS8_INS3_18RequestGameSessionEEE() { return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V120PlayerSessionForRead9getLeaderEv() { +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V127GetGameSessionsResponseBody15getGameSessionsEv(void* self) { + (void)self; NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi39ParameterToSendPlayerSessionInvitationsC1Ev() { +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V128PostGameSessionsResponseBody15getGameSessionsEv(void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi28ParameterToGetPlayerSessionsD1Ev() { +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V128RequestJoinGameSessionPlayer12setJoinStateERKNS3_16InitialJoinStateE() { return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V120PlayerSessionForRead28getExclusiveLeaderPrivilegesEv() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V128RequestJoinGameSessionPlayer15setPushContextsERKNS1_6Common6VectorINS5_12IntrusivePtrINS3_22GameSessionPushContextEEEEE() { return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi26setPlayerSessionPropertiesEiRKNS4_37ParameterToSetPlayerSessionPropertiesERNS1_6Common11TransactionINS8_15DefaultResponseENS8_12IntrusivePtrINS8_18ResponseHeaderBaseEEEEE() { +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V129GameSessionPushContextFactory6createEPNS1_6Common10LibContextEPKcPNS5_12IntrusivePtrINS3_22GameSessionPushContextEEE() { return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi25changePlayerSessionLeaderEiRKNS4_36ParameterToChangePlayerSessionLeaderERNS1_6Common11TransactionINS8_15DefaultResponseENS8_12IntrusivePtrINS8_18ResponseHeaderBaseEEEEE() { +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V131RequestGameSessionPlayerFactory6createEPNS1_6Common10LibContextEPKcS9_PNS5_12IntrusivePtrINS3_24RequestGameSessionPlayerEEE() { return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V150PutPlayerSessionsSessionIdLeaderRequestBodyFactory6createEPNS1_6Common10LibContextERKNS_4Json5ValueEPNS5_12IntrusivePtrINS3_43PutPlayerSessionsSessionIdLeaderRequestBodyEEE() { +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V134PostGameSessionsRequestBodyFactory6createEPNS1_6Common10LibContextERKNS5_6VectorINS5_12IntrusivePtrINS3_18RequestGameSessionEEEEEPNS9_INS3_27PostGameSessionsRequestBodyEEE() { return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V119JoinableUserFactory6createEPNS1_6Common10LibContextERKmPNS5_12IntrusivePtrINS3_12JoinableUserEEE() { +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V135RequestJoinGameSessionPlayerFactory6createEPNS1_6Common10LibContextEPKcS9_PNS5_12IntrusivePtrINS3_28RequestJoinGameSessionPlayerEEE() { return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi36ParameterToChangePlayerSessionLeaderD1Ev() { +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V137PatchGameSessionsSessionIdRequestBody14setCustomData1EPKvm() { return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V156PostPlayerSessionsSessionIdInvitationsRequestBodyFactory6createEPNS1_6Common10LibContextEPNS5_12IntrusivePtrINS3_49PostPlayerSessionsSessionIdInvitationsRequestBodyEEE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V137PatchGameSessionsSessionIdRequestBody14setCustomData2EPKvm() { + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi39ParameterToSendPlayerSessionInvitations9terminateEv() { +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V137PatchGameSessionsSessionIdRequestBody16setMaxSpectatorsERKi() { return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi28ParameterToGetPlayerSessions10initializeEPNS1_6Common10LibContextEPKc() { - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V137RequestGameSessionMemberPlayerFactory6createEPNS1_6Common10LibContextERKNS5_6VectorINS5_12IntrusivePtrINS3_24RequestGameSessionPlayerEEEEEPNS9_INS3_30RequestGameSessionMemberPlayerEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi28ParameterToGetPlayerSessionsC1Ev() { +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V139PatchPlayerSessionsSessionIdRequestBody14setCustomData1EPKvm() { return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V133ResponsePlayerSessionMemberPlayer10getPlayersEv() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V139PatchPlayerSessionsSessionIdRequestBody14setCustomData2EPKvm() { return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V139PatchPlayerSessionsSessionIdRequestBody28setExclusiveLeaderPrivilegesERKNS1_6Common6VectorINS5_6StringEEE() { +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V139PatchPlayerSessionsSessionIdRequestBody16setMaxSpectatorsERKi() { return 0; } -int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V113PlayerSession9getMemberEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V144PatchGameSessionsSessionIdRequestBodyFactory6createEPNS1_6Common10LibContextEPNS5_12IntrusivePtrINS3_37PatchGameSessionsSessionIdRequestBodyEEE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V19ToFactory6createEPNS1_6Common10LibContextERKmPNS5_12IntrusivePtrINS3_2ToEEE() { +int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V156PostGameSessionsSessionIdMemberPlayersRequestBodyFactory6createEPNS1_6Common10LibContextERKNS5_6VectorINS5_12IntrusivePtrINS3_28RequestJoinGameSessionPlayerEEEEEPNS9_INS3_49PostGameSessionsSessionIdMemberPlayersRequestBodyEEE() { return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi49ParameterToAddPlayerSessionJoinableSpecifiedUsersD1Ev() { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11Matchmaking2V120GetOfferResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi36ParameterToChangePlayerSessionLeader10initializeEPNS1_6Common10LibContextEPKcNS6_12IntrusivePtrINS3_43PutPlayerSessionsSessionIdLeaderRequestBodyEEE() { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11Matchmaking2V120GetOfferResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { + (void)self; return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V167PostPlayerSessionsSessionIdJoinableSpecifiedUsersRequestBodyFactory6createEPNS1_6Common10LibContextERKNS5_6VectorINS5_12IntrusivePtrINS3_12JoinableUserEEEEEPNS9_INS3_60PostPlayerSessionsSessionIdJoinableSpecifiedUsersRequestBodyEEE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11Matchmaking2V120GetOfferResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { + (void)self; + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi36ParameterToChangePlayerSessionLeaderC1Ev() { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11Matchmaking2V124SubmitTicketResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi37ParameterToSetPlayerSessionProperties9terminateEv() { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11Matchmaking2V124SubmitTicketResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { + (void)self; return 0; } -int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118LeaderWithOnlineId12getAccountIdEv() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11Matchmaking2V124SubmitTicketResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { + (void)self; return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V139PatchPlayerSessionsSessionIdRequestBody20setInvitableUserTypeERKNS3_23CustomInvitableUserTypeE() { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V129GetPlayerSessionsResponseBody17getPlayerSessionsEv() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi49ParameterToAddPlayerSessionJoinableSpecifiedUsersC1Ev() { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEENS4_INS6_9RecordApi26RecordScoreResponseHeadersEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSD_ESD_() { return 0; } -int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V120PlayerSessionForRead14getCustomData2Ev() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { return 0; } -int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V127ResponsePlayerSessionPlayer12getAccountIdEv() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { + (void)self; return 0; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11hasResponseEv() { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { + (void)self; return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V112JoinableUserEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V128PostGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V128PostGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { (void)self; return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsersD1Ev(void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V128PostGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { (void)self; return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi15filterProfanityEiRKNS4_26ParameterToFilterProfanityERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_23FilterProfanityResponseEEENSA_INS8_18ResponseHeaderBaseEEEEE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi26ParameterToFilterProfanity10initializeEPNS1_6Common10LibContextEPKcSA_NS6_12IntrusivePtrINS3_19WebApiFilterRequestEEE() { - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi26ParameterToFilterProfanity9terminateEv() { - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V150PostGameSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi26ParameterToFilterProfanityC1Ev(void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V150PostGameSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { (void)self; return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi26ParameterToFilterProfanityD1Ev(void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V150PostGameSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { (void)self; return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi15ProfanityFilter2V226WebApiFilterRequestFactory6createEPNS1_6Common10LibContextEPKcPNS5_12IntrusivePtrINS3_19WebApiFilterRequestEEE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi33getCommunicationRestrictionStatusEiRKNS4_44ParameterToGetCommunicationRestrictionStatusERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_38CommunicationRestrictionStatusResponseEEENSA_INS8_18ResponseHeaderBaseEEEEE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi44ParameterToGetCommunicationRestrictionStatus10initializeEPNS1_6Common10LibContextEm() { - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi44ParameterToGetCommunicationRestrictionStatus9terminateEv() { - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_7Matches2V119CreateMatchResponseEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi44ParameterToGetCommunicationRestrictionStatusC1Ev(void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_7Matches2V119CreateMatchResponseEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { (void)self; return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi44ParameterToGetCommunicationRestrictionStatusD1Ev(void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_7Matches2V119CreateMatchResponseEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { (void)self; return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS2_6VectorINS4_INS1_13InGameCatalog2V59ContainerEEEEEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliSB_PvEPFvliSF_ESF_() { + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_15DefaultResponseENS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi26SetDataInfoResponseHeadersEEEEC1Ev(void* self) { (void)self; return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_15DefaultResponseENS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi26SetDataInfoResponseHeadersEEEED1Ev(void* self) { (void)self; return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS4_PvEPFvliS9_ES9_() { + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { - (void)self; - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V121PlayerForTicketCreateEEC1Ev(IntrusivePtr* self) { + *self = {}; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { - (void)self; - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V121PlayerForTicketCreateEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V123SubmitTicketRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { - (void)self; - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V123SubmitTicketRequestBodyEEC1Ev(IntrusivePtr* self) { + *self = {}; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { - (void)self; - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V123SubmitTicketRequestBodyEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V19AttributeEEC1Ev(IntrusivePtr* self) { + *self = {}; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { - (void)self; - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V19AttributeEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { - (void)self; - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V114RepresentativeEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_() { - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118MatchmakingForReadEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { - (void)self; - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118RequestGameSessionEEC1Ev(IntrusivePtr* self) { + *self = {}; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { - (void)self; - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118RequestGameSessionEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_15ProfanityFilter2V219WebApiFilterRequestEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V122GameSessionPushContextEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { CopyIntrusivePtr(self, source, ReferenceCountOffset); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_15ProfanityFilter2V219WebApiFilterRequestEEC1Ev(IntrusivePtr* self) { +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V122GameSessionPushContextEEC1Ev(IntrusivePtr* self) { *self = {}; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_15ProfanityFilter2V219WebApiFilterRequestEED1Ev(IntrusivePtr* self) { +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V122GameSessionPushContextEED1Ev(IntrusivePtr* self) { ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_18ResponseHeaderBaseEEC1Ev(IntrusivePtr* self) { +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 _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_18ResponseHeaderBaseEED1Ev(IntrusivePtr* self) { +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V124RequestGameSessionPlayerEED1Ev(IntrusivePtr* self) { ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6StringEEC1Ev(IntrusivePtr* self) { +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 _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6StringEED1Ev(IntrusivePtr* self) { +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V127PostGameSessionsRequestBodyEED1Ev(IntrusivePtr* self) { ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_11UserProfile2V113BasicPresenceEEEEEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, VectorReferenceCountOffset, __func__); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V128RequestJoinGameSessionPlayerEEC1Ev(IntrusivePtr* self) { + *self = {}; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common13ConstIteratorINS2_12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEEEED2Ev(void* self) { - (void)self; - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V128RequestJoinGameSessionPlayerEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V112JoinableUserEEC1Ev(IntrusivePtr* self) { +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V130RequestGameSessionMemberPlayerEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); +} + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V130RequestGameSessionMemberPlayerEEC1Ev(IntrusivePtr* self) { *self = {}; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_14SessionManager2V120PlayerSessionForReadEEEEdeEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V130RequestGameSessionMemberPlayerEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118LeaderWithOnlineIdEEptEv(const IntrusivePtr* self) { - return self->object; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V137PatchGameSessionsSessionIdRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V112JoinableUserEEEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x30, __func__); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V137PatchGameSessionsSessionIdRequestBodyEEC1Ev(IntrusivePtr* self) { + *self = {}; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11hasResponseEv() { - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V137PatchGameSessionsSessionIdRequestBodyEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V160PostPlayerSessionsSessionIdJoinableSpecifiedUsersRequestBodyEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V149PostGameSessionsSessionIdMemberPlayersRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V143PutPlayerSessionsSessionIdLeaderRequestBodyEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V149PostGameSessionsSessionIdMemberPlayersRequestBodyEEC1Ev(IntrusivePtr* self) { + *self = {}; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { - (void)self; - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V149PostGameSessionsSessionIdMemberPlayersRequestBodyEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common13ConstIteratorImED2Ev(void* self) { - (void)self; - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEEC1Ev(IntrusivePtr* self) { + *self = {}; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V161PostPlayerSessionsSessionIdJoinableSpecifiedUsersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { - return TransactionNotStarted; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V127ResponsePlayerSessionPlayerEEEEEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x30, __func__); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V122SetDataInfoRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V122SetDataInfoRequestBodyEEC1Ev(IntrusivePtr* self) { + *self = {}; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5abortEv() { - return TransactionNotStarted; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V122SetDataInfoRequestBodyEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V149PostPlayerSessionsSessionIdInvitationsRequestBodyEEC1Ev(IntrusivePtr* self) { +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi25UploadDataResponseHeadersEEC1Ev(IntrusivePtr* self) { *self = {}; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { - return TransactionNotStarted; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi25UploadDataResponseHeadersEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V112JoinableUserEEEE8pushBackERKS8_(IntrusivePtr* self, const void* element) { - return VectorPushBackIntrusivePtr(self, static_cast(element)); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V111AddedPlayerEEC1Ev(IntrusivePtr* self) { + *self = {}; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V149PostPlayerSessionsSessionIdInvitationsRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { - CopyIntrusivePtr(self, source, 0x00); +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__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { - return TransactionNotStarted; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118RequestMatchPlayerEEC1Ev(IntrusivePtr* self) { + *self = {}; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V113PlayerSessionEEaSERS7_(IntrusivePtr* self, const IntrusivePtr* source) { - AssignIntrusivePtr(self, source, 0x00, __func__); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118RequestMatchPlayerEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V12ToEEC1Ev(IntrusivePtr* self) { +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118RequestTeamResultsEEC1Ev(IntrusivePtr* self) { *self = {}; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEptEv(const IntrusivePtr* self) { - return self->object; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118RequestTeamResultsEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V160PostPlayerSessionsSessionIdJoinableSpecifiedUsersRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { - CopyIntrusivePtr(self, source, 0x00); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119AdditionalStatisticEEC1Ev(IntrusivePtr* self) { + *self = {}; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V120PlayerSessionForReadEEEEEEptEv(const IntrusivePtr* self) { - return self->object; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119AdditionalStatisticEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V161PostPlayerSessionsSessionIdJoinableSpecifiedUsersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { - (void)self; - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119RequestInGameRosterEEC1Ev(IntrusivePtr* self) { + *self = {}; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119RequestInGameRosterEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119RequestMatchResultsEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { - return TransactionNotStarted; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119RequestMatchResultsEEC1Ev(IntrusivePtr* self) { + *self = {}; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119RequestMatchResultsEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120ReportResultsRequestEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { - return TransactionNotStarted; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120ReportResultsRequestEEC1Ev(IntrusivePtr* self) { + *self = {}; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120ReportResultsRequestEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120RequestPlayerResultsEEC1Ev(IntrusivePtr* self) { + *self = {}; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { - return TransactionNotStarted; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120RequestPlayerResultsEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120RequestTeamStatisticEEC1Ev(IntrusivePtr* self) { + *self = {}; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120RequestTeamStatisticEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { - return TransactionNotStarted; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V122RequestMatchStatisticsEEC1Ev(IntrusivePtr* self) { + *self = {}; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V122RequestMatchStatisticsEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V122RequestPlayerStatisticEEC1Ev(IntrusivePtr* self) { + *self = {}; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { - return TransactionNotStarted; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V122RequestPlayerStatisticEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common18ResponseHeaderBase14getHeaderValueEPKcRNS2_12IntrusivePtrINS2_6StringEEE() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V123RequestTeamMemberResultEEC1Ev(IntrusivePtr* self) { + *self = {}; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5abortEv() { - return TransactionNotStarted; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V123RequestTeamMemberResultEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEEEE3endEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124RequestCompetitiveResultEEC1Ev(IntrusivePtr* self) { + *self = {}; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEEEE5beginEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124RequestCompetitiveResultEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorImE3endEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124UpdateMatchDetailRequestEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorImE5beginEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124UpdateMatchDetailRequestEEC1Ev(IntrusivePtr* self) { + *self = {}; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEEEEppEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124UpdateMatchDetailRequestEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common8IteratorImEppEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124UpdateMatchStatusRequestEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, ReferenceCountOffset); } -int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V113BasicPresence12getAccountIdEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124UpdateMatchStatusRequestEEC1Ev(IntrusivePtr* self) { + *self = {}; } -int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V113BasicPresence12getInContextEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124UpdateMatchStatusRequestEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V113BasicPresence15getOnlineStatusEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V126RequestTeamMemberStatisticEEC1Ev(IntrusivePtr* self) { + *self = {}; } -int APS5_VABI _ZNK3sce2Np9CppWebApi15ProfanityFilter2V223FilterProfanityResponse10getMessageEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V126RequestTeamMemberStatisticEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, ReferenceCountOffset, __func__); } -int APS5_VABI _ZNK3sce2Np9CppWebApi30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponse13getRestrictedEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V59ContainerEEEEEEC1ERSA_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, 0x30); } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEEptEv(const IntrusivePtr* self) { - return self->object; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V111GameSessionEEEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEptEv(const IntrusivePtr* self) { - return self->object; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V118GameSessionForReadEEEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11Matchmaking2V120GetOfferResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11Matchmaking2V120GetOfferResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11Matchmaking2V120GetOfferResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11Matchmaking2V124SubmitTicketResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_18ResponseHeaderBaseEE3getEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11Matchmaking2V124SubmitTicketResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_18ResponseHeaderBaseEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11Matchmaking2V124SubmitTicketResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6StringEE3getEv(const IntrusivePtr* self) { - return self->object; -} -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6StringEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_11UserProfile2V113BasicPresenceEEEEEEdeEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V123RecordScoreResponseBodyEEENS4_INS6_9RecordApi26RecordScoreResponseHeadersEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_11UserProfile2V113BasicPresenceEEEEEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorImEEEdeEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorImEEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V128PostGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V128PostGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V128PostGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEEEE4sizeEv() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V150PostGameSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V150PostGameSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V120PlayerSessionForReadEEEE5emptyEv(const IntrusivePtr* self) { - const auto* body = static_cast(self->object); - if (body == nullptr) return 1; - if (body->magic != VectorBodyMagic) { - NotImplemented_nid_no_patch(__func__); - return 0; - } - return body->size == 0; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V150PostGameSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEEC1Ev(IntrusivePtr* self) { - *self = {}; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V143PutPlayerSessionsSessionIdLeaderRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { - CopyIntrusivePtr(self, source, 0x00); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V139PatchPlayerSessionsSessionIdRequestBodyEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { - CopyIntrusivePtr(self, source, 0x00); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_17TitleCloudStorage2V122UploadDataResponseBodyEEENS4_INS6_7DataApi25UploadDataResponseHeadersEEEE6finishEv() { + return TransactionNotStarted; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V127ResponsePlayerSessionPlayerEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_7Matches2V119CreateMatchResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { - (void)self; - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_7Matches2V119CreateMatchResponseEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { + return TransactionNotStarted; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_15DefaultResponseENS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi26SetDataInfoResponseHeadersEEEE5startEPNS2_10LibContextE() { return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V139PatchPlayerSessionsSessionIdRequestBodyEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_15DefaultResponseENS2_12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi26SetDataInfoResponseHeadersEEEE6finishEv() { + return TransactionNotStarted; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V113PlayerSessionEEEEEEaSERKSA_(IntrusivePtr* self, const IntrusivePtr* source) { - AssignIntrusivePtr(self, source, 0x30, __func__); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEE28setResponseInformationOptionEP37SceNpWebApi2ResponseInformationOption() { + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V12ToEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { - CopyIntrusivePtr(self, source, 0x00); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common19UpStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V122UploadDataResponseBodyEEENS4_INS6_7DataApi25UploadDataResponseHeadersEEEE5startEPNS2_10LibContextEm() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V113PlayerSessionEEEEEE3getEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common19UpStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V122UploadDataResponseBodyEEENS4_INS6_7DataApi25UploadDataResponseHeadersEEEE8sendDataEPKvm() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V149PostPlayerSessionsSessionIdInvitationsRequestBodyEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common19UpStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V122UploadDataResponseBodyEEENS4_INS6_7DataApi25UploadDataResponseHeadersEEEEC1Ev(void* self) { + (void)self; + return 0; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V127ResponsePlayerSessionPlayerEEEEEE3getEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common19UpStreamTransactionINS2_12IntrusivePtrINS1_17TitleCloudStorage2V122UploadDataResponseBodyEEENS4_INS6_7DataApi25UploadDataResponseHeadersEEEED1Ev(void* self) { + (void)self; + return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V112JoinableUserEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { - self->object = nullptr; - self->deleter = nullptr; - self->libContext = libContext; -} -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V130RequestPlayerSessionInvitationEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11Matchmaking2V121PlayerForTicketCreateEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V127ResponsePlayerSessionPlayerEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11Matchmaking2V121PlayerForTicketCreateEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { self->object = nullptr; self->deleter = nullptr; self->libContext = libContext; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEC1Ev(IntrusivePtr* self) { - *self = {}; -} - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V160PostPlayerSessionsSessionIdJoinableSpecifiedUsersRequestBodyEEC1Ev(IntrusivePtr* self) { - *self = {}; -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; -} - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V12ToEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11Matchmaking2V121PlayerForTicketCreateEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V161PostPlayerSessionsSessionIdJoinableSpecifiedUsersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5abortEv() { - return TransactionNotStarted; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11Matchmaking2V19AttributeEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorImE4sizeEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11Matchmaking2V19AttributeEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; } -std::int64_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5getIdEv() { - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11Matchmaking2V19AttributeEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEEEEdeEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V111GameSessionEEEEixEm(void* self, std::uint64_t index) { + return HostVectorElement(self, index, __func__); } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11hasResponseEv() { - return 0; +void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V118GameSessionForReadEEEEixEm(void* self, std::uint64_t index) { + return HostVectorElement(self, index, __func__); } -void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V127ResponsePlayerSessionPlayerEEEEixEm(IntrusivePtr* self, unsigned long index) { - auto* body = static_cast(self->object); - if (body == nullptr || body->magic != VectorBodyMagic || body->elementKind != 1) { - NotImplemented_nid_no_patch(__func__); - return nullptr; - } - return static_cast(body->elements) + index; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V118RequestGameSessionEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V127ResponsePlayerSessionPlayerEEEED1Ev(IntrusivePtr* self) { +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__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common13ConstIteratorINS2_12IntrusivePtrINS1_14SessionManager2V120PlayerSessionForReadEEEED2Ev(void* self) { - (void)self; - return 0; +void* APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V120PlayerSessionForReadEEEEixEm(void* self, std::uint64_t index) { + return HostVectorElement(self, index, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { - (void)self; - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V122GameSessionPushContextEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V143PutPlayerSessionsSessionIdLeaderRequestBodyEEC1Ev(IntrusivePtr* self) { - *self = {}; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V122GameSessionPushContextEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V161PostPlayerSessionsSessionIdJoinableSpecifiedUsersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { - (void)self; - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V122GameSessionPushContextEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5abortEv() { - return TransactionNotStarted; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V124RequestGameSessionPlayerEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEEEEneERKS9_() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V124RequestGameSessionPlayerEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V139PatchPlayerSessionsSessionIdRequestBodyEEptEv(const IntrusivePtr* self) { - return self->object; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V124RequestGameSessionPlayerEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V113PlayerSessionEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V128RequestJoinGameSessionPlayerEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V139PatchPlayerSessionsSessionIdRequestBodyEEC1Ev(IntrusivePtr* self) { - *self = {}; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V128RequestJoinGameSessionPlayerEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V113PlayerSessionEE3getEv(const IntrusivePtr* self) { - return self->object; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V128RequestJoinGameSessionPlayerEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V161PostPlayerSessionsSessionIdJoinableSpecifiedUsersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11hasResponseEv() { - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V111AddedPlayerEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11hasResponseEv() { - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V111AddedPlayerEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V133ResponsePlayerSessionMemberPlayerEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V111AddedPlayerEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V130RequestPlayerSessionInvitationEEC1Ev(IntrusivePtr* self) { - *self = {}; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V113RemovedPlayerEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V133ResponsePlayerSessionMemberPlayerEEptEv(const IntrusivePtr* self) { - return self->object; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V113RemovedPlayerEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V113RemovedPlayerEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V113PlayerSessionEEC1Ev(IntrusivePtr* self) { - *self = {}; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V113RequestMemberEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V130RequestPlayerSessionInvitationEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V113RequestMemberEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { self->object = nullptr; self->deleter = nullptr; self->libContext = libContext; } -std::int64_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V161PostPlayerSessionsSessionIdJoinableSpecifiedUsersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5getIdEv() { - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V113RequestMemberEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorImEdeEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V116RequestMatchTeamEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118LeaderWithOnlineIdEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V116RequestMatchTeamEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; } -std::int64_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5getIdEv() { - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V116RequestMatchTeamEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorImEneERKS4_() { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V118RequestMatchPlayerEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); } -std::uint64_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V127ResponsePlayerSessionPlayerEEEE4sizeEv(const IntrusivePtr* self) { - const auto* body = static_cast(self->object); - if (body == nullptr) return 0; - if (body->magic != VectorBodyMagic) { - NotImplemented_nid_no_patch(__func__); - return 0; - } - return body->size; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V118RequestMatchPlayerEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V120PlayerSessionForReadEEEEEED1Ev(IntrusivePtr* self) { +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V118RequestMatchPlayerEEEED1Ev(IntrusivePtr* self) { ReleaseIntrusivePtr(self, 0x30, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V120PlayerSessionForReadEEEE5beginEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V118RequestTeamResultsEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V130RequestPlayerSessionInvitationEEEE8pushBackERKS8_(IntrusivePtr* self, const void* element) { - return VectorPushBackIntrusivePtr(self, static_cast(element)); +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V118RequestTeamResultsEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V161PostPlayerSessionsSessionIdJoinableSpecifiedUsersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V118RequestTeamResultsEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5abortEv() { - return TransactionNotStarted; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V119AdditionalStatisticEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V149PostPlayerSessionsSessionIdInvitationsRequestBodyEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +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_14SessionManager2V130RequestPlayerSessionInvitationEEEED1Ev(IntrusivePtr* self) { +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V119AdditionalStatisticEEEED1Ev(IntrusivePtr* self) { ReleaseIntrusivePtr(self, 0x30, __func__); } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V120PlayerSessionForReadEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V120RequestPlayerResultsEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); } -std::int64_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE5getIdEv() { - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V120RequestPlayerResultsEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V127ResponsePlayerSessionPlayerEEEE8copyFromERKS9_() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V120RequestPlayerResultsEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V120RequestTeamStatisticEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V113PlayerSessionEEEEEEC1Ev(IntrusivePtr* self) { - *self = {}; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V120RequestTeamStatisticEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; } -int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku10labelIsSetEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V120RequestTeamStatisticEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); } -int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku10priceIsSetEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V122RequestPlayerStatisticEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); } -int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku8getPriceEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V122RequestPlayerStatisticEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; } -int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku15getDisplayPriceEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V122RequestPlayerStatisticEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi13InGameCatalog2V512ContainerApi23ParameterToGetContainer7setsortENS5_4SortE() { - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V123RequestTeamMemberResultEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); } -int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku18originalPriceIsSetEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V123RequestTeamMemberResultEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; } -int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V57Product14getDescriptionEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V123RequestTeamMemberResultEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); } -int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V57Product14getReleaseDateEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V126RequestTeamMemberStatisticEEEE8pushBackERKS8_(IntrusivePtr* self, const IntrusivePtr* element) { + return VectorPushBackIntrusivePtr(self, element); } -int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku23getDisplayOriginalPriceEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V126RequestTeamMemberStatisticEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; } -int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V57Product14getDisplayNameEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V126RequestTeamMemberStatisticEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); } -int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku16getOriginalPriceEv() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_6StringEE7reserveEi() { return 0; } -int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku25displayOriginalPriceIsSetEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} -int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku8getLabelEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} -int APS5_VABI _ZN3sce2Np9CppWebApi13InGameCatalog2V512ContainerApi23ParameterToGetContainer9setoffsetEi() { - return 0; -} -int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V57Product16releaseDateIsSetEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} -int APS5_VABI _ZN3sce2Np9CppWebApi13InGameCatalog2V512ContainerApi23ParameterToGetContainer15setcontainerIdsEPKc(void* self, const char* containerIds) { - return SetParameterText(self, containerIds); -} -int APS5_VABI _ZN3sce2Np9CppWebApi13InGameCatalog2V512ContainerApi23ParameterToGetContainer8setlimitEi() { - return 0; -} -int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V53Sku17displayPriceIsSetEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} -int APS5_VABI _ZNK3sce2Np9CppWebApi13InGameCatalog2V57Product5getIdEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS2_6VectorINS4_INS1_13InGameCatalog2V59ContainerEEEEEEENS4_INS2_18ResponseHeaderBaseEEEE11hasResponseEv() { - return 0; -} -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS2_6VectorINS4_INS1_13InGameCatalog2V59ContainerEEEEEEENS4_INS2_18ResponseHeaderBaseEEEEaSERKSE_() { - NotImplemented_nid_no_patch(__func__); - return 0; -} -int APS5_VABI _ZN3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V59ContainerEEEEppEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_13InGameCatalog2V57ProductEEEE5emptyEv(const IntrusivePtr* self) { - const auto* body = static_cast(self->object); - if (body == nullptr) return 1; - if (body->magic != VectorBodyMagic) { - NotImplemented_nid_no_patch(__func__); - return 0; - } - return body->size == 0; -} -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V59ContainerEEEEneERKS9_() { - NotImplemented_nid_no_patch(__func__); - return 0; -} -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_13InGameCatalog2V53SkuEEEE5beginEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V53SkuEEEEneERKS9_() { - NotImplemented_nid_no_patch(__func__); - return 0; -} -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V57ProductEEEEEEdeEv(const IntrusivePtr* self) { - return self->object; -} -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_13InGameCatalog2V53SkuEEptEv(const IntrusivePtr* self) { - return self->object; -} -int APS5_VABI _ZN3sce2Np9CppWebApi6Common13ConstIteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V53SkuEEEED2Ev(void* self) { - (void)self; - return 0; -} -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_13InGameCatalog2V59ContainerEEEE3endEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V59ContainerEEEEdeEv() { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V114PersonalDetail11getLastNameEv(const void* self) { + (void)self; NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V53SkuEEEEdeEv() { +int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V114PersonalDetail12getFirstNameEv(const void* self) { + (void)self; NotImplemented_nid_no_patch(__func__); return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V59ContainerEEEEEEC1ERKSA_(IntrusivePtr* self, const IntrusivePtr* source) { - CopyIntrusivePtr(self, source, 0x30); -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS2_6VectorINS4_INS1_13InGameCatalog2V59ContainerEEEEEEENS4_INS2_18ResponseHeaderBaseEEEEC1ERKSE_(void* self) { +int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V114PersonalDetail13getMiddleNameEv(const void* self) { (void)self; + NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common13ConstIteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V59ContainerEEEED2Ev(void* self) { +bool APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V114PersonalDetail13lastNameIsSetEv(const void* self) { (void)self; - return 0; + NotImplemented_nid_no_patch(__func__); + return false; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_13InGameCatalog2V59ContainerEEEE5beginEv() { +bool APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V114PersonalDetail14firstNameIsSetEv(const void* self) { + (void)self; NotImplemented_nid_no_patch(__func__); - return 0; + return false; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_13InGameCatalog2V53SkuEEEE3endEv() { +bool APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V114PersonalDetail15middleNameIsSetEv(const void* self) { + (void)self; NotImplemented_nid_no_patch(__func__); - return 0; + return false; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V53SkuEEEEEEdeEv(const IntrusivePtr* self) { - return self->object; -} -int APS5_VABI _ZN3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_13InGameCatalog2V53SkuEEEEppEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_13InGameCatalog2V59ContainerEEEE5emptyEv(const IntrusivePtr* self) { - const auto* body = static_cast(self->object); - if (body == nullptr) return 1; - if (body->magic != VectorBodyMagic) { - NotImplemented_nid_no_patch(__func__); - return 0; - } - return body->size == 0; -} -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_13InGameCatalog2V59ContainerEEEEEEaSERKSA_(IntrusivePtr* self, const IntrusivePtr* source) { - AssignIntrusivePtr(self, source, 0x30, __func__); -} -int APS5_VABI _ZN3sce2Np9CppWebApi6Common8IteratorINS2_6StringEEppEv() { - NotImplemented_nid_no_patch(__func__); - return 0; -} -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorImEEEC1Ev(IntrusivePtr* self) { - *self = {}; -} -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorImEEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x30, __func__); -} -int APS5_VABI _ZN3sce2Np9CppWebApi6Common13ConstIteratorINS2_6StringEED2Ev(void* self) { - (void)self; - return 0; -} -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_6StringEE8copyFromERKS5_() { - NotImplemented_nid_no_patch(__func__); - return 0; -} -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorImEEE3getEv(const IntrusivePtr* self) { - return self->object; -} -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_6StringEEneERKS5_() { + + +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V111GameSession12getSessionIdEv(const void* self) { + (void)self; NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEE11hasResponseEv() { +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V114Representative11getOnlineIdEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); return 0; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS2_6StringEEEEptEv(const IntrusivePtr* self) { - return self->object; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_6StringEE3endEv() { +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V114Representative12getAccountIdEv(const void* self) { + (void)self; NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6StringeqEPKc(const CommonString* self, const char* other) { - return other != nullptr && std::strcmp(self->buffer != nullptr ? self->buffer : "", other) == 0; -} - -std::int64_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEE5getIdEv() { +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118GameSessionForRead14getCustomData1Ev(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); 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; +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118GameSessionForRead14getCustomData2Ev(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_6StringEE5beginEv() { +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118GameSessionForRead14getMatchmakingEv(const void* self) { + (void)self; NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common6String5emptyEv(const CommonString* self) { - return self->buffer == nullptr || self->buffer[0] == '\0'; +bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118GameSessionForRead16customData1IsSetEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return false; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS2_6StringEEEE3getEv(const IntrusivePtr* self) { - return self->object; +bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118GameSessionForRead16customData2IsSetEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return false; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_6StringEEdeEv() { +bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118GameSessionForRead16matchmakingIsSetEv(const void* self) { + (void)self; NotImplemented_nid_no_patch(__func__); - return 0; + return false; } -// -------------------------------------------------------------------------- -// UserProfile2V1 model accessors, CommunicationRestrictionStatus plumbing and -// the remaining Common instantiations, from the same dump whose modules lack -// libSceNpCppWebApi.prx. -// -------------------------------------------------------------------------- - -int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V112BasicProfile19personalDetailIsSetEv() { +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118GameSessionForRead17getRepresentativeEv(const void* self) { + (void)self; NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V115BasicProfileApi28ParameterToGetPublicProfiles9terminateEv() { - return 0; +bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118GameSessionForRead19representativeIsSetEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return false; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V112BasicProfileC1EPNS1_6Common10LibContextE() { +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118LeaderWithOnlineId11getOnlineIdEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); -} - -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEE11hasResponseEv() { +int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V118MatchmakingForRead10getOfferIdEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); return 0; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); -} - -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEC1Ev(IntrusivePtr* self) { - *self = {}; -} - -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V115BasicProfileApi28ParameterToGetPublicProfiles10initializeEPNS1_6Common10LibContextEPKc() { - return 0; +bool APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V120PlayerSessionForRead11leaderIsSetEv(const void* self) { + (void)self; + NotImplemented_nid_no_patch(__func__); + return false; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEENS4_INS2_18ResponseHeaderBaseEEEED1Ev(void* self) { - (void)self; - return 0; +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V112BasicProfile25isOfficiallyVerifiedIsSetEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V121PlayerForTicketCreateEEptEv(const IntrusivePtr* self) { + return self->object; } -int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V113BasicPresence14accountIdIsSetEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V123SubmitTicketRequestBodyEEptEv(const IntrusivePtr* self) { + return self->object; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_11UserProfile2V112BasicProfileEEEEEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x30, __func__); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11Matchmaking2V124SubmitTicketResponseBodyEEptEv(const IntrusivePtr* self) { + return self->object; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V113BasicPresence12setAccountIdERKm() { - return 0; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_12Leaderboards2V19RecordApi26RecordScoreResponseHeadersEE3getEv(const IntrusivePtr* self) { + return self->object; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V113BasicPresenceC1EPNS1_6Common10LibContextE() { - return 0; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V111GameSessionEEptEv(const IntrusivePtr* self) { + return self->object; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5abortEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V114RepresentativeEEptEv(const IntrusivePtr* self) { + return self->object; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V114PersonalDetailEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +bool APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118GameSessionForReadEEcvbEv(const IntrusivePtr* self) { + return self->object != nullptr; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5getIdEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118GameSessionForReadEEdeEv(const IntrusivePtr* self) { + return self->object; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEE11hasResponseEv() { - return 0; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118GameSessionForReadEEptEv(const IntrusivePtr* self) { + return self->object; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V113BasicPresence12setInContextERKb() { - return 0; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118MatchmakingForReadEEptEv(const IntrusivePtr* self) { + return self->object; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_11UserProfile2V112BasicProfileEEEEEEC1Ev(IntrusivePtr* self) { - *self = {}; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V118RequestGameSessionEEptEv(const IntrusivePtr* self) { + return self->object; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEENS4_INS2_18ResponseHeaderBaseEEEE11hasResponseEv() { - return 0; +bool APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V120PlayerSessionForReadEEcvbEv(const IntrusivePtr* self) { + return self->object != nullptr; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V120PlayerSessionForReadEEdeEv(const IntrusivePtr* self) { + return self->object; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriends9setoffsetEi() { - return 0; +bool APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V122GameSessionPushContextEEcvbEv(const IntrusivePtr* self) { + return self->object != nullptr; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE6finishEv() { - return 0; +bool APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V124PlayerSessionPushContextEEcvbEv(const IntrusivePtr* self) { + return self->object != nullptr; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V124RequestGameSessionPlayerEEptEv(const IntrusivePtr* self) { + return self->object; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V112BasicProfile11setOnlineIdERK13SceNpOnlineId() { - return 0; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEptEv(const IntrusivePtr* self) { + return self->object; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V128PostGameSessionsResponseBodyEEptEv(const IntrusivePtr* self) { + return self->object; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_11UserProfile2V113BasicPresenceEEEEEE3getEv(const IntrusivePtr* self) { +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V128RequestJoinGameSessionPlayerEEptEv(const IntrusivePtr* self) { return self->object; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V137PatchGameSessionsSessionIdRequestBodyEEptEv(const IntrusivePtr* self) { + return self->object; } -int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V112BasicProfile17getPersonalDetailEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_17TitleCloudStorage2V17DataApi25UploadDataResponseHeadersEEptEv(const IntrusivePtr* self) { + return self->object; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEC1Ev(IntrusivePtr* self) { - *self = {}; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V111AddedPlayerEEptEv(const IntrusivePtr* self) { + return self->object; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEENS4_INS2_18ResponseHeaderBaseEEEEC1ERKSB_(void* self) { - (void)self; - return 0; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V113RemovedPlayerEEptEv(const IntrusivePtr* self) { + return self->object; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_11UserProfile2V112BasicProfileEEEEEEptEv(const IntrusivePtr* self) { +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V116JoinMatchRequestEEptEv(const IntrusivePtr* self) { return self->object; } -int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V112BasicProfile11getOnlineIdEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V116RequestMatchTeamEEptEv(const IntrusivePtr* self) { + return self->object; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_11UserProfile2V113BasicPresenceEEEEEEaSERKSA_(IntrusivePtr* self, const IntrusivePtr* source) { - ReleaseIntrusivePtr(self, 0x30, __func__); - CopyIntrusivePtr(self, source, 0x30); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V117LeaveMatchRequestEEptEv(const IntrusivePtr* self) { + return self->object; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11UserProfile2V112BasicProfileEEEE5beginEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118CreateMatchRequestEEptEv(const IntrusivePtr* self) { + return self->object; } -int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V114PersonalDetail14getDisplayNameEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118RequestMatchPlayerEEptEv(const IntrusivePtr* self) { + return self->object; } -int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V112BasicProfile13onlineIdIsSetEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V118RequestTeamResultsEEptEv(const IntrusivePtr* self) { + return self->object; } -int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V113BasicPresence14inContextIsSetEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119CreateMatchResponseEEptEv(const IntrusivePtr* self) { + return self->object; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE11hasResponseEv() { - return 0; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119RequestInGameRosterEEptEv(const IntrusivePtr* self) { + return self->object; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V114PersonalDetailEEptEv(const IntrusivePtr* self) { +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V119RequestMatchResultsEEptEv(const IntrusivePtr* self) { return self->object; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEC1ERKS7_(IntrusivePtr* self, const IntrusivePtr* source) { - CopyIntrusivePtr(self, source, 0x00); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120ReportResultsRequestEEptEv(const IntrusivePtr* self) { + return self->object; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V112BasicProfileEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120RequestPlayerResultsEEptEv(const IntrusivePtr* self) { + return self->object; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V112BasicProfileD1Ev() { - return 0; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V120RequestTeamStatisticEEptEv(const IntrusivePtr* self) { + return self->object; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_11UserProfile2V112BasicProfileEEEEneERKS9_() { - NotImplemented_nid_no_patch(__func__); - return 0; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V122RequestMatchStatisticsEEptEv(const IntrusivePtr* self) { + return self->object; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { - CopyIntrusivePtr(self, source, 0x00); +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124RequestCompetitiveResultEEptEv(const IntrusivePtr* self) { + return self->object; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEC1Ev(IntrusivePtr* self) { - *self = {}; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124UpdateMatchDetailRequestEEptEv(const IntrusivePtr* self) { + return self->object; } -int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V112BasicProfile23getIsOfficiallyVerifiedEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_7Matches2V124UpdateMatchStatusRequestEEptEv(const IntrusivePtr* self) { + return self->object; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_11UserProfile2V112BasicProfileEEEEEE3getEv(const IntrusivePtr* self) { + +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_12Leaderboards2V15EntryEEEEEEptEv(const IntrusivePtr* self) { return self->object; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V111GameSessionEEEEEEdeEv(const IntrusivePtr* self) { + return self->object; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V115BasicProfileApi17getPublicProfilesEiRKNS4_28ParameterToGetPublicProfilesERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_25GetPublicProfilesResponseEEENSA_INS8_18ResponseHeaderBaseEEEEE() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V118GameSessionForReadEEEEEEdeEv(const IntrusivePtr* self) { + return self->object; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_11UserProfile2V113BasicPresenceEEEEEEC1Ev(IntrusivePtr* self) { - *self = {}; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V118GameSessionForReadEEEEEEptEv(const IntrusivePtr* self) { + return self->object; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEC1Ev(IntrusivePtr* self) { - *self = {}; +void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_14SessionManager2V120PlayerSessionForReadEEEEEEdeEv(const IntrusivePtr* self) { + return self->object; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS3_INS1_11UserProfile2V112BasicProfileEEEEEEaSERKSA_(IntrusivePtr* self, const IntrusivePtr* source) { - ReleaseIntrusivePtr(self, 0x30, __func__); - CopyIntrusivePtr(self, source, 0x30); +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11Matchmaking2V120GetOfferResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE11hasResponseEv() { - return 0; +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11Matchmaking2V124SubmitTicketResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_12Leaderboards2V122GetRankingResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5startEPNS2_10LibContextE() { +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V127GetGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V128PostGameSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V112BasicProfileEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { - CopyIntrusivePtr(self, source, 0x00); +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V125GetPublicProfilesResponse11getProfilesEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V130PostPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5getIdEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V150PostGameSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_11UserProfile2V112BasicProfileEEEEppEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V150PostPlayerSessionsSessionIdInvitationsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriends8setlimitEi() { - return 0; +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_14SessionManager2V152PostPlayerSessionsSessionIdMemberPlayersResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5abortEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_17TitleCloudStorage2V122UploadDataResponseBodyEEENS4_INS6_7DataApi25UploadDataResponseHeadersEEEE18getResponseHeadersERSB_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEC1Ev(IntrusivePtr* self) { - *self = {}; +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_15DefaultResponseENS2_12IntrusivePtrINS2_18ResponseHeaderBaseEEEE18getResponseHeadersERS7_() { + return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V112BasicProfile23setIsOfficiallyVerifiedERKb() { - return 0; + +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_12Leaderboards2V15EntryEEEE4sizeEv(const void* self) { + return HostVectorSize(self, __func__); } -int APS5_VABI _ZNK3sce2Np9CppWebApi11UserProfile2V113BasicPresence17onlineStatusIsSetEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_13InGameCatalog2V57ProductEEEE4sizeEv(const void* self) { + return HostVectorSize(self, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V115BasicProfileApi28ParameterToGetPublicProfilesD1Ev() { - return 0; +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V118GameSessionForReadEEEE4sizeEv(const void* self) { + return HostVectorSize(self, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V115BasicProfileApi28ParameterToGetPublicProfilesC1Ev() { - return 0; +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V120PlayerSessionForReadEEEE4sizeEv(const void* self) { + return HostVectorSize(self, __func__); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEaSERKS7_(IntrusivePtr* self, const IntrusivePtr* source) { - ReleaseIntrusivePtr(self, 0x00, __func__); - CopyIntrusivePtr(self, source, 0x00); +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V113RequestMemberEEEE4sizeEv(const void* self) { + return HostVectorSize(self, __func__); } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5getIdEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V116RequestMatchTeamEEEE4sizeEv(const void* self) { + return HostVectorSize(self, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V113BasicPresenceD1Ev() { - return 0; +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V118RequestMatchPlayerEEEE4sizeEv(const void* self) { + return HostVectorSize(self, __func__); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self) { - (void)self; - return 0; +std::size_t APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_7Matches2V120RequestTeamStatisticEEEE4sizeEv(const void* self) { + return HostVectorSize(self, __func__); } -void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEED1Ev(IntrusivePtr* self) { - ReleaseIntrusivePtr(self, 0x00, __func__); + +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6StringC1EPNS2_10LibContextE(CommonString* self, void* libContext) { + self->referenceCount = 0; + self->buffer = nullptr; + self->bufferSize = 0; + self->libContext = libContext; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common13ConstIteratorINS2_12IntrusivePtrINS1_11UserProfile2V112BasicProfileEEEED2Ev(void* self) { - (void)self; - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6StringD1Ev(CommonString* self) { + std::free(self->buffer); + self->buffer = nullptr; + self->bufferSize = 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5abortEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +const char* APS5_VABI _ZNK3sce2Np9CppWebApi6Common6String5c_strEv(const CommonString* self) { + return self->buffer != nullptr ? self->buffer : ""; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsers8setlimitEi() { +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 _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5getIdEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V126RequestPlayerSessionPlayerEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); } -void* APS5_VABI _ZNK3sce2Np9CppWebApi6Common12IntrusivePtrINS1_11UserProfile2V112BasicProfileEEptEv(const IntrusivePtr* self) { - return self->object; +int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V126RequestPlayerSessionPlayerEEEE8pushBackERKS8_(IntrusivePtr* self, const void* element) { + return VectorPushBackIntrusivePtr(self, static_cast(element)); } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsers9setoffsetEi() { - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS2_6StringEEEEC1ERS7_(IntrusivePtr* self, const IntrusivePtr* source) { + CopyIntrusivePtr(self, source, 0x30); } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11UserProfile2V112BasicProfileEEEE3endEv() { - NotImplemented_nid_no_patch(__func__); - 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; } -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V113BasicPresence15setOnlineStatusERKNS3_12OnlineStatusE() { - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_14SessionManager2V126RequestPlayerSessionPlayerEEEEC1EPNS2_10LibContextE(IntrusivePtr* self, void* libContext) { + self->object = nullptr; + self->deleter = nullptr; + self->libContext = libContext; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetPublicProfilesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE5abortEv() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorINS2_6StringEEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common8IteratorINS2_12IntrusivePtrINS1_11UserProfile2V112BasicProfileEEEEdeEv() { +int APS5_VABI _ZNK3sce2Np9CppWebApi6Common6VectorINS2_12IntrusivePtrINS1_11UserProfile2V113BasicPresenceEEEE4sizeEv() { NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI _ZN3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEENS4_INS2_18ResponseHeaderBaseEEEEaSERKSB_() { - NotImplemented_nid_no_patch(__func__); - return 0; +void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS2_6VectorImEEED1Ev(IntrusivePtr* self) { + ReleaseIntrusivePtr(self, 0x30, __func__); } -int APS5_VABI _ZNK3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEE11getResponseERS8_() { - return SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; +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 5554b1cb0a58..c5844039e4ad 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,14 +459,49 @@ 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(); -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriends9terminateEv(); +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriends10initializeEPNS1_6Common10LibContextEPKc(void* self, const std::uint64_t* context, const char* accountId); +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriends9terminateEv(void* self); int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriendsC1Ev(void* self); int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriendsD1Ev(void* self); int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi17getBasicPresencesEiRKNS4_28ParameterToGetBasicPresencesERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_25GetBasicPresencesResponseEEENSA_INS8_18ResponseHeaderBaseEEEEE(); -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi28ParameterToGetBasicPresences10initializeEPNS1_6Common10LibContextEPKc(); -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi28ParameterToGetBasicPresences9terminateEv(); +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi28ParameterToGetBasicPresences10initializeEPNS1_6Common10LibContextEPKc(void* self, const std::uint64_t* context, const char* accountIds); +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi28ParameterToGetBasicPresences9terminateEv(void* self); int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi28ParameterToGetBasicPresencesC1Ev(void* self); int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi28ParameterToGetBasicPresencesD1Ev(void* self); int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V118GetFriendsResponse10getFriendsEv(); @@ -412,8 +530,8 @@ int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi29Parame int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi39ParameterToSendPlayerSessionInvitationsD1Ev(); int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V120PlayerSessionForRead14getCustomData1Ev(); int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi16getBlockingUsersEiRKNS4_27ParameterToGetBlockingUsersERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_24GetBlockingUsersResponseEEENSA_INS8_18ResponseHeaderBaseEEEEE(); -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsers10initializeEPNS1_6Common10LibContextE(); -int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsers9terminateEv(); +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsers10initializeEPNS1_6Common10LibContextE(void* self, const std::uint64_t* context); +int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsers9terminateEv(void* self); int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsersC1Ev(void* self); int APS5_VABI _ZN3sce2Np9CppWebApi14SessionManager2V117PlayerSessionsApi31ParameterToCreatePlayerSessions9terminateEv(void* self); int APS5_VABI _ZNK3sce2Np9CppWebApi14SessionManager2V120PlayerSessionForRead16customData1IsSetEv(); @@ -451,14 +569,14 @@ void APS5_VABI _ZN3sce2Np9CppWebApi6Common12IntrusivePtrINS1_14SessionManager2V1 int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_14SessionManager2V129GetPlayerSessionsResponseBodyEEENS4_INS2_18ResponseHeaderBaseEEEEC1Ev(void* self); int APS5_VABI _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsersD1Ev(void* self); int APS5_VABI _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi15filterProfanityEiRKNS4_26ParameterToFilterProfanityERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_23FilterProfanityResponseEEENSA_INS8_18ResponseHeaderBaseEEEEE(); -int APS5_VABI _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi26ParameterToFilterProfanity10initializeEPNS1_6Common10LibContextEPKcSA_NS6_12IntrusivePtrINS3_19WebApiFilterRequestEEE(); -int APS5_VABI _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi26ParameterToFilterProfanity9terminateEv(); +int APS5_VABI _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi26ParameterToFilterProfanity10initializeEPNS1_6Common10LibContextEPKcSA_NS6_12IntrusivePtrINS3_19WebApiFilterRequestEEE(void* self, const std::uint64_t* context, const char* locale, const char* serviceLabel, const IntrusivePtr* body); +int APS5_VABI _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi26ParameterToFilterProfanity9terminateEv(void* self); int APS5_VABI _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi26ParameterToFilterProfanityC1Ev(void* self); int APS5_VABI _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi26ParameterToFilterProfanityD1Ev(void* self); int APS5_VABI _ZN3sce2Np9CppWebApi15ProfanityFilter2V226WebApiFilterRequestFactory6createEPNS1_6Common10LibContextEPKcPNS5_12IntrusivePtrINS3_19WebApiFilterRequestEEE(); int APS5_VABI _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi33getCommunicationRestrictionStatusEiRKNS4_44ParameterToGetCommunicationRestrictionStatusERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_38CommunicationRestrictionStatusResponseEEENSA_INS8_18ResponseHeaderBaseEEEEE(); -int APS5_VABI _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi44ParameterToGetCommunicationRestrictionStatus10initializeEPNS1_6Common10LibContextEm(); -int APS5_VABI _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi44ParameterToGetCommunicationRestrictionStatus9terminateEv(); +int APS5_VABI _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi44ParameterToGetCommunicationRestrictionStatus10initializeEPNS1_6Common10LibContextEm(void* self, const std::uint64_t* context, std::uint64_t accountId); +int APS5_VABI _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi44ParameterToGetCommunicationRestrictionStatus9terminateEv(void* self); int APS5_VABI _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi44ParameterToGetCommunicationRestrictionStatusC1Ev(void* self); int APS5_VABI _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi44ParameterToGetCommunicationRestrictionStatusD1Ev(void* self); int APS5_VABI _ZN3sce2Np9CppWebApi6Common11TransactionINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEE21setOnFinishedCallbackEPFvliS8_PvEPFvliSC_ESC_(); @@ -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 44530aadcd72..3df65ec49d29 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 { @@ -126,12 +127,12 @@ int APS5_VABI sceNpEntitlementAccessInitialize(const NpEntitlementAccessInitPara } int APS5_VABI sceNpEntitlementAccessAbortRequest(std::int64_t requestId) { - NotImplemented_nid_no_patch(__func__); + (void)requestId; return 0; } int APS5_VABI sceNpEntitlementAccessDeleteRequest(std::int64_t requestId) { - NotImplemented_nid_no_patch(__func__); + (void)requestId; return 0; } @@ -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 d68d483b874c..f65a2a2cb33c 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 219499b30b25..c235b1f317fd 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 aee6fb1edfe3..776d707121d2 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 046eafb72766..3a3e6681d0f9 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 000000000000..4ce154f1ebee --- /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 5fa5fa4390e8..c4c5bf6dc607 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 2a4635c7c858..43325c714598 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 000000000000..78e735c3a49d --- /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 83c567edd020..2a092bdaa093 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/libSceNpPartnerSubscription/Export.cpp b/core/libs/prx/libSceNpPartnerSubscription/Export.cpp new file mode 100644 index 000000000000..10d26192d314 --- /dev/null +++ b/core/libs/prx/libSceNpPartnerSubscription/Export.cpp @@ -0,0 +1,14 @@ +#include "prx/libSceNpPartnerSubscription/include/InventoryExports.hpp" +#include "prx/libc/include/General.hpp" + +extern "C" { + +int APS5_VABI sceNpPartnerSubscriptionInitialize() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpPartnerSubscriptionTerminate() { + NotImplemented_nid_no_patch(__func__); +} + +} diff --git a/core/libs/prx/libSceNpPartnerSubscription/include/InventoryExports.hpp b/core/libs/prx/libSceNpPartnerSubscription/include/InventoryExports.hpp new file mode 100644 index 000000000000..ab3d0f32794f --- /dev/null +++ b/core/libs/prx/libSceNpPartnerSubscription/include/InventoryExports.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceNpPartnerSubscriptionInitialize(); +int APS5_VABI sceNpPartnerSubscriptionTerminate(); + +} diff --git a/core/libs/prx/libSceNpPartnerSubscription/libSceNpPartnerSubscription.hpp b/core/libs/prx/libSceNpPartnerSubscription/libSceNpPartnerSubscription.hpp new file mode 100644 index 000000000000..824175334dd2 --- /dev/null +++ b/core/libs/prx/libSceNpPartnerSubscription/libSceNpPartnerSubscription.hpp @@ -0,0 +1,3 @@ +#pragma once + +#include "prx/libSceNpPartnerSubscription/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceNpParty/Export.cpp b/core/libs/prx/libSceNpParty/Export.cpp index 971b89447038..0f2dcb53c9c8 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 64065918085b..d0c19a46140b 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 3ece49618f03..0cb54f9a1ae8 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/libSceNpRemotePlaySessionSignaling/Export.cpp b/core/libs/prx/libSceNpRemotePlaySessionSignaling/Export.cpp index a0f12e3e85bd..13e645093700 100644 --- a/core/libs/prx/libSceNpRemotePlaySessionSignaling/Export.cpp +++ b/core/libs/prx/libSceNpRemotePlaySessionSignaling/Export.cpp @@ -56,4 +56,20 @@ int APS5_VABI sceNpRemotePlaySessionSignalingTerminate() { return 0; } +int APS5_VABI sceNpRemotePlaySessionSignalingAbortConnection() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpRemotePlaySessionSignalingEstablishConnection() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpRemotePlaySessionSignalingManualUdpCreateJoinSession() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpRemotePlaySessionSignalingManualUdpJoinSession() { + NotImplemented_nid_no_patch(__func__); +} + } diff --git a/core/libs/prx/libSceNpRemotePlaySessionSignaling/include/Api.hpp b/core/libs/prx/libSceNpRemotePlaySessionSignaling/include/Api.hpp index 9aeae0ac11f3..58219e5a820e 100644 --- a/core/libs/prx/libSceNpRemotePlaySessionSignaling/include/Api.hpp +++ b/core/libs/prx/libSceNpRemotePlaySessionSignaling/include/Api.hpp @@ -14,5 +14,9 @@ int APS5_VABI sceNpRemotePlaySessionSignalingJoinSession(); int APS5_VABI sceNpRemotePlaySessionSignalingLeaveSession(); int APS5_VABI sceNpRemotePlaySessionSignalingSetCustomProperty(); int APS5_VABI sceNpRemotePlaySessionSignalingTerminate(); +int APS5_VABI sceNpRemotePlaySessionSignalingAbortConnection(); +int APS5_VABI sceNpRemotePlaySessionSignalingEstablishConnection(); +int APS5_VABI sceNpRemotePlaySessionSignalingManualUdpCreateJoinSession(); +int APS5_VABI sceNpRemotePlaySessionSignalingManualUdpJoinSession(); } diff --git a/core/libs/prx/libSceNpSessionSignaling/Export.cpp b/core/libs/prx/libSceNpSessionSignaling/Export.cpp index 1123e5533378..a32523596862 100644 --- a/core/libs/prx/libSceNpSessionSignaling/Export.cpp +++ b/core/libs/prx/libSceNpSessionSignaling/Export.cpp @@ -276,4 +276,24 @@ int APS5_VABI sceNpSessionSignalingSetCustomProperty() { return 0; } +int APS5_VABI sceNpSessionSignalingManualUdpAbortConnection() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpSessionSignalingManualUdpCreateJoin() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpSessionSignalingManualUdpEstablishConnection() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpSessionSignalingManualUdpJoin() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpSessionSignalingRegisterInternalCallback() { + NotImplemented_nid_no_patch(__func__); +} + } diff --git a/core/libs/prx/libSceNpSessionSignaling/include/Api.hpp b/core/libs/prx/libSceNpSessionSignaling/include/Api.hpp index 948b31325348..ad73c1a5953b 100644 --- a/core/libs/prx/libSceNpSessionSignaling/include/Api.hpp +++ b/core/libs/prx/libSceNpSessionSignaling/include/Api.hpp @@ -110,5 +110,10 @@ int APS5_VABI sceNpSessionSignalingGetGroupFromPeerAddress(); int APS5_VABI sceNpSessionSignalingInitializeWithPort(); int APS5_VABI sceNpSessionSignalingJoinActivate(); int APS5_VABI sceNpSessionSignalingSetCustomProperty(); +int APS5_VABI sceNpSessionSignalingManualUdpAbortConnection(); +int APS5_VABI sceNpSessionSignalingManualUdpCreateJoin(); +int APS5_VABI sceNpSessionSignalingManualUdpEstablishConnection(); +int APS5_VABI sceNpSessionSignalingManualUdpJoin(); +int APS5_VABI sceNpSessionSignalingRegisterInternalCallback(); } diff --git a/core/libs/prx/libSceNpSessionSignalingCrossplay/Export.cpp b/core/libs/prx/libSceNpSessionSignalingCrossplay/Export.cpp new file mode 100644 index 000000000000..37e5c0bc6af9 --- /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 000000000000..c1cd2e574d05 --- /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 000000000000..57a34744553c --- /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 5445d0ddddc0..b7cfa38eee5f 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 ebad76b2f260..c5010ded302a 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/libSceNpSpeechToText/Export.cpp b/core/libs/prx/libSceNpSpeechToText/Export.cpp index d81f4a5e32c4..e0c5b9fb2a38 100644 --- a/core/libs/prx/libSceNpSpeechToText/Export.cpp +++ b/core/libs/prx/libSceNpSpeechToText/Export.cpp @@ -1,3 +1,4 @@ +#include "prx/libSceNpSpeechToText/include/InventoryExports.hpp" #include #include #include "SceTypes.hpp" @@ -8,3 +9,35 @@ extern "C" { APS5_DUMMY_FUN } + +extern "C" { + +int APS5_VABI sceNpSpeechToTextCreateContext() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpSpeechToTextDestroyContext() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpSpeechToTextGetEvent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpSpeechToTextInitialize() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpSpeechToTextStart() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpSpeechToTextStop() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpSpeechToTextTerminate() { + NotImplemented_nid_no_patch(__func__); +} + +} diff --git a/core/libs/prx/libSceNpSpeechToText/include/InventoryExports.hpp b/core/libs/prx/libSceNpSpeechToText/include/InventoryExports.hpp new file mode 100644 index 000000000000..2f6f1e9cd223 --- /dev/null +++ b/core/libs/prx/libSceNpSpeechToText/include/InventoryExports.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceNpSpeechToTextCreateContext(); +int APS5_VABI sceNpSpeechToTextDestroyContext(); +int APS5_VABI sceNpSpeechToTextGetEvent(); +int APS5_VABI sceNpSpeechToTextInitialize(); +int APS5_VABI sceNpSpeechToTextStart(); +int APS5_VABI sceNpSpeechToTextStop(); +int APS5_VABI sceNpSpeechToTextTerminate(); + +} diff --git a/core/libs/prx/libSceNpSpeechToText/libSceNpSpeechToText.hpp b/core/libs/prx/libSceNpSpeechToText/libSceNpSpeechToText.hpp index 6f70f09beec2..a5ad0be86004 100644 --- a/core/libs/prx/libSceNpSpeechToText/libSceNpSpeechToText.hpp +++ b/core/libs/prx/libSceNpSpeechToText/libSceNpSpeechToText.hpp @@ -1 +1,2 @@ #pragma once +#include "prx/libSceNpSpeechToText/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceNpTcs/Export.cpp b/core/libs/prx/libSceNpTcs/Export.cpp index f496f8ffbf60..78dee5e9ae03 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 000000000000..0238e33d455f --- /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 cf84369ec2f6..6d7edef15fdd 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/libSceNpTextToSpeech/Export.cpp b/core/libs/prx/libSceNpTextToSpeech/Export.cpp index d81f4a5e32c4..97c360beba77 100644 --- a/core/libs/prx/libSceNpTextToSpeech/Export.cpp +++ b/core/libs/prx/libSceNpTextToSpeech/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceNpTextToSpeech/include/InventoryExports.hpp" #include #include #include "SceTypes.hpp" @@ -8,3 +10,57 @@ extern "C" { APS5_DUMMY_FUN } + +extern "C" { + +int APS5_VABI sceNpTextToSpeechCreateContext() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpTextToSpeechDestroyContext() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpTextToSpeechGetEvent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpTextToSpeechInitialize() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpTextToSpeechTerminate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI libSceNpTextToSpeechUnknown__minus_wGjkwcjXWs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-wGjkwcjXWs", libSceNpTextToSpeechUnknown__minus_wGjkwcjXWs_nid_no_patch); + +int APS5_VABI libSceNpTextToSpeechUnknown_APYz0RAIugo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("APYz0RAIugo", libSceNpTextToSpeechUnknown_APYz0RAIugo_nid_no_patch); + +int APS5_VABI libSceNpTextToSpeechUnknown_Fp7i5mx3JWM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Fp7i5mx3JWM", libSceNpTextToSpeechUnknown_Fp7i5mx3JWM_nid_no_patch); + +int APS5_VABI libSceNpTextToSpeechUnknown_i3MidGD_minus_Zfk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("i3MidGD-Zfk", libSceNpTextToSpeechUnknown_i3MidGD_minus_Zfk_nid_no_patch); + +int APS5_VABI libSceNpTextToSpeechUnknown_oIMRm6q4pUM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oIMRm6q4pUM", libSceNpTextToSpeechUnknown_oIMRm6q4pUM_nid_no_patch); + +int APS5_VABI libSceNpTextToSpeechUnknown_rIXr2WILhUE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rIXr2WILhUE", libSceNpTextToSpeechUnknown_rIXr2WILhUE_nid_no_patch); + +} diff --git a/core/libs/prx/libSceNpTextToSpeech/include/InventoryExports.hpp b/core/libs/prx/libSceNpTextToSpeech/include/InventoryExports.hpp new file mode 100644 index 000000000000..31e2c1a75b1f --- /dev/null +++ b/core/libs/prx/libSceNpTextToSpeech/include/InventoryExports.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceNpTextToSpeechCreateContext(); +int APS5_VABI sceNpTextToSpeechDestroyContext(); +int APS5_VABI sceNpTextToSpeechGetEvent(); +int APS5_VABI sceNpTextToSpeechInitialize(); +int APS5_VABI sceNpTextToSpeechTerminate(); +int APS5_VABI libSceNpTextToSpeechUnknown__minus_wGjkwcjXWs_nid_no_patch(); +int APS5_VABI libSceNpTextToSpeechUnknown_APYz0RAIugo_nid_no_patch(); +int APS5_VABI libSceNpTextToSpeechUnknown_Fp7i5mx3JWM_nid_no_patch(); +int APS5_VABI libSceNpTextToSpeechUnknown_i3MidGD_minus_Zfk_nid_no_patch(); +int APS5_VABI libSceNpTextToSpeechUnknown_oIMRm6q4pUM_nid_no_patch(); +int APS5_VABI libSceNpTextToSpeechUnknown_rIXr2WILhUE_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceNpTextToSpeech/libSceNpTextToSpeech.hpp b/core/libs/prx/libSceNpTextToSpeech/libSceNpTextToSpeech.hpp index 6f70f09beec2..facc6e75d292 100644 --- a/core/libs/prx/libSceNpTextToSpeech/libSceNpTextToSpeech.hpp +++ b/core/libs/prx/libSceNpTextToSpeech/libSceNpTextToSpeech.hpp @@ -1 +1,2 @@ #pragma once +#include "prx/libSceNpTextToSpeech/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceNpTrophy/CMakeLists.txt b/core/libs/prx/libSceNpTrophy/CMakeLists.txt index 77627ad02615..279849ac16a1 100644 --- a/core/libs/prx/libSceNpTrophy/CMakeLists.txt +++ b/core/libs/prx/libSceNpTrophy/CMakeLists.txt @@ -21,3 +21,16 @@ if(BUILD_TESTING) "PATH=path_list_prepend:$") endif() endif() + +if(BUILD_TESTING) + add_test_executable(guest_np_trophy_system_debug_tests ${LIBS_INCLUDE_DIR}/tests/GuestNpTrophySystemDebug.cpp) + target_include_directories(guest_np_trophy_system_debug_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_np_trophy_system_debug_tests PRIVATE libSceNpTrophy) + configure_windows_unwind(guest_np_trophy_system_debug_tests) + add_test(NAME guest_np_trophy_system_debug COMMAND guest_np_trophy_system_debug_tests) + set_tests_properties(guest_np_trophy_system_debug PROPERTIES TIMEOUT 20) + if(WIN32) + set_tests_properties(guest_np_trophy_system_debug PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceNpTrophy/Export.cpp b/core/libs/prx/libSceNpTrophy/Export.cpp index bf962536fef1..3322573f4d6b 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 @@ -558,8 +560,7 @@ int APS5_VABI sceNpTrophySystemCreateHandle(void) { } int APS5_VABI sceNpTrophySystemDbgCtl(void) { - NotImplemented_nid_no_patch(__func__); - return 0; + return static_cast(0x80551692); } int APS5_VABI sceNpTrophySystemDebugLockTrophy(void) { @@ -588,13 +589,11 @@ int APS5_VABI sceNpTrophySystemDestroyTrophyConfig(void) { } int APS5_VABI sceNpTrophySystemGetDbgParam(void) { - NotImplemented_nid_no_patch(__func__); - return 0; + return static_cast(0x80551692); } int APS5_VABI sceNpTrophySystemGetDbgParamInt(void) { - NotImplemented_nid_no_patch(__func__); - return 0; + return static_cast(0x80551692); } int APS5_VABI sceNpTrophySystemGetGroupIcon(void) { @@ -718,13 +717,11 @@ int APS5_VABI sceNpTrophySystemRemoveUserData(void) { } int APS5_VABI sceNpTrophySystemSetDbgParam(void) { - NotImplemented_nid_no_patch(__func__); - return 0; + return static_cast(0x80551692); } int APS5_VABI sceNpTrophySystemSetDbgParamInt(void) { - NotImplemented_nid_no_patch(__func__); - return 0; + return static_cast(0x80551692); } int APS5_VABI sceNpTrophySystemUnregisterTitleSyncedCallback(void) { @@ -787,4 +784,66 @@ int APS5_VABI sceNpTrophySystemWrapRemoveUserData(void) { return 0; } +int APS5_VABI sceNpTrophySystemWrapGetGroupData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpTrophySystemWrapGetGroupDataArray() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpTrophySystemWrapGetGroupDetailsArray() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpTrophySystemWrapGetTitleData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpTrophySystemWrapGetTrophyData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpTrophySystemWrapGetTrophyDataArray() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpTrophySystemWrapGetTrophyDetails() { + NotImplemented_nid_no_patch(__func__); +} + +} + +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/Api.hpp b/core/libs/prx/libSceNpTrophy/include/Api.hpp index adb66083d367..698d7d98dbce 100644 --- a/core/libs/prx/libSceNpTrophy/include/Api.hpp +++ b/core/libs/prx/libSceNpTrophy/include/Api.hpp @@ -173,5 +173,12 @@ int APS5_VABI sceNpTrophySystemWrapGetTrophyTitleIdsByNpTitleId(); int APS5_VABI sceNpTrophySystemWrapRemoveAll(); int APS5_VABI sceNpTrophySystemWrapRemoveTitleData(); int APS5_VABI sceNpTrophySystemWrapRemoveUserData(); +int APS5_VABI sceNpTrophySystemWrapGetGroupData(); +int APS5_VABI sceNpTrophySystemWrapGetGroupDataArray(); +int APS5_VABI sceNpTrophySystemWrapGetGroupDetailsArray(); +int APS5_VABI sceNpTrophySystemWrapGetTitleData(); +int APS5_VABI sceNpTrophySystemWrapGetTrophyData(); +int APS5_VABI sceNpTrophySystemWrapGetTrophyDataArray(); +int APS5_VABI sceNpTrophySystemWrapGetTrophyDetails(); } diff --git a/core/libs/prx/libSceNpTrophy/include/InventoryExports.hpp b/core/libs/prx/libSceNpTrophy/include/InventoryExports.hpp new file mode 100644 index 000000000000..ad8cbd329605 --- /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 f808efbd11d5..154e3bf20dbe 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 31a83cfca0c1..4958ac0ad7be 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 000000000000..e976ba1862e1 --- /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 0a98172b4b3b..65712901d79c 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 5a70852cc04e..67651be3daf9 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 fcd25e70839b..d0a0d22a422d 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/libSceNpUniversalDataSystem/include/UdsEvent.hpp b/core/libs/prx/libSceNpUniversalDataSystem/include/UdsEvent.hpp index 35c819682468..ab014e8545f5 100644 --- a/core/libs/prx/libSceNpUniversalDataSystem/include/UdsEvent.hpp +++ b/core/libs/prx/libSceNpUniversalDataSystem/include/UdsEvent.hpp @@ -1,6 +1,7 @@ #ifndef CORE_LIBS_PRX_LIBSCENPUNIVERSALDATASYSTEM_INCLUDE_UDSEVENT_HPP #define CORE_LIBS_PRX_LIBSCENPUNIVERSALDATASYSTEM_INCLUDE_UDSEVENT_HPP +#include #include #include #include @@ -48,6 +49,8 @@ namespace Uds { inline constexpr std::string_view UnlockTrophyEvent = "_UnlockTrophy"; inline constexpr std::string_view UpdateTrophyProgressEvent = "_UpdateTrophyProgress"; inline constexpr std::string_view TrophyIdProperty = "_trophy_id"; +inline constexpr std::string_view EventNameKey = "eventName"; +inline constexpr std::string_view PropertiesKey = "properties"; enum class TrophyEventKind { None, Unlock, Progress, Malformed }; @@ -61,6 +64,8 @@ TrophyEvent RecognizeTrophyEvent(const NpUniversalDataSystemEvent& event); std::string Describe(const Value& value); std::string Describe(const NpUniversalDataSystemEventPropertyObject& object); std::string Describe(const NpUniversalDataSystemEvent& event); +std::size_t MessagePackSize(const NpUniversalDataSystemEvent& event); +std::string DebugString(const NpUniversalDataSystemEvent& event); NpTrophy2Event StatEvent(const NpUniversalDataSystemEvent& event); } diff --git a/core/libs/prx/libSceNpUniversalDataSystem/src/Event.cpp b/core/libs/prx/libSceNpUniversalDataSystem/src/Event.cpp index 12bcbd69c4f5..7238f8759018 100644 --- a/core/libs/prx/libSceNpUniversalDataSystem/src/Event.cpp +++ b/core/libs/prx/libSceNpUniversalDataSystem/src/Event.cpp @@ -1,4 +1,5 @@ #include "prx/libSceNpUniversalDataSystem/include/Api.hpp" +#include #include #include #include @@ -53,9 +54,8 @@ int APS5_VABI sceNpUniversalDataSystemCreateEvent( NpUniversalDataSystemEvent** new_event, NpUniversalDataSystemEventPropertyObject** prop_ptr) { - if (event_name == nullptr || new_event == nullptr) { - APS5_INVALID_ARG_EX; - } + if (event_name == nullptr || event_name[0] == '\0') return SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_INVALID_EVENT_NAME; + if (new_event == nullptr) return SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_INVALID_ARGUMENT; auto event = std::make_unique(); event->name = event_name; if (prop != nullptr) event->properties = prop->Clone(); @@ -84,10 +84,9 @@ int APS5_VABI sceNpUniversalDataSystemPostEvent(int context, int handle, const v } int APS5_VABI sceNpUniversalDataSystemEventEstimateSize(const NpUniversalDataSystemEvent* event, size_t* size) { - if (event == nullptr || size == nullptr) { - APS5_INVALID_ARG_EX; - } - *size = NP_UNIVERSAL_DATA_SYSTEM_EMPTY_EVENT_SIZE; + if (event == nullptr) return SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_EVENT; + if (size == nullptr) return SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_INVALID_ARGUMENT; + *size = Uds::MessagePackSize(*event); return SCE_NP_UNIVERSAL_DATA_SYSTEM_OK; } @@ -97,16 +96,18 @@ int APS5_VABI sceNpUniversalDataSystemEventToString( size_t buf_size, size_t* string_size) { - if (event == nullptr) { - APS5_INVALID_ARG_EX; - } - const size_t json_len = std::strlen(NP_UNIVERSAL_DATA_SYSTEM_EMPTY_JSON) + 1; - if (string_size != nullptr) { - *string_size = json_len; + if (event == nullptr) return SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_EVENT; + if (buf == nullptr) { + if (string_size == nullptr) return SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_INVALID_ARGUMENT; + buf_size = 0; } - if (buf != nullptr && buf_size > 0) { - std::snprintf(buf, buf_size, "%s", NP_UNIVERSAL_DATA_SYSTEM_EMPTY_JSON); + const std::string text = Uds::DebugString(*event); + if (buf_size != 0) { + const size_t copied = std::min(text.size(), buf_size - 1); + std::memcpy(buf, text.data(), copied); + buf[copied] = '\0'; } + if (string_size != nullptr) *string_size = text.size(); return SCE_NP_UNIVERSAL_DATA_SYSTEM_OK; } diff --git a/core/libs/prx/libSceNpUniversalDataSystem/src/EventPropertyArray.cpp b/core/libs/prx/libSceNpUniversalDataSystem/src/EventPropertyArray.cpp index c7552e6a4b16..10dc791bfa89 100644 --- a/core/libs/prx/libSceNpUniversalDataSystem/src/EventPropertyArray.cpp +++ b/core/libs/prx/libSceNpUniversalDataSystem/src/EventPropertyArray.cpp @@ -20,9 +20,7 @@ Uds::Owned& arrays() { extern "C" { int APS5_VABI sceNpUniversalDataSystemCreateEventPropertyArray(NpUniversalDataSystemEventPropertyArray** new_array) { - if (new_array == nullptr) { - APS5_INVALID_ARG_EX; - } + if (new_array == nullptr) return SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_INVALID_ARGUMENT; *new_array = arrays().Adopt(std::make_unique()); return SCE_NP_UNIVERSAL_DATA_SYSTEM_OK; } @@ -35,9 +33,8 @@ int APS5_VABI sceNpUniversalDataSystemDestroyEventPropertyArray(NpUniversalDataS int APS5_VABI sceNpUniversalDataSystemEventPropertyArraySetString( NpUniversalDataSystemEventPropertyArray* array, const char* value) { - if (array == nullptr || value == nullptr) { - APS5_INVALID_ARG_EX; - } + if (array == nullptr) return SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_ARRAY; + if (value == nullptr) return SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_VALUE; array->Add(std::string(value)); return SCE_NP_UNIVERSAL_DATA_SYSTEM_OK; } @@ -45,9 +42,7 @@ int APS5_VABI sceNpUniversalDataSystemEventPropertyArraySetString( int APS5_VABI sceNpUniversalDataSystemEventPropertyArraySetInt32( NpUniversalDataSystemEventPropertyArray* array, int32_t value) { - if (array == nullptr) { - APS5_INVALID_ARG_EX; - } + if (array == nullptr) return SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_ARRAY; array->Add(value); return SCE_NP_UNIVERSAL_DATA_SYSTEM_OK; } @@ -55,9 +50,7 @@ int APS5_VABI sceNpUniversalDataSystemEventPropertyArraySetInt32( int APS5_VABI sceNpUniversalDataSystemEventPropertyArraySetUInt32( NpUniversalDataSystemEventPropertyArray* array, uint32_t value) { - if (array == nullptr) { - APS5_INVALID_ARG_EX; - } + if (array == nullptr) return SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_ARRAY; array->Add(value); return SCE_NP_UNIVERSAL_DATA_SYSTEM_OK; } @@ -65,9 +58,7 @@ int APS5_VABI sceNpUniversalDataSystemEventPropertyArraySetUInt32( int APS5_VABI sceNpUniversalDataSystemEventPropertyArraySetInt64( NpUniversalDataSystemEventPropertyArray* array, int64_t value) { - if (array == nullptr) { - APS5_INVALID_ARG_EX; - } + if (array == nullptr) return SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_ARRAY; array->Add(value); return SCE_NP_UNIVERSAL_DATA_SYSTEM_OK; } @@ -75,9 +66,7 @@ int APS5_VABI sceNpUniversalDataSystemEventPropertyArraySetInt64( int APS5_VABI sceNpUniversalDataSystemEventPropertyArraySetUInt64( NpUniversalDataSystemEventPropertyArray* array, uint64_t value) { - if (array == nullptr) { - APS5_INVALID_ARG_EX; - } + if (array == nullptr) return SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_ARRAY; array->Add(value); return SCE_NP_UNIVERSAL_DATA_SYSTEM_OK; } @@ -85,9 +74,7 @@ int APS5_VABI sceNpUniversalDataSystemEventPropertyArraySetUInt64( int APS5_VABI sceNpUniversalDataSystemEventPropertyArraySetFloat32( NpUniversalDataSystemEventPropertyArray* array, float value) { - if (array == nullptr) { - APS5_INVALID_ARG_EX; - } + if (array == nullptr) return SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_ARRAY; array->Add(value); return SCE_NP_UNIVERSAL_DATA_SYSTEM_OK; } @@ -95,9 +82,7 @@ int APS5_VABI sceNpUniversalDataSystemEventPropertyArraySetFloat32( int APS5_VABI sceNpUniversalDataSystemEventPropertyArraySetFloat64( NpUniversalDataSystemEventPropertyArray* array, double value) { - if (array == nullptr) { - APS5_INVALID_ARG_EX; - } + if (array == nullptr) return SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_ARRAY; array->Add(value); return SCE_NP_UNIVERSAL_DATA_SYSTEM_OK; } @@ -105,9 +90,7 @@ NpUniversalDataSystemEventPropertyArray* array, double value) int APS5_VABI sceNpUniversalDataSystemEventPropertyArraySetBool( NpUniversalDataSystemEventPropertyArray* array, bool value) { - if (array == nullptr) { - APS5_INVALID_ARG_EX; - } + if (array == nullptr) return SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_ARRAY; array->Add(value); return SCE_NP_UNIVERSAL_DATA_SYSTEM_OK; } @@ -115,9 +98,8 @@ int APS5_VABI sceNpUniversalDataSystemEventPropertyArraySetBool( int APS5_VABI sceNpUniversalDataSystemEventPropertyArraySetBinary( NpUniversalDataSystemEventPropertyArray* array, const void* value, size_t value_size) { - if (array == nullptr || value == nullptr) { - APS5_INVALID_ARG_EX; - } + if (array == nullptr) return SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_ARRAY; + if (value == nullptr) return SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_VALUE; const auto* bytes = static_cast(value); array->Add(Uds::Binary(bytes, bytes + value_size)); return SCE_NP_UNIVERSAL_DATA_SYSTEM_OK; @@ -128,9 +110,7 @@ int APS5_VABI sceNpUniversalDataSystemEventPropertyArraySetObject( const NpUniversalDataSystemEventPropertyObject* value, NpUniversalDataSystemEventPropertyObject** value_ptr) { - if (array == nullptr) { - APS5_INVALID_ARG_EX; - } + if (array == nullptr) return SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_ARRAY; auto child = std::make_shared(value != nullptr ? value->Clone() : NpUniversalDataSystemEventPropertyObject{}); if (value_ptr != nullptr) { *value_ptr = child.get(); @@ -144,9 +124,7 @@ int APS5_VABI sceNpUniversalDataSystemEventPropertyArraySetArray( const NpUniversalDataSystemEventPropertyArray* value, NpUniversalDataSystemEventPropertyArray** value_ptr) { - if (array == nullptr) { - APS5_INVALID_ARG_EX; - } + if (array == nullptr) return SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_ARRAY; auto child = std::make_shared(value != nullptr ? value->Clone() : NpUniversalDataSystemEventPropertyArray{}); if (value_ptr != nullptr) { *value_ptr = child.get(); diff --git a/core/libs/prx/libSceNpUniversalDataSystem/src/EventPropertyObject.cpp b/core/libs/prx/libSceNpUniversalDataSystem/src/EventPropertyObject.cpp index 20fd5f38e17d..f8527e5d2b67 100644 --- a/core/libs/prx/libSceNpUniversalDataSystem/src/EventPropertyObject.cpp +++ b/core/libs/prx/libSceNpUniversalDataSystem/src/EventPropertyObject.cpp @@ -15,14 +15,18 @@ Uds::Owned& objects() { return registry; } +int checkTarget(const NpUniversalDataSystemEventPropertyObject* object, const char* key) { + if (object == nullptr) return SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_OBJECT; + if (key == nullptr || key[0] == '\0') return SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_INVALID_KEY; + return SCE_NP_UNIVERSAL_DATA_SYSTEM_OK; +} + } extern "C" { int APS5_VABI sceNpUniversalDataSystemCreateEventPropertyObject(NpUniversalDataSystemEventPropertyObject** new_object) { - if (new_object == nullptr) { - APS5_INVALID_ARG_EX; - } + if (new_object == nullptr) return SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_INVALID_ARGUMENT; *new_object = objects().Adopt(std::make_unique()); return SCE_NP_UNIVERSAL_DATA_SYSTEM_OK; } @@ -35,9 +39,8 @@ int APS5_VABI sceNpUniversalDataSystemDestroyEventPropertyObject(NpUniversalData int APS5_VABI sceNpUniversalDataSystemEventPropertyObjectSetString( NpUniversalDataSystemEventPropertyObject* object, const char* key, const char* value) { - if (object == nullptr || key == nullptr || value == nullptr) { - APS5_INVALID_ARG_EX; - } + if (const int error = checkTarget(object, key); error != SCE_NP_UNIVERSAL_DATA_SYSTEM_OK) return error; + if (value == nullptr) return SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_VALUE; object->Set(key, std::string(value)); return SCE_NP_UNIVERSAL_DATA_SYSTEM_OK; } @@ -45,9 +48,7 @@ int APS5_VABI sceNpUniversalDataSystemEventPropertyObjectSetString( int APS5_VABI sceNpUniversalDataSystemEventPropertyObjectSetInt32( NpUniversalDataSystemEventPropertyObject* object, const char* key, int32_t value) { - if (object == nullptr || key == nullptr) { - APS5_INVALID_ARG_EX; - } + if (const int error = checkTarget(object, key); error != SCE_NP_UNIVERSAL_DATA_SYSTEM_OK) return error; object->Set(key, value); return SCE_NP_UNIVERSAL_DATA_SYSTEM_OK; } @@ -55,9 +56,7 @@ int APS5_VABI sceNpUniversalDataSystemEventPropertyObjectSetInt32( int APS5_VABI sceNpUniversalDataSystemEventPropertyObjectSetUInt32( NpUniversalDataSystemEventPropertyObject* object, const char* key, uint32_t value) { - if (object == nullptr || key == nullptr) { - APS5_INVALID_ARG_EX; - } + if (const int error = checkTarget(object, key); error != SCE_NP_UNIVERSAL_DATA_SYSTEM_OK) return error; object->Set(key, value); return SCE_NP_UNIVERSAL_DATA_SYSTEM_OK; } @@ -65,9 +64,7 @@ int APS5_VABI sceNpUniversalDataSystemEventPropertyObjectSetUInt32( int APS5_VABI sceNpUniversalDataSystemEventPropertyObjectSetInt64( NpUniversalDataSystemEventPropertyObject* object, const char* key, int64_t value) { - if (object == nullptr || key == nullptr) { - APS5_INVALID_ARG_EX; - } + if (const int error = checkTarget(object, key); error != SCE_NP_UNIVERSAL_DATA_SYSTEM_OK) return error; object->Set(key, value); return SCE_NP_UNIVERSAL_DATA_SYSTEM_OK; } @@ -75,9 +72,7 @@ int APS5_VABI sceNpUniversalDataSystemEventPropertyObjectSetInt64( int APS5_VABI sceNpUniversalDataSystemEventPropertyObjectSetUInt64( NpUniversalDataSystemEventPropertyObject* object, const char* key, uint64_t value) { - if (object == nullptr || key == nullptr) { - APS5_INVALID_ARG_EX; - } + if (const int error = checkTarget(object, key); error != SCE_NP_UNIVERSAL_DATA_SYSTEM_OK) return error; object->Set(key, value); return SCE_NP_UNIVERSAL_DATA_SYSTEM_OK; } @@ -85,9 +80,7 @@ int APS5_VABI sceNpUniversalDataSystemEventPropertyObjectSetUInt64( int APS5_VABI sceNpUniversalDataSystemEventPropertyObjectSetFloat32( NpUniversalDataSystemEventPropertyObject* object, const char* key, float value) { - if (object == nullptr || key == nullptr) { - APS5_INVALID_ARG_EX; - } + if (const int error = checkTarget(object, key); error != SCE_NP_UNIVERSAL_DATA_SYSTEM_OK) return error; object->Set(key, value); return SCE_NP_UNIVERSAL_DATA_SYSTEM_OK; } @@ -95,9 +88,7 @@ int APS5_VABI sceNpUniversalDataSystemEventPropertyObjectSetFloat32( int APS5_VABI sceNpUniversalDataSystemEventPropertyObjectSetFloat64( NpUniversalDataSystemEventPropertyObject* object, const char* key, double value) { - if (object == nullptr || key == nullptr) { - APS5_INVALID_ARG_EX; - } + if (const int error = checkTarget(object, key); error != SCE_NP_UNIVERSAL_DATA_SYSTEM_OK) return error; object->Set(key, value); return SCE_NP_UNIVERSAL_DATA_SYSTEM_OK; } @@ -105,9 +96,7 @@ int APS5_VABI sceNpUniversalDataSystemEventPropertyObjectSetFloat64( int APS5_VABI sceNpUniversalDataSystemEventPropertyObjectSetBool( NpUniversalDataSystemEventPropertyObject* object, const char* key, bool value) { - if (object == nullptr || key == nullptr) { - APS5_INVALID_ARG_EX; - } + if (const int error = checkTarget(object, key); error != SCE_NP_UNIVERSAL_DATA_SYSTEM_OK) return error; object->Set(key, value); return SCE_NP_UNIVERSAL_DATA_SYSTEM_OK; } @@ -115,9 +104,8 @@ int APS5_VABI sceNpUniversalDataSystemEventPropertyObjectSetBool( int APS5_VABI sceNpUniversalDataSystemEventPropertyObjectSetBinary( NpUniversalDataSystemEventPropertyObject* object, const char* key, const void* value, size_t value_size) { - if (object == nullptr || key == nullptr || value == nullptr) { - APS5_INVALID_ARG_EX; - } + if (const int error = checkTarget(object, key); error != SCE_NP_UNIVERSAL_DATA_SYSTEM_OK) return error; + if (value == nullptr) return SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_VALUE; const auto* bytes = static_cast(value); object->Set(key, Uds::Binary(bytes, bytes + value_size)); return SCE_NP_UNIVERSAL_DATA_SYSTEM_OK; @@ -129,9 +117,7 @@ int APS5_VABI sceNpUniversalDataSystemEventPropertyObjectSetObject( const NpUniversalDataSystemEventPropertyObject* value, NpUniversalDataSystemEventPropertyObject** value_ptr) { - if (object == nullptr || key == nullptr) { - APS5_INVALID_ARG_EX; - } + if (const int error = checkTarget(object, key); error != SCE_NP_UNIVERSAL_DATA_SYSTEM_OK) return error; auto child = std::make_shared(value != nullptr ? value->Clone() : NpUniversalDataSystemEventPropertyObject{}); if (value_ptr != nullptr) { *value_ptr = child.get(); @@ -146,9 +132,7 @@ int APS5_VABI sceNpUniversalDataSystemEventPropertyObjectSetArray( const NpUniversalDataSystemEventPropertyArray* value, NpUniversalDataSystemEventPropertyArray** value_ptr) { - if (object == nullptr || key == nullptr) { - APS5_INVALID_ARG_EX; - } + if (const int error = checkTarget(object, key); error != SCE_NP_UNIVERSAL_DATA_SYSTEM_OK) return error; auto child = std::make_shared(value != nullptr ? value->Clone() : NpUniversalDataSystemEventPropertyArray{}); if (value_ptr != nullptr) { *value_ptr = child.get(); diff --git a/core/libs/prx/libSceNpUniversalDataSystem/src/NpUniversalDataSystem.hpp b/core/libs/prx/libSceNpUniversalDataSystem/src/NpUniversalDataSystem.hpp index e89083d5bd50..6372f88906f6 100644 --- a/core/libs/prx/libSceNpUniversalDataSystem/src/NpUniversalDataSystem.hpp +++ b/core/libs/prx/libSceNpUniversalDataSystem/src/NpUniversalDataSystem.hpp @@ -14,13 +14,16 @@ static constexpr int SCE_NP_UNIVERSAL_DATA_SYSTEM_OK = 0; static constexpr int SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_INVALID_ARGUMENT = -2141900542; +static constexpr int SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_EVENT = -2141900522; +static constexpr int SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_INVALID_EVENT_NAME = -2141900531; +static constexpr int SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_INVALID_KEY = -2141900524; +static constexpr int SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_VALUE = -2141900523; +static constexpr int SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_OBJECT = -2141900519; +static constexpr int SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_ARRAY = -2141900518; static constexpr int NP_UNIVERSAL_DATA_SYSTEM_CONTEXT_DEFAULT = 1; static constexpr int NP_UNIVERSAL_DATA_SYSTEM_HANDLE_DEFAULT = 1; -static constexpr const char* NP_UNIVERSAL_DATA_SYSTEM_EMPTY_JSON = "{}"; -static constexpr size_t NP_UNIVERSAL_DATA_SYSTEM_EMPTY_EVENT_SIZE = 3; - namespace Uds { template diff --git a/core/libs/prx/libSceNpUniversalDataSystem/src/UdsEvent.cpp b/core/libs/prx/libSceNpUniversalDataSystem/src/UdsEvent.cpp index 94767a7d35d6..823b1a1161dc 100644 --- a/core/libs/prx/libSceNpUniversalDataSystem/src/UdsEvent.cpp +++ b/core/libs/prx/libSceNpUniversalDataSystem/src/UdsEvent.cpp @@ -91,6 +91,126 @@ void appendValue(std::string& out, const Value& value) { }, value); } +std::size_t lengthPrefixed(std::size_t length, std::size_t smallLimit) { + if (length < smallLimit) return (smallLimit == 32 ? 1 : 2) + length; + if (length < 0x100) return 2 + length; + if (length < 0x10000) return 3 + length; + return 5 + length; +} + +std::size_t containerHeader(std::size_t count) { + if (count < 16) return 1; + if (count < 0x10000) return 3; + return 5; +} + +std::size_t packedSize(const Value& value); + +std::size_t packedSize(const NpUniversalDataSystemEventPropertyObject& object) { + std::size_t size = containerHeader(object.properties.size()); + for (const auto& [key, value] : object.properties) size += lengthPrefixed(key.size(), 32) + packedSize(value); + return size; +} + +std::size_t packedSize(const Value& value) { + return std::visit([](const auto& held) -> std::size_t { + using Held = std::decay_t; + if constexpr (std::is_same_v) { + return 1; + } else if constexpr (std::is_same_v || std::is_same_v || std::is_same_v) { + return 5; + } else if constexpr (std::is_same_v || std::is_same_v || std::is_same_v) { + return 9; + } else if constexpr (std::is_same_v) { + return lengthPrefixed(held.size(), 32); + } else if constexpr (std::is_same_v) { + return lengthPrefixed(held.size(), 0x100); + } else if constexpr (std::is_same_v>) { + return packedSize(*held); + } else { + std::size_t size = containerHeader(held->values.size()); + for (const auto& element : held->values) size += packedSize(element); + return size; + } + }, value); +} + +template +void appendTagged(std::string& out, T value, const char* tag) { + char number[40]; + const auto result = std::to_chars(number, number + sizeof(number), value); + if (result.ec != std::errc{}) throw std::runtime_error("event property number formatting failed"); + out.append(number, static_cast(result.ptr - number)); + out += tag; +} + +void appendTaggedReal(std::string& out, double value, const char* tag) { + char number[40]; + const auto result = std::to_chars(number, number + sizeof(number), value, std::chars_format::general, 6); + if (result.ec != std::errc{}) throw std::runtime_error("event property number formatting failed"); + out.append(number, static_cast(result.ptr - number)); + out += tag; +} + +void appendDebug(std::string& out, const Value& value, std::size_t indent); + +void appendDebug(std::string& out, const NpUniversalDataSystemEventPropertyObject& object, std::size_t indent) { + out += "{\n"; + for (const auto& [key, value] : object.properties) { + out.append(indent + 4, ' '); + out += '"'; + out += key; + out += "\": "; + appendDebug(out, value, indent + 4); + out += ",\n"; + } + out.append(indent, ' '); + out += '}'; +} + +void appendDebug(std::string& out, const Value& value, std::size_t indent) { + std::visit([&](const auto& held) { + using Held = std::decay_t; + if constexpr (std::is_same_v) { + out += held ? "true" : "false"; + } else if constexpr (std::is_same_v) { + appendTagged(out, held, " (Int32)"); + } else if constexpr (std::is_same_v) { + appendTagged(out, held, " (UInt32)"); + } else if constexpr (std::is_same_v) { + appendTagged(out, held, " (Int64)"); + } else if constexpr (std::is_same_v) { + appendTagged(out, held, " (UInt64)"); + } else if constexpr (std::is_same_v) { + appendTaggedReal(out, held, " (Float32)"); + } else if constexpr (std::is_same_v) { + appendTaggedReal(out, held, " (Float64)"); + } else if constexpr (std::is_same_v) { + out += '"'; + out += held; + out += '"'; + } else if constexpr (std::is_same_v) { + static constexpr char Digits[] = "0123456789ABCDEF"; + for (const std::uint8_t byte : held) { + out += Digits[byte >> 4]; + out += Digits[byte & 0xF]; + } + out += " (Binary)"; + } else if constexpr (std::is_same_v>) { + appendDebug(out, *held, indent); + } else { + out += "[\n"; + for (const auto& element : held->values) { + out.append(indent + 4, ' '); + appendDebug(out, element, indent + 4); + out += ",\n"; + } + out.append(indent, ' '); + out += ']'; + } + }, value); +} + std::optional unsignedValue(const Value& value) { return std::visit([](const auto& held) -> std::optional { using Held = std::decay_t; @@ -150,6 +270,20 @@ std::string Describe(const NpUniversalDataSystemEvent& event) { return event.name + " " + Describe(event.properties); } +std::size_t MessagePackSize(const NpUniversalDataSystemEvent& event) { + return containerHeader(2) + lengthPrefixed(EventNameKey.size(), 32) + lengthPrefixed(event.name.size(), 32) + + lengthPrefixed(PropertiesKey.size(), 32) + packedSize(event.properties); +} + +std::string DebugString(const NpUniversalDataSystemEvent& event) { + NpUniversalDataSystemEventPropertyObject root; + root.Set(EventNameKey, event.name); + root.Set(PropertiesKey, std::make_shared(event.properties)); + std::string out; + appendDebug(out, root, 0); + return out; +} + NpTrophy2Event StatEvent(const NpUniversalDataSystemEvent& event) { NpTrophy2Event converted; converted.name = event.name; diff --git a/core/libs/prx/libSceNpUniversalDataSystem/tests/Events.cpp b/core/libs/prx/libSceNpUniversalDataSystem/tests/Events.cpp index 992af0fe4585..2dea9e8d3049 100644 --- a/core/libs/prx/libSceNpUniversalDataSystem/tests/Events.cpp +++ b/core/libs/prx/libSceNpUniversalDataSystem/tests/Events.cpp @@ -7,10 +7,12 @@ #include #include #include +#include #include #include #include #include +#include #include #include @@ -63,8 +65,15 @@ void testObjectSetters() { const auto* replaced = std::get_if(object->Find("int32")); check(object->properties.size() == 9 && replaced != nullptr && *replaced == "replaced", "setting a key again did not replace its value"); check(object->Find("missing") == nullptr, "a missing key was found"); - check(throwsInvalidArgument([] { sceNpUniversalDataSystemEventPropertyObjectSetInt32(nullptr, "key", 1); }), "a null object was accepted"); - check(throwsInvalidArgument([object] { sceNpUniversalDataSystemEventPropertyObjectSetInt32(object, nullptr, 1); }), "a null key was accepted"); + check(sceNpUniversalDataSystemEventPropertyObjectSetInt32(nullptr, "key", 1) == SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_OBJECT, "a null object was accepted"); + check(sceNpUniversalDataSystemEventPropertyObjectSetInt32(object, nullptr, 1) == SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_INVALID_KEY, "a null key was accepted"); + check(sceNpUniversalDataSystemEventPropertyObjectSetInt32(object, "", 1) == SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_INVALID_KEY, "an empty key was accepted"); + check(sceNpUniversalDataSystemEventPropertyObjectSetString(nullptr, nullptr, nullptr) == SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_OBJECT, "a null object was not checked first"); + check(sceNpUniversalDataSystemEventPropertyObjectSetString(object, "", nullptr) == SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_INVALID_KEY, "the key was not checked before the value"); + check(sceNpUniversalDataSystemEventPropertyObjectSetString(object, "string", nullptr) == SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_VALUE, "a null string was accepted"); + check(sceNpUniversalDataSystemEventPropertyObjectSetBinary(object, "binary", nullptr, 0) == SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_VALUE, "a null binary of size 0 was accepted"); + check(object->properties.size() == 9, "a rejected call changed the object"); + check(sceNpUniversalDataSystemCreateEventPropertyObject(nullptr) == SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_INVALID_ARGUMENT, "a null object pointer was accepted"); call(sceNpUniversalDataSystemDestroyEventPropertyObject(object), "property object was not destroyed"); } @@ -114,7 +123,12 @@ void testNestedValues() { call(sceNpUniversalDataSystemEventPropertyObjectSetArray(parent, "list", array, &stored), "SetArray over a key failed"); call(sceNpUniversalDataSystemDestroyEventPropertyArray(array), "property array was not destroyed"); check(stored != array && Uds::Describe(*parent) == R"({"child":{"x":5,"y":true},"list":[9]})", "SetArray did not store a copy under its key"); - check(throwsInvalidArgument([] { sceNpUniversalDataSystemEventPropertyArraySetInt32(nullptr, 1); }), "a null array was accepted"); + check(sceNpUniversalDataSystemEventPropertyArraySetInt32(nullptr, 1) == SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_ARRAY, "a null array was accepted"); + check(sceNpUniversalDataSystemEventPropertyArraySetString(nullptr, nullptr) == SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_ARRAY, "a null array was not checked first"); + check(sceNpUniversalDataSystemEventPropertyArraySetString(stored, nullptr) == SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_VALUE, "a null string was added"); + check(sceNpUniversalDataSystemEventPropertyArraySetBinary(stored, nullptr, 0) == SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_VALUE, "a null binary of size 0 was added"); + check(stored->values.size() == 1, "a rejected call changed the array"); + check(sceNpUniversalDataSystemCreateEventPropertyArray(nullptr) == SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_INVALID_ARGUMENT, "a null array pointer was accepted"); call(sceNpUniversalDataSystemDestroyEventPropertyObject(parent), "parent object was not destroyed"); } @@ -136,11 +150,120 @@ void testEvents() { call(sceNpUniversalDataSystemCreateEvent("_Empty", nullptr, &empty, nullptr), "event without properties was not created"); check(Uds::Describe(*empty) == "_Empty {}", "an event without properties was not empty"); call(sceNpUniversalDataSystemDestroyEvent(empty), "event without properties was not destroyed"); - check(throwsInvalidArgument([] { - NpUniversalDataSystemEvent* unnamed = nullptr; - sceNpUniversalDataSystemCreateEvent(nullptr, nullptr, &unnamed, nullptr); + NpUniversalDataSystemEvent* unnamed = nullptr; + check(sceNpUniversalDataSystemCreateEvent(nullptr, nullptr, &unnamed, nullptr) == SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_INVALID_EVENT_NAME && unnamed == nullptr, "an event without a name was created"); + check(sceNpUniversalDataSystemCreateEvent("", nullptr, &unnamed, nullptr) == SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_INVALID_EVENT_NAME && unnamed == nullptr, "an event with an empty name was created"); + check(sceNpUniversalDataSystemCreateEvent("", nullptr, nullptr, nullptr) == SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_INVALID_EVENT_NAME, "the name was not checked before the output pointer"); + check(sceNpUniversalDataSystemCreateEvent("_Named", nullptr, nullptr, nullptr) == SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_INVALID_ARGUMENT, "an event without an output pointer was created"); +} + +void checkEventText(const NpUniversalDataSystemEvent* event, size_t expectedSize, std::string_view expected, const char* message) { + size_t size = 0; + call(sceNpUniversalDataSystemEventEstimateSize(event, &size), "EstimateSize failed"); + check(size == expectedSize, message); + size_t length = 0; + call(sceNpUniversalDataSystemEventToString(event, nullptr, 0, &length), "ToString without a buffer failed"); + check(length == expected.size(), message); + std::string text(expected.size() + 2, '\x7f'); + length = 0; + call(sceNpUniversalDataSystemEventToString(event, text.data(), expected.size() + 1, &length), "ToString failed"); + check(length == expected.size() && text.compare(0, expected.size(), expected) == 0 && text[expected.size()] == '\0' && text.back() == '\x7f', message); +} - }), "an event without a name was created"); +void testEventSizeAndString() { + using Fill = void (*)(NpUniversalDataSystemEventPropertyObject*); + struct Case { + Fill fill; + size_t size; + std::string_view text; + const char* message; + }; + const Case cases[] = { + {[](NpUniversalDataSystemEventPropertyObject*) {}, 25, + "{\n \"eventName\": \"E\",\n \"properties\": {\n },\n}", "an empty event was not described as the console does"}, + {[](NpUniversalDataSystemEventPropertyObject* object) { call(sceNpUniversalDataSystemEventPropertyObjectSetInt64(object, "k", INT64_MIN), "SetInt64 failed"); }, 36, + "{\n \"eventName\": \"E\",\n \"properties\": {\n \"k\": -9223372036854775808 (Int64),\n },\n}", "an int64 property was not described as the console does"}, + {[](NpUniversalDataSystemEventPropertyObject* object) { call(sceNpUniversalDataSystemEventPropertyObjectSetUInt64(object, "k", UINT64_MAX), "SetUInt64 failed"); }, 36, + "{\n \"eventName\": \"E\",\n \"properties\": {\n \"k\": 18446744073709551615 (UInt64),\n },\n}", "a uint64 property was not described as the console does"}, + {[](NpUniversalDataSystemEventPropertyObject* object) { call(sceNpUniversalDataSystemEventPropertyObjectSetFloat32(object, "k", 0.1f), "SetFloat32 failed"); }, 32, + "{\n \"eventName\": \"E\",\n \"properties\": {\n \"k\": 0.1 (Float32),\n },\n}", "a float32 property was not described as the console does"}, + {[](NpUniversalDataSystemEventPropertyObject* object) { call(sceNpUniversalDataSystemEventPropertyObjectSetFloat64(object, "k", 1e300), "SetFloat64 failed"); }, 36, + "{\n \"eventName\": \"E\",\n \"properties\": {\n \"k\": 1e+300 (Float64),\n },\n}", "a float64 property was not described as the console does"}, + {[](NpUniversalDataSystemEventPropertyObject* object) { call(sceNpUniversalDataSystemEventPropertyObjectSetString(object, "s", "a\"b\\c\n\x01/z"), "SetString failed"); }, 37, + "{\n \"eventName\": \"E\",\n \"properties\": {\n \"s\": \"a\"b\\c\n\x01/z\",\n },\n}", "a string property was escaped or resized"}, + {[](NpUniversalDataSystemEventPropertyObject* object) { call(sceNpUniversalDataSystemEventPropertyObjectSetBinary(object, "b", "\x00\x7f\xff", 3), "SetBinary failed"); }, 32, + "{\n \"eventName\": \"E\",\n \"properties\": {\n \"b\": 007FFF (Binary),\n },\n}", "a binary property was not described as the console does"}, + {[](NpUniversalDataSystemEventPropertyObject* object) { + call(sceNpUniversalDataSystemEventPropertyObjectSetInt32(object, "zeta", 1), "SetInt32 failed"); + call(sceNpUniversalDataSystemEventPropertyObjectSetInt32(object, "alpha", 2), "SetInt32 failed"); + call(sceNpUniversalDataSystemEventPropertyObjectSetInt32(object, "mid", 3), "SetInt32 failed"); + call(sceNpUniversalDataSystemEventPropertyObjectSetInt32(object, "alpha", 4), "SetInt32 failed"); + }, 55, + "{\n \"eventName\": \"E\",\n \"properties\": {\n \"zeta\": 1 (Int32),\n \"alpha\": 4 (Int32),\n \"mid\": 3 (Int32),\n },\n}", + "properties were not described in the order they were first set"}, + {[](NpUniversalDataSystemEventPropertyObject* object) { + auto* child = createObject(); + call(sceNpUniversalDataSystemEventPropertyObjectSetInt32(child, "x", 7), "SetInt32 failed"); + NpUniversalDataSystemEventPropertyObject* stored = nullptr; + call(sceNpUniversalDataSystemEventPropertyObjectSetObject(object, "obj", child, &stored), "SetObject failed"); + call(sceNpUniversalDataSystemEventPropertyObjectSetInt32(child, "after", 1), "SetInt32 failed"); + call(sceNpUniversalDataSystemEventPropertyObjectSetInt32(stored, "viaPtr", 2), "SetInt32 failed"); + call(sceNpUniversalDataSystemDestroyEventPropertyObject(child), "child object was not destroyed"); + }, 49, + "{\n \"eventName\": \"E\",\n \"properties\": {\n \"obj\": {\n \"x\": 7 (Int32),\n \"viaPtr\": 2 (Int32),\n },\n },\n}", + "a nested object was not described as the console does"}, + {[](NpUniversalDataSystemEventPropertyObject* object) { + NpUniversalDataSystemEventPropertyArray* array = nullptr; + call(sceNpUniversalDataSystemCreateEventPropertyArray(&array), "array was not created"); + call(sceNpUniversalDataSystemEventPropertyArraySetInt32(array, -1), "array SetInt32 failed"); + call(sceNpUniversalDataSystemEventPropertyArraySetString(array, "x"), "array SetString failed"); + call(sceNpUniversalDataSystemEventPropertyArraySetBool(array, true), "array SetBool failed"); + call(sceNpUniversalDataSystemEventPropertyArraySetUInt64(array, 9), "array SetUInt64 failed"); + call(sceNpUniversalDataSystemEventPropertyArraySetFloat32(array, 2.5f), "array SetFloat32 failed"); + call(sceNpUniversalDataSystemEventPropertyArraySetBinary(array, "\x01\x02", 2), "array SetBinary failed"); + auto* inner = createObject(); + call(sceNpUniversalDataSystemEventPropertyObjectSetInt32(inner, "i", 1), "SetInt32 failed"); + call(sceNpUniversalDataSystemEventPropertyArraySetObject(array, inner, nullptr), "array SetObject failed"); + NpUniversalDataSystemEventPropertyArray* empty = nullptr; + call(sceNpUniversalDataSystemCreateEventPropertyArray(&empty), "empty array was not created"); + call(sceNpUniversalDataSystemEventPropertyArraySetArray(array, empty, nullptr), "array SetArray failed"); + call(sceNpUniversalDataSystemEventPropertyObjectSetArray(object, "arr", array, nullptr), "SetArray failed"); + call(sceNpUniversalDataSystemDestroyEventPropertyObject(inner), "inner object was not destroyed"); + call(sceNpUniversalDataSystemDestroyEventPropertyArray(empty), "empty array was not destroyed"); + call(sceNpUniversalDataSystemDestroyEventPropertyArray(array), "array was not destroyed"); + }, 65, + "{\n \"eventName\": \"E\",\n \"properties\": {\n \"arr\": [\n -1 (Int32),\n \"x\",\n true,\n 9 (UInt64),\n" + " 2.5 (Float32),\n 0102 (Binary),\n {\n \"i\": 1 (Int32),\n },\n [\n ],\n ],\n },\n}", + "an array was not described as the console does"}, + }; + for (const auto& item : cases) { + NpUniversalDataSystemEvent* event = nullptr; + NpUniversalDataSystemEventPropertyObject* properties = nullptr; + call(sceNpUniversalDataSystemCreateEvent("E", nullptr, &event, &properties), "event was not created"); + item.fill(properties); + checkEventText(event, item.size, item.text, item.message); + call(sceNpUniversalDataSystemDestroyEvent(event), "event was not destroyed"); + } + + NpUniversalDataSystemEvent* event = nullptr; + call(sceNpUniversalDataSystemCreateEvent("E", nullptr, &event, nullptr), "event was not created"); + size_t length = 0; + check(sceNpUniversalDataSystemEventEstimateSize(nullptr, &length) == SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_EVENT, "EstimateSize accepted a null event"); + check(sceNpUniversalDataSystemEventEstimateSize(event, nullptr) == SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_INVALID_ARGUMENT, "EstimateSize accepted a null size"); + char text[8]; + check(sceNpUniversalDataSystemEventToString(nullptr, text, sizeof(text), &length) == SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_NULL_EVENT, "ToString accepted a null event"); + check(sceNpUniversalDataSystemEventToString(event, nullptr, 0, nullptr) == SCE_NP_UNIVERSAL_DATA_SYSTEM_ERROR_INVALID_ARGUMENT, "ToString accepted no buffer and no length"); + length = 0; + call(sceNpUniversalDataSystemEventToString(event, nullptr, sizeof(text), &length), "ToString without a buffer but with a capacity failed"); + check(length == 52, "ToString without a buffer did not report the full length"); + std::memset(text, 'x', sizeof(text)); + call(sceNpUniversalDataSystemEventToString(event, text, 0, &length), "ToString into an empty buffer failed"); + check(length == 52 && text[0] == 'x', "ToString wrote into an empty buffer"); + call(sceNpUniversalDataSystemEventToString(event, text, 1, nullptr), "ToString into a one-byte buffer failed"); + check(text[0] == '\0' && text[1] == 'x', "a one-byte buffer did not get only the terminator"); + call(sceNpUniversalDataSystemEventToString(event, text, 7, &length), "ToString into a short buffer failed"); + check(length == 52 && std::string_view(text, 7) == std::string_view("{\n \0", 7) && text[7] == 'x', "a short buffer was not cut like snprintf"); + call(sceNpUniversalDataSystemDestroyEvent(event), "event was not destroyed"); } Uds::TrophyEvent recognize(const char* name, std::optional id) { @@ -287,6 +410,7 @@ int main() { testObjectSetters(); testNestedValues(); testEvents(); + testEventSizeAndString(); testRecognition(); testStatEvent(); testLocaleIndependentNumberFormatting(); diff --git a/core/libs/prx/libSceNpWebApi/CMakeLists.txt b/core/libs/prx/libSceNpWebApi/CMakeLists.txt index 0e3e193000c5..c40af150ee65 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 49a0b7357b71..4f9b31e73c4a 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,4 +327,159 @@ int APS5_VABI sceNpWebApiUtilityParseNpId() { return 0; } +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(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__); +} + +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() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpWebApiClearUnusedConnection() { + 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() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpWebApiGetErrorCode() { + 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(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(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() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpWebApiIntRegisterServicePushEventCallbackA() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpWebApiRegisterExtdPushEventCallback() { + 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() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceNpWebApiSendMultipartRequest2() { + 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(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(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(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(int titleUserCtxId) { + std::lock_guard lock(contextsMutex); + return findUserContext(titleUserCtxId).error; +} + +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 000000000000..ba72276195be --- /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 47b0d19b1bf6..e8b44ee2222e 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,4 +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 libCtxId, int handleId); +int APS5_VABI sceNpWebApiAddHttpRequestHeader(std::int64_t requestId, const char* fieldName, const char* value); +int APS5_VABI sceNpWebApiAddMultipartPart(); +void APS5_VABI sceNpWebApiCheckTimeout(); +int APS5_VABI sceNpWebApiClearAllUnusedConnection(); +int APS5_VABI sceNpWebApiClearUnusedConnection(); +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 libHttpCtxId, std::size_t poolSize); +int APS5_VABI sceNpWebApiIntCreateCtxIndExtdPushEventFilter(); +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(const NpWebApiIntInitializeArgs* args); +int APS5_VABI sceNpWebApiIntRegisterServicePushEventCallback(); +int APS5_VABI sceNpWebApiIntRegisterServicePushEventCallbackA(); +int APS5_VABI sceNpWebApiRegisterExtdPushEventCallback(); +int APS5_VABI sceNpWebApiRegisterNotificationCallback(int titleUserCtxId, void* callback, void* userArg); +int APS5_VABI sceNpWebApiSendMultipartRequest(); +int APS5_VABI sceNpWebApiSendMultipartRequest2(); +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(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 fda278f8c624..1ede18368987 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 000000000000..a7eedbb9bc56 --- /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 6c299c3731c5..6462dce53f58 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/libSceOpusCeltEnc/Export.cpp b/core/libs/prx/libSceOpusCeltEnc/Export.cpp index 47556b14d118..94d556040826 100644 --- a/core/libs/prx/libSceOpusCeltEnc/Export.cpp +++ b/core/libs/prx/libSceOpusCeltEnc/Export.cpp @@ -109,4 +109,20 @@ int APS5_VABI sceOpusCeltEncEncodeFloatWithPriority(OpusCeltEncoder* state, cons return 0; } +int APS5_VABI sceOpusCeltEncGetAjmContext() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceOpusCeltMultistreamEncCreate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceOpusCeltMultistreamEncCtl() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceOpusCeltMultistreamEncCreateEx() { + NotImplemented_nid_no_patch(__func__); +} + } // extern "C" diff --git a/core/libs/prx/libSceOpusCeltEnc/include/Api.hpp b/core/libs/prx/libSceOpusCeltEnc/include/Api.hpp index 5a38483d1d5b..886187d4bc68 100644 --- a/core/libs/prx/libSceOpusCeltEnc/include/Api.hpp +++ b/core/libs/prx/libSceOpusCeltEnc/include/Api.hpp @@ -14,8 +14,12 @@ int APS5_VABI sceOpusCeltEncEncode(OpusCeltEncoder* encoder, const std::int16_t* int APS5_VABI sceOpusCeltEncEncodeFloat(OpusCeltEncoder* encoder, const float* samples, std::int32_t frameSize, std::uint8_t* data, std::int32_t maxDataBytes); int APS5_VABI sceOpusCeltEncEncodeFloatWithPriority(OpusCeltEncoder* encoder, const float* samples, std::int32_t frameSize, std::uint8_t* data, std::int32_t maxDataBytes, std::uint32_t priority); int APS5_VABI sceOpusCeltEncEncodeWithPriority(OpusCeltEncoder* encoder, const std::int16_t* samples, std::int32_t frameSize, std::uint8_t* data, std::int32_t maxDataBytes, std::uint32_t priority); +int APS5_VABI sceOpusCeltEncGetAjmContext(); int APS5_VABI sceOpusCeltEncGetSize(std::int32_t channels); int APS5_VABI sceOpusCeltEncInitialize(std::uint32_t* contextId); int APS5_VABI sceOpusCeltEncTerminate(const std::uint32_t* contextId); +int APS5_VABI sceOpusCeltMultistreamEncCreate(); +int APS5_VABI sceOpusCeltMultistreamEncCreateEx(); +int APS5_VABI sceOpusCeltMultistreamEncCtl(); } diff --git a/core/libs/prx/libSceOpusDec/Export.cpp b/core/libs/prx/libSceOpusDec/Export.cpp index 138675d8f75f..dc487b2049e9 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 000000000000..0250712cd4ad --- /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 fd178928197d..36325330f24d 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/libSceOpusSilkEnc/Export.cpp b/core/libs/prx/libSceOpusSilkEnc/Export.cpp index 826f776fd14a..8f534c4f8d07 100644 --- a/core/libs/prx/libSceOpusSilkEnc/Export.cpp +++ b/core/libs/prx/libSceOpusSilkEnc/Export.cpp @@ -138,4 +138,8 @@ int APS5_VABI sceOpusSilkEncEncodeFloatWithPriorityAndTimeout(OpusSilkEncoder* s return 0; } +int APS5_VABI sceOpusSilkEncGetAjmContext() { + NotImplemented_nid_no_patch(__func__); +} + } // extern "C" diff --git a/core/libs/prx/libSceOpusSilkEnc/include/Api.hpp b/core/libs/prx/libSceOpusSilkEnc/include/Api.hpp index 01202c6ad961..ed791b16f528 100644 --- a/core/libs/prx/libSceOpusSilkEnc/include/Api.hpp +++ b/core/libs/prx/libSceOpusSilkEnc/include/Api.hpp @@ -17,6 +17,7 @@ int APS5_VABI sceOpusSilkEncEncodeFloatWithPriority(OpusSilkEncoder* encoder, co int APS5_VABI sceOpusSilkEncEncodeFloatWithPriorityAndTimeout(OpusSilkEncoder* encoder, const float* samples, std::int32_t frameSize, std::uint8_t* data, std::int32_t maxDataBytes, std::uint32_t priority, std::uint32_t timeout, std::uint32_t* batchId); int APS5_VABI sceOpusSilkEncEncodeWithPriority(OpusSilkEncoder* encoder, const std::int16_t* samples, std::int32_t frameSize, std::uint8_t* data, std::int32_t maxDataBytes, std::uint32_t priority); int APS5_VABI sceOpusSilkEncEncodeWithPriorityAndTimeout(OpusSilkEncoder* encoder, const std::int16_t* samples, std::int32_t frameSize, std::uint8_t* data, std::int32_t maxDataBytes, std::uint32_t priority, std::uint32_t timeout, std::uint32_t* batchId); +int APS5_VABI sceOpusSilkEncGetAjmContext(); int APS5_VABI sceOpusSilkEncGetSize(std::int32_t channels); int APS5_VABI sceOpusSilkEncInitialize(std::uint32_t* contextId); int APS5_VABI sceOpusSilkEncTerminate(const std::uint32_t* contextId); diff --git a/core/libs/prx/libScePSNowGkp/Export.cpp b/core/libs/prx/libScePSNowGkp/Export.cpp index 78ef114a0352..1836f90a91d7 100644 --- a/core/libs/prx/libScePSNowGkp/Export.cpp +++ b/core/libs/prx/libScePSNowGkp/Export.cpp @@ -1,3 +1,4 @@ +#include "prx/libScePSNowGkp/include/InventoryExports.hpp" #include "prx/libScePSNowGkp/include/Api.hpp" #include #include @@ -27,3 +28,27 @@ int APS5_VABI sceCloudClientTestConnection() { } } + +extern "C" { + +int APS5_VABI sceCloudClientGetStatus() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCloudClientInitialize() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCloudClientRequestClientId() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCloudClientSetSettings() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceCloudClientTerminate() { + NotImplemented_nid_no_patch(__func__); +} + +} diff --git a/core/libs/prx/libScePSNowGkp/include/InventoryExports.hpp b/core/libs/prx/libScePSNowGkp/include/InventoryExports.hpp new file mode 100644 index 000000000000..9890f67348b2 --- /dev/null +++ b/core/libs/prx/libScePSNowGkp/include/InventoryExports.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceCloudClientGetStatus(); +int APS5_VABI sceCloudClientInitialize(); +int APS5_VABI sceCloudClientRequestClientId(); +int APS5_VABI sceCloudClientSetSettings(); +int APS5_VABI sceCloudClientTerminate(); + +} diff --git a/core/libs/prx/libScePSNowGkp/libScePSNowGkp.hpp b/core/libs/prx/libScePSNowGkp/libScePSNowGkp.hpp index 740a2676d3b8..82ddfe345c50 100644 --- a/core/libs/prx/libScePSNowGkp/libScePSNowGkp.hpp +++ b/core/libs/prx/libScePSNowGkp/libScePSNowGkp.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libScePSNowGkp/include/Api.hpp" +#include "prx/libScePSNowGkp/include/InventoryExports.hpp" diff --git a/core/libs/prx/libScePad/CMakeLists.txt b/core/libs/prx/libScePad/CMakeLists.txt index b979e5344cf2..48fefce3bee2 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) @@ -29,3 +31,11 @@ if(BUILD_TESTING) "PATH=path_list_prepend:$") endif() endif() + +if(BUILD_TESTING) + add_test_executable(pad_rumble_intensity_tests tests/PadRumbleIntensity.cpp) + target_include_directories(pad_rumble_intensity_tests PRIVATE ${LIBS_INCLUDE_DIR}) + configure_host_test_executable(pad_rumble_intensity_tests) + add_test(NAME pad_rumble_intensity COMMAND pad_rumble_intensity_tests) + set_tests_properties(pad_rumble_intensity PROPERTIES TIMEOUT 30) +endif() diff --git a/core/libs/prx/libScePad/Export.cpp b/core/libs/prx/libScePad/Export.cpp index a0e44bd6b6dc..e0c2fec1f7ab 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 000000000000..91f7312888b0 --- /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 000000000000..17169d2933b2 --- /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 000000000000..3f590d1cae41 --- /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 000000000000..9265d91feb41 --- /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 172735fd6268..0d2fd0bc2aff 100644 --- a/core/libs/prx/libScePad/include/InputCommandFile.hpp +++ b/core/libs/prx/libScePad/include/InputCommandFile.hpp @@ -60,6 +60,24 @@ class InputCommandFile { 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 ec4da4ab4724..99ffcc96be14 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 { @@ -40,6 +41,10 @@ inline constexpr std::array InputMapping{ InputBinding{SDL_SCANCODE_F11, MouseButton::None, InputControl::ToggleFullscreen}, 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 14002488e18d..84f4478d1eb6 100644 --- a/core/libs/prx/libScePad/include/KeyboardMouse.hpp +++ b/core/libs/prx/libScePad/include/KeyboardMouse.hpp @@ -55,6 +55,10 @@ struct InputRequests { bool toggleFullscreen = false; 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 f8e544e09220..b6515da5a972 100644 --- a/core/libs/prx/libScePad/include/PadInputTypes.hpp +++ b/core/libs/prx/libScePad/include/PadInputTypes.hpp @@ -24,7 +24,11 @@ enum class InputControl { ToggleMouse, ToggleFullscreen, TogglePerformanceOverlay, - Screenshot + Screenshot, + ShowPadStatus, + VolumeUp, + VolumeDown, + ToggleMute }; enum class PadButton : std::uint32_t { diff --git a/core/libs/prx/libScePad/include/PadRumbleIntensity.hpp b/core/libs/prx/libScePad/include/PadRumbleIntensity.hpp new file mode 100644 index 000000000000..eaf637a62016 --- /dev/null +++ b/core/libs/prx/libScePad/include/PadRumbleIntensity.hpp @@ -0,0 +1,69 @@ +#ifndef CORE_LIBS_PRX_LIBSCEPAD_PADRUMBLEINTENSITY_HPP +#define CORE_LIBS_PRX_LIBSCEPAD_PADRUMBLEINTENSITY_HPP + +#include +#include +#include +#include + +namespace Pad { + +constexpr unsigned kRumblePercentFull = 100; + +constexpr std::uint16_t ScaleRumbleAmplitude(std::uint16_t amplitude, unsigned percent) { + if (percent >= kRumblePercentFull) return amplitude; + return static_cast((static_cast(amplitude) * percent + 50u) / 100u); +} + +struct RumbleCommand { + std::uint16_t low = 0; + std::uint16_t high = 0; + std::uint32_t durationMs = 0; + + constexpr bool Active() const { return low != 0 || high != 0; } + constexpr bool operator==(const RumbleCommand& other) const { + return low == other.low && high == other.high && durationMs == other.durationMs; + } +}; + +constexpr RumbleCommand MakeRumbleCommand(std::uint8_t low, std::uint8_t high, unsigned percent, std::uint32_t durationMs) { + if (percent >= kRumblePercentFull) { + return RumbleCommand{static_cast(low * 257), static_cast(high * 257), (low != 0 || high != 0) ? durationMs : 0}; + } + RumbleCommand command; + command.low = ScaleRumbleAmplitude(static_cast(low * 257), percent); + command.high = ScaleRumbleAmplitude(static_cast(high * 257), percent); + command.durationMs = command.Active() ? durationMs : 0; + return command; +} + +template +bool SendRumble(Sink&& sink, std::uint8_t low, std::uint8_t high, unsigned percent, std::uint32_t durationMs) { + const RumbleCommand command = MakeRumbleCommand(low, high, percent, durationMs); + sink(command.low, command.high, command.durationMs); + return command.Active(); +} + +inline unsigned ParseRumblePercent(const char* text) { + if (text == nullptr) return kRumblePercentFull; + const std::string value(text); + bool valid = !value.empty() && value.size() <= 3; + unsigned parsed = 0; + for (const char digit : value) { + if (digit < '0' || digit > '9') valid = false; + else parsed = parsed * 10 + static_cast(digit - '0'); + } + if (!valid || parsed > kRumblePercentFull) { + throw std::runtime_error("ANYPS5_RUMBLE must be a whole number from 0 to 100, got '" + value + "'"); + } + return parsed; +} + +inline unsigned RumblePercent() { + static const unsigned percent = ParseRumblePercent(std::getenv("ANYPS5_RUMBLE")); + return percent; +} + +} + +#endif diff --git a/core/libs/prx/libScePad/include/PadState.hpp b/core/libs/prx/libScePad/include/PadState.hpp index 365627eb3ae4..1dfc108fcc65 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 000000000000..41a8a83fb737 --- /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 2b57276eed51..ee47ae1d030f 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/libScePad/tests/PadRumbleIntensity.cpp b/core/libs/prx/libScePad/tests/PadRumbleIntensity.cpp new file mode 100644 index 000000000000..2b497d352a1b --- /dev/null +++ b/core/libs/prx/libScePad/tests/PadRumbleIntensity.cpp @@ -0,0 +1,171 @@ +#include "prx/libScePad/include/PadRumbleIntensity.hpp" + +#include +#include +#include +#include +#include +#include +#include + +namespace { + +void Require(bool condition, const char* message) { + if (condition) return; + std::fprintf(stderr, "pad_rumble_intensity: %s\n", message); + std::exit(1); +} + +void SetEnvironment(const char* value) { +#ifdef _WIN32 + _putenv_s("ANYPS5_RUMBLE", value == nullptr ? "" : value); +#else + if (value == nullptr) unsetenv("ANYPS5_RUMBLE"); + else setenv("ANYPS5_RUMBLE", value, 1); +#endif +} + +unsigned ReferenceScale(unsigned amplitude, unsigned percent) { + return (2u * amplitude * percent + 100u) / 200u; +} + +void ScaleKnownValues() { + Require(Pad::ScaleRumbleAmplitude(0, 0) == 0 && Pad::ScaleRumbleAmplitude(0, 50) == 0 && Pad::ScaleRumbleAmplitude(0, 100) == 0, "a zero amplitude stays zero"); + Require(Pad::ScaleRumbleAmplitude(65535, 100) == 65535, "100 percent keeps the full amplitude"); + Require(Pad::ScaleRumbleAmplitude(65535, 0) == 0, "0 percent silences the full amplitude"); + Require(Pad::ScaleRumbleAmplitude(65535, 1) == 655, "1 percent of 65535 is 655"); + Require(Pad::ScaleRumbleAmplitude(65535, 50) == 32768, "50 percent of 65535 rounds .5 up to 32768"); + Require(Pad::ScaleRumbleAmplitude(65535, 99) == 64880, "99 percent of 65535 is 64880"); + Require(Pad::ScaleRumbleAmplitude(1, 50) == 1, "half of 1 rounds up to 1"); + Require(Pad::ScaleRumbleAmplitude(1, 49) == 0, "49 percent of 1 rounds down to 0"); + Require(Pad::ScaleRumbleAmplitude(257, 50) == 129, "50 percent of 257 rounds .5 up to 129"); + Require(Pad::ScaleRumbleAmplitude(3, 50) == 2, "half of 3 rounds up to 2"); + Require(Pad::ScaleRumbleAmplitude(2, 25) == 1, "a quarter of 2 rounds .5 up to 1"); + Require(Pad::ScaleRumbleAmplitude(1000, 101) == 1000 && Pad::ScaleRumbleAmplitude(65535, 4000000000u) == 65535, "a percentage above 100 never amplifies"); +} + +void ScaleOverFullRange() { + for (unsigned percent = 0; percent <= 100; ++percent) { + unsigned previous = 0; + for (unsigned amplitude = 0; amplitude <= 65535; ++amplitude) { + const auto scaled = Pad::ScaleRumbleAmplitude(static_cast(amplitude), percent); + Require(scaled == ReferenceScale(amplitude, percent), "the scale matches the independent exact reference"); + Require(scaled <= amplitude, "scaling never amplifies"); + Require(scaled >= previous, "scaling is monotonic in the amplitude"); + previous = scaled; + } + } + for (unsigned amplitude = 0; amplitude <= 65535; amplitude += 97) { + unsigned previous = 0; + for (unsigned percent = 0; percent <= 100; ++percent) { + const auto scaled = Pad::ScaleRumbleAmplitude(static_cast(amplitude), percent); + Require(scaled >= previous, "scaling is monotonic in the percentage"); + previous = scaled; + } + Require(Pad::ScaleRumbleAmplitude(static_cast(amplitude), 100) == amplitude, "100 percent is the identity"); + Require(Pad::ScaleRumbleAmplitude(static_cast(amplitude), 0) == 0, "0 percent is silence"); + } +} + +void FullIntensityIsTheLegacyCommandByteForByte() { + constexpr std::uint32_t duration = 2000; + for (unsigned low = 0; low <= 255; ++low) { + for (unsigned high = 0; high <= 255; ++high) { + Pad::RumbleCommand legacy; + legacy.low = static_cast(low * 257); + legacy.high = static_cast(high * 257); + legacy.durationMs = (low != 0 || high != 0) ? duration : 0; + for (const unsigned percent : {100u, 101u, 255u}) { + const auto command = Pad::MakeRumbleCommand(static_cast(low), static_cast(high), percent, duration); + Require(sizeof(command) == sizeof(legacy) && std::memcmp(&command, &legacy, sizeof(command)) == 0, "full intensity equals the unscaled command byte for byte"); + Require(command.Active() == (low != 0 || high != 0), "full intensity is active exactly when a motor is on"); + } + } + } +} + +void OffNeverReachesTheHost() { + std::vector calls; + const auto sink = [&calls](std::uint16_t low, std::uint16_t high, std::uint32_t duration) { calls.push_back({low, high, duration}); }; + for (unsigned low = 0; low <= 255; ++low) { + for (unsigned high = 0; high <= 255; ++high) { + calls.clear(); + const bool active = Pad::SendRumble(sink, static_cast(low), static_cast(high), 0, 2000); + Require(calls.size() == 1, "an applied output reaches the sink exactly once, so a running rumble is stopped"); + Require(calls[0].low == 0 && calls[0].high == 0 && calls[0].durationMs == 0, "0 percent only ever asks the host to stop"); + Require(!active, "0 percent is never reported as rumbling"); + } + } +} + +void StopOnApplyAfterFullRumble() { + std::vector calls; + const auto sink = [&calls](std::uint16_t low, std::uint16_t high, std::uint32_t duration) { calls.push_back({low, high, duration}); }; + Pad::SendRumble(sink, 255, 255, 100, 2000); + Require(calls.size() == 1 && calls[0].low == 65535 && calls[0].high == 65535 && calls[0].durationMs == 2000, "before the setting applies, the host rumbles at full strength"); + Pad::SendRumble(sink, 255, 255, 0, 2000); + Require(calls.size() == 2 && calls[1].low == 0 && calls[1].high == 0 && calls[1].durationMs == 0, "applying 0 percent stops the running rumble"); + Pad::SendRumble(sink, 0, 0, 0, 2000); + Require(calls.size() == 3 && !calls[2].Active() && calls[2].durationMs == 0, "a title stopping its own vibration sends the same stop"); +} + +void IntermediateIntensityScalesBothMotors() { + const auto half = Pad::MakeRumbleCommand(255, 128, 50, 2000); + Require(half.low == 32768 && half.high == 16448 && half.durationMs == 2000, "50 percent halves each motor with .5 rounded up"); + const auto left = Pad::MakeRumbleCommand(200, 0, 25, 2000); + Require(left.low == 12850 && left.high == 0 && left.durationMs == 2000, "a motor that is off stays off"); + const auto idle = Pad::MakeRumbleCommand(0, 0, 50, 2000); + Require(idle.low == 0 && idle.high == 0 && idle.durationMs == 0, "no motor on means a stop with no duration"); + for (unsigned percent = 1; percent <= 99; ++percent) { + for (unsigned level = 1; level <= 255; ++level) { + const auto command = Pad::MakeRumbleCommand(static_cast(level), 0, percent, 2000); + Require(command.Active() && command.durationMs == 2000, "any nonzero request stays audible at any nonzero percentage"); + Require(command.low <= level * 257u && command.high == 0, "an intermediate percentage never amplifies"); + } + } +} + +bool Refuses(const char* text, const char* expectedValue) { + try { + Pad::ParseRumblePercent(text); + } catch (const std::runtime_error& error) { + const std::string message = error.what(); + return message.find("ANYPS5_RUMBLE") != std::string::npos && message.find(expectedValue) != std::string::npos; + } + return false; +} + +void ParserAcceptsAndRefuses() { + Require(Pad::ParseRumblePercent(nullptr) == 100, "an unset variable keeps full intensity"); + const struct { const char* text; unsigned expected; } accepted[] = {{"0", 0}, {"1", 1}, {"50", 50}, {"99", 99}, {"100", 100}, {"007", 7}, {"000", 0}}; + for (const auto& entry : accepted) Require(Pad::ParseRumblePercent(entry.text) == entry.expected, "a whole number from 0 to 100 is accepted"); + const char* refused[] = {"", "101", "999", "1000", "-1", "+5", " 5", "5 ", "1.5", "abc", "0x10", "50%", "5a", "1e1", "\n"}; + for (const char* text : refused) Require(Refuses(text, text), "an invalid value is refused with an error naming the variable and the value"); +} + +void EnvironmentIsReadOnceAndInvalidValuesKeepFailing() { + SetEnvironment("abc"); + bool first = false; + bool second = false; + try { Pad::RumblePercent(); } catch (const std::runtime_error&) { first = true; } + try { Pad::RumblePercent(); } catch (const std::runtime_error&) { second = true; } + Require(first && second, "an invalid value fails at every use, not only the first"); + SetEnvironment("30"); + Require(Pad::RumblePercent() == 30, "a valid value is read"); + SetEnvironment("80"); + Require(Pad::RumblePercent() == 30, "the value is read once for the lifetime of the process"); +} + +} + +int main() { + ScaleKnownValues(); + ScaleOverFullRange(); + FullIntensityIsTheLegacyCommandByteForByte(); + OffNeverReachesTheHost(); + StopOnApplyAfterFullRumble(); + IntermediateIntensityScalesBothMotors(); + ParserAcceptsAndRefuses(); + EnvironmentIsReadOnceAndInvalidValuesKeepFailing(); + return 0; +} diff --git a/core/libs/prx/libScePadTracker/CMakeLists.txt b/core/libs/prx/libScePadTracker/CMakeLists.txt new file mode 100644 index 000000000000..776a703aff0c --- /dev/null +++ b/core/libs/prx/libScePadTracker/CMakeLists.txt @@ -0,0 +1,14 @@ +add_library(libScePadTracker SHARED EXCLUDE_FROM_ALL Export.cpp) +target_include_directories(libScePadTracker PRIVATE ${LIBS_INCLUDE_DIR}) +configure_windows_unwind(libScePadTracker) + +if(BUILD_TESTING) + add_test_executable(guest_pad_tracker_tests ${LIBS_INCLUDE_DIR}/tests/GuestPadTracker.cpp) + target_include_directories(guest_pad_tracker_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_pad_tracker_tests PRIVATE libScePadTracker) + add_test(NAME guest_pad_tracker COMMAND guest_pad_tracker_tests) + if(WIN32) + set_tests_properties(guest_pad_tracker PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libScePadTracker/Export.cpp b/core/libs/prx/libScePadTracker/Export.cpp index e48d78bdda12..2ddae2fad632 100644 --- a/core/libs/prx/libScePadTracker/Export.cpp +++ b/core/libs/prx/libScePadTracker/Export.cpp @@ -11,8 +11,10 @@ int APS5_VABI scePadTrackerCalibrate() { return 0; } -int APS5_VABI scePadTrackerGetWorkingMemorySize() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI scePadTrackerGetWorkingMemorySize(std::uint32_t* first, std::uint32_t* second) { + if (first == nullptr || second == nullptr) return static_cast(0x80c40003); + *first = 0x800000; + *second = 0x800000; return 0; } diff --git a/core/libs/prx/libScePadTracker/include/Api.hpp b/core/libs/prx/libScePadTracker/include/Api.hpp index 825991c11438..4fa7596271fa 100644 --- a/core/libs/prx/libScePadTracker/include/Api.hpp +++ b/core/libs/prx/libScePadTracker/include/Api.hpp @@ -1,11 +1,12 @@ #pragma once #include "SceTypes.hpp" +#include extern "C" { int APS5_VABI scePadTrackerCalibrate(); -int APS5_VABI scePadTrackerGetWorkingMemorySize(); +int APS5_VABI scePadTrackerGetWorkingMemorySize(std::uint32_t* first, std::uint32_t* second); int APS5_VABI scePadTrackerInit(); int APS5_VABI scePadTrackerReadState(); int APS5_VABI scePadTrackerTerm(); diff --git a/core/libs/prx/libScePlayGo/Export.cpp b/core/libs/prx/libScePlayGo/Export.cpp index f03bd2e343e8..574f2938ad4f 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,11 +227,19 @@ int APS5_VABI scePlayGoGetProgress(int handle, const uint16_t* chunk_ids, uint32 return 0; } +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; } @@ -223,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; } @@ -252,6 +284,15 @@ int APS5_VABI scePlayGoSetInstallSpeed(int handle, int32_t speed) { return 0; } +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) { if (handle != PLAYGO_HANDLE) return SCE_PLAYGO_ERROR_BAD_HANDLE; if (!todo_list) return SCE_PLAYGO_ERROR_BAD_POINTER; @@ -265,14 +306,21 @@ 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(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) { if (handle != PLAYGO_HANDLE) return SCE_PLAYGO_ERROR_BAD_HANDLE; g_languageMask = language_mask; diff --git a/core/libs/prx/libScePlayGo/include/Api.hpp b/core/libs/prx/libScePlayGo/include/Api.hpp index e7f2e0a8793d..1f72fd12f9c6 100644 --- a/core/libs/prx/libScePlayGo/include/Api.hpp +++ b/core/libs/prx/libScePlayGo/include/Api.hpp @@ -13,6 +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 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); @@ -20,9 +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(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 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 4c7e5fe395a2..c09e68fee310 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 6fb478bbda40..70ad502339f8 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/libScePlayReady2/Export.cpp b/core/libs/prx/libScePlayReady2/Export.cpp index 0ad7e3f73d4e..b90313736be4 100644 --- a/core/libs/prx/libScePlayReady2/Export.cpp +++ b/core/libs/prx/libScePlayReady2/Export.cpp @@ -86,4 +86,9 @@ int APS5_VABI scePlayReadyReinitialize() { return 0; } + +int APS5_VABI scePlayReadyApiSetInitParamFlags() { + NotImplemented_nid_no_patch(__func__); +} + } diff --git a/core/libs/prx/libScePlayReady2/include/Api.hpp b/core/libs/prx/libScePlayReady2/include/Api.hpp index 3e388e5dc654..7c65f079fc1c 100644 --- a/core/libs/prx/libScePlayReady2/include/Api.hpp +++ b/core/libs/prx/libScePlayReady2/include/Api.hpp @@ -21,4 +21,6 @@ int APS5_VABI scePlayReadyReaderFreeOpaqueContent(); int APS5_VABI scePlayReadyReaderRetrieveOpaqueContent(); int APS5_VABI scePlayReadyReinitialize(); +int APS5_VABI scePlayReadyApiSetInitParamFlags(); + } diff --git a/core/libs/prx/libScePlayReady4/Export.cpp b/core/libs/prx/libScePlayReady4/Export.cpp index 9d4bbeea9337..27b4893f63e6 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 @@ -181,4 +183,264 @@ int APS5_VABI scePlayReadyProfileStop() { return 0; } + +int APS5_VABI scePlayReadyCdmiProcessLicenseAckResponse() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI scePlayReadyCdmiGetSessionId2() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI scePlayReadyCdmiGenerateLicenseAckRequest() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI scePlayReadyCdmiGenerateRequest2() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI scePlayReadyDomainJoinProcessResponse2() { + NotImplemented_nid_no_patch(__func__); +} + +} + +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/Api.hpp b/core/libs/prx/libScePlayReady4/include/Api.hpp index cef37c1859c7..8875d406e487 100644 --- a/core/libs/prx/libScePlayReady4/include/Api.hpp +++ b/core/libs/prx/libScePlayReady4/include/Api.hpp @@ -40,4 +40,10 @@ int APS5_VABI scePlayReadyProfileResume(); int APS5_VABI scePlayReadyProfileStart(); int APS5_VABI scePlayReadyProfileStop(); +int APS5_VABI scePlayReadyCdmiProcessLicenseAckResponse(); +int APS5_VABI scePlayReadyCdmiGetSessionId2(); +int APS5_VABI scePlayReadyCdmiGenerateLicenseAckRequest(); +int APS5_VABI scePlayReadyCdmiGenerateRequest2(); +int APS5_VABI scePlayReadyDomainJoinProcessResponse2(); + } diff --git a/core/libs/prx/libScePlayReady4/include/InventoryExports.hpp b/core/libs/prx/libScePlayReady4/include/InventoryExports.hpp new file mode 100644 index 000000000000..d8675c45fedd --- /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 97c4cdd3e7e3..a76aa8006ba8 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 000000000000..576f70d2a291 --- /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 000000000000..c4459311138d --- /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 000000000000..9415afb17619 --- /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/libScePngDec/Export.cpp b/core/libs/prx/libScePngDec/Export.cpp index c4404f2e4005..6382e6267132 100644 --- a/core/libs/prx/libScePngDec/Export.cpp +++ b/core/libs/prx/libScePngDec/Export.cpp @@ -101,7 +101,7 @@ void fillImageInfo(const Decoder::Png::Header& header, PngDecImageInfo* info) { } bool hasAlpha(const Decoder::Png::Header& header) { - return header.hasTransparency || header.colorType == Decoder::Png::ColorType::GrayscaleAlpha + return header.hasTransparency || header.colorType == Decoder::Png::ColorType::Palette || header.colorType == Decoder::Png::ColorType::GrayscaleAlpha || header.colorType == Decoder::Png::ColorType::Rgba; } diff --git a/core/libs/prx/libScePngParser/Export.cpp b/core/libs/prx/libScePngParser/Export.cpp index d81f4a5e32c4..691d4702fdae 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 000000000000..14898e3c19d1 --- /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 6f70f09beec2..5139493e499f 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 000000000000..d81f4a5e32c4 --- /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 000000000000..6f70f09beec2 --- /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 5c8e4f8df9f4..ee40869b5a10 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,64 @@ 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; +} + +void APS5_VABI sceRazorCpuSetPushMarkerCallback(void* callback) { + (void)callback; +} + +void APS5_VABI sceRazorCpuSetPushMarkerStaticCallback(void* callback) { + (void)callback; +} + +int APS5_VABI sceRazorCpuStartCaptureInternal(void) { + return SCE_RAZOR_CPU_ERROR_NOT_INITIALIZED; +} + +int APS5_VABI sceRazorCpuStopCaptureInternal(void) { + return SCE_RAZOR_CPU_ERROR_NOT_INITIALIZED; +} + +int APS5_VABI sceRazorCpuWorkloadRunBegin(void) { + return 0; +} + +int APS5_VABI sceRazorCpuWorkloadRunEnd(void) { + return 0; +} + +int APS5_VABI sceRazorCpuWorkloadSubmit(void) { + return 0; } -int APS5_VABI sceRazorCpuSetPushMarkerCallback(void) { +int APS5_VABI sceRazorCpuUserSignalWaitBegin() { NotImplemented_nid_no_patch(__func__); - return 0; } -int APS5_VABI sceRazorCpuSetPushMarkerStaticCallback(void) { +int APS5_VABI sceRazorCpuUserSignalPost() { NotImplemented_nid_no_patch(__func__); - return 0; } -int APS5_VABI sceRazorCpuStartCaptureInternal(void) { +int APS5_VABI sceRazorCpuWriteBookmarkEnd() { NotImplemented_nid_no_patch(__func__); - return 0; } -int APS5_VABI sceRazorCpuStopCaptureInternal(void) { +int APS5_VABI sceRazorCpuUserSignalWaitEnd() { NotImplemented_nid_no_patch(__func__); - return 0; } -int APS5_VABI sceRazorCpuWorkloadRunBegin(void) { +int APS5_VABI sceRazorCpuWorkloadRunBeginEx() { NotImplemented_nid_no_patch(__func__); - return 0; } -int APS5_VABI sceRazorCpuWorkloadRunEnd(void) { +int APS5_VABI sceRazorCpuUserSignalPostEx() { NotImplemented_nid_no_patch(__func__); - return 0; } -int APS5_VABI sceRazorCpuWorkloadSubmit(void) { +int APS5_VABI sceRazorCpuUserSignalWaitBeginEx() { NotImplemented_nid_no_patch(__func__); - return 0; } } diff --git a/core/libs/prx/libSceRazorCpu/include/Api.hpp b/core/libs/prx/libSceRazorCpu/include/Api.hpp index 1e6b94daff55..21bcbb13b004 100644 --- a/core/libs/prx/libSceRazorCpu/include/Api.hpp +++ b/core/libs/prx/libSceRazorCpu/include/Api.hpp @@ -29,15 +29,22 @@ 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); int APS5_VABI sceRazorCpuWorkloadRunEnd(void); int APS5_VABI sceRazorCpuWorkloadSubmit(void); +int APS5_VABI sceRazorCpuUserSignalWaitBegin(); +int APS5_VABI sceRazorCpuUserSignalPost(); +int APS5_VABI sceRazorCpuWriteBookmarkEnd(); +int APS5_VABI sceRazorCpuUserSignalWaitEnd(); +int APS5_VABI sceRazorCpuWorkloadRunBeginEx(); +int APS5_VABI sceRazorCpuUserSignalPostEx(); +int APS5_VABI sceRazorCpuUserSignalWaitBeginEx(); } diff --git a/core/libs/prx/libSceRegMgr/CMakeLists.txt b/core/libs/prx/libSceRegMgr/CMakeLists.txt index e10c382e33d8..fd61a9bf30a9 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/Export.cpp b/core/libs/prx/libSceRegMgr/Export.cpp index 84326f6c258f..bd8634999896 100644 --- a/core/libs/prx/libSceRegMgr/Export.cpp +++ b/core/libs/prx/libSceRegMgr/Export.cpp @@ -399,4 +399,10 @@ int APS5_VABI sceRegMgrPrintInfo(void) { return 0; } +int APS5_VABI sceRegMgrUnknown_001_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("HGxgXwGSAzQ", sceRegMgrUnknown_001_nid_no_patch); + } diff --git a/core/libs/prx/libSceRegMgr/InventoryExports.cpp b/core/libs/prx/libSceRegMgr/InventoryExports.cpp new file mode 100644 index 000000000000..7830cdafa9ac --- /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/libSceRemotePlayClientIpc/Export.cpp b/core/libs/prx/libSceRemotePlayClientIpc/Export.cpp index d81f4a5e32c4..9d0badd408ee 100644 --- a/core/libs/prx/libSceRemotePlayClientIpc/Export.cpp +++ b/core/libs/prx/libSceRemotePlayClientIpc/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceRemotePlayClientIpc/include/InventoryExports.hpp" #include #include #include "SceTypes.hpp" @@ -8,3 +10,91 @@ extern "C" { APS5_DUMMY_FUN } + +extern "C" { + +int APS5_VABI sceRemotePlayClientIpcGetClientStatus() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceRemotePlayClientIpcInitialize() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceRemotePlayClientIpcSetClientStatus() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceRemotePlayClientIpcTerminateStreaming() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceRemotePlayClientIpcTerminate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceRemotePlayClientIpcWaitConnectionAsync() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI libSceRemotePlayClientIpcUnknown_0Ezd4jv7F_minus_4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0Ezd4jv7F-4", libSceRemotePlayClientIpcUnknown_0Ezd4jv7F_minus_4_nid_no_patch); + +int APS5_VABI libSceRemotePlayClientIpcUnknown_2dzIQ1US7Ag_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("2dzIQ1US7Ag", libSceRemotePlayClientIpcUnknown_2dzIQ1US7Ag_nid_no_patch); + +int APS5_VABI libSceRemotePlayClientIpcUnknown_4_plus_sKR9yWkWY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("4+sKR9yWkWY", libSceRemotePlayClientIpcUnknown_4_plus_sKR9yWkWY_nid_no_patch); + +int APS5_VABI libSceRemotePlayClientIpcUnknown_EVbYn8UOvMs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("EVbYn8UOvMs", libSceRemotePlayClientIpcUnknown_EVbYn8UOvMs_nid_no_patch); + +int APS5_VABI libSceRemotePlayClientIpcUnknown_JGKtr0_plus_B87A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JGKtr0+B87A", libSceRemotePlayClientIpcUnknown_JGKtr0_plus_B87A_nid_no_patch); + +int APS5_VABI libSceRemotePlayClientIpcUnknown_JVKO2gPlWPw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JVKO2gPlWPw", libSceRemotePlayClientIpcUnknown_JVKO2gPlWPw_nid_no_patch); + +int APS5_VABI libSceRemotePlayClientIpcUnknown_M16_minus_T2ERA8c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("M16-T2ERA8c", libSceRemotePlayClientIpcUnknown_M16_minus_T2ERA8c_nid_no_patch); + +int APS5_VABI libSceRemotePlayClientIpcUnknown_PnLBwmAGb_minus_g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("PnLBwmAGb-g", libSceRemotePlayClientIpcUnknown_PnLBwmAGb_minus_g_nid_no_patch); + +int APS5_VABI libSceRemotePlayClientIpcUnknown_RiyUwZBmS_minus_k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RiyUwZBmS-k", libSceRemotePlayClientIpcUnknown_RiyUwZBmS_minus_k_nid_no_patch); + +int APS5_VABI libSceRemotePlayClientIpcUnknown_a3LqZtr60o4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("a3LqZtr60o4", libSceRemotePlayClientIpcUnknown_a3LqZtr60o4_nid_no_patch); + +int APS5_VABI libSceRemotePlayClientIpcUnknown_gO3jwkOQ834_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gO3jwkOQ834", libSceRemotePlayClientIpcUnknown_gO3jwkOQ834_nid_no_patch); + +int APS5_VABI libSceRemotePlayClientIpcUnknown_gqmq4cTnR0M_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("gqmq4cTnR0M", libSceRemotePlayClientIpcUnknown_gqmq4cTnR0M_nid_no_patch); + +} diff --git a/core/libs/prx/libSceRemotePlayClientIpc/include/InventoryExports.hpp b/core/libs/prx/libSceRemotePlayClientIpc/include/InventoryExports.hpp new file mode 100644 index 000000000000..a53e5d938c9c --- /dev/null +++ b/core/libs/prx/libSceRemotePlayClientIpc/include/InventoryExports.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceRemotePlayClientIpcGetClientStatus(); +int APS5_VABI sceRemotePlayClientIpcInitialize(); +int APS5_VABI sceRemotePlayClientIpcSetClientStatus(); +int APS5_VABI sceRemotePlayClientIpcTerminateStreaming(); +int APS5_VABI sceRemotePlayClientIpcTerminate(); +int APS5_VABI sceRemotePlayClientIpcWaitConnectionAsync(); +int APS5_VABI libSceRemotePlayClientIpcUnknown_0Ezd4jv7F_minus_4_nid_no_patch(); +int APS5_VABI libSceRemotePlayClientIpcUnknown_2dzIQ1US7Ag_nid_no_patch(); +int APS5_VABI libSceRemotePlayClientIpcUnknown_4_plus_sKR9yWkWY_nid_no_patch(); +int APS5_VABI libSceRemotePlayClientIpcUnknown_EVbYn8UOvMs_nid_no_patch(); +int APS5_VABI libSceRemotePlayClientIpcUnknown_JGKtr0_plus_B87A_nid_no_patch(); +int APS5_VABI libSceRemotePlayClientIpcUnknown_JVKO2gPlWPw_nid_no_patch(); +int APS5_VABI libSceRemotePlayClientIpcUnknown_M16_minus_T2ERA8c_nid_no_patch(); +int APS5_VABI libSceRemotePlayClientIpcUnknown_PnLBwmAGb_minus_g_nid_no_patch(); +int APS5_VABI libSceRemotePlayClientIpcUnknown_RiyUwZBmS_minus_k_nid_no_patch(); +int APS5_VABI libSceRemotePlayClientIpcUnknown_a3LqZtr60o4_nid_no_patch(); +int APS5_VABI libSceRemotePlayClientIpcUnknown_gO3jwkOQ834_nid_no_patch(); +int APS5_VABI libSceRemotePlayClientIpcUnknown_gqmq4cTnR0M_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceRemotePlayClientIpc/libSceRemotePlayClientIpc.hpp b/core/libs/prx/libSceRemotePlayClientIpc/libSceRemotePlayClientIpc.hpp index 6f70f09beec2..62da2d57c34c 100644 --- a/core/libs/prx/libSceRemotePlayClientIpc/libSceRemotePlayClientIpc.hpp +++ b/core/libs/prx/libSceRemotePlayClientIpc/libSceRemotePlayClientIpc.hpp @@ -1 +1,2 @@ #pragma once +#include "prx/libSceRemotePlayClientIpc/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceRemoteplay/Export.cpp b/core/libs/prx/libSceRemoteplay/Export.cpp index fbc5a0351f42..c5544cba3e93 100644 --- a/core/libs/prx/libSceRemoteplay/Export.cpp +++ b/core/libs/prx/libSceRemoteplay/Export.cpp @@ -1,13 +1,30 @@ +#include "prx/libc/include/general/ExportMacros.hpp" #include "prx/libSceRemoteplay/include/InventoryExports.hpp" #include "prx/libSceRemoteplay/include/Api.hpp" #include #include -#include -#include +#include #include "SceTypes.hpp" #include "prx/libc/include/General.hpp" constexpr int REMOTEPLAY_CONNECTION_STATUS_DISCONNECT = 0; +constexpr int REMOTEPLAY_ERROR_INVALID_ARG = static_cast(0x80FC0001); +constexpr int REMOTEPLAY_ERROR_ALREADY_INITIALIZED = static_cast(0x80FC0003); +constexpr int REMOTEPLAY_ERROR_NOT_INITIALIZED = static_cast(0x80FC0004); +constexpr std::size_t REMOTEPLAY_MINIMUM_HEAP_SIZE = 0x1800; + +namespace { + +enum class RemoteplayState : std::uint32_t { + None, + Terminated, + Initialized, +}; + +std::mutex g_stateMutex; +RemoteplayState g_state = RemoteplayState::None; + +} extern "C" { @@ -30,17 +47,25 @@ int APS5_VABI sceRemoteplayUnregistCallback() { int APS5_VABI sceRemoteplayGetConnectionStatus(int user_id, int* status) { (void)user_id; - if (!status) APS5_INVALID_ARG_EX; + std::lock_guard lock(g_stateMutex); + if (g_state != RemoteplayState::Initialized) return REMOTEPLAY_ERROR_NOT_INITIALIZED; + if (!status) return REMOTEPLAY_ERROR_INVALID_ARG; *status = REMOTEPLAY_CONNECTION_STATUS_DISCONNECT; return 0; } int APS5_VABI sceRemoteplayInitialize(void* heap, size_t heap_size) { - if (!heap || heap_size == 0) APS5_INVALID_ARG_EX; + std::lock_guard lock(g_stateMutex); + if (g_state == RemoteplayState::Initialized) return REMOTEPLAY_ERROR_ALREADY_INITIALIZED; + if (heap && heap_size < REMOTEPLAY_MINIMUM_HEAP_SIZE) return REMOTEPLAY_ERROR_INVALID_ARG; + g_state = RemoteplayState::Initialized; return 0; } int APS5_VABI sceRemoteplayTerminate(void) { + std::lock_guard lock(g_stateMutex); + if (g_state != RemoteplayState::Initialized) return REMOTEPLAY_ERROR_NOT_INITIALIZED; + g_state = RemoteplayState::Terminated; return 0; } @@ -239,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 8b7845baefbe..349a78079200 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/libSceResourceArbitrator/Export.cpp b/core/libs/prx/libSceResourceArbitrator/Export.cpp index d81f4a5e32c4..20f0507d9ee3 100644 --- a/core/libs/prx/libSceResourceArbitrator/Export.cpp +++ b/core/libs/prx/libSceResourceArbitrator/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceResourceArbitrator/include/InventoryExports.hpp" #include #include #include "SceTypes.hpp" @@ -8,3 +10,70 @@ extern "C" { APS5_DUMMY_FUN } + +extern "C" { + +int APS5_VABI sceResourceArbitratorChangeState() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceResourceArbitratorClearCallback() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceResourceArbitratorGetFeatureIdList() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceResourceArbitratorIsExecutable() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceResourceArbitratorSetCallback() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI libSceResourceArbitratorUnknown_3xRoVp7fPPY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3xRoVp7fPPY", libSceResourceArbitratorUnknown_3xRoVp7fPPY_nid_no_patch); + +int APS5_VABI sceResourceArbitratorPostTelemetry() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI libSceResourceArbitratorUnknown_OM6SXhDZdiU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OM6SXhDZdiU", libSceResourceArbitratorUnknown_OM6SXhDZdiU_nid_no_patch); + +int APS5_VABI libSceResourceArbitratorUnknown_TYiIrKTzQ8s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("TYiIrKTzQ8s", libSceResourceArbitratorUnknown_TYiIrKTzQ8s_nid_no_patch); + +int APS5_VABI libSceResourceArbitratorUnknown_cT1vA0DTMcs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("cT1vA0DTMcs", libSceResourceArbitratorUnknown_cT1vA0DTMcs_nid_no_patch); + +int APS5_VABI libSceResourceArbitratorUnknown_jzKwHzhEBIQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("jzKwHzhEBIQ", libSceResourceArbitratorUnknown_jzKwHzhEBIQ_nid_no_patch); + +int APS5_VABI sceResourceArbitratorSendDebugFunction() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI libSceResourceArbitratorUnknown_rMJnXXj6GIo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("rMJnXXj6GIo", libSceResourceArbitratorUnknown_rMJnXXj6GIo_nid_no_patch); + +int APS5_VABI libSceResourceArbitratorUnknown_ru9qkt9UCLQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ru9qkt9UCLQ", libSceResourceArbitratorUnknown_ru9qkt9UCLQ_nid_no_patch); + +} diff --git a/core/libs/prx/libSceResourceArbitrator/include/InventoryExports.hpp b/core/libs/prx/libSceResourceArbitrator/include/InventoryExports.hpp new file mode 100644 index 000000000000..46284cd577e9 --- /dev/null +++ b/core/libs/prx/libSceResourceArbitrator/include/InventoryExports.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceResourceArbitratorChangeState(); +int APS5_VABI sceResourceArbitratorClearCallback(); +int APS5_VABI sceResourceArbitratorGetFeatureIdList(); +int APS5_VABI sceResourceArbitratorIsExecutable(); +int APS5_VABI sceResourceArbitratorSetCallback(); +int APS5_VABI libSceResourceArbitratorUnknown_3xRoVp7fPPY_nid_no_patch(); +int APS5_VABI sceResourceArbitratorPostTelemetry(); +int APS5_VABI libSceResourceArbitratorUnknown_OM6SXhDZdiU_nid_no_patch(); +int APS5_VABI libSceResourceArbitratorUnknown_TYiIrKTzQ8s_nid_no_patch(); +int APS5_VABI libSceResourceArbitratorUnknown_cT1vA0DTMcs_nid_no_patch(); +int APS5_VABI libSceResourceArbitratorUnknown_jzKwHzhEBIQ_nid_no_patch(); +int APS5_VABI sceResourceArbitratorSendDebugFunction(); +int APS5_VABI libSceResourceArbitratorUnknown_rMJnXXj6GIo_nid_no_patch(); +int APS5_VABI libSceResourceArbitratorUnknown_ru9qkt9UCLQ_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceResourceArbitrator/libSceResourceArbitrator.hpp b/core/libs/prx/libSceResourceArbitrator/libSceResourceArbitrator.hpp index 6f70f09beec2..de61ff38209d 100644 --- a/core/libs/prx/libSceResourceArbitrator/libSceResourceArbitrator.hpp +++ b/core/libs/prx/libSceResourceArbitrator/libSceResourceArbitrator.hpp @@ -1 +1,2 @@ #pragma once +#include "prx/libSceResourceArbitrator/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceRnpsAppMgr/Export.cpp b/core/libs/prx/libSceRnpsAppMgr/Export.cpp index 389f33546a61..7bb79af33d0f 100644 --- a/core/libs/prx/libSceRnpsAppMgr/Export.cpp +++ b/core/libs/prx/libSceRnpsAppMgr/Export.cpp @@ -51,11 +51,23 @@ int APS5_VABI sceRnpsAppMgrGetAppInfoList() { return 0; } +int APS5_VABI sceRnpsAppMgrGetEvent() { + NotImplemented_nid_no_patch(__func__); +} + int APS5_VABI sceRnpsAppMgrGetEventForShellUI() { NotImplemented_nid_no_patch(__func__); return 0; } +int APS5_VABI sceRnpsAppMgrGetMboInfo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceRnpsAppMgrGetMboManifestDebugString() { + NotImplemented_nid_no_patch(__func__); +} + int APS5_VABI sceRnpsAppMgrGetUpdateProgress() { NotImplemented_nid_no_patch(__func__); return 0; @@ -71,6 +83,18 @@ int APS5_VABI sceRnpsAppMgrInitialize() { return 0; } +int APS5_VABI sceRnpsAppMgrIsBgsInstallReady() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceRnpsAppMgrIsCrlUpdated() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceRnpsAppMgrIsMboUpdated() { + NotImplemented_nid_no_patch(__func__); +} + int APS5_VABI sceRnpsAppMgrPushEventForShellUI() { NotImplemented_nid_no_patch(__func__); return 0; @@ -140,5 +164,13 @@ int APS5_VABI sceRnpsAppMgrUnregisterShellUI() { NotImplemented_nid_no_patch(__func__); return 0; } +int APS5_VABI sceRnpsAppMgrVerifyApp() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceRnpsAppMgrVerifyFileInApp() { + NotImplemented_nid_no_patch(__func__); +} + } diff --git a/core/libs/prx/libSceRnpsAppMgr/include/Api.hpp b/core/libs/prx/libSceRnpsAppMgr/include/Api.hpp index 95fc2a3856a8..8fba87c22b96 100644 --- a/core/libs/prx/libSceRnpsAppMgr/include/Api.hpp +++ b/core/libs/prx/libSceRnpsAppMgr/include/Api.hpp @@ -13,10 +13,16 @@ int APS5_VABI sceRnpsAppMgrFinishUrlRequest(); int APS5_VABI sceRnpsAppMgrGetAppInfo(); int APS5_VABI sceRnpsAppMgrGetAppInfoDebugString(); int APS5_VABI sceRnpsAppMgrGetAppInfoList(); +int APS5_VABI sceRnpsAppMgrGetEvent(); int APS5_VABI sceRnpsAppMgrGetEventForShellUI(); +int APS5_VABI sceRnpsAppMgrGetMboInfo(); +int APS5_VABI sceRnpsAppMgrGetMboManifestDebugString(); int APS5_VABI sceRnpsAppMgrGetUpdateProgress(); int APS5_VABI sceRnpsAppMgrHasEventForShellUI(); int APS5_VABI sceRnpsAppMgrInitialize(); +int APS5_VABI sceRnpsAppMgrIsBgsInstallReady(); +int APS5_VABI sceRnpsAppMgrIsCrlUpdated(); +int APS5_VABI sceRnpsAppMgrIsMboUpdated(); int APS5_VABI sceRnpsAppMgrPushEventForShellUI(); int APS5_VABI sceRnpsAppMgrRecoverUfsImage(); int APS5_VABI sceRnpsAppMgrRegisterShellUI(); @@ -31,5 +37,7 @@ int APS5_VABI sceRnpsAppMgrStartService(); int APS5_VABI sceRnpsAppMgrTerminate(); int APS5_VABI sceRnpsAppMgrUnblockAppInstall(); int APS5_VABI sceRnpsAppMgrUnregisterShellUI(); +int APS5_VABI sceRnpsAppMgrVerifyApp(); +int APS5_VABI sceRnpsAppMgrVerifyFileInApp(); } diff --git a/core/libs/prx/libSceRudp/CMakeLists.txt b/core/libs/prx/libSceRudp/CMakeLists.txt index 2f8f0c7420ff..435a336abcbe 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 41955952c5c1..ec5c912c845b 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,4 +604,19 @@ int APS5_VABI sceRudpSetMaxSegmentSize(uint16_t mss) { return 0; } +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 ef5db9da08fc..9a7f2706b2e6 100644 --- a/core/libs/prx/libSceRudp/include/Api.hpp +++ b/core/libs/prx/libSceRudp/include/Api.hpp @@ -35,10 +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 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 7d1e1e0c55f4..1d30e2d53602 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 f459e56eceb1..644b421f494e 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 @@ -303,8 +304,9 @@ int APS5_VABI sceSaveDataBackup(const SaveDataBackup* backup) { if (backup == nullptr || backup->dir_name == nullptr) { return SAVE_DATA_ERROR_PARAMETER; } - // The system copies the save directory to its backup area asynchronously; the copy itself is - // not observable by the title, only its completion event. + if (std::memchr(backup->dir_name->data, '\0', sizeof(backup->dir_name->data)) == nullptr) { + return SAVE_DATA_ERROR_PARAMETER; + } SaveDataEvent event{}; event.type = SAVE_DATA_EVENT_TYPE_BACKUP; event.error_code = SAVE_DATA_OK; @@ -331,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; @@ -360,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); } @@ -384,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; @@ -393,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) { @@ -418,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) { @@ -632,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; @@ -650,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; } @@ -662,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; @@ -676,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; } @@ -1066,8 +1134,10 @@ int APS5_VABI sceSaveDataDebugTarget() { } int APS5_VABI sceSaveDataAbort() { - NotImplemented_nid_no_patch(__func__); - return 0; + if (g_initializations == 0) { + return SAVE_DATA_ERROR_NOT_INITIALIZED; + } + return SAVE_DATA_OK; } int APS5_VABI sceSaveDataBindPsnAccount(void) { @@ -1131,8 +1201,10 @@ int APS5_VABI sceSaveDataCheckSaveDataVersionLatest(void) { } int APS5_VABI sceSaveDataClearProgress() { - NotImplemented_nid_no_patch(__func__); - return 0; + if (g_initializations == 0) { + return SAVE_DATA_ERROR_NOT_INITIALIZED; + } + return SAVE_DATA_OK; } int APS5_VABI sceSaveDataCreateUploadData(void) { @@ -1395,6 +1467,34 @@ int APS5_VABI sceSaveDataUpload(void) { return 0; } +int APS5_VABI sceSaveDataCheckPremiumMember() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSaveDataCheckSyncStatus() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSaveDataGetAllSizeProspero() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSaveDataGetAutoSyncInfo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSaveDataGetCloudInfo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSaveDataNotifySaveDataDownload() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSaveDataSetAutoSyncSettings() { + NotImplemented_nid_no_patch(__func__); +} + } namespace { diff --git a/core/libs/prx/libSceSaveData.native/SaveData.hpp b/core/libs/prx/libSceSaveData.native/SaveData.hpp index 1a8681cb38cc..b8d2b8a1f9cb 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 000000000000..d52ea04e6dd4 --- /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 ed878f0e320c..ecde5e9dc3c5 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 000000000000..763882320953 --- /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/Api.hpp b/core/libs/prx/libSceSaveData/include/Api.hpp index 88067a68e56d..60fe67e664d5 100644 --- a/core/libs/prx/libSceSaveData/include/Api.hpp +++ b/core/libs/prx/libSceSaveData/include/Api.hpp @@ -79,5 +79,12 @@ int APS5_VABI sceSaveDataUmountSys(void); int APS5_VABI sceSaveDataUmountWithBackup(void); int APS5_VABI sceSaveDataUnregisterEventCallback(); int APS5_VABI sceSaveDataUpload(void); +int APS5_VABI sceSaveDataCheckPremiumMember(); +int APS5_VABI sceSaveDataCheckSyncStatus(); +int APS5_VABI sceSaveDataGetAllSizeProspero(); +int APS5_VABI sceSaveDataGetAutoSyncInfo(); +int APS5_VABI sceSaveDataGetCloudInfo(); +int APS5_VABI sceSaveDataNotifySaveDataDownload(); +int APS5_VABI sceSaveDataSetAutoSyncSettings(); } diff --git a/core/libs/prx/libSceSaveData/include/InventoryExports.hpp b/core/libs/prx/libSceSaveData/include/InventoryExports.hpp new file mode 100644 index 000000000000..106add58aed3 --- /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 72713a0e1f05..5b29b59e4612 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 e2f486e7f12f..3076aa435586 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 000000000000..8c451202d59e --- /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 ee79c2f96a81..e9a283210fe0 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 d81f4a5e32c4..c698fcb3210e 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 000000000000..dfeff88cf81c --- /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 6f70f09beec2..b969840f3b89 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 a19d94eb98ec..b9c1c1936e5f 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 @@ -131,4 +133,32 @@ int APS5_VABI sceSharePlayStopStreaming(void) { return 0; } +int APS5_VABI sceSharePlaySetShareScreenStatus() { + NotImplemented_nid_no_patch(__func__); +} + +} + +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/Api.hpp b/core/libs/prx/libSceSharePlay/include/Api.hpp index 317c0dc43c5a..a02ab4885f06 100644 --- a/core/libs/prx/libSceSharePlay/include/Api.hpp +++ b/core/libs/prx/libSceSharePlay/include/Api.hpp @@ -24,5 +24,6 @@ int APS5_VABI sceSharePlayStartStandby(void); int APS5_VABI sceSharePlayStartStreaming(void); int APS5_VABI sceSharePlayStopStandby(void); int APS5_VABI sceSharePlayStopStreaming(void); +int APS5_VABI sceSharePlaySetShareScreenStatus(); } diff --git a/core/libs/prx/libSceSharePlay/include/InventoryExports.hpp b/core/libs/prx/libSceSharePlay/include/InventoryExports.hpp new file mode 100644 index 000000000000..696f0d7b2307 --- /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 c68e51972057..22f3a4b12cde 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/libSceShellUIUtil/Export.cpp b/core/libs/prx/libSceShellUIUtil/Export.cpp index 3381c8bd7f57..3f70af2a7093 100644 --- a/core/libs/prx/libSceShellUIUtil/Export.cpp +++ b/core/libs/prx/libSceShellUIUtil/Export.cpp @@ -6,6 +6,10 @@ extern "C" { +int APS5_VABI sceShellUIUtilAbortTask() { + NotImplemented_nid_no_patch(__func__); +} + int APS5_VABI sceShellUIUtilCreateTaskToken() { NotImplemented_nid_no_patch(__func__); return 0; diff --git a/core/libs/prx/libSceShellUIUtil/include/Api.hpp b/core/libs/prx/libSceShellUIUtil/include/Api.hpp index fe2e641916c3..c6a30ddb23b3 100644 --- a/core/libs/prx/libSceShellUIUtil/include/Api.hpp +++ b/core/libs/prx/libSceShellUIUtil/include/Api.hpp @@ -6,6 +6,7 @@ struct ShellUIUtilLaunchParameter; extern "C" { +int APS5_VABI sceShellUIUtilAbortTask(); int APS5_VABI sceShellUIUtilCreateTaskToken(); int APS5_VABI sceShellUIUtilGetAppUrl(const char* application, const char* parameter, char* output, std::uint32_t capacity, std::uint32_t* outputSize); int APS5_VABI sceShellUIUtilInitialize(); diff --git a/core/libs/prx/libSceSocialScreen/CMakeLists.txt b/core/libs/prx/libSceSocialScreen/CMakeLists.txt new file mode 100644 index 000000000000..f9de227cc90f --- /dev/null +++ b/core/libs/prx/libSceSocialScreen/CMakeLists.txt @@ -0,0 +1,15 @@ +add_library(libSceSocialScreen SHARED EXCLUDE_FROM_ALL Export.cpp) +target_include_directories(libSceSocialScreen PRIVATE ${LIBS_INCLUDE_DIR}) +configure_windows_unwind(libSceSocialScreen) + +if(BUILD_TESTING) + add_test_executable(guest_social_screen_tests ${LIBS_INCLUDE_DIR}/tests/GuestSocialScreen.cpp) + target_include_directories(guest_social_screen_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_social_screen_tests PRIVATE libSceSocialScreen) + configure_windows_unwind(guest_social_screen_tests) + add_test(NAME guest_social_screen COMMAND guest_social_screen_tests) + if(WIN32) + set_tests_properties(guest_social_screen PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceSocialScreen/Export.cpp b/core/libs/prx/libSceSocialScreen/Export.cpp index 31e90003c84e..80e06e00950c 100644 --- a/core/libs/prx/libSceSocialScreen/Export.cpp +++ b/core/libs/prx/libSceSocialScreen/Export.cpp @@ -1,6 +1,7 @@ #include "prx/libSceSocialScreen/include/Api.hpp" #include #include +#include #include "SceTypes.hpp" #include "prx/libc/include/General.hpp" @@ -31,8 +32,12 @@ int APS5_VABI sceSocialScreenInitialize() { return 0; } -int APS5_VABI sceSocialScreenInitializeSeparateModeParameter() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI sceSocialScreenInitializeSeparateModeParameter(void* parameter) { + if (parameter == nullptr) return static_cast(0x81440003); + auto* bytes = static_cast(parameter); + const std::uint32_t at0 = 1; + std::memcpy(bytes, &at0, sizeof(at0)); + std::memset(bytes + 4, 0, 0x1c); return 0; } diff --git a/core/libs/prx/libSceSocialScreen/include/Api.hpp b/core/libs/prx/libSceSocialScreen/include/Api.hpp index 77d98b1b8530..73f64ef0695f 100644 --- a/core/libs/prx/libSceSocialScreen/include/Api.hpp +++ b/core/libs/prx/libSceSocialScreen/include/Api.hpp @@ -9,7 +9,7 @@ int APS5_VABI sceSocialScreenConfigureSeparateMode(); int APS5_VABI sceSocialScreenCrashDaemon(); int APS5_VABI sceSocialScreenGetIgnoreSeparateMode(); int APS5_VABI sceSocialScreenInitialize(); -int APS5_VABI sceSocialScreenInitializeSeparateModeParameter(); +int APS5_VABI sceSocialScreenInitializeSeparateModeParameter(void* parameter); int APS5_VABI sceSocialScreenOpenSeparateMode(); int APS5_VABI sceSocialScreenReserveHighFrameRateVideoCaptureRequest(); int APS5_VABI sceSocialScreenSetIgnoreSeparateMode(); diff --git a/core/libs/prx/libSceSrcUtl/Export.cpp b/core/libs/prx/libSceSrcUtl/Export.cpp index 3494cee76bef..458ab04dab8b 100644 --- a/core/libs/prx/libSceSrcUtl/Export.cpp +++ b/core/libs/prx/libSceSrcUtl/Export.cpp @@ -1,11 +1,53 @@ #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() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSrcUtilityDeleteEx() { + NotImplemented_nid_no_patch(__func__); +} + int APS5_VABI sceSrcUtilityFinalize() { NotImplemented_nid_no_patch(__func__); return 0; @@ -16,18 +58,27 @@ int APS5_VABI sceSrcUtilityFlush() { return 0; } -int APS5_VABI sceSrcUtilityGetDelaySamples() { +int APS5_VABI sceSrcUtilityGetAjmContext() { NotImplemented_nid_no_patch(__func__); - return 0; } -int APS5_VABI sceSrcUtilityGetHandleSize() { +int APS5_VABI sceSrcUtilityGetDelaySamples() { NotImplemented_nid_no_patch(__func__); return 0; } -int APS5_VABI sceSrcUtilityGetPriority() { - NotImplemented_nid_no_patch(__func__); +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(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; } @@ -46,9 +97,14 @@ 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() { + NotImplemented_nid_no_patch(__func__); +} + } diff --git a/core/libs/prx/libSceSrcUtl/include/Api.hpp b/core/libs/prx/libSceSrcUtl/include/Api.hpp index b4db4c7c48fd..54c7c8e52368 100644 --- a/core/libs/prx/libSceSrcUtl/include/Api.hpp +++ b/core/libs/prx/libSceSrcUtl/include/Api.hpp @@ -4,14 +4,18 @@ extern "C" { +int APS5_VABI sceSrcUtilityCreateEx(); +int APS5_VABI sceSrcUtilityDeleteEx(); 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 7758a11ed7cc..cf7e65149cf1 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 @@ -297,4 +299,61 @@ int APS5_VABI sceSysCoreReceiveEvent() { NotImplemented_nid_no_patch(__func__); return 0; } + +int APS5_VABI sceApplicationExitSpawn3() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceApplicationKickCoredump3() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceApplicationNotifyUnmountForExitSpawn() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceApplicationSendResultOfDebuggerRestoreRequest() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceApplicationSendResultOfDebuggerSaveRequest() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceApplicationSwitchToPprNativeMode() { + NotImplemented_nid_no_patch(__func__); +} + +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/Api.hpp b/core/libs/prx/libSceSysCore/include/Api.hpp index 8f3529042cb9..2a523d8ceb2a 100644 --- a/core/libs/prx/libSceSysCore/include/Api.hpp +++ b/core/libs/prx/libSceSysCore/include/Api.hpp @@ -82,4 +82,12 @@ int APS5_VABI sceApplictionGetStateForDebugger(); int APS5_VABI sceSysCoreGetEventCount(); int APS5_VABI sceSysCoreReceiveEvent(); +int APS5_VABI sceApplicationExitSpawn3(); +int APS5_VABI sceApplicationKickCoredump3(); +int APS5_VABI sceApplicationNotifyUnmountForExitSpawn(); +int APS5_VABI sceApplicationSendResultOfDebuggerRestoreRequest(); +int APS5_VABI sceApplicationSendResultOfDebuggerSaveRequest(); +int APS5_VABI sceApplicationSwitchToPprNativeMode(); +int APS5_VABI sceApplicationSwitchToPprNativeMode2(); + } diff --git a/core/libs/prx/libSceSysCore/include/InventoryExports.hpp b/core/libs/prx/libSceSysCore/include/InventoryExports.hpp new file mode 100644 index 000000000000..e1d0fbe78315 --- /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 c0d6d0db4815..4b30ea9181ae 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 b03a2433c9ce..f8c08ca0986f 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/Export.cpp b/core/libs/prx/libSceSysmodule/Export.cpp index c95e6793c0a3..72f6ab0f89e4 100644 --- a/core/libs/prx/libSceSysmodule/Export.cpp +++ b/core/libs/prx/libSceSysmodule/Export.cpp @@ -17,7 +17,7 @@ #include #include #include -#else +#elif !defined(__EMSCRIPTEN__) #include "prx/libc/include/specifics/linux/HostMapping.hpp" #endif @@ -149,6 +149,8 @@ bool fillModuleInfoForUnwind(std::uint64_t addr, ModuleInfoForUnwind* info) { info->seg0_addr = region; info->seg0_size = size; return true; +#elif defined(__EMSCRIPTEN__) + return sceKernelGetModuleInfoForUnwind(addr, 0, info) == 0; #else const auto mapping = HostMapping::Find(addr, "sceSysmoduleGetModuleInfoForUnwind"); if (!mapping) { diff --git a/core/libs/prx/libSceSysmodule/InventoryExports.cpp b/core/libs/prx/libSceSysmodule/InventoryExports.cpp new file mode 100644 index 000000000000..3eae1db75737 --- /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 056318a3a4a5..ac06a3cb0193 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 000000000000..9ec54a0a0174 --- /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 1e6ac94f6a4f..cc676856f9d2 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 860ef6304606..ccf931d52cf2 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 @@ -31,4 +33,47 @@ int APS5_VABI sceSystemLogger2Terminate() { return 0; } +int APS5_VABI sceSystemLogger2GetEventStatus() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSystemLogger2IsAvailableMonitor() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSystemLogger2TerminateWithResourceRelease() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSystemLogger2SetEventAsyncEx2() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSystemLogger2SetRnpsEventAsync() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSystemLogger2SetEventAsyncInternal() { + NotImplemented_nid_no_patch(__func__); +} + +} + +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/Api.hpp b/core/libs/prx/libSceSystemLogger2/include/Api.hpp index 4b8e19eaf036..49a5d8303e65 100644 --- a/core/libs/prx/libSceSystemLogger2/include/Api.hpp +++ b/core/libs/prx/libSceSystemLogger2/include/Api.hpp @@ -10,4 +10,11 @@ int APS5_VABI sceSystemLogger2SetEventAsync(); int APS5_VABI sceSystemLogger2SetEventAsyncEx(); int APS5_VABI sceSystemLogger2Terminate(); +int APS5_VABI sceSystemLogger2GetEventStatus(); +int APS5_VABI sceSystemLogger2IsAvailableMonitor(); +int APS5_VABI sceSystemLogger2TerminateWithResourceRelease(); +int APS5_VABI sceSystemLogger2SetEventAsyncEx2(); +int APS5_VABI sceSystemLogger2SetRnpsEventAsync(); +int APS5_VABI sceSystemLogger2SetEventAsyncInternal(); + } diff --git a/core/libs/prx/libSceSystemLogger2/include/InventoryExports.hpp b/core/libs/prx/libSceSystemLogger2/include/InventoryExports.hpp new file mode 100644 index 000000000000..8d1308f1ba69 --- /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 931a124f245e..0b54e3de405c 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/libSceSystemLogger2Delivery/Export.cpp b/core/libs/prx/libSceSystemLogger2Delivery/Export.cpp index c01af333e1c8..32b62a462411 100644 --- a/core/libs/prx/libSceSystemLogger2Delivery/Export.cpp +++ b/core/libs/prx/libSceSystemLogger2Delivery/Export.cpp @@ -26,4 +26,16 @@ int APS5_VABI sceSystemLogger2DeliveryTerminate() { return 0; } +int APS5_VABI sceSystemLogger2DeliveryResume() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSystemLogger2DeliverySuspend() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSystemLogger2DeliveryInitialize() { + NotImplemented_nid_no_patch(__func__); +} + } diff --git a/core/libs/prx/libSceSystemLogger2Delivery/include/Api.hpp b/core/libs/prx/libSceSystemLogger2Delivery/include/Api.hpp index c0263701f71a..1a50f6367353 100644 --- a/core/libs/prx/libSceSystemLogger2Delivery/include/Api.hpp +++ b/core/libs/prx/libSceSystemLogger2Delivery/include/Api.hpp @@ -9,4 +9,8 @@ int APS5_VABI sceSystemLogger2DeliveryGetResult(); int APS5_VABI sceSystemLogger2DeliverySetBatchDeliveryEvent(); int APS5_VABI sceSystemLogger2DeliveryTerminate(); +int APS5_VABI sceSystemLogger2DeliveryResume(); +int APS5_VABI sceSystemLogger2DeliverySuspend(); +int APS5_VABI sceSystemLogger2DeliveryInitialize(); + } diff --git a/core/libs/prx/libSceSystemLogger2NativeQueueClient/Export.cpp b/core/libs/prx/libSceSystemLogger2NativeQueueClient/Export.cpp index ae54608dbed4..afbcd3a2ff27 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 @@ -31,4 +32,33 @@ int APS5_VABI sceSystemLogger2NativeQueueClientSetNativeQueueConfig() { return 0; } +int APS5_VABI sceSystemLogger2NativeQueueClientSetBatchDeliveryResult() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSystemLogger2NativeQueueClientSetEventFilter() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSystemLogger2NativeQueueClientCheckData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSystemLogger2NativeQueueClientGetEvent2() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSystemLogger2NativeQueueClientInitialize() { + NotImplemented_nid_no_patch(__func__); +} + +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 3631a92febdf..d6ea2e740b39 100644 --- a/core/libs/prx/libSceSystemLogger2NativeQueueClient/include/Api.hpp +++ b/core/libs/prx/libSceSystemLogger2NativeQueueClient/include/Api.hpp @@ -10,4 +10,13 @@ int APS5_VABI sceSystemLogger2NativeQueueClientSetDeliveryEnable(); int APS5_VABI sceSystemLogger2NativeQueueClientSetDeliveryResult(); int APS5_VABI sceSystemLogger2NativeQueueClientSetNativeQueueConfig(); +int APS5_VABI sceSystemLogger2NativeQueueClientSetBatchDeliveryResult(); +int APS5_VABI sceSystemLogger2NativeQueueClientSetEventFilter(); +int APS5_VABI sceSystemLogger2NativeQueueClientCheckData(); +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 9e0190d6ad10..1311faaac2aa 100644 --- a/core/libs/prx/libSceSystemService/CMakeLists.txt +++ b/core/libs/prx/libSceSystemService/CMakeLists.txt @@ -21,7 +21,7 @@ if(BUILD_TESTING) set_target_properties(guest_loadexec_host PROPERTIES PREFIX "" SUFFIX ".prx" BUILD_RPATH "$ORIGIN") configure_windows_unwind(guest_loadexec_host) find_package(Python3 COMPONENTS Interpreter QUIET) - if(Python3_FOUND) + if(Python3_FOUND AND ANYPS5_RELINKER_CLI) set(loadexecLibraries $ $ $ $ $) if(APS5_ENABLE_TRACY) list(APPEND loadexecLibraries $) @@ -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/Export.cpp b/core/libs/prx/libSceSystemService/Export.cpp index 6d3cf793af47..d6a112e49639 100644 --- a/core/libs/prx/libSceSystemService/Export.cpp +++ b/core/libs/prx/libSceSystemService/Export.cpp @@ -174,6 +174,7 @@ HostLaunch PrepareLaunch(const char* path, const char* const* arguments) { } void StartHostExecutable(HostLaunch& launch) { + LogFileRelease_nid_no_patch(); STARTUPINFOW startup{}; startup.cb = sizeof(startup); PROCESS_INFORMATION process{}; @@ -234,6 +235,7 @@ void StartHostExecutable(HostLaunch& launch) { if (const int host = HostStandardError_nid_no_patch(); host >= 0 && ::dup2(host, 2) != 2) { throw std::runtime_error("sceSystemServiceLoadExec: cannot give the host standard error back to descriptor 2: " + std::string(std::strerror(errno))); } + LogFileRelease_nid_no_patch(); ::execv(launch.executable.c_str(), argv.data()); throw std::runtime_error("sceSystemServiceLoadExec: execv failed: " + std::string(std::strerror(errno))); } diff --git a/core/libs/prx/libSceSystemService/LoadExec.cpp b/core/libs/prx/libSceSystemService/LoadExec.cpp index 82e0c2b3c492..939f1311815c 100644 --- a/core/libs/prx/libSceSystemService/LoadExec.cpp +++ b/core/libs/prx/libSceSystemService/LoadExec.cpp @@ -75,6 +75,7 @@ Handle Duplicate(HANDLE source, DWORD access) { } if (command.size() >= 32767) throw std::runtime_error("LoadExec: command line is too long"); auto parent = Duplicate(GetCurrentProcess(), SYNCHRONIZE); + LogFileRelease_nid_no_patch(); std::vector standard; std::vector handles{parent.get()}; STARTUPINFOEXW startup{}; @@ -164,6 +165,7 @@ Handle Duplicate(HANDLE source, DWORD access) { std::fflush(nullptr); if (const int host = HostStandardError_nid_no_patch(); host >= 0 && dup2(host, 2) != 2) throw std::system_error(errno, std::generic_category(), "LoadExec: giving the host standard error back to descriptor 2"); + LogFileRelease_nid_no_patch(); std::filesystem::current_path(target.parent_path()); if ((descriptor > 3 && close_range(3, static_cast(descriptor - 1), 0) != 0) || close_range(static_cast(std::max(3, descriptor + 1)), ~0u, 0) != 0) @@ -193,6 +195,7 @@ Handle Duplicate(HANDLE source, DWORD access) { std::fflush(nullptr); if (const int host = HostStandardError_nid_no_patch(); host >= 0 && dup2(host, 2) != 2) throw std::system_error(errno, std::generic_category(), "LoadExec: giving the host standard error back to descriptor 2"); + LogFileRelease_nid_no_patch(); for (const int standard : {STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO}) { if (fcntl(standard, F_GETFD) != -1 && posix_spawn_file_actions_addinherit_np(&actions, standard) != 0) throw std::runtime_error("LoadExec: keeping the standard streams"); diff --git a/core/libs/prx/libSceSystemService/PendingExports.cpp b/core/libs/prx/libSceSystemService/PendingExports.cpp index 21179c61184c..1e820338fa18 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 6c0120e66bc1..47b2c0e0dbbc 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 dc975b9b4a5b..bd8c49e25060 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 @@ -31,4 +33,29 @@ int APS5_VABI sceSystemTtsUnregisterCallback() { return 0; } +int APS5_VABI sceSystemTtsConvertText() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSystemTtsPauseResume() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSystemTtsRepeat() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceSystemTtsWait() { + NotImplemented_nid_no_patch(__func__); +} + +} + +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/Api.hpp b/core/libs/prx/libSceSystemTts/include/Api.hpp index d0942cfe3006..4d349b0d7b48 100644 --- a/core/libs/prx/libSceSystemTts/include/Api.hpp +++ b/core/libs/prx/libSceSystemTts/include/Api.hpp @@ -9,5 +9,9 @@ int APS5_VABI sceSystemTtsIsAccessibilityAvailable(); int APS5_VABI sceSystemTtsRegisterCallback(); int APS5_VABI sceSystemTtsSpeakRequest(); int APS5_VABI sceSystemTtsUnregisterCallback(); +int APS5_VABI sceSystemTtsConvertText(); +int APS5_VABI sceSystemTtsPauseResume(); +int APS5_VABI sceSystemTtsRepeat(); +int APS5_VABI sceSystemTtsWait(); } diff --git a/core/libs/prx/libSceSystemTts/include/InventoryExports.hpp b/core/libs/prx/libSceSystemTts/include/InventoryExports.hpp new file mode 100644 index 000000000000..6e3fb0437c46 --- /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 f2c384d4c4e8..4bd0decb6c32 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 71faf0cb5fa0..f550aa63e3c8 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 000000000000..fa490466d40e --- /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 7b3b5682b77b..254509fed02c 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 cd4a31d3f696..29790a5f2133 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 000000000000..faf8de09ec4c --- /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 0238da246a26..bda7c225c167 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/libSceTextToSpeech2/Export.cpp b/core/libs/prx/libSceTextToSpeech2/Export.cpp index 02aaefeadf86..4396ba5975ae 100644 --- a/core/libs/prx/libSceTextToSpeech2/Export.cpp +++ b/core/libs/prx/libSceTextToSpeech2/Export.cpp @@ -50,4 +50,28 @@ int APS5_VABI sceTextToSpeech2Terminate() { return SCE_KERNEL_ERROR_EOPNOTSUPP; } +int APS5_VABI sceTextToSpeech2ConvertTextInt() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceTextToSpeech2GetAudioInt() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceTextToSpeech2InitializeInt() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceTextToSpeech2OpenInt() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceTextToSpeech2RegisterTextConversionItem() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceTextToSpeech2SynthesizeInt() { + NotImplemented_nid_no_patch(__func__); +} + } diff --git a/core/libs/prx/libSceTextToSpeech2/include/Api.hpp b/core/libs/prx/libSceTextToSpeech2/include/Api.hpp index 23340118f7d1..a01a22393f84 100644 --- a/core/libs/prx/libSceTextToSpeech2/include/Api.hpp +++ b/core/libs/prx/libSceTextToSpeech2/include/Api.hpp @@ -34,5 +34,11 @@ int APS5_VABI sceTextToSpeech2GetSpeechStatus(std::int32_t* status); int APS5_VABI sceTextToSpeech2Open(const TextToSpeechOpenParameter* parameter); int APS5_VABI sceTextToSpeech2Speak(const TextToSpeechSpeakParameter* parameter); int APS5_VABI sceTextToSpeech2Terminate(); +int APS5_VABI sceTextToSpeech2ConvertTextInt(); +int APS5_VABI sceTextToSpeech2GetAudioInt(); +int APS5_VABI sceTextToSpeech2InitializeInt(); +int APS5_VABI sceTextToSpeech2OpenInt(); +int APS5_VABI sceTextToSpeech2RegisterTextConversionItem(); +int APS5_VABI sceTextToSpeech2SynthesizeInt(); } diff --git a/core/libs/prx/libSceTtsCoreG3Bc/Export.cpp b/core/libs/prx/libSceTtsCoreG3Bc/Export.cpp index d81f4a5e32c4..545cd35679e1 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 000000000000..b1fa3ccb29c5 --- /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 6f70f09beec2..2946b67d4a43 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 000000000000..334bf571addd --- /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 000000000000..0e253d57f1ae --- /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 000000000000..531463be1606 --- /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 000000000000..5f79df92ac06 --- /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 000000000000..fa15ef2a6490 --- /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 000000000000..4af25a44d614 --- /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 000000000000..2cdafa465c74 --- /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 000000000000..54e356209bac --- /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 000000000000..2de02b1b1ff7 --- /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/libSceUpdateService/Export.cpp b/core/libs/prx/libSceUpdateService/Export.cpp index d43476272614..3aef36ec2f5a 100644 --- a/core/libs/prx/libSceUpdateService/Export.cpp +++ b/core/libs/prx/libSceUpdateService/Export.cpp @@ -1,3 +1,5 @@ +#include "prx/libc/include/general/ExportMacros.hpp" +#include "prx/libSceUpdateService/include/InventoryExports.hpp" #include "prx/libSceUpdateService/include/Api.hpp" #include #include @@ -6,6 +8,10 @@ extern "C" { +int APS5_VABI sceUpsrvFlushHttpCookie() { + NotImplemented_nid_no_patch(__func__); +} + int APS5_VABI sceUpsrvGetCompletedTaskId() { NotImplemented_nid_no_patch(__func__); return 0; @@ -207,3 +213,73 @@ int APS5_VABI sceUpsrvVerifySystemExBank() { } } + +extern "C" { + +int APS5_VABI sceUpsrvDisableAutoInstall() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUpsrvEndUpdateSession() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUpsrvNotifyUpdatedEvent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUpsrvUpdateCheckDoCheckSystemWithDownloadTypeForSettings() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUpsrvUpdateCheckDoCheckSystemWithReleaseType() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUpsrvUpdateCheckIsTestPeriod() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUpsrvUpdateConfirmUpdate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUpsrvUpdateStartUpdateModeWithParam() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUpsrvUpdateStartUpdateMode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI libSceUpdateServiceUnknown_33Z2z4kXKq0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("33Z2z4kXKq0", libSceUpdateServiceUnknown_33Z2z4kXKq0_nid_no_patch); + +int APS5_VABI libSceUpdateServiceUnknown_ItlDmxWppec_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("ItlDmxWppec", libSceUpdateServiceUnknown_ItlDmxWppec_nid_no_patch); + +int APS5_VABI libSceUpdateServiceUnknown_SpnzKCdKA_plus_4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("SpnzKCdKA+4", libSceUpdateServiceUnknown_SpnzKCdKA_plus_4_nid_no_patch); + +int APS5_VABI libSceUpdateServiceUnknown_sEcvo34_plus_ihg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("sEcvo34+ihg", libSceUpdateServiceUnknown_sEcvo34_plus_ihg_nid_no_patch); + +int APS5_VABI libSceUpdateServiceUnknown_vrw9HD_minus_1Gs0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vrw9HD-1Gs0", libSceUpdateServiceUnknown_vrw9HD_minus_1Gs0_nid_no_patch); + +int APS5_VABI libSceUpdateServiceUnknown_yyy3cEojLOw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yyy3cEojLOw", libSceUpdateServiceUnknown_yyy3cEojLOw_nid_no_patch); + +} diff --git a/core/libs/prx/libSceUpdateService/include/Api.hpp b/core/libs/prx/libSceUpdateService/include/Api.hpp index 9dce013b86b5..0f746296295a 100644 --- a/core/libs/prx/libSceUpdateService/include/Api.hpp +++ b/core/libs/prx/libSceUpdateService/include/Api.hpp @@ -4,6 +4,8 @@ extern "C" { +int APS5_VABI sceUpsrvFlushHttpCookie(); + int APS5_VABI sceUpsrvGetCompletedTaskId(); int APS5_VABI sceUpsrvGetRebootFlag(); int APS5_VABI sceUpsrvGetSystemExUpdateTaskState(); diff --git a/core/libs/prx/libSceUpdateService/include/InventoryExports.hpp b/core/libs/prx/libSceUpdateService/include/InventoryExports.hpp new file mode 100644 index 000000000000..346329a82f7b --- /dev/null +++ b/core/libs/prx/libSceUpdateService/include/InventoryExports.hpp @@ -0,0 +1,23 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceUpsrvDisableAutoInstall(); +int APS5_VABI sceUpsrvEndUpdateSession(); +int APS5_VABI sceUpsrvNotifyUpdatedEvent(); +int APS5_VABI sceUpsrvUpdateCheckDoCheckSystemWithDownloadTypeForSettings(); +int APS5_VABI sceUpsrvUpdateCheckDoCheckSystemWithReleaseType(); +int APS5_VABI sceUpsrvUpdateCheckIsTestPeriod(); +int APS5_VABI sceUpsrvUpdateConfirmUpdate(); +int APS5_VABI sceUpsrvUpdateStartUpdateModeWithParam(); +int APS5_VABI sceUpsrvUpdateStartUpdateMode(); +int APS5_VABI libSceUpdateServiceUnknown_33Z2z4kXKq0_nid_no_patch(); +int APS5_VABI libSceUpdateServiceUnknown_ItlDmxWppec_nid_no_patch(); +int APS5_VABI libSceUpdateServiceUnknown_SpnzKCdKA_plus_4_nid_no_patch(); +int APS5_VABI libSceUpdateServiceUnknown_sEcvo34_plus_ihg_nid_no_patch(); +int APS5_VABI libSceUpdateServiceUnknown_vrw9HD_minus_1Gs0_nid_no_patch(); +int APS5_VABI libSceUpdateServiceUnknown_yyy3cEojLOw_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceUpdateService/libSceUpdateService.hpp b/core/libs/prx/libSceUpdateService/libSceUpdateService.hpp index 87a15733f7db..235f8be82699 100644 --- a/core/libs/prx/libSceUpdateService/libSceUpdateService.hpp +++ b/core/libs/prx/libSceUpdateService/libSceUpdateService.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libSceUpdateService/include/Api.hpp" +#include "prx/libSceUpdateService/include/InventoryExports.hpp" diff --git a/core/libs/prx/libSceUsbStorage/Export.cpp b/core/libs/prx/libSceUsbStorage/Export.cpp index ef68706db3a9..6a90d328d63e 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 @@ -232,6 +234,15 @@ std::uint64_t CopyString(char (&destination)[256], const std::string& text, cons extern "C" { +int APS5_VABI sceUsbStorageClearFakeMapLockForDebug() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceUsbStorageCheckSystemDefaultMountPoint() { + NotImplemented_nid_no_patch(__func__); +} + + std::int32_t APS5_VABI sceUsbStorageInit(void* attr) { if (attr != nullptr) throw std::runtime_error("sceUsbStorageInit: a thread attribute is not implemented"); auto& service = State(); @@ -556,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/UsbStorage.hpp b/core/libs/prx/libSceUsbStorage/UsbStorage.hpp index 3ccc495a6e3f..c34938caf918 100644 --- a/core/libs/prx/libSceUsbStorage/UsbStorage.hpp +++ b/core/libs/prx/libSceUsbStorage/UsbStorage.hpp @@ -49,6 +49,9 @@ struct UsbStorageDeviceInfo { using UsbStorageCallback = void (APS5_VABI *)(const UsbStorageEvent* event, void* userData); extern "C" { +int APS5_VABI sceUsbStorageClearFakeMapLockForDebug(); +int APS5_VABI sceUsbStorageCheckSystemDefaultMountPoint(); + std::int32_t APS5_VABI sceUsbStorageInit(void* attr); std::int32_t APS5_VABI sceUsbStorageTerm(void); std::int32_t APS5_VABI sceUsbStorageRegisterCallback(std::int32_t eventType, UsbStorageCallback callback, void* arg); diff --git a/core/libs/prx/libSceUsbStorage/include/InventoryExports.hpp b/core/libs/prx/libSceUsbStorage/include/InventoryExports.hpp new file mode 100644 index 000000000000..dd1b085d4804 --- /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 bf3486516077..7a988104e288 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 282c8e98a35e..ee3f746eb4f6 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 07a31f1f56ab..fab4886e27cb 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; @@ -352,8 +354,10 @@ int APS5_VABI sceUserServiceGetTraditionalChineseInputType(int user_id, int32_t* } int APS5_VABI sceUserServiceGetNpAccountId(int user_id, uint64_t* account_id) { - const int index = UserIndex(user_id); - if (account_id == nullptr || index < 0) { + if (!IsUserLoggedIn(user_id)) { + return USER_SERVICE_ERROR_UNKNOWN_USER; + } + if (account_id == nullptr) { return USER_SERVICE_ERROR_INVALID_ARGUMENT; } *account_id = 0; diff --git a/core/libs/prx/libSceUserService/InventoryExports.cpp b/core/libs/prx/libSceUserService/InventoryExports.cpp new file mode 100644 index 000000000000..0a45386094e2 --- /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 000000000000..ac3ba56053c2 --- /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 000000000000..8f9f71a4b7a8 --- /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 32a9d2d7aedd..18bd89f71667 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/libSceVdecCore/Export.cpp b/core/libs/prx/libSceVdecCore/Export.cpp index 0c25b209ecd1..553317924864 100644 --- a/core/libs/prx/libSceVdecCore/Export.cpp +++ b/core/libs/prx/libSceVdecCore/Export.cpp @@ -6,6 +6,10 @@ extern "C" { +int APS5_VABI sceVdecCoreQueryMemorySizeSvp() { + NotImplemented_nid_no_patch(__func__); +} + int APS5_VABI sceVdecCoreAnalyzeStream() { NotImplemented_nid_no_patch(__func__); return 0; diff --git a/core/libs/prx/libSceVdecCore/include/Api.hpp b/core/libs/prx/libSceVdecCore/include/Api.hpp index 9b1aaeed6cea..cca7a3bd3341 100644 --- a/core/libs/prx/libSceVdecCore/include/Api.hpp +++ b/core/libs/prx/libSceVdecCore/include/Api.hpp @@ -4,6 +4,8 @@ extern "C" { +int APS5_VABI sceVdecCoreQueryMemorySizeSvp(); + int APS5_VABI sceVdecCoreAnalyzeStream(); int APS5_VABI sceVdecCoreCreateDecoder(); int APS5_VABI sceVdecCoreDeleteDecoder(); diff --git a/core/libs/prx/libSceVdecShevc/Export.cpp b/core/libs/prx/libSceVdecShevc/Export.cpp index 43e493606648..13d6337e2cb3 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 000000000000..ba4eee98a80b --- /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 e6f868789ac9..1d58b977dbd4 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 000000000000..ca700a82cf68 --- /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 000000000000..72e440902fbc --- /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 000000000000..be355d554721 --- /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 c423ca85fb12..26a5b0b581bc 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 @@ -76,4 +78,47 @@ int APS5_VABI sceVencStopEncode() { return 0; } +int APS5_VABI sceVencGetHeader() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVencSetNormalPrivacyProtectionConfig() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVencSetImagePasteConfig() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVencQueryPreset2() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVencSetCodecConfig() { + NotImplemented_nid_no_patch(__func__); +} + +} + +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/Api.hpp b/core/libs/prx/libSceVenc/include/Api.hpp index 26d25b4a0783..f513ac4c901f 100644 --- a/core/libs/prx/libSceVenc/include/Api.hpp +++ b/core/libs/prx/libSceVenc/include/Api.hpp @@ -19,4 +19,10 @@ int APS5_VABI sceVencSetReferenceFrameInvalidationConfig(); int APS5_VABI sceVencStartEncode(); int APS5_VABI sceVencStopEncode(); +int APS5_VABI sceVencGetHeader(); +int APS5_VABI sceVencSetNormalPrivacyProtectionConfig(); +int APS5_VABI sceVencSetImagePasteConfig(); +int APS5_VABI sceVencQueryPreset2(); +int APS5_VABI sceVencSetCodecConfig(); + } diff --git a/core/libs/prx/libSceVenc/include/InventoryExports.hpp b/core/libs/prx/libSceVenc/include/InventoryExports.hpp new file mode 100644 index 000000000000..c2286327ab35 --- /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 cae676b0b2ef..839190d01939 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 83c4dda32a61..c8896316a269 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 000000000000..ccad32650d3e --- /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 07fbad2f8807..46f7cf17902a 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 1bbb8968bb7f..8da34b281e8a 100644 --- a/core/libs/prx/libSceVideoOut/CMakeLists.txt +++ b/core/libs/prx/libSceVideoOut/CMakeLists.txt @@ -1,15 +1,18 @@ add_library(libSceVideoOut SHARED EXCLUDE_FROM_ALL ${CMAKE_CURRENT_SOURCE_DIR}/Unimplemented.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/InventoryExports.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Event.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Buffer.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Output.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/VideoOutDriver.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/DisplayWindow.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/PadInput.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/PadStatusSdl.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Telemetry.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/MouseInput.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/KeyboardInput.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/ImeTextInput.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/DialogInput.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/InputMapping.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/KeyboardMouse.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/HostHdrProbe.cpp @@ -35,7 +38,7 @@ foreach(runtimeLinkFlag IN ITEMS -static-libgcc -static-libstdc++ -static) endforeach() add_test_executable(video_out_mouse_tests EXCLUDE_FROM_ALL tests/MouseInput.cpp) target_include_directories(video_out_mouse_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_SDL2_INCLUDE_DIR}) -target_link_libraries(video_out_mouse_tests PRIVATE libSceVideoOut libSceMouse libc SDL2-static) +target_link_libraries(video_out_mouse_tests PRIVATE libSceVideoOut libSceMouse libSceIme libc SDL2-static) set_target_properties(video_out_mouse_tests PROPERTIES CXX_EXTENSIONS OFF) configure_windows_unwind(video_out_mouse_tests) if(BUILD_TESTING) @@ -43,7 +46,21 @@ if(BUILD_TESTING) add_test(NAME video_out_mouse COMMAND video_out_mouse_tests) if(WIN32) set_tests_properties(video_out_mouse 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:$") + endif() +endif() + +add_test_executable(video_out_dialog_input_tests EXCLUDE_FROM_ALL tests/DialogInput.cpp) +target_include_directories(video_out_dialog_input_tests PRIVATE ${LIBS_INCLUDE_DIR} ${ANYPS5_SDL2_INCLUDE_DIR}) +target_link_libraries(video_out_dialog_input_tests PRIVATE libSceVideoOut libSceIme libc SDL2-static) +set_target_properties(video_out_dialog_input_tests PROPERTIES CXX_EXTENSIONS OFF) +configure_windows_unwind(video_out_dialog_input_tests) +if(BUILD_TESTING) + set_target_properties(video_out_dialog_input_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + add_test(NAME video_out_dialog_input COMMAND video_out_dialog_input_tests) + if(WIN32) + set_tests_properties(video_out_dialog_input PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$;PATH=path_list_prepend:$;PATH=path_list_prepend:$") endif() endif() @@ -92,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 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() @@ -118,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) @@ -157,6 +181,11 @@ if(BUILD_TESTING) set_tests_properties(pad_input_mapping PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") endif() + add_test_executable(pad_status_sdl_tests tests/PadStatusSdl.cpp src/PadStatusSdl.cpp) + target_include_directories(pad_status_sdl_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/3rdparty/SDL2/include) + set_target_properties(pad_status_sdl_tests PROPERTIES CXX_EXTENSIONS OFF) + configure_host_test_executable(pad_status_sdl_tests) + add_test(NAME pad_status_sdl COMMAND pad_status_sdl_tests) add_test_executable(pad_output_pacing_tests tests/PadOutputPacing.cpp) target_include_directories(pad_output_pacing_tests PRIVATE ${LIBS_INCLUDE_DIR}) target_link_libraries(pad_output_pacing_tests PRIVATE libc) @@ -168,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) @@ -313,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 new file mode 100644 index 000000000000..e298727bb53b --- /dev/null +++ b/core/libs/prx/libSceVideoOut/InventoryExports.cpp @@ -0,0 +1,829 @@ +#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" + +extern "C" { + +int APS5_VABI sceVideoOutAddBuffer() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutAddBuffer4k2kPrivilege() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutAddBufferAnisoPrivilege() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutAddBufferHdrPrivilege() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutAddBufferYccPrivilege() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutAddDisplayPositionEvent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutAddDriver() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutAddS3dHmdPrivilege() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutAddSetModeEvent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutAddStereoBuffer() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutAdjustColor2_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutClearVrrMaster() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutConfigureLayout() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutConfigureOptionsInitialize_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutConfigureOutputEx() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutConfigureOutputModeExSubmitDoneUnsafe_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutConfigureOutputModeEx_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutConfigureOutputMode_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutControlHdcpEncryption() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutCursorIsUpdatePending() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutCursorSetPositionStereo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutCurveSamplePointsCalc_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutDebugAddVrrPrivilege() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutDebugBlankPipe() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutDebugReadCrc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutDebugSetDrr() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutDebugSetGlobalAlpha() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutDebugTriggerRefresh() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutDeleteDisplayPositionEvent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutDeleteDriver() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutDeleteSetModeEvent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutDriverAddEvent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutDriverDecrementBufferLabel() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutDriverDeleteEvent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutDriverGetBufferLabelAddress() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutDriverGetEopHandle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutDriverGetFinishedEopHandle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutDriverGetLatestEopHandle() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutDriverIncrementBufferLabel() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutDriverResetBufferLabel() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutDriverTriggerEvent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutGetBufferInformation() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutGetCoredumpOutputMode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutGetCurrentOutputMode_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutGetDeviceInfoExOts_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutGetDeviceInfoEx_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutGetHdmiKsvList_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutGetHdmiMonitorInfoNoMask_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutGetHdmiMonitorInfo_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutGetHdmiRawEdid_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutGetMonitorInfo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutGetOutputStatusEx() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutGetPipelineStatus() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutGetPortStatusInfoByBusSpecifier_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutGetPortStatusInfo_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutGetPortStatusInfo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutGetStatusForWebcore() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutGetVideoOutModeByBusSpecifier_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutHdmiMonitorInfoIsSupportedHdcpVersion() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutHdmiMonitorInfoIsSupportedVideoOutMode_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutLockBuffer() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutRazorAddCallback() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutRazorRecallCallbacks() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutRazorRemoveCallback() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutRegisterBufferAttribute() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutRegisterStereoBuffers() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutRemoveBuffer() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSetAlphaControl() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSetBlankAfterResume() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSetContentType() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSetDisplayEventPosition() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSetGamutMetadata_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSetGlobalAlpha() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSetToneMap_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSetVrrMaster() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSubmitChangeBufferAttribute() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysAddSetModeEvent2() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysAddSetModeEvent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysAddVblankEvent2() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysAddVblankEvent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysChangePipelineLayout() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysClose() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysConfigureLayout() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysConfigureOutputMode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysConfigureOutput() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysDeleteVblankEvent2() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysDeleteVblankEvent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysFloatPort() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysGetBus() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysGetColorConversionStatus() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysGetCurrentOutputMode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysGetDeviceInfo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysGetFlipStatus() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysGetKsvList() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysGetMonitorInfo_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysGetOutputStatus() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysGetPipelineStatus() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysGetResolutionStatus2() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysGetResolutionStatus() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysGetVblankStatus2() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysGetVblankStatus() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysGetVideoOutModeByBusSpecifier() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysHdmiMonitorInfoIsMorpheus() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysInitMode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysIsModeS3d() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysIsOutputSupported() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysIsSupportedByMonitorInfo_() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysIsUserStatusHdr() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysIsUserStatusSystemDefault() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysIsUserStatusVr() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysModeIsHdr() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysModeIsSystemDefault() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysModeIsVrLegacy() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysModeIsVrNative() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysModeIsVr() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysOpenInternal() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysOpenVrNative() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysReadCrc64() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysReadCrc() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysResetAtGpuReset() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysSetColorMode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysSetDcePipeMode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysSetDimmer2() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysSetDimmer() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysSetHdcpEncryption() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysSetHdrMetadata() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysSetOverscanRatio() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysUpdateDisplayParameter() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysUpdatePrivilege() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutSysUpdateRenderingMode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutUnlockBuffer() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoOutUnregisterBufferAttribute() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI libSceVideoOutUnknown__minus_5AIEU9_plus_11g_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("-5AIEU9+11g", libSceVideoOutUnknown__minus_5AIEU9_plus_11g_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_0y3VgFMy99k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("0y3VgFMy99k", libSceVideoOutUnknown_0y3VgFMy99k_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_1r0tse0IXgU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("1r0tse0IXgU", libSceVideoOutUnknown_1r0tse0IXgU_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_32RkOEsOvQE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("32RkOEsOvQE", libSceVideoOutUnknown_32RkOEsOvQE_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_3xrSV8U0Hsg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("3xrSV8U0Hsg", libSceVideoOutUnknown_3xrSV8U0Hsg_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_7ZOVeum_minus_aAg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("7ZOVeum-aAg", libSceVideoOutUnknown_7ZOVeum_minus_aAg_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_8nnuVJFfTaM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("8nnuVJFfTaM", libSceVideoOutUnknown_8nnuVJFfTaM_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_99wK8O6hGtY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("99wK8O6hGtY", libSceVideoOutUnknown_99wK8O6hGtY_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_9ho7J3ihMlg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("9ho7J3ihMlg", libSceVideoOutUnknown_9ho7J3ihMlg_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_BIfepC2zRH4_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("BIfepC2zRH4", libSceVideoOutUnknown_BIfepC2zRH4_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_Ek7XQBAkFYA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ek7XQBAkFYA", libSceVideoOutUnknown_Ek7XQBAkFYA_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_F3cj7Bea07w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("F3cj7Bea07w", libSceVideoOutUnknown_F3cj7Bea07w_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_IQMqDChUkMM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("IQMqDChUkMM", libSceVideoOutUnknown_IQMqDChUkMM_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_InORxXcUzR8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("InORxXcUzR8", libSceVideoOutUnknown_InORxXcUzR8_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_JDjWoYVTvdk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("JDjWoYVTvdk", libSceVideoOutUnknown_JDjWoYVTvdk_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_Ji_plus_6MtHGDHU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Ji+6MtHGDHU", libSceVideoOutUnknown_Ji_plus_6MtHGDHU_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_LMgBlt8J_plus_8A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("LMgBlt8J+8A", libSceVideoOutUnknown_LMgBlt8J_plus_8A_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_M4lTPTxoeN0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("M4lTPTxoeN0", libSceVideoOutUnknown_M4lTPTxoeN0_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_MuM1bZDAvV8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("MuM1bZDAvV8", libSceVideoOutUnknown_MuM1bZDAvV8_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_N0AyfJuu8_minus_w_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("N0AyfJuu8-w", libSceVideoOutUnknown_N0AyfJuu8_minus_w_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_NyVCSlocu3k_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("NyVCSlocu3k", libSceVideoOutUnknown_NyVCSlocu3k_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_OWn_plus_sZtXKbg_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("OWn+sZtXKbg", libSceVideoOutUnknown_OWn_plus_sZtXKbg_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_P5a32OulZQk_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("P5a32OulZQk", libSceVideoOutUnknown_P5a32OulZQk_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_P96_plus_z_minus_0vEqs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("P96+z-0vEqs", libSceVideoOutUnknown_P96_plus_z_minus_0vEqs_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_QLfXO66LPcI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("QLfXO66LPcI", libSceVideoOutUnknown_QLfXO66LPcI_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_RGGakYPkFIo_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("RGGakYPkFIo", libSceVideoOutUnknown_RGGakYPkFIo_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_UW7CnswVJFQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("UW7CnswVJFQ", libSceVideoOutUnknown_UW7CnswVJFQ_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_VKBIGfxIuAA_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("VKBIGfxIuAA", libSceVideoOutUnknown_VKBIGfxIuAA_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_Wu_plus_K43K3ToE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("Wu+K43K3ToE", libSceVideoOutUnknown_Wu_plus_K43K3ToE_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_XGIE4BsuS6A_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("XGIE4BsuS6A", libSceVideoOutUnknown_XGIE4BsuS6A_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_aB6EqO5VB38_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("aB6EqO5VB38", libSceVideoOutUnknown_aB6EqO5VB38_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_d7eh3psk1J8_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("d7eh3psk1J8", libSceVideoOutUnknown_d7eh3psk1J8_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_fWJeR0LHh1s_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("fWJeR0LHh1s", libSceVideoOutUnknown_fWJeR0LHh1s_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_iUybgvm4EPM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("iUybgvm4EPM", libSceVideoOutUnknown_iUybgvm4EPM_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_l_minus_NHggThj7U_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("l-NHggThj7U", libSceVideoOutUnknown_l_minus_NHggThj7U_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_nrZ1di4tauc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("nrZ1di4tauc", libSceVideoOutUnknown_nrZ1di4tauc_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_oNJ4gsibB6c_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("oNJ4gsibB6c", libSceVideoOutUnknown_oNJ4gsibB6c_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_pTxsULu4Nh0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("pTxsULu4Nh0", libSceVideoOutUnknown_pTxsULu4Nh0_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_q9HFykGcuWU_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("q9HFykGcuWU", libSceVideoOutUnknown_q9HFykGcuWU_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_qWRDqFaC9GE_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("qWRDqFaC9GE", libSceVideoOutUnknown_qWRDqFaC9GE_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_tHObJYt1qSM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("tHObJYt1qSM", libSceVideoOutUnknown_tHObJYt1qSM_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_udcfTO7aAyM_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("udcfTO7aAyM", libSceVideoOutUnknown_udcfTO7aAyM_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_v9gmbZSAovI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("v9gmbZSAovI", libSceVideoOutUnknown_v9gmbZSAovI_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_vXMpe7Murfc_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("vXMpe7Murfc", libSceVideoOutUnknown_vXMpe7Murfc_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_wKJpFhCTrX0_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wKJpFhCTrX0", libSceVideoOutUnknown_wKJpFhCTrX0_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_wZI4fmUJMlw_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("wZI4fmUJMlw", libSceVideoOutUnknown_wZI4fmUJMlw_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_xqlbOlrMbBs_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("xqlbOlrMbBs", libSceVideoOutUnknown_xqlbOlrMbBs_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_yGMBA0AKcgQ_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yGMBA0AKcgQ", libSceVideoOutUnknown_yGMBA0AKcgQ_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_yoK0AjkkBkI_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +APS5_EXPORT("yoK0AjkkBkI", libSceVideoOutUnknown_yoK0AjkkBkI_nid_no_patch); + +int APS5_VABI libSceVideoOutUnknown_ys239q8VgXY_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); +} +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/DialogInput.hpp b/core/libs/prx/libSceVideoOut/include/DialogInput.hpp new file mode 100644 index 000000000000..278613279789 --- /dev/null +++ b/core/libs/prx/libSceVideoOut/include/DialogInput.hpp @@ -0,0 +1,11 @@ +#ifndef CORE_LIBS_PRX_LIBSCEVIDEOOUT_DIALOGINPUT_HPP +#define CORE_LIBS_PRX_LIBSCEVIDEOOUT_DIALOGINPUT_HPP + +#include "SDL_events.h" + +class DialogInput { +public: + void HandleEvent(const SDL_Event& event, unsigned windowId); +}; + +#endif diff --git a/core/libs/prx/libSceVideoOut/include/HostVolumeInput.hpp b/core/libs/prx/libSceVideoOut/include/HostVolumeInput.hpp new file mode 100644 index 000000000000..aa7197bbc508 --- /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/InventoryExports.hpp b/core/libs/prx/libSceVideoOut/include/InventoryExports.hpp new file mode 100644 index 000000000000..5c65f818668c --- /dev/null +++ b/core/libs/prx/libSceVideoOut/include/InventoryExports.hpp @@ -0,0 +1,190 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI sceVideoOutAddBuffer(); +int APS5_VABI sceVideoOutAddBuffer4k2kPrivilege(); +int APS5_VABI sceVideoOutAddBufferAnisoPrivilege(); +int APS5_VABI sceVideoOutAddBufferHdrPrivilege(); +int APS5_VABI sceVideoOutAddBufferYccPrivilege(); +int APS5_VABI sceVideoOutAddDisplayPositionEvent(); +int APS5_VABI sceVideoOutAddDriver(); +int APS5_VABI sceVideoOutAddS3dHmdPrivilege(); +int APS5_VABI sceVideoOutAddSetModeEvent(); +int APS5_VABI sceVideoOutAddStereoBuffer(); +int APS5_VABI sceVideoOutAdjustColor2_(); +int APS5_VABI sceVideoOutClearVrrMaster(); +int APS5_VABI sceVideoOutConfigureLayout(); +int APS5_VABI sceVideoOutConfigureOptionsInitialize_(); +int APS5_VABI sceVideoOutConfigureOutputEx(); +int APS5_VABI sceVideoOutConfigureOutputModeExSubmitDoneUnsafe_(); +int APS5_VABI sceVideoOutConfigureOutputModeEx_(); +int APS5_VABI sceVideoOutConfigureOutputMode_(); +int APS5_VABI sceVideoOutControlHdcpEncryption(); +int APS5_VABI sceVideoOutCursorIsUpdatePending(); +int APS5_VABI sceVideoOutCursorSetPositionStereo(); +int APS5_VABI sceVideoOutCurveSamplePointsCalc_(); +int APS5_VABI sceVideoOutDebugAddVrrPrivilege(); +int APS5_VABI sceVideoOutDebugBlankPipe(); +int APS5_VABI sceVideoOutDebugReadCrc(); +int APS5_VABI sceVideoOutDebugSetDrr(); +int APS5_VABI sceVideoOutDebugSetGlobalAlpha(); +int APS5_VABI sceVideoOutDebugTriggerRefresh(); +int APS5_VABI sceVideoOutDeleteDisplayPositionEvent(); +int APS5_VABI sceVideoOutDeleteDriver(); +int APS5_VABI sceVideoOutDeleteSetModeEvent(); +int APS5_VABI sceVideoOutDriverAddEvent(); +int APS5_VABI sceVideoOutDriverDecrementBufferLabel(); +int APS5_VABI sceVideoOutDriverDeleteEvent(); +int APS5_VABI sceVideoOutDriverGetBufferLabelAddress(); +int APS5_VABI sceVideoOutDriverGetEopHandle(); +int APS5_VABI sceVideoOutDriverGetFinishedEopHandle(); +int APS5_VABI sceVideoOutDriverGetLatestEopHandle(); +int APS5_VABI sceVideoOutDriverIncrementBufferLabel(); +int APS5_VABI sceVideoOutDriverResetBufferLabel(); +int APS5_VABI sceVideoOutDriverTriggerEvent(); +int APS5_VABI sceVideoOutGetBufferInformation(); +int APS5_VABI sceVideoOutGetCoredumpOutputMode(); +int APS5_VABI sceVideoOutGetCurrentOutputMode_(); +int APS5_VABI sceVideoOutGetDeviceInfoExOts_(); +int APS5_VABI sceVideoOutGetDeviceInfoEx_(); +int APS5_VABI sceVideoOutGetHdmiKsvList_(); +int APS5_VABI sceVideoOutGetHdmiMonitorInfoNoMask_(); +int APS5_VABI sceVideoOutGetHdmiMonitorInfo_(); +int APS5_VABI sceVideoOutGetHdmiRawEdid_(); +int APS5_VABI sceVideoOutGetMonitorInfo(); +int APS5_VABI sceVideoOutGetOutputStatusEx(); +int APS5_VABI sceVideoOutGetPipelineStatus(); +int APS5_VABI sceVideoOutGetPortStatusInfoByBusSpecifier_(); +int APS5_VABI sceVideoOutGetPortStatusInfo_(); +int APS5_VABI sceVideoOutGetPortStatusInfo(); +int APS5_VABI sceVideoOutGetStatusForWebcore(); +int APS5_VABI sceVideoOutGetVideoOutModeByBusSpecifier_(); +int APS5_VABI sceVideoOutHdmiMonitorInfoIsSupportedHdcpVersion(); +int APS5_VABI sceVideoOutHdmiMonitorInfoIsSupportedVideoOutMode_(); +int APS5_VABI sceVideoOutLockBuffer(); +int APS5_VABI sceVideoOutRazorAddCallback(); +int APS5_VABI sceVideoOutRazorRecallCallbacks(); +int APS5_VABI sceVideoOutRazorRemoveCallback(); +int APS5_VABI sceVideoOutRegisterBufferAttribute(); +int APS5_VABI sceVideoOutRegisterStereoBuffers(); +int APS5_VABI sceVideoOutRemoveBuffer(); +int APS5_VABI sceVideoOutSetAlphaControl(); +int APS5_VABI sceVideoOutSetBlankAfterResume(); +int APS5_VABI sceVideoOutSetContentType(); +int APS5_VABI sceVideoOutSetDisplayEventPosition(); +int APS5_VABI sceVideoOutSetGamutMetadata_(); +int APS5_VABI sceVideoOutSetGlobalAlpha(); +int APS5_VABI sceVideoOutSetToneMap_(); +int APS5_VABI sceVideoOutSetVrrMaster(); +int APS5_VABI sceVideoOutSubmitChangeBufferAttribute(); +int APS5_VABI sceVideoOutSysAddSetModeEvent2(); +int APS5_VABI sceVideoOutSysAddSetModeEvent(); +int APS5_VABI sceVideoOutSysAddVblankEvent2(); +int APS5_VABI sceVideoOutSysAddVblankEvent(); +int APS5_VABI sceVideoOutSysChangePipelineLayout(); +int APS5_VABI sceVideoOutSysClose(); +int APS5_VABI sceVideoOutSysConfigureLayout(); +int APS5_VABI sceVideoOutSysConfigureOutputMode(); +int APS5_VABI sceVideoOutSysConfigureOutput(); +int APS5_VABI sceVideoOutSysDeleteVblankEvent2(); +int APS5_VABI sceVideoOutSysDeleteVblankEvent(); +int APS5_VABI sceVideoOutSysFloatPort(); +int APS5_VABI sceVideoOutSysGetBus(); +int APS5_VABI sceVideoOutSysGetColorConversionStatus(); +int APS5_VABI sceVideoOutSysGetCurrentOutputMode(); +int APS5_VABI sceVideoOutSysGetDeviceInfo(); +int APS5_VABI sceVideoOutSysGetFlipStatus(); +int APS5_VABI sceVideoOutSysGetKsvList(); +int APS5_VABI sceVideoOutSysGetMonitorInfo_(); +int APS5_VABI sceVideoOutSysGetOutputStatus(); +int APS5_VABI sceVideoOutSysGetPipelineStatus(); +int APS5_VABI sceVideoOutSysGetResolutionStatus2(); +int APS5_VABI sceVideoOutSysGetResolutionStatus(); +int APS5_VABI sceVideoOutSysGetVblankStatus2(); +int APS5_VABI sceVideoOutSysGetVblankStatus(); +int APS5_VABI sceVideoOutSysGetVideoOutModeByBusSpecifier(); +int APS5_VABI sceVideoOutSysHdmiMonitorInfoIsMorpheus(); +int APS5_VABI sceVideoOutSysInitMode(); +int APS5_VABI sceVideoOutSysIsModeS3d(); +int APS5_VABI sceVideoOutSysIsOutputSupported(); +int APS5_VABI sceVideoOutSysIsSupportedByMonitorInfo_(); +int APS5_VABI sceVideoOutSysIsUserStatusHdr(); +int APS5_VABI sceVideoOutSysIsUserStatusSystemDefault(); +int APS5_VABI sceVideoOutSysIsUserStatusVr(); +int APS5_VABI sceVideoOutSysModeIsHdr(); +int APS5_VABI sceVideoOutSysModeIsSystemDefault(); +int APS5_VABI sceVideoOutSysModeIsVrLegacy(); +int APS5_VABI sceVideoOutSysModeIsVrNative(); +int APS5_VABI sceVideoOutSysModeIsVr(); +int APS5_VABI sceVideoOutSysOpenInternal(); +int APS5_VABI sceVideoOutSysOpenVrNative(); +int APS5_VABI sceVideoOutSysReadCrc64(); +int APS5_VABI sceVideoOutSysReadCrc(); +int APS5_VABI sceVideoOutSysResetAtGpuReset(); +int APS5_VABI sceVideoOutSysSetColorMode(); +int APS5_VABI sceVideoOutSysSetDcePipeMode(); +int APS5_VABI sceVideoOutSysSetDimmer2(); +int APS5_VABI sceVideoOutSysSetDimmer(); +int APS5_VABI sceVideoOutSysSetHdcpEncryption(); +int APS5_VABI sceVideoOutSysSetHdrMetadata(); +int APS5_VABI sceVideoOutSysSetOverscanRatio(); +int APS5_VABI sceVideoOutSysUpdateDisplayParameter(); +int APS5_VABI sceVideoOutSysUpdatePrivilege(); +int APS5_VABI sceVideoOutSysUpdateRenderingMode(); +int APS5_VABI sceVideoOutUnlockBuffer(); +int APS5_VABI sceVideoOutUnregisterBufferAttribute(); +int APS5_VABI libSceVideoOutUnknown__minus_5AIEU9_plus_11g_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_0y3VgFMy99k_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_1r0tse0IXgU_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_32RkOEsOvQE_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_3xrSV8U0Hsg_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_7ZOVeum_minus_aAg_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_8nnuVJFfTaM_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_99wK8O6hGtY_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_9ho7J3ihMlg_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_BIfepC2zRH4_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_Ek7XQBAkFYA_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_F3cj7Bea07w_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_IQMqDChUkMM_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_InORxXcUzR8_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_JDjWoYVTvdk_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_Ji_plus_6MtHGDHU_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_LMgBlt8J_plus_8A_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_M4lTPTxoeN0_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_MuM1bZDAvV8_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_N0AyfJuu8_minus_w_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_NyVCSlocu3k_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_OWn_plus_sZtXKbg_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_P5a32OulZQk_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_P96_plus_z_minus_0vEqs_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_QLfXO66LPcI_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_RGGakYPkFIo_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_UW7CnswVJFQ_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_VKBIGfxIuAA_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_Wu_plus_K43K3ToE_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_XGIE4BsuS6A_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_aB6EqO5VB38_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_d7eh3psk1J8_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_fWJeR0LHh1s_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_iUybgvm4EPM_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_l_minus_NHggThj7U_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_nrZ1di4tauc_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_oNJ4gsibB6c_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_pTxsULu4Nh0_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_q9HFykGcuWU_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_qWRDqFaC9GE_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_tHObJYt1qSM_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_udcfTO7aAyM_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_v9gmbZSAovI_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_vXMpe7Murfc_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_wKJpFhCTrX0_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_wZI4fmUJMlw_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_xqlbOlrMbBs_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_yGMBA0AKcgQ_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_yoK0AjkkBkI_nid_no_patch(); +int APS5_VABI libSceVideoOutUnknown_ys239q8VgXY_nid_no_patch(); + +} diff --git a/core/libs/prx/libSceVideoOut/include/KeyboardInput.hpp b/core/libs/prx/libSceVideoOut/include/KeyboardInput.hpp index f08af07eec3a..ea1d811ce64b 100644 --- a/core/libs/prx/libSceVideoOut/include/KeyboardInput.hpp +++ b/core/libs/prx/libSceVideoOut/include/KeyboardInput.hpp @@ -9,6 +9,7 @@ class KeyboardInput { private: bool focused = true; + bool suspended = 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 000000000000..8e3f84577013 --- /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/MouseInput.hpp b/core/libs/prx/libSceVideoOut/include/MouseInput.hpp index be37a2c2cba4..6e5814dc08dc 100644 --- a/core/libs/prx/libSceVideoOut/include/MouseInput.hpp +++ b/core/libs/prx/libSceVideoOut/include/MouseInput.hpp @@ -16,6 +16,7 @@ class MouseInput { bool focused = true; bool captured = false; + bool suspended = false; double scaleX = 1.0; double scaleY = 1.0; double remainderX = 0.0; diff --git a/core/libs/prx/libSceVideoOut/include/PadInput.hpp b/core/libs/prx/libSceVideoOut/include/PadInput.hpp index 08a87ee22061..079d8b3b200d 100644 --- a/core/libs/prx/libSceVideoOut/include/PadInput.hpp +++ b/core/libs/prx/libSceVideoOut/include/PadInput.hpp @@ -7,8 +7,11 @@ #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 +#include #include "prx/libSceVideoOut/include/Telemetry.hpp" class DisplayWindow; @@ -17,6 +20,8 @@ class PadInput { public: PadInput(); ~PadInput(); + PadInput(const PadInput&) = delete; + PadInput& operator=(const PadInput&) = delete; void HandleEvent(const SDL_Event& event, DisplayWindow& window); void Update(const DisplayWindow& window); bool MouseModeEnabled() const { return keyboardMouse.MouseMode(); } @@ -36,6 +41,8 @@ class PadInput { LightBarPacer lightBar; TriggerEffectCache triggerEffect; std::uint32_t heldThroughCapture = 0; + AgcDriver::PadKind kind = AgcDriver::PadKind::Unknown; + std::string name; }; explicit PadInput(Pad::InputConfiguration configuration); @@ -49,10 +56,19 @@ class PadInput { PadInputState handOff(int slot, PadInputState state); void applyOutput(); 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/PadStatusSdl.hpp b/core/libs/prx/libSceVideoOut/include/PadStatusSdl.hpp new file mode 100644 index 000000000000..f6cc7c2de943 --- /dev/null +++ b/core/libs/prx/libSceVideoOut/include/PadStatusSdl.hpp @@ -0,0 +1,11 @@ +#ifndef CORE_LIBS_PRX_LIBSCEVIDEOOUT_PADSTATUSSDL_HPP +#define CORE_LIBS_PRX_LIBSCEVIDEOOUT_PADSTATUSSDL_HPP + +#include "SDL_gamecontroller.h" +#include "SDL_joystick.h" +#include "prx/libSceAgcDriver/Execution/include/PadStatus.hpp" + +AgcDriver::PadKind PadKindFromSdl(SDL_GameControllerType type); +AgcDriver::PadPower PadPowerFromSdl(SDL_JoystickPowerLevel level); + +#endif diff --git a/core/libs/prx/libSceVideoOut/include/Port0Presence.hpp b/core/libs/prx/libSceVideoOut/include/Port0Presence.hpp new file mode 100644 index 000000000000..be199da0c7b8 --- /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/include/VideoOut.hpp b/core/libs/prx/libSceVideoOut/include/VideoOut.hpp index 8f86fea2b940..2ef789a28eb6 100644 --- a/core/libs/prx/libSceVideoOut/include/VideoOut.hpp +++ b/core/libs/prx/libSceVideoOut/include/VideoOut.hpp @@ -10,6 +10,7 @@ int APS5_VABI sceVideoOutCursorEnable(int32_t, int32_t, const void*); int APS5_VABI sceVideoOutCursorDisable(int32_t, int32_t); int APS5_VABI sceVideoOutCursorSetImageAddress(int32_t, int32_t, const void*); int APS5_VABI sceVideoOutCursorSetPosition(int32_t, int32_t, uint32_t, uint32_t); +int APS5_VABI sceVideoOutCursorSet2xMagnify(int32_t, int32_t, bool); int APS5_VABI sceVideoOutAdjustColor_(int handle, const VideoOutColorSettings* settings, uint32_t settingsSize); int APS5_VABI sceVideoOutColorSettingsSetGamma_(VideoOutColorSettings* settings, float gamma, uint32_t settingsSize); int APS5_VABI sceDbgVideoOutAddOutputModeVr60Privilege(); diff --git a/core/libs/prx/libSceVideoOut/include/VideoOutDriver.hpp b/core/libs/prx/libSceVideoOut/include/VideoOutDriver.hpp index 555617fb1696..39a987f02627 100644 --- a/core/libs/prx/libSceVideoOut/include/VideoOutDriver.hpp +++ b/core/libs/prx/libSceVideoOut/include/VideoOutDriver.hpp @@ -18,13 +18,17 @@ #include #include "prx/libSceAgcDriver/Execution/include/VideoOutput.hpp" #include "prx/libSceAgcDriver/Execution/include/DisplayBuffer.hpp" +#ifndef __EMSCRIPTEN__ #include "prx/libSceVideoOut/include/DisplayWindow.hpp" -#include "prx/libSceVideoOut/include/BufferReuseTracker.hpp" #include "prx/libSceVideoOut/include/HostHdrProbe.hpp" +#endif +#include "prx/libSceVideoOut/include/BufferReuseTracker.hpp" #include "prx/libc/include/Shutdown.hpp" #include "prx/libkernel/Time/include/TimedWait.hpp" +#ifndef __EMSCRIPTEN__ #include "SDL.h" +#endif #include "SceTypes.hpp" static constexpr int VIDEO_OUT_ERROR_INVALID_VALUE = -2144796671; @@ -255,8 +259,10 @@ class VideoOutDriver { std::array, VIDEO_OUT_NUM_MAX> outputs; std::shared_ptr flipQueue = std::make_shared(); +#ifndef __EMSCRIPTEN__ DisplayWindow window; HostHdrProbe hdrProbe; +#endif std::uint64_t hdrGeneration = 0; std::atomic displayRefreshRate{0}; std::atomic displayResolution{VIDEO_OUT_RESOLUTION_1080P}; diff --git a/core/libs/prx/libSceVideoOut/libSceVideoOut.hpp b/core/libs/prx/libSceVideoOut/libSceVideoOut.hpp index d3328b141056..f917f95ea823 100644 --- a/core/libs/prx/libSceVideoOut/libSceVideoOut.hpp +++ b/core/libs/prx/libSceVideoOut/libSceVideoOut.hpp @@ -4,3 +4,5 @@ #include "prx/libSceVideoOut/include/Event.hpp" #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/Buffer.cpp b/core/libs/prx/libSceVideoOut/src/Buffer.cpp index 459ea23d4e16..99f1e68d539b 100644 --- a/core/libs/prx/libSceVideoOut/src/Buffer.cpp +++ b/core/libs/prx/libSceVideoOut/src/Buffer.cpp @@ -260,6 +260,8 @@ int APS5_VABI sceVideoOutUnregisterBuffers(int handle, int setIndex) try { if (!cfg->groups[setIndex].occupied) { throw std::runtime_error(std::string(__func__) + ": VIDEO_OUT_ERROR_INVALID_INDEX"); } + const auto shown = cfg->flipStatus.currentBuffer; + if (cfg->busType == VIDEO_OUT_BUS_TYPE_MAIN && shown >= 0 && shown < VIDEO_OUT_BUFFER_NUM_MAX && cfg->buffers[shown].groupIndex == setIndex) return VIDEO_OUT_ERROR_RESOURCE_BUSY; for (int i = 0; i < VIDEO_OUT_BUFFER_NUM_MAX; ++i) { if (cfg->buffers[i].groupIndex == setIndex && cfg->bufferPending[i] != 0) throw std::runtime_error("VideoOut: cannot unregister a buffer with a pending flip"); } diff --git a/core/libs/prx/libSceVideoOut/src/DialogInput.cpp b/core/libs/prx/libSceVideoOut/src/DialogInput.cpp new file mode 100644 index 000000000000..8faf5a07884b --- /dev/null +++ b/core/libs/prx/libSceVideoOut/src/DialogInput.cpp @@ -0,0 +1,52 @@ +#include "prx/libSceVideoOut/include/DialogInput.hpp" +#include "prx/libSceIme/include/ModalDialog.hpp" + +#include "SDL_keyboard.h" +#include "SDL_mouse.h" + +void DialogInput::HandleEvent(const SDL_Event& event, unsigned windowId) { + ModalDialogInputKind kind; + switch (event.type) { + case SDL_KEYDOWN: + if (event.key.windowID != windowId) return; + switch (event.key.keysym.scancode) { + case SDL_SCANCODE_LEFT: + case SDL_SCANCODE_UP: + kind = ModalDialogInputKind::Previous; + break; + case SDL_SCANCODE_RIGHT: + case SDL_SCANCODE_DOWN: + kind = ModalDialogInputKind::Next; + break; + case SDL_SCANCODE_TAB: + kind = (event.key.keysym.mod & KMOD_SHIFT) != 0 ? ModalDialogInputKind::Previous : ModalDialogInputKind::Next; + break; + case SDL_SCANCODE_RETURN: + case SDL_SCANCODE_KP_ENTER: + case SDL_SCANCODE_SPACE: + if (event.key.repeat != 0) return; + kind = ModalDialogInputKind::Confirm; + break; + case SDL_SCANCODE_ESCAPE: + if (event.key.repeat != 0) return; + kind = ModalDialogInputKind::Cancel; + break; + default: + return; + } + break; + case SDL_MOUSEWHEEL: + if (event.wheel.windowID != windowId || event.wheel.y == 0) return; + kind = event.wheel.y > 0 ? ModalDialogInputKind::Previous : ModalDialogInputKind::Next; + break; + case SDL_MOUSEBUTTONDOWN: + if (event.button.windowID != windowId) return; + if (event.button.button == SDL_BUTTON_LEFT) kind = ModalDialogInputKind::Confirm; + else if (event.button.button == SDL_BUTTON_RIGHT) kind = ModalDialogInputKind::Cancel; + else return; + break; + default: + return; + } + ModalDialogPublishInput_nid_postfix(kind); +} diff --git a/core/libs/prx/libSceVideoOut/src/InputMapping.cpp b/core/libs/prx/libSceVideoOut/src/InputMapping.cpp index dc9bb16da1a6..5a3b969c45a3 100644 --- a/core/libs/prx/libSceVideoOut/src/InputMapping.cpp +++ b/core/libs/prx/libSceVideoOut/src/InputMapping.cpp @@ -56,7 +56,11 @@ constexpr auto actions = std::array{ InputAction{"ToggleMouse", Pad::InputControl::ToggleMouse, Pad::PadButton::None}, 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{"Screenshot", Pad::InputControl::Screenshot, 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) { @@ -121,6 +125,18 @@ Pad::InputBinding parseBinding(const InputAction& action, std::string_view sourc if (action.control == Pad::InputControl::Screenshot) { throw std::runtime_error("Screenshot can only use a keyboard key"); } + 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") { @@ -145,7 +161,8 @@ enum class InputSetting { MouseDecayMs, StickModifierScale, KeyboardRampMs, - TriggerRampMs + TriggerRampMs, + MouseControlsRightStick }; struct InputSettingName { @@ -165,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) { @@ -212,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; @@ -226,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/KeyboardInput.cpp b/core/libs/prx/libSceVideoOut/src/KeyboardInput.cpp index 241b61fa8ea2..39122a7caddd 100644 --- a/core/libs/prx/libSceVideoOut/src/KeyboardInput.cpp +++ b/core/libs/prx/libSceVideoOut/src/KeyboardInput.cpp @@ -1,5 +1,6 @@ #include "prx/libSceVideoOut/include/KeyboardInput.hpp" #include "prx/libSceKeyboard/include/KeyboardState.hpp" +#include "prx/libSceIme/include/ModalDialog.hpp" #include "SDL_keyboard.h" @@ -9,6 +10,13 @@ void KeyboardInput::HandleEvent(const SDL_Event& event, unsigned windowId) { case SDL_KEYDOWN: case SDL_KEYUP: if (event.key.windowID != windowId || !focused || event.key.repeat != 0) return; + if (ModalDialogCapturesInput_nid_postfix()) { + if (suspended) return; + suspended = true; + input.resetKeys = true; + break; + } + suspended = false; if (event.key.keysym.scancode <= SDL_SCANCODE_UNKNOWN || event.key.keysym.scancode > SDL_SCANCODE_RGUI) return; input.keyCode = static_cast(event.key.keysym.scancode); input.pressed = event.type == SDL_KEYDOWN; diff --git a/core/libs/prx/libSceVideoOut/src/KeyboardMouse.cpp b/core/libs/prx/libSceVideoOut/src/KeyboardMouse.cpp index 1ef93610d09e..3a4f9dac3529 100644 --- a/core/libs/prx/libSceVideoOut/src/KeyboardMouse.cpp +++ b/core/libs/prx/libSceVideoOut/src/KeyboardMouse.cpp @@ -264,6 +264,10 @@ Pad::InputRequests Pad::KeyboardMouse::HandleEvent(const SDL_Event& event, Clock if (binding.control == InputControl::ToggleFullscreen && keyboard && down && !pressed[index]) requests.toggleFullscreen = true; 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; } @@ -304,6 +308,10 @@ PadInputState Pad::KeyboardMouse::Compose(const PadInputState& controller) const case InputControl::ToggleFullscreen: break; 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(); @@ -313,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/MouseInput.cpp b/core/libs/prx/libSceVideoOut/src/MouseInput.cpp index f1e79af3664e..95b53ac6c077 100644 --- a/core/libs/prx/libSceVideoOut/src/MouseInput.cpp +++ b/core/libs/prx/libSceVideoOut/src/MouseInput.cpp @@ -1,5 +1,6 @@ #include "prx/libSceVideoOut/include/MouseInput.hpp" #include "prx/libSceMouse/include/MouseState.hpp" +#include "prx/libSceIme/include/ModalDialog.hpp" #include "SDL_mouse.h" #include "SDL_video.h" @@ -10,13 +11,20 @@ void MouseInput::HandleEvent(const SDL_Event& event, unsigned windowId) { MouseInputEvent input{}; switch (event.type) { case SDL_MOUSEMOTION: - if (event.motion.windowID != windowId || !focused) return; + if (event.motion.windowID != windowId || !focused || ModalDialogCapturesInput_nid_postfix()) return; input.x = scaled(event.motion.xrel, scaleX, remainderX); input.y = scaled(event.motion.yrel, scaleY, remainderY); break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: if (event.button.windowID != windowId || !focused) return; + if (ModalDialogCapturesInput_nid_postfix()) { + if (suspended) return; + suspended = true; + input.resetButtons = true; + break; + } + suspended = false; switch (event.button.button) { case SDL_BUTTON_LEFT: input.button = 1; break; case SDL_BUTTON_RIGHT: input.button = 2; break; @@ -26,7 +34,7 @@ void MouseInput::HandleEvent(const SDL_Event& event, unsigned windowId) { input.pressed = event.type == SDL_MOUSEBUTTONDOWN; break; case SDL_MOUSEWHEEL: - if (event.wheel.windowID != windowId || !focused) return; + if (event.wheel.windowID != windowId || !focused || ModalDialogCapturesInput_nid_postfix()) return; input.wheel = event.wheel.y; input.tilt = event.wheel.x; if (event.wheel.direction == SDL_MOUSEWHEEL_FLIPPED) { diff --git a/core/libs/prx/libSceVideoOut/src/Output.cpp b/core/libs/prx/libSceVideoOut/src/Output.cpp index 22fde2a031c2..df96251ac9dd 100644 --- a/core/libs/prx/libSceVideoOut/src/Output.cpp +++ b/core/libs/prx/libSceVideoOut/src/Output.cpp @@ -302,6 +302,13 @@ int APS5_VABI sceVideoOutCursorSetPosition(int32_t handle, int32_t index, uint32 LibcAwaitExit_nid_postfix(); } +int APS5_VABI sceVideoOutCursorSet2xMagnify(int32_t handle, int32_t index, bool) try { + if (const int error = cursorHandleError(__func__, handle, index)) return error; + return 0; +} catch (const ProcessShutdown&) { + LibcAwaitExit_nid_postfix(); +} + int APS5_VABI sceVideoOutWaitVblank(int handle) try { auto cfg = VideoOutDriver::Get().GetConfig(handle); if (cfg == nullptr) { diff --git a/core/libs/prx/libSceVideoOut/src/PadInput.cpp b/core/libs/prx/libSceVideoOut/src/PadInput.cpp index 0732ce837dd8..57bc24695c42 100644 --- a/core/libs/prx/libSceVideoOut/src/PadInput.cpp +++ b/core/libs/prx/libSceVideoOut/src/PadInput.cpp @@ -9,22 +9,34 @@ #include "SDL.h" #include "prx/libSceVideoOut/include/PadInput.hpp" +#include "prx/libSceVideoOut/include/PadStatusSdl.hpp" #include "prx/libSceMouse/include/MouseState.hpp" #include "prx/libSceVideoOut/include/DisplayWindow.hpp" #include "prx/libSceAgcDriver/Execution/include/Presentation.hpp" #include "prx/libSceAgcDriver/Execution/include/Driver.hpp" +#include "prx/libSceAgcDriver/Execution/include/PadStatusOverlay.hpp" #include "prx/libScePad/include/PadState.hpp" #include "prx/libScePad/include/Pad.hpp" #include "prx/libScePad/include/PadInputTypes.hpp" +#include "prx/libScePad/include/PadRumbleIntensity.hpp" #include "prx/libSceUserService/UserService.hpp" #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(); } -PadInput::PadInput(Pad::InputConfiguration configuration) : keyboardMouse(std::move(configuration)) { +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(); }}, 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() { @@ -77,13 +89,17 @@ void PadInput::openController(int deviceIndex) { slots[slot].lightBar.Reset(); slots[slot].triggerEffect.Reset(); const char* name = SDL_GameControllerName(gc); + slots[slot].kind = PadKindFromSdl(SDL_GameControllerGetType(gc)); + slots[slot].name = name != nullptr ? name : ""; APS5_LOG_OUT("Pad: connected game controller (slot %d): %s (type %d, sensors accel=%d gyro=%d, touchpads=%d, led=%d, trigger rumble=%d)", slot, name != nullptr ? name : "unknown", static_cast(SDL_GameControllerGetType(gc)), 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) { @@ -101,6 +117,8 @@ void PadInput::closeController(int slot) { SDL_GameControllerClose(slots[slot].controller); slots[slot].controller = nullptr; slots[slot].instanceId = -1; + slots[slot].kind = AgcDriver::PadKind::Unknown; + slots[slot].name.clear(); slots[slot].state = {}; slots[slot].outputState = {}; slots[slot].outputPending = false; @@ -110,6 +128,33 @@ void PadInput::closeController(int slot) { } } +AgcDriver::PadStatusSnapshot PadInput::statusSnapshot() const { + AgcDriver::PadStatusSnapshot snapshot; + for (int slot = 0; slot < PAD_MAX_CONTROLLERS; ++slot) { + SDL_GameController* controller = slots[slot].controller; + if (controller == nullptr) continue; + auto& status = snapshot.slots[static_cast(slot)]; + status.connected = true; + status.kind = slots[slot].kind; + status.name = slots[slot].name; + status.power = PadPowerFromSdl(SDL_JoystickCurrentPowerLevel(SDL_GameControllerGetJoystick(controller))); + } + return snapshot; +} + +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; @@ -125,8 +170,11 @@ void PadInput::applyOutput() { const bool isPs5 = SDL_GameControllerGetType(controller) == SDL_CONTROLLER_TYPE_PS5; const auto large = std::max(slots[slot].outputState.vibrationLarge, slots[slot].outputState.audioVibrationLarge); const auto small = std::max(slots[slot].outputState.vibrationSmall, slots[slot].outputState.audioVibrationSmall); - const bool rumbling = large != 0 || small != 0; - const bool triggerRumble = slots[slot].outputState.trigger[0].fallback != 0 || slots[slot].outputState.trigger[1].fallback != 0; + const unsigned rumblePercent = Pad::RumblePercent(); + const auto motors = Pad::MakeRumbleCommand(large, small, rumblePercent, 2000); + const auto triggers = Pad::MakeRumbleCommand(slots[slot].outputState.trigger[0].fallback, slots[slot].outputState.trigger[1].fallback, rumblePercent, 2000); + const bool rumbling = motors.Active(); + const bool triggerRumble = triggers.Active(); if (SDL_GameControllerHasLED(controller) == SDL_TRUE) { struct PlayerLedColor { Uint8 r, g, b; }; static constexpr PlayerLedColor defaultColors[4] = { @@ -147,8 +195,7 @@ void PadInput::applyOutput() { } slots[slot].outputPending = false; slots[slot].nextRumbleRefresh = now + std::chrono::milliseconds(700); - constexpr Uint32 rumbleMs = 2000; - SDL_GameControllerRumble(controller, static_cast(large * 257), static_cast(small * 257), rumbling ? rumbleMs : 0); + SDL_GameControllerRumble(controller, motors.low, motors.high, motors.durationMs); if (slots[slot].outputState.triggerTouched) { if (isPs5) { TriggerEffectCache::Effect effect{}; @@ -159,7 +206,7 @@ void PadInput::applyOutput() { slots[slot].triggerEffect.Result(effect, SDL_GameControllerSendEffect(controller, effect.data(), static_cast(effect.size())) == 0); } } else if (SDL_GameControllerHasRumbleTriggers(controller) == SDL_TRUE) { - SDL_GameControllerRumbleTriggers(controller, static_cast(slots[slot].outputState.trigger[0].fallback * 257), static_cast(slots[slot].outputState.trigger[1].fallback * 257), triggerRumble ? rumbleMs : 0); + SDL_GameControllerRumbleTriggers(controller, triggers.low, triggers.high, triggers.durationMs); } } } @@ -279,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; } @@ -289,16 +338,30 @@ void PadInput::HandleEvent(const SDL_Event& event, DisplayWindow& window) { event.type == SDL_MOUSEBUTTONDOWN || event.type == SDL_MOUSEBUTTONUP; if (!input || ignoreInput) return; if (event.type == SDL_KEYDOWN && ImeCapturesKeyboard_nid_postfix()) return; + if (event.type != SDL_KEYUP && event.type != SDL_MOUSEBUTTONUP && ModalDialogCapturesInput_nid_postfix()) return; keyboardMouse.SetTitleReadsMouse(MouseIsOpen_nid_no_patch()); const auto requests = keyboardMouse.HandleEvent(event, std::chrono::steady_clock::now()); if (requests.toggleFullscreen && window.Handle() != nullptr && event.key.windowID == SDL_GetWindowID(window.Handle())) window.ToggleFullscreen(); if (requests.togglePerformanceOverlay && window.Handle() != nullptr && event.key.windowID == SDL_GetWindowID(window.Handle())) AgcDriverTogglePerformanceOverlay_nid_postfix(); if (requests.screenshot && window.Handle() != nullptr && event.key.windowID == SDL_GetWindowID(window.Handle())) AgcDriverRequestScreenshot_nid_postfix(); + if (requests.showPadStatus && window.Handle() != nullptr && event.key.windowID == SDL_GetWindowID(window.Handle())) { + 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) { @@ -307,6 +370,8 @@ void PadInput::Update(const DisplayWindow& window) { } } if (anyController) SDL_GameControllerUpdate(); + updatePort0(); + reportStatus(); applyOutput(); for (int slot = 0; slot < PAD_MAX_CONTROLLERS; ++slot) { if (slots[slot].controller != nullptr) { @@ -320,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) { @@ -338,8 +405,11 @@ void PadInput::publish(std::uint64_t frame) { PadInputState PadInput::handOff(int slot, PadInputState state) { auto& held = slots[slot].heldThroughCapture; - if (ImeCapturesPad_nid_postfix()) { - if (slot == 0) ImePublishPad_nid_postfix({state.buttons, state.sticks[0], state.sticks[1], state.analogButtonsL2}); + 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; PadInputState neutral; neutral.hasMotion = false; @@ -357,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/src/PadStatusSdl.cpp b/core/libs/prx/libSceVideoOut/src/PadStatusSdl.cpp new file mode 100644 index 000000000000..82d53a6f4b92 --- /dev/null +++ b/core/libs/prx/libSceVideoOut/src/PadStatusSdl.cpp @@ -0,0 +1,35 @@ +#include "prx/libSceVideoOut/include/PadStatusSdl.hpp" + +AgcDriver::PadKind PadKindFromSdl(SDL_GameControllerType type) { + switch (type) { + case SDL_CONTROLLER_TYPE_PS5: return AgcDriver::PadKind::DualSense; + case SDL_CONTROLLER_TYPE_PS4: return AgcDriver::PadKind::DualShock4; + case SDL_CONTROLLER_TYPE_PS3: return AgcDriver::PadKind::DualShock3; + case SDL_CONTROLLER_TYPE_XBOX360: + case SDL_CONTROLLER_TYPE_XBOXONE: return AgcDriver::PadKind::Xbox; + case SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO: + case SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_LEFT: + case SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT: + case SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_PAIR: return AgcDriver::PadKind::Switch; + case SDL_CONTROLLER_TYPE_AMAZON_LUNA: + case SDL_CONTROLLER_TYPE_GOOGLE_STADIA: + case SDL_CONTROLLER_TYPE_NVIDIA_SHIELD: return AgcDriver::PadKind::Other; + case SDL_CONTROLLER_TYPE_UNKNOWN: + case SDL_CONTROLLER_TYPE_VIRTUAL: + case SDL_CONTROLLER_TYPE_MAX: break; + } + return AgcDriver::PadKind::Unknown; +} + +AgcDriver::PadPower PadPowerFromSdl(SDL_JoystickPowerLevel level) { + switch (level) { + case SDL_JOYSTICK_POWER_EMPTY: return AgcDriver::PadPower::Empty; + case SDL_JOYSTICK_POWER_LOW: return AgcDriver::PadPower::Low; + case SDL_JOYSTICK_POWER_MEDIUM: return AgcDriver::PadPower::Medium; + case SDL_JOYSTICK_POWER_FULL: return AgcDriver::PadPower::Full; + case SDL_JOYSTICK_POWER_WIRED: return AgcDriver::PadPower::Wired; + case SDL_JOYSTICK_POWER_UNKNOWN: + case SDL_JOYSTICK_POWER_MAX: break; + } + return AgcDriver::PadPower::Unknown; +} diff --git a/core/libs/prx/libSceVideoOut/src/Telemetry.cpp b/core/libs/prx/libSceVideoOut/src/Telemetry.cpp index 5a1130a7bc86..f627a215fe0d 100644 --- a/core/libs/prx/libSceVideoOut/src/Telemetry.cpp +++ b/core/libs/prx/libSceVideoOut/src/Telemetry.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -29,6 +30,18 @@ std::int64_t steadyNanos() { return std::chrono::duration_cast(std::chrono::steady_clock::now().time_since_epoch()).count(); } +std::string configuredDirectory() { +#ifdef _WIN32 + const wchar_t* configured = _wgetenv(L"APS5_VIDEOOUT_TELEMETRY_DIR"); + if (configured == nullptr) return {}; + const auto text = std::filesystem::path(configured).u8string(); + return std::string(reinterpret_cast(text.data()), text.size()); +#else + const char* configured = std::getenv("APS5_VIDEOOUT_TELEMETRY_DIR"); + return configured != nullptr ? configured : std::string(); +#endif +} + std::int64_t processId() { #ifdef _WIN32 return static_cast(::GetCurrentProcessId()); @@ -82,7 +95,7 @@ std::uint64_t BoundedLineQueue::Dropped() const { Writer::Writer(const std::string& directory, std::size_t capacity, const std::string& commit) : queue(capacity) { const std::string path = directory + "/videoout.jsonl"; - output.open(path, std::ios::binary | std::ios::app); + output.open(std::filesystem::path(reinterpret_cast(path.c_str())), std::ios::binary | std::ios::app); if (!output.is_open()) throw std::runtime_error("VideoOut telemetry: cannot open " + path); output.exceptions(std::ios::badbit | std::ios::failbit); const auto steady = steadyNanos(); @@ -188,7 +201,7 @@ std::unique_ptr OpenFromEnvironment(const char* directory, const std::st } Writer* Instance() { - static const std::unique_ptr writer = OpenFromEnvironment(std::getenv("APS5_VIDEOOUT_TELEMETRY_DIR"), APS5_TRACE_COMMIT); + static const std::unique_ptr writer = OpenFromEnvironment(configuredDirectory().c_str(), APS5_TRACE_COMMIT); return writer.get(); } diff --git a/core/libs/prx/libSceVideoOut/src/VideoOutDriver.cpp b/core/libs/prx/libSceVideoOut/src/VideoOutDriver.cpp index 33dce7d18058..2ec6c5e7976e 100644 --- a/core/libs/prx/libSceVideoOut/src/VideoOutDriver.cpp +++ b/core/libs/prx/libSceVideoOut/src/VideoOutDriver.cpp @@ -19,6 +19,7 @@ #include "prx/libSceAgcDriver/Execution/include/AspectFit.hpp" #include "prx/libSceVideoOut/include/KeyboardInput.hpp" #include "prx/libSceVideoOut/include/ImeTextInput.hpp" +#include "prx/libSceVideoOut/include/DialogInput.hpp" #include "prx/libScePad/include/PadState.hpp" #include "prx/libkernel/Equeue/Equeue.hpp" #include "prx/libkernel/Time/include/Time.hpp" @@ -31,6 +32,7 @@ #include "prx/libSceAgcDriver/Execution/include/HostHdr.hpp" #include "prx/libSceAgcDriver/Execution/include/Presentation.hpp" #include "prx/libSceIme/include/ImeKeyboardView.hpp" +#include "prx/libSceIme/include/ModalDialog.hpp" #include "prx/libSceAgcDriver/Execution/include/PerformanceTimer.hpp" #include "prx/libSceAgcDriver/Execution/include/GuestMemory.hpp" #include "prx/libc/include/PreciseWait.hpp" @@ -698,11 +700,15 @@ void VideoOutDriver::presentLoop(std::stop_token token, std::promise& star return; } started.set_value(); + struct DialogPresenter { + ~DialogPresenter() { ModalDialogSetPresenter_nid_postfix(false); } + } dialogPresenter; std::shared_ptr current; std::optional padInput; std::optional mouseInput; std::optional keyboardInput; std::optional imeTextInput; + std::optional dialogInput; #if APS5_ENABLE_TIMING_LOG std::unique_ptr timingLog; #endif @@ -715,6 +721,7 @@ void VideoOutDriver::presentLoop(std::stop_token token, std::promise& star mouseInput.emplace(); keyboardInput.emplace(); imeTextInput.emplace(); + dialogInput.emplace(); }); while (!token.stop_requested()) { { @@ -737,6 +744,7 @@ void VideoOutDriver::presentLoop(std::stop_token token, std::promise& star mouseInput->HandleEvent(event, SDL_GetWindowID(window.Handle())); keyboardInput->HandleEvent(event, SDL_GetWindowID(window.Handle())); imeTextInput->HandleEvent(event, SDL_GetWindowID(window.Handle())); + dialogInput->HandleEvent(event, SDL_GetWindowID(window.Handle())); } } padInput->Update(window); @@ -747,6 +755,7 @@ void VideoOutDriver::presentLoop(std::stop_token token, std::promise& star LibcRequestExit_nid_postfix(0); throw ProcessShutdown{}; } + ModalDialogSetPresenter_nid_postfix(window.Handle() != nullptr); pollHostHdr(); OnMainThread([&] { mouseInput->UpdateCapture(!padInput->MouseModeEnabled()); }); if (current) { @@ -756,6 +765,9 @@ void VideoOutDriver::presentLoop(std::stop_token token, std::promise& star ImeKeyboardView keyboardView; const bool keyboardShown = ImeReadKeyboardView_nid_postfix(keyboardView); AgcDriverSetSystemOverlay_nid_postfix(keyboardShown ? &keyboardView : nullptr); + ModalDialogView dialogView; + const bool dialogShown = !keyboardShown && ModalDialogReadView_nid_postfix(dialogView); + AgcDriverSetSystemDialog_nid_postfix(dialogShown ? &dialogView : nullptr); processFlip(*current); int windowWidth = 0; int windowHeight = 0; diff --git a/core/libs/prx/libSceVideoOut/tests/DialogInput.cpp b/core/libs/prx/libSceVideoOut/tests/DialogInput.cpp new file mode 100644 index 000000000000..94a9cc174eb3 --- /dev/null +++ b/core/libs/prx/libSceVideoOut/tests/DialogInput.cpp @@ -0,0 +1,140 @@ +#include "prx/libSceIme/include/ModalDialog.hpp" +#include "prx/libSceVideoOut/include/DialogInput.hpp" +#include "SDL.h" +#include "SDL_events.h" +#include "SDL_keyboard.h" +#include "SDL_mouse.h" +#include +#include +#include +#undef main + +namespace { + +constexpr unsigned Window = 7; + +void Require(bool condition, const char* reason) { + if (!condition) { + std::fprintf(stderr, "dialog input: %s\n", reason); + std::abort(); + } +} + +SDL_Event Key(SDL_Scancode scancode, unsigned window = Window, std::uint8_t repeat = 0, std::uint16_t mod = 0) { + SDL_Event event{}; + event.type = SDL_KEYDOWN; + event.key.windowID = window; + event.key.repeat = repeat; + event.key.keysym.scancode = scancode; + event.key.keysym.mod = mod; + return event; +} + +SDL_Event Wheel(int y, unsigned window = Window) { + SDL_Event event{}; + event.type = SDL_MOUSEWHEEL; + event.wheel.windowID = window; + event.wheel.y = y; + return event; +} + +SDL_Event Button(std::uint8_t button, unsigned window = Window) { + SDL_Event event{}; + event.type = SDL_MOUSEBUTTONDOWN; + event.button.windowID = window; + event.button.button = button; + return event; +} + +std::size_t Focus() { + ModalDialogView view; + Require(ModalDialogReadView_nid_postfix(view), "no dialog is shown"); + for (std::size_t index = 0; index < view.buttons.size(); ++index) { + if (view.buttons[index].selected) return index; + } + return ModalDialogNoButton; +} + +ModalDialogState State(std::size_t* chosen = nullptr) { + std::size_t value = 0; + const auto state = ModalDialogPoll_nid_postfix(value); + if (chosen != nullptr) *chosen = value; + return state; +} + +void Open() { + ModalDialogRequest request; + request.message = u"Choose"; + request.buttons = {u"A", u"B", u"C"}; + request.focus = 0; + request.cancel = 2; + Require(ModalDialogOpen_nid_postfix(request), "the dialog did not open"); +} + +} + +int main() { + DialogInput input; + ModalDialogSetPresenter_nid_postfix(true); + + input.HandleEvent(Key(SDL_SCANCODE_RETURN), Window); + Require(State() == ModalDialogState::Idle, "a key answered a dialog that is not open"); + + Open(); + input.HandleEvent(Key(SDL_SCANCODE_RIGHT), Window); + Require(Focus() == 1, "Right did not focus the next button"); + input.HandleEvent(Key(SDL_SCANCODE_TAB), Window); + Require(Focus() == 2, "Tab did not focus the next button"); + input.HandleEvent(Key(SDL_SCANCODE_TAB, Window, 0, KMOD_LSHIFT), Window); + Require(Focus() == 1, "Shift+Tab did not focus the previous button"); + input.HandleEvent(Key(SDL_SCANCODE_UP), Window); + Require(Focus() == 0, "Up did not focus the previous button"); + input.HandleEvent(Key(SDL_SCANCODE_DOWN), Window); + Require(Focus() == 1, "Down did not focus the next button"); + input.HandleEvent(Key(SDL_SCANCODE_LEFT), Window); + Require(Focus() == 0, "Left did not focus the previous button"); + input.HandleEvent(Wheel(-1), Window); + Require(Focus() == 1, "the wheel down did not focus the next button"); + input.HandleEvent(Wheel(1), Window); + Require(Focus() == 0, "the wheel up did not focus the previous button"); + input.HandleEvent(Wheel(0), Window); + Require(Focus() == 0, "a zero wheel step moved the focus"); + + input.HandleEvent(Key(SDL_SCANCODE_RIGHT, Window + 1), Window); + input.HandleEvent(Wheel(-1, Window + 1), Window); + input.HandleEvent(Button(SDL_BUTTON_LEFT, Window + 1), Window); + input.HandleEvent(Key(SDL_SCANCODE_A), Window); + input.HandleEvent(Button(SDL_BUTTON_MIDDLE), Window); + Require(Focus() == 0 && State() == ModalDialogState::Showing, "an event for another window or an unmapped event reached the dialog"); + + input.HandleEvent(Key(SDL_SCANCODE_RETURN, Window, 1), Window); + input.HandleEvent(Key(SDL_SCANCODE_ESCAPE, Window, 1), Window); + Require(State() == ModalDialogState::Showing, "a repeated Enter or Escape answered the dialog"); + + input.HandleEvent(Key(SDL_SCANCODE_RETURN), Window); + std::size_t chosen = 9; + Require(State(&chosen) == ModalDialogState::Answered && chosen == 0, "Enter did not choose the focused button"); + + Open(); + input.HandleEvent(Key(SDL_SCANCODE_RIGHT), Window); + input.HandleEvent(Key(SDL_SCANCODE_SPACE), Window); + Require(State(&chosen) == ModalDialogState::Answered && chosen == 1, "Space did not choose the focused button"); + + Open(); + input.HandleEvent(Key(SDL_SCANCODE_ESCAPE), Window); + Require(State(&chosen) == ModalDialogState::Answered && chosen == 2, "Escape did not choose the cancel button"); + + Open(); + input.HandleEvent(Button(SDL_BUTTON_RIGHT), Window); + Require(State(&chosen) == ModalDialogState::Answered && chosen == 2, "a right click did not choose the cancel button"); + + Open(); + input.HandleEvent(Wheel(-1), Window); + input.HandleEvent(Button(SDL_BUTTON_LEFT), Window); + Require(State(&chosen) == ModalDialogState::Answered && chosen == 1, "a left click did not choose the focused button"); + + Open(); + input.HandleEvent(Key(SDL_SCANCODE_KP_ENTER), Window); + Require(State(&chosen) == ModalDialogState::Answered && chosen == 0, "the keypad Enter did not choose the focused button"); + ModalDialogSetPresenter_nid_postfix(false); +} diff --git a/core/libs/prx/libSceVideoOut/tests/Flip.cpp b/core/libs/prx/libSceVideoOut/tests/Flip.cpp index 87024f728f91..506c6e76ff07 100644 --- a/core/libs/prx/libSceVideoOut/tests/Flip.cpp +++ b/core/libs/prx/libSceVideoOut/tests/Flip.cpp @@ -7,6 +7,10 @@ #include "prx/libkernel/Equeue/Equeue.hpp" #include "prx/libSceAgcDriver/Execution/include/Driver.hpp" #include "prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp" +#include "prx/libSceAgcDriver/Execution/include/PadStatusOverlay.hpp" +#include "prx/libSceAgcDriver/Execution/include/PerformanceOverlay.hpp" +#include "prx/libSceAgcDriver/Execution/include/Presentation.hpp" +#include "prx/libSceIme/include/ImeKeyboardView.hpp" #include "prx/libSceAgcDriver/Submit/include/Dcb.hpp" #include "prx/libc/include/Shutdown.hpp" #include "tests/VideoOutTestEnvironment.hpp" @@ -267,7 +271,12 @@ void testCpuFlipOrder() { check(flipsWithin(2, std::chrono::seconds(30)), "the submitting thread's flip did not complete"); check(shownArgument() == 6, "the submitting thread's flip presented the wrong request"); AgcDriverWaitIdle_nid_postfix(); - sceVideoOutUnregisterBuffers(handle, 0); + constexpr int resourceBusy = static_cast(0x80290009u); + check(sceVideoOutUnregisterBuffers(handle, 0) == resourceBusy, "the set on screen was unregistered"); + { + std::lock_guard lock(cfg->mutex); + check(cfg->groups[0].occupied && cfg->buffers[0].groupIndex == 0, "a refused unregistration released the set on screen"); + } sceVideoOutClose(handle); AgcDriverUnregisterVideoOutput_nid_postfix(7, first); AgcDriverUnregisterVideoOutput_nid_postfix(8, second); @@ -581,6 +590,62 @@ void testPresentation() { LibcRunShutdown_nid_postfix(); } +void testPadStatus() { + const int mainHandle = sceVideoOutOpen(255, 0, 0, nullptr); + auto mainCfg = VideoOutDriver::Get().GetConfig(mainHandle); + std::vector mainAllocation(6 * 65536 + 65535); + const auto mainStorage = alignedBuffer(mainAllocation); + fillBuffer(mainStorage, 259, 137); + VideoOutBuffers mainBuffer{mainStorage.data(), nullptr, {nullptr, nullptr}}; + VideoOutBufferAttribute2 attribute{}; + sceVideoOutSetBufferAttribute2(&attribute, 0x8000000000000000ull, 0, 259, 137, 0, 0, 0); + check(sceVideoOutRegisterBuffers2(mainHandle, 0, 0, &mainBuffer, 1, &attribute, 0, nullptr) == 0, "main buffer registration failed"); + std::int64_t argument = 0; + std::uint64_t presented = AgcDriver::VulkanDevice::PresentCounts().presents; + const auto flipAndPresent = [&](const char* what) { + ++argument; + std::uint64_t target; + { + std::lock_guard lock(mainCfg->mutex); + target = mainCfg->flipStatus.count + 1; + } + check(sceVideoOutSubmitFlip(mainHandle, 0, 1, argument) == 0, "the flip was not accepted"); + std::unique_lock lock(mainCfg->mutex); + check(mainCfg->vblankCond.wait_for(lock, std::chrono::seconds(15), [&] { return (mainCfg->failure && mainCfg->flipStatus.flipPendingNum == 0) || mainCfg->flipStatus.count == target; }), "the flip did not complete"); + if (mainCfg->failure) std::rethrow_exception(mainCfg->failure); + lock.unlock(); + const auto deadline = std::chrono::steady_clock::now() + std::chrono::seconds(5); + while (AgcDriver::VulkanDevice::PresentCounts().presents == presented && std::chrono::steady_clock::now() < deadline) std::this_thread::sleep_for(std::chrono::milliseconds(10)); + const std::string reason = std::string("a flip was not presented ") + what; + check(AgcDriver::VulkanDevice::PresentCounts().presents > presented, reason.c_str()); + presented = AgcDriver::VulkanDevice::PresentCounts().presents; + }; + flipAndPresent("without the panel"); + check(!AgcDriver::PadStatusOverlayLines().has_value(), "the panel is shown before anything asked for it"); + AgcDriverPadStatusShow_nid_postfix(); + check(AgcDriver::PadStatusOverlayLines().has_value(), "a request does not show the panel"); + flipAndPresent("with the panel"); + AgcDriver::PerformanceOverlay::Toggle(); + flipAndPresent("with the panel and the performance overlay"); + AgcDriver::PerformanceOverlay::Toggle(); + flipAndPresent("with the panel and the detailed performance overlay"); + AgcDriver::PerformanceOverlay::Toggle(); + ImeKeyboardView keyboard; + keyboard.rows = 1; + keyboard.columns = 1; + ImeKeyCell key; + key.label = u"A"; + keyboard.keys.push_back(key); + AgcDriverSetSystemOverlay_nid_postfix(&keyboard); + AgcDriverPadStatusShow_nid_postfix(); + flipAndPresent("with the system keyboard over the panel"); + AgcDriverSetSystemOverlay_nid_postfix(nullptr); + flipAndPresent("after the system keyboard closed"); + sceVideoOutUnregisterBuffers(mainHandle, 0); + sceVideoOutClose(mainHandle); + LibcRunShutdown_nid_postfix(); +} + void testOverlay() { const int mainHandle = sceVideoOutOpen(255, 0, 0, nullptr); const int overlayHandle = sceVideoOutOpen(255, 1, 0, nullptr); @@ -927,6 +992,9 @@ void testUnopenedEventRegistration() { check(sceVideoOutAddVblankEvent(eq, 1, nullptr) == VIDEO_OUT_ERROR_INVALID_HANDLE, "vblank event on an unopened port was accepted"); const int handle = sceVideoOutOpen(255, 0, 0, nullptr); check(sceVideoOutAddFlipEvent(eq, handle, nullptr) == 0, "flip event on an open port was refused"); + check(sceVideoOutAddVblankEvent(eq, handle, nullptr) == 0, "vblank event on an open port was refused"); + check(sceVideoOutDeleteFlipEvent(eq, handle) == 0, "registered flip event was not deleted"); + check(sceVideoOutDeleteVblankEvent(eq, handle) == 0, "registered vblank event was not deleted"); sceVideoOutClose(handle); check(sceVideoOutAddFlipEvent(eq, handle, nullptr) == VIDEO_OUT_ERROR_INVALID_HANDLE, "flip event on a closed port was accepted"); check(sceKernelDeleteEqueue(eq) == 0, "the event queue was not deleted"); @@ -1073,6 +1141,7 @@ void testFreshHandleCalls() { const std::uint32_t image[64 * 64] = {}; check(sceVideoOutCursorEnable(handle, 0, nullptr) == VIDEO_OUT_ERROR_INVALID_ADDRESS, "a cursor was enabled without an image address"); check(sceVideoOutCursorSetPosition(handle, 0, 100, 100) == 0, "the cursor position was refused"); + check(sceVideoOutCursorSet2xMagnify(handle, 0, true) == 0, "2x cursor magnification was refused"); check(sceVideoOutCursorSetImageAddress(handle, 0, nullptr) == VIDEO_OUT_ERROR_INVALID_ADDRESS, "a null cursor image address was accepted"); check(sceVideoOutCursorDisable(handle, 0) == 0, "the cursor was not disabled"); check(sceVideoOutSetFlipMaster(handle, 0) == VIDEO_OUT_ERROR_INVALID_HANDLE, "a fresh handle was made flip master of handle 0"); @@ -1099,6 +1168,7 @@ void testFreshHandleCalls() { check(sceVideoOutCursorEnable(-1, 0, nullptr) == VIDEO_OUT_ERROR_INVALID_HANDLE, "an invalid handle was checked after the cursor image address"); check(sceVideoOutCursorEnable(-1, 0, image) == VIDEO_OUT_ERROR_INVALID_HANDLE, "a cursor was enabled on an invalid handle"); check(sceVideoOutCursorSetPosition(-1, 0, 100, 100) == VIDEO_OUT_ERROR_INVALID_HANDLE, "an invalid handle's cursor was positioned"); + check(sceVideoOutCursorSet2xMagnify(-1, 0, true) == VIDEO_OUT_ERROR_INVALID_HANDLE, "an invalid handle's cursor was magnified"); check(sceVideoOutCursorSetImageAddress(-1, 0, nullptr) == VIDEO_OUT_ERROR_INVALID_HANDLE, "an invalid handle's cursor image was set"); check(sceVideoOutCursorDisable(-1, 0) == VIDEO_OUT_ERROR_INVALID_HANDLE, "an invalid handle's cursor was disabled"); check(sceVideoOutSetFlipMaster(-1, 0) == VIDEO_OUT_ERROR_INVALID_HANDLE, "an invalid handle was made flip master"); @@ -1207,6 +1277,7 @@ int runTests(int argc, char** argv) { else if (argc == 2 && std::string(argv[1]) == "eop") testEop(true); else if (argc == 2 && std::string(argv[1]) == "eop_main") testEop(false); else if (argc == 2 && std::string(argv[1]) == "overlay") testOverlay(); + else if (argc == 2 && std::string(argv[1]) == "padstatus") testPadStatus(); else if (argc == 2 && std::string(argv[1]) == "deferred") testDeferredBuffer(); else if (argc == 2 && std::string(argv[1]) == "unregistered") testUnregisteredBuffer(); else if (argc == 2 && std::string(argv[1]) == "ps4") testPs4Buffers(); diff --git a/core/libs/prx/libSceVideoOut/tests/HostVolumeInput.cpp b/core/libs/prx/libSceVideoOut/tests/HostVolumeInput.cpp new file mode 100644 index 000000000000..fc2d4c8a06a9 --- /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 6b0c4348edae..110347f7499f 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); } @@ -114,15 +128,184 @@ void screenshotBinding() { require(rejects("Screenshot = WHEEL:Up\n"), "the screenshot key refuses the mouse wheel"); } +std::size_t padStatusBindingsOn(const Pad::InputConfiguration& configuration, SDL_Scancode key) { + std::size_t count = 0; + for (const auto& binding : configuration.bindings) count += binding.control == Pad::InputControl::ShowPadStatus && binding.key == key ? 1 : 0; + return count; +} + +void padStatusBinding() { + useConfig("Cross = KEY:F\n"); + const auto defaults = Pad::LoadInputMapping(); + require(padStatusBindingsOn(defaults, SDL_SCANCODE_F9) == 1, "F9 shows the pad status by default"); + std::size_t padStatus = 0; + std::size_t onF9 = 0; + for (const auto& binding : defaults.bindings) { + padStatus += binding.control == Pad::InputControl::ShowPadStatus ? 1 : 0; + onF9 += binding.key == SDL_SCANCODE_F9 ? 1 : 0; + } + require(padStatus == 1, "the pad status has more than one default input"); + require(onF9 == 1, "another default binding uses F9"); + 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"); + useConfig("showpadstatus = key:f4\nSHOWPADSTATUS = KEY:F3\nShowPadStatus = KEY:F4\n"); + const auto alternates = Pad::LoadInputMapping(); + require(padStatusBindingsOn(alternates, SDL_SCANCODE_F4) == 1 && padStatusBindingsOn(alternates, SDL_SCANCODE_F3) == 1 && padStatusBindingsOn(alternates, SDL_SCANCODE_F9) == 0, "the pad status keeps alternate keys, once each, whatever the case"); + require(rejects("ShowPadStatus = MOUSE:Left\n"), "the pad status key refuses a mouse button"); + require(rejects("ShowPadStatus = MOUSE:X2\n"), "the pad status key refuses another mouse button"); + require(rejects("ShowPadStatus = WHEEL:Up\n"), "the pad status key refuses the mouse wheel"); + require(rejects("ShowPadStatus = KEY:NoSuchKey\n"), "the pad status key refuses an unknown key"); + require(rejects("ShowPadStatus =\n"), "the pad status key refuses an empty source"); +} + +void padStatusConflicts() { + useConfig("ShowPadStatus = KEY:F10\n"); + const auto sharedKey = Pad::LoadInputMapping(); + std::size_t overlayOnF10 = 0; + for (const auto& binding : sharedKey.bindings) overlayOnF10 += binding.control == Pad::InputControl::TogglePerformanceOverlay && binding.key == SDL_SCANCODE_F10 ? 1 : 0; + require(padStatusBindingsOn(sharedKey, SDL_SCANCODE_F10) == 1 && overlayOnF10 == 1, "the pad status and the overlay cannot share a key"); + useConfig("Cross = KEY:F9\n"); + const auto taken = Pad::LoadInputMapping(); + bool crossOnF9 = false; + for (const auto& binding : taken.bindings) crossOnF9 = crossOnF9 || (binding.control == Pad::InputControl::Button && binding.button == Pad::PadButton::Cross && binding.key == SDL_SCANCODE_F9); + require(crossOnF9 && padStatusBindingsOn(taken, SDL_SCANCODE_F9) == 1, "a pad button on F9 removes the pad status key"); + useConfig("TogglePerformanceOverlay = KEY:F9\n"); + const auto overlayOnPadStatusKey = Pad::LoadInputMapping(); + bool overlayOnF9 = false; + for (const auto& binding : overlayOnPadStatusKey.bindings) overlayOnF9 = overlayOnF9 || (binding.control == Pad::InputControl::TogglePerformanceOverlay && binding.key == SDL_SCANCODE_F9); + require(overlayOnF9 && padStatusBindingsOn(overlayOnPadStatusKey, SDL_SCANCODE_F9) == 1, "the overlay on F9 removes the pad status key"); + useConfig("ShowPadStatus = KEY:F4\nTogglePerformanceOverlay = KEY:F9\n"); + const auto swapped = Pad::LoadInputMapping(); + 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"); @@ -130,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() { @@ -142,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() { @@ -277,6 +466,17 @@ int main() try { settingsReject(); performanceOverlayBinding(); 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 e4d9c6892f6c..4ca8c6d956ff 100644 --- a/core/libs/prx/libSceVideoOut/tests/KeyboardMouse.cpp +++ b/core/libs/prx/libSceVideoOut/tests/KeyboardMouse.cpp @@ -472,6 +472,115 @@ void testToggleRequests() { check(!keyboardMouse.HandleEvent(KeyEvent(SDL_SCANCODE_F12, false), now).screenshot, "releasing F12 asks for nothing"); } +void testShowPadStatus() { + const auto now = Pad::KeyboardMouse::Clock::now(); + Pad::KeyboardMouse keyboardMouse(defaults()); + const auto pressed = keyboardMouse.HandleEvent(KeyEvent(SDL_SCANCODE_F9, true), now); + check(pressed.showPadStatus, "F9 asks to show the pad status"); + check(!pressed.toggleFullscreen && !pressed.togglePerformanceOverlay && !pressed.screenshot && !pressed.toggleMouse, "F9 asks for more than the pad status"); + check(keyboardMouse.Compose(PadInputState{}).buttons == 0, "F9 presses a pad button"); + auto repeated = KeyEvent(SDL_SCANCODE_F9, true); + repeated.key.repeat = 1; + check(!keyboardMouse.HandleEvent(repeated, now).showPadStatus, "a repeated F9 asks again"); + check(!keyboardMouse.HandleEvent(KeyEvent(SDL_SCANCODE_F9, false), now).showPadStatus, "releasing F9 asks for the pad status"); + check(keyboardMouse.HandleEvent(KeyEvent(SDL_SCANCODE_F9, true), now).showPadStatus, "pressing F9 again does not ask again"); + keyboardMouse.HandleEvent(KeyEvent(SDL_SCANCODE_F9, false), now); + for (const auto key : {SDL_SCANCODE_F10, SDL_SCANCODE_F11, SDL_SCANCODE_F12, SDL_SCANCODE_F7, SDL_SCANCODE_F8, SDL_SCANCODE_F6, SDL_SCANCODE_F5}) { + check(!keyboardMouse.HandleEvent(KeyEvent(key, true), now).showPadStatus, "another function key asks for the pad status"); + keyboardMouse.HandleEvent(KeyEvent(key, false), now); + } + check(!keyboardMouse.HandleEvent(PadSimulation::ButtonEvent(SDL_BUTTON_MIDDLE, true), now).showPadStatus, "a mouse button asks for the pad status"); + auto moved = defaults(); + std::erase_if(moved.bindings, [](const Pad::InputBinding& binding) { return binding.control == Pad::InputControl::ShowPadStatus; }); + moved.bindings.push_back({SDL_SCANCODE_F4, Pad::MouseButton::None, Pad::InputControl::ShowPadStatus}); + Pad::KeyboardMouse rebound(moved); + check(!rebound.HandleEvent(KeyEvent(SDL_SCANCODE_F9, true), now).showPadStatus, "the old key still asks after a rebind"); + check(rebound.HandleEvent(KeyEvent(SDL_SCANCODE_F4, true), now).showPadStatus, "the new key does not ask after a rebind"); + auto shared = defaults(); + shared.bindings.push_back({SDL_SCANCODE_F10, Pad::MouseButton::None, Pad::InputControl::ShowPadStatus}); + Pad::KeyboardMouse conflicting(shared); + const auto both = conflicting.HandleEvent(KeyEvent(SDL_SCANCODE_F10, true), now); + 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); @@ -533,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() { @@ -559,8 +697,16 @@ int main() { {"focus loss releases the mouse", testFocusLossReleasesMouse}, {"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/MouseInput.cpp b/core/libs/prx/libSceVideoOut/tests/MouseInput.cpp index 12c9119998e6..0a1427e747df 100644 --- a/core/libs/prx/libSceVideoOut/tests/MouseInput.cpp +++ b/core/libs/prx/libSceVideoOut/tests/MouseInput.cpp @@ -1,6 +1,7 @@ #include "prx/libSceMouse/include/Api.hpp" #include "prx/libSceVideoOut/include/MouseInput.hpp" #include "prx/libSceMouse/include/mouse_structs.h" +#include "prx/libSceIme/include/ModalDialog.hpp" #include "prx/libc/include/general/VabiMacros.hpp" #include "SDL.h" #include "SDL_events.h" @@ -28,6 +29,22 @@ SDL_Event Motion(unsigned windowId, int xrel, int yrel) { return event; } +SDL_Event Wheel(unsigned windowId, int y) { + SDL_Event event{}; + event.type = SDL_MOUSEWHEEL; + event.wheel.windowID = windowId; + event.wheel.y = y; + return event; +} + +SDL_Event Button(unsigned windowId, std::uint8_t button, bool pressed) { + SDL_Event event{}; + event.type = pressed ? SDL_MOUSEBUTTONDOWN : SDL_MOUSEBUTTONUP; + event.button.windowID = windowId; + event.button.button = button; + return event; +} + SDL_Event Window(unsigned windowId, std::uint8_t kind) { SDL_Event event{}; event.type = SDL_WINDOWEVENT; @@ -84,6 +101,91 @@ void Sum(std::int32_t handle, std::int32_t& x, std::int32_t& y) { } } +struct Drained { + int count = 0; + std::int32_t x = 0; + std::int32_t y = 0; + std::int32_t wheel = 0; + std::uint32_t buttons = 0; +}; + +Drained Drain(std::int32_t handle) { + MouseData data[MOUSE_MAX_DATA_NUM]{}; + const int count = sceMouseRead(handle, data, MOUSE_MAX_DATA_NUM); + Require(count >= 0, "read failed"); + Drained drained; + drained.count = count; + for (int index = 0; index < count; ++index) { + drained.x += data[index].x_axis; + drained.y += data[index].y_axis; + drained.wheel += data[index].wheel; + drained.buttons = data[index].buttons; + } + return drained; +} + +void OpenDialog() { + ModalDialogRequest request; + request.message = u"Choose"; + request.buttons = {u"Yes", u"No"}; + Require(ModalDialogOpen_nid_postfix(request), "the dialog did not open"); +} + +void DialogButtonPress(MouseInput& input, std::int32_t handle) { + static_cast(Drain(handle)); + ModalDialogSetPresenter_nid_postfix(true); + OpenDialog(); + input.HandleEvent(Button(3, SDL_BUTTON_LEFT, true), 3); + Require(Drain(handle).buttons == 0, "a button press reached the title while a dialog was shown"); + ModalDialogClose_nid_postfix(); + input.HandleEvent(Button(3, SDL_BUTTON_LEFT, true), 3); + Require(Drain(handle).buttons == 1, "a button press does not reach the title after the dialog closed"); + input.HandleEvent(Button(3, SDL_BUTTON_LEFT, false), 3); + Require(Drain(handle).buttons == 0, "a button release does not reach the title"); + ModalDialogReset_nid_postfix(); + ModalDialogSetPresenter_nid_postfix(false); +} + +void DialogButtonRelease(MouseInput& input, std::int32_t handle) { + static_cast(Drain(handle)); + ModalDialogSetPresenter_nid_postfix(true); + input.HandleEvent(Button(3, SDL_BUTTON_RIGHT, true), 3); + Require(Drain(handle).buttons == 2, "a button press does not reach the title without a dialog"); + OpenDialog(); + input.HandleEvent(Button(3, SDL_BUTTON_RIGHT, false), 3); + auto drained = Drain(handle); + Require(drained.count == 1 && drained.buttons == 0, "the held button was not released when the dialog started taking clicks"); + input.HandleEvent(Button(3, SDL_BUTTON_LEFT, true), 3); + input.HandleEvent(Button(3, SDL_BUTTON_LEFT, false), 3); + Require(Drain(handle).count == 0, "a button press or release reached the title while a dialog was shown"); + ModalDialogClose_nid_postfix(); + input.HandleEvent(Button(3, SDL_BUTTON_LEFT, true), 3); + Require(Drain(handle).buttons == 1, "a button press does not reach the title after the dialog closed"); + input.HandleEvent(Button(3, SDL_BUTTON_LEFT, false), 3); + Require(Drain(handle).buttons == 0, "a button release does not reach the title after the dialog closed"); + ModalDialogReset_nid_postfix(); + ModalDialogSetPresenter_nid_postfix(false); +} + +void DialogMotionAndWheel(MouseInput& input, std::int32_t handle) { + static_cast(Drain(handle)); + ModalDialogSetPresenter_nid_postfix(true); + input.HandleEvent(Wheel(3, 2), 3); + auto drained = Drain(handle); + Require(drained.wheel == 2, "the wheel does not reach the title without a dialog"); + OpenDialog(); + input.HandleEvent(Motion(3, 5, 5), 3); + input.HandleEvent(Wheel(3, 2), 3); + drained = Drain(handle); + Require(drained.count == 0, "motion or wheel reached the title while a dialog was shown"); + ModalDialogClose_nid_postfix(); + input.HandleEvent(Motion(3, 4, 6), 3); + drained = Drain(handle); + Require(drained.x == 8 && drained.y == 12, "motion does not reach the title after the dialog closed"); + ModalDialogReset_nid_postfix(); + ModalDialogSetPresenter_nid_postfix(false); +} + } int main() { @@ -114,6 +216,9 @@ int main() { input.HandleEvent(Motion(3, 3, 3), 3); Sum(handle, x, y); Require(x == 6 && y == 6, "an empty presentation changed the scale"); + DialogMotionAndWheel(input, handle); + DialogButtonPress(input, handle); + DialogButtonRelease(input, handle); CaptureDecision(input, handle); CaptureApplied(input); std::puts("mouse input tests passed"); diff --git a/core/libs/prx/libSceVideoOut/tests/PadPort0.cpp b/core/libs/prx/libSceVideoOut/tests/PadPort0.cpp new file mode 100644 index 000000000000..743d5f8b03b9 --- /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 841a0ac8c475..655260d36ede 100644 --- a/core/libs/prx/libSceVideoOut/tests/PadSdl.cpp +++ b/core/libs/prx/libSceVideoOut/tests/PadSdl.cpp @@ -6,15 +6,25 @@ #include "prx/libSceVideoOut/include/DisplayWindow.hpp" #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(); } } @@ -84,6 +94,115 @@ void HandOff(PadInput& padInput, const DisplayWindow& window, int device) { Require((Pad::ReadState(0).buttons & Cross) != 0); button(SDL_CONTROLLER_BUTTON_A, false); trigger(false); + + ModalDialogSetPresenter_nid_postfix(true); + ModalDialogRequest request; + request.message = u"Continue?"; + request.buttons = {u"Yes", u"No"}; + request.cancel = 1; + Require(ModalDialogOpen_nid_postfix(request)); + padInput.Update(window); + Require((Pad::ReadState(0).buttons & Intercepted) != 0); + button(SDL_CONTROLLER_BUTTON_A, true); + const PadData answering = Pad::ReadState(0); + Require(answering.buttons == Intercepted && answering.left_stick_x == 128 && answering.left_stick_y == 128); + std::size_t chosen = 9; + Require(ModalDialogPoll_nid_postfix(chosen) == ModalDialogState::Answered && chosen == 0); + padInput.Update(window); + Require((Pad::ReadState(0).buttons & (Cross | Intercepted)) == 0); + button(SDL_CONTROLLER_BUTTON_A, false); + button(SDL_CONTROLLER_BUTTON_A, true); + Require((Pad::ReadState(0).buttons & Cross) != 0); + button(SDL_CONTROLLER_BUTTON_A, false); + + Require(ModalDialogOpen_nid_postfix(request)); + Require(ModalDialogCapturesInput_nid_postfix()); + ModalDialogClose_nid_postfix(); + ModalDialogReset_nid_postfix(); + 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); } } @@ -96,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(); @@ -172,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/PadStatusSdl.cpp b/core/libs/prx/libSceVideoOut/tests/PadStatusSdl.cpp new file mode 100644 index 000000000000..1384fca6e50d --- /dev/null +++ b/core/libs/prx/libSceVideoOut/tests/PadStatusSdl.cpp @@ -0,0 +1,66 @@ +#include "prx/libSceVideoOut/include/PadStatusSdl.hpp" +#include +#include +#include +#include +#include +#include + +namespace { + +using AgcDriver::PadKind; +using AgcDriver::PadPower; + +void require(bool condition, const std::string& reason) { + if (!condition) throw std::runtime_error(reason); +} + +void typeTests() { + constexpr std::array, SDL_CONTROLLER_TYPE_MAX> expected{{ + {SDL_CONTROLLER_TYPE_UNKNOWN, PadKind::Unknown}, + {SDL_CONTROLLER_TYPE_XBOX360, PadKind::Xbox}, + {SDL_CONTROLLER_TYPE_XBOXONE, PadKind::Xbox}, + {SDL_CONTROLLER_TYPE_PS3, PadKind::DualShock3}, + {SDL_CONTROLLER_TYPE_PS4, PadKind::DualShock4}, + {SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO, PadKind::Switch}, + {SDL_CONTROLLER_TYPE_VIRTUAL, PadKind::Unknown}, + {SDL_CONTROLLER_TYPE_PS5, PadKind::DualSense}, + {SDL_CONTROLLER_TYPE_AMAZON_LUNA, PadKind::Other}, + {SDL_CONTROLLER_TYPE_GOOGLE_STADIA, PadKind::Other}, + {SDL_CONTROLLER_TYPE_NVIDIA_SHIELD, PadKind::Other}, + {SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_LEFT, PadKind::Switch}, + {SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT, PadKind::Switch}, + {SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_PAIR, PadKind::Switch}, + }}; + for (std::size_t index = 0; index < expected.size(); ++index) { + require(static_cast(expected[index].first) == index, "the SDL controller type table is out of order at " + std::to_string(index)); + require(PadKindFromSdl(expected[index].first) == expected[index].second, "SDL controller type " + std::to_string(index) + " maps to the wrong kind"); + } + require(PadKindFromSdl(SDL_CONTROLLER_TYPE_MAX) == PadKind::Unknown, "the type bound is a kind"); + require(PadKindFromSdl(static_cast(SDL_CONTROLLER_TYPE_MAX + 1)) == PadKind::Unknown, "a type SDL does not define is a kind"); + std::printf("pad status sdl: every SDL controller type maps to its kind\n"); +} + +void powerTests() { + require(PadPowerFromSdl(SDL_JOYSTICK_POWER_UNKNOWN) == PadPower::Unknown, "an unknown power level is a level"); + require(PadPowerFromSdl(SDL_JOYSTICK_POWER_EMPTY) == PadPower::Empty, "empty maps wrongly"); + require(PadPowerFromSdl(SDL_JOYSTICK_POWER_LOW) == PadPower::Low, "low maps wrongly"); + require(PadPowerFromSdl(SDL_JOYSTICK_POWER_MEDIUM) == PadPower::Medium, "medium maps wrongly"); + require(PadPowerFromSdl(SDL_JOYSTICK_POWER_FULL) == PadPower::Full, "full maps wrongly"); + require(PadPowerFromSdl(SDL_JOYSTICK_POWER_WIRED) == PadPower::Wired, "wired maps wrongly"); + require(PadPowerFromSdl(SDL_JOYSTICK_POWER_MAX) == PadPower::Unknown, "the power bound is a level"); + require(PadPowerFromSdl(static_cast(SDL_JOYSTICK_POWER_MAX + 1)) == PadPower::Unknown, "a power level SDL does not define is a level"); + std::printf("pad status sdl: every SDL power level maps to its level\n"); +} + +} + +int main() try { + typeTests(); + powerTests(); + std::printf("pad status sdl tests passed\n"); + return 0; +} catch (const std::exception& error) { + std::cerr << error.what() << '\n'; + return 1; +} diff --git a/core/libs/prx/libSceVideoOut/tests/Port0Presence.cpp b/core/libs/prx/libSceVideoOut/tests/Port0Presence.cpp new file mode 100644 index 000000000000..9c5b233a0a53 --- /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 d81f4a5e32c4..340cbc701550 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 000000000000..ac346d4631eb --- /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 6f70f09beec2..bc8db66d0e75 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/libSceVideoRecordingP/Export.cpp b/core/libs/prx/libSceVideoRecordingP/Export.cpp index 61661397563d..7614cf388c0e 100644 --- a/core/libs/prx/libSceVideoRecordingP/Export.cpp +++ b/core/libs/prx/libSceVideoRecordingP/Export.cpp @@ -189,4 +189,13 @@ int APS5_VABI videoRecordingUnknown_iQS6DUtLybE(void) { return 0; } +int APS5_VABI sceVideoRecordingGetCopyrightImageMemory() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoRecordingCloseWithTruncationByHandle() { + NotImplemented_nid_no_patch(__func__); +} + + } diff --git a/core/libs/prx/libSceVideoRecordingP/include/Api.hpp b/core/libs/prx/libSceVideoRecordingP/include/Api.hpp index 2f831a0c7ef7..e82972870511 100644 --- a/core/libs/prx/libSceVideoRecordingP/include/Api.hpp +++ b/core/libs/prx/libSceVideoRecordingP/include/Api.hpp @@ -65,4 +65,8 @@ int APS5_VABI sceVideoRecordingStop(void); int APS5_VABI sceVideoRecordingTerm(void); int APS5_VABI videoRecordingUnknown_iQS6DUtLybE(void); +int APS5_VABI sceVideoRecordingGetCopyrightImageMemory(); +int APS5_VABI sceVideoRecordingCloseWithTruncationByHandle(); + + } diff --git a/core/libs/prx/libSceVideoStreamingEngine/Export.cpp b/core/libs/prx/libSceVideoStreamingEngine/Export.cpp index f773806a458d..88279eb5a5a4 100644 --- a/core/libs/prx/libSceVideoStreamingEngine/Export.cpp +++ b/core/libs/prx/libSceVideoStreamingEngine/Export.cpp @@ -6,6 +6,238 @@ extern "C" { +int APS5_VABI sceVideoStreamingEngineAbortAuxMessage() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineAbortParsing() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineAddSourceBuffer() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineAppendBuffer() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineCancelThumbnail() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineClearLiveSeekableRange() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineCreatePlayer() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineDeleteMediaSample() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineDeletePlayer() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineDivideMediaSample() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineEnableAudioTrack() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineEndOfStream() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineEnqueueMediaSample() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineGenerateThumbnail() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineGetAudioFrame() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineGetAudioTrackInfo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineGetBufferedInfo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineGetDuration() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineGetLoadingProgress() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineGetLoop() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineGetMediaKeys() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineGetPlaybackRange() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineGetPlaybackRate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineGetResolution() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineGetTimeProperty() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineGetVideoTrackInfo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineInitialize() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineIsLiveStreaming() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineIsTransparentVideoMode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineLoad() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineMediaKeySessionClose() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineMediaKeySessionRemove() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineMediaKeySessionUpdate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineMediaKeySystemAccessGetConfiguration() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineMediaKeysDestroySession() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineMediaKeysSetServerCertificate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEnginePause() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEnginePlay() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineQueryInitEsvmMemory() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineQueryVideoMemory() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineReleaseThumbnailData() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineRemoveSourceBuffer() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineRequestMediaKeySystemAccess() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineSeek() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineSelectVideoTrack() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineSendAuxMessageForRepeatedResults() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineSendAuxMessageSync() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineSetDuration() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineSetLiveSeekableRange() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineSetLoop() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineSetMediaKeys() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineSetPlaybackRange() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineSetPlaybackRate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineSetPtsDtsToMediaSample() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineStop() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineStopDecode() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineTerminate() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceVideoStreamingEngineUpdateByteStreamFormatSpecification() { + NotImplemented_nid_no_patch(__func__); +} + int APS5_VABI sceVideoStreamingEngineDestroyMediaKeySystemAccess() { NotImplemented_nid_no_patch(__func__); return 0; diff --git a/core/libs/prx/libSceVideoStreamingEngine/include/Api.hpp b/core/libs/prx/libSceVideoStreamingEngine/include/Api.hpp index 2b807d7c2581..6a730bbe71c2 100644 --- a/core/libs/prx/libSceVideoStreamingEngine/include/Api.hpp +++ b/core/libs/prx/libSceVideoStreamingEngine/include/Api.hpp @@ -4,6 +4,65 @@ extern "C" { +int APS5_VABI sceVideoStreamingEngineAbortAuxMessage(); +int APS5_VABI sceVideoStreamingEngineAbortParsing(); +int APS5_VABI sceVideoStreamingEngineAddSourceBuffer(); +int APS5_VABI sceVideoStreamingEngineAppendBuffer(); +int APS5_VABI sceVideoStreamingEngineCancelThumbnail(); +int APS5_VABI sceVideoStreamingEngineClearLiveSeekableRange(); +int APS5_VABI sceVideoStreamingEngineCreatePlayer(); +int APS5_VABI sceVideoStreamingEngineDeleteMediaSample(); +int APS5_VABI sceVideoStreamingEngineDeletePlayer(); +int APS5_VABI sceVideoStreamingEngineDivideMediaSample(); +int APS5_VABI sceVideoStreamingEngineEnableAudioTrack(); +int APS5_VABI sceVideoStreamingEngineEndOfStream(); +int APS5_VABI sceVideoStreamingEngineEnqueueMediaSample(); +int APS5_VABI sceVideoStreamingEngineGenerateThumbnail(); +int APS5_VABI sceVideoStreamingEngineGetAudioFrame(); +int APS5_VABI sceVideoStreamingEngineGetAudioTrackInfo(); +int APS5_VABI sceVideoStreamingEngineGetBufferedInfo(); +int APS5_VABI sceVideoStreamingEngineGetDuration(); +int APS5_VABI sceVideoStreamingEngineGetLoadingProgress(); +int APS5_VABI sceVideoStreamingEngineGetLoop(); +int APS5_VABI sceVideoStreamingEngineGetMediaKeys(); +int APS5_VABI sceVideoStreamingEngineGetPlaybackRange(); +int APS5_VABI sceVideoStreamingEngineGetPlaybackRate(); +int APS5_VABI sceVideoStreamingEngineGetResolution(); +int APS5_VABI sceVideoStreamingEngineGetTimeProperty(); +int APS5_VABI sceVideoStreamingEngineGetVideoTrackInfo(); +int APS5_VABI sceVideoStreamingEngineInitialize(); +int APS5_VABI sceVideoStreamingEngineIsLiveStreaming(); +int APS5_VABI sceVideoStreamingEngineIsTransparentVideoMode(); +int APS5_VABI sceVideoStreamingEngineLoad(); +int APS5_VABI sceVideoStreamingEngineMediaKeySessionClose(); +int APS5_VABI sceVideoStreamingEngineMediaKeySessionRemove(); +int APS5_VABI sceVideoStreamingEngineMediaKeySessionUpdate(); +int APS5_VABI sceVideoStreamingEngineMediaKeySystemAccessGetConfiguration(); +int APS5_VABI sceVideoStreamingEngineMediaKeysDestroySession(); +int APS5_VABI sceVideoStreamingEngineMediaKeysSetServerCertificate(); +int APS5_VABI sceVideoStreamingEnginePause(); +int APS5_VABI sceVideoStreamingEnginePlay(); +int APS5_VABI sceVideoStreamingEngineQueryInitEsvmMemory(); +int APS5_VABI sceVideoStreamingEngineQueryVideoMemory(); +int APS5_VABI sceVideoStreamingEngineReleaseThumbnailData(); +int APS5_VABI sceVideoStreamingEngineRemoveSourceBuffer(); +int APS5_VABI sceVideoStreamingEngineRequestMediaKeySystemAccess(); +int APS5_VABI sceVideoStreamingEngineSeek(); +int APS5_VABI sceVideoStreamingEngineSelectVideoTrack(); +int APS5_VABI sceVideoStreamingEngineSendAuxMessageForRepeatedResults(); +int APS5_VABI sceVideoStreamingEngineSendAuxMessageSync(); +int APS5_VABI sceVideoStreamingEngineSetDuration(); +int APS5_VABI sceVideoStreamingEngineSetLiveSeekableRange(); +int APS5_VABI sceVideoStreamingEngineSetLoop(); +int APS5_VABI sceVideoStreamingEngineSetMediaKeys(); +int APS5_VABI sceVideoStreamingEngineSetPlaybackRange(); +int APS5_VABI sceVideoStreamingEngineSetPlaybackRate(); +int APS5_VABI sceVideoStreamingEngineSetPtsDtsToMediaSample(); +int APS5_VABI sceVideoStreamingEngineStop(); +int APS5_VABI sceVideoStreamingEngineStopDecode(); +int APS5_VABI sceVideoStreamingEngineTerminate(); +int APS5_VABI sceVideoStreamingEngineUpdateByteStreamFormatSpecification(); + int APS5_VABI sceVideoStreamingEngineDestroyMediaKeySystemAccess(); int APS5_VABI sceVideoStreamingEngineMediaKeySessionGenerateRequest(); int APS5_VABI sceVideoStreamingEngineMediaKeySessionGetExpiration(); diff --git a/core/libs/prx/libSceVideoStreamingEngineAudioOnly/Export.cpp b/core/libs/prx/libSceVideoStreamingEngineAudioOnly/Export.cpp new file mode 100644 index 000000000000..3dae414313d1 --- /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 000000000000..a3618dbab7be --- /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 000000000000..5cde7f7245e0 --- /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/libSceVideodec/Export.cpp b/core/libs/prx/libSceVideodec/Export.cpp index f5110f027482..b8a4b3cbc8b1 100644 --- a/core/libs/prx/libSceVideodec/Export.cpp +++ b/core/libs/prx/libSceVideodec/Export.cpp @@ -79,11 +79,12 @@ SceVideodec2::DecoderConfigInfo MapConfig(const ConfigInfo& config) { return decoderConfig; } -Geometry Measure(const SceVideodec2::OutputInfo& output, const Decoder2Crop& crop) { +Geometry Measure(const SceVideodec2::OutputInfo& output, const SceVideodec2::Internal::PictureHeader& header) { + if (header.bitDepthMinus8 != 0) throw std::runtime_error("Videodec: pictures deeper than 8 bits are not implemented"); Geometry geometry; geometry.width = output.frameWidth; geometry.height = output.frameHeight; - geometry.crop = crop; + geometry.crop = header.crop; geometry.pitch = AlignUp(geometry.width, PitchAlignment); return geometry; } @@ -188,7 +189,7 @@ int APS5_VABI sceVideodecDecode(Ctrl* ctrl, const SceVideodec2::InputData* input } SceVideodec2::Internal::PictureHeader header{}; if (output.isValid) Videodec2PictureHeader_nid_no_patch(decoder->handle, output.frameBuffer, &header); - const auto geometry = Measure(output, header.crop); + const auto geometry = Measure(output, header); FillPictureInfo(geometry, output, picture); picture->ptsData = header.pts; picture->attachedData = header.attached; @@ -240,7 +241,7 @@ int APS5_VABI sceVideodecFlush(Ctrl* ctrl, FrameBuffer* frameBuffer, PictureInfo } SceVideodec2::Internal::PictureHeader header{}; if (output.isValid) Videodec2PictureHeader_nid_no_patch(decoder->handle, output.frameBuffer, &header); - const auto geometry = Measure(output, header.crop); + const auto geometry = Measure(output, header); FillPictureInfo(geometry, output, picture); picture->ptsData = header.pts; picture->attachedData = header.attached; diff --git a/core/libs/prx/libSceVisionManager/Export.cpp b/core/libs/prx/libSceVisionManager/Export.cpp index e329980232d1..b19cf1ab2c85 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 000000000000..6e7bf9ac851c --- /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 e2529647b865..4e2ef8236248 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 d81f4a5e32c4..5c13882d4754 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 000000000000..54ebf49f8c09 --- /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 6f70f09beec2..21e36b4f85a2 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/libSceVrHand/CMakeLists.txt b/core/libs/prx/libSceVrHand/CMakeLists.txt new file mode 100644 index 000000000000..a82bb350b7b8 --- /dev/null +++ b/core/libs/prx/libSceVrHand/CMakeLists.txt @@ -0,0 +1,14 @@ +add_library(libSceVrHand SHARED EXCLUDE_FROM_ALL Export.cpp) +target_include_directories(libSceVrHand PRIVATE ${LIBS_INCLUDE_DIR}) +configure_windows_unwind(libSceVrHand) + +if(BUILD_TESTING) + add_test_executable(guest_vr_hand_tests ${LIBS_INCLUDE_DIR}/tests/GuestVrHand.cpp) + target_include_directories(guest_vr_hand_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_vr_hand_tests PRIVATE libSceVrHand) + add_test(NAME guest_vr_hand COMMAND guest_vr_hand_tests) + if(WIN32) + set_tests_properties(guest_vr_hand PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceVrHand/Export.cpp b/core/libs/prx/libSceVrHand/Export.cpp index 5977eb34e445..5d646b921884 100644 --- a/core/libs/prx/libSceVrHand/Export.cpp +++ b/core/libs/prx/libSceVrHand/Export.cpp @@ -1,6 +1,7 @@ #include "prx/libSceVrHand/include/Api.hpp" #include #include +#include #include "SceTypes.hpp" #include "prx/libc/include/General.hpp" @@ -31,8 +32,20 @@ int APS5_VABI sceVrHandInitialize() { return 0; } -int APS5_VABI sceVrHandQueryMemory() { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI sceVrHandQueryMemory(const void* param, void* result) { + constexpr int errInvalidArg = static_cast(0x8a870006); + if (param == nullptr || result == nullptr) return errInvalidArg; + const auto* input = static_cast(param); + std::uint32_t size = 0; + std::memcpy(&size, input, sizeof(size)); + if (size != 0x20) return errInvalidArg; + for (std::size_t index = 4; index < 0x20; ++index) if (input[index] != 0) return errInvalidArg; + auto* output = static_cast(result); + const std::uint32_t at0 = 0x3c00000; + const std::uint32_t at4 = 0x10000; + std::memcpy(output, &at0, sizeof(at0)); + std::memcpy(output + 4, &at4, sizeof(at4)); + std::memset(output + 8, 0, 0x14); return 0; } diff --git a/core/libs/prx/libSceVrHand/include/Api.hpp b/core/libs/prx/libSceVrHand/include/Api.hpp index 007ca14737b7..7c6d86c4f7af 100644 --- a/core/libs/prx/libSceVrHand/include/Api.hpp +++ b/core/libs/prx/libSceVrHand/include/Api.hpp @@ -9,7 +9,7 @@ int APS5_VABI sceVrHandGetMesh(); int APS5_VABI sceVrHandGetMeshSize(); int APS5_VABI sceVrHandGetResult(); int APS5_VABI sceVrHandInitialize(); -int APS5_VABI sceVrHandQueryMemory(); +int APS5_VABI sceVrHandQueryMemory(const void* param, void* result); int APS5_VABI sceVrHandStart(); int APS5_VABI sceVrHandStop(); diff --git a/core/libs/prx/libSceVrTracker/Export.cpp b/core/libs/prx/libSceVrTracker/Export.cpp index 7e66fd197e50..0f9005af7094 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 000000000000..8228f057dab7 --- /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 81621f70848a..5831e89f25b3 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 000000000000..9a43597ab5a3 --- /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 000000000000..73d359781936 --- /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 000000000000..a21cf7699d38 --- /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 641f60463e9e..3e3933240a4f 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 d5961d62115d..758a56801787 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 000000000000..67d06f773652 --- /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 d9b740e44058..9d181d1a9aaf 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 000000000000..9fd9f62f7f00 --- /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 000000000000..97c4280a3965 --- /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 000000000000..0b7625db0a97 --- /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 000000000000..a676546277bb --- /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 000000000000..30b702b1e3d0 --- /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 000000000000..164307b2b51f --- /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 d81f4a5e32c4..85bef6edfc57 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 000000000000..f41474417fd5 --- /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 000000000000..c17442a686b4 --- /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 6f70f09beec2..614bf8b9549b 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 6459243e92ae..9515d736829b 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 1db2bcd2dd85..777a60e2acc6 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 cf80c59945a8..a65adb325e94 100644 --- a/core/libs/prx/libc/CMakeLists.txt +++ b/core/libs/prx/libc/CMakeLists.txt @@ -51,6 +51,8 @@ target_sources(libc PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/AppArchive.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/CreationMask.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/FailureReport.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/LogFilePlatform.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/LogFile.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/specifics/gcc/StackGuard.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/specifics/windows/CrashReport.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/specifics/x86_64/CallTrace.cpp @@ -84,6 +86,7 @@ target_sources(libc PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/StandardStreams.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/StreamPurge.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/GuestAllocations.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/MemoryResource.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/GuestArena.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/GuestStacks.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/GuestWriteWatch.cpp @@ -233,6 +236,22 @@ if(BUILD_TESTING) "PATH=path_list_prepend:$") endif() + if(MINGW OR CMAKE_SYSTEM_NAME STREQUAL "Linux") + enable_language(ASM) + add_test_executable(guest_memory_resource_tests + ${LIBS_INCLUDE_DIR}/tests/GuestMemoryResource.cpp + ${LIBS_INCLUDE_DIR}/tests/GuestSceV2Exceptions.S) + target_include_directories(guest_memory_resource_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_memory_resource_tests PRIVATE libc) + configure_windows_unwind(guest_memory_resource_tests) + add_test(NAME guest_memory_resource COMMAND guest_memory_resource_tests) + set_tests_properties(guest_memory_resource PROPERTIES TIMEOUT 10) + if(WIN32) + set_tests_properties(guest_memory_resource PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + endif() + add_test_executable(guest_index_tests ${LIBS_INCLUDE_DIR}/tests/GuestIndex.cpp) target_include_directories(guest_index_tests PRIVATE ${LIBS_INCLUDE_DIR}) target_link_libraries(guest_index_tests PRIVATE libc ${CMAKE_DL_LIBS}) @@ -243,9 +262,19 @@ 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) + target_link_libraries(guest_allocating_strings_tests PRIVATE libc libkernel) configure_windows_unwind(guest_allocating_strings_tests) add_test(NAME guest_allocating_strings COMMAND guest_allocating_strings_tests) if(WIN32) @@ -1108,6 +1137,15 @@ if(BUILD_TESTING) set_tests_properties(guest_underflow_error PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") endif() + add_test_executable(guest_throw_bad_array_new_length_tests ${LIBS_INCLUDE_DIR}/tests/GuestThrowBadArrayNewLength.cpp) + target_include_directories(guest_throw_bad_array_new_length_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_throw_bad_array_new_length_tests PRIVATE libc) + configure_windows_unwind(guest_throw_bad_array_new_length_tests) + add_test(NAME guest_throw_bad_array_new_length COMMAND guest_throw_bad_array_new_length_tests) + if(WIN32) + set_tests_properties(guest_throw_bad_array_new_length PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() if(WIN32) add_test_executable(exception_personality_tests ${LIBS_INCLUDE_DIR}/tests/ExceptionPersonality.cpp) target_include_directories(exception_personality_tests PRIVATE ${LIBS_INCLUDE_DIR}) @@ -1122,6 +1160,10 @@ if(BUILD_TESTING) target_include_directories(exception_personality_tests PRIVATE ${LIBS_INCLUDE_DIR}) target_link_libraries(exception_personality_tests PRIVATE libc) add_test(NAME exception_personality COMMAND exception_personality_tests) + add_test_executable(exception_compact_unwind_tests ${LIBS_INCLUDE_DIR}/tests/ExceptionCompactUnwind.cpp) + target_include_directories(exception_compact_unwind_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(exception_compact_unwind_tests PRIVATE libc) + add_test(NAME exception_compact_unwind COMMAND exception_compact_unwind_tests) add_test_executable(guest_exit_order_tests ${LIBS_INCLUDE_DIR}/tests/GuestExitOrder.cpp) target_include_directories(guest_exit_order_tests PRIVATE ${LIBS_INCLUDE_DIR}) target_link_libraries(guest_exit_order_tests PRIVATE libc) @@ -1131,6 +1173,11 @@ if(BUILD_TESTING) target_link_libraries(guest_path_lifetime_tests PRIVATE libc) add_test(NAME guest_path_lifetime COMMAND guest_path_lifetime_tests) set_tests_properties(guest_path_lifetime PROPERTIES TIMEOUT 20) + add_test_executable(guest_heap_lifetime_tests ${LIBS_INCLUDE_DIR}/tests/GuestHeapLifetime.cpp) + target_include_directories(guest_heap_lifetime_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_heap_lifetime_tests PRIVATE libc) + add_test(NAME guest_heap_lifetime COMMAND guest_heap_lifetime_tests) + set_tests_properties(guest_heap_lifetime PROPERTIES TIMEOUT 20) if(NOT APPLE) add_test_executable(exception_runtime_tests ${LIBS_INCLUDE_DIR}/tests/ExceptionRuntime.cpp) target_include_directories(exception_runtime_tests PRIVATE ${LIBS_INCLUDE_DIR}) @@ -1239,6 +1286,13 @@ if(BUILD_TESTING) configure_windows_unwind(log_macros_tests) add_test(NAME log_macros COMMAND log_macros_tests) add_test(NAME log_macros_timestamps COMMAND log_macros_tests timestamps) + if(NOT WIN32) + add_test_executable(log_file_tests ${LIBS_INCLUDE_DIR}/tests/LogFile.cpp) + target_include_directories(log_file_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(log_file_tests PRIVATE libc) + add_test(NAME log_file COMMAND log_file_tests) + set_tests_properties(log_file PROPERTIES TIMEOUT 30) + endif() if(WIN32) set_tests_properties(log_macros log_macros_timestamps PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") diff --git a/core/libs/prx/libc/include/Api.hpp b/core/libs/prx/libc/include/Api.hpp index 17d6eeb41503..9794adca9dd0 100644 --- a/core/libs/prx/libc/include/Api.hpp +++ b/core/libs/prx/libc/include/Api.hpp @@ -111,6 +111,8 @@ void APS5_VABI libc___cxa_finalize(void* dsoHandle); char* APS5_VABI strndup_nid_postfix(const char* source, std::size_t limit); char* APS5_VABI strdup_nid_postfix(const char* source); int APS5_VABI asprintf_nid_postfix(char** destination, const char* format, ...); +int APS5_VABI dprintf_nid_postfix(int descriptor, const char* format, ...); +int APS5_VABI vdprintf_nid_postfix(int descriptor, const char* format, VaList* args); void* APS5_VABI scriptingGetMem_nid_postfix(std::size_t alignment, std::size_t bytes); void APS5_VABI scriptingFreeMem_nid_postfix(void* pointer); void APS5_VABI __atomic_load_nid_postfix(std::size_t, void*, void*, int); @@ -258,6 +260,7 @@ void APS5_VABI free_nid_postfix(void* ptr); void* APS5_VABI realloc_nid_postfix(void* ptr, size_t newSize); void* APS5_VABI reallocf_nid_postfix(void* ptr, size_t newSize); void* APS5_VABI reallocarray_nid_postfix(void* ptr, size_t nmemb, size_t size); +void* APS5_VABI recallocarray_nid_postfix(void* ptr, size_t oldnmemb, size_t nmemb, size_t size); void* APS5_VABI memalign_nid_postfix(size_t alignment, size_t size); void* APS5_VABI aligned_alloc_nid_postfix(size_t alignment, size_t size); void* APS5_VABI reallocalign_nid_postfix(void* ptr, size_t size, size_t alignment); @@ -268,6 +271,7 @@ int APS5_VABI mergesort_nid_postfix(void* base, size_t count, size_t size, Guest int APS5_VABI heapsort_nid_postfix(void* base, size_t count, size_t size, GuestCompare compare); void APS5_VABI qsort_nid_postfix(void* base, size_t count, size_t size, int (APS5_VABI *compare)(const void*, const void*)); int APS5_VABI qsort_s_nid_postfix(void* base, size_t count, size_t size, GuestContextCompare compare, void* context); +void APS5_VABI qsort_r_nid_postfix(void* base, size_t count, size_t size, void* thunk, int (APS5_VABI *compare)(void*, const void*, const void*)); int APS5_VABI access_nid_postfix(const char* path, int mode); int APS5_VABI remove_nid_postfix(const char* path); double APS5_VABI __adddf3_nid_postfix(double a, double b); @@ -959,6 +963,13 @@ void APS5_VABI _ZdlPvm_nid_postfix(void* pointer, std::size_t); void APS5_VABI _ZdaPvm_nid_postfix(void* pointer, std::size_t); void APS5_VABI _ZdlPvSt11align_val_t_nid_postfix(void* pointer, std::size_t alignment); void APS5_VABI _ZdlPvmSt11align_val_t_nid_postfix(void* pointer, std::size_t, std::size_t alignment); +void* APS5_VABI null_memory_resource_nid_postfix(); +void* APS5_VABI _Aligned_new_delete_resource_nid_postfix(); +void* APS5_VABI _Unaligned_new_delete_resource_nid_postfix(); +void* APS5_VABI _Aligned_get_default_resource_nid_postfix(); +void* APS5_VABI _Unaligned_get_default_resource_nid_postfix(); +void* APS5_VABI _Aligned_set_default_resource_nid_postfix(void* resource); +void* APS5_VABI _Unaligned_set_default_resource_nid_postfix(void* resource); long long APS5_VABI strtonum_nid_postfix(const char* text, long long minimum, long long maximum, const char** error); char* APS5_VABI basename_r_nid_postfix(const char* path, char* buffer); char* APS5_VABI basename_nid_postfix(const char* path); @@ -1416,6 +1427,7 @@ int APS5_VABI dl_iterate_phdr_nid_postfix(int (*callback)(dl_phdr_info*, std::si [[noreturn]] void APS5_VABI __cxa_bad_cast_nid_postfix(); [[noreturn]] void APS5_VABI __cxa_bad_typeid_nid_postfix(); [[noreturn]] void APS5_VABI __cxa_throw_bad_array_new_length_nid_postfix(); +[[noreturn]] void APS5_VABI _ZSt6_ThrowRKSt20bad_array_new_length_nid_postfix(const LibcException::ExceptionObject* error); [[noreturn]] void APS5_VABI _ZSt11_Xbad_allocv_nid_postfix(); [[noreturn]] void APS5_VABI _ZSt14_Xout_of_rangePKc_nid_postfix(const char* message); [[noreturn]] void APS5_VABI _ZSt14_Xlength_errorPKc_nid_postfix(const char* message); @@ -1491,6 +1503,8 @@ const char* APS5_VABI _ZNKSt13__sce_cxxvers16_Error_exception4whatEv_nid_postfix [[noreturn]] void APS5_VABI _ZNSt8__sce_v216_Throw_Cpp_errorEi_nid_postfix(int code); std::int64_t APS5_VABI _ZNSt8__sce_v216_Xtime_get_ticksEv_nid_postfix(); const char* APS5_VABI _ZNSt8__sce_v213_Syserror_mapEi_nid_postfix(int value); +void APS5_VABI _ZNSt8__sce_v28_Locinfo13_Locinfo_ctorEPS0_PKc_nid_postfix(GuestLocale::SceV2Locinfo* self, const char* localeName); +void APS5_VABI _ZNSt8__sce_v28_Locinfo13_Locinfo_dtorEPS0__nid_postfix(GuestLocale::SceV2Locinfo* self); int APS5_VABI feupdateenv_nid_postfix(const GuestFloatingPointEnvironment* environment); int APS5_VABI feholdexcept_nid_postfix(GuestFloatingPointEnvironment* environment); extern const GuestFloatingPointEnvironment __fe_dfl_env_nid_postfix; diff --git a/core/libs/prx/libc/include/General.hpp b/core/libs/prx/libc/include/General.hpp index 9f4f63c8e507..2d202aeb8a39 100644 --- a/core/libs/prx/libc/include/General.hpp +++ b/core/libs/prx/libc/include/General.hpp @@ -16,6 +16,7 @@ extern "C" [[noreturn]] void NotImplemented_nid_no_patch(const char* funcName); extern "C" std::uint64_t NotImplementedCalls_nid_no_patch(); extern "C" void CxaFinalize_nid_no_patch(void* dsoHandle); extern "C" bool StopAtPrefixLetter_nid_no_patch(const char* str, char** endptr, int base); +extern "C" const char* NanSubjectEnd_nid_no_patch(const char* text); extern "C" bool RejectIntegerBase_nid_no_patch(const char* str, char** endptr, int base, bool setError); extern "C" int KeepHostStandardError_nid_no_patch(); extern "C" int KeepHostStandardOutput_nid_no_patch(); @@ -63,6 +64,9 @@ using PthreadJoinFn_nid_no_patch = int (APS5_VABI*)(void*, void**); using PthreadDetachFn_nid_no_patch = int (APS5_VABI*)(void*); extern "C" void RegisterPthreadCreate_nid_no_patch(PthreadCreateFn_nid_no_patch fn); extern "C" void RegisterPthreadJoin_nid_no_patch(PthreadJoinFn_nid_no_patch fn); +using GuestWriteHook_nid_no_patch = std::int64_t (APS5_VABI *)(int descriptor, const void* buffer, std::size_t count); +extern "C" void LibcSetGuestWriteHook_nid_no_patch(GuestWriteHook_nid_no_patch hook); +extern "C" GuestWriteHook_nid_no_patch LibcGetGuestWriteHook_nid_no_patch(); extern "C" void RegisterPthreadDetach_nid_no_patch(PthreadDetachFn_nid_no_patch fn); extern "C" void RegisterProcessorCount_nid_no_patch(unsigned count); struct ThreadForwards_nid_no_patch { diff --git a/core/libs/prx/libc/include/GuestLocale.hpp b/core/libs/prx/libc/include/GuestLocale.hpp index 9645b407f35a..958adc5cac36 100644 --- a/core/libs/prx/libc/include/GuestLocale.hpp +++ b/core/libs/prx/libc/include/GuestLocale.hpp @@ -13,6 +13,12 @@ struct LocinfoStorage { alignas(std::uint64_t) unsigned char bytes[64]; }; +struct SceV2Locinfo { + std::uint64_t reserved; + const char* name; + const char* classicName; +}; + struct Facet; struct FacetVtable { @@ -188,6 +194,9 @@ static_assert(offsetof(NumpunctFacet, truename) == 0x28); static_assert(offsetof(NumpunctVtable, decimalPoint) == 0x20); static_assert(offsetof(NumpunctVtable, truename) == 0x40); static_assert(alignof(LocinfoStorage) == 8); +static_assert(sizeof(SceV2Locinfo) == 24); +static_assert(offsetof(SceV2Locinfo, name) == 8); +static_assert(offsetof(SceV2Locinfo, classicName) == 0x10); } diff --git a/core/libs/prx/libc/include/GuestLongDouble.hpp b/core/libs/prx/libc/include/GuestLongDouble.hpp new file mode 100644 index 000000000000..aac647771660 --- /dev/null +++ b/core/libs/prx/libc/include/GuestLongDouble.hpp @@ -0,0 +1,54 @@ +#ifndef CORE_LIBS_PRX_LIBC_INCLUDE_GUESTLONGDOUBLE_HPP +#define CORE_LIBS_PRX_LIBC_INCLUDE_GUESTLONGDOUBLE_HPP + +#include +#include +#include + +namespace LibcDetail { + +inline constexpr std::size_t GuestLongDoubleBytes = 16; + +static_assert(std::numeric_limits::digits == 64 || std::numeric_limits::digits == 113); + +inline long double GuestLongDoubleLoad(const void* source) { + long double value; + static_assert(sizeof(value) == GuestLongDoubleBytes); + if constexpr (std::numeric_limits::digits == 64) { + std::memcpy(&value, source, sizeof(value)); + } else { + std::uint64_t mantissa; + std::uint16_t signExponent; + std::memcpy(&mantissa, source, sizeof(mantissa)); + std::memcpy(&signExponent, static_cast(source) + 8, sizeof(signExponent)); + const std::uint64_t fraction = mantissa & 0x7FFF'FFFF'FFFF'FFFFull; + const std::uint64_t low = fraction << 49; + const std::uint64_t high = (fraction >> 15) | (static_cast(signExponent & 0x7FFF) << 48) | (static_cast(signExponent >> 15) << 63); + std::memcpy(&value, &low, sizeof(low)); + std::memcpy(reinterpret_cast(&value) + 8, &high, sizeof(high)); + } + return value; +} + +inline void GuestLongDoubleStore(void* target, long double value) { + if constexpr (std::numeric_limits::digits == 64) { + std::memcpy(target, &value, sizeof(value)); + } else { + std::uint64_t low; + std::uint64_t high; + std::memcpy(&low, &value, sizeof(low)); + std::memcpy(&high, reinterpret_cast(&value) + 8, sizeof(high)); + const auto exponent = static_cast((high >> 48) & 0x7FFF); + const std::uint64_t fraction = ((high & 0xFFFF'FFFF'FFFFull) << 15) | (low >> 49); + const std::uint64_t mantissa = fraction | (exponent != 0 ? 0x8000'0000'0000'0000ull : 0); + const auto signExponent = static_cast(exponent | ((high >> 63) << 15)); + unsigned char bytes[GuestLongDoubleBytes] = {}; + std::memcpy(bytes, &mantissa, sizeof(mantissa)); + std::memcpy(bytes + 8, &signExponent, sizeof(signExponent)); + std::memcpy(target, bytes, sizeof(bytes)); + } +} + +} + +#endif diff --git a/core/libs/prx/libc/include/LogFile.hpp b/core/libs/prx/libc/include/LogFile.hpp new file mode 100644 index 000000000000..ca48f5d28f65 --- /dev/null +++ b/core/libs/prx/libc/include/LogFile.hpp @@ -0,0 +1,108 @@ +#ifndef CORE_LIBS_PRX_LIBC_INCLUDE_LOGFILE_HPP +#define CORE_LIBS_PRX_LIBC_INCLUDE_LOGFILE_HPP + +#include +#include +#include +#include +#include +#include + +namespace log_file { + +using Handle = std::intptr_t; +constexpr Handle NoHandle = -1; + +constexpr int StandardOutput = 1; +constexpr int StandardError = 2; + +struct Pipe { + Handle read = NoHandle; + Handle write = NoHandle; +}; + +bool OpenAppend(const std::string& path, Handle& file, std::string& error); +bool MakePipe(Pipe& pipe, std::string& error); +Handle KeepStandard(int standard); +bool Divert(int standard, Handle write); +void RestoreStandard(int standard, Handle original); +bool IsInteractive(Handle handle); +void PauseMicroseconds(long microseconds); +void WriteStandardDirect(int standard, const char* text, std::size_t length); +bool ReadVariable(std::string& value); +[[noreturn]] void FailStartup(const std::string& message); +bool WaitReadable(Handle read, int milliseconds); +long ReadAvailable(Handle read, char* buffer, std::size_t capacity); +long Pending(Handle read); +bool WriteAll(Handle destination, const char* data, std::size_t length); +void Close(Handle handle); + +class Tee { +public: + static constexpr std::size_t ChunkBytes = 65536; + static constexpr std::size_t CarryBytes = 1048576; + + Tee(Handle file, Handle terminalOutput, Handle terminalError, Handle sourceOutput, Handle sourceError); + ~Tee(); + Tee(const Tee&) = delete; + Tee& operator=(const Tee&) = delete; + + void Start(); + void Stop(); + bool Flush(bool ending); + void CrashWrite(int standard, const char* text, std::size_t length); + void Note(const char* text, std::size_t length); + bool FileFailed() const; + +private: + struct Stream { + Handle source = NoHandle; + Handle terminal = NoHandle; + std::atomic terminalBroken{false}; + std::unique_ptr chunk; + std::unique_ptr carry; + std::size_t carried = 0; + std::thread worker; + }; + + bool lock(int milliseconds); + void unlock(); + void pump(Stream& stream); + void toFile(const char* data, std::size_t length); + void flushCarry(Stream& stream); + void toTerminal(Stream& stream, const char* data, std::size_t length); + void run(Stream& stream); + Stream& streamOf(int standard); + + Handle _file; + Stream _streams[2]; + std::atomic _lock{0}; + std::atomic _stop{false}; + std::atomic _fileFailed{false}; + bool _started = false; +}; + +class Session { +public: + virtual ~Session() = default; + virtual Tee& Output() = 0; + virtual void Release() = 0; +}; + +class Factory { +public: + virtual ~Factory() = default; + virtual std::unique_ptr Create(const std::string& path, std::string& error) = 0; +}; + +std::unique_ptr StartFromValue(const char* value, Factory& factory, std::string& error); +Factory& SystemFactory(); + +bool Active(); +void Flush(); +void Release(); +void CrashWrite(int standard, const char* text, std::size_t length); + +} + +#endif diff --git a/core/libs/prx/libc/include/Shutdown.hpp b/core/libs/prx/libc/include/Shutdown.hpp index a59aa05cedbc..f5bf8ad27fa8 100644 --- a/core/libs/prx/libc/include/Shutdown.hpp +++ b/core/libs/prx/libc/include/Shutdown.hpp @@ -18,5 +18,7 @@ extern "C" [[noreturn]] void LibcTerminate_nid_no_patch(int code); extern "C" void LibcSetEndFlush_nid_no_patch(void (*flush)()); extern "C" void LibcRunEndFlush_nid_no_patch(); extern "C" void LibcSetExitDrain_nid_no_patch(void (*drain)()); +extern "C" void LogFileFlush_nid_no_patch(); +extern "C" void LogFileRelease_nid_no_patch(); #endif diff --git a/core/libs/prx/libc/include/WindowsFormatting.hpp b/core/libs/prx/libc/include/WindowsFormatting.hpp index 928635470a62..306705573d29 100644 --- a/core/libs/prx/libc/include/WindowsFormatting.hpp +++ b/core/libs/prx/libc/include/WindowsFormatting.hpp @@ -2,6 +2,7 @@ #define CORE_LIBS_PRX_LIBC_INCLUDE_WINDOWSFORMATTING_HPP #include "SceTypes.hpp" +#include "prx/libc/include/GuestLongDouble.hpp" #include #include #include @@ -87,9 +88,13 @@ class FormatArguments { args.overflow_arg_area = static_cast(args.overflow_arg_area) + 8; } } - T value; - std::memcpy(&value, address, sizeof(value)); - return value; + if constexpr (std::is_same_v) { + return GuestLongDoubleLoad(address); + } else { + T value; + std::memcpy(&value, address, sizeof(value)); + return value; + } } }; @@ -664,8 +669,6 @@ inline int FormatWindows(char* buffer, size_t size, const char* format, const vo output.Value(spec + "ll" + conversion, value); } else if (std::strchr("aAeEfFgG", conversion)) { if (length == "L") { - static_assert(sizeof(long double) == 16); - static_assert(std::numeric_limits::digits == 64); const long double value = args.Next(); if (std::isnan(value)) { output.Value(PaddedStringSpec(spec), NanText(spec, std::signbit(value), conversion < 'a').c_str()); diff --git a/core/libs/prx/libc/include/WindowsMappings.hpp b/core/libs/prx/libc/include/WindowsMappings.hpp index 471dfaa695ed..98d3b80a6450 100644 --- a/core/libs/prx/libc/include/WindowsMappings.hpp +++ b/core/libs/prx/libc/include/WindowsMappings.hpp @@ -155,6 +155,7 @@ class WindowsMappings { else createdPrivate->emplace_back(base, runBytes); } const auto run = residentRuns.emplace(base, Run{base + runBytes, {}, static_cast(runBytes >> 12), key, offset + done}).first; + run->second.watched = watchResident; residentIndex.emplace(std::make_pair(key, offset + done), run); for (std::size_t at = 0; at < runBytes; at += pageBytes) { bool compared = false; @@ -360,7 +361,10 @@ class WindowsMappings { else ++view.hostImports; const auto written = subpagesOf(it->first, address, end); if (store) invalidate(it->first, view, written); - else if (view.resident) forgetClean(it->first, it->first + pageBytes); + else if (view.resident) { + forgetClean(it->first, it->first + pageBytes); + markImported(it->first); + } const auto opened = static_cast((store || view.resident) ? view.armed & written : 0); if (opened == 0) continue; protectSubpages(it->first, opened, view.protection, "open shared memory to a host write", view.viewBytes); @@ -380,6 +384,22 @@ class WindowsMappings { } } + static std::vector TouchedPages(std::uintptr_t start, std::size_t pages, void* const* written, std::size_t count) { + std::vector touched(pages); + for (std::size_t index = 0; index < count; ++index) { + const auto page = (reinterpret_cast(written[index]) - start) / pageBytes; + if (page < pages) touched[page] = true; + } + return touched; + } + + void markImported(std::uintptr_t page) { + const auto next = residentRuns.upper_bound(page); + if (next == residentRuns.begin()) return; + const auto run = std::prev(next); + if (page < run->second.end) run->second.imported = true; + } + void* MapAlias(std::uintptr_t address, std::size_t bytes) { std::lock_guard lock(mutex); const auto refuse = [&](const char* reason) { @@ -741,6 +761,9 @@ class WindowsMappings { std::uint32_t fresh; std::uintptr_t key; std::uint64_t offset; + bool watched = false; + bool reset = false; + bool imported = false; }; struct Window { void* view = nullptr; @@ -753,6 +776,7 @@ class WindowsMappings { } void collectResident(std::uintptr_t start, Run& run, std::uintptr_t from, std::uintptr_t stop, void** pages, std::size_t* count, bool clear, Collection collection) { + if (clear) run.reset = true; const auto first = from & ~std::uintptr_t{4095}; if (run.fresh == 0 && collection != Collection::Fresh) { ULONG_PTR reported = (stop - first + 4095) / 4096; @@ -974,11 +998,23 @@ class WindowsMappings { if (!VirtualProtect(reinterpret_cast(start), stop - start, PAGE_READONLY, &previous)) fail("open resident guest pages"); const auto entry = indexEntry(run); const bool indexed = entry != residentIndex.end(); + std::vector dirty; + std::vector touched; + bool filtered = false; + if (indexed && run->second.watched && !run->second.reset && !run->second.imported) { + dirty.resize((stop - start) / subpageBytes); + ULONG_PTR reported = dirty.size(); + DWORD granularity = 0; + if (GetWriteWatch(0, reinterpret_cast(start), stop - start, dirty.data(), &reported, &granularity) == 0) { + touched = TouchedPages(start, (stop - start) / pageBytes, dirty.data(), reported); + filtered = true; + } + } std::shared_ptr saved; for (auto page = start; page < stop; page += pageBytes) { const auto found = views.find(page); const auto& view = found->second; - const bool written = indexed && !blank(page); + const bool written = indexed && (!filtered || touched[(page - start) / pageBytes]) && !blank(page); if (written || (indexed && view.comparedWhenShared)) { auto& slot = physical[std::make_pair(run->second.key, view.offset)]; if (!slot) slot = std::make_shared(); diff --git a/core/libs/prx/libc/include/exceptions/CompactUnwind.hpp b/core/libs/prx/libc/include/exceptions/CompactUnwind.hpp new file mode 100644 index 000000000000..84e9a83459e1 --- /dev/null +++ b/core/libs/prx/libc/include/exceptions/CompactUnwind.hpp @@ -0,0 +1,290 @@ +#ifndef CORE_LIBS_PRX_LIBC_INCLUDE_EXCEPTIONS_COMPACTUNWIND_HPP +#define CORE_LIBS_PRX_LIBC_INCLUDE_EXCEPTIONS_COMPACTUNWIND_HPP + +#include +#include +#include +#include + +#include "prx/libc/include/exceptions/Unwind.hpp" + +namespace LibcUnwind { + +enum class CompactParse { Miss, Found, Failed }; + +enum class CompactPersonality { Unknown, Gxx, Gcc }; + +struct CompactEntry { + std::uint32_t encoding {}; + std::uint32_t functionOffset {}; + std::uint32_t functionEndOffset {}; + bool hasPersonality {}; + std::int32_t personalityDelta {}; + bool hasLsda {}; + std::uint32_t lsdaOffset {}; + bool dwarf {}; + std::uint32_t dwarfOffset {}; +}; + +using CompactDwarfDecode = bool (*)(std::uint32_t ehOffset, void* user); + +inline std::uint32_t ReadU32At(std::span data, std::size_t offset, bool& ok) { + std::uint32_t value = 0; + if (!ok || offset > data.size() || data.size() - offset < 4) { ok = false; return 0; } + std::memcpy(&value, data.data() + offset, 4); + return value; +} + +inline CompactPersonality MatchCompactPersonality(const char* name) { + if (name == nullptr) return CompactPersonality::Unknown; + if (std::strcmp(name, "__gxx_personality_v0") == 0 || std::strcmp(name, "___gxx_personality_v0") == 0) return CompactPersonality::Gxx; + if (std::strcmp(name, "__gcc_personality_v0") == 0 || std::strcmp(name, "___gcc_personality_v0") == 0) return CompactPersonality::Gcc; + return CompactPersonality::Unknown; +} + +inline bool CompactUnwindRules(std::uint32_t encoding, std::span function, Rules& rules) { + const auto mode = encoding & 0x0f000000u; + rules = {}; + auto save = [&](unsigned reg, std::intptr_t offset) { + if (reg < RuleCount) rules.registers[reg] = {1, offset}; + }; + save(16, -8); + if (mode == 0x01000000u) { + rules.cfaRegister = 6; + rules.cfaOffset = 16; + save(6, -16); + auto locations = encoding & 0x7fffu; + const auto slot = static_cast((encoding >> 16) & 0xffu); + for (int index = 0; index < 5; ++index) { + unsigned reg = 0; + switch (locations & 7u) { + case 1: reg = 3; break; + case 2: reg = 12; break; + case 3: reg = 13; break; + case 4: reg = 14; break; + case 5: reg = 15; break; + case 0: break; + default: return false; + } + if (reg) save(reg, -16 - 8 * slot + 8 * index); + locations >>= 3; + } + return true; + } + if (mode == 0) return false; + if (mode != 0x02000000u && mode != 0x03000000u) return false; + const auto stackEncoded = (encoding >> 16) & 0xffu; + const auto stackAdjust = (encoding >> 13) & 7u; + const auto regCount = (encoding >> 10) & 7u; + auto permutation = encoding & 0x3ffu; + if (regCount > 6) return false; + std::uint32_t stackSize = stackEncoded * 8u; + if (mode == 0x03000000u) { + if (stackEncoded > function.size() || function.size() - stackEncoded < 4) return false; + std::uint32_t immediate = 0; + std::memcpy(&immediate, function.data() + stackEncoded, 4); + stackSize = immediate + 8u * stackAdjust; + } + if (stackSize > 0x10000000u) return false; + rules.cfaRegister = 7; + rules.cfaOffset = static_cast(stackSize); + unsigned permuted[6] = {}; + switch (regCount) { + case 6: + permuted[0] = permutation / 120; permutation -= permuted[0] * 120; + permuted[1] = permutation / 24; permutation -= permuted[1] * 24; + permuted[2] = permutation / 6; permutation -= permuted[2] * 6; + permuted[3] = permutation / 2; permutation -= permuted[3] * 2; + permuted[4] = permutation; permuted[5] = 0; + break; + case 5: + permuted[0] = permutation / 120; permutation -= permuted[0] * 120; + permuted[1] = permutation / 24; permutation -= permuted[1] * 24; + permuted[2] = permutation / 6; permutation -= permuted[2] * 6; + permuted[3] = permutation / 2; permutation -= permuted[3] * 2; + permuted[4] = permutation; + break; + case 4: + permuted[0] = permutation / 60; permutation -= permuted[0] * 60; + permuted[1] = permutation / 12; permutation -= permuted[1] * 12; + permuted[2] = permutation / 3; permutation -= permuted[2] * 3; + permuted[3] = permutation; + break; + case 3: + permuted[0] = permutation / 20; permutation -= permuted[0] * 20; + permuted[1] = permutation / 4; permutation -= permuted[1] * 4; + permuted[2] = permutation; + break; + case 2: + permuted[0] = permutation / 5; permutation -= permuted[0] * 5; + permuted[1] = permutation; + break; + case 1: permuted[0] = permutation; break; + case 0: break; + default: return false; + } + bool used[7] = {}; + static const unsigned dwarf[7] = {0, 3, 12, 13, 14, 15, 6}; + for (unsigned index = 0; index < regCount; ++index) { + unsigned renumbered = 0; + unsigned reg = 0; + for (unsigned candidate = 1; candidate < 7; ++candidate) { + if (used[candidate]) continue; + if (renumbered == permuted[index]) { reg = dwarf[candidate]; used[candidate] = true; break; } + ++renumbered; + } + if (reg == 0) return false; + save(reg, -8 * static_cast(regCount - index + 1)); + } + return true; +} + +inline CompactParse ParseCompactUnwind(std::span info, std::span eh, std::uint32_t target, CompactDwarfDecode decode, void* user, CompactEntry& entry) { + entry = {}; + if (info.size() < 28) return CompactParse::Miss; + bool ok = true; + auto read = [&](std::size_t offset) { return ReadU32At(info, offset, ok); }; + if (read(0) != 1 || !ok) return CompactParse::Miss; + const auto commonOffset = read(4); + const auto commonCount = read(8); + const auto personalityOffset = read(12); + const auto personalityCount = read(16); + const auto indexOffset = read(20); + const auto indexCount = read(24); + if (!ok || indexCount < 2) return CompactParse::Miss; + std::uint32_t low = 0, high = indexCount; + const auto last = indexCount - 1; + while (low < high) { + const auto mid = low + (high - low) / 2; + const auto start = read(indexOffset + static_cast(mid) * 12u); + if (!ok) return CompactParse::Miss; + if (start <= target) { + const auto follows = mid == last ? target : read(indexOffset + static_cast(mid + 1) * 12u); + if (!ok) return CompactParse::Miss; + if (mid == last || follows > target) { low = mid; break; } + low = mid + 1; + } else high = mid; + } + if (!ok || low >= last) return CompactParse::Miss; + const auto pageFunction = read(indexOffset + static_cast(low) * 12u); + const auto nextFunction = read(indexOffset + static_cast(low + 1) * 12u); + const auto pageOffset = read(indexOffset + static_cast(low) * 12u + 4u); + const auto lsdaOffset = read(indexOffset + static_cast(low) * 12u + 8u); + const auto lsdaEnd = read(indexOffset + static_cast(low + 1) * 12u + 8u); + if (!ok || pageOffset == 0) return CompactParse::Miss; + const auto pageKind = read(pageOffset); + const auto pagePacked = read(pageOffset + 4u); + if (!ok) return CompactParse::Miss; + const auto entryOffset = pagePacked & 0xffffu; + const auto entryCount = pagePacked >> 16; + if (entryCount == 0) return CompactParse::Miss; + std::uint32_t encoding = 0; + std::uint32_t functionOffset = 0; + std::uint32_t functionEndOffset = 0; + if (pageKind == 2) { + low = 0; + high = entryCount; + while (low < high) { + const auto mid = low + (high - low) / 2; + const auto start = read(pageOffset + entryOffset + static_cast(mid) * 8u); + if (!ok) return CompactParse::Miss; + if (start <= target) { + if (mid + 1 == entryCount) { low = mid; break; } + const auto follows = read(pageOffset + entryOffset + static_cast(mid + 1) * 8u); + if (!ok) return CompactParse::Miss; + if (follows > target) { low = mid; break; } + low = mid + 1; + } else high = mid; + } + if (low >= entryCount) return CompactParse::Miss; + functionOffset = read(pageOffset + entryOffset + static_cast(low) * 8u); + encoding = read(pageOffset + entryOffset + static_cast(low) * 8u + 4u); + if (!ok) return CompactParse::Miss; + functionEndOffset = low + 1 < entryCount ? read(pageOffset + entryOffset + static_cast(low + 1) * 8u) : nextFunction; + } else if (pageKind == 3) { + const auto encodingPacked = read(pageOffset + 8u); + if (!ok) return CompactParse::Miss; + const auto encodingsOffset = encodingPacked & 0xffffu; + const auto pageTarget = target - pageFunction; + const auto pageLast = entryCount - 1; + low = 0; + high = entryCount; + while (low < high) { + const auto mid = low + (high - low) / 2; + const auto packed = read(pageOffset + entryOffset + static_cast(mid) * 4u); + if (!ok) return CompactParse::Miss; + const auto start = packed & 0x00ffffffu; + if (start <= pageTarget) { + if (mid == pageLast) { low = mid; break; } + const auto follows = read(pageOffset + entryOffset + static_cast(mid + 1) * 4u) & 0x00ffffffu; + if (!ok) return CompactParse::Miss; + if (follows > pageTarget) { low = mid; break; } + low = mid + 1; + } else high = mid; + } + if (low >= entryCount) return CompactParse::Miss; + const auto packed = read(pageOffset + entryOffset + static_cast(low) * 4u); + if (!ok) return CompactParse::Miss; + functionOffset = pageFunction + (packed & 0x00ffffffu); + if (low < pageLast) functionEndOffset = pageFunction + (read(pageOffset + entryOffset + static_cast(low + 1) * 4u) & 0x00ffffffu); + else functionEndOffset = nextFunction; + const auto encodingIndex = packed >> 24; + if (encodingIndex < commonCount) encoding = read(commonOffset + static_cast(encodingIndex) * 4u); + else encoding = read(pageOffset + encodingsOffset + static_cast(encodingIndex - commonCount) * 4u); + } else return CompactParse::Miss; + if (!ok || target < functionOffset || target > functionEndOffset || functionEndOffset < functionOffset) return CompactParse::Miss; + const auto mode = encoding & 0x0f000000u; + if (mode == 0) return CompactParse::Failed; + if (mode == 0x04000000u) { + const auto ehOffset = encoding & 0x00ffffffu; + if (eh.empty() || static_cast(ehOffset) >= eh.size()) return CompactParse::Failed; + if (decode == nullptr || !decode(ehOffset, user)) return CompactParse::Failed; + entry.encoding = encoding; + entry.functionOffset = functionOffset; + entry.functionEndOffset = functionEndOffset; + entry.dwarf = true; + entry.dwarfOffset = ehOffset; + return CompactParse::Found; + } + bool hasLsda = false; + std::uint32_t lsda = 0; + if (encoding & 0x40000000u) { + if (lsdaEnd < lsdaOffset) return CompactParse::Failed; + const auto count = (lsdaEnd - lsdaOffset) / 8u; + low = 0; + high = count; + while (low < high) { + const auto mid = low + (high - low) / 2; + const auto start = read(lsdaOffset + static_cast(mid) * 8u); + if (!ok) return CompactParse::Failed; + if (start == functionOffset) { + lsda = read(lsdaOffset + static_cast(mid) * 8u + 4u); + hasLsda = true; + break; + } + if (start < functionOffset) low = mid + 1; + else high = mid; + } + if (!ok || !hasLsda) return CompactParse::Failed; + } + bool hasPersonality = false; + std::int32_t personalityDelta = 0; + const auto personalityIndex = (encoding >> 28) & 3u; + if (personalityIndex != 0) { + if (personalityIndex - 1 >= personalityCount) return CompactParse::Failed; + personalityDelta = static_cast(read(personalityOffset + static_cast(personalityIndex - 1) * 4u)); + if (!ok) return CompactParse::Failed; + hasPersonality = true; + } + entry.encoding = encoding; + entry.functionOffset = functionOffset; + entry.functionEndOffset = functionEndOffset; + entry.hasPersonality = hasPersonality; + entry.personalityDelta = personalityDelta; + entry.hasLsda = hasLsda; + entry.lsdaOffset = lsda; + return CompactParse::Found; +} + +} +#endif diff --git a/core/libs/prx/libc/include/exceptions/Unwind.hpp b/core/libs/prx/libc/include/exceptions/Unwind.hpp index bb7f08357cc6..e0092e493be0 100644 --- a/core/libs/prx/libc/include/exceptions/Unwind.hpp +++ b/core/libs/prx/libc/include/exceptions/Unwind.hpp @@ -111,6 +111,12 @@ struct Frame { std::intptr_t dataAlign {}; unsigned returnRegister {}; bool signal {}; +#ifdef __APPLE__ + bool useCompact {}; + std::uint32_t compactEncoding {}; + Word functionStart {}; + Word functionEnd {}; +#endif #ifdef _WIN32 bool foreign {}; _Unwind_Context caller {}; diff --git a/core/libs/prx/libc/include/general/ExportMacros.hpp b/core/libs/prx/libc/include/general/ExportMacros.hpp index c175c74f2bf0..6f6f833d1d99 100644 --- a/core/libs/prx/libc/include/general/ExportMacros.hpp +++ b/core/libs/prx/libc/include/general/ExportMacros.hpp @@ -1,7 +1,9 @@ #ifndef CORE_LIBS_PRX_LIBC_INCLUDE_GENERAL_EXPORTMACROS_HPP #define CORE_LIBS_PRX_LIBC_INCLUDE_GENERAL_EXPORTMACROS_HPP -#if defined(__APPLE__) +#if defined(__EMSCRIPTEN__) && !defined(APS5_WASM_EXPORT_SCAN) + #define APS5_EXPORT(exportName, funcName) +#elif defined(__APPLE__) #define APS5_EXPORT(exportName, funcName) \ __asm__(".globl \"_" exportName "_nid_no_patch_cut\"\n\t" \ ".set \"_" exportName "_nid_no_patch_cut\", _" #funcName) diff --git a/core/libs/prx/libc/include/general/VabiMacros.hpp b/core/libs/prx/libc/include/general/VabiMacros.hpp index 1eed45e459bd..49994ae1e482 100644 --- a/core/libs/prx/libc/include/general/VabiMacros.hpp +++ b/core/libs/prx/libc/include/general/VabiMacros.hpp @@ -3,6 +3,8 @@ #ifdef _WIN32 #define APS5_VABI __attribute__((sysv_abi)) +#elif defined(APS5_WASM_EXPORT_SCAN) +#define APS5_VABI APS5_VABI #else #define APS5_VABI #endif diff --git a/core/libs/prx/libc/include/specifics/itanium/CxxAbi.hpp b/core/libs/prx/libc/include/specifics/itanium/CxxAbi.hpp index f4957fd7b3e9..b38b463e14be 100644 --- a/core/libs/prx/libc/include/specifics/itanium/CxxAbi.hpp +++ b/core/libs/prx/libc/include/specifics/itanium/CxxAbi.hpp @@ -3,6 +3,12 @@ #include +#ifdef __EMSCRIPTEN__ +namespace __cxxabiv1 { +extern "C" int __cxa_thread_atexit(void (*)(void*), void*, void*) noexcept; +} +#endif + #ifdef _LIBCPPABI_VERSION #include diff --git a/core/libs/prx/libc/src/AllocatingStrings.cpp b/core/libs/prx/libc/src/AllocatingStrings.cpp index 9f346a90f3ef..672b2269c2e6 100644 --- a/core/libs/prx/libc/src/AllocatingStrings.cpp +++ b/core/libs/prx/libc/src/AllocatingStrings.cpp @@ -2,13 +2,34 @@ #include "prx/libc/include/ApplicationHeap.hpp" #include "prx/libc/include/General.hpp" #include "SceTypes.hpp" +#include #include +#include #include #include #include +#ifdef _WIN32 +#include +#include +extern "C" _invalid_parameter_handler _set_thread_local_invalid_parameter_handler(_invalid_parameter_handler); +#else +#include +#endif + +namespace { +std::atomic g_guestWriteHook{nullptr}; +} extern "C" { +void LibcSetGuestWriteHook_nid_no_patch(GuestWriteHook_nid_no_patch hook) { + g_guestWriteHook.store(hook, std::memory_order_release); +} + +GuestWriteHook_nid_no_patch LibcGetGuestWriteHook_nid_no_patch() { + return g_guestWriteHook.load(std::memory_order_acquire); +} + char* APS5_VABI strndup_nid_postfix(const char* source, std::size_t limit) { if (!source) { errno = 22; return nullptr; } std::size_t length = 0; @@ -46,4 +67,65 @@ int APS5_VABI asprintf_nid_postfix(char** destination, const char* format, ...) return result; } +int APS5_VABI vdprintf_nid_postfix(int descriptor, const char* format, VaList* args) { + if (descriptor > SHRT_MAX) { + errno = 24; + return -1; + } + if (descriptor < 0) { + errno = 9; + return -1; + } + char* text = nullptr; + const int count = vasprintf_nid_postfix(&text, format, args); + if (count < 0) return -1; + std::size_t remaining = static_cast(count); + const char* ptr = text; + int writeError = 0; + while (remaining > 0) { + std::int64_t written = 0; + if (const auto hook = g_guestWriteHook.load(std::memory_order_acquire)) { + written = hook(descriptor, ptr, remaining); + } else { +#ifdef _WIN32 + const auto ignore = +[](const wchar_t*, const wchar_t*, const wchar_t*, unsigned int, std::uintptr_t) {}; + const auto previous = _set_thread_local_invalid_parameter_handler(ignore); + written = ::_write(descriptor, ptr, static_cast(remaining)); + _set_thread_local_invalid_parameter_handler(previous); +#else + written = ::write(descriptor, ptr, remaining); +#endif + } + if (written <= 0) { + writeError = errno; + break; + } + ptr += written; + remaining -= static_cast(written); + } + ApplicationHeapFree_nid_no_patch(text); + if (remaining > 0) { + if (writeError != 0) errno = writeError; + return -1; + } + return count; +} + +int APS5_VABI dprintf_nid_postfix(int descriptor, const char* format, ...) { +#ifdef _WIN32 + __builtin_sysv_va_list args; + __builtin_sysv_va_start(args, format); +#else + std::va_list args; + va_start(args, format); +#endif + const int result = vdprintf_nid_postfix(descriptor, format, reinterpret_cast(args)); +#ifdef _WIN32 + __builtin_sysv_va_end(args); +#else + va_end(args); +#endif + return result; +} + } diff --git a/core/libs/prx/libc/src/ApplicationProcessParameters.cpp b/core/libs/prx/libc/src/ApplicationProcessParameters.cpp index 183aa3203760..ed5f1fb309f4 100644 --- a/core/libs/prx/libc/src/ApplicationProcessParameters.cpp +++ b/core/libs/prx/libc/src/ApplicationProcessParameters.cpp @@ -10,7 +10,7 @@ #define NOMINMAX #endif #include -#elif defined(__linux__) || defined(__APPLE__) +#elif defined(__linux__) || defined(__APPLE__) || defined(__EMSCRIPTEN__) #include "prx/libc/include/specifics/linux/ElfTypes.hpp" #include #endif @@ -88,7 +88,7 @@ const void* ApplicationProcessParameters_nid_no_patch() { } if (!found) throw std::runtime_error("application heap: process metadata is missing; relink the executable"); return result; -#elif defined(__linux__) || defined(__APPLE__) +#elif defined(__linux__) || defined(__APPLE__) || defined(__EMSCRIPTEN__) struct Search { const void* parameters = nullptr; bool invalid = false; diff --git a/core/libs/prx/libc/src/BoundsChecking.cpp b/core/libs/prx/libc/src/BoundsChecking.cpp index b1bf73a2a1d7..634f860c06b8 100644 --- a/core/libs/prx/libc/src/BoundsChecking.cpp +++ b/core/libs/prx/libc/src/BoundsChecking.cpp @@ -54,7 +54,7 @@ void* APS5_VABI bsearch_s_nid_postfix(const void* key, const void* base, std::si return nullptr; } if (count == 0) return nullptr; - if (!key || !base || !compare || size == 0) { + if (!key || !base || !compare) { violation("bsearch_s: bad argument", guestEinval); return nullptr; } diff --git a/core/libs/prx/libc/src/DinkumwareInternals.cpp b/core/libs/prx/libc/src/DinkumwareInternals.cpp index fd7ee6ec4f34..c7156b090285 100644 --- a/core/libs/prx/libc/src/DinkumwareInternals.cpp +++ b/core/libs/prx/libc/src/DinkumwareInternals.cpp @@ -1,12 +1,15 @@ #include "prx/libc/include/Api.hpp" #include +#include #include #include #include #include #include #include +#include #include +#include #include #include @@ -16,23 +19,207 @@ namespace { constexpr long long ExponentLimit = 1000000000; constexpr int InvalidArgument = 22; +constexpr int DomainError = 33; constexpr int RangeError = 34; +constexpr long double LogPolynomial[] = { + 0x87f45b3375e0c9edp-66L, 0x87a58c55129af2f8p-66L, 0x9d90cfd7547e4ed2p-66L, 0xba2e6ba9488d3d0cp-66L, + 0xe38e393a60e2888bp-66L, 0x924924920646cc89p-65L, 0xcccccccccd00c2ebp-65L, 0xaaaaaaaaaaaaa334p-64L, +}; + bool Hexadecimal(const char* text) { while (std::isspace(static_cast(*text))) ++text; if (*text == '+' || *text == '-') ++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(); const int saved = guestErrno; if (error != nullptr) *error = 0; + if (const char* stop = NanSubjectEnd_nid_no_patch(text)) { + if (end != nullptr) *end = const_cast(stop); + 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; + if (pten == 0 && Hexadecimal(text)) { + guestErrno = saved; + return value; + } const bool overflowed = std::isinf(value) && guestErrno == RangeError; if (pten != 0 && stop != text && (std::isfinite(value) || overflowed)) { if (Hexadecimal(text)) NotImplemented_nid_no_patch(function); @@ -426,8 +613,46 @@ float APS5_VABI _FLog_nid_postfix(float x, int base) { } long double APS5_VABI _LLog_nid_postfix(long double x, int base) { - if (base > 0) return log10l_nid_postfix(x); - return base == 0 ? logl_nid_postfix(x) : log2l_nid_postfix(x); + static_assert(sizeof(long double) == 16 && std::numeric_limits::digits == 64); + std::uint64_t mantissa; + std::uint16_t signExponent; + std::memcpy(&mantissa, &x, sizeof(mantissa)); + std::memcpy(&signExponent, reinterpret_cast(&x) + sizeof(mantissa), sizeof(signExponent)); + const int exponent = signExponent & 0x7fff; + const bool negative = (signExponent & 0x8000) != 0; + if (exponent == 0x7fff) { + if ((mantissa & 0x7fffffffffffffffull) != 0 || !negative) return x; + } else if (mantissa == 0) { + std::feraiseexcept(FE_DIVBYZERO); + *__error_nid_postfix() = RangeError; + return -std::numeric_limits::infinity(); + } + if (negative) { + std::feraiseexcept(FE_INVALID); + *__error_nid_postfix() = DomainError; + return std::numeric_limits::quiet_NaN(); + } + const int shift = std::countl_zero(mantissa); + int scale = std::max(exponent, 1) - shift - 0x3ffe; + const std::uint64_t normalized = mantissa << shift; + const std::uint16_t halfExponent = 0x3ffe; + long double fraction = 0; + std::memcpy(&fraction, &normalized, sizeof(normalized)); + std::memcpy(reinterpret_cast(&fraction) + sizeof(normalized), &halfExponent, sizeof(halfExponent)); + if (fraction < 0xb504f333f9de6484p-64L) { + fraction = fraction + fraction; + --scale; + } + const long double y = fraction - 1.0L; + const long double z = y / (fraction + 1.0L); + const long double w = z * z; + long double p = LogPolynomial[0]; + for (std::size_t index = 1; index < std::size(LogPolynomial); ++index) p = p * w + LogPolynomial[index]; + const long double q = z * (y - p * w); + const long double e = scale; + if (base == 0) return (y - (q + -0xfbe8e7bcd5e4f1dap-87L * e)) + e * 0x1.62e42cp-1f; + if (base > 0) return ((0xa937287195355babp-89L * y - (q * 0xde5bd8a937287195p-65L + -0xa13ef3fde623e256p-87L * e)) + y * 0x1.bcb7bp-2f) + e * 0x1.34413p-2f; + return ((q * -0xb8aa3b295c17f0bcp-63L + 0xa5705fc2eefa1ffbp-89L * y) + y * 0x1.715476p+0f) + e; } long double APS5_VABI _LDivide_nid_postfix(long double x, long double y) { diff --git a/core/libs/prx/libc/src/Errors.cpp b/core/libs/prx/libc/src/Errors.cpp index b52a21120949..f934c4de09d0 100644 --- a/core/libs/prx/libc/src/Errors.cpp +++ b/core/libs/prx/libc/src/Errors.cpp @@ -46,9 +46,25 @@ constexpr const char* messages[] = { static_assert(sizeof(messages) / sizeof(messages[0]) == 97); bool NamedByStrerror(int error) { return error > 0 && error < 95; } +constexpr struct { + int error; + const char* text; +} extendedMessages[] = { + {107, "State not recoverable"}, {108, "Owner dead"}, {152, "File positioning error"}, + {1040, "No message available"}, {1050, "No stream resources"}, {1051, "Not a stream"}, + {1062, "Other"}, {1074, "Stream timeout"}, +}; + +const char* ExtendedMessage(int error) { + for (const auto& entry : extendedMessages) + if (entry.error == error) return entry.text; + return nullptr; +} + void Describe(int error, char (&text)[128]) { if (error == 0) std::snprintf(text, sizeof(text), "No error"); else if (NamedByStrerror(error)) std::snprintf(text, sizeof(text), "%s", messages[error]); + else if (const char* extended = ExtendedMessage(error)) std::snprintf(text, sizeof(text), "%s", extended); else std::snprintf(text, sizeof(text), "error_code=0x%08x", static_cast(error)); } } diff --git a/core/libs/prx/libc/src/FileAndHeap.cpp b/core/libs/prx/libc/src/FileAndHeap.cpp index d46864447ad0..875828d095fe 100644 --- a/core/libs/prx/libc/src/FileAndHeap.cpp +++ b/core/libs/prx/libc/src/FileAndHeap.cpp @@ -677,6 +677,62 @@ void* APS5_VABI reallocarray_nid_postfix(void* ptr, size_t nmemb, size_t size) { return realloc_nid_postfix(ptr, nmemb * size); } +/* + * Copyright (c) 2008, 2017 Otto Moerbeek + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +void* APS5_VABI recallocarray_nid_postfix(void* ptr, size_t oldnmemb, size_t nmemb, size_t size) { + if (size != 0 && nmemb > std::numeric_limits::max() / size) { + errno = 12; + return nullptr; + } + if (ptr == nullptr) { + void* result = calloc_nid_postfix(nmemb, size); + if (result == nullptr && nmemb != 0 && size != 0) errno = 12; + return result; + } + if (size != 0 && oldnmemb > std::numeric_limits::max() / size) { + errno = 22; + return nullptr; + } + const size_t newsize = nmemb * size; + const size_t oldsize = oldnmemb * size; + if (newsize <= oldsize) { + const size_t d = oldsize - newsize; + if (d < oldsize / 2 && d < 16384) { + auto* bytes = static_cast(ptr); + for (size_t index = 0; index < d; ++index) bytes[newsize + index] = 0; + return ptr; + } + } + void* newptr = malloc_nid_postfix(newsize); + if (newptr == nullptr) { + errno = 12; + return nullptr; + } + if (newsize > oldsize) { + std::memcpy(newptr, ptr, oldsize); + std::memset(static_cast(newptr) + oldsize, 0, newsize - oldsize); + } else { + std::memcpy(newptr, ptr, newsize); + } + auto* oldbytes = static_cast(ptr); + for (size_t index = 0; index < oldsize; ++index) oldbytes[index] = 0; + free_nid_postfix(ptr); + return newptr; +} + void* APS5_VABI memalign_nid_postfix(size_t alignment, size_t size) { if (!ApplicationHeapDefault_nid_no_patch()) { if (!validAlignment(alignment)) { @@ -844,4 +900,15 @@ int APS5_VABI qsort_s_nid_postfix(void* base, size_t count, size_t size, GuestCo return 0; } +void APS5_VABI qsort_r_nid_postfix(void* base, size_t count, size_t size, void* thunk, int (APS5_VABI *compare)(void*, const void*, const void*)) { + if (!compare) throw std::invalid_argument("qsort_r: null comparator"); + if (size == 0) throw std::invalid_argument("qsort_r: zero element size"); + if (count == 0) return; + if (!base) throw std::invalid_argument("qsort_r: null base"); + if (count > std::numeric_limits::max() / size) throw std::overflow_error("qsort_r: array size overflow"); + if (count == 1) return; + + SortElements(static_cast(base), count, size, [compare, thunk](const void* left, const void* right) { return compare(thunk, left, right); }); +} + } diff --git a/core/libs/prx/libc/src/FileLock.cpp b/core/libs/prx/libc/src/FileLock.cpp index 1c088bb0d166..f73c79cbeabe 100644 --- a/core/libs/prx/libc/src/FileLock.cpp +++ b/core/libs/prx/libc/src/FileLock.cpp @@ -3,10 +3,14 @@ #ifdef _WIN32 #include +#include +#include #include #include #include #include +#include +#include #include #include "prx/libc/include/WindowsDescriptor.hpp" @@ -20,15 +24,74 @@ constexpr int LockUnlock = 8; constexpr DWORD LockByteLow = 0xFFFFFFFE; constexpr DWORD LockByteHigh = 0x7FFFFFFF; +using DirectoryKey = std::pair; + +struct DirectoryHolders { + int shared = 0; + bool exclusive = false; +}; + +std::mutex g_directoryMutex; +std::condition_variable g_directoryChanged; +std::map g_directoryLocks; + +bool SetDirectoryLock(const DirectoryKey& key, int& held, int mode, bool nonblocking) { + std::unique_lock lock(g_directoryMutex); + const auto release = [&] { + const auto found = g_directoryLocks.find(key); + if (found != g_directoryLocks.end()) { + if (held == LockExclusive) found->second.exclusive = false; + else if (held == LockShared) --found->second.shared; + if (!found->second.exclusive && found->second.shared == 0) g_directoryLocks.erase(found); + } + held = 0; + }; + const auto busy = [&] { + const auto found = g_directoryLocks.find(key); + if (found == g_directoryLocks.end()) return false; + const int others = found->second.shared - (held == LockShared ? 1 : 0); + return (found->second.exclusive && held != LockExclusive) || (mode == LockExclusive && others != 0); + }; + if (mode != LockUnlock && busy()) { + if (nonblocking) { + ::SetLastError(ERROR_LOCK_VIOLATION); + return false; + } + if (held != 0) { + release(); + g_directoryChanged.notify_all(); + } + g_directoryChanged.wait(lock, [&] { return !busy(); }); + } + release(); + if (mode != LockUnlock) { + auto& holders = g_directoryLocks[key]; + if (mode == LockExclusive) holders.exclusive = true; + else ++holders.shared; + held = mode; + } + g_directoryChanged.notify_all(); + return true; +} + +std::optional DirectoryOf(HANDLE handle) { + BY_HANDLE_FILE_INFORMATION information{}; + if (!::GetFileInformationByHandle(handle, &information) || (information.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) return std::nullopt; + return DirectoryKey{information.dwVolumeSerialNumber, (static_cast(information.nFileIndexHigh) << 32) | information.nFileIndexLow}; +} + struct LockState { std::mutex mutex; int mode = 0; HANDLE locker = nullptr; + bool classified = false; + std::optional directory; LockState() = default; LockState(const LockState&) = delete; LockState& operator=(const LockState&) = delete; ~LockState() { + if (directory && mode != 0) SetDirectoryLock(*directory, mode, LockUnlock, true); if (locker != nullptr) ::CloseHandle(locker); } }; @@ -65,6 +128,11 @@ int GuestFileLock_nid_no_patch(int fd, int operation) { }(); std::lock_guard lock(state->mutex); if (state->mode == mode) return 0; + if (!state->classified) { + state->directory = DirectoryOf(handle); + state->classified = true; + } + if (state->directory) return SetDirectoryLock(*state->directory, state->mode, mode, (operation & LockNonblocking) != 0) ? 0 : -1; if (state->mode != 0) { OVERLAPPED overlapped{}; overlapped.Offset = LockByteLow; diff --git a/core/libs/prx/libc/src/Formatting.cpp b/core/libs/prx/libc/src/Formatting.cpp index 0f5176f7fc2c..087f3b15b733 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,9 +111,51 @@ 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__) - return __isoc99_vsscanf(input, format, args); + const int savedError = errno; + const int result = __isoc99_vsscanf(input, format, args); + if (result == EOF && errno == 0) errno = savedError; + return result; #else return std::vsscanf(input, format, args); #endif @@ -128,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 @@ -318,6 +366,28 @@ int ScanSource(TSource source, const char* format, bool secure, NextPointer next target = nextPointer(); if (target == nullptr) return EOF; } + if constexpr (!TSource::Contiguous) if (conversion == 'c' && length != "l") { + const unsigned long wanted = width == 0 ? 1 : width; + if (secure && !suppress) { + const auto capacity = static_cast(nextCapacity()); + if (capacity == 0 || wanted > capacity) { + if (capacity != 0) static_cast(target)[0] = '\0'; + return finish(assigned); + } + } + unsigned long taken = 0; + while (taken < wanted) { + const int next = source.Peek(); + if (next == EOF) break; + if (!suppress) static_cast(target)[taken] = static_cast(next); + source.Skip(); + ++taken; + } + if (taken == 0) return finish(converted ? assigned : EOF); + converted = true; + if (!suppress) ++assigned; + continue; + } if (sized && !suppress) { const auto capacity = static_cast(nextCapacity()); const unsigned long limit = conversion == 'c' ? capacity : (capacity == 0 ? 0 : capacity - 1); @@ -368,6 +438,11 @@ template int ScanGuestStream(FileStream* stream, const char* format, NextPointer nextPointer, NextCapacity nextCapacity) { if (stream == nullptr || format == nullptr) return EOF; if (!stream->IsOpen()) { errno = 9; return EOF; } + flockfile_nid_postfix(stream); + struct Unlock { + FileStream* stream; + ~Unlock() { funlockfile_nid_postfix(stream); } + } unlock{stream}; auto* native = GetNativeStream(stream); if (!stream->SwitchToReading()) return EOF; #ifndef _WIN32 diff --git a/core/libs/prx/libc/src/General.cpp b/core/libs/prx/libc/src/General.cpp index 972d2f2070be..9ed57a5fb066 100644 --- a/core/libs/prx/libc/src/General.cpp +++ b/core/libs/prx/libc/src/General.cpp @@ -581,6 +581,9 @@ std::atomic g_hostStandardError{-1}; } extern "C" int KeepHostStandardError_nid_no_patch() { +#ifdef __EMSCRIPTEN__ + return 2; +#else const std::lock_guard lock(g_hostStandardErrorMutex); if (const int kept = g_hostStandardError.load(); kept >= 0) return kept; const int kept = ::fcntl(2, F_DUPFD_CLOEXEC, 3); @@ -599,6 +602,7 @@ extern "C" int KeepHostStandardError_nid_no_patch() { stderr = stream; g_hostStandardError.store(kept); return kept; +#endif } extern "C" int HostStandardError_nid_no_patch() { @@ -611,6 +615,9 @@ std::atomic g_hostStandardOutput{-1}; } extern "C" int KeepHostStandardOutput_nid_no_patch() { +#ifdef __EMSCRIPTEN__ + NotImplemented_nid_no_patch(__func__); +#else const std::lock_guard lock(g_hostStandardOutputMutex); if (const int kept = g_hostStandardOutput.load(); kept >= 0) return kept; const int kept = ::fcntl(1, F_DUPFD_CLOEXEC, 3); @@ -629,6 +636,7 @@ extern "C" int KeepHostStandardOutput_nid_no_patch() { stdout = stream; g_hostStandardOutput.store(kept); return kept; +#endif } extern "C" int DuplicateHostDescriptor_nid_no_patch(int descriptor) { diff --git a/core/libs/prx/libc/src/GuestAllocations.cpp b/core/libs/prx/libc/src/GuestAllocations.cpp index cca11ea1e4b2..e0988c8c62c1 100644 --- a/core/libs/prx/libc/src/GuestAllocations.cpp +++ b/core/libs/prx/libc/src/GuestAllocations.cpp @@ -103,7 +103,7 @@ void recordChange(void* mutation, const void* pointer, std::size_t bytes) { if (mutation != nullptr && bytes != 0) static_cast(mutation)->changed.emplace_back(reinterpret_cast(pointer), bytes); } -#if !defined(_WIN32) && !defined(__APPLE__) +#if !defined(_WIN32) && !defined(__APPLE__) && !defined(__EMSCRIPTEN__) std::vector> fileBackedWritableImage() { const auto image = std::filesystem::read_symlink("/proc/self/exe").string(); std::ifstream maps("/proc/self/maps"); @@ -631,7 +631,7 @@ struct RangePatch { }; RangePatch replaceRange(const void* pointer, std::size_t bytes, bool remove, bool readable, bool writable, bool gpu) { - const auto address = reinterpret_cast(pointer); + const std::uint64_t address = reinterpret_cast(pointer); require(bytes != 0 && bytes <= std::numeric_limits::max() - address, "invalid guest protection or unmap range"); require(!writable || readable, "writable guest allocation must be readable"); const auto end = address + bytes; diff --git a/core/libs/prx/libc/src/GuestArena.cpp b/core/libs/prx/libc/src/GuestArena.cpp index bbe4fda6b94b..948c8d841a72 100644 --- a/core/libs/prx/libc/src/GuestArena.cpp +++ b/core/libs/prx/libc/src/GuestArena.cpp @@ -17,6 +17,7 @@ #include #endif #include +#include #include #include #include @@ -56,6 +57,11 @@ constexpr std::uintptr_t SystemReservedStart = 0x00000007FFFFC000ull + GuestAren constexpr std::uintptr_t SystemReservedEnd = 0x0000001000000000ull + GuestArenaOffset; constexpr std::uintptr_t ApplicationAreaEnd = 0x000000FC00000000ull + GuestArenaOffset; +#ifdef __EMSCRIPTEN__ +constexpr std::size_t EmscriptenArenaAlignment = std::size_t{1} << 32; +constexpr std::size_t EmscriptenArenaBytes = std::size_t{8} << 30; +#endif + std::uintptr_t alignUp(std::uintptr_t value, std::size_t alignment) { return (value + alignment - 1) & ~(static_cast(alignment) - 1); } @@ -152,6 +158,9 @@ class Arena { std::lock_guard lock(_lock); const auto start = reinterpret_cast(pointer); const auto end = start + bytes; +#ifdef __EMSCRIPTEN__ + NoteDirtyLocked(start, end); +#endif auto it = _used.upper_bound(start); if (it != _used.begin()) --it; while (it != _used.end() && it->first < end) { @@ -172,7 +181,12 @@ class Arena { private: Arena() { -#if defined(__linux__) || defined(__APPLE__) +#if defined(__EMSCRIPTEN__) + void* const region = std::aligned_alloc(EmscriptenArenaAlignment, EmscriptenArenaBytes); + if (region == nullptr) throw std::runtime_error("guest arena: cannot reserve the guest range in WebAssembly memory"); + _base = reinterpret_cast(region); + _end = _base + EmscriptenArenaBytes; +#elif defined(__linux__) || defined(__APPLE__) SeedHostUsedRanges(); #elif defined(_WIN32) _writeWatched = std::getenv("APS5_NO_WRITE_WATCH") == nullptr; @@ -308,6 +322,46 @@ class Arena { } #endif +#ifdef __EMSCRIPTEN__ + void NoteDirtyLocked(std::uintptr_t start, std::uintptr_t end) { + auto it = _dirty.upper_bound(start); + if (it != _dirty.begin() && std::prev(it)->second >= start) --it; + while (it != _dirty.end() && it->first <= end) { + start = std::min(start, it->first); + end = std::max(end, it->second); + it = _dirty.erase(it); + } + _dirty.emplace(start, end); + } + +public: + void NoteDirty(const void* pointer, std::size_t bytes) { + std::lock_guard lock(_lock); + const auto start = reinterpret_cast(pointer); + NoteDirtyLocked(start, start + bytes); + } + + void ZeroDirty(void* pointer, std::size_t bytes) { + std::lock_guard lock(_lock); + const auto start = reinterpret_cast(pointer); + const auto end = start + bytes; + auto it = _dirty.upper_bound(start); + if (it != _dirty.begin() && std::prev(it)->second > start) --it; + while (it != _dirty.end() && it->first < end) { + const auto [dirtyStart, dirtyEnd] = *it; + const auto first = std::max(dirtyStart, start); + const auto last = std::min(dirtyEnd, end); + std::memset(reinterpret_cast(first), 0, last - first); + it = _dirty.erase(it); + if (dirtyStart < first) _dirty.emplace(dirtyStart, first); + if (dirtyEnd > last) it = _dirty.emplace(last, dirtyEnd).first; + } + } + +private: + std::map _dirty; +#endif + std::mutex _lock; std::map _used; std::vector> _holes; @@ -353,6 +407,9 @@ class Arena { #ifndef _WIN32 void ReleaseHostRegion(const void* pointer, std::size_t bytes) { +#ifdef __EMSCRIPTEN__ + throw std::runtime_error("guest arena: host region release is unsupported in WebAssembly"); +#else Release(pointer, bytes); std::lock_guard lock(_lock); const auto start = reinterpret_cast(pointer); @@ -368,6 +425,7 @@ class Arena { } _hostRegions = std::move(kept); static_cast(ReserveNoReplace(start, bytes)); +#endif } #endif }; @@ -615,6 +673,24 @@ void GuestArenaReset_nid_postfix(void* pointer, std::size_t bytes) { if (!Arena::Get().Contains(pointer, bytes)) throw OutsideArena("reset", pointer, bytes); if (PlaceAt(pointer, bytes, 0x01) == MAP_FAILED) throw std::system_error(errno, std::generic_category(), "guest arena reset failed"); } +#elif defined(__EMSCRIPTEN__) +void GuestArenaSetProtection_nid_postfix(std::uintptr_t address, std::size_t bytes, std::uint32_t protection) { + static_cast(protection); + if (!Arena::Get().Contains(reinterpret_cast(address), bytes)) throw OutsideArena("set protection", reinterpret_cast(address), bytes); +} + +void GuestArenaCommit_nid_postfix(void* pointer, std::size_t bytes, std::uint32_t protection, std::size_t granule) { + static_cast(protection); + static_cast(granule); + if (!Arena::Get().Contains(pointer, bytes)) throw OutsideArena("commit", pointer, bytes); + Arena::Get().MarkUsedForCommit(pointer, bytes); + Arena::Get().ZeroDirty(pointer, bytes); +} + +void GuestArenaReset_nid_postfix(void* pointer, std::size_t bytes) { + if (!Arena::Get().Contains(pointer, bytes)) throw OutsideArena("reset", pointer, bytes); + Arena::Get().NoteDirty(pointer, bytes); +} #endif bool GuestArenaWriteWatched_nid_postfix() { diff --git a/core/libs/prx/libc/src/GuestHeap.cpp b/core/libs/prx/libc/src/GuestHeap.cpp index d6d074b65316..2c6d1ab56378 100644 --- a/core/libs/prx/libc/src/GuestHeap.cpp +++ b/core/libs/prx/libc/src/GuestHeap.cpp @@ -264,6 +264,28 @@ void rawFree(void* raw, std::size_t blockBytes) { } } +struct Block { + void* raw; + std::size_t bytes; +}; + +std::unordered_map& blocks() { + static auto* value = new std::unordered_map; + return *value; +} + +Block validatedBlock(const void* pointer, std::size_t bytes) { + const auto found = blocks().find(pointer); + if (found == blocks().end()) throw std::runtime_error("guest heap allocation metadata is missing"); + const auto block = found->second; + if (reinterpret_cast(pointer)[-2] != block.raw || reinterpret_cast(pointer)[-1] != block.bytes) + throw std::runtime_error("guest heap block header differs from allocation metadata"); + const auto offset = reinterpret_cast(pointer) - reinterpret_cast(block.raw); + if (offset > block.bytes || bytes > block.bytes - offset) + throw std::runtime_error("guest heap allocation exceeds its block"); + return block; +} + void* allocate(GuestAllocations::Mutation& mutation, std::size_t alignment, std::size_t bytes, bool gpu) { if (alignment == 0 || (alignment & (alignment - 1)) != 0) throw std::invalid_argument("invalid guest heap alignment"); alignment = std::max(alignment, MinimumAlignment); @@ -276,7 +298,13 @@ void* allocate(GuestAllocations::Mutation& mutation, std::size_t alignment, std: reinterpret_cast(pointer)[-2] = raw; reinterpret_cast(pointer)[-1] = blockBytes; try { - mutation.Add(pointer, bytes, true, true, gpu); + blocks().emplace(pointer, Block{raw, blockBytes}); + try { + mutation.Add(pointer, bytes, true, true, gpu); + } catch (...) { + blocks().erase(pointer); + throw; + } } catch (...) { rawFree(raw, blockBytes); throw; @@ -291,21 +319,18 @@ void* emptyInPlace(GuestAllocations::Mutation& mutation, void* pointer, bool gpu return pointer; } -std::size_t ownedBytes(const void* pointer) { - const auto raw = reinterpret_cast(reinterpret_cast(pointer)[-2]); - const auto blockBytes = reinterpret_cast(pointer)[-1]; - return raw + blockBytes - reinterpret_cast(pointer); +std::size_t ownedBytes(const void* pointer, const Block& block) { + return reinterpret_cast(block.raw) + block.bytes - reinterpret_cast(pointer); } -bool keepsBlockSize(const void* pointer, std::size_t alignment, std::size_t bytes) { +bool keepsBlockSize(const Block& block, const void* pointer, std::size_t alignment, std::size_t bytes) { if (alignment == 0 || (alignment & (alignment - 1)) != 0) return false; alignment = std::max(alignment, MinimumAlignment); const std::size_t padding = alignment > RawAlignment ? alignment : 0; if (bytes > std::numeric_limits::max() - HeaderBytes - padding - LargeGranuleBytes) return false; - const auto blockBytes = reinterpret_cast(pointer)[-1]; const auto total = bytes + HeaderBytes + padding; const auto freshBlockBytes = GuestArena::GuestArenaAvailable_nid_postfix() ? ArenaHeap::Get().BlockBytesFor(total) : total; - return freshBlockBytes == blockBytes && bytes <= ownedBytes(pointer); + return freshBlockBytes == block.bytes && bytes <= ownedBytes(pointer, block); } void* resizeInPlace(GuestAllocations::Mutation& mutation, void* pointer, std::size_t bytes, bool gpu) { @@ -314,11 +339,12 @@ void* resizeInPlace(GuestAllocations::Mutation& mutation, void* pointer, std::si return pointer; } -void free(GuestAllocations::Mutation& mutation, void* pointer) { +void free(GuestAllocations::Mutation& mutation, void* pointer, std::size_t bytes) { + const auto block = validatedBlock(pointer, bytes); mutation.Remove(pointer); - const auto blockBytes = reinterpret_cast(pointer)[-1]; - shrink(usage().inUse, blockBytes); - rawFree(reinterpret_cast(pointer)[-2], blockBytes); + blocks().erase(pointer); + shrink(usage().inUse, block.bytes); + rawFree(block.raw, block.bytes); } } @@ -333,7 +359,7 @@ void GuestHeapFree_nid_postfix(void* pointer) { GuestAllocations::Mutation mutation; const auto range = mutation.Find(pointer); mutation.RequireUnpinned(pointer, range.bytes); - free(mutation, pointer); + free(mutation, pointer, range.bytes); } void* GuestHeapReallocate_nid_postfix(void* pointer, std::size_t bytes) { @@ -341,11 +367,12 @@ void* GuestHeapReallocate_nid_postfix(void* pointer, std::size_t bytes) { GuestAllocations::Mutation mutation; const auto range = mutation.Find(pointer); mutation.RequireUnpinned(pointer, range.bytes); + const auto block = validatedBlock(pointer, range.bytes); if (bytes == 0) return emptyInPlace(mutation, pointer, range.gpu); - if (keepsBlockSize(pointer, MinimumAlignment, bytes)) return resizeInPlace(mutation, pointer, bytes, range.gpu); + if (keepsBlockSize(block, pointer, MinimumAlignment, bytes)) return resizeInPlace(mutation, pointer, bytes, range.gpu); void* result = allocate(mutation, MinimumAlignment, bytes, range.gpu); std::memcpy(result, pointer, std::min(bytes, range.bytes)); - free(mutation, pointer); + free(mutation, pointer, range.bytes); return result; } @@ -354,17 +381,18 @@ void* GuestHeapRealign_nid_postfix(void* pointer, std::size_t bytes, std::size_t GuestAllocations::Mutation mutation; const auto range = mutation.Find(pointer); mutation.RequireUnpinned(pointer, range.bytes); + const auto block = validatedBlock(pointer, range.bytes); if (bytes == 0) { if (alignment == 0 || (alignment & (alignment - 1)) != 0) throw std::invalid_argument("invalid guest heap alignment"); if (reinterpret_cast(pointer) % alignment != 0) throw std::invalid_argument("reallocalign to 0 bytes with an alignment the block does not have is not measured on the console"); return emptyInPlace(mutation, pointer, range.gpu); } - if (alignment != 0 && (alignment & (alignment - 1)) == 0 && reinterpret_cast(pointer) % alignment == 0 && keepsBlockSize(pointer, alignment, bytes)) + if (alignment != 0 && (alignment & (alignment - 1)) == 0 && reinterpret_cast(pointer) % alignment == 0 && keepsBlockSize(block, pointer, alignment, bytes)) return resizeInPlace(mutation, pointer, bytes, range.gpu); void* result = allocate(mutation, alignment, bytes, range.gpu); std::memcpy(result, pointer, std::min(bytes, range.bytes)); - free(mutation, pointer); + free(mutation, pointer, range.bytes); return result; } diff --git a/core/libs/prx/libc/src/GuestWriteWatch.cpp b/core/libs/prx/libc/src/GuestWriteWatch.cpp index 6d9eaa4e4c9f..ac097710bca1 100644 --- a/core/libs/prx/libc/src/GuestWriteWatch.cpp +++ b/core/libs/prx/libc/src/GuestWriteWatch.cpp @@ -593,11 +593,14 @@ class Watch { if (page >= it->second.end) return false; auto& state = it->second.pages[(page - it->first) / _page]; if ((state & Protected) != 0) { + if (::mprotect(reinterpret_cast(page), _page, state & ProtectionMask) != 0) return false; state = static_cast((state & (ProtectionMask | Fresh)) | Written); - ::mprotect(reinterpret_cast(page), _page, state & ProtectionMask); return true; } - return (state & PROT_WRITE) != 0; + if ((state & PROT_WRITE) == 0) return false; + std::uint8_t value = 0; + mach_vm_size_t copied = 0; + return mach_vm_read_overwrite(mach_task_self(), address, sizeof(value), reinterpret_cast(&value), &copied) == KERN_SUCCESS && copied == sizeof(value); } std::uintptr_t pageStart(std::uintptr_t address) const { diff --git a/core/libs/prx/libc/src/LocaleSupport.cpp b/core/libs/prx/libc/src/LocaleSupport.cpp index 2e9ebc770827..fb8343411e8a 100644 --- a/core/libs/prx/libc/src/LocaleSupport.cpp +++ b/core/libs/prx/libc/src/LocaleSupport.cpp @@ -786,6 +786,19 @@ void APS5_VABI _ZNSt8_LocinfoD1Ev_nid_postfix(GuestLocale::LocinfoStorage* self) if (self == nullptr) throw std::invalid_argument("_Locinfo destructor: null object"); } +void APS5_VABI _ZNSt8__sce_v28_Locinfo13_Locinfo_ctorEPS0_PKc_nid_postfix(GuestLocale::SceV2Locinfo* self, const char* localeName) { + if (self == nullptr) throw std::invalid_argument("_Locinfo: null object"); + self->name = setlocale_nid_postfix(0x3f, nullptr); + if (localeName == nullptr || (*localeName != 0 && std::strcmp(localeName, "C") != 0)) + _ZNSt8__sce_v215_Xruntime_errorEPKc_nid_postfix("bad locale name"); + self->classicName = self->name; +} + +void APS5_VABI _ZNSt8__sce_v28_Locinfo13_Locinfo_dtorEPS0__nid_postfix(GuestLocale::SceV2Locinfo* self) { + if (self == nullptr) throw std::invalid_argument("_Locinfo destructor: null object"); + if (self->name != nullptr) setlocale_nid_postfix(0x3f, self->name); +} + int APS5_VABI _Mbtowcx_nid_postfix(std::uint16_t* dst, const char* src, std::size_t count, mbstate_t* st) { if (dst == nullptr || src == nullptr || st == nullptr || count == 0) throw std::invalid_argument("_Mbtowcx: invalid conversion arguments"); wchar_t converted{}; diff --git a/core/libs/prx/libc/src/LogFile.cpp b/core/libs/prx/libc/src/LogFile.cpp new file mode 100644 index 000000000000..10967b61b06b --- /dev/null +++ b/core/libs/prx/libc/src/LogFile.cpp @@ -0,0 +1,304 @@ +#include "prx/libc/include/LogFile.hpp" +#include "prx/libc/include/Shutdown.hpp" +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#else +#include +#endif + +namespace log_file { + +namespace { + +constexpr const char VariableName[] = "ANYPS5_LOG_FILE"; +constexpr const char WriteFailure[] = "[log] ANYPS5_LOG_FILE: the file can no longer be written; it stops here and the terminal output goes on\n"; + +std::atomic g_session{nullptr}; + +} + +Tee::Tee(Handle file, Handle terminalOutput, Handle terminalError, Handle sourceOutput, Handle sourceError) : _file(file) { + _streams[0].source = sourceOutput; + _streams[0].terminal = terminalOutput; + _streams[1].source = sourceError; + _streams[1].terminal = terminalError; + for (auto& stream : _streams) { + stream.chunk = std::make_unique(ChunkBytes); + stream.carry = std::make_unique(CarryBytes); + } +} + +Tee::~Tee() { + Stop(); +} + +Tee::Stream& Tee::streamOf(int standard) { + return _streams[standard == StandardOutput ? 0 : 1]; +} + +bool Tee::lock(int milliseconds) { + const auto deadline = std::chrono::steady_clock::now() + std::chrono::milliseconds(milliseconds); + for (;;) { + int expected = 0; + if (_lock.compare_exchange_strong(expected, 1, std::memory_order_acquire)) return true; + if (std::chrono::steady_clock::now() >= deadline) return false; + PauseMicroseconds(100); + } +} + +void Tee::unlock() { + _lock.store(0, std::memory_order_release); +} + +void Tee::toTerminal(Stream& stream, const char* data, std::size_t length) { + if (stream.terminal == NoHandle || stream.terminalBroken.load(std::memory_order_relaxed) || length == 0) return; + if (!WriteAll(stream.terminal, data, length)) stream.terminalBroken.store(true, std::memory_order_relaxed); +} + +void Tee::toFile(const char* data, std::size_t length) { + if (length == 0 || _fileFailed.load(std::memory_order_relaxed)) return; + if (WriteAll(_file, data, length)) return; + _fileFailed.store(true, std::memory_order_relaxed); + toTerminal(_streams[1], WriteFailure, sizeof(WriteFailure) - 1); +} + +void Tee::flushCarry(Stream& stream) { + if (stream.carried == 0) return; + toFile(stream.carry.get(), stream.carried); + toFile("\n", 1); + stream.carried = 0; +} + +void Tee::pump(Stream& stream) { + if (stream.source == NoHandle) return; + for (;;) { + const long count = ReadAvailable(stream.source, stream.chunk.get(), ChunkBytes); + if (count <= 0) return; + const char* chunk = stream.chunk.get(); + const auto length = static_cast(count); + toTerminal(stream, chunk, length); + std::size_t whole = length; + while (whole > 0 && chunk[whole - 1] != '\n') --whole; + if (whole == 0) { + if (stream.carried + length > CarryBytes) { + toFile(stream.carry.get(), stream.carried); + stream.carried = 0; + toFile(chunk, length); + } else { + std::memcpy(stream.carry.get() + stream.carried, chunk, length); + stream.carried += length; + } + continue; + } + if (stream.carried != 0) { + toFile(stream.carry.get(), stream.carried); + stream.carried = 0; + } + toFile(chunk, whole); + std::memcpy(stream.carry.get(), chunk + whole, length - whole); + stream.carried = length - whole; + } +} + +void Tee::run(Stream& stream) { + while (!_stop.load(std::memory_order_acquire)) { + if (!WaitReadable(stream.source, 20)) continue; + bool locked = false; + while (!locked && !_stop.load(std::memory_order_acquire)) locked = lock(50); + if (!locked) return; + if (!_stop.load(std::memory_order_acquire)) pump(stream); + unlock(); + } +} + +void Tee::Start() { + if (_started) return; + _started = true; + for (auto& stream : _streams) { + if (stream.source != NoHandle) stream.worker = std::thread([this, &stream] { run(stream); }); + } +} + +void Tee::Stop() { + _stop.store(true, std::memory_order_release); + for (auto& stream : _streams) { + if (stream.worker.joinable()) stream.worker.join(); + } + _started = false; + Flush(true); +} + +bool Tee::Flush(bool ending) { + if (!lock(500)) return false; + for (auto& stream : _streams) pump(stream); + if (ending) { + for (auto& stream : _streams) flushCarry(stream); + } + unlock(); + return true; +} + +void Tee::CrashWrite(int standard, const char* text, std::size_t length) { + const bool locked = lock(250); + if (locked) { + for (auto& stream : _streams) { + pump(stream); + flushCarry(stream); + } + } + toTerminal(streamOf(standard), text, length); + toFile(text, length); + if (locked) unlock(); +} + +void Tee::Note(const char* text, std::size_t length) { + const bool locked = lock(250); + toFile(text, length); + if (locked) unlock(); +} + +bool Tee::FileFailed() const { + return _fileFailed.load(std::memory_order_relaxed); +} + +std::unique_ptr StartFromValue(const char* value, Factory& factory, std::string& error) { + error.clear(); + if (value == nullptr || *value == '\0') return nullptr; + auto session = factory.Create(value, error); + if (session == nullptr && error.empty()) error = "no session was created"; + return session; +} + +namespace { + +class SystemSession final : public Session { +public: + SystemSession(Handle file, Handle originalOutput, Handle originalError, Pipe output, Pipe error) : + _originalOutput(originalOutput), _originalError(originalError), _output(output), _error(error), + _tee(file, originalOutput, originalError, output.read, error.read) {} + + Tee& Output() override { return _tee; } + + void Release() override { + _tee.Flush(true); + RestoreStandard(StandardOutput, _originalOutput); + RestoreStandard(StandardError, _originalError); + } + +private: + Handle _originalOutput; + Handle _originalError; + Pipe _output; + Pipe _error; + Tee _tee; +}; + +class SystemFactoryImpl final : public Factory { +public: + std::unique_ptr Create(const std::string& path, std::string& error) override { + Handle file = NoHandle; + std::string reason; + if (!OpenAppend(path, file, reason)) { + error = std::string(VariableName) + ": cannot open \"" + path + "\" for appending: " + reason; + return nullptr; + } + Pipe output; + Pipe errors; + if (!MakePipe(output, reason) || !MakePipe(errors, reason)) { + error = std::string(VariableName) + ": cannot create the pipes that copy the log into the file: " + reason; + Close(file); + return nullptr; + } + const Handle originalOutput = KeepStandard(StandardOutput); + const Handle originalError = KeepStandard(StandardError); + const bool interactive = originalOutput != NoHandle && IsInteractive(originalOutput); + std::fflush(nullptr); + if (!Divert(StandardOutput, output.write) || !Divert(StandardError, errors.write)) { + RestoreStandard(StandardOutput, originalOutput); + RestoreStandard(StandardError, originalError); + error = std::string(VariableName) + ": cannot redirect the standard streams into the log pipes"; + Close(file); + return nullptr; + } + if (interactive) { +#ifdef _WIN32 + std::setvbuf(stdout, nullptr, _IONBF, 0); +#else + std::setvbuf(stdout, nullptr, _IOLBF, 0); +#endif + } + auto session = std::make_unique(file, originalOutput, originalError, output, errors); + const std::string note = std::string("[log] ANYPS5_LOG_FILE: appending to this file, process ") + std::to_string(static_cast( +#ifdef _WIN32 + _getpid() +#else + getpid() +#endif + )) + "\n"; + session->Output().Note(note.data(), note.size()); + session->Output().Start(); + return session; + } +}; + +} + +Factory& SystemFactory() { + static SystemFactoryImpl factory; + return factory; +} + +bool Active() { + return g_session.load(std::memory_order_acquire) != nullptr; +} + +void Flush() { + if (auto* const session = g_session.load(std::memory_order_acquire)) session->Output().Flush(true); +} + +void Release() { + if (auto* const session = g_session.load(std::memory_order_acquire)) session->Release(); +} + +void CrashWrite(int standard, const char* text, std::size_t length) { + if (auto* const session = g_session.load(std::memory_order_acquire)) { + session->Output().CrashWrite(standard, text, length); + return; + } + WriteStandardDirect(standard, text, length); +} + +namespace { + +[[maybe_unused]] const bool g_started = [] { + std::string value; + const bool set = ReadVariable(value); + std::string error; + auto session = StartFromValue(set ? value.c_str() : nullptr, SystemFactory(), error); + if (!error.empty()) FailStartup(error + "\n"); + if (session == nullptr) return false; + g_session.store(session.release(), std::memory_order_release); + std::atexit([] { + std::fflush(nullptr); + Flush(); + }); + return true; +}(); + +} + +} + +extern "C" void LogFileFlush_nid_no_patch() { + log_file::Flush(); +} + +extern "C" void LogFileRelease_nid_no_patch() { + log_file::Release(); +} diff --git a/core/libs/prx/libc/src/LogFilePlatform.cpp b/core/libs/prx/libc/src/LogFilePlatform.cpp new file mode 100644 index 000000000000..8b8f0b4832b8 --- /dev/null +++ b/core/libs/prx/libc/src/LogFilePlatform.cpp @@ -0,0 +1,340 @@ +#include "prx/libc/include/LogFile.hpp" +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#include +#include +#else +#include +#include +#include +#include +#include +#include +#endif + +namespace log_file { + +namespace { + +constexpr const char VariableName[] = "ANYPS5_LOG_FILE"; + +#ifdef _WIN32 + +HANDLE g_diverted[3] = {nullptr, nullptr, nullptr}; + +DWORD StandardId(int standard) { + return standard == StandardOutput ? STD_OUTPUT_HANDLE : STD_ERROR_HANDLE; +} + +std::string Describe(unsigned long code) { + char text[256]; + const DWORD length = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, nullptr, code, 0, text, sizeof(text), nullptr); + std::string message(text, length); + while (!message.empty() && (message.back() == '\n' || message.back() == '\r' || message.back() == ' ' || message.back() == '.')) message.pop_back(); + if (message.empty()) message = "unknown error"; + return message + " (Windows error " + std::to_string(code) + ")"; +} + +bool Valid(HANDLE handle) { + return handle != nullptr && handle != INVALID_HANDLE_VALUE; +} + +std::wstring Widen(const std::string& text) { + if (text.empty()) return {}; + const int length = MultiByteToWideChar(CP_UTF8, 0, text.data(), static_cast(text.size()), nullptr, 0); + std::wstring wide(static_cast(length), L'\0'); + MultiByteToWideChar(CP_UTF8, 0, text.data(), static_cast(text.size()), wide.data(), length); + return wide; +} + +#else + +struct Identity { + dev_t device = 0; + ino_t node = 0; + bool known = false; +}; + +Identity g_diverted[3]; + +std::string Describe(int code) { + return std::string(std::strerror(code)) + " (errno " + std::to_string(code) + ")"; +} + +#endif + +} + +#ifdef _WIN32 + +bool OpenAppend(const std::string& path, Handle& file, std::string& error) { + const HANDLE handle = CreateFileW(Widen(path).c_str(), FILE_APPEND_DATA, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, nullptr, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); + if (handle == INVALID_HANDLE_VALUE) { + error = Describe(GetLastError()); + return false; + } + SetHandleInformation(handle, HANDLE_FLAG_INHERIT, 0); + file = reinterpret_cast(handle); + return true; +} + +bool MakePipe(Pipe& pipe, std::string& error) { + SECURITY_ATTRIBUTES attributes{sizeof(attributes), nullptr, TRUE}; + HANDLE read = nullptr; + HANDLE write = nullptr; + if (!CreatePipe(&read, &write, &attributes, 1u << 20)) { + error = Describe(GetLastError()); + return false; + } + SetHandleInformation(read, HANDLE_FLAG_INHERIT, 0); + SetHandleInformation(write, HANDLE_FLAG_INHERIT, 0); + pipe.read = reinterpret_cast(read); + pipe.write = reinterpret_cast(write); + return true; +} + +Handle KeepStandard(int standard) { + const HANDLE current = GetStdHandle(StandardId(standard)); + if (!Valid(current)) return NoHandle; + HANDLE kept = nullptr; + if (!DuplicateHandle(GetCurrentProcess(), current, GetCurrentProcess(), &kept, 0, FALSE, DUPLICATE_SAME_ACCESS)) return NoHandle; + return reinterpret_cast(kept); +} + +bool Divert(int standard, Handle write) { + HANDLE copy = nullptr; + if (!DuplicateHandle(GetCurrentProcess(), reinterpret_cast(write), GetCurrentProcess(), ©, 0, TRUE, DUPLICATE_SAME_ACCESS)) return false; + const int descriptor = _open_osfhandle(reinterpret_cast(copy), _O_BINARY | _O_WRONLY); + if (descriptor < 0) { + CloseHandle(copy); + return false; + } + const int result = _dup2(descriptor, standard); + _close(descriptor); + if (result != 0) return false; + const HANDLE installed = reinterpret_cast(_get_osfhandle(standard)); + if (!SetStdHandle(StandardId(standard), installed)) return false; + g_diverted[standard] = installed; + return true; +} + +void RestoreStandard(int standard, Handle original) { + if (g_diverted[standard] == nullptr || GetStdHandle(StandardId(standard)) != g_diverted[standard]) return; + g_diverted[standard] = nullptr; + if (original == NoHandle) { + _close(standard); + SetStdHandle(StandardId(standard), nullptr); + return; + } + HANDLE copy = nullptr; + if (!DuplicateHandle(GetCurrentProcess(), reinterpret_cast(original), GetCurrentProcess(), ©, 0, TRUE, DUPLICATE_SAME_ACCESS)) return; + const int descriptor = _open_osfhandle(reinterpret_cast(copy), _O_BINARY | _O_WRONLY); + if (descriptor < 0) { + CloseHandle(copy); + return; + } + const int result = _dup2(descriptor, standard); + _close(descriptor); + if (result == 0) SetStdHandle(StandardId(standard), reinterpret_cast(_get_osfhandle(standard))); +} + +bool IsInteractive(Handle handle) { + DWORD mode = 0; + return GetConsoleMode(reinterpret_cast(handle), &mode) != 0; +} + +void PauseMicroseconds(long microseconds) { + Sleep(static_cast(std::max(1L, microseconds / 1000))); +} + +void WriteStandardDirect(int standard, const char* text, std::size_t length) { + const HANDLE handle = GetStdHandle(StandardId(standard)); + DWORD written = 0; + WriteFile(handle, text, static_cast(length), &written, nullptr); +} + +bool ReadVariable(std::string& value) { + const DWORD size = GetEnvironmentVariableW(L"ANYPS5_LOG_FILE", nullptr, 0); + if (size <= 1) return false; + std::wstring wide(size, L'\0'); + const DWORD length = GetEnvironmentVariableW(L"ANYPS5_LOG_FILE", wide.data(), size); + if (length == 0 || length >= size) return false; + wide.resize(length); + const int bytes = WideCharToMultiByte(CP_UTF8, 0, wide.data(), static_cast(wide.size()), nullptr, 0, nullptr, nullptr); + value.assign(static_cast(bytes), '\0'); + WideCharToMultiByte(CP_UTF8, 0, wide.data(), static_cast(wide.size()), value.data(), bytes, nullptr, nullptr); + return true; +} + +void FailStartup(const std::string& message) { + WriteStandardDirect(StandardError, message.data(), message.size()); + TerminateProcess(GetCurrentProcess(), 1); + std::abort(); +} + +bool WaitReadable(Handle read, int milliseconds) { + for (int waited = 0; waited <= milliseconds; waited += 2) { + if (Pending(read) != 0) return true; + Sleep(2); + } + return false; +} + +long Pending(Handle read) { + DWORD available = 0; + if (!PeekNamedPipe(reinterpret_cast(read), nullptr, 0, nullptr, &available, nullptr)) return -1; + return static_cast(available); +} + +long ReadAvailable(Handle read, char* buffer, std::size_t capacity) { + const long available = Pending(read); + if (available <= 0) return available; + DWORD count = 0; + if (!ReadFile(reinterpret_cast(read), buffer, static_cast(std::min(capacity, static_cast(available))), &count, nullptr)) return -1; + return static_cast(count); +} + +bool WriteAll(Handle destination, const char* data, std::size_t length) { + std::size_t done = 0; + while (done < length) { + DWORD written = 0; + if (!WriteFile(reinterpret_cast(destination), data + done, static_cast(std::min(length - done, 1u << 20)), &written, nullptr) || written == 0) return false; + done += written; + } + return true; +} + +void Close(Handle handle) { + if (handle != NoHandle) CloseHandle(reinterpret_cast(handle)); +} + +#else + +bool OpenAppend(const std::string& path, Handle& file, std::string& error) { + const int descriptor = ::open(path.c_str(), O_WRONLY | O_CREAT | O_APPEND | O_CLOEXEC, 0666); + if (descriptor < 0) { + error = Describe(errno); + return false; + } + file = descriptor; + return true; +} + +bool MakePipe(Pipe& pipe, std::string& error) { + int descriptors[2]; + if (::pipe(descriptors) != 0) { + error = Describe(errno); + return false; + } + for (const int descriptor : descriptors) ::fcntl(descriptor, F_SETFD, FD_CLOEXEC); + ::fcntl(descriptors[0], F_SETFL, ::fcntl(descriptors[0], F_GETFL) | O_NONBLOCK); +#ifdef F_SETPIPE_SZ + ::fcntl(descriptors[1], F_SETPIPE_SZ, 1 << 20); +#endif + pipe.read = descriptors[0]; + pipe.write = descriptors[1]; + return true; +} + +Handle KeepStandard(int standard) { + const int kept = ::fcntl(standard, F_DUPFD_CLOEXEC, 3); + return kept < 0 ? NoHandle : kept; +} + +bool Divert(int standard, Handle write) { + struct stat information{}; + if (::fstat(static_cast(write), &information) != 0) return false; + if (::dup2(static_cast(write), standard) != standard) return false; + g_diverted[standard] = {information.st_dev, information.st_ino, true}; + return true; +} + +void RestoreStandard(int standard, Handle original) { + if (!g_diverted[standard].known) return; + struct stat information{}; + if (::fstat(standard, &information) != 0 || information.st_dev != g_diverted[standard].device || information.st_ino != g_diverted[standard].node) return; + g_diverted[standard].known = false; + if (original == NoHandle) ::close(standard); + else ::dup2(static_cast(original), standard); +} + +bool IsInteractive(Handle handle) { + return ::isatty(static_cast(handle)) == 1; +} + +void PauseMicroseconds(long microseconds) { + const timespec pause{0, microseconds * 1000}; + ::nanosleep(&pause, nullptr); +} + +void WriteStandardDirect(int standard, const char* text, std::size_t length) { + std::size_t done = 0; + while (done < length) { + const ssize_t result = ::write(standard, text + done, length - done); + if (result < 0 && errno == EINTR) continue; + if (result <= 0) break; + done += static_cast(result); + } +} + +bool ReadVariable(std::string& value) { + const char* text = std::getenv(VariableName); + if (text == nullptr || *text == '\0') return false; + value = text; + return true; +} + +void FailStartup(const std::string& message) { + WriteStandardDirect(StandardError, message.data(), message.size()); + ::_exit(1); +} + +bool WaitReadable(Handle read, int milliseconds) { + pollfd request{static_cast(read), POLLIN, 0}; + const int ready = ::poll(&request, 1, milliseconds); + if (ready > 0 && (request.revents & POLLIN) != 0) return true; + if (ready > 0) PauseMicroseconds(20000); + return false; +} + +long Pending(Handle read) { + int available = 0; + if (::ioctl(static_cast(read), FIONREAD, &available) != 0) return -1; + return available; +} + +long ReadAvailable(Handle read, char* buffer, std::size_t capacity) { + const ssize_t count = ::read(static_cast(read), buffer, capacity); + if (count >= 0) return static_cast(count); + return errno == EAGAIN || errno == EINTR ? 0 : -1; +} + +bool WriteAll(Handle destination, const char* data, std::size_t length) { + std::size_t done = 0; + int stalled = 0; + while (done < length) { + const ssize_t result = ::write(static_cast(destination), data + done, length - done); + if (result < 0 && errno == EINTR) continue; + if (result < 0 && errno == EAGAIN && stalled++ < 50) { + pollfd request{static_cast(destination), POLLOUT, 0}; + ::poll(&request, 1, 100); + continue; + } + if (result <= 0) return false; + done += static_cast(result); + } + return true; +} + +void Close(Handle handle) { + if (handle != NoHandle) ::close(static_cast(handle)); +} + +#endif + +} diff --git a/core/libs/prx/libc/src/Math.cpp b/core/libs/prx/libc/src/Math.cpp index 234c2b945f52..7b6f8ff4ca5b 100644 --- a/core/libs/prx/libc/src/Math.cpp +++ b/core/libs/prx/libc/src/Math.cpp @@ -1,3 +1,121 @@ +/* Derived from FreeBSD lib/msun/src/e_powf.c (release/9.0.0); lib/msun/src/s_expm1.c (release/11.4.0); + * lib/msun/src/s_log1p.c (release/11.4.0); lib/msun/src/e_atan2f.c (release/11.4.0); + * lib/msun/src/s_expm1f.c (59bc2f095289); lib/msun/src/s_log1pf.c (59bc2f095289); + * lib/msun/src/e_expf.c (59bc2f095289); lib/msun/src/e_atanhf.c (59bc2f095289); lib/msun/src/e_sinhf.c + * (5aa554c7e5b6); lib/msun/src/e_coshf.c (5aa554c7e5b6); lib/msun/src/e_acoshf.c (5aa554c7e5b6); + * lib/msun/src/s_atanf.c (release/11.4.0); lib/msun/src/e_logf.c (release/11.4.0); + * lib/msun/src/e_acosf.c (release/11.4.0); lib/msun/src/e_asinf.c (release/11.4.0); + * lib/msun/src/s_tanh.c (release/11.4.0); lib/msun/src/s_logb.c (release/11.4.0); + * lib/msun/src/s_logbf.c (release/11.4.0); lib/msun/src/e_fmodf.c (release/11.4.0); + * lib/msun/src/s_cbrtf.c (release/11.4.0); lib/msun/src/k_sinf.c (release/11.4.0); + * lib/msun/src/k_cosf.c (release/11.4.0); lib/msun/src/e_rem_pio2f.c (release/11.4.0) */ +/* Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. + * Optimized by Bruce D. Evans. */ +/* e_rem_pio2f.c, k_cosf.c and s_cbrtf.c: + * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. + * Debugged and optimized by Bruce D. Evans. */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +/* Derived from FreeBSD lib/msun/src/s_cbrt.c (release/11.4.0) */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + * + * Optimized by Bruce D. Evans. + */ +/* Derived from FreeBSD lib/msun/src/k_tanf.c (release/11.4.0) */ +/* Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. + * Optimized by Bruce D. Evans. */ +/* + * ==================================================== + * Copyright 2004 Sun Microsystems, Inc. All Rights Reserved. + * + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +/* Derived from FreeBSD lib/msun/src/k_rem_pio2.c (release/11.4.0); lib/msun/src/e_sinh.c + * (release/11.4.0); lib/msun/src/e_asinl.c (9f0432041b8f) */ +/* Converted to long double by David Schultz . */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunSoft, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +/* Derived from FreeBSD lib/msun/src/s_exp2f.c (release/11.4.0) */ +/*- + * Copyright (c) 2005 David Schultz + * All rights reserved. + * + * 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 above 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 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. + */ +/* Derived from FreeBSD lib/msun/ld80/invtrig.c (9f0432041b8f) */ +/*- + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2008 David Schultz + * All rights reserved. + * + * 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 above 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 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. + */ #include "prx/libc/include/Api.hpp" #include #include @@ -446,8 +564,18 @@ double APS5_VABI exp2_nid_postfix(double x) { return result; } double APS5_VABI ldexp_nid_postfix(double x, int exponent) { return std::ldexp(x, exponent); } -double APS5_VABI scalbn_nid_postfix(double x, int exponent) { return std::scalbn(x, exponent); } -float APS5_VABI scalbnf_nid_postfix(float x, int exponent) { return std::scalbn(x, exponent); } +double APS5_VABI scalbn_nid_postfix(double x, int exponent) { + const int saved_errno = errno; + const double result = std::scalbn(x, exponent); + errno = saved_errno; + return result; +} +float APS5_VABI scalbnf_nid_postfix(float x, int exponent) { + const int saved_errno = errno; + const float result = std::scalbn(x, exponent); + errno = saved_errno; + return result; +} long double APS5_VABI scalbnl_nid_postfix(long double x, int exponent) { return std::scalbn(x, exponent); } float APS5_VABI significandf_nid_postfix(float x) { return x == 0.0f || !std::isfinite(x) ? x : std::scalbn(x, -std::ilogb(x)); } double APS5_VABI significand_nid_postfix(double x) { return x == 0.0 || !std::isfinite(x) ? x : std::scalbn(x, -std::ilogb(x)); } @@ -478,7 +606,6 @@ int APS5_VABI __isfinitef_nid_postfix(float x) { return std::isfinite(x) ? 1 : 0 int APS5_VABI __isnormal_nid_postfix(double x) { return std::isnormal(x) ? 1 : 0; } int APS5_VABI __isnormalf_nid_postfix(float x) { return std::isnormal(x) ? 1 : 0; } int APS5_VABI __isinff_nid_postfix(float x) { return std::isinf(x) ? 1 : 0; } -float APS5_VABI nearbyintf_nid_postfix(float x) { return std::isnan(x) ? x + x : std::nearbyintf(x); } long double APS5_VABI nearbyintl_nid_postfix(long double x) { return std::nearbyint(x); } double APS5_VABI nearbyint_nid_postfix(double x) { return std::isnan(x) ? x + x : std::nearbyint(x); } @@ -1652,7 +1779,12 @@ float APS5_VABI logf_nid_postfix(float x) { } float APS5_VABI log2f_nid_postfix(float x) { return std::log2(x); } double APS5_VABI log10_nid_postfix(double x) { return std::log10(x); } -float APS5_VABI ldexpf_nid_postfix(float x, int exp) { return std::ldexp(x, exp); } +float APS5_VABI ldexpf_nid_postfix(float x, int exp) { + const int saved_errno = errno; + const float result = std::scalbn(x, exp); + errno = saved_errno; + return result; +} double APS5_VABI fmod_nid_postfix(double x, double y) { int saved_errno = errno; double result = std::fmod(x, y); @@ -2039,7 +2171,10 @@ long double APS5_VABI _LSinh_nid_postfix(long double x, long double y) { } int APS5_VABI _Fltrounds_nid_postfix(void) { - return SonyFltrounds(); + std::uint16_t control; + asm volatile("fnstcw %0" : "=m"(control)); + constexpr std::array Rounding{1, 3, 2, 0}; + return Rounding[(control >> 10u) & 3u]; } static_assert(sizeof(GuestFloatingPointEnvironment) == 32 && alignof(GuestFloatingPointEnvironment) == 4 && offsetof(GuestFloatingPointEnvironment, mxcsr) == 28); diff --git a/core/libs/prx/libc/src/MathExact.cpp b/core/libs/prx/libc/src/MathExact.cpp index 58af10a8d528..abf586e8f5fa 100644 --- a/core/libs/prx/libc/src/MathExact.cpp +++ b/core/libs/prx/libc/src/MathExact.cpp @@ -179,6 +179,7 @@ long double APS5_VABI fmal_nid_postfix(long double x, long double y, long double double APS5_VABI rint_nid_postfix(double x) { return std::isnan(x) ? x + x : std::rint(x); } float APS5_VABI rintf_nid_postfix(float x) { return std::isnan(x) ? x + x : std::rint(x); } +float APS5_VABI nearbyintf_nid_postfix(float x) { return std::isnan(x) ? x + x : std::rintf(x); } std::int64_t APS5_VABI lrint_nid_postfix(double x) { return _mm_cvtsd_si64(_mm_set_sd(x)); } diff --git a/core/libs/prx/libc/src/MemoryResource.cpp b/core/libs/prx/libc/src/MemoryResource.cpp new file mode 100644 index 000000000000..56a303e2dafb --- /dev/null +++ b/core/libs/prx/libc/src/MemoryResource.cpp @@ -0,0 +1,137 @@ +#include "prx/libc/include/Api.hpp" +#include "prx/libc/include/general/VabiMacros.hpp" +#include +#include + +namespace LibcException { +struct TypeInfoVtable; +} + +extern "C" { +extern LibcException::TypeInfoVtable _ZTVN10__cxxabiv117__class_type_infoE_nid_postfix; +extern LibcException::TypeInfoVtable _ZTVN10__cxxabiv120__si_class_type_infoE_nid_postfix; +} + +namespace { + +struct MemoryResource { + const void* vtable; +}; + +struct ClassTypeInfo { + const void* vtable; + const char* name; +}; + +struct SingleTypeInfo { + const void* vtable; + const char* name; + const void* base; +}; + +struct MemoryResourceVtable { + std::ptrdiff_t offset; + const SingleTypeInfo* type; + void (APS5_VABI* destroy)(MemoryResource*); + void (APS5_VABI* deleteObject)(MemoryResource*); + void* (APS5_VABI* allocate)(MemoryResource*, std::size_t, std::size_t); + void (APS5_VABI* deallocate)(MemoryResource*, void*, std::size_t, std::size_t); + bool (APS5_VABI* isEqual)(const MemoryResource*, const MemoryResource*); +}; + +constexpr std::size_t DefaultNewAlignment = 32; + +const void* TypeInfoVptr(LibcException::TypeInfoVtable& vtable) { + return reinterpret_cast(&vtable) + 2 * sizeof(void*); +} + +const ClassTypeInfo MemoryResourceType {TypeInfoVptr(_ZTVN10__cxxabiv117__class_type_infoE_nid_postfix), "NSt8__sce_v23pmr15memory_resourceE"}; +const SingleTypeInfo IdentityEqualResourceType {TypeInfoVptr(_ZTVN10__cxxabiv120__si_class_type_infoE_nid_postfix), "NSt8__sce_v23pmr24_Identity_equal_resourceE", &MemoryResourceType}; +const SingleTypeInfo AlignedNewDeleteResourceType {TypeInfoVptr(_ZTVN10__cxxabiv120__si_class_type_infoE_nid_postfix), "NSt8__sce_v23pmr33_Aligned_new_delete_resource_implE", &IdentityEqualResourceType}; +const SingleTypeInfo UnalignedNewDeleteResourceType {TypeInfoVptr(_ZTVN10__cxxabiv120__si_class_type_infoE_nid_postfix), "NSt8__sce_v23pmr35_Unaligned_new_delete_resource_implE", &IdentityEqualResourceType}; +const SingleTypeInfo NullResourceType {TypeInfoVptr(_ZTVN10__cxxabiv120__si_class_type_infoE_nid_postfix), "Z20null_memory_resourceE14_Null_resource", &IdentityEqualResourceType}; + +void APS5_VABI DestroyResource(MemoryResource*) {} + +void APS5_VABI DeleteResource(MemoryResource* self) { + _ZdlPv_nid_postfix(self); +} + +bool APS5_VABI IsSameResource(const MemoryResource* self, const MemoryResource* other) { + return self == other; +} + +void* APS5_VABI AlignedAllocate(MemoryResource*, std::size_t bytes, std::size_t alignment) { + if (alignment > DefaultNewAlignment) return _ZnwmSt11align_val_t_nid_postfix(bytes, alignment); + return _Znwm_nid_postfix(bytes); +} + +void APS5_VABI AlignedDeallocate(MemoryResource*, void* pointer, std::size_t bytes, std::size_t alignment) { + if (alignment > DefaultNewAlignment) + _ZdlPvmSt11align_val_t_nid_postfix(pointer, bytes, alignment); + else + _ZdlPvm_nid_postfix(pointer, bytes); +} + +void* APS5_VABI UnalignedAllocate(MemoryResource*, std::size_t bytes, std::size_t alignment) { + if (alignment > DefaultNewAlignment) _ZNSt8__sce_v211_Xbad_allocEv_nid_postfix(); + return _Znwm_nid_postfix(bytes); +} + +void APS5_VABI UnalignedDeallocate(MemoryResource*, void* pointer, std::size_t bytes, std::size_t) { + _ZdlPvm_nid_postfix(pointer, bytes); +} + +void* APS5_VABI NullAllocate(MemoryResource*, std::size_t, std::size_t) { + _ZNSt8__sce_v211_Xbad_allocEv_nid_postfix(); +} + +void APS5_VABI NullDeallocate(MemoryResource*, void*, std::size_t, std::size_t) {} + +const MemoryResourceVtable AlignedNewDeleteVtable {0, &AlignedNewDeleteResourceType, DestroyResource, DeleteResource, AlignedAllocate, AlignedDeallocate, IsSameResource}; +const MemoryResourceVtable UnalignedNewDeleteVtable {0, &UnalignedNewDeleteResourceType, DestroyResource, DeleteResource, UnalignedAllocate, UnalignedDeallocate, IsSameResource}; +const MemoryResourceVtable NullVtable {0, &NullResourceType, DestroyResource, DeleteResource, NullAllocate, NullDeallocate, IsSameResource}; + +MemoryResource AlignedNewDeleteResource {&AlignedNewDeleteVtable.destroy}; +MemoryResource UnalignedNewDeleteResource {&UnalignedNewDeleteVtable.destroy}; +MemoryResource NullResource {&NullVtable.destroy}; + +std::atomic DefaultResource {nullptr}; + +MemoryResource* OrFallback(MemoryResource* resource, MemoryResource* fallback) { + return resource != nullptr ? resource : fallback; +} + +} + +extern "C" { + +void* APS5_VABI null_memory_resource_nid_postfix() { + return &NullResource; +} + +void* APS5_VABI _Aligned_new_delete_resource_nid_postfix() { + return &AlignedNewDeleteResource; +} + +void* APS5_VABI _Unaligned_new_delete_resource_nid_postfix() { + return &UnalignedNewDeleteResource; +} + +void* APS5_VABI _Aligned_get_default_resource_nid_postfix() { + return OrFallback(DefaultResource.load(), &AlignedNewDeleteResource); +} + +void* APS5_VABI _Unaligned_get_default_resource_nid_postfix() { + return OrFallback(DefaultResource.load(), &UnalignedNewDeleteResource); +} + +void* APS5_VABI _Aligned_set_default_resource_nid_postfix(void* resource) { + return OrFallback(DefaultResource.exchange(static_cast(resource)), &AlignedNewDeleteResource); +} + +void* APS5_VABI _Unaligned_set_default_resource_nid_postfix(void* resource) { + return OrFallback(DefaultResource.exchange(static_cast(resource)), &UnalignedNewDeleteResource); +} + +} diff --git a/core/libs/prx/libc/src/Process.cpp b/core/libs/prx/libc/src/Process.cpp index 8d7c88c0d9cb..dbd1c0e7d9db 100644 --- a/core/libs/prx/libc/src/Process.cpp +++ b/core/libs/prx/libc/src/Process.cpp @@ -130,6 +130,7 @@ extern "C" void LibcSetEndFlush_nid_no_patch(void (*flush)()) { extern "C" void LibcRunEndFlush_nid_no_patch() { if (const auto flush = endFlush.load(std::memory_order_acquire)) flush(); + LogFileFlush_nid_no_patch(); } extern "C" void LibcSetExitDrain_nid_no_patch(void (*drain)()) { @@ -230,6 +231,7 @@ void APS5_VABI exit_nid_postfix(int code) { LibcRunEndFlush_nid_no_patch(); std::fprintf(stderr, "[libc] abort() called from %p\n", __builtin_return_address(0)); std::fflush(nullptr); + LogFileFlush_nid_no_patch(); std::abort(); } diff --git a/core/libs/prx/libc/src/ScanningWide.cpp b/core/libs/prx/libc/src/ScanningWide.cpp index cccfa535b145..d44728f09460 100644 --- a/core/libs/prx/libc/src/ScanningWide.cpp +++ b/core/libs/prx/libc/src/ScanningWide.cpp @@ -1,4 +1,5 @@ #include "prx/libc/include/Api.hpp" +#include "prx/libc/include/GuestLongDouble.hpp" #include #include #include @@ -240,7 +241,7 @@ class WideScanner { } std::size_t IntegerSize(const std::string& length) const { - if (length.empty()) return sizeof(std::int32_t); + if (length.empty() || length == "L") return sizeof(std::int32_t); if (length == "hh") return sizeof(std::int8_t); if (length == "h") return sizeof(std::int16_t); if (length == "l" || length == "ll" || length == "j" || length == "z" || length == "t") return sizeof(std::int64_t); @@ -286,11 +287,11 @@ class WideScanner { directive.setBegin = format; if (*format == u']') ++format; while (*format != 0 && *format != u']') ++format; - if (*format == 0) Fail("unterminated scanset"); - directive.setEnd = format++; - for (const char16_t* member = directive.setBegin + 1; member + 1 < directive.setEnd; ++member) { - if (*member == u'-') Fail("scanset range is implementation-defined"); + if (*format == 0) { + directive.conversion = 0; + return directive; } + directive.setEnd = format++; } return directive; } @@ -319,7 +320,7 @@ class WideScanner { case u'S': case u'C': return Outcome::Matching; case u'n': return Count(directive); - default: Fail("unsupported conversion " + std::to_string(directive.conversion)); + default: return Outcome::Matching; } } @@ -361,12 +362,10 @@ class WideScanner { } Outcome Pointer(const Directive& directive) { - if (!directive.length.empty()) Fail("invalid pointer length modifier " + directive.length); return Integer(directive, 16, false, sizeof(void*)); } Outcome Float(const Directive& directive) { - static_assert(sizeof(long double) == 16 && std::numeric_limits::digits == 64); if (!directive.length.empty() && directive.length != "l" && directive.length != "L") Fail("invalid floating length modifier " + directive.length); void* target = nullptr; @@ -378,8 +377,7 @@ class WideScanner { if (target != nullptr) { const int savedError = errno; if (directive.length == "L") { - const long double value = std::strtold(field.c_str(), nullptr); - std::memcpy(target, &value, sizeof(value)); + LibcDetail::GuestLongDoubleStore(target, std::strtold(field.c_str(), nullptr)); } else if (directive.length == "l") { const double value = std::strtod(field.c_str(), nullptr); std::memcpy(target, &value, sizeof(value)); @@ -397,7 +395,12 @@ class WideScanner { static bool InSet(const Directive& directive, char16_t character) { bool found = false; - for (const char16_t* member = directive.setBegin; member != directive.setEnd && !found; ++member) found = *member == character; + for (const char16_t* member = directive.setBegin; member != directive.setEnd && !found;) { + if (directive.setEnd - member >= 3 && member[1] == u'-') { + found = character >= member[0] && character <= member[2]; + member += 3; + } else found = *member++ == character; + } return found != directive.setExcluded; } @@ -410,8 +413,6 @@ class WideScanner { } Outcome Text(const Directive& directive) { - if (!directive.length.empty() && directive.length != "l") - Fail("invalid string length modifier " + directive.length); void* target = nullptr; std::size_t capacity = 0; if (!directive.suppress) { diff --git a/core/libs/prx/libc/src/Strings.cpp b/core/libs/prx/libc/src/Strings.cpp index 954399543088..a4123cc8e880 100644 --- a/core/libs/prx/libc/src/Strings.cpp +++ b/core/libs/prx/libc/src/Strings.cpp @@ -296,6 +296,12 @@ bool HasHexadecimalPrefix(const char* text, const char* parsedEnd) { extern "C" { +const char* NanSubjectEnd_nid_no_patch(const char* text) { + if (text == nullptr) return nullptr; + const auto subject = FindNanSubject(text); + return subject.tail == nullptr ? nullptr : NanSequenceEnd(subject.tail); +} + void* APS5_VABI memset_nid_postfix(void* s, int c, size_t n) { // APS5_LOG_OUT("s=%p c=%d n=%zu", s, c, n); return std::memset(s, c, n); @@ -831,8 +837,10 @@ float APS5_VABI wcstof_nid_postfix(const char16_t* str, char16_t** endptr) { } long double APS5_VABI wcstold_nid_postfix(const char16_t* str, char16_t** endptr) { +#ifndef __EMSCRIPTEN__ static_assert(sizeof(long double) == 16); static_assert(std::numeric_limits::digits == 64); +#endif return ParseAsciiPrefix(str, endptr, [](const char* text, char** end) { return ParseFloat(text, end, std::strtold); }); } diff --git a/core/libs/prx/libc/src/Time.cpp b/core/libs/prx/libc/src/Time.cpp index a50cce43e6c5..66f46dcc809c 100644 --- a/core/libs/prx/libc/src/Time.cpp +++ b/core/libs/prx/libc/src/Time.cpp @@ -570,8 +570,9 @@ int64_t APS5_VABI libc_mktime_nid_postfix(GuestTm* timeptr) { return time; } #endif - if (approximate < firstOrdinary || approximate > HOST_LAST_SECOND - SECONDS_PER_DAY) { - moved = calendarCycles(approximate - firstOrdinary, CALENDAR_CYCLE_SECONDS) * CALENDAR_CYCLE_SECONDS; + if (!ordinary || approximate < firstOrdinary || approximate > HOST_LAST_SECOND - SECONDS_PER_DAY) { + if (approximate < firstOrdinary || approximate > HOST_LAST_SECOND - SECONDS_PER_DAY) + moved = calendarCycles(approximate - firstOrdinary, CALENDAR_CYCLE_SECONDS) * CALENDAR_CYCLE_SECONDS; GuestTm window{}; if (!utcCalendarFields(approximate - moved, window)) return -1; window.tm_isdst = host.tm_isdst; diff --git a/core/libs/prx/libc/src/WideConversion.cpp b/core/libs/prx/libc/src/WideConversion.cpp index 8748715186de..2350b1bccbaf 100644 --- a/core/libs/prx/libc/src/WideConversion.cpp +++ b/core/libs/prx/libc/src/WideConversion.cpp @@ -44,17 +44,17 @@ std::size_t ReadErrorMessage(int error, char (&message)[128]) { return std::strlen(message); } -void ErrorMessageConstraint(char* buffer) { +void ErrorMessageConstraint() { SonyConstraintHandler handler; { std::lock_guard lock(SonyConstraintMutex()); handler = SonyConstraintHandlerSlot(); } if (handler == SonyDefaultConstraintHandler) { - SonyDefaultConstraintHandler("strerror_s", buffer, 22); + SonyDefaultConstraintHandler("strerror_s: bad argument", nullptr, 22); } else { using GuestHandler = void (APS5_VABI *)(const char*, void*, int); - reinterpret_cast(handler)("strerror_s", buffer, 22); + reinterpret_cast(handler)("strerror_s: bad argument", nullptr, 22); } } @@ -66,8 +66,8 @@ extern "C" std::size_t APS5_VABI strerrorlen_s_nid_postfix(int error) { } extern "C" int APS5_VABI strerror_s_nid_postfix(char* buffer, std::size_t capacity, int error) { - if (!buffer || capacity == 0 || capacity > (std::numeric_limits::max() >> 1)) { - ErrorMessageConstraint(buffer); + if (!buffer || capacity == 0 || capacity > (std::numeric_limits::max() >> 3)) { + ErrorMessageConstraint(); return 22; } char message[128]; diff --git a/core/libs/prx/libc/src/exception/StandardExceptions.cpp b/core/libs/prx/libc/src/exception/StandardExceptions.cpp index ae4c9dae2ca2..8f6ced59c183 100644 --- a/core/libs/prx/libc/src/exception/StandardExceptions.cpp +++ b/core/libs/prx/libc/src/exception/StandardExceptions.cpp @@ -551,6 +551,7 @@ const char* APS5_VABI _ZNKSt8ios_base7failure4whatEv_nid_postfix(const LibcExcep [[noreturn]] void APS5_VABI __cxa_bad_cast_nid_postfix() { LibcException::ThrowPlain(_ZTVSt8bad_cast_nid_postfix); } [[noreturn]] void APS5_VABI __cxa_bad_typeid_nid_postfix() { LibcException::ThrowPlain(_ZTVSt10bad_typeid_nid_postfix); } [[noreturn]] void APS5_VABI __cxa_throw_bad_array_new_length_nid_postfix() { LibcException::ThrowPlain(_ZTVSt20bad_array_new_length_nid_postfix); } +[[noreturn]] void APS5_VABI _ZSt6_ThrowRKSt20bad_array_new_length_nid_postfix(const LibcException::ExceptionObject*) { LibcException::ThrowPlain(_ZTVSt20bad_array_new_length_nid_postfix); } [[noreturn]] void APS5_VABI _ZSt11_Xbad_allocv_nid_postfix() { LibcException::ThrowPlain(_ZTVSt9bad_alloc_nid_postfix); } [[noreturn]] void APS5_VABI _ZSt14_Xout_of_rangePKc_nid_postfix(const char* message) { LibcException::ThrowMessage(_ZTVSt12out_of_range_nid_postfix, message); } [[noreturn]] void APS5_VABI _ZSt14_Xlength_errorPKc_nid_postfix(const char* message) { LibcException::ThrowMessage(_ZTVSt12length_error_nid_postfix, message); } diff --git a/core/libs/prx/libc/src/exception/Unwind.cpp b/core/libs/prx/libc/src/exception/Unwind.cpp index 973b21dbcf77..7934f698f905 100644 --- a/core/libs/prx/libc/src/exception/Unwind.cpp +++ b/core/libs/prx/libc/src/exception/Unwind.cpp @@ -1,5 +1,6 @@ #include "prx/libc/include/Api.hpp" #include "prx/libc/include/exceptions/Unwind.hpp" +#include "prx/libc/include/exceptions/CompactUnwind.hpp" #include "prx/libc/include/exceptions/Runtime.hpp" #include "prx/libc/include/specifics/linux/ElfTypes.hpp" #include "prx/libc/src/specifics/x86_64/RegisterContext.cpp" @@ -25,6 +26,7 @@ #include #endif #ifdef __APPLE__ +#include #include #include #include @@ -129,6 +131,22 @@ static Word ResolveImport(Word address) { } #endif +#ifdef __APPLE__ +Word ResolveStub(Word personality) { + if (!personality) return 0; + Dl_info image {}; + if (!dladdr(reinterpret_cast(personality), &image) || image.dli_fbase == nullptr) return 0; + const auto* code = reinterpret_cast(personality); + if (code[0] != 0xff || code[1] != 0x25) return personality; + std::int32_t displacement = 0; + std::memcpy(&displacement, code + 2, 4); + const auto slot = static_cast(static_cast(personality) + 6 + displacement); + Word target = 0; + std::memcpy(&target, reinterpret_cast(slot), sizeof(target)); + return target ? target : personality; +} +#endif + _Unwind_Reason_Code CallPersonality(Word personality, _Unwind_Action actions, _Unwind_Exception* exception, _Unwind_Context* context) { #ifdef _WIN32 personality = ResolveImport(personality); @@ -137,6 +155,28 @@ _Unwind_Reason_Code CallPersonality(Word personality, _Unwind_Action actions, _U return __gxx_personality_v0_nid_postfix(1, actions, exception->exception_class, exception, context); if (personality == reinterpret_cast(__gcc_personality_v0_nid_postfix) || personality == reinterpret_cast(__gcc_personality_v0)) return __gcc_personality_v0_nid_postfix(1, actions, exception->exception_class, exception, context); +#ifdef __APPLE__ + { + Dl_info mapped {}; + if (!dladdr(reinterpret_cast(personality), &mapped) || mapped.dli_fbase == nullptr) + return (actions & _UA_SEARCH_PHASE) ? _URC_FATAL_PHASE1_ERROR : _URC_FATAL_PHASE2_ERROR; + } + personality = ResolveStub(personality); + if (personality == 0) return (actions & _UA_SEARCH_PHASE) ? _URC_FATAL_PHASE1_ERROR : _URC_FATAL_PHASE2_ERROR; + if (personality == reinterpret_cast(__gxx_personality_v0_nid_postfix) || personality == reinterpret_cast(__gxx_personality_v0)) + return __gxx_personality_v0_nid_postfix(1, actions, exception->exception_class, exception, context); + if (personality == reinterpret_cast(__gcc_personality_v0_nid_postfix) || personality == reinterpret_cast(__gcc_personality_v0)) + return __gcc_personality_v0_nid_postfix(1, actions, exception->exception_class, exception, context); + Dl_info info {}; + const char* name = nullptr; + if (dladdr(reinterpret_cast(personality), &info)) name = info.dli_sname; + const auto kind = MatchCompactPersonality(name); + if (kind == CompactPersonality::Gxx) + return __gxx_personality_v0_nid_postfix(1, actions, exception->exception_class, exception, context); + if (kind == CompactPersonality::Gcc) + return __gcc_personality_v0_nid_postfix(1, actions, exception->exception_class, exception, context); + return (actions & _UA_SEARCH_PHASE) ? _URC_FATAL_PHASE1_ERROR : _URC_FATAL_PHASE2_ERROR; +#endif return (actions & _UA_SEARCH_PHASE) ? _URC_FATAL_PHASE1_ERROR : _URC_FATAL_PHASE2_ERROR; } #if defined(__linux__) || defined(__APPLE__) @@ -325,6 +365,101 @@ bool VirtualUnwind(_Unwind_Context& context, Frame& frame) { } #endif +#ifdef __APPLE__ +struct AppleSections { Word base {}; const Byte* unwind {}; unsigned long unwindSize {}; const Byte* eh {}; unsigned long ehSize {}; }; + +bool AppleSectionsOf(Word pc, AppleSections& out) { + Dl_info image {}; + if (!dladdr(reinterpret_cast(pc), &image) || !image.dli_fbase) return false; + const auto* header = static_cast(image.dli_fbase); + if (header->magic != MH_MAGIC_64) return false; + out.base = reinterpret_cast(header); + const Byte* command = reinterpret_cast(header + 1); + Word slide = 0; + for (std::uint32_t index = 0; index < header->ncmds; ++index) { + const auto* load = reinterpret_cast(command); + if (load->cmdsize < 8 || command + load->cmdsize < command) return false; + if (load->cmd == LC_SEGMENT_64) { + const auto* segment = reinterpret_cast(load); + if (std::strcmp(segment->segname, "__TEXT") == 0) slide = out.base - static_cast(segment->vmaddr); + const auto* section = reinterpret_cast(segment + 1); + for (std::uint32_t part = 0; part < segment->nsects; ++part, ++section) { + const auto* address = reinterpret_cast(static_cast(section->addr) + slide); + if (std::strncmp(section->sectname, "__unwind_info", 16) == 0) { + out.unwind = address; + out.unwindSize = static_cast(section->size); + } else if (std::strncmp(section->sectname, "__eh_frame", 16) == 0) { + out.eh = address; + out.ehSize = static_cast(section->size); + } + } + } + command += load->cmdsize; + } + return out.unwind != nullptr; +} + +struct CompactDwarfAttempt { + _Unwind_Context* context; + Frame* frame; + Lookup* query; + const Byte* eh; + Word base; +}; + +bool TryCompactDwarf(std::uint32_t ehOffset, void* user) { + auto* attempt = static_cast(user); + attempt->query->fde = attempt->eh + ehOffset; + attempt->query->text = attempt->base; + attempt->query->data = attempt->base; + Frame decoded {}; + if (!DecodeCandidate(*attempt->context, decoded, *attempt->query)) { + attempt->query->fde = nullptr; + return false; + } + *attempt->frame = decoded; + return true; +} + +bool AppleCompact(_Unwind_Context& context, Frame& frame, Lookup& query) { + AppleSections sections {}; + if (!AppleSectionsOf(query.pc, sections)) return false; + const auto base = sections.base; + if (query.pc < base) return false; + const std::span unwind{sections.unwind, static_cast(sections.unwindSize)}; + const std::span eh = sections.eh == nullptr ? std::span{} : std::span{sections.eh, static_cast(sections.ehSize)}; + CompactDwarfAttempt attempt {&context, &frame, &query, sections.eh, base}; + CompactEntry entry {}; + const auto target = static_cast(query.pc - base); + const auto status = ParseCompactUnwind(unwind, eh, target, TryCompactDwarf, &attempt, entry); + if (status != CompactParse::Found) return false; + if (entry.dwarf) return true; + frame = {}; + frame.useCompact = true; + frame.compactEncoding = entry.encoding; + frame.functionStart = base + entry.functionOffset; + frame.functionEnd = base + entry.functionEndOffset; + frame.personality = entry.hasPersonality ? static_cast(static_cast(base) + entry.personalityDelta) : 0; + frame.lsda = entry.hasLsda ? base + entry.lsdaOffset : 0; + frame.returnRegister = 16; + context.region = frame.functionStart; + context.lsda = frame.lsda; + context.personality = frame.personality; + context.textBase = base; + context.dataBase = base; + return true; +} + +bool CompactRules(Frame& frame, Rules& rules) { + frame.returnRegister = 16; + std::span function; + if (frame.functionEnd > frame.functionStart) + function = {reinterpret_cast(frame.functionStart), static_cast(frame.functionEnd - frame.functionStart)}; + return CompactUnwindRules(frame.compactEncoding, function, rules); +} + +#endif + bool DecodeFrame(_Unwind_Context& context, Frame& frame) { Lookup query {context.registers[16] - !context.signalFrame}; #if defined(__linux__) || defined(__APPLE__) @@ -333,6 +468,7 @@ bool DecodeFrame(_Unwind_Context& context, Frame& frame) { #endif dl_iterate_phdr(FindFrame, &query); #ifdef __APPLE__ + if (!query.fde && AppleCompact(context, frame, query)) return true; if (!query.fde) { Dl_info image {}; if (!dladdr(reinterpret_cast(query.pc), &image) || !image.dli_fbase) return false; @@ -356,7 +492,11 @@ bool DecodeFrame(_Unwind_Context& context, Frame& frame) { return false; } #endif - return DecodeCandidate(context, frame, query); + if (DecodeCandidate(context, frame, query)) return true; +#ifdef __APPLE__ + return AppleCompact(context, frame, query); +#endif + return false; #else const Byte* base = nullptr; const auto* nt = ImageHeaders(query.pc, base); @@ -462,6 +602,14 @@ bool GetRules(_Unwind_Context& context, Frame& frame, Rules& rules) { return false; #endif } +#ifdef __APPLE__ + if (frame.useCompact) { + if (!CompactRules(frame, rules)) return false; + if (rules.cfaRegister >= 17) return false; + context.cfa = context.registers[rules.cfaRegister] + rules.cfaOffset; + return true; + } +#endif Rules initial; if (!Instructions(frame.cieBegin, frame.cieEnd, frame, ~Word(0), initial, {})) return false; #ifdef _WIN32 diff --git a/core/libs/prx/libc/src/specifics/linux/DlIteratePhdr.cpp b/core/libs/prx/libc/src/specifics/linux/DlIteratePhdr.cpp index 516a53933a98..0feae7ca9e65 100644 --- a/core/libs/prx/libc/src/specifics/linux/DlIteratePhdr.cpp +++ b/core/libs/prx/libc/src/specifics/linux/DlIteratePhdr.cpp @@ -8,7 +8,7 @@ extern "C" { int APS5_VABI dl_iterate_phdr_nid_postfix(int (*callback)(dl_phdr_info*, std::size_t, void*), void* data) { -#if defined(__linux__) || defined(__APPLE__) +#if defined(__linux__) || defined(__APPLE__) || defined(__EMSCRIPTEN__) return dl_iterate_phdr(callback, data); #else (void)callback; diff --git a/core/libs/prx/libc/src/specifics/windows/CrashReport.cpp b/core/libs/prx/libc/src/specifics/windows/CrashReport.cpp index 1d031c17a1c0..ca9e252ab4cc 100644 --- a/core/libs/prx/libc/src/specifics/windows/CrashReport.cpp +++ b/core/libs/prx/libc/src/specifics/windows/CrashReport.cpp @@ -4,6 +4,7 @@ #include "prx/libc/include/CallTrace.hpp" #include "prx/libc/include/FailureReport.hpp" #include "prx/libc/include/GuestArena.hpp" +#include "prx/libc/include/LogFile.hpp" #include "prx/libc/include/Shutdown.hpp" #include "prx/libc/include/CrashText.hpp" #include @@ -32,8 +33,7 @@ void Report(const char* format, ...) { va_end(args); if (length <= 0) return; if (length > static_cast(sizeof(buffer)) - 1) length = sizeof(buffer) - 1; - DWORD written = 0; - WriteFile(GetStdHandle(STD_ERROR_HANDLE), buffer, static_cast(length), &written, nullptr); + log_file::CrashWrite(log_file::StandardError, buffer, static_cast(length)); } void ReportAllThreads(); diff --git a/core/libs/prx/libc/src/specifics/x86_64/CallTrace.cpp b/core/libs/prx/libc/src/specifics/x86_64/CallTrace.cpp index 0c33a3ef77d0..8a8658366e74 100644 --- a/core/libs/prx/libc/src/specifics/x86_64/CallTrace.cpp +++ b/core/libs/prx/libc/src/specifics/x86_64/CallTrace.cpp @@ -21,6 +21,7 @@ #include #endif #include "prx/libc/include/CallTrace.hpp" +#include "prx/libc/include/LogFile.hpp" #include "prx/libc/include/general/AsmMacros.hpp" #include "prx/libc/include/general/VabiMacros.hpp" #include @@ -299,13 +300,7 @@ class ReportLine { void Write() { Text("\n"); - std::size_t written = 0; - while (written < _length) { - const ssize_t result = ::write(STDERR_FILENO, _buffer + written, _length - written); - if (result < 0 && errno == EINTR) continue; - if (result <= 0) break; - written += static_cast(result); - } + log_file::CrashWrite(log_file::StandardError, _buffer, _length); _length = 0; } diff --git a/core/libs/prx/libfreetype/Export.cpp b/core/libs/prx/libfreetype/Export.cpp new file mode 100644 index 000000000000..b8064f6b90f4 --- /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 000000000000..032458af2581 --- /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 000000000000..a3aaf7c3017f --- /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 000000000000..1789f4e06955 --- /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/AppMetadata/include/AppMetadata.hpp b/core/libs/prx/libkernel/AppMetadata/include/AppMetadata.hpp index ef97a2c7cf92..2c3aac7bfda9 100644 --- a/core/libs/prx/libkernel/AppMetadata/include/AppMetadata.hpp +++ b/core/libs/prx/libkernel/AppMetadata/include/AppMetadata.hpp @@ -30,6 +30,7 @@ bool HasAppIcon_nid_postfix(); AppIconData GetAppIconData_nid_postfix(); std::uint64_t GetAppDownloadDataSizeMiB_nid_postfix(); std::uint32_t GetAppAttribute3_nid_no_patch(); +bool GetAppParamSfoAttribute_nid_no_patch(std::uint32_t* attribute); std::int32_t GetAppUserDefinedParam_nid_postfix(std::uint32_t index); } diff --git a/core/libs/prx/libkernel/AppMetadata/include/ParamJsonParser.hpp b/core/libs/prx/libkernel/AppMetadata/include/ParamJsonParser.hpp index 65e2c6c0a84e..b63c85b7ab0d 100644 --- a/core/libs/prx/libkernel/AppMetadata/include/ParamJsonParser.hpp +++ b/core/libs/prx/libkernel/AppMetadata/include/ParamJsonParser.hpp @@ -12,6 +12,7 @@ struct ParsedParamJson { std::string contentVersion; std::uint64_t downloadDataSizeMiB = 0; std::uint32_t attribute3 = 0; + std::optional paramSfoAttribute; std::optional flexibleMemorySizeBytes; std::int32_t userDefinedParams[4] = {}; }; diff --git a/core/libs/prx/libkernel/AppMetadata/src/AppMetadata.cpp b/core/libs/prx/libkernel/AppMetadata/src/AppMetadata.cpp index 3f46122f149e..bae222a7c401 100644 --- a/core/libs/prx/libkernel/AppMetadata/src/AppMetadata.cpp +++ b/core/libs/prx/libkernel/AppMetadata/src/AppMetadata.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -23,6 +24,7 @@ char g_titleId[12] = {}; char g_contentVersion[16] = {}; std::uint64_t g_downloadDataSizeMiB = 0; std::uint32_t g_attribute3 = 0; +std::optional g_paramSfoAttribute; std::int32_t g_userDefinedParams[4] = {}; std::vector g_iconBytes; @@ -51,6 +53,7 @@ void ensureTitleLoaded() { if (!parsed.contentVersion.empty() && parsed.contentVersion.size() < sizeof(g_contentVersion)) copyToFixedBuffer(g_contentVersion, sizeof(g_contentVersion), parsed.contentVersion); g_downloadDataSizeMiB = parsed.downloadDataSizeMiB; g_attribute3 = parsed.attribute3; + g_paramSfoAttribute = parsed.paramSfoAttribute; std::memcpy(g_userDefinedParams, parsed.userDefinedParams, sizeof(g_userDefinedParams)); g_titleLoaded = true; } @@ -122,6 +125,13 @@ std::uint32_t GetAppAttribute3_nid_no_patch() { return g_attribute3; } +bool GetAppParamSfoAttribute_nid_no_patch(std::uint32_t* attribute) { + ensureTitleLoaded(); + if (!g_paramSfoAttribute) return false; + *attribute = *g_paramSfoAttribute; + return true; +} + std::int32_t GetAppUserDefinedParam_nid_postfix(std::uint32_t index) { if (index >= 4) throw std::out_of_range("user defined param index out of range"); ensureTitleLoaded(); diff --git a/core/libs/prx/libkernel/AppMetadata/src/ParamSfoParser.cpp b/core/libs/prx/libkernel/AppMetadata/src/ParamSfoParser.cpp index bfaf32d9f85c..99b9467fa199 100644 --- a/core/libs/prx/libkernel/AppMetadata/src/ParamSfoParser.cpp +++ b/core/libs/prx/libkernel/AppMetadata/src/ParamSfoParser.cpp @@ -81,5 +81,7 @@ ParsedParamJson parseParamSfo(const std::filesystem::path& paramSfoPath) { const auto param = integers.find("USER_DEFINED_PARAM_" + std::to_string(index + 1)); if (param != integers.end()) result.userDefinedParams[index] = param->second; } + const auto attribute = integers.find("ATTRIBUTE"); + result.paramSfoAttribute = attribute != integers.end() ? static_cast(attribute->second) : 0u; return result; } diff --git a/core/libs/prx/libkernel/CMakeLists.txt b/core/libs/prx/libkernel/CMakeLists.txt index 7810fe72b851..92d099e7560e 100644 --- a/core/libs/prx/libkernel/CMakeLists.txt +++ b/core/libs/prx/libkernel/CMakeLists.txt @@ -70,6 +70,9 @@ add_library(libkernel SHARED EXCLUDE_FROM_ALL ${CMAKE_CURRENT_SOURCE_DIR}/System/src/Process.cpp ${CMAKE_CURRENT_SOURCE_DIR}/System/src/Sandbox.cpp ${CMAKE_CURRENT_SOURCE_DIR}/System/src/HostCpu.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/System/src/HostPerformance.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/System/src/HostPerformanceProcess.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/System/src/HostPerformanceStartup.cpp ${CMAKE_CURRENT_SOURCE_DIR}/System/src/MimallocMacOs.cpp ${CMAKE_CURRENT_SOURCE_DIR}/System/src/SystemConfiguration.cpp ${CMAKE_CURRENT_SOURCE_DIR}/System/src/Login.cpp @@ -91,6 +94,9 @@ add_library(libkernel SHARED EXCLUDE_FROM_ALL ) if(APPLE) target_link_libraries(libkernel PRIVATE "-framework CoreFoundation") + target_sources(libkernel PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/System/src/MacActivity.cpp) +elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") + target_sources(libkernel PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/System/src/GameModeClient.cpp) endif() target_include_directories(libkernel PRIVATE ${LIBS_INCLUDE_DIR}) @@ -141,7 +147,7 @@ if(BUILD_TESTING) set_target_properties(guest_exec_host PROPERTIES PREFIX "" SUFFIX ".prx" BUILD_RPATH "$ORIGIN") configure_windows_unwind(guest_exec_host) find_package(Python3 COMPONENTS Interpreter QUIET) - if(Python3_FOUND) + if(Python3_FOUND AND ANYPS5_RELINKER_CLI) add_test(NAME exec_arguments COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/core/relinker/relinker/tests/test_exec_arguments.py $ $ @@ -258,7 +264,7 @@ if(BUILD_TESTING) "PATH=path_list_prepend:$") endif() find_package(Python3 QUIET COMPONENTS Interpreter) - if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND Python3_Interpreter_FOUND) + if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND Python3_Interpreter_FOUND AND ANYPS5_RELINKER_CLI) add_test_executable(guest_runtime_lifecycle_tests ${LIBS_INCLUDE_DIR}/tests/GuestRuntimeLifecycle.cpp) target_include_directories(guest_runtime_lifecycle_tests PRIVATE ${LIBS_INCLUDE_DIR}) target_link_libraries(guest_runtime_lifecycle_tests PRIVATE libkernel libc ${CMAKE_DL_LIBS}) @@ -770,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) @@ -956,6 +972,16 @@ if(BUILD_TESTING) set_tests_properties(guest_nanosleep_long_request PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") endif() + add_test_executable(guest_timed_wait_cpu_tests ${LIBS_INCLUDE_DIR}/tests/GuestTimedWaitCpu.cpp) + target_include_directories(guest_timed_wait_cpu_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_timed_wait_cpu_tests PRIVATE libkernel libc) + configure_windows_unwind(guest_timed_wait_cpu_tests) + 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 RUN_SERIAL TRUE ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() add_test_executable(guest_pthread_sem_tests ${LIBS_INCLUDE_DIR}/tests/GuestPthreadSem.cpp) target_include_directories(guest_pthread_sem_tests PRIVATE ${LIBS_INCLUDE_DIR}) target_link_libraries(guest_pthread_sem_tests PRIVATE libkernel libc) @@ -1543,6 +1569,13 @@ if(BUILD_TESTING) "PATH=path_list_prepend:$") set_tests_properties(guest_shm_open PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") + add_test_executable(guest_named_shm_windows_mapping_tests ${LIBS_INCLUDE_DIR}/tests/GuestNamedShmWindowsMapping.cpp) + target_include_directories(guest_named_shm_windows_mapping_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_named_shm_windows_mapping_tests PRIVATE libkernel libc) + configure_windows_unwind(guest_named_shm_windows_mapping_tests) + add_test(NAME guest_named_shm_windows_mapping COMMAND guest_named_shm_windows_mapping_tests) + set_tests_properties(guest_named_shm_windows_mapping PROPERTIES TIMEOUT 20 ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") endif() add_test_executable(guest_jit_shared_memory_tests ${LIBS_INCLUDE_DIR}/tests/GuestJitSharedMemory.cpp) target_include_directories(guest_jit_shared_memory_tests PRIVATE ${LIBS_INCLUDE_DIR}) @@ -1651,6 +1684,21 @@ if(BUILD_TESTING) configure_windows_unwind(guest_udp_tests) add_test(NAME guest_udp COMMAND guest_udp_tests) set_tests_properties(guest_udp PROPERTIES TIMEOUT 20) + if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + add_test_executable(guest_udp_name_concurrency_tests ${LIBS_INCLUDE_DIR}/tests/GuestUdpNameConcurrency.cpp) + target_include_directories(guest_udp_name_concurrency_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_udp_name_concurrency_tests PRIVATE libkernel libc) + target_link_options(guest_udp_name_concurrency_tests PRIVATE LINKER:--export-dynamic-symbol=connect) + add_test(NAME guest_udp_name_concurrency COMMAND guest_udp_name_concurrency_tests) + set_tests_properties(guest_udp_name_concurrency PROPERTIES TIMEOUT 10) + add_test_executable(guest_udp_disconnect_result_tests ${LIBS_INCLUDE_DIR}/tests/GuestUdpDisconnectResult.cpp) + target_include_directories(guest_udp_disconnect_result_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_udp_disconnect_result_tests PRIVATE libkernel libc) + target_link_options(guest_udp_disconnect_result_tests PRIVATE + LINKER:--export-dynamic-symbol=connect LINKER:--export-dynamic-symbol=getpeername) + add_test(NAME guest_udp_disconnect_result COMMAND guest_udp_disconnect_result_tests) + set_tests_properties(guest_udp_disconnect_result PROPERTIES TIMEOUT 10) + endif() if(WIN32) set_tests_properties(guest_udp PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") @@ -2238,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) @@ -2283,7 +2341,7 @@ if(BUILD_TESTING) target_include_directories(guest_timed_join_tests PRIVATE ${LIBS_INCLUDE_DIR}) target_link_libraries(guest_timed_join_tests PRIVATE libkernel libc ${CMAKE_DL_LIBS}) configure_windows_unwind(guest_timed_join_tests) - if(WIN32 AND Python3_Interpreter_FOUND) + if(WIN32 AND Python3_Interpreter_FOUND AND ANYPS5_RELINKER_CLI) foreach(joinProvider IN ITEMS libkernel_sys libkernel_web) add_test(NAME guest_timed_join_import_${joinProvider} COMMAND ${Python3_EXECUTABLE} ${LIBS_INCLUDE_DIR}/tests/test_windows_timed_join_imports.py $ ${PATCHED_DIR} @@ -2341,4 +2399,96 @@ if(BUILD_TESTING) ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") endif() endforeach() + add_test_executable(host_performance_session_tests + ${LIBS_INCLUDE_DIR}/tests/HostPerformanceSession.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/System/src/HostPerformance.cpp) + target_include_directories(host_performance_session_tests PRIVATE ${LIBS_INCLUDE_DIR}) + find_package(Threads REQUIRED) + target_link_libraries(host_performance_session_tests PRIVATE Threads::Threads) + set_target_properties(host_performance_session_tests PROPERTIES CXX_EXTENSIONS OFF) + configure_host_test_executable(host_performance_session_tests) + add_test(NAME host_performance_session COMMAND host_performance_session_tests) + set_tests_properties(host_performance_session PROPERTIES TIMEOUT 20) + if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + add_library(game_mode_fixture SHARED ${LIBS_INCLUDE_DIR}/tests/GameModeFixtureLibrary.cpp) + add_library(game_mode_fixture_no_end SHARED ${LIBS_INCLUDE_DIR}/tests/GameModeFixtureLibrary.cpp) + target_compile_definitions(game_mode_fixture_no_end PRIVATE FIXTURE_OMIT_END) + add_library(game_mode_fixture_no_error_string SHARED ${LIBS_INCLUDE_DIR}/tests/GameModeFixtureLibrary.cpp) + target_compile_definitions(game_mode_fixture_no_error_string PRIVATE FIXTURE_OMIT_ERROR_STRING) + set_target_properties(game_mode_fixture game_mode_fixture_no_end game_mode_fixture_no_error_string PROPERTIES + LIBRARY_OUTPUT_DIRECTORY "${ANYPS5_TEST_OUTPUT_DIRECTORY}") + add_test_executable(host_performance_game_mode_tests + ${LIBS_INCLUDE_DIR}/tests/HostPerformanceGameMode.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/System/src/HostPerformance.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/System/src/GameModeClient.cpp) + target_include_directories(host_performance_game_mode_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(host_performance_game_mode_tests PRIVATE ${CMAKE_DL_LIBS}) + set_target_properties(host_performance_game_mode_tests PROPERTIES CXX_EXTENSIONS OFF) + add_dependencies(host_performance_game_mode_tests game_mode_fixture game_mode_fixture_no_end game_mode_fixture_no_error_string) + add_test(NAME host_performance_game_mode COMMAND host_performance_game_mode_tests + $ $ + $ + ${CMAKE_CURRENT_BINARY_DIR}/no-such-libgamemode.so) + set_tests_properties(host_performance_game_mode PROPERTIES TIMEOUT 20) + endif() + if(UNIX) + set(objcFixtureLibraries "") + foreach(objcFixture IN ITEMS objc_fixture:FIXTURE_COMPLETE objc_fixture_no_class:FIXTURE_NO_CLASS objc_fixture_nil_activity:FIXTURE_NIL_ACTIVITY objc_fixture_no_pool:FIXTURE_OMIT_POOL) + string(REPLACE ":" ";" objcFixture ${objcFixture}) + list(GET objcFixture 0 objcFixtureName) + add_library(${objcFixtureName} SHARED ${LIBS_INCLUDE_DIR}/tests/ObjcFixtureLibrary.cpp) + set_target_properties(${objcFixtureName} PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${ANYPS5_TEST_OUTPUT_DIRECTORY}") + list(GET objcFixture 1 objcFixtureDefinition) + target_compile_definitions(${objcFixtureName} PRIVATE ${objcFixtureDefinition}) + list(APPEND objcFixtureLibraries ${objcFixtureName}) + endforeach() + add_test_executable(host_performance_mac_activity_tests + ${LIBS_INCLUDE_DIR}/tests/HostPerformanceMacActivity.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/System/src/MacActivity.cpp) + target_include_directories(host_performance_mac_activity_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(host_performance_mac_activity_tests PRIVATE ${CMAKE_DL_LIBS}) + set_target_properties(host_performance_mac_activity_tests PROPERTIES CXX_EXTENSIONS OFF) + add_dependencies(host_performance_mac_activity_tests ${objcFixtureLibraries}) + add_test(NAME host_performance_mac_activity COMMAND host_performance_mac_activity_tests + $ $ + $ $ + ${CMAKE_CURRENT_BINARY_DIR}/no-such-libobjc.dylib) + set_tests_properties(host_performance_mac_activity PROPERTIES TIMEOUT 20) + endif() + add_test_executable(host_performance_process_tests + ${LIBS_INCLUDE_DIR}/tests/HostPerformanceProcess.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/System/src/HostPerformance.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/System/src/HostPerformanceProcess.cpp) + target_include_directories(host_performance_process_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(host_performance_process_tests PRIVATE libc Threads::Threads ${CMAKE_DL_LIBS}) + set_target_properties(host_performance_process_tests PROPERTIES CXX_EXTENSIONS OFF) + configure_windows_unwind(host_performance_process_tests) + if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + target_sources(host_performance_process_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/System/src/GameModeClient.cpp) + elseif(APPLE) + target_sources(host_performance_process_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/System/src/MacActivity.cpp) + endif() + function(add_host_performance_process_test name pattern) + add_test(NAME host_performance_process_${name} COMMAND host_performance_process_tests ${ARGN}) + set_tests_properties(host_performance_process_${name} PROPERTIES TIMEOUT 20 PASS_REGULAR_EXPRESSION "${pattern}") + if(WIN32) + set_tests_properties(host_performance_process_${name} PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + endfunction() + add_host_performance_process_test(exit "begin called.release ran at exit" exit) + add_host_performance_process_test(exit_without_handlers "begin called.release ran at exit" exit-without-handlers) + add_host_performance_process_test(refused "begin called" refused) + set_tests_properties(host_performance_process_refused PROPERTIES FAIL_REGULAR_EXPRESSION "release ran") + add_host_performance_process_test(off "off left the backend alone" off) + set_tests_properties(host_performance_process_off PROPERTIES FAIL_REGULAR_EXPRESSION "begin called") + add_host_performance_process_test(twice "second session refused" twice) + add_host_performance_process_test(environment "environment accepted" environment) + add_test(NAME host_performance_process_invalid COMMAND host_performance_process_tests environment) + set_tests_properties(host_performance_process_invalid PROPERTIES TIMEOUT 20 ENVIRONMENT "APS5_GAME_MODE=bogus" + PASS_REGULAR_EXPRESSION "invalid value rejected by name") + if(WIN32) + set_tests_properties(host_performance_process_invalid PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() endif() diff --git a/core/libs/prx/libkernel/DirectMemory/DirectMemory.cpp b/core/libs/prx/libkernel/DirectMemory/DirectMemory.cpp index 72f44ac6db5b..7eb7903cd04f 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 @@ -31,6 +32,10 @@ #include #include #include +#elif defined(__EMSCRIPTEN__) +#include +#include +#include #else #include #include "prx/libc/include/WindowsDescriptor.hpp" @@ -380,7 +385,9 @@ class SectionPool { class PhysicalBacking { public: PhysicalBacking(std::size_t bytes, int memoryType, std::uint64_t start) : memoryType(memoryType), bytes(bytes) { -#ifdef _WIN32 +#if defined(__EMSCRIPTEN__) + static_cast(start); +#elif defined(_WIN32) static_cast(start); const auto size = static_cast(bytes); if (SectionPoolEnabled()) section = SectionPool::Get().Take(bytes); @@ -415,7 +422,8 @@ class PhysicalBacking { #endif ~PhysicalBacking() { -#ifdef _WIN32 +#if defined(__EMSCRIPTEN__) +#elif defined(_WIN32) if (!SectionPoolEnabled()) { GuestArena::GuestArenaForgetSection_nid_postfix(section); CloseHandle(section); @@ -431,7 +439,11 @@ class PhysicalBacking { PhysicalBacking& operator=(const PhysicalBacking&) = delete; void Map(std::uintptr_t address, std::size_t bytes, std::uint64_t offset, int protection) const { -#ifdef _WIN32 +#if defined(__EMSCRIPTEN__) + static_cast(offset); + static_cast(protection); + GuestArena::GuestArenaCommit_nid_postfix(reinterpret_cast(address), bytes, 0x04, PS5_PAGE_SIZE); +#elif defined(_WIN32) GuestArena::GuestArenaMapDirect_nid_postfix(reinterpret_cast(address), bytes, section, offset, WinProtFromPosix(protection)); #else if (::mmap(reinterpret_cast(address), bytes, protection, MAP_SHARED | MAP_FIXED, file, static_cast(fileOffset + offset)) == MAP_FAILED) throw std::system_error(errno, std::generic_category(), "map direct memory backing"); @@ -441,7 +453,8 @@ class PhysicalBacking { private: int memoryType; std::size_t bytes; -#ifdef _WIN32 +#if defined(__EMSCRIPTEN__) +#elif defined(_WIN32) HANDLE section = nullptr; #else int file = -1; @@ -611,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__) @@ -707,6 +725,9 @@ bool WriteSharedBacking(std::uintptr_t address, const void* source, std::size_t void AddMapping(std::uintptr_t address, std::size_t len, std::uint64_t phys, int nativeProt, bool records = true) { ValidatePhysicalRange(phys, len); if (records) EraseMappings(address, address + len); +#ifdef __EMSCRIPTEN__ + if (records && !MappingsSharingPhys(phys, phys + len).empty()) throw std::system_error(ENOTSUP, std::generic_category(), "WebAssembly memory cannot map one direct memory range at two addresses"); +#endif const auto last = phys + len; auto it = g_physBlocks.upper_bound(phys); --it; @@ -779,6 +800,9 @@ bool RemapFixedIntoRegistered(GuestAllocations::Mutation& mutation, void* addr, #ifdef _WIN32 GuestArena::GuestArenaReset_nid_postfix(addr, len); if (nativeProtection != PROT_NONE) CommitArenaRange(addr, len, WinProtFromPosix(nativeProtection)); +#elif defined(__EMSCRIPTEN__) + GuestArena::GuestArenaReset_nid_postfix(addr, len); + GuestArena::GuestArenaCommit_nid_postfix(addr, len, 0x04, PS5_PAGE_SIZE); #else if (::mmap(addr, len, nativeProtection, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0) == MAP_FAILED) throw std::system_error(errno, std::generic_category(), "remap anonymous memory"); GuestWriteWatch::GuestWriteWatchRegister_nid_postfix(addr, len); @@ -789,11 +813,17 @@ bool RemapFixedIntoRegistered(GuestAllocations::Mutation& mutation, void* addr, return true; } -#if defined(__linux__) +#if defined(__linux__) || defined(__EMSCRIPTEN__) bool ArenaAvailable() { return GuestArena::GuestArenaAvailable_nid_postfix(); } void* ArenaCommit(void* addr, size_t len, int prot) { +#ifdef __EMSCRIPTEN__ + static_cast(prot); + GuestArena::GuestArenaCommit_nid_postfix(addr, len, 0x04, PS5_PAGE_SIZE); + return addr; +#else return mmap(addr, len, prot, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); +#endif } void ArenaForget(void* addr, size_t len) { @@ -802,7 +832,7 @@ void ArenaForget(void* addr, size_t len) { #endif void Unmap(void* addr, size_t len) { -#if defined(__linux__) +#if defined(__linux__) || defined(__EMSCRIPTEN__) if (ArenaAvailable() && GuestArena::GuestArenaContains_nid_postfix(addr, len)) GuestArena::GuestArenaReset_nid_postfix(addr, len); else if (munmap(addr, len) != 0) throw std::system_error(errno, std::generic_category(), "munmap failed"); @@ -854,7 +884,7 @@ void* MapPlaced(void* addr, size_t len, int prot, int flags, size_t alignment) { } } #endif -#if defined(__linux__) +#if defined(__linux__) || defined(__EMSCRIPTEN__) if (ArenaAvailable() && !GuestArena::GuestArenaContains_nid_postfix(addr, len)) throw std::invalid_argument("fixed mapping is outside the guest address space arena"); if (ArenaAvailable()) { @@ -875,7 +905,7 @@ void* MapPlaced(void* addr, size_t len, int prot, int flags, size_t alignment) { return result; } if (addr) { -#if defined(__linux__) +#if defined(__linux__) || defined(__EMSCRIPTEN__) if (ArenaAvailable()) { void* placed = GuestArena::GuestArenaAllocateFromHint_nid_postfix( reinterpret_cast(addr), len, alignment); @@ -883,7 +913,11 @@ void* MapPlaced(void* addr, size_t len, int prot, int flags, size_t alignment) { ArenaForget(placed, len); throw std::system_error(errno, std::generic_category(), "Arena mapping failed"); } +#ifdef __EMSCRIPTEN__ + throw std::runtime_error("the guest address space arena is unavailable"); +#else return MapAtOrAbove(reinterpret_cast(addr), len, prot, alignment); +#endif #else return mmap_aligned(len, prot, alignment, reinterpret_cast(addr)); #endif @@ -891,7 +925,7 @@ void* MapPlaced(void* addr, size_t len, int prot, int flags, size_t alignment) { #ifdef _WIN32 return mmap_aligned(len, prot, alignment); #endif -#if defined(__linux__) +#if defined(__linux__) || defined(__EMSCRIPTEN__) if (ArenaAvailable()) { void* placed = GuestArena::GuestArenaAllocate_nid_postfix(len, alignment); if (void* committed = ArenaCommit(placed, len, prot); committed != MAP_FAILED) return committed; @@ -1010,7 +1044,7 @@ void UnmapRegistered(GuestAllocations::Mutation& mutation, void* addr, size_t le auto* pieceAddress = const_cast(piece); std::lock_guard lock(g_directLock); EraseMappings(reinterpret_cast(piece), reinterpret_cast(piece) + pieceBytes); -#if defined(__linux__) +#if defined(__linux__) || defined(__EMSCRIPTEN__) Unmap(pieceAddress, pieceBytes); #else if (KernelArena::Get().Contains(pieceAddress, pieceBytes)) munmap(pieceAddress, pieceBytes); @@ -1047,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; @@ -1191,6 +1229,13 @@ int DoMapFileBacked_nid_no_patch(void** addr, size_t len, int prot, int flags, i RecordProtection(mapped, len, prot); Trace("map file %p+0x%zx offset=0x%llx prot=0x%x flags=0x%x", mapped, len, static_cast(offset), prot, flags); return 0; +#elif defined(__EMSCRIPTEN__) + static_cast(prot); + static_cast(flags); + static_cast(descriptor); + static_cast(offset); + static_cast(alignment); + throw std::system_error(ENOTSUP, std::generic_category(), "file-backed guest mmap is not supported in WebAssembly"); #else if ((flags & 3) != 1) throw std::system_error(ENOTSUP, std::generic_category(), "map file: a private file mapping is not mapped from the file on Windows"); const HANDLE file = WindowsDescriptorHandle_nid_no_patch(descriptor); @@ -1248,11 +1293,14 @@ int DoMapShared(void** addr, size_t len, int prot, HostSharedMemory object) { GuestAllocations::Mutation mutation; void* mapped = MapPlaced(*addr, len, PROT_NONE, 0, PS5_PAGE_SIZE); try { -#ifdef _WIN32 +#if defined(_WIN32) GuestArena::GuestArenaMap_nid_postfix(mapped, len, object, 0, WinProtFromPosix(nativeProtection)); #elif defined(__APPLE__) if (::mmap(mapped, len, nativeProtection & ~PROT_EXEC, MAP_SHARED | MAP_FIXED, object, 0) == MAP_FAILED) throw std::system_error(errno, std::generic_category(), "map shared memory"); if ((nativeProtection & PROT_EXEC) != 0 && ::mprotect(mapped, len, nativeProtection) != 0) throw std::system_error(errno, std::generic_category(), "make shared memory executable"); +#elif defined(__EMSCRIPTEN__) + static_cast(object); + throw std::system_error(ENOTSUP, std::generic_category(), "shared memory mappings are not supported in WebAssembly"); #else if (::mmap(mapped, len, nativeProtection, MAP_SHARED | MAP_FIXED, object, 0) == MAP_FAILED) throw std::system_error(errno, std::generic_category(), "map shared memory"); #endif @@ -1373,10 +1421,12 @@ int DoMprotect(const void* addr, size_t len, int prot) { const bool protectedPages = error == 0; #else bool protectedPages = mprotect(insidePointer, insideBytes, nativeProtection) == 0; +#if defined(__linux__) if (!protectedPages && errno == ENOMEM) { MapUnmappedPages(insidePointer, static_cast((stackEnd & ~hostPageMask) - inside)); protectedPages = mprotect(insidePointer, insideBytes, nativeProtection) == 0; } +#endif #endif if (!protectedPages) throw std::system_error(errno, std::generic_category(), "mprotect failed"); if (inside != requested) RecordProtection(requestedPointer, static_cast(inside - requested), prot); diff --git a/core/libs/prx/libkernel/DirectMemory/Export.cpp b/core/libs/prx/libkernel/DirectMemory/Export.cpp index 619cf83633a9..ef0324cf29a0 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/DirectMemory/PosixMemory.cpp b/core/libs/prx/libkernel/DirectMemory/PosixMemory.cpp index 81295e330c38..dd76e29ee805 100644 --- a/core/libs/prx/libkernel/DirectMemory/PosixMemory.cpp +++ b/core/libs/prx/libkernel/DirectMemory/PosixMemory.cpp @@ -47,6 +47,7 @@ constexpr int GuestAdviceProtect = 10; constexpr int GuestLockCurrent = 0x1; constexpr int GuestLockFuture = 0x2; constexpr int GuestDefinedProtection = 0x3F7; +constexpr std::uintptr_t GuestUserAddressStart = PS5_PAGE_SIZE; constexpr std::uintptr_t GuestUserAddressEnd = 0x800000000000; constexpr int GuestAlignedSuper = 0x1000000; constexpr std::size_t SuperpageSize = std::size_t{1} << 21; @@ -205,10 +206,12 @@ void* APS5_VABI mmap_nid_postfix(void* address, std::size_t length, int protecti if (!File::IsSharedMemoryDescriptor_nid_no_patch(mappingDescriptor) && !RegularFile(mappingDescriptor)) return failed(GuestNotSupported); #elif defined(_WIN32) const int mappingDescriptor = descriptor; - if (!File::IsSharedMemoryDescriptor_nid_no_patch(mappingDescriptor)) { + { const HANDLE handle = WindowsDescriptorHandle_nid_no_patch(mappingDescriptor); if (handle == INVALID_HANDLE_VALUE) return failed(GuestBadDescriptor); - if (File::DirectoryDescriptorPath(mappingDescriptor) || File::IsRandomDevice(mappingDescriptor) || GetFileType(handle) != FILE_TYPE_DISK) return failed(GuestNotSupported); + if (!File::IsSharedMemoryDescriptor_nid_no_patch(mappingDescriptor) && + (File::DirectoryDescriptorPath(mappingDescriptor) || File::IsRandomDevice(mappingDescriptor) || GetFileType(handle) != FILE_TYPE_DISK)) + return failed(GuestNotSupported); const int accessMode = DescriptorAccess(handle, mappingDescriptor); if (accessMode < 0) return failed(GuestBadDescriptor); if ((protection & 1) != 0 && accessMode == 1) return failed(GuestAccess); @@ -347,6 +350,15 @@ int APS5_VABI madvise_nid_postfix(void* address, std::size_t length, int advice) return 0; } +int APS5_VABI posix_madvise_nid_postfix(void* address, std::size_t length, int advice) { + if (advice == GuestAdviceProtect) return 0; + const auto start = reinterpret_cast(address); + if (advice < 0 || advice > GuestAdviceCore || start < GuestUserAddressStart || start > GuestUserAddressEnd || length > GuestUserAddressEnd - start) { + return GuestInvalid; + } + return 0; +} + int APS5_VABI mincore_nid_postfix(const void* address, std::size_t length, char* vec) { const auto failed = [](int error) { SetError(error); diff --git a/core/libs/prx/libkernel/Equeue/Equeue.cpp b/core/libs/prx/libkernel/Equeue/Equeue.cpp index 981708e90594..fca356d2964d 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/Equeue/src/FileEvent.cpp b/core/libs/prx/libkernel/Equeue/src/FileEvent.cpp index aaf4d1b5700d..ba078db53b64 100644 --- a/core/libs/prx/libkernel/Equeue/src/FileEvent.cpp +++ b/core/libs/prx/libkernel/Equeue/src/FileEvent.cpp @@ -23,6 +23,8 @@ #include #include #include +#elif defined(__EMSCRIPTEN__) +#include #else #include #include @@ -68,6 +70,7 @@ class VnodeWatch { stopSignal = ends[1]; ::fcntl(stopEvent, F_SETFD, FD_CLOEXEC); ::fcntl(stopSignal, F_SETFD, FD_CLOEXEC); +#elif defined(__EMSCRIPTEN__) #else stopEvent = ::eventfd(0, EFD_CLOEXEC); if (stopEvent < 0) { @@ -465,6 +468,19 @@ int OpenHostWatch(int descriptor, std::uint32_t, HostWatch& host) { return 0; } +#elif defined(__EMSCRIPTEN__) + +struct HostWatch {}; + +void CloseHostWatch(HostWatch&) {} + +void RunHostWatch(std::shared_ptr, HostWatch) {} + +int OpenHostWatch(int, std::uint32_t, HostWatch&) { + NotImplemented_nid_no_patch("EVFILT_VNODE in WebAssembly"); + return GUEST_EINVAL; +} + #else struct HostWatch { diff --git a/core/libs/prx/libkernel/Equeue/src/Kqueue.cpp b/core/libs/prx/libkernel/Equeue/src/Kqueue.cpp index 803268a6c3c1..3f211800852a 100644 --- a/core/libs/prx/libkernel/Equeue/src/Kqueue.cpp +++ b/core/libs/prx/libkernel/Equeue/src/Kqueue.cpp @@ -13,6 +13,7 @@ #include "prx/libkernel/Time/include/TimedWait.hpp" #include +#include #include #include #include @@ -46,6 +47,8 @@ constexpr int GUEST_EMFILE = 24; constexpr int GUEST_EPIPE = 32; constexpr int KQ_NEVENTS = 8; +constexpr int KQ_STACK_EVENTS = 64; +constexpr int KQ_MAX_SCAN = 1024; constexpr std::int16_t EVFILT_AIO = -3; constexpr std::int16_t EVFILT_PROCDESC = -8; constexpr std::int16_t EVFILT_LIO = -10; @@ -621,9 +624,19 @@ int APS5_VABI kevent_nid_postfix(int descriptor, const KernelEvent* changelist, if (nchanges > 0 && changelist == nullptr) { return PosixFailure(GUEST_EFAULT); } + KernelTimespec limit{}; + if (timeout != nullptr) { + if (!GuestCopyIn_nid_no_patch(&limit, timeout, sizeof(limit))) { + return PosixFailure(GUEST_EFAULT); + } + timeout = &limit; + } int errors = 0; for (int i = 0; i < nchanges; ++i) { - KernelEvent change = changelist[i]; + KernelEvent change{}; + if (!GuestCopyIn_nid_no_patch(&change, changelist + i, sizeof(change))) { + return PosixFailure(GUEST_EFAULT); + } if (change.filter == 0) { continue; } @@ -638,7 +651,10 @@ int APS5_VABI kevent_nid_postfix(int descriptor, const KernelEvent* changelist, change.flags = EV_ERROR; change.data = error; if (eventlist != nullptr) { - *eventlist++ = change; + if (!GuestCopyOut_nid_no_patch(eventlist, &change, sizeof(change))) { + return PosixFailure(GUEST_EFAULT); + } + ++eventlist; } --nevents; ++errors; @@ -660,14 +676,19 @@ int APS5_VABI kevent_nid_postfix(int descriptor, const KernelEvent* changelist, deadline = ScanDeadline(*timeout); } } - KernelEvent scratch[KQ_NEVENTS]; - KernelEvent* target = eventlist != nullptr ? eventlist : scratch; - const int capacity = eventlist != nullptr ? nevents : std::min(nevents, KQ_NEVENTS); + KernelEvent scratch[KQ_STACK_EVENTS]; + std::unique_ptr heap; + const int capacity = std::min(nevents, eventlist != nullptr ? KQ_MAX_SCAN : KQ_NEVENTS); + KernelEvent* target = scratch; + if (capacity > KQ_STACK_EVENTS) { + heap.reset(new KernelEvent[static_cast(capacity)]); + target = heap.get(); + } const int count = poll ? queue->GetTriggeredEvents(target, capacity) : queue->WaitForEventsUntil(target, capacity, deadline.value_or(0)); if (count < 0) { return PosixFailure(GuestErrno(count)); } - if (count > 0 && eventlist == nullptr) { + if (count > 0 && (eventlist == nullptr || !GuestCopyOut_nid_no_patch(eventlist, target, static_cast(count) * sizeof(KernelEvent)))) { return PosixFailure(GUEST_EFAULT); } return count; diff --git a/core/libs/prx/libkernel/File/src/DescriptorControl.cpp b/core/libs/prx/libkernel/File/src/DescriptorControl.cpp index 63828320b8cc..1c5f3dddd90b 100644 --- a/core/libs/prx/libkernel/File/src/DescriptorControl.cpp +++ b/core/libs/prx/libkernel/File/src/DescriptorControl.cpp @@ -147,7 +147,8 @@ const char* KindName(Kind kind) { #ifdef _WIN32 std::optional Classify(int fd, const char* function) { - if (fd < 0 || !DescriptorIsOpen_nid_no_patch(fd)) return std::nullopt; + if (fd < 0 || (!GuestSockets::IsOpen(fd) && !DescriptorIsOpen_nid_no_patch(fd))) return std::nullopt; + if (GuestSockets::IsOpen(fd)) return Kind::Socket; if (File::IsDirectoryDescriptor(fd)) return Kind::Directory; if (File::IsRandomDevice(fd)) return Kind::RandomDevice; if (File::IsArchivedFile(fd)) return Kind::ArchivedFile; @@ -160,6 +161,7 @@ std::optional Classify(int fd, const char* function) { } int AccessMode(int fd, const char* function) { + if (GuestSockets::IsOpen(fd)) return ReadWrite; return WindowsDescriptorAccess_nid_no_patch(WindowsDescriptorHandle_nid_no_patch(fd), fd, function); } @@ -221,6 +223,12 @@ int Readable(int fd, Kind kind, const char* function) { throw std::runtime_error(std::string(function) + ": cannot read the size and offset of descriptor " + std::to_string(fd) + ", errno=" + std::to_string(errno)); return static_cast(size - offset); } + if (kind == Kind::Socket) { + std::int64_t data = 0; + bool eof = false; + GuestSockets::Ready(fd, false, &data, &eof); + return static_cast(data); + } if (AccessMode(fd, function) == WriteOnly) return 0; DWORD available = 0; if (!::PeekNamedPipe(WindowsDescriptorHandle_nid_no_patch(fd), nullptr, 0, nullptr, &available, nullptr)) { @@ -653,7 +661,7 @@ bool GrantsAccess(int fd, bool write) { } bool IsVnode(int fd) { - if (fd < 0 || File::IsRandomDevice(fd)) return false; + if (fd < 0 || File::IsRandomDevice(fd) || GuestSockets::IsOpen(fd)) return false; if (File::IsArchivedFile(fd)) return true; #ifdef _WIN32 if (!DescriptorIsOpen_nid_no_patch(fd)) return false; diff --git a/core/libs/prx/libkernel/File/src/NativeStat.cpp b/core/libs/prx/libkernel/File/src/NativeStat.cpp index 2902da115249..100bf5a9a3ef 100644 --- a/core/libs/prx/libkernel/File/src/NativeStat.cpp +++ b/core/libs/prx/libkernel/File/src/NativeStat.cpp @@ -138,7 +138,7 @@ static void CopyNativeStat(const NativeStat& st, FileStat* sb) { #if defined(__APPLE__) sb->st_birthtim.tv_sec = static_cast(st.st_birthtimespec.tv_sec); sb->st_birthtim.tv_nsec = static_cast(st.st_birthtimespec.tv_nsec); -#elif defined(__linux__) +#elif defined(__linux__) || defined(__EMSCRIPTEN__) sb->st_birthtim = sb->st_ctim; #else sb->st_birthtim.tv_sec = static_cast(st.st_birthtim.tv_sec); diff --git a/core/libs/prx/libkernel/File/src/SandboxCertificates.cpp b/core/libs/prx/libkernel/File/src/SandboxCertificates.cpp index 40ed2effdb3e..14437699aa9f 100644 --- a/core/libs/prx/libkernel/File/src/SandboxCertificates.cpp +++ b/core/libs/prx/libkernel/File/src/SandboxCertificates.cpp @@ -111,6 +111,8 @@ std::filesystem::path CertificateList(const std::filesystem::path& root) { const bool g_certificateListProvided = [] { AddPathProvider_nid_no_patch((std::string("/") + sceKernelGetFsSandboxRandomWord() + "/common/cert/CA_LIST.cer").c_str(), &CertificateList); + AddPathProvider_nid_no_patch("/system/common/cert/CA_LIST.cer", &CertificateList); + AddPathProvider_nid_no_patch("/common/cert/CA_LIST.cer", &CertificateList); return true; }(); } diff --git a/core/libs/prx/libkernel/File/src/Stdio.cpp b/core/libs/prx/libkernel/File/src/Stdio.cpp index ea142daa3c40..a0d6f8055096 100644 --- a/core/libs/prx/libkernel/File/src/Stdio.cpp +++ b/core/libs/prx/libkernel/File/src/Stdio.cpp @@ -477,6 +477,7 @@ static bool FailPosixPositionedGuestSocket(int descriptor) { static bool IsPipeDescriptor(int descriptor) { #ifdef _WIN32 + if (GuestSockets::IsOpen(descriptor)) return false; const auto handle = reinterpret_cast(WithoutParameterHandler([descriptor] { return ::_get_osfhandle(descriptor); })); return handle != INVALID_HANDLE_VALUE && ::GetFileType(handle) == FILE_TYPE_PIPE; #else @@ -501,7 +502,7 @@ static int PositionedArgumentError(int descriptor, bool write, bool nullBuffer, static int TransferArgumentError(int descriptor, bool nullBuffer) { if (!nullBuffer) return 0; - return DescriptorIsOpen_nid_no_patch(descriptor) ? GUEST_EFAULT : GUEST_EBADF; + return (GuestSockets::IsOpen(descriptor) || DescriptorIsOpen_nid_no_patch(descriptor)) ? GUEST_EFAULT : GUEST_EBADF; } static int SceErrorFromErrno(int error) { @@ -943,9 +944,6 @@ int APS5_VABI flock_nid_postfix(int d, int operation) { #endif const int type = operation & 8 ? 8 : operation & 2 ? 2 : operation & 1 ? 1 : 0; if (type == 0) return PosixFailure(GUEST_EBADF); -#ifdef _WIN32 - if (File::IsDirectoryDescriptor(d)) return 0; -#endif if (NativeFlock(d, type | (operation & 4)) != 0) { #ifdef _WIN32 const auto error = ::GetLastError(); @@ -1128,6 +1126,8 @@ std::int64_t APS5_VABI _write_nid_postfix(int descriptor, const void* buffer, st return PosixResult(sceKernelWrite(descriptor, buffer == nullptr ? &emptyBuffer : buffer, count)); } +const bool g_libcWriteHookRegistered = (LibcSetGuestWriteHook_nid_no_patch(&_write_nid_postfix), true); + int APS5_VABI stat_nid_postfix(const char* path, FileStat* sb) { if (sb == nullptr) return PosixFailure(GUEST_EFAULT); std::string copy; @@ -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; } @@ -1292,7 +1289,11 @@ int APS5_VABI sceKernelGetdirentries(int fd, char* buf, int nbytes, int64_t* bas if (base < 0) return SceErrorFromErrno(errno); if (basep != nullptr) *basep = static_cast(base); std::vector host(static_cast(nbytes) < 4096 ? 4096 : static_cast(nbytes)); +#ifdef __EMSCRIPTEN__ + const auto read = ::getdents(fd, reinterpret_cast(host.data()), host.size()); +#else const auto read = ::syscall(SYS_getdents64, fd, host.data(), host.size()); +#endif if (read < 0) return SceErrorFromErrno(errno); std::size_t written = 0; off_t resume = base; @@ -1716,6 +1717,13 @@ static bool InvalidTimes(const KernelTimeval* times) { return times != nullptr && (times[0].tv_usec < 0 || times[0].tv_usec >= 1000000 || times[1].tv_usec < 0 || times[1].tv_usec >= 1000000); } +static bool CopyInTimes(const KernelTimeval*& times, KernelTimeval (&local)[2]) { + if (times == nullptr) return true; + if (!GuestCopyIn_nid_no_patch(local, times, sizeof(local))) return false; + times = local; + return true; +} + int APS5_VABI sceKernelTruncate_nid_postfix(const char* path, std::int64_t length) { if (length < 0) return SceErrorFromErrno(GUEST_EINVAL); std::string copy; @@ -1753,6 +1761,8 @@ int APS5_VABI truncate_nid_postfix(const char* path, std::int64_t length) { } int APS5_VABI sceKernelUtimes_nid_postfix(const char* path, const KernelTimeval* times) { + KernelTimeval local[2]; + if (!CopyInTimes(times, local)) return SCE_KERNEL_ERROR_EFAULT; if (InvalidTimes(times)) return SCE_KERNEL_ERROR_EINVAL; std::string copy; if (const int error = CopyGuestPath_nid_no_patch(path, copy)) return SceErrorFromErrno(error); @@ -1765,6 +1775,8 @@ int APS5_VABI sceKernelUtimes_nid_postfix(const char* path, const KernelTimeval* } int APS5_VABI utimes_nid_postfix(const char* path, const KernelTimeval* times) { + KernelTimeval local[2]; + if (!CopyInTimes(times, local)) return PosixFailure(GUEST_EFAULT); if (InvalidTimes(times)) return PosixFailure(GUEST_EINVAL); std::string copy; if (const int error = PathError(path, copy)) return PosixFailure(error); @@ -1773,6 +1785,8 @@ int APS5_VABI utimes_nid_postfix(const char* path, const KernelTimeval* times) { } int APS5_VABI lutimes_nid_postfix(const char* path, const KernelTimeval* times) { + KernelTimeval local[2]; + if (!CopyInTimes(times, local)) return PosixFailure(GUEST_EFAULT); if (InvalidTimes(times)) return PosixFailure(GUEST_EINVAL); std::string copy; if (const int error = PathError(path, copy)) return PosixFailure(error); @@ -1784,6 +1798,8 @@ int APS5_VABI lutimes_nid_postfix(const char* path, const KernelTimeval* times) } int APS5_VABI sceKernelFutimes(int d, const KernelTimeval* times) { + KernelTimeval local[2]; + if (!CopyInTimes(times, local)) return SCE_KERNEL_ERROR_EFAULT; if (File::IsVirtualDirectoryDescriptor(d)) return SceErrorFromErrno(GUEST_EISDIR); if (GuestSockets::IsOpen(d)) return SceErrorFromErrno(GUEST_EINVAL); File::RefuseArchivedFile(d, "futimes"); diff --git a/core/libs/prx/libkernel/KernelErrors.hpp b/core/libs/prx/libkernel/KernelErrors.hpp index e3e5b759fdfd..39f505278db1 100644 --- a/core/libs/prx/libkernel/KernelErrors.hpp +++ b/core/libs/prx/libkernel/KernelErrors.hpp @@ -101,5 +101,8 @@ inline constexpr int SCE_KERNEL_ERROR_ENOTCAPABLE = SceKernelError(93); inline constexpr int SCE_KERNEL_ERROR_ECAPMODE = SceKernelError(94); inline constexpr int SCE_KERNEL_ERROR_ENOTRECOVERABLE = SceKernelError(95); inline constexpr int SCE_KERNEL_ERROR_EOWNERDEAD = SceKernelError(96); +inline constexpr int SCE_KERNEL_ERROR_ELAST = SceKernelError(96); +inline constexpr int SCE_KERNEL_ERROR_EWOULDBLOCK = SCE_KERNEL_ERROR_EAGAIN; +inline constexpr int SCE_KERNEL_ERROR_ENOTSUP = SCE_KERNEL_ERROR_EOPNOTSUPP; #endif diff --git a/core/libs/prx/libkernel/Module/src/DynamicLoader.cpp b/core/libs/prx/libkernel/Module/src/DynamicLoader.cpp index b9feacb7d1d1..a0f46af6d264 100644 --- a/core/libs/prx/libkernel/Module/src/DynamicLoader.cpp +++ b/core/libs/prx/libkernel/Module/src/DynamicLoader.cpp @@ -4,7 +4,6 @@ #include "prx/libkernel/Module/ModuleArgs.hpp" #include #include -#include #include #include #include @@ -29,16 +28,20 @@ #include #endif #endif +#include "prx/libc/include/HostThreadLocal.hpp" #ifdef _WIN32 extern "C" void ForgetUnloadedUnwindImages_nid_no_patch(); #endif namespace { -thread_local std::array loaderError{}; +struct LoaderErrorTag; +std::string& LoaderError() { + return HostThreadLocal(); +} thread_local bool pendingError = false; void Error(const char* message) { - std::snprintf(loaderError.data(), loaderError.size(), "%s", message); + LoaderError() = message; pendingError = true; } void LoadFailure(const std::filesystem::path& source, const std::filesystem::path& resolved, const std::string& reason) { @@ -139,7 +142,7 @@ extern "C" { char* APS5_VABI dlerror_nid_postfix() { if (!pendingError) return nullptr; pendingError = false; - return loaderError.data(); + return LoaderError().data(); } #ifdef __linux__ static void InitializeLinuxGuestModule(void* native) { diff --git a/core/libs/prx/libkernel/Module/src/Module.cpp b/core/libs/prx/libkernel/Module/src/Module.cpp index f1921c47526d..2cff3fbf7275 100644 --- a/core/libs/prx/libkernel/Module/src/Module.cpp +++ b/core/libs/prx/libkernel/Module/src/Module.cpp @@ -23,7 +23,7 @@ #include #include #include -#else +#elif !defined(__EMSCRIPTEN__) #include #include "prx/libc/include/specifics/linux/HostMapping.hpp" #endif @@ -111,7 +111,7 @@ extern "C" void ForgetUnloadedUnwindImages_nid_no_patch() { std::lock_guard lock(unwindImagesMutex); for (const auto base : unloaded) UnwindImages().erase(base); } -#elif !defined(__APPLE__) +#elif !defined(__APPLE__) && !defined(__EMSCRIPTEN__) namespace { struct ImageSearch { @@ -181,7 +181,10 @@ int APS5_VABI sceKernelDlsym(KernelModule handle, const char* symbol, void** add int APS5_VABI sceKernelGetModuleInfoForUnwind(uint64_t addr, int flags, ModuleInfoForUnwind* info) { (void)flags; if (!info) return SCE_KERNEL_ERROR_EFAULT; -#ifdef _WIN32 +#if defined(__EMSCRIPTEN__) + static_cast(addr); + NotImplemented_nid_no_patch(__func__); +#elif defined(_WIN32) if (FillKnownUnwindImage(addr, info)) return 0; MEMORY_BASIC_INFORMATION mbi{}; if (!VirtualQuery(reinterpret_cast(addr), &mbi, sizeof(mbi))) return SCE_KERNEL_ERROR_ESRCH; diff --git a/core/libs/prx/libkernel/Module/src/ModuleInfo.cpp b/core/libs/prx/libkernel/Module/src/ModuleInfo.cpp index de75e2a17e76..37115f46f1d5 100644 --- a/core/libs/prx/libkernel/Module/src/ModuleInfo.cpp +++ b/core/libs/prx/libkernel/Module/src/ModuleInfo.cpp @@ -442,6 +442,12 @@ int APS5_VABI sceKernelGetModuleInfo2(KernelModule handle, ModuleInfo* info) { return FillModuleInfo(handle, info, true); } +KernelModule APS5_VABI sceKernelGetExecutableModuleHandle() { + const auto images = GuestImages(); + if (images.empty()) throw std::runtime_error("sceKernelGetExecutableModuleHandle: the main program is not loaded"); + return ModuleIdForImage_nid_no_patch(images.front().native); +} + int GetModuleInfoExByHandle_nid_no_patch(KernelModule handle, ModuleInfoEx* info) { return FillModuleInfo(handle, info, false); } diff --git a/core/libs/prx/libkernel/Pthread/Posix/Thread.cpp b/core/libs/prx/libkernel/Pthread/Posix/Thread.cpp index 1068558f4868..3030699cf32a 100644 --- a/core/libs/prx/libkernel/Pthread/Posix/Thread.cpp +++ b/core/libs/prx/libkernel/Pthread/Posix/Thread.cpp @@ -126,15 +126,19 @@ int APS5_VABI rtprio_thread_nid_postfix(int function, int lwpid, GuestRtPrio* pr int schedPriority = self->priority.load(std::memory_order_relaxed); const bool other = lwpid != 0 && static_cast(lwpid) != static_cast(self->tid); if (other && !GetLiveGuestThreadSched_nid_no_patch(lwpid, policy, schedPriority)) return fail(GuestEsrch); + GuestRtPrio requested{}; + if (function == Set && !GuestCopyIn_nid_no_patch(&requested, priority, sizeof(requested))) return fail(GuestEfault); const bool realTime = policy == GuestSchedFifo || policy == GuestSchedRr; if (function == Lookup) { - priority->type = realTime ? (policy == GuestSchedFifo ? Fifo : Realtime) : Normal; - priority->prio = realTime ? static_cast(schedPriority) : 0; + GuestRtPrio current{}; + current.type = realTime ? (policy == GuestSchedFifo ? Fifo : Realtime) : Normal; + current.prio = realTime ? static_cast(schedPriority) : 0; + if (!GuestCopyOut_nid_no_patch(priority, ¤t, sizeof(current))) return fail(GuestEfault); return 0; } if (other) NotImplemented_nid_no_patch("rtprio_thread: a thread other than the calling one"); if (realTime) NotImplemented_nid_no_patch("rtprio_thread: a guest thread's real-time class"); - if (priority->type == Normal && priority->prio == 0) return 0; + if (requested.type == Normal && requested.prio == 0) return 0; NotImplemented_nid_no_patch("rtprio_thread: a real-time priority change"); } @@ -185,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) { @@ -202,36 +218,36 @@ 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); - if (!param) return SchedFailure(PosixThread::GUEST_EFAULT); - *param = current; + { + 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); - const Pthread thread = SchedTarget(pid, "sched_setparam"); - if (!thread) return SchedFailure(PosixThread::GUEST_ESRCH); - const auto live = LockLiveGuestThread(thread); + KernelSchedParam requested{}; + if (!GuestCopyIn_nid_no_patch(&requested, param, sizeof(requested))) return SchedFailure(PosixThread::GUEST_EFAULT); + 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) throw std::runtime_error("sched_setparam: the thread's policy " + std::to_string(policy) + " is neither SCHED_FIFO nor SCHED_RR, for which the answer of a PS5 is unmeasured"); - if (!InSchedRange(policy, param->sched_priority)) return SchedFailure(PosixThread::GUEST_EPERM); - thread->priority.store(param->sched_priority, std::memory_order_relaxed); + if (!InSchedRange(policy, requested.sched_priority)) return SchedFailure(PosixThread::GUEST_EPERM); + thread->priority.store(requested.sched_priority, std::memory_order_relaxed); return 0; } @@ -250,12 +266,13 @@ int APS5_VABI pthread_getprio_nid_postfix(Pthread thread) { int APS5_VABI pthread_getaffinity_np_nid_postfix(Pthread thread, std::size_t cpusetSize, void* cpuset) { if (!thread) return PosixThread::GUEST_EINVAL; - if (cpusetSize != GUEST_CPUSET_BYTES) return GUEST_ERANGE; + if (cpusetSize >= GUEST_CPUSET_BYTES) return GUEST_ERANGE; + if (cpusetSize != 8 && cpusetSize != 16) NotImplemented_nid_no_patch("pthread_getaffinity_np with a set other than 8, 16 or 32 bytes and more"); if (!cpuset) return PosixThread::GUEST_EFAULT; KernelCpumask mask = 0; const int result = scePthreadGetaffinity(thread, &mask); if (result != 0) return PosixThread::ToErrno(result); - std::memset(cpuset, 0, GUEST_CPUSET_BYTES); + std::memset(cpuset, 0, cpusetSize); std::memcpy(cpuset, &mask, sizeof(mask)); return 0; } diff --git a/core/libs/prx/libkernel/Pthread/include/Mutex.hpp b/core/libs/prx/libkernel/Pthread/include/Mutex.hpp index a994a1b5c32f..9f32d3535064 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 a7b152207fb7..8bc33af5c00c 100644 --- a/core/libs/prx/libkernel/Pthread/include/Pthread.hpp +++ b/core/libs/prx/libkernel/Pthread/include/Pthread.hpp @@ -35,6 +35,7 @@ struct PthreadMutexattrPrivate { int protocol = 0; int ceiling = 0; int pshared = 0; + int generation = 0; }; constexpr int ADAPTIVE_MUTEX_SPINS = 2000; @@ -45,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; @@ -149,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; @@ -189,8 +191,12 @@ 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 +extern "C" void DeliverPendingException_nid_no_patch(PthreadPrivate* thread); +#endif extern "C" void ResumeAllGuestThreads_nid_no_patch(); bool LiveGuestThreadExists(std::int64_t tid); bool GetLiveGuestThreadAffinity_nid_no_patch(std::int64_t tid, KernelCpumask& mask); diff --git a/core/libs/prx/libkernel/Pthread/src/Cond.cpp b/core/libs/prx/libkernel/Pthread/src/Cond.cpp index 812809cbb7b3..674cc86cfff2 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 3c3b7b8b89b0..4ae1b0cf5657 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 ce41edb7ce69..f96e2fb4309c 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); @@ -801,7 +812,9 @@ static void RunThread(std::unique_ptr args) { #endif args.reset(); self->suspended.wait(true, std::memory_order_acquire); -#ifndef _WIN32 +#ifdef _WIN32 + DeliverPendingException_nid_no_patch(self); +#else pthread_sigmask(SIG_SETMASK, &signalMask, nullptr); #endif finishThread(self, Aps5CallGuestEntry_nid_no_patch(entry, arg)); @@ -947,7 +960,7 @@ static void* StartNativeThread(void* opaque) { } } guard{self}; std::jmp_buf exitJump; - if (setjmp(exitJump) == 0) { + if (_setjmp(exitJump) == 0) { threadExitJump = &exitJump; RunThread(std::unique_ptr(guest)); } @@ -981,6 +994,7 @@ int APS5_VABI scePthreadCreate(Pthread* thread, const PthreadAttr* attr, Pthread if (name) p->name = name; p->createdSuspended = attr && (*attr)->_createSuspended; p->suspended.store(p->createdSuspended, std::memory_order_relaxed); + p->pendingException.store(0, std::memory_order_relaxed); std::promise start; auto args = std::make_unique(ThreadArgs{entry, arg, p.get()}); #ifdef _WIN32 @@ -1162,7 +1176,7 @@ void APS5_VABI scePthreadExit(void* retval) { _endthreadex(0); #else if (threadExitJump) - std::longjmp(*threadExitJump, 1); + _longjmp(*threadExitJump, 1); pthread_exit(retval); #endif throw std::runtime_error("Native thread exit returned"); @@ -1176,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); @@ -1188,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 96d8588896f3..c02cac3109d4 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 55580de98733..6920274f6683 100644 --- a/core/libs/prx/libkernel/Socket/src/Udp.cpp +++ b/core/libs/prx/libkernel/Socket/src/Udp.cpp @@ -125,6 +125,7 @@ struct Socket : KernelSocketPoll::NativeOwner { GuestSockets::SocketOptionState options; bool receiveShut = false; bool sendShut = false; + bool localAddressCleared = false; std::uint32_t inode = 0; std::weak_ptr peer; Socket(NativeSocket value, int family, int type) : value(value), family(family), type(type) {} @@ -341,7 +342,22 @@ std::int64_t ZeroPortSend(const Socket& socket, const sockaddr_storage& destinat if (bound && remote.sin_addr.s_addr != htonl(INADDR_ANY) && remote.sin_addr.s_addr != htonl(INADDR_BROADCAST)) return static_cast(length); return Fail(49); } -int Disconnect(const Socket& socket) { +int LocalAddress(Socket& socket, sockaddr_storage& address, socklen_t& size) { + std::unique_lock lock(socket.modeMutex, std::defer_lock); + if (socket.type == 2) lock.lock(); + if (::getsockname(socket.value, reinterpret_cast(&address), &size)) return -1; + if (socket.type == 2 && socket.localAddressCleared) { + if (address.ss_family == AF_INET) reinterpret_cast(address).sin_addr = {}; + else if (address.ss_family == AF_INET6) { + auto& v6 = reinterpret_cast(address); + v6.sin6_addr = {}; + v6.sin6_scope_id = 0; + } + } + return 0; +} +int Disconnect(Socket& socket) { + std::lock_guard lock(socket.modeMutex); sockaddr_storage peer{}; socklen_t peerSize = sizeof(peer); if (::getpeername(socket.value, reinterpret_cast(&peer), &peerSize) != 0) return 0; @@ -352,22 +368,38 @@ int Disconnect(const Socket& socket) { sockaddr_storage unspecified{}; unspecified.ss_family = local.ss_family; if (::connect(socket.value, reinterpret_cast(&unspecified), localSize) != 0) return Fail(NativeError()); +#elif defined(__APPLE__) + sockaddr unspecified{}; + unspecified.sa_family = AF_UNSPEC; + if (::connect(socket.value, &unspecified, sizeof(unspecified)) != 0) { + const int error = NativeError(); + peerSize = sizeof(peer); + if (::getpeername(socket.value, reinterpret_cast(&peer), &peerSize) == 0 || errno != ENOTCONN) return Fail(error); + } #else sockaddr unspecified{}; unspecified.sa_family = AF_UNSPEC; - if (::connect(socket.value, &unspecified, sizeof(unspecified)) != 0) return Fail(NativeError()); + if (::connect(socket.value, &unspecified, sizeof(unspecified)) != 0) { + const int error = NativeError(); + peerSize = sizeof(peer); + if (::getpeername(socket.value, reinterpret_cast(&peer), &peerSize) == 0 || errno != ENOTCONN) return Fail(error); + } #endif sockaddr_storage current{}; socklen_t currentSize = sizeof(current); if (::getsockname(socket.value, reinterpret_cast(¤t), ¤tSize) != 0) return Fail(NativeError()); - if (PortOf(current) != 0) return 0; + if (PortOf(current) != 0) { + socket.localAddressCleared = true; + return 0; + } sockaddr_storage wildcard{}; wildcard.ss_family = local.ss_family; PortOf(wildcard) = PortOf(local); if (::bind(socket.value, reinterpret_cast(&wildcard), localSize) != 0) return Fail(NativeError()); + socket.localAddressCleared = true; return 0; } -bool ZeroPortConnect(const Socket& socket, const void* address, std::uint32_t length) { +bool ZeroPortConnect(Socket& socket, const void* address, std::uint32_t length) { if (!address || (socket.type != 1 && socket.type != 2) || (socket.family != 2 && socket.family != 28)) return false; const auto* bytes = static_cast(address); if (length < (socket.family == 2 ? 16u : 28u) || bytes[1] != socket.family || (bytes[2] | bytes[3]) != 0) return false; @@ -1158,18 +1190,21 @@ int APS5_VABI fcntl_nid_postfix(int descriptor, int command, ...) { return 0; } if (command == 3) return 2 | (socket->options.nonblocking ? 4 : 0); // F_GETFL, O_RDWR - if (command != 4) return Fail(22); - const int flags = static_cast(argument); - if ((flags & ~7) != 0) return Fail(45); + if (command == 4) { + const int flags = static_cast(argument); + if ((flags & ~7) != 0) return Fail(45); #ifdef _WIN32 - unsigned long enabled = (flags & 4) != 0; - if (ioctlsocket(socket->value, FIONBIO, &enabled)) return Fail(NativeError()); + unsigned long enabled = (flags & 4) != 0; + if (ioctlsocket(socket->value, FIONBIO, &enabled)) return Fail(NativeError()); #else - int enabled = (flags & 4) != 0; - if (::ioctl(socket->value, FIONBIO, &enabled)) return Fail(NativeError()); + int enabled = (flags & 4) != 0; + if (::ioctl(socket->value, FIONBIO, &enabled)) return Fail(NativeError()); #endif - socket->options.nonblocking = enabled != 0; - return 0; + socket->options.nonblocking = enabled != 0; + return 0; + } + if ((command >= 7 && command <= 9) || (command >= 11 && command <= 13) || command == 15 || command == 16) return Fail(9); + return Fail(22); } int APS5_VABI _fcntl_nid_postfix(int descriptor, int command, ...) { #ifdef _WIN32 @@ -1282,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); @@ -1305,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); @@ -1334,11 +1383,12 @@ int APS5_VABI connect_nid_postfix(int descriptor, const void* address, std::uint if (socket->type == 1) RefuseClosedLoopbackAtOnce_nid_no_patch(socket->value, reinterpret_cast(&native)); #endif if (ZeroPortConnect(*socket, address, length)) return -1; - { - std::lock_guard lock(socket->modeMutex); - socket->options.reportedError = 0; - } - return ::connect(socket->value, reinterpret_cast(&native), size) ? Fail(ConnectError()) : 0; + std::unique_lock lock(socket->modeMutex); + socket->options.reportedError = 0; + if (socket->type != 2) lock.unlock(); + if (::connect(socket->value, reinterpret_cast(&native), size)) return Fail(ConnectError()); + if (socket->type == 2) socket->localAddressCleared = false; + return 0; } int APS5_VABI listen_nid_postfix(int descriptor, int backlog) { const auto socket = Lookup(descriptor); @@ -1426,7 +1476,11 @@ int APS5_VABI bind_nid_postfix(int descriptor, const void* address, std::uint32_ const int mapped = LongMappedDualStack(*socket, address, length); if (mapped < 0) return -1; if (!Address(socket->family, address, mapped ? 28 : length, native, size)) return -1; - return ::bind(socket->value, reinterpret_cast(&native), size) ? Fail(NativeError()) : 0; + std::unique_lock lock(socket->modeMutex, std::defer_lock); + if (socket->type == 2) lock.lock(); + if (::bind(socket->value, reinterpret_cast(&native), size)) return Fail(NativeError()); + if (socket->type == 2) socket->localAddressCleared = false; + return 0; } namespace { bool AlreadyShut(NativeSocket socket, int how) { @@ -1471,7 +1525,7 @@ int APS5_VABI getsockname_nid_postfix(int descriptor, void* address, std::uint32 if (socket->family == GuestUnix) return UnnamedAddress(address, length); sockaddr_storage native{}; socklen_t size = sizeof(native); - if (::getsockname(socket->value, reinterpret_cast(&native), &size)) { + if (LocalAddress(*socket, native, size)) { #ifdef _WIN32 if (WSAGetLastError() != WSAEINVAL) return Fail(NativeError()); native = {}; @@ -1818,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); @@ -1846,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; @@ -1856,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/include/GameModeClient.hpp b/core/libs/prx/libkernel/System/include/GameModeClient.hpp new file mode 100644 index 000000000000..c6dca0c8172b --- /dev/null +++ b/core/libs/prx/libkernel/System/include/GameModeClient.hpp @@ -0,0 +1,37 @@ +#ifndef CORE_LIBS_PRX_LIBKERNEL_SYSTEM_INCLUDE_GAMEMODECLIENT_HPP +#define CORE_LIBS_PRX_LIBKERNEL_SYSTEM_INCLUDE_GAMEMODECLIENT_HPP + +#include "prx/libkernel/System/include/HostPerformance.hpp" +#include +#include + +namespace HostPerformance { + +class GameModeClient final : public IBackend { +public: + explicit GameModeClient(std::vector libraries = DefaultLibraries()); + ~GameModeClient() override; + GameModeClient(const GameModeClient&) = delete; + GameModeClient& operator=(const GameModeClient&) = delete; + + static std::vector DefaultLibraries(); + + const char* Name() const override; + BeginResult Begin() override; + void End() override; + +private: + using Request = int (*)(); + using ErrorString = const char* (*)(); + + std::vector libraries; + void* handle = nullptr; + Request requestStart = nullptr; + Request requestEnd = nullptr; + ErrorString errorString = nullptr; + bool requested = false; +}; + +} + +#endif diff --git a/core/libs/prx/libkernel/System/include/HostCpu.hpp b/core/libs/prx/libkernel/System/include/HostCpu.hpp index 11b3368dbf99..149136c48359 100644 --- a/core/libs/prx/libkernel/System/include/HostCpu.hpp +++ b/core/libs/prx/libkernel/System/include/HostCpu.hpp @@ -22,6 +22,18 @@ struct HostCpuFeature { bool Present; }; +struct HostCpuText { + char value[1024]; +}; + +extern "C" { + +HostCpuRegisters ReadHostCpuRegisters_nid_no_patch(); +HostCpuText HostCpuModel_nid_no_patch(); +HostCpuText MissingHostCpuFeatures_nid_no_patch(const HostCpuRegisters* registers); + +} + HostCpuRegisters ReadHostCpuRegisters(); std::string HostCpuModel(); std::vector HostCpuFeatures(const HostCpuRegisters& registers); diff --git a/core/libs/prx/libkernel/System/include/HostPerformance.hpp b/core/libs/prx/libkernel/System/include/HostPerformance.hpp new file mode 100644 index 000000000000..a27564d864c0 --- /dev/null +++ b/core/libs/prx/libkernel/System/include/HostPerformance.hpp @@ -0,0 +1,55 @@ +#ifndef CORE_LIBS_PRX_LIBKERNEL_SYSTEM_INCLUDE_HOSTPERFORMANCE_HPP +#define CORE_LIBS_PRX_LIBKERNEL_SYSTEM_INCLUDE_HOSTPERFORMANCE_HPP + +#include +#include +#include +#include + +namespace HostPerformance { + +enum class Mode { Off, On, Auto }; + +Mode ParseMode(const char* text); + +enum class Outcome { Started, Unavailable, Refused }; + +struct BeginResult { + Outcome Result = Outcome::Unavailable; + std::string Detail; +}; + +class IBackend { +public: + virtual ~IBackend() = default; + virtual const char* Name() const = 0; + virtual BeginResult Begin() = 0; + virtual void End() = 0; +}; + +enum class State { Idle, Off, Active, Unavailable, Refused, Ended }; + +class Session { +public: + using Log = std::function; + + Session(Mode mode, IBackend& backend, Log log); + State Start(); + void Stop(); + State Current() const; + +private: + Mode mode; + IBackend& backend; + Log log; + mutable std::mutex mutex; + State state = State::Idle; +}; + +std::unique_ptr CreateHostBackend(); +Session* StartProcessSession(Mode mode, std::unique_ptr backend); +void StartFromEnvironment(); + +} + +#endif diff --git a/core/libs/prx/libkernel/System/include/MacActivity.hpp b/core/libs/prx/libkernel/System/include/MacActivity.hpp new file mode 100644 index 000000000000..36f3a6c71bf1 --- /dev/null +++ b/core/libs/prx/libkernel/System/include/MacActivity.hpp @@ -0,0 +1,57 @@ +#ifndef CORE_LIBS_PRX_LIBKERNEL_SYSTEM_INCLUDE_MACACTIVITY_HPP +#define CORE_LIBS_PRX_LIBKERNEL_SYSTEM_INCLUDE_MACACTIVITY_HPP + +#include "prx/libkernel/System/include/HostPerformance.hpp" +#include +#include + +namespace HostPerformance { + +constexpr std::uint64_t ActivityIdleSystemSleepDisabled = 1ULL << 20; +constexpr std::uint64_t ActivityUserInitiated = 0x00FFFFFFULL | ActivityIdleSystemSleepDisabled; +constexpr std::uint64_t ActivityLatencyCritical = 0xFF00000000ULL; + +struct ObjcLibraries { + std::string Runtime = "/usr/lib/libobjc.A.dylib"; + std::string Foundation = "/System/Library/Frameworks/Foundation.framework/Foundation"; +}; + +class MacActivity final : public IBackend { +public: + explicit MacActivity(ObjcLibraries libraries = {}); + ~MacActivity() override; + MacActivity(const MacActivity&) = delete; + MacActivity& operator=(const MacActivity&) = delete; + + const char* Name() const override; + BeginResult Begin() override; + void End() override; + +private: + using GetClass = void* (*)(const char*); + using RegisterSelector = void* (*)(const char*); + using PoolPush = void* (*)(); + using PoolPop = void (*)(void*); + using SendObject = void* (*)(void*, void*); + using SendVoid = void (*)(void*, void*); + using SendString = void* (*)(void*, void*, const char*); + using SendBegin = void* (*)(void*, void*, std::uint64_t, void*); + using SendEnd = void (*)(void*, void*, void*); + + ObjcLibraries libraries; + void* runtime = nullptr; + void* foundation = nullptr; + GetClass getClass = nullptr; + RegisterSelector registerSelector = nullptr; + PoolPush poolPush = nullptr; + PoolPop poolPop = nullptr; + void* send = nullptr; + void* processInfo = nullptr; + void* token = nullptr; + + BeginResult Load(); +}; + +} + +#endif diff --git a/core/libs/prx/libkernel/System/src/Exception.cpp b/core/libs/prx/libkernel/System/src/Exception.cpp index 363606d8827b..e26b1e26f211 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) { @@ -1084,13 +1089,26 @@ int APS5_VABI sceKernelRemoveExceptionHandler(int signum) { return 0; } +#ifdef _WIN32 +void DeliverPendingException_nid_no_patch(PthreadPrivate* thread) { + const int signum = thread->pendingException.exchange(-1, std::memory_order_acq_rel); + if (signum <= 0) return; + const auto handler = Handler(signum); + if (handler == nullptr) throw std::runtime_error("sceKernelRaiseException: the handler was removed before the signal was delivered"); + RaiseOn(thread, handler, signum); +} +#endif + int APS5_VABI sceKernelRaiseException(Pthread thread, int signum) { if (signum != RaisedSignal) return SCE_KERNEL_ERROR_EINVAL; if (thread == nullptr || thread->_finished.load(std::memory_order_acquire)) return SCE_KERNEL_ERROR_ESRCH; const auto handler = Handler(signum); if (handler == nullptr) throw std::runtime_error("sceKernelRaiseException: no handler installed for the signal"); #ifdef _WIN32 - if (thread->suspended.load(std::memory_order_acquire)) throw std::runtime_error("sceKernelRaiseException: the target thread is still suspended at creation"); + if (thread->suspended.load(std::memory_order_acquire)) { + int pending = 0; + if (thread->pendingException.compare_exchange_strong(pending, signum, std::memory_order_acq_rel) || pending > 0) return 0; + } return RaiseOn(thread, handler, signum) ? 0 : SCE_KERNEL_ERROR_ESRCH; #else return RaiseOn(thread) ? 0 : SCE_KERNEL_ERROR_ESRCH; diff --git a/core/libs/prx/libkernel/System/src/GameModeClient.cpp b/core/libs/prx/libkernel/System/src/GameModeClient.cpp new file mode 100644 index 000000000000..9bbcdce8ff52 --- /dev/null +++ b/core/libs/prx/libkernel/System/src/GameModeClient.cpp @@ -0,0 +1,62 @@ +#include "prx/libkernel/System/include/GameModeClient.hpp" +#include +#include +#include +#include + +namespace HostPerformance { + +GameModeClient::GameModeClient(std::vector libraries) : libraries(std::move(libraries)) {} + +GameModeClient::~GameModeClient() { + try { + End(); + } catch (const std::exception&) { + } + if (handle != nullptr) dlclose(handle); +} + +std::vector GameModeClient::DefaultLibraries() { + return {"libgamemode.so.0", "libgamemode.so"}; +} + +const char* GameModeClient::Name() const { + return "gamemode"; +} + +BeginResult GameModeClient::Begin() { + if (requested) return {Outcome::Started, {}}; + if (handle == nullptr) { + std::string failures; + for (const auto& library : libraries) { + handle = dlopen(library.c_str(), RTLD_NOW | RTLD_LOCAL); + if (handle != nullptr) break; + const char* reason = dlerror(); + if (!failures.empty()) failures += "; "; + failures += reason != nullptr ? reason : library + ": unknown dlopen failure"; + } + if (handle == nullptr) return {Outcome::Unavailable, failures.empty() ? "no library to load" : failures}; + requestStart = reinterpret_cast(dlsym(handle, "real_gamemode_request_start")); + requestEnd = reinterpret_cast(dlsym(handle, "real_gamemode_request_end")); + errorString = reinterpret_cast(dlsym(handle, "real_gamemode_error_string")); + } + if (requestStart == nullptr) return {Outcome::Unavailable, "the library has no real_gamemode_request_start"}; + if (requestEnd == nullptr) return {Outcome::Unavailable, "the library has no real_gamemode_request_end"}; + if (requestStart() != 0) { + const char* reason = errorString != nullptr ? errorString() : nullptr; + return {Outcome::Refused, reason != nullptr && *reason != '\0' ? reason : "no reason given"}; + } + requested = true; + return {Outcome::Started, {}}; +} + +void GameModeClient::End() { + if (!requested) return; + requested = false; + if (requestEnd() != 0) { + const char* reason = errorString != nullptr ? errorString() : nullptr; + throw std::runtime_error(reason != nullptr && *reason != '\0' ? reason : "no reason given"); + } +} + +} diff --git a/core/libs/prx/libkernel/System/src/HostCpu.cpp b/core/libs/prx/libkernel/System/src/HostCpu.cpp index a27d29b6dce4..50ca4798ec26 100644 --- a/core/libs/prx/libkernel/System/src/HostCpu.cpp +++ b/core/libs/prx/libkernel/System/src/HostCpu.cpp @@ -3,6 +3,7 @@ #if defined(__x86_64__) || defined(__i386__) #include #endif +#include #include #include #include @@ -173,6 +174,32 @@ std::vector MissingHostCpuFeatures(const HostCpuRegisters& register return missing; } +namespace { + +HostCpuText PackText(const std::string& text) { + HostCpuText packed{}; + std::memcpy(packed.value, text.data(), std::min(text.size(), sizeof(packed.value) - 1)); + return packed; +} + +} + +extern "C" { + +HostCpuRegisters ReadHostCpuRegisters_nid_no_patch() { + return ReadHostCpuRegisters(); +} + +HostCpuText HostCpuModel_nid_no_patch() { + return PackText(HostCpuModel()); +} + +HostCpuText MissingHostCpuFeatures_nid_no_patch(const HostCpuRegisters* registers) { + return PackText(Join(MissingHostCpuFeatures(*registers))); +} + +} + void CheckHostCpu(const HostCpuRegisters& registers, const std::string& model) { const auto missing = MissingHostCpuFeatures(registers); if (missing.empty()) return; diff --git a/core/libs/prx/libkernel/System/src/HostPerformance.cpp b/core/libs/prx/libkernel/System/src/HostPerformance.cpp new file mode 100644 index 000000000000..5e4c12af1463 --- /dev/null +++ b/core/libs/prx/libkernel/System/src/HostPerformance.cpp @@ -0,0 +1,63 @@ +#include "prx/libkernel/System/include/HostPerformance.hpp" +#include +#include +#include +#include + +namespace HostPerformance { + +Mode ParseMode(const char* text) { + if (text == nullptr || *text == '\0' || std::strcmp(text, "off") == 0) return Mode::Off; + if (std::strcmp(text, "on") == 0) return Mode::On; + if (std::strcmp(text, "auto") == 0) return Mode::Auto; + throw std::invalid_argument(std::string("APS5_GAME_MODE=") + text + " is not off, on or auto"); +} + +Session::Session(Mode mode, IBackend& backend, Log log) : mode(mode), backend(backend), log(std::move(log)) {} + +State Session::Start() { + std::lock_guard lock(mutex); + if (state != State::Idle) return state; + if (mode == Mode::Off) return state = State::Off; + BeginResult begun; + try { + begun = backend.Begin(); + } catch (const std::exception& error) { + begun = {Outcome::Refused, error.what()}; + } catch (...) { + begun = {Outcome::Refused, "unknown failure"}; + } + const std::string name = backend.Name(); + switch (begun.Result) { + case Outcome::Started: + log(name + ": requested"); + return state = State::Active; + case Outcome::Unavailable: + if (mode == Mode::On) log(name + ": unavailable, continuing without it (" + begun.Detail + ")"); + return state = State::Unavailable; + case Outcome::Refused: + log(name + ": request refused, continuing without it (" + begun.Detail + ")"); + return state = State::Refused; + } + return state; +} + +void Session::Stop() { + std::lock_guard lock(mutex); + if (state != State::Active) return; + state = State::Ended; + try { + backend.End(); + } catch (const std::exception& error) { + log(std::string(backend.Name()) + ": release failed (" + error.what() + ")"); + } catch (...) { + log(std::string(backend.Name()) + ": release failed"); + } +} + +State Session::Current() const { + std::lock_guard lock(mutex); + return state; +} + +} diff --git a/core/libs/prx/libkernel/System/src/HostPerformanceProcess.cpp b/core/libs/prx/libkernel/System/src/HostPerformanceProcess.cpp new file mode 100644 index 000000000000..16deb97f3a98 --- /dev/null +++ b/core/libs/prx/libkernel/System/src/HostPerformanceProcess.cpp @@ -0,0 +1,68 @@ +#include "prx/libkernel/System/include/HostPerformance.hpp" +#include "prx/libc/include/Shutdown.hpp" +#include +#include +#include +#include +#include + +#if defined(__linux__) +#include "prx/libkernel/System/include/GameModeClient.hpp" +#elif defined(__APPLE__) +#include "prx/libkernel/System/include/MacActivity.hpp" +#endif + +namespace HostPerformance { + +namespace { + +#if !defined(__linux__) && !defined(__APPLE__) +class UnsupportedBackend final : public IBackend { +public: + const char* Name() const override { return "host-performance"; } + BeginResult Begin() override { return {Outcome::Unavailable, "this host has no game mode request"}; } + void End() override {} +}; +#endif + +struct ProcessSession { + std::unique_ptr Backend; + Session Held; + + ProcessSession(Mode mode, std::unique_ptr backend) + : Backend(std::move(backend)), Held(mode, *Backend, [](const std::string& line) { std::fprintf(stderr, "[host-performance] %s\n", line.c_str()); }) {} +}; + +ProcessSession* process = nullptr; + +void StopProcessSession() { + if (process != nullptr) process->Held.Stop(); +} + +} + +std::unique_ptr CreateHostBackend() { +#if defined(__linux__) + return std::make_unique(); +#elif defined(__APPLE__) + return std::make_unique(); +#else + return std::make_unique(); +#endif +} + +Session* StartProcessSession(Mode mode, std::unique_ptr backend) { + if (process != nullptr) throw std::logic_error("host performance: the process session already exists"); + if (mode == Mode::Off) return nullptr; + process = new ProcessSession(mode, std::move(backend)); + if (process->Held.Start() == State::Active) LibcRegisterShutdown_nid_postfix(StopProcessSession); + return &process->Held; +} + +void StartFromEnvironment() { + const Mode mode = ParseMode(std::getenv("APS5_GAME_MODE")); + if (mode == Mode::Off) return; + StartProcessSession(mode, CreateHostBackend()); +} + +} diff --git a/core/libs/prx/libkernel/System/src/HostPerformanceStartup.cpp b/core/libs/prx/libkernel/System/src/HostPerformanceStartup.cpp new file mode 100644 index 000000000000..d85904025273 --- /dev/null +++ b/core/libs/prx/libkernel/System/src/HostPerformanceStartup.cpp @@ -0,0 +1,7 @@ +#include "prx/libkernel/System/include/HostPerformance.hpp" + +namespace { + +const bool hostPerformanceStarted = (HostPerformance::StartFromEnvironment(), true); + +} diff --git a/core/libs/prx/libkernel/System/src/Login.cpp b/core/libs/prx/libkernel/System/src/Login.cpp index d25e16d5b2ef..9997e97bc0b9 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/MacActivity.cpp b/core/libs/prx/libkernel/System/src/MacActivity.cpp new file mode 100644 index 000000000000..c9a9421528ab --- /dev/null +++ b/core/libs/prx/libkernel/System/src/MacActivity.cpp @@ -0,0 +1,86 @@ +#include "prx/libkernel/System/include/MacActivity.hpp" +#include +#include +#include + +namespace HostPerformance { + +MacActivity::MacActivity(ObjcLibraries libraries) : libraries(std::move(libraries)) {} + +MacActivity::~MacActivity() { + try { + End(); + } catch (const std::exception&) { + } + if (foundation != nullptr) dlclose(foundation); + if (runtime != nullptr) dlclose(runtime); +} + +const char* MacActivity::Name() const { + return "macos-activity"; +} + +BeginResult MacActivity::Load() { + if (send != nullptr) return {Outcome::Started, {}}; + runtime = dlopen(libraries.Runtime.c_str(), RTLD_NOW | RTLD_LOCAL); + if (runtime == nullptr) { + const char* reason = dlerror(); + return {Outcome::Unavailable, reason != nullptr ? reason : libraries.Runtime + ": unknown dlopen failure"}; + } + foundation = dlopen(libraries.Foundation.c_str(), RTLD_NOW | RTLD_LOCAL); + if (foundation == nullptr) { + const char* reason = dlerror(); + return {Outcome::Unavailable, reason != nullptr ? reason : libraries.Foundation + ": unknown dlopen failure"}; + } + getClass = reinterpret_cast(dlsym(runtime, "objc_getClass")); + registerSelector = reinterpret_cast(dlsym(runtime, "sel_registerName")); + poolPush = reinterpret_cast(dlsym(runtime, "objc_autoreleasePoolPush")); + poolPop = reinterpret_cast(dlsym(runtime, "objc_autoreleasePoolPop")); + void* const message = dlsym(runtime, "objc_msgSend"); + if (getClass == nullptr) return {Outcome::Unavailable, "the Objective-C runtime has no objc_getClass"}; + if (registerSelector == nullptr) return {Outcome::Unavailable, "the Objective-C runtime has no sel_registerName"}; + if (poolPush == nullptr || poolPop == nullptr) return {Outcome::Unavailable, "the Objective-C runtime has no autorelease pool functions"}; + if (message == nullptr) return {Outcome::Unavailable, "the Objective-C runtime has no objc_msgSend"}; + send = message; + return {Outcome::Started, {}}; +} + +BeginResult MacActivity::Begin() { + if (token != nullptr) return {Outcome::Started, {}}; + if (const auto loaded = Load(); loaded.Result != Outcome::Started) return loaded; + void* const pool = poolPush(); + BeginResult result{Outcome::Started, {}}; + void* const processInfoClass = getClass("NSProcessInfo"); + void* const stringClass = getClass("NSString"); + if (processInfoClass == nullptr || stringClass == nullptr) { + result = {Outcome::Unavailable, "NSProcessInfo is not loaded"}; + } else { + void* const info = reinterpret_cast(send)(processInfoClass, registerSelector("processInfo")); + void* const reason = reinterpret_cast(send)(stringClass, registerSelector("stringWithUTF8String:"), "AnyPS5 title running"); + void* const activity = info != nullptr && reason != nullptr + ? reinterpret_cast(send)(info, registerSelector("beginActivityWithOptions:reason:"), ActivityUserInitiated | ActivityLatencyCritical, reason) + : nullptr; + if (activity == nullptr) { + result = {Outcome::Refused, "beginActivityWithOptions:reason: returned no activity"}; + } else { + reinterpret_cast(send)(activity, registerSelector("retain")); + processInfo = info; + token = activity; + } + } + poolPop(pool); + return result; +} + +void MacActivity::End() { + if (token == nullptr) return; + void* const pool = poolPush(); + void* const activity = token; + token = nullptr; + reinterpret_cast(send)(processInfo, registerSelector("endActivity:"), activity); + reinterpret_cast(send)(activity, registerSelector("release")); + processInfo = nullptr; + poolPop(pool); +} + +} diff --git a/core/libs/prx/libkernel/System/src/Process.cpp b/core/libs/prx/libkernel/System/src/Process.cpp index 2519d2c35302..ec1de2cc9d0f 100644 --- a/core/libs/prx/libkernel/System/src/Process.cpp +++ b/core/libs/prx/libkernel/System/src/Process.cpp @@ -713,9 +713,11 @@ int APS5_VABI getresgid_nid_postfix(std::uint32_t* rgid, std::uint32_t* egid, st return 0; } +#ifndef __EMSCRIPTEN__ void APS5_VABI exit_nid_postfix(int code) { LibcExit_nid_no_patch(code); } +#endif [[noreturn]] void APS5_VABI _exit_nid_postfix(int status) { LibcTerminate_nid_no_patch(status); @@ -960,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; } @@ -970,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; } @@ -1230,7 +1232,7 @@ int APS5_VABI getdtablesize_nid_postfix(void) { getrlimit_nid_postfix(guestRlimitNofile, &limit); std::int64_t tableSize = limit.rlim_cur; -#ifndef _WIN32 +#if !defined(_WIN32) && !defined(__EMSCRIPTEN__) tableSize = std::min(tableSize, static_cast(::getdtablesize())); #endif if (tableSize > std::numeric_limits::max()) diff --git a/core/libs/prx/libkernel/System/src/Signals.cpp b/core/libs/prx/libkernel/System/src/Signals.cpp index c3cbccd2e152..56f806e9ec81 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 9a11a06d82e5..a92a356a7abd 100644 --- a/core/libs/prx/libkernel/System/src/SystemConfiguration.cpp +++ b/core/libs/prx/libkernel/System/src/SystemConfiguration.cpp @@ -12,8 +12,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -93,7 +95,7 @@ const SystemInteger* FindSystemInteger(const int* name) { } bool IsLeafMib(const int* name) { - return FindSystemInteger(name) != nullptr || (name[0] == 6 && (name[1] == 2 || name[1] == 3 || name[1] == 5 || name[1] == 7)) || (name[0] == 1 && (name[1] == 21 || name[1] == 37 || name[1] == 50)); + return FindSystemInteger(name) != nullptr || (name[0] == 6 && (name[1] == 2 || name[1] == 3 || name[1] == 5 || name[1] == 7)) || (name[0] == 1 && (name[1] == 21 || name[1] == 37 || name[1] == 50)) || (name[0] == 2 && name[1] == 2); } KernelTimeval BootTime() { @@ -107,6 +109,32 @@ KernelTimeval BootTime() { return bootTime; } +struct GuestLoadAverage { + std::uint32_t ldavg[3]; + std::int64_t fscale; +}; +static_assert(sizeof(GuestLoadAverage) == 24); + +std::uint32_t ScaledLoad(double average, std::int64_t fscale) { + const auto scaled = average * static_cast(fscale) + 0.5; + if (!(scaled > 0.0)) return 0; + if (scaled >= static_cast(std::numeric_limits::max())) return std::numeric_limits::max(); + return static_cast(scaled); +} + +GuestLoadAverage HostLoadAverage() { + GuestLoadAverage load; + std::memset(&load, 0, sizeof(load)); + load.fscale = 1 << 11; +#ifndef _WIN32 + double averages[3]{}; + if (getloadavg(averages, 3) == 3) { + for (int index = 0; index < 3; ++index) load.ldavg[index] = ScaledLoad(averages[index], load.fscale); + } +#endif + return load; +} + constexpr std::size_t MaximumSysctlName = 1024; int TopLevelNode(std::string_view name) { @@ -177,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; @@ -385,6 +422,14 @@ int APS5_VABI sysctl_nid_postfix(const int* name, std::uint32_t nameLength, void const std::uint64_t physmem = static_cast(pages) * PS5_PAGE_SIZE; return CopyOut(&physmem, sizeof(physmem), oldValue, oldLength); } + if (nameLength == 2 && name[0] == 2 && name[1] == 2) { + if (newValue != nullptr) { + *__error_nid_postfix() = 1; + return -1; + } + const GuestLoadAverage load = HostLoadAverage(); + return CopyOut(&load, sizeof(load), oldValue, oldLength); + } if (nameLength == 2) { if (const auto* entry = FindSystemString(name)) { if (newValue != nullptr) { @@ -418,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; @@ -431,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) { @@ -552,6 +605,10 @@ int APS5_VABI sysctlbyname_nid_postfix(const char* name, void* oldValue, std::si static constexpr int mib[] = {1, 21}; return sysctl_nid_postfix(mib, 2, oldValue, oldLength, newValue, newLength); } + if (std::strcmp(name, "vm.loadavg") == 0) { + static constexpr int mib[] = {2, 2}; + return sysctl_nid_postfix(mib, 2, oldValue, oldLength, newValue, newLength); + } if (std::strcmp(name, "kern.arandom") == 0) { static constexpr int mib[] = {1, 37}; return sysctl_nid_postfix(mib, 2, oldValue, oldLength, newValue, newLength); @@ -644,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; } @@ -654,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; } @@ -663,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; } @@ -671,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; } @@ -735,6 +805,7 @@ int APS5_VABI sysctlnametomib_nid_postfix(const char* name, int* mib, std::size_ {"kern.proc.pathname", {1, 14, 12}, 3}, {"kern.ps_strings", {1, 32}, 2}, {"kern.rng_pseudo", {1, 50}, 2}, + {"vm.loadavg", {2, 2}, 2}, }; if (name == nullptr || size == nullptr) throw std::invalid_argument(std::string(__func__) + ": null name or size"); const std::size_t nameLength = strnlen(name, MaximumSysctlName); diff --git a/core/libs/prx/libkernel/System/src/ThermalSensors.cpp b/core/libs/prx/libkernel/System/src/ThermalSensors.cpp index 056399d64217..35909af0a1fd 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/System/src/UserContext.cpp b/core/libs/prx/libkernel/System/src/UserContext.cpp index 1445055be517..ea580d7132fe 100644 --- a/core/libs/prx/libkernel/System/src/UserContext.cpp +++ b/core/libs/prx/libkernel/System/src/UserContext.cpp @@ -8,8 +8,33 @@ #include #include #include +#ifdef __EMSCRIPTEN__ +#include "prx/libc/include/General.hpp" +#else #include +#endif + +#ifdef __EMSCRIPTEN__ +extern "C" { +int APS5_VABI getcontext_nid_postfix(UserUcontext* context) { + static_cast(context); + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI setcontext_nid_postfix(const UserUcontext* context) { + static_cast(context); + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI swapcontext_nid_postfix(UserUcontext* saved, const UserUcontext* next) { + static_cast(saved); + static_cast(next); + NotImplemented_nid_no_patch(__func__); +} + +} +#else namespace { struct RegisterFrame { @@ -281,3 +306,4 @@ int APS5_VABI Aps5SwapcontextFinish_nid_no_patch(UserUcontext* saved, const User } } +#endif diff --git a/core/libs/prx/libkernel/Time/TimedWait.cpp b/core/libs/prx/libkernel/Time/TimedWait.cpp index b60cfb995dc5..e49b8d43de6c 100644 --- a/core/libs/prx/libkernel/Time/TimedWait.cpp +++ b/core/libs/prx/libkernel/Time/TimedWait.cpp @@ -22,7 +22,7 @@ namespace TimedWait { namespace { constexpr std::uint64_t YIELD_BELOW_NANOS = 50000ULL; -constexpr std::uint64_t LEAD_NANOS = 500000ULL; +constexpr std::uint64_t LEAD_NANOS = 20000ULL; std::mutex& ChangeSleepersMutex() { static std::mutex mutex; @@ -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" { @@ -91,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) { @@ -247,13 +281,16 @@ int APS5_VABI pthread_mutex_setprioceiling_nid_postfix(void) { return 0; } -int APS5_VABI pthread_mutexattr_getgen_np_nid_postfix(void) { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI pthread_mutexattr_getgen_np_nid_postfix(const PthreadMutexattr* attr, int* generation) { + if (!attr || !*attr || !generation) return PosixThread::GUEST_EINVAL; + *generation = (*attr)->generation & 1; return 0; } -int APS5_VABI pthread_mutexattr_setgen_np_nid_postfix(void) { - NotImplemented_nid_no_patch(__func__); +int APS5_VABI pthread_mutexattr_setgen_np_nid_postfix(PthreadMutexattr* attr, int generation) { + if (!attr || !*attr) return PosixThread::GUEST_EINVAL; + if (generation != 0 && generation != 1) return PosixThread::GUEST_ENOTSUP; + (*attr)->generation = generation; return 0; } @@ -440,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; } @@ -780,11 +825,6 @@ int APS5_VABI sceKernelGetEmergencyErrorLog(void) { return 0; } -int APS5_VABI sceKernelGetExecutableModuleHandle(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI sceKernelGetExtLibcHandle(void) { NotImplemented_nid_no_patch(__func__); return 0; @@ -1025,9 +1065,8 @@ int APS5_VABI sceKernelGetUniversalMode(void) { return 0; } -int APS5_VABI sceKernelGetUpdVersion(void) { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI sceKernelGetUpdVersion(std::uint32_t* version) { + return sysKernelGetUpdVersion_nid_postfix(version); } int APS5_VABI sceKernelGetUtokenDataExecutionForRcmgr(void) { @@ -1090,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) { @@ -1324,19 +1363,10 @@ int APS5_VABI sceKernelIsMainOnStandbyMode(void) { return 0; } -int APS5_VABI sceKernelIsModuleLoaded(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - int APS5_VABI sceKernelIsNeoMode(void) { - NotImplemented_nid_no_patch(__func__); - return 0; -} - -int APS5_VABI sceKernelIsPs4Process(void) { - NotImplemented_nid_no_patch(__func__); - return 0; + std::uint32_t attribute = 0; + if (!GetAppParamSfoAttribute_nid_no_patch(&attribute)) NotImplemented_nid_no_patch(__func__); + return (attribute & PARAM_SFO_ATTRIBUTE_SUPPORT_NEO_MODE) != 0 ? 1 : 0; } int APS5_VABI sceKernelJitGetSharedMemoryInfo(void) { @@ -1394,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; } @@ -1809,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); } @@ -1831,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) { @@ -1905,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) { @@ -2015,18 +2053,16 @@ int APS5_VABI scePthreadMutexSetprioceiling(void) { return 0; } -int APS5_VABI scePthreadMutexattrGetgen(void) { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI scePthreadMutexattrGetgen(const PthreadMutexattr* attr, int* generation) { + return SceResult(pthread_mutexattr_getgen_np_nid_postfix(attr, generation)); } int APS5_VABI scePthreadMutexattrInitForInternalLibc(PthreadMutexattr* attr) { return SceResult(pthread_mutexattr_init_nid_postfix(attr)); } -int APS5_VABI scePthreadMutexattrSetgen(void) { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI scePthreadMutexattrSetgen(PthreadMutexattr* attr, int generation) { + return SceResult(pthread_mutexattr_setgen_np_nid_postfix(attr, generation)); } int APS5_VABI scePthreadResume(Pthread thread) { diff --git a/core/libs/prx/libkernel_sys/Export.cpp b/core/libs/prx/libkernel_sys/Export.cpp index 1195d93f256d..bd135b5f965a 100644 --- a/core/libs/prx/libkernel_sys/Export.cpp +++ b/core/libs/prx/libkernel_sys/Export.cpp @@ -28,6 +28,7 @@ #include "prx/libc/include/General.hpp" #include "prx/libc/include/ApplicationHeap.hpp" #include "prx/libkernel/KernelErrors.hpp" +#include "prx/libkernel/AppMetadata/include/AppMetadata.hpp" #include "prx/libc/include/FilesystemError.hpp" #include "prx/libkernel/KernelErrors.hpp" #include "prx/libkernel/Pthread/include/Pthread.hpp" @@ -349,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; } @@ -426,11 +427,28 @@ int APS5_VABI sceKernelIsKratos(void) { return 0; } +bool IsPs4Process() { + try { + const auto titleId = GetAppTitleId_nid_postfix(); + const std::string_view id(titleId.value, strnlen(titleId.value, sizeof(titleId.value))); + return id.starts_with("CUSA"); + } catch (const std::runtime_error&) { + return false; + } catch (const std::length_error&) { + return false; + } +} + +int APS5_VABI sceKernelIsPs4Process(void) { + return IsPs4Process() ? 1 : 0; +} + int APS5_VABI get_authinfo_nid_postfix(int pid, KernelAuthInfo* info) { if (info == nullptr) return static_cast(Fail(GuestEperm)); if (pid != 0 && pid != getpid_nid_postfix()) return static_cast(Fail(GuestEsrch)); - *info = {}; - info->capabilities[0] = 0x2000000000000000; + KernelAuthInfo local{}; + local.capabilities[0] = 0x2000000000000000; + if (!GuestCopyOut_nid_no_patch(info, &local, sizeof(local))) return static_cast(Fail(GuestEfault)); return 0; } @@ -517,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)); } @@ -641,17 +672,25 @@ static int LinkNative(const std::filesystem::path& source, const std::filesystem return 0; } -#ifndef _WIN32 static int LinkSymbolicLinkItself(const std::filesystem::path& source, const std::filesystem::path& destination) { if (const int error = LinkDestinationError(destination)) return static_cast(Fail(error)); +#ifdef _WIN32 + if ((GetFileAttributesW(source.c_str()) & FILE_ATTRIBUTE_DIRECTORY) != 0) + NotImplemented_nid_no_patch("linkat: a hard link to a directory symbolic link itself on Windows"); + if (!CreateHardLinkW(destination.c_str(), source.c_str(), nullptr)) { + const DWORD error = GetLastError(); + if (error == ERROR_NOT_SAME_DEVICE) return static_cast(Fail(GuestExdev)); + throw std::system_error(static_cast(error), std::system_category(), "linkat"); + } +#else if (::linkat(AT_FDCWD, source.c_str(), AT_FDCWD, destination.c_str(), 0) != 0) { if (errno == EXDEV) return static_cast(Fail(GuestExdev)); throw std::system_error(errno, std::generic_category(), "linkat"); } +#endif RecordWrittenPath_nid_no_patch(destination); return 0; } -#endif int APS5_VABI link_nid_postfix(const char* existing, const char* created) { std::string existingCopy, createdCopy; @@ -681,16 +720,11 @@ int APS5_VABI linkat_nid_postfix(int fd1, const char* path1, int fd2, const char std::filesystem::path source, destination; if (const int error = ResolveAtPath(fd1, path1, source)) return static_cast(Fail(error)); const bool linkItself = flag == 0 && IsSymbolicLink(source); -#ifdef _WIN32 - if (linkItself) NotImplemented_nid_no_patch("linkat: a hard link to a symbolic link itself on Windows"); -#endif if (!linkItself) if (const int error = LinkSourceError(source)) return static_cast(Fail(error)); if (const int error = CopyPath(path2, copy2)) return static_cast(Fail(error)); if (const int error = ResolveAtPath(fd2, path2, destination)) return static_cast(Fail(error)); -#ifndef _WIN32 if (linkItself) return LinkSymbolicLinkItself(source, destination); -#endif return LinkNative(source, destination); } @@ -986,9 +1020,8 @@ int APS5_VABI sched_rr_get_interval_nid_postfix(int pid, KernelTimespec* interva constexpr int GuestEsrch = 3; const int self = getpid_nid_postfix(); if (pid != 0 && pid != self) return static_cast(Fail(GuestEsrch)); - if (interval == nullptr) return static_cast(Fail(GuestEfault)); - interval->tv_sec = 0; - interval->tv_nsec = 94000000; + const KernelTimespec quantum{0, 94000000}; + if (interval == nullptr || !GuestCopyOut_nid_no_patch(interval, &quantum, sizeof(quantum))) return static_cast(Fail(GuestEfault)); return 0; } @@ -1204,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 new file mode 100644 index 000000000000..93087dfeaebf --- /dev/null +++ b/core/libs/prx/libkernel_sys/include/AdditionalExports.hpp @@ -0,0 +1,334 @@ +#pragma once + +#include "SceTypes.hpp" + +extern "C" { + +int APS5_VABI __cfi_slowpath_diag_nid_postfix(); +int APS5_VABI __cfi_slowpath_nid_postfix(); +int APS5_VABI __freeze_nid_postfix(); +int APS5_VABI __sceKernelGetGPI_nid_postfix(); +int APS5_VABI __sys_debug_init_nid_postfix(); +int APS5_VABI __sys_dl_get_info_2_nid_postfix(); +int APS5_VABI __sys_dl_get_info_nid_postfix(); +int APS5_VABI __sys_dl_get_list_nid_postfix(); +int APS5_VABI __sys_dl_get_metadata_nid_postfix(); +int APS5_VABI __sys_dynlib_get_info2_nid_postfix(); +int APS5_VABI __sys_dynlib_get_info_for_libdbg_nid_postfix(); +int APS5_VABI __sys_dynlib_get_list2_nid_postfix(); +int APS5_VABI __sys_dynlib_get_list_for_libdbg_nid_postfix(); +int APS5_VABI __sys_dynlib_load_prx_nid_postfix(); +int APS5_VABI __sys_dynlib_unload_prx_nid_postfix(); +int APS5_VABI __sys_get_proc_type_info_nid_postfix(); +int APS5_VABI __sys_is_development_mode_nid_postfix(); +int APS5_VABI __sys_kqueueex_nid_postfix(); +int APS5_VABI __sys_namedobj_create_nid_postfix(); +int APS5_VABI __sys_namedobj_delete_nid_postfix(); +int APS5_VABI __sys_nanosleep_nid_postfix(); +int APS5_VABI __sys_netabort_nid_postfix(); +int APS5_VABI __sys_netcontrol_nid_postfix(); +int APS5_VABI __sys_netgetiflist_nid_postfix(); +int APS5_VABI __sys_netgetsockinfo_nid_postfix(); +int APS5_VABI __sys_opmc_disable_nid_postfix(); +int APS5_VABI __sys_opmc_enable_nid_postfix(); +int APS5_VABI __sys_opmc_get_ctr_nid_postfix(); +int APS5_VABI __sys_opmc_get_hw_nid_postfix(); +int APS5_VABI __sys_opmc_set_ctl_nid_postfix(); +int APS5_VABI __sys_opmc_set_ctr_nid_postfix(); +int APS5_VABI __sys_opmc_set_hw_nid_postfix(); +int APS5_VABI __sys_osem_close_nid_postfix(); +int APS5_VABI __sys_osem_open_nid_postfix(); +int APS5_VABI __sys_randomized_path_nid_postfix(); +int APS5_VABI __sys_rdup_nid_postfix(); +int APS5_VABI __sys_regmgr_call_nid_postfix(); +int APS5_VABI __sys_resume_internal_hdd_nid_postfix(); +int APS5_VABI __sys_resume_process_nid_postfix(); +int APS5_VABI __sys_set_uevt_nid_postfix(); +int APS5_VABI __sys_socketclose_nid_postfix(); +int APS5_VABI __sys_suspend_process_nid_postfix(); +int APS5_VABI __sys_test_debug_rwmem_nid_postfix(); +int APS5_VABI __sys_workaround8849_nid_postfix(); +int APS5_VABI __ubsan_handle_cfi_check_fail_abort_nid_postfix(); +int APS5_VABI __ubsan_handle_cfi_check_fail_nid_postfix(); +int APS5_VABI _dup2_nid_postfix(); +int APS5_VABI _execve_nid_postfix(); +int APS5_VABI _execvpe_nid_postfix(); +int APS5_VABI _wait4_nid_postfix(); +int APS5_VABI adjtime_nid_postfix(); +int APS5_VABI libkernel_sysUnknown_0CV40L3tznI_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_1WXQlxMpnNA_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_1v23w7Rnkic_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_1v6DjTPunjs_nid_no_patch(); +int APS5_VABI sceKernelInternalCreateMapperSharedMemory(); +int APS5_VABI libkernel_sysUnknown_2XwZJG3Dkss_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_2YWCKF9_minus_3gM_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_2_plus_KZ4mZKp6E_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_2fPLezHAV2E_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_2wKjID0iGVM_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_2xg4JXvaJ6k_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_3BwLcdWeZLs_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_3YkQPLocySc_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_3jw_minus_vq4gYLs_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_4AMTAyz32fk_nid_no_patch(); +int APS5_VABI sceKernelIsCloudkitForDecid(); +int APS5_VABI libkernel_sysUnknown_5KHFhRhBR78_nid_no_patch(); +int APS5_VABI sceKernelIccGetButtonStatus(); +int APS5_VABI sceKernelAbortWithContext(); +int APS5_VABI sceKernelGetCanvasHandleByPid(); +int APS5_VABI libkernel_sysUnknown_7BUHmsuhcq4_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_7FNl8FfSGNw_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_7Sd1vnnqEqU_nid_no_patch(); +int APS5_VABI sceKernelIccReadWlanArea(); +int APS5_VABI libkernel_sysUnknown_8U0nlN0TpDU_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_8YkbXeSRxnM_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_940JfV9yJto_nid_no_patch(); +int APS5_VABI sceKernelGetAppMemoryInfo(); +int APS5_VABI libkernel_sysUnknown_9ncS0kCRRSA_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_AGHqSV1gdIY_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_A_plus_S5E4RCh7Y_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_AhBZlHQYeA8_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_ApbTseKUKCI_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_B70jHzr4Jj4_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_BJvWKKfmj4w_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_BjmZn9pYSuk_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_C3ToW2CA_plus_hM_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_C3xgqN95IoE_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_C49jelxiaVE_nid_no_patch(); +int APS5_VABI sceKernelSwitchToTrinityMode(); +int APS5_VABI sceKernelIsGenuineCronosCex(); +int APS5_VABI libkernel_sysUnknown_DWWduhQYA3I_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_Dv8In6FvzuM_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_E58GHGcQT7I_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_EIz_plus_fSlYCn8_nid_no_patch(); +int APS5_VABI sceKernelTraceMarkerBookmark(); +int APS5_VABI libkernel_sysUnknown_EaepepH_minus_LmI_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_FIUPjhnoI_plus_o_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_FR0odl35yQY_nid_no_patch(); +int APS5_VABI sceKernelIccGetExtBDDriveStatus(); +int APS5_VABI libkernel_sysUnknown_GTyjVeZcdRM_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_Gtncco_plus_mxio_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_HRrfx1wytn0_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_HnWsxkpJya0_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_HruYl9uBnNo_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_IJQeoUQ3pb4_nid_no_patch(); +int APS5_VABI sceKernelInternalUnlockMapperMemory(); +int APS5_VABI libkernel_sysUnknown_Ipau2b5eaHM_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_Ishr1Sdu024_nid_no_patch(); +int APS5_VABI sceKernelIdTableGetStats(); +int APS5_VABI libkernel_sysUnknown_JFpAREOJnag_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_JN1D3WtbDPs_nid_no_patch(); +int APS5_VABI sceKernelIccNotifyPowerState(); +int APS5_VABI libkernel_sysUnknown_KoDy4Jazz40_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_KoSCciXA1N0_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_L4GARHYRW0U_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_LPXIR37gw3c_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_LVRydXoXt7U_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_LwGBaXgvFaY_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_MJ_minus_err8l_minus_XY_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_MKlp_minus_bW1bz8_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_N94a0T4F4_plus_U_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_NhFlyw_minus_77cY_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_OZBJnWxt7d4_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_PBq_minus_OUg5A5s_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_PTDuAbCYfm0_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_QTGIeqEjeFc_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_Qk38ESxhDEQ_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_R3QLLyp9MEU_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_RA5mXLPd5V4_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_RDjusrvQ_minus_44_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_RfzgytiWey0_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_SEKlG1AMRGQ_nid_no_patch(); +int APS5_VABI sceKernelGetContentVersion(); +int APS5_VABI libkernel_sysUnknown_Sesgl6Zl8YI_nid_no_patch(); +int APS5_VABI sceKernelTraceMarkerPop(); +int APS5_VABI sceKernelInternalLockMapperMemory(); +int APS5_VABI libkernel_sysUnknown_TVB77yVa_plus_RU_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_Tca8tetUZCw_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_U9B58Hc5C_plus_8_nid_no_patch(); +int APS5_VABI sceKernelAddExternalTriggerEvent(); +int APS5_VABI libkernel_sysUnknown_V4f3CEBQyuM_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_VU1YkdCmYto_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_W1Cg5WPD4IQ_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_W7Vpt62Xtf4_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_WLC94v0XY_plus_0_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_WtA8Aq_minus_0cyY_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_WyZULCQhjdY_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_X4R_minus_jzzFYac_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_Xj9nET9tctI_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_XvONqaRmAPE_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_YP7qj_plus_uSJwo_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_ZFhVeS_plus_BQJs_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_Z_plus_8fq02NpM0_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown__minus_PNB3tfnD8c_nid_no_patch(); +int APS5_VABI sceKernelGetAppLibcData(); +int APS5_VABI libkernel_sysUnknown__minus_sYN8ucoAWw_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown__plus_1mj9RYU1rs_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown__plus_MZfwzH65JQ_nid_no_patch(); +int APS5_VABI sceKernelGetAmprSysInfo(); +int APS5_VABI libkernel_sysUnknown_aH3bEULQH54_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_aJK9UjBtwi4_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_aL9DwvoSDzs_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_aekYw_plus_lydSg_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_aj7wRdAWFeM_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_ak6t3JzhOtg_nid_no_patch(); +int APS5_VABI sceKernelGetSandboxConfig(); +int APS5_VABI libkernel_sysUnknown_bQ_plus_8uJVyxII_nid_no_patch(); +int APS5_VABI sceKernelIccResetBootTimestamp(); +int APS5_VABI libkernel_sysUnknown_cH6vM6sF5YA_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_cReByBlM5XE_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_cafDxa64sO4_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_ciYlptMdvhc_nid_no_patch(); +int APS5_VABI sceKernelIccWriteWlanArea(); +int APS5_VABI libkernel_sysUnknown_culoiinnxDA_nid_no_patch(); +int APS5_VABI sceKernelCheckProsperoSdkVersion(); +int APS5_VABI libkernel_sysUnknown_dnzOA7Vx1AE_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_drv94FQk_minus_Qw_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_e7oZmNPlBbU_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_eSgYzXvTPQI_nid_no_patch(); +int APS5_VABI sceKernelTraceMarkerPlot(); +int APS5_VABI libkernel_sysUnknown_ftHBlCfIEQo_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_g7MGwZ5UxBE_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_gBiaAGKEvHM_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_gJ5gpW45mU0_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_gSIiye3ERqo_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_gpgi_minus_GwE2Is_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_guq_plus_otVpgj0_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_gvq6XRoDogE_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_h26nEKnW8VI_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_h35fpAz5tf4_nid_no_patch(); +int APS5_VABI sceKernelTraceMarkerPush(); +int APS5_VABI libkernel_sysUnknown_hmqw8GlN_plus_tI_nid_no_patch(); +int APS5_VABI sceKernelGetCanvasHandle(); +int APS5_VABI sceKernelSetSandboxId(); +int APS5_VABI libkernel_sysUnknown_ilQLkGlAjWA_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_j6bGtwZkxOQ_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_jESbu_plus_uFJYU_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_jMuNoBRCPUg_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_jkLbtOA587w_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_k_plus_J3KBjfkNk_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_km8Fr2Jn4Gg_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_l67TRPy55_minus_U_nid_no_patch(); +int APS5_VABI sceKernelDeleteExternalTriggerEvent(); +int APS5_VABI libkernel_sysUnknown_l_minus_QGmU3VU_plus_Q_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_mIkJUpP5vKo_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_ncrollDo5u4_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_nsq826qQ2EI_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_o141x2VDeVc_nid_no_patch(); +int APS5_VABI sceKernelGetMainSocSubId(); +int APS5_VABI sceKernelInternalUnmapMapperSharedMemory(); +int APS5_VABI libkernel_sysUnknown_pCbBddNl66Y_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_pOClGbxrx94_nid_no_patch(); +int APS5_VABI sceKernelSetAppLibcData(); +int APS5_VABI libkernel_sysUnknown_pp_plus_G_plus_UZhiqY_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_qGzuTSD9cPQ_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_qHVs_plus_dxCumg_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_qSleeVC6lwI_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_q_minus_2Uxlg_minus_faU_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_qe5JmcCj4zg_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_qtHOLtFWq7Y_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_r6qUkFmQFr0_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_rC7zr_minus_oAHCo_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_rD4PS3f_plus_jKw_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_rLBfsmdAuvo_nid_no_patch(); +int APS5_VABI sceKernelIccDisableButton(); +int APS5_VABI libkernel_sysUnknown_sFW_plus_Ilmw_plus_58_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_tkZiGUoRJok_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_u9lxqerTKeA_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_uV_plus_YilcHqAs_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_ulVjluL9TzM_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_v_plus_qTlNjF6kE_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_vfYaxkxnJXQ_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_vq2_plus_HyP5U5I_nid_no_patch(); +int APS5_VABI sceKernelSetCanvasHandle(); +int APS5_VABI libkernel_sysUnknown_wn0XzOue4EM_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_wwWv_plus_0MzhGM_nid_no_patch(); +int APS5_VABI sceKernelDebugPauseWithDebugContext(); +int APS5_VABI libkernel_sysUnknown_xpB6yv8NhhE_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_yWOJkfd_minus_DhA_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_yn0b42DApAI_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_yzvrk3YrPlE_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_z0qKN5kkVj0_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_zAloppPJxy0_nid_no_patch(); +int APS5_VABI libkernel_sysUnknown_z_plus_e0vV_minus_tnH4_nid_no_patch(); +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 sceKernelCreateUuidV1(); +int APS5_VABI sceKernelCreateUuidV7(); +int APS5_VABI sceKernelDeleteDynlibEvent(); +int APS5_VABI sceKernelDeleteFGCInfo(); +int APS5_VABI sceKernelEnableDmemAliasing3(); +int APS5_VABI sceKernelExtendMaximumModuleNumber(); +int APS5_VABI sceKernelGetAioDebugRequestInfo(); +int APS5_VABI sceKernelGetAioDebugSubmitInfo(); +int APS5_VABI sceKernelGetAmprCounter(); +int APS5_VABI sceKernelGetAppCategoryTypeByAppId(); +int APS5_VABI sceKernelGetAppInfo2(); +int APS5_VABI sceKernelGetAppInfoListForMinisyscore(); +int APS5_VABI sceKernelGetCpuCoreClock(); +int APS5_VABI sceKernelGetGenuineProsperoSystemSwVersion(); +int APS5_VABI sceKernelGetNandInfo(); +int APS5_VABI sceKernelGetPackageInfo(); +int APS5_VABI sceKernelGetProsperoCompiledSdkVersion(); +int APS5_VABI sceKernelGetProsperoCompiledSdkVersionByPid(); +int APS5_VABI sceKernelGetPs4CompiledSdkVersion(); +int APS5_VABI sceKernelGetPs4CompiledSdkVersionByPid(); +int APS5_VABI sceKernelGetResidentFmemCount2(); +int APS5_VABI sceKernelGetToolMemoryRange(); +int APS5_VABI sceKernelGetUpdatemode(); +int APS5_VABI sceKernelHasTrinityMode(); +int APS5_VABI sceKernelIccClearEmcCrashReport(); +int APS5_VABI sceKernelIccDisableExtBDDriveOperation(); +int APS5_VABI sceKernelIccGetBDDriveChuckingState(); +int APS5_VABI sceKernelIccGetBuzzerDimSetting(); +int APS5_VABI sceKernelIccGetBuzzerOffSetting(); +int APS5_VABI sceKernelIccGetDynamicLedDimSetting(); +int APS5_VABI sceKernelIccGetEmcBtDownload(); +int APS5_VABI sceKernelIccGetEmcCrashNumOfBlocks(); +int APS5_VABI sceKernelIccGetEmcCrashReport(); +int APS5_VABI sceKernelIccGetFloydVersion(); +int APS5_VABI sceKernelIccGetWlanBtGpio(); +int APS5_VABI sceKernelIccIsExtBDDriveAttached(); +int APS5_VABI sceKernelIccIsThermalAlert(); +int APS5_VABI sceKernelIccSetBootTimestamp(); +int APS5_VABI sceKernelIccSetBuzzerDimSetting(); +int APS5_VABI sceKernelIccSetBuzzerOffSetting(); +int APS5_VABI sceKernelIccSetDynamicLedDimSetting(); +int APS5_VABI sceKernelIccSetEmcBtDownload(); +int APS5_VABI sceKernelIccSetPriorityBuzzer(); +int APS5_VABI sceKernelIccSetPriorityBuzzerEx(); +int APS5_VABI sceKernelIccSetWlanBtGpio(); +int APS5_VABI sceKernelIccSetWlanBtManuTestMode(); +int APS5_VABI sceKernelIsAuthenticTrinity(); +int APS5_VABI sceKernelIsCloudDevkit(); +int APS5_VABI sceKernelIsCloudkit(); +int APS5_VABI sceKernelIsCronos(); +int APS5_VABI sceKernelIsEcoChargeAvailable(); +int APS5_VABI sceKernelIsSpmemAvailable(); +int APS5_VABI sceKernelKernelHeapGetCount(); +int APS5_VABI sceKernelKernelHeapUsage2(); +int APS5_VABI sceKernelMapFlexibleMemoryInternal(); +int APS5_VABI sceKernelMapFlexibleMemoryInternal2(); +int APS5_VABI sceKernelMapNamedFlexibleMemoryInternal2(); +int APS5_VABI sceKernelMapNamedSystemFlexibleMemory2(); +int APS5_VABI sceKernelMapperGetIndirectBufferInfo(); +int APS5_VABI sceKernelMapperGetUsageStatsData(); +int APS5_VABI sceKernelMapperSetPageTablePoolOccupancyNotificationThreshold(); +int APS5_VABI sceKernelPltTrap(); +int APS5_VABI sceKernelSetAcKeyRegResult(); +int APS5_VABI sceKernelSetAppInfoByAppId(); +int APS5_VABI sceKernelSetUpdatemodeDirect(); +int APS5_VABI sceKernelTitleWorkaroundIsEnabled2(); +int APS5_VABI sceKernelTraceAutoCaptureCreate(); +int APS5_VABI sceKernelTraceAutoCaptureDelete(); +int APS5_VABI sceKernelTraceAutoCaptureMap(); +int APS5_VABI sceKernelTraceAutoCaptureStart(); +int APS5_VABI sceKernelTraceAutoCaptureStop(); +int APS5_VABI sceKernelTraceAutoCaptureStore(); +int APS5_VABI sceKernelTraceAutoCaptureUnmap(); +int APS5_VABI sceKernelUseCronosKura(); +int APS5_VABI sceKernelUseCronosStreaming(); +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 9618dee45b3c..c1fa1576d4bc 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; @@ -145,8 +150,8 @@ int APS5_VABI pthread_multi_np_nid_postfix(void); int APS5_VABI pthread_mutex_getprioceiling_nid_postfix(void); int APS5_VABI pthread_mutex_init_for_mono_nid_postfix(void); int APS5_VABI pthread_mutex_setprioceiling_nid_postfix(void); -int APS5_VABI pthread_mutexattr_getgen_np_nid_postfix(void); -int APS5_VABI pthread_mutexattr_setgen_np_nid_postfix(void); +int APS5_VABI pthread_mutexattr_getgen_np_nid_postfix(const PthreadMutexattr* attr, int* generation); +int APS5_VABI pthread_mutexattr_setgen_np_nid_postfix(PthreadMutexattr* attr, int generation); void APS5_VABI pthread_resume_all_np_nid_postfix(void); int APS5_VABI pthread_resume_np_nid_postfix(Pthread thread); int APS5_VABI pthread_resume_user_context_np_nid_postfix(void); @@ -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); @@ -254,7 +260,6 @@ int APS5_VABI sceKernelGetDebugMenuModeForPsmForRcmgr(void); int APS5_VABI sceKernelGetDebugMenuModeForRcmgr(void); int APS5_VABI sceKernelGetDefaultToolMemorySize(void); int APS5_VABI sceKernelGetEmergencyErrorLog(void); -int APS5_VABI sceKernelGetExecutableModuleHandle(void); int APS5_VABI sceKernelGetExtLibcHandle(void); int APS5_VABI sceKernelGetFakeFinalizeMenuForRcmgr(void); int APS5_VABI sceKernelGetFirstImageAddr(void); @@ -304,7 +309,7 @@ int APS5_VABI sceKernelGetSystemLevelDebuggerModeForRcmgr(void); int APS5_VABI sceKernelGetSystemSwBeta(void); int APS5_VABI sceKernelGetThreadName(uint32_t id, char* name); int APS5_VABI sceKernelGetUniversalMode(void); -int APS5_VABI sceKernelGetUpdVersion(void); +int APS5_VABI sceKernelGetUpdVersion(std::uint32_t* version); int APS5_VABI sceKernelGetUtokenDataExecutionForRcmgr(void); int APS5_VABI sceKernelGetUtokenExpirationTimeNotafterForRcmgr(void); int APS5_VABI sceKernelGetUtokenExpirationTimeNotbeforeForRcmgr(void); @@ -317,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); @@ -371,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); @@ -387,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); @@ -472,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); @@ -493,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)()); @@ -518,9 +524,9 @@ int APS5_VABI scePthreadMutexGetprioceiling(void); int APS5_VABI scePthreadMutexInitForInternalLibc(PthreadMutex* mutex, const PthreadMutexattr* attr); int APS5_VABI scePthreadMutexIsowned(void); int APS5_VABI scePthreadMutexSetprioceiling(void); -int APS5_VABI scePthreadMutexattrGetgen(void); +int APS5_VABI scePthreadMutexattrGetgen(const PthreadMutexattr* attr, int* generation); int APS5_VABI scePthreadMutexattrInitForInternalLibc(PthreadMutexattr* attr); -int APS5_VABI scePthreadMutexattrSetgen(void); +int APS5_VABI scePthreadMutexattrSetgen(PthreadMutexattr* attr, int generation); int APS5_VABI scePthreadResume(Pthread thread); void APS5_VABI scePthreadResumeAll(void); int APS5_VABI scePthreadSetBesteffort(void); diff --git a/core/libs/prx/libkernel_sys/libkernel_sys.hpp b/core/libs/prx/libkernel_sys/libkernel_sys.hpp index d1700db7751d..9b35b146590e 100644 --- a/core/libs/prx/libkernel_sys/libkernel_sys.hpp +++ b/core/libs/prx/libkernel_sys/libkernel_sys.hpp @@ -1,3 +1,4 @@ #pragma once #include "prx/libkernel_sys/include/Api.hpp" +#include "prx/libkernel_sys/include/AdditionalExports.hpp" diff --git a/core/libs/prx/libkernel_web/Export.cpp b/core/libs/prx/libkernel_web/Export.cpp index fb34206c211f..c753713bec32 100644 --- a/core/libs/prx/libkernel_web/Export.cpp +++ b/core/libs/prx/libkernel_web/Export.cpp @@ -2,9 +2,226 @@ #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 __freeze_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sceKernelGetGPI_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_debug_init_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_dl_get_info_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_dl_get_info_2_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_dl_get_list_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_dl_get_metadata_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_dynlib_get_info2_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_dynlib_get_info_for_libdbg_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_dynlib_get_list2_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_dynlib_get_list_for_libdbg_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_dynlib_load_prx_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_get_proc_type_info_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_is_development_mode_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_kqueueex_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_namedobj_create_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_namedobj_delete_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_netabort_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_netcontrol_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_netgetiflist_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_netgetsockinfo_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_opmc_disable_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_opmc_enable_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_opmc_get_ctr_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_opmc_get_hw_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_opmc_set_ctl_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_opmc_set_ctr_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_opmc_set_hw_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_osem_close_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_osem_open_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_randomized_path_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_rdup_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_regmgr_call_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_set_uevt_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_socketclose_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_test_debug_rwmem_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI __sys_workaround8849_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceKernelWebUnknown_038_nid_no_patch() { + NotImplemented_nid_no_patch(__func__); + return 0; +} +APS5_EXPORT("W8f1adVl+48", sceKernelWebUnknown_038_nid_no_patch); + +int APS5_VABI _execve_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _execvpe_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI _wait4_nid_disambig1_nid_postfix() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceKernelGetPrefixVersion() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceKernelIccGetThermalAlert() { + NotImplemented_nid_no_patch(__func__); + return 0; +} + } 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 000000000000..e1dbd43230fd --- /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 6f70f09beec2..425dbf928891 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 98fb4bdf8766..378c303e41bb 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 @@ -719,4 +721,143 @@ int APS5_VABI sceDebugWriteThreadRegister() { return 0; } +int APS5_VABI sceDebugGetAmprCounterInfo() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceMdbgFinalizeForShellCore() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceMdbgInitForShellCore() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceMdbgReceiveEvent() { + NotImplemented_nid_no_patch(__func__); +} + +int APS5_VABI sceMdbgSetResult() { + NotImplemented_nid_no_patch(__func__); +} + +} + +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/Api.hpp b/core/libs/prx/libmdbg_syscore/include/Api.hpp index 9008d00bb741..3371a2396849 100644 --- a/core/libs/prx/libmdbg_syscore/include/Api.hpp +++ b/core/libs/prx/libmdbg_syscore/include/Api.hpp @@ -148,4 +148,10 @@ int APS5_VABI sceDebugWriteProcessMemory(); int APS5_VABI sceDebugWriteProcessRegister(); int APS5_VABI sceDebugWriteThreadRegister(); +int APS5_VABI sceDebugGetAmprCounterInfo(); +int APS5_VABI sceMdbgFinalizeForShellCore(); +int APS5_VABI sceMdbgInitForShellCore(); +int APS5_VABI sceMdbgReceiveEvent(); +int APS5_VABI sceMdbgSetResult(); + } 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 000000000000..77fefb04155b --- /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 8a0fe08e5f93..2d6984528d30 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 000000000000..190029c626ec --- /dev/null +++ b/core/libs/prx/libwebrtc/CMakeLists.txt @@ -0,0 +1,39 @@ +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) + +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() +endif() diff --git a/core/libs/prx/libwebrtc/Export.cpp b/core/libs/prx/libwebrtc/Export.cpp new file mode 100644 index 000000000000..0fe15a48b23f --- /dev/null +++ b/core/libs/prx/libwebrtc/Export.cpp @@ -0,0 +1,2127 @@ +#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 WebRtcOpus_EncoderFree_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI WebRtcOpus_SetBitRate_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI WebRtcOpus_EnableFec_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI WebRtcOpus_DisableFec_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI WebRtcOpus_SetMaxPlaybackRate_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI WebRtcOpus_SetComplexity_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI WebRtcOpus_EnableDtx_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI WebRtcOpus_DisableDtx_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI WebRtcOpus_EnableCbr_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI WebRtcOpus_DisableCbr_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI WebRtcOpus_Encode_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI WebRtcOpus_EncoderCreate_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI WebRtcOpus_SetPacketLossRate_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI WebRtcOpus_GetBandwidth_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI WebRtcOpus_SetBandwidth_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI WebRtcOpus_SetForceChannels_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + 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 000000000000..9ce5d377dcb6 --- /dev/null +++ b/core/libs/prx/libwebrtc/include/Api.hpp @@ -0,0 +1,422 @@ +#pragma once + +#include "SceTypes.hpp" +#include "prx/libwebrtc/include/ExpFilter.hpp" +#include "prx/libwebrtc/include/RtcpCommonHeader.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); +int APS5_VABI WebRtcOpus_EncoderFree_nid_postfix(void); +int APS5_VABI WebRtcOpus_SetBitRate_nid_postfix(void); +int APS5_VABI WebRtcOpus_EnableFec_nid_postfix(void); +int APS5_VABI WebRtcOpus_DisableFec_nid_postfix(void); +int APS5_VABI WebRtcOpus_SetMaxPlaybackRate_nid_postfix(void); +int APS5_VABI WebRtcOpus_SetComplexity_nid_postfix(void); +int APS5_VABI WebRtcOpus_EnableDtx_nid_postfix(void); +int APS5_VABI WebRtcOpus_DisableDtx_nid_postfix(void); +int APS5_VABI WebRtcOpus_EnableCbr_nid_postfix(void); +int APS5_VABI WebRtcOpus_DisableCbr_nid_postfix(void); +int APS5_VABI WebRtcOpus_Encode_nid_postfix(void); +int APS5_VABI WebRtcOpus_EncoderCreate_nid_postfix(void); +int APS5_VABI WebRtcOpus_SetPacketLossRate_nid_postfix(void); +int APS5_VABI WebRtcOpus_GetBandwidth_nid_postfix(void); +int APS5_VABI WebRtcOpus_SetBandwidth_nid_postfix(void); +int APS5_VABI WebRtcOpus_SetForceChannels_nid_postfix(void); +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 000000000000..600327c779c6 --- /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/RtcpCommonHeader.hpp b/core/libs/prx/libwebrtc/include/RtcpCommonHeader.hpp new file mode 100644 index 000000000000..15e9280434db --- /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 000000000000..57c9e662236a --- /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 000000000000..fe97b83424c1 --- /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/RtcpCommonHeader.cpp b/core/libs/prx/libwebrtc/src/RtcpCommonHeader.cpp new file mode 100644 index 000000000000..e4f85d3ce1de --- /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 000000000000..8bb5b3cc32e9 --- /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 000000000000..c72cb0ee506b --- /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/RtcpCommonHeader.cpp b/core/libs/prx/libwebrtc/tests/RtcpCommonHeader.cpp new file mode 100644 index 000000000000..d7c331b9e9ce --- /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 000000000000..dbd2451fc9da --- /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 000000000000..311df5480dcb --- /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 000000000000..d625c15ef3e0 --- /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 31328f15db9f..c9e84b289b83 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 000000000000..ca85db1a5ca7 --- /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 3a6f8594df9f..90b9841f6930 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/ApplicationHeap.cpp b/core/libs/tests/ApplicationHeap.cpp index 9982dbc1e050..e371bf511c54 100644 --- a/core/libs/tests/ApplicationHeap.cpp +++ b/core/libs/tests/ApplicationHeap.cpp @@ -359,6 +359,36 @@ int main(int argc, char** argv) { *__error_nid_postfix() = 0; require(reallocarray_nid_postfix(pointer, 2, SIZE_MAX) == nullptr && *__error_nid_postfix() == 12); ApplicationHeapFree_nid_no_patch(pointer); + pointer = static_cast(recallocarray_nid_postfix(nullptr, 0, 4, 10)); + require(pointer != nullptr && ApplicationHeapUsableSize_nid_no_patch(pointer) == 40); + for (unsigned i = 0; i < 40; ++i) require(pointer[i] == 0); + std::memset(pointer, 0x5a, 40); + pointer = static_cast(recallocarray_nid_postfix(pointer, 4, 6, 10)); + require(pointer != nullptr && ApplicationHeapUsableSize_nid_no_patch(pointer) == 60); + for (unsigned i = 0; i < 40; ++i) require(pointer[i] == 0x5a); + for (unsigned i = 40; i < 60; ++i) require(pointer[i] == 0); + auto* shrunken = static_cast(recallocarray_nid_postfix(pointer, 6, 5, 10)); + require(shrunken == pointer); + for (unsigned i = 0; i < 40; ++i) require(shrunken[i] == 0x5a); + for (unsigned i = 40; i < 60; ++i) require(shrunken[i] == 0); + pointer = static_cast(recallocarray_nid_postfix(shrunken, 5, 2, 10)); + require(pointer != nullptr); + for (unsigned i = 0; i < 20; ++i) require(pointer[i] == 0x5a); + *__error_nid_postfix() = 0; + require(recallocarray_nid_postfix(pointer, 2, 2, SIZE_MAX) == nullptr && *__error_nid_postfix() == 12); + *__error_nid_postfix() = 0; + require(recallocarray_nid_postfix(pointer, SIZE_MAX, 2, 2) == nullptr && *__error_nid_postfix() == 22); + *__error_nid_postfix() = 0; + require(recallocarray_nid_postfix(nullptr, 0, SIZE_MAX, 2) == nullptr && *__error_nid_postfix() == 12); + ApplicationHeapFree_nid_no_patch(pointer); + pointer = static_cast(recallocarray_nid_postfix(nullptr, 0, 20, 1000)); + require(pointer != nullptr && ApplicationHeapUsableSize_nid_no_patch(pointer) == 20000); + std::memset(pointer, 0x33, 20000); + shrunken = static_cast(recallocarray_nid_postfix(pointer, 20, 14, 1000)); + require(shrunken == pointer); + for (unsigned i = 0; i < 14000; ++i) require(shrunken[i] == 0x33); + for (unsigned i = 14000; i < 20000; ++i) require(shrunken[i] == 0); + ApplicationHeapFree_nid_no_patch(shrunken); for (std::size_t alignment : {16, 64, 4096}) { auto* aligned = ApplicationHeapAlign_nid_no_patch(alignment, 37); require(reinterpret_cast(aligned) % alignment == 0); @@ -504,6 +534,14 @@ int main(int argc, char** argv) { require(strndup_nid_postfix(text, 5) == nullptr && *__error_nid_postfix() == 12); *__error_nid_postfix() = 0; require(getcwd_nid_postfix(nullptr, 0) == nullptr && *__error_nid_postfix() == 12); + *__error_nid_postfix() = 0; + require(recallocarray_nid_postfix(nullptr, 0, 4, 10) == nullptr && *__error_nid_postfix() == 12); + *__error_nid_postfix() = 0; + require(recallocarray_nid_postfix(nullptr, 0, SIZE_MAX, 2) == nullptr && *__error_nid_postfix() == 12); + std::memset(storage.data(), 0x7b, 32); + *__error_nid_postfix() = 0; + require(recallocarray_nid_postfix(storage.data(), 4, 8, 10) == nullptr && *__error_nid_postfix() == 12); + for (unsigned i = 0; i < 32; ++i) require(reinterpret_cast(storage.data())[i] == 0x7b); fail = false; const auto beforeScripting = frees; const auto sizeBeforeScripting = lastSize; diff --git a/core/libs/tests/EmscriptenModuleUnwind.cpp b/core/libs/tests/EmscriptenModuleUnwind.cpp new file mode 100644 index 000000000000..9e3710221e29 --- /dev/null +++ b/core/libs/tests/EmscriptenModuleUnwind.cpp @@ -0,0 +1,41 @@ +#include "prx/libkernel/include/Api.hpp" +#include "prx/libkernel/KernelErrors.hpp" +#include "prx/libSceSysmodule/include/Api.hpp" +#include +#include +#include +#include +#include + +namespace { + +struct UnsupportedPath { + const char* function; +}; + +} + +extern "C" [[noreturn]] void NotImplemented_nid_no_patch(const char* function) { + throw UnsupportedPath{function}; +} + +int main() { + for (const auto query : {&sceKernelGetModuleInfoForUnwind, &sceSysmoduleGetModuleInfoForUnwind}) { + for (const auto address : {std::uint64_t{0}, std::uint64_t{0x10000}, std::numeric_limits::max()}) { + for (const int flags : {0, 1, -1}) { + ModuleInfoForUnwind info; + std::memset(&info, 0xa5, sizeof(info)); + std::array before; + std::memcpy(before.data(), &info, sizeof(info)); + try { + query(address, flags, &info); + std::abort(); + } catch (const UnsupportedPath& error) { + if (std::strcmp(error.function, "sceKernelGetModuleInfoForUnwind") != 0 || + std::memcmp(before.data(), &info, sizeof(info)) != 0) std::abort(); + } + } + } + } + if (sceKernelGetModuleInfoForUnwind(0, 0, nullptr) != SCE_KERNEL_ERROR_EFAULT) std::abort(); +} diff --git a/core/libs/tests/ErrorDialogRequest.cpp b/core/libs/tests/ErrorDialogRequest.cpp new file mode 100644 index 000000000000..3d231d9dcca8 --- /dev/null +++ b/core/libs/tests/ErrorDialogRequest.cpp @@ -0,0 +1,24 @@ +#include "prx/libSceErrorDialog/include/ErrorDialogRequest.hpp" +#include +#include + +namespace { + +void Require(bool value, const char* what) { + if (!value) { + std::fprintf(stderr, "error_dialog_request: %s\n", what); + std::abort(); + } +} + +} + +int main() { + const ModalDialogRequest request = ErrorDialog::BuildRequest(static_cast(0x80020001u)); + Require(request.message == u"An error occurred.\nError code: 0x80020001", "the error code is not in the message"); + Require(request.buttons.size() == 1 && request.buttons[0] == u"OK", "the dialog does not have one OK button"); + Require(request.focus == 0 && request.cancel == 0, "the OK button is not focused and chosen by a cancel"); + Require(ErrorDialog::BuildRequest(0).message == u"An error occurred.\nError code: 0x00000000", "a zero code is not padded"); + Require(ErrorDialog::BuildRequest(-1).message == u"An error occurred.\nError code: 0xFFFFFFFF", "a negative code is not shown as unsigned"); + Require(ErrorDialog::BuildRequest(0x1AB).message == u"An error occurred.\nError code: 0x000001AB", "hex digits are not uppercase"); +} diff --git a/core/libs/tests/ExceptionCompactUnwind.cpp b/core/libs/tests/ExceptionCompactUnwind.cpp new file mode 100644 index 000000000000..0663ab507905 --- /dev/null +++ b/core/libs/tests/ExceptionCompactUnwind.cpp @@ -0,0 +1,170 @@ +#include "prx/libc/include/exceptions/CompactUnwind.hpp" + +#include +#include +#include +#include +#include + +namespace { + +void Require(bool condition, const char* message) { + if (!condition) { + std::fprintf(stderr, "exception_compact_unwind: %s\n", message); + std::abort(); + } +} + +void Append32(std::vector& bytes, std::uint32_t value) { + for (int shift = 0; shift < 32; shift += 8) bytes.push_back(static_cast(value >> shift)); +} + +std::vector SampleUnwind() { + constexpr std::uint32_t common = 0x1c; + constexpr std::uint32_t personality = 0x20; + constexpr std::uint32_t lsda = 0x28; + constexpr std::uint32_t index = 0x30; + constexpr std::uint32_t regular = 0x54; + constexpr std::uint32_t compressed = 0x84; + std::vector bytes; + Append32(bytes, 1); + Append32(bytes, common); + Append32(bytes, 1); + Append32(bytes, personality); + Append32(bytes, 2); + Append32(bytes, index); + Append32(bytes, 3); + Append32(bytes, 0x02010000u); + Append32(bytes, 0x40); + Append32(bytes, static_cast(-8)); + Append32(bytes, 0x1000); + Append32(bytes, 0x0abc); + Append32(bytes, 0x1000); + Append32(bytes, regular); + Append32(bytes, lsda); + Append32(bytes, 0x2000); + Append32(bytes, compressed); + Append32(bytes, lsda + 8); + Append32(bytes, 0x3000); + Append32(bytes, 0); + Append32(bytes, lsda + 8); + Append32(bytes, 2); + Append32(bytes, 0x00050008u); + Append32(bytes, 0x1000); + Append32(bytes, 0x52020000u); + Append32(bytes, 0x1100); + Append32(bytes, 0); + Append32(bytes, 0x1200); + Append32(bytes, 0x04000004u); + Append32(bytes, 0x1300); + Append32(bytes, 0x04ffff00u); + Append32(bytes, 0x1400); + Append32(bytes, 0x04000000u); + Append32(bytes, 3); + Append32(bytes, 0x0002000cu); + Append32(bytes, 0x00010014u); + Append32(bytes, 0x00000010u); + Append32(bytes, 0x01000080u); + Append32(bytes, 0x23040000u); + Require(bytes.size() == compressed + 24, "sample unwind blob size"); + Require(regular + 8 + 5 * 8 == compressed, "regular page ends where the compressed page starts"); + return bytes; +} + +LibcUnwind::CompactParse Lookup(const std::vector& info, std::span eh, std::uint32_t target, LibcUnwind::CompactDwarfDecode decode, bool* called, LibcUnwind::CompactEntry& entry) { + return LibcUnwind::ParseCompactUnwind(info, eh, target, decode, called, entry); +} + +bool AcceptDwarf(std::uint32_t, void* user) { + if (user) *static_cast(user) = true; + return true; +} + +bool RejectDwarf(std::uint32_t, void* user) { + if (user) *static_cast(user) = true; + return false; +} + +void CheckIndex(const std::vector& info) { + using LibcUnwind::CompactParse; + LibcUnwind::CompactEntry entry {}; + bool called = false; + const unsigned char ehBytes[] = {1, 2, 3, 4, 5, 6, 7, 8}; + const std::span eh{ehBytes, sizeof(ehBytes)}; + Require(Lookup(info, eh, 0x0fff, AcceptDwarf, &called, entry) == CompactParse::Miss, "an address before the first page is a miss"); + Require(!called, "a miss does not decode an FDE"); + Require(Lookup(info, eh, 0x1000, AcceptDwarf, &called, entry) == CompactParse::Found, "the first regular-page function is found"); + Require(entry.encoding == 0x52020000u, "the first function keeps its real encoding"); + Require(entry.encoding != 0x01000000u, "a real entry is not rewritten as an RBP frame"); + Require(entry.functionOffset == 0x1000 && entry.functionEndOffset == 0x1100, "the first function spans until the next entry"); + Require(entry.hasPersonality && entry.personalityDelta == 0x40, "personality index 1 is the first signed delta"); + Require(entry.hasLsda && entry.lsdaOffset == 0x0abc, "the LSDA index matches the function offset"); + Require(Lookup(info, eh, 0x10ff, nullptr, nullptr, entry) == CompactParse::Found && entry.functionOffset == 0x1000, "the last byte of the first function stays on that entry"); + Require(Lookup(info, eh, 0x1100, nullptr, nullptr, entry) == CompactParse::Failed, "encoding 0 fails"); + called = false; + Require(Lookup(info, {}, 0x1200, AcceptDwarf, &called, entry) == CompactParse::Failed, "a DWARF-mode entry with no eh section fails"); + Require(!called, "a missing eh section is not decoded"); + called = false; + Require(Lookup(info, eh, 0x1200, AcceptDwarf, &called, entry) == CompactParse::Found, "an in-range FDE that decodes is found"); + Require(called && entry.dwarf && entry.dwarfOffset == 4 && entry.encoding == 0x04000004u, "a decoded DWARF-mode entry keeps its eh offset"); + called = false; + Require(Lookup(info, eh, 0x1300, AcceptDwarf, &called, entry) == CompactParse::Failed, "an eh offset past the section fails"); + Require(!called, "an out-of-range eh offset is not decoded"); + called = false; + Require(Lookup(info, eh, 0x1400, RejectDwarf, &called, entry) == CompactParse::Failed, "a rejected FDE fails"); + Require(called, "an in-range FDE is offered to the decoder"); + Require(Lookup(info, eh, 0x2010, nullptr, nullptr, entry) == CompactParse::Found, "the first compressed-page function is found"); + Require(entry.encoding == 0x02010000u && entry.functionOffset == 0x2010 && entry.functionEndOffset == 0x2080, "a compressed entry uses the common encoding and the next slot as its end"); + Require(!entry.hasPersonality && !entry.hasLsda && !entry.dwarf, "the common compressed entry has no personality, LSDA, or dwarf offset"); + Require(Lookup(info, eh, 0x2080, nullptr, nullptr, entry) == CompactParse::Found, "the last page's last function is found"); + Require(entry.encoding == 0x23040000u && entry.functionOffset == 0x2080 && entry.functionEndOffset == 0x3000, "the last function runs to the sentinel"); + Require(entry.hasPersonality && entry.personalityDelta == -8, "personality index 2 is the second signed delta"); + Require(Lookup(info, eh, 0x2fff, nullptr, nullptr, entry) == CompactParse::Found && entry.functionOffset == 0x2080, "the last byte of the last page stays on that function"); + Require(Lookup(info, eh, 0x3000, nullptr, nullptr, entry) == CompactParse::Miss, "the sentinel is not a function"); +} + +void CheckRules() { + LibcUnwind::Rules rules {}; + Require(!LibcUnwind::CompactUnwindRules(0, {}, rules), "encoding 0 is not a frame"); + Require(!LibcUnwind::CompactUnwindRules(0x10000000u, {}, rules), "mode 0 with a personality still fails"); + Require(LibcUnwind::CompactUnwindRules(0x02020000u, {}, rules), "a frameless encoding does not need function bytes"); + Require(rules.cfaRegister == 7 && rules.cfaOffset == 16, "mode 2 stack size is the encoded count times 8"); + const unsigned char immediate[] = {0, 0, 0, 0, 0x10, 0, 0, 0}; + Require(LibcUnwind::CompactUnwindRules(0x03040000u, {immediate, sizeof(immediate)}, rules), "mode 3 reads the immediate inside the function"); + Require(rules.cfaRegister == 7 && rules.cfaOffset == 0x10, "mode 3 stack size is the immediate"); + Require(!LibcUnwind::CompactUnwindRules(0x03040000u, {immediate, 7}, rules), "mode 3 fails when the immediate would pass the function end"); + Require(!LibcUnwind::CompactUnwindRules(0x03040000u, {immediate, 4}, rules), "mode 3 fails when the immediate starts at the function end"); + unsigned char far[8] = {}; + Require(!LibcUnwind::CompactUnwindRules(0x03ff0000u, {far, sizeof(far)}, rules), "mode 3 fails when the immediate offset is outside a short function"); + Require(LibcUnwind::CompactUnwindRules(0x01000000u, {}, rules), "a real RBP-mode encoding still has rules"); + Require(rules.cfaRegister == 6 && rules.cfaOffset == 16, "RBP mode is CFA rbp+16"); +} + +void CheckPersonality() { + using LibcUnwind::CompactPersonality; + Require(LibcUnwind::MatchCompactPersonality(nullptr) == CompactPersonality::Unknown, "a missing name is unknown"); + Require(LibcUnwind::MatchCompactPersonality("__gxx_personality_v0") == CompactPersonality::Gxx, "the C++ personality name is exact"); + Require(LibcUnwind::MatchCompactPersonality("___gxx_personality_v0") == CompactPersonality::Gxx, "the Mach-O C++ personality symbol is exact"); + Require(LibcUnwind::MatchCompactPersonality("__gcc_personality_v0") == CompactPersonality::Gcc, "the C personality name is exact"); + Require(LibcUnwind::MatchCompactPersonality("___gcc_personality_v0") == CompactPersonality::Gcc, "the Mach-O C personality symbol is exact"); + const char* unknown[] = { + "gcc_personality_v0", + "my_gcc_personality_v0", + "__gxx_personality_v0_extra", + "objc_personality", + "__objc_personality_v0", + "personality", + "__gxx_personality_v0 ", + }; + for (const char* name : unknown) + Require(LibcUnwind::MatchCompactPersonality(name) == CompactPersonality::Unknown, name); +} + +} + +int main() { + CheckIndex(SampleUnwind()); + CheckRules(); + CheckPersonality(); + return 0; +} diff --git a/core/libs/tests/FilePosition.cpp b/core/libs/tests/FilePosition.cpp index 9bd695cc1546..50fcb3006ccf 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 edf8b3efd88f..ac9fc5bf2e43 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 02eed2f0a344..8a0603b2e041 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 @@ -15,6 +18,10 @@ #include #include #include +#include +#include +#include +#include #include #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN @@ -103,6 +110,99 @@ static void CheckExclusiveCppOpen(const std::string& base) { } } +static int APS5_VABI ScanShortCharacterList(FileStream* stream, const char* format, ...) { +#ifdef _WIN32 + __builtin_sysv_va_list args; + __builtin_sysv_va_start(args, format); +#else + std::va_list args; + va_start(args, format); +#endif + const int result = vfscanf_s_nid_postfix(stream, format, reinterpret_cast(args)); +#ifdef _WIN32 + __builtin_sysv_va_end(args); +#else + va_end(args); +#endif + return result; +} + +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 = TemporaryFile::Open(); + Require(native != nullptr); + const std::vector input(bytes, 'a'); + Require(std::fwrite(input.data(), 1, input.size(), native) == input.size()); + std::rewind(native); + FileStream stream(native); + std::vector output(bytes + 1, 'Z'); + int result = -1, consumed = -1; + std::exception_ptr failure; + std::atomic finished{false}; + std::barrier start(2); + std::thread reader([&] { + start.arrive_and_wait(); + try { + result = scan(&stream, "%1048576c%n", output.data(), output.size(), &consumed); + } catch (...) { + failure = std::current_exception(); + } + finished.store(true); + }); + start.arrive_and_wait(); + bool releasedDuringField = false; + while (!finished.load()) { + if (ftrylockfile_nid_postfix(&stream) == 0) { + const auto position = ftell_nid_postfix(&stream); + releasedDuringField = releasedDuringField || (position > 0 && position < static_cast(bytes)); + funlockfile_nid_postfix(&stream); + } + std::this_thread::yield(); + } + reader.join(); + if (failure) std::rethrow_exception(failure); + Require(ftrylockfile_nid_postfix(&stream) == 0, "Short stream character scan retained its file lock after returning"); + funlockfile_nid_postfix(&stream); + Require(std::fclose(native) == 0); + Require(!releasedDuringField, "Short stream character scan released its file lock during a field"); + Require(result == 1 && consumed == static_cast(bytes) && output.back() == 'Z'); + Require(std::memcmp(output.data(), input.data(), bytes) == 0); + } +} + +static void CheckShortCharacterScans() { + CheckShortCharacterScanLocking(); + using Scanner = int (APS5_VABI*)(FileStream*, const char*, ...); + for (const Scanner scan : {fscanf_s_nid_postfix, ScanShortCharacterList}) { + for (const std::string input : {std::string(), std::string("a"), std::string("ab"), std::string("a\0b", 3), std::string("a b")}) { + for (const unsigned width : {1u, 2u, 8u}) { + const auto taken = std::min(input.size(), width); + for (const bool suppress : {false, true}) { + auto* native = TemporaryFile::Open(); + Require(native != nullptr && std::fwrite(input.data(), 1, input.size(), native) == input.size()); + std::rewind(native); + FileStream stream(native); + std::array output; + output.fill('Z'); + int consumed = -1; + const std::string format = std::string("%") + (suppress ? "*" : "") + std::to_string(width) + "c%n"; + const int result = suppress ? scan(&stream, format.c_str(), &consumed) : scan(&stream, format.c_str(), output.data(), 32u, &consumed); + Require(result == (taken == 0 ? EOF : (suppress ? 0 : 1)) && consumed == (taken == 0 ? -1 : static_cast(taken)), "Short stream character scan result or consumption"); + const auto written = suppress ? 0 : taken; + Require(std::memcmp(output.data(), input.data(), written) == 0); + for (std::size_t i = written; i < output.size(); ++i) Require(output[i] == 'Z', "Short stream character scan destination guard"); + Require(ftell_nid_postfix(&stream) == static_cast(taken)); + Require((feof_nid_postfix(&stream) != 0) == (input.size() < width)); + Require(ferror_nid_postfix(&stream) == 0); + Require(std::fclose(native) == 0); + } + } + } + } +} + static int APS5_VABI ScanList(FileStream* stream, const char* format, ...) { #ifdef _WIN32 __builtin_sysv_va_list args; @@ -120,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); @@ -129,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"); @@ -142,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) { @@ -210,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__) @@ -292,6 +484,7 @@ static void CheckZeroSizedTransfers(const std::string& base) { int main(int argc, char** argv) { Require(argc == 2); CheckExclusiveCppOpen(argv[1]); + CheckShortCharacterScans(); CheckZeroSizedTransfers(argv[1]); CheckUpdateStreamReadsAfterWrites(argv[1]); CheckStreamWritesAfterReads(argv[1]); @@ -327,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 ed534f18d731..87e27c19cd77 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); @@ -256,7 +294,35 @@ static void CheckSecureFormat() { Require(threw); } +static void CheckScanInputFailureErrno() { + const int previousError = *__error_nid_postfix(); + for (const auto scan : {sscanf_nid_postfix, ScanList}) { + for (const int savedError : {0, 22, 97}) { + for (const char* input : {"", " ", " "}) { + std::array word; + word.fill('!'); + *__error_nid_postfix() = savedError; + Require(scan(input, "%s", word.data()) == EOF && *__error_nid_postfix() == savedError); + Require(std::all_of(word.begin(), word.end(), [](char value) { return value == '!'; })); + int number = 123; + *__error_nid_postfix() = savedError; + Require(scan(input, "%d", &number) == EOF && number == 123 && *__error_nid_postfix() == savedError); + float floating = 1.0f; + *__error_nid_postfix() = savedError; + Require(scan(input, "%f", &floating) == EOF && floating == 1.0f && *__error_nid_postfix() == savedError); + *__error_nid_postfix() = savedError; + Require(scan(input, "%*s") == EOF && *__error_nid_postfix() == savedError); + } + } + float floating = 0.0f; + *__error_nid_postfix() = 97; + Require(scan("1e99999", "%f", &floating) == 1 && std::isinf(floating) && *__error_nid_postfix() == 34); + } + *__error_nid_postfix() = previousError; +} + __attribute__((noinline)) static void APS5_VABI RunChecks() { + CheckScanInputFailureErrno(); char buffer[1024]; Require(FormatList(buffer, sizeof(buffer), "Mount requested: %d", 0) == 18); Require(std::strcmp(buffer, "Mount requested: 0") == 0); diff --git a/core/libs/tests/GameModeFixtureLibrary.cpp b/core/libs/tests/GameModeFixtureLibrary.cpp new file mode 100644 index 000000000000..182a07e8ab8e --- /dev/null +++ b/core/libs/tests/GameModeFixtureLibrary.cpp @@ -0,0 +1,43 @@ +namespace { + +int startResult = 0; +int endResult = 0; +int starts = 0; +int ends = 0; + +} + +extern "C" { + +int real_gamemode_request_start() { + ++starts; + return startResult; +} + +#ifndef FIXTURE_OMIT_END +int real_gamemode_request_end() { + ++ends; + return endResult; +} +#endif + +#ifndef FIXTURE_OMIT_ERROR_STRING +const char* real_gamemode_error_string() { + return "fixture daemon is not running"; +} +#endif + +void fixture_configure(int start, int end) { + startResult = start; + endResult = end; +} + +int fixture_starts() { + return starts; +} + +int fixture_ends() { + return ends; +} + +} diff --git a/core/libs/tests/GuestAcm.cpp b/core/libs/tests/GuestAcm.cpp index 0ef10e0adf12..366cf3764bef 100644 --- a/core/libs/tests/GuestAcm.cpp +++ b/core/libs/tests/GuestAcm.cpp @@ -43,7 +43,7 @@ int main() { Require(sceAcmBatchStartBuffers(context2, 0, nullptr, nullptr, &batch2) == 0 && batch2 != 0); Require(sceAcmBatchWait(context2, batch2, 0) == 0); - Require(sceAcm_ConvReverb_SharedInput(nullptr, 0, nullptr, 0, nullptr, nullptr, nullptr) == 0); + Require(sceAcm_ConvReverb_SharedInput(nullptr, 0, nullptr, 0, nullptr, nullptr, nullptr) == BadPointer); Require(sceAcm_FFT(nullptr, 0, 0, 0, nullptr, 0, nullptr, 0) == BadPointer); alignas(128) std::byte commands[256]{}; alignas(128) std::uint32_t sourceData[32]{}; @@ -71,7 +71,7 @@ int main() { for (std::size_t index = 8; index < 16; ++index) Require(descriptor[index] == 0); commandBatch = {commands, 0, sizeof(commands)}; Require(sceAcm_FFT(&commandBatch, 512, 0, 0, sources, 0, outputs, 0) == BadPointer); - Require(sceAcm_FFT(&commandBatch, 256, 1, 0, sources, 0, outputs, 0) == BadPointer); + Require(sceAcm_FFT(&commandBatch, 768, 1, 0, sources, 0, outputs, 0) == BadPointer); Require(sceAcm_FFT(&commandBatch, 4096, 1, 0, sources, 0, outputs, 0) == BadPointer); Require(sceAcm_FFT(&commandBatch, 512, 1, 2, sources, 0, outputs, 0) == BadPointer); Require(sceAcm_FFT(&commandBatch, 512, 1, 0, sources, 2, outputs, 0) == BadPointer); @@ -83,20 +83,40 @@ int main() { Require(commandBatch.offset == 72 && commandBatch.buffer_size == sizeof(commands)); std::uint64_t fftWords[9]; std::memcpy(fftWords, commands, sizeof(fftWords)); - Require(fftWords[0] == 0x1C030400 && fftWords[1] == 0xC0A); - Require(fftWords[2] == 0x400000006 && fftWords[3] == reinterpret_cast(sourceData)); - Require(fftWords[4] == 0x90A && fftWords[5] == 0xB0A && fftWords[6] == 0x40A); - Require(fftWords[7] == 0x400000008 && fftWords[8] == reinterpret_cast(sourceData)); + Require(fftWords[0] == 0x38050800 && fftWords[1] == 0xD0A); + Require(fftWords[2] == 0x800000006 && fftWords[3] == reinterpret_cast(sourceData)); + Require(fftWords[4] == 0x20A && fftWords[5] == 0xB0A && fftWords[6] == 0x80A); + Require(fftWords[7] == 0x800000008 && fftWords[8] == reinterpret_cast(sourceData)); commandBatch = {commands, 0, 71}; Require(sceAcm_FFT(&commandBatch, 512, 1, 0, sources, 0, outputs, 0) == static_cast(0x81940009)); Require(commandBatch.offset == 0); commandBatch = {commands, 0, sizeof(commands)}; Require(sceAcm_FFT(&commandBatch, 2048, 1, 1, sources, 1, outputs, 9) == 0); std::memcpy(fftWords, commands, sizeof(fftWords)); - Require(fftWords[0] == 0x600 && fftWords[1] == 0x80A && fftWords[4] == 0x20A && fftWords[5] == 0x60A && fftWords[6] == 0x50A); + Require(fftWords[0] == 0xA00 && fftWords[1] == 0x80A && fftWords[2] == 0x800000006 && fftWords[4] == 0x20A && fftWords[5] == 0x60A && fftWords[6] == 0x50A); + commandBatch = {commands, 0, sizeof(commands)}; + Require(sceAcm_FFT(&commandBatch, 256, 1, 0, sources, 0, outputs, 1) == 0 && commandBatch.offset == 72); + std::memcpy(fftWords, commands, sizeof(fftWords)); + Require(fftWords[0] == 0x39030700 && fftWords[1] == 0xD0A && fftWords[2] == 0x200000006); + Require(fftWords[4] == 0xA && fftWords[5] == 0xA0A && fftWords[6] == 0x80A && fftWords[7] == 0x400000008); + std::uint64_t ifftWords[10]; + commandBatch = {commands, 0, sizeof(commands)}; + Require(sceAcm_IFFT(nullptr, 1024, 1, 1, sources, 0, outputs, 1) == BadPointer); + Require(sceAcm_IFFT(&commandBatch, 1024, 1, 1, sources, 0, outputs, 5) == BadPointer); + Require(sceAcm_IFFT(&commandBatch, 1024, 1, 1, sources, 0, outputs, 3) == 0 && commandBatch.offset == 88); + commandBatch = {commands, 0, sizeof(commands)}; + Require(sceAcm_IFFT(&commandBatch, 1024, 1, 1, sources, 0, outputs, 1) == 0 && commandBatch.offset == 80); + std::memcpy(ifftWords, commands, sizeof(ifftWords)); + Require(ifftWords[0] == 0x32880900 && ifftWords[1] == 0xD0A && ifftWords[2] == 0x800000006 && ifftWords[3] == reinterpret_cast(sourceData)); + Require(ifftWords[4] == 0x50A && ifftWords[5] == 0xC0A && ifftWords[6] == 0x60A); + Require(ifftWords[7] == 0x0800001000000009 && ifftWords[8] == 0 && ifftWords[9] == reinterpret_cast(sourceData)); + commandBatch = {commands, 0, sizeof(commands)}; + Require(sceAcm_IFFT(&commandBatch, 2048, 1, 0, sources, 1, outputs, 0) == 0 && commandBatch.offset == 72); + std::memcpy(ifftWords, commands, sizeof(ifftWords)); + Require(ifftWords[0] == 0x2C100A00 && ifftWords[1] == 0x80A && ifftWords[4] == 0x10A && ifftWords[5] == 0x70A && ifftWords[6] == 0x50A); sources[1] = sourceData; outputs[1] = sourceData; - for (const auto size : {512, 1024, 2048}) { + for (const auto size : {256, 512, 1024, 2048}) { for (std::int32_t inputFormat = 0; inputFormat < 2; ++inputFormat) { for (std::int32_t outputFormat = 0; outputFormat < 2; ++outputFormat) { for (std::int32_t flags = 0; flags < 16; ++flags) { @@ -107,6 +127,13 @@ int main() { } else { Require(result == 0 && commandBatch.offset == 72 + ((flags & 2) ? 8 : 0) + ((flags & 4) ? 8 : 0)); } + commandBatch = {commands, 0, sizeof(commands)}; + const auto inverseResult = sceAcm_IFFT(&commandBatch, size, 1, inputFormat, sources, outputFormat, outputs, flags); + if ((flags & 5) == 5) { + Require(inverseResult == BadPointer && commandBatch.offset == 0); + } else { + Require(inverseResult == 0 && commandBatch.offset == 72 + ((flags & 2) ? 8 : 0) + ((flags & 5) ? 8 : 0)); + } } } } @@ -115,6 +142,172 @@ int main() { Require(sceAcm_Panner(&commandBatch, 1, sources, 0, 0, 1, sources, sources, nullptr, outputs) == static_cast(0x81940009)); Require(commandBatch.offset == 0 && commandBatch.buffer_size == 152); + const auto qword = [](const std::byte* base, std::size_t position) { std::uint64_t value; std::memcpy(&value, base + position, sizeof(value)); return value; }; + const auto dword = [](const std::byte* base, std::size_t position) { std::uint32_t value; std::memcpy(&value, base + position, sizeof(value)); return value; }; + const auto single = [](const std::byte* base, std::size_t position) { float value; std::memcpy(&value, base + position, sizeof(value)); return value; }; + const auto address = [](const void* pointer) { return static_cast(reinterpret_cast(pointer)); }; + alignas(128) static std::byte reverbMemory[0x10000]; + alignas(128) static std::byte reverbCommands[4096]; + std::byte* const memory = reverbMemory; + const std::byte* const descriptor0 = reverbCommands + sizeof(reverbCommands) - 0x280; + const std::byte* const descriptor1 = reverbCommands + sizeof(reverbCommands) - 0x500; + AcmReverbBuffer historyBlocks[2]{{memory, nullptr}, {memory + 0x4000, nullptr}}; + const AcmReverbBuffer* historyChannels[2]{&historyBlocks[0], &historyBlocks[1]}; + const void* inputChannels[2]{memory + 0x8000, memory + 0x8080}; + AcmReverbInput reverbInput{512, 4, 2, 0, 0, 0, historyChannels, inputChannels, 0}; + AcmReverbBuffer filterBlocks[4]{{memory + 0x9000, nullptr}, {memory + 0x9080, nullptr}, {memory + 0x9100, nullptr}, {memory + 0x9180, nullptr}}; + const AcmReverbBuffer* filterChannelsA[2]{&filterBlocks[0], &filterBlocks[1]}; + const AcmReverbBuffer* filterChannelsB[2]{&filterBlocks[2], &filterBlocks[3]}; + AcmReverbFilter filterA{512, 3, 2, 0, nullptr, filterChannelsA}; + AcmReverbFilter filterB{512, 5, 2, 0, nullptr, filterChannelsB}; + void* workspaceA[2]{memory + 0xA000, memory + 0xA080}; + void* samplesA[2]{memory + 0xB000, memory + 0xB080}; + void* workspaceB[2]{memory + 0xA100, memory + 0xA180}; + void* samplesB[2]{memory + 0xB100, memory + 0xB180}; + AcmReverbOutput outputA{512, 2, samplesA, workspaceA, 1.0f, 1.0f, nullptr}; + AcmReverbOutput outputB{512, 2, samplesB, workspaceB, 1.0f, 1.0f, nullptr}; + const AcmReverbFilter* reverbFilters[2]{&filterA, &filterB}; + const AcmReverbOutput* reverbOutputs[2]{&outputA, &outputB}; + const float reverbGains[2]{0.5f, 0.25f}; + AcmBatchInfo reverbBatch{reverbCommands, 0, sizeof(reverbCommands)}; + const auto ringIs = [&reverbInput](std::uint32_t current, std::uint32_t available) { return reverbInput.currentBlock == current && reverbInput.availableBlocks == available; }; + const auto reverb = [&](std::uint32_t outputCount, const AcmReverbFilter* const* filters, const AcmReverbOutput* const* outputs) { return sceAcm_ConvReverb_SharedInput(&reverbBatch, 1, &reverbInput, outputCount, filters, reverbGains, outputs); }; + + Require(sceAcm_ConvReverb_SharedInput(nullptr, 1, &reverbInput, 1, reverbFilters, reverbGains, reverbOutputs) == BadPointer); + Require(sceAcm_ConvReverb_SharedInput(&reverbBatch, 0, &reverbInput, 1, reverbFilters, reverbGains, reverbOutputs) == BadPointer); + Require(sceAcm_ConvReverb_SharedInput(&reverbBatch, 1, nullptr, 1, reverbFilters, reverbGains, reverbOutputs) == BadPointer); + Require(reverb(1, nullptr, reverbOutputs) == BadPointer); + reverbInput.blockSize = 768; + Require(reverb(1, reverbFilters, reverbOutputs) == BadPointer); + reverbInput.blockSize = 512; + filterA.blockCount = 0; + Require(reverb(1, reverbFilters, reverbOutputs) == BadPointer); + filterA.blockCount = 3; + Require(ringIs(0, 0) && reverbBatch.offset == 0); + Require(reverb(0, reverbFilters, reverbOutputs) == BadPointer && ringIs(3, 1)); + Require(reverb(1, reverbFilters, nullptr) == BadPointer && ringIs(2, 2)); + reverbInput.currentBlock = 0; + historyBlocks[1].blockMetadata = memory; + Require(reverb(1, reverbFilters, reverbOutputs) == BadPointer && ringIs(3, 3)); + historyBlocks[1].blockMetadata = nullptr; + Require(reverbBatch.offset == 0 && reverbBatch.buffer_size == sizeof(reverbCommands)); + + reverbInput.currentBlock = 0; + reverbInput.availableBlocks = 0; + std::memset(reverbCommands, 0xCC, sizeof(reverbCommands)); + Require(reverb(1, reverbFilters, reverbOutputs) == 0); + Require(ringIs(3, 1) && reverbBatch.offset == 216 && reverbBatch.buffer_size == sizeof(reverbCommands) - 2 * 0x280); + Require(qword(reverbCommands, 0) == 0x900 && qword(reverbCommands, 24) == address(inputChannels[0]) && qword(reverbCommands, 64) == address(memory + 0x3000) && qword(reverbCommands, 80) == address(inputChannels[1]) && qword(reverbCommands, 120) == address(memory + 0x7000)); + Require(qword(reverbCommands, 128) == ((std::uint64_t{3} << 45) | (std::uint64_t{1} << 40) | (std::uint64_t{1} << 34) | (std::uint64_t{1} << 23) | (std::uint64_t{1} << 21) | (std::uint64_t{1} << 19) | 0xD00)); + Require(qword(reverbCommands, 136) == 0x028000000000000D && qword(reverbCommands, 144) == address(descriptor0) && qword(reverbCommands, 152) == 0x1030A && qword(reverbCommands, 160) == 0x10A && qword(reverbCommands, 168) == 0x20A); + Require(qword(reverbCommands, 176) == 0x028000000000000D && qword(reverbCommands, 184) == address(descriptor1) && qword(reverbCommands, 208) == 0x20A); + Require(qword(descriptor0, 0) == address(memory) && qword(descriptor0, 8) == address(memory + 0x9000) && qword(descriptor0, 16) == 0); + Require(dword(descriptor0, 0x48) == 1 && dword(descriptor0, 0x4C) == 1 && dword(descriptor0, 0x6C) == 0 && dword(descriptor0, 0xC8) == 3 * 4096 && dword(descriptor0, 0xCC) == 0); + Require(dword(descriptor0, 0x148) == 4 * 4096 && dword(descriptor0, 0x14C) == 0xFFFFFFFF && qword(descriptor0, 0x80) == 0 && qword(descriptor0, 0x100) == 0 && descriptor0[0x16C] == std::byte{0}); + Require(dword(descriptor0, 0x174) == 1024 && dword(descriptor0, 0x178) == 3 && dword(descriptor0, 0x17C) == 2); + Require(qword(descriptor0, 0x180) == address(workspaceA[0]) && qword(descriptor0, 0x188) == 0 && single(descriptor0, 0x1C0) == 0.5f && qword(descriptor0, 0x200) == address(samplesA[0]) && qword(descriptor0, 0x240) == 0); + Require(qword(descriptor1, 0) == address(memory + 0x4000) && qword(descriptor1, 8) == address(memory + 0x9080) && qword(descriptor1, 0x180) == address(workspaceA[1]) && qword(descriptor1, 0x200) == address(samplesA[1])); + Require(reverb(1, reverbFilters, reverbOutputs) == 0); + Require(ringIs(2, 2) && reverbBatch.offset == 432 && reverbBatch.buffer_size == sizeof(reverbCommands) - 4 * 0x280); + const std::byte* const descriptor2 = reverbCommands + sizeof(reverbCommands) - 0x780; + Require(qword(reverbCommands, 280) == address(memory + 0x2000) && qword(reverbCommands, 360) == address(descriptor2) && dword(descriptor2, 0x48) == 2 && dword(descriptor2, 0xC8) == 2 * 4096); + + reverbInput.currentBlock = 0; + reverbInput.availableBlocks = 4; + reverbBatch = {reverbCommands, 0, sizeof(reverbCommands)}; + Require(reverb(2, reverbFilters, reverbOutputs) == 0); + Require(ringIs(3, 4) && reverbBatch.offset == 216); + Require(qword(reverbCommands, 128) == ((std::uint64_t{3} << 45) | (std::uint64_t{1} << 40) | (std::uint64_t{1} << 34) | (std::uint64_t{1} << 29) | (std::uint64_t{1} << 23) | (std::uint64_t{1} << 21) | (std::uint64_t{1} << 19) | 0xD00)); + Require(qword(descriptor0, 8) == address(memory + 0x9100) && qword(descriptor0, 16) == address(memory + 0x9000)); + Require(dword(descriptor0, 0x48) == 4 && dword(descriptor0, 0x4C) == 4 && dword(descriptor0, 0x50) == 3 && descriptor0[0x16C] == std::byte{1} && descriptor0[0x16D] == std::byte{0}); + Require(dword(descriptor0, 0x17C) == 3 && dword(descriptor0, 0x178) == 7 && single(descriptor0, 0x1C0) == 0.25f && single(descriptor0, 0x1C4) == 0.5f); + Require(qword(descriptor0, 0x180) == address(workspaceB[0]) && qword(descriptor0, 0x188) == address(workspaceA[0]) && qword(descriptor0, 0x200) == address(samplesB[0]) && qword(descriptor0, 0x208) == address(samplesA[0])); + + const AcmReverbBuffer* broadcastChannels[9]; + void* broadcastWorkspace[9]; + void* broadcastSamples[9]; + for (std::size_t index = 0; index < 9; ++index) { + broadcastChannels[index] = &filterBlocks[index % 4]; + broadcastWorkspace[index] = memory + 0xC000 + 0x80 * index; + broadcastSamples[index] = memory + 0xD000 + 0x80 * index; + } + AcmReverbInput monoInput{512, 2, 1, 0, 0, 0, historyChannels, inputChannels, 0}; + AcmReverbFilter broadcastFilter{512, 2, 9, 1, nullptr, broadcastChannels}; + AcmReverbOutput broadcastOutput{512, 9, broadcastSamples, broadcastWorkspace, 1.0f, 1.0f, nullptr}; + const AcmReverbFilter* broadcastFilters[1]{&broadcastFilter}; + const AcmReverbOutput* broadcastOutputs[1]{&broadcastOutput}; + reverbBatch = {reverbCommands, 0, sizeof(reverbCommands)}; + Require(sceAcm_ConvReverb_SharedInput(&reverbBatch, 1, &monoInput, 1, broadcastFilters, nullptr, broadcastOutputs) == 0); + Require(reverbBatch.offset == 160 && reverbBatch.buffer_size == sizeof(reverbCommands) - 2 * 0x280 && monoInput.currentBlock == 1 && monoInput.availableBlocks == 1); + Require(qword(reverbCommands, 72) == ((std::uint64_t{2} << 45) | (std::uint64_t{1} << 43) | (std::uint64_t{1} << 33) | (std::uint64_t{1} << 22) | (std::uint64_t{1} << 21) | (std::uint64_t{1} << 17) | 0xD00)); + Require(dword(descriptor0, 0x17C) == 9 && dword(descriptor0, 0x178) == 1 && qword(descriptor0, 0x238) == address(broadcastSamples[7]) && single(descriptor0, 0x1DC) == 1.0f && descriptor0[0x173] == std::byte{7}); + Require(dword(descriptor1, 0x17C) == 2 && qword(descriptor1, 8) == address(memory + 0x9000) && qword(descriptor1, 0x180) == address(broadcastWorkspace[8]) && qword(descriptor1, 0x200) == address(broadcastSamples[8])); + + const AcmReverbBuffer* sharedFilterChannel[1]{&filterBlocks[0]}; + AcmReverbFilter sharedFilter{512, 4, 1, 0, nullptr, sharedFilterChannel}; + const AcmReverbFilter* sharedFilters[1]{&sharedFilter}; + reverbInput.sampleFormat = 1; + reverbInput.currentBlock = 0; + reverbInput.availableBlocks = 0; + reverbBatch = {reverbCommands, 0, sizeof(reverbCommands)}; + Require(reverb(1, sharedFilters, reverbOutputs) == 0 && reverbBatch.offset == 216); + Require(qword(reverbCommands, 24) == address(inputChannels[1]) && qword(reverbCommands, 64) == address(memory + 0x5800) && qword(reverbCommands, 80) == address(inputChannels[0]) && qword(reverbCommands, 120) == address(memory + 0x1800)); + Require(qword(reverbCommands, 128) == ((std::uint64_t{4} << 45) | (std::uint64_t{1} << 39) | (std::uint64_t{1} << 34) | (std::uint64_t{1} << 23) | (std::uint64_t{1} << 20) | (std::uint64_t{1} << 18) | 0xD00)); + Require(dword(descriptor0, 0xC8) == 3 * 2048 && dword(descriptor0, 0x148) == 4 * 2048 && dword(descriptor0, 0x178) == 2 && qword(descriptor1, 8) == address(memory + 0x9000) && qword(descriptor1, 0x200) == address(samplesA[1])); + reverbInput.sampleFormat = 0; + + reverbInput.blockSize = 128; + filterA.blockSize = 128; + outputA.blockSize = 128; + reverbInput.currentBlock = 0; + reverbInput.availableBlocks = 0; + reverbBatch = {reverbCommands, 0, sizeof(reverbCommands)}; + Require(reverb(1, reverbFilters, reverbOutputs) == 0 && ringIs(3, 1) && reverbBatch.offset == 216 && reverbBatch.buffer_size == sizeof(reverbCommands) - 2 * 0x280); + Require(qword(reverbCommands, 0) == 0x700 && qword(reverbCommands, 8) == 0xD0A && qword(reverbCommands, 16) == 0x200000006 && qword(reverbCommands, 24) == address(inputChannels[0])); + Require(qword(reverbCommands, 32) == 0xA && qword(reverbCommands, 40) == 0xA0A && qword(reverbCommands, 48) == 0x80A && qword(reverbCommands, 56) == 0x400000008 && qword(reverbCommands, 64) == address(memory + 0xC00)); + Require(qword(reverbCommands, 120) == address(memory + 0x4C00)); + Require(qword(reverbCommands, 128) == ((std::uint64_t{3} << 45) | (std::uint64_t{1} << 40) | (std::uint64_t{1} << 34) | (std::uint64_t{1} << 23) | (std::uint64_t{1} << 21) | (std::uint64_t{1} << 19) | 0xB00)); + Require(qword(reverbCommands, 136) == 0x028000000000000D && qword(reverbCommands, 144) == address(descriptor0) && qword(reverbCommands, 152) == 0x1030A); + Require(qword(descriptor0, 0) == address(memory) && dword(descriptor0, 0xC8) == 3 * 1024 && dword(descriptor0, 0x148) == 4 * 1024 && dword(descriptor0, 0x174) == 256); + reverbInput.blockSize = 512; + filterA.blockSize = 512; + outputA.blockSize = 512; + + reverbInput.currentBlock = 0; + reverbInput.availableBlocks = 0; + reverbBatch = {reverbCommands, 0, 0x280 + 175}; + Require(reverb(1, reverbFilters, reverbOutputs) == static_cast(0x81940009) && ringIs(3, 1)); + Require(reverbBatch.offset == 0 && reverbBatch.buffer_size == 0x280 + 175); + reverbBatch = {reverbCommands, 0, sizeof(reverbCommands)}; + samplesA[1] = memory + 0xB084; + Require(reverb(1, reverbFilters, reverbOutputs) == static_cast(0x8194000A)); + samplesA[1] = memory + 0xB080; + outputA.channelCount = 1; + Require(reverb(1, reverbFilters, reverbOutputs) == BadPointer); + filterA.channelCount = 3; + 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); Require(sceAcmBatchStartBuffer(context1, nullptr, 0, nullptr, &batch1) == BadContext); diff --git a/core/libs/tests/GuestAgcDriverResources.cpp b/core/libs/tests/GuestAgcDriverResources.cpp index eafe67b86eaa..5db1d6d200aa 100644 --- a/core/libs/tests/GuestAgcDriverResources.cpp +++ b/core/libs/tests/GuestAgcDriverResources.cpp @@ -1,5 +1,6 @@ #include "prx/libSceAgcDriver/State/include/Status.hpp" #include "prx/libSceAgcDriver/Resource/include/Registration.hpp" +#include "prx/libSceAgcDriver/Resource/include/Lifecycle.hpp" #include "prx/libSceAgcDriver/include/AgcDriver.hpp" #include "SceTypes.hpp" #include @@ -7,6 +8,7 @@ #include #include #include +#include #include static constexpr int Unavailable = static_cast(0x8A6C9018); @@ -52,6 +54,10 @@ int main() { Require(sceAgcDriverGetDefaultOwner(&owner) == Unavailable && owner == 7u); std::uint32_t maxNameLength = 8u; Require(sceAgcDriverGetResourceRegistrationMaxNameLength(&maxNameLength) == 0 && maxNameLength == 0xfcu); + bool nullLengthRejected = false; + try { sceAgcDriverGetResourceRegistrationMaxNameLength(nullptr); } + catch (const std::invalid_argument&) { nullLengthRejected = true; } + Require(nullLengthRejected); const char* name = "unchanged"; Require(sceAgcDriverGetOwnerName(owner, &name) == Unavailable); Require(sceAgcDriverGetResourceName(resource, &name) == Unavailable); @@ -67,30 +73,63 @@ int main() { Require(sceAgcDriverGetResourceShaderGuid(resource, guid) == Unavailable); Require(sceAgcDriverFindResourcesPublic(nullptr, nullptr) == Unavailable); Require(sceAgcDriverUnregisterAllResourcesForOwner(owner) == Unavailable); + Require(sceAgcDriverUnregisterOwnerAndResources(owner) == Unavailable); + Require(sceAgcDriverUnregisterOwnerAndResources(0u) == Unavailable); + Require(sceAgcDriverUnregisterResource(resource) == Unavailable); + Require(sceAgcDriverUnregisterResource(0u) == Unavailable); Require(std::string_view(name) == "unchanged"); constexpr int InvalidStream = static_cast(0x8A6C0033); constexpr int NullStream = static_cast(0x8A6C0035); constexpr int StreamNotRegistered = static_cast(0x8A6C003A); + Require(!AgcDriverWorkloadStreamRegistered_nid_postfix(0u)); + Require(!AgcDriverWorkloadStreamRegistered_nid_postfix(1u)); + Require(!AgcDriverWorkloadStreamRegistered_nid_postfix(2u)); + Require(!AgcDriverWorkloadStreamRegistered_nid_postfix(31u)); + Require(!AgcDriverWorkloadStreamRegistered_nid_postfix(32u)); for (const std::uint32_t id : {0u, 32u, 0x101u, 0xffffffffu}) { Require(sceAgcDriverRegisterWorkloadStream(id, memory) == InvalidStream); Require(sceAgcDriverRegisterWorkloadStream(id, nullptr) == InvalidStream); Require(sceAgcDriverUnregisterWorkloadStream(id) == InvalidStream); + Require(!AgcDriverWorkloadStreamRegistered_nid_postfix(id)); } Require(sceAgcDriverRegisterWorkloadStream(2u, nullptr) == NullStream); + Require(!AgcDriverWorkloadStreamRegistered_nid_postfix(2u)); Require(sceAgcDriverUnregisterWorkloadStream(2u) == StreamNotRegistered); + Require(!AgcDriverWorkloadStreamRegistered_nid_postfix(2u)); Require(sceAgcDriverRegisterWorkloadStream(1u, memory) == 0); + Require(AgcDriverWorkloadStreamRegistered_nid_postfix(1u)); + Require(!AgcDriverWorkloadStreamRegistered_nid_postfix(2u)); + Require(!AgcDriverWorkloadStreamRegistered_nid_postfix(31u)); Require(sceAgcDriverRegisterWorkloadStream(1u, memory) == InvalidStream); Require(sceAgcDriverRegisterWorkloadStream(1u, nullptr) == InvalidStream); + Require(AgcDriverWorkloadStreamRegistered_nid_postfix(1u)); Require(sceAgcDriverRegisterWorkloadStream(31u, reinterpret_cast(memory) + 1) == 0); + Require(AgcDriverWorkloadStreamRegistered_nid_postfix(1u)); + Require(AgcDriverWorkloadStreamRegistered_nid_postfix(31u)); Require(sceAgcDriverUnregisterWorkloadStream(1u) == 0); + Require(!AgcDriverWorkloadStreamRegistered_nid_postfix(1u)); + Require(AgcDriverWorkloadStreamRegistered_nid_postfix(31u)); Require(sceAgcDriverUnregisterWorkloadStream(1u) == StreamNotRegistered); + Require(!AgcDriverWorkloadStreamRegistered_nid_postfix(1u)); Require(sceAgcDriverRegisterWorkloadStream(1u, memory) == 0); + Require(AgcDriverWorkloadStreamRegistered_nid_postfix(1u)); Require(sceAgcDriverUnregisterWorkloadStream(1u) == 0); + Require(!AgcDriverWorkloadStreamRegistered_nid_postfix(1u)); Require(sceAgcDriverUnregisterWorkloadStream(31u) == 0); + Require(!AgcDriverWorkloadStreamRegistered_nid_postfix(31u)); Require(!sceAgcDriverIsCaptureInProgress()); Require(!sceAgcDriverIsTraceInProgress()); Require(!sceAgcDriverIsSubmitValidationEnabled()); + constexpr int CaptureUnavailable = static_cast(0x8A6C1000); + Require(sceAgcDriverRequestCaptureStart(nullptr) == CaptureUnavailable); + Require(sceAgcDriverRequestCaptureStart("capture.trace") == CaptureUnavailable); + Require(sceAgcDriverRequestCaptureStop() == CaptureUnavailable); + Require(sceAgcDriverTriggerCapture() == CaptureUnavailable); Require(sceAgcDriverRegisterOwnerForSystem() == Unavailable); Require(sceAgcDriverInitResourceRegistrationInterface() == Unavailable); Require(sceAgcDriverSetResourceRegistrationInfo() == 0); + Require(sceAgcDriverInitResourceRegistration() == 0); + std::uint64_t userMemSize = 0; + Require(sceAgcDriverQueryResourceRegistrationUserMemoryRequirements(&userMemSize) == 0 && userMemSize == 0x4000ull); + Require(sceAgcDriverQueryResourceRegistrationUserMemoryRequirements(nullptr) == 0x80020065u); } diff --git a/core/libs/tests/GuestAjm.cpp b/core/libs/tests/GuestAjm.cpp index 6eff989cdd1b..35ad71e3464e 100644 --- a/core/libs/tests/GuestAjm.cpp +++ b/core/libs/tests/GuestAjm.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #ifdef _WIN32 @@ -2007,7 +2008,7 @@ void TestConsoleBufferJobs(std::uint32_t context) { Require(BatchWord(batch, 40) == (3u | (0x2000u << 6)) && BatchWord(batch, 44) == 0x6001 && BatchWord(batch, 48) == 18); at = sceAjmBatchJobRunBufferRa(at, instance, version | sidebandStream | runMultipleFrames, stream.data(), 1024, pcm.data(), 1024 * 2, &single, sizeof(single), nullptr); Require(at == batch.data() + 128); - Require(BatchWord(batch, 68) == 56 && BatchWord(batch, 72) == 1 && BatchWord(batch, 88) == (4u | (0x8000u << 6)) && BatchWord(batch, 96) == 17 && BatchWord(batch, 112) == 18); + Require(BatchWord(batch, 68) == 56 && BatchWord(batch, 72) == 0xCDCDCDC1 && BatchWord(batch, 88) == (0xCC000004u | (0x8000u << 6)) && BatchWord(batch, 96) == 0xCDCDCDD1 && BatchWord(batch, 112) == 0xCDCDCDD2); at = sceAjmBatchJobRunSplitBufferRa(at, instance, version | sidebandStream | runMultipleFrames, inputs, 2, outputs, 2, &split, sizeof(split), nullptr); Require(at == batch.data() + 224 && BatchWord(batch, 132) == 88); Require(StartBuffer(context, batch.data(), static_cast(at) - batch.data()) == 0); @@ -2105,7 +2106,7 @@ void TestConsoleHandWrittenJobs(std::uint32_t context) { using InlineBuffer = void* (APS5_VABI*)(void*, const void*, std::size_t, const void**); -InlineBuffer ResolveInlineBuffer(const char* library, const char* name) { +void* ResolveExport(const char* library, const char* name) { #ifdef _WIN32 const HMODULE module = LoadLibraryA(library); Require(module != nullptr); @@ -2119,7 +2120,7 @@ InlineBuffer ResolveInlineBuffer(const char* library, const char* name) { std::fprintf(stderr, "%s is not exported by %s\n", name, library ? library : "libSceAjm.native.prx"); std::abort(); } - return reinterpret_cast(symbol); + return symbol; } void TestInlineBufferLayout(InlineBuffer inlineBuffer) { @@ -2141,9 +2142,9 @@ void TestConsoleInlineBuffer(std::uint32_t context, const char* ajmiLibrary) { #else const char* nativeLibrary = nullptr; #endif - const InlineBuffer inlineBuffer = ResolveInlineBuffer(nativeLibrary, "sceAjmBatchJobInlineBuffer"); + const InlineBuffer inlineBuffer = reinterpret_cast(ResolveExport(nativeLibrary, "sceAjmBatchJobInlineBuffer")); TestInlineBufferLayout(inlineBuffer); - TestInlineBufferLayout(ResolveInlineBuffer(ajmiLibrary, "sceAjmBatchJobInlineBuffer_nid_disambig1")); + TestInlineBufferLayout(reinterpret_cast(ResolveExport(ajmiLibrary, "sceAjmBatchJobInlineBuffer_nid_disambig1"))); const void* address = nullptr; std::vector stream(1024, 0); @@ -2165,6 +2166,58 @@ void TestConsoleInlineBuffer(std::uint32_t context, const char* ajmiLibrary) { Require(sceAjmInstanceDestroy(context, instance) == 0); } +using RunBufferRa = void* (APS5_VABI*)(void*, std::uint32_t, std::uint64_t, const void*, std::size_t, void*, std::size_t, void*, std::size_t, void*); + +std::uint64_t BatchPointer(const std::vector& batch, std::size_t offset) { + std::uint64_t value = 0; + std::memcpy(&value, batch.data() + offset, sizeof(value)); + return value; +} + +void TestRunBufferRaLayout(RunBufferRa runBufferRa) { + std::uint8_t input[0x40]; + std::uint8_t output[0x80]; + std::uint8_t sideband[0x20]; + std::uint8_t returnAddress[1]; + const auto address = [](const void* pointer) { return static_cast(reinterpret_cast(pointer)); }; + + std::vector batch(0x60, 0xCC); + Require(runBufferRa(batch.data(), 0x12345, 0x0000000300000002, input, sizeof(input), output, sizeof(output), sideband, sizeof(sideband), returnAddress) == batch.data() + 0x50); + Require(BatchWord(batch, 0x00) == 0xCC48D140 && BatchWord(batch, 0x04) == 0x48); + Require(BatchWord(batch, 0x08) == 0xCCCCCCC6 && BatchWord(batch, 0x0C) == 0 && BatchPointer(batch, 0x10) == address(returnAddress)); + Require(BatchWord(batch, 0x18) == 0xCCCCCCC1 && BatchWord(batch, 0x1C) == 0x40 && BatchPointer(batch, 0x20) == address(input)); + Require(BatchWord(batch, 0x28) == 0xCC000004 && BatchWord(batch, 0x2C) == 2); + Require(BatchWord(batch, 0x30) == 0xCCCCCCD1 && BatchWord(batch, 0x34) == 0x80 && BatchPointer(batch, 0x38) == address(output)); + Require(BatchWord(batch, 0x40) == 0xCCCCCCD2 && BatchWord(batch, 0x44) == 0x20 && BatchPointer(batch, 0x48) == address(sideband)); + Require(std::all_of(batch.begin() + 0x50, batch.end(), [](std::uint8_t byte) { return byte == 0xCC; })); + + std::fill(batch.begin(), batch.end(), 0xCC); + Require(runBufferRa(batch.data(), 0x12345, 0x0000000300000002, input, sizeof(input), output, sizeof(output), sideband, sizeof(sideband), nullptr) == batch.data() + 0x40); + Require(BatchWord(batch, 0x00) == 0xCC48D140 && BatchWord(batch, 0x04) == 0x38); + Require(BatchWord(batch, 0x08) == 0xCCCCCCC1 && BatchWord(batch, 0x0C) == 0x40 && BatchPointer(batch, 0x10) == address(input)); + Require(BatchWord(batch, 0x18) == 0xCC000004 && BatchWord(batch, 0x1C) == 2); + Require(BatchWord(batch, 0x20) == 0xCCCCCCD1 && BatchWord(batch, 0x30) == 0xCCCCCCD2); + + const std::pair masked[] = { + {0xFFFFFFFFFFFFFFFF, 0xCC38000400001FFF}, + {0x0000800000001001, 0xCC20000400001001}, + {0x0000200000000000, 0xCC08000400000000}, + {0x0000400000000000, 0xCC10000400000000}, + {0xFFFF1FFFFFFFE000, 0xCC00000400000000}, + }; + for (const auto& [flags, words] : masked) { + std::fill(batch.begin(), batch.end(), 0xCC); + Require(runBufferRa(batch.data(), 0xABCDEF, flags, input, sizeof(input), output, sizeof(output), sideband, sizeof(sideband), nullptr) == batch.data() + 0x40); + Require(BatchWord(batch, 0x00) == 0xCEF37BC0); + Require(BatchWord(batch, 0x18) == static_cast(words >> 32) && BatchWord(batch, 0x1C) == static_cast(words)); + } +} + +void TestConsoleRunBufferRa(const char* ajmiLibrary) { + TestRunBufferRaLayout(sceAjmBatchJobRunBufferRa); + TestRunBufferRaLayout(reinterpret_cast(ResolveExport(ajmiLibrary, "sceAjmBatchJobRunBufferRa_nid_disambig1"))); +} + int StartBufferRefused(std::uint32_t context, const void* batch, std::size_t size, AjmBatchError& error) { std::uint32_t id = 0; error = AjmBatchError{}; @@ -2563,6 +2616,7 @@ int main(int argc, char** argv) { TestConsoleBufferJobs(context); TestConsoleHandWrittenJobs(context); TestConsoleInlineBuffer(context, argv[1]); + TestConsoleRunBufferRa(argv[1]); TestConsoleBufferEdges(context); TestConsoleEmptyBatch(context); TestConsoleSingleFrameRun(context); diff --git a/core/libs/tests/GuestAllocatingStrings.cpp b/core/libs/tests/GuestAllocatingStrings.cpp index 9bcaf276858b..795209a327e8 100644 --- a/core/libs/tests/GuestAllocatingStrings.cpp +++ b/core/libs/tests/GuestAllocatingStrings.cpp @@ -1,5 +1,7 @@ #include "prx/libc/include/Api.hpp" #include "prx/libc/include/ApplicationHeap.hpp" +#include "prx/libc/include/General.hpp" +#include "prx/libkernel/include/Api.hpp" #include "prx/libc/include/general/VabiMacros.hpp" #include "SceTypes.hpp" #include @@ -8,6 +10,13 @@ #include #include #include +#ifdef _WIN32 +#include +#include +#else +#include +#include +#endif namespace { @@ -52,7 +61,7 @@ void InitializeHeap() { ApplicationHeapInitialize_nid_no_patch(process.data()); } -int CallVasprintf(char** destination, const char* format, ...) { +static int APS5_VABI CallVasprintf(char** destination, const char* format, ...) { #ifdef _WIN32 __builtin_sysv_va_list args; __builtin_sysv_va_start(args, format); @@ -69,6 +78,23 @@ int CallVasprintf(char** destination, const char* format, ...) { return result; } +static int APS5_VABI CallVdprintf(int descriptor, const char* format, ...) { +#ifdef _WIN32 + __builtin_sysv_va_list args; + __builtin_sysv_va_start(args, format); +#else + std::va_list args; + va_start(args, format); +#endif + const int result = vdprintf_nid_postfix(descriptor, format, reinterpret_cast(args)); +#ifdef _WIN32 + __builtin_sysv_va_end(args); +#else + va_end(args); +#endif + return result; +} + } int main() { @@ -118,6 +144,123 @@ int main() { Require(std::strcmp(allocated, "value=42 ok") == 0); free_nid_postfix(allocated); + *__error_nid_postfix() = 0; + Require(dprintf_nid_postfix(-1, "test") == -1); + Require(*__error_nid_postfix() == 9); + + *__error_nid_postfix() = 0; + Require(CallVdprintf(-1, "test") == -1); + Require(*__error_nid_postfix() == 9); + + *__error_nid_postfix() = 0; + Require(dprintf_nid_postfix(1, nullptr) == -1); + Require(*__error_nid_postfix() == 22); + + *__error_nid_postfix() = 0; + Require(CallVdprintf(1, nullptr) == -1); + Require(*__error_nid_postfix() == 22); + + const char tempFile[] = "guest_allocating_strings_dprintf.tmp"; +#ifdef _WIN32 + const int fd = ::_open(tempFile, _O_CREAT | _O_TRUNC | _O_RDWR | _O_BINARY, 0600); +#else + const int fd = ::open(tempFile, O_CREAT | O_TRUNC | O_RDWR, 0600); +#endif + Require(fd >= 0); + + Require(dprintf_nid_postfix(fd, "") == 0); + + const int dwritten = dprintf_nid_postfix(fd, "hello %d %s\n", 123, "world"); + Require(dwritten == 16); + + const int vdwritten = CallVdprintf(fd, "pi=%.2f\n", 3.14159); + Require(vdwritten == 8); + +#ifdef _WIN32 + Require(::_lseek(fd, 0, SEEK_SET) == 0); + char readBuffer[64]{}; + const int readBytes = ::_read(fd, readBuffer, sizeof(readBuffer)); + Require(readBytes == 24); + ::_close(fd); + ::_unlink(tempFile); +#else + Require(::lseek(fd, 0, SEEK_SET) == 0); + char readBuffer[64]{}; + const int readBytes = static_cast(::read(fd, readBuffer, sizeof(readBuffer))); + Require(readBytes == 24); + ::close(fd); + ::unlink(tempFile); +#endif + Require(std::memcmp(readBuffer, "hello 123 world\npi=3.14\n", 24) == 0); + + *__error_nid_postfix() = 0; + Require(dprintf_nid_postfix(fd, "closed") == -1); + Require(*__error_nid_postfix() == 9); + + *__error_nid_postfix() = 0; + Require(dprintf_nid_postfix(99999, "invalid") == -1); + Require(*__error_nid_postfix() == 24); + + *__error_nid_postfix() = 0; + Require(dprintf_nid_postfix(32767, "invalid") == -1); + Require(*__error_nid_postfix() == 9); + + Require(dprintf_nid_postfix(1, "") == 0); + Require(dprintf_nid_postfix(2, "") == 0); + + const char guestFile[] = "guest_allocating_strings_guest.tmp"; + const int guestFd = open_nid_postfix(guestFile, 0x202, 0644); + Require(guestFd >= 0); + Require(dprintf_nid_postfix(guestFd, "guest %d %s\n", 99, "ok") == 12); + close_nid_postfix(guestFd); + const int readFd = open_nid_postfix(guestFile, 0, 0); + Require(readFd >= 0); + char guestReadBuf[32]{}; + Require(read_nid_postfix(readFd, guestReadBuf, sizeof(guestReadBuf)) == 12); + Require(std::strcmp(guestReadBuf, "guest 99 ok\n") == 0); + close_nid_postfix(readFd); + unlink_nid_postfix(guestFile); + + int pair[2] = {-1, -1}; + Require(socketpair_nid_postfix(1, 1, 0, pair) == 0); + Require(dprintf_nid_postfix(pair[0], "socket %d %s\n", 777, "peer") == 16); + char sockReadBuf[32]{}; + Require(read_nid_postfix(pair[1], sockReadBuf, sizeof(sockReadBuf)) == 16); + Require(std::strcmp(sockReadBuf, "socket 777 peer\n") == 0); + close_nid_postfix(pair[0]); + close_nid_postfix(pair[1]); + + static int shortState = 0; + const auto origHook = LibcGetGuestWriteHook_nid_no_patch(); + + LibcSetGuestWriteHook_nid_no_patch(+[](int, const void*, std::size_t count) APS5_VABI -> std::int64_t { + if (shortState++ == 0 && count > 5) return 5; + return static_cast(count); + }); + shortState = 0; + Require(dprintf_nid_postfix(1, "abcdefghijk") == 11); + Require(shortState == 2); + + LibcSetGuestWriteHook_nid_no_patch(+[](int, const void*, std::size_t count) APS5_VABI -> std::int64_t { + if (shortState++ == 0 && count > 5) return 5; + errno = 5; + return -1; + }); + shortState = 0; + *__error_nid_postfix() = 0; + Require(dprintf_nid_postfix(1, "abcdefghijk") == -1); + Require(*__error_nid_postfix() == 5); + + LibcSetGuestWriteHook_nid_no_patch(+[](int, const void*, std::size_t) APS5_VABI -> std::int64_t { + errno = 35; + return -1; + }); + *__error_nid_postfix() = 0; + Require(dprintf_nid_postfix(1, "nonblocking") == -1); + Require(*__error_nid_postfix() == 35); + + LibcSetGuestWriteHook_nid_no_patch(origHook); + failAllocation = true; allocated = nullptr; *__error_nid_postfix() = 0; @@ -126,5 +269,11 @@ int main() { Require(allocated == nullptr); failAllocation = false; + failAllocation = true; + *__error_nid_postfix() = 0; + Require(dprintf_nid_postfix(1, "fail %d", 1) == -1); + Require(*__error_nid_postfix() == 12); + failAllocation = false; + return 0; } diff --git a/core/libs/tests/GuestAllocatorFailures.cpp b/core/libs/tests/GuestAllocatorFailures.cpp index f38e1a1e2d65..7e808ea04033 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/GuestAmpr.cpp b/core/libs/tests/GuestAmpr.cpp index 8e116bf392a8..05e617348e05 100644 --- a/core/libs/tests/GuestAmpr.cpp +++ b/core/libs/tests/GuestAmpr.cpp @@ -468,6 +468,13 @@ void TestVersionedCommands() { Require(sceAmprMeasureCommandSizeWriteAddressFromCounterPair_04_00(&pair, 11) == rejected); Require(sceAmprMeasureCommandSizeWaitOnAddress_04_00(&value, 0, 6, 1) == sizeof(Apr::WaitCommand)); Require(sceAmprMeasureCommandSizeWriteAddressFromCounterPair_04_00(&pair, 10) == sizeof(Apr::WriteAddressFromCounterCommand)); + Require(sceAmprMeasureCommandSizeWriteAddressFromTimeCounterOnCompletion(&time) == sizeof(Apr::WriteAddressFromCounterCommand)); + Require(sceAmprMeasureCommandSizeWriteAddressFromTimeCounterOnCompletion(nullptr) == rejected); + Require(sceAmprMeasureCommandSizeWriteAddressFromCounterOnCompletion(&single, 128) == sizeof(Apr::WriteAddressFromCounterCommand)); + Require(sceAmprMeasureCommandSizeWriteAddressFromCounterOnCompletion(nullptr, 0) == rejected); + Require(sceAmprMeasureCommandSizeWriteAddressFromCounterPairOnCompletion(&pair, 10) == sizeof(Apr::WriteAddressFromCounterCommand)); + Require(sceAmprMeasureCommandSizeWriteAddressFromCounterPairOnCompletion(&pair, 11) == rejected); + Require(sceAmprMeasureCommandSizeWriteAddressFromCounterPairOnCompletion(nullptr, 10) == rejected); } void SubmitWithin10Seconds(const Recorder& recorder) { @@ -756,6 +763,45 @@ void TestResolveForEachVariants() { std::remove(paths[0]); } +void TestPrefixedResolveWithoutSizes() { + std::uint32_t probe = 0; + const std::string prefix = "ampr_ids_" + std::to_string(reinterpret_cast(&probe)) + "_"; + { std::ofstream file(prefix + "first.bin", std::ios::binary); file << "aaaa"; } + { std::ofstream file(prefix + "second.bin", std::ios::binary); file << "bb"; } + const char* names[]{"first.bin", "second.bin"}; + std::uint32_t ids[]{0x123456, 0x123456}; + std::uint32_t failed = 99; + Require(sceKernelAprResolveFilepathsWithPrefixToIds(prefix.c_str(), names, 2, ids, &failed) == 0); + Require(ids[0] != 0xffffffffu && ids[0] != 0x123456 && ids[1] != 0xffffffffu && ids[1] != 0x123456 && ids[0] != ids[1]); + Require(failed == 99); + std::uint32_t sizedIds[]{0x123456, 0x123456}; + std::uint64_t sizes[]{0, 0}; + Require(sceKernelAprResolveFilepathsWithPrefixToIdsAndFileSizes(prefix.c_str(), names, 2, sizedIds, sizes, &failed) == 0); + Require(sizedIds[0] == ids[0] && sizedIds[1] == ids[1] && sizes[0] == 4 && sizes[1] == 2); + const char* mixed[]{"first.bin", "missing.bin", "second.bin"}; + std::uint32_t mid[]{0x123456, 0x123456, 0x123456}; + failed = 99; + *__error_nid_postfix() = 0; + Require(sceKernelAprResolveFilepathsWithPrefixToIds(prefix.c_str(), mixed, 3, mid, &failed) == -1); + Require(*__error_nid_postfix() == 2 && failed == 1 && mid[0] == ids[0] && mid[1] == 0xffffffffu && mid[2] == 0x123456); + Require(sceKernelAprResolveFilepathsWithPrefixToIds(prefix.c_str(), mixed, 3, mid, nullptr) == -1); + Require(*__error_nid_postfix() == 2); + const char* nulled[]{"first.bin", nullptr}; + std::uint32_t dropped[]{0x123456, 0x123456}; + failed = 99; + Require(sceKernelAprResolveFilepathsWithPrefixToIds(prefix.c_str(), nulled, 2, dropped, &failed) == -1); + Require(*__error_nid_postfix() == 2 && failed == 1 && dropped[0] == ids[0] && dropped[1] == 0xffffffffu); + *__error_nid_postfix() = 0; + Require(sceKernelAprResolveFilepathsWithPrefixToIds(nullptr, names, 1, ids, &failed) == -1 && *__error_nid_postfix() == 22); + Require(sceKernelAprResolveFilepathsWithPrefixToIds(prefix.c_str(), nullptr, 1, ids, &failed) == -1 && *__error_nid_postfix() == 22); + Require(sceKernelAprResolveFilepathsWithPrefixToIds(prefix.c_str(), names, 1, nullptr, &failed) == -1 && *__error_nid_postfix() == 22); + std::uint32_t untouched[]{0x123456}; + Require(sceKernelAprResolveFilepathsWithPrefixToIds(prefix.c_str(), names, 0, untouched, &failed) == 0); + Require(untouched[0] == 0x123456 && failed == 1); + std::remove((prefix + "first.bin").c_str()); + std::remove((prefix + "second.bin").c_str()); +} + void TestMalformedCommandSizes() { const auto requireFailure = [](const void* record, std::size_t recordBytes, std::uint32_t bufferBytes, const char* expected) { std::array memory{}; @@ -1767,6 +1813,7 @@ int main() { TestReadAtUnseekableOffsetThrows(); TestResolveFailures(); TestResolveForEachVariants(); + TestPrefixedResolveWithoutSizes(); TestMalformedCommandSizes(); TestResolveSymbolicLink(); TestGatherScatter(); diff --git a/core/libs/tests/GuestAmprDivAndBufferSize.cpp b/core/libs/tests/GuestAmprDivAndBufferSize.cpp new file mode 100644 index 000000000000..8d3d4376d5b9 --- /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 000000000000..5da2765a3c85 --- /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 cc0566661dcd..59c07bcff866 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 df94affd4a3f..5dea9e7bdd38 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 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 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/GuestAudio3dSpeakerArray.cpp b/core/libs/tests/GuestAudio3dSpeakerArray.cpp index 796ffaa6e7eb..b9e0d285fdf3 100644 --- a/core/libs/tests/GuestAudio3dSpeakerArray.cpp +++ b/core/libs/tests/GuestAudio3dSpeakerArray.cpp @@ -43,6 +43,15 @@ int main() { AudioOut2SpeakerArrayHandle handle = nullptr; Require(sceAudio3dCreateSpeakerArray(nullptr, ¶meters) == INVALID_PARAMETER, "null handle is an invalid parameter"); Require(sceAudio3dCreateSpeakerArray(&handle, nullptr) == INVALID_PARAMETER, "null parameters are an invalid parameter"); + Audio3dSpeakerArrayParameters zeroSpeakers = parameters; + zeroSpeakers.numSpeakers = 0; + RequireThrows([&] { sceAudio3dCreateSpeakerArray(&handle, &zeroSpeakers); }, "zero speakers parameter is rejected"); + Audio3dSpeakerArrayParameters nullPositions = parameters; + nullPositions.positions = nullptr; + RequireThrows([&] { sceAudio3dCreateSpeakerArray(&handle, &nullPositions); }, "null positions parameter is rejected"); + Audio3dSpeakerArrayParameters nullMemory = parameters; + nullMemory.memory = nullptr; + RequireThrows([&] { sceAudio3dCreateSpeakerArray(&handle, &nullMemory); }, "null memory parameter is rejected"); Require(handle == nullptr, "a rejected create leaves the handle"); Require(sceAudio3dCreateSpeakerArray(&handle, ¶meters) == 0, "create succeeds without ambisonics parameters"); Require(handle != nullptr, "create stores the handle"); diff --git a/core/libs/tests/GuestAudiodecAjmContext.cpp b/core/libs/tests/GuestAudiodecAjmContext.cpp new file mode 100644 index 000000000000..a8ae6deb3f5c --- /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 000000000000..dcec0a0aa24e --- /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 6b757d9121ce..a06a85b42ecd 100644 --- a/core/libs/tests/GuestAvPlayer.cpp +++ b/core/libs/tests/GuestAvPlayer.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -1263,6 +1264,27 @@ void TestRestartAfterPausedJumpKeepsClockRunning() { Check(sceAvPlayerClose(player) == 0, "close failed"); } +void TestJumpPastTheLatestTimeReportsTheDuration() { + Events events; + AvPlayerInitData init = InitData(&events); + auto* player = sceAvPlayerInit(&init); + Check(player != nullptr, "init failed"); + Check(sceAvPlayerAddSource(player, "/app0/avplayer.mp4") == 0, "add source failed"); + std::uint64_t duration = 0; + for (const auto stream : {VideoStream, EnglishAudioStream}) { + AvPlayerStreamInfo info{}; + Check(sceAvPlayerGetStreamInfo(player, stream, &info) == 0, "stream info failed"); + duration = std::max(duration, info.duration); + } + Check(sceAvPlayerEnableStream(player, VideoStream) == 0, "enable video failed"); + Check(sceAvPlayerEnableStream(player, EnglishAudioStream) == 0, "enable audio failed"); + Check(sceAvPlayerJumpToTime(player, std::numeric_limits::max()) == 0, "jump to the latest time failed"); + Check(sceAvPlayerStart(player) == 0, "start failed"); + const auto current = sceAvPlayerCurrentTime(player); + Check(current == duration, "current time " + std::to_string(current) + " after a jump to the latest time, expected the duration " + std::to_string(duration)); + Check(sceAvPlayerClose(player) == 0, "close failed"); +} + void TestPausedPreparationAfterAudioStarts(std::uint32_t syncMode) { Events events; auto init = InitData(&events); @@ -2059,6 +2081,7 @@ int main(int argc, char** argv) { TestPs5ExtendedInitLayout(); TestAutoStartKeepsStartedPlayback(); TestRestartAfterPausedJumpKeepsClockRunning(); + TestJumpPastTheLatestTimeReportsTheDuration(); TestUnsyncedVideoKeepsUpWithAudio(); TestNoSyncVideoCanLeadAudioClock(); TestLoopWarningWaitsForPlayback(); diff --git a/core/libs/tests/GuestAvailableCpumask.cpp b/core/libs/tests/GuestAvailableCpumask.cpp index 1450a36bce27..8dfead909da8 100644 --- a/core/libs/tests/GuestAvailableCpumask.cpp +++ b/core/libs/tests/GuestAvailableCpumask.cpp @@ -34,13 +34,16 @@ static constexpr int GUEST_EFAULT = 14; static constexpr int GUEST_ERANGE = 34; static KernelCpumask ReadCpuset(Pthread thread) { - std::uint8_t cpuset[GUEST_CPUSET_BYTES + 8]; + constexpr std::size_t widest = 16; + std::uint8_t cpuset[widest + 8]; std::memset(cpuset, 0xAB, sizeof(cpuset)); - Require(pthread_getaffinity_np_nid_postfix(thread, GUEST_CPUSET_BYTES, cpuset) == 0); - for (std::size_t i = sizeof(KernelCpumask); i < GUEST_CPUSET_BYTES; ++i) Require(cpuset[i] == 0); - for (std::size_t i = GUEST_CPUSET_BYTES; i < sizeof(cpuset); ++i) Require(cpuset[i] == 0xAB); + Require(pthread_getaffinity_np_nid_postfix(thread, widest, cpuset) == 0); + for (std::size_t i = sizeof(KernelCpumask); i < widest; ++i) Require(cpuset[i] == 0); + for (std::size_t i = widest; i < sizeof(cpuset); ++i) Require(cpuset[i] == 0xAB); KernelCpumask mask = 0; std::memcpy(&mask, cpuset, sizeof(mask)); + KernelCpumask narrow = ~KernelCpumask{0}; + Require(pthread_getaffinity_np_nid_postfix(thread, sizeof(narrow), &narrow) == 0 && narrow == mask); return mask; } @@ -277,11 +280,11 @@ int main() { Require(ReadCpuset(pthread_self_nid_postfix()) == available); std::uint8_t rawSet[GUEST_CPUSET_BYTES]{}; - for (const std::size_t size : {std::size_t{0}, std::size_t{8}, std::size_t{31}, std::size_t{33}, std::size_t{64}}) + for (const std::size_t size : {std::size_t{32}, std::size_t{33}, std::size_t{64}}) Require(pthread_getaffinity_np_nid_postfix(pthread_self_nid_postfix(), size, rawSet) == GUEST_ERANGE); Require(pthread_getaffinity_np_nid_postfix(nullptr, GUEST_CPUSET_BYTES, rawSet) == GUEST_EINVAL); Require(pthread_getaffinity_np_nid_postfix(nullptr, 0, rawSet) == GUEST_EINVAL); - Require(pthread_getaffinity_np_nid_postfix(pthread_self_nid_postfix(), GUEST_CPUSET_BYTES, nullptr) == GUEST_EFAULT); + Require(pthread_getaffinity_np_nid_postfix(pthread_self_nid_postfix(), 16, nullptr) == GUEST_EFAULT); Require(cpuset_getaffinity_nid_postfix(3, 1, scePthreadGetthreadid(), 8, processSet) == 0 && processSet[0] == available); Require(cpuset_getaffinity_nid_postfix(3, 1, 999999, 8, processSet) == -1 && *__error_nid_postfix() == GUEST_ESRCH); Require(cpuset_getaffinity_nid_postfix(3, 2, 999999, 8, processSet) == -1 && *__error_nid_postfix() == GUEST_ESRCH); diff --git a/core/libs/tests/GuestBinaryWord.cpp b/core/libs/tests/GuestBinaryWord.cpp index cfb2f004f034..a9ac191b2f59 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/GuestBoundsChecking.cpp b/core/libs/tests/GuestBoundsChecking.cpp index c0dd517bf2c9..f40aae0255ff 100644 --- a/core/libs/tests/GuestBoundsChecking.cpp +++ b/core/libs/tests/GuestBoundsChecking.cpp @@ -80,8 +80,26 @@ void CheckBsearch() { before = constraintCalls; Require(bsearch_s_nid_postfix(&key, values, 0, tooLarge, CompareInts, &calls) == nullptr, "bsearch_s accepted an oversized element"); RequireViolation(before, "bsearch_s: bad argument", 22); + struct ZeroStrideCase { std::size_t count; int lessCalls; int greaterCalls; }; + const ZeroStrideCase zeroStrideCases[] = {{0, 0, 0}, {1, 1, 1}, {2, 2, 1}, {3, 2, 2}, {4, 3, 2}, {7, 3, 3}, {8, 4, 3}, {15, 4, 4}, {16, 5, 4}, {1023, 10, 10}, {1024, 11, 10}, {tooLarge - 1, 61, 61}}; + for (const auto& entry : zeroStrideCases) for (const int zeroKey : {0, 1, 2}) { + before = constraintCalls; + calls = 0; + *__error_nid_postfix() = 97; + void* result = bsearch_s_nid_postfix(&zeroKey, values, entry.count, 0, CompareInts, &calls); + const void* expected = entry.count != 0 && zeroKey == 1 ? values : nullptr; + const int expectedCalls = zeroKey == 0 ? entry.lessCalls : zeroKey == 2 ? entry.greaterCalls : entry.count != 0; + Require(result == expected && calls == expectedCalls, "bsearch_s zero stride result or comparison count"); + Require(constraintCalls == before && *__error_nid_postfix() == 97, "bsearch_s zero stride invoked a constraint or changed errno"); + } + before = constraintCalls; + calls = 0; + Require(bsearch_s_nid_postfix(&key, values, tooLarge, 0, CompareInts, &calls) == nullptr && calls == 0, "bsearch_s searched an oversized count"); + RequireViolation(before, "bsearch_s: bad argument", 22); + calls = 0; + Require(bsearch_s_nid_postfix(&values[0], values, 1, tooLarge - 1, CompareInts, &calls) == values && calls == 1, "bsearch_s rejected an RSIZE_MAX element size"); before = constraintCalls; - Require(bsearch_s_nid_postfix(&key, values, 7, 0, CompareInts, &calls) == nullptr, "bsearch_s accepted a zero element size"); + Require(bsearch_s_nid_postfix(nullptr, values, 7, 0, CompareInts, &calls) == nullptr, "bsearch_s zero stride accepted a null key"); RequireViolation(before, "bsearch_s: bad argument", 22); } diff --git a/core/libs/tests/GuestCamera.cpp b/core/libs/tests/GuestCamera.cpp index 18afa7bc2695..3c5c99bd8da0 100644 --- a/core/libs/tests/GuestCamera.cpp +++ b/core/libs/tests/GuestCamera.cpp @@ -55,6 +55,14 @@ void CheckClosed() { Require(sceCameraStop(1) == ErrorNotOpen, "stopping before any open must report NOT_OPEN"); Require(sceCameraStopByHandle(1) == ErrorNotOpen, "stopping by handle before any open must report NOT_OPEN"); Require(sceCameraIsValidFrameData(1, &frame) == ErrorNotOpen, "frame validity before any open must report NOT_OPEN"); + CameraConfig config{}; + config.sizeThis = sizeof(CameraConfig); + Require(sceCameraGetConfig(1, &config) == ErrorNotOpen, "getting config before any open must report NOT_OPEN"); + Require(sceCameraGetConfig(0, &config) == ErrorParam, "getting config with handle 0 must be rejected"); + Require(sceCameraGetConfig(1, nullptr) == ErrorParam, "getting config with null pointer must be rejected"); + Require(sceCameraGetDeviceConfig(1, &config) == ErrorNotOpen, "getting device config before any open must report NOT_OPEN"); + Require(sceCameraGetDeviceConfig(0, &config) == ErrorParam, "getting device config with handle 0 must be rejected"); + Require(sceCameraGetDeviceConfig(1, nullptr) == ErrorParam, "getting device config with null pointer must be rejected"); } void CheckOpen() { diff --git a/core/libs/tests/GuestCesIso2022.cpp b/core/libs/tests/GuestCesIso2022.cpp new file mode 100644 index 000000000000..7a73afcd573a --- /dev/null +++ b/core/libs/tests/GuestCesIso2022.cpp @@ -0,0 +1,323 @@ +#include "prx/libSceCesCs/include/Api.hpp" +#include "prx/libc/include/general/VabiMacros.hpp" +#include +#include +#include +#include +#include + +namespace { + +constexpr int invalidParameter = static_cast(0x805C0001); +constexpr int invalidSrcBuffer = static_cast(0x805C0010); +constexpr int invalidDstBuffer = static_cast(0x805C0030); +constexpr int dstBufferEnd = static_cast(0x805C0031); + +void Require(bool value) { if (!value) std::abort(); } + +const std::uint8_t* Bytes(const char* text) { return reinterpret_cast(text); } + +int Encode(void* context, const char* utf8, std::uint8_t* iso, std::uint32_t isoMax, std::uint32_t& used, std::uint32_t& produced) { + return sceCesUtf8StrToIso2022Str(context, Bytes(utf8), static_cast(std::strlen(utf8)), &used, iso, isoMax, &produced); +} + +struct Case { + int profile; + bool encode; + const char* input; + std::uint32_t size; + int result; + std::uint32_t used; + std::uint32_t produced; + const char* output; +}; + +const Case CASES[] = { + {0, true, "\x41", 1, static_cast(0x00000000), 1, 1, "\x41"}, + {0, true, "", 0, static_cast(0x00000000), 0, 0, ""}, + {0, true, "\xE3\x81\x82", 3, static_cast(0x00000000), 3, 8, "\x1B\x24\x42\x24\x22\x1B\x28\x42"}, + {0, true, "\x41\xE3\x81\x82\xC2\xA5\x42\x0A", 8, static_cast(0x00000000), 8, 12, "\x41\x1B\x24\x42\x24\x22\x1B\x28\x42\x5C\x42\x0A"}, + {0, true, "\xE2\x80\xBE\x7E", 4, static_cast(0x805C0020), 3, 1, "\x7E"}, + {0, true, "\xE3\x81\x82\xE3\x81\x84", 6, static_cast(0x00000000), 6, 10, "\x1B\x24\x42\x24\x22\x24\x24\x1B\x28\x42"}, + {0, true, "\xEF\xBD\xB6", 3, static_cast(0x805C0024), 0, 0, ""}, + {0, true, "\xEF\xBD\xB6\xE3\x81\x82", 6, static_cast(0x805C0024), 0, 0, ""}, + {0, true, "\xEF\xBD\xB6\xE3\x81\x82\xEF\xBD\xB6\x41", 10, static_cast(0x805C0024), 0, 0, ""}, + {0, true, "\x5C", 1, static_cast(0x00000000), 1, 8, "\x1B\x24\x42\x21\x40\x1B\x28\x42"}, + {0, true, "\xE3\x81\x82\x0A\xE3\x81\x84", 7, static_cast(0x00000000), 7, 17, "\x1B\x24\x42\x24\x22\x1B\x28\x42\x0A\x1B\x24\x42\x24\x24\x1B\x28\x42"}, + {0, true, "\x1B", 1, static_cast(0x805C0011), 0, 0, ""}, + {0, true, "\x0E", 1, static_cast(0x805C0024), 0, 0, ""}, + {0, true, "\x41\x1B\x42", 3, static_cast(0x805C0015), 1, 1, "\x41"}, + {0, true, "\xF0\x9F\x98\x80", 4, static_cast(0x805C0020), 0, 0, ""}, + {0, true, "\xEF\xBB\xBF", 3, static_cast(0x00000000), 3, 0, ""}, + {0, true, "\xC2\xA2", 2, static_cast(0x00000000), 2, 8, "\x1B\x24\x42\x21\x71\x1B\x28\x42"}, + {0, true, "\xEF\xBD\xB6\x41", 4, static_cast(0x805C0024), 0, 0, ""}, + {0, true, "\xC2\xA5\xE3\x81\x82\xC2\xA5", 7, static_cast(0x00000000), 7, 10, "\x5C\x1B\x24\x42\x24\x22\x1B\x28\x42\x5C"}, + {0, true, "\xEF\xBC\xBC", 3, static_cast(0x805C0020), 0, 0, ""}, + {0, true, "\x41\xC2\x80\x42", 4, static_cast(0x805C0024), 1, 1, "\x41"}, + {0, false, "\x1B\x24\x40\x24\x22\x1B\x28\x42", 8, static_cast(0x805C0011), 5, 3, "\xE3\x81\x82"}, + {0, false, "\x1B\x24\x42\x24\x22", 5, static_cast(0x00000000), 5, 3, "\xE3\x81\x82"}, + {0, false, "\x1B\x24\x42\x24\x22\x1B\x28\x4A", 8, static_cast(0x805C0011), 5, 3, "\xE3\x81\x82"}, + {0, false, "\x1B\x28\x4A\x41", 4, static_cast(0x00000000), 4, 1, "\x41"}, + {0, false, "\x1B\x28\x4A\x41\x1B\x28\x42", 7, static_cast(0x805C0011), 4, 1, "\x41"}, + {0, false, "\x1B\x28\x4A\x5C\x7E\x41\x1B\x28\x42", 9, static_cast(0x805C0011), 6, 6, "\xC2\xA5\xE2\x80\xBE\x41"}, + {0, false, "\x1B\x24\x42\x24\x22\x0A\x24\x24\x1B\x28\x42", 11, static_cast(0x805C0011), 8, 7, "\xE3\x81\x82\x0A\xE3\x81\x84"}, + {0, false, "\x1B\x28\x49\x36", 4, static_cast(0x805C0015), 0, 0, ""}, + {0, false, "\x0E\x36\x0F", 3, static_cast(0x805C0015), 0, 0, ""}, + {0, false, "\x0E\x36\x0F\x41", 4, static_cast(0x805C0015), 0, 0, ""}, + {0, false, "\x0E\x36", 2, static_cast(0x805C0015), 0, 0, ""}, + {0, false, "\x1B\x24\x28\x44\x30\x21", 6, static_cast(0x805C0015), 0, 0, ""}, + {0, false, "\x1B\x24", 2, static_cast(0x805C0011), 0, 0, ""}, + {0, false, "\x1B\x24\x42\x24", 4, static_cast(0x805C0011), 0, 0, ""}, + {0, false, "\x1B\x28\x5A", 3, static_cast(0x805C0011), 0, 0, ""}, + {0, false, "\xB6", 1, static_cast(0x805C0014), 0, 0, ""}, + {0, false, "\x1B\x24\x42\x29\x21", 5, static_cast(0x805C0020), 0, 0, ""}, + {0, false, "\x1B\x24\x42\x24\x7F", 5, static_cast(0x00000000), 5, 3, "\xE3\x82\xA1"}, + {0, false, "\x1B\x28\x49\x36\x1B\x28\x42", 7, static_cast(0x805C0015), 0, 0, ""}, + {0, false, "\x1B\x28\x49\x60", 4, static_cast(0x805C0015), 0, 0, ""}, + {0, false, "\x5C\x7E", 2, static_cast(0x00000000), 2, 5, "\xC2\xA5\xE2\x80\xBE"}, + {0, false, "\x41\x1B\x28\x42", 4, static_cast(0x805C0011), 1, 1, "\x41"}, + {0, false, "\x41\x1B\x24\x42\x24\x22\x1B\x28\x42", 9, static_cast(0x805C0011), 6, 4, "\x41\xE3\x81\x82"}, + {0, false, "\x41\x1B\x24\x42\x24\x22\x24\x24", 8, static_cast(0x00000000), 8, 7, "\x41\xE3\x81\x82\xE3\x81\x84"}, + {0, false, "\x1B\x24\x42\x24\x22\x41", 6, static_cast(0x805C0011), 5, 3, "\xE3\x81\x82"}, + {1, true, "\x41", 1, static_cast(0x00000000), 1, 1, "\x41"}, + {1, true, "", 0, static_cast(0x00000000), 0, 0, ""}, + {1, true, "\xE3\x81\x82", 3, static_cast(0x00000000), 3, 8, "\x1B\x24\x42\x24\x22\x1B\x28\x42"}, + {1, true, "\x41\xE3\x81\x82\xC2\xA5\x42\x0A", 8, static_cast(0x00000000), 8, 13, "\x41\x1B\x24\x42\x24\x22\x21\x6F\x1B\x28\x42\x42\x0A"}, + {1, true, "\xE2\x80\xBE\x7E", 4, static_cast(0x00000000), 4, 9, "\x1B\x24\x42\x21\x31\x1B\x28\x42\x7E"}, + {1, true, "\xE3\x81\x82\xE3\x81\x84", 6, static_cast(0x00000000), 6, 10, "\x1B\x24\x42\x24\x22\x24\x24\x1B\x28\x42"}, + {1, true, "\xEF\xBD\xB6", 3, static_cast(0x00000000), 3, 7, "\x1B\x28\x49\x36\x1B\x28\x42"}, + {1, true, "\xEF\xBD\xB6\xE3\x81\x82", 6, static_cast(0x00000000), 6, 12, "\x1B\x28\x49\x36\x1B\x24\x42\x24\x22\x1B\x28\x42"}, + {1, true, "\xEF\xBD\xB6\xE3\x81\x82\xEF\xBD\xB6\x41", 10, static_cast(0x00000000), 10, 17, "\x1B\x28\x49\x36\x1B\x24\x42\x24\x22\x1B\x28\x49\x36\x1B\x28\x42\x41"}, + {1, true, "\x5C", 1, static_cast(0x00000000), 1, 1, "\x5C"}, + {1, true, "\xE3\x81\x82\x0A\xE3\x81\x84", 7, static_cast(0x00000000), 7, 17, "\x1B\x24\x42\x24\x22\x1B\x28\x42\x0A\x1B\x24\x42\x24\x24\x1B\x28\x42"}, + {1, true, "\x1B", 1, static_cast(0x805C0011), 0, 0, ""}, + {1, true, "\x0E", 1, static_cast(0x805C0024), 0, 0, ""}, + {1, true, "\x41\x1B\x42", 3, static_cast(0x805C0015), 1, 1, "\x41"}, + {1, true, "\xF0\x9F\x98\x80", 4, static_cast(0x805C0020), 0, 0, ""}, + {1, true, "\xEF\xBB\xBF", 3, static_cast(0x00000000), 3, 0, ""}, + {1, true, "\xC2\xA2", 2, static_cast(0x00000000), 2, 8, "\x1B\x24\x42\x21\x71\x1B\x28\x42"}, + {1, true, "\xEF\xBD\xB6\x41", 4, static_cast(0x00000000), 4, 8, "\x1B\x28\x49\x36\x1B\x28\x42\x41"}, + {1, true, "\xC2\xA5\xE3\x81\x82\xC2\xA5", 7, static_cast(0x00000000), 7, 12, "\x1B\x24\x42\x21\x6F\x24\x22\x21\x6F\x1B\x28\x42"}, + {1, true, "\xEF\xBC\xBC", 3, static_cast(0x00000000), 3, 8, "\x1B\x24\x42\x21\x40\x1B\x28\x42"}, + {1, true, "\x41\xC2\x80\x42", 4, static_cast(0x805C0024), 1, 1, "\x41"}, + {1, false, "\x1B\x24\x40\x24\x22\x1B\x28\x42", 8, static_cast(0x805C0011), 5, 3, "\xE3\x81\x82"}, + {1, false, "\x1B\x24\x42\x24\x22", 5, static_cast(0x00000000), 5, 3, "\xE3\x81\x82"}, + {1, false, "\x1B\x24\x42\x24\x22\x1B\x28\x4A", 8, static_cast(0x805C0011), 5, 3, "\xE3\x81\x82"}, + {1, false, "\x1B\x28\x4A\x41", 4, static_cast(0x00000000), 4, 1, "\x41"}, + {1, false, "\x1B\x28\x4A\x41\x1B\x28\x42", 7, static_cast(0x805C0011), 4, 1, "\x41"}, + {1, false, "\x1B\x28\x4A\x5C\x7E\x41\x1B\x28\x42", 9, static_cast(0x805C0011), 6, 3, "\x5C\x7E\x41"}, + {1, false, "\x1B\x24\x42\x24\x22\x0A\x24\x24\x1B\x28\x42", 11, static_cast(0x805C0011), 8, 7, "\xE3\x81\x82\x0A\xE3\x81\x84"}, + {1, false, "\x1B\x28\x49\x36", 4, static_cast(0x00000000), 4, 3, "\xEF\xBD\xB6"}, + {1, false, "\x0E\x36\x0F", 3, static_cast(0x805C0015), 0, 0, ""}, + {1, false, "\x0E\x36\x0F\x41", 4, static_cast(0x805C0015), 0, 0, ""}, + {1, false, "\x0E\x36", 2, static_cast(0x805C0015), 0, 0, ""}, + {1, false, "\x1B\x24\x28\x44\x30\x21", 6, static_cast(0x805C0015), 0, 0, ""}, + {1, false, "\x1B\x24", 2, static_cast(0x805C0011), 0, 0, ""}, + {1, false, "\x1B\x24\x42\x24", 4, static_cast(0x805C0011), 0, 0, ""}, + {1, false, "\x1B\x28\x5A", 3, static_cast(0x805C0011), 0, 0, ""}, + {1, false, "\xB6", 1, static_cast(0x805C0014), 0, 0, ""}, + {1, false, "\x1B\x24\x42\x29\x21", 5, static_cast(0x805C0020), 0, 0, ""}, + {1, false, "\x1B\x24\x42\x24\x7F", 5, static_cast(0x00000000), 5, 3, "\xE3\x82\xA1"}, + {1, false, "\x1B\x28\x49\x36\x1B\x28\x42", 7, static_cast(0x805C0011), 4, 3, "\xEF\xBD\xB6"}, + {1, false, "\x1B\x28\x49\x60", 4, static_cast(0x805C0020), 0, 0, ""}, + {1, false, "\x5C\x7E", 2, static_cast(0x00000000), 2, 2, "\x5C\x7E"}, + {1, false, "\x41\x1B\x28\x42", 4, static_cast(0x805C0011), 1, 1, "\x41"}, + {1, false, "\x41\x1B\x24\x42\x24\x22\x1B\x28\x42", 9, static_cast(0x805C0011), 6, 4, "\x41\xE3\x81\x82"}, + {1, false, "\x41\x1B\x24\x42\x24\x22\x24\x24", 8, static_cast(0x00000000), 8, 7, "\x41\xE3\x81\x82\xE3\x81\x84"}, + {1, false, "\x1B\x24\x42\x24\x22\x41", 6, static_cast(0x805C0011), 5, 3, "\xE3\x81\x82"}, + {2, true, "\x41", 1, static_cast(0x00000000), 1, 1, "\x41"}, + {2, true, "", 0, static_cast(0x00000000), 0, 0, ""}, + {2, true, "\xE3\x81\x82", 3, static_cast(0x00000000), 3, 8, "\x1B\x24\x42\x24\x22\x1B\x28\x42"}, + {2, true, "\x41\xE3\x81\x82\xC2\xA5\x42\x0A", 8, static_cast(0x00000000), 8, 13, "\x41\x1B\x24\x42\x24\x22\x21\x6F\x1B\x28\x42\x42\x0A"}, + {2, true, "\xE2\x80\xBE\x7E", 4, static_cast(0x00000000), 4, 9, "\x1B\x24\x42\x21\x31\x1B\x28\x42\x7E"}, + {2, true, "\xE3\x81\x82\xE3\x81\x84", 6, static_cast(0x00000000), 6, 10, "\x1B\x24\x42\x24\x22\x24\x24\x1B\x28\x42"}, + {2, true, "\xEF\xBD\xB6", 3, static_cast(0x00000000), 3, 6, "\x0E\x36\x0F\x1B\x28\x42"}, + {2, true, "\xEF\xBD\xB6\xE3\x81\x82", 6, static_cast(0x00000000), 6, 11, "\x0E\x36\x0F\x1B\x24\x42\x24\x22\x1B\x28\x42"}, + {2, true, "\xEF\xBD\xB6\xE3\x81\x82\xEF\xBD\xB6\x41", 10, static_cast(0x00000000), 10, 15, "\x0E\x36\x0F\x1B\x24\x42\x24\x22\x0E\x36\x0F\x1B\x28\x42\x41"}, + {2, true, "\x5C", 1, static_cast(0x00000000), 1, 1, "\x5C"}, + {2, true, "\xE3\x81\x82\x0A\xE3\x81\x84", 7, static_cast(0x00000000), 7, 17, "\x1B\x24\x42\x24\x22\x1B\x28\x42\x0A\x1B\x24\x42\x24\x24\x1B\x28\x42"}, + {2, true, "\x1B", 1, static_cast(0x805C0011), 0, 0, ""}, + {2, true, "\x0E", 1, static_cast(0x805C0024), 0, 0, ""}, + {2, true, "\x41\x1B\x42", 3, static_cast(0x805C0015), 1, 1, "\x41"}, + {2, true, "\xF0\x9F\x98\x80", 4, static_cast(0x805C0020), 0, 0, ""}, + {2, true, "\xEF\xBB\xBF", 3, static_cast(0x00000000), 3, 0, ""}, + {2, true, "\xC2\xA2", 2, static_cast(0x00000000), 2, 8, "\x1B\x24\x42\x21\x71\x1B\x28\x42"}, + {2, true, "\xEF\xBD\xB6\x41", 4, static_cast(0x00000000), 4, 7, "\x0E\x36\x0F\x1B\x28\x42\x41"}, + {2, true, "\xC2\xA5\xE3\x81\x82\xC2\xA5", 7, static_cast(0x00000000), 7, 12, "\x1B\x24\x42\x21\x6F\x24\x22\x21\x6F\x1B\x28\x42"}, + {2, true, "\xEF\xBC\xBC", 3, static_cast(0x00000000), 3, 8, "\x1B\x24\x42\x21\x40\x1B\x28\x42"}, + {2, true, "\x41\xC2\x80\x42", 4, static_cast(0x805C0024), 1, 1, "\x41"}, + {2, false, "\x1B\x24\x40\x24\x22\x1B\x28\x42", 8, static_cast(0x805C0011), 5, 3, "\xE3\x81\x82"}, + {2, false, "\x1B\x24\x42\x24\x22", 5, static_cast(0x00000000), 5, 3, "\xE3\x81\x82"}, + {2, false, "\x1B\x24\x42\x24\x22\x1B\x28\x4A", 8, static_cast(0x805C0011), 5, 3, "\xE3\x81\x82"}, + {2, false, "\x1B\x28\x4A\x41", 4, static_cast(0x00000000), 4, 1, "\x41"}, + {2, false, "\x1B\x28\x4A\x41\x1B\x28\x42", 7, static_cast(0x805C0011), 4, 1, "\x41"}, + {2, false, "\x1B\x28\x4A\x5C\x7E\x41\x1B\x28\x42", 9, static_cast(0x805C0011), 6, 3, "\x5C\x7E\x41"}, + {2, false, "\x1B\x24\x42\x24\x22\x0A\x24\x24\x1B\x28\x42", 11, static_cast(0x805C0011), 8, 7, "\xE3\x81\x82\x0A\xE3\x81\x84"}, + {2, false, "\x1B\x28\x49\x36", 4, static_cast(0x805C0015), 0, 0, ""}, + {2, false, "\x0E\x36\x0F", 3, static_cast(0x805C0011), 2, 3, "\xEF\xBD\xB6"}, + {2, false, "\x0E\x36\x0F\x41", 4, static_cast(0x00000000), 4, 4, "\xEF\xBD\xB6\x41"}, + {2, false, "\x0E\x36", 2, static_cast(0x00000000), 2, 3, "\xEF\xBD\xB6"}, + {2, false, "\x1B\x24\x28\x44\x30\x21", 6, static_cast(0x805C0015), 0, 0, ""}, + {2, false, "\x1B\x24", 2, static_cast(0x805C0011), 0, 0, ""}, + {2, false, "\x1B\x24\x42\x24", 4, static_cast(0x805C0011), 0, 0, ""}, + {2, false, "\x1B\x28\x5A", 3, static_cast(0x805C0011), 0, 0, ""}, + {2, false, "\xB6", 1, static_cast(0x805C0014), 0, 0, ""}, + {2, false, "\x1B\x24\x42\x29\x21", 5, static_cast(0x805C0020), 0, 0, ""}, + {2, false, "\x1B\x24\x42\x24\x7F", 5, static_cast(0x00000000), 5, 3, "\xE3\x82\xA1"}, + {2, false, "\x1B\x28\x49\x36\x1B\x28\x42", 7, static_cast(0x805C0015), 0, 0, ""}, + {2, false, "\x1B\x28\x49\x60", 4, static_cast(0x805C0015), 0, 0, ""}, + {2, false, "\x5C\x7E", 2, static_cast(0x00000000), 2, 2, "\x5C\x7E"}, + {2, false, "\x41\x1B\x28\x42", 4, static_cast(0x805C0011), 1, 1, "\x41"}, + {2, false, "\x41\x1B\x24\x42\x24\x22\x1B\x28\x42", 9, static_cast(0x805C0011), 6, 4, "\x41\xE3\x81\x82"}, + {2, false, "\x41\x1B\x24\x42\x24\x22\x24\x24", 8, static_cast(0x00000000), 8, 7, "\x41\xE3\x81\x82\xE3\x81\x84"}, + {2, false, "\x1B\x24\x42\x24\x22\x41", 6, static_cast(0x805C0011), 5, 3, "\xE3\x81\x82"}, +}; + +void* InitProfile(int profile, std::uint8_t* sheet) { + if (profile == 0) return sceCesUcsProfileInitIso2022JpRfc1468(sheet); + if (profile == 1) return sceCesUcsProfileInitIso2022JpCp50221(sheet); + return sceCesUcsProfileInitIso2022JpCp50222(sheet); +} + +void CheckCases() { + alignas(8) std::uint8_t sheet[64] = {}; + alignas(8) std::uint8_t context[64] = {}; + for (const Case& entry : CASES) { + Require(InitProfile(entry.profile, sheet) == sheet && sceCesIso2022UcsContextInit(context, sheet) == 0); + std::uint8_t out[64]; + std::memset(out, 0xCC, sizeof(out)); + std::uint32_t used = 0x77777777; + std::uint32_t produced = 0x66666666; + const int result = entry.encode ? sceCesUtf8StrToIso2022Str(context, Bytes(entry.input), entry.size, &used, out, sizeof(out), &produced) + : sceCesIso2022StrToUtf8Str(context, Bytes(entry.input), entry.size, &used, out, sizeof(out), &produced); + Require(result == entry.result && used == entry.used && produced == entry.produced && std::memcmp(out, entry.output, produced) == 0); + } +} + +void Fnv(std::uint32_t& hash, std::uint32_t value) { + for (int i = 0; i < 4; ++i) hash = (hash ^ ((value >> (8 * i)) & 0xFF)) * 0x01000193u; +} + +const char* const PREFIXES[] = {"", "\x1B(B", "\x1B(J", "\x1B$@", "\x1B$B", "\x1B(I", "\x1B$(D", "\x1B$A", "\x1B$(Q"}; + +void CheckSweeps(int profile, std::uint32_t encodeHash, std::uint32_t decodeHash) { + alignas(8) std::uint8_t sheet[64] = {}; + alignas(8) std::uint8_t context[64] = {}; + Require(InitProfile(profile, sheet) == sheet); + std::uint32_t hash = 0x811C9DC5u; + for (std::uint32_t code = 1; code < 0x10000; ++code) { + Require(sceCesIso2022UcsContextInit(context, sheet) == 0); + std::uint8_t iso[16]; + std::memset(iso, 0xCC, sizeof(iso)); + std::uint32_t used = 0x77777777; + std::uint32_t written = 0x66666666; + Fnv(hash, static_cast(sceCesUtf32StrToIso2022Str(context, &code, 1, &used, iso, sizeof(iso), &written))); + Fnv(hash, used); + Fnv(hash, written); + for (std::uint32_t i = 0; i < written && i < 16; ++i) hash = (hash ^ iso[i]) * 0x01000193u; + } + Require(hash == encodeHash); + hash = 0x811C9DC5u; + for (const char* prefix : PREFIXES) { + const std::uint32_t size = static_cast(std::strlen(prefix)); + for (std::uint32_t bytes = 1; bytes <= 2; ++bytes) { + for (std::uint32_t i = 0; i < (bytes == 1 ? 256u : 94u * 94u); ++i) { + std::uint8_t iso[8] = {}; + std::memcpy(iso, prefix, size); + if (bytes == 1) iso[size] = static_cast(i); + else { + iso[size] = static_cast(0x21 + i / 94); + iso[size + 1] = static_cast(0x21 + i % 94); + } + Require(sceCesIso2022UcsContextInit(context, sheet) == 0); + std::uint32_t out[4] = {}; + std::uint32_t used = 0x77777777; + std::uint32_t produced = 0x66666666; + Fnv(hash, static_cast(sceCesIso2022StrToUtf32Str(context, iso, size + bytes, &used, out, 4, &produced))); + Fnv(hash, used); + Fnv(hash, produced); + if (produced > 0) Fnv(hash, out[0]); + if (produced > 1) Fnv(hash, out[1]); + } + } + } + Require(hash == decodeHash); +} + +void CheckArguments() { + alignas(8) std::uint8_t sheet[64] = {}; + alignas(8) std::uint8_t context[64] = {}; + Require(sceCesUcsProfileInitIso2022JpRfc1468(sheet) == sheet); + Require(sceCesIso2022UcsContextInit(context, sheet) == 0); + std::uint32_t used = 0; + std::uint32_t produced = 0; + std::uint8_t out[4] = {}; + Require(Encode(context, "\xE3\x81\x82", out, sizeof(out), used, produced) == dstBufferEnd); + Require(Encode(context, "A", nullptr, 0, used, produced) == invalidDstBuffer); + Require(sceCesUtf8StrGetIso2022Len(context, Bytes("A\xE3\x81\x82"), 4, &used, &produced) == 0 && used == 4 && produced == 9); + Require(sceCesIso2022StrGetUtf8Len(context, Bytes("A\x1B$B\x24\x22"), 6, &used, &produced) == 0 && used == 6 && produced == 4); + Require(sceCesUtf8StrToIso2022Str(context, nullptr, 1, &used, out, sizeof(out), &produced) == invalidSrcBuffer); + Require(sceCesIso2022StrToUtf8Str(context, nullptr, 1, &used, out, sizeof(out), &produced) == invalidSrcBuffer); + Require(sceCesIso2022StrToUtf8Str(context, Bytes("A"), 1, &used, nullptr, 0, &produced) == invalidDstBuffer); + Require(sceCesUtf8StrToIso2022Str(nullptr, Bytes("A"), 1, &used, out, sizeof(out), &produced) == invalidParameter); + Require(sceCesIso2022UcsContextInit(nullptr, sheet) == invalidParameter); + alignas(8) std::uint8_t cleared[0x400] = {}; + std::memset(cleared, 0xA5, sizeof(cleared)); + Require(sceCesIso2022UcsContextInit(cleared, nullptr) == invalidParameter); + for (std::size_t i = 0; i < sizeof(cleared); ++i) Require(cleared[i] == (i < 0x100 ? 0 : 0xA5)); + Require(sceCesIso2022StrToUtf8Str(cleared, Bytes("A"), 1, &used, out, sizeof(out), &produced) == invalidParameter); + alignas(8) std::uint8_t copy[64] = {}; + Require(sceCesIso2022UcsContextInitCopy(copy, context) == 0); + std::uint8_t iso[16] = {}; + Require(Encode(copy, "\xE3\x81\x82", iso, sizeof(iso), used, produced) == 0 && produced == 8 && std::memcmp(iso, "\x1B$B\x24\x22\x1B(B", 8) == 0); + Require(sceCesIso2022UcsContextInitCopy(copy, nullptr) == invalidParameter); + Require(sceCesMbcsStrToUtf8Str(context, Bytes("A"), 1, &used, out, sizeof(out), &produced) == invalidParameter); + alignas(8) std::uint8_t sjis[64] = {}; + alignas(8) std::uint8_t other[64] = {}; + Require(sceCesUcsProfileInitSJis1997Cp932(sjis) == sjis); + Require(sceCesMbcsUcsContextInit(other, sjis) == 0); + Require(sceCesUtf8StrToIso2022Str(other, Bytes("A"), 1, &used, out, sizeof(out), &produced) == invalidParameter); + Require(sceCesIso2022StrToUtf8Str(other, Bytes("A"), 1, &used, out, sizeof(out), &produced) == invalidParameter); +} + +void CheckWideUnits() { + alignas(8) std::uint8_t sheet[64] = {}; + alignas(8) std::uint8_t context[64] = {}; + Require(sceCesUcsProfileInitIso2022JpRfc1468(sheet) == sheet); + Require(sceCesIso2022UcsContextInit(context, sheet) == 0); + const std::uint16_t ucs2[] = {0x41, 0x3042, 0}; + const std::uint32_t utf32[] = {0x41, 0x3042, 0}; + std::uint8_t iso[32] = {}; + std::uint32_t used = 0; + std::uint32_t produced = 0; + Require(sceCesUcs2StrToIso2022Str(context, ucs2, 2, &used, iso, sizeof(iso), &produced) == 0 && used == 2 && produced == 9); + Require(std::memcmp(iso, "A\x1B$B\x24\x22\x1B(B", 9) == 0); + Require(sceCesUcs2StrGetIso2022Len(context, ucs2, 2, &used, &produced) == 0 && produced == 9); + Require(sceCesUtf16StrToIso2022Str(context, ucs2, 2, &used, iso, sizeof(iso), &produced) == 0 && produced == 9); + Require(sceCesUtf16StrGetIso2022Len(context, ucs2, 2, &used, &produced) == 0 && produced == 9); + Require(sceCesUtf32StrToIso2022Str(context, utf32, 2, &used, iso, sizeof(iso), &produced) == 0 && produced == 9); + Require(sceCesUtf32StrGetIso2022Len(context, utf32, 2, &used, &produced) == 0 && produced == 9); + std::uint16_t units[8] = {}; + std::uint32_t wide[8] = {}; + Require(sceCesIso2022StrToUcs2Str(context, iso, 10, &used, units, 8, &produced) == 0 && used == 6 && produced == 2 && units[0] == 0x41 && units[1] == 0x3042); + Require(sceCesIso2022StrGetUcs2Len(context, iso, 10, &used, &produced) == 0 && produced == 2); + Require(sceCesIso2022StrToUtf16Str(context, iso, 10, &used, units, 8, &produced) == 0 && produced == 2 && units[1] == 0x3042); + Require(sceCesIso2022StrGetUtf16Len(context, iso, 10, &used, &produced) == 0 && produced == 2); + Require(sceCesIso2022StrToUtf32Str(context, iso, 10, &used, wide, 8, &produced) == 0 && produced == 2 && wide[1] == 0x3042); + Require(sceCesIso2022StrGetUtf32Len(context, iso, 10, &used, &produced) == 0 && produced == 2); + Require(sceCesIso2022StrToUcs2Str(context, iso, 10, &used, units, 1, &produced) == dstBufferEnd); + Require(sceCesIso2022StrToUcs2Str(context, iso, 10, &used, nullptr, 0, &produced) == invalidDstBuffer); + Require(sceCesUcs2StrToIso2022Str(context, ucs2, 2, &used, nullptr, 0, &produced) == invalidDstBuffer); +} + +} + +int main() { + CheckCases(); + CheckSweeps(0, 0x84AEE5BBu, 0xC3973AD3u); + CheckSweeps(1, 0x2419A587u, 0x7714F53Eu); + CheckSweeps(2, 0xA1B4C62Du, 0xF29A5516u); + CheckArguments(); + CheckWideUnits(); + return 0; +} diff --git a/core/libs/tests/GuestCondTimedwait.cpp b/core/libs/tests/GuestCondTimedwait.cpp index 55cc01888349..98e29ce7fdf2 100644 --- a/core/libs/tests/GuestCondTimedwait.cpp +++ b/core/libs/tests/GuestCondTimedwait.cpp @@ -17,6 +17,7 @@ static constexpr int POSIX_EPERM = 1; static constexpr int POSIX_EINVAL = 22; static constexpr int POSIX_ETIMEDOUT = 60; static constexpr int MUTEX_TYPE_RECURSIVE = 2; +static constexpr KernelClockid CLOCK_MONOTONIC_ID = 4; static void Require(bool value) { if (!value) std::abort(); } @@ -101,6 +102,44 @@ static void RelativeWait() { Require(scePthreadMutexDestroy(&signalled.mutex) == SCE_OK); } +static KernelTimespec MonotonicAfter(std::int64_t nanoseconds) { + KernelTimespec now{}; + Require(sceKernelClockGettime(CLOCK_MONOTONIC_ID, &now) == SCE_OK); + const auto total = now.tv_nsec + nanoseconds; + return KernelTimespec{now.tv_sec + total / 1000000000, total % 1000000000}; +} + +static void MonotonicClockWait() { + Signalled signalled; + PthreadCondattr attr = nullptr; + Require(pthread_condattr_init_nid_postfix(&attr) == 0); + Require(pthread_condattr_setclock_nid_postfix(&attr, CLOCK_MONOTONIC_ID) == 0); + Require(scePthreadMutexInit(&signalled.mutex, nullptr, nullptr) == SCE_OK); + Require(pthread_cond_init_nid_postfix(&signalled.cond, &attr) == 0); + Require(pthread_condattr_destroy_nid_postfix(&attr) == 0); + + Require(scePthreadMutexLock(&signalled.mutex) == SCE_OK); + const auto start = std::chrono::steady_clock::now(); + const auto soon = MonotonicAfter(50000000); + Require(pthread_cond_timedwait_nid_postfix(&signalled.cond, &signalled.mutex, &soon) == POSIX_ETIMEDOUT); + Require(std::chrono::steady_clock::now() - start >= std::chrono::milliseconds(40)); + RequireHeldByCaller(signalled); + + Pthread thread = nullptr; + Require(scePthreadCreate(&thread, nullptr, Signaller, &signalled, nullptr) == SCE_OK); + const auto later = MonotonicAfter(10000000000); + const auto waitStart = std::chrono::steady_clock::now(); + while (!signalled.ready) + Require(pthread_cond_timedwait_nid_postfix(&signalled.cond, &signalled.mutex, &later) == 0); + Require(std::chrono::steady_clock::now() - waitStart < std::chrono::seconds(5)); + RequireHeldByCaller(signalled); + Require(scePthreadMutexUnlock(&signalled.mutex) == SCE_OK); + Require(scePthreadJoin(thread, nullptr) == SCE_OK); + + Require(pthread_cond_destroy_nid_postfix(&signalled.cond) == 0); + Require(scePthreadMutexDestroy(&signalled.mutex) == SCE_OK); +} + static void SignalTo() { Signalled signalled; signalled.target = scePthreadSelf(); @@ -153,6 +192,7 @@ static void SignalToEveryRound(bool recursive) { int main() { RelativeWait(); + MonotonicClockWait(); SignalTo(); SignalToEveryRound(false); SignalToEveryRound(true); diff --git a/core/libs/tests/GuestContentDelete.cpp b/core/libs/tests/GuestContentDelete.cpp index d41135e1cdf4..ae3bf7b27cec 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 fc64c245eab5..5f081681e93c 100644 --- a/core/libs/tests/GuestDinkumwareInternals.cpp +++ b/core/libs/tests/GuestDinkumwareInternals.cpp @@ -9,10 +9,13 @@ #include #include #include +#include +#include namespace { constexpr int RangeError = 34; +constexpr int DomainError = 33; constexpr int InvalidArgument = 22; constexpr short Denormal = -2; constexpr short Finite = -1; @@ -36,6 +39,132 @@ void CheckStod(const char* text, std::int64_t pten, double expected, long consum Require(same && end - text == consumed && *__error_nid_postfix() == error, message); } +template +void CheckHexRange(TFloat (APS5_VABI *parse)(const char*, char**, std::int64_t, int*), TFloat (APS5_VABI *simple)(const char*, char**, std::int64_t), const char* overflow, const char* underflow) { + for (const bool negative : {false, true}) for (const bool overflows : {false, true}) for (const int saved : {7, RangeError}) { + const std::string text = std::string(negative ? " \t-" : "+") + (overflows ? overflow : underflow) + "tail"; + const auto matches = [&](TFloat value) { + return (overflows ? std::isinf(value) : value == 0) && std::signbit(value) == negative; + }; + char* end = nullptr; + int error = 123; + *__error_nid_postfix() = saved; + const auto value = parse(text.c_str(), &end, 0, &error); + Require(matches(value) && end == text.c_str() + text.size() - 4 && error == 0 && *__error_nid_postfix() == saved, "unscaled hexadecimal range result preserves errno and clears error"); + end = nullptr; + *__error_nid_postfix() = saved; + const auto plain = simple(text.c_str(), &end, 0); + Require(matches(plain) && end == text.c_str() + text.size() - 4 && *__error_nid_postfix() == saved, "unscaled hexadecimal range wrapper preserves errno"); + } +} + +void TestHexRange() { + std::fenv_t saved; + Require(std::fegetenv(&saved) == 0 && std::fesetround(FE_TONEAREST) == 0, "save hexadecimal range test environment"); + CheckHexRange(_Stofx_nid_postfix, _Stof_nid_postfix, "0X1p128", "0X1p-150"); + CheckHexRange(_Stodx_nid_postfix, _Stod_nid_postfix, "0x1p1024", "0x1p-1075"); + CheckHexRange(_Stoldx_nid_postfix, _Stold_nid_postfix, "0x1p16384", "0x1p-16446"); + 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); @@ -182,6 +311,42 @@ void TestFloatErrors() { Require(std::isnan(_Stodx_nid_postfix("nan", &end, 2, &error)) && error == 0 && end[0] == '\0', "_Stodx NaN"); } +void TestScaledNan() { + struct Case { const char* text; std::size_t consumed; }; + const Case cases[] = {{"nan", 3}, {" -NaNtail", 6}, {"-nan(0x123)", 11}, {"nan(a_b9)", 9}, {"nan()", 5}, {"nan(abc", 3}, {"nan(1.0)", 3}, {"nan(a b)", 3}, {"nan((a))", 3}, {"\t+NAN(Az_0)", 11}}; + std::fenv_t saved; + Require(std::feholdexcept(&saved) == 0, "save scaled NaN environment"); + const auto check = [&](auto parse, auto alias) { + const TFloat expected = std::numeric_limits::quiet_NaN(); + constexpr std::size_t bytes = sizeof(TFloat) == 16 ? 10 : sizeof(TFloat); + for (const auto& entry : cases) for (const auto power : {std::numeric_limits::min(), std::int64_t{-400}, std::int64_t{-1}, std::int64_t{0}, std::int64_t{1}, std::int64_t{400}, std::numeric_limits::max()}) { + for (const int rounding : {FE_TONEAREST, FE_DOWNWARD, FE_UPWARD, FE_TOWARDZERO}) for (const int sticky : {0, FE_DIVBYZERO | FE_INEXACT, FE_INVALID}) for (unsigned pointers = 0; pointers != 4; ++pointers) { + Require(std::fesetround(rounding) == 0, "select scaled NaN rounding"); + std::feclearexcept(FE_ALL_EXCEPT); + if (sticky != 0) std::feraiseexcept(sticky); + *__error_nid_postfix() = 97; + int error = 123; + char* end = nullptr; + const TFloat value = parse(entry.text, (pointers & 1u) != 0 ? nullptr : &end, power, (pointers & 2u) != 0 ? nullptr : &error); + const int raised = std::fetestexcept(FloatingExceptions); + Require(std::memcmp(&value, &expected, bytes) == 0, "scaled NaN value bits"); + Require((pointers & 1u) != 0 || end == entry.text + entry.consumed, "scaled NaN consumed subject"); + Require((pointers & 2u) != 0 || error == 0, "scaled NaN error output"); + Require(*__error_nid_postfix() == 97 && raised == sticky && std::fegetround() == rounding, "scaled NaN preserves errno and floating environment"); + std::feclearexcept(FE_ALL_EXCEPT); + if (sticky != 0) std::feraiseexcept(sticky); + const TFloat other = alias(entry.text, &end, power); + const int aliasRaised = std::fetestexcept(FloatingExceptions); + Require(std::memcmp(&other, &expected, bytes) == 0 && end == entry.text + entry.consumed && *__error_nid_postfix() == 97 && aliasRaised == sticky, "scaled NaN alias"); + } + } + }; + check.operator()(_Stofx_nid_postfix, _Stof_nid_postfix); + check.operator()(_Stodx_nid_postfix, _Stod_nid_postfix); + check.operator()(_Stoldx_nid_postfix, _Stold_nid_postfix); + Require(std::fesetenv(&saved) == 0, "restore scaled NaN environment"); +} + void TestIntegerErrors() { char* end = nullptr; int error = 99; @@ -209,6 +374,36 @@ void TestIntegerErrors() { Require(_Stoullx_nid_postfix("18446744073709551616", &end, 10, &error) == 18446744073709551615ull && error == RangeError && *__error_nid_postfix() == RangeError, "_Stoullx overflow"); } +void TestFloatingRounds() { + GuestFloatingPointEnvironment saved; + Require(fegetenv_nid_postfix(&saved) == 0, "save floating environment"); + constexpr int Expected[]{1, 3, 2, 0}; + const int savedErrno = *__error_nid_postfix(); + for (const unsigned precision : {0u, 0x200u, 0x300u}) { + for (unsigned x87 = 0; x87 != 4; ++x87) { + for (unsigned sse = 0; sse != 4; ++sse) { + for (const unsigned flush : {0u, 0x40u, 0x8000u, 0x8040u}) { + auto input = saved; + input.control = (input.control & 0xffff0000u) | 0x7fu | precision | (x87 << 10u); + input.status = (input.status & ~0x3fu) | 0x25u; + input.mxcsr = 0x1fa5u | (sse << 13u) | flush; + asm volatile("fldenv %0" : : "m"(input)); + asm volatile("ldmxcsr %0" : : "m"(input.mxcsr)); + *__error_nid_postfix() = 97; + Require(_Fltrounds_nid_postfix() == Expected[x87], "_Fltrounds follows x87 independently of SSE"); + GuestFloatingPointEnvironment after; + Require(fegetenv_nid_postfix(&after) == 0, "read floating environment"); + Require(after.control == input.control && (after.status & 0x3fu) == 0x25u && after.mxcsr == input.mxcsr, "_Fltrounds preserves controls and flags"); + Require(*__error_nid_postfix() == 97, "_Fltrounds preserves errno"); + } + } + } + } + asm volatile("fldenv %0" : : "m"(saved)); + asm volatile("ldmxcsr %0" : : "m"(saved.mxcsr)); + *__error_nid_postfix() = savedErrno; +} + void TestDoubleHelpers() { const double e = 0x1.5bf0a8b145769p+1; CheckExp(1.0, 1.0, 0, e, Finite, 0, 0, "_Exp e"); @@ -412,15 +607,105 @@ void TestLongDoubleHelpers() { Require(_LLog_nid_postfix(8.0L, -1) == 3.0L && _LLog_nid_postfix(8.0L, -3) == 3.0L, "_LLog base 2"); } +long double Extended(std::uint64_t mantissa, std::uint16_t signExponent) { + unsigned char bytes[sizeof(long double)]{}; + std::memcpy(bytes, &mantissa, sizeof(mantissa)); + std::memcpy(bytes + sizeof(mantissa), &signExponent, sizeof(signExponent)); + long double value; + std::memcpy(&value, bytes, sizeof(value)); + return value; +} + +bool SameBits(long double value, std::uint64_t mantissa, std::uint16_t signExponent) { + unsigned char bytes[sizeof(long double)]; + std::memcpy(bytes, &value, sizeof(value)); + std::uint64_t actualMantissa; + std::uint16_t actualSignExponent; + std::memcpy(&actualMantissa, bytes, sizeof(actualMantissa)); + std::memcpy(&actualSignExponent, bytes + sizeof(actualMantissa), sizeof(actualSignExponent)); + return actualMantissa == mantissa && actualSignExponent == signExponent; +} + +void TestLongLog() { + const struct { std::uint64_t inputMantissa; std::uint16_t inputSignExponent; int base; std::uint64_t outputMantissa; std::uint16_t outputSignExponent; } cases[] = { + {0x8000000000000000ull, 0x4002, 0, 0x851591f9dd5b9b41ull, 0x4000}, {0xfa00000000000000ull, 0x4008, 1, 0xc000000000000000ull, 0x4000}, + {0xfa00000000000000ull, 0x4008, 5, 0xc000000000000000ull, 0x4000}, {0x8000000000000000ull, 0x4002, -1, 0xc000000000000000ull, 0x4000}, + {0x8000000000000000ull, 0x3fff, 0, 0, 0x0000}, {0x8000000000000000ull, 0x4000, 0, 0xb17217f7d1cf79acull, 0x3ffe}, + {0xa000000000000000ull, 0x4002, 1, 0x8000000000000000ull, 0x3fff}, {0x8000000000000000ull, 0x3ffe, -1, 0x8000000000000000ull, 0xbfff}, + {0xc000000000000000ull, 0x4000, 0, 0x8c9f53d5681854bbull, 0x3fff}, {0xb333333333333333ull, 0x3ffe, 0, 0xb69e192709fa762aull, 0xbffd}, + {0x9c3d73864f3805c0ull, 0x0c17, 0, 0x8fe95c8a78a8b80eull, 0xc00c}, {0xd1ba8323fe558c61ull, 0x73e6, 1, 0xfa00000000000000ull, 0x400a}, + {0xe000000000000000ull, 0x4001, -1, 0xb3abb3faa02166cdull, 0x4000}, + {0xb9ac82c8410c3c68ull, 0x3ff2, 1, 0xf01e4bc814a4fb4cull, 0xc000}, {0x98a9e5bdab7504d1ull, 0x3ff5, 1, 0xbbc2f513876414b1ull, 0xc000}, + {0xcb41eecb51a96e38ull, 0x3ff8, 1, 0xf40409ebb181947aull, 0xbfff}, {0xecad15fd3a0eaf66ull, 0x3ffd, 0, 0xc589acfa7c6c1534ull, 0xbffe}, + {0xc86e97283b961889ull, 0x3ffe, 1, 0xd9a59da3f27f263eull, 0xbffb}, {0xf164446eb384ba65ull, 0x4001, 1, 0xe0a894064e71356aull, 0x3ffe}, + {0x8000000000000000ull, 0x7fff, 0, 0x8000000000000000ull, 0x7fff}, {0xc000000000000001ull, 0xffff, 1, 0xc000000000000001ull, 0xffff}, + }; + for (const auto& test : cases) { + *__error_nid_postfix() = 12345; + const long double result = _LLog_nid_postfix(Extended(test.inputMantissa, test.inputSignExponent), test.base); + if (!SameBits(result, test.outputMantissa, test.outputSignExponent) || *__error_nid_postfix() != 12345) { + std::fprintf(stderr, "Dinkumware internals: _LLog failed for %016llx:%04x base %d\n", static_cast(test.inputMantissa), test.inputSignExponent, test.base); + std::exit(1); + } + } + for (const std::uint16_t signExponent : {0x0000, 0x8000, 0x3fff, 0xbfff}) { + std::feclearexcept(FE_ALL_EXCEPT); + *__error_nid_postfix() = 0; + const long double zero = _LLog_nid_postfix(Extended(0, signExponent), 0); + Require(SameBits(zero, 0x8000000000000000ull, 0xffff) && *__error_nid_postfix() == RangeError && std::fetestexcept(FE_DIVBYZERO) != 0, "_LLog of a zero mantissa"); + } + for (const long double input : {-1.0L, -0x1p-16445L, Extended(0x8000000000000000ull, 0xffff)}) { + std::feclearexcept(FE_ALL_EXCEPT); + *__error_nid_postfix() = 0; + Require(SameBits(_LLog_nid_postfix(input, -1), 0xc000000000000000ull, 0x7fff) && *__error_nid_postfix() == DomainError && std::fetestexcept(FE_INVALID) != 0, "_LLog of a negative argument"); + } + *__error_nid_postfix() = 0; +} + +std::uint16_t X87ControlWord() { + std::uint16_t control; + asm volatile("fnstcw %0" : "=m"(control)); + return control; +} + +void TestLongLogAt53Bits() { + const struct { std::uint64_t inputMantissa; std::uint16_t inputSignExponent; int base; std::uint64_t outputMantissa; std::uint16_t outputSignExponent; } cases[] = { + {0x8000000000000000ull, 0x4002, 0, 0x851591f9dd5b9800ull, 0x4000}, {0xfa00000000000000ull, 0x4008, 1, 0xc000000000000000ull, 0x4000}, + {0x8000000000000000ull, 0x4000, 0, 0xb17217f7d1cf7800ull, 0x3ffe}, {0xb333333333333333ull, 0x3ffe, 0, 0xb69e192709fa8000ull, 0xbffd}, + {0x9c3d73864f3805c0ull, 0x0c17, 0, 0x8fe95c8a78a8b800ull, 0xc00c}, {0xe000000000000000ull, 0x4001, -1, 0xb3abb3faa0216800ull, 0x4000}, + {0xf164446eb384ba65ull, 0x4001, 1, 0xe0a894064e713800ull, 0x3ffe}, + }; + const std::uint16_t saved = X87ControlWord(); + const auto control = static_cast((saved & ~0x0300u) | 0x0200u); + for (const auto& test : cases) { + const long double input = Extended(test.inputMantissa, test.inputSignExponent); + asm volatile("fldcw %0" : : "m"(control) : "memory"); + const long double result = _LLog_nid_postfix(input, test.base); + const std::uint16_t after = X87ControlWord(); + asm volatile("fldcw %0" : : "m"(saved) : "memory"); + if (!SameBits(result, test.outputMantissa, test.outputSignExponent) || after != control) { + std::fprintf(stderr, "Dinkumware internals: _LLog at 53 bits failed for %016llx:%04x base %d\n", static_cast(test.inputMantissa), test.inputSignExponent, test.base); + std::exit(1); + } + } +} + } int main() { TestStod(); + TestHexRange(); + TestUnscaledHexadecimal(); + TestLongDoubleHexadecimalPrecision(); TestStoll(); TestDoubleHelpers(); + TestFloatingRounds(); TestFloatErrors(); + TestScaledNan(); TestIntegerErrors(); TestArithmetic(); TestDispatch(); TestLongDoubleHelpers(); + TestLongLog(); + TestLongLogAt53Bits(); } diff --git a/core/libs/tests/GuestDirectory.cpp b/core/libs/tests/GuestDirectory.cpp index 5f6096246e4b..a504fcfc5dcd 100644 --- a/core/libs/tests/GuestDirectory.cpp +++ b/core/libs/tests/GuestDirectory.cpp @@ -196,6 +196,13 @@ int main() { Require(*__error_nid_postfix() == 20); Require(opendir_nid_postfix("") == nullptr && *__error_nid_postfix() == 2); Require(closedir_nid_postfix(nullptr) == -1 && *__error_nid_postfix() == 9); + *__error_nid_postfix() = 0; + Require(opendir_nid_postfix(nullptr) == nullptr && *__error_nid_postfix() == 14); + *__error_nid_postfix() = 0; + Require(readdir_nid_postfix(nullptr) == nullptr && *__error_nid_postfix() == 9); + *__error_nid_postfix() = 0; + rewinddir_nid_postfix(nullptr); + Require(*__error_nid_postfix() == 9); const std::u8string folder = u8"セーブ"; const std::u8string file = u8"été.txt"; Require(std::filesystem::create_directory(root / std::filesystem::path(folder))); diff --git a/core/libs/tests/GuestEditMp4.cpp b/core/libs/tests/GuestEditMp4.cpp new file mode 100644 index 000000000000..a20ba36cc36b --- /dev/null +++ b/core/libs/tests/GuestEditMp4.cpp @@ -0,0 +1,37 @@ +#include "prx/libSceEditMp4/include/Api.hpp" +#include +#include +#include +#include + +namespace { + +void Require(bool value) { if (!value) std::abort(); } + +std::array Initialized(std::uint8_t fill) { + std::array bytes{}; + bytes.fill(fill); + sceEditMp4InitializeParam(bytes.data()); + return bytes; +} + +} + +int main() { + for (const std::uint8_t fill : {std::uint8_t{0x00}, std::uint8_t{0xaa}}) { + const auto bytes = Initialized(fill); + for (std::size_t index = 0; index < 0x10; ++index) Require(bytes[index] == 0); + std::uint64_t at10 = 0; + std::uint32_t at18 = 0; + std::memcpy(&at10, bytes.data() + 0x10, sizeof(at10)); + std::memcpy(&at18, bytes.data() + 0x18, sizeof(at18)); + Require(at10 == 0x3f); + Require(at18 == 700); + for (std::size_t index = 0x1c; index < bytes.size(); ++index) Require(bytes[index] == fill); + } + sceEditMp4InitializeParam(nullptr); + + Require(sceEditMp4QueryMemSize() == 0x387d30); + Require(sceEditMp4QueryMemSize() == 0x387d30); + return 0; +} diff --git a/core/libs/tests/GuestEntitlements.cpp b/core/libs/tests/GuestEntitlements.cpp index 135b9a951094..2bf1b61c4e46 100644 --- a/core/libs/tests/GuestEntitlements.cpp +++ b/core/libs/tests/GuestEntitlements.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -68,10 +69,42 @@ 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)); Require(sceNpEntitlementAccessGetEntitlementKey(0, &label, &key) == static_cast(0x817D0007)); + for (std::int64_t requestId : {std::int64_t{0}, std::int64_t{1}, std::int64_t{-7}, std::numeric_limits::max()}) { + Require(sceNpEntitlementAccessAbortRequest(requestId) == 0); + Require(sceNpEntitlementAccessDeleteRequest(requestId) == 0); + Require(sceNpEntitlementAccessDeleteRequest(requestId) == 0); + } std::filesystem::remove_all(root); std::puts("Guest entitlements passed"); return 0; diff --git a/core/libs/tests/GuestErr.cpp b/core/libs/tests/GuestErr.cpp index 570a1c1d85bd..c4314d31cd17 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 @@ class Capture { 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/GuestErrorDialog.cpp b/core/libs/tests/GuestErrorDialog.cpp index 8f108e6c83e3..2a9e8acd7d6a 100644 --- a/core/libs/tests/GuestErrorDialog.cpp +++ b/core/libs/tests/GuestErrorDialog.cpp @@ -1,7 +1,10 @@ #include "prx/libSceErrorDialog/include/Api.hpp" #include "prx/libc/include/general/VabiMacros.hpp" +#include "prx/libSceIme/include/ModalDialog.hpp" #include +#include #include +#include namespace { @@ -22,6 +25,105 @@ struct ErrorDialogParam { std::int32_t reserved; }; +ModalDialogState Session() { + std::size_t chosen = 0; + return ModalDialogPoll_nid_postfix(chosen); +} + +void CloseAndFallback() { + ErrorDialogParam param{16, static_cast(0x80020001), 0, 0}; + ModalDialogSetPresenter_nid_postfix(true); + Require(sceErrorDialogInitialize() == 0); + Require(sceErrorDialogOpen(¶m) == 0 && Session() == ModalDialogState::Showing); + Require(sceErrorDialogClose() == 0); + Require(Session() == ModalDialogState::Closed); + Require(sceErrorDialogGetStatus() == kStatusFinished); + Require(sceErrorDialogClose() == kErrInvalidState); + + Require(sceErrorDialogOpen(¶m) == 0 && Session() == ModalDialogState::Showing); + Require(sceErrorDialogTerminate() == 0); + Require(Session() == ModalDialogState::Idle); + Require(!ModalDialogCapturesInput_nid_postfix()); + + ModalDialogRequest other; + other.message = u"Other"; + other.buttons = {u"OK"}; + Require(ModalDialogOpen_nid_postfix(other)); + Require(sceErrorDialogInitialize() == 0); + Require(sceErrorDialogOpen(¶m) == 0); + Require(sceErrorDialogGetStatus() == kStatusRunning); + Require(sceErrorDialogUpdateStatus() == kStatusFinished); + ModalDialogReset_nid_postfix(); + Require(sceErrorDialogTerminate() == 0); + + ModalDialogSetPresenter_nid_postfix(false); + Require(sceErrorDialogInitialize() == 0); + Require(sceErrorDialogOpen(¶m) == 0 && Session() == ModalDialogState::Idle); + Require(sceErrorDialogUpdateStatus() == kStatusFinished); + Require(sceErrorDialogTerminate() == 0); +} + +void OtherLibraryDialog() { + ModalDialogSetPresenter_nid_postfix(true); + ModalDialogRequest other; + other.owner = ModalDialogOwnerMsgDialog; + other.message = u"Question"; + other.buttons = {u"Yes", u"No"}; + Require(ModalDialogOpen_nid_postfix(other)); + Require(sceErrorDialogInitialize() == 0); + Require(sceErrorDialogTerminate() == 0); + std::size_t chosen = 0; + Require(ModalDialogPoll_nid_postfix(chosen, ModalDialogOwnerMsgDialog) == ModalDialogState::Showing && ModalDialogCapturesInput_nid_postfix()); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Confirm); + Require(ModalDialogPoll_nid_postfix(chosen, ModalDialogOwnerMsgDialog) == ModalDialogState::Answered && chosen == 0); + ModalDialogReset_nid_postfix(); + ModalDialogSetPresenter_nid_postfix(false); +} + +void WithoutFlips() { + ErrorDialogParam param{16, static_cast(0x80020001), 0, 0}; + ModalDialogSetPresenter_nid_postfix(true); + ModalDialogSetShowTimeout_nid_postfix(40); + Require(sceErrorDialogInitialize() == 0); + Require(sceErrorDialogOpen(¶m) == 0); + Require(sceErrorDialogGetStatus() == kStatusRunning); + std::this_thread::sleep_for(std::chrono::milliseconds(120)); + Require(sceErrorDialogUpdateStatus() == kStatusFinished); + Require(!ModalDialogCapturesInput_nid_postfix() && Session() == ModalDialogState::Unshown); + + Require(sceErrorDialogOpen(¶m) == 0 && sceErrorDialogGetStatus() == kStatusRunning); + ModalDialogView view; + Require(ModalDialogReadView_nid_postfix(view)); + std::this_thread::sleep_for(std::chrono::milliseconds(120)); + Require(sceErrorDialogUpdateStatus() == kStatusRunning); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Confirm); + Require(sceErrorDialogUpdateStatus() == kStatusFinished); + Require(sceErrorDialogTerminate() == 0); + ModalDialogSetShowTimeout_nid_postfix(ModalDialogShowTimeoutMilliseconds); + ModalDialogSetPresenter_nid_postfix(false); +} + +void ShownDialog() { + ErrorDialogParam param{16, static_cast(0x80020001), 0, 0}; + ModalDialogSetPresenter_nid_postfix(true); + Require(sceErrorDialogInitialize() == 0); + Require(sceErrorDialogOpen(¶m) == 0); + Require(Session() == ModalDialogState::Showing); + ModalDialogView view; + Require(ModalDialogReadView_nid_postfix(view)); + Require(view.message == u"An error occurred.\nError code: 0x80020001" && view.buttons.size() == 1 && view.buttons[0].selected); + for (int poll = 0; poll < 3; ++poll) Require(sceErrorDialogUpdateStatus() == kStatusRunning && sceErrorDialogGetStatus() == kStatusRunning); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Confirm); + Require(sceErrorDialogGetStatus() == kStatusFinished); + Require(sceErrorDialogUpdateStatus() == kStatusFinished); + + Require(sceErrorDialogOpen(¶m) == 0 && Session() == ModalDialogState::Showing); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Cancel); + Require(sceErrorDialogUpdateStatus() == kStatusFinished); + Require(sceErrorDialogTerminate() == 0); + ModalDialogSetPresenter_nid_postfix(false); +} + } int main() { @@ -71,4 +173,9 @@ int main() { Require(sceErrorDialogOpen(¶m) == kErrInvalidState); Require(sceErrorDialogOpenDetail() == kErrUnexpectedFatal); Require(sceErrorDialogOpenWithReport() == kErrUnexpectedFatal); + + ShownDialog(); + CloseAndFallback(); + WithoutFlips(); + OtherLibraryDialog(); } diff --git a/core/libs/tests/GuestErrors.cpp b/core/libs/tests/GuestErrors.cpp index 25ac0bb23a4f..2ea161da655e 100644 --- a/core/libs/tests/GuestErrors.cpp +++ b/core/libs/tests/GuestErrors.cpp @@ -68,7 +68,21 @@ int main() { Require(std::strcmp(strerror_nid_postfix(error), expected) == 0); Require(*__error_nid_postfix() == 13); } - for (const int error : {97, 100, 1000, 9999, INT_MAX, -1, INT_MIN}) { + const struct { + int error; + const char* text; + } extended[] = { + {107, "State not recoverable"}, {108, "Owner dead"}, {152, "File positioning error"}, + {1040, "No message available"}, {1050, "No stream resources"}, {1051, "Not a stream"}, + {1062, "Other"}, {1074, "Stream timeout"}, + }; + for (const auto& entry : extended) { + Require(strerror_r_nid_postfix(entry.error, buffer, sizeof(buffer)) == 0); + Require(std::strcmp(buffer, entry.text) == 0); + Require(std::strcmp(strerror_nid_postfix(entry.error), entry.text) == 0); + Require(*__error_nid_postfix() == 13); + } + for (const int error : {97, 100, 106, 109, 151, 153, 1000, 1039, 1041, 1075, 9999, INT_MAX, -1, INT_MIN}) { char coded[32]; std::snprintf(coded, sizeof(coded), "error_code=0x%08x", static_cast(error)); Require(strerror_r_nid_postfix(error, buffer, sizeof(buffer)) == 0); diff --git a/core/libs/tests/GuestExecHost.cpp b/core/libs/tests/GuestExecHost.cpp index 959a1f35c691..82faaf1b6baf 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/GuestFileLock.cpp b/core/libs/tests/GuestFileLock.cpp index 26dd7afae8f8..10dc6d0e48ad 100644 --- a/core/libs/tests/GuestFileLock.cpp +++ b/core/libs/tests/GuestFileLock.cpp @@ -293,7 +293,53 @@ static void Directories() { Require(flock_nid_postfix(descriptor, 8) == 0); Require(flock_nid_postfix(descriptor, 0) == -1 && *__error_nid_postfix() == 9); Require(flock_nid_postfix(descriptor, 4) == -1 && *__error_nid_postfix() == 9); - Require(close_nid_postfix(descriptor) == 0); + const int other = open_nid_postfix(path.c_str(), 0x20000, 0); + Require(other >= 0); + Require(flock_nid_postfix(descriptor, 2 | 4) == 0); + Require(!Acquires(other, 2) && !Acquires(other, 1)); + Require(flock_nid_postfix(descriptor, 1 | 4) == 0); + Require(Acquires(other, 1) && !Acquires(other, 2)); + Require(flock_nid_postfix(other, 1 | 4) == 0); + Require(flock_nid_postfix(descriptor, 2 | 4) == -1 && *__error_nid_postfix() == 35); + Require(flock_nid_postfix(other, 8) == 0 && !Acquires(other, 2)); + Require(flock_nid_postfix(descriptor, 2 | 4) == 0); + const int third = open_nid_postfix(path.c_str(), 0x20000, 0); + Require(third >= 0); + auto exclusive = std::async(std::launch::async, [&] { return flock_nid_postfix(other, 2); }); + Require(exclusive.wait_for(std::chrono::milliseconds(200)) == std::future_status::timeout); + Require(flock_nid_postfix(descriptor, 1 | 4) == 0); + Require(exclusive.wait_for(std::chrono::milliseconds(200)) == std::future_status::timeout); + Require(Acquires(third, 1) && !Acquires(third, 2)); + Require(flock_nid_postfix(descriptor, 8) == 0); + Require(exclusive.wait_for(std::chrono::seconds(2)) == std::future_status::ready && exclusive.get() == 0); + Require(flock_nid_postfix(other, 1 | 4) == 0 && flock_nid_postfix(descriptor, 1 | 4) == 0); + auto upgrade = std::async(std::launch::async, [&] { return flock_nid_postfix(descriptor, 2); }); + const auto deadline = std::chrono::steady_clock::now() + std::chrono::seconds(5); + while (flock_nid_postfix(other, 2 | 4) != 0) { + Require(*__error_nid_postfix() == 35 && std::chrono::steady_clock::now() < deadline); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } + Require(upgrade.wait_for(std::chrono::milliseconds(0)) == std::future_status::timeout && !Acquires(third, 1)); + Require(flock_nid_postfix(other, 8) == 0); + Require(upgrade.wait_for(std::chrono::seconds(2)) == std::future_status::ready && upgrade.get() == 0); + Require(!Acquires(third, 1) && close_nid_postfix(third) == 0); + const int copy = dup_nid_postfix(descriptor); + Require(copy >= 0 && flock_nid_postfix(copy, 2 | 4) == 0); + Require(close_nid_postfix(descriptor) == 0 && !Acquires(other, 2)); + std::promise entered; + auto entry = entered.get_future(); + auto waiting = std::async(std::launch::async, [&] { + entered.set_value(); + return flock_nid_postfix(other, 2); + }); + entry.wait(); + Require(waiting.wait_for(std::chrono::milliseconds(200)) == std::future_status::timeout); + Require(close_nid_postfix(copy) == 0); + Require(waiting.wait_for(std::chrono::seconds(2)) == std::future_status::ready && waiting.get() == 0); + const int reopened = open_nid_postfix(path.c_str(), 0x20000, 0); + Require(reopened >= 0 && !Acquires(reopened, 1)); + Require(close_nid_postfix(other) == 0 && Acquires(reopened, 2)); + Require(close_nid_postfix(reopened) == 0); std::error_code ignored; std::filesystem::remove_all(directory, ignored); } diff --git a/core/libs/tests/GuestFileTimestamps.cpp b/core/libs/tests/GuestFileTimestamps.cpp index 0cdc8fa88b1f..ffedc11c73de 100644 --- a/core/libs/tests/GuestFileTimestamps.cpp +++ b/core/libs/tests/GuestFileTimestamps.cpp @@ -2,6 +2,7 @@ #include "prx/libc/include/Api.hpp" #include "SceTypes.hpp" #include +#include #include #include #include @@ -133,6 +134,16 @@ int main() { const KernelTimeval second[2]{{1000000002, 1}, {1000000003, 999999}}; Require(futimes_nid_postfix(fd, second) == 0, "futimes on read-only descriptor"); CheckTimes(path, fd, second); + const auto* unmapped = reinterpret_cast(std::uintptr_t{0x10}); + for (const auto update : {utimes_nid_postfix, lutimes_nid_postfix}) { + *__error_nid_postfix() = 0; + Require(update(path.c_str(), unmapped) == -1 && *__error_nid_postfix() == 14, "unreadable times fault in utimes and lutimes"); + } + *__error_nid_postfix() = 0; + Require(futimes_nid_postfix(fd, unmapped) == -1 && *__error_nid_postfix() == 14, "unreadable times fault in futimes"); + Require(sceKernelUtimes_nid_postfix(path.c_str(), unmapped) == static_cast(0x8002000eu), "unreadable times fault in sceKernelUtimes"); + Require(sceKernelFutimes(fd, unmapped) == static_cast(0x8002000eu), "unreadable times fault in sceKernelFutimes"); + CheckTimes(path, fd, second); Require(sceKernelUtimes_nid_postfix(path.c_str(), first) == 0, "sceKernelUtimes fractional timestamp"); CheckTimes(path, fd, first); Require(lutimes_nid_postfix(path.c_str(), second) == 0, "lutimes fractional timestamp"); diff --git a/core/libs/tests/GuestFilesystem.cpp b/core/libs/tests/GuestFilesystem.cpp index fd05fc56e8ef..f284609395c9 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/GuestFirmwareConstantReturns.cpp b/core/libs/tests/GuestFirmwareConstantReturns.cpp index f88525c988eb..bf9c55df5e0e 100644 --- a/core/libs/tests/GuestFirmwareConstantReturns.cpp +++ b/core/libs/tests/GuestFirmwareConstantReturns.cpp @@ -1,4 +1,5 @@ #include "SceTypes.hpp" +#include "prx/libSceAvSetting/libSceAvSetting.hpp" #include "prx/libSceComposite/libSceComposite.hpp" #include "prx/libSceFsInternalForVsh/libSceFsInternalForVsh.hpp" #include "prx/libSceHttpCache/libSceHttpCache.hpp" @@ -13,6 +14,12 @@ namespace { void Require(bool value) { if (!value) std::abort(); } +void CheckAvSetting() { + constexpr int AvSettingError = static_cast(0x802A00FF); + Require(sceAvSettingSetDisplayBlackLevel() == AvSettingError); + Require(sceAvSettingTerm() == AvSettingError); +} + void CheckComposite() { constexpr int Unsupported = static_cast(0x80d40006); Require(sceCompositorCreateIndirectRenderTarget() == Unsupported); @@ -70,6 +77,7 @@ void CheckDebugSyscore() { } int main() { + CheckAvSetting(); CheckComposite(); CheckFsInternal(); CheckHttpCacheAndPlayReady(); diff --git a/core/libs/tests/GuestFloatBuiltins.cpp b/core/libs/tests/GuestFloatBuiltins.cpp index 5595a78ecc4a..5ecaa9c33eff 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/GuestFontGraphics.cpp b/core/libs/tests/GuestFontGraphics.cpp index 3093955bc9c8..a32257584abd 100644 --- a/core/libs/tests/GuestFontGraphics.cpp +++ b/core/libs/tests/GuestFontGraphics.cpp @@ -6,9 +6,14 @@ #include #include #include +#include namespace { +using FontDrawupSignature = int (APS5_VABI *)(FontGraphicsFrame*, const void*, std::uint32_t, void**, float, float, float, float); +static_assert(std::is_same_v); +static_assert(std::is_same_v); + constexpr int InvalidParameter = static_cast(0x80460002); constexpr int InvalidFill = static_cast(0x80460086); constexpr int InvalidRegion = static_cast(0x80460087); diff --git a/core/libs/tests/GuestFontMetrics.cpp b/core/libs/tests/GuestFontMetrics.cpp index cd7a1c1fe68f..b309310bf139 100644 --- a/core/libs/tests/GuestFontMetrics.cpp +++ b/core/libs/tests/GuestFontMetrics.cpp @@ -135,6 +135,18 @@ int main() { Require(sceFontCloseFont(nullptr) == SCE_FONT_ERROR_INVALID_FONT_HANDLE); for (FontHandle font : {plain, typo, versionOne, os2Only}) Require(sceFontCloseFont(font) == SCE_FONT_OK); + + FontHandle reopened = Open(library, plainData); + const auto typoCopy = typoData; + FontHandle copied = Open(library, typoCopy); + RequireMetrics(reopened, 2, {1, 80.0f, -20.0f, 0.0f, 50.0f, 0.0f, 0.0f}); + RequireMetrics(copied, 2, {2, 70.0f, -30.0f, 10.0f, 50.0f, 0.0f, 0.0f}); + for (FontHandle font : {reopened, copied}) Require(sceFontCloseFont(font) == SCE_FONT_OK); + + std::vector shared; + for (int i = 0; i < 5; ++i) shared.push_back(Open(library, plainData)); + for (FontHandle font : shared) RequireMetrics(font, 2, {1, 80.0f, -20.0f, 0.0f, 50.0f, 0.0f, 0.0f}); + for (FontHandle font : shared) Require(sceFontCloseFont(font) == SCE_FONT_OK); Require(sceFontDestroyLibrary(&library) == SCE_FONT_OK); Require(sceFontMemoryTerm(&memory) == SCE_FONT_OK); std::puts("Font metrics tests passed"); diff --git a/core/libs/tests/GuestFontWords.cpp b/core/libs/tests/GuestFontWords.cpp index 6a23430a7cfc..48c2a59b0d6b 100644 --- a/core/libs/tests/GuestFontWords.cpp +++ b/core/libs/tests/GuestFontWords.cpp @@ -129,6 +129,10 @@ static void CreateValidation() { Require(sceFontCreateWords(&badMemory, &source, 0, &words) == SCE_FONT_ERROR_INVALID_MEMORY && words == nullptr); Require(sceFontCreateWords(&fixture.memory, nullptr, 0, &words) == SCE_FONT_ERROR_INVALID_PARAMETER); Require(sceFontCreateWords(&fixture.memory, &source, 0, nullptr) == SCE_FONT_ERROR_INVALID_PARAMETER); + FontTextSource noParser = source; + noParser.textParser = nullptr; + words = reinterpret_cast(1); + Require(sceFontCreateWords(&fixture.memory, &noParser, 0, &words) == SCE_FONT_ERROR_INVALID_PARAMETER && words == nullptr); FontTextSource unknown = source; unknown.systemUse0 = 0; Require(sceFontCreateWords(&fixture.memory, &unknown, 0, &words) == SCE_FONT_ERROR_INVALID_TEXT_SOURCE && words == nullptr); diff --git a/core/libs/tests/GuestFreeType.cpp b/core/libs/tests/GuestFreeType.cpp index ca1c5dd2dbe8..15a542fa6879 100644 --- a/core/libs/tests/GuestFreeType.cpp +++ b/core/libs/tests/GuestFreeType.cpp @@ -11,6 +11,8 @@ #include FT_CID_H #include FT_SIZES_H #include FT_SYSTEM_H +#include FT_MODULE_H +#include FT_DRIVER_H #include #include @@ -1571,7 +1573,41 @@ static void SizeObjects(const std::vector& font) { std::printf("FreeType size objects: %d lifecycles, %d rendered glyphs, %d allocation failures compared with native\n", scenarios, rendered, failures); } +static void CheckGlyphToScriptMap() { + const auto font = SquareGlyphFont('A', 700); + GuestLibrary* library = nullptr; + GuestFaceRec* face = nullptr; + FT_Library nativeLibrary = nullptr; + FT_Face nativeFace = nullptr; + Require(FT_Init_FreeType_nid_postfix(&library) == 0 && FT_Init_FreeType(&nativeLibrary) == 0); + Require(FT_New_Memory_Face_nid_postfix(library, font.data(), font.size(), 0, &face) == 0); + Require(FT_New_Memory_Face(nativeLibrary, font.data(), static_cast(font.size()), 0, &nativeFace) == 0); + struct GuestMap { GuestFaceRec* face; std::uint16_t* map; }; + GuestMap guest{face, nullptr}; + FT_Prop_GlyphToScriptMap expected{nativeFace, nullptr}; + const int nativeResult = FT_Property_Get(nativeLibrary, "autofitter", "glyph-to-script-map", &expected); + Require(FT_Property_Get_nid_postfix(library, "autofitter", "glyph-to-script-map", &guest) == nativeResult); + Require(nativeResult == 0 && guest.face == face && guest.map && expected.map); + Require(std::equal(guest.map, guest.map + face->num_glyphs, expected.map)); + std::array storage{}; + GuestMap unaligned{face, nullptr}; + std::memcpy(storage.data() + 1, &unaligned, sizeof(unaligned)); + Require(FT_Property_Get_nid_postfix(library, "autofitter", "glyph-to-script-map", storage.data() + 1) == 0); + std::memcpy(&unaligned, storage.data() + 1, sizeof(unaligned)); + Require(unaligned.face == face && unaligned.map == guest.map); + Require(FT_Property_Set_nid_postfix(library, "autofitter", "glyph-to-script-map", &guest) == + FT_Property_Set(nativeLibrary, "autofitter", "glyph-to-script-map", &expected)); + GuestMap invalid{nullptr, reinterpret_cast(1)}; + FT_Prop_GlyphToScriptMap nativeInvalid{nullptr, reinterpret_cast(1)}; + Require(FT_Property_Get_nid_postfix(library, "autofitter", "glyph-to-script-map", &invalid) == + FT_Property_Get(nativeLibrary, "autofitter", "glyph-to-script-map", &nativeInvalid)); + Require(invalid.map == reinterpret_cast(1)); + Require(FT_Done_Face_nid_postfix(face) == 0 && FT_Done_Face(nativeFace) == 0); + Require(FT_Done_FreeType_nid_postfix(library) == 0 && FT_Done_FreeType(nativeLibrary) == 0); +} + int main() { + CheckGlyphToScriptMap(); SizeObjects(SquareGlyphFont('A', 700)); { const auto referenceFont = SquareGlyphFont('A', 700); diff --git a/core/libs/tests/GuestFreeTypeAdvances.cpp b/core/libs/tests/GuestFreeTypeAdvances.cpp index 8aeb14f403c4..e8f13c183ca8 100644 --- a/core/libs/tests/GuestFreeTypeAdvances.cpp +++ b/core/libs/tests/GuestFreeTypeAdvances.cpp @@ -11,7 +11,6 @@ #include #include #include -#include #include #include @@ -27,6 +26,10 @@ static void Check(bool value, int line) { constexpr std::int64_t Sentinel = 0x1122334455667788; +static std::int64_t Widened(FT_Fixed value) { + return value == static_cast(Sentinel) ? Sentinel : static_cast(value); +} + struct Fixture { std::vector bytes; FT_Library library = nullptr; @@ -82,8 +85,7 @@ static void CheckSingle(Fixture& fixture, unsigned glyph, std::int32_t flags) { std::array actual{Sentinel, Sentinel, Sentinel}; Require(FT_Get_Advance_nid_postfix(fixture.guest, glyph, flags, &actual[1]) == error); Require(actual.front() == Sentinel && actual.back() == Sentinel); - if (error == 0 || sizeof(FT_Fixed) == sizeof(std::int64_t)) Require(actual[1] == expected); - else Require(actual[1] == Sentinel); + Require(actual[1] == Widened(expected)); fixture.CheckSlot(); } @@ -96,10 +98,7 @@ static void CheckBatch(Fixture& fixture, unsigned start, unsigned count, std::in actual.fill(Sentinel); Require(FT_Get_Advances_nid_postfix(fixture.guest, start, count, flags, &actual[1]) == error); Require(actual.front() == Sentinel && actual.back() == Sentinel); - for (unsigned index = 0; index < expected.size(); ++index) { - if ((error == 0 && index < count) || sizeof(FT_Fixed) == sizeof(std::int64_t)) Require(actual[index + 1] == expected[index]); - else Require(actual[index + 1] == Sentinel); - } + for (unsigned index = 0; index < expected.size(); ++index) Require(actual[index + 1] == Widened(expected[index])); fixture.CheckSlot(); } @@ -244,18 +243,8 @@ static void CheckPartialFailure() { const int error = FT_Get_Advances(fixture.native, 0, 2, FT_LOAD_DEFAULT, expected.data()); Require(error != 0 && expected[0] != static_cast(Sentinel) && expected[1] == static_cast(Sentinel)); std::array actual{Sentinel, Sentinel, Sentinel, Sentinel}; - if constexpr (sizeof(FT_Fixed) == sizeof(std::int64_t)) { - Require(FT_Get_Advances_nid_postfix(fixture.guest, 0, 2, FT_LOAD_DEFAULT, &actual[1]) == error); - Require(actual[1] == expected[0] && actual[2] == Sentinel); - } else { - bool threw = false; - try { - FT_Get_Advances_nid_postfix(fixture.guest, 0, 2, FT_LOAD_DEFAULT, &actual[1]); - } catch (const std::runtime_error&) { - threw = true; - } - Require(threw && actual[1] == Sentinel && actual[2] == Sentinel); - } + Require(FT_Get_Advances_nid_postfix(fixture.guest, 0, 2, FT_LOAD_DEFAULT, &actual[1]) == error); + Require(actual[1] == expected[0] && actual[2] == Sentinel); Require(actual.front() == Sentinel && actual.back() == Sentinel); fixture.CheckSlot(); } diff --git a/core/libs/tests/GuestFreeTypeCorner.cpp b/core/libs/tests/GuestFreeTypeCorner.cpp index 3dab54335ae2..da989a8122f2 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/GuestFreeTypeCurveBounds.cpp b/core/libs/tests/GuestFreeTypeCurveBounds.cpp index d10151a47c4d..21ade431c544 100644 --- a/core/libs/tests/GuestFreeTypeCurveBounds.cpp +++ b/core/libs/tests/GuestFreeTypeCurveBounds.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include using namespace FreeType; @@ -63,6 +64,33 @@ GuestBBox Check(std::vector points, std::vector tags return actual.box; } +int Measure(std::vector points, std::vector tags, std::vector contours, GuestBBox& box) { + GuestOutline guest{static_cast(contours.size()), static_cast(points.size()), + points.data(), tags.data(), contours.data(), 0}; + GuardedBox actual; + const int status = FT_Outline_Get_BBox_nid_postfix(&guest, &actual.box); + Require(actual.before == 0x123456789ABCDEF0 && actual.after == 0xFEDCBA9876543210); + box = actual.box; + return status; +} + +GuestBBox Expect(std::vector points, std::vector tags, std::vector contours) { + GuestBBox box{}; + Require(Measure(std::move(points), std::move(tags), std::move(contours), box) == 0); + return box; +} + +bool Rejected(GuestOutline outline, const std::string& reason) { + GuardedBox actual; + const auto sentinel = actual.box; + try { + FT_Outline_Get_BBox_nid_postfix(&outline, &actual.box); + } catch (const std::invalid_argument& error) { + return std::string(error.what()).starts_with(reason) && Equal(actual.box, sentinel); + } + return false; +} + int main() { GuardedBox invalid; const auto sentinel = invalid.box; @@ -109,31 +137,75 @@ int main() { Require(Equal(Check(many, tags, {65534}), {0, 0, 999, 65534})); Require(Equal(Check(many, tags, contours), {0, 0, 999, 65534})); - std::array points{{{0, 0}, {1, 1}}}; - std::array smallTags{1, 1}; - std::uint16_t end = 1; - GuestOutline missing{1, 2, nullptr, smallTags.data(), &end, 0}; - invalid.box = sentinel; - bool threw = false; - try { - FT_Outline_Get_BBox_nid_postfix(&missing, &invalid.box); - } catch (const std::runtime_error&) { - threw = true; + std::array points{{{0, 0}, {100, 200}, {200, 0}}}; + std::array curvedTags{1, 0, 1}; + std::uint16_t end = 2; + for (int missing = 0; missing < 3; ++missing) { + GuestOutline outline{1, 3, missing == 0 ? nullptr : points.data(), missing == 1 ? nullptr : curvedTags.data(), + missing == 2 ? nullptr : &end, 0}; + Require(Rejected(outline, "FT_Outline_Get_BBox: null ")); } - Require(threw && Equal(invalid.box, sentinel)); - for (auto badContours : std::vector>{{2}, {0}, {1, 1}, {1, 0}, {0, 1, 1}}) { - GuestOutline malformed{static_cast(badContours.size()), 2, - points.data(), smallTags.data(), badContours.data(), 0}; - threw = false; - try { - FT_Outline_Get_BBox_nid_postfix(&malformed, &invalid.box); - } catch (const std::runtime_error& error) { - threw = std::string(error.what()).starts_with("FT_Outline_Get_BBox: inconsistent contour bounds"); - } - Require(threw && Equal(invalid.box, sentinel)); + for (std::uint16_t endpoint : {std::uint16_t{3}, std::uint16_t{65535}}) { + GuestOutline outline{1, 3, points.data(), curvedTags.data(), &endpoint, 0}; + Require(Rejected(outline, "FT_Outline_Decompose: contour endpoint at or beyond n_points")); + } + std::array onTags{1, 1, 1}; + GuestOutline straight{1, 3, points.data(), onTags.data(), nullptr, 0}; + Require(FT_Outline_Get_BBox_nid_postfix(&straight, &invalid.box) == 0 && Equal(invalid.box, {0, 0, 200, 200})); + for (auto contours : std::vector>{{3}, {0}, {1, 1}, {1, 0}, {0, 1, 1}, {65535}}) + Require(Equal(Check({{0, 0}, {100, 200}, {200, 0}}, {1, 1, 1}, contours), {0, 0, 200, 200})); + Require(Equal(Check({{0, 0}, {100, 200}, {200, 0}, {500, -500}}, {1, 0, 1, 1}, {2}), {0, -500, 500, 100})); + Check({{0, 0}, {100, 200}, {200, 0}, {500, -500}}, {1, 0, 1, 1}, {2, 1}, 0, true); + Check({{0, 0}, {100, 200}, {200, 0}, {500, -500}}, {1, 0, 1, 1}, {2, 2}, 0, true); + GuestBBox unchanged{}; + Require(Measure({{0, 100}, {100, 0}, {200, 0}}, {2, 2, 1}, {2}, unchanged) == FT_Err_Invalid_Outline); + Require(Measure({{0, 100}, {100, 0}, {200, 0}, {300, 50}}, {2, 2, 1, 2}, {3}, unchanged) == FT_Err_Invalid_Outline); + + constexpr std::int64_t big = (std::int64_t{1} << 40) + 4097; + Require(Equal(Expect({{0, 0}, {big, 2 * big}, {2 * big, 0}}, {1, 0, 1}, {2}), {0, 0, 2 * big, std::int64_t{1} << 41})); + Require(Equal(Expect({{0, 0}, {big, -3 * big}, {3 * big, -big}, {4 * big, 0}}, {1, 2, 2, 1}, {3}), + {0, -1742130928311, 4 * big, 0})); + Require(Equal(Expect({{-big, 7}, {big, 9}}, {1, 1}, {1}), {-big, 7, big, 9})); + constexpr auto low = std::numeric_limits::min(); + constexpr auto high = std::numeric_limits::max(); + for (const auto& overflow : std::vector>{{{0, low}, {0, high}, {0, low}}, + {{0, high}, {0, low}, {0, high}}, {{0, 0}, {0, high}, {0, low}}}) { + std::array values{overflow[0], overflow[1], overflow[2]}; + GuestOutline outline{1, 3, values.data(), curvedTags.data(), &end, 0}; + Require(Rejected(outline, "FT_Outline_Get_BBox: signed overflow in the extremum arithmetic")); } + std::array aligned{{{0, 0}, {0, std::int64_t{1} << 33}, {0, std::int64_t{1} << 33}, {0, 0}}}; + std::array cubicTags{1, 2, 2, 1}; + std::uint16_t cubicEnd = 3; + GuestOutline zeroLow{1, 4, aligned.data(), cubicTags.data(), &cubicEnd, 0}; + Require(Rejected(zeroLow, "FT_Outline_Get_BBox: cubic control distances whose low 32 bits are zero")); + if constexpr (sizeof(FT_Pos) >= sizeof(std::int64_t)) { Check({{std::int64_t{1} << 40, -(std::int64_t{1} << 40)}, {0, 0}}, {1, 1}, {1}); + Check({{0, 0}, {big, 2 * big}, {2 * big, 0}}, {1, 0, 1}, {2}); + } + std::mt19937_64 wideRandom(0x5EED); + std::uint64_t digest = 0xCBF29CE484222325; + const auto fold = [&digest](std::int64_t value) { digest = (digest ^ static_cast(value)) * 0x100000001B3; }; + const auto record = [&fold](std::vector curve, std::vector curveTags, std::uint16_t endpoint) { + GuestBBox box{}; + fold(Measure(std::move(curve), std::move(curveTags), {endpoint}, box)); + fold(box.xMin); + fold(box.yMin); + fold(box.xMax); + fold(box.yMax); + }; + for (unsigned iteration = 0; iteration < 4096; ++iteration) { + std::vector wide; + for (unsigned index = 0; index < 4; ++index) { + const auto magnitude = std::uint64_t{1} << (20 + wideRandom() % 31); + wide.push_back({static_cast(wideRandom() % magnitude) - static_cast(magnitude / 2), + static_cast(wideRandom() % magnitude) - static_cast(magnitude / 2)}); + } + record(wide, {1, 2, 2, 1}, 3); + wide.pop_back(); + record(wide, {1, 0, 1}, 2); } - std::printf("FreeType curve bounds: 8192 generated curves, extrema, errors and count limits passed\n"); + Require(digest == 0x6C9B1F2FED2DF477); + std::printf("FreeType curve bounds: 16384 generated curves, extrema, errors and count limits passed\n"); } diff --git a/core/libs/tests/GuestFreeTypeModuleProperties.cpp b/core/libs/tests/GuestFreeTypeModuleProperties.cpp index 74534f2974ae..b4bedc4822e2 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/GuestFreeTypeOtMemory.cpp b/core/libs/tests/GuestFreeTypeOtMemory.cpp new file mode 100644 index 000000000000..1a1d9691a805 --- /dev/null +++ b/core/libs/tests/GuestFreeTypeOtMemory.cpp @@ -0,0 +1,258 @@ +#include "prx/libSceFreeTypeOt/include/Memory.hpp" +#include +#include +#include +#include + +namespace { + +using FreeType::GuestMemoryRec; + +struct Recorder { + GuestMemoryRec memory{}; + int allocs = 0; + int frees = 0; + int reallocs = 0; + std::int64_t lastSize = 0; + std::int64_t lastCurrent = 0; + std::int64_t lastNew = 0; + void* lastBlock = nullptr; + GuestMemoryRec* lastMemory = nullptr; + bool fail = false; +}; + +Recorder* Owner(GuestMemoryRec* memory) { + return static_cast(memory->user); +} + +void* APS5_VABI RecordAlloc(GuestMemoryRec* memory, std::int64_t size) { + auto* recorder = Owner(memory); + ++recorder->allocs; + recorder->lastMemory = memory; + recorder->lastSize = size; + if (recorder->fail) return nullptr; + void* block = std::malloc(static_cast(size)); + std::memset(block, 0xAA, static_cast(size)); + return block; +} + +void APS5_VABI RecordFree(GuestMemoryRec* memory, void* block) { + auto* recorder = Owner(memory); + ++recorder->frees; + recorder->lastMemory = memory; + recorder->lastBlock = block; + std::free(block); +} + +void* APS5_VABI RecordRealloc(GuestMemoryRec* memory, std::int64_t current, std::int64_t size, void* block) { + auto* recorder = Owner(memory); + ++recorder->reallocs; + recorder->lastMemory = memory; + recorder->lastCurrent = current; + recorder->lastNew = size; + recorder->lastBlock = block; + if (recorder->fail) return nullptr; + auto* resized = static_cast(std::realloc(block, static_cast(size))); + if (size > current) std::memset(resized + current, 0xAA, static_cast(size - current)); + return resized; +} + +void Reset(Recorder& recorder) { + recorder = Recorder{}; + recorder.memory = {&recorder, RecordAlloc, RecordFree, RecordRealloc}; +} + +void Require(bool condition, const char* message) { + if (condition) return; + std::fprintf(stderr, "FreeType Ot memory: %s\n", message); + std::exit(1); +} + +bool Filled(const void* block, std::size_t size, unsigned char value) { + const auto* bytes = static_cast(block); + for (std::size_t i = 0; i < size; ++i) { + if (bytes[i] != value) return false; + } + return true; +} + +void QuickAllocation() { + Recorder recorder; + Reset(recorder); + std::int32_t error = -1; + void* block = ft_mem_qalloc_nid_postfix(&recorder.memory, 24, &error); + Require(block && error == 0, "qalloc of a positive size returns a block and no error"); + Require(recorder.allocs == 1 && recorder.lastSize == 24 && recorder.lastMemory == &recorder.memory, "qalloc passes the memory record and size to alloc"); + Require(Filled(block, 24, 0xAA), "qalloc leaves the block uncleared"); + ft_mem_free_nid_postfix(&recorder.memory, block); + Require(recorder.frees == 1 && recorder.lastBlock == block && recorder.lastMemory == &recorder.memory, "free passes the block to memory->free"); + + Reset(recorder); + error = -1; + Require(!ft_mem_qalloc_nid_postfix(&recorder.memory, 0, &error) && error == 0 && recorder.allocs == 0, "qalloc of size 0 returns null without calling alloc"); + error = -1; + Require(!ft_mem_qalloc_nid_postfix(&recorder.memory, -1, &error) && error == 0x06 && recorder.allocs == 0, "qalloc of a negative size is Invalid_Argument"); + recorder.fail = true; + error = -1; + Require(!ft_mem_qalloc_nid_postfix(&recorder.memory, 8, &error) && error == 0x40 && recorder.allocs == 1, "qalloc reports Out_Of_Memory when alloc fails"); +} + +void ClearedAllocation() { + Recorder recorder; + Reset(recorder); + std::int32_t error = -1; + void* block = ft_mem_alloc_nid_postfix(&recorder.memory, 16, &error); + Require(block && error == 0 && recorder.allocs == 1 && recorder.lastSize == 16, "alloc allocates through memory->alloc"); + Require(Filled(block, 16, 0), "alloc clears the block"); + ft_mem_free_nid_postfix(&recorder.memory, block); + + error = -1; + Require(!ft_mem_alloc_nid_postfix(&recorder.memory, 0, &error) && error == 0, "alloc of size 0 returns null"); + error = -1; + Require(!ft_mem_alloc_nid_postfix(&recorder.memory, -5, &error) && error == 0x06, "alloc of a negative size is Invalid_Argument"); + recorder.fail = true; + error = -1; + Require(!ft_mem_alloc_nid_postfix(&recorder.memory, 4, &error) && error == 0x40, "alloc reports Out_Of_Memory when alloc fails"); + + Reset(recorder); + ft_mem_free_nid_postfix(&recorder.memory, nullptr); + Require(recorder.frees == 0, "free of null does not call memory->free"); +} + +void QuickReallocation() { + Recorder recorder; + Reset(recorder); + std::int32_t error = -1; + void* block = ft_mem_qrealloc_nid_postfix(&recorder.memory, 4, 0, 3, nullptr, &error); + Require(block && error == 0 && recorder.allocs == 1 && recorder.lastSize == 12 && recorder.reallocs == 0, "qrealloc from zero items allocates new_count * item_size"); + Require(Filled(block, 12, 0), "qrealloc from zero items clears the new block, as ft_mem_alloc does"); + std::memset(block, 0x11, 12); + + error = -1; + void* grown = ft_mem_qrealloc_nid_postfix(&recorder.memory, 4, 3, 5, block, &error); + Require(grown && error == 0 && recorder.reallocs == 1, "qrealloc of a live block calls memory->realloc"); + Require(recorder.lastCurrent == 12 && recorder.lastNew == 20 && recorder.lastBlock == block, "qrealloc passes byte sizes and the old block"); + Require(Filled(grown, 12, 0x11) && Filled(static_cast(grown) + 12, 8, 0xAA), "qrealloc does not clear the grown tail"); + + recorder.fail = true; + error = -1; + Require(ft_mem_qrealloc_nid_postfix(&recorder.memory, 4, 5, 9, grown, &error) == grown && error == 0x40, "qrealloc keeps the old block when realloc fails"); + recorder.fail = false; + + const int callbacks = recorder.allocs + recorder.frees + recorder.reallocs; + error = -1; + Require(ft_mem_qrealloc_nid_postfix(&recorder.memory, -1, 5, 6, grown, &error) == grown && error == 0x06, "negative item_size is Invalid_Argument"); + error = -1; + Require(ft_mem_qrealloc_nid_postfix(&recorder.memory, 4, -1, 6, grown, &error) == grown && error == 0x06, "negative cur_count is Invalid_Argument"); + error = -1; + Require(ft_mem_qrealloc_nid_postfix(&recorder.memory, 4, 5, -1, grown, &error) == grown && error == 0x06, "negative new_count is Invalid_Argument"); + error = -1; + Require(ft_mem_qrealloc_nid_postfix(&recorder.memory, 2, 5, 0x40000000, grown, &error) == grown && error == 0x0A, "new_count above FT_INT_MAX / item_size is Array_Too_Large"); + Require(recorder.allocs + recorder.frees + recorder.reallocs == callbacks, "rejected qrealloc calls make no memory callback"); + + recorder.fail = true; + error = -1; + Require(!ft_mem_qrealloc_nid_postfix(&recorder.memory, 2, 0, 0x3FFFFFFF, nullptr, &error) && error == 0x40, "new_count at FT_INT_MAX / item_size is allocated"); + Require(recorder.lastSize == 0x7FFFFFFE, "the boundary allocation asks for new_count * item_size bytes"); + recorder.fail = false; + + error = -1; + Require(!ft_mem_qrealloc_nid_postfix(&recorder.memory, 4, 5, 0, grown, &error) && error == 0, "qrealloc to zero items frees and returns null"); + Require(recorder.lastBlock == grown && recorder.frees == 1, "qrealloc to zero items passes the block to memory->free"); + + block = ft_mem_qalloc_nid_postfix(&recorder.memory, 8, &error); + error = -1; + Require(!ft_mem_qrealloc_nid_postfix(&recorder.memory, 0, 2, 4, block, &error) && error == 0, "qrealloc with item_size 0 frees and returns null"); + Require(recorder.lastBlock == block && recorder.frees == 2, "qrealloc with item_size 0 passes the block to memory->free"); +} + +void ClearedReallocation() { + Recorder recorder; + Reset(recorder); + std::int32_t error = -1; + void* block = ft_mem_realloc_nid_postfix(&recorder.memory, 4, 0, 3, nullptr, &error); + Require(block && error == 0 && recorder.lastSize == 12 && Filled(block, 12, 0), "realloc from zero items allocates and clears"); + auto* bytes = static_cast(block); + for (int i = 0; i < 12; ++i) bytes[i] = static_cast(i + 1); + + error = -1; + void* grown = ft_mem_realloc_nid_postfix(&recorder.memory, 4, 3, 5, block, &error); + Require(grown && error == 0 && recorder.reallocs == 1 && recorder.lastCurrent == 12 && recorder.lastNew == 20, "realloc resizes through memory->realloc"); + bytes = static_cast(grown); + bool kept = true; + for (int i = 0; i < 12; ++i) kept = kept && bytes[i] == i + 1; + Require(kept && Filled(bytes + 12, 8, 0), "realloc keeps the old items and clears the new ones"); + + std::memset(bytes, 0x22, 20); + error = -1; + void* shrunk = ft_mem_realloc_nid_postfix(&recorder.memory, 4, 5, 2, grown, &error); + Require(shrunk && error == 0 && recorder.lastCurrent == 20 && recorder.lastNew == 8 && Filled(shrunk, 8, 0x22), "realloc shrinks without clearing"); + + error = -1; + Require(ft_mem_realloc_nid_postfix(&recorder.memory, 4, 2, -3, shrunk, &error) == shrunk && error == 0x06 && Filled(shrunk, 8, 0x22), "realloc errors keep the block unchanged"); + recorder.fail = true; + error = -1; + Require(ft_mem_realloc_nid_postfix(&recorder.memory, 4, 2, 6, shrunk, &error) == shrunk && error == 0x40 && Filled(shrunk, 8, 0x22), "realloc keeps the block when realloc fails"); + recorder.fail = false; + ft_mem_free_nid_postfix(&recorder.memory, shrunk); +} + +void Duplication() { + Recorder recorder; + Reset(recorder); + const char source[7] = {'a', 'b', 'c', 0, 'd', 'e', 'f'}; + std::int32_t error = -1; + void* copy = ft_mem_dup_nid_postfix(&recorder.memory, source, sizeof(source), &error); + Require(copy && error == 0 && recorder.allocs == 1 && recorder.lastSize == 7, "dup allocates size bytes"); + Require(std::memcmp(copy, source, sizeof(source)) == 0, "dup copies every byte, including embedded zeros"); + ft_mem_free_nid_postfix(&recorder.memory, copy); + + error = -1; + Require(!ft_mem_dup_nid_postfix(&recorder.memory, source, 0, &error) && error == 0 && recorder.allocs == 1, "dup of size 0 returns null"); + error = -1; + void* uncopied = ft_mem_dup_nid_postfix(&recorder.memory, nullptr, 4, &error); + Require(uncopied && error == 0 && recorder.allocs == 2 && Filled(uncopied, 4, 0xAA), "dup of a null address allocates without copying"); + ft_mem_free_nid_postfix(&recorder.memory, uncopied); + error = -1; + Require(!ft_mem_dup_nid_postfix(&recorder.memory, source, 0x8000000000000000ull, &error) && error == 0x06 && recorder.allocs == 2, "dup of a size above FT_Long is Invalid_Argument"); + + error = -1; + char* text = static_cast(ft_mem_strdup_nid_postfix(&recorder.memory, "hello", &error)); + Require(text && error == 0 && recorder.lastSize == 6 && std::strcmp(text, "hello") == 0, "strdup copies strlen + 1 bytes"); + ft_mem_free_nid_postfix(&recorder.memory, text); + const int allocs = recorder.allocs; + error = -1; + Require(!ft_mem_strdup_nid_postfix(&recorder.memory, nullptr, &error) && error == 0 && recorder.allocs == allocs, "strdup of null returns null without allocating"); + recorder.fail = true; + error = -1; + Require(!ft_mem_strdup_nid_postfix(&recorder.memory, "x", &error) && error == 0x40, "strdup reports Out_Of_Memory when alloc fails"); +} + +void BoundedCopy() { + char buffer[8]; + std::memset(buffer, 'x', sizeof(buffer)); + Require(ft_mem_strcpyn_nid_postfix(buffer, "abc", sizeof(buffer)) == 0 && std::strcmp(buffer, "abc") == 0, "strcpyn copies a string that fits and returns 0"); + std::memset(buffer, 'x', sizeof(buffer)); + Require(ft_mem_strcpyn_nid_postfix(buffer, "abc", 4) == 0 && std::strcmp(buffer, "abc") == 0, "strcpyn fits size - 1 characters"); + std::memset(buffer, 'x', sizeof(buffer)); + Require(ft_mem_strcpyn_nid_postfix(buffer, "abcdef", 4) == 1 && std::strcmp(buffer, "abc") == 0 && buffer[4] == 'x', "strcpyn truncates to size - 1 characters and returns 1"); + std::memset(buffer, 'x', sizeof(buffer)); + Require(ft_mem_strcpyn_nid_postfix(buffer, "a", 1) == 1 && buffer[0] == 0 && buffer[1] == 'x', "strcpyn of size 1 writes only the terminator"); + std::memset(buffer, 'x', sizeof(buffer)); + Require(ft_mem_strcpyn_nid_postfix(buffer, "a", 0) == 1 && buffer[0] == 0 && buffer[1] == 'x', "strcpyn of size 0 still writes the terminator"); + std::memset(buffer, 'x', sizeof(buffer)); + Require(ft_mem_strcpyn_nid_postfix(buffer, "", 5) == 0 && buffer[0] == 0 && buffer[1] == 'x', "strcpyn of an empty string returns 0"); +} + +} + +int main() { + QuickAllocation(); + ClearedAllocation(); + QuickReallocation(); + ClearedReallocation(); + Duplication(); + BoundedCopy(); + std::puts("Guest FreeType Ot memory tests passed"); + return 0; +} diff --git a/core/libs/tests/GuestFutureCategory.cpp b/core/libs/tests/GuestFutureCategory.cpp index 35e38af6a770..96b5c77154fd 100644 --- a/core/libs/tests/GuestFutureCategory.cpp +++ b/core/libs/tests/GuestFutureCategory.cpp @@ -15,6 +15,12 @@ using Message = GuestLocale::String* (APS5_VABI *)(GuestLocale::String*, const LibcException::CategoryObject*, int); using Name = const char* (APS5_VABI *)(const LibcException::CategoryObject*); using Raise = void (APS5_VABI *)(const LibcException::FutureErrorObject*); +using What = const char* (APS5_VABI *)(const LibcException::FutureErrorObject*); + +static const char* GuestWhat(const std::exception& error) { + const auto* object = reinterpret_cast(&error); + return std::bit_cast(static_cast(object->vtable)[2])(object); +} bool failAllocation = false; @@ -141,7 +147,7 @@ static void CheckFutureError() { try { _ZSt19_Throw_future_errorRKSt10error_code_nid_postfix(&code); } catch (const std::exception& error) { caught = true; - REQUIRE(error.what() != nullptr && std::strcmp(error.what(), "future already retrieved") == 0); + REQUIRE(GuestWhat(error) != nullptr && std::strcmp(GuestWhat(error), "future already retrieved") == 0); } REQUIRE(caught); @@ -150,7 +156,7 @@ static void CheckFutureError() { try { _ZSt19_Throw_future_errorRKSt10error_code_nid_postfix(&code); } catch (const std::exception& error) { caught = true; - REQUIRE(error.what() == nullptr); + REQUIRE(GuestWhat(error) == nullptr); } REQUIRE(caught); diff --git a/core/libs/tests/GuestGameLiveStreaming.cpp b/core/libs/tests/GuestGameLiveStreaming.cpp index cb973dfdacae..7460e4eba8ec 100644 --- a/core/libs/tests/GuestGameLiveStreaming.cpp +++ b/core/libs/tests/GuestGameLiveStreaming.cpp @@ -184,6 +184,14 @@ void CheckScalars() { for (const std::uint32_t bitrate : {0u, 6000u, 0xffffffffu}) Require(sceGameLiveStreamingSetMaxBitrate(bitrate) == 0); } +void CheckSeparateModeParameter() { + Require(sceGameLiveStreamingScreenInitializeSeparateModeParameter(nullptr) == kInvalidArgument); + std::array parameter{}; + parameter.fill(0xaa); + Require(sceGameLiveStreamingScreenInitializeSeparateModeParameter(parameter.data()) == 0); + for (std::size_t i = 0; i < parameter.size(); ++i) Require(parameter[i] == (i < 0x44 ? 0 : 0xaa)); +} + } int main() { @@ -194,6 +202,7 @@ int main() { Require(sceGameLiveStreamingGetCurrentStatus2(nullptr) == notInitialized); Require(EnableThrowsNotInitialized(true)); CheckLifecycleFirst(); + CheckSeparateModeParameter(); for (const std::size_t size : {0u, 1u, 0x3fffu, 0x4001u, 0x100000u}) Require(sceGameLiveStreamingInitialize(size) == invalidArgument); Require(sceGameLiveStreamingInitialize(0x4000) == 0); Require(sceGameLiveStreamingEnableLiveStreaming(true) == 0); diff --git a/core/libs/tests/GuestGetlogin.cpp b/core/libs/tests/GuestGetlogin.cpp index 5071c786c9ca..000e9d827cad 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 fc31313d74f1..7bcc7e298d6f 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 13db14bc9039..92fbb1e1e9e0 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 4862729c1905..804eed957a4b 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 000000000000..efe6173f22d1 --- /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/GuestHeapLifetime.cpp b/core/libs/tests/GuestHeapLifetime.cpp new file mode 100644 index 000000000000..01423a9c351f --- /dev/null +++ b/core/libs/tests/GuestHeapLifetime.cpp @@ -0,0 +1,77 @@ +#include "prx/libc/include/GuestHeap.hpp" +#include "prx/libc/include/GuestArena.hpp" +#include +#include +#include +#include +#include +#include +#include + +namespace { + +int events[2]; +void* retained; + +void CheckHeapDuringExit() { + bool passed = false; + try { + std::thread worker([&] { + try { + const auto* bytes = static_cast(retained); + for (std::size_t index = 0; index < 32; ++index) { + if (bytes[index] != 0x5a) return; + } + if (GuestHeap::GuestHeapUsableSize_nid_postfix(retained) != 32) return; + for (std::size_t iteration = 0; iteration < 256; ++iteration) { + void* pointer = GuestHeap::GuestHeapAllocate_nid_postfix(32); + if (GuestHeap::GuestHeapUsableSize_nid_postfix(pointer) != 32) return; + std::memset(pointer, 0xa5, 32); + GuestHeap::GuestHeapFree_nid_postfix(pointer); + } + GuestHeap::GuestHeapFree_nid_postfix(retained); + passed = true; + } catch (const std::exception& error) { + std::fprintf(stderr, "guest heap during exit: %s\n", error.what()); + } catch (...) {} + }); + worker.join(); + } catch (...) {} + const char result = passed ? 'P' : 'F'; + static_cast(!write(events[1], &result, 1)); +} + +bool HeapSurvivesExit() { + if (pipe(events) != 0) return false; + const pid_t child = fork(); + if (child < 0) { + close(events[0]); + close(events[1]); + return false; + } + if (child == 0) { + close(events[0]); + if (std::atexit(CheckHeapDuringExit) != 0) std::_Exit(2); + retained = GuestHeap::GuestHeapAllocate_nid_postfix(32); + if (!GuestArena::GuestArenaContains_nid_postfix(retained, 32)) std::_Exit(2); + std::memset(retained, 0x5a, 32); + std::exit(0); + } + close(events[1]); + char result = 0; + const ssize_t count = read(events[0], &result, 1); + close(events[0]); + int status = 0; + return waitpid(child, &status, 0) == child && WIFEXITED(status) && + WEXITSTATUS(status) == 0 && count == 1 && result == 'P'; +} + +} + +int main() { + if (!HeapSurvivesExit()) { + std::fputs("guest small-block heap must remain available during static finalization\n", stderr); + return 1; + } + return 0; +} diff --git a/core/libs/tests/GuestHttp2.cpp b/core/libs/tests/GuestHttp2.cpp index 2f1525f541a9..8bd6b7e26e34 100644 --- a/core/libs/tests/GuestHttp2.cpp +++ b/core/libs/tests/GuestHttp2.cpp @@ -33,7 +33,8 @@ int main() { Require(Throws([&] { sceHttp2SetCookieBox(tmpl, box); })); Require(sceHttp2CookieFlush(box) == 0); Require(sceHttp2SetResolveRetry(tmpl, 0) == 0); - Require(Throws([&] { sceHttp2SetResolveRetry(tmpl, 3); })); + Require(sceHttp2SetResolveRetry(tmpl, 3) == 0); + Require(Throws([&] { sceHttp2SetResolveRetry(tmpl, -1); })); Require(sceHttp2SetRequestNoContentLength(request) == 0); Require(Throws([&] { sceHttp2AddRequestHeader(request, "bad:name", "value", 0); })); Require(Throws([&] { sceHttp2AddRequestHeader(request, "x-header", "value\r\ninjected: yes", 0); })); diff --git a/core/libs/tests/GuestHttp2Transport.cpp b/core/libs/tests/GuestHttp2Transport.cpp index 03594e78b639..4aab31e278a5 100644 --- a/core/libs/tests/GuestHttp2Transport.cpp +++ b/core/libs/tests/GuestHttp2Transport.cpp @@ -10,6 +10,7 @@ #include "SceTypes.hpp" #include "prx/libkernel/include/Api.hpp" #include "prx/libSceHttp2/include/Http2.hpp" +#include "prx/libSceHttp2/Transport.hpp" #include "prx/libSceNet/include/Net.hpp" #include "prx/libSceSsl/include/Ssl.hpp" #include "prx/libSceSsl/SslTypes.hpp" @@ -51,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) { @@ -136,6 +169,8 @@ class Server { 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; } @@ -175,7 +210,12 @@ class Server { 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; @@ -193,6 +233,21 @@ class Server { 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"); @@ -200,6 +255,7 @@ class Server { 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{}; @@ -258,6 +314,12 @@ class Server { } 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)) { @@ -308,6 +370,7 @@ void Success(int ssl, Mode mode, bool disableCa = false) { if (disableCa) Require(sceHttp2SslDisableOption(client.tmpl, 0x20) == 0, "disable known CA check"); if (mode == Mode::Normal && !disableCa) Require(sceHttp2SslEnableOption(client.tmpl, 0x4) == 0, "verify localhost certificate name"); Require(sceHttp2AddRequestHeader(client.tmpl, "X-Inherited", "original", 0) == 0, "template header"); + Require(sceHttp2SetResolveRetry(client.tmpl, 2) == 0, "resolve retries"); const std::string upload = mode == Mode::Large ? std::string(150000, 'u') : std::string{}; client.Create(server.Url(mode == Mode::Normal && !disableCa ? "localhost" : "127.0.0.1"), mode == Mode::Head ? "HEAD" : upload.empty() ? "GET" : "POST", upload.size()); Require(sceHttp2AddRequestHeader(client.tmpl, "X-Inherited", "changed", 0) == 0, "template mutation"); @@ -353,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); @@ -480,6 +631,43 @@ void Refused(int ssl) { Require(sceHttp2GetStatusCode(client.request, &status) == static_cast(0x8041013d) && status == 123, "failed status untouched"); } +std::atomic lookups{0}; +std::atomic failedLookups{0}; + +int CountedLookup(const char*) { + return ++lookups <= failedLookups.load() ? -1 : 0; +} + +void Retries(int ssl) { + std::fprintf(stderr, "HTTP2 resolve retry scenarios\n"); + Http2SetLookupHook_nid_no_patch(CountedLookup); + { + Server server(Mode::Normal); + Client client(ssl); + Require(sceHttp2SetResolveRetry(client.tmpl, 2) == 0, "two resolve retries"); + client.Create(server.Url()); + lookups = 0; + failedLookups = 2; + Require(sceHttp2SendRequest(client.request, nullptr, 0) == 0, "a lookup that fails twice succeeds on its second retry"); + Require(lookups == 3, "two failed lookups and the third one were made"); + std::array buffer; + std::string body; + for (int count; (count = sceHttp2ReadData(client.request, buffer.data(), buffer.size())) > 0;) body.append(buffer.data(), static_cast(count)); + Require(body == "response body", "body after retried lookups"); + server.Join(); + } + for (const int retry : {0, 1}) { + Client client(ssl); + Require(sceHttp2SetResolveRetry(client.tmpl, retry) == 0, "resolve retry count"); + client.Create("https://127.0.0.1:1/"); + lookups = 0; + failedLookups = 100; + Require(Throws([&] { sceHttp2SendRequest(client.request, nullptr, 0); }), "every lookup failing fails the request"); + Require(lookups == retry + 1, "a request makes its retry count plus one lookups before failing"); + } + Http2SetLookupHook_nid_no_patch(nullptr); +} + void Capacity(int ssl) { Server server(Mode::StallBody); Client client(ssl, 1); @@ -547,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}) { @@ -556,6 +750,7 @@ int main(int argc, char** argv) { } Refused(ssl); Capacity(ssl); + Retries(ssl); const int untrusted = sceSslInit_nid_postfix(8 * 1024 * 1024); Require(untrusted > 0, "untrusted SSL context"); Failure(untrusted, Mode::Normal); diff --git a/core/libs/tests/GuestIcuConverterCallbacks.cpp b/core/libs/tests/GuestIcuConverterCallbacks.cpp new file mode 100644 index 000000000000..d22162f2cd84 --- /dev/null +++ b/core/libs/tests/GuestIcuConverterCallbacks.cpp @@ -0,0 +1,165 @@ +#include "prx/libSceIcu/libSceIcu.hpp" +#include +#include +#include +#include +#include +#include + +namespace { + +void Require(bool condition, const char* message) { + if (condition) return; + std::fprintf(stderr, "ICU converter callbacks: %s\n", message); + std::abort(); +} + +template +bool Rejects(TCall call) { + try { + call(); + } catch (const std::invalid_argument&) { + return true; + } + return false; +} + +template +void CheckError(TCall call, std::int32_t initial, bool cleared) { + std::array storage{0x13579bdf, initial, 0x2468ace0}; + errno = 73; + call(&storage[1]); + Require(storage[1] == (cleared ? 0 : initial), "error policy result"); + Require(storage.front() == 0x13579bdf && storage.back() == 0x2468ace0, "error write stays within one int32"); + Require(errno == 73, "callback preserves errno"); +} + +struct PointCase { + std::int32_t point; + bool ignorable; +}; + +constexpr PointCase Points[]{ + {INT32_MIN, false}, {-1, false}, {0, false}, {0x41, false}, + {0xac, false}, {0xad, true}, {0xae, false}, + {0x34e, false}, {0x34f, true}, {0x350, false}, + {0x61b, false}, {0x61c, true}, {0x61d, false}, + {0x115e, false}, {0x115f, true}, {0x1160, true}, {0x1161, false}, + {0x17b3, false}, {0x17b4, true}, {0x17b5, true}, {0x17b6, false}, + {0x180a, false}, {0x180b, true}, {0x180e, true}, {0x180f, true}, {0x1810, false}, + {0x200a, false}, {0x200b, true}, {0x200f, true}, {0x2010, false}, + {0x2029, false}, {0x202a, true}, {0x202e, true}, {0x202f, false}, + {0x205f, false}, {0x2060, true}, {0x206f, true}, {0x2070, false}, + {0x3163, false}, {0x3164, true}, {0x3165, false}, + {0xd800, false}, {0xdfff, false}, + {0xfdff, false}, {0xfe00, true}, {0xfe0f, true}, {0xfe10, false}, + {0xfefe, false}, {0xfeff, true}, {0xff00, false}, + {0xff9f, false}, {0xffa0, true}, {0xffa1, false}, + {0xffef, false}, {0xfff0, true}, {0xfff8, true}, {0xfff9, false}, + {0x1bc9f, false}, {0x1bca0, true}, {0x1bca3, true}, {0x1bca4, false}, + {0x1d172, false}, {0x1d173, true}, {0x1d17a, true}, {0x1d17b, false}, + {0xdffff, false}, {0xe0000, true}, {0xe0fff, true}, {0xe1000, false}, + {0x10ffff, false}, {0x110000, false}, {INT32_MAX, false} +}; + +void PolicyMatrix() { + const std::array contextBytes{'i', 'x', 0, 'I'}; + const std::array contexts{nullptr, &contextBytes[0], &contextBytes[1], &contextBytes[2], &contextBytes[3]}; + constexpr bool skipPolicy[5][8]{ + {true, true, true, false, false, false, false, false}, + {true, false, false, false, false, false, false, false}, + {false, false, false, false, false, false, false, false}, + {false, false, false, false, false, false, false, false}, + {false, false, false, false, false, false, false, false} + }; + std::array arguments; + arguments.fill(0x5a); + const std::array units{0xd800, 0, 0xbeef}; + const std::array bytes{static_cast(0xff), 0, 'Z'}; + for (std::int32_t reason = 0; reason <= 7; ++reason) { + for (std::size_t context = 0; context < contexts.size(); ++context) { + for (const auto& point : Points) { + const bool stopClears = reason == 0 && point.ignorable; + const bool skipClears = stopClears || skipPolicy[context][reason]; + const auto stop = [&](std::int32_t* error) { + UCNV_FROM_U_CALLBACK_STOP_nid_postfix(contexts[context], reinterpret_cast(arguments.data()), units.data(), INT32_MIN, point.point, reason, error); + }; + const auto skip = [&](std::int32_t* error) { + UCNV_FROM_U_CALLBACK_SKIP_nid_postfix(contexts[context], reinterpret_cast(arguments.data()), units.data(), INT32_MAX, point.point, reason, error); + }; + for (std::int32_t initial : {0, 10, 12, -128, INT32_MIN, INT32_MAX}) { + CheckError(stop, initial, stopClears); + CheckError(skip, initial, skipClears); + } + Require(Rejects([&] { stop(nullptr); }) == stopClears, "FROM STOP only requires an error pointer when writing"); + Require(Rejects([&] { skip(nullptr); }) == skipClears, "FROM SKIP only requires an error pointer when writing"); + } + const auto stop = [&](std::int32_t* error) { + UCNV_TO_U_CALLBACK_STOP_nid_postfix(contexts[context], reinterpret_cast(arguments.data()), bytes.data(), INT32_MAX, reason, error); + }; + const auto skip = [&](std::int32_t* error) { + UCNV_TO_U_CALLBACK_SKIP_nid_postfix(contexts[context], reinterpret_cast(arguments.data()), bytes.data(), INT32_MIN, reason, error); + }; + for (std::int32_t initial : {0, 10, 12, -128, INT32_MIN, INT32_MAX}) { + CheckError(stop, initial, false); + CheckError(skip, initial, skipPolicy[context][reason]); + } + Require(!Rejects([&] { stop(nullptr); }), "TO STOP never requires an error pointer"); + Require(Rejects([&] { skip(nullptr); }) == skipPolicy[context][reason], "TO SKIP only requires an error pointer when writing"); + } + } + for (auto byte : arguments) Require(byte == 0x5a, "converter argument storage is untouched"); + Require(units == std::array{0xd800, 0, 0xbeef}, "UTF-16 input is untouched"); + Require(bytes == std::array{static_cast(0xff), 0, 'Z'}, "byte input is untouched"); + Require(contextBytes == std::array{'i', 'x', 0, 'I'}, "context is untouched"); +} + +void IgnoredPointers() { + const auto* unused = reinterpret_cast(std::uintptr_t{1}); + auto* from = reinterpret_cast(std::uintptr_t{1}); + auto* to = reinterpret_cast(std::uintptr_t{1}); + auto* error = reinterpret_cast(std::uintptr_t{1}); + const auto* units = reinterpret_cast(std::uintptr_t{1}); + const auto* bytes = reinterpret_cast(std::uintptr_t{1}); + for (std::int32_t reason = 3; reason <= 7; ++reason) { + UCNV_FROM_U_CALLBACK_STOP_nid_postfix(unused, from, units, -1, 0xad, reason, error); + UCNV_FROM_U_CALLBACK_SKIP_nid_postfix(unused, from, units, -1, 0xad, reason, error); + UCNV_TO_U_CALLBACK_STOP_nid_postfix(unused, to, bytes, -1, reason, error); + UCNV_TO_U_CALLBACK_SKIP_nid_postfix(unused, to, bytes, -1, reason, error); + } + for (std::int32_t reason = 0; reason <= 2; ++reason) + UCNV_TO_U_CALLBACK_STOP_nid_postfix(unused, to, bytes, -1, reason, error); + UCNV_FROM_U_CALLBACK_STOP_nid_postfix(unused, from, units, -1, 0x41, 0, error); + std::int32_t status = 10; + UCNV_FROM_U_CALLBACK_STOP_nid_postfix(unused, from, units, -1, 0xad, 0, &status); + Require(status == 0, "FROM STOP default-ignorable handling does not read context or converter state"); + status = 10; + UCNV_FROM_U_CALLBACK_SKIP_nid_postfix(unused, from, units, -1, 0xad, 0, &status); + Require(status == 0, "FROM SKIP default-ignorable handling precedes context access"); + status = 12; + UCNV_FROM_U_CALLBACK_SKIP_nid_postfix(nullptr, nullptr, nullptr, 0, 0x41, 1, &status); + Require(status == 0, "FROM SKIP accepts unused null conversion pointers"); + status = 12; + UCNV_TO_U_CALLBACK_SKIP_nid_postfix(nullptr, nullptr, nullptr, 0, 1, &status); + Require(status == 0, "TO SKIP accepts unused null conversion pointers"); +} + +void InvalidReasons() { + const auto* unused = reinterpret_cast(std::uintptr_t{1}); + std::int32_t status = 10; + for (std::int32_t reason : {INT32_MIN, -1, 8, INT32_MAX}) { + Require(Rejects([&] { UCNV_FROM_U_CALLBACK_STOP_nid_postfix(unused, nullptr, nullptr, 0, 0xad, reason, &status); }), "FROM STOP rejects values outside the enum range"); + Require(Rejects([&] { UCNV_FROM_U_CALLBACK_SKIP_nid_postfix(unused, nullptr, nullptr, 0, 0xad, reason, &status); }), "FROM SKIP rejects values outside the enum range"); + Require(Rejects([&] { UCNV_TO_U_CALLBACK_STOP_nid_postfix(unused, nullptr, nullptr, 0, reason, &status); }), "TO STOP rejects values outside the enum range"); + Require(Rejects([&] { UCNV_TO_U_CALLBACK_SKIP_nid_postfix(unused, nullptr, nullptr, 0, reason, &status); }), "TO SKIP rejects values outside the enum range"); + Require(status == 10, "invalid reasons preserve the error"); + } +} + +} + +int main() { + PolicyMatrix(); + IgnoredPointers(); + InvalidReasons(); +} diff --git a/core/libs/tests/GuestIcuUtf8.cpp b/core/libs/tests/GuestIcuUtf8.cpp new file mode 100644 index 000000000000..44b2297a7436 --- /dev/null +++ b/core/libs/tests/GuestIcuUtf8.cpp @@ -0,0 +1,234 @@ +#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 UTF-8 check failed at line %u\n", location.line()); + std::abort(); +} + +template +void Rejects(TCall call) { + try { + call(); + } catch (const std::invalid_argument&) { + return; + } + Require(false); +} + +std::int32_t Error(int consumed, int strict) { + if (strict == -3) return 0xfffd; + if (strict < 0) return -1; + constexpr std::array legacy{0x15, 0x9f, 0xffff, 0x10ffff}; + return legacy[consumed]; +} + +void Sequence(std::initializer_list bytes, int strict, std::int32_t nextValue, int nextIndex, + std::int32_t previousValue, int previousIndex, int backIndex) { + for (int origin : {0, 3}) { + std::array text; + text.fill(0x80); + std::copy(bytes.begin(), bytes.end(), text.begin() + origin); + const auto original = text; + const auto length = static_cast(bytes.size()); + auto index = origin + 1; + Require(utf8_nextCharSafeBody_nid_postfix(text.data(), &index, origin + length, text[origin], static_cast(strict)) == nextValue); + Require(index == origin + nextIndex); + index = origin + length - 1; + Require(utf8_prevCharSafeBody_nid_postfix(text.data(), origin, &index, text[index], static_cast(strict)) == previousValue); + Require(index == origin + previousIndex); + Require(utf8_back1SafeBody_nid_postfix(text.data(), origin, origin + length - 1) == origin + backIndex); + Require(text == original); + } +} + +void ErrorModes() { + for (int strict = -128; strict <= 127; ++strict) { + const auto e0 = Error(0, strict); + const auto e1 = Error(1, strict); + const auto e2 = Error(2, strict); + const auto e3 = Error(3, strict); + Sequence({0x41}, strict, e0, 1, e0, 0, 0); + Sequence({0xc2, 0xa2}, strict, 0xa2, 2, 0xa2, 0, 0); + Sequence({0xe2, 0x82, 0xac}, strict, 0x20ac, 3, 0x20ac, 0, 0); + Sequence({0xf0, 0x9f, 0x98, 0x80}, strict, 0x1f600, 4, 0x1f600, 0, 0); + Sequence({0xc0, 0x80}, strict, e0, 1, e0, 1, 1); + Sequence({0xc1, 0xbf}, strict, e0, 1, e0, 1, 1); + Sequence({0xe0, 0x80, 0x80}, strict, e0, 1, e0, 2, 2); + Sequence({0xf0, 0x80, 0x80, 0x80}, strict, e0, 1, e0, 3, 3); + Sequence({0xf4, 0x90, 0x80, 0x80}, strict, e0, 1, e0, 3, 3); + Sequence({0xf5, 0x80, 0x80, 0x80}, strict, e0, 1, e0, 3, 3); + Sequence({0xff, 0xbf, 0xbf, 0xbf}, strict, e0, 1, e0, 3, 3); + Sequence({0xe1, 0xa0}, strict, e1, 2, e1, 0, 0); + Sequence({0xf1, 0x90, 0x80}, strict, e2, 3, e2, 0, 0); + Sequence({0xf1, 0x90}, strict, e1, 2, e1, 0, 0); + Sequence({0xe1, 0xa0, 0x41}, strict, e1, 2, e0, 2, 2); + Sequence({0xf0, 0x9f, 0x98, 0x41}, strict, e2, 3, e0, 3, 3); + Sequence({0xef, 0xb7, 0x90}, strict, strict > 0 ? e2 : 0xfdd0, 3, strict > 0 ? e2 : 0xfdd0, 0, 0); + Sequence({0xf4, 0x8f, 0xbf, 0xbf}, strict, strict > 0 ? e3 : 0x10ffff, 4, strict > 0 ? e3 : 0x10ffff, 0, 0); + Sequence({0xed, 0xa0, 0x80}, strict, strict == -2 ? 0xd800 : e0, strict == -2 ? 3 : 1, + strict == -2 ? 0xd800 : e0, strict == -2 ? 0 : 2, 2); + Sequence({0xed, 0xa0}, strict, strict == -2 ? e1 : e0, strict == -2 ? 2 : 1, e0, 1, 1); + Sequence({0x80, 0x80, 0x80, 0x80}, strict, e0, 1, e0, 3, 3); + Sequence({0xe0, 0xa0, 0x80}, strict, 0x800, 3, 0x800, 0, 0); + Sequence({0xe0, 0x9f, 0xbf}, strict, e0, 1, e0, 2, 2); + Sequence({0xef, 0xbf, 0xbe}, strict, strict > 0 ? e2 : 0xfffe, 3, strict > 0 ? e2 : 0xfffe, 0, 0); + Sequence({0xf0, 0x9f, 0xbf, 0xbe}, strict, strict > 0 ? e3 : 0x1fffe, 4, strict > 0 ? e3 : 0x1fffe, 0, 0); + } +} + +int Encode(std::uint32_t value, std::uint8_t* output) { + if (value <= 0x7f) { + output[0] = static_cast(value); + return 1; + } + if (value <= 0x7ff) { + output[0] = static_cast(0xc0 + value / 64); + output[1] = static_cast(0x80 + value % 64); + return 2; + } + if (value <= 0xffff) { + output[0] = static_cast(0xe0 + value / 4096); + output[1] = static_cast(0x80 + value / 64 % 64); + output[2] = static_cast(0x80 + value % 64); + return 3; + } + output[0] = static_cast(0xf0 + value / 262144); + output[1] = static_cast(0x80 + value / 4096 % 64); + output[2] = static_cast(0x80 + value / 64 % 64); + output[3] = static_cast(0x80 + value % 64); + return 4; +} + +void ScalarRoundTrips() { + for (std::int32_t value = 0x80; value <= 0x10ffff; ++value) { + if (value >= 0xd800 && value <= 0xdfff) continue; + std::array encoded{}; + const int length = Encode(value, encoded.data() + 1); + auto index = std::int32_t{2}; + Require(utf8_nextCharSafeBody_nid_postfix(encoded.data(), &index, length + 1, encoded[1], -1) == value); + Require(index == length + 1); + index = length; + Require(utf8_prevCharSafeBody_nid_postfix(encoded.data(), 1, &index, encoded[length], -1) == value); + Require(index == 1); + for (int last = 2; last <= length; ++last) { + Require(utf8_back1SafeBody_nid_postfix(encoded.data(), 1, last) == 1); + Require(utf8_back1SafeBody_nid_postfix(encoded.data(), 2, last) == last); + } + std::array actual; + actual.fill(0x55); + std::int8_t error = -37; + Require(utf8_appendCharSafeBody_nid_postfix(actual.data(), 1, length + 1, value, &error) == length + 1); + Require(error == -37); + Require(std::equal(encoded.begin() + 1, encoded.begin() + 1 + length, actual.begin() + 1)); + Require(actual[0] == 0x55 && actual[length + 1] == 0x55); + } + for (std::int32_t value = 0; value <= 0x7f; ++value) { + std::array text{0x55, 0x55, 0x55, 0x55}; + std::int8_t error = 29; + Require(utf8_appendCharSafeBody_nid_postfix(text.data(), 1, 3, value, &error) == 3); + Require(text[0] == 0x55 && text[1] == 0xc0 + value / 64 && text[2] == 0x80 + value % 64 && text[3] == 0x55); + Require(error == 29); + } +} + +void AppendFailures() { + constexpr std::array values{-1, INT32_MIN, 0, 0x7f, 0x80, 0x7ff, 0x800, 0xd800, 0xdfff, 0x10000, 0x110000, INT32_MAX}; + constexpr std::array, 4> replacements{{{}, {0x15}, {0xc2, 0x9f}, {0xef, 0xbf, 0xbf}}}; + for (const auto value : values) { + const bool valid = value >= 0 && value <= 0x10ffff && !(value >= 0xd800 && value <= 0xdfff); + const int width = value <= 0x7ff ? 2 : value <= 0xffff ? 3 : 4; + for (int space = -2; space <= 5; ++space) { + if (valid && space >= width) continue; + for (bool hasError : {false, true}) { + std::array text; + text.fill(0x55); + std::int8_t error = 47; + const int count = hasError ? 0 : std::clamp(space, 0, 3); + Require(utf8_appendCharSafeBody_nid_postfix(text.data(), 2, 2 + space, value, hasError ? &error : nullptr) == 2 + count); + Require(error == (hasError ? 1 : 47)); + for (int index = 0; index < static_cast(text.size()); ++index) { + Require(text[index] == (index >= 2 && index < 2 + count ? replacements[count][index - 2] : 0x55)); + } + } + } + } +} + +void TerminatedAndBounded() { + constexpr std::array sequence{0xf0, 0x90, 0x80, 0x80}; + for (int size = 1; size <= 4; ++size) { + auto text = std::make_unique(size + 1); + std::copy_n(sequence.begin(), size, text.get()); + text[size] = 0; + for (std::int32_t length : {-1, -7, INT32_MIN, size}) { + auto index = std::int32_t{1}; + Require(utf8_nextCharSafeBody_nid_postfix(text.get(), &index, length, sequence[0], -3) == (size == 4 ? 0x10000 : 0xfffd)); + Require(index == size); + } + auto index = static_cast(size - 1); + const auto last = index; + Require(utf8_prevCharSafeBody_nid_postfix(text.get(), last, &index, text[last], -1) == -1); + Require(index == last); + Require(utf8_back1SafeBody_nid_postfix(text.get(), last, last) == last); + } + for (int byte = 0; byte <= 255; ++byte) { + std::array text{static_cast(byte), 0x80}; + auto index = std::int32_t{1}; + Require(utf8_nextCharSafeBody_nid_postfix(text.data(), &index, 1, byte, -1) == -1 && index == 1); + } +} + +void InvalidArguments() { + std::array text{0xf0, 0x90, 0x80, 0x80}; + std::int32_t index = 1; + Rejects([&] { utf8_nextCharSafeBody_nid_postfix(text.data(), nullptr, 4, 0xf0, -1); }); + Rejects([&] { utf8_prevCharSafeBody_nid_postfix(text.data(), 0, nullptr, 0x80, -1); }); + Rejects([&] { utf8_nextCharSafeBody_nid_postfix(nullptr, &index, 4, 0xf0, -1); }); + Rejects([&] { utf8_prevCharSafeBody_nid_postfix(nullptr, 0, &index, 0x80, -1); }); + Rejects([&] { utf8_back1SafeBody_nid_postfix(nullptr, 0, 0); }); + Rejects([&] { utf8_appendCharSafeBody_nid_postfix(nullptr, 0, 4, 0x10000, nullptr); }); + Rejects([&] { utf8_appendCharSafeBody_nid_postfix(text.data(), -1, 4, 0x80, nullptr); }); + index = -1; + Rejects([&] { utf8_nextCharSafeBody_nid_postfix(text.data(), &index, 4, 0xf0, -1); }); + index = 3; + Rejects([&] { utf8_nextCharSafeBody_nid_postfix(text.data(), &index, 2, 0xf0, -1); }); + Rejects([&] { utf8_prevCharSafeBody_nid_postfix(text.data(), 4, &index, 0x80, -1); }); + Rejects([&] { utf8_back1SafeBody_nid_postfix(text.data(), -1, 0); }); + index = 0; + Require(utf8_nextCharSafeBody_nid_postfix(nullptr, &index, 0, 0xf0, -1) == -1 && index == 0); + Require(utf8_prevCharSafeBody_nid_postfix(nullptr, 0, &index, 0x80, -1) == -1 && index == 0); + for (const auto value : {0, 0x80, 0x800, 0xd800, 0x10000}) { + const int width = value <= 0x7ff ? 2 : value <= 0xffff ? 3 : 4; + const int position = INT32_MAX - (width - 1); + std::int8_t error = 0; + Require(utf8_appendCharSafeBody_nid_postfix(nullptr, position, INT32_MAX, value, &error) == position && error == 1); + Rejects([&] { utf8_appendCharSafeBody_nid_postfix(nullptr, position + 1, INT32_MAX, value, &error); }); + } + Rejects([] { utf8_appendCharSafeBody_nid_postfix(nullptr, INT32_MAX, INT32_MIN, -1, nullptr); }); + std::int8_t error = 0; + Require(utf8_appendCharSafeBody_nid_postfix(nullptr, INT32_MAX, INT32_MIN, -1, &error) == INT32_MAX && error == 1); + Require(utf8_appendCharSafeBody_nid_postfix(nullptr, 0, INT32_MIN, -1, nullptr) == 0); +} + +} + +int main() { + ErrorModes(); + ScalarRoundTrips(); + AppendFailures(); + TerminatedAndBounded(); + InvalidArguments(); +} diff --git a/core/libs/tests/GuestIcuVersion.cpp b/core/libs/tests/GuestIcuVersion.cpp index b464003cac1d..31c85b68c502 100644 --- a/core/libs/tests/GuestIcuVersion.cpp +++ b/core/libs/tests/GuestIcuVersion.cpp @@ -91,6 +91,77 @@ void UCharsToChars() { Require(Rejects([&] { u_UCharsToChars_nid_postfix(units.data(), nullptr, 1); }), "null destination rejected"); } +void AuStrcpy() { + std::array chars; + chars.fill('X'); + Require(u_austrcpy_nid_postfix(chars.data(), u"") == chars.data(), "empty copy returns destination"); + Require(chars[0] == 0 && chars[1] == 'X', "empty copy writes only terminator"); + + chars.fill('X'); + Require(u_austrcpy_nid_postfix(chars.data(), u"Ab_9") == chars.data(), "ASCII copy returns destination"); + Require(std::memcmp(chars.data(), "Ab_9\0XXX", chars.size()) == 0, "ASCII characters and terminator copy"); + + chars.fill('X'); + u_austrcpy_nid_postfix(chars.data(), u"A!#$@B"); + Require(std::memcmp(chars.data(), "A!#$@B\0X", chars.size()) == 0, "punctuation outside the invariant set copies unchanged"); + + std::array asciiUnits; + for (std::size_t index = 0; index < 127; ++index) asciiUnits[index] = static_cast(index + 1); + asciiUnits[127] = 0; + std::array asciiChars; + asciiChars.fill('X'); + Require(u_austrcpy_nid_postfix(asciiChars.data(), asciiUnits.data()) == asciiChars.data(), "full ASCII copy returns destination"); + for (std::size_t index = 0; index < 127; ++index) + Require(asciiChars[index] == static_cast(index + 1), "every unit in 0x01-0x7f copies unchanged"); + Require(asciiChars[127] == 0 && asciiChars[128] == 'X', "full ASCII copy writes terminator without overrun"); + + Require(Rejects([&] { u_austrcpy_nid_postfix(nullptr, u"a"); }), "null destination rejected"); + Require(Rejects([&] { u_austrcpy_nid_postfix(chars.data(), nullptr); }), "null source rejected"); +} + +void AuStrncpy() { + std::array chars; + chars.fill('X'); + Require(u_austrncpy_nid_postfix(chars.data(), u"Abcdef", 3) == chars.data(), "truncated copy returns destination"); + Require(std::memcmp(chars.data(), "AbcXXXXX", chars.size()) == 0, "truncated copy omits terminator"); + + chars.fill('X'); + u_austrncpy_nid_postfix(chars.data(), u"Abc", 3); + Require(std::memcmp(chars.data(), "AbcXXXXX", chars.size()) == 0, "exact-length copy omits terminator"); + + chars.fill('X'); + u_austrncpy_nid_postfix(chars.data(), u"Abc", 6); + Require(std::memcmp(chars.data(), "Abc\0XXXX", chars.size()) == 0, "longer bound writes one terminator without padding"); + + chars.fill('X'); + u_austrncpy_nid_postfix(chars.data(), u"A!#$@", 7); + Require(std::memcmp(chars.data(), "A!#$@\0XX", chars.size()) == 0, "non-invariant ASCII units copy unchanged within bound"); + + std::array asciiUnits; + for (std::size_t index = 0; index < 127; ++index) asciiUnits[index] = static_cast(index + 1); + asciiUnits[127] = 0; + std::array asciiChars; + asciiChars.fill('X'); + Require(u_austrncpy_nid_postfix(asciiChars.data(), asciiUnits.data(), 128) == asciiChars.data(), "bounded full ASCII copy returns destination"); + for (std::size_t index = 0; index < 127; ++index) + Require(asciiChars[index] == static_cast(index + 1), "every unit in 0x01-0x7f copies unchanged in bounded copy"); + Require(asciiChars[127] == 0 && asciiChars[128] == 'X', "bounded full ASCII copy writes terminator without overrun"); + + const std::array unterminated{u'!', u'$', u'@'}; + chars.fill('X'); + u_austrncpy_nid_postfix(chars.data(), unterminated.data(), 3); + Require(std::memcmp(chars.data(), "!$@XXXXX", chars.size()) == 0, "bounded copy stops at count without reading past it"); + + chars.fill('X'); + Require(u_austrncpy_nid_postfix(chars.data(), u"Abc", 0) == chars.data(), "zero count returns destination"); + Require(u_austrncpy_nid_postfix(chars.data(), u"Abc", -2) == chars.data(), "negative count returns destination"); + Require(chars[0] == 'X', "nonpositive counts write nothing"); + Require(u_austrncpy_nid_postfix(nullptr, nullptr, 0) == nullptr, "zero count allows null pointers"); + Require(u_austrncpy_nid_postfix(chars.data(), nullptr, -1) == chars.data(), "negative count allows null source"); + Require(Rejects([&] { u_austrncpy_nid_postfix(nullptr, u"a", 1); }), "null destination with positive count rejected"); + Require(Rejects([&] { u_austrncpy_nid_postfix(chars.data(), nullptr, 1); }), "null source with positive count rejected"); +} + void VersionFromString() { Require(FromString("1.2.3.4") == Version{1, 2, 3, 4}, "four parts"); Require(FromString("65.1") == Version{65, 1, 0, 0}, "missing parts are zero"); @@ -150,6 +221,8 @@ void RoundTrip() { int main() { CharsToUChars(); UCharsToChars(); + AuStrcpy(); + AuStrncpy(); VersionFromString(); VersionFromUString(); VersionToString(); diff --git a/core/libs/tests/GuestImeModalDialog.cpp b/core/libs/tests/GuestImeModalDialog.cpp new file mode 100644 index 000000000000..07161169e081 --- /dev/null +++ b/core/libs/tests/GuestImeModalDialog.cpp @@ -0,0 +1,184 @@ +#include "prx/libSceIme/include/ModalDialog.hpp" +#include +#include +#include +#include + +namespace { + +constexpr std::uint32_t Left = 0x0080; +constexpr std::uint32_t Right = 0x0020; +constexpr std::uint32_t Circle = 0x2000; +constexpr std::uint32_t Cross = 0x4000; + +void Require(bool value, const char* what) { + if (value) return; + std::fprintf(stderr, "FAIL %s\n", what); + std::exit(1); +} + +void IgnoreText(ImeHostInputKind, const char16_t*, std::size_t) {} + +ModalDialogRequest YesNo(std::size_t focus, std::size_t cancel) { + ModalDialogRequest request; + request.message = u"Overwrite?"; + request.buttons = {u"Yes", u"No"}; + request.focus = focus; + request.cancel = cancel; + return request; +} + +ImeHostPad Pad(std::uint32_t buttons, std::uint8_t leftX = 128) { + ImeHostPad pad; + pad.buttons = buttons; + pad.leftX = leftX; + return pad; +} + +std::size_t Chosen(ModalDialogState expected) { + std::size_t chosen = 7; + Require(ModalDialogPoll_nid_postfix(chosen) == expected, "unexpected state"); + return chosen; +} + +} + +int main() { + Require(!ModalDialogHasPresenter_nid_postfix(), "a presenter is registered at start"); + Require(!ModalDialogOpen_nid_postfix(YesNo(0, 1)), "opened without a presenter"); + Chosen(ModalDialogState::Idle); + Require(!ModalDialogCapturesInput_nid_postfix(), "captures input while idle"); + + ModalDialogSetPresenter_nid_postfix(true); + Require(ModalDialogHasPresenter_nid_postfix(), "presenter not registered"); + ModalDialogRequest none; + Require(!ModalDialogOpen_nid_postfix(none), "opened without buttons"); + ModalDialogRequest four = YesNo(0, 1); + four.buttons = {u"a", u"b", u"c", u"d"}; + Require(!ModalDialogOpen_nid_postfix(four), "opened with four buttons"); + Require(!ModalDialogOpen_nid_postfix(YesNo(2, 1)), "opened with a focus past the buttons"); + Require(!ModalDialogOpen_nid_postfix(YesNo(0, 2)), "opened with a cancel button past the buttons"); + Chosen(ModalDialogState::Idle); + + Require(ModalDialogOpen_nid_postfix(YesNo(0, 1)), "valid request refused"); + Require(!ModalDialogOpen_nid_postfix(YesNo(0, 1)), "second open accepted while showing"); + Chosen(ModalDialogState::Showing); + Require(ModalDialogCapturesInput_nid_postfix(), "does not capture input while showing"); + ModalDialogView view; + Require(ModalDialogReadView_nid_postfix(view), "no view while showing"); + Require(view.message == u"Overwrite?" && view.buttons.size() == 2, "view content"); + Require(view.buttons[0].selected && !view.buttons[1].selected && view.buttons[1].label == u"No", "view focus"); + + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Previous); + Require(ModalDialogReadView_nid_postfix(view) && view.buttons[0].selected, "focus moved before the first button"); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Next); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Next); + Require(ModalDialogReadView_nid_postfix(view) && view.buttons[1].selected, "focus moved past the last button"); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Confirm); + Require(Chosen(ModalDialogState::Answered) == 1, "confirm did not choose the focused button"); + Require(!ModalDialogCapturesInput_nid_postfix(), "captures input once answered"); + Require(!ModalDialogReadView_nid_postfix(view), "view after the answer"); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Previous); + Require(Chosen(ModalDialogState::Answered) == 1, "an answered dialog changed"); + + Require(ModalDialogOpen_nid_postfix(YesNo(1, 1)), "reopen refused after an answer"); + Chosen(ModalDialogState::Showing); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Cancel); + Require(Chosen(ModalDialogState::Answered) == 1, "cancel did not choose the cancel button"); + + ModalDialogRequest noCancel = YesNo(0, ModalDialogNoButton); + Require(ModalDialogOpen_nid_postfix(noCancel), "request without cancel refused"); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Cancel); + Chosen(ModalDialogState::Showing); + ModalDialogClose_nid_postfix(); + Chosen(ModalDialogState::Closed); + Require(!ModalDialogCapturesInput_nid_postfix(), "captures input once closed"); + ModalDialogReset_nid_postfix(); + Chosen(ModalDialogState::Idle); + + Require(ModalDialogOpen_nid_postfix(YesNo(0, 1)), "reopen refused after a reset"); + ModalDialogPublishPad_nid_postfix(Pad(Cross)); + Chosen(ModalDialogState::Showing); + ModalDialogPublishPad_nid_postfix(Pad(0)); + ModalDialogPublishPad_nid_postfix(Pad(Right)); + Require(ModalDialogReadView_nid_postfix(view) && view.buttons[1].selected, "D-pad right did not move the focus"); + ModalDialogPublishPad_nid_postfix(Pad(Right)); + ModalDialogPublishPad_nid_postfix(Pad(0)); + ModalDialogPublishPad_nid_postfix(Pad(0, 20)); + Require(ModalDialogReadView_nid_postfix(view) && view.buttons[0].selected, "stick left did not move the focus"); + ModalDialogPublishPad_nid_postfix(Pad(0, 128)); + ModalDialogPublishPad_nid_postfix(Pad(Left)); + Require(ModalDialogReadView_nid_postfix(view) && view.buttons[0].selected, "focus moved before the first button"); + ModalDialogPublishPad_nid_postfix(Pad(0)); + ModalDialogPublishPad_nid_postfix(Pad(Circle)); + Require(Chosen(ModalDialogState::Answered) == 1, "Circle did not cancel"); + + Require(ModalDialogOpen_nid_postfix(YesNo(0, 1)), "reopen refused"); + ModalDialogPublishPad_nid_postfix(Pad(Cross | Circle)); + ModalDialogPublishPad_nid_postfix(Pad(Cross | Circle)); + Chosen(ModalDialogState::Showing); + ModalDialogPublishPad_nid_postfix(Pad(0)); + ModalDialogPublishPad_nid_postfix(Pad(Cross)); + Require(Chosen(ModalDialogState::Answered) == 0, "Cross did not confirm the focused button"); + + Require(ModalDialogOpen_nid_postfix(YesNo(0, 1)), "reopen refused before the IME check"); + ImeSetHostTextSink_nid_no_patch(&IgnoreText); + Require(!ModalDialogCapturesInput_nid_postfix(), "captures input while the IME owns the keyboard"); + Require(!ModalDialogReadView_nid_postfix(view), "view while the IME owns the keyboard"); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Confirm); + Chosen(ModalDialogState::Showing); + ImeSetHostTextSink_nid_no_patch(nullptr); + Require(ModalDialogCapturesInput_nid_postfix(), "does not resume after the IME releases the keyboard"); + Require(ModalDialogReadView_nid_postfix(view), "no view after the IME releases the keyboard"); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Confirm); + Require(Chosen(ModalDialogState::Answered) == 0, "confirm after the IME released the keyboard"); + + ModalDialogSetPresenter_nid_postfix(false); + Require(!ModalDialogOpen_nid_postfix(YesNo(0, 1)), "opened after the presenter went away"); + + ModalDialogSetPresenter_nid_postfix(true); + ModalDialogReset_nid_postfix(); + ModalDialogSetShowTimeout_nid_postfix(40); + Require(ModalDialogOpen_nid_postfix(YesNo(0, 1)), "reopen refused before the timeout checks"); + Chosen(ModalDialogState::Showing); + Require(ModalDialogCapturesInput_nid_postfix(), "a new dialog does not capture input before the timeout"); + std::this_thread::sleep_for(std::chrono::milliseconds(120)); + Require(!ModalDialogCapturesInput_nid_postfix(), "an undrawn dialog still captures input after the timeout"); + Chosen(ModalDialogState::Unshown); + Require(!ModalDialogReadView_nid_postfix(view), "an undrawn dialog was drawn after the timeout"); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Confirm); + Chosen(ModalDialogState::Unshown); + Require(ModalDialogOpen_nid_postfix(YesNo(0, 1)), "an unshown dialog blocks the next one"); + Require(ModalDialogReadView_nid_postfix(view), "a new dialog is not drawn"); + std::this_thread::sleep_for(std::chrono::milliseconds(120)); + Require(ModalDialogCapturesInput_nid_postfix(), "a dialog that was drawn stopped capturing input"); + Chosen(ModalDialogState::Showing); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Confirm); + Require(Chosen(ModalDialogState::Answered) == 0, "a drawn dialog could not be answered after the timeout"); + ModalDialogReset_nid_postfix(); + ModalDialogSetShowTimeout_nid_postfix(ModalDialogShowTimeoutMilliseconds); + + ModalDialogRequest owned = YesNo(0, 1); + owned.owner = ModalDialogOwnerMsgDialog; + Require(ModalDialogOpen_nid_postfix(owned), "an owned dialog was refused"); + std::size_t other = 7; + Require(ModalDialogPoll_nid_postfix(other, ModalDialogOwnerErrorDialog) == ModalDialogState::Idle && other == ModalDialogNoButton, "another library sees the dialog"); + Require(ModalDialogPoll_nid_postfix(other, ModalDialogOwnerMsgDialog) == ModalDialogState::Showing, "the owner does not see its dialog"); + ModalDialogReset_nid_postfix(ModalDialogOwnerErrorDialog); + ModalDialogClose_nid_postfix(ModalDialogOwnerErrorDialog); + Require(ModalDialogPoll_nid_postfix(other, ModalDialogOwnerMsgDialog) == ModalDialogState::Showing && ModalDialogCapturesInput_nid_postfix(), "another library reset or closed the dialog"); + Require(ModalDialogReadView_nid_postfix(view), "the dialog is gone after another library's reset"); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Next); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Confirm); + Require(ModalDialogPoll_nid_postfix(other, ModalDialogOwnerMsgDialog) == ModalDialogState::Answered && other == 1, "the owner's answer was lost"); + ModalDialogReset_nid_postfix(ModalDialogOwnerErrorDialog); + Require(ModalDialogPoll_nid_postfix(other, ModalDialogOwnerMsgDialog) == ModalDialogState::Answered, "another library erased the answer"); + ModalDialogReset_nid_postfix(ModalDialogOwnerMsgDialog); + Require(ModalDialogPoll_nid_postfix(other, ModalDialogOwnerMsgDialog) == ModalDialogState::Idle, "the owner could not reset its dialog"); + + Require(ModalDialogOpen_nid_postfix(owned), "the dialog did not open again"); + ModalDialogClose_nid_postfix(ModalDialogOwnerMsgDialog); + Require(ModalDialogPoll_nid_postfix(other, ModalDialogOwnerMsgDialog) == ModalDialogState::Closed, "the owner could not close its dialog"); + ModalDialogReset_nid_postfix(); + ModalDialogSetPresenter_nid_postfix(false); +} diff --git a/core/libs/tests/GuestInvitationDialog.cpp b/core/libs/tests/GuestInvitationDialog.cpp index 37978bac5957..f7caafb0fc4d 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 779be13872df..7100b450b863 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 fea9861f9821..5b1b53b757cb 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/GuestKernelFcntl.cpp b/core/libs/tests/GuestKernelFcntl.cpp index d625cec04dd9..dc3737eb5e0b 100644 --- a/core/libs/tests/GuestKernelFcntl.cpp +++ b/core/libs/tests/GuestKernelFcntl.cpp @@ -110,7 +110,7 @@ static void SocketsKeepTheirPath() { Require(sceKernelFcntl(socket, SetFlags, 0) == 0); Require(sceKernelFcntl(socket, GetFlags) == ReadWrite); GuestLock lock{}; - Require(sceKernelFcntl(socket, GetLock, &lock) == SceEinval); + Require(sceKernelFcntl(socket, GetLock, &lock) == SceEbadf); Require(sceKernelFcntl(socket, GetDescriptorFlags) == 0); Require(sceKernelFcntl(socket, SetDescriptorFlags, 1) == 0); Require(sceKernelFcntl(socket, GetDescriptorFlags) == 1); @@ -194,6 +194,17 @@ static void SocketsKeepTheirPath() { Require(sceKernelFcntl(socket, GetFlags) == ReadWrite); Require(sceKernelFcntl(socket, 5) == SceEinval); Require(sceKernelFcntl(socket + 4096, GetFlags) == SceEbadf); + GuestLock socketLock{0, 0, 0, WriteLock, FromStart, 0}; + RequireFailure(fcntl_nid_postfix(socket, SetLock, &socketLock), GuestEbadf); + RequireFailure(fcntl_nid_postfix(socket, GetLock, &socketLock), GuestEbadf); + RequireFailure(fcntl_nid_postfix(socket, SetLockWait, &socketLock), GuestEbadf); + Require(sceKernelFcntl(socket, SetLock, &socketLock) == SceEbadf); + Require(sceKernelFcntl(socket, GetLock, &socketLock) == SceEbadf); + Require(sceKernelFcntl(socket, SetLockWait, &socketLock) == SceEbadf); + RequireFailure(fcntl_nid_postfix(socket, ReadAhead, 1), GuestEbadf); + RequireFailure(fcntl_nid_postfix(socket, DarwinReadAhead, 1), GuestEbadf); + Require(sceKernelFcntl(socket, ReadAhead, 1) == SceEbadf); + Require(sceKernelFcntl(socket, DarwinReadAhead, 1) == SceEbadf); int queued = -1; Require(ioctl_nid_postfix(socket, ReadableRequest, &queued) == 0 && queued == 0); RequireMalformedRequestsFail(socket); diff --git a/core/libs/tests/GuestKernelSys.cpp b/core/libs/tests/GuestKernelSys.cpp index f3d70f70e4bf..25969b5a016b 100644 --- a/core/libs/tests/GuestKernelSys.cpp +++ b/core/libs/tests/GuestKernelSys.cpp @@ -76,7 +76,18 @@ bool ThrowsNaming(Call call, const char* text) { return false; } -#ifndef _WIN32 +#ifdef _WIN32 +unsigned long LinkCount(const std::string& path) { + const HANDLE link = CreateFileW(std::filesystem::path(path).c_str(), 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, nullptr, OPEN_EXISTING, + FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS, nullptr); + Require(link != INVALID_HANDLE_VALUE); + BY_HANDLE_FILE_INFORMATION information{}; + const bool read = GetFileInformationByHandle(link, &information) != 0; + CloseHandle(link); + Require(read); + return information.nNumberOfLinks; +} +#else nlink_t LinkCount(const std::string& path) { struct stat status {}; Require(::lstat(path.c_str(), &status) == 0); @@ -84,6 +95,13 @@ nlink_t LinkCount(const std::string& path) { } #endif +std::string LinkTarget(const std::string& path) { + char buffer[256]{}; + const std::int64_t length = readlink_nid_postfix(path.c_str(), buffer, sizeof(buffer)); + Require(length > 0); + return std::string(buffer, static_cast(length)); +} + void OwnershipAndLinkTests(const std::filesystem::path& root) { constexpr std::uint32_t Unchanged = 0xFFFFFFFFu; const auto file = (root / "owned.txt").string(); @@ -152,27 +170,31 @@ void OwnershipAndLinkTests(const std::filesystem::path& root) { Require(lchown_nid_postfix(dangling.c_str(), 0, 0) == 0); Require(fchownat_nid_postfix(-100, dangling.c_str(), 0, 0, 0) == -1 && Error() == 2); Require(fchownat_nid_postfix(-100, dangling.c_str(), 0, 0, 0x200) == 0); -#ifndef _WIN32 const auto symbolicCopy = (root / "copy.link").string(); const auto danglingCopy = (root / "dangling.copy").string(); Require(linkat_nid_postfix(-100, symbolic.c_str(), -100, symbolicCopy.c_str(), 0) == 0); - Require(std::filesystem::read_symlink(symbolicCopy) == "owned.txt" && LinkCount(symbolic) == 2); + Require(LinkTarget(symbolicCopy) == "owned.txt" && LinkCount(symbolic) == 2); Require(std::filesystem::hard_link_count(file) == 2); Require(linkat_nid_postfix(directory, "dangling.link", directory, "dangling.copy", 0) == 0); - Require(std::filesystem::read_symlink(danglingCopy) == "missing.txt" && LinkCount(dangling) == 2); + Require(LinkTarget(danglingCopy) == "missing.txt" && LinkCount(dangling) == 2); Require(linkat_nid_postfix(-100, dangling.c_str(), -100, other.c_str(), 0x400) == -1 && Error() == 2); Require(linkat_nid_postfix(-100, symbolic.c_str(), -100, linked.c_str(), 0) == -1 && Error() == 17); Require(linkat_nid_postfix(-100, symbolic.c_str(), -100, (missing + "/inner").c_str(), 0) == -1 && Error() == 2); Require(linkat_nid_postfix(-100, symbolic.c_str(), -100, (throughFile + "/inner").c_str(), 0) == -1 && Error() == 20); Require(LinkCount(symbolic) == 2 && !std::filesystem::exists(std::filesystem::symlink_status(other))); + Require(unlink_nid_postfix(symbolicCopy.c_str()) == 0 && unlink_nid_postfix(danglingCopy.c_str()) == 0); + Require(LinkCount(symbolic) == 1 && LinkCount(dangling) == 1 && std::filesystem::hard_link_count(file) == 2); const auto folder = root / "folder"; const auto folderLink = (root / "folder.link").string(); - const auto folderCopy = (root / "folder.copy").string(); Require(std::filesystem::create_directory(folder) && symlink_nid_postfix("folder", folderLink.c_str()) == 0); Require(linkat_nid_postfix(-100, folderLink.c_str(), -100, other.c_str(), 0x400) == -1 && Error() == 1); +#ifdef _WIN32 + Require(RemoveDirectoryW(std::filesystem::path(folderLink).c_str()) != 0 && std::filesystem::remove(folder)); +#else + const auto folderCopy = (root / "folder.copy").string(); Require(linkat_nid_postfix(-100, folderLink.c_str(), -100, folderCopy.c_str(), 0) == 0); - Require(std::filesystem::read_symlink(folderCopy) == "folder" && LinkCount(folderLink) == 2); - Require(std::filesystem::remove(symbolicCopy) && std::filesystem::remove(danglingCopy) && std::filesystem::remove(folderCopy)); + Require(LinkTarget(folderCopy) == "folder" && LinkCount(folderLink) == 2); + Require(std::filesystem::remove(folderCopy)); Require(std::filesystem::remove(folderLink) && std::filesystem::remove(folder)); #endif Require(linkat_nid_postfix(-100, symbolic.c_str(), -100, other.c_str(), 0x400) == 0); @@ -569,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; @@ -770,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)); @@ -943,6 +1146,9 @@ int main() { CheckCondattrClock(); CheckAmmWriteCommands(); CheckAmmWaitCompletion(); + CheckAmmCommandWriters(); + CheckAmmWrittenWaitsRun(); + CheckAmmMapperCalls(); CheckAmmWaitConcurrentSubmits(); CheckSchedSetscheduler(); CheckSigreturn(); @@ -987,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/GuestKernelSysConsoleIdentity.cpp b/core/libs/tests/GuestKernelSysConsoleIdentity.cpp index 0775baa88501..dc953c7fbb61 100644 --- a/core/libs/tests/GuestKernelSysConsoleIdentity.cpp +++ b/core/libs/tests/GuestKernelSysConsoleIdentity.cpp @@ -6,11 +6,17 @@ #include #include #include +#include +#include +#include +#include +#include namespace { constexpr int GuestEperm = 1; constexpr int GuestEsrch = 3; +constexpr int GuestEfault = 14; void Require(bool condition, const char* message) { if (!condition) { @@ -19,7 +25,7 @@ void Require(bool condition, const char* message) { } } -void CheckConsoleKind() { +void CheckConsoleKind(bool ps4) { Require(sceKernelIsCEX() == 1, "the console must be reported as a retail unit"); Require(sceKernelIsDevKit() == 0, "the console must not be reported as a development kit"); Require(sceKernelIsGenuineCEX() == 1, "the console must be reported as a genuine retail unit"); @@ -28,6 +34,11 @@ void CheckConsoleKind() { Require(sceKernelIsTestKit() == 0, "the console must not be reported as a test kit"); Require(sceKernelIsProspero() == 1, "the architecture must be reported as Prospero"); Require(sceKernelIsKratos() == 0, "the architecture must not be reported as Kratos"); + if (ps4) { + Require(sceKernelIsPs4Process() == 1, "a CUSA title must be reported as a PS4 process"); + } else { + Require(sceKernelIsPs4Process() == 0, "the default process must not be reported as a PS4 process"); + } } void CheckAuthInfo() { @@ -37,6 +48,8 @@ void CheckAuthInfo() { } info; *__error_nid_postfix() = 0; Require(get_authinfo_nid_postfix(0, nullptr) == -1 && *__error_nid_postfix() == GuestEperm, "a null result must fail with EPERM"); + Require(get_authinfo_nid_postfix(0, reinterpret_cast(0x10)) == -1 && *__error_nid_postfix() == GuestEfault, + "an unwritable store must fail with EFAULT"); std::memset(&info, 0x5a, sizeof(info)); *__error_nid_postfix() = 0; Require(get_authinfo_nid_postfix(getpid_nid_postfix() + 1, &info.value) == -1 && *__error_nid_postfix() == GuestEsrch, @@ -69,9 +82,33 @@ void CheckOpenPsId() { } -int main() { - CheckConsoleKind(); +int main(int argc, char** argv) { + if (argc == 2 && std::string_view(argv[1]) == "ps4-child") { + CheckConsoleKind(true); + return 0; + } + CheckConsoleKind(false); CheckAuthInfo(); CheckOpenPsId(); + + const auto directory = std::filesystem::temp_directory_path() / ("ps4-identity-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() + "\" && \"" + argv[0] + "\" ps4-child\""; +#else + const std::string command = "cd \"" + directory.string() + "\" && \"" + argv[0] + "\" ps4-child"; +#endif + const int status = std::system(command.c_str()); + std::filesystem::remove_all(directory); + Require(status == 0, "the PS4 child process must succeed"); return 0; } diff --git a/core/libs/tests/GuestKernelSysModuleInternal.cpp b/core/libs/tests/GuestKernelSysModuleInternal.cpp index 34741ddc336d..84dc88f29566 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/GuestKernelSysNeoMode.cpp b/core/libs/tests/GuestKernelSysNeoMode.cpp new file mode 100644 index 000000000000..bc261dfcca44 --- /dev/null +++ b/core/libs/tests/GuestKernelSysNeoMode.cpp @@ -0,0 +1,175 @@ +#include "prx/libkernel_sys/libkernel_sys.hpp" +#include "prx/libkernel/include/Api.hpp" +#include "SceTypes.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +constexpr std::int32_t SupportNeoMode = 0x00800000; +constexpr std::int32_t SupportPsVrAndEnterCross = 0x00004002; + +struct Entry { + std::string key; + std::uint16_t format; + std::vector data; +}; + +void Require(bool condition, const char* message) { + if (!condition) { + std::fprintf(stderr, "KERNEL SYS NEO MODE: %s\n", message); + std::abort(); + } +} + +Entry Text(const std::string& key, const std::string& value) { + std::vector data(value.begin(), value.end()); + data.push_back(0); + return {key, 0x0204, data}; +} + +Entry Integer(const std::string& key, std::int32_t value) { + std::vector data(4); + std::memcpy(data.data(), &value, 4); + return {key, 0x0404, data}; +} + +void Put32(std::vector& bytes, std::size_t offset, std::uint32_t value) { + std::memcpy(bytes.data() + offset, &value, 4); +} + +std::vector Build(const std::vector& entries) { + std::vector keys; + std::vector data; + std::vector bytes(20 + entries.size() * 16); + for (std::size_t index = 0; index < entries.size(); ++index) { + const auto entry = 20 + index * 16; + const auto keyOffset = static_cast(keys.size()); + std::memcpy(bytes.data() + entry, &keyOffset, 2); + std::memcpy(bytes.data() + entry + 2, &entries[index].format, 2); + Put32(bytes, entry + 4, static_cast(entries[index].data.size())); + Put32(bytes, entry + 8, static_cast(entries[index].data.size())); + Put32(bytes, entry + 12, static_cast(data.size())); + keys.insert(keys.end(), entries[index].key.begin(), entries[index].key.end()); + keys.push_back(0); + data.insert(data.end(), entries[index].data.begin(), entries[index].data.end()); + } + while (keys.size() % 4 != 0) keys.push_back(0); + std::memcpy(bytes.data(), "\0PSF", 4); + Put32(bytes, 4, 0x0101); + Put32(bytes, 8, static_cast(bytes.size())); + Put32(bytes, 12, static_cast(bytes.size() + keys.size())); + Put32(bytes, 16, static_cast(entries.size())); + bytes.insert(bytes.end(), keys.begin(), keys.end()); + bytes.insert(bytes.end(), data.begin(), data.end()); + return bytes; +} + +std::filesystem::path Metadata(const std::filesystem::path& directory) { + const auto metadata = directory / "app0" / "sce_sys"; + std::filesystem::create_directories(metadata); + return metadata; +} + +void WriteParamSfo(const std::filesystem::path& directory, const std::vector& extra) { + std::vector entries{Text("TITLE", "Example"), Text("TITLE_ID", "CUSA00000")}; + entries.insert(entries.end(), extra.begin(), extra.end()); + const auto bytes = Build(entries); + std::ofstream file(Metadata(directory) / "param.sfo", std::ios::binary); + file.write(reinterpret_cast(bytes.data()), static_cast(bytes.size())); + Require(static_cast(file), "cannot write the param.sfo fixture"); +} + +void WriteParamJson(const std::filesystem::path& directory) { + std::ofstream file(Metadata(directory) / "param.json"); + file << R"({"titleId":"PPSA00000","localizedParameters":{"en-US":{"titleName":"Example"}}})"; + Require(static_cast(file), "cannot write the param.json fixture"); +} + +bool Throws(std::string_view expected) { + try { + sceKernelIsNeoMode(); + } catch (const std::runtime_error& error) { + return std::string_view(error.what()) == expected; + } + return false; +} + +int RunSelf(const char* program, std::string_view mode, const std::filesystem::path& directory) { + const std::string arguments = "\"" + std::string(program) + "\" " + std::string(mode) + " \"" + directory.string() + "\""; +#ifdef _WIN32 + const std::string command = "\"" + arguments + "\""; +#else + const std::string command = arguments; +#endif + return std::system(command.c_str()); +} + +} + +int main(int argc, char** argv) { + if (argc == 3) { + std::filesystem::current_path(argv[2]); + const std::string_view mode = argv[1]; + if (mode == "--neo") { + Require(sceKernelIsNeoMode() == 1, "a title with the Neo-mode bit is not in Neo mode"); + Require(sceKernelIsNeoMode() == 1, "a second call changed the answer"); + return 0; + } + if (mode == "--base") { + Require(sceKernelIsNeoMode() == 0, "a title without the Neo-mode bit is in Neo mode"); + Require(sceKernelIsNeoMode() == 0, "a second call changed the answer"); + return 0; + } + if (mode == "--param-json") { + Require(Throws("sceKernelIsNeoMode not implemented"), "a title with param.json did not throw"); + return 0; + } + if (mode == "--no-metadata") { + Require(Throws("param.json or param.sfo not found"), "a title without metadata did not throw"); + return 0; + } + return 1; + } + + const auto root = std::filesystem::temp_directory_path() / ("guest_kernel_sys_neo_mode_" + std::to_string(getpid_nid_postfix())); + std::filesystem::remove_all(root); + const struct { + const char* name; + const char* mode; + bool paramSfo; + std::vector attribute; + bool paramJson; + const char* failure; + } cases[] = { + {"neo", "--neo", true, {Integer("ATTRIBUTE", SupportNeoMode)}, false, "ATTRIBUTE 0x00800000"}, + {"all", "--neo", true, {Integer("ATTRIBUTE", -1)}, false, "ATTRIBUTE 0xffffffff"}, + {"other", "--base", true, {Integer("ATTRIBUTE", SupportPsVrAndEnterCross)}, false, "ATTRIBUTE without bit 23"}, + {"absent", "--base", true, {}, false, "param.sfo without ATTRIBUTE"}, + {"json", "--param-json", false, {}, true, "param.json"}, + {"both", "--param-json", true, {Integer("ATTRIBUTE", SupportNeoMode)}, true, "param.json beside a Neo-mode param.sfo"}, + {"none", "--no-metadata", false, {}, false, "no metadata"}, + }; + for (const auto& test : cases) { + const auto directory = root / test.name; + std::filesystem::create_directories(directory); + if (test.paramSfo) WriteParamSfo(directory, test.attribute); + if (test.paramJson) WriteParamJson(directory); + if (RunSelf(argv[0], test.mode, directory) != 0) { + std::fprintf(stderr, "KERNEL SYS NEO MODE: case failed: %s\n", test.failure); + std::filesystem::remove_all(root); + return 1; + } + } + std::filesystem::remove_all(root); + std::puts("sceKernelIsNeoMode tests passed"); + return 0; +} diff --git a/core/libs/tests/GuestKernelSysPthread.cpp b/core/libs/tests/GuestKernelSysPthread.cpp index 1fbcc5054b0c..0341955141d3 100644 --- a/core/libs/tests/GuestKernelSysPthread.cpp +++ b/core/libs/tests/GuestKernelSysPthread.cpp @@ -1,6 +1,7 @@ #include "prx/libkernel/KernelErrors.hpp" #include "prx/libkernel_sys/include/Api.hpp" #include "prx/libkernel/include/Api.hpp" +#include "prx/libkernel/Pthread/include/Pthread.hpp" #include "SceTypes.hpp" #include "prx/libkernel/Pthread/include/Atfork.hpp" #include @@ -34,6 +35,29 @@ static void TestScope() { Require(scePthreadAttrDestroy(&attr) == 0); } +static void TestMutexAttributeGeneration() { + PthreadMutexattr attr = nullptr; + Require(pthread_mutexattr_init_nid_postfix(&attr) == 0); + + int generation = -1; + Require(pthread_mutexattr_getgen_np_nid_postfix(&attr, &generation) == 0 && generation == 0); + Require(pthread_mutexattr_setgen_np_nid_postfix(&attr, 1) == 0); + Require(pthread_mutexattr_getgen_np_nid_postfix(&attr, &generation) == 0 && generation == 1); + Require(pthread_mutexattr_setgen_np_nid_postfix(&attr, 2) == 45); + Require(pthread_mutexattr_getgen_np_nid_postfix(nullptr, &generation) == 22); + Require(pthread_mutexattr_getgen_np_nid_postfix(&attr, nullptr) == 22); + Require(pthread_mutexattr_setgen_np_nid_postfix(nullptr, 0) == 22); + PthreadMutexattr destroyedAttr = nullptr; + Require(pthread_mutexattr_getgen_np_nid_postfix(&destroyedAttr, &generation) == 22); + Require(pthread_mutexattr_setgen_np_nid_postfix(&destroyedAttr, 0) == 22); + + Require(scePthreadMutexattrSetgen(&attr, 0) == 0); + Require(scePthreadMutexattrGetgen(&attr, &generation) == 0 && generation == 0); + Require(scePthreadMutexattrSetgen(&attr, 2) == SCE_KERNEL_ERROR_EOPNOTSUPP); + Require(scePthreadMutexattrGetgen(nullptr, &generation) == SCE_KERNEL_ERROR_EINVAL); + Require(pthread_mutexattr_destroy_nid_postfix(&attr) == 0); +} + static void TestConcurrency() { Require(scePthreadSetconcurrency(3) == 0 && scePthreadGetconcurrency() == 3); Require(scePthreadSetconcurrency(-1) == SCE_KERNEL_ERROR_EINVAL && scePthreadGetconcurrency() == 3); @@ -52,6 +76,7 @@ static void TestAtfork() { int main() { TestScope(); + TestMutexAttributeGeneration(); TestConcurrency(); TestAtfork(); return 0; diff --git a/core/libs/tests/GuestKernelSysSdkVersion.cpp b/core/libs/tests/GuestKernelSysSdkVersion.cpp index dc20a51ac8fc..0dc451e8f9e3 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/GuestKernelSysUpdVersion.cpp b/core/libs/tests/GuestKernelSysUpdVersion.cpp new file mode 100644 index 000000000000..907cf0c7513b --- /dev/null +++ b/core/libs/tests/GuestKernelSysUpdVersion.cpp @@ -0,0 +1,44 @@ +#include "prx/libkernel/include/Api.hpp" +#include +#include +#include +#ifdef _WIN32 +#include +#else +#include +#endif + +namespace { + +using GetUpdVersionFn = int (APS5_VABI*)(std::uint32_t*); + +void Require(bool condition, const char* what) { + if (condition) return; + std::fprintf(stderr, "%s\n", what); + std::abort(); +} + +GetUpdVersionFn Resolve() { +#ifdef _WIN32 + void* symbol = reinterpret_cast(GetProcAddress(LoadLibraryA("libkernel_sys.prx"), "sceKernelGetUpdVersion")); +#else + void* symbol = dlsym(RTLD_DEFAULT, "sceKernelGetUpdVersion"); +#endif + Require(symbol != nullptr, "sceKernelGetUpdVersion is not exported by libkernel_sys"); + return reinterpret_cast(symbol); +} + +} + +int main() { + const GetUpdVersionFn getUpdVersion = Resolve(); + struct { + std::uint32_t version; + std::uint32_t after; + } update{0xaaaaaaaau, 0xaaaaaaaau}, system{0xaaaaaaaau, 0xaaaaaaaau}; + Require(getUpdVersion(&update.version) == sysKernelGetUpdVersion_nid_postfix(&system.version), "the result differs from sysKernelGetUpdVersion"); + Require(update.version == system.version && update.after == 0xaaaaaaaau, "the version differs from sysKernelGetUpdVersion or more than 4 bytes were written"); + Require(getUpdVersion(nullptr) == static_cast(0x80020016u), "a null output was not refused with EINVAL"); + std::puts("update version tests passed"); + return 0; +} diff --git a/core/libs/tests/GuestKernelSysVmMapTimestamp.cpp b/core/libs/tests/GuestKernelSysVmMapTimestamp.cpp new file mode 100644 index 000000000000..2befc1e36294 --- /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/GuestKqueue.cpp b/core/libs/tests/GuestKqueue.cpp index c421f32f458d..110c416f5b15 100644 --- a/core/libs/tests/GuestKqueue.cpp +++ b/core/libs/tests/GuestKqueue.cpp @@ -3,6 +3,7 @@ #include "SceTypes.hpp" #include #include +#include #include #include #include @@ -131,6 +132,46 @@ template static std::string ThrownMessage(TCall call) { return {}; } +static void BadPointersFaultAndBatchesFill() { + constexpr int fault = 14; + const int kq = kqueue_nid_postfix(); + for (std::uintptr_t ident = 100; ident < 112; ++ident) { + Require(Apply(kq, Change(ident, EvfiltUser, EvAdd)) == 0); + Require(Apply(kq, Change(ident, EvfiltUser, 0, NoteTrigger)) == 0); + } + KernelEvent events[16]{}; + Require(Poll(kq, events, 16) == 12); + std::uint32_t seen = 0; + for (int i = 0; i < 12; ++i) seen |= 1u << (events[i].ident - 100); + Require(seen == 0xfff); + std::vector many(100); + Require(Poll(kq, many.data(), 100) == 12); + Require(Poll(kq, events, 9) == 9); + Require(Poll(kq, events, 5) == 5); + auto* unmapped = reinterpret_cast(std::uintptr_t{0x10}); + const KernelTimespec zero{0, 0}; + RequireFailure(kevent_nid_postfix(kq, unmapped, 1, nullptr, 0, nullptr), fault); + RequireFailure(kevent_nid_postfix(kq, nullptr, 0, events, 16, reinterpret_cast(unmapped)), fault); + RequireFailure(kevent_nid_postfix(kq, nullptr, 0, unmapped, 16, &zero), fault); + void* page = nullptr; + Require(sceKernelMapFlexibleMemory(&page, 0x4000, 3, 0) == 0 && page != nullptr); + auto* readOnly = static_cast(page); + Require(sceKernelMprotect(page, 0x4000, 1) == 0); + RequireFailure(kevent_nid_postfix(kq, nullptr, 0, readOnly, 16, &zero), fault); + Require(readOnly[0].ident == 0 && readOnly[0].filter == 0); + const KernelEvent bad = Change(200, EvfiltUser, 0, NoteTrigger); + RequireFailure(kevent_nid_postfix(kq, &bad, 1, readOnly, 1, &zero), fault); + Require(Poll(kq, events, INT_MAX) == 12); + for (std::uintptr_t ident = 1000; ident < 2030; ++ident) { + Require(Apply(kq, Change(ident, EvfiltUser, EvAdd)) == 0); + Require(Apply(kq, Change(ident, EvfiltUser, 0, NoteTrigger)) == 0); + } + std::vector plenty(2000); + Require(Poll(kq, plenty.data(), 2000) == 1024); + for (std::uintptr_t ident = 1000; ident < 2030; ++ident) Require(Apply(kq, Change(ident, EvfiltUser, EvDelete)) == 0); + Require(close_nid_postfix(kq) == 0); +} + static void CreateAndClose() { const int kq = kqueue_nid_postfix(); Require(kq >= 0 && kq < FirstSocket); @@ -1628,5 +1669,6 @@ int main(int argc, char** argv) { DeniedParentWatch(); #endif Timeout(); + BadPointersFaultAndBatchesFill(); return 0; } diff --git a/core/libs/tests/GuestLibreSsl3KeyReference.cpp b/core/libs/tests/GuestLibreSsl3KeyReference.cpp index ca69aceb4e5c..1f814a8d6868 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/GuestLibreSslError.cpp b/core/libs/tests/GuestLibreSslError.cpp index f81ec64d6b68..5c7adcee6abe 100644 --- a/core/libs/tests/GuestLibreSslError.cpp +++ b/core/libs/tests/GuestLibreSslError.cpp @@ -5,6 +5,7 @@ #include #include #include +#include static void Require(bool value, const char* what) { if (value) return; @@ -64,6 +65,16 @@ int main() { ERR_remove_thread_state_nid_postfix(nullptr); Require(ERR_peek_error_nid_postfix() == 0, "removing the thread state empties the queue"); + static_assert(std::is_void_v); + static_assert(std::is_void_v); + static_assert(std::is_void_v); + PKCS12_PBE_add_nid_postfix(); + OBJ_cleanup_nid_postfix(); + SSL_load_error_strings_nid_postfix(); + SSL_load_error_strings_nid_postfix(); + OBJ_cleanup_nid_postfix(); + Require(ERR_peek_error_nid_postfix() == 0, "PKCS12_PBE_add, OBJ_cleanup and SSL_load_error_strings queue no error"); + std::puts("guest_libressl_error: ok"); return 0; } diff --git a/core/libs/tests/GuestLibreSslProtocol.cpp b/core/libs/tests/GuestLibreSslProtocol.cpp index e4ced5478feb..f14e7f3c6f70 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); +} + +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); +} - std::printf("LibreSSL protocol selection: 7056 generated pairs, and valid-list boundaries passed\n"); +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/GuestLibreSslUi.cpp b/core/libs/tests/GuestLibreSslUi.cpp index 0a14b61ba8e6..00bb9b81a05a 100644 --- a/core/libs/tests/GuestLibreSslUi.cpp +++ b/core/libs/tests/GuestLibreSslUi.cpp @@ -2,6 +2,7 @@ #include "prx/libc/include/Api.hpp" #include "prx/libc/include/ApplicationHeap.hpp" #include "prx/libc/include/general/VabiMacros.hpp" +#include #include #include #include @@ -132,6 +133,72 @@ static void TestGetCloser() { UI_destroy_method_nid_postfix(method); } +static std::uint64_t UiError(std::uint64_t reason) { + return std::uint64_t{40} << 24 | std::uint64_t{0xfff} << 12 | reason; +} + +static void TestSetResult() { + ERR_clear_error_nid_postfix(); + char buffer[8] {}; + LibreSslUi ui {}; + LibreSslUiString prompt {}; + prompt.type = 1; + prompt.resultBuffer = buffer; + prompt.data.stringData.resultMinimum = 2; + prompt.data.stringData.resultMaximum = 5; + ui.flags = 0x0101; + Require(UI_set_result_nid_postfix(&ui, &prompt, "abc") == 0); + Require(!std::strcmp(buffer, "abc") && ui.flags == 0x0100 && ERR_peek_error_nid_postfix() == 0); + Require(UI_set_result_nid_postfix(&ui, &prompt, "abcde") == 0 && !std::strcmp(buffer, "abcde") && ERR_peek_error_nid_postfix() == 0); + Require(UI_set_result_nid_postfix(&ui, &prompt, "ab") == 0 && !std::strcmp(buffer, "ab") && buffer[3] == 'd'); + + std::memcpy(buffer, "kept", 5); + Require(UI_set_result_nid_postfix(&ui, &prompt, "a") == -1); + Require(ui.flags == 0x0101 && !std::strcmp(buffer, "kept")); + Require(ERR_get_error_nid_postfix() == UiError(101) && ERR_get_error_nid_postfix() == 0); + Require(UI_set_result_nid_postfix(&ui, &prompt, "abcdef") == -1); + Require(ui.flags == 0x0101 && !std::strcmp(buffer, "kept")); + Require(ERR_get_error_nid_postfix() == UiError(100) && ERR_get_error_nid_postfix() == 0); + Require(UI_set_result_nid_postfix(&ui, &prompt, "") == -1 && ui.flags == 0x0101); + Require(ERR_get_error_nid_postfix() == UiError(101)); + + Require(UI_set_result_nid_postfix(&ui, nullptr, "abc") == -1); + Require(ui.flags == 0x0100 && ERR_peek_error_nid_postfix() == 0); + + LibreSslUiString verify = prompt; + verify.type = 2; + Require(UI_set_result_nid_postfix(&ui, &verify, "wxyz") == 0 && !std::strcmp(buffer, "wxyz")); + ui.flags = 0x0001; + Require(UI_set_result_nid_postfix(&ui, &verify, "uvwxyz") == -1 && ui.flags == 0x0001); + Require(ERR_get_error_nid_postfix() == UiError(100)); + + LibreSslUiString unbuffered = prompt; + unbuffered.resultBuffer = nullptr; + ui.flags = 0x0001; + Require(UI_set_result_nid_postfix(&ui, &unbuffered, "abc") == -1 && ui.flags == 0); + Require(ERR_get_error_nid_postfix() == UiError(105) && ERR_get_error_nid_postfix() == 0); + + LibreSslUiString boolean {}; + boolean.type = 3; + boolean.resultBuffer = buffer; + boolean.data.booleanData.okCharacters = "yY"; + boolean.data.booleanData.cancelCharacters = "nN"; + Require(UI_set_result_nid_postfix(&ui, &boolean, "xN") == 0 && buffer[0] == 'n'); + Require(UI_set_result_nid_postfix(&ui, &boolean, "Yes") == 0 && buffer[0] == 'y'); + Require(UI_set_result_nid_postfix(&ui, &boolean, "xz") == 0 && buffer[0] == '\0'); + std::memcpy(buffer, "kept", 5); + Require(UI_set_result_nid_postfix(&ui, &boolean, "") == 0 && buffer[0] == '\0' && !std::strcmp(buffer + 1, "ept")); + boolean.resultBuffer = nullptr; + Require(UI_set_result_nid_postfix(&ui, &boolean, "y") == -1 && ERR_get_error_nid_postfix() == UiError(105)); + + std::memcpy(buffer, "kept", 5); + LibreSslUiString info = prompt; + info.type = 4; + ui.flags = 0x0001; + Require(UI_set_result_nid_postfix(&ui, &info, "a") == 0 && ui.flags == 0 && !std::strcmp(buffer, "kept")); + Require(ERR_peek_error_nid_postfix() == 0); +} + int main() { InitializeHeap(); TestCreate(); @@ -144,5 +211,6 @@ int main() { TestGetReader(); TestSetCloser(); TestGetCloser(); + TestSetResult(); std::puts("libSceLibreSsl UI method tests passed"); } diff --git a/core/libs/tests/GuestLibreSslX509StoreContext.cpp b/core/libs/tests/GuestLibreSslX509StoreContext.cpp index edc80af33b41..47d45cb228cf 100644 --- a/core/libs/tests/GuestLibreSslX509StoreContext.cpp +++ b/core/libs/tests/GuestLibreSslX509StoreContext.cpp @@ -1,4 +1,6 @@ #include "prx/libSceLibreSsl/include/Api.hpp" +#include "prx/libc/include/Api.hpp" +#include "prx/libc/include/ApplicationHeap.hpp" #include "prx/libc/include/general/VabiMacros.hpp" #include #include @@ -24,6 +26,7 @@ constexpr std::size_t ChainOffset = 160; constexpr std::size_t ErrorDepthOffset = 180; constexpr std::size_t ErrorOffset = 184; constexpr std::size_t CurrentCertOffset = 192; +constexpr std::size_t ExDataOffset = 232; struct alignas(8) TestContext { unsigned char bytes[ContextSize]; @@ -109,11 +112,71 @@ static void TestGetChain() { RequireThrows([] { X509_STORE_CTX_get_chain_nid_postfix(nullptr); }); } +static void TestGetExData() { + TestContext context; + int first = 0; + int second = 0; + char* entries[2] {reinterpret_cast(&first), reinterpret_cast(&second)}; + LibreSslStack data {2, entries, 0, 2, nullptr}; + context.Write(ExDataOffset, nullptr); + Require(X509_STORE_CTX_get_ex_data_nid_postfix(Context(context), 0) == nullptr); + Require(X509_STORE_CTX_get_ex_data_nid_postfix(Context(context), 1) == nullptr); + context.Write(ExDataOffset, &data); + Require(X509_STORE_CTX_get_ex_data_nid_postfix(Context(context), 1) == &second); + Require(X509_STORE_CTX_get_ex_data_nid_postfix(Context(context), 0) == &first); + Require(X509_STORE_CTX_get_ex_data_nid_postfix(Context(context), 2) == nullptr); + Require(X509_STORE_CTX_get_ex_data_nid_postfix(Context(context), -1) == nullptr); + Require(OnlyChanged(context, ExDataOffset, 8)); + Require(data.num == 2 && data.data == entries && entries[0] == reinterpret_cast(&first) && entries[1] == reinterpret_cast(&second)); +} + +static int APS5_VABI CompareCertificates(const void*, const void*) { return 0; } + +static void TestGet1Chain() { + TestContext context; + context.Write(ChainOffset, nullptr); + Require(X509_STORE_CTX_get1_chain_nid_postfix(Context(context)) == nullptr); + Require(OnlyChanged(context, ChainOffset, 8)); + + LibreSslX509 leaf {}; + LibreSslX509 intermediate {}; + LibreSslX509 root {}; + leaf.references = 1; + intermediate.references = 2; + root.references = 5; + char* certificates[6] {reinterpret_cast(&leaf), reinterpret_cast(&intermediate), reinterpret_cast(&root)}; + LibreSslStack chain {3, certificates, 1, 6, CompareCertificates}; + context.Write(ChainOffset, &chain); + LibreSslStack* copy = X509_STORE_CTX_get1_chain_nid_postfix(Context(context)); + Require(copy != nullptr && copy != &chain && copy->data != nullptr && copy->data != certificates); + Require(copy->num == 3 && copy->numAlloc == 6 && copy->sorted == 1 && copy->comp == CompareCertificates); + Require(copy->data[0] == certificates[0] && copy->data[1] == certificates[1] && copy->data[2] == certificates[2]); + Require(leaf.references == 2 && intermediate.references == 3 && root.references == 6); + Require(chain.num == 3 && chain.data == certificates && chain.numAlloc == 6); + Require(X509_STORE_CTX_get_chain_nid_postfix(Context(context)) == &chain); + Require(OnlyChanged(context, ChainOffset, 8)); + free_nid_postfix(copy->data); + free_nid_postfix(copy); + + char* none[4] {}; + LibreSslStack empty {0, none, 0, 4, nullptr}; + context.Write(ChainOffset, &empty); + copy = X509_STORE_CTX_get1_chain_nid_postfix(Context(context)); + Require(copy != nullptr && copy != &empty && copy->num == 0 && copy->numAlloc == 4 && copy->comp == nullptr); + free_nid_postfix(copy->data); + free_nid_postfix(copy); + Require(leaf.references == 2 && intermediate.references == 3 && root.references == 6); +} + int main() { + void* const heap[10] {}; + ApplicationHeapRegister_nid_no_patch(heap); TestGetError(); TestSetError(); TestGetErrorDepth(); TestGetCurrentCert(); TestGetChain(); + TestGetExData(); + TestGet1Chain(); std::puts("libSceLibreSsl X509_STORE_CTX tests passed"); } diff --git a/core/libs/tests/GuestLongDouble.cpp b/core/libs/tests/GuestLongDouble.cpp new file mode 100644 index 000000000000..5f0b78cb1306 --- /dev/null +++ b/core/libs/tests/GuestLongDouble.cpp @@ -0,0 +1,41 @@ +#include "prx/libc/include/GuestLongDouble.hpp" +#include +#include +#include +#include +#include + +int main() { + struct Case { + std::uint64_t mantissa; + std::uint16_t signExponent; + long double expected; + }; + const Case cases[] = { + {0, 0, 0.0L}, {0, 0x8000, -0.0L}, + {0x8000000000000000ull, 0x3fff, 1.0L}, {0xc000000000000000ull, 0xbfff, -1.5L}, + {0x8000000000000000ull, 1, std::ldexp(1.0L, -16382)}, + {1, 0, std::ldexp(1.0L, -16445)}, + }; + for (const auto& item : cases) { + std::array guest{}; + std::memcpy(guest.data(), &item.mantissa, sizeof(item.mantissa)); + std::memcpy(guest.data() + 8, &item.signExponent, sizeof(item.signExponent)); + const auto loaded = LibcDetail::GuestLongDoubleLoad(guest.data()); + if (loaded != item.expected || std::signbit(loaded) != std::signbit(item.expected)) std::abort(); + std::array stored{}; + LibcDetail::GuestLongDoubleStore(stored.data(), loaded); + if (std::memcmp(stored.data(), guest.data(), 10) != 0) std::abort(); + } + for (const auto mantissa : {0x8000000000000000ull, 0xc000000000000123ull}) { + std::array guest{}; + const std::uint16_t exponent = 0x7fff; + std::memcpy(guest.data(), &mantissa, sizeof(mantissa)); + std::memcpy(guest.data() + 8, &exponent, sizeof(exponent)); + const auto loaded = LibcDetail::GuestLongDoubleLoad(guest.data()); + if (mantissa == 0x8000000000000000ull ? !std::isinf(loaded) : !std::isnan(loaded)) std::abort(); + std::array stored{}; + LibcDetail::GuestLongDoubleStore(stored.data(), loaded); + if (std::memcmp(stored.data(), guest.data(), 10) != 0) std::abort(); + } +} diff --git a/core/libs/tests/GuestMath.cpp b/core/libs/tests/GuestMath.cpp index 4efaa6aa0ddf..e7f9e65f6d6d 100644 --- a/core/libs/tests/GuestMath.cpp +++ b/core/libs/tests/GuestMath.cpp @@ -130,6 +130,50 @@ static void CheckNearbyint() { Require(nearbyint_nid_postfix(INFINITY) == INFINITY && nearbyint_nid_postfix(-INFINITY) == -INFINITY); Require(std::isnan(nearbyint_nid_postfix(NAN))); Require(std::fetestexcept(FE_INEXACT) == 0); + std::feclearexcept(FE_ALL_EXCEPT); + std::uint16_t savedControl; + asm volatile("fnstcw %0" : "=m"(savedControl)); + const unsigned savedMxcsr = _mm_getcsr(); + Require(std::fesetround(FE_UPWARD) == 0); + _mm_setcsr((_mm_getcsr() & ~0x6000u) | 0x0000u); + std::feclearexcept(FE_ALL_EXCEPT); + Require(nearbyintf_nid_postfix(2.5f) == 2.0f); + Require(std::fetestexcept(FE_INEXACT) != 0); + Require(std::fesetround(FE_TONEAREST) == 0); + _mm_setcsr((_mm_getcsr() & ~0x6000u) | 0x4000u); + std::feclearexcept(FE_ALL_EXCEPT); + Require(nearbyintf_nid_postfix(2.5f) == 3.0f); + Require(std::fetestexcept(FE_INEXACT) != 0); + struct RoundingCase { + unsigned mode; + std::uint32_t positiveHalf; + std::uint32_t negativeHalf; + std::uint32_t positiveTwoHalf; + std::uint32_t negativeTwoHalf; + }; + struct RoundingValue { + float input; + std::uint32_t expected; + }; + for (const auto& test : {RoundingCase{0x0000u, 0x00000000u, 0x80000000u, 0x40000000u, 0xc0000000u}, + RoundingCase{0x2000u, 0x00000000u, 0xbf800000u, 0x40000000u, 0xc0400000u}, + RoundingCase{0x4000u, 0x3f800000u, 0x80000000u, 0x40400000u, 0xc0000000u}, + RoundingCase{0x6000u, 0x00000000u, 0x80000000u, 0x40000000u, 0xc0000000u}}) { + Require(std::fesetround(FE_TONEAREST) == 0); + _mm_setcsr((_mm_getcsr() & ~0x6000u) | test.mode); + for (const auto& value : {RoundingValue{0.5f, test.positiveHalf}, RoundingValue{-0.5f, test.negativeHalf}, + RoundingValue{2.5f, test.positiveTwoHalf}, RoundingValue{-2.5f, test.negativeTwoHalf}}) { + std::feclearexcept(FE_ALL_EXCEPT); + Require(std::bit_cast(nearbyintf_nid_postfix(value.input)) == value.expected); + Require(std::fetestexcept(FE_INEXACT) != 0); + } + for (const float zeroValue : {0.0f, -0.0f}) { + std::feclearexcept(FE_ALL_EXCEPT); + Require(std::bit_cast(nearbyintf_nid_postfix(zeroValue)) == std::bit_cast(zeroValue)); + } + } + asm volatile("fldcw %0" :: "m"(savedControl)); + _mm_setcsr(savedMxcsr); } static std::uint16_t X87ControlWord() { @@ -490,6 +534,28 @@ static void CheckFloatUnderflowErrno() { errno = 0; } +static void CheckLdexpfErrno() { + constexpr struct { + std::uint32_t input; + int exponent; + std::uint32_t expected; + } cases[] = { + {0x3f800000u, 200, 0x7f800000u}, + {0x101e8e30u, 1262, 0x7f800000u}, + {0xbf800000u, 128, 0xff800000u}, + {0x3f800000u, -200, 0x00000000u}, + {0x3f800000u, -2000, 0x00000000u}, + {0x3f800000u, -149, 0x00000001u}, + {0x3fc00000u, -149, 0x00000002u}, + {0x00000200u, 5, 0x00004000u}, + }; + for (const auto& item : cases) { + errno = 1234; + Require(std::bit_cast(ldexpf_nid_postfix(std::bit_cast(item.input), item.exponent)) == item.expected); + Require(errno == 1234); + } +} + static void CheckAtanfConsoleBits() { constexpr std::uint32_t cases[][2] = { {0x3e80000bu, 0x3e7adbc5u}, {0x3e0007c9u, 0x3dfebd2au}, {0xbdccce4cu, 0xbdcc2090u}, @@ -711,6 +777,39 @@ static void CheckFmodfErrno() { } } +static void CheckScalbnErrno() { + constexpr struct { + int exponent; + std::uint64_t expected; + } doubles[] = { + {2000, 0x7ff0000000000000ull}, + {-2000, 0x0000000000000000ull}, + {-1074, 0x0000000000000001ull}, + {-1075, 0x0000000000000000ull}, + {200, 0x4c70000000000000ull}, + }; + for (const auto& item : doubles) { + errno = 1234; + Require(std::bit_cast(scalbn_nid_postfix(1.0, item.exponent)) == item.expected); + Require(errno == 1234); + } + constexpr struct { + int exponent; + std::uint32_t expected; + } floats[] = { + {2000, 0x7f800000u}, + {200, 0x7f800000u}, + {-200, 0x00000000u}, + {-2000, 0x00000000u}, + {10, 0x44800000u}, + }; + for (const auto& item : floats) { + errno = 1234; + Require(std::bit_cast(scalbnf_nid_postfix(1.0f, item.exponent)) == item.expected); + Require(errno == 1234); + } +} + static void CheckLongDouble() { Require(ExtendedBits(acosl_nid_postfix(-1.0L), 0xc90fdaa22168c235ull, 0x4000)); Require(ExtendedBits(acosl_nid_postfix(0.0L), 0xc90fdaa22168c235ull, 0x3fff)); @@ -1433,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); @@ -2494,12 +2603,14 @@ int main() { CheckNearbyint(); CheckFegetenv(); CheckLongDouble(); + CheckScalbnErrno(); CheckNearbyintl(); CheckCbrtConsoleBits(); CheckLogbConsoleBits(); CheckExpm1ConsoleBits(); CheckLog1pConsoleBits(); CheckNextafterConsoleBits(); + CheckRemainderf(); CheckTanhConsoleBits(); CheckSinhMsunBits(); CheckSinhLargeArguments(); @@ -2647,6 +2758,7 @@ int main() { CheckAtanfConsoleBits(); CheckAtan2fConsoleBits(); CheckFloatUnderflowErrno(); + CheckLdexpfErrno(); CheckFmodErrno(); CheckFmodfErrno(); CheckDoubleClassification(); diff --git a/core/libs/tests/GuestMathExact.cpp b/core/libs/tests/GuestMathExact.cpp index 8c0d7d73897c..c1075d499ea2 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 c21a88b382e9..1324294c4959 100644 --- a/core/libs/tests/GuestMbus.cpp +++ b/core/libs/tests/GuestMbus.cpp @@ -6,6 +6,9 @@ #include #include #include +#include + +static_assert(std::is_same_v); namespace { @@ -16,9 +19,54 @@ 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() { + static_assert(sizeof(MbusEventCallbacks) == 16); + alignas(MbusEventCallbacks) std::array callbackBytes{}; + callbackBytes.fill(0xa5); + sceMbusEventCallbackFuncsInit_(reinterpret_cast(callbackBytes.data()), 8); + for (std::size_t i = 0; i < callbackBytes.size(); ++i) { + Require(callbackBytes[i] == (i < 8 ? 0 : 0xa5), "partial callback initialization changed an unexpected byte"); + } + sceMbusEventCallbackFuncsInit_(reinterpret_cast(callbackBytes.data()), sizeof(MbusEventCallbacks)); + for (std::size_t i = 0; i < callbackBytes.size(); ++i) { + Require(callbackBytes[i] == (i < sizeof(MbusEventCallbacks) ? 0 : 0xa5), "full callback initialization changed an unexpected byte"); + } + callbackBytes.fill(0x5a); + 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 000000000000..cfb89a8be1b5 --- /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 bb8029fce505..82253b5cc07b 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; @@ -683,6 +710,74 @@ static void CheckAllocateMainDirectMemory() { Require(sceKernelReleaseDirectMemory(physical, page * 2) == 0); } +static void CheckAllocateDirectMemoryRejectsInvalidArguments() { + constexpr std::size_t page = 0x4000; + std::int64_t out = -1; + + out = 0x1234; + Require(sceKernelAllocateDirectMemory(0, DIRECT_MEMORY_SIZE, 0, 0, 0, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + Require(sceKernelAllocateDirectMemory(0, DIRECT_MEMORY_SIZE, 1, 0, 0, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + Require(sceKernelAllocateDirectMemory(0, DIRECT_MEMORY_SIZE, page - 1, 0, 0, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + Require(sceKernelAllocateDirectMemory(0, DIRECT_MEMORY_SIZE, page + 1, 0, 0, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + Require(sceKernelAllocateDirectMemory(0, DIRECT_MEMORY_SIZE, page, 0, 0, nullptr) == SCE_KERNEL_ERROR_EINVAL); + Require(sceKernelAllocateMainDirectMemory(page, 0, 0, nullptr) == SCE_KERNEL_ERROR_EINVAL); + + Require(sceKernelAllocateDirectMemory(-1, DIRECT_MEMORY_SIZE, page, 0, 0, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + Require(sceKernelAllocateDirectMemory(std::numeric_limits::min(), DIRECT_MEMORY_SIZE, page, 0, 0, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + Require(sceKernelAllocateDirectMemory(0, 0, page, 0, 0, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + Require(sceKernelAllocateDirectMemory(0, -1, page, 0, 0, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + Require(sceKernelAllocateDirectMemory(static_cast(page), static_cast(page), page, 0, 0, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + Require(sceKernelAllocateDirectMemory(static_cast(page * 2), static_cast(page), page, 0, 0, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + + Require(sceKernelAllocateDirectMemory(0, DIRECT_MEMORY_SIZE, page, 3, 0, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + Require(sceKernelAllocateDirectMemory(0, DIRECT_MEMORY_SIZE, page, 1, 0, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + Require(sceKernelAllocateDirectMemory(0, DIRECT_MEMORY_SIZE, page, 0x1000, 0, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + Require(sceKernelAllocateDirectMemory(0, DIRECT_MEMORY_SIZE, page, 0x2000, 0, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + Require(sceKernelAllocateDirectMemory(0, DIRECT_MEMORY_SIZE, page, page - 1, 0, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + Require(sceKernelAllocateDirectMemory(0, DIRECT_MEMORY_SIZE, page, page + 1, 0, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + Require(sceKernelAllocateDirectMemory(0, DIRECT_MEMORY_SIZE, page, std::numeric_limits::max(), 0, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + + Require(sceKernelAllocateMainDirectMemory(0, 0, 0, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + Require(sceKernelAllocateMainDirectMemory(page, 0x2000, 0, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + Require(sceKernelAllocateMainDirectMemory(page, page - 1, 0, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + Require(sceKernelAllocateMainDirectMemory(page, page + 1, 0, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + + Require(sceKernelMemoryPoolExpand(0, DIRECT_MEMORY_SIZE, page, 0, nullptr) == SCE_KERNEL_ERROR_EINVAL); + Require(sceKernelMemoryPoolExpand(0, DIRECT_MEMORY_SIZE, 0, 0, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + Require(sceKernelMemoryPoolExpand(0, DIRECT_MEMORY_SIZE, 1, 0, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + Require(sceKernelMemoryPoolExpand(-1, DIRECT_MEMORY_SIZE, page, 0, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + Require(sceKernelMemoryPoolExpand(0, 0, page, 0, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + Require(sceKernelMemoryPoolExpand(0, DIRECT_MEMORY_SIZE, page, 0x2000, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + Require(sceKernelMemoryPoolExpand(0, DIRECT_MEMORY_SIZE, page, page - 1, &out) == SCE_KERNEL_ERROR_EINVAL && out == 0x1234); + + void* poolAddr = nullptr; + Require(sceKernelMemoryPoolReserve(nullptr, page, 0, 0, nullptr) == SCE_KERNEL_ERROR_EINVAL); + Require(sceKernelMemoryPoolReserve(nullptr, 0, 0, 0, &poolAddr) == SCE_KERNEL_ERROR_EINVAL); + Require(sceKernelMemoryPoolReserve(nullptr, 1, 0, 0, &poolAddr) == SCE_KERNEL_ERROR_EINVAL); + Require(sceKernelMemoryPoolReserve(nullptr, page, 0x2000, 0, &poolAddr) == SCE_KERNEL_ERROR_EINVAL); + Require(sceKernelMemoryPoolReserve(nullptr, page, page - 1, 0, &poolAddr) == SCE_KERNEL_ERROR_EINVAL); + + std::int64_t validPhys = -1; + Require(sceKernelAllocateDirectMemory(0, DIRECT_MEMORY_SIZE, page, 0, 0, &validPhys) == 0); + Require(validPhys >= 0 && validPhys % static_cast(page) == 0); + Require(sceKernelReleaseDirectMemory(validPhys, page) == 0); + + validPhys = -1; + Require(sceKernelAllocateDirectMemory(0, DIRECT_MEMORY_SIZE, page, page, 0, &validPhys) == 0); + Require(validPhys >= 0 && validPhys % static_cast(page) == 0); + Require(sceKernelReleaseDirectMemory(validPhys, page) == 0); + + validPhys = -1; + Require(sceKernelAllocateDirectMemory(0, DIRECT_MEMORY_SIZE, page, page * 2, 0, &validPhys) == 0); + Require(validPhys >= 0 && validPhys % static_cast(page * 2) == 0); + Require(sceKernelReleaseDirectMemory(validPhys, page) == 0); + + validPhys = -1; + Require(sceKernelAllocateDirectMemory(0, DIRECT_MEMORY_SIZE, page, page * 4, 0, &validPhys) == 0); + Require(validPhys >= 0 && validPhys % static_cast(page * 4) == 0); + Require(sceKernelReleaseDirectMemory(validPhys, page) == 0); +} + static void CheckReusedDirectMemorySections() { #ifdef _WIN32 constexpr std::size_t page = 0x4000; @@ -852,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; @@ -893,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); @@ -970,6 +1069,66 @@ static void CheckMtypeprotect() { Require(sceKernelReleaseDirectMemory(phys, page * 3) == 0); } +static void CheckMemoryPoolArguments() { + constexpr std::size_t page = 0x4000; + constexpr int einval = static_cast(0x80020016u); + std::int64_t phys = 0; + Require(sceKernelAllocateDirectMemory(0, 0x7fffffffffll, page * 2, 0, 0, &phys) == 0); + void* mapped = nullptr; + Require(sceKernelMapDirectMemory(&mapped, page * 2, 3, 0, phys, 0) == 0); + auto* bytes = static_cast(mapped); + Require(sceKernelMemoryPoolCommit(nullptr, page, 0, 3, 0) == einval); + Require(sceKernelMemoryPoolCommit(bytes, 0, 0, 3, 0) == einval); + Require(sceKernelMemoryPoolCommit(bytes + 1, page, 0, 3, 0) == einval); + Require(sceKernelMemoryPoolCommit(bytes, page + 1, 0, 3, 0) == einval); + Require(sceKernelMemoryPoolDecommit(nullptr, page, 0) == einval); + Require(sceKernelMemoryPoolDecommit(bytes, 0, 0) == einval); + Require(sceKernelMemoryPoolDecommit(bytes + 1, page, 0) == einval); + Require(sceKernelMemoryPoolDecommit(bytes, page + 1, 0) == einval); + VirtualQueryInfo info{}; + Require(sceKernelVirtualQuery(bytes, 0, &info, sizeof(info)) == 0 && info.protection == 3); + + KernelMemoryPoolBatchEntry entries[2]{}; + int processed = -1; + Require(sceKernelMemoryPoolBatch(nullptr, 1, &processed, 0) == einval); + Require(sceKernelMemoryPoolBatch(entries, -1, &processed, 0) == einval); + Require(sceKernelMemoryPoolBatch(entries, 0, &processed, 0) == 0 && processed == 0); + for (const std::uint32_t op : {0u, 9u}) { + entries[0] = {}; + entries[0].op = op; + processed = -1; + Require(sceKernelMemoryPoolBatch(entries, 1, &processed, 0) == einval && processed == 0); + } + entries[0] = {}; + entries[0].op = 3; + entries[0].protect.addr = bytes; + entries[0].protect.len = page; + entries[0].protect.prot = 1; + entries[1] = {}; + entries[1].op = 9; + processed = -1; + Require(sceKernelMemoryPoolBatch(entries, 2, &processed, 0) == einval && processed == 1); + Require(sceKernelVirtualQuery(bytes, 0, &info, sizeof(info)) == 0 && info.protection == 1); + Require(sceKernelMunmap(reinterpret_cast(mapped), page * 2) == 0); + 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; @@ -3653,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); @@ -3748,6 +3909,7 @@ int main(int argc, char** argv) { CheckPageTableStats(); CheckVirtualQueryWireLayout(); CheckNamedAndHintedMappings(); + CheckVirtualRangeNames(); CheckInternalNamedFlexibleMapping(); CheckFlexibleFixedReplacement(); CheckMunmapScopedFlexibleRelease(); @@ -3766,6 +3928,7 @@ int main(int argc, char** argv) { CheckSavedDirectMemorySurvivesCachePressure(); CheckReusedDirectMemorySections(); CheckAllocateMainDirectMemory(); + CheckAllocateDirectMemoryRejectsInvalidArguments(); CheckReleaseDirectMemoryClearsMappings(); CheckReleaseDirectMemoryRejectsInvalidRanges(); CheckFixedMappingReplacesPartialOverlap(); @@ -3786,6 +3949,8 @@ int main(int argc, char** argv) { CheckGetDirectMemoryType(); CheckDirectMemoryQuery(); CheckMtypeprotect(); + CheckMapUnallocatedDirectMemory(); + CheckMemoryPoolArguments(); CheckHeapAlignment(); CheckHeapReallocWithinTheBlock(); CheckHeapAfterMappingReuse(); @@ -3906,6 +4071,24 @@ int main(int argc, char** argv) { *__error_nid_postfix() = 0; Require(madvise_nid_postfix(reinterpret_cast(0x800000000000), 1, 0) == -1 && *__error_nid_postfix() == 22); Require(madvise_nid_postfix(reinterpret_cast(0x7fffffffc000), 0x4000, 4) == 0); + *__error_nid_postfix() = 77; + for (int advice = 0; advice <= 10; ++advice) Require(posix_madvise_nid_postfix(memory, page * 3, advice) == 0); + Require(posix_madvise_nid_postfix(reinterpret_cast(0x800000000000), 1, 10) == 0); + Require(posix_madvise_nid_postfix(memory, std::numeric_limits::max(), 10) == 0); + Require(posix_madvise_nid_postfix(memory + 1, 0, 4) == 0); + Require(posix_madvise_nid_postfix(nullptr, 1, 0) == 22 && *__error_nid_postfix() == 77); + Require(posix_madvise_nid_postfix(reinterpret_cast(0x1000), 1, 0) == 22 && *__error_nid_postfix() == 77); + Require(posix_madvise_nid_postfix(reinterpret_cast(page - 1), 1, 4) == 22 && *__error_nid_postfix() == 77); + Require(posix_madvise_nid_postfix(memory, page, 11) == 22 && *__error_nid_postfix() == 77); + Require(posix_madvise_nid_postfix(memory, page, -1) == 22 && *__error_nid_postfix() == 77); + Require(posix_madvise_nid_postfix(memory, 0, 11) == 22 && *__error_nid_postfix() == 77); + Require(posix_madvise_nid_postfix(memory, std::numeric_limits::max(), 0) == 22 && *__error_nid_postfix() == 77); + Require(posix_madvise_nid_postfix(reinterpret_cast(0x800000000000), 1, 0) == 22 && *__error_nid_postfix() == 77); + Require(posix_madvise_nid_postfix(reinterpret_cast(0x7fffffffc000), 0x4000, 4) == 0); + Require(posix_madvise_nid_postfix(reinterpret_cast(page), 1, 0) == 0); + Require(posix_madvise_nid_postfix(reinterpret_cast(0x800000000000), 0, 0) == 0); + Require(posix_madvise_nid_postfix(nullptr, 0, 0) == 22); + Require(*__error_nid_postfix() == 77); char mincoreVec[4] = {}; Require(mincore_nid_postfix(memory, page * 3, mincoreVec) == 0); Require(mincoreVec[0] == 1 && mincoreVec[1] == 1 && mincoreVec[2] == 1); diff --git a/core/libs/tests/GuestMemoryResource.cpp b/core/libs/tests/GuestMemoryResource.cpp new file mode 100644 index 000000000000..842ce8fceb30 --- /dev/null +++ b/core/libs/tests/GuestMemoryResource.cpp @@ -0,0 +1,163 @@ +#include "prx/libc/include/Api.hpp" +#include "prx/libc/include/ApplicationHeap.hpp" +#include "prx/libc/include/general/AsmMacros.hpp" +#include "prx/libc/include/general/VabiMacros.hpp" +#include +#include +#include +#include +#include + +namespace LibcException { +struct TypeInfoVtable; +} + +struct TypeRecord { const void* vtable; const char* name; const TypeRecord* base; }; + +using Thrower = void (APS5_VABI *)(const void*); +using Allocate = void* (APS5_VABI *)(void*, std::size_t, std::size_t); +using Deallocate = void (APS5_VABI *)(void*, void*, std::size_t, std::size_t); +using IsEqual = bool (APS5_VABI *)(const void*, const void*); +using Destroy = void (APS5_VABI *)(void*); + +extern "C" { +extern LibcException::TypeInfoVtable _ZTVN10__cxxabiv117__class_type_infoE_nid_postfix; +extern LibcException::TypeInfoVtable _ZTVN10__cxxabiv120__si_class_type_infoE_nid_postfix; +extern const TypeRecord _ZTISt9bad_alloc_nid_postfix; +extern const TypeRecord _ZTISt8bad_cast_nid_postfix; + +void APS5_VABI SceV2Catch(Thrower thrower, const void* argument); +void APS5_VABI AllocateOverAligned(const void* resource); + +const void* SceV2CatchType = nullptr; +const void* SceV2OtherType = nullptr; +int SceV2Selector = 0; +} + +asm(".text\n" + APS5_ASM_FUNCTION("AllocateOverAligned") + " movl $64, %edx\n" + " movl $16, %esi\n" + " movq (%rdi), %rax\n" + " jmp *16(%rax)\n" + APS5_ASM_FUNCTION_END("AllocateOverAligned")); + +static unsigned failures = 0; + +static void Require(bool value, const char* what) { + if (value) return; + std::fprintf(stderr, "FAIL: %s\n", what); + ++failures; +} + +static char caught[128]; + +extern "C" void APS5_VABI SceV2Inspect(void* object) { + const auto* vtable = *static_cast(object); + std::snprintf(caught, sizeof(caught), "%s", static_cast(vtable[-1])->name); +} + +static const void* const* Vtable(const void* resource) { + return *static_cast(resource); +} + +static const TypeRecord* TypeOf(const void* resource) { + return static_cast(Vtable(resource)[-1]); +} + +template +static TFunction Slot(const void* resource, std::size_t index) { + return reinterpret_cast(const_cast(Vtable(resource)[index])); +} + +static const void* TypeInfoVptr(LibcException::TypeInfoVtable& vtable) { + return reinterpret_cast(&vtable) + 2 * sizeof(void*); +} + +static void CheckTypes(const void* resource, const char* name) { + Require(reinterpret_cast(Vtable(resource)[-2]) == 0, "offset to top is 0"); + const TypeRecord* type = TypeOf(resource); + Require(std::strcmp(type->name, name) == 0, name); + Require(type->vtable == TypeInfoVptr(_ZTVN10__cxxabiv120__si_class_type_infoE_nid_postfix), "resource type is a single-base class"); + const TypeRecord* identity = type->base; + Require(std::strcmp(identity->name, "NSt8__sce_v23pmr24_Identity_equal_resourceE") == 0, "_Identity_equal_resource base"); + Require(identity->vtable == TypeInfoVptr(_ZTVN10__cxxabiv120__si_class_type_infoE_nid_postfix), "_Identity_equal_resource is a single-base class"); + const TypeRecord* root = identity->base; + Require(std::strcmp(root->name, "NSt8__sce_v23pmr15memory_resourceE") == 0, "memory_resource root"); + Require(root->vtable == TypeInfoVptr(_ZTVN10__cxxabiv117__class_type_infoE_nid_postfix), "memory_resource has no base"); +} + +static void CheckThrows(Thrower thrower, const void* argument, const char* what) { + SceV2CatchType = &_ZTISt9bad_alloc_nid_postfix; + SceV2OtherType = &_ZTISt8bad_cast_nid_postfix; + SceV2Selector = 0; + caught[0] = 0; + SceV2Catch(thrower, argument); + Require(SceV2Selector == 2, what); + Require(std::strcmp(caught, "St9bad_alloc") == 0, what); +} + +static void CheckResources() { + void* aligned = _Aligned_new_delete_resource_nid_postfix(); + void* unaligned = _Unaligned_new_delete_resource_nid_postfix(); + void* empty = null_memory_resource_nid_postfix(); + Require(aligned && unaligned && empty, "resources exist"); + Require(aligned != unaligned && aligned != empty && unaligned != empty, "resources are distinct"); + Require(aligned == _Aligned_new_delete_resource_nid_postfix() && empty == null_memory_resource_nid_postfix(), "resources are stable"); + CheckTypes(aligned, "NSt8__sce_v23pmr33_Aligned_new_delete_resource_implE"); + CheckTypes(unaligned, "NSt8__sce_v23pmr35_Unaligned_new_delete_resource_implE"); + CheckTypes(empty, "Z20null_memory_resourceE14_Null_resource"); + + for (void* resource : {aligned, unaligned, empty}) { + Require(Slot(resource, 4)(resource, resource), "is_equal to itself"); + Slot(resource, 0)(resource); + } + Require(!Slot(aligned, 4)(aligned, unaligned), "aligned is not unaligned"); + Require(!Slot(unaligned, 4)(unaligned, empty), "unaligned is not null"); + Require(!Slot(empty, 4)(empty, aligned), "null is not aligned"); + + for (const std::size_t alignment : {std::size_t{1}, std::size_t{16}, std::size_t{32}, std::size_t{64}, std::size_t{4096}}) { + auto* block = static_cast(Slot(aligned, 2)(aligned, 200, alignment)); + Require(block != nullptr && reinterpret_cast(block) % alignment == 0, "aligned allocate honours the alignment"); + std::memset(block, 0x5a, 200); + Slot(aligned, 3)(aligned, block, 200, alignment); + } + for (const std::size_t alignment : {std::size_t{1}, std::size_t{8}, std::size_t{32}}) { + auto* block = static_cast(Slot(unaligned, 2)(unaligned, 48, alignment)); + Require(block != nullptr && reinterpret_cast(block) % alignment == 0, "unaligned allocate up to 32"); + std::memset(block, 0xa5, 48); + Slot(unaligned, 3)(unaligned, block, 48, alignment); + } + Slot(empty, 3)(empty, nullptr, 0, 1); + Slot(empty, 3)(empty, aligned, 64, 8); + + CheckThrows(AllocateOverAligned, unaligned, "unaligned allocate over 32 throws bad_alloc"); + CheckThrows(reinterpret_cast(const_cast(Vtable(empty)[2])), empty, "null allocate throws bad_alloc"); +} + +static void CheckDefaults() { + void* aligned = _Aligned_new_delete_resource_nid_postfix(); + void* unaligned = _Unaligned_new_delete_resource_nid_postfix(); + void* empty = null_memory_resource_nid_postfix(); + Require(_Aligned_get_default_resource_nid_postfix() == aligned, "aligned default starts as new_delete"); + Require(_Unaligned_get_default_resource_nid_postfix() == unaligned, "unaligned default starts as new_delete"); + Require(_Aligned_set_default_resource_nid_postfix(empty) == aligned, "first aligned set returns new_delete"); + Require(_Aligned_get_default_resource_nid_postfix() == empty && _Unaligned_get_default_resource_nid_postfix() == empty, "both share one default"); + Require(_Unaligned_set_default_resource_nid_postfix(aligned) == empty, "set returns the previous resource"); + Require(_Unaligned_get_default_resource_nid_postfix() == aligned, "unaligned set changes the shared default"); + Require(_Aligned_set_default_resource_nid_postfix(nullptr) == aligned, "reset returns the previous resource"); + Require(_Aligned_get_default_resource_nid_postfix() == aligned && _Unaligned_get_default_resource_nid_postfix() == unaligned, "null restores each new_delete"); + Require(_Unaligned_set_default_resource_nid_postfix(nullptr) == unaligned, "unaligned set from null returns unaligned new_delete"); + Require(_Aligned_set_default_resource_nid_postfix(nullptr) == aligned, "aligned set from null returns aligned new_delete"); +} + +int main() { + std::array api{}; + ApplicationHeapRegister_nid_no_patch(api.data()); + CheckResources(); + CheckDefaults(); + if (failures != 0) { + std::fprintf(stderr, "%u failures\n", failures); + return 1; + } +} diff --git a/core/libs/tests/GuestMktime.cpp b/core/libs/tests/GuestMktime.cpp index f3e74a4a6bd8..8fd2fbeba04e 100644 --- a/core/libs/tests/GuestMktime.cpp +++ b/core/libs/tests/GuestMktime.cpp @@ -58,6 +58,57 @@ static void CheckFailure(Converter convert) { Require(Equal(input, original), "Failed mktime changed the guest calendar"); } +static void CheckEarlyYearNormalization(Converter convert) { + const struct { + int year; + int mon; + int mday; + int normalizedMon; + int normalizedMday; + } inputs[] = {{68, 24, 13, 0, 13}, {68, 25, 1, 1, 1}, {69, 11, 45, 0, 14}, {67, 36, 2, 0, 2}}; + for (const auto& item : inputs) { + GuestTm canonical{}; + canonical.tm_year = item.year; + canonical.tm_mon = item.mon; + canonical.tm_mday = item.mday; + canonical.tm_hour = 12; + canonical.tm_isdst = -1; + GuestTm input = canonical; + const std::int64_t timer = convert(&input); + Require(timer != -1, "mktime refused a calendar that normalizes into 1970"); + GuestTm expected{}; + Require(localtime_s_nid_postfix(&timer, &expected) == &expected, "Local conversion failed"); + Require(Equal(input, expected), "mktime did not normalize an early-year calendar"); + Require(input.tm_year == 70 && input.tm_mon == item.normalizedMon && input.tm_mday == item.normalizedMday && input.tm_hour == 12, + "mktime normalized to the wrong date"); + } +} + +static void CheckEquivalentFutureCalendars(const char* zone) { + Require(setenv_nid_postfix("TZ", zone, 1) == 0, "Could not set the time zone"); + tzset_nid_postfix(); + constexpr std::array converters{libc_mktime_nid_postfix, mktime_nid_postfix}; + for (auto convert : converters) { + for (const int year : {420, 490, 1620}) { + GuestTm canonical{}; + canonical.tm_year = year; + canonical.tm_mon = 9; + canonical.tm_mday = 22; + canonical.tm_hour = 18; + canonical.tm_min = 22; + canonical.tm_sec = 37; + canonical.tm_isdst = -1; + GuestTm nonordinary = canonical; + nonordinary.tm_mon = 21; + nonordinary.tm_mday = -343; + const auto expected = convert(&canonical); + Require(expected != -1, "mktime refused a representable future calendar"); + Require(convert(&nonordinary) == expected, "equivalent future calendars used different time-zone rules"); + Require(Equal(canonical, nonordinary), "equivalent future calendars normalized to different fields"); + } + } +} + static void CheckZone(const char* zone) { Require(setenv_nid_postfix("TZ", zone, 1) == 0, "Could not set the time zone"); tzset_nid_postfix(); @@ -68,6 +119,7 @@ static void CheckZone(const char* zone) { for (const auto timer : timers) { CheckNormalization(convert, timer); } + CheckEarlyYearNormalization(convert); CheckFailure(convert); } } @@ -76,4 +128,9 @@ int main() { CheckZone("UTC0"); CheckZone("UTC-2"); CheckZone("UTC5"); + CheckEquivalentFutureCalendars("EST5EDT"); +#ifndef _WIN32 + CheckEquivalentFutureCalendars("America/New_York"); + CheckEquivalentFutureCalendars("Pacific/Kiritimati"); +#endif } diff --git a/core/libs/tests/GuestModuleInfo.cpp b/core/libs/tests/GuestModuleInfo.cpp index bc233a08cf5a..fd112c8f695d 100644 --- a/core/libs/tests/GuestModuleInfo.cpp +++ b/core/libs/tests/GuestModuleInfo.cpp @@ -72,6 +72,17 @@ int main(int argc, char** argv) { Require(count >= 2 && count < handles.size() && handles[count] == -1); handles.resize(count); Require(handles.front() == self.id); + const auto mainHandle = sceKernelGetExecutableModuleHandle(); + Require(mainHandle == self.id); + ModuleInfo executableInfo{}; + executableInfo.st_size = sizeof(ModuleInfo); + Require(sceKernelGetModuleInfo(mainHandle, &executableInfo) == 0 && std::string(executableInfo.name) == self.name); + bool holdsOwnCode = false; + for (std::uint32_t i = 0; i < executableInfo.segment_count; ++i) { + const auto code = reinterpret_cast(&Query); + holdsOwnCode = holdsOwnCode || (code >= executableInfo.segments[i].address && code - executableInfo.segments[i].address < executableInfo.segments[i].size); + } + Require(holdsOwnCode); const auto kernel = Query(reinterpret_cast(&sceKernelGetModuleList), 0).id; Require(std::count(handles.begin(), handles.end(), kernel) == 1); Require(std::count(handles.begin(), handles.end(), info.id) == 0); @@ -203,4 +214,5 @@ int main(int argc, char** argv) { Require(fresh.eh_frame_addr - fresh.segments[0].address == info.eh_frame_addr - info.segments[0].address); else Require(fresh.eh_frame_addr == 0); Require(dlclose_nid_postfix(reloaded) == 0); + Require(sceKernelGetExecutableModuleHandle() == self.id); } diff --git a/core/libs/tests/GuestMoveTracker.cpp b/core/libs/tests/GuestMoveTracker.cpp new file mode 100644 index 000000000000..0d141bf511ed --- /dev/null +++ b/core/libs/tests/GuestMoveTracker.cpp @@ -0,0 +1,28 @@ +#include "prx/libSceMoveTracker/include/Api.hpp" +#include +#include +#include + +namespace { + +void Require(bool value) { if (!value) std::abort(); } + +constexpr int kErrInvalidArg = static_cast(0x80ef0003); +constexpr std::uint32_t kFill = 0xaaaaaaaau; + +} + +int main() { + std::array total{kFill, kFill}; + std::array processing{kFill, kFill}; + + Require(sceMoveTrackerGetWorkingMemorySize(nullptr, nullptr) == kErrInvalidArg); + Require(sceMoveTrackerGetWorkingMemorySize(total.data(), nullptr) == kErrInvalidArg); + Require(sceMoveTrackerGetWorkingMemorySize(nullptr, processing.data()) == kErrInvalidArg); + Require(total[0] == kFill && total[1] == kFill && processing[0] == kFill && processing[1] == kFill); + + Require(sceMoveTrackerGetWorkingMemorySize(total.data(), processing.data()) == 0); + Require(total[0] == 0xa00000 && processing[0] == 0x800000); + Require(total[1] == kFill && processing[1] == kFill); + return 0; +} diff --git a/core/libs/tests/GuestMsgDialog.cpp b/core/libs/tests/GuestMsgDialog.cpp new file mode 100644 index 000000000000..741d21091af5 --- /dev/null +++ b/core/libs/tests/GuestMsgDialog.cpp @@ -0,0 +1,154 @@ +#include "prx/libSceMsgDialog/include/Api.hpp" +#include "prx/libSceMsgDialog/include/MsgDialogParam.hpp" +#include "prx/libSceIme/include/ModalDialog.hpp" +#include "SceTypes.hpp" +#include +#include +#include +#include +#include +#include + +namespace { + +constexpr int StatusRunning = 2; +constexpr int StatusFinished = 3; +constexpr int ErrBusy = static_cast(0x80B80007u); +constexpr int ErrNotRunning = static_cast(0x80B8000Bu); + +void Require(bool value, const char* what) { + if (value) return; + std::fprintf(stderr, "msg dialog: %s\n", what); + std::abort(); +} + +struct UserMessage { + std::int32_t buttonType; + std::int32_t pad; + const char* message; +}; + +struct Param { + std::uint8_t bytes[MsgDialog::ParamBytes] = {}; + + Param(std::int32_t mode, const UserMessage* user) { + std::memcpy(bytes + 0x38, &mode, 4); + std::memcpy(bytes + 0x40, &user, 8); + } +}; + +ModalDialogState Session(std::size_t* chosen = nullptr) { + std::size_t value = 99; + const auto state = ModalDialogPoll_nid_postfix(value); + if (chosen != nullptr) *chosen = value; + return state; +} + +void Headless() { + UserMessage user{MsgDialog::ButtonTypeYesNo, 0, "Continue?"}; + Param param(MsgDialog::ModeUserMsg, &user); + Require(!ModalDialogHasPresenter_nid_postfix(), "a presenter is registered"); + Require(sceMsgDialogInitialize() == 0, "initialize"); + Require(sceMsgDialogOpen(¶m) == 0, "open without a presenter"); + Require(Session() == ModalDialogState::Idle, "a dialog was shown without a presenter"); + Require(sceMsgDialogGetStatus() == StatusRunning, "first poll without a presenter"); + Require(sceMsgDialogGetStatus() == StatusFinished, "second poll without a presenter"); + Require(sceMsgDialogTerminate() == 0, "terminate"); +} + +void Shown() { + ModalDialogSetPresenter_nid_postfix(true); + UserMessage user{MsgDialog::ButtonTypeYesNo, 0, "Continue?"}; + Param param(MsgDialog::ModeUserMsg, &user); + Require(sceMsgDialogOpen(¶m) == 0, "open with a presenter"); + Require(Session() == ModalDialogState::Showing, "the dialog was not shown"); + ModalDialogView view; + Require(ModalDialogReadView_nid_postfix(view) && view.message == u"Continue?" && view.buttons.size() == 2, "the shown dialog is not the message"); + for (int poll = 0; poll < 5; ++poll) Require(sceMsgDialogGetStatus() == StatusRunning && sceMsgDialogUpdateStatus() == StatusRunning, "a shown dialog finished before it was answered"); + Require(sceMsgDialogOpen(¶m) == ErrBusy, "a second open was accepted while the dialog ran"); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Next); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Confirm); + Require(sceMsgDialogGetStatus() == StatusFinished, "an answered dialog did not finish"); + Require(sceMsgDialogClose() == ErrNotRunning, "a finished dialog could be closed"); + Require(sceMsgDialogOpen(¶m) == 0 && Session() == ModalDialogState::Showing, "a new dialog was not shown after the answer"); + Require(sceMsgDialogClose() == 0, "close"); + Require(Session() == ModalDialogState::Closed, "close did not close the session"); + Require(sceMsgDialogGetStatus() == StatusFinished, "a closed dialog is still running"); + Require(sceMsgDialogOpen(¶m) == 0 && Session() == ModalDialogState::Showing, "a new dialog was not shown after a close"); + Require(sceMsgDialogTerminate() == 0, "terminate"); + Require(Session() == ModalDialogState::Idle, "terminate left the session"); + Require(sceMsgDialogGetStatus() == 0, "status after terminate"); +} + +void NotPresented() { + UserMessage none{MsgDialog::ButtonTypeNone, 0, "Wait"}; + Param withoutButtons(MsgDialog::ModeUserMsg, &none); + Require(sceMsgDialogOpen(&withoutButtons) == 0 && Session() == ModalDialogState::Idle, "a dialog without buttons was shown"); + Require(sceMsgDialogGetStatus() == StatusRunning && sceMsgDialogGetStatus() == StatusFinished, "a dialog without buttons did not finish on the second poll"); + UserMessage user{MsgDialog::ButtonTypeOk, 0, "Progress"}; + Param progress(MsgDialog::ModeProgressBar, &user); + Require(sceMsgDialogOpen(&progress) == 0 && Session() == ModalDialogState::Idle, "a progress bar was shown"); + Require(sceMsgDialogClose() == 0, "close of the progress bar"); + Param system(MsgDialog::ModeSystemMsg, &user); + Require(sceMsgDialogOpen(&system) == 0 && Session() == ModalDialogState::Idle, "a system message was shown"); + Require(sceMsgDialogGetStatus() == StatusRunning && sceMsgDialogGetStatus() == StatusFinished, "a system message did not finish on the second poll"); + UserMessage busy{MsgDialog::ButtonTypeOk, 0, "Other"}; + ModalDialogRequest other; + other.message = u"Other"; + other.buttons = {u"OK"}; + Require(ModalDialogOpen_nid_postfix(other), "the session did not open"); + Param param(MsgDialog::ModeUserMsg, &busy); + Require(sceMsgDialogOpen(¶m) == 0, "open while another dialog is showing"); + Require(sceMsgDialogGetStatus() == StatusRunning && sceMsgDialogGetStatus() == StatusFinished, "a dialog refused by the session did not finish on the second poll"); + ModalDialogReset_nid_postfix(); +} + +void OtherLibraryDialog() { + ModalDialogSetPresenter_nid_postfix(true); + ModalDialogRequest other; + other.owner = ModalDialogOwnerErrorDialog; + other.message = u"Error"; + other.buttons = {u"OK"}; + Require(ModalDialogOpen_nid_postfix(other), "the other library's dialog did not open"); + Require(sceMsgDialogInitialize() == 0, "initialize"); + Require(sceMsgDialogTerminate() == 0, "terminate"); + std::size_t chosen = 0; + Require(ModalDialogPoll_nid_postfix(chosen, ModalDialogOwnerErrorDialog) == ModalDialogState::Showing && ModalDialogCapturesInput_nid_postfix(), "terminating libSceMsgDialog ended another library's dialog"); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Confirm); + Require(ModalDialogPoll_nid_postfix(chosen, ModalDialogOwnerErrorDialog) == ModalDialogState::Answered && chosen == 0, "the other library's dialog was not answerable"); + ModalDialogReset_nid_postfix(); + ModalDialogSetPresenter_nid_postfix(false); +} + +void WithoutFlips() { + ModalDialogSetPresenter_nid_postfix(true); + ModalDialogSetShowTimeout_nid_postfix(40); + UserMessage user{MsgDialog::ButtonTypeYesNoFocusNo, 0, "Continue?"}; + Param param(MsgDialog::ModeUserMsg, &user); + Require(sceMsgDialogOpen(¶m) == 0, "open without flips"); + Require(sceMsgDialogGetStatus() == StatusRunning, "the dialog finished before the bound"); + std::this_thread::sleep_for(std::chrono::milliseconds(120)); + Require(sceMsgDialogGetStatus() == StatusFinished, "a dialog that was never drawn kept the title waiting"); + Require(!ModalDialogCapturesInput_nid_postfix() && Session() == ModalDialogState::Unshown, "an undrawn dialog still holds the session"); + Require(sceMsgDialogOpen(¶m) == 0 && sceMsgDialogUpdateStatus() == StatusRunning, "a new dialog was refused after the bound"); + ModalDialogView view; + Require(ModalDialogReadView_nid_postfix(view), "the new dialog was not drawn"); + std::this_thread::sleep_for(std::chrono::milliseconds(120)); + Require(sceMsgDialogGetStatus() == StatusRunning, "a drawn dialog finished without an answer"); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Confirm); + Require(sceMsgDialogGetStatus() == StatusFinished, "a drawn dialog could not be answered after the bound"); + Require(sceMsgDialogTerminate() == 0, "terminate"); + ModalDialogSetShowTimeout_nid_postfix(ModalDialogShowTimeoutMilliseconds); + ModalDialogSetPresenter_nid_postfix(false); +} + +} + +int main() { + Headless(); + Shown(); + NotPresented(); + WithoutFlips(); + OtherLibraryDialog(); + ModalDialogSetPresenter_nid_postfix(false); +} diff --git a/core/libs/tests/GuestMsgDialogNative.cpp b/core/libs/tests/GuestMsgDialogNative.cpp index 7e25847352d0..49cf6cbffb59 100644 --- a/core/libs/tests/GuestMsgDialogNative.cpp +++ b/core/libs/tests/GuestMsgDialogNative.cpp @@ -1,8 +1,13 @@ #include "prx/libSceMsgDialog.native/libSceMsgDialog.native.hpp" +#include "prx/libSceMsgDialog/include/MsgDialogParam.hpp" +#include "prx/libSceIme/include/ModalDialog.hpp" #include "SceTypes.hpp" #include "prx/libc/include/general/VabiMacros.hpp" #include #include +#include +#include +#include extern "C" { extern int SceMsgDialogNativeModuleLoaded_nid_no_patch; @@ -21,6 +26,179 @@ constexpr int kErrNotFinished = static_cast(0x80B80005u); constexpr int kErrNotRunning = static_cast(0x80B8000Bu); constexpr int kErrArgNull = static_cast(0x80B8000Du); constexpr int kButtonIdOk = 1; +constexpr int kButtonIdNo = 2; +constexpr int kStatusRunning = 2; + +struct UserMessage { + std::int32_t buttonType; + std::int32_t pad; + const char* message; +}; + +struct UserParam { + std::uint8_t bytes[MsgDialog::ParamBytes] = {}; + + UserParam(std::int32_t mode, const UserMessage* user) { + std::memcpy(bytes + 0x38, &mode, 4); + std::memcpy(bytes + 0x40, &user, 8); + } +}; + +ModalDialogState Session() { + std::size_t chosen = 0; + return ModalDialogPoll_nid_postfix(chosen); +} + +void CancelAndFallbacks() { + MsgDialogResult result{}; + UserMessage yesNo{MsgDialog::ButtonTypeYesNo, 0, "Continue?"}; + UserParam param(MsgDialog::ModeUserMsg, &yesNo); + ModalDialogSetPresenter_nid_postfix(true); + Require(sceMsgDialogInitialize() == 0); + Require(sceMsgDialogOpen(¶m) == 0); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Cancel); + Require(sceMsgDialogGetStatus() == kStatusFinished); + Require(sceMsgDialogGetResult(&result) == 0 && result.button_id == kButtonIdNo); + + UserMessage okOnly{MsgDialog::ButtonTypeOk, 0, "Saved"}; + UserParam okParam(MsgDialog::ModeUserMsg, &okOnly); + Require(sceMsgDialogOpen(&okParam) == 0 && sceMsgDialogGetStatus() == kStatusRunning); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Cancel); + Require(sceMsgDialogGetStatus() == kStatusFinished); + Require(sceMsgDialogGetResult(&result) == 0 && result.button_id == kButtonIdOk); + + UserMessage none{MsgDialog::ButtonTypeNone, 0, "Wait"}; + UserParam noneParam(MsgDialog::ModeUserMsg, &none); + Require(sceMsgDialogOpen(&noneParam) == 0 && sceMsgDialogGetStatus() == kStatusFinished && Session() != ModalDialogState::Showing); + UserParam progress(MsgDialog::ModeProgressBar, &yesNo); + Require(sceMsgDialogOpen(&progress) == 0 && sceMsgDialogGetStatus() == kStatusFinished && Session() != ModalDialogState::Showing); + UserParam system(MsgDialog::ModeSystemMsg, &yesNo); + Require(sceMsgDialogOpen(&system) == 0 && sceMsgDialogGetStatus() == kStatusFinished && Session() != ModalDialogState::Showing); + result = MsgDialogResult{}; + Require(sceMsgDialogGetResult(&result) == 0 && result.button_id == kButtonIdOk); + + ModalDialogSetPresenter_nid_postfix(false); + UserMessage focusNo{MsgDialog::ButtonTypeYesNoFocusNo, 0, "Delete?"}; + UserParam focusParam(MsgDialog::ModeUserMsg, &focusNo); + Require(sceMsgDialogOpen(&focusParam) == 0 && sceMsgDialogGetStatus() == kStatusFinished && Session() != ModalDialogState::Showing); + result = MsgDialogResult{}; + Require(sceMsgDialogGetResult(&result) == 0 && result.button_id == kButtonIdOk); + Require(sceMsgDialogTerminate() == 0); +} + +void CloseAndTerminate() { + MsgDialogResult result{}; + UserMessage yesNo{MsgDialog::ButtonTypeYesNo, 0, "Continue?"}; + UserParam param(MsgDialog::ModeUserMsg, &yesNo); + ModalDialogSetPresenter_nid_postfix(true); + Require(sceMsgDialogInitialize() == 0); + Require(sceMsgDialogOpen(¶m) == 0 && Session() == ModalDialogState::Showing); + Require(sceMsgDialogClose() == 0); + Require(Session() == ModalDialogState::Closed); + Require(sceMsgDialogGetStatus() == kStatusFinished); + Require(sceMsgDialogClose() == kErrNotRunning); + Require(sceMsgDialogGetResult(&result) == 0 && result.button_id == kButtonIdOk); + + Require(sceMsgDialogOpen(¶m) == 0 && Session() == ModalDialogState::Showing); + UserMessage okOnly{MsgDialog::ButtonTypeOk, 0, "Saved"}; + UserParam okParam(MsgDialog::ModeUserMsg, &okOnly); + Require(sceMsgDialogOpen(&okParam) == 0 && Session() == ModalDialogState::Showing); + ModalDialogView view; + Require(ModalDialogReadView_nid_postfix(view) && view.message == u"Saved" && view.buttons.size() == 1); + Require(sceMsgDialogGetStatus() == kStatusRunning); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Confirm); + Require(sceMsgDialogGetStatus() == kStatusFinished); + + Require(sceMsgDialogOpen(¶m) == 0 && Session() == ModalDialogState::Showing); + Require(sceMsgDialogTerminate() == 0); + Require(Session() == ModalDialogState::Idle); + Require(!ModalDialogCapturesInput_nid_postfix()); + ModalDialogSetPresenter_nid_postfix(false); +} + +void OtherLibraryDialog() { + ModalDialogSetPresenter_nid_postfix(true); + ModalDialogRequest other; + other.owner = ModalDialogOwnerErrorDialog; + other.message = u"Error"; + other.buttons = {u"OK"}; + Require(ModalDialogOpen_nid_postfix(other)); + Require(sceMsgDialogInitialize() == 0); + Require(sceMsgDialogTerminate() == 0); + std::size_t chosen = 0; + Require(ModalDialogPoll_nid_postfix(chosen, ModalDialogOwnerErrorDialog) == ModalDialogState::Showing && ModalDialogCapturesInput_nid_postfix()); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Confirm); + Require(ModalDialogPoll_nid_postfix(chosen, ModalDialogOwnerErrorDialog) == ModalDialogState::Answered && chosen == 0); + + UserMessage yesNo{MsgDialog::ButtonTypeYesNo, 0, "Continue?"}; + UserParam param(MsgDialog::ModeUserMsg, &yesNo); + ModalDialogReset_nid_postfix(); + Require(sceMsgDialogInitialize() == 0); + Require(sceMsgDialogOpen(¶m) == 0 && Session() == ModalDialogState::Showing); + ModalDialogReset_nid_postfix(ModalDialogOwnerErrorDialog); + Require(Session() == ModalDialogState::Showing && sceMsgDialogGetStatus() == kStatusRunning); + Require(sceMsgDialogTerminate() == 0); + Require(Session() == ModalDialogState::Idle); + ModalDialogSetPresenter_nid_postfix(false); +} + +void WithoutFlips() { + MsgDialogResult result{}; + UserMessage focusNo{MsgDialog::ButtonTypeYesNoFocusNo, 0, "Delete?"}; + UserParam param(MsgDialog::ModeUserMsg, &focusNo); + ModalDialogSetPresenter_nid_postfix(true); + ModalDialogSetShowTimeout_nid_postfix(40); + Require(sceMsgDialogInitialize() == 0); + Require(sceMsgDialogOpen(¶m) == 0); + Require(sceMsgDialogGetStatus() == kStatusRunning); + std::this_thread::sleep_for(std::chrono::milliseconds(120)); + Require(sceMsgDialogGetStatus() == kStatusFinished); + Require(sceMsgDialogGetResult(&result) == 0 && result.button_id == kButtonIdOk); + Require(!ModalDialogCapturesInput_nid_postfix() && Session() == ModalDialogState::Unshown); + + Require(sceMsgDialogOpen(¶m) == 0 && sceMsgDialogGetStatus() == kStatusRunning); + ModalDialogView view; + Require(ModalDialogReadView_nid_postfix(view)); + std::this_thread::sleep_for(std::chrono::milliseconds(120)); + Require(sceMsgDialogUpdateStatus() == kStatusRunning); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Confirm); + Require(sceMsgDialogUpdateStatus() == kStatusFinished); + Require(sceMsgDialogGetResult(&result) == 0 && result.button_id == kButtonIdNo); + Require(sceMsgDialogTerminate() == 0); + ModalDialogSetShowTimeout_nid_postfix(ModalDialogShowTimeoutMilliseconds); + ModalDialogSetPresenter_nid_postfix(false); +} + +void ShownDialog() { + UserMessage yesNo{MsgDialog::ButtonTypeYesNo, 0, "Continue?"}; + UserParam param(MsgDialog::ModeUserMsg, &yesNo); + MsgDialogResult result{}; + ModalDialogSetPresenter_nid_postfix(true); + Require(sceMsgDialogInitialize() == 0); + Require(sceMsgDialogOpen(¶m) == 0); + Require(Session() == ModalDialogState::Showing); + for (int poll = 0; poll < 3; ++poll) Require(sceMsgDialogUpdateStatus() == kStatusRunning && sceMsgDialogGetStatus() == kStatusRunning); + Require(sceMsgDialogGetResult(&result) == kErrNotFinished); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Next); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Confirm); + Require(sceMsgDialogGetStatus() == kStatusFinished); + result = MsgDialogResult{}; + Require(sceMsgDialogGetResult(&result) == 0 && result.result == 0 && result.button_id == kButtonIdNo); + + Require(sceMsgDialogOpen(¶m) == 0 && sceMsgDialogGetStatus() == kStatusRunning); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Confirm); + Require(sceMsgDialogUpdateStatus() == kStatusFinished); + Require(sceMsgDialogGetResult(&result) == 0 && result.button_id == kButtonIdOk); + + UserMessage focusNo{MsgDialog::ButtonTypeYesNoFocusNo, 0, "Delete?"}; + UserParam focusParam(MsgDialog::ModeUserMsg, &focusNo); + Require(sceMsgDialogOpen(&focusParam) == 0); + ModalDialogPublishInput_nid_postfix(ModalDialogInputKind::Confirm); + Require(sceMsgDialogGetStatus() == kStatusFinished); + Require(sceMsgDialogGetResult(&result) == 0 && result.button_id == kButtonIdNo); + Require(sceMsgDialogTerminate() == 0); + ModalDialogSetPresenter_nid_postfix(false); +} } @@ -74,4 +252,10 @@ int main() { Require(sceMsgDialogGetResult(&result) == kErrNotInitialized); Require(sceMsgDialogClose() == kErrNotRunning); Require(sceMsgDialogGetStatus() == 0); + + ShownDialog(); + CancelAndFallbacks(); + CloseAndTerminate(); + WithoutFlips(); + OtherLibraryDialog(); } diff --git a/core/libs/tests/GuestMultibyteLocale.cpp b/core/libs/tests/GuestMultibyteLocale.cpp index 682521486d8b..95875c1802da 100644 --- a/core/libs/tests/GuestMultibyteLocale.cpp +++ b/core/libs/tests/GuestMultibyteLocale.cpp @@ -114,9 +114,29 @@ static void CheckStrings() { Require(wcstombs_nid_postfix(nullptr, source, 0) == 6, "wcstombs counts bytes"); } +static void CheckMbrlen() { + unsigned char state[16]{}; + Require(mbrlen_nid_postfix("A", 1, state) == 1, "mbrlen counts an ASCII byte"); + Require(mbrlen_nid_postfix("\xc3\xa9", 2, state) == 2, "mbrlen counts a two-byte form"); + Require(mbrlen_nid_postfix("\xe2\x82\xac" "A", 4, state) == 3 && mbsinit_nid_postfix(state), "mbrlen counts one three-byte form"); + Require(mbrlen_nid_postfix("", 1, state) == 0 && mbsinit_nid_postfix(state), "mbrlen returns 0 for a NUL byte"); + Require(mbrlen_nid_postfix("A", 0, state) == Incomplete && mbsinit_nid_postfix(state), "mbrlen of no bytes is incomplete"); + Require(mbrlen_nid_postfix("\xe2\x82", 2, state) == Incomplete && !mbsinit_nid_postfix(state), "mbrlen keeps a partial form pending"); + Require(mbrlen_nid_postfix("\xac", 1, state) == 1 && mbsinit_nid_postfix(state), "mbrlen counts only the byte that completes the form"); + *__error_nid_postfix() = 0; + Require(mbrlen_nid_postfix("\x80", 1, state) == Invalid && *__error_nid_postfix() == 86, "mbrlen rejects a lone continuation byte with EILSEQ"); + Require(mbrlen_nid_postfix(nullptr, 0, state) == 0 && mbsinit_nid_postfix(state), "mbrlen with a null string resets the state"); + + std::uint16_t value = 0; + Require(mbrlen_nid_postfix("\xe2", 1, nullptr) == Incomplete, "mbrlen keeps a partial form in its own internal state"); + Require(mbrtowc_nid_postfix(&value, "A", 1, nullptr) == 1 && value == 'A', "mbrtowc does not share mbrlen's internal state"); + Require(mbrlen_nid_postfix("\x82\xac", 2, nullptr) == 2, "mbrlen completes the form from its internal state"); +} + int main() { CheckDecoding(); CheckState(); + CheckMbrlen(); CheckEncoding(); CheckStrings(); return 0; diff --git a/core/libs/tests/GuestNKWebKitDates.cpp b/core/libs/tests/GuestNKWebKitDates.cpp new file mode 100644 index 000000000000..fb797019380a --- /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 000000000000..2f8f99ca0085 --- /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/GuestNamedShmWindowsMapping.cpp b/core/libs/tests/GuestNamedShmWindowsMapping.cpp new file mode 100644 index 000000000000..608ba4cc29b3 --- /dev/null +++ b/core/libs/tests/GuestNamedShmWindowsMapping.cpp @@ -0,0 +1,89 @@ +#include "prx/libkernel/include/Api.hpp" +#include "prx/libc/include/Api.hpp" +#include "prx/libc/include/general/VabiMacros.hpp" +#include +#include +#include +#include +#include +#include + +namespace { +constexpr int ReadOnly = 0; +constexpr int ReadWrite = 2; +constexpr int Create = 0x200; +constexpr int Exclusive = 0x800; +constexpr int ProtRead = 1; +constexpr int ProtReadWrite = 3; +constexpr int MapShared = 1; +constexpr int MapPrivate = 2; +constexpr std::size_t Size = 0x8000; +void* const Failed = reinterpret_cast(static_cast(-1)); + +void Require(bool value, const char* message) { + if (value) return; + std::fprintf(stderr, "named shared-memory mapping: %s (guest errno %d)\n", message, *__error_nid_postfix()); + std::abort(); +} + +char* Map(std::size_t length, int protection, int flags, int descriptor, std::int64_t offset) { + return static_cast(mmap_nid_postfix(nullptr, length, protection, flags, descriptor, offset)); +} +} + +int main() { + const std::string name = "/aps5-named-map-" + std::to_string(::GetCurrentProcessId()); + shm_unlink_nid_postfix(name.c_str()); + const int first = shm_open_nid_postfix(name.c_str(), Create | Exclusive | ReadWrite, 0600); + Require(first >= 0, "creating the named object failed"); + Require(ftruncate_nid_postfix(first, Size) == 0, "sizing the named object failed"); + + auto* view = Map(Size, ProtReadWrite, MapShared, first, 0); + Require(view != Failed, "a shared read-write mapping of the named object failed"); + view[0x10] = 'a'; + + const int second = shm_open_nid_postfix(name.c_str(), ReadWrite, 0); + Require(second >= 0 && second != first, "reopening the named object failed"); + auto* other = Map(Size, ProtReadWrite, MapShared, second, 0); + Require(other != Failed && other != view, "a second shared mapping of the named object failed"); + Require(other[0x10] == 'a', "a store through one mapping is missing from a mapping of another descriptor"); + other[0x5000] = 'b'; + Require(view[0x5000] == 'b', "a store through the second mapping is missing from the first"); + + char byte = 0; + Require(pread_nid_postfix(second, &byte, 1, 0x5000) == 1 && byte == 'b', "pread does not see a store made through a mapping"); + const char written = 'c'; + Require(pwrite_nid_disambig1_nid_postfix(first, &written, 1, 0x6000) == 1, "pwrite into the named object failed"); + Require(view[0x6000] == 'c' && other[0x6000] == 'c', "a mapping does not see a pwrite into the named object"); + + auto* offset = Map(0x4000, ProtRead, MapShared, second, 0x4000); + Require(offset != Failed && offset[0x1000] == 'b' && offset[0x2000] == 'c', "a mapping at a nonzero offset shows the wrong bytes"); + Require(munmap_nid_postfix(offset, 0x4000) == 0, "unmapping the offset mapping failed"); + + const int reader = shm_open_nid_postfix(name.c_str(), ReadOnly, 0); + Require(reader >= 0, "opening the named object read-only failed"); + auto* readView = Map(Size, ProtRead, MapShared, reader, 0); + Require(readView != Failed && readView[0x5000] == 'b', "a read-only mapping of a read-only descriptor failed"); + Require(munmap_nid_postfix(readView, Size) == 0, "unmapping the read-only mapping failed"); + *__error_nid_postfix() = 0; + Require(Map(Size, ProtReadWrite, MapShared, reader, 0) == Failed && *__error_nid_postfix() == 13, "a writable shared mapping of a read-only descriptor was not refused with EACCES"); + Require(close_nid_postfix(reader) == 0, "closing the read-only descriptor failed"); + + Require(shm_unlink_nid_postfix(name.c_str()) == 0, "unlinking the named object failed"); + *__error_nid_postfix() = 0; + Require(shm_open_nid_postfix(name.c_str(), ReadWrite, 0) == -1 && *__error_nid_postfix() == 2, "the unlinked name still opens"); + view[0x7000] = 'u'; + Require(other[0x7000] == 'u', "mappings of an unlinked object stopped sharing stores"); + Require(pread_nid_postfix(second, &byte, 1, 0x7000) == 1 && byte == 'u', "a descriptor of an unlinked object stopped seeing mapped stores"); + + auto* copy = Map(Size, ProtReadWrite, MapPrivate, second, 0); + Require(copy != Failed && copy[0x10] == 'a', "a private mapping of the named object failed"); + copy[0x10] = 'p'; + Require(view[0x10] == 'a' && pread_nid_postfix(first, &byte, 1, 0x10) == 1 && byte == 'a', "a store through a private mapping reached the named object"); + Require(munmap_nid_postfix(copy, Size) == 0, "unmapping the private mapping failed"); + + Require(munmap_nid_postfix(view, Size) == 0 && munmap_nid_postfix(other, Size) == 0, "unmapping the shared mappings failed"); + Require(close_nid_postfix(first) == 0 && close_nid_postfix(second) == 0, "closing the named object's descriptors failed"); + std::puts("named shared-memory mapping tests passed"); + return 0; +} diff --git a/core/libs/tests/GuestNetSocketState.cpp b/core/libs/tests/GuestNetSocketState.cpp index 2101d0c16731..b8a9cd7ad6c2 100644 --- a/core/libs/tests/GuestNetSocketState.cpp +++ b/core/libs/tests/GuestNetSocketState.cpp @@ -22,9 +22,36 @@ static void CheckOption(int socket, int option, int expected) { } } +static void RequireError(int result, int error) { + Require(result == static_cast(0x80410100u | static_cast(error))); + Require(*sceNetErrnoLoc() == error); +} + +static void CheckStateErrors(int family) { + const int datagram = sceNetSocket("errors-datagram", family, 2, 17); + const int stream = sceNetSocket("errors-stream", family, 1, 6); + const int closed = sceNetSocket("errors-closed", family, 1, 6); + Require(datagram >= 0 && stream >= 0 && closed >= 0); + Require(sceNetSocketClose(closed) == 0); + for (const int how : {-1, 3}) RequireError(sceNetShutdown(stream, how), 22); + RequireError(sceNetShutdown(closed, 1), 9); + RequireError(sceNetListen(closed, 1), 9); + RequireError(sceNetListen(datagram, 1), 45); + RequireError(sceNetAccept(closed, nullptr, nullptr), 9); + RequireError(sceNetAccept(stream, nullptr, nullptr), 22); + std::array address{}; + std::uint32_t size = family == 2 ? 16 : 28; + address[0] = static_cast(size); + address[1] = static_cast(family); + RequireError(sceNetBind_nid_postfix(closed, address.data(), size), 9); + RequireError(sceNetGetsockname(closed, address.data(), &size), 9); + for (const int socket : {stream, datagram}) Require(sceNetSocketClose(socket) == 0); +} + int main() { Require(sceNetInit_nid_postfix() == 0); for (const int family : {2, 28}) { + CheckStateErrors(family); const int datagram = sceNetSocket("state-datagram", family, 2, 17); const int listener = sceNetSocket("state-listener", family, 1, 6); const int client = sceNetSocket("state-client", family, 1, 6); diff --git a/core/libs/tests/GuestNpAuth.cpp b/core/libs/tests/GuestNpAuth.cpp index a1920ceb5c21..31efb7ba5789 100644 --- a/core/libs/tests/GuestNpAuth.cpp +++ b/core/libs/tests/GuestNpAuth.cpp @@ -139,6 +139,9 @@ int main() { Require(sceNpAuthSetTimeout(unknownReq, 2, 5000000, 10000000, 10000000, 10000000) == requestNotFound); Require(sceNpAuthWaitAsync(syncReq, nullptr) == invalidArgument); + Require(sceNpAuthPollAsync(asyncReq, nullptr) == invalidArgument); + Require(sceNpAuthPollAsync(syncReq, nullptr) == invalidArgument); + Require(sceNpAuthPollAsync(unknownReq, nullptr) == invalidArgument); Require(sceNpAuthWaitAsync(syncReq, &waitResult) == invalidId); Require(sceNpAuthPollAsync(syncReq, &pollResult) == invalidId); diff --git a/core/libs/tests/GuestNpAuthAuthorizedAppDialog.cpp b/core/libs/tests/GuestNpAuthAuthorizedAppDialog.cpp index 793b7cc3c5ea..e39943224abd 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 28a329dd02e9..12cd7fa4bfb9 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 21e7c42392ad..08313861e120 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 9d646757ef72..5b2ca6ea8857 100644 --- a/core/libs/tests/GuestNpCommonRuntime.cpp +++ b/core/libs/tests/GuestNpCommonRuntime.cpp @@ -1,6 +1,7 @@ #include "prx/libSceNpCommon/include/Api.hpp" #include "SceTypes.hpp" +#include #include #include #include @@ -8,7 +9,9 @@ #include #include #include +#include #include +#include namespace { @@ -30,8 +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; @@ -70,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"); @@ -155,6 +232,146 @@ void TestHeaps() { Require(sceNpIpc2ClientTerm() == 0 && sceNpIpc2ClientInit() == 0 && sceNpIpc2ClientTerm() == 0, "the ipc client restarts"); } +struct AllocatorRecord { + std::array block {}; + std::size_t size = 0; + void* released = nullptr; + bool fail = false; +}; + +void* APS5_VABI RecordAllocate(std::size_t size, void* context) { + auto* record = static_cast(context); + record->size = size; + return record->fail ? nullptr : record->block.data(); +} + +void APS5_VABI RecordRelease(void* pointer, void* context) { + static_cast(context)->released = pointer; +} + +void TestObjects() { + AllocatorRecord record {}; + NpAllocator allocator {RecordAllocate, nullptr, RecordRelease, &record}; + void* object = _ZN3sce2np6ObjectnwEmR14SceNpAllocator(40, &allocator); + NpAllocator* stored = nullptr; + std::memcpy(&stored, record.block.data(), sizeof(stored)); + + Require(object == record.block.data() + 16 && record.size == 56 && stored == &allocator, + "an object is allocated behind a 16-byte header that keeps its allocator"); + AllocatorRecord other {}; + NpAllocator otherAllocator {RecordAllocate, nullptr, RecordRelease, &other}; + _ZN3sce2np6ObjectdlEPvR14SceNpAllocator(object, &otherAllocator); + + Require(record.released == record.block.data() && other.released == nullptr, "an object is freed through the allocator it was allocated with"); + record.released = nullptr; + _ZN3sce2np6ObjectdaEPv(_ZN3sce2np6ObjectnaEmR14SceNpAllocator(0, &allocator)); + + Require(record.size == 16 && record.released == record.block.data(), "an array is allocated and freed the same way"); + NpAllocatorEx allocatorEx {allocator, 0x1234}; + record.released = nullptr; + object = _ZN3sce2np6ObjectnwEmR16SceNpAllocatorEx(8, &allocatorEx); + std::memcpy(&stored, record.block.data(), sizeof(stored)); + + Require(object == record.block.data() + 16 && stored == &allocatorEx.allocator, "an extended allocator keeps its own address in the header"); + _ZN3sce2np6ObjectdaEPvR16SceNpAllocatorEx(object, &allocatorEx); + Require(record.released == record.block.data(), "an object from an extended allocator is freed through it"); + record.released = nullptr; + _ZN3sce2np6ObjectdlEPv(_ZN3sce2np6ObjectnaEmR16SceNpAllocatorEx(8, &allocatorEx)); + _ZN3sce2np6ObjectdlEPvR16SceNpAllocatorEx(nullptr, &allocatorEx); + _ZN3sce2np6ObjectdaEPvR14SceNpAllocator(nullptr, &allocator); + + Require(record.released == record.block.data(), "freeing a null object does nothing"); + record.fail = true; + Require(_ZN3sce2np6ObjectnwEmR14SceNpAllocator(8, &allocator) == nullptr && _ZN3sce2np6ObjectnwEmR16SceNpAllocatorEx(8, &allocatorEx) == nullptr, + "a failed allocation returns null"); +} + +void TestObjectsThroughStoredAllocator() { + AllocatorRecord record {}; + NpAllocator allocator {RecordAllocate, nullptr, RecordRelease, &record}; + NpAllocatorEx allocatorEx {allocator, 0x1234}; + AllocatorRecord other {}; + NpAllocator otherAllocator {RecordAllocate, nullptr, RecordRelease, &other}; + NpAllocatorEx otherEx {otherAllocator, 0}; + + record.block.fill(0xAA); + void* object = _ZN3sce2np6ObjectnaEmR16SceNpAllocatorEx(24, &allocatorEx); + Require(object == record.block.data() + 16 && record.size == 40, "an extended array is allocated behind the header"); + Require(std::all_of(record.block.begin() + 8, record.block.begin() + 16, [](std::uint8_t b) { return b == 0xAA; }), + "the second half of the header is left as the allocator returned it"); + _ZN3sce2np6ObjectdlEPvR16SceNpAllocatorEx(object, &otherEx); + Require(record.released == record.block.data() && other.released == nullptr, "delete with an extended allocator frees through the stored one"); + + record.released = nullptr; + _ZN3sce2np6ObjectdaEPvR14SceNpAllocator(_ZN3sce2np6ObjectnwEmR14SceNpAllocator(8, &allocator), &otherAllocator); + Require(record.released == record.block.data() && other.released == nullptr, "delete[] with an allocator frees through the stored one"); + + record.released = nullptr; + _ZN3sce2np6ObjectdaEPvR16SceNpAllocatorEx(_ZN3sce2np6ObjectnwEmR16SceNpAllocatorEx(8, &allocatorEx), &otherEx); + Require(record.released == record.block.data() && other.released == nullptr, "delete[] with an extended allocator frees through the stored one"); + + Require(_ZN3sce2np6ObjectnwEmR14SceNpAllocator(SIZE_MAX - 15, &allocator) == record.block.data() + 16 && record.size == 0, + "the size plus the header wraps unchecked, so a succeeding allocator is asked for 0 bytes"); + + record.fail = true; + Require(_ZN3sce2np6ObjectnaEmR14SceNpAllocator(8, &allocator) == nullptr && _ZN3sce2np6ObjectnaEmR16SceNpAllocatorEx(8, &allocatorEx) == nullptr, + "a failed array allocation returns null"); +} + +void TestTitleIdObjects() { + NpTitleIdObject parsed {}; + std::memset(&parsed, 0x77, sizeof(parsed)); + Require(_ZN3sce2np9NpTitleId5ParseEPS1_PKc(&parsed, "WXYZ54321_07") == 0 && std::memcmp(parsed.titleId.data, "WXYZ54321_00\0\0\0", 16) == 0, + "parsing keeps the nine character code and resets the suffix to _00"); + Require(_ZN3sce2np9NpTitleId5ParseEPS1_PKcm(&parsed, "WXYZ54321", 9) == NpTitleIdInvalid, "parsing needs the twelve character form"); + Require(_ZN3sce2np9NpTitleId5ParseEPS1_PKc(&parsed, "WXYZ5432a_07") == NpTitleIdInvalid + && _ZN3sce2np9NpTitleId5ParseEPS1_PKc(&parsed, "WXY154321_07") == NpTitleIdInvalid + && _ZN3sce2np9NpTitleId5ParseEPS1_PKc(&parsed, "WXYZ54321-07") == NpTitleIdInvalid, + "parsing needs four letters, five digits, an underscore and two digits"); + Require(std::memcmp(parsed.titleId.data, "WXYZ54321_00", 13) == 0, "a rejected title id leaves the object as it was"); + + NpTitleIdObject built {}; + _ZN3sce2np9NpTitleIdC1Ev(&built); + Require(_ZNK3sce2np9NpTitleId7IsEmptyEv(&built) && built.vtable != nullptr, "a default title id is empty"); + Require(_ZN3sce2np9NpTitleId20ConstructFromTitleIdEPS1_PKcm(&built, "wxyz54321", 9) == 0 + && _ZN3sce2np9NpTitleId20ConstructFromTitleIdEPS1_PKc(&built, "WXYZ54321_00") == NpTitleIdInvalid, + "constructing takes only the nine character code"); + Require(_ZN3sce2np9NpTitleId20ConstructFromTitleIdEPS1_PKc(&built, "WXYZ54321") == 0 && !_ZNK3sce2np9NpTitleId7IsEmptyEv(&built), + "a constructed title id is not empty"); + + char text[16]; + std::memset(text, 'x', sizeof(text)); + Require(_ZN3sce2np9NpTitleId5BuildERKS1_Pcm(&built, text, 12) == NpTitleIdBufferTooSmall && text[0] == 'x', "building needs 13 bytes"); + Require(_ZN3sce2np9NpTitleId5BuildERKS1_Pcm(&built, text, 14) == 0 && std::strcmp(text, "WXYZ54321_00") == 0 && text[13] == '\0' && text[14] == 'x', + "building writes the title id and clears the rest of the buffer"); + + NpTitleIdObject copy {}; + _ZN3sce2np9NpTitleIdC1ERKS1_(©, &parsed); + NpTitleId plain = parsed.titleId; + plain.data[11] = '9'; + Require(_ZNK3sce2np9NpTitleId6EqualsERKS1_(©, &built) && _ZN3sce2npeqERKNS0_9NpTitleIdES3_(©, &built) + && _ZNK3sce2np9NpTitleId6EqualsEPKc(©, "WXYZ54321_00"), "equal title ids compare equal"); + Require(_ZN3sce2npneERKNS0_9NpTitleIdERK12SceNpTitleId(©, &plain) && _ZN3sce2npneERK12SceNpTitleIdRKNS0_9NpTitleIdE(&plain, ©), + "the suffix takes part in the comparison"); + plain.data[12] = 'q'; + plain.data[11] = '0'; + Require(_ZNK3sce2np9NpTitleId6EqualsERK12SceNpTitleId(©, &plain), "only the first twelve characters are compared"); + + _ZN3sce2np9NpTitleIdC1ERK12SceNpTitleId(©, &plain); + _ZN3sce2np9NpTitleIdaSERKS1_(&built, ©); + Require(built.titleId.data[12] == 'q', "assignment copies all sixteen bytes"); + _ZN3sce2np9NpTitleId5ClearEv(&built); + Require(_ZNK3sce2np9NpTitleId7IsEmptyEv(&built) && built.titleId.data[12] == '\0', "clearing empties the title id"); + + AllocatorRecord record {}; + NpAllocator allocator {RecordAllocate, nullptr, RecordRelease, &record}; + auto* owned = static_cast(_ZN3sce2np6ObjectnwEmR14SceNpAllocator(sizeof(NpTitleIdObject), &allocator)); + _ZN3sce2np9NpTitleIdC1Ev(owned); + using Destructor = void APS5_VABI (*)(NpTitleIdObject*); + reinterpret_cast(const_cast(owned->vtable[1]))(owned); + Require(record.released == record.block.data(), "the deleting destructor frees through the stored allocator"); +} + struct CalloutRecord { std::atomic order {0}; std::atomic first {0}; @@ -312,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] = {}; @@ -417,6 +854,11 @@ void TestHexAndCopies() { Require(sceNpStrParseHex("0AF", bytes, 2) == NpInvalidArgument, "odd hex is refused"); Require(sceNpStrParseHex("0AFE", bytes, 1) == NpBufferTooSmall, "hex parsing checks the output size"); Require(sceNpStrParseHex("0AG1", bytes, 2) == NpInvalidArgument, "non-hex characters are refused"); + bytes[1] = 0xFF; + Require(sceNpStrParseHex("0A5G", bytes, 2) == NpInvalidArgument && bytes[0] == 0x0A && bytes[1] == 0x50, + "a valid high digit is stored before the low digit is refused"); + bytes[1] = 0xFF; + Require(sceNpStrnParseHex("0AG5", 4, bytes, 2) == NpInvalidArgument && bytes[1] == 0xFF, "a refused high digit stores nothing"); Require(sceNpStrnParseHex("DEADBEEF1234", 8, bytes, 4) == 0 && bytes[0] == 0xDE && bytes[3] == 0xEF, "a hex prefix is read"); char copy[8] = {}; @@ -428,12 +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(); @@ -441,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 2d85fde51b6d..38dd085db73a 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 000000000000..a5a32c4aa4d9 --- /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/GuestNpCppWebApiOffline.cpp b/core/libs/tests/GuestNpCppWebApiOffline.cpp index dfe8d7abc05b..40a67516edbb 100644 --- a/core/libs/tests/GuestNpCppWebApiOffline.cpp +++ b/core/libs/tests/GuestNpCppWebApiOffline.cpp @@ -211,6 +211,63 @@ static void TestLeaderboardsParameterLifecycles() { }); } +static void TestUserProfileParameterLifecycles() { + TestParameterLifecycle( + { + _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriendsC1Ev, + _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriendsD1Ev, + _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriends9terminateEv, + nullptr, + }, + [](void* parameter, const std::uint64_t* context, bool present) { + return _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriends10initializeEPNS1_6Common10LibContextEPKc(parameter, context, present ? "me" : nullptr); + }); + TestParameterLifecycle( + { + _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi28ParameterToGetBasicPresencesC1Ev, + _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi28ParameterToGetBasicPresencesD1Ev, + _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi28ParameterToGetBasicPresences9terminateEv, + nullptr, + }, + [](void* parameter, const std::uint64_t* context, bool present) { + return _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi28ParameterToGetBasicPresences10initializeEPNS1_6Common10LibContextEPKc(parameter, context, present ? "1,2" : nullptr); + }); + TestParameterLifecycle( + { + _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsersC1Ev, + _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsersD1Ev, + _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsers9terminateEv, + nullptr, + }, + [](void* parameter, const std::uint64_t* context, bool present) { + return present ? _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsers10initializeEPNS1_6Common10LibContextE(parameter, context) : ParameterInvalidArgument; + }); + TestParameterLifecycle( + { + _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi44ParameterToGetCommunicationRestrictionStatusC1Ev, + _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi44ParameterToGetCommunicationRestrictionStatusD1Ev, + _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi44ParameterToGetCommunicationRestrictionStatus9terminateEv, + nullptr, + }, + [](void* parameter, const std::uint64_t* context, bool present) { + return present ? _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi44ParameterToGetCommunicationRestrictionStatus10initializeEPNS1_6Common10LibContextEm(parameter, context, 1) : ParameterInvalidArgument; + }); + TestParameterLifecycle( + { + _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi26ParameterToFilterProfanityC1Ev, + _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi26ParameterToFilterProfanityD1Ev, + _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi26ParameterToFilterProfanity9terminateEv, + nullptr, + }, + [](void* parameter, const std::uint64_t* context, bool present) { + const auto initialize = _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi26ParameterToFilterProfanity10initializeEPNS1_6Common10LibContextEPKcSA_NS6_12IntrusivePtrINS3_19WebApiFilterRequestEEE; + if (present) return initialize(parameter, context, "en-US", "0", &body); + Require(initialize(parameter, context, "en-US", "0", &missingBody) == ParameterBodyMissing, "initialize accepted a missing filter request"); + Require(initialize(parameter, context, nullptr, "0", &body) == ParameterInvalidArgument, "initialize accepted a null locale"); + return initialize(parameter, context, "en-US", nullptr, &body); + }); +} + static void TestIteratorDestructors() { unsigned char iterator[0x20]; std::memset(iterator, 0x5a, sizeof(iterator)); @@ -273,6 +330,7 @@ int main() { TestParameterLifecycles(); TestSessionManagerParameterLifecycles(); TestLeaderboardsParameterLifecycles(); + TestUserProfileParameterLifecycles(); TestIteratorDestructors(); TestVectorSizeAndElements(); std::puts("NpCppWebApi offline tests passed"); diff --git a/core/libs/tests/GuestNpCppWebApiSignedOut.cpp b/core/libs/tests/GuestNpCppWebApiSignedOut.cpp index 0cfea69f0018..5d7ea3cf4feb 100644 --- a/core/libs/tests/GuestNpCppWebApiSignedOut.cpp +++ b/core/libs/tests/GuestNpCppWebApiSignedOut.cpp @@ -11,6 +11,7 @@ static constexpr int TransactionNotStarted = static_cast(0x80553508); using Object = int (APS5_VABI*)(void*); using Call = int (APS5_VABI*)(); +using Initialize = int (*)(void*, std::uint64_t*); struct RequestFlow { Object transactionConstruct; @@ -22,11 +23,37 @@ struct RequestFlow { Call getResponseHeaders; Object parameterConstruct; Object parameterDestroy; - Call initialize; - Call terminate; + Initialize initialize; + Object terminate; Call call; }; +static IntrusivePtr filterRequest{reinterpret_cast(0x1000), nullptr, nullptr}; + +static int InitializeFriends(void* parameter, std::uint64_t* context) { + return _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriends10initializeEPNS1_6Common10LibContextEPKc(parameter, context, "me"); +} + +static int InitializeBlockingUsers(void* parameter, std::uint64_t* context) { + return _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsers10initializeEPNS1_6Common10LibContextE(parameter, context); +} + +static int InitializeBasicPresences(void* parameter, std::uint64_t* context) { + return _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi28ParameterToGetBasicPresences10initializeEPNS1_6Common10LibContextEPKc(parameter, context, "me"); +} + +static int InitializeFilterProfanity(void* parameter, std::uint64_t* context) { + return _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi26ParameterToFilterProfanity10initializeEPNS1_6Common10LibContextEPKcSA_NS6_12IntrusivePtrINS3_19WebApiFilterRequestEEE(parameter, context, "en-US", "0", &filterRequest); +} + +static int InitializeCommunicationRestrictionStatus(void* parameter, std::uint64_t* context) { + 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, @@ -38,7 +65,7 @@ static const RequestFlow flows[] = { _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V118GetFriendsResponseEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_, _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriendsC1Ev, _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriendsD1Ev, - _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriends10initializeEPNS1_6Common10LibContextEPKc, + InitializeFriends, _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi21ParameterToGetFriends9terminateEv, _ZN3sce2Np9CppWebApi11UserProfile2V110FriendsApi10getFriendsEiRKNS4_21ParameterToGetFriendsERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_18GetFriendsResponseEEENSA_INS8_18ResponseHeaderBaseEEEEE, }, @@ -52,7 +79,7 @@ static const RequestFlow flows[] = { _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V124GetBlockingUsersResponseEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_, _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsersC1Ev, _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsersD1Ev, - _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsers10initializeEPNS1_6Common10LibContextE, + InitializeBlockingUsers, _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi27ParameterToGetBlockingUsers9terminateEv, _ZN3sce2Np9CppWebApi11UserProfile2V19BlocksApi16getBlockingUsersEiRKNS4_27ParameterToGetBlockingUsersERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_24GetBlockingUsersResponseEEENSA_INS8_18ResponseHeaderBaseEEEEE, }, @@ -66,7 +93,7 @@ static const RequestFlow flows[] = { _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_11UserProfile2V125GetBasicPresencesResponseEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_, _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi28ParameterToGetBasicPresencesC1Ev, _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi28ParameterToGetBasicPresencesD1Ev, - _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi28ParameterToGetBasicPresences10initializeEPNS1_6Common10LibContextEPKc, + InitializeBasicPresences, _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi28ParameterToGetBasicPresences9terminateEv, _ZN3sce2Np9CppWebApi11UserProfile2V111PresenceApi17getBasicPresencesEiRKNS4_28ParameterToGetBasicPresencesERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_25GetBasicPresencesResponseEEENSA_INS8_18ResponseHeaderBaseEEEEE, }, @@ -80,7 +107,7 @@ static const RequestFlow flows[] = { _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_15ProfanityFilter2V223FilterProfanityResponseEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_, _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi26ParameterToFilterProfanityC1Ev, _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi26ParameterToFilterProfanityD1Ev, - _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi26ParameterToFilterProfanity10initializeEPNS1_6Common10LibContextEPKcSA_NS6_12IntrusivePtrINS3_19WebApiFilterRequestEEE, + InitializeFilterProfanity, _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi26ParameterToFilterProfanity9terminateEv, _ZN3sce2Np9CppWebApi15ProfanityFilter2V212ProfanityApi15filterProfanityEiRKNS4_26ParameterToFilterProfanityERNS1_6Common11TransactionINS8_12IntrusivePtrINS3_23FilterProfanityResponseEEENSA_INS8_18ResponseHeaderBaseEEEEE, }, @@ -94,10 +121,24 @@ static const RequestFlow flows[] = { _ZNK3sce2Np9CppWebApi6Common15TransactionBaseINS2_12IntrusivePtrINS1_30CommunicationRestrictionStatus2V338CommunicationRestrictionStatusResponseEEENS4_INS2_18ResponseHeaderBaseEEEE18getResponseHeadersERSA_, _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi44ParameterToGetCommunicationRestrictionStatusC1Ev, _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi44ParameterToGetCommunicationRestrictionStatusD1Ev, - _ZN3sce2Np9CppWebApi30CommunicationRestrictionStatus2V333CommunicationRestrictionStatusApi44ParameterToGetCommunicationRestrictionStatus10initializeEPNS1_6Common10LibContextEm, + InitializeCommunicationRestrictionStatus, _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*); @@ -161,19 +202,22 @@ static void TestRequestFlow(const RequestFlow& flow) { alignas(16) unsigned char parameter[0x100]; std::memset(transaction, 0x5a, sizeof(transaction)); std::memset(parameter, 0x5a, sizeof(parameter)); + std::uint64_t context = 0; + Require(_ZN3sce2Np9CppWebApi6Common10initializeERKNS2_10InitParamsERNS2_10LibContextE(nullptr, &context) == 0); Require(flow.transactionConstruct(transaction) == 0); Require(flow.setOnFinishedCallback() == 0); Require(flow.setResponseInformationOption() == 0); Require(flow.parameterConstruct(parameter) == 0); - Require(flow.initialize() == 0); + Require(flow.initialize(parameter, &context) == 0); Require(flow.call() == NotSignedIn); Require(flow.start() == NotSignedIn); Require(flow.getResponseHeaders() == NotSignedIn); Require(flow.finish() == TransactionNotStarted); - Require(flow.terminate() == 0); + Require(flow.terminate(parameter) == 0); Require(flow.parameterDestroy(parameter) == 0); Require(flow.transactionDestroy(transaction) == 0); + Require(_ZN3sce2Np9CppWebApi6Common9terminateERNS2_10LibContextE(&context) == 0); } int main() { diff --git a/core/libs/tests/GuestNpCppWebApiTitleCloudStorage.cpp b/core/libs/tests/GuestNpCppWebApiTitleCloudStorage.cpp new file mode 100644 index 000000000000..da9a621cb34d --- /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 897d26ebe2f9..b71297ccdcae 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 2ee253c2b5cb..80d5022a1def 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 cb7fa68f8d06..49ba4eb8058a 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() { @@ -143,8 +195,11 @@ int main() { Require(sceNpProfileDialogTerminate() == 0); Require(sceNpProfileDialogTerminate() == kErrNotInitialized); - Require(sceNpProfileDialogGetStatus() == kStatusNone); + Require(sceNpProfileDialogClose() == kErrNotInitialized); Require(sceNpProfileDialogGetResult(reinterpret_cast(result)) == kErrNotInitialized); + Require(sceNpProfileDialogGetResult(nullptr) == kErrNotInitialized); + Require(sceNpProfileDialogGetStatus() == kStatusNone); + Require(sceNpProfileDialogUpdateStatus() == kStatusNone); Require(sceNpProfileDialogInitialize() == 0); std::memset(result, kSentinel, sizeof(result)); @@ -155,5 +210,12 @@ int main() { Require(sceNpProfileDialogGetResult(reinterpret_cast(result)) == 0); RequireCanceled(result, &first); Require(sceNpProfileDialogTerminate() == 0); + Require(sceNpProfileDialogTerminate() == kErrNotInitialized); + Require(sceNpProfileDialogClose() == kErrNotInitialized); + Require(sceNpProfileDialogGetResult(reinterpret_cast(result)) == kErrNotInitialized); + 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 d69593f7e539..cd5d5c09435e 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 507569039f78..ce6f93b7d245 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/GuestNpTrophy.cpp b/core/libs/tests/GuestNpTrophy.cpp index 2564fbc361ec..75c31429a3d9 100644 --- a/core/libs/tests/GuestNpTrophy.cpp +++ b/core/libs/tests/GuestNpTrophy.cpp @@ -116,6 +116,18 @@ int main() { Require(sceNpTrophyGetGameIcon(context, handle, icon, nullptr) == InvalidArgument, "null game icon size pointer"); Require(sceNpTrophyGetGroupIcon(context, handle, 0, icon, nullptr) == InvalidArgument, "null group icon size pointer"); Require(sceNpTrophyGetTrophyIcon(context, handle, 0, icon, nullptr) == InvalidArgument, "null trophy icon size pointer"); + Require(sceNpTrophyGetGameInfo(context, handle, nullptr, nullptr) == InvalidArgument, "null game info pointers"); + Require(sceNpTrophyGetGroupInfo(context, handle, 0, nullptr, nullptr) == InvalidArgument, "null group info pointers"); + Require(sceNpTrophyGetTrophyInfo(context, handle, 0, nullptr, nullptr) == InvalidArgument, "null trophy info pointers"); + GameDetails badGameDetails{}; + badGameDetails.size = 1; + Require(sceNpTrophyGetGameInfo(context, handle, &badGameDetails, nullptr) == InvalidArgument, "invalid game details size"); + GroupDetails badGroupDetails{}; + badGroupDetails.size = 1; + Require(sceNpTrophyGetGroupInfo(context, handle, 0, &badGroupDetails, nullptr) == InvalidArgument, "invalid group details size"); + TrophyDetails badTrophyDetails{}; + badTrophyDetails.size = 1; + Require(sceNpTrophyGetTrophyInfo(context, handle, 0, &badTrophyDetails, nullptr) == InvalidArgument, "invalid trophy details size"); Require(sceNpTrophyDestroyHandle(-1) == InvalidHandle, "invalid handle destruction"); Require(sceNpTrophyDestroyContext(missing) == 0, "destroy the second context"); int live = 0; diff --git a/core/libs/tests/GuestNpTrophyStats.cpp b/core/libs/tests/GuestNpTrophyStats.cpp index 35511ae5b614..6fb19c20e1e9 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/GuestNpTrophySystemDebug.cpp b/core/libs/tests/GuestNpTrophySystemDebug.cpp new file mode 100644 index 000000000000..26b419939c1c --- /dev/null +++ b/core/libs/tests/GuestNpTrophySystemDebug.cpp @@ -0,0 +1,29 @@ +#include "prx/libSceNpTrophy/include/Api.hpp" + +#include +#include + +int main() { + constexpr int DebugResult = static_cast(0x80551692u); + struct Call { + const char* name; + int (APS5_VABI* function)(); + }; + const Call calls[] = { + {"sceNpTrophySystemDbgCtl", sceNpTrophySystemDbgCtl}, + {"sceNpTrophySystemGetDbgParam", sceNpTrophySystemGetDbgParam}, + {"sceNpTrophySystemGetDbgParamInt", sceNpTrophySystemGetDbgParamInt}, + {"sceNpTrophySystemSetDbgParam", sceNpTrophySystemSetDbgParam}, + {"sceNpTrophySystemSetDbgParamInt", sceNpTrophySystemSetDbgParamInt}, + }; + for (const Call& call : calls) { + for (int attempt = 0; attempt < 2; ++attempt) { + if (call.function() != DebugResult) { + std::fprintf(stderr, "%s did not return 0x80551692\n", call.name); + return 1; + } + } + } + std::puts("NpTrophy system debug tests passed"); + return 0; +} diff --git a/core/libs/tests/GuestNpTus.cpp b/core/libs/tests/GuestNpTus.cpp index b80d87fa8b38..a644360031dd 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/GuestNpUniversalDataSystemQueries.cpp b/core/libs/tests/GuestNpUniversalDataSystemQueries.cpp index 222d6f21a91b..2a6e1afa987a 100644 --- a/core/libs/tests/GuestNpUniversalDataSystemQueries.cpp +++ b/core/libs/tests/GuestNpUniversalDataSystemQueries.cpp @@ -49,18 +49,18 @@ int main() { NpUniversalDataSystemEvent* event = nullptr; CHECK(sceNpUniversalDataSystemCreateEvent("QueryEvent", nullptr, &event, nullptr) == 0 && event != nullptr); std::size_t size = 0; - CHECK(RejectsArgument([&] { sceNpUniversalDataSystemEventEstimateSize(nullptr, &size); })); - CHECK(RejectsArgument([&] { sceNpUniversalDataSystemEventEstimateSize(event, nullptr); })); - CHECK(sceNpUniversalDataSystemEventEstimateSize(event, &size) == 0 && size == 3); + CHECK(sceNpUniversalDataSystemEventEstimateSize(nullptr, &size) == static_cast(0x80553116u)); + CHECK(sceNpUniversalDataSystemEventEstimateSize(event, nullptr) == static_cast(0x80553102u)); + CHECK(sceNpUniversalDataSystemEventEstimateSize(event, &size) == 0 && size == 34); char text[8]; std::memset(text, 'x', sizeof(text)); std::size_t length = 0; - CHECK(RejectsArgument([&] { sceNpUniversalDataSystemEventToString(nullptr, text, sizeof(text), &length); })); + CHECK(sceNpUniversalDataSystemEventToString(nullptr, text, sizeof(text), &length) == static_cast(0x80553116u)); CHECK(text[0] == 'x' && length == 0); - CHECK(sceNpUniversalDataSystemEventToString(event, text, sizeof(text), &length) == 0 && length == 3 && std::strcmp(text, "{}") == 0); + CHECK(sceNpUniversalDataSystemEventToString(event, text, sizeof(text), &length) == 0 && length == 61 && std::strcmp(text, "{\n \"") == 0); length = 0; - CHECK(sceNpUniversalDataSystemEventToString(event, nullptr, 0, &length) == 0 && length == 3); + CHECK(sceNpUniversalDataSystemEventToString(event, nullptr, 0, &length) == 0 && length == 61); char tiny[2] = {'x', 'x'}; CHECK(sceNpUniversalDataSystemEventToString(event, tiny, sizeof(tiny), nullptr) == 0 && tiny[0] == '{' && tiny[1] == '\0'); CHECK(sceNpUniversalDataSystemDestroyEvent(event) == 0); diff --git a/core/libs/tests/GuestNpWebApi.cpp b/core/libs/tests/GuestNpWebApi.cpp index 465ee0900c70..1f6122817c09 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 { @@ -138,6 +140,10 @@ void TestRequests() { Require(sceNpWebApiCreateRequest(user, "group", "/path", MethodPost, &untyped, &request) == InvalidContentParameter, "content without a type"); Require(sceNpWebApiCreateRequest(0, "group", "/path", MethodPost, &untyped, &request) == InvalidContentParameter, "content is checked before the user context"); Require(sceNpWebApiCreateRequest(user, "group", "/path", MethodPatch, nullptr, &request) == InvalidArgument, "PATCH with SDK 2.50 or later"); + SetSdkVersion(0x05050001); + request = 0; + Require(sceNpWebApiCreateRequest(user, "userProfile", "/v1/users/me/profile", 99, nullptr, &request) == InvalidArgument && request == 0, "method 99 at SDK 0x05050001"); + SetSdkVersion(0x04508001); Require(sceNpWebApiCreateRequest(user + 1, "group", "/path", MethodGet, nullptr, &request) == UserContextNotFound, "request of an unknown user context"); Require(sceNpWebApiCreateRequest(0, "group", "/path", MethodGet, nullptr, &request) == LibContextNotFound, "request of user context 0"); Require(sceNpWebApiCreateRequest(-1, "group", "/path", MethodGet, nullptr, &request) == LibContextNotFound, "request of user context -1"); @@ -238,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() { @@ -248,5 +391,9 @@ int main() { TestRequests(); TestPushEventCallbacks(); TestOlderSdks(); + TestHandleOperations(); + TestRequestOptions(); + TestMultipartRequests(); + TestRequestTimeouts(); return 0; } diff --git a/core/libs/tests/GuestNpWebApi2.cpp b/core/libs/tests/GuestNpWebApi2.cpp index 0c532feca46a..6f85495dc7ce 100644 --- a/core/libs/tests/GuestNpWebApi2.cpp +++ b/core/libs/tests/GuestNpWebApi2.cpp @@ -91,5 +91,36 @@ int main() { Require(sceNpWebApi2Terminate(created) == 0); Require(sceNpWebApi2GetMemoryPoolStats(created, &stats) == invalidContext); } + + const int pushLibrary = sceNpWebApi2Initialize(1, 0x10000); + const int pushUser = sceNpWebApi2CreateUserContext(pushLibrary, 1); + const int otherUser = sceNpWebApi2CreateUserContext(pushLibrary, 2); + Require(pushLibrary > 0 && pushUser > 0 && otherUser > 0 && otherUser != pushUser); + std::int64_t sent = 0; + Require(sceNpWebApi2CreateRequest(pushUser, "sessionManager", "/v1/sessions", "GET", nullptr, nullptr) == invalidArgument); + Require(sceNpWebApi2CreateRequest(pushUser, "sessionManager", "/v1/sessions", "GET", nullptr, &sent) == 0 && sent > 0); + Require(sceNpWebApi2AddHttpRequestHeader(sent, "Accept", "application/json") == 0); + Require(sceNpWebApi2SendRequest(sent, nullptr, 0, nullptr) == unavailable); + Require(sceNpWebApi2AbortRequest(sent) == 0); + sceNpWebApi2CheckTimeout(); + Require(sceNpWebApi2DeleteRequest(sent) == 0); + const int pushHandle = sceNpWebApi2PushEventCreateHandle(pushLibrary); + const int filter = sceNpWebApi2PushEventCreateFilter(pushLibrary, pushHandle, "sessionManager", 0, nullptr, 0); + const int nextFilter = sceNpWebApi2PushEventCreateFilter(pushLibrary, pushHandle, "sessionManager", 0, nullptr, 0); + Require(pushHandle > 0 && filter > 0 && nextFilter > 0 && nextFilter != filter); + int userArg = 0; + const int callback = sceNpWebApi2PushEventRegisterCallback(pushUser, filter, nullptr, &userArg); + const int contextCallback = sceNpWebApi2PushEventRegisterPushContextCallback(pushUser, nextFilter, nullptr, &userArg); + Require(callback > 0 && contextCallback > 0 && contextCallback != callback); + NpWebApi2PushContextId pushContext{}; + Require(sceNpWebApi2PushEventCreatePushContext(pushUser, &pushContext) == unavailable); + Require(sceNpWebApi2PushEventStartPushContextCallback(pushUser, &pushContext) == 0); + Require(sceNpWebApi2PushEventUnregisterPushContextCallback(pushUser, contextCallback) == 0); + Require(sceNpWebApi2PushEventUnregisterCallback(pushUser, callback) == 0); + Require(sceNpWebApi2PushEventDeletePushContext(pushUser, &pushContext) == 0); + Require(sceNpWebApi2PushEventDeleteFilter(pushLibrary, nextFilter) == 0 && sceNpWebApi2PushEventDeleteFilter(pushLibrary, filter) == 0); + Require(sceNpWebApi2PushEventDeleteHandle(pushLibrary, pushHandle) == 0); + Require(sceNpWebApi2DeleteUserContext(otherUser) == 0 && sceNpWebApi2DeleteUserContext(pushUser) == 0); + Require(sceNpWebApi2Terminate(pushLibrary) == 0); return 0; } diff --git a/core/libs/tests/GuestNpWebApiInitialize.cpp b/core/libs/tests/GuestNpWebApiInitialize.cpp new file mode 100644 index 000000000000..eef0f62c0f8d --- /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/GuestOpendir2.cpp b/core/libs/tests/GuestOpendir2.cpp index b18f6184c34c..c95f0ef3a03d 100644 --- a/core/libs/tests/GuestOpendir2.cpp +++ b/core/libs/tests/GuestOpendir2.cpp @@ -29,16 +29,23 @@ int main() { Require(plain != nullptr); const auto expected = Entries(plain); Require(expected.at("sample.txt") == 8 && expected.at("subdirectory") == 4); - for (const int flags : {0x7, 0x6}) { + for (const int flags : {0x7, 0x6, 0x0, 0x1, 0x20, 0x27, 0x100, 0x40000000, static_cast(0xffffffe7u)}) { void* directory = __opendir2_nid_postfix(path.c_str(), flags); Require(directory != nullptr); Require(Entries(directory) == expected); } + for (const int flags : {0x8, 0x10, 0x18, 0xf, 0x1f, 0x7fffffff, -1}) { + *__error_nid_postfix() = 1234; + Require(__opendir2_nid_postfix(path.c_str(), flags) == nullptr && *__error_nid_postfix() == 1234); + Require(__opendir2_nid_postfix(nullptr, flags) == nullptr && *__error_nid_postfix() == 1234); + } const auto missing = (root / "missing").string(); Require(opendir_nid_postfix(missing.c_str()) == nullptr); const int missingError = *__error_nid_postfix(); - *__error_nid_postfix() = 0; - Require(__opendir2_nid_postfix(missing.c_str(), 0x7) == nullptr && *__error_nid_postfix() == missingError); + for (const int flags : {0x7, 0x20}) { + *__error_nid_postfix() = 0; + Require(__opendir2_nid_postfix(missing.c_str(), flags) == nullptr && *__error_nid_postfix() == missingError); + } std::filesystem::remove(root / "sample.txt"); std::filesystem::remove(root / "subdirectory"); std::filesystem::remove(root); diff --git a/core/libs/tests/GuestPad.cpp b/core/libs/tests/GuestPad.cpp index 5e22504d21a6..d894f17ec9a7 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); @@ -950,9 +1072,91 @@ int main() { Require(info.connectedCount[0] == 1); Require(info.padTypeInfo[0].connectPort == 0); + const PadVibrationParam vibZero{0, 0}; + const PadVibrationParam vibFull{255, 255}; + const PadVibrationParam vibMixed{128, 64}; + Require(scePadSetVibration(handle2, &vibZero) == PAD_OK); + Require(scePadSetVibration(handle2, &vibFull) == PAD_OK); + Require(scePadSetVibration(handle2, &vibMixed) == PAD_OK); + Require(scePadSetVibration(handle2 + 99, &vibMixed) == PAD_ERROR_INVALID_HANDLE); + Require(scePadSetVibration(-1, &vibMixed) == PAD_ERROR_INVALID_HANDLE); + Require(scePadSetVibration(handle2, nullptr) == PAD_ERROR_INVALID_ARG); + + const PadLightBarParam lightOff{0, 0, 0}; + const PadLightBarParam lightFull{255, 255, 255}; + const PadLightBarParam lightColor{100, 150, 200}; + Require(scePadSetLightBar(handle2, &lightOff) == PAD_OK); + Require(scePadSetLightBar(handle2, &lightFull) == PAD_OK); + Require(scePadSetLightBar(handle2, &lightColor) == PAD_OK); + Require(scePadSetLightBar(handle2 + 99, &lightColor) == PAD_ERROR_INVALID_HANDLE); + 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/GuestPadTracker.cpp b/core/libs/tests/GuestPadTracker.cpp new file mode 100644 index 000000000000..2fb34b53f55c --- /dev/null +++ b/core/libs/tests/GuestPadTracker.cpp @@ -0,0 +1,29 @@ +#include "prx/libScePadTracker/include/Api.hpp" +#include +#include +#include +#include + +namespace { + +void Require(bool value) { if (!value) std::abort(); } + +constexpr int kErrInvalidArg = static_cast(0x80c40003); +constexpr std::uint32_t kFill = 0xaaaaaaaau; + +} + +int main() { + std::array first{kFill, kFill}; + std::array second{kFill, kFill}; + + Require(scePadTrackerGetWorkingMemorySize(nullptr, nullptr) == kErrInvalidArg); + Require(scePadTrackerGetWorkingMemorySize(first.data(), nullptr) == kErrInvalidArg); + Require(scePadTrackerGetWorkingMemorySize(nullptr, second.data()) == kErrInvalidArg); + Require(first[0] == kFill && first[1] == kFill && second[0] == kFill && second[1] == kFill); + + Require(scePadTrackerGetWorkingMemorySize(first.data(), second.data()) == 0); + Require(first[0] == 0x800000 && second[0] == 0x800000); + Require(first[1] == kFill && second[1] == kFill); + return 0; +} diff --git a/core/libs/tests/GuestPageTableStats.cpp b/core/libs/tests/GuestPageTableStats.cpp index 18b33b9f39ce..06819894e03c 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 55711df9c3c2..d0321f63e940 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 000000000000..07892d95de9c --- /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/GuestPngDec.cpp b/core/libs/tests/GuestPngDec.cpp index 120be43fdca3..6c11ae060758 100644 --- a/core/libs/tests/GuestPngDec.cpp +++ b/core/libs/tests/GuestPngDec.cpp @@ -28,6 +28,24 @@ static const std::uint8_t PALETTE_TRNS[] = { 0x57, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82, }; +static const std::uint8_t PALETTE_OPAQUE[] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x08, 0x03, 0x00, 0x00, 0x00, 0x45, 0x68, 0xFD, + 0x16, 0x00, 0x00, 0x00, 0x0C, 0x50, 0x4C, 0x54, 0x45, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xD6, 0x02, 0x8F, 0x7B, 0x00, 0x00, 0x00, 0x0E, 0x49, 0x44, 0x41, + 0x54, 0x78, 0xDA, 0x63, 0x60, 0x60, 0x64, 0x60, 0x62, 0x06, 0x00, 0x00, 0x11, 0x00, 0x07, 0x83, + 0xCA, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82, +}; + +static const std::uint8_t PALETTE_1BIT_ADAM7[] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x01, 0x03, 0x00, 0x00, 0x01, 0x3F, 0x7F, 0xAF, + 0xF1, 0x00, 0x00, 0x00, 0x06, 0x50, 0x4C, 0x54, 0x45, 0x10, 0x20, 0x30, 0xC0, 0xB0, 0xA0, 0x34, + 0xE7, 0xF7, 0xE1, 0x00, 0x00, 0x00, 0x0E, 0x49, 0x44, 0x41, 0x54, 0x78, 0xDA, 0x63, 0x68, 0x60, + 0x60, 0x60, 0x70, 0x00, 0x00, 0x02, 0xC6, 0x00, 0xC1, 0x12, 0x35, 0x36, 0x6C, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82, +}; + static const std::uint8_t GRAY16[] = { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x81, 0xD9, 0xFC, @@ -347,6 +365,22 @@ int main() { Require(paletteImage == std::vector({255, 0, 0, 255, 0, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 128})); Require(info.image_flag == 2); + const std::vector opaquePalettePng(PALETTE_OPAQUE, PALETTE_OPAQUE + sizeof(PALETTE_OPAQUE)); + std::vector opaquePaletteImage(2 * 2 * 4, 0xCC); + decode = DecodeParam(opaquePalettePng, opaquePaletteImage); + Require(scePngDecDecode(handle, &decode, &info) == (2 << 16 | 2)); + Require(opaquePaletteImage == std::vector({255, 0, 0, 255, 0, 255, 0, 255, 0, 0, 255, 255, 255, 255, 0, 255})); + Require(info.color_space == 4 && info.image_flag == 0); + decode.pixel_format = 1; + Require(scePngDecDecode(handle, &decode, &info) == (2 << 16 | 2)); + Require(opaquePaletteImage == std::vector({0, 0, 255, 255, 0, 255, 0, 255, 255, 0, 0, 255, 0, 255, 255, 255})); + + const std::vector lowDepthPalettePng(PALETTE_1BIT_ADAM7, PALETTE_1BIT_ADAM7 + sizeof(PALETTE_1BIT_ADAM7)); + decode = DecodeParam(lowDepthPalettePng, opaquePaletteImage); + Require(scePngDecDecode(handle, &decode, &info) == (2 << 16 | 2)); + Require(opaquePaletteImage == std::vector({192, 176, 160, 255, 16, 32, 48, 255, 16, 32, 48, 255, 192, 176, 160, 255})); + Require(info.color_space == 4 && info.bit_depth == 1 && info.image_flag == 1); + const std::vector gray16Png(GRAY16, GRAY16 + sizeof(GRAY16)); std::vector gray16Image(2 * 4, 0xCC); decode = DecodeParam(gray16Png, gray16Image); diff --git a/core/libs/tests/GuestPosixSem.cpp b/core/libs/tests/GuestPosixSem.cpp index 7581fbcfba7a..aa3aea380f4a 100644 --- a/core/libs/tests/GuestPosixSem.cpp +++ b/core/libs/tests/GuestPosixSem.cpp @@ -73,6 +73,33 @@ static void CheckFutureDeadline() { Require(sem_destroy_nid_postfix(&sem) == 0, "deadline semaphore destroy must succeed"); } +static void CheckRelativeTimeout() { + std::uintptr_t sem = 0; + int value = -1; + Require(sem_init_nid_postfix(&sem, 0, 2) == 0, "relative-timeout semaphore must initialize"); + Require(sem_reltimedwait_np_nid_postfix(&sem, 50000) == 0, "relative wait on an available semaphore must succeed"); + Require(sem_getvalue_nid_postfix(&sem, &value) == 0 && value == 1, "relative wait must decrement"); + Require(sem_wait_nid_postfix(&sem) == 0, "wait on an available semaphore must succeed"); + Require(sem_getvalue_nid_postfix(&sem, &value) == 0 && value == 0, "wait must decrement"); + + const auto start = std::chrono::steady_clock::now(); + *__error_nid_postfix() = 0; + Require(sem_reltimedwait_np_nid_postfix(&sem, 50000) == -1 && *__error_nid_postfix() == 60, "relative timeout must expire with ETIMEDOUT"); + Require(std::chrono::steady_clock::now() - start >= std::chrono::milliseconds(40), "relative timeout expired early"); + Require(sem_getvalue_nid_postfix(&sem, &value) == 0 && value == 0, "expired relative timeout must preserve the count"); + + int waitResult = -2; + std::thread waiter([&] { waitResult = sem_reltimedwait_np_nid_postfix(&sem, 5000000); }); + std::this_thread::sleep_for(std::chrono::milliseconds(20)); + const auto posted = std::chrono::steady_clock::now(); + Require(sem_post_nid_postfix(&sem) == 0, "post must release a relative-timeout waiter"); + waiter.join(); + Require(waitResult == 0, "relative-timeout waiter must succeed after a post before its timeout"); + Require(std::chrono::steady_clock::now() - posted < std::chrono::seconds(4), "relative-timeout waiter waited for its timeout"); + Require(sem_getvalue_nid_postfix(&sem, &value) == 0 && value == 0, "relative-timeout waiter must consume the posted count"); + Require(sem_destroy_nid_postfix(&sem) == 0, "relative-timeout semaphore destroy must succeed"); +} + int main(int argc, char** argv) { constexpr unsigned int maximum = 0x7fffffffu; std::uintptr_t sem = 0; @@ -147,6 +174,7 @@ int main(int argc, char** argv) { Require(sem_getvalue_nid_postfix(&sem, &value) == 0 && value == 0, "failed timed waits must preserve the count"); Require(sem_destroy_nid_postfix(&sem) == 0, "blocked semaphore destroy must succeed"); CheckFutureDeadline(); + CheckRelativeTimeout(); CheckRetire(); Require(sem_init_nid_postfix(&sem, 0, 1) == 0, "renamed semaphore must initialize"); diff --git a/core/libs/tests/GuestPthreadBarrier.cpp b/core/libs/tests/GuestPthreadBarrier.cpp index 3b314e9430da..df85bc1cbbd7 100644 --- a/core/libs/tests/GuestPthreadBarrier.cpp +++ b/core/libs/tests/GuestPthreadBarrier.cpp @@ -3,8 +3,11 @@ #include #include #include +#include #include +#include +static constexpr int GUEST_EBUSY = 16; static constexpr int GUEST_EINVAL = 22; static constexpr int PROCESS_PRIVATE = 0; static constexpr int PROCESS_SHARED = 1; @@ -42,7 +45,30 @@ static void RunWaiters(Context& context) { Require(context.serial == 1 && context.released == static_cast(WAITERS) - 1); } +static void DestroyWhileWaiting() { + Context context; + Require(pthread_barrier_init_nid_postfix(&context.barrier, nullptr, 2) == 0); + auto* const barrier = context.barrier; + Pthread thread = nullptr; + Require(scePthreadCreate(&thread, nullptr, Waiter, &context, nullptr) == 0); + for (;;) { + { + std::lock_guard lock(barrier->mutex); + if (barrier->arrived == 1) break; + } + std::this_thread::yield(); + } + Require(pthread_barrier_destroy_nid_postfix(&context.barrier) == GUEST_EBUSY && context.barrier == barrier); + Require(pthread_barrier_wait_nid_postfix(&context.barrier) == BARRIER_SERIAL_THREAD); + Require(scePthreadJoin(thread, nullptr) == 0); + Require(context.released == 1 && context.serial == 0); + Require(pthread_barrier_destroy_nid_postfix(&context.barrier) == 0 && context.barrier == nullptr); + Require(pthread_barrier_wait_nid_postfix(&context.barrier) == GUEST_EINVAL); + Require(pthread_barrier_destroy_nid_postfix(&context.barrier) == GUEST_EINVAL); +} + int main() { + DestroyWhileWaiting(); PthreadBarrierattrPrivate* missing = nullptr; int pshared = -1; Require(pthread_barrierattr_init_nid_postfix(nullptr) == GUEST_EINVAL); diff --git a/core/libs/tests/GuestPthreadCreateSuspended.cpp b/core/libs/tests/GuestPthreadCreateSuspended.cpp index cadde5c8e2b3..252c757579bc 100644 --- a/core/libs/tests/GuestPthreadCreateSuspended.cpp +++ b/core/libs/tests/GuestPthreadCreateSuspended.cpp @@ -220,31 +220,13 @@ static void ResumesDetachedThreadsWhileTheyExit() { Require(scePthreadJoin(resumer, nullptr) == SCE_OK, "joining the resuming thread failed"); } -#ifdef _WIN32 -static void RefusesRaiseWhileSuspended() { - Require(sceKernelInstallExceptionHandler(GUEST_SIGUSR1, reinterpret_cast(&Handler)) == SCE_OK, "sceKernelInstallExceptionHandler failed"); - Started started; - Pthread thread = nullptr; - CreateSuspendedSce(&thread, Record, &started); - bool refused = false; - try { - sceKernelRaiseException(thread, GUEST_SIGUSR1); - } catch (const std::runtime_error& error) { - refused = std::string(error.what()).find("suspended") != std::string::npos; - } - Require(refused, "sceKernelRaiseException did not refuse a thread still suspended at creation"); - Require(pthread_resume_np_nid_postfix(thread) == 0, "pthread_resume_np failed"); - Require(scePthreadJoin(thread, nullptr) == SCE_OK && started.ran.load(), "joining a resumed thread failed"); - Require(raised.load() == 0, "the handler ran for a refused raise"); - Require(sceKernelRemoveExceptionHandler(GUEST_SIGUSR1) == SCE_OK, "sceKernelRemoveExceptionHandler failed"); -} -#else static void DefersRaiseUntilResume() { Require(sceKernelInstallExceptionHandler(GUEST_SIGUSR1, reinterpret_cast(&Handler)) == SCE_OK, "sceKernelInstallExceptionHandler failed"); Started started; Pthread thread = nullptr; CreateSuspendedSce(&thread, Record, &started); Require(sceKernelRaiseException(thread, GUEST_SIGUSR1) == SCE_OK, "sceKernelRaiseException on a suspended thread failed"); + Require(sceKernelRaiseException(thread, GUEST_SIGUSR1) == SCE_OK, "a second sceKernelRaiseException on a suspended thread failed"); std::this_thread::sleep_for(SUSPENDED_WINDOW); Require(raised.load() == 0, "the handler ran on a thread still suspended at creation"); Require(pthread_resume_np_nid_postfix(thread) == 0, "pthread_resume_np failed"); @@ -252,7 +234,6 @@ static void DefersRaiseUntilResume() { Require(raised.load() == 1 && raisedOn.load() == thread, "the handler did not run on the thread once it was resumed"); Require(sceKernelRemoveExceptionHandler(GUEST_SIGUSR1) == SCE_OK, "sceKernelRemoveExceptionHandler failed"); } -#endif int main() { ReportsErrors(); @@ -268,9 +249,5 @@ int main() { ReportsCreateSuspendedInAttrGet(pthread_attr_get_np_nid_postfix); ReportsCreateSuspendedInAttrGet(scePthreadAttrGet); ResumesDetachedThreadsWhileTheyExit(); -#ifdef _WIN32 - RefusesRaiseWhileSuspended(); -#else DefersRaiseUntilResume(); -#endif } diff --git a/core/libs/tests/GuestPthreadMutexSpin.cpp b/core/libs/tests/GuestPthreadMutexSpin.cpp new file mode 100644 index 000000000000..e5e391fa584f --- /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/GuestPthreadPosixCalls.cpp b/core/libs/tests/GuestPthreadPosixCalls.cpp index 5dce839af354..91d08bad91f2 100644 --- a/core/libs/tests/GuestPthreadPosixCalls.cpp +++ b/core/libs/tests/GuestPthreadPosixCalls.cpp @@ -89,5 +89,9 @@ int main() { Check(pthread_setcancelstate_nid_postfix(CancelDisable, &old) == 0 && old == CancelEnable); Check(pthread_setcancelstate_nid_postfix(CancelEnable, &old) == 0 && old == CancelDisable); Check(pthread_setcancelstate_nid_postfix(CancelEnable, &old) == 0 && old == CancelEnable); + for (const int invalid : {2, -1}) Check(pthread_setcancelstate_nid_postfix(invalid, &old) == GuestEinval); + Check(pthread_setcancelstate_nid_postfix(CancelDisable, &old) == 0 && old == CancelEnable); + Check(pthread_setcancelstate_nid_postfix(3, nullptr) == GuestEinval); + Check(pthread_setcancelstate_nid_postfix(CancelEnable, &old) == 0 && old == CancelDisable); return 0; } diff --git a/core/libs/tests/GuestQsort.cpp b/core/libs/tests/GuestQsort.cpp index 17a380e5c765..bdc17d949438 100644 --- a/core/libs/tests/GuestQsort.cpp +++ b/core/libs/tests/GuestQsort.cpp @@ -69,6 +69,64 @@ int APS5_VABI CompareKeysWithDirection(const void* left, const void* right, void return *static_cast(context) * CompareKeys(left, right); } +int APS5_VABI CompareKeysWithThunk(void* thunk, const void* left, const void* right) { + return *static_cast(thunk) * CompareKeys(left, right); +} + +bool ExpectOrderR(const char* name, const std::vector& keys, const std::vector& tags) { + std::vector elements; + for (std::size_t index = 0; index < keys.size(); ++index) elements.push_back({keys[index], static_cast(index)}); + int direction = 1; + qsort_r_nid_postfix(elements.data(), elements.size(), sizeof(Element), &direction, CompareKeysWithThunk); + for (std::size_t index = 0; index < tags.size(); ++index) { + if (elements[index].tag != tags[index]) { + std::fprintf(stderr, "%s: qsort_r element %zu has tag %d, expected %d\n", name, index, elements[index].tag, tags[index]); + return false; + } + } + return true; +} + +bool ExpectReverseOrderR() { + std::vector elements{{1, 0}, {3, 1}, {2, 2}, {4, 3}}; + int direction = -1; + qsort_r_nid_postfix(elements.data(), elements.size(), sizeof(Element), &direction, CompareKeysWithThunk); + if (elements.size() != 4) return false; + if (elements[0].key != 4 || elements[1].key != 3 || elements[2].key != 2 || elements[3].key != 1) { + std::fprintf(stderr, "reverse qsort_r: elements not sorted in descending order\n"); + return false; + } + return true; +} + +bool ExpectQsortRValidation() { + Element pair[2] = {{2, 0}, {1, 1}}; + int direction = 1; + qsort_r_nid_postfix(nullptr, 0, sizeof(Element), &direction, CompareKeysWithThunk); + qsort_r_nid_postfix(pair, 1, sizeof(Element), &direction, CompareKeysWithThunk); + bool threw = false; + try { + qsort_r_nid_postfix(pair, 2, sizeof(Element), &direction, nullptr); + } catch (const std::invalid_argument&) { + threw = true; + } + if (!threw) return false; + threw = false; + try { + qsort_r_nid_postfix(pair, 2, 0, &direction, CompareKeysWithThunk); + } catch (const std::invalid_argument&) { + threw = true; + } + if (!threw) return false; + threw = false; + try { + qsort_r_nid_postfix(nullptr, 2, sizeof(Element), &direction, CompareKeysWithThunk); + } catch (const std::invalid_argument&) { + threw = true; + } + return threw; +} + bool ExpectOrderS(const char* name, const std::vector& keys, const std::vector& tags) { std::vector elements; for (std::size_t index = 0; index < keys.size(); ++index) elements.push_back({keys[index], static_cast(index)}); @@ -241,6 +299,10 @@ int main() { correct &= ExpectOrder("median of three", {2, 1, 2, 0, 1, 2, 0, 1, 0, 2, 1, 0}, {11, 3, 6, 8, 10, 1, 7, 4, 9, 5, 0, 2}); correct &= ExpectOrderS("insertion sort", {1, 0, 1, 0}, {1, 3, 0, 2}); correct &= ExpectOrderS("median of three", {2, 1, 2, 0, 1, 2, 0, 1, 0, 2, 1, 0}, {11, 3, 6, 8, 10, 1, 7, 4, 9, 5, 0, 2}); + correct &= ExpectOrderR("insertion sort", {1, 0, 1, 0}, {1, 3, 0, 2}); + correct &= ExpectOrderR("median of three", {2, 1, 2, 0, 1, 2, 0, 1, 0, 2, 1, 0}, {11, 3, 6, 8, 10, 1, 7, 4, 9, 5, 0, 2}); + correct &= ExpectReverseOrderR(); + correct &= ExpectQsortRValidation(); correct &= ExpectQsortS(); correct &= ExpectQsortSConstraints(); std::vector keys; diff --git a/core/libs/tests/GuestRaiseInHostCode.cpp b/core/libs/tests/GuestRaiseInHostCode.cpp index e89332fc4c74..0577bde922f2 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 000000000000..aca4cc38012a --- /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 63f449ac1d88..2a4cf354663a 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/GuestRemoteplay.cpp b/core/libs/tests/GuestRemoteplay.cpp new file mode 100644 index 000000000000..9c89dc7fc00c --- /dev/null +++ b/core/libs/tests/GuestRemoteplay.cpp @@ -0,0 +1,47 @@ +#include "prx/libSceRemoteplay/include/Api.hpp" + +#include +#include +#include +#include + +static void Require(bool value) { if (!value) std::abort(); } + +int main() { + constexpr auto invalidArgument = static_cast(0x80FC0001u); + constexpr auto alreadyInitialized = static_cast(0x80FC0003u); + constexpr auto notInitialized = static_cast(0x80FC0004u); + constexpr int connectionStatusDisconnect = 0; + std::array heap{}; + + int status = -1; + Require(sceRemoteplayGetConnectionStatus(0, &status) == notInitialized && status == -1); + Require(sceRemoteplayTerminate() == notInitialized); + + Require(sceRemoteplayInitialize(nullptr, 0) == 0); + Require(sceRemoteplayGetConnectionStatus(0, nullptr) == invalidArgument); + status = -1; + Require(sceRemoteplayGetConnectionStatus(0, &status) == 0 && status == connectionStatusDisconnect); + Require(sceRemoteplayInitialize(nullptr, 0) == alreadyInitialized); + Require(sceRemoteplayInitialize(heap.data(), heap.size()) == alreadyInitialized); + + Require(sceRemoteplayTerminate() == 0); + Require(sceRemoteplayTerminate() == notInitialized); + status = -1; + Require(sceRemoteplayGetConnectionStatus(0, &status) == notInitialized && status == -1); + + Require(sceRemoteplayInitialize(heap.data(), heap.size() - 1) == invalidArgument); + Require(sceRemoteplayTerminate() == notInitialized); + + Require(sceRemoteplayInitialize(heap.data(), heap.size()) == 0); + Require(sceRemoteplayTerminate() == 0); + + Require(sceRemoteplayInitialize(nullptr, 1) == 0); + Require(sceRemoteplayTerminate() == 0); + + Require(sceRemoteplayInitialize(heap.data(), heap.size()) == 0); + status = -1; + Require(sceRemoteplayGetConnectionStatus(3, &status) == 0 && status == connectionStatusDisconnect); + Require(sceRemoteplayTerminate() == 0); + return 0; +} diff --git a/core/libs/tests/GuestRenderingWait.cpp b/core/libs/tests/GuestRenderingWait.cpp index 352b8b1d1d31..31bbc83618e7 100644 --- a/core/libs/tests/GuestRenderingWait.cpp +++ b/core/libs/tests/GuestRenderingWait.cpp @@ -67,6 +67,19 @@ int main() { try { sceAgcDriverWaitUntilSafeForRendering(&cursor, size - 1, 0, 7, 0); } catch (const std::invalid_argument&) { rejected = true; } Require(rejected && cursor == words.data() && words[0] == 0); + rejected = false; + try { sceAgcDriverWaitUntilSafeForRendering(nullptr, size, 0, 7, 0); } + catch (const std::invalid_argument&) { rejected = true; } + Require(rejected); + std::uint32_t* nullCursor = nullptr; + rejected = false; + try { sceAgcDriverWaitUntilSafeForRendering(&nullCursor, size, 0, 7, 0); } + catch (const std::exception&) { rejected = true; } + Require(rejected && nullCursor == nullptr); + rejected = false; + try { sceAgcDriverWaitUntilSafeForRendering(&cursor, size, 0, 7, -1); } + catch (const std::invalid_argument&) { rejected = true; } + Require(rejected && cursor == words.data()); Require(sceAgcDriverWaitUntilSafeForRendering(&cursor, size, 0, 7, 0) == 0); Require(cursor == words.data() + size); Require(words[0] == AgcDriver::RenderingWaitPacketHeader && words[1] == 7 && words[2] == 0 && words[3] == 0); diff --git a/core/libs/tests/GuestRtprioThread.cpp b/core/libs/tests/GuestRtprioThread.cpp index 0d44857120c3..a9ec33d1f7c1 100644 --- a/core/libs/tests/GuestRtprioThread.cpp +++ b/core/libs/tests/GuestRtprioThread.cpp @@ -92,6 +92,17 @@ int main() { CheckThread(GUEST_SCHED_FIFO, 256, RTP_PRIO_FIFO); Require(LookupError(2, 0, &self) == GUEST_ESRCH); Require(LookupError(RTP_LOOKUP, 0, nullptr) == GUEST_EFAULT); + auto* unmapped = reinterpret_cast(std::uintptr_t{0x10}); + Require(LookupError(RTP_LOOKUP, 0, unmapped) == GUEST_EFAULT); + Require(LookupError(RTP_SET, 0, unmapped) == GUEST_EFAULT); + Require(LookupError(RTP_SET, 999999, unmapped) == GUEST_ESRCH); + void* page = nullptr; + Require(sceKernelMapFlexibleMemory(&page, 0x4000, 3, 0) == 0 && page != nullptr); + auto* readOnly = static_cast(page); + *readOnly = {7, 7}; + Require(sceKernelMprotect(page, 0x4000, 1) == 0); + Require(LookupError(RTP_LOOKUP, 0, readOnly) == GUEST_EFAULT); + Require(readOnly->type == 7 && readOnly->prio == 7); Require(LookupError(RTP_LOOKUP, 1, &self) == GUEST_ESRCH); Require(LookupError(RTP_LOOKUP, 999999, &self) == GUEST_ESRCH); bool threw = false; diff --git a/core/libs/tests/GuestRudpStatus.cpp b/core/libs/tests/GuestRudpStatus.cpp index 8aed90988d3e..37ef60a774a6 100644 --- a/core/libs/tests/GuestRudpStatus.cpp +++ b/core/libs/tests/GuestRudpStatus.cpp @@ -32,6 +32,13 @@ int main() { Require(sceRudpGetStatus(nullptr, 0) == notInitialized); Require(sceRudpGetStatus(status.data(), statusSize + 1) == notInitialized); Require(status == untouched); + std::uint16_t mss = 0x5a5a; + Require(sceRudpGetMaxSegmentSize(&mss) == notInitialized); + Require(mss == 0x5a5a); + Require(sceRudpGetMaxSegmentSize(nullptr) == notInitialized); + Require(sceRudpProcessEvents(0) == notInitialized); + Require(sceRudpNetFlush() == notInitialized); + Require(sceRudpNetReceived(0, nullptr, 0, nullptr, 0) == notInitialized); Require(sceRudpEnd() == notInitialized); Require(sceRudpTerminate(0) == notInitialized); @@ -42,6 +49,12 @@ int main() { for (std::size_t offset : {1u, 2u, 4u}) Require(sceRudpInit_nid_postfix(pool + offset, 0x1000) == memory); Require(sceRudpInit_nid_postfix(pool + 8, 0xC58) == 0); Require(sceRudpInit_nid_postfix(nullptr, 0) == alreadyInitialized); + Require(sceRudpGetMaxSegmentSize(nullptr) == invalidArgument); + Require(sceRudpGetMaxSegmentSize(&mss) == 0); + Require(mss == 1410); + Require(sceRudpProcessEvents(0) == 0); + Require(sceRudpNetFlush() == 0); + Require(sceRudpNetReceived(0, nullptr, 0, nullptr, 0) == 0); Require(sceRudpGetStatus(nullptr, statusSize) == invalidArgument); Require(sceRudpGetStatus(nullptr, 0) == invalidArgument); @@ -81,6 +94,10 @@ int main() { Require(sceRudpEnd() == notInitialized); Require(sceRudpTerminate(second) == notInitialized); Require(sceRudpGetStatus(status.data(), statusSize) == notInitialized); + Require(sceRudpGetMaxSegmentSize(&mss) == notInitialized); + Require(sceRudpProcessEvents(0) == notInitialized); + Require(sceRudpNetFlush() == notInitialized); + Require(sceRudpNetReceived(0, nullptr, 0, nullptr, 0) == notInitialized); Require(sceRudpInit_nid_postfix(pool + 8, 0xC58) == 0); Require(sceRudpTerminate(second) == invalidContextId); Require(sceRudpEnd() == 0); diff --git a/core/libs/tests/GuestRudpUnconnected.cpp b/core/libs/tests/GuestRudpUnconnected.cpp new file mode 100644 index 000000000000..208fdabe42e2 --- /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/GuestSafeErrors.cpp b/core/libs/tests/GuestSafeErrors.cpp index ee6ad4bd7428..81053c972121 100644 --- a/core/libs/tests/GuestSafeErrors.cpp +++ b/core/libs/tests/GuestSafeErrors.cpp @@ -23,7 +23,7 @@ thread_local int violations = 0; thread_local void* violationBuffer = nullptr; void APS5_VABI Constraint(const char* message, void* buffer, int error) { - Require(message && std::strcmp(message, "strerror_s") == 0, "constraint callback message and ABI"); + Require(message && std::strcmp(message, "strerror_s: bad argument") == 0, "constraint callback message and ABI"); Require(error == 22, "constraint callback error"); violationBuffer = buffer; ++violations; @@ -79,12 +79,18 @@ void CheckConstraints() { std::array buffer; buffer.fill('!'); constexpr auto maximum = std::numeric_limits::max(); - for (const auto capacity : {std::size_t{0}, (maximum >> 1) + 1, maximum}) { + for (const auto capacity : {std::size_t{0}, (maximum >> 3) + 1, (maximum >> 1) + 1, maximum}) { const int before = violations; Require(strerror_s_nid_postfix(buffer.data(), capacity, 2) == 22, "reject invalid capacity"); - Require(violations == before + 1 && violationBuffer == buffer.data(), "one callback with destination"); + Require(violations == before + 1 && violationBuffer == nullptr, "one callback with a null pointer"); for (const char value : buffer) Require(value == '!', "constraint failure leaves destination untouched"); } + std::array wide; + wide.fill('!'); + const int beforeLargest = violations; + Require(strerror_s_nid_postfix(wide.data(), maximum >> 3, 2) == 0, "largest valid capacity"); + Require(violations == beforeLargest, "largest valid capacity is not a violation"); + Require(std::strcmp(wide.data(), "No such file or directory") == 0, "largest valid capacity writes the message"); for (const auto capacity : {std::size_t{0}, std::size_t{1}, maximum}) { const int before = violations; Require(strerror_s_nid_postfix(nullptr, capacity, 2) == 22, "reject null destination"); diff --git a/core/libs/tests/GuestSandboxCertificates.cpp b/core/libs/tests/GuestSandboxCertificates.cpp index 5fb1e400b3f2..d493ee5008ca 100644 --- a/core/libs/tests/GuestSandboxCertificates.cpp +++ b/core/libs/tests/GuestSandboxCertificates.cpp @@ -87,6 +87,10 @@ int main() { Require(text == expected); #endif Require(ReadStream(path) == text); + Require(ReadKernel("/system/common/cert/CA_LIST.cer") == text); + Require(ReadStream("/system/common/cert/CA_LIST.cer") == text); + Require(ReadKernel("/common/cert/CA_LIST.cer") == text); + Require(ReadStream("/common/cert/CA_LIST.cer") == text); Require(ReadKernel(directory + "/./ca_list.cer") == text); FileStat status{}; Require(sceKernelStat(path.c_str(), &status) == 0); diff --git a/core/libs/tests/GuestSaveDataHostSpace.cpp b/core/libs/tests/GuestSaveDataHostSpace.cpp new file mode 100644 index 000000000000..c845121d1a18 --- /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 3717f20b4a38..a4b1e81ae66f 100644 --- a/core/libs/tests/GuestSaveDataMountStatus.cpp +++ b/core/libs/tests/GuestSaveDataMountStatus.cpp @@ -1,7 +1,9 @@ #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 #include #include @@ -19,9 +21,11 @@ constexpr std::uint32_t MountReadWrite = 2; constexpr std::uint32_t MountCreate = 4; constexpr std::uint32_t MountCreate2 = 32; constexpr int SaveDataErrorParameter = -2137063424; +constexpr int SaveDataErrorNotInitialized = -2137063423; constexpr int SaveDataErrorNotMounted = -2137063420; constexpr int SaveDataErrorBusy = -2137063421; constexpr int SaveDataErrorNotFound = -2137063416; +constexpr int SaveDataErrorMountFull = -2137063412; int failures = 0; @@ -62,10 +66,29 @@ void CheckUnmountedCalls() { Check(sceSaveDataBackup(nullptr) == SaveDataErrorParameter, "backup null backup is PARAMETER"); SaveDataBackup nullDirBackup{}; Check(sceSaveDataBackup(&nullDirBackup) == SaveDataErrorParameter, "backup null dir_name is PARAMETER"); + char unterminatedBackup[sizeof(SceSaveDataDirName::data)]; + std::memset(unterminatedBackup, 'a', sizeof(unterminatedBackup)); + SaveDataBackup unterminatedBackupParam{}; + unterminatedBackupParam.user_id = 0x10000000; + unterminatedBackupParam.dir_name = reinterpret_cast(unterminatedBackup); + Check(sceSaveDataBackup(&unterminatedBackupParam) == SaveDataErrorParameter, "backup unterminated dir_name is PARAMETER"); Check(sceSaveDataGetEventResult(nullptr, nullptr) == SaveDataErrorParameter, "getEventResult null event is PARAMETER"); SaveDataEvent emptyEvent{}; Check(sceSaveDataGetEventResult(nullptr, &emptyEvent) == SaveDataErrorNotFound, "getEventResult on empty queue returns NOT_FOUND"); Check(sceSaveDataGetEventResult(&emptyEvent, nullptr) == SaveDataErrorParameter, "getEventResult null result pointer is PARAMETER"); + SceSaveDataDirName validDir{}; + std::snprintf(validDir.data, sizeof(validDir.data), "valid_backup"); + SaveDataBackup validBackup{}; + validBackup.user_id = 0x10000000; + validBackup.dir_name = &validDir; + Check(sceSaveDataBackup(&validBackup) == 0, "backup valid dir_name succeeds"); + SaveDataEvent backupEvent{}; + Check(sceSaveDataGetEventResult(nullptr, &backupEvent) == 0, "getEventResult retrieves backup event"); + Check(backupEvent.type == 2, "backup event type is 2"); + Check(backupEvent.error_code == 0, "backup event error code is 0"); + Check(backupEvent.user_id == 0x10000000, "backup event user_id matches"); + Check(std::strcmp(backupEvent.dir_name.data, "valid_backup") == 0, "backup event dir_name matches"); + Check(sceSaveDataGetEventResult(nullptr, &emptyEvent) == SaveDataErrorNotFound, "event queue is empty after retrieving backup event"); } void CheckMountInfoAndParam(const SaveDataMountPoint* point) { @@ -80,8 +103,12 @@ void CheckMountInfoAndParam(const SaveDataMountPoint* point) { char readTitle[128]{}; Check(sceSaveDataUmount2(0, nullptr) == SaveDataErrorParameter, "umount2 null point is PARAMETER"); Check(sceSaveDataLoadIcon(nullptr, &icon) == SaveDataErrorParameter, "loadIcon null point is PARAMETER"); + Check(sceSaveDataLoadIcon(&unmounted, &icon) == SaveDataErrorNotMounted, "loadIcon unmounted point is NOT_MOUNTED"); + Check(sceSaveDataLoadIcon(&unmounted, nullptr) == SaveDataErrorNotMounted, "loadIcon unmounted point with null icon is NOT_MOUNTED"); Check(sceSaveDataLoadIcon(point, &icon) == 0, "loadIcon on mounted save succeeds"); Check(sceSaveDataSaveIcon(nullptr, &icon) == SaveDataErrorParameter, "saveIcon null point is PARAMETER"); + Check(sceSaveDataSaveIcon(&unmounted, &icon) == SaveDataErrorNotMounted, "saveIcon unmounted point is NOT_MOUNTED"); + Check(sceSaveDataSaveIcon(&unmounted, nullptr) == SaveDataErrorNotMounted, "saveIcon unmounted point with null icon is NOT_MOUNTED"); Check(sceSaveDataSaveIcon(point, &icon) == 0, "saveIcon on mounted save succeeds"); Check(sceSaveDataSaveIconByPath(point, "icon.png") == 0, "saveIconByPath on mounted save succeeds"); Check(sceSaveDataGetMountInfo(nullptr, &info) == SaveDataErrorParameter, "getMountInfo null point is PARAMETER"); @@ -236,6 +263,118 @@ void CheckInvalidNamesAreRejected() { MountAndCheck("after", MountReadWrite | MountCreate2, 1u, "CREATE2 after the rejected names"); } +void CheckMountCapacityAndLifecycle() { + Check(sceSaveDataAbort() == 0, "abort after init succeeds"); + Check(sceSaveDataClearProgress() == 0, "clearProgress after init succeeds"); + + SceSaveDataDirName dirA{}; + std::memcpy(dirA.data, "count-a", sizeof("count-a")); + SaveDataMount3 mountA{}; + mountA.dir_name = &dirA; + mountA.mount_mode = MountReadWrite | MountCreate2; + SaveDataMountResult resultA{}; + Check(sceSaveDataMount3(&mountA, &resultA) == 0, "mountA succeeds"); + SaveDataMountResult duplicate{}; + Check(sceSaveDataMount3(&mountA, &duplicate) == SaveDataErrorBusy, "duplicate mount is busy"); + + SceSaveDataDirName dirB{}; + std::memcpy(dirB.data, "count-b", sizeof("count-b")); + SaveDataMount3 mountB{}; + mountB.dir_name = &dirB; + mountB.mount_mode = MountReadWrite | MountCreate2; + SaveDataMountResult resultB{}; + Check(sceSaveDataMount3(&mountB, &resultB) == 0, "mountB succeeds"); + + SceSaveDataDirName dirC{}; + std::memcpy(dirC.data, "count-c", sizeof("count-c")); + SaveDataMount3 mountC{}; + mountC.dir_name = &dirC; + mountC.mount_mode = MountReadWrite | MountCreate2; + SaveDataMountResult resultC{}; + Check(sceSaveDataMount3(&mountC, &resultC) == 0, "mountC succeeds"); + + Check(sceSaveDataUmount2(0, &resultB.mount_point) == 0, "unmountB succeeds"); + + Check(sceSaveDataUmount2(0, &resultA.mount_point) == 0, "unmountA succeeds"); + + Check(sceSaveDataUmount2(0, &resultC.mount_point) == 0, "unmountC succeeds"); + + std::array names{}; + std::array mounted{}; + for (std::size_t index = 0; index < mounted.size(); ++index) { + std::snprintf(names[index].data, sizeof(names[index].data), "capacity-%zu", index); + SaveDataMount3 request{}; + request.dir_name = &names[index]; + request.mount_mode = MountReadWrite | MountCreate2; + Check(sceSaveDataMount3(&request, &mounted[index]) == 0, "mount at capacity index " + std::to_string(index)); + } + std::memcpy(names.back().data, "capacity-overflow", sizeof("capacity-overflow")); + SaveDataMount3 overflow{}; + overflow.dir_name = &names.back(); + overflow.mount_mode = MountReadWrite | MountCreate2; + SaveDataMountResult rejected{}; + Check(sceSaveDataMount3(&overflow, &rejected) == SaveDataErrorMountFull, "mount beyond capacity is rejected"); + 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() { @@ -243,9 +382,13 @@ int main() { std::filesystem::create_directories(root); const auto previous = std::filesystem::current_path(); std::filesystem::current_path(root); + Check(sceSaveDataAbort() == SaveDataErrorNotInitialized, "abort pre-init is NOT_INITIALIZED"); + Check(sceSaveDataClearProgress() == SaveDataErrorNotInitialized, "clearProgress pre-init is NOT_INITIALIZED"); 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"); MountAndCheck("made", MountReadWrite | MountCreate, 1u, "CREATE of a missing save"); @@ -253,6 +396,9 @@ int main() { CheckFailedMountKeepsResult(); CheckEquivalentMounts(); CheckInvalidNamesAreRejected(); + Check(sceSaveDataTerminate() == 0, "SaveData terminates"); + Check(sceSaveDataAbort() == SaveDataErrorNotInitialized, "abort post-terminate returns NOT_INITIALIZED"); + Check(sceSaveDataClearProgress() == SaveDataErrorNotInitialized, "clearProgress post-terminate returns NOT_INITIALIZED"); std::filesystem::current_path(previous); std::error_code error; std::filesystem::remove_all(root, error); diff --git a/core/libs/tests/GuestSceNet.cpp b/core/libs/tests/GuestSceNet.cpp index 9fa26fc6ff92..b88e06ba9f93 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 @@ -29,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -90,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)); @@ -188,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 @@ -311,6 +313,22 @@ static void CheckPoolStats() { Require(Failed(sceNetGetMemoryPoolStats(pool, &stats), 9)); } +static void CheckPoolErrors() { + for (const int size : {0, -1, std::numeric_limits::min()}) { + *sceNetErrnoLoc() = 33; + Require(Failed(sceNetPoolCreate("bad", size, 0), 22)); + } + const int first = sceNetPoolCreate("first", 0x1000, 0); + const int second = sceNetPoolCreate("second", 0x1000, 0); + Require(first > 0 && second > 0 && first != second); + Require(sceNetPoolDestroy(first) == 0); + for (const int id : {first, 0, -1, std::numeric_limits::max()}) { + *sceNetErrnoLoc() = 33; + Require(Failed(sceNetPoolDestroy(id), 9)); + } + Require(sceNetPoolDestroy(second) == 0); +} + static void CheckStatisticsInfo() { Require(Failed(sceNetGetStatisticsInfo(nullptr, 0), 14)); NetStatisticsInfo info; @@ -1193,6 +1211,22 @@ static void CheckInetPtonEx() { } } +static void CheckEtherNtostrErrors() { + const NetEtherAddr address{{0, 1, 2, 10, 11, 15}}; + std::array text{}; + text.fill('#'); + *sceNetErrnoLoc() = 33; + Require(Failed(sceNetEtherNtostr(nullptr, text.data(), text.size()), 22)); + *sceNetErrnoLoc() = 33; + Require(Failed(sceNetEtherNtostr(&address, nullptr, text.size()), 22)); + *sceNetErrnoLoc() = 33; + Require(Failed(sceNetEtherNtostr(&address, text.data(), text.size() - 1), 22)); + *sceNetErrnoLoc() = 33; + Require(Failed(sceNetEtherNtostr(&address, text.data(), 0), 22)); + Require(std::all_of(text.begin(), text.end(), [](char character) { return character == '#'; })); + Require(sceNetEtherNtostr(&address, text.data(), text.size()) == 0); +} + static void CheckEtherAddress() { struct GuardedAddress { std::uint8_t before; @@ -2167,6 +2201,7 @@ static void CheckDatagramDisconnect() { int main() { CheckEtherAddress(); + CheckEtherNtostrErrors(); const auto epoch = std::chrono::steady_clock::time_point{}; Require(KernelSocketSelect::DeadlineAfter(epoch, 2, 250000) == epoch + std::chrono::milliseconds(2250)); Require(KernelSocketSelect::DeadlineAfter(epoch, INT64_MAX, 0) == std::chrono::steady_clock::time_point::max()); @@ -2177,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); @@ -2196,6 +2236,7 @@ int main() { CheckSocketHostErrors(); CheckSocketArgumentErrors(); CheckPoolStats(); + CheckPoolErrors(); CheckStatisticsInfo(); CheckIfName(); CheckRandom(); diff --git a/core/libs/tests/GuestSceV2Exceptions.cpp b/core/libs/tests/GuestSceV2Exceptions.cpp index 6683c8d67b72..b0caf0f94248 100644 --- a/core/libs/tests/GuestSceV2Exceptions.cpp +++ b/core/libs/tests/GuestSceV2Exceptions.cpp @@ -27,6 +27,13 @@ int SceV2Selector = 0; const void* SceV2Caught = nullptr; } +struct LocinfoCall { GuestLocale::SceV2Locinfo* self; const char* name; }; + +extern "C" void APS5_VABI SceV2ConstructLocinfo(const void* argument) { + const auto* call = static_cast(argument); + _ZNSt8__sce_v28_Locinfo13_Locinfo_ctorEPS0_PKc_nid_postfix(call->self, call->name); +} + static unsigned failures = 0; static void Require(bool value, const char* what) { @@ -173,6 +180,42 @@ static void CheckSyserrorMap() { Require(_ZSt13_Syserror_mapi_nid_postfix(99999) == nullptr, "unversioned _Syserror_map(unknown) stays null"); } +static void CheckLocinfo() { + const TypeRecord runtimeError = Named("NSt8__sce_v213runtime_errorE"); + const TypeRecord logicError = Named("NSt8__sce_v211logic_errorE"); + const char untouched[] = "untouched"; + + GuestLocale::SceV2Locinfo locinfo {}; + locinfo.reserved = 0x5a5a5a5a5a5a5a5aull; + _ZNSt8__sce_v28_Locinfo13_Locinfo_ctorEPS0_PKc_nid_postfix(&locinfo, ""); + Require(locinfo.name != nullptr && std::strcmp(locinfo.name, "C") == 0, "_Locinfo(empty) stores C"); + Require(locinfo.name == locinfo.classicName, "_Locinfo stores the classic name twice"); + _ZNSt8__sce_v28_Locinfo13_Locinfo_ctorEPS0_PKc_nid_postfix(&locinfo, "C"); + Require(locinfo.classicName != nullptr && std::strcmp(locinfo.classicName, "C") == 0, "_Locinfo(C) stores C"); + _ZNSt8__sce_v28_Locinfo13_Locinfo_dtorEPS0__nid_postfix(&locinfo); + Require(locinfo.reserved == 0x5a5a5a5a5a5a5a5aull, "_Locinfo preserves the caller word at offset 0"); + + const char* const rejected[] {nullptr, "POSIX", "c", "C.UTF-8", "CX", "en_US.UTF-8"}; + for (const char* name : rejected) { + GuestLocale::SceV2Locinfo invalid {}; + invalid.reserved = 0x5a5a5a5a5a5a5a5aull; + invalid.classicName = untouched; + LocinfoCall call {&invalid, name}; + SceV2CatchType = &runtimeError; + SceV2OtherType = &logicError; + SceV2Selector = 0; + inspected[0] = 0; + inspectBytes = sizeof(void*); + SceV2Catch(reinterpret_cast(SceV2ConstructLocinfo), &call); + Require(SceV2Selector == 2, "_Locinfo(non-C) throws"); + Require(std::strcmp(inspected, "NSt8__sce_v213runtime_errorE|bad locale name") == 0, "_Locinfo(non-C) message"); + Require(invalid.name != nullptr && std::strcmp(invalid.name, "C") == 0, "_Locinfo stores C before rejecting the name"); + Require(invalid.classicName == untouched, "_Locinfo leaves offset 0x10 untouched when rejecting the name"); + Require(invalid.reserved == 0x5a5a5a5a5a5a5a5aull, "_Locinfo preserves the caller word when rejecting the name"); + } + inspectBytes = sizeof(LibcException::ExceptionObject); +} + static void CheckTicks() { const auto before = _Xtime_get_ticks_nid_postfix(); const auto ticks = _ZNSt8__sce_v216_Xtime_get_ticksEv_nid_postfix(); @@ -185,6 +228,7 @@ int main() { CheckThrowers(); CheckCopies(); CheckSyserrorMap(); + CheckLocinfo(); CheckTicks(); if (failures) return 1; std::puts("guest std::__sce_v2 exceptions: PASS"); diff --git a/core/libs/tests/GuestSchedParams.cpp b/core/libs/tests/GuestSchedParams.cpp index 68e59d680bd3..e199d9bfd334 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; @@ -65,11 +67,17 @@ static void CheckTargets() { *__error_nid_postfix() = 0; REQUIRE(FailsWith(sched_getparam_nid_postfix(0, nullptr), GUEST_EFAULT)); *__error_nid_postfix() = 0; + REQUIRE(FailsWith(sched_getparam_nid_postfix(0, reinterpret_cast(0x10)), GUEST_EFAULT)); + *__error_nid_postfix() = 0; REQUIRE(FailsWith(sched_getparam_nid_postfix(self + 1, nullptr), GUEST_ESRCH)); *__error_nid_postfix() = 0; REQUIRE(FailsWith(sched_setparam_nid_postfix(0, nullptr), GUEST_EFAULT)); *__error_nid_postfix() = 0; + 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; @@ -132,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); @@ -142,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/GuestSchedPriority.cpp b/core/libs/tests/GuestSchedPriority.cpp index 27f7e23a90b8..8aaec24a568e 100644 --- a/core/libs/tests/GuestSchedPriority.cpp +++ b/core/libs/tests/GuestSchedPriority.cpp @@ -54,6 +54,16 @@ int main() { Require(sched_rr_get_interval_nid_postfix(self + 1, &interval) == -1 && *__error_nid_postfix() == 3); *__error_nid_postfix() = 0; Require(sched_rr_get_interval_nid_postfix(0, nullptr) == -1 && *__error_nid_postfix() == 14); + *__error_nid_postfix() = 0; + Require(sched_rr_get_interval_nid_postfix(0, reinterpret_cast(std::uintptr_t{0x10})) == -1 && *__error_nid_postfix() == 14); + *__error_nid_postfix() = 0; + Require(sched_rr_get_interval_nid_postfix(-1, reinterpret_cast(std::uintptr_t{0x10})) == -1 && *__error_nid_postfix() == 3); + void* page = nullptr; + Require(sceKernelMapFlexibleMemory(&page, 0x4000, 3, 0) == 0 && page != nullptr); + Require(sceKernelMprotect(page, 0x4000, 1) == 0); + *__error_nid_postfix() = 0; + Require(sched_rr_get_interval_nid_postfix(0, static_cast(page)) == -1 && *__error_nid_postfix() == 14); + Require(static_cast(page)->tv_nsec == 0); for (int policy : {1, 3}) { Require(sched_get_priority_max_nid_postfix(policy) == 767); Require(sched_get_priority_min_nid_postfix(policy) == 256); diff --git a/core/libs/tests/GuestSemaphore.cpp b/core/libs/tests/GuestSemaphore.cpp index 89fc2cc852fc..4ef7bdb09341 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 f2fac5d3cc9d..6ec7da5f8fd8 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 2c7d7c944318..088d59f4924a 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 8eb2de43af45..b8f6b036b019 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/GuestSocialScreen.cpp b/core/libs/tests/GuestSocialScreen.cpp new file mode 100644 index 000000000000..7bbb3284695e --- /dev/null +++ b/core/libs/tests/GuestSocialScreen.cpp @@ -0,0 +1,24 @@ +#include "prx/libSceSocialScreen/include/Api.hpp" +#include +#include +#include +#include + +namespace { + +void Require(bool value) { if (!value) std::abort(); } + +constexpr int kErrInvalidArg = static_cast(0x81440003); + +} + +int main() { + Require(sceSocialScreenInitializeSeparateModeParameter(nullptr) == kErrInvalidArg); + std::array parameter{}; + parameter.fill(0xaa); + Require(sceSocialScreenInitializeSeparateModeParameter(parameter.data()) == 0); + Require(parameter[0] == 1 && parameter[1] == 0 && parameter[2] == 0 && parameter[3] == 0); + for (std::size_t i = 4; i < 0x20; ++i) Require(parameter[i] == 0); + for (std::size_t i = 0x20; i < parameter.size(); ++i) Require(parameter[i] == 0xaa); + return 0; +} diff --git a/core/libs/tests/GuestSocketPair.cpp b/core/libs/tests/GuestSocketPair.cpp index e2266c799df6..b760914fabb3 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 000000000000..0e7e5a1180e9 --- /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 ad533dc3cbf6..f9cf38854904 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,41 @@ 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(TemporaryFile::Open()); + Require(putc_nid_postfix('A', &stream) == 'A'); + Require(putc_nid_postfix(0x141, &stream) == 0x41); + Require(putc_nid_postfix(-1, &stream) == 0xff); + rewind_nid_postfix(&stream); + Require(getc_nid_postfix(&stream) == 'A' && getc_nid_postfix(&stream) == 0x41 && getc_nid_postfix(&stream) == 0xff); + Require(getc_nid_postfix(&stream) == EOF && feof_nid_postfix(&stream) != 0 && ferror_nid_postfix(&stream) == 0); + stream.Close(); +} + 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}) { @@ -131,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); @@ -160,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([&] { @@ -216,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; @@ -260,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); @@ -282,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]{}; @@ -307,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; @@ -323,8 +369,21 @@ static void CheckSupplementaryWideCharacters() { } } +static void CheckUngetcEndOfFile() { + FileStream stream(TemporaryFile::Open()); + Require(fwrite_nid_postfix("ab", 1, 2, &stream) == 2); + rewind_nid_postfix(&stream); + Require(ungetc_nid_postfix(EOF, &stream) == EOF); + Require(ftello_nid_postfix(&stream) == 0 && fgetc_nid_postfix(&stream) == 'a'); + Require(fgetc_nid_postfix(&stream) == 'b' && fgetc_nid_postfix(&stream) == EOF && feof_nid_postfix(&stream) != 0); + Require(ungetc_nid_postfix(EOF, &stream) == EOF && feof_nid_postfix(&stream) != 0); + Require(ungetc_nid_postfix('z', &stream) == 'z' && feof_nid_postfix(&stream) == 0); + Require(fgetc_nid_postfix(&stream) == 'z' && fgetc_nid_postfix(&stream) == EOF && feof_nid_postfix(&stream) != 0); + stream.Close(); +} + 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); @@ -399,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; @@ -430,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); } @@ -582,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); @@ -618,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); @@ -720,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)); @@ -775,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); @@ -821,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; @@ -829,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'); @@ -838,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'); @@ -866,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()); @@ -875,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'); @@ -911,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'); @@ -926,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()); @@ -935,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); @@ -948,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); @@ -964,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; @@ -973,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; @@ -982,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]{}; @@ -1004,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); @@ -1023,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)); @@ -1037,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); @@ -1063,9 +1122,13 @@ int main(int argc, char** argv) { Require(fgetc_nid_postfix(&locked) == 'A' && fgetc_nid_postfix(&locked) == 'B'); locked.Close(); 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 80d9e2d16661..414a9b1533e9 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 0303fe2a34ca..2960694890af 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 2a0b397629f7..99ab8fcedf6d 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 bcef6300ff9b..f0a1cd4e0b34 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; @@ -513,8 +544,51 @@ static void CheckBootTimeSysctl() { Require(sysctl_nid_postfix(mib, 2, &first, &length, &first, sizeof(first)) == -1 && *__error_nid_postfix() == 1); Require(sysctlbyname_nid_postfix("kern.boottime", &first, &length, &first, sizeof(first)) == -1 && *__error_nid_postfix() == 1); } +struct LoadAverage { + std::uint32_t ldavg[3]; + std::int64_t fscale; +}; +static_assert(sizeof(LoadAverage) == 24); + +static void CheckLoadAverageSysctl() { + const int mib[] = {2, 2}; + *__error_nid_postfix() = 13; + std::size_t length = 0; + Require(sysctl_nid_postfix(mib, 2, nullptr, &length, nullptr, 0) == 0 && length == sizeof(LoadAverage)); + length = 0; + Require(sysctlbyname_nid_postfix("vm.loadavg", nullptr, &length, nullptr, 0) == 0 && length == sizeof(LoadAverage)); + LoadAverage load; + std::memset(&load, 0xaa, sizeof(load)); + length = sizeof(load); +#ifndef _WIN32 + double before[3]{}; + Require(getloadavg(before, 3) == 3); +#endif + Require(sysctl_nid_postfix(mib, 2, &load, &length, nullptr, 0) == 0 && length == sizeof(load) && load.fscale == 2048); + std::uint8_t padding[4]; + std::memcpy(padding, reinterpret_cast(&load) + 12, sizeof(padding)); + Require(padding[0] == 0 && padding[1] == 0 && padding[2] == 0 && padding[3] == 0); +#ifndef _WIN32 + double after[3]{}; + Require(getloadavg(after, 3) == 3); + const auto scaled = [](double average) { return static_cast(average * 2048.0 + 0.5); }; + for (int index = 0; index < 3; ++index) Require(load.ldavg[index] == scaled(before[index]) || load.ldavg[index] == scaled(after[index])); +#endif + LoadAverage named{}; + length = sizeof(named); + Require(sysctlbyname_nid_postfix("vm.loadavg", &named, &length, nullptr, 0) == 0 && length == sizeof(named) && named.fscale == 2048); + Require(*__error_nid_postfix() == 13); + + int namedMib[3] = {0x5a5a5a5a, 0x5a5a5a5a, 0x5a5a5a5a}; + std::size_t mibLength = 3; + Require(sysctlnametomib_nid_postfix("vm.loadavg", namedMib, &mibLength) == 0 && mibLength == 2); + Require(namedMib[0] == 2 && namedMib[1] == 2 && namedMib[2] == 0x5a5a5a5a); + + length = sizeof(load); + Require(sysctl_nid_postfix(mib, 2, &load, &length, &load, sizeof(load)) == -1 && *__error_nid_postfix() == 1); +} static void CheckLeafWithTrailingComponent() { - const int leaves[][2] = {{6, 3}, {6, 2}, {6, 5}, {6, 7}, {1, 21}, {1, 24}, {1, 37}, {1, 50}}; + const int leaves[][2] = {{6, 3}, {6, 2}, {6, 5}, {6, 7}, {1, 21}, {1, 24}, {1, 37}, {1, 50}, {2, 2}}; for (const auto& leaf : leaves) { const int mib[] = {leaf[0], leaf[1], 0}; char buffer[8] = {}; @@ -593,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); @@ -1110,10 +1202,12 @@ int main() { CheckUnknownSysctlName(); CheckPathnameSysctl(); CheckProcessSysctl(); + CheckProcessListSysctl(); CheckSystemStringSysctl(); CheckSystemStringNames(); CheckOsReleaseDateSysctl(); CheckBootTimeSysctl(); + CheckLoadAverageSysctl(); CheckLeafWithTrailingComponent(); CheckMeasuredAbsentSysctlMibs(); CheckSystemSwVersion(); diff --git a/core/libs/tests/GuestSystemFont.cpp b/core/libs/tests/GuestSystemFont.cpp index c38a2bbae35d..63988f6972bd 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 000000000000..3fc4f9762c8a --- /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 000000000000..a6750b60e605 --- /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 0b436d9d9f80..9214137285fa 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/GuestThrowBadArrayNewLength.cpp b/core/libs/tests/GuestThrowBadArrayNewLength.cpp new file mode 100644 index 000000000000..0bf48bc043c3 --- /dev/null +++ b/core/libs/tests/GuestThrowBadArrayNewLength.cpp @@ -0,0 +1,34 @@ +#include "prx/libc/include/Api.hpp" +#include "prx/libc/include/general/VabiMacros.hpp" +#include +#include +#include +#include + +struct TypeRecord { const void* const* vtable; const char* name; const TypeRecord* base; }; +struct Vtable { std::ptrdiff_t offset; const TypeRecord* type; const void* destroy; const void* deleteObject; const char* (APS5_VABI *what)(const LibcException::ExceptionObject*); }; + +extern "C" { +extern const TypeRecord _ZTISt9bad_alloc_nid_postfix; +extern const TypeRecord _ZTISt20bad_array_new_length_nid_postfix; +extern const Vtable _ZTVSt20bad_array_new_length_nid_postfix; +} + +static void Require(bool value) { if (!value) std::abort(); } + +int main() { + const auto& type = _ZTISt20bad_array_new_length_nid_postfix; + Require(std::strcmp(type.name, "St20bad_array_new_length") == 0); + Require(type.base == &_ZTISt9bad_alloc_nid_postfix); + const auto& table = _ZTVSt20bad_array_new_length_nid_postfix; + Require(table.offset == 0 && table.type == &type && table.what != nullptr); + + const std::type_info* caught = nullptr; + try { + _ZSt6_ThrowRKSt20bad_array_new_length_nid_postfix(nullptr); + } catch (...) { + caught = __cxa_current_exception_type_nid_postfix(); + } + Require(caught != nullptr && caught->name() != nullptr && std::strcmp(caught->name(), type.name) == 0); + return 0; +} diff --git a/core/libs/tests/GuestTimedWaitCpu.cpp b/core/libs/tests/GuestTimedWaitCpu.cpp new file mode 100644 index 000000000000..c7a90c279dab --- /dev/null +++ b/core/libs/tests/GuestTimedWaitCpu.cpp @@ -0,0 +1,163 @@ +#include "prx/libkernel/include/Api.hpp" +#include "prx/libkernel/KernelErrors.hpp" +#include "prx/libkernel/Pthread/include/Cond.hpp" +#include "prx/libkernel/Pthread/include/Mutex.hpp" +#include "prx/libkernel/Time/include/Time.hpp" +#include "SceTypes.hpp" +#include +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#endif + +static void Require(bool value) { + if (!value) std::abort(); +} + +#ifdef _WIN32 +static void RequireCpuBound(std::uint64_t cpuNanos, std::uint64_t wallNanos, const char* name) { + Require(wallNanos != 0); + std::cout << name << ": calling-thread CPU " << std::fixed << std::setprecision(1) + << (100.0 * static_cast(cpuNanos) / static_cast(wallNanos)) + << "% (limit <= 40%)" << std::defaultfloat << std::endl; + Require(cpuNanos <= (wallNanos * 40ULL) / 100ULL); +} +#endif + +constexpr int WAIT_ITERATIONS = 500; +constexpr int SHORT_WAIT_ITERATIONS = 1000; +#ifdef _WIN32 +constexpr std::uint64_t P99_WAIT_MAX_NANOS = 3000000ULL; +constexpr std::uint64_t MAX_WAIT_NANOS = 10000000ULL; +#else +constexpr std::uint64_t P99_WAIT_MAX_NANOS = 10000000ULL; +constexpr std::uint64_t MAX_WAIT_NANOS = 50000000ULL; +#endif + +template +static void RequireLatencyBounds(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); + 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; +} + +#ifdef _WIN32 +static std::uint64_t CurrentThreadCpuNanos() { + FILETIME creation{}, exit{}, kernel{}, user{}; + Require(GetThreadTimes(GetCurrentThread(), &creation, &exit, &kernel, &user) != 0); + ULARGE_INTEGER k, u; + k.LowPart = kernel.dwLowDateTime; + k.HighPart = kernel.dwHighDateTime; + u.LowPart = user.dwLowDateTime; + u.HighPart = user.dwHighDateTime; + return (k.QuadPart + u.QuadPart) * 100ULL; +} +#endif + +static void TestUsleep500us() { + std::array samples{}; +#ifdef _WIN32 + const auto cpuStart = CurrentThreadCpuNanos(); +#endif + const auto wallStart = std::chrono::steady_clock::now(); + + for (int i = 0; i < WAIT_ITERATIONS; ++i) { + const auto t0 = std::chrono::steady_clock::now(); + Require(sceKernelUsleep_nid_postfix(500) == 0); + const auto t1 = std::chrono::steady_clock::now(); + const auto elapsed = std::chrono::duration_cast(t1 - t0); + samples[i] = static_cast(elapsed.count()); + Require(elapsed >= std::chrono::microseconds(500)); + } + + const auto wallEnd = std::chrono::steady_clock::now(); +#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(500 us)"); +#endif + RequireLatencyBounds(samples, 500000ULL, "sceKernelUsleep(500 us)"); +} + +static void TestUsleep100us() { + std::array samples{}; +#ifdef _WIN32 + const auto cpuStart = CurrentThreadCpuNanos(); +#endif + const auto wallStart = std::chrono::steady_clock::now(); + + for (int i = 0; i < SHORT_WAIT_ITERATIONS; ++i) { + const auto t0 = std::chrono::steady_clock::now(); + Require(sceKernelUsleep_nid_postfix(100) == 0); + const auto t1 = std::chrono::steady_clock::now(); + const auto elapsed = std::chrono::duration_cast(t1 - t0); + samples[i] = static_cast(elapsed.count()); + Require(elapsed >= std::chrono::microseconds(100)); + } + + const auto wallEnd = std::chrono::steady_clock::now(); + RequireLatencyBounds(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 +} + +static void TestCondTimedwait500us() { + std::array samples{}; + PthreadMutex mutex = nullptr; + PthreadCond cond = nullptr; + Require(scePthreadMutexInit(&mutex, nullptr, nullptr) == 0); + Require(scePthreadCondInit(&cond, nullptr, nullptr) == 0); + Require(scePthreadMutexLock(&mutex) == 0); + +#ifdef _WIN32 + const auto cpuStart = CurrentThreadCpuNanos(); +#endif + const auto wallStart = std::chrono::steady_clock::now(); + + for (int i = 0; i < WAIT_ITERATIONS; ++i) { + const auto t0 = std::chrono::steady_clock::now(); + const int result = scePthreadCondTimedwait(&cond, &mutex, 500); + Require(result == SCE_KERNEL_ERROR_ETIMEDOUT); + const auto t1 = std::chrono::steady_clock::now(); + const auto elapsed = std::chrono::duration_cast(t1 - t0); + samples[i] = static_cast(elapsed.count()); + Require(elapsed >= std::chrono::microseconds(500)); + } + + const auto wallEnd = std::chrono::steady_clock::now(); +#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, "scePthreadCondTimedwait(500 us)"); +#endif + + Require(scePthreadMutexUnlock(&mutex) == 0); + Require(scePthreadCondDestroy(&cond) == 0); + Require(scePthreadMutexDestroy(&mutex) == 0); + + RequireLatencyBounds(samples, 500000ULL, "scePthreadCondTimedwait(500 us)"); +} + +int main() { + TestUsleep100us(); + TestUsleep500us(); + TestCondTimedwait500us(); + return 0; +} diff --git a/core/libs/tests/GuestUdp.cpp b/core/libs/tests/GuestUdp.cpp index a2dd3d37ccde..ec80b654d41d 100644 --- a/core/libs/tests/GuestUdp.cpp +++ b/core/libs/tests/GuestUdp.cpp @@ -92,6 +92,84 @@ static void CheckAddressLengths(int family) { Require(close_nid_postfix(sender) == 0 && close_nid_postfix(receiver) == 0); } +static void CheckDissolvedName(int family, int binding) { + const std::uint32_t addressSize = family == 2 ? 16 : 28; + const int peer = socket_nid_postfix(family, 2, 0); + if (peer < 0 && family == 28 && *__error_nid_postfix() == 47) return; + Require(peer >= 0); + std::array peerAddress{}; + peerAddress[0] = static_cast(addressSize); + peerAddress[1] = static_cast(family); + if (family == 2) { peerAddress[4] = 127; peerAddress[7] = 1; } + else peerAddress[23] = 1; + const int bound = bind_nid_postfix(peer, peerAddress.data(), addressSize); + if (bound < 0 && family == 28 && *__error_nid_postfix() == 49) { + Require(close_nid_postfix(peer) == 0); + return; + } + Require(bound == 0); + std::uint32_t size = peerAddress.size(); + Require(getsockname_nid_postfix(peer, peerAddress.data(), &size) == 0 && size == addressSize); + int dissolved = socket_nid_postfix(family, 2, 0); + Require(dissolved >= 0); + if (binding != 0) { + auto local = peerAddress; + local[2] = local[3] = 0; + Require(bind_nid_postfix(dissolved, local.data(), addressSize) == 0); + if (binding == 2) { + size = local.size(); + Require(getsockname_nid_postfix(dissolved, local.data(), &size) == 0 && size == addressSize); + Require(close_nid_postfix(dissolved) == 0); + dissolved = socket_nid_postfix(family, 2, 0); + Require(dissolved >= 0); + Require(bind_nid_postfix(dissolved, local.data(), addressSize) == 0); + } + } + const int alias = dup_nid_postfix(dissolved); + Require(alias >= 0); + Require(connect_nid_postfix(dissolved, peerAddress.data(), addressSize) == 0); + std::array connected{}; + size = connected.size(); + Require(getsockname_nid_postfix(alias, connected.data(), &size) == 0 && size == addressSize); + Require(connected[2] || connected[3]); + const auto begin = family == 2 ? 4 : 8; + const auto end = family == 2 ? 8 : 24; + Require(std::equal(connected.begin() + begin, connected.begin() + end, peerAddress.begin() + begin)); + for (const bool portZero : {false, true}) { + auto disconnect = peerAddress; + if (portZero) disconnect[2] = disconnect[3] = 0; + else disconnect[1] = 0; + Require(connect_nid_postfix(alias, disconnect.data(), addressSize) == -1 && *__error_nid_postfix() == (portZero ? 49 : 47)); + for (const int descriptor : {dissolved, alias}) { + std::array name{}; + size = name.size(); + Require(getpeername_nid_postfix(descriptor, name.data(), &size) == -1 && *__error_nid_postfix() == 57); + size = name.size(); + Require(getsockname_nid_postfix(descriptor, name.data(), &size) == 0 && size == addressSize); + Require(name[2] == connected[2] && name[3] == connected[3]); + Require(std::all_of(name.begin() + begin, name.begin() + end, [](auto byte) { return byte == 0; })); + if (family == 28) Require(std::all_of(name.begin() + 24, name.end(), [](auto byte) { return byte == 0; })); + for (const std::uint32_t capacity : {0u, 1u, 6u, addressSize}) { + std::array truncated; + truncated.fill(0xa5); + size = capacity; + Require(getsockname_nid_postfix(descriptor, truncated.data(), &size) == 0 && size == capacity); + Require(std::equal(name.begin(), name.begin() + size, truncated.begin())); + Require(std::all_of(truncated.begin() + size, truncated.end(), [](auto byte) { return byte == 0xa5; })); + } + } + Require(connect_nid_postfix(dissolved, peerAddress.data(), addressSize) == 0); + std::array reconnected{}; + size = reconnected.size(); + Require(getsockname_nid_postfix(alias, reconnected.data(), &size) == 0 && size == addressSize); + Require(std::equal(connected.begin(), connected.begin() + addressSize, reconnected.begin())); + Require(send_nid_postfix(alias, "x", 1, 0) == 1); + char payload = 0; + Require(recv_nid_postfix(peer, &payload, 1, 0) == 1 && payload == 'x'); + } + Require(close_nid_postfix(alias) == 0 && close_nid_postfix(dissolved) == 0 && close_nid_postfix(peer) == 0); +} + static void CheckSendToPortZero() { const int receiver = socket_nid_postfix(2, 2, 0); const int sender = socket_nid_postfix(2, 2, 0); @@ -257,6 +335,8 @@ static void CheckArrivalTimestamps(int family) { int main() { CheckAddressLengths(2); CheckAddressLengths(28); + for (const int family : {2, 28}) + for (int binding = 0; binding < 3; ++binding) CheckDissolvedName(family, binding); CheckArrivalTimestamps(2); CheckArrivalTimestamps(28); CheckDontWait(); @@ -406,9 +486,7 @@ int main() { size = localName.size(); Require(getsockname_nid_postfix(dissolved, localName.data(), &size) == 0); Require(localName[2] == dissolvedAddress[2] && localName[3] == dissolvedAddress[3]); -#ifndef _WIN32 Require(localName[4] == 0 && localName[5] == 0 && localName[6] == 0 && localName[7] == 0); -#endif Require(send_nid_postfix(dissolved, "x", 1, 0) == -1 && *__error_nid_postfix() == 39); const char unrelated[] = "unrelated sender"; Require(sendto_nid_postfix(other, unrelated, sizeof(unrelated), 0, dissolvedAddress.data(), dissolvedAddress.size()) == sizeof(unrelated)); diff --git a/core/libs/tests/GuestUdpDisconnectResult.cpp b/core/libs/tests/GuestUdpDisconnectResult.cpp new file mode 100644 index 000000000000..f5911130b0ae --- /dev/null +++ b/core/libs/tests/GuestUdpDisconnectResult.cpp @@ -0,0 +1,116 @@ +#include "prx/libkernel/include/Api.hpp" +#include "prx/libkernel/Socket/include/SocketRuntime.hpp" +#include "prx/libc/include/Api.hpp" +#include +#include +#include +#include +#include +#include +#include +#include + +enum class NativeResult { Disconnected, Connected, UnknownPeer }; +static int injectedDescriptor = -1; +static int injectedError = 0; +static int peerError = 0; +static NativeResult injectedResult = NativeResult::Disconnected; + +extern "C" int connect(int descriptor, const sockaddr* address, socklen_t size) { + if (descriptor != injectedDescriptor || address->sa_family != AF_UNSPEC) + return static_cast(::syscall(SYS_connect, descriptor, address, size)); + if (injectedResult != NativeResult::Connected) { + const int result = static_cast(::syscall(SYS_connect, descriptor, address, size)); + if (result != 0) return result; + } + if (injectedResult == NativeResult::UnknownPeer) peerError = EACCES; + errno = injectedError; + return -1; +} + +extern "C" int getpeername(int descriptor, sockaddr* address, socklen_t* size) { + if (descriptor == injectedDescriptor && peerError != 0) { + errno = std::exchange(peerError, 0); + return -1; + } + return static_cast(::syscall(SYS_getpeername, descriptor, address, size)); +} + +static void Require(bool value) { if (!value) std::abort(); } + +static void CheckResult(int family, int binding, int error, NativeResult result, bool portZero) { + const std::uint32_t addressSize = family == 2 ? 16 : 28; + const int peer = socket_nid_postfix(family, 2, 0); + if (peer < 0 && family == 28 && *__error_nid_postfix() == 47) return; + Require(peer >= 0); + std::array destination{}; + destination[0] = static_cast(addressSize); + destination[1] = static_cast(family); + if (family == 2) { destination[4] = 127; destination[7] = 1; } + else destination[23] = 1; + const int bound = bind_nid_postfix(peer, destination.data(), addressSize); + if (bound < 0 && family == 28 && *__error_nid_postfix() == 49) { + Require(close_nid_postfix(peer) == 0); + return; + } + Require(bound == 0); + std::uint32_t size = destination.size(); + Require(getsockname_nid_postfix(peer, destination.data(), &size) == 0 && size == addressSize); + int client = socket_nid_postfix(family, 2, 0); + Require(client >= 0); + if (binding != 0) { + auto local = destination; + local[2] = local[3] = 0; + Require(bind_nid_postfix(client, local.data(), addressSize) == 0); + if (binding == 2) { + size = local.size(); + Require(getsockname_nid_postfix(client, local.data(), &size) == 0); + Require(close_nid_postfix(client) == 0); + client = socket_nid_postfix(family, 2, 0); + Require(client >= 0 && bind_nid_postfix(client, local.data(), addressSize) == 0); + } + } + Require(connect_nid_postfix(client, destination.data(), addressSize) == 0); + std::array before{}; + size = before.size(); + Require(getsockname_nid_postfix(client, before.data(), &size) == 0 && size == addressSize); + Require(before[2] || before[3]); + const auto native = GuestSockets::NativeDescriptor(client); + Require(native >= 0); + injectedDescriptor = static_cast(native); + injectedError = error; + injectedResult = result; + auto disconnect = destination; + if (portZero) disconnect[2] = disconnect[3] = 0; + else disconnect[1] = 0; + const int expected = result == NativeResult::Disconnected ? (portZero ? 49 : 47) : (error == EINVAL ? 22 : 47); + Require(connect_nid_postfix(client, disconnect.data(), addressSize) == -1 && *__error_nid_postfix() == expected); + injectedDescriptor = -1; + Require(peerError == 0); + std::array name{}; + size = name.size(); + if (result == NativeResult::Connected) { + Require(getpeername_nid_postfix(client, name.data(), &size) == 0 && name == destination); + size = name.size(); + Require(getsockname_nid_postfix(client, name.data(), &size) == 0 && name == before); + } else { + Require(getpeername_nid_postfix(client, name.data(), &size) == -1 && *__error_nid_postfix() == 57); + if (result == NativeResult::Disconnected) { + size = name.size(); + Require(getsockname_nid_postfix(client, name.data(), &size) == 0 && size == addressSize); + Require(name[2] == before[2] && name[3] == before[3]); + const auto begin = family == 2 ? 4 : 8; + const auto end = family == 2 ? 8 : 28; + Require(std::all_of(name.begin() + begin, name.begin() + end, [](auto byte) { return byte == 0; })); + } + } + Require(close_nid_postfix(client) == 0 && close_nid_postfix(peer) == 0); +} + +int main() { + for (const int family : {2, 28}) + for (int binding = 0; binding < 3; ++binding) + for (const int error : {EAFNOSUPPORT, EINVAL}) + for (const auto result : {NativeResult::Disconnected, NativeResult::Connected, NativeResult::UnknownPeer}) + for (const bool portZero : {false, true}) CheckResult(family, binding, error, result, portZero); +} diff --git a/core/libs/tests/GuestUdpNameConcurrency.cpp b/core/libs/tests/GuestUdpNameConcurrency.cpp new file mode 100644 index 000000000000..fc185213250f --- /dev/null +++ b/core/libs/tests/GuestUdpNameConcurrency.cpp @@ -0,0 +1,61 @@ +#include "prx/libkernel/include/Api.hpp" +#include "prx/libkernel/Socket/include/SocketRuntime.hpp" +#include +#include +#include +#include +#include +#include +#include +#include + +static std::atomic pausedDescriptor{-1}; +static std::promise connectPaused; +static std::promise continueConnect; +static std::shared_future resumeConnect = continueConnect.get_future().share(); + +extern "C" int connect(int descriptor, const sockaddr* address, socklen_t size) { + const int result = static_cast(::syscall(SYS_connect, descriptor, address, size)); + int expected = descriptor; + if (result == 0 && pausedDescriptor.compare_exchange_strong(expected, -1)) { + connectPaused.set_value(); + resumeConnect.wait(); + } + return result; +} + +static void Require(bool value) { if (!value) std::abort(); } + +int main() { + const int peer = socket_nid_postfix(2, 2, 0); + const int client = socket_nid_postfix(2, 2, 0); + Require(peer >= 0 && client >= 0); + std::array destination{16, 2, 0, 0, 127, 0, 0, 1}; + Require(bind_nid_postfix(peer, destination.data(), destination.size()) == 0); + std::uint32_t size = destination.size(); + Require(getsockname_nid_postfix(peer, destination.data(), &size) == 0); + Require(connect_nid_postfix(client, destination.data(), destination.size()) == 0); + std::array local{}; + size = local.size(); + Require(getsockname_nid_postfix(client, local.data(), &size) == 0); + const auto native = GuestSockets::NativeDescriptor(client); + Require(native >= 0); + pausedDescriptor = static_cast(native); + const std::array unspecified{16, 0}; + auto disconnect = std::async(std::launch::async, [&] { + return connect_nid_postfix(client, unspecified.data(), unspecified.size()); + }); + connectPaused.get_future().wait(); + auto reconnect = std::async(std::launch::async, [&] { + return connect_nid_postfix(client, destination.data(), destination.size()); + }); + reconnect.wait_for(std::chrono::milliseconds(250)); + continueConnect.set_value(); + Require(disconnect.get() == -1 && reconnect.get() == 0); + std::array name{}; + size = name.size(); + Require(getpeername_nid_postfix(client, name.data(), &size) == 0 && name == destination); + size = name.size(); + Require(getsockname_nid_postfix(client, name.data(), &size) == 0 && name == local); + Require(close_nid_postfix(client) == 0 && close_nid_postfix(peer) == 0); +} diff --git a/core/libs/tests/GuestUserService.cpp b/core/libs/tests/GuestUserService.cpp index 9b8ce9d612cb..852b8d6da0a4 100644 --- a/core/libs/tests/GuestUserService.cpp +++ b/core/libs/tests/GuestUserService.cpp @@ -100,7 +100,9 @@ int main() { std::uint64_t account_id = 0xdeadbeefu; Require(sceUserServiceGetNpAccountId(USER_SERVICE_INITIAL_USER_ID, nullptr) == USER_SERVICE_ERROR_INVALID_ARGUMENT); - Require(sceUserServiceGetNpAccountId(123, &account_id) == USER_SERVICE_ERROR_INVALID_ARGUMENT); + Require(sceUserServiceGetNpAccountId(123, &account_id) == USER_SERVICE_ERROR_UNKNOWN_USER); + Require(account_id == 0xdeadbeefu); + Require(sceUserServiceGetNpAccountId(123, nullptr) == USER_SERVICE_ERROR_UNKNOWN_USER); Require(sceUserServiceGetNpAccountId(USER_SERVICE_INITIAL_USER_ID, &account_id) == USER_SERVICE_OK); Require(account_id == 0); @@ -115,6 +117,10 @@ int main() { Require(sceUserServiceGetPlatformPrivacyWs1(user_id, &privacy) == USER_SERVICE_ERROR_NOT_LOGGED_IN); Require(privacy == 0x5a5a); Require(sceUserServiceGetPlatformPrivacyWs1(user_id, nullptr) == USER_SERVICE_ERROR_NOT_LOGGED_IN); + account_id = 0xdeadbeefu; + Require(sceUserServiceGetNpAccountId(user_id, &account_id) == USER_SERVICE_ERROR_UNKNOWN_USER); + Require(account_id == 0xdeadbeefu); + Require(sceUserServiceGetNpAccountId(user_id, nullptr) == USER_SERVICE_ERROR_UNKNOWN_USER); } Require(sceUserServiceGetAgeLevel(USER_SERVICE_INITIAL_USER_ID, &age_level) == USER_SERVICE_OK); Require(age_level == 0xffffffffu); @@ -193,6 +199,10 @@ int main() { Require(sceUserServiceGetPlatformPrivacyWs1(USER_SERVICE_INITIAL_USER_ID + 1, &privacy) == USER_SERVICE_ERROR_NOT_LOGGED_IN); Require(privacy == 0x5a5a); Require(sceUserServiceGetPlatformPrivacyWs1(USER_SERVICE_INITIAL_USER_ID + 1, nullptr) == USER_SERVICE_ERROR_NOT_LOGGED_IN); + account_id = 0xdeadbeefu; + Require(sceUserServiceGetNpAccountId(USER_SERVICE_INITIAL_USER_ID + 1, &account_id) == USER_SERVICE_ERROR_UNKNOWN_USER); + Require(account_id == 0xdeadbeefu); + Require(sceUserServiceGetNpAccountId(USER_SERVICE_INITIAL_USER_ID + 1, nullptr) == USER_SERVICE_ERROR_UNKNOWN_USER); for (const Setting& setting : settings) { std::int32_t value = 0x5a5a5a5a; Require(setting.get(USER_SERVICE_INITIAL_USER_ID + 1, &value) == USER_SERVICE_ERROR_NOT_LOGGED_IN); @@ -213,6 +223,10 @@ int main() { Require(sceUserServiceGetPlatformPrivacyWs1(USER_SERVICE_INITIAL_USER_ID + 1, nullptr) == USER_SERVICE_ERROR_INVALID_ARGUMENT); Require(sceUserServiceGetPlatformPrivacyWs1(USER_SERVICE_INITIAL_USER_ID + 1, &privacy) == USER_SERVICE_OK); Require(privacy == 0); + account_id = 0xdeadbeefu; + Require(sceUserServiceGetNpAccountId(USER_SERVICE_INITIAL_USER_ID + 1, nullptr) == USER_SERVICE_ERROR_INVALID_ARGUMENT); + Require(sceUserServiceGetNpAccountId(USER_SERVICE_INITIAL_USER_ID + 1, &account_id) == USER_SERVICE_OK); + Require(account_id == 0); for (const Setting& setting : settings) { std::int32_t value = 0x5a5a5a5a; Require(setting.get(USER_SERVICE_INITIAL_USER_ID + 1, &value) == USER_SERVICE_OK); @@ -231,6 +245,10 @@ int main() { Require(sceUserServiceGetPlatformPrivacyWs1(USER_SERVICE_INITIAL_USER_ID + 1, &privacy) == USER_SERVICE_ERROR_NOT_LOGGED_IN); Require(privacy == 0x5a5a); Require(sceUserServiceGetPlatformPrivacyWs1(USER_SERVICE_INITIAL_USER_ID + 1, nullptr) == USER_SERVICE_ERROR_NOT_LOGGED_IN); + account_id = 0xdeadbeefu; + Require(sceUserServiceGetNpAccountId(USER_SERVICE_INITIAL_USER_ID + 1, &account_id) == USER_SERVICE_ERROR_UNKNOWN_USER); + Require(account_id == 0xdeadbeefu); + Require(sceUserServiceGetNpAccountId(USER_SERVICE_INITIAL_USER_ID + 1, nullptr) == USER_SERVICE_ERROR_UNKNOWN_USER); for (const Setting& setting : settings) { std::int32_t value = 0x5a5a5a5a; Require(setting.get(USER_SERVICE_INITIAL_USER_ID + 1, &value) == USER_SERVICE_ERROR_NOT_LOGGED_IN); diff --git a/core/libs/tests/GuestUserServiceLifecycle.cpp b/core/libs/tests/GuestUserServiceLifecycle.cpp index 99a61cc97b57..488ed4c805c8 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 0990141df28a..9b2bc63990f2 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/GuestVideodec.cpp b/core/libs/tests/GuestVideodec.cpp index 989a2c53c93d..68b3d8493ec2 100644 --- a/core/libs/tests/GuestVideodec.cpp +++ b/core/libs/tests/GuestVideodec.cpp @@ -167,6 +167,60 @@ void testReset() { check(!picture.isValid, "a reset decoder produced a picture"); } +constexpr std::uint8_t High10Picture[] = { + 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x0a, 0xa6, 0xcb, 0x88, 0xf6, 0x02, 0x20, 0x00, 0x00, + 0x03, 0x00, 0x20, 0x00, 0x00, 0x03, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x0f, + 0xc8, 0x00, 0x00, 0x01, 0x65, 0x88, 0x84, 0x3a, 0x26, 0x28, 0x0c, 0x9c, 0x9c, 0x9d, 0x75, 0xd7, + 0x5d, 0x75, 0xd7, 0x5e +}; + +void testDeepPicture() { + Session session; + const SceVideodec2::InputData input{sizeof(SceVideodec2::InputData), High10Picture, sizeof(High10Picture), 1000, 0, 0xa0}; + bool refused = false; + std::size_t pictures = 0; + try { + auto target = session.MakeTarget(); + PictureInfo picture{sizeof(PictureInfo)}; + check(sceVideodecDecode(&session.ctrl, &input, &target, &picture) == 0, "decode of the 10-bit picture failed"); + if (picture.isValid) ++pictures; + for (;;) { + check(sceVideodecFlush(&session.ctrl, &target, &picture) == 0, "flush of the 10-bit picture failed"); + if (!picture.isValid) break; + ++pictures; + } + } catch (const std::runtime_error& error) { + if (std::string(error.what()).find("deeper than 8 bits") == std::string::npos) throw; + refused = true; + } + check(refused, "10-bit pictures copied as 8-bit pictures: " + std::to_string(pictures)); +} + +constexpr std::uint8_t High10ReorderedPicture[] = { + 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x00, 0x0a, 0xa6, 0xce, 0x41, 0x1e, 0xc0, 0x44, 0x00, 0x00, + 0x03, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0xc8, 0x3c, 0x48, 0x94, 0x48, 0x00, 0x00, 0x00, 0x01, + 0x68, 0xeb, 0xe3, 0xcb, 0x22, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x65, 0x88, 0x84, 0x00, 0x43, 0xff, + 0xfe, 0xf7, 0x81, 0xbf, 0x32, 0x7d, 0xaa, 0xb2, 0x5c, 0x7e, 0x79, 0xdf, 0x14, 0x3f, 0x28, 0x74, + 0xab, 0x06, 0xa2, 0xac, 0xeb, 0x0d +}; + +void testDeepReorderedPicture() { + Session session; + const SceVideodec2::InputData input{sizeof(SceVideodec2::InputData), High10ReorderedPicture, sizeof(High10ReorderedPicture), 1000, 0, 0xa0}; + auto target = session.MakeTarget(); + PictureInfo picture{sizeof(PictureInfo)}; + check(sceVideodecDecode(&session.ctrl, &input, &target, &picture) == 0, "decode of the reordered 10-bit picture failed"); + check(!picture.isValid, "the reordered 10-bit picture was not held for the flush"); + bool refused = false; + try { + sceVideodecFlush(&session.ctrl, &target, &picture); + } catch (const std::runtime_error& error) { + if (std::string(error.what()).find("deeper than 8 bits") == std::string::npos) throw; + refused = true; + } + check(refused, "a flushed 10-bit picture was copied as an 8-bit picture"); +} + void testQueryResourceInfo(std::int32_t width, std::int32_t height, std::uint32_t profile, std::uint32_t level) { const ConfigInfo config{sizeof(ConfigInfo), 1, profile, level, width, height, 4, 0}; ResourceInfo resource{sizeof(ResourceInfo)}; @@ -219,6 +273,8 @@ int main() { testDecodeCropped(); testErrors(); testReset(); + testDeepPicture(); + testDeepReorderedPicture(); testQueryResourceInfo(); std::puts("Videodec tests passed"); return 0; diff --git a/core/libs/tests/GuestVoiceChat.cpp b/core/libs/tests/GuestVoiceChat.cpp index e4941b9977be..d01c8e2bbda5 100644 --- a/core/libs/tests/GuestVoiceChat.cpp +++ b/core/libs/tests/GuestVoiceChat.cpp @@ -29,6 +29,8 @@ int main() { Require(sceVoiceChatUnregisterMemberEventHandler(nullptr) == 0, "unregister member event handler failed"); Require(sceVoiceChatUnregisterPartyUserStateChangedHandler(nullptr) == 0, "unregister party user state changed handler failed"); Require(sceVoiceChatUnregisterVoiceEventHandler(nullptr) == 0, "unregister voice event handler failed"); + Require(sceVoiceChatUnregisterAccessibilityEventHandler(nullptr) == 0, "unregister accessibility event handler failed"); + Require(sceVoiceChatUnregisterRangedMemberEventHandler(nullptr) == 0, "unregister ranged member event handler failed"); Require(sceVoiceChatStartChannelEvent(nullptr) == 0, "start channel event failed"); Require(sceVoiceChatStopChannelEvent(nullptr) == 0, "stop channel event failed"); Require(sceVoiceChatStartDaemonEvent(nullptr) == 0, "start daemon event failed"); @@ -37,6 +39,10 @@ int main() { Require(sceVoiceChatStopMemberEvent(nullptr) == 0, "stop member event failed"); Require(sceVoiceChatStartVoiceEvent(nullptr) == 0, "start voice event failed"); Require(sceVoiceChatStopVoiceEvent(nullptr) == 0, "stop voice event failed"); + Require(sceVoiceChatStartAccessibilityEvent(nullptr) == 0, "start accessibility event failed"); + Require(sceVoiceChatStopAccessibilityEvent(nullptr) == 0, "stop accessibility event failed"); + Require(sceVoiceChatStartRangedMemberEvent(nullptr) == 0, "start ranged member event failed"); + Require(sceVoiceChatStopRangedMemberEvent(nullptr) == 0, "stop ranged member event failed"); Require(sceVoiceChatGetMicState(nullptr) == kSignedOut, "get mic state did not return signed out"); Require(sceVoiceChatGetUserVoiceVolumeGain(nullptr, nullptr) == kSignedOut, "get volume gain did not return signed out"); @@ -56,10 +62,15 @@ int main() { Require(sceVoiceChatRequestLeaveGameSessionVoiceChatChannel(1, nullptr, nullptr) == kSignedOut, "leave game session did not return signed out"); Require(sceVoiceChatRequestCreatePlayerSessionVoiceChatChannel(1, nullptr, nullptr) == kSignedOut, "create player session did not return signed out"); Require(sceVoiceChatRequestDeletePlayerSessionVoiceChatChannel(1, nullptr, nullptr) == kSignedOut, "delete player session did not return signed out"); + Require(sceVoiceChatRequestJoinPlayerSessionVoiceChatChannel(1, nullptr, nullptr) == kSignedOut, "join player session did not return signed out"); + Require(sceVoiceChatRequestLeavePlayerSessionVoiceChatChannel(1, nullptr, nullptr) == kSignedOut, "leave player session did not return signed out"); Require(sceVoiceChatRequestCreateVoiceChatGroup(1, nullptr, nullptr) == kSignedOut, "create voice chat group did not return signed out"); Require(sceVoiceChatRequestJoinVoiceChatGroup(1, nullptr, nullptr) == kSignedOut, "join voice chat group did not return signed out"); Require(sceVoiceChatRequestLeaveVoiceChatGroup(1, nullptr, nullptr) == kSignedOut, "leave voice chat group did not return signed out"); Require(sceVoiceChatRequestDeleteVoiceChatGroup(1, nullptr, nullptr) == kSignedOut, "delete voice chat group did not return signed out"); + Require(sceVoiceChatRequestUpdateGameSessionVoiceChatChannelName(1, nullptr, nullptr) == kSignedOut, "update game session name did not return signed out"); + Require(sceVoiceChatRequestUpdatePlayerSessionVoiceChatChannelName(1, nullptr, nullptr) == kSignedOut, "update player session name did not return signed out"); + Require(sceVoiceChatRequestSetMemberVolume(1, nullptr, nullptr) == kSignedOut, "set member volume did not return signed out"); Require(sceVoiceChatRequestAcsTts(1, nullptr, nullptr) == kSignedOut, "tts request did not return signed out"); Require(sceVoiceChatAbortRequest(1) == 0, "abort request failed"); Require(sceVoiceChatDeleteRequest(1) == 0, "delete request failed"); diff --git a/core/libs/tests/GuestVrHand.cpp b/core/libs/tests/GuestVrHand.cpp new file mode 100644 index 000000000000..aeb0d2d77fa5 --- /dev/null +++ b/core/libs/tests/GuestVrHand.cpp @@ -0,0 +1,63 @@ +#include "prx/libSceVrHand/include/Api.hpp" +#include +#include +#include +#include + +namespace { + +void Require(bool value) { if (!value) std::abort(); } + +constexpr int kErrInvalidArg = static_cast(0x8a870006); +constexpr std::uint8_t kFill = 0xaa; + +std::array ValidParam() { + std::array param{}; + param[0] = 0x20; + return param; +} + +bool Untouched(const std::array& out) { + for (const auto value : out) if (value != kFill) return false; + return true; +} + +int Query(const std::array& param, std::array& out) { + out.fill(kFill); + return sceVrHandQueryMemory(param.data(), out.data()); +} + +} + +int main() { + std::array out{}; + auto param = ValidParam(); + + out.fill(kFill); + Require(sceVrHandQueryMemory(nullptr, out.data()) == kErrInvalidArg && Untouched(out)); + Require(sceVrHandQueryMemory(param.data(), nullptr) == kErrInvalidArg); + + for (const std::uint32_t size : {0u, 0x1fu, 0x21u, 0x40u, 0x120u, 0x10020u, 0x1000020u}) { + param = ValidParam(); + std::memcpy(param.data(), &size, sizeof(size)); + Require(Query(param, out) == kErrInvalidArg && Untouched(out)); + } + for (std::size_t index = 4; index < 0x20; ++index) { + param = ValidParam(); + param[index] = 1; + Require(Query(param, out) == kErrInvalidArg && Untouched(out)); + } + + param = ValidParam(); + std::memset(param.data() + 0x20, 0xcc, 0x20); + Require(Query(param, out) == 0); + std::uint32_t at0 = 0; + std::uint32_t at4 = 0; + std::memcpy(&at0, out.data(), sizeof(at0)); + std::memcpy(&at4, out.data() + 4, sizeof(at4)); + Require(at0 == 0x3c00000); + Require(at4 == 0x10000); + for (std::size_t index = 8; index < 0x1c; ++index) Require(out[index] == 0); + for (std::size_t index = 0x1c; index < out.size(); ++index) Require(out[index] == kFill); + return 0; +} diff --git a/core/libs/tests/GuestVrSetupDialog.cpp b/core/libs/tests/GuestVrSetupDialog.cpp index e1593d7a4ffa..21cfd3bb195f 100644 --- a/core/libs/tests/GuestVrSetupDialog.cpp +++ b/core/libs/tests/GuestVrSetupDialog.cpp @@ -87,7 +87,12 @@ int main() { Require(sceVrSetupDialogTerminate() == 0); Require(sceVrSetupDialogTerminate() == kErrNotInitialized); Require(sceVrSetupDialogOpen(nullptr) == kErrArgNull); + Require(sceVrSetupDialogOpen(¶m) == kErrNotInitialized); + Require(sceVrSetupDialogClose() == kErrNotInitialized); Require(sceVrSetupDialogGetResult(nullptr) == kErrArgNull); + result[0] = -1; + Require(sceVrSetupDialogGetResult(result) == kErrNotInitialized); + Require(result[0] == -1 && result[1] == -1); Require(sceVrSetupDialogGetStatus() == kStatusNone); Require(sceVrSetupDialogUpdateStatus() == kStatusNone); @@ -98,4 +103,14 @@ int main() { Require(sceVrSetupDialogGetResult(result) == kErrNotFinished); Require(result[0] == kResultUserCanceled && result[1] == -1); Require(sceVrSetupDialogTerminate() == 0); + Require(sceVrSetupDialogTerminate() == kErrNotInitialized); + Require(sceVrSetupDialogOpen(nullptr) == kErrArgNull); + Require(sceVrSetupDialogOpen(¶m) == kErrNotInitialized); + Require(sceVrSetupDialogClose() == kErrNotInitialized); + Require(sceVrSetupDialogGetResult(nullptr) == kErrArgNull); + result[0] = -1; + Require(sceVrSetupDialogGetResult(result) == kErrNotInitialized); + Require(result[0] == -1 && result[1] == -1); + Require(sceVrSetupDialogGetStatus() == kStatusNone); + Require(sceVrSetupDialogUpdateStatus() == kStatusNone); } diff --git a/core/libs/tests/GuestWebBrowserDialog.cpp b/core/libs/tests/GuestWebBrowserDialog.cpp index a103ce8ea7de..3c9c5b947dc1 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 @@ -12,10 +14,49 @@ constexpr int COMMON_DIALOG_STATUS_FINISHED = 3; constexpr int COMMON_DIALOG_RESULT_USER_CANCELED = 1; constexpr int COMMON_DIALOG_ERROR_NOT_INITIALIZED = static_cast(0x80B80003u); constexpr int COMMON_DIALOG_ERROR_NOT_FINISHED = static_cast(0x80B80005u); +constexpr int COMMON_DIALOG_ERROR_INVALID_STATE = static_cast(0x80B80006u); +constexpr int COMMON_DIALOG_ERROR_PARAMETER = static_cast(0x80B8000Au); 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() { @@ -43,6 +84,14 @@ int main() { Require(sceWebBrowserDialogUpdateStatus() == COMMON_DIALOG_STATUS_INITIALIZED); Require(sceWebBrowserDialogGetResult(&result) == COMMON_DIALOG_ERROR_NOT_FINISHED); Require(result.result == 0x5a5a5a5a); + Require(sceWebBrowserDialogSetCookie(nullptr) == COMMON_DIALOG_ERROR_ARG_NULL); + Require(sceWebBrowserDialogResetCookie(nullptr) == COMMON_DIALOG_ERROR_ARG_NULL); + WebBrowserDialogCookieParam badCookie{}; + badCookie.size = 1; + Require(sceWebBrowserDialogSetCookie(&badCookie) == COMMON_DIALOG_ERROR_PARAMETER); + WebBrowserDialogResetCookieParam badReset{}; + badReset.size = 1; + Require(sceWebBrowserDialogResetCookie(&badReset) == COMMON_DIALOG_ERROR_PARAMETER); Require(sceWebBrowserDialogTerminate() == 0); Require(sceWebBrowserDialogTerminate() == COMMON_DIALOG_ERROR_NOT_INITIALIZED); @@ -53,6 +102,8 @@ int main() { Require(sceWebBrowserDialogInitialize() == 0); Require(sceWebBrowserDialogOpen(nullptr) == COMMON_DIALOG_ERROR_ARG_NULL); Require(sceWebBrowserDialogOpen(param) == 0); + Require(sceWebBrowserDialogSetCookie(nullptr) == COMMON_DIALOG_ERROR_INVALID_STATE); + Require(sceWebBrowserDialogResetCookie(&badReset) == COMMON_DIALOG_ERROR_INVALID_STATE); Require(sceWebBrowserDialogGetStatus() == COMMON_DIALOG_STATUS_FINISHED); Require(sceWebBrowserDialogUpdateStatus() == COMMON_DIALOG_STATUS_FINISHED); @@ -71,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"; @@ -134,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/GuestWideConversion.cpp b/core/libs/tests/GuestWideConversion.cpp index f1971d9e1395..db18242a8a64 100644 --- a/core/libs/tests/GuestWideConversion.cpp +++ b/core/libs/tests/GuestWideConversion.cpp @@ -142,8 +142,9 @@ static void CheckScan() { Require(swscanf_s_nid_postfix(u"5 abc", u"%d%ls", &first, static_cast(nullptr), std::size_t{4}) == -1, "null %ls argument"); Require(swscanf_s_nid_postfix(nullptr, u"%d", &first) == -1, "null buffer"); Require(swscanf_s_nid_postfix(u"5", nullptr) == -1, "null format"); - Require(Throws([&] { swscanf_s_nid_postfix(u"abc", u"%l[a-c]", text, std::size_t{6}); }), "scanset range throws"); - Require(Throws([&] { swscanf_s_nid_postfix(u"5", u"%Ld", &wide); }), "%Ld throws"); + Require(swscanf_s_nid_postfix(u"abcz", u"%l[a-c]", text, std::size_t{6}) == 1 && std::u16string(text) == u"abc", "scanset range"); + first = -1; + Require(swscanf_s_nid_postfix(u"5", u"%Ld", &first) == 1 && first == 5, "%Ld reads an int"); Require(swscanf_s_nid_postfix(u"Ā", u"%s", narrow, std::size_t{4}) == 1 && std::strcmp(narrow, "\xc4\x80") == 0, "narrow %s stores UTF-8"); } @@ -224,9 +225,36 @@ static void CheckUnsizedScan() { Require(swscanf_nid_postfix(u"5", u"%d%d", &first, &second) == 1, "swscanf input failure after a conversion"); Require(swscanf_nid_postfix(nullptr, u"%d", &first) == -1, "swscanf null buffer"); Require(swscanf_nid_postfix(u"5", nullptr) == -1, "swscanf null format"); - Require(Throws([&] { swscanf_nid_postfix(u"abc", u"%l[a-c]", text); }), "swscanf scanset range throws"); - Require(Throws([&] { swscanf_nid_postfix(u"5", u"%Ld", &wide); }), "swscanf %Ld throws"); - Require(Throws([&] { swscanf_nid_postfix(u"1", u"%lp", &pointer); }), "swscanf %lp throws"); + Require(swscanf_nid_postfix(u"abcz", u"%l[a-c]", text) == 1 && std::u16string(text) == u"abc", "swscanf scanset range"); + const struct { + const char16_t* input; + const char16_t* format; + int result; + const char* stored; + } ranges[] = { + {u"bca-", u"%[a-c]", 1, "bca"}, {u"za", u"%[z-a]", 0, ""}, {u"-ab", u"%[-a]", 1, "-a"}, {u"a-b", u"%[a-]", 1, "a-"}, + {u"dcb", u"%[^a-c]", 1, "d"}, {u"b", u"%[a-a-c]", 0, ""}, {u"a-c", u"%[a-a-c]", 1, "a-c"}, {u"-d", u"%[a-c-e]", 1, "-"}, + {u"-x", u"%[c-a-z]", 1, "-"}, {u"-", u"%[a--]", 0, ""}, {u"+", u"%[*--]", 1, "+"}, {u"b]", u"%[]-c]", 1, "b]"}, + {u"-]a", u"%[^]-]", 0, ""}, {u"\u00e9a", u"%[a-\u00e9]", 1, "\xc3\xa9" "a"}, {u"ab cd", u"%2hs", 1, "ab"}, {u"ab", u"%lls", 1, "ab"}, + {u"ab", u"%hhs", 1, "ab"}, {u"ab", u"%h[a-z]", 1, "ab"}, {u"ab", u"%y", 0, ""}, {u"ab", u"%5y", 0, ""}, {u"ab", u"%hls", 0, ""}, + }; + for (const auto& item : ranges) { + char bytes[8] = {'!', '!', '!', '!', '!', '!', '!', '!'}; + Require(swscanf_nid_postfix(item.input, item.format, bytes) == item.result, "swscanf scanset or length result"); + Require(item.result == 0 ? bytes[0] == '!' : std::strcmp(bytes, item.stored) == 0, "swscanf scanset or length bytes"); + } + char letters[4] = {'!', '!', '!', '!'}; + Require(swscanf_nid_postfix(u"abc", u"%2hc", letters) == 1 && letters[0] == 'a' && letters[1] == 'b' && letters[2] == '!', "swscanf %hc"); + Require(swscanf_nid_postfix(u"ab", u"%ls%y", text) == 1 && std::u16string(text) == u"ab", "swscanf stops at an unknown conversion"); + first = -1; + Require(swscanf_nid_postfix(u"5", u"%Ld", &first) == 1 && first == 5, "swscanf %Ld reads an int"); + pointer = nullptr; + Require(swscanf_nid_postfix(u"1f", u"%lp", &pointer) == 1 && pointer == reinterpret_cast(0x1f), "swscanf %lp reads a pointer"); + pointer = nullptr; + Require(swscanf_nid_postfix(u"1f", u"%hp", &pointer) == 1 && pointer == reinterpret_cast(0x1f), "swscanf %hp reads a pointer"); + char unset[4] = {'!', '!', '!', '!'}; + Require(swscanf_nid_postfix(u"ab", u"%[^]", unset) == 0 && swscanf_nid_postfix(u"ab", u"%[ab", unset) == 0, "swscanf unterminated set"); + Require(swscanf_nid_postfix(u"", u"%[^]", unset) == 0 && unset[0] == '!', "swscanf unterminated set at end of input"); Require(swscanf_nid_postfix(u"Ā", u"%s", narrow) == 1 && std::strcmp(narrow, "\xc4\x80") == 0, "swscanf narrow %s stores UTF-8"); } diff --git a/core/libs/tests/GuestWideStreamScan.cpp b/core/libs/tests/GuestWideStreamScan.cpp index 857a72001f45..1f4f1971d09c 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 000000000000..3a9bb35b5f19 --- /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/HostCpu.cpp b/core/libs/tests/HostCpu.cpp index 7c5d3aea880c..0f52676ca67a 100644 --- a/core/libs/tests/HostCpu.cpp +++ b/core/libs/tests/HostCpu.cpp @@ -123,8 +123,23 @@ static void CheckError() { } } +static void CheckExportedHelpers() { + const auto registers = ReadHostCpuRegisters_nid_no_patch(); + const auto direct = ReadHostCpuRegisters(); + Require(registers.Leaf1Ecx == direct.Leaf1Ecx && registers.Leaf7Ebx == direct.Leaf7Ebx && registers.Xcr0 == direct.Xcr0, "exported registers differ"); + Require(std::string(HostCpuModel_nid_no_patch().value) == HostCpuModel(), "exported model differs"); + auto none = Zen2(); + Require(std::string(MissingHostCpuFeatures_nid_no_patch(&none).value).empty(), "exported missing list is not empty for a Zen 2 CPU"); + auto lacking = Zen2(); + lacking.Leaf7Ebx &= ~Bit(8); + Require(std::string(MissingHostCpuFeatures_nid_no_patch(&lacking).value) == "BMI2", "exported missing list is not BMI2"); + lacking.Leaf7Ebx &= ~Bit(3); + Require(std::string(MissingHostCpuFeatures_nid_no_patch(&lacking).value) == "BMI1, BMI2", "exported missing list is not joined with a comma and a space"); +} + int main() { try { + CheckExportedHelpers(); CheckZen2(); CheckIntelWithoutAmdOnlyExtensions(); CheckSingleMissingExtension(); diff --git a/core/libs/tests/HostPerformanceGameMode.cpp b/core/libs/tests/HostPerformanceGameMode.cpp new file mode 100644 index 000000000000..d6ee47fb9512 --- /dev/null +++ b/core/libs/tests/HostPerformanceGameMode.cpp @@ -0,0 +1,174 @@ +#include "prx/libkernel/System/include/GameModeClient.hpp" +#include +#include +#include +#include +#include + +namespace { + +using namespace HostPerformance; + +void Require(bool condition, const std::string& message) { + if (!condition) throw std::runtime_error(message); +} + +bool Contains(const std::string& text, const std::string& part) { + return text.find(part) != std::string::npos; +} + +struct Fixture { + void* Handle = nullptr; + void (*Configure)(int, int) = nullptr; + int (*Starts)() = nullptr; + int (*Ends)() = nullptr; + + explicit Fixture(const std::string& path) { + Handle = dlopen(path.c_str(), RTLD_NOW | RTLD_LOCAL); + Require(Handle != nullptr, "cannot load the fixture " + path); + Configure = reinterpret_cast(dlsym(Handle, "fixture_configure")); + Starts = reinterpret_cast(dlsym(Handle, "fixture_starts")); + Ends = reinterpret_cast(dlsym(Handle, "fixture_ends")); + Require(Configure != nullptr && Starts != nullptr && Ends != nullptr, "the fixture lacks its counters"); + } + + ~Fixture() { dlclose(Handle); } +}; + +void MissingLibraryIsUnavailable(const std::string& missing) { + GameModeClient client({missing}); + const auto begun = client.Begin(); + Require(begun.Result == Outcome::Unavailable, "a library that cannot be loaded must be unavailable"); + Require(Contains(begun.Detail, missing), "the reason must name the library that failed"); + client.End(); +} + +void NoLibraryNamesIsUnavailable() { + GameModeClient client(std::vector{}); + Require(client.Begin().Result == Outcome::Unavailable, "an empty library list must be unavailable"); +} + +void SecondNameIsTriedAfterTheFirstFails(const std::string& missing, const std::string& fixturePath) { + Fixture fixture(fixturePath); + GameModeClient client({missing, fixturePath}); + Require(client.Begin().Result == Outcome::Started, "the next library name must be tried when one fails"); + Require(fixture.Starts() == 1, "the request must reach the library that loaded"); + client.End(); +} + +void StartAndEndReachTheLibraryOnce(const std::string& fixturePath) { + Fixture fixture(fixturePath); + fixture.Configure(0, 0); + const int startsBefore = fixture.Starts(); + const int endsBefore = fixture.Ends(); + { + GameModeClient client({fixturePath}); + Require(client.Begin().Result == Outcome::Started, "a library that accepts the request must start"); + Require(client.Begin().Result == Outcome::Started, "a repeated begin must keep the request"); + Require(fixture.Starts() == startsBefore + 1, "a repeated begin must not request again"); + client.End(); + client.End(); + Require(fixture.Ends() == endsBefore + 1, "end must release once"); + } + Require(fixture.Ends() == endsBefore + 1, "the destructor must not release an ended request again"); + { + GameModeClient client({fixturePath}); + client.Begin(); + } + Require(fixture.Ends() == endsBefore + 2, "the destructor must release a request still held"); +} + +void EndWithoutBeginDoesNothing(const std::string& fixturePath) { + Fixture fixture(fixturePath); + const int endsBefore = fixture.Ends(); + GameModeClient client({fixturePath}); + client.End(); + Require(fixture.Ends() == endsBefore, "end without a request must not reach the library"); +} + +void RefusalCarriesTheLibraryReason(const std::string& fixturePath) { + Fixture fixture(fixturePath); + fixture.Configure(-1, 0); + const int endsBefore = fixture.Ends(); + { + GameModeClient client({fixturePath}); + const auto begun = client.Begin(); + Require(begun.Result == Outcome::Refused, "a library that refuses must be reported as refused"); + Require(Contains(begun.Detail, "fixture daemon is not running"), "the refusal must carry the library's error string"); + client.End(); + } + Require(fixture.Ends() == endsBefore, "a refused request must never be released"); + fixture.Configure(0, 0); +} + +void RefusalWithoutErrorStringStillReports(const std::string& fixturePath) { + Fixture fixture(fixturePath); + fixture.Configure(-1, 0); + GameModeClient client({fixturePath}); + const auto begun = client.Begin(); + Require(begun.Result == Outcome::Refused && !begun.Detail.empty(), "a refusal without an error string must still carry a reason"); + fixture.Configure(0, 0); +} + +void FailingEndIsReported(const std::string& fixturePath) { + Fixture fixture(fixturePath); + fixture.Configure(0, -1); + GameModeClient client({fixturePath}); + client.Begin(); + bool threw = false; + try { + client.End(); + } catch (const std::runtime_error&) { + threw = true; + } + Require(threw, "a failing end must be reported so the session can log it"); + fixture.Configure(0, 0); +} + +void MissingSymbolIsUnavailable(const std::string& fixturePath, const char* symbol) { + GameModeClient client({fixturePath}); + const auto begun = client.Begin(); + Require(begun.Result == Outcome::Unavailable, std::string("a library without ") + symbol + " must be unavailable"); + Require(Contains(begun.Detail, symbol), std::string("the reason must name ") + symbol); +} + +void SessionOverTheClient(const std::string& fixturePath) { + Fixture fixture(fixturePath); + fixture.Configure(0, 0); + const int startsBefore = fixture.Starts(); + const int endsBefore = fixture.Ends(); + GameModeClient client({fixturePath}); + std::vector lines; + Session session(Mode::On, client, [&](const std::string& line) { lines.push_back(line); }); + Require(session.Start() == State::Active, "the session must be active over a working library"); + session.Stop(); + Require(fixture.Starts() == startsBefore + 1 && fixture.Ends() == endsBefore + 1, "the session must request once and release once"); + Require(lines.size() == 1, "the session must log one line"); +} + +} + +int main(int argc, char** argv) { + if (argc != 5) { + std::cerr << "usage: host_performance_game_mode_tests \n"; + return 2; + } + const std::string fixture = argv[1]; + try { + MissingLibraryIsUnavailable(argv[4]); + NoLibraryNamesIsUnavailable(); + SecondNameIsTriedAfterTheFirstFails(argv[4], fixture); + StartAndEndReachTheLibraryOnce(fixture); + EndWithoutBeginDoesNothing(fixture); + RefusalCarriesTheLibraryReason(fixture); + RefusalWithoutErrorStringStillReports(argv[3]); + FailingEndIsReported(fixture); + MissingSymbolIsUnavailable(argv[2], "real_gamemode_request_end"); + SessionOverTheClient(fixture); + } catch (const std::exception& error) { + std::cerr << "host performance game mode: " << error.what() << "\n"; + return 1; + } + std::cout << "host performance game mode passed\n"; + return 0; +} diff --git a/core/libs/tests/HostPerformanceMacActivity.cpp b/core/libs/tests/HostPerformanceMacActivity.cpp new file mode 100644 index 000000000000..fefad3e9b4ba --- /dev/null +++ b/core/libs/tests/HostPerformanceMacActivity.cpp @@ -0,0 +1,132 @@ +#include "prx/libkernel/System/include/MacActivity.hpp" +#include +#include +#include +#include +#include + +namespace { + +using namespace HostPerformance; + +void Require(bool condition, const std::string& message) { + if (!condition) throw std::runtime_error(message); +} + +bool Contains(const std::string& text, const std::string& part) { + return text.find(part) != std::string::npos; +} + +struct Fixture { + void* Handle = nullptr; + const char* (*Events)() = nullptr; + int (*PoolDepth)() = nullptr; + int (*Pools)() = nullptr; + + explicit Fixture(const std::string& path) { + Handle = dlopen(path.c_str(), RTLD_NOW | RTLD_LOCAL); + Require(Handle != nullptr, "cannot load the fixture " + path); + Events = reinterpret_cast(dlsym(Handle, "fixture_events")); + PoolDepth = reinterpret_cast(dlsym(Handle, "fixture_pool_depth")); + Pools = reinterpret_cast(dlsym(Handle, "fixture_pools")); + Require(Events != nullptr && PoolDepth != nullptr && Pools != nullptr, "the fixture lacks its accessors"); + } + + ~Fixture() { dlclose(Handle); } +}; + +std::string Expected(std::uint64_t options) { + char text[32]; + std::snprintf(text, sizeof(text), "%llx", static_cast(options)); + return std::string("begin:") + text + ":AnyPS5 title running"; +} + +void OptionsAreUserInitiatedAndLatencyCritical() { + Require(ActivityUserInitiated == 0x00FFFFFFULL, "NSActivityUserInitiated is 0x00FFFFFF, which includes the idle system sleep bit"); + Require(ActivityLatencyCritical == 0xFF00000000ULL, "NSActivityLatencyCritical is 0xFF00000000"); + Require((ActivityUserInitiated & ActivityLatencyCritical) == 0 && (ActivityUserInitiated & ActivityIdleSystemSleepDisabled) != 0, "the two option sets must not overlap"); +} + +void ActivityIsBegunRetainedAndEndedOnce(const std::string& path) { + Fixture fixture(path); + { + MacActivity activity({path, path}); + Require(activity.Begin().Result == Outcome::Started, "a runtime that returns an activity must start"); + Require(activity.Begin().Result == Outcome::Started, "a repeated begin must keep the activity"); + const std::string expected = Expected(ActivityUserInitiated | ActivityLatencyCritical) + ",retain"; + Require(fixture.Events() == expected, std::string("begin must start one retained activity with both options, saw ") + fixture.Events()); + activity.End(); + activity.End(); + Require(fixture.Events() == expected + ",end,release", std::string("end must end and release once, saw ") + fixture.Events()); + Require(fixture.PoolDepth() == 0, "every autorelease pool must be popped"); + } + Require(fixture.Pools() == 2, "begin and end must each use one autorelease pool"); +} + +void DestructorEndsAHeldActivity(const std::string& path) { + Fixture fixture(path); + const std::string before = fixture.Events(); + { + MacActivity activity({path, path}); + activity.Begin(); + } + Require(std::string(fixture.Events()).size() > before.size() && Contains(fixture.Events(), ",end,release"), "the destructor must end a held activity"); +} + +void MissingLibrariesAreUnavailable(const std::string& path, const std::string& missing) { + MacActivity noRuntime({missing, path}); + const auto first = noRuntime.Begin(); + Require(first.Result == Outcome::Unavailable && Contains(first.Detail, missing), "a missing runtime library must be unavailable and named"); + MacActivity noFoundation({path, missing}); + const auto second = noFoundation.Begin(); + Require(second.Result == Outcome::Unavailable && Contains(second.Detail, missing), "a missing Foundation must be unavailable and named"); +} + +void MissingPoolFunctionsAreUnavailable(const std::string& path) { + MacActivity activity({path, path}); + const auto begun = activity.Begin(); + Require(begun.Result == Outcome::Unavailable && Contains(begun.Detail, "autorelease pool"), "a runtime without pool functions must be unavailable"); +} + +void MissingClassIsUnavailableAndPoolBalanced(const std::string& path) { + Fixture fixture(path); + MacActivity activity({path, path}); + const auto begun = activity.Begin(); + Require(begun.Result == Outcome::Unavailable && Contains(begun.Detail, "NSProcessInfo"), "a runtime without NSProcessInfo must be unavailable"); + Require(fixture.PoolDepth() == 0, "a failed begin must still pop its pool"); + activity.End(); + Require(std::string(fixture.Events()).empty(), "nothing may be called on the activity that never began"); +} + +void NilActivityIsRefused(const std::string& path) { + Fixture fixture(path); + MacActivity activity({path, path}); + const auto begun = activity.Begin(); + Require(begun.Result == Outcome::Refused && Contains(begun.Detail, "beginActivityWithOptions"), "a nil activity must be refused"); + Require(fixture.PoolDepth() == 0, "a refused begin must still pop its pool"); + activity.End(); + Require(!Contains(fixture.Events(), "end"), "a refused activity must never be ended"); +} + +} + +int main(int argc, char** argv) { + if (argc != 6) { + std::cerr << "usage: host_performance_mac_activity_tests \n"; + return 2; + } + try { + OptionsAreUserInitiatedAndLatencyCritical(); + ActivityIsBegunRetainedAndEndedOnce(argv[1]); + DestructorEndsAHeldActivity(argv[1]); + MissingLibrariesAreUnavailable(argv[1], argv[5]); + MissingPoolFunctionsAreUnavailable(argv[4]); + MissingClassIsUnavailableAndPoolBalanced(argv[2]); + NilActivityIsRefused(argv[3]); + } catch (const std::exception& error) { + std::cerr << "host performance mac activity: " << error.what() << "\n"; + return 1; + } + std::cout << "host performance mac activity passed\n"; + return 0; +} diff --git a/core/libs/tests/HostPerformanceProcess.cpp b/core/libs/tests/HostPerformanceProcess.cpp new file mode 100644 index 000000000000..fd59efbc51e7 --- /dev/null +++ b/core/libs/tests/HostPerformanceProcess.cpp @@ -0,0 +1,87 @@ +#include "prx/libc/include/Shutdown.hpp" +#include "prx/libkernel/System/include/HostPerformance.hpp" +#include +#include +#include +#include +#include +#include + +namespace { + +using namespace HostPerformance; + +class PrintingBackend final : public IBackend { +public: + explicit PrintingBackend(Outcome outcome) : outcome(outcome) {} + const char* Name() const override { return "printing"; } + + BeginResult Begin() override { + std::puts("begin called"); + return {outcome, "scripted"}; + } + + void End() override { + std::puts("release ran at exit"); + std::fflush(stdout); + } + +private: + Outcome outcome; +}; + +int Fail(const char* message) { + std::fprintf(stderr, "host performance process: %s\n", message); + return 1; +} + +} + +int main(int argc, char** argv) { + if (argc != 2) return Fail("usage: host_performance_process_tests "); + const std::string name = argv[1]; + if (name == "exit" || name == "exit-without-handlers") { + if (StartProcessSession(Mode::On, std::make_unique(Outcome::Started)) == nullptr) return Fail("an on session must exist"); + std::fflush(stdout); + if (name == "exit") LibcExit_nid_no_patch(0); + LibcExitWithoutHandlers_nid_no_patch(0); + } + if (name == "refused") { + if (StartProcessSession(Mode::Auto, std::make_unique(Outcome::Refused)) == nullptr) return Fail("an auto session must exist"); + std::fflush(stdout); + LibcExit_nid_no_patch(0); + } + if (name == "off") { + if (StartProcessSession(Mode::Off, std::make_unique(Outcome::Started)) != nullptr) return Fail("an off session must not exist"); + std::puts("off left the backend alone"); + std::fflush(stdout); + LibcExit_nid_no_patch(0); + } + if (name == "twice") { + StartProcessSession(Mode::On, std::make_unique(Outcome::Started)); + try { + StartProcessSession(Mode::On, std::make_unique(Outcome::Started)); + } catch (const std::logic_error&) { + std::puts("second session refused"); + std::fflush(stdout); + LibcExit_nid_no_patch(0); + } + return Fail("a second session must be refused"); + } + if (name == "environment") { + const char* value = std::getenv("APS5_GAME_MODE"); + try { + StartFromEnvironment(); + } catch (const std::invalid_argument& error) { + if (value != nullptr && std::strcmp(value, "bogus") == 0 && std::string(error.what()).find("APS5_GAME_MODE=bogus") != std::string::npos) { + std::puts("invalid value rejected by name"); + return 0; + } + return Fail(error.what()); + } + if (value != nullptr && std::strcmp(value, "bogus") == 0) return Fail("an invalid value must be rejected"); + std::puts("environment accepted"); + return 0; + } + return Fail("unknown case"); +} diff --git a/core/libs/tests/HostPerformanceSession.cpp b/core/libs/tests/HostPerformanceSession.cpp new file mode 100644 index 000000000000..026fc522d4b6 --- /dev/null +++ b/core/libs/tests/HostPerformanceSession.cpp @@ -0,0 +1,164 @@ +#include "prx/libkernel/System/include/HostPerformance.hpp" +#include +#include +#include +#include +#include + +namespace { + +using namespace HostPerformance; + +void Require(bool condition, const std::string& message) { + if (!condition) throw std::runtime_error(message); +} + +class FakeBackend final : public IBackend { +public: + BeginResult Next{Outcome::Started, {}}; + bool ThrowOnBegin = false; + bool ThrowOnEnd = false; + int Begins = 0; + int Ends = 0; + + const char* Name() const override { return "fake"; } + + BeginResult Begin() override { + ++Begins; + if (ThrowOnBegin) throw std::runtime_error("begin exploded"); + return Next; + } + + void End() override { + ++Ends; + if (ThrowOnEnd) throw std::runtime_error("end exploded"); + } +}; + +struct Harness { + FakeBackend Backend; + std::vector Lines; + Session Make(Mode mode) { + return Session(mode, Backend, [this](const std::string& line) { Lines.push_back(line); }); + } +}; + +void ParsingKeepsTheDefaultOff() { + for (const char* text : {static_cast(nullptr), "", "off"}) Require(ParseMode(text) == Mode::Off, "APS5_GAME_MODE unset, empty or off must leave the host alone"); + Require(ParseMode("on") == Mode::On, "APS5_GAME_MODE=on must request game mode"); + Require(ParseMode("auto") == Mode::Auto, "APS5_GAME_MODE=auto must request game mode only when available"); + for (const char* text : {"1", "0", "ON", "Auto", " on", "yes", "true", "off "}) { + bool threw = false; + try { + static_cast(ParseMode(text)); + } catch (const std::invalid_argument& error) { + threw = std::string(error.what()).find("APS5_GAME_MODE=") != std::string::npos; + } + Require(threw, std::string("APS5_GAME_MODE=") + text + " must be rejected with an error naming the variable"); + } +} + +void OffNeverTouchesTheBackend() { + Harness harness; + auto session = harness.Make(Mode::Off); + Require(session.Start() == State::Off, "off must report the off state"); + session.Stop(); + Require(harness.Backend.Begins == 0 && harness.Backend.Ends == 0, "off must not call the backend"); + Require(harness.Lines.empty(), "off must log nothing"); +} + +void StartedIsReleasedOnceAndStartedOnce() { + for (const Mode mode : {Mode::On, Mode::Auto}) { + Harness harness; + auto session = harness.Make(mode); + Require(session.Start() == State::Active, "a started request must be active"); + Require(session.Start() == State::Active, "a second start must keep the state"); + Require(harness.Backend.Begins == 1, "start must reach the backend once"); + Require(harness.Lines.size() == 1, "a started request must log once"); + session.Stop(); + session.Stop(); + Require(session.Current() == State::Ended, "stop must end an active request"); + Require(harness.Backend.Ends == 1, "stop must release exactly once"); + Require(session.Start() == State::Ended, "a stopped session must not start again"); + Require(harness.Backend.Begins == 1, "a stopped session must not reach the backend again"); + } +} + +void UnavailableIsQuietInAutoAndLoggedInOn() { + Harness automatic; + automatic.Backend.Next = {Outcome::Unavailable, "no library"}; + auto autoSession = automatic.Make(Mode::Auto); + Require(autoSession.Start() == State::Unavailable, "auto must report an unavailable backend"); + Require(automatic.Lines.empty(), "auto must stay silent when the backend is unavailable"); + autoSession.Stop(); + Require(automatic.Backend.Ends == 0, "an unavailable backend must never be released"); + + Harness forced; + forced.Backend.Next = {Outcome::Unavailable, "no library"}; + auto onSession = forced.Make(Mode::On); + onSession.Start(); + onSession.Start(); + Require(forced.Lines.size() == 1 && forced.Lines[0].find("no library") != std::string::npos, "on must log an unavailable backend once with its reason"); +} + +void RefusalIsLoggedOnceInBothModes() { + for (const Mode mode : {Mode::On, Mode::Auto}) { + Harness harness; + harness.Backend.Next = {Outcome::Refused, "daemon not running"}; + auto session = harness.Make(mode); + Require(session.Start() == State::Refused, "a refused request must report the refused state"); + session.Start(); + session.Stop(); + Require(harness.Lines.size() == 1 && harness.Lines[0].find("daemon not running") != std::string::npos, "a refusal must be logged once with its reason"); + Require(harness.Backend.Ends == 0, "a refused request must never be released"); + } +} + +void ThrowingBackendsAreContained() { + Harness harness; + harness.Backend.ThrowOnBegin = true; + auto session = harness.Make(Mode::On); + Require(session.Start() == State::Refused, "a throwing begin must count as a refusal"); + Require(harness.Lines.size() == 1 && harness.Lines[0].find("begin exploded") != std::string::npos, "a throwing begin must log its message"); + + Harness releasing; + releasing.Backend.ThrowOnEnd = true; + auto active = releasing.Make(Mode::On); + active.Start(); + active.Stop(); + Require(active.Current() == State::Ended, "a throwing end must still end the session"); + Require(releasing.Lines.size() == 2 && releasing.Lines[1].find("end exploded") != std::string::npos, "a throwing end must be logged"); +} + +void ConcurrentStartsReachTheBackendOnce() { + Harness harness; + auto session = harness.Make(Mode::On); + std::vector threads; + for (int index = 0; index < 8; ++index) { + threads.emplace_back([&] { + session.Start(); + session.Stop(); + }); + } + for (auto& thread : threads) thread.join(); + Require(harness.Backend.Begins == 1 && harness.Backend.Ends == 1, "concurrent start and stop must reach the backend once each"); +} + +} + +int main() { + try { + ParsingKeepsTheDefaultOff(); + OffNeverTouchesTheBackend(); + StartedIsReleasedOnceAndStartedOnce(); + UnavailableIsQuietInAutoAndLoggedInOn(); + RefusalIsLoggedOnceInBothModes(); + ThrowingBackendsAreContained(); + ConcurrentStartsReachTheBackendOnce(); + } catch (const std::exception& error) { + std::cerr << "host performance session: " << error.what() << "\n"; + return 1; + } + std::cout << "host performance session passed\n"; + return 0; +} diff --git a/core/libs/tests/JxrStream.cpp b/core/libs/tests/JxrStream.cpp index 7cf587da0ce6..066f187541ec 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/KernelError.cpp b/core/libs/tests/KernelError.cpp index d0c1aa0bac07..30a660085034 100644 --- a/core/libs/tests/KernelError.cpp +++ b/core/libs/tests/KernelError.cpp @@ -23,6 +23,10 @@ int main() { } Require(SCE_KERNEL_ERROR_ENOTRECOVERABLE == static_cast(0x8002005fu)); Require(SCE_KERNEL_ERROR_EOWNERDEAD == static_cast(0x80020060u)); + Require(SCE_KERNEL_ERROR_ELAST == SCE_KERNEL_ERROR_EOWNERDEAD); + Require(SCE_KERNEL_ERROR_ELAST == static_cast(0x80020060u)); + Require(SCE_KERNEL_ERROR_EWOULDBLOCK == SCE_KERNEL_ERROR_EAGAIN); + Require(SCE_KERNEL_ERROR_ENOTSUP == SCE_KERNEL_ERROR_EOPNOTSUPP); Require(sceKernelError(-1) == static_cast(0x8001ffffu)); Require(sceKernelError(std::numeric_limits::max()) == 0x1ffff); Require(sceKernelError(std::numeric_limits::min()) == 0x20000); diff --git a/core/libs/tests/LogFile.cpp b/core/libs/tests/LogFile.cpp new file mode 100644 index 000000000000..5715be317038 --- /dev/null +++ b/core/libs/tests/LogFile.cpp @@ -0,0 +1,493 @@ +#include "prx/libc/include/LogFile.hpp" +#include "prx/libc/include/Shutdown.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern char** environ; + +namespace { + +using namespace log_file; + +std::string g_self; +std::filesystem::path g_directory; +int g_failures = 0; + +void Require(bool value, const char* what) { + if (value) return; + std::fprintf(stderr, "log file test failed: %s\n", what); + std::exit(1); +} + +std::string Slurp(const std::filesystem::path& path) { + std::ifstream stream(path, std::ios::binary); + return std::string(std::istreambuf_iterator(stream), std::istreambuf_iterator()); +} + +std::string Drain(Handle read) { + std::string text; + char buffer[4096]; + for (;;) { + const long count = ReadAvailable(read, buffer, sizeof(buffer)); + if (count <= 0) return text; + text.append(buffer, static_cast(count)); + } +} + +struct Rig { + Pipe output; + Pipe errors; + Pipe terminalOutput; + Pipe terminalError; + Handle file = NoHandle; + std::filesystem::path path; + std::unique_ptr tee; + std::mutex outputWrites; + std::mutex errorWrites; + + explicit Rig(const std::string& name, bool terminals = true, bool start = true) { + path = g_directory / name; + std::string error; + Require(MakePipe(output, error) && MakePipe(errors, error), "source pipes"); + Require(MakePipe(terminalOutput, error) && MakePipe(terminalError, error), "terminal pipes"); + Require(OpenAppend(path.string(), file, error), "log file"); + tee = std::make_unique(file, terminals ? terminalOutput.write : NoHandle, terminals ? terminalError.write : NoHandle, output.read, errors.read); + if (start) tee->Start(); + } + + void Write(int standard, const std::string& text) { + const std::lock_guard hold(standard == StandardOutput ? outputWrites : errorWrites); + Require(WriteAll(standard == StandardOutput ? output.write : errors.write, text.data(), text.size()), "source write"); + } + + ~Rig() { + tee.reset(); + for (const Handle handle : {output.read, output.write, errors.read, errors.write, terminalOutput.read, terminalOutput.write, terminalError.read, terminalError.write, file}) Close(handle); + } +}; + +void OrderAndTerminal() { + Rig rig("order.log"); + rig.Write(StandardOutput, "one\n"); + rig.Write(StandardOutput, "two\n"); + rig.Write(StandardOutput, "three\n"); + rig.tee->Stop(); + Require(Slurp(rig.path) == "one\ntwo\nthree\n", "the file lacks the lines or their order"); + Require(Drain(rig.terminalOutput.read) == "one\ntwo\nthree\n", "the terminal lacks the lines"); + Require(Drain(rig.terminalError.read).empty(), "standard error shows standard output text"); +} + +void BothStreams() { + Rig rig("both.log", true, false); + rig.Write(StandardOutput, "out one\n"); + Require(rig.tee->Flush(false), "flush"); + rig.Write(StandardError, "err one\n"); + Require(rig.tee->Flush(false), "flush"); + rig.Write(StandardOutput, "out two\n"); + Require(rig.tee->Flush(false), "flush"); + Require(Slurp(rig.path) == "out one\nerr one\nout two\n", "the streams are not in arrival order in the file"); + Require(Drain(rig.terminalOutput.read) == "out one\nout two\n", "standard output on the terminal differs"); + Require(Drain(rig.terminalError.read) == "err one\n", "standard error on the terminal differs"); +} + +void LinesStayWholeAcrossStreams() { + Rig rig("whole.log", true, false); + rig.Write(StandardOutput, "AAA"); + rig.tee->Flush(false); + rig.Write(StandardError, "BBB\n"); + rig.tee->Flush(false); + rig.Write(StandardOutput, "CCC\n"); + rig.tee->Flush(false); + Require(Slurp(rig.path) == "BBB\nAAACCC\n", "a line of one stream was split by a line of the other"); + Require(Drain(rig.terminalOutput.read) == "AAACCC\n", "the terminal copy of a partial line differs"); +} + +void ConcurrentWriters() { + Rig rig("concurrent.log", false); + constexpr int Writers = 6; + constexpr int PerWriter = 400; + std::vector threads; + for (int writer = 0; writer < Writers; ++writer) { + threads.emplace_back([&rig, writer] { + for (int index = 0; index < PerWriter; ++index) { + char line[3100]; + const int head = std::snprintf(line, sizeof(line), "w%d n%d ", writer, index); + std::memset(line + head, 'a' + writer, 3000); + line[head + 3000] = '\n'; + rig.Write(writer % 2 == 0 ? StandardOutput : StandardError, std::string(line, static_cast(head) + 3001)); + } + }); + } + for (auto& thread : threads) thread.join(); + rig.tee->Stop(); + std::istringstream lines(Slurp(rig.path)); + std::vector next(Writers, 0); + std::string line; + int total = 0; + while (std::getline(lines, line)) { + int writer = -1; + int index = -1; + int head = 0; + Require(std::sscanf(line.c_str(), "w%d n%d %n", &writer, &index, &head) == 2 && writer >= 0 && writer < Writers, "a line of the file has no writer header"); + Require(line.size() == static_cast(head) + 3000 && line.find_first_not_of(static_cast('a' + writer), static_cast(head)) == std::string::npos, "a line of the file mixes bytes of two writers"); + Require(index == next[static_cast(writer)]++, "the lines of one writer are out of order"); + ++total; + } + Require(total == Writers * PerWriter, "lines are missing from the file"); +} + +void CrashWriteReachesFile() { + Rig rig("crash.log", true, false); + rig.Write(StandardOutput, "before one\n"); + rig.Write(StandardError, "before two\n"); + rig.Write(StandardOutput, "unfinished"); + rig.tee->CrashWrite(StandardError, "CRASH report\n", 13); + Require(Slurp(rig.path) == "before one\nunfinished\nbefore two\nCRASH report\n", "the pending lines or the crash report are not in the file in order"); + Require(Drain(rig.terminalError.read) == "before two\nCRASH report\n", "the crash report did not reach the terminal"); + Require(Drain(rig.terminalOutput.read) == "before one\nunfinished", "the pending output did not reach the terminal"); +} + +void CrashWriteWithTeeThreadsRunning() { + Rig rig("crash-running.log"); + for (int index = 0; index < 200; ++index) rig.Write(StandardError, "pending " + std::to_string(index) + "\n"); + rig.tee->CrashWrite(StandardError, "CRASH\n", 6); + const std::string text = Slurp(rig.path); + Require(text.size() > 6 && text.compare(text.size() - 6, 6, "CRASH\n") == 0, "the crash line is not last in the file"); + Require(text.find("pending 199\n") != std::string::npos && text.find("pending 0\n") == 0, "pending lines are missing before the crash line"); +} + +void PartialLineAtExit() { + Rig rig("partial.log"); + rig.Write(StandardOutput, "whole\nno newline at the end"); + rig.tee->Stop(); + Require(Slurp(rig.path) == "whole\nno newline at the end\n", "a line without a newline was not flushed at the end"); + Require(Drain(rig.terminalOutput.read) == "whole\nno newline at the end", "the terminal copy gained a newline"); +} + +void LongLines() { + Rig rig("long.log", false); + const std::string line(300000, 'x'); + rig.Write(StandardOutput, line + "\n"); + const std::string huge(Tee::CarryBytes + 12345, 'y'); + std::thread writer([&] { rig.Write(StandardError, huge + "\n"); }); + std::string terminal; + writer.join(); + rig.tee->Stop(); + const std::string text = Slurp(rig.path); + Require(text.size() == line.size() + huge.size() + 2, "a long line changed size in the file"); + Require(text.find(line + "\n") != std::string::npos && text.find(huge + "\n") != std::string::npos, "a long line is not whole in the file"); +} + +void AppendKeepsEarlierRuns() { + const auto path = g_directory / "append.log"; + for (const char* text : {"first run\n", "second run\n"}) { + Handle file = NoHandle; + std::string error; + Require(OpenAppend(path.string(), file, error), "open for appending"); + Require(WriteAll(file, text, std::strlen(text)), "append write"); + Close(file); + } + Require(Slurp(path) == "first run\nsecond run\n", "opening the file again did not append"); +} + +void RelativePathUsesWorkingDirectory() { + const auto previous = std::filesystem::current_path(); + std::filesystem::current_path(g_directory); + Handle file = NoHandle; + std::string error; + const bool opened = OpenAppend("relative.log", file, error); + std::filesystem::current_path(previous); + Require(opened, "open a relative path"); + Close(file); + Require(std::filesystem::exists(g_directory / "relative.log"), "a relative path was not resolved against the working directory"); +} + +void UnopenablePath() { + std::string error; + const std::string path = (g_directory / "missing-directory" / "x.log").string(); + Require(StartFromValue(path.c_str(), SystemFactory(), error) == nullptr, "an unopenable path started a session"); + Require(error.find("ANYPS5_LOG_FILE") != std::string::npos, "the error does not name ANYPS5_LOG_FILE"); + Require(error.find(path) != std::string::npos, "the error does not name the path"); + Require(error.find("No such file or directory") != std::string::npos && error.find("errno 2") != std::string::npos, "the error does not carry the operating system error"); + const std::string directory = g_directory.string(); + error.clear(); + Require(StartFromValue(directory.c_str(), SystemFactory(), error) == nullptr && error.find("Is a directory") != std::string::npos, "a directory was accepted as the log file"); +} + +class CountingFactory final : public Factory { +public: + int created = 0; + std::unique_ptr Create(const std::string&, std::string& error) override { + ++created; + error = "counted"; + return nullptr; + } +}; + +int OpenDescriptors() { + int count = 0; + for (int descriptor = 0; descriptor < 1024; ++descriptor) count += ::fcntl(descriptor, F_GETFD) != -1; + return count; +} + +void UnsetCreatesNothing() { + CountingFactory factory; + const int before = OpenDescriptors(); + std::string error = "stale"; + Require(StartFromValue(nullptr, factory, error) == nullptr && error.empty(), "an unset variable started a session"); + Require(StartFromValue("", factory, error) == nullptr && error.empty(), "an empty variable started a session"); + Require(factory.created == 0, "an unset or empty variable reached the factory"); + Require(OpenDescriptors() == before, "an unset variable opened a descriptor"); + Require(StartFromValue("x.log", factory, error) == nullptr && factory.created == 1 && error == "counted", "a set variable did not reach the factory"); +} + +void BrokenTerminalKeepsFile() { + std::signal(SIGPIPE, SIG_IGN); + Rig rig("terminal-closed.log"); + Close(rig.terminalOutput.read); + rig.terminalOutput.read = NoHandle; + rig.Write(StandardOutput, "still logged\n"); + rig.Write(StandardOutput, "and again\n"); + rig.tee->Stop(); + Require(Slurp(rig.path) == "still logged\nand again\n", "a closed terminal stopped the file"); +} + +void MissingTerminalKeepsFile() { + Rig rig("terminal-absent.log", false); + rig.Write(StandardOutput, "file only\n"); + rig.Write(StandardError, "also file only\n"); + rig.tee->Stop(); + Require(Slurp(rig.path) == "file only\nalso file only\n", "an absent terminal stopped the file"); +} + +void FullDiskKeepsTerminal() { + Pipe output; + Pipe errors; + Pipe terminalOutput; + Pipe terminalError; + std::string error; + Require(MakePipe(output, error) && MakePipe(errors, error) && MakePipe(terminalOutput, error) && MakePipe(terminalError, error), "pipes"); + const int full = ::open("/dev/full", O_WRONLY); + if (full < 0) return; + { + Tee tee(full, terminalOutput.write, terminalError.write, output.read, errors.read); + tee.Start(); + const std::string line = "after the disk is full\n"; + Require(WriteAll(output.write, line.data(), line.size()), "source write"); + tee.Stop(); + Require(tee.FileFailed(), "a failed file write was not recorded"); + } + Require(Drain(terminalOutput.read) == "after the disk is full\n", "the terminal lost output after the file failed"); + const std::string notice = Drain(terminalError.read); + Require(notice.find("ANYPS5_LOG_FILE") != std::string::npos && notice.find("can no longer be written") != std::string::npos, "the failure was not reported once on the terminal"); + for (const Handle handle : {output.read, output.write, errors.read, errors.write, terminalOutput.read, terminalOutput.write, terminalError.read, terminalError.write}) Close(handle); + ::close(full); +} + +struct Result { + std::string out; + std::string err; + int status = -1; +}; + +Result Run(const std::string& role, const std::string& variable, bool set = true) { + Pipe out; + Pipe err; + std::string error; + Require(MakePipe(out, error) && MakePipe(err, error), "child pipes"); + posix_spawn_file_actions_t actions; + posix_spawn_file_actions_init(&actions); + posix_spawn_file_actions_adddup2(&actions, static_cast(out.write), 1); + posix_spawn_file_actions_adddup2(&actions, static_cast(err.write), 2); + std::vector environment; + for (char** entry = environ; *entry != nullptr; ++entry) { + if (std::strncmp(*entry, "ANYPS5_LOG_FILE=", 16) != 0) environment.emplace_back(*entry); + } + if (set) environment.push_back("ANYPS5_LOG_FILE=" + variable); + std::vector pointers; + for (auto& entry : environment) pointers.push_back(entry.data()); + pointers.push_back(nullptr); + std::string self = g_self; + std::string argument = "--child"; + std::string roleCopy = role; + char* arguments[] = {self.data(), argument.data(), roleCopy.data(), nullptr}; + pid_t child = 0; + Require(posix_spawn(&child, g_self.c_str(), &actions, nullptr, arguments, pointers.data()) == 0, "spawn the child"); + posix_spawn_file_actions_destroy(&actions); + Close(out.write); + Close(err.write); + Result result; + bool open[2] = {true, true}; + const int descriptors[2] = {static_cast(out.read), static_cast(err.read)}; + const auto deadline = std::chrono::steady_clock::now() + std::chrono::seconds(20); + while ((open[0] || open[1]) && std::chrono::steady_clock::now() < deadline) { + pollfd requests[2] = {{open[0] ? descriptors[0] : -1, POLLIN, 0}, {open[1] ? descriptors[1] : -1, POLLIN, 0}}; + ::poll(requests, 2, 100); + for (int index = 0; index < 2; ++index) { + if (!open[index]) continue; + char buffer[4096]; + const ssize_t count = ::read(descriptors[index], buffer, sizeof(buffer)); + if (count > 0) (index == 0 ? result.out : result.err).append(buffer, static_cast(count)); + else if (count == 0) open[index] = false; + } + } + if (open[0] || open[1]) std::fprintf(stderr, "role %s open %d %d\n", role.c_str(), open[0], open[1]); + Require(!open[0] && !open[1], "the child kept its streams open"); + ::waitpid(child, &result.status, 0); + Close(out.read); + Close(err.read); + return result; +} + +int ThreadCount() { + int count = 0; + std::error_code error; + for (const auto& entry : std::filesystem::directory_iterator("/proc/self/task", error)) { + static_cast(entry); + ++count; + } + return count; +} + +int ChildMain(const std::string& role) { + if (role == "threads") { + std::printf("threads=%d\n", ThreadCount()); + return 0; + } + if (role == "plain") { + std::printf("stdout line\n"); + std::fprintf(stderr, "stderr line\n"); + std::fflush(stdout); + return 0; + } + if (role == "partial") { + std::printf("stdout without a newline"); + return 0; + } + if (role == "hard") { + std::fprintf(stderr, "written just before the end\n"); + LogFileFlush_nid_no_patch(); + _exit(3); + } + if (role == "crash") { + std::fprintf(stderr, "line before the crash\n"); + const char report[] = "FATAL: simulated crash report\n"; + log_file::CrashWrite(StandardError, report, sizeof(report) - 1); + _exit(4); + } + if (role == "exec") { + std::fprintf(stderr, "line before the exec\n"); + LogFileRelease_nid_no_patch(); + execl("/bin/sh", "sh", "-c", "echo from the replacement; echo from the replacement on stderr >&2", static_cast(nullptr)); + return 9; + } + return 2; +} + +void ChildProcesses() { + const auto path = g_directory / "child.log"; + const auto clear = [&] { std::filesystem::remove(path); }; + + clear(); + Result plain = Run("plain", path.string()); + Require(plain.status == 0, "the child failed"); + Require(plain.out == "stdout line\n" && plain.err == "stderr line\n", "the terminal output of a child changed"); + const std::string logged = Slurp(path); + Require(logged.find("stdout line\n") != std::string::npos && logged.find("stderr line\n") != std::string::npos, "the child's lines are not in the file"); + + clear(); + Result partial = Run("partial", path.string()); + Require(partial.status == 0 && partial.out == "stdout without a newline", "the partial line changed on the terminal"); + Require(Slurp(path).find("stdout without a newline\n") != std::string::npos, "a partial line was lost at a normal exit"); + + clear(); + Result hard = Run("hard", path.string()); + Require(WIFEXITED(hard.status) && WEXITSTATUS(hard.status) == 3 && hard.err == "written just before the end\n", "the abrupt child differs"); + Require(Slurp(path).find("written just before the end\n") != std::string::npos, "a line written before _exit is not in the file"); + + clear(); + Result crash = Run("crash", path.string()); + Require(WIFEXITED(crash.status) && WEXITSTATUS(crash.status) == 4, "the crashing child differs"); + Require(crash.err == "line before the crash\nFATAL: simulated crash report\n", "the crash text did not reach the terminal in order"); + Require(Slurp(path).find("line before the crash\nFATAL: simulated crash report\n") != std::string::npos, "the crash text did not reach the file in order"); + + clear(); + Result replaced = Run("exec", path.string()); + Require(replaced.status == 0, "the replacement failed or was killed by a broken pipe"); + Require(replaced.out == "from the replacement\n" && replaced.err == "line before the exec\nfrom the replacement on stderr\n", "the output around the replacement did not reach the terminal"); + const std::string execLog = Slurp(path); + Require(execLog.find("line before the exec\n") != std::string::npos && execLog.find("from the replacement") == std::string::npos, "the file holds the replacement's output or lacks the earlier line"); + + clear(); + Result bad = Run("plain", (g_directory / "no-such-directory" / "x.log").string()); + Require(WIFEXITED(bad.status) && WEXITSTATUS(bad.status) == 1, "an unopenable path did not stop the process"); + Require(bad.err.find("ANYPS5_LOG_FILE") != std::string::npos && bad.err.find("No such file or directory") != std::string::npos && bad.out.empty(), "the startup error differs"); + + clear(); + Result unset = Run("plain", "", false); + Require(unset.out == "stdout line\n" && unset.err == "stderr line\n" && !std::filesystem::exists(path), "an unset variable changed the output or created a file"); + Result emptied = Run("plain", "", true); + Require(emptied.out == "stdout line\n" && emptied.err == "stderr line\n", "an empty variable changed the output"); + + if (std::filesystem::exists("/proc/self/task")) { + const auto count = [&](bool set) { + const Result result = Run("threads", path.string(), set); + int threads = -1; + Require(std::sscanf(result.out.c_str(), "threads=%d", &threads) == 1, "the thread count line"); + return threads; + }; + const int without = count(false); + const int with = count(true); + Require(with == without + 2, "enabling the log did not add exactly the two copy threads"); + clear(); + } +} + +} + +int main(int argc, char** argv) { + g_self = argv[0]; + if (argc == 3 && std::string(argv[1]) == "--child") return ChildMain(argv[2]); + Require(argc == 1, "unexpected argument"); + char pattern[] = "/tmp/anyps5-log-file-XXXXXX"; + Require(::mkdtemp(pattern) != nullptr, "temporary directory"); + g_directory = pattern; + OrderAndTerminal(); + BothStreams(); + LinesStayWholeAcrossStreams(); + ConcurrentWriters(); + CrashWriteReachesFile(); + CrashWriteWithTeeThreadsRunning(); + PartialLineAtExit(); + LongLines(); + AppendKeepsEarlierRuns(); + RelativePathUsesWorkingDirectory(); + UnopenablePath(); + UnsetCreatesNothing(); + BrokenTerminalKeepsFile(); + MissingTerminalKeepsFile(); + FullDiskKeepsTerminal(); + ChildProcesses(); + std::error_code ignored; + std::filesystem::remove_all(g_directory, ignored); + return g_failures; +} diff --git a/core/libs/tests/MsgDialogParam.cpp b/core/libs/tests/MsgDialogParam.cpp new file mode 100644 index 000000000000..65c3edab2b76 --- /dev/null +++ b/core/libs/tests/MsgDialogParam.cpp @@ -0,0 +1,79 @@ +#include "prx/libSceMsgDialog/include/MsgDialogParam.hpp" +#include +#include +#include +#include + +namespace { + +void Require(bool value, const char* what) { + if (!value) { + std::fprintf(stderr, "msg_dialog_param: %s\n", what); + std::abort(); + } +} + +struct UserMessage { + std::int32_t buttonType; + std::int32_t pad; + const char* message; +}; + +struct Param { + std::uint8_t bytes[MsgDialog::ParamBytes] = {}; + + void setMode(std::int32_t mode) { std::memcpy(bytes + 0x38, &mode, 4); } + void setUserMessage(const UserMessage* user) { std::memcpy(bytes + 0x40, &user, 8); } +}; + +} + +int main() { + Require(!MsgDialog::ParseParam(nullptr).hasUserMessage, "a null parameter has a user message"); + Require(MsgDialog::ParseParam(nullptr).mode == MsgDialog::ModeUserMsg, "a null parameter is not a user message"); + + Param empty; + auto parsed = MsgDialog::ParseParam(&empty); + Require(parsed.mode == MsgDialog::ModeUserMsg, "mode 0 is not treated as a user message"); + Require(!parsed.hasUserMessage && !parsed.hasText, "a null user message pointer was read"); + + Param outOfRange; + outOfRange.setMode(9); + Require(MsgDialog::ParseParam(&outOfRange).mode == MsgDialog::ModeUserMsg, "mode 9 is not treated as a user message"); + + for (const int mode : {MsgDialog::ModeProgressBar, MsgDialog::ModeSystemMsg}) { + UserMessage user{MsgDialog::ButtonTypeYesNo, 0, "ignored"}; + Param other; + other.setMode(mode); + other.setUserMessage(&user); + parsed = MsgDialog::ParseParam(&other); + Require(parsed.mode == mode, "the mode was not kept"); + Require(!parsed.hasUserMessage && !parsed.hasText, "a user message was read for another mode"); + } + + UserMessage user{MsgDialog::ButtonTypeYesNoFocusNo, 0, "Overwrite the save?\nThis cannot be undone."}; + Param param; + param.setMode(MsgDialog::ModeUserMsg); + param.setUserMessage(&user); + parsed = MsgDialog::ParseParam(¶m); + Require(parsed.mode == MsgDialog::ModeUserMsg, "user message mode"); + Require(parsed.hasUserMessage && parsed.hasText, "user message not read"); + Require(parsed.buttonType == MsgDialog::ButtonTypeYesNoFocusNo, "button type"); + Require(parsed.text == "Overwrite the save?\nThis cannot be undone.", "message text"); + + UserMessage noText{MsgDialog::ButtonTypeOkCancel, 0, nullptr}; + param.setUserMessage(&noText); + parsed = MsgDialog::ParseParam(¶m); + Require(parsed.hasUserMessage && !parsed.hasText, "a null message pointer was read"); + Require(parsed.buttonType == MsgDialog::ButtonTypeOkCancel, "button type without a message"); + + static char longText[MsgDialog::MaxMessageBytes + 64]; + std::memset(longText, 'a', sizeof(longText) - 1); + UserMessage longMessage{MsgDialog::ButtonTypeOk, 0, longText}; + param.setUserMessage(&longMessage); + Require(MsgDialog::ParseParam(¶m).text.size() == MsgDialog::MaxMessageBytes, "a long message was not capped"); + + const std::string logged = MsgDialog::LogText(std::string("a\tb\nc") + std::string(200, 'x')); + Require(logged.size() == 160, "the logged text is not capped at 160"); + Require(logged.compare(0, 5, "a?b\nc") == 0, "control characters are not masked in the log"); +} diff --git a/core/libs/tests/MsgDialogRequest.cpp b/core/libs/tests/MsgDialogRequest.cpp new file mode 100644 index 000000000000..3dca563e6f91 --- /dev/null +++ b/core/libs/tests/MsgDialogRequest.cpp @@ -0,0 +1,63 @@ +#include "prx/libSceMsgDialog/include/MsgDialogRequest.hpp" +#include +#include + +namespace { + +void Require(bool value, const char* what) { + if (!value) { + std::fprintf(stderr, "msg_dialog_request: %s\n", what); + std::abort(); + } +} + +MsgDialog::ParsedParam Parsed(int buttonType, const char* text = "Question?") { + MsgDialog::ParsedParam parsed; + parsed.hasUserMessage = true; + parsed.hasText = true; + parsed.buttonType = buttonType; + parsed.text = text; + return parsed; +} + +} + +int main() { + ModalDialogRequest request; + Require(MsgDialog::BuildRequest(Parsed(MsgDialog::ButtonTypeOk), request), "OK was refused"); + Require(request.message == u"Question?" && request.buttons.size() == 1 && request.buttons[0] == u"OK", "OK buttons"); + Require(request.focus == 0 && request.cancel == 0, "OK focus and cancel"); + + Require(MsgDialog::BuildRequest(Parsed(MsgDialog::ButtonTypeYesNo), request), "Yes and No was refused"); + Require(request.buttons.size() == 2 && request.buttons[0] == u"Yes" && request.buttons[1] == u"No", "Yes and No buttons"); + Require(request.focus == 0 && request.cancel == 1, "Yes and No focus and cancel"); + + Require(MsgDialog::BuildRequest(Parsed(MsgDialog::ButtonTypeOkCancel), request), "OK and Cancel was refused"); + Require(request.buttons.size() == 2 && request.buttons[0] == u"OK" && request.buttons[1] == u"Cancel", "OK and Cancel buttons"); + Require(request.focus == 0 && request.cancel == 1, "OK and Cancel focus and cancel"); + + Require(MsgDialog::BuildRequest(Parsed(MsgDialog::ButtonTypeYesNoFocusNo), request), "Yes and No with focus on No was refused"); + Require(request.buttons.size() == 2 && request.focus == 1 && request.cancel == 1, "Yes and No with focus on No"); + + Require(MsgDialog::BuildRequest(Parsed(MsgDialog::ButtonTypeOk, "caf\xC3\xA9"), request) && request.message == u"café", "the message is not decoded"); + + const ModalDialogRequest kept = request; + Require(!MsgDialog::BuildRequest(Parsed(MsgDialog::ButtonTypeNone), request), "a dialog without buttons was presented"); + Require(!MsgDialog::BuildRequest(Parsed(5), request), "an unknown button type was presented"); + Require(!MsgDialog::BuildRequest(Parsed(-1), request), "a negative button type was presented"); + MsgDialog::ParsedParam progress = Parsed(MsgDialog::ButtonTypeOk); + progress.mode = MsgDialog::ModeProgressBar; + Require(!MsgDialog::BuildRequest(progress, request), "a progress bar was presented"); + MsgDialog::ParsedParam system = Parsed(MsgDialog::ButtonTypeOk); + system.mode = MsgDialog::ModeSystemMsg; + Require(!MsgDialog::BuildRequest(system, request), "a system message was presented"); + MsgDialog::ParsedParam noMessage = Parsed(MsgDialog::ButtonTypeOk); + noMessage.hasText = false; + Require(!MsgDialog::BuildRequest(noMessage, request), "a dialog without a message pointer was presented"); + MsgDialog::ParsedParam noUser = Parsed(MsgDialog::ButtonTypeOk); + noUser.hasUserMessage = false; + Require(!MsgDialog::BuildRequest(noUser, request), "a dialog without a user message was presented"); + Require(request.message == kept.message && request.buttons == kept.buttons && request.focus == kept.focus, "a refused request changed the output"); + + Require(MsgDialog::ButtonIdOf(0) == MsgDialog::ButtonIdOk && MsgDialog::ButtonIdOf(1) == MsgDialog::ButtonIdNo, "button ids"); +} diff --git a/core/libs/tests/MsgDialogText.cpp b/core/libs/tests/MsgDialogText.cpp new file mode 100644 index 000000000000..e9929b5fcfcb --- /dev/null +++ b/core/libs/tests/MsgDialogText.cpp @@ -0,0 +1,30 @@ +#include "prx/libSceMsgDialog/include/MsgDialogText.hpp" +#include +#include + +namespace { + +void Require(bool value, const char* what) { + if (!value) { + std::fprintf(stderr, "msg_dialog_text: %s\n", what); + std::abort(); + } +} + +} + +int main() { + Require(MsgDialog::DecodeUtf8("") == u"", "an empty string is not empty"); + Require(MsgDialog::DecodeUtf8("Save?\nYes") == u"Save?\nYes", "ASCII was changed"); + Require(MsgDialog::DecodeUtf8("\xC3\xA9") == u"é", "a two-byte sequence"); + Require(MsgDialog::DecodeUtf8("\xE2\x82\xAC") == u"€", "a three-byte sequence"); + Require(MsgDialog::DecodeUtf8("\xF0\x9F\x98\x80") == u"\U0001F600", "a four-byte sequence is not a surrogate pair"); + Require(MsgDialog::DecodeUtf8("\xFF") == u"�", "an invalid lead byte"); + Require(MsgDialog::DecodeUtf8("\x80") == u"�", "a stray continuation byte"); + Require(MsgDialog::DecodeUtf8("\xC0\x80") == u"��", "an overlong two-byte sequence"); + Require(MsgDialog::DecodeUtf8("\xE0\x80\x80") == u"���", "an overlong three-byte sequence"); + Require(MsgDialog::DecodeUtf8("\xED\xA0\x80") == u"���", "an encoded surrogate"); + Require(MsgDialog::DecodeUtf8("\xF4\x90\x80\x80") == u"����", "a code point past U+10FFFF"); + Require(MsgDialog::DecodeUtf8("a\xE2\x82") == u"a��", "a truncated sequence"); + Require(MsgDialog::DecodeUtf8("\xE2\x28\xA1") == u"�(�", "a broken continuation byte"); +} diff --git a/core/libs/tests/ObjcFixtureLibrary.cpp b/core/libs/tests/ObjcFixtureLibrary.cpp new file mode 100644 index 000000000000..e639c0e28039 --- /dev/null +++ b/core/libs/tests/ObjcFixtureLibrary.cpp @@ -0,0 +1,97 @@ +#include +#include +#include +#include +#include + +namespace { + +std::string events; +int poolDepth = 0; +int pools = 0; +char processInfoObject = 0; +char activityObject = 0; +char processInfoClass = 0; +char stringClass = 0; + +void Record(const std::string& event) { + if (!events.empty()) events += ","; + events += event; +} + +} + +extern "C" { + +void* objc_getClass(const char* name) { +#ifdef FIXTURE_NO_CLASS + static_cast(name); + return nullptr; +#else + if (std::strcmp(name, "NSProcessInfo") == 0) return &processInfoClass; + if (std::strcmp(name, "NSString") == 0) return &stringClass; + return nullptr; +#endif +} + +void* sel_registerName(const char* name) { + static std::map interned; + return const_cast(interned.emplace(name, name).first->second.c_str()); +} + +#ifndef FIXTURE_OMIT_POOL +void* objc_autoreleasePoolPush() { + ++poolDepth; + ++pools; + return &poolDepth; +} + +void objc_autoreleasePoolPop(void* pool) { + if (pool != &poolDepth) Record("bad-pool"); + --poolDepth; +} +#endif + +void* objc_msgSend(void* self, void* selector, void* first, void* second) { + const std::string name = static_cast(selector); + if (name == "processInfo") return self == &processInfoClass ? &processInfoObject : nullptr; + if (name == "stringWithUTF8String:") return self == &stringClass ? first : nullptr; + if (name == "beginActivityWithOptions:reason:") { + char text[32]; + std::snprintf(text, sizeof(text), "begin:%llx:", static_cast(reinterpret_cast(first))); + Record(text + std::string(static_cast(second))); +#ifdef FIXTURE_NIL_ACTIVITY + return nullptr; +#else + return &activityObject; +#endif + } + if (name == "retain") { + Record("retain"); + return self; + } + if (name == "release") { + Record("release"); + return nullptr; + } + if (name == "endActivity:") { + Record(self == &processInfoObject && first == &activityObject ? "end" : "end-wrong-target"); + return nullptr; + } + Record("unexpected:" + name); + return nullptr; +} + +const char* fixture_events() { + return events.c_str(); +} + +int fixture_pool_depth() { + return poolDepth; +} + +int fixture_pools() { + return pools; +} + +} diff --git a/core/libs/tests/ParamJsonParser.cpp b/core/libs/tests/ParamJsonParser.cpp index 8ec7173a5a26..a8da0a00de12 100644 --- a/core/libs/tests/ParamJsonParser.cpp +++ b/core/libs/tests/ParamJsonParser.cpp @@ -152,6 +152,7 @@ static void CheckLanguages(const std::filesystem::path& path) { static void CheckOutputPermission(const std::filesystem::path& path) { const std::string prefix = R"({"titleId":"PPSA99007","localizedParameters":{"en-US":{"titleName":"Example"}})"; Require(ParseText(path, prefix + "}").attribute3 == 0, "Absent output permission is not zero"); + Require(!ParseText(path, prefix + ",\"attribute\":8388608}").paramSfoAttribute, "param.json gave a param.sfo attribute"); for (const auto& [text, expected] : {std::pair{"0", 0u}, {"524352", 0x80040u}, {"4294967295", 0xFFFFFFFFu}}) { Require(ParseText(path, prefix + ",\"attribute3\":" + text + "}").attribute3 == expected, "Incorrect output permission"); } diff --git a/core/libs/tests/ParamSfoParser.cpp b/core/libs/tests/ParamSfoParser.cpp index d4f9ff1c1293..238a1e0fee86 100644 --- a/core/libs/tests/ParamSfoParser.cpp +++ b/core/libs/tests/ParamSfoParser.cpp @@ -98,8 +98,20 @@ int main() { Require(parsed.title == "Example" && parsed.titleId == "CUSA00000", "Incorrect title metadata"); Require(parsed.downloadDataSizeMiB == 64, "Incorrect download data size"); Require(parsed.userDefinedParams[0] == 23566 && parsed.userDefinedParams[1] == 0 && parsed.userDefinedParams[2] == -7 && parsed.userDefinedParams[3] == 0, "Incorrect user defined params"); + Require(parsed.paramSfoAttribute == 0u, "An absent ATTRIBUTE is not 0"); auto entries = Valid(); + entries.push_back(Integer("ATTRIBUTE", 0x00800000)); + Require(Parse(path, Build(entries)).paramSfoAttribute == 0x00800000u, "Incorrect ATTRIBUTE"); + entries.back() = Integer("ATTRIBUTE", -1); + Require(Parse(path, Build(entries)).paramSfoAttribute == 0xFFFFFFFFu, "ATTRIBUTE lost its high bit"); + entries.back() = Text("ATTRIBUTE", "8388608"); + Require(Parse(path, Build(entries)).paramSfoAttribute == 0u, "A text ATTRIBUTE was read as an integer"); + entries.back() = Integer("ATTRIBUTE", 0x00800000); + entries.back().data.pop_back(); + Rejects(path, Build(entries), "ATTRIBUTE is not a 32-bit integer"); + + entries = Valid(); entries.erase(entries.begin() + 2); Rejects(path, Build(entries), "missing TITLE"); entries = Valid(); diff --git a/core/libs/tests/PsnDialogNotice.cpp b/core/libs/tests/PsnDialogNotice.cpp new file mode 100644 index 000000000000..ca0ca2a5eea8 --- /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 000000000000..ca5ed31da651 --- /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 000000000000..67db2f803bfb --- /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/TextureFormatLookup.cpp b/core/libs/tests/TextureFormatLookup.cpp index 8838b9a95022..da6cbdc1d0f2 100644 --- a/core/libs/tests/TextureFormatLookup.cpp +++ b/core/libs/tests/TextureFormatLookup.cpp @@ -13,10 +13,13 @@ int main() { if (FindGuestTextureFormat(VK_FORMAT_UNDEFINED, 4)) std::abort(); if (FindGuestTextureFormat(VK_FORMAT_BC1_RGBA_UNORM_BLOCK, 8)) std::abort(); if (FindGuestColorTargetFormat(VK_FORMAT_B8G8R8A8_UNORM, 4) != 56) std::abort(); + if (FindGuestColorTargetFormat(VK_FORMAT_B8G8R8A8_SNORM, 4) != 57) std::abort(); if (FindGuestColorTargetFormat(VK_FORMAT_B8G8R8A8_SRGB, 4) != 130) std::abort(); + if (FindGuestColorTargetFormat(VK_FORMAT_A2R10G10B10_UNORM_PACK32, 4) != 50) std::abort(); if (FindGuestColorTargetFormat(VK_FORMAT_R8G8B8A8_UNORM, 4) != 56) std::abort(); if (FindGuestColorTargetFormat(VK_FORMAT_R16G16B16A16_SFLOAT, 8) != 71) std::abort(); if (FindGuestColorTargetFormat(VK_FORMAT_B8G8R8A8_UNORM, 8)) std::abort(); + if (FindGuestColorTargetFormat(VK_FORMAT_B8G8R8A8_SNORM, 8)) std::abort(); if (FindGuestColorTargetFormat(VK_FORMAT_B8G8R8A8_SRGB, 1)) std::abort(); if (FindGuestColorTargetFormat(VK_FORMAT_BC1_RGBA_UNORM_BLOCK, 8)) std::abort(); if (FindGuestColorTargetFormat(VK_FORMAT_UNDEFINED, 4)) std::abort(); diff --git a/core/libs/tests/WindowsMappingsRelease.cpp b/core/libs/tests/WindowsMappingsRelease.cpp index 6b2f016c97ee..987a066e320f 100644 --- a/core/libs/tests/WindowsMappingsRelease.cpp +++ b/core/libs/tests/WindowsMappingsRelease.cpp @@ -1,5 +1,8 @@ #include "prx/libc/include/WindowsMappings.hpp" #include +#include +#include +#include #include #include @@ -69,10 +72,88 @@ static void CheckValidRelease() { CloseHandle(section); } +static void CheckTouchedPagesAnyOrder() { + constexpr std::size_t page = 0x4000; + void* const ascending[] = {reinterpret_cast(page + 4096), reinterpret_cast(3 * page), reinterpret_cast(7 * page + 8192)}; + void* const scrambled[] = {ascending[2], ascending[0], ascending[1]}; + for (void* const* written : {ascending, scrambled}) { + const auto touched = GuestArena::WindowsMappings::TouchedPages(0, 8, written, 3); + for (std::size_t index = 0; index < 8; ++index) Require(touched[index] == (index == 1 || index == 3 || index == 7)); + } +} + +static void CheckEvictKeepsWrittenPages() { + constexpr std::size_t bytes = 2 * 1024 * 1024; + constexpr std::size_t step = 65536; + auto& mappings = GuestArena::WindowsMappings::Get(); + auto* reserved = static_cast(mappings.Reserve(nullptr, 2 * bytes)); + Require(reserved != nullptr); + const auto start = (reinterpret_cast(reserved) + bytes - 1) & ~static_cast(bytes - 1); + auto* base = reinterpret_cast(start); + const auto section = CreateFileMappingW(INVALID_HANDLE_VALUE, nullptr, PAGE_READWRITE, 0, bytes, nullptr); + Require(section != nullptr); + const auto residentRun = [&] { + std::uintptr_t first = 0; + std::uintptr_t last = 0; + return mappings.ResidentSpan(start, 1, &first, &last) && first == start && last == start + bytes; + }; + const auto checkOnly = [&](std::initializer_list> written) { + for (std::size_t at = 0; at < bytes; at += step) { + unsigned char expected = 0; + for (const auto& [offset, value] : written) { + if (offset / step * step == at) expected = value; + } + Require(base[at + 7] == expected); + } + }; + const auto cycle = [&] { + mappings.Reset(base, bytes); + mappings.Map(base, bytes, section, 0, PAGE_READWRITE, true, true); + Require(residentRun()); + }; + + mappings.Map(base, bytes, section, 0, PAGE_READWRITE, true, true); + Require(residentRun()); + base[2 * step + 7] = 21; + base[bytes - step + 7] = 22; + cycle(); + checkOnly({{2 * step + 7, 21}, {bytes - step + 7, 22}}); + + base[5 * step + 7] = 23; + std::vector pages(bytes / 4096); + std::size_t count = pages.size(); + Require(mappings.Collect(start, bytes, pages.data(), &count, true)); + base[9 * step + 7] = 24; + cycle(); + checkOnly({{2 * step + 7, 21}, {bytes - step + 7, 22}, {5 * step + 7, 23}, {9 * step + 7, 24}}); + + count = pages.size(); + Require(mappings.Collect(start, bytes, pages.data(), &count, true)); + cycle(); + checkOnly({{2 * step + 7, 21}, {bytes - step + 7, 22}, {5 * step + 7, 23}, {9 * step + 7, 24}}); + + Require(mappings.BeginHostWrite(start, bytes, false)); + base[12 * step + 7] = 25; + Require(ResetWriteWatch(base + 12 * step, step) == 0); + mappings.EndHostWrite(start, bytes, false); + cycle(); + checkOnly({{2 * step + 7, 21}, {bytes - step + 7, 22}, {5 * step + 7, 23}, {9 * step + 7, 24}, {12 * step + 7, 25}}); + + mappings.Reset(base, bytes); + Require(VirtualFree(reserved, 2 * bytes, MEM_RELEASE | MEM_COALESCE_PLACEHOLDERS)); + Require(VirtualFree(reserved, 0, MEM_RELEASE)); + mappings.ForgetSection(section); + CloseHandle(section); +} + int main(int argc, char** argv) { try { if (argc == 2) CheckMetadataMismatch(static_cast(argv[1][0] - '0')); - else CheckValidRelease(); + else { + CheckValidRelease(); + CheckTouchedPagesAnyOrder(); + CheckEvictKeepsWrittenPages(); + } } catch (const std::exception& failure) { std::fprintf(stderr, "%s\n", failure.what()); return 1; diff --git a/core/libs/tests/WriteWatchBacking.cpp b/core/libs/tests/WriteWatchBacking.cpp new file mode 100644 index 000000000000..dab284896b35 --- /dev/null +++ b/core/libs/tests/WriteWatchBacking.cpp @@ -0,0 +1,209 @@ +#include "prx/libc/include/GuestWriteWatch.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +using namespace GuestWriteWatch; + +namespace { + +void Require(bool condition, const char* message) { + if (!condition) throw std::runtime_error(message); +} + +struct Mapping { + Mapping(int flags, int protection) : protection(protection) { + char path[] = "/tmp/anyps5-watch-backing-XXXXXX"; + file = ::mkstemp(path); + Require(file >= 0, "cannot create backing file"); + ::unlink(path); + Require(::ftruncate(file, 2 * page) == 0, "cannot size backing file"); + base = static_cast(::mmap(nullptr, 2 * page, PROT_READ | PROT_WRITE, flags, file, 0)); + Require(base != MAP_FAILED, "cannot map backing file"); + Require(::mprotect(base, 2 * page, protection) == 0, "cannot set mapping protection"); + } + ~Mapping() { + GuestWriteWatchUnregister_nid_postfix(base, 2 * page); + ::munmap(base, 2 * page); + ::close(file); + } + std::set Collect() { + std::set pages; + Require(GuestWriteWatchCollect_nid_postfix(reinterpret_cast(base), 2 * page, [](void* context, std::uintptr_t begin, std::uintptr_t end) { + auto& output = *static_cast*>(context); + const auto page = static_cast(::getpagesize()); + for (auto at = begin; at < end; at += page) output.insert(at); + }, &pages), "cannot collect watched mapping"); + return pages; + } + void Watch(bool armed, bool hostWrite) { + GuestWriteWatchRegister_nid_postfix(base, 2 * page); + Require(GuestWriteWatchProtect_nid_postfix(base, 2 * page, protection) == 0, "cannot record mapping protection"); + if (armed) Require(Collect().size() == 2, "fresh mapping was not reported"); + if (hostWrite) GuestWriteWatchBeginHostWrite_nid_postfix(base + page, page); + } + const std::size_t page = static_cast(::getpagesize()); + const int protection; + int file = -1; + std::uint8_t* base = nullptr; +}; + +template +int RunChild(TFunction function) { + const auto child = ::fork(); + Require(child >= 0, "cannot fork fault test"); + if (child == 0) { + ::alarm(2); + try { + function(); + } catch (...) { + ::_exit(2); + } + ::_exit(0); + } + int status = 0; + Require(::waitpid(child, &status, 0) == child, "cannot wait for fault test"); + return status; +} + +template +void RequireFault(TFunction function) { + const int status = RunChild(function); + Require(WIFSIGNALED(status) && (WTERMSIG(status) == SIGBUS || WTERMSIG(status) == SIGSEGV), "unrecoverable write did not deliver its fault"); +} + +void CheckTruncation(int flags) { + for (const int protection : {PROT_READ | PROT_WRITE, PROT_WRITE}) { + for (const bool armed : {false, true}) { + for (const bool hostWrite : {false, true}) { + for (const bool keepFirst : {false, true}) { + const auto write = [&](bool watched) { + Mapping mapping(flags, protection); + if (watched) mapping.Watch(armed, hostWrite); + Require(::ftruncate(mapping.file, keepFirst ? mapping.page : 0) == 0, "cannot truncate backing file"); + *static_cast(mapping.base + mapping.page + 17) = 42; + if (watched) { + if (hostWrite) GuestWriteWatchEndHostWrite_nid_postfix(mapping.base + mapping.page, mapping.page); + Require(mapping.Collect().contains(reinterpret_cast(mapping.base + mapping.page)), "surviving private write was not tracked"); + } + }; + const int native = RunChild([&] { write(false); }); + Require((WIFEXITED(native) && WEXITSTATUS(native) == 0) || (WIFSIGNALED(native) && (WTERMSIG(native) == SIGBUS || WTERMSIG(native) == SIGSEGV)), "native truncation control failed"); + const int watched = RunChild([&] { write(true); }); + if (watched != native) std::fprintf(stderr, "flags=%d protection=%d armed=%d host=%d keepFirst=%d native=%d watched=%d\n", flags, protection, armed, hostWrite, keepFirst, native, watched); + Require(watched == native, "write watch changed the native truncation result"); + } + } + } + } +} + +void CheckWritable() { + for (const int flags : {MAP_SHARED, MAP_PRIVATE}) { + for (const int protection : {PROT_READ | PROT_WRITE, PROT_WRITE}) { + for (const bool armed : {false, true}) { + for (const bool hostWrite : {false, true}) { + Mapping mapping(flags, protection); + mapping.Watch(armed, hostWrite); + mapping.base[mapping.page + 17] = 42; + if (hostWrite) GuestWriteWatchEndHostWrite_nid_postfix(mapping.base + mapping.page, mapping.page); + const auto pages = mapping.Collect(); + Require(pages.size() == (armed ? 1u : 2u) && pages.contains(reinterpret_cast(mapping.base + mapping.page)), "valid write was not reported"); + Require(mapping.Collect().empty(), "valid write was reported twice"); + GuestWriteWatchUnregister_nid_postfix(mapping.base, 2 * mapping.page); + Require(mach_vm_protect(mach_task_self(), reinterpret_cast(mapping.base), 2 * mapping.page, false, VM_PROT_READ | VM_PROT_WRITE) == KERN_SUCCESS, "cannot read back valid write"); + Require(mapping.base[mapping.page + 17] == 42, "valid write was lost"); + } + } + } + } +} + +std::atomic arrived{0}; +std::atomic firstHandled{false}; +struct sigaction previousBus{}; +struct sigaction previousSegv{}; + +static_assert(std::atomic::is_always_lock_free && std::atomic::is_always_lock_free); + +void DelaySecondFault(int signal, siginfo_t* info, void* context) { + const auto order = arrived.fetch_add(1); + if (order >= 2) ::_exit(4); + while (arrived.load() < 2) {} + if (order == 1) while (!firstHandled.load()) {} + (signal == SIGBUS ? previousBus : previousSegv).sa_sigaction(signal, info, context); + if (order == 0) firstHandled.store(true); +} + +void CheckLateFault() { + ::alarm(10); + struct sigaction delayed{}; + delayed.sa_sigaction = &DelaySecondFault; + delayed.sa_flags = SA_SIGINFO | SA_RESTART; + sigemptyset(&delayed.sa_mask); + Require(::sigaction(SIGBUS, &delayed, &previousBus) == 0, "cannot delay SIGBUS"); + Require(::sigaction(SIGSEGV, &delayed, &previousSegv) == 0, "cannot delay SIGSEGV"); + for (const int flags : {MAP_SHARED, MAP_PRIVATE}) { + for (const int protection : {PROT_READ | PROT_WRITE, PROT_WRITE}) { + Mapping mapping(flags, protection); + mapping.Watch(true, false); + for (unsigned round = 1; round <= 8; ++round) { + arrived.store(0); + firstHandled.store(false); + std::thread first([&] { mapping.base[mapping.page + 32] = static_cast(round); }); + std::thread second([&] { mapping.base[mapping.page + 64] = static_cast(round); }); + first.join(); + second.join(); + Require(arrived.load() == 2 && firstHandled.load(), "two simultaneous faults were not exercised"); + Require(mapping.Collect() == std::set{reinterpret_cast(mapping.base + mapping.page)}, "late write fault was not tracked"); + Require(mapping.Collect().empty(), "late write fault was tracked twice"); + } + GuestWriteWatchUnregister_nid_postfix(mapping.base, 2 * mapping.page); + Require(mach_vm_protect(mach_task_self(), reinterpret_cast(mapping.base), 2 * mapping.page, false, VM_PROT_READ | VM_PROT_WRITE) == KERN_SUCCESS, "cannot read back concurrent writes"); + Require(mapping.base[mapping.page + 32] == 8 && mapping.base[mapping.page + 64] == 8, "concurrent write was lost"); + } + } + Require(::sigaction(SIGBUS, &previousBus, nullptr) == 0 && ::sigaction(SIGSEGV, &previousSegv, nullptr) == 0, "cannot restore fault handlers"); + ::alarm(0); +} + +void CheckRestoreFailure() { + RequireFault([] { + Mapping mapping(MAP_SHARED, PROT_READ | PROT_WRITE); + mapping.Watch(true, false); + Require(mach_vm_protect(mach_task_self(), reinterpret_cast(mapping.base), 2 * mapping.page, true, VM_PROT_READ) == KERN_SUCCESS, "cannot lower maximum protection"); + *static_cast(mapping.base + mapping.page + 17) = 42; + }); +} + +} + +int main(int argc, char** argv) { + try { + Require(argc == 2 && GuestWriteWatchAvailable_nid_postfix(), "expected a mode and available write watch"); + const std::string_view mode(argv[1]); + if (mode == "shared") CheckTruncation(MAP_SHARED); + else if (mode == "private") CheckTruncation(MAP_PRIVATE); + else if (mode == "writable") CheckWritable(); + else if (mode == "late") CheckLateFault(); + else if (mode == "restore") CheckRestoreFailure(); + else throw std::runtime_error("unknown write-watch backing test"); + std::printf("write watch backing %s passed\n", argv[1]); + return 0; + } catch (const std::exception& error) { + std::fprintf(stderr, "%s\n", error.what()); + return 1; + } +} diff --git a/core/libs/tests/emscripten/CMakeLists.txt b/core/libs/tests/emscripten/CMakeLists.txt new file mode 100644 index 000000000000..e978296a6177 --- /dev/null +++ b/core/libs/tests/emscripten/CMakeLists.txt @@ -0,0 +1,51 @@ +cmake_minimum_required(VERSION 3.20) +project(AnyPS5LibraryPortability CXX) +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +enable_testing() +get_filename_component(libs "${CMAKE_CURRENT_SOURCE_DIR}/../.." ABSOLUTE) +add_executable(guest_long_double_tests ../GuestLongDouble.cpp) +target_include_directories(guest_long_double_tests PRIVATE ${libs}) +add_library(library_portability_sources OBJECT + ${libs}/prx/libSceNet/Export.cpp + ${libs}/prx/libSceSysmodule/Export.cpp + ${libs}/prx/libc/src/ApplicationProcessParameters.cpp + ${libs}/prx/libc/src/Formatting.cpp + ${libs}/prx/libc/src/General.cpp + ${libs}/prx/libc/src/GuestAllocations.cpp + ${libs}/prx/libc/src/GuestArena.cpp + ${libs}/prx/libc/src/Interfaces.cpp + ${libs}/prx/libc/src/ScanningWide.cpp + ${libs}/prx/libc/src/Strings.cpp + ${libs}/prx/libc/src/specifics/linux/DlIteratePhdr.cpp + ${libs}/prx/libkernel/DirectMemory/DirectMemory.cpp + ${libs}/prx/libkernel/Equeue/src/FileEvent.cpp + ${libs}/prx/libkernel/File/src/NativeStat.cpp + ${libs}/prx/libkernel/File/src/Stdio.cpp + ${libs}/prx/libkernel/Module/src/Module.cpp + ${libs}/prx/libkernel/System/src/Process.cpp + ${libs}/prx/libkernel/System/src/UserContext.cpp +) +target_include_directories(library_portability_sources PRIVATE ${libs}) +if(EMSCRIPTEN) + set(flags --target=wasm64 -pthread -fwasm-exceptions -sSUPPORT_LONGJMP=wasm) + target_compile_options(guest_long_double_tests PRIVATE ${flags}) + target_link_options(guest_long_double_tests PRIVATE ${flags} -sENVIRONMENT=node -sEXIT_RUNTIME) + set_target_properties(guest_long_double_tests PROPERTIES SUFFIX .js) + set(ANYPS5_NODE node CACHE FILEPATH "Node.js 26 or newer for memory64") + add_test(NAME guest_long_double COMMAND ${ANYPS5_NODE} $) + target_compile_options(library_portability_sources PRIVATE ${flags}) + add_executable(emscripten_module_unwind_tests + ../EmscriptenModuleUnwind.cpp + ${libs}/prx/libkernel/Module/src/Module.cpp + ${libs}/prx/libSceSysmodule/Export.cpp) + target_include_directories(emscripten_module_unwind_tests PRIVATE ${libs}) + target_compile_options(emscripten_module_unwind_tests PRIVATE ${flags}) + target_link_options(emscripten_module_unwind_tests PRIVATE ${flags} -sENVIRONMENT=node -sEXIT_RUNTIME) + set_target_properties(emscripten_module_unwind_tests PROPERTIES SUFFIX .js) + add_test(NAME emscripten_module_unwind COMMAND ${ANYPS5_NODE} $) + set_tests_properties(emscripten_module_unwind PROPERTIES TIMEOUT 20) +else() + add_test(NAME guest_long_double COMMAND guest_long_double_tests) +endif() +set_tests_properties(guest_long_double PROPERTIES TIMEOUT 20) diff --git a/core/libs/tests/test_public_headers.py b/core/libs/tests/test_public_headers.py index 25116597656f..6e99eb6ec8f2 100644 --- a/core/libs/tests/test_public_headers.py +++ b/core/libs/tests/test_public_headers.py @@ -16,6 +16,9 @@ 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/libs/tests/write_watch/CMakeLists.txt b/core/libs/tests/write_watch/CMakeLists.txt index f29a73ff4f20..a912f98cc146 100644 --- a/core/libs/tests/write_watch/CMakeLists.txt +++ b/core/libs/tests/write_watch/CMakeLists.txt @@ -7,6 +7,19 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) endif() find_package(Threads REQUIRED) +add_executable(write_watch_backing_tests ../WriteWatchBacking.cpp ../../prx/libc/src/GuestWriteWatch.cpp) +target_include_directories(write_watch_backing_tests PRIVATE ../..) +target_compile_features(write_watch_backing_tests PRIVATE cxx_std_20) +target_link_libraries(write_watch_backing_tests PRIVATE Threads::Threads) +set_target_properties(write_watch_backing_tests PROPERTIES + CXX_EXTENSIONS OFF + RUNTIME_OUTPUT_DIRECTORY "$<1:${ANYPS5_TEST_OUTPUT_DIRECTORY}>") + +foreach(mode shared private writable late restore) + add_test(NAME write_watch_backing_${mode} COMMAND write_watch_backing_tests ${mode}) + set_tests_properties(write_watch_backing_${mode} PROPERTIES TIMEOUT 30) +endforeach() + add_executable(write_watch_tests ../WriteWatch.cpp ../../prx/libc/src/GuestWriteWatch.cpp) target_include_directories(write_watch_tests PRIVATE ../..) target_compile_features(write_watch_tests PRIVATE cxx_std_20) diff --git a/core/relinker/CMakeLists.txt b/core/relinker/CMakeLists.txt index c008ff91a54d..eeb7f96acae7 100644 --- a/core/relinker/CMakeLists.txt +++ b/core/relinker/CMakeLists.txt @@ -1,5 +1,3 @@ -option(ANYPS5_RELINKER_CLI "Build the native relinker command line" ON) - add_library(relinker_core STATIC ${CMAKE_CURRENT_SOURCE_DIR}/elfpatcher/src/linux/LinuxElfPatcher.cpp ${CMAKE_CURRENT_SOURCE_DIR}/elfpatcher/src/linux/LinuxGuestModuleWriter.cpp @@ -188,8 +186,12 @@ if(WIN32) add_library(relinker_resources OBJECT ${CMAKE_CURRENT_SOURCE_DIR}/relinker.rc) set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/relinker.rc PROPERTIES OBJECT_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/relinker.manifest) target_sources(relinker PRIVATE $) - target_compile_options(relinker PRIVATE -municode) - target_link_options(relinker PRIVATE -municode) + if(MSVC) + set_target_properties(relinker PROPERTIES LINK_FLAGS "/MANIFEST:NO") + else() + target_compile_options(relinker PRIVATE -municode) + target_link_options(relinker PRIVATE -municode) + endif() endif() if(WIN32) @@ -808,6 +810,11 @@ if(BUILD_TESTING) add_test(NAME guest_export_lookup COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/relinker/tests/test_guest_export_lookup.py $) set_tests_properties(guest_export_lookup PROPERTIES TIMEOUT 30) + add_test(NAME guest_zero_finalizer COMMAND ${Python3_EXECUTABLE} + ${CMAKE_CURRENT_SOURCE_DIR}/relinker/tests/test_guest_zero_finalizer.py + $ $ ${CMAKE_CXX_COMPILER}) + set_tests_properties(guest_zero_finalizer PROPERTIES TIMEOUT 30) + add_asan_test_options(guest_zero_finalizer verify_asan_link_order=0) add_test(NAME guest_module_fini COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/relinker/tests/test_guest_module_fini.py $ $) @@ -993,6 +1000,14 @@ if(BUILD_TESTING) target_link_libraries(entry_stub_tests PRIVATE relinker_core) add_test(NAME entry_stub COMMAND entry_stub_tests) + add_test_executable(windows_entry_stub_bounds_tests + ${CMAKE_CURRENT_SOURCE_DIR}/elfpatcher/tests/WindowsEntryStubBoundsTests.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/elfpatcher/tests/WindowsEntryStubAllocation.cpp + ) + target_link_libraries(windows_entry_stub_bounds_tests PRIVATE relinker_core) + add_test(NAME windows_entry_stub_bounds COMMAND windows_entry_stub_bounds_tests) + set_tests_properties(windows_entry_stub_bounds PROPERTIES TIMEOUT 20) + add_test_executable(control_flow_graph_tests ${CMAKE_CURRENT_SOURCE_DIR}/relinker/tests/ControlFlowGraphTests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/relinker/src/analysis/RelativeJumpTables.cpp @@ -1034,10 +1049,11 @@ if(BUILD_TESTING) ) add_test(NAME strict_nid_filter COMMAND strict_nid_filter_tests) - if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64") + if((CMAKE_SYSTEM_NAME STREQUAL "Linux" OR WIN32) AND CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64") add_test_executable(to_intel_linux_stubs_tests ${CMAKE_CURRENT_SOURCE_DIR}/relinker/tests/ToIntelLinuxStubsTests.cpp ) + target_include_directories(to_intel_linux_stubs_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../libs) add_test(NAME to_intel_linux_stubs COMMAND to_intel_linux_stubs_tests $) add_test_executable(rela_bounds_tests @@ -1052,6 +1068,7 @@ if(BUILD_TESTING) add_test_executable(guest_intel_trampolines_tests ${CMAKE_CURRENT_SOURCE_DIR}/relinker/tests/GuestIntelTrampolinesTests.cpp ) + target_include_directories(guest_intel_trampolines_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../libs) add_test(NAME guest_intel_trampolines_execution COMMAND guest_intel_trampolines_tests $) add_test_executable(dynamic_table_bounds_tests diff --git a/core/relinker/cli/src/Autorun.cpp b/core/relinker/cli/src/Autorun.cpp index e6e6defd69c4..95f821403897 100644 --- a/core/relinker/cli/src/Autorun.cpp +++ b/core/relinker/cli/src/Autorun.cpp @@ -9,6 +9,9 @@ #include #ifdef _WIN32 +#ifndef NOMINMAX +#define NOMINMAX +#endif #include #endif @@ -69,7 +72,7 @@ int Autorun(const std::string& absPath, bool toWindows) { #endif std::cout << "\nPress Enter to exit...\n"; - std::cin.ignore(std::numeric_limits::max(), '\n'); + std::cin.ignore((std::numeric_limits::max)(), '\n'); return exitCode; } diff --git a/core/relinker/cli/src/CliArgs.cpp b/core/relinker/cli/src/CliArgs.cpp index 697a5de1aad9..8a6f7b2aef02 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 a56f25be567e..b7e0a7d218d2 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 951a99b18ea7..b48555e99df5 100644 --- a/core/relinker/codegen/include/codegen/x86/X64OpcodeConstants.hpp +++ b/core/relinker/codegen/include/codegen/x86/X64OpcodeConstants.hpp @@ -20,6 +20,7 @@ inline constexpr std::uint8_t PrefixAddressSize = 0x67; inline constexpr std::uint8_t RexMin = 0x40; inline constexpr std::uint8_t RexMax = 0x4F; inline constexpr std::uint8_t RexWBit = 0x08; +inline constexpr std::uint8_t RexBBit = 0x01; inline constexpr std::uint8_t TwoByteOpcodeEscape = 0x0F; @@ -108,6 +109,8 @@ inline constexpr std::uint8_t OneByteLoopMax = 0xE2; inline constexpr std::uint8_t OneByteInOutImm8Min = 0xE4; inline constexpr std::uint8_t OneByteInOutImm8Max = 0xE7; inline constexpr std::uint8_t OneByteInt = 0xCD; +inline constexpr std::uint8_t OneByteInt3 = 0xCC; +inline constexpr std::uint8_t OneByteNop = 0x90; inline constexpr std::uint8_t OneByteRetImm16 = 0xC2; inline constexpr std::uint8_t OneByteRetFarImm16 = 0xCA; inline constexpr std::uint8_t OneByteEnter = 0xC8; @@ -215,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/Amd64OnlyConverter.cpp b/core/relinker/codegen/src/Amd64OnlyConverter.cpp index d8d1be17315a..f6817ce47e4e 100644 --- a/core/relinker/codegen/src/Amd64OnlyConverter.cpp +++ b/core/relinker/codegen/src/Amd64OnlyConverter.cpp @@ -112,6 +112,41 @@ class WindowPlacer { return hit != _branchTargets.end() && *hit < end; } + [[nodiscard]] bool _int3(const std::size_t index) const { + const auto bytes = _bytes(index); + return bytes.size() == 1 && bytes[0] == X64OpcodeConstants::OneByteInt3; + } + + [[nodiscard]] bool _padding(const std::size_t index) const { + const auto info = _info(index); + if (info.IsTwoByteOpcode) + return info.Opcode == X64OpcodeConstants::TwoByteNopModRm; + if (info.Opcode != X64OpcodeConstants::OneByteNop) + return _int3(index); + const auto prefixes = _bytes(index).first(info.OpcodeOffset); + return (info.RexPrefix & X64OpcodeConstants::RexBBit) == 0 && std::find(prefixes.begin(), prefixes.end(), X64OpcodeConstants::PrefixRep) == prefixes.end(); + } + + [[nodiscard]] bool _mayBeEntered(const std::size_t index) const { + for (auto previous = index; previous > 0; --previous) { + if (_end(previous - 1) != _address(previous) || _blocksFollowing(previous - 1)) + return true; + if (!_padding(previous - 1)) + return false; + } + return true; + } + + [[nodiscard]] bool _enteredWithin(const std::size_t first, const std::size_t last) const { + if (_entered(_address(first), _end(last))) + return true; + for (auto index = first + 1; index <= last; ++index) { + if (!_int3(index) && _mayBeEntered(index)) + return true; + } + return false; + } + [[nodiscard]] bool _blocksFollowing(const std::size_t index) const { const auto kind = _info(index).FlowKind; return kind != ControlFlowKind::Sequential && kind != ControlFlowKind::ConditionalBranch; @@ -135,7 +170,7 @@ class WindowPlacer { } [[nodiscard]] std::optional _relocate(const std::size_t index, const std::size_t first, const std::size_t last, const bool allowInPlace = false) const { - if (_entered(_address(first), _end(last))) + if (_enteredWithin(first, last)) return std::nullopt; StubBodyBuilder body; Placement placement; @@ -162,7 +197,7 @@ class WindowPlacer { using Amd64OnlySubstitutionTable::kJmpRel32; std::size_t head = 0; for (auto last = start; last < _matches.size(); ++last) { - if (!_movable(last, true) || _entered(_address(start), _end(last))) + if (!_movable(last, true) || _enteredWithin(start, last)) return std::nullopt; if (head == 0 && _end(last) - _address(start) >= kJmpRel32.Size) head = static_cast(_end(last) - _address(start)); diff --git a/core/relinker/codegen/src/x86/WideStoreOperands.cpp b/core/relinker/codegen/src/x86/WideStoreOperands.cpp index 478c4108edbd..529d39596bd7 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 d5823779fc30..f0165db65fe8 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}; @@ -1058,6 +1071,39 @@ void converterWideStoreWindows() { requireFailure([&] { (void)convert(withStore(far, tail)); }, "A 256-bit store whose movable neighbours are all beyond a short jump was kept"); } +void converterIslandIndirectEntries() { + const auto converter = Codegen::MakeAmd64OnlyConverter(Codegen::Amd64OnlyTarget::Rosetta); + const Bytes prologue = {0x55, 0x48, 0x89, 0xE5, 0x41, 0x57, 0x41, 0x56, 0x41, 0x55, 0x41, 0x54, 0x53, 0xC3}; + for (const auto& padding : {Bytes{0xCC, 0xCC}, Bytes{0x66, 0x90}, Bytes{0x0F, 0x1F, 0x00}, Bytes{}}) { + Bytes text = {0xE8, 0x40, 0x00, 0x00, 0x00, 0xC5, 0xFC, 0x11, 0x07, 0xC3, 0xEB, 0xFD}; + text.insert(text.end(), padding.begin(), padding.end()); + const auto entry = static_cast(0x200 + text.size()); + text.insert(text.end(), prologue.begin(), prologue.end()); + Bytes file(0x300 + text.size(), 0xCC); + std::copy(text.begin(), text.end(), file.begin() + 0x200); + const auto result = converter->Convert(file, {segmentHeader(text.size())}); + require(result.Trampolines.size() == 2 && result.KeptCount == 0, "A 256-bit store before a function that only a pointer reaches was not lowered through an island"); + for (const auto& site : result.Trampolines) + require(site.Offset >= entry || site.Offset + site.Length <= entry, "An island covered the entry of a function that follows a jump and its padding"); + require(result.Trampolines[0].Offset == entry, "An island next to a function that follows a jump and its padding did not start at its entry"); + } +} + +void converterIslandInTrapPadding() { + const auto converter = Codegen::MakeAmd64OnlyConverter(Codegen::Amd64OnlyTarget::Rosetta); + Bytes text = {0xE8, 0x40, 0x00, 0x00, 0x00, 0xC5, 0xFC, 0x11, 0x07, 0xC3, 0xEB, 0xFD}; + const Bytes padding(15, 0xCC); + text.insert(text.end(), padding.begin(), padding.end()); + const auto entry = static_cast(0x200 + text.size()); + text.insert(text.end(), {0xE9, 0x00, 0x01, 0x00, 0x00}); + Bytes file(0x300 + text.size(), 0xCC); + std::copy(text.begin(), text.end(), file.begin() + 0x200); + const auto result = converter->Convert(file, {segmentHeader(text.size())}); + require(result.Trampolines.size() == 2 && result.KeptCount == 0, "A 256-bit store before int3 padding and a function that cannot move was not lowered through an island"); + for (const auto& site : result.Trampolines) + require(site.Offset + site.Length <= entry, "An island in the int3 padding after a jump ran into the next function"); +} + void converterClaimedFollower() { const auto converter = Codegen::MakeAmd64OnlyConverter(Codegen::Amd64OnlyTarget::Rosetta); for (const auto& [shortInstruction, name] : {std::pair{Bytes{0x0F, 0x53, 0xCA}, "RCPPS"}, std::pair{Bytes{0xF3, 0x0F, 0xC7, 0xF8}, "RDPID"}}) { @@ -2413,6 +2459,8 @@ int main() { wideStoreSplit(); converterWideStoreWindows(); converterWideStoreIslandAcrossInt64Max(); + converterIslandIndirectEntries(); + converterIslandInTrapPadding(); converterClaimedFollower(); converterJumpTableTargets(); converterReciprocal(); diff --git a/core/relinker/elfpatcher/include/elfpatcher/general/AddressDistance.hpp b/core/relinker/elfpatcher/include/elfpatcher/general/AddressDistance.hpp new file mode 100644 index 000000000000..2e624196c709 --- /dev/null +++ b/core/relinker/elfpatcher/include/elfpatcher/general/AddressDistance.hpp @@ -0,0 +1,23 @@ +#pragma once +#include +#include + +namespace Elfpatcher { + +[[nodiscard]] inline bool SignedDistance(const std::uint64_t to, const std::uint64_t from, std::int64_t& out) { + constexpr std::uint64_t kSignBoundary = 1ULL << 63; + constexpr std::uint64_t kInt64MinMagnitude = static_cast(std::numeric_limits::max()) + 1ULL; + if ((to < kSignBoundary) == (from < kSignBoundary)) { + out = static_cast(to - from); + return true; + } + const std::uint64_t high = to < kSignBoundary ? from : to; + const std::uint64_t low = to < kSignBoundary ? to : from; + const std::uint64_t magnitude = high - low; + if (magnitude >= kInt64MinMagnitude) + return false; + out = high == to ? static_cast(magnitude) : -static_cast(magnitude); + return true; +} + +} diff --git a/core/relinker/elfpatcher/src/general/EntryStubBuilder.cpp b/core/relinker/elfpatcher/src/general/EntryStubBuilder.cpp index 72168e18b375..bf5924d9a4f4 100644 --- a/core/relinker/elfpatcher/src/general/EntryStubBuilder.cpp +++ b/core/relinker/elfpatcher/src/general/EntryStubBuilder.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -25,8 +26,8 @@ std::vector EntryStubBuilder::BuildEntryStub( _appendBytes(s, kStubOpXorRsiRsi, sizeof(kStubOpXorRsiRsi)); const std::uint64_t callInsnVaddr = stubVaddr + s.size(); const std::uint64_t callNextVaddr = callInsnVaddr + kStubCallInstructionSize; - const auto displacement = static_cast(realEntryVaddr - callNextVaddr); - if (displacement < std::numeric_limits::min() || displacement > std::numeric_limits::max()) + std::int64_t displacement = 0; + if (!SignedDistance(realEntryVaddr, callNextVaddr, displacement) || displacement < std::numeric_limits::min() || displacement > std::numeric_limits::max()) throw Domain::RelinkerException("Entry stub call exceeds rel32 range"); const auto rel32 = static_cast(displacement); s.push_back(kStubOpCallRel32); diff --git a/core/relinker/elfpatcher/src/linux/LinuxElfPatcher.cpp b/core/relinker/elfpatcher/src/linux/LinuxElfPatcher.cpp index e2a1ceb67f35..ec5e95cd3a6a 100644 --- a/core/relinker/elfpatcher/src/linux/LinuxElfPatcher.cpp +++ b/core/relinker/elfpatcher/src/linux/LinuxElfPatcher.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -136,9 +137,42 @@ void SeparateSharedLoadPages(std::vector& buf, std::vector= previous.MemorySize) + continue; + const auto previousEnd = previous.MappedAddress + previous.MemorySize; + if (current.MappedAddress == previous.MappedAddress || previousEnd > current.MappedAddress + current.MemorySize) + throw Domain::RelinkerException("Overlapping PT_LOAD memory ranges", current.MappedAddress); + if (((previous.Flags | current.Flags) & (PF_W | PF_X)) == (PF_W | PF_X) + && current.MappedAddress % kDefaultLoadAlignment != 0) + throw Domain::RelinkerException("Overlapping PT_LOAD memory ranges", current.MappedAddress); + const auto previousFileEnd = previous.MappedAddress + previous.FileSize; + const auto currentFileEnd = current.MappedAddress + current.FileSize; + const auto compareEnd = std::min(previousEnd, std::max(previousFileEnd, currentFileEnd)); + for (auto address = current.MappedAddress; address < compareEnd;) { + const bool previousBacked = address < previousFileEnd; + const bool currentBacked = address < currentFileEnd; + auto runEnd = compareEnd; + if (previousBacked) + runEnd = std::min(runEnd, previousFileEnd); + if (currentBacked) + runEnd = std::min(runEnd, currentFileEnd); + const auto length = static_cast(runEnd - address); + const auto previousAt = static_cast(previous.Offset + (address - previous.MappedAddress)); + const auto currentAt = static_cast(current.Offset + (address - current.MappedAddress)); + const bool congruent = previousBacked && currentBacked + ? std::equal(buf.begin() + previousAt, buf.begin() + previousAt + length, buf.begin() + currentAt) + : previousBacked + ? std::all_of(buf.begin() + previousAt, buf.begin() + previousAt + length, [](const std::uint8_t byte) { return byte == 0; }) + : std::all_of(buf.begin() + currentAt, buf.begin() + currentAt + length, [](const std::uint8_t byte) { return byte == 0; }); + if (!congruent) + throw Domain::RelinkerException("Overlapping PT_LOAD memory ranges", current.MappedAddress); + address = runEnd; + } + previous.MemorySize = current.MappedAddress - previous.MappedAddress; + if (previous.FileSize > previous.MemorySize) + previous.FileSize = previous.MemorySize; } for (std::size_t position = 0; position < loads.size(); ++position) { auto& load = headers[loads[position]]; @@ -263,8 +297,8 @@ std::vector TracePrologue(const std::uint64_t vaddr, const std::ui std::vector code = {0x52, 0x53, 0x41, 0x54, 0x48, 0x83, 0xec, 0x08}; const auto rip = [&](std::initializer_list opcode, const std::uint64_t target) { code.insert(code.end(), opcode); - const auto displacement = static_cast(target) - static_cast(vaddr + code.size() + 4); - if (displacement < std::numeric_limits::min() || displacement > std::numeric_limits::max()) + std::int64_t displacement = 0; + if (!SignedDistance(target, vaddr + code.size() + 4, displacement) || displacement < std::numeric_limits::min() || displacement > std::numeric_limits::max()) throw Domain::RelinkerException("Import trace table exceeds rel32 range"); Io::AppendU32(code, static_cast(displacement)); }; @@ -352,9 +386,8 @@ void LinuxElfPatcher::_appendTrampoline( const auto inRange = [](const std::int64_t displacement) { return displacement >= std::numeric_limits::min() && displacement <= std::numeric_limits::max(); }; - const auto returnDisplacement = static_cast(site.Address + site.Length) - static_cast(bodyVaddr + site.ReturnBranchOffset + kJmpRel32.Size); - const auto jumpDisplacement = static_cast(bodyVaddr) - static_cast(site.Address + kJmpRel32.Size); - if (!inRange(returnDisplacement) || !inRange(jumpDisplacement)) + std::int64_t returnDisplacement = 0, jumpDisplacement = 0; + if (!SignedDistance(site.Address + site.Length, bodyVaddr + site.ReturnBranchOffset + kJmpRel32.Size, returnDisplacement) || !SignedDistance(bodyVaddr, site.Address + kJmpRel32.Size, jumpDisplacement) || !inRange(returnDisplacement) || !inRange(jumpDisplacement)) throw Domain::RelinkerException("AMD-only stub exceeds rel32 range", site.Offset); _byteWriter->WriteU32(buf, static_cast(bodyOff + site.ReturnBranchOffset + 1), static_cast(returnDisplacement)); diff --git a/core/relinker/elfpatcher/src/linux/LinuxGuestModuleWriter.cpp b/core/relinker/elfpatcher/src/linux/LinuxGuestModuleWriter.cpp index 25e5eb516e75..ab4dfbdd46a0 100644 --- a/core/relinker/elfpatcher/src/linux/LinuxGuestModuleWriter.cpp +++ b/core/relinker/elfpatcher/src/linux/LinuxGuestModuleWriter.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -102,7 +103,7 @@ std::vector GuestModuleWriter::WriteLinux(const Relinker::GuestIma Io::AppendU64(bytes, 0x415053354c494658ull); pointer(0); pointer(image.Init, image.HasInit); - pointer(image.Fini, image.Fini != 0); + pointer(image.Fini, image.HasFini); Io::AppendU64(bytes, image.InitArray.size()); Io::AppendU64(bytes, image.FiniArray.size()); Io::AppendU64(bytes, 0); @@ -155,8 +156,8 @@ std::vector GuestModuleWriter::WriteLinux(const Relinker::GuestIma constexpr std::size_t kArgsDisplacement = 3, kTargetDisplacement = 0x11, kResultDisplacement = 0x19; constexpr std::size_t kStubSize = 0x1f; const auto stubDisplacement = [](std::uint64_t target, std::uint64_t next) { - const auto distance = static_cast(target) - static_cast(next); - if (distance < std::numeric_limits::min() || distance > std::numeric_limits::max()) + std::int64_t distance = 0; + if (!SignedDistance(target, next, distance) || distance < std::numeric_limits::min() || distance > std::numeric_limits::max()) throw Domain::RelinkerException("Guest initializer exceeds relative branch range"); return static_cast(static_cast(distance)); }; @@ -181,10 +182,10 @@ std::vector GuestModuleWriter::WriteLinux(const Relinker::GuestIma return start; }; const auto finalizer = [&](std::uint64_t target) { - if (target == 0) return std::uint64_t{}; + if (!image.HasFini) return std::uint64_t{}; const auto start = address(); - const auto distance = static_cast(target) - static_cast(start + 11); - if (distance < std::numeric_limits::min() || distance > std::numeric_limits::max()) + std::int64_t distance = 0; + if (!SignedDistance(target, start + 11, distance) || distance < std::numeric_limits::min() || distance > std::numeric_limits::max()) throw Domain::RelinkerException("Guest finaliser exceeds relative branch range"); bytes.insert(bytes.end(), {0x31, 0xff, 0x31, 0xf6, 0x31, 0xd2, 0xe9}); Io::AppendU32(bytes, static_cast(distance)); @@ -192,7 +193,7 @@ std::vector GuestModuleWriter::WriteLinux(const Relinker::GuestIma }; const auto init = deferInitialization ? 0 : lifecycle(image.Init); auto fini = deferInitialization ? 0 : finalizer(image.Fini); - if (deferInitialization && (image.Fini != 0 || !image.FiniArray.empty())) { + if (deferInitialization && (image.HasFini || !image.FiniArray.empty())) { fini = address(); bytes.insert(bytes.end(), {0x48, 0x83, 0x3d}); Io::AppendU32(bytes, stubDisplacement(lifecycleTable + 48, address() + 5)); @@ -209,7 +210,7 @@ std::vector GuestModuleWriter::WriteLinux(const Relinker::GuestIma Io::AppendU32(bytes, stubDisplacement(*slot, address() + 4)); bytes.insert(bytes.end(), {0x48, 0x85, 0xc0, 0x74, 8, 0x31, 0xff, 0x31, 0xf6, 0x31, 0xd2, 0xff, 0xd0}); } - if (image.Fini != 0) { + if (image.HasFini) { bytes.insert(bytes.end(), {0x31, 0xff, 0x31, 0xf6, 0x31, 0xd2, 0xe8}); Io::AppendU32(bytes, stubDisplacement(image.Fini, address() + 4)); } diff --git a/core/relinker/elfpatcher/src/macos/MacOsGuestModuleWriter.cpp b/core/relinker/elfpatcher/src/macos/MacOsGuestModuleWriter.cpp index c1f00da55cf8..c1a7cb4cb842 100644 --- a/core/relinker/elfpatcher/src/macos/MacOsGuestModuleWriter.cpp +++ b/core/relinker/elfpatcher/src/macos/MacOsGuestModuleWriter.cpp @@ -99,7 +99,7 @@ std::vector GuestModuleWriter::WriteMacOs(const Relinker::GuestIma for (const auto slot : guest.InitArray) input.InitArrayRvas.push_back(image.GetRva(slot, 8)); for (const auto slot : guest.FiniArray) input.FiniArrayRvas.push_back(image.GetRva(slot, 8)); input.InitRva = guest.HasInit ? image.GetRva(guest.Init) : 0; - input.FiniRva = guest.Fini == 0 ? 0 : image.GetRva(guest.Fini); + input.FiniRva = guest.HasFini ? image.GetRva(guest.Fini) : 0; input.Trampolines = &guest.Trampolines; try { return WriteMacOsImage(input); diff --git a/core/relinker/elfpatcher/src/windows/WindowsEntryStubBuilder.cpp b/core/relinker/elfpatcher/src/windows/WindowsEntryStubBuilder.cpp index ec473d802899..d9be16b06948 100644 --- a/core/relinker/elfpatcher/src/windows/WindowsEntryStubBuilder.cpp +++ b/core/relinker/elfpatcher/src/windows/WindowsEntryStubBuilder.cpp @@ -81,7 +81,10 @@ WindowsEntryStub WindowsEntryStubBuilder::Build(const std::uint32_t dataRva, con auto& data = result.Data.Data; const auto reserve = [&](const std::size_t size) { - const auto rva = CheckedRva(dataRva + data.size()); + const auto rva = CheckedRva(static_cast(dataRva) + data.size()); + if (size > data.max_size() - data.size()) + throw Domain::RelinkerException("Windows entry-stub allocation exceeds vector capacity"); + CheckedRva(static_cast(dataRva) + data.size() + size); data.resize(data.size() + size); return rva; }; @@ -166,6 +169,7 @@ WindowsEntryStub WindowsEntryStubBuilder::Build(const std::uint32_t dataRva, con std::vector searchCounts; std::vector platformTlsResolvers; std::vector imported(libraries.size()); + std::vector familyFallbacks(libraries.size()); std::vector executableImports(guestModules.size()); const bool unscopedImports = std::any_of(imports.begin(), imports.end(), [](const auto& import) { return import.Library.empty(); }); for (const auto& import : imports) { @@ -182,11 +186,16 @@ WindowsEntryStub WindowsEntryStubBuilder::Build(const std::uint32_t dataRva, con if (order.empty()) throw Domain::RelinkerException("Import module is not a dependency: " + import.Library); const bool hostModule = !import.Library.empty() && std::any_of(order.begin(), order.end(), [&](auto index) { return index >= guestModules.size(); }); + std::size_t familyBegin = order.size(); + std::size_t familyEnd = order.size(); if (hostModule) { - if (library == "libkernel_sys.prx" || library == "libkernel_web.prx") { + if (library == "libkernel.prx" || library == "libkernel_sys.prx" || library == "libkernel_web.prx") { + familyBegin = order.size(); for (std::size_t index = guestModules.size(); index < libraries.size(); ++index) { - if (libraries[index] == "libkernel.prx") order.push_back(CheckedRva(index)); + if ((libraries[index] == "libkernel.prx" || libraries[index] == "libkernel_sys.prx" || libraries[index] == "libkernel_web.prx") && libraries[index] != library) + order.push_back(CheckedRva(index)); } + familyEnd = order.size(); } for (std::size_t index = guestModules.size(); index < libraries.size(); ++index) { if (libraries[index] == "libc.prx" && library != "libc.prx") order.push_back(CheckedRva(index)); @@ -205,9 +214,12 @@ WindowsEntryStub WindowsEntryStubBuilder::Build(const std::uint32_t dataRva, con })); searchTables.push_back(CheckedRva(dataRva + data.size())); searchCounts.push_back(CheckedRva(order.size())); - for (const auto index : order) { + for (std::size_t position = 0; position < order.size(); ++position) { + const auto index = order[position]; Io::AppendU32(data, index); - if (!import.Library.empty()) imported[index] = true; + const bool fallback = position >= familyBegin && position < familyEnd && libraries[index] != "libkernel.prx"; + if (fallback) familyFallbacks[index] = true; + else if (!import.Library.empty()) imported[index] = true; } } @@ -596,7 +608,7 @@ WindowsEntryStub WindowsEntryStubBuilder::Build(const std::uint32_t dataRva, con code.PatchBranch(noAllocator, code.GetRva()); for (std::size_t index = 0; index < libraries.size(); ++index) { - if (index >= guestModules.size() && !imported[index] && !unscopedImports) continue; + if (index >= guestModules.size() && !imported[index] && !familyFallbacks[index] && !unscopedImports) continue; if (absolutePath && index >= guestModules.size()) { code.Rip({0x48, 0x8d, 0x0d}, libraryPaths[index]); } else { @@ -853,7 +865,7 @@ WindowsEntryStub WindowsEntryStubBuilder::Build(const std::uint32_t dataRva, con code.PatchBranch(branch, code.GetRva()); writeString(searched, true); for (std::size_t index = 0; index < resolvedPaths.size(); ++index) { - if (index >= guestModules.size() && !imported[index] && !unscopedImports) continue; + if (index >= guestModules.size() && !imported[index] && !familyFallbacks[index] && !unscopedImports) continue; writeString(indent, true); writeString(resolvedPaths[index], true); writeString(newline, true); diff --git a/core/relinker/elfpatcher/src/windows/WindowsGuestModuleWriter.cpp b/core/relinker/elfpatcher/src/windows/WindowsGuestModuleWriter.cpp index 0b284a4bcd4f..7a3794848ee1 100644 --- a/core/relinker/elfpatcher/src/windows/WindowsGuestModuleWriter.cpp +++ b/core/relinker/elfpatcher/src/windows/WindowsGuestModuleWriter.cpp @@ -205,7 +205,7 @@ std::vector GuestModuleWriter::WriteWindows(const Relinker::GuestI for (const auto slot : guest.FiniArray) runtime.FiniArrayRvas.push_back(image.GetRva(slot, 8)); runtime.InitRva = guest.HasInit ? image.GetRva(guest.Init) : 0; runtime.UnmatchedImportModules.assign(guest.Dynamic.UnmatchedImportModules.begin(), guest.Dynamic.UnmatchedImportModules.end()); - runtime.FiniRva = guest.Fini == 0 ? 0 : image.GetRva(guest.Fini); + runtime.FiniRva = guest.HasFini ? image.GetRva(guest.Fini) : 0; auto result = WindowsPeWriter().Write(sections, entry, directories); const auto characteristics = Io::ReadU16(result, 0x80 + 22); Io::WriteU16(result, 0x80 + 22, static_cast((characteristics | 0x2000) & ~1u)); diff --git a/core/relinker/elfpatcher/src/windows/WindowsImportBuilder.cpp b/core/relinker/elfpatcher/src/windows/WindowsImportBuilder.cpp index f2d45060beaa..830789aee6e6 100644 --- a/core/relinker/elfpatcher/src/windows/WindowsImportBuilder.cpp +++ b/core/relinker/elfpatcher/src/windows/WindowsImportBuilder.cpp @@ -56,12 +56,13 @@ std::vector WindowsImportBuilder::ReadLibraries(const Domain::SysVD const auto addIfMissing = [&](const char* library) { if (unique.insert(library).second) result.emplace_back(library); }; - if (unique.contains("libSceLibcInternal.prx") || unique.contains("libkernel.prx")) - addIfMissing("libc.prx"); - if (unique.contains("libkernel_sys.prx") || unique.contains("libkernel_web.prx")) { + if (unique.contains("libkernel.prx") || unique.contains("libkernel_sys.prx") || unique.contains("libkernel_web.prx")) { addIfMissing("libkernel.prx"); - addIfMissing("libc.prx"); + addIfMissing("libkernel_sys.prx"); + addIfMissing("libkernel_web.prx"); } + if (unique.contains("libSceLibcInternal.prx") || unique.contains("libkernel.prx") || unique.contains("libkernel_sys.prx") || unique.contains("libkernel_web.prx")) + addIfMissing("libc.prx"); return result; } diff --git a/core/relinker/elfpatcher/src/windows/WindowsLoadImage.cpp b/core/relinker/elfpatcher/src/windows/WindowsLoadImage.cpp index c181efa7d231..d3298f237ab4 100644 --- a/core/relinker/elfpatcher/src/windows/WindowsLoadImage.cpp +++ b/core/relinker/elfpatcher/src/windows/WindowsLoadImage.cpp @@ -28,12 +28,44 @@ WindowsLoadImage::WindowsLoadImage(const std::vector& source, cons throw Domain::RelinkerException("No PT_LOAD segments found"); std::sort(segments.begin(), segments.end(), [](const auto& left, const auto& right) { return left.MappedAddress < right.MappedAddress; }); firstAddress = segments.front().MappedAddress & ~static_cast(SectionAlignment - 1); - std::uint64_t end = firstAddress; - for (const auto& segment : segments) { - if (segment.MappedAddress < end) + for (std::size_t index = 1; index < segments.size(); ++index) { + auto& previous = segments[index - 1]; + const auto& segment = segments[index]; + if (segment.MappedAddress - previous.MappedAddress >= previous.MemorySize) + continue; + const auto previousEnd = previous.MappedAddress + previous.MemorySize; + if (segment.MappedAddress == previous.MappedAddress || previousEnd > segment.MappedAddress + segment.MemorySize) throw Domain::RelinkerException("Overlapping PT_LOAD memory ranges", segment.MappedAddress); - end = segment.MappedAddress + segment.MemorySize; + if (((previous.Flags | segment.Flags) & 3u) == 3u && segment.MappedAddress % SectionAlignment != 0) + throw Domain::RelinkerException("Overlapping PT_LOAD memory ranges", segment.MappedAddress); + const auto previousFileEnd = previous.MappedAddress + previous.FileSize; + const auto segmentFileEnd = segment.MappedAddress + segment.FileSize; + const auto compareEnd = std::min(previousEnd, std::max(previousFileEnd, segmentFileEnd)); + for (auto address = segment.MappedAddress; address < compareEnd;) { + const bool previousBacked = address < previousFileEnd; + const bool segmentBacked = address < segmentFileEnd; + auto runEnd = compareEnd; + if (previousBacked) + runEnd = std::min(runEnd, previousFileEnd); + if (segmentBacked) + runEnd = std::min(runEnd, segmentFileEnd); + const auto length = static_cast(runEnd - address); + const auto previousAt = static_cast(previous.Offset + (address - previous.MappedAddress)); + const auto segmentAt = static_cast(segment.Offset + (address - segment.MappedAddress)); + const bool congruent = previousBacked && segmentBacked + ? std::equal(source.begin() + previousAt, source.begin() + previousAt + length, source.begin() + segmentAt) + : previousBacked + ? std::all_of(source.begin() + previousAt, source.begin() + previousAt + length, [](const std::uint8_t byte) { return byte == 0; }) + : std::all_of(source.begin() + segmentAt, source.begin() + segmentAt + length, [](const std::uint8_t byte) { return byte == 0; }); + if (!congruent) + throw Domain::RelinkerException("Overlapping PT_LOAD memory ranges", segment.MappedAddress); + address = runEnd; + } + previous.MemorySize = segment.MappedAddress - previous.MappedAddress; + if (previous.FileSize > previous.MemorySize) + previous.FileSize = previous.MemorySize; } + const auto end = segments.back().MappedAddress + segments.back().MemorySize; size = AlignRva(end - firstAddress); CheckedRva(LoadRva + size); pageFlags.resize(static_cast(size / SectionAlignment)); diff --git a/core/relinker/elfpatcher/src/windows/WindowsTlsBuilder.cpp b/core/relinker/elfpatcher/src/windows/WindowsTlsBuilder.cpp index 5b50475293bd..722584997afc 100644 --- a/core/relinker/elfpatcher/src/windows/WindowsTlsBuilder.cpp +++ b/core/relinker/elfpatcher/src/windows/WindowsTlsBuilder.cpp @@ -429,9 +429,10 @@ PeDirectory WindowsTlsBuilder::Build(const std::vector& source, co if (instruction.RipDisplacement) { const auto target = static_cast(instruction.Rva) + static_cast(bytes.size()) + std::bit_cast(Io::ReadU32(bytes, *instruction.RipDisplacement)); const auto displacement = target - (static_cast(code.GetRva()) + static_cast(bytes.size())); - if (displacement < std::numeric_limits::min() || displacement > std::numeric_limits::max()) + const bool addressSize32 = Codegen::X64InstructionDecoder{}.DecodeInstruction(bytes.data(), bytes.size()).AddressSize32; + if (!addressSize32 && (displacement < std::numeric_limits::min() || displacement > std::numeric_limits::max())) throw Domain::RelinkerException("Moved RIP-relative instruction exceeds rel32 range from its TLS stub", access.FileOffset); - Io::WriteU32(bytes, *instruction.RipDisplacement, static_cast(static_cast(displacement))); + Io::WriteU32(bytes, *instruction.RipDisplacement, static_cast(displacement)); } if (instruction.BranchTarget) { const auto displacement = static_cast(*instruction.BranchTarget) - (static_cast(code.GetRva()) + static_cast(bytes.size())); diff --git a/core/relinker/elfpatcher/tests/EntryStubTests.cpp b/core/relinker/elfpatcher/tests/EntryStubTests.cpp index 1fe8dc32e913..282e8ff25c25 100644 --- a/core/relinker/elfpatcher/tests/EntryStubTests.cpp +++ b/core/relinker/elfpatcher/tests/EntryStubTests.cpp @@ -149,22 +149,34 @@ void windowsKernelVariantImportsSearchCanonicalKernelAfterTheRequestedVariant() void windowsKernelVariantDependenciesLoadCanonicalKernel() { using namespace Elfpatcher::Windows; for (const auto& variant : {std::string("libkernel_sys.prx"), std::string("libkernel_web.prx")}) { + const auto other = variant == "libkernel_sys.prx" ? "libkernel_web.prx" : "libkernel_sys.prx"; Domain::SysVDynamicSection dynamic; dynamic.DynStrData.insert(dynamic.DynStrData.end(), variant.begin(), variant.end()); dynamic.DynStrData.push_back(0); dynamic.DynamicSegmentData.resize(16); Io::WriteU64(dynamic.DynamicSegmentData, 0, 1); Io::WriteU64(dynamic.DynamicSegmentData, 8, 0); - require(WindowsImportBuilder().ReadLibraries(dynamic) == std::vector{variant, "libkernel.prx", "libc.prx"}, + require(WindowsImportBuilder().ReadLibraries(dynamic) == std::vector{variant, "libkernel.prx", other, "libc.prx"}, variant + ": canonical kernel fallback and its libc provider are not loaded after the requested module"); } } +void stubRejectsAnEntryBeyondTheWrapBoundary() { + bool threw = false; + try { + static_cast(Elfpatcher::EntryStubBuilder().BuildEntryStub(0x1000, 0xFFFFFFFFFFFFF000)); + } catch (const Domain::RelinkerException& error) { + threw = std::string(error.what()).find("rel32") != std::string::npos; + } + require(threw, "an entry point more than 2^63 from the stub was accepted with a wrapped displacement"); +} + } int main() { try { stubTerminatesTheFrameChain(); + stubRejectsAnEntryBeyondTheWrapBoundary(); windowsStubLoadsTheAllocatorFirst("C:/Games/Title/libs", u"C:\\Games\\Title\\libs\\", {0x48, 0x8d, 0x0d}); windowsStubLoadsTheAllocatorFirst("$ORIGIN/libs", u"libs\\", {0x48, 0x8d, 0x35}); windowsStubLoadsTheAllocatorOnRequest("C:/Games/Title/libs", u"C:\\Games\\Title\\libs\\", {0x48, 0x8d, 0x0d}); diff --git a/core/relinker/elfpatcher/tests/LinuxLoadPageTests.cpp b/core/relinker/elfpatcher/tests/LinuxLoadPageTests.cpp index d96fb4cebbbe..66b2b7138ecf 100644 --- a/core/relinker/elfpatcher/tests/LinuxLoadPageTests.cpp +++ b/core/relinker/elfpatcher/tests/LinuxLoadPageTests.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -162,6 +163,69 @@ void ZeroFileBytesStayInPlace() { Require(OutputOffset(output, 0x2c20) == 0x2c20, "a segment whose page already reads right was moved"); } +std::uint64_t VaddrOf(const Bytes& output, const std::uint64_t fileOffset) { + for (const auto& load : OutputLoads(output)) + if (fileOffset >= load.Offset && fileOffset < load.Offset + load.FileSize) + return load.MappedAddress + (fileOffset - load.Offset); + throw std::runtime_error("linux load pages: file offset is not covered by an output PT_LOAD"); +} + +void TrampolineDisplacementAcrossInt64Max() { + using Codegen::Amd64OnlySubstitutionTable::kJmpRel32; + auto source = Fixture(0x3000); + const Bytes insertq = {0xF2, 0x0F, 0x79, 0xD1, 0x10, 0x20}; + std::copy(insertq.begin(), insertq.end(), source.begin() + 0x500); + Write(source, 24, 0x7FFFFFFFFFFFE100); + const std::vector headers{ + Load(0x400, 0x7FFFFFFFFFFFE000, 0x2000, 0x2000, 5), + }; + Codegen::TrampolineSite site; + site.Offset = 0x500; + site.Address = 0x7FFFFFFFFFFFE100; + site.Length = insertq.size(); + site.OriginalBytes = insertq; + site.Body = {0xE9, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xAD, 0xBE, 0xEF, 0xC3}; + site.ReturnBranchOffset = 0; + const auto output = Patcher().Patch(source, headers, {}, 0, "$ORIGIN/libs", true, false, {site}); + const Bytes tail(site.Body.begin() + site.ReturnBranchOffset + kJmpRel32.Size, site.Body.end()); + const auto tailStart = std::search(output.begin(), output.end(), tail.begin(), tail.end()); + Require(tailStart != output.end(), "the trampoline body is missing from the output"); + const auto bodyOff = static_cast(tailStart - output.begin()) - site.ReturnBranchOffset - kJmpRel32.Size; + const auto bodyVaddr = VaddrOf(output, bodyOff); + Require(bodyVaddr >= 0x8000000000000000, "the trampoline body did not land above 2^63"); + const auto jumpDisplacement = static_cast(bodyVaddr - (site.Address + kJmpRel32.Size)); + const auto returnDisplacement = static_cast(site.Address + site.Length - (bodyVaddr + site.ReturnBranchOffset + kJmpRel32.Size)); + Require(Read(output, site.Offset) == kJmpRel32.Bytes[0], "the trampoline site was not rewritten as a rel32 jump"); + Require(Read(output, site.Offset + 1) == static_cast(jumpDisplacement), "the trampoline jump displacement is wrong"); + Require(Read(output, bodyOff + site.ReturnBranchOffset + 1) == static_cast(returnDisplacement), "the trampoline return displacement is wrong"); +} + +void TrampolineDisplacementBeyondInt64Range() { + using Codegen::Amd64OnlySubstitutionTable::kJmpRel32; + auto source = Fixture(0x3000); + const Bytes insertq = {0xF2, 0x0F, 0x79, 0xD1, 0x10, 0x20}; + std::copy(insertq.begin(), insertq.end(), source.begin() + 0x500); + Write(source, 24, 0xFFFFFFFFFFFFE100); + const std::vector headers{ + Load(0x400, 0x400, 0x1000, 0x1000, 5), + Load(0x2000, 0xFFFFFFFFFFFFE000, 0x800, 0x800, 5), + }; + Codegen::TrampolineSite site; + site.Offset = 0x500; + site.Address = 0x500; + site.Length = insertq.size(); + site.OriginalBytes = insertq; + site.Body = {0xE9, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xAD, 0xBE, 0xEF, 0xC3}; + site.ReturnBranchOffset = 0; + bool threw = false; + try { + (void)Patcher().Patch(source, headers, {}, 0, "$ORIGIN/libs", true, false, {site}); + } catch (const Domain::RelinkerException& error) { + threw = std::string(error.what()).find("rel32") != std::string::npos; + } + Require(threw, "a trampoline whose site and body are more than 2^63 apart was accepted with a wrapped displacement"); +} + } int main() { @@ -169,6 +233,8 @@ int main() { ZeroFillBelowTheNextSegment(); DataAndZeroFillBelowTheNextSegment(); ZeroFileBytesStayInPlace(); + TrampolineDisplacementAcrossInt64Max(); + TrampolineDisplacementBeyondInt64Range(); } catch (const std::exception& error) { std::cerr << error.what() << '\n'; return 1; diff --git a/core/relinker/elfpatcher/tests/WindowsDependencyDiagnosticsTests.cpp b/core/relinker/elfpatcher/tests/WindowsDependencyDiagnosticsTests.cpp index 45ce2bf9542b..87619d031f8a 100644 --- a/core/relinker/elfpatcher/tests/WindowsDependencyDiagnosticsTests.cpp +++ b/core/relinker/elfpatcher/tests/WindowsDependencyDiagnosticsTests.cpp @@ -47,16 +47,16 @@ void checkRuntimeDependencies() { throw std::runtime_error("Incorrect Windows runtime dependency visibility"); }; check({}, {}); - check({"libkernel.prx"}, {"libkernel.prx", "libc.prx"}); - check({"libkernel.prx", "libc.prx"}, {"libkernel.prx", "libc.prx"}); + check({"libkernel.prx"}, {"libkernel.prx", "libkernel_sys.prx", "libkernel_web.prx", "libc.prx"}); + check({"libkernel.prx", "libc.prx"}, {"libkernel.prx", "libc.prx", "libkernel_sys.prx", "libkernel_web.prx"}); check({"libSceLibcInternal.prx", "libkernel.prx"}, - {"libSceLibcInternal.prx", "libkernel.prx", "libc.prx"}); + {"libSceLibcInternal.prx", "libkernel.prx", "libkernel_sys.prx", "libkernel_web.prx", "libc.prx"}); check({"libc.prx", "libSceLibcInternal.prx"}, {"libc.prx", "libSceLibcInternal.prx"}); check({"libSceVideoOut.prx", "libkernel.prx", "libSceVideoOut.prx"}, - {"libSceVideoOut.prx", "libkernel.prx", "libc.prx"}); - check({"libkernel_sys.prx"}, {"libkernel_sys.prx", "libkernel.prx", "libc.prx"}); - check({"libkernel_web.prx"}, {"libkernel_web.prx", "libkernel.prx", "libc.prx"}); + {"libSceVideoOut.prx", "libkernel.prx", "libkernel_sys.prx", "libkernel_web.prx", "libc.prx"}); + check({"libkernel_sys.prx"}, {"libkernel_sys.prx", "libkernel.prx", "libkernel_web.prx", "libc.prx"}); + check({"libkernel_web.prx"}, {"libkernel_web.prx", "libkernel.prx", "libkernel_sys.prx", "libc.prx"}); check({"libSceVideoOut.prx", "libSceVideoOut.prx"}, {"libSceVideoOut.prx"}); } diff --git a/core/relinker/elfpatcher/tests/WindowsEntryStubAllocation.cpp b/core/relinker/elfpatcher/tests/WindowsEntryStubAllocation.cpp new file mode 100644 index 000000000000..b550fd7ad7de --- /dev/null +++ b/core/relinker/elfpatcher/tests/WindowsEntryStubAllocation.cpp @@ -0,0 +1,16 @@ +#include +#include +#include + +namespace WindowsEntryStubAllocation { +std::size_t largest = 0; +} + +void* operator new(std::size_t size) { + if (size > WindowsEntryStubAllocation::largest) WindowsEntryStubAllocation::largest = size; + if (void* memory = std::malloc(size == 0 ? 1 : size)) return memory; + throw std::bad_alloc(); +} + +void operator delete(void* memory) noexcept { std::free(memory); } +void operator delete(void* memory, std::size_t) noexcept { std::free(memory); } diff --git a/core/relinker/elfpatcher/tests/WindowsEntryStubBoundsTests.cpp b/core/relinker/elfpatcher/tests/WindowsEntryStubBoundsTests.cpp new file mode 100644 index 000000000000..21d82aa50499 --- /dev/null +++ b/core/relinker/elfpatcher/tests/WindowsEntryStubBoundsTests.cpp @@ -0,0 +1,58 @@ +#include +#include +#include +#include +#include +#include +#include + +namespace WindowsEntryStubAllocation { +extern std::size_t largest; +} + +namespace { + +void require(const bool condition, const std::string& message) { + if (!condition) throw std::runtime_error(message); +} + +void checkNormalAllocation(const Elfpatcher::Windows::WindowsImports& imports, const std::uint32_t dataRva) { + WindowsEntryStubAllocation::largest = 0; + const auto stub = Elfpatcher::Windows::WindowsEntryStubBuilder().Build( + dataRva, 0x1000, imports, {}, {}, ".", false, false); + require(!stub.Data.Data.empty(), "Normal entry-stub allocation was empty"); + require(WindowsEntryStubAllocation::largest > 4096, "The allocation tracker missed the startup buffers"); +} + +void checkBoundaryBeforeAllocation(const Elfpatcher::Windows::WindowsImports& imports) { + constexpr auto limit = std::numeric_limits::max(); + constexpr std::uint32_t remaining = 4096; + WindowsEntryStubAllocation::largest = 0; + try { + Elfpatcher::Windows::WindowsEntryStubBuilder().Build( + limit - remaining, 0x1000, imports, {}, {}, ".", false, false); + } catch (const Domain::RelinkerException& error) { + const auto largest = WindowsEntryStubAllocation::largest; + require(std::string(error.what()) == "PE image exceeds the supported 2 GiB address range", + "The entry-stub boundary failed with another error"); + require(error.FailureOffset > limit, "The rejected endpoint was within the supported range"); + require(largest <= remaining, "The entry stub allocated past the RVA limit before rejecting it"); + return; + } + throw std::runtime_error("An entry-stub allocation crossing the 2 GiB limit was accepted"); +} + +} + +int main() { + try { + const auto imports = Elfpatcher::Windows::WindowsImportBuilder().Build(0x1000); + checkNormalAllocation(imports, 0x10000); + checkNormalAllocation(imports, std::numeric_limits::max() - 1024 * 1024); + checkBoundaryBeforeAllocation(imports); + } catch (const std::exception& error) { + std::cerr << error.what() << '\n'; + return 1; + } + return 0; +} diff --git a/core/relinker/relinker/include/relinker/guest/GuestImage.hpp b/core/relinker/relinker/include/relinker/guest/GuestImage.hpp index 82b31f60867c..2d6b51a189b2 100644 --- a/core/relinker/relinker/include/relinker/guest/GuestImage.hpp +++ b/core/relinker/relinker/include/relinker/guest/GuestImage.hpp @@ -55,6 +55,7 @@ struct GuestImage { std::uint64_t Init = 0; bool HasInit = false; std::uint64_t Fini = 0; + bool HasFini = false; std::uint64_t Got = 0; bool UsePlatformTlsResolver = true; bool Symbolic = false; diff --git a/core/relinker/relinker/src/analysis/CodeInstructionCollector.cpp b/core/relinker/relinker/src/analysis/CodeInstructionCollector.cpp index 4c2355bed94b..9297528c1643 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; } @@ -229,14 +232,28 @@ std::set CodeInstructionCollector::Collect(const std::ve range(0, 64); if (const auto entry = Io::ReadU64(bytes, 24); entry != 0) addRoot(entry); if (const auto init = value(12, 0x6000000c)) addRoot(*init); - if (const auto fini = value(13, 0x6000000d); fini && *fini != 0) addRoot(*fini); + if (const auto fini = value(13, 0x6000000d)) addRoot(*fini); const auto symbolBytes = value(0x6100003f, 0xffffffffffffffffull); std::uint64_t symbolCount = 0; if (symbolBytes) { if (*symbolBytes % 24 != 0) throw Domain::RelinkerException("Code analysis: invalid symbol table size"); symbolCount = *symbolBytes / 24; - } else if (tags.contains(4)) symbolCount = Io::ReadU32(bytes, fileOffset(tags.at(4), 8) + 4); - else if (tags.contains(0x6ffffef5)) { + } else if (tags.contains(4)) { + const auto address = tags.at(4); + const auto header = fileOffset(address, 8); + const auto nbucket = Io::ReadU32(bytes, header); + const auto nchain = Io::ReadU32(bytes, header + 4); + if (nbucket == 0 || nchain == 0) + throw Domain::RelinkerException("Code analysis: invalid SysV hash header", address); + const std::uint64_t hashSize = 8 + static_cast(nbucket) * 4 + static_cast(nchain) * 4; + const auto start = fileOffset(address, hashSize); + for (std::uint64_t index = 0; index < nbucket; ++index) { + const auto bucket = Io::ReadU32(bytes, start + 8 + index * 4); + if (bucket >= nchain) + throw Domain::RelinkerException("Code analysis: invalid SysV hash bucket index", address); + } + symbolCount = nchain; + } else if (tags.contains(0x6ffffef5)) { const auto address = tags.at(0x6ffffef5); const auto header = fileOffset(address, 16); const auto bucketCount = Io::ReadU32(bytes, header); @@ -246,6 +263,8 @@ std::set CodeInstructionCollector::Collect(const std::ve throw Domain::RelinkerException("Code analysis: invalid GNU hash header", address); const std::uint64_t bucketOffset = 16 + static_cast(bloomCount) * 8; const auto chainOffset = bucketOffset + static_cast(bucketCount) * 4; + if (chainOffset > std::numeric_limits::max() - address) + throw Domain::RelinkerException("Code analysis: invalid GNU hash header", address); const auto start = fileOffset(address, chainOffset); std::uint64_t lastBucket = 0; for (std::uint64_t index = 0; index < bucketCount; ++index) { @@ -258,11 +277,15 @@ std::set CodeInstructionCollector::Collect(const std::ve if (lastBucket != 0) { symbolCount = lastBucket; for (;;) { + if (symbolCount - firstSymbol > (std::numeric_limits::max() - chainOffset) / 4) + throw Domain::RelinkerException("Code analysis: invalid GNU hash chain", address); const auto offset = chainOffset + (symbolCount - firstSymbol) * 4; if (offset > std::numeric_limits::max() - address) throw Domain::RelinkerException("Code analysis: invalid GNU hash chain", address); const auto chain = Io::ReadU32(bytes, fileOffset(address + offset, 4)); ++symbolCount; + if (symbolCount > std::numeric_limits::max()) + throw Domain::RelinkerException("Code analysis: invalid GNU hash chain", address); if (chain & 1) break; } } diff --git a/core/relinker/relinker/src/analysis/RelativeJumpTables.cpp b/core/relinker/relinker/src/analysis/RelativeJumpTables.cpp index 0171c49c9b89..799cc59c2061 100644 --- a/core/relinker/relinker/src/analysis/RelativeJumpTables.cpp +++ b/core/relinker/relinker/src/analysis/RelativeJumpTables.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -249,6 +250,9 @@ std::size_t FindEmbeddedDataTableEnd(std::span code, Virtual } std::size_t FindTrailingRelativeJumpTable(std::span code, VirtualAddress codeAddress, std::size_t* tableEnd, std::size_t unwindEnd) { + if (code.size() > std::numeric_limits::max() - codeAddress) { + throw RelinkerException("Text section range exceeds the address space"); + } const Codegen::X64InstructionDecoder decoder; std::vector loads; std::vector instructionStarts(code.size() + 1, false); @@ -298,6 +302,9 @@ std::size_t FindTrailingRelativeJumpTable(std::span code, Vi } std::vector FindRelativeJumpTables(std::span segment, VirtualAddress segmentVAddr, const std::vector>& functions) { + if (segment.size() > std::numeric_limits::max() - segmentVAddr) { + throw RelinkerException("Text section range exceeds the address space"); + } std::vector tables; const auto segmentEnd = segmentVAddr + segment.size(); const Codegen::X64InstructionDecoder decoder; diff --git a/core/relinker/relinker/src/analysis/UnusedNidFilter/ControlFlowGraph.cpp b/core/relinker/relinker/src/analysis/UnusedNidFilter/ControlFlowGraph.cpp index d8c89bcffbd7..dfaab81f7586 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 b141b5b4b8d9..5045239694fd 100644 --- a/core/relinker/relinker/src/analysis/UnusedNidFilter/EhFrameReader.cpp +++ b/core/relinker/relinker/src/analysis/UnusedNidFilter/EhFrameReader.cpp @@ -140,7 +140,7 @@ class Reader { 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 947521c4290b..3a095c196c94 100644 --- a/core/relinker/relinker/src/analysis/UnusedNidFilter/EntryPointCollector.cpp +++ b/core/relinker/relinker/src/analysis/UnusedNidFilter/EntryPointCollector.cpp @@ -133,7 +133,10 @@ class EntryPointCollector : public IEntryPointCollector { } } 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/src/analysis/UnusedNidFilter/PltCompactor.cpp b/core/relinker/relinker/src/analysis/UnusedNidFilter/PltCompactor.cpp index 6632f2e0ae7e..472decc16209 100644 --- a/core/relinker/relinker/src/analysis/UnusedNidFilter/PltCompactor.cpp +++ b/core/relinker/relinker/src/analysis/UnusedNidFilter/PltCompactor.cpp @@ -7,6 +7,12 @@ namespace Relinker::UnusedNidFilter { CompactedPlt CompactPlt(const std::vector& originalReferences, const std::vector& keptReferences, const std::vector& text, VirtualAddress textVaddr, FileByteOffset textOffset, FileByteOffset tableOffset) { + if (text.size() > std::numeric_limits::max() - textVaddr) { + throw RelinkerException("Text section range exceeds the address space"); + } + if (text.size() > std::numeric_limits::max() - textOffset) { + throw RelinkerException("Strict filter: PLT patch offset overflow", textOffset); + } CompactedPlt result; result.References = keptReferences; std::unordered_map originalSlots; diff --git a/core/relinker/relinker/src/guest/GuestImageReader.cpp b/core/relinker/relinker/src/guest/GuestImageReader.cpp index 03287bb37f14..35e9334bd845 100644 --- a/core/relinker/relinker/src/guest/GuestImageReader.cpp +++ b/core/relinker/relinker/src/guest/GuestImageReader.cpp @@ -125,8 +125,20 @@ GuestImage GuestImageReader::Read(const std::filesystem::path& path, std::vector if (strSize == 0 || bytes[strOffset] != 0 || get(11, 0x6100003b) != 24) fail("Invalid string or symbol table"); std::uint64_t symSize = 0; if (tags.contains(0x6100003f)) symSize = tags.at(0x6100003f); - else if (tags.contains(4)) symSize = static_cast(Io::ReadU32(bytes, translate(tags.at(4), 8) + 4)) * 24; - else if (tags.contains(0x6ffffef5)) { + else if (tags.contains(4)) { + const auto address = tags.at(4); + const auto header = translate(address, 8); + const auto nbucket = Io::ReadU32(bytes, header); + const auto nchain = Io::ReadU32(bytes, header + 4); + if (nbucket == 0 || nchain == 0) fail("Invalid SysV hash header"); + const std::uint64_t hashSize = 8 + static_cast(nbucket) * 4 + static_cast(nchain) * 4; + const auto start = translate(address, hashSize); + for (std::uint64_t index = 0; index < nbucket; ++index) { + const auto bucket = Io::ReadU32(bytes, start + 8 + index * 4); + if (bucket >= nchain) fail("Invalid SysV hash bucket index"); + } + symSize = static_cast(nchain) * 24; + } else if (tags.contains(0x6ffffef5)) { const auto address = tags.at(0x6ffffef5); const auto header = translate(address, 16); const auto bucketCount = Io::ReadU32(bytes, header); @@ -135,6 +147,7 @@ GuestImage GuestImageReader::Read(const std::filesystem::path& path, std::vector if (bucketCount == 0 || bloomCount == 0 || firstSymbol == 0) fail("Invalid GNU hash header"); const std::uint64_t bucketOffset = 16 + static_cast(bloomCount) * 8; const auto chainOffset = bucketOffset + static_cast(bucketCount) * 4; + if (chainOffset > std::numeric_limits::max() - address) fail("Invalid GNU hash header"); const auto start = translate(address, chainOffset); std::uint64_t lastBucket = 0; for (std::uint64_t index = 0; index < bucketCount; ++index) { @@ -146,10 +159,12 @@ GuestImage GuestImageReader::Read(const std::filesystem::path& path, std::vector if (lastBucket != 0) { symbolCount = lastBucket; for (;;) { + if (symbolCount - firstSymbol > (std::numeric_limits::max() - chainOffset) / 4) fail("Invalid GNU hash chain"); const auto offset = chainOffset + (symbolCount - firstSymbol) * 4; if (offset > std::numeric_limits::max() - address) fail("Invalid GNU hash chain"); const auto chain = Io::ReadU32(bytes, translate(address + offset, 4)); ++symbolCount; + if (symbolCount > std::numeric_limits::max()) fail("Invalid GNU hash chain"); if (chain & 1) break; } } @@ -297,9 +312,12 @@ GuestImage GuestImageReader::Read(const std::filesystem::path& path, std::vector image.Init = tags.at(12); image.HasInit = true; } - if (tags.contains(13)) image.Fini = tags.at(13); + if (tags.contains(13)) { + image.Fini = tags.at(13); + image.HasFini = true; + } if (image.HasInit) mapped(image.Init, 1, 1); - if (image.Fini != 0) mapped(image.Fini, 1, 1); + if (image.HasFini) mapped(image.Fini, 1, 1); const auto readLifecycleArray = [&](std::uint64_t addressTag, std::uint64_t sizeTag, std::vector& entries) { if (!tags.contains(sizeTag)) return; if (tags.at(sizeTag) != 0 && !tags.contains(addressTag)) fail("Incomplete guest lifecycle array"); diff --git a/core/relinker/relinker/tests/ControlFlowGraphTests.cpp b/core/relinker/relinker/tests/ControlFlowGraphTests.cpp index aa79bae7f0f3..4279e3741cb4 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() { @@ -265,6 +306,27 @@ void CheckAddressOverflow() { threw = true; } Require(threw, "Text section address space overflow was not rejected"); + + threw = false; + try { + Relinker::FindRelativeJumpTables(text, std::numeric_limits::max(), {}); + } catch (const RelinkerException&) { + threw = true; + } + Require(threw, "Relative jump table text section address space overflow was not rejected"); + + threw = false; + try { + std::size_t tableEnd = 0; + Relinker::FindTrailingRelativeJumpTable(text, std::numeric_limits::max(), &tableEnd); + } catch (const RelinkerException&) { + threw = true; + } + Require(threw, "Trailing relative jump table address space overflow was not rejected"); + + const auto lastAddress = std::numeric_limits::max() - text.size(); + Require(Relinker::FindRelativeJumpTables(text, lastAddress, {}).empty(), "Relative jump tables at the end of the address space were rejected"); + Require(Relinker::FindTrailingRelativeJumpTable(text, lastAddress) == text.size(), "Trailing relative jump table at the end of the address space was rejected"); } void CheckHighVirtualAddress() { @@ -626,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 ffee97066f86..60a5bb4e854f 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(); @@ -434,6 +477,66 @@ void relocationValidation() { } +void sysvHashBoundsInCodeInstructionCollector() { + auto baseImage = fixture(); + const auto parseHeaders = [](const std::vector& bytes) { + std::vector headers; + const auto count = Io::ReadU16(bytes, 56); + for (std::size_t i = 0; i < count; ++i) { + const auto at = 64 + i * 56; + Domain::ProgramHeader h{}; + h.Type = Io::ReadU32(bytes, at); + h.Flags = Io::ReadU32(bytes, at + 4); + h.Offset = Io::ReadU64(bytes, at + 8); + h.MappedAddress = Io::ReadU64(bytes, at + 16); + h.FileSize = Io::ReadU64(bytes, at + 32); + h.MemorySize = Io::ReadU64(bytes, at + 40); + headers.push_back(h); + } + return headers; + }; + const auto headers = parseHeaders(baseImage); + const auto checkRejection = [&](const std::vector& img, std::string_view expected) { + try { + Relinker::CodeInstructionCollector().Collect(img, headers); + throw std::runtime_error("Collector accepted invalid SysV hash table"); + } catch (const Domain::RelinkerException& error) { + require(std::string(error.what()).find(expected) != std::string::npos, "Wrong error message from collector"); + } + }; + { + auto zeroBucket = baseImage; + Io::WriteU32(zeroBucket, 0x2680, 0); + checkRejection(zeroBucket, "invalid SysV hash header"); + } + { + auto zeroChain = baseImage; + Io::WriteU32(zeroChain, 0x2684, 0); + checkRejection(zeroChain, "invalid SysV hash header"); + } + { + auto oobBucket = baseImage; + Io::WriteU32(oobBucket, 0x2688, 4); + checkRejection(oobBucket, "invalid SysV hash bucket index"); + } + { + auto tableOob = baseImage; + Io::WriteU32(tableOob, 0x2684, 0x2000); + checkRejection(tableOob, "unmapped address"); + } + { + auto lastBucket = baseImage; + Io::WriteU32(lastBucket, 0x2680, 2); + Io::WriteU32(lastBucket, 0x268c, 1); + checkRejection(lastBucket, "invalid SysV hash bucket index"); + } + { + auto chainPastSegment = baseImage; + Io::WriteU32(chainPastSegment, 0x2680, 0x25e); + checkRejection(chainPastSegment, "unmapped address"); + } +} + int main() { try { convert(); @@ -447,6 +550,7 @@ int main() { baseRelocations(); runtimeDirectories(); relocationValidation(); + sysvHashBoundsInCodeInstructionCollector(); } catch (const std::exception& error) { std::cerr << error.what() << '\n'; return 1; diff --git a/core/relinker/relinker/tests/ElfFixture.hpp b/core/relinker/relinker/tests/ElfFixture.hpp index 2ed1a52cae32..e50f6444abdd 100644 --- a/core/relinker/relinker/tests/ElfFixture.hpp +++ b/core/relinker/relinker/tests/ElfFixture.hpp @@ -8,8 +8,15 @@ #include #include #include +#ifdef _WIN32 +#ifndef NOMINMAX +#define NOMINMAX +#endif +#include +#else #include #include +#endif namespace RelinkerTests { @@ -112,13 +119,58 @@ inline Bytes MakeModule(const std::span code) { return image; } +#ifdef _WIN32 +inline DWORD WindowsProtection(const bool read, const bool write, const bool execute) { + if (execute) return write ? PAGE_EXECUTE_READWRITE : read ? PAGE_EXECUTE_READ : PAGE_EXECUTE; + if (write) return PAGE_READWRITE; + return read ? PAGE_READONLY : PAGE_NOACCESS; +} +#endif + +inline std::uint64_t PageSize() { +#ifdef _WIN32 + SYSTEM_INFO system{}; + GetSystemInfo(&system); + return system.dwPageSize; +#else + return static_cast(sysconf(_SC_PAGESIZE)); +#endif +} + +inline void* MapImageMemory(const std::size_t size) { +#ifdef _WIN32 + return VirtualAlloc(nullptr, size, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE); +#else + void* base = mmap(nullptr, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + return base == MAP_FAILED ? nullptr : base; +#endif +} + +inline bool ProtectImageMemory(void* address, const std::size_t size, const bool read, const bool write, const bool execute) { +#ifdef _WIN32 + DWORD previous = 0; + return VirtualProtect(address, size, WindowsProtection(read, write, execute), &previous) != 0; +#else + return mprotect(address, size, (read ? PROT_READ : 0) | (write ? PROT_WRITE : 0) | (execute ? PROT_EXEC : 0)) == 0; +#endif +} + +inline void UnmapImageMemory(void* address, const std::size_t size) { +#ifdef _WIN32 + (void)size; + VirtualFree(address, 0, MEM_RELEASE); +#else + munmap(address, size); +#endif +} + class MappedImage { public: explicit MappedImage(const Bytes& elf) { const auto phOffset = Read(elf, 32); const auto phSize = Read(elf, 54); const auto phCount = Read(elf, 56); - const auto page = static_cast(sysconf(_SC_PAGESIZE)); + const auto page = PageSize(); linkBase = std::numeric_limits::max(); std::uint64_t last = 0; for (std::uint16_t index = 0; index < phCount; ++index) { @@ -129,8 +181,8 @@ class MappedImage { } if (last == 0) throw std::runtime_error("ELF has no PT_LOAD segment"); size = static_cast(last - linkBase); - base = mmap(nullptr, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - if (base == MAP_FAILED) throw std::runtime_error("Cannot map executable memory for the ELF image"); + base = MapImageMemory(size); + if (base == nullptr) throw std::runtime_error("Cannot map executable memory for the ELF image"); for (std::uint16_t index = 0; index < phCount; ++index) { const auto header = phOffset + index * phSize; if (Read(elf, header) != 1) continue; @@ -139,7 +191,7 @@ class MappedImage { if (offset > elf.size() || fileSize > elf.size() - offset) throw std::runtime_error("PT_LOAD exceeds the ELF file"); std::memcpy(static_cast(base) + (Read(elf, header + 16) - linkBase), elf.data() + offset, fileSize); } - if (mprotect(base, size, PROT_NONE) != 0) throw std::runtime_error("Cannot protect the ELF image"); + if (!ProtectImageMemory(base, size, false, false, false)) throw std::runtime_error("Cannot protect the ELF image"); for (std::uint16_t index = 0; index < phCount; ++index) { const auto header = phOffset + index * phSize; if (Read(elf, header) != 1) continue; @@ -147,8 +199,7 @@ class MappedImage { const auto vaddr = Read(elf, header + 16) - linkBase; const auto start = vaddr / page * page; const auto end = (vaddr + Read(elf, header + 40) + page - 1) / page * page; - const int protection = ((flags & 4) != 0 ? PROT_READ : 0) | ((flags & 2) != 0 ? PROT_WRITE : 0) | ((flags & 1) != 0 ? PROT_EXEC : 0); - if (mprotect(static_cast(base) + start, std::min(end, size) - start, protection) != 0) throw std::runtime_error("Cannot apply PT_LOAD permissions"); + if (!ProtectImageMemory(static_cast(base) + start, std::min(end, size) - start, (flags & 4) != 0, (flags & 2) != 0, (flags & 1) != 0)) throw std::runtime_error("Cannot apply PT_LOAD permissions"); } } @@ -156,7 +207,7 @@ class MappedImage { MappedImage& operator=(const MappedImage&) = delete; ~MappedImage() { - munmap(base, size); + UnmapImageMemory(base, size); } template diff --git a/core/relinker/relinker/tests/GuestIntelTrampolinesTests.cpp b/core/relinker/relinker/tests/GuestIntelTrampolinesTests.cpp index ff50df293fb2..3ac63ff7bf4d 100644 --- a/core/relinker/relinker/tests/GuestIntelTrampolinesTests.cpp +++ b/core/relinker/relinker/tests/GuestIntelTrampolinesTests.cpp @@ -1,5 +1,6 @@ #include "ElfFixture.hpp" #include "RelinkerProcess.hpp" +#include "prx/libc/include/general/VabiMacros.hpp" #include #include #include @@ -29,6 +30,8 @@ const Bytes kModuleCode = { constexpr std::uint64_t kSites[] = {10, 16}; constexpr std::size_t kSiteLength = 6; +using SseStub = std::uint64_t APS5_VABI (std::uint64_t, std::uint64_t); + std::uint64_t expected(const std::uint64_t value, const std::uint64_t destination) { return (destination & ~0xFF0000ull) | (((value >> 8) & 0xFF) << 16); } @@ -62,7 +65,7 @@ int main(const int argc, char** argv) { require(site + 5 + displacement >= kCodeSize, "Guest module SSE4a stub is inside the original code segment"); } - const auto function = image.At(0); + const auto function = image.At(0); for (const auto [value, destination] : {std::pair{0x1122334455667788ull, 0x0123456789ABCDEFull}, {0ull, ~0ull}, {~0ull, 0ull}, {0x9E3779B97F4A7C15ull, 0x0F1E2D3C4B5A6978ull}}) require(function(value, destination) == expected(value, destination), "Relinked guest module trampolines computed the wrong value"); std::cout << "Guest Intel trampoline execution tests passed\n"; diff --git a/core/relinker/relinker/tests/RelinkerProcess.hpp b/core/relinker/relinker/tests/RelinkerProcess.hpp index b642783fe401..79429d7164a7 100644 --- a/core/relinker/relinker/tests/RelinkerProcess.hpp +++ b/core/relinker/relinker/tests/RelinkerProcess.hpp @@ -7,6 +7,13 @@ #include #include #include +#ifdef _WIN32 +#ifndef NOMINMAX +#define NOMINMAX +#endif +#include +#include +#else #include #include #include @@ -14,15 +21,29 @@ #include extern char** environ; +#endif namespace RelinkerTests { class TempDirectory { public: TempDirectory() { +#ifdef _WIN32 + std::random_device random; + for (int attempt = 0; attempt < 100; ++attempt) { + auto candidate = std::filesystem::temp_directory_path() / ("anyps5-relinker-" + std::to_string(random())); + std::error_code error; + if (std::filesystem::create_directory(candidate, error)) { + path = candidate; + return; + } + } + throw std::runtime_error("Cannot create a temporary directory"); +#else auto pattern = (std::filesystem::temp_directory_path() / "anyps5-relinker-XXXXXX").string(); if (mkdtemp(pattern.data()) == nullptr) throw std::runtime_error("Cannot create a temporary directory"); path = pattern; +#endif } TempDirectory(const TempDirectory&) = delete; @@ -46,7 +67,62 @@ struct RelinkerRun { std::string Output; }; +#ifdef _WIN32 +inline std::wstring QuoteArgument(const std::wstring& argument) { + std::wstring quoted = L"\""; + std::size_t backslashes = 0; + for (const auto character : argument) { + if (character == L'\\') { + ++backslashes; + continue; + } + quoted.append(character == L'"' ? backslashes * 2 + 1 : backslashes, L'\\'); + backslashes = 0; + quoted.push_back(character); + } + quoted.append(backslashes * 2, L'\\'); + quoted.push_back(L'"'); + return quoted; +} +#endif + inline RelinkerRun RunRelinker(const std::filesystem::path& relinker, const std::vector& arguments, const std::filesystem::path& logPath) { +#ifdef _WIN32 + std::wstring commandLine = QuoteArgument(relinker.wstring()); + for (const auto& argument : arguments) commandLine += L" " + QuoteArgument(std::filesystem::path(argument).wstring()); + SECURITY_ATTRIBUTES inheritable{sizeof(inheritable), nullptr, TRUE}; + const HANDLE logFile = CreateFileW(logPath.c_str(), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, &inheritable, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); + if (logFile == INVALID_HANDLE_VALUE) throw std::runtime_error("Cannot create the relinker log"); + SIZE_T attributeBytes = 0; + InitializeProcThreadAttributeList(nullptr, 1, 0, &attributeBytes); + std::vector attributeStorage(attributeBytes); + const auto attributes = reinterpret_cast(attributeStorage.data()); + HANDLE inherited[] = {logFile}; + if (!InitializeProcThreadAttributeList(attributes, 1, 0, &attributeBytes)) { + CloseHandle(logFile); + throw std::runtime_error("Cannot prepare the relinker's inherited handles"); + } + const bool listed = UpdateProcThreadAttribute(attributes, 0, PROC_THREAD_ATTRIBUTE_HANDLE_LIST, inherited, sizeof(inherited), nullptr, nullptr) != 0; + STARTUPINFOEXW startup{}; + startup.StartupInfo.cb = sizeof(startup); + startup.StartupInfo.dwFlags = STARTF_USESTDHANDLES; + startup.StartupInfo.hStdOutput = logFile; + startup.StartupInfo.hStdError = logFile; + startup.lpAttributeList = attributes; + PROCESS_INFORMATION process{}; + const bool spawned = listed && CreateProcessW(relinker.c_str(), commandLine.data(), nullptr, nullptr, TRUE, EXTENDED_STARTUPINFO_PRESENT, + nullptr, nullptr, &startup.StartupInfo, &process) != 0; + DeleteProcThreadAttributeList(attributes); + CloseHandle(logFile); + if (!spawned) throw std::runtime_error("Cannot start the relinker"); + DWORD exitCode = 0; + const bool waited = WaitForSingleObject(process.hProcess, INFINITE) == WAIT_OBJECT_0 && GetExitCodeProcess(process.hProcess, &exitCode) != 0; + CloseHandle(process.hThread); + CloseHandle(process.hProcess); + if (!waited) throw std::runtime_error("Cannot wait for the relinker"); + RelinkerRun run; + run.ExitCode = static_cast(exitCode); +#else std::vector owned{relinker.string()}; owned.insert(owned.end(), arguments.begin(), arguments.end()); std::vector argv; @@ -64,6 +140,7 @@ inline RelinkerRun RunRelinker(const std::filesystem::path& relinker, const std: if (waitpid(pid, &status, 0) != pid) throw std::runtime_error("Cannot wait for the relinker"); RelinkerRun run; if (WIFEXITED(status)) run.ExitCode = WEXITSTATUS(status); +#endif std::ifstream log(logPath, std::ios::binary); run.Output.assign(std::istreambuf_iterator(log), std::istreambuf_iterator()); return run; diff --git a/core/relinker/relinker/tests/StrictNidFilterTests.cpp b/core/relinker/relinker/tests/StrictNidFilterTests.cpp index 8c4d4030e027..edd4833ca10f 100644 --- a/core/relinker/relinker/tests/StrictNidFilterTests.cpp +++ b/core/relinker/relinker/tests/StrictNidFilterTests.cpp @@ -490,6 +490,19 @@ void relativeTableTargetsBounds() { "Modular two's-complement displacement wrapping across the address boundary was lost"); } +void pltCompactorBounds() { + const std::vector text(64, 0x90); + const std::vector emptyReferences; + + requireFailure([&] { + Relinker::UnusedNidFilter::CompactPlt(emptyReferences, emptyReferences, text, std::numeric_limits::max() - 10, 0, 0x300); + }, "Wrapping text section virtual address range was accepted by PLT compactor"); + + requireFailure([&] { + Relinker::UnusedNidFilter::CompactPlt(emptyReferences, emptyReferences, text, 0x1000, std::numeric_limits::max() - 10, 0x300); + }, "Overflowing text section file byte offset was accepted by PLT compactor"); +} + void relativeRelocationTableBounds() { std::vector bytes(0x400, 0); bytes[0] = 0x7F; @@ -923,6 +936,7 @@ int main() { filterCallbackDataImports(); filterAndPltCompaction(); relativeTableTargetsBounds(); + pltCompactorBounds(); relativeRelocationTableBounds(); sceDynlibDataOffsets(); duplicatePointerRelocations(); diff --git a/core/relinker/relinker/tests/ToIntelLinuxStubsTests.cpp b/core/relinker/relinker/tests/ToIntelLinuxStubsTests.cpp index 04a57131f527..2131767e1b40 100644 --- a/core/relinker/relinker/tests/ToIntelLinuxStubsTests.cpp +++ b/core/relinker/relinker/tests/ToIntelLinuxStubsTests.cpp @@ -1,5 +1,6 @@ #include "ElfFixture.hpp" #include "RelinkerProcess.hpp" +#include "prx/libc/include/general/VabiMacros.hpp" #include #include #include @@ -26,6 +27,8 @@ const Bytes kCode = { constexpr std::uint64_t kSites[] = {10, 16}; constexpr std::size_t kSiteLength = 6; +using SseStub = std::uint64_t APS5_VABI (std::uint64_t, std::uint64_t); + std::uint64_t expected(const std::uint64_t value, const std::uint64_t destination) { return (destination & ~0xFF0000ull) | (((value >> 8) & 0xFF) << 16); } @@ -53,7 +56,7 @@ int main(const int argc, char** argv) { require(site + 5 + displacement >= kCodeSize, "SSE4a stub is inside the original code segment"); } - const auto function = image.At(0); + const auto function = image.At(0); for (const auto [value, destination] : {std::pair{0x1122334455667788ull, 0x0123456789ABCDEFull}, {0ull, ~0ull}, {~0ull, 0ull}, {0x9E3779B97F4A7C15ull, 0x0F1E2D3C4B5A6978ull}}) require(function(value, destination) == expected(value, destination), "Relinked SSE4a stubs computed the wrong value"); std::cout << "--to-intel Linux stub tests passed\n"; diff --git a/core/relinker/relinker/tests/UnwindRecordBoundsTests.cpp b/core/relinker/relinker/tests/UnwindRecordBoundsTests.cpp index 70127068703e..fe1fdf99763e 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/WindowsExportAliasTests.cpp b/core/relinker/relinker/tests/WindowsExportAliasTests.cpp index 8bfc0400e62c..8c7c3cdd7275 100644 --- a/core/relinker/relinker/tests/WindowsExportAliasTests.cpp +++ b/core/relinker/relinker/tests/WindowsExportAliasTests.cpp @@ -71,6 +71,22 @@ int main() { auto symbolic=good;symbolic.Symbolic=true;Domain::GuestRuntime symbolicRuntime;Reject([&]{Elfpatcher::GuestModuleWriter().WriteWindows(symbolic,symbolicRuntime);},"DF_SYMBOLIC"); for(unsigned kind=0;kind<10;++kind){auto g=good;auto& s=g.Symbols[2];switch(kind){case 0:s.Value+=8;break;case 1:s.Size+=1;break;case 2:s.Info=0x22;break;case 3:s.Info=0x11;break;case 4:s.Visibility=0;break;case 5:s.Section=2;break;case 6:g.Symbols[1].Info=s.Info=0x11;break;case 7:g.Symbols[1].Section=s.Section=Relinker::AbsoluteSection;break;case 8:g.Symbols[1].Info=s.Info=0x16;g.Dynamic.RelaData.clear();break;case 9:g.Symbols[1].Info=s.Info=0x10;break;}Check(!Relinker::IdenticalOrdinaryFunctionExport(g.Symbols[1],s),"nonordinary/conflicting tuple accepted");Domain::GuestRuntime r;Reject([&]{Elfpatcher::GuestModuleWriter().WriteWindows(g,r);},kind==8?"TLS":"Duplicate guest export");} Check(Domain::DeclaredImportModule("same#A#B",{{1,"one"},{2,"two"}})=="one"&&Domain::DeclaredImportModule("same#A#C",{{1,"one"},{2,"two"}})=="two","module-qualified IDs merged"); + auto zeroBucket=Fixture();Io::WriteU32(zeroBucket,0x2600,0); + Reject([&]{Relinker::GuestImageReader().Read("generic.prx",zeroBucket,true);},"Invalid SysV hash header"); + auto zeroChain=Fixture();Io::WriteU32(zeroChain,0x2604,0); + Reject([&]{Relinker::GuestImageReader().Read("generic.prx",zeroChain,true);},"Invalid SysV hash header"); + auto oobBucket=Fixture();Io::WriteU32(oobBucket,0x2608,4); + Reject([&]{Relinker::GuestImageReader().Read("generic.prx",oobBucket,true);},"Invalid SysV hash bucket index"); + auto tableOob=Fixture();Io::WriteU32(tableOob,0x2604,0x1000); + Reject([&]{Relinker::GuestImageReader().Read("generic.prx",tableOob,true);},"Unmapped ELF address"); + auto lastBucket=Fixture();Io::WriteU32(lastBucket,0x2600,2);Io::WriteU32(lastBucket,0x2608,1);Io::WriteU32(lastBucket,0x260c,4); + Reject([&]{Relinker::GuestImageReader().Read("generic.prx",lastBucket,true);},"Invalid SysV hash bucket index"); + auto chainPastSegment=Fixture();Io::WriteU32(chainPastSegment,0x2600,0x27d); + Reject([&]{Relinker::GuestImageReader().Read("generic.prx",chainPastSegment,true);},"Unmapped ELF address"); + auto multiBucket=Fixture(); + Io::WriteU32(multiBucket,0x2600,2);Io::WriteU32(multiBucket,0x2604,4);Io::WriteU32(multiBucket,0x2608,1);Io::WriteU32(multiBucket,0x260c,2); + auto goodMulti=Relinker::GuestImageReader().Read("generic.prx",multiBucket,true); + Check(goodMulti.Symbols.size()==4,"valid multi-bucket SysV hash accepted"); std::cout<<"WINDOWS_EXPORT_ALIAS_CASES_PASSED\npreserved-indices reversed-order conflicting-fields strict-nonwindows qualified-import writer-guard\n"; } catch(const std::exception& e){std::cerr<= 0, (name, stub.hex()) displacement = struct.unpack_from("= 0, stub.hex() + end = stub_address + offset + len(eip_lea) + effective = (end + struct.unpack_from("") endif() endif() + if(BUILD_TESTING AND ANYPS5_ENABLE_SPIRV_TOOLS AND NOT ANYPS5_USE_SYSTEM_DEPS AND NOT TARGET spirv_literal_float_tests) + add_test_executable(spirv_literal_float_tests "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/tests/SpirvLiteralFloat.cpp") + target_include_directories(spirv_literal_float_tests PRIVATE "${ANYPS5_SPIRV_HEADERS_SOURCE_DIR}/include") + target_link_libraries(spirv_literal_float_tests PRIVATE SPIRV-Tools-static) + set_target_properties(spirv_literal_float_tests PROPERTIES CXX_EXTENSIONS OFF) + configure_windows_unwind(spirv_literal_float_tests) + add_test(NAME spirv_literal_float COMMAND spirv_literal_float_tests) + set_tests_properties(spirv_literal_float PROPERTIES TIMEOUT 30) + if(MINGW) + target_link_libraries(spirv_literal_float_tests PRIVATE libc) + set_tests_properties(spirv_literal_float PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() + endif() endfunction() diff --git a/core/shader/recompiler/CacheKey.hpp b/core/shader/recompiler/CacheKey.hpp index 26f88ac0f4a9..9223eb414965 100644 --- a/core/shader/recompiler/CacheKey.hpp +++ b/core/shader/recompiler/CacheKey.hpp @@ -230,13 +230,15 @@ class RecompileCacheKey { append(key, value.positionLocation); append(key, value.sampleLocations); append(key, value.targetOutputMode); - append(key, value.targetMerge.target); - append(key, value.targetMerge.mask); - append(key, value.targetMerge.samples); - append(key, value.targetMerge.depthStencilWrites); - append(key, value.targetMerge.depthStencilTests); - if (value.targetMerge.blend.enabled) { - const auto& blend = value.targetMerge.blend; + append(key, value.targetMerges.size()); + for (const auto& merge : value.targetMerges) { + append(key, merge.target); + append(key, merge.mask); + append(key, merge.samples); + append(key, merge.depthStencilWrites); + append(key, merge.depthStencilTests); + if (!merge.blend.enabled) continue; + const auto& blend = merge.blend; append(key, blend.snorm); append(key, blend.colorSource); append(key, blend.colorDestination); @@ -355,6 +357,7 @@ class RecompileCacheKey { append(key, value.pixelFunctionStorageDwords); append(key, value.deviceScopeLdsMemoryBarriers); append(key, value.ldsLockFences); + append(key, value.meshWindowBuffer); } }; diff --git a/core/shader/recompiler/ControlFlow/src/ControlFlowGraph.cpp b/core/shader/recompiler/ControlFlow/src/ControlFlowGraph.cpp index 22fe11817d0f..0ba6e78fed97 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/RequestSerializer.cpp b/core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp index 8d041f1dcd04..6ee08edb3970 100644 --- a/core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp +++ b/core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp @@ -7,6 +7,8 @@ namespace ShaderRecompiler { namespace { constexpr std::uint32_t TargetBlendFlag = 0x10000u; +constexpr std::uint32_t FurtherMergeShift = 17u; +constexpr std::uint32_t FurtherMergeMask = 7u << FurtherMergeShift; constexpr char kBase64Alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; @@ -359,14 +361,18 @@ void writePixelInfo(Writer& writer, const ShaderPixelStageInfo& info) { for (const std::uint8_t location : info.sampleLocations) writer.WriteU8(location); writer.WriteBool(info.stencilOperationValueExport); for (const std::uint32_t order : info.sampleOrder) writer.WriteU32(order); - writer.WriteU8(info.targetMerge.target); - writer.WriteU32(static_cast(info.targetMerge.mask) | (info.targetMerge.blend.enabled ? TargetBlendFlag : 0u)); - writer.WriteU8(info.targetMerge.samples); - for (const std::uint32_t word : info.targetMerge.descriptor) writer.WriteU32(word); - writer.WriteBool(info.targetMerge.depthStencilWrites); - writer.WriteBool(info.targetMerge.depthStencilTests); - if (info.targetMerge.blend.enabled) { - const auto& blend = info.targetMerge.blend; + if (info.targetMerges.size() > 8u) throw std::runtime_error("a recompile request merges into more than eight color targets"); + const auto further = static_cast(std::max(info.targetMerges.size(), 1u) - 1u); + for (std::uint32_t index = 0; index <= further; ++index) { + const auto& merge = info.targetMerges.empty() ? TargetMerge{} : info.targetMerges[index]; + writer.WriteU8(merge.target); + writer.WriteU32(static_cast(merge.mask) | (merge.blend.enabled ? TargetBlendFlag : 0u) | (index == 0u ? further << FurtherMergeShift : 0u)); + writer.WriteU8(merge.samples); + for (const std::uint32_t word : merge.descriptor) writer.WriteU32(word); + writer.WriteBool(merge.depthStencilWrites); + writer.WriteBool(merge.depthStencilTests); + if (!merge.blend.enabled) continue; + const auto& blend = merge.blend; writer.WriteBool(blend.snorm); writer.WriteU8(blend.colorSource); writer.WriteU8(blend.colorDestination); @@ -457,17 +463,19 @@ ShaderPixelStageInfo readPixelInfo(Reader& reader, std::uint32_t version) { if (version >= 42u) { for (std::uint32_t& order : info.sampleOrder) order = reader.ReadU32(); } - if (version >= 46u) { - info.targetMerge.target = reader.ReadU8(); + for (std::uint32_t index = 0, count = version >= 46u ? 1u : 0u; index < count; ++index) { + TargetMerge merge; + merge.target = reader.ReadU8(); const auto word = reader.ReadU32(); - if ((word & ~(0xffffu | TargetBlendFlag)) != 0u) throw std::runtime_error("invalid recompile request target merge mask"); - info.targetMerge.mask = static_cast(word & 0xffffu); - info.targetMerge.samples = reader.ReadU8(); - for (std::uint32_t& descriptor : info.targetMerge.descriptor) descriptor = reader.ReadU32(); - info.targetMerge.depthStencilWrites = reader.ReadBool(); - info.targetMerge.depthStencilTests = reader.ReadBool(); + if ((word & ~(0xffffu | TargetBlendFlag | (index == 0u ? FurtherMergeMask : 0u))) != 0u) throw std::runtime_error("invalid recompile request target merge mask"); + count += (word & FurtherMergeMask) >> FurtherMergeShift; + merge.mask = static_cast(word & 0xffffu); + merge.samples = reader.ReadU8(); + for (std::uint32_t& descriptor : merge.descriptor) descriptor = reader.ReadU32(); + merge.depthStencilWrites = reader.ReadBool(); + merge.depthStencilTests = reader.ReadBool(); if ((word & TargetBlendFlag) != 0u) { - auto& blend = info.targetMerge.blend; + auto& blend = merge.blend; blend.enabled = true; blend.snorm = reader.ReadBool(); blend.colorSource = reader.ReadU8(); @@ -479,6 +487,8 @@ ShaderPixelStageInfo readPixelInfo(Reader& reader, std::uint32_t version) { blend.writeMask = reader.ReadU8(); for (std::uint32_t& constant : blend.constants) constant = reader.ReadU32(); } + if (merge.mask != 0u) info.targetMerges.push_back(merge); + else if (index != 0u || count != 1u) throw std::runtime_error("invalid recompile request target merge mask"); } if (version >= 49u && info.depthExportEnable) { info.depthExportMin = std::bit_cast(reader.ReadU32()); diff --git a/core/shader/recompiler/ControlFlow/src/Structurizer.cpp b/core/shader/recompiler/ControlFlow/src/Structurizer.cpp index 19da8b52352c..419d0ab69a56 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/IntermediateRepresentation/include/IntermediateRepresentation/IrMetadata/Resources.hpp b/core/shader/recompiler/IntermediateRepresentation/include/IntermediateRepresentation/IrMetadata/Resources.hpp index f76c12cc805b..f371ef940792 100644 --- a/core/shader/recompiler/IntermediateRepresentation/include/IntermediateRepresentation/IrMetadata/Resources.hpp +++ b/core/shader/recompiler/IntermediateRepresentation/include/IntermediateRepresentation/IrMetadata/Resources.hpp @@ -94,6 +94,7 @@ struct ImageResource { bool flatVolumeCompatible = true; bool singleMipPlaneBiasCompatible = false; bool volumeArraySampleCompatible = false; + bool adjustedSample = false; bool flatLineCompatible = true; bool flatVolumeLineCompatible = true; bool dimensionQueryOnly = true; diff --git a/core/shader/recompiler/IntermediateRepresentation/include/IntermediateRepresentation/IrProgram.hpp b/core/shader/recompiler/IntermediateRepresentation/include/IntermediateRepresentation/IrProgram.hpp index f724becd4b7a..bb66d00d95c4 100644 --- a/core/shader/recompiler/IntermediateRepresentation/include/IntermediateRepresentation/IrProgram.hpp +++ b/core/shader/recompiler/IntermediateRepresentation/include/IntermediateRepresentation/IrProgram.hpp @@ -32,12 +32,14 @@ class IrProgram { IrValue& CreateValue(IrOpcode opcode, IrType type, std::uint64_t flags); void SetEntryBlock(IrBlock& block); std::size_t ReclaimUnusedValues(); + void ReleaseUseArena(); [[nodiscard]] std::vector& BlockOrder(); [[nodiscard]] const std::vector& BlockOrder() const; private: std::shared_ptr instructionNodes; std::vector> blocks; + IrUseArena useArena; std::vector blockOrder; std::vector> values; IrResourcePlan resourcePlan; diff --git a/core/shader/recompiler/IntermediateRepresentation/include/IntermediateRepresentation/IrValue.hpp b/core/shader/recompiler/IntermediateRepresentation/include/IntermediateRepresentation/IrValue.hpp index d37a3156af06..699436a0e394 100644 --- a/core/shader/recompiler/IntermediateRepresentation/include/IntermediateRepresentation/IrValue.hpp +++ b/core/shader/recompiler/IntermediateRepresentation/include/IntermediateRepresentation/IrValue.hpp @@ -7,6 +7,8 @@ #include #include #include +#include +#include #include #include #include @@ -16,6 +18,51 @@ namespace ShaderRecompiler { class IrBlock; class IrValue; +struct IrUse; + +template +class IrUseAllocator { +public: + using value_type = T; + using propagate_on_container_move_assignment = std::true_type; + using propagate_on_container_swap = std::true_type; + IrUseAllocator() noexcept = default; + explicit IrUseAllocator(std::pmr::memory_resource* arena) noexcept : arena(arena) {} + template + IrUseAllocator(const IrUseAllocator& other) noexcept : arena(other.Arena()) {} + T* allocate(std::size_t count) { + if (arena == nullptr) return std::allocator{}.allocate(count); + return static_cast(arena->allocate(count * sizeof(T), alignof(T))); + } + void deallocate(T* pointer, std::size_t count) noexcept { + if (arena == nullptr) std::allocator{}.deallocate(pointer, count); + } + [[nodiscard]] std::pmr::memory_resource* Arena() const noexcept { return arena; } + IrUseAllocator select_on_container_copy_construction() const noexcept { return {}; } + friend bool operator==(const IrUseAllocator& left, const IrUseAllocator& right) noexcept { return left.arena == right.arena; } + +private: + std::pmr::memory_resource* arena = nullptr; +}; + +using IrUseList = std::vector>; + +class IrUseArena { +public: + IrUseArena() = default; + IrUseArena(IrUseArena&& other) noexcept = default; + IrUseArena& operator=(IrUseArena&& other) noexcept { + resource.swap(other.resource); + return *this; + } + std::pmr::memory_resource* Resource() { + if (resource == nullptr) resource = std::make_unique(); + return resource.get(); + } + +private: + std::unique_ptr resource; +}; struct IrUse { IrValue* user = nullptr; @@ -91,7 +138,7 @@ class IrOperands { class IrValue { public: - IrValue(IrOpcode opcode, IrType type, std::uint32_t id); + IrValue(IrOpcode opcode, IrType type, std::uint32_t id, std::pmr::memory_resource* useArena = nullptr); IrValue(const IrValue& other) = delete; IrValue& operator=(const IrValue& other) = delete; IrValue(IrValue&& other) = delete; @@ -136,7 +183,8 @@ class IrValue { [[nodiscard]] std::size_t PhiBlockCount() const; [[nodiscard]] IrValue* Argument(std::size_t index) const; [[nodiscard]] IrBlock* PhiBlock(std::size_t index) const; - [[nodiscard]] const std::vector& OperandUses() const; + [[nodiscard]] const IrUseList& OperandUses() const; + void MoveUsesToHeap(); [[nodiscard]] std::uint64_t ImmediateU64() const; [[nodiscard]] std::uint16_t ImmediateF16Bits() const; [[nodiscard]] float ImmediateF32() const; @@ -166,7 +214,7 @@ class IrValue { GuestRegister registerValue{}; std::uint64_t flags = 0; std::vector phiBlocks; - std::vector operandUses; + IrUseList operandUses; bool hasImmediate; IrOperands arguments; IrBlock* parent; diff --git a/core/shader/recompiler/IntermediateRepresentation/src/IrProgram.cpp b/core/shader/recompiler/IntermediateRepresentation/src/IrProgram.cpp index 4c5e1fc57c98..34a251932ba1 100644 --- a/core/shader/recompiler/IntermediateRepresentation/src/IrProgram.cpp +++ b/core/shader/recompiler/IntermediateRepresentation/src/IrProgram.cpp @@ -274,6 +274,11 @@ std::size_t IrProgram::ReclaimUnusedValues() { return removed; } +void IrProgram::ReleaseUseArena() { + for (const auto& value : values) value->MoveUsesToHeap(); + useArena = IrUseArena{}; +} + std::vector>& IrProgram::Blocks() { return blocks; } @@ -315,7 +320,7 @@ IrBlock& IrProgram::CreateBlock() { } IrValue& IrProgram::CreateValue(IrOpcode opcode, IrType type) { - auto value = std::make_unique(opcode, type, nextValueId); + auto value = std::make_unique(opcode, type, nextValueId, useArena.Resource()); nextValueId++; IrValue& created = *value; values.push_back(std::move(value)); diff --git a/core/shader/recompiler/IntermediateRepresentation/src/IrValue.cpp b/core/shader/recompiler/IntermediateRepresentation/src/IrValue.cpp index 2bbfc39eda63..b549aa739368 100644 --- a/core/shader/recompiler/IntermediateRepresentation/src/IrValue.cpp +++ b/core/shader/recompiler/IntermediateRepresentation/src/IrValue.cpp @@ -5,7 +5,7 @@ namespace ShaderRecompiler { -IrValue::IrValue(IrOpcode opcode, IrType type, std::uint32_t id) : opcode(opcode), type(type), id(id), hasImmediate(false), parent(nullptr) { +IrValue::IrValue(IrOpcode opcode, IrType type, std::uint32_t id, std::pmr::memory_resource* useArena) : opcode(opcode), type(type), id(id), hasImmediate(false), parent(nullptr), operandUses(IrUseAllocator(useArena)) { arguments.reserve(IrOpcodeOperandCount(opcode)); } @@ -121,10 +121,15 @@ IrBlock* IrValue::PhiBlock(std::size_t index) const { return phiBlocks[index]; } -const std::vector& IrValue::OperandUses() const { +const IrUseList& IrValue::OperandUses() const { return operandUses; } +void IrValue::MoveUsesToHeap() { + if (operandUses.get_allocator().Arena() == nullptr) return; + operandUses = IrUseList(operandUses.begin(), operandUses.end(), IrUseAllocator{}); +} + std::uint64_t IrValue::ImmediateU64() const { return immediateBits; } diff --git a/core/shader/recompiler/IntermediateRepresentation/tests/UseRewrite.cpp b/core/shader/recompiler/IntermediateRepresentation/tests/UseRewrite.cpp index f5a711b96991..0f17c87cd6e6 100644 --- a/core/shader/recompiler/IntermediateRepresentation/tests/UseRewrite.cpp +++ b/core/shader/recompiler/IntermediateRepresentation/tests/UseRewrite.cpp @@ -91,7 +91,7 @@ void CheckSimpleReplacement() { Require(!source->HasUses() && source->OperandUses().empty()); Require(first->Argument(0) == target && first->Argument(1) == target && first->Argument(2) == target); Require(second->Argument(0) == target); - const std::vector expected{{existing, 0}, {first, 2}, {first, 1}, {second, 0}, {first, 0}}; + const IrUseList expected{{existing, 0}, {first, 2}, {first, 1}, {second, 0}, {first, 0}}; Require(target->OperandUses() == expected); Require(std::ranges::equal(target->Uses(), std::vector({existing, first, first, second, first}))); first->ReplaceArgument(1, source); @@ -110,10 +110,10 @@ void CheckTailArgumentRemoval() { last->AddArgument(source); last->AddArgument(source); last->ReplaceArgument(0, nullptr); - Require(source->OperandUses() == std::vector({{first, 0}, {last, 1}})); + Require(source->OperandUses() == IrUseList({{first, 0}, {last, 1}})); last->ReplaceArgument(1, graph.Value(3)); - Require(source->OperandUses() == std::vector({{first, 0}})); - Require(graph.Value(3)->OperandUses() == std::vector({{last, 1}})); + Require(source->OperandUses() == IrUseList({{first, 0}})); + Require(graph.Value(3)->OperandUses() == IrUseList({{last, 1}})); first->Invalidate(); Require(!source->HasUses() && first->Argument(0) == nullptr); } diff --git a/core/shader/recompiler/Optimization/include/Optimization/ShaderStageInputInfo.hpp b/core/shader/recompiler/Optimization/include/Optimization/ShaderStageInputInfo.hpp index c1277ba9d377..9d7a8107c1dc 100644 --- a/core/shader/recompiler/Optimization/include/Optimization/ShaderStageInputInfo.hpp +++ b/core/shader/recompiler/Optimization/include/Optimization/ShaderStageInputInfo.hpp @@ -204,12 +204,10 @@ struct ShaderPixelInputInfo { bool psIteratesSamples = false; PixelPositionLocation psPositionLocation = PixelPositionLocation::Center; std::array sampleLocations{}; - std::uint8_t mergeTarget = 0; - std::uint16_t mergeMask = 0; + std::vector merges; std::uint8_t mergeSamples = 1; bool mergeDepthStencilWrites = false; bool mergeDepthStencilTests = false; - TargetBlend mergeBlend{}; std::array sampleOrder{}; ShaderStageRuntime stage; diff --git a/core/shader/recompiler/Optimization/src/ConstantFolder.cpp b/core/shader/recompiler/Optimization/src/ConstantFolder.cpp index 43db702ad8bd..e31e25adb8a0 100644 --- a/core/shader/recompiler/Optimization/src/ConstantFolder.cpp +++ b/core/shader/recompiler/Optimization/src/ConstantFolder.cpp @@ -765,7 +765,7 @@ bool forwardsWord(const IrUse& use) { void collectReaders(IrValue& value, std::vector& readers) { std::unordered_set visited{&value}; - std::vector, std::size_t>> pending; + std::vector> pending; pending.emplace_back(value.OperandUses(), 0u); while (!pending.empty()) { auto& [uses, next] = pending.back(); @@ -819,7 +819,7 @@ void lowerPackedAncillary(IrProgram& program, IrBuilder& builder, IrValue& ancil if (!isPackedAncillary(ancillary)) { return; } - const std::vector uses = ancillary.OperandUses(); + const IrUseList uses = ancillary.OperandUses(); std::vector direct; std::vector forwarded; for (const IrUse& use : uses) { diff --git a/core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp b/core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp index 576ac75a425b..e849a594a9c3 100644 --- a/core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp +++ b/core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp @@ -325,7 +325,10 @@ DescriptorBindingPlan DescriptorBindingBuilder::Prepare(const IrBindingLayout& l } std::vector imageModes(info.images.size()); for (std::size_t index = 0; index < info.images.size(); ++index) { - if (info.images[index].table == NoTable) imageModes[index] = ResourceMaterializer::RuntimeImageMode(info.images[index], snapshot.images.at(index), info.runtimeImageModes.at(index)); + if (info.images[index].table != NoTable) continue; + const auto& modes = info.runtimeImageModes.at(index); + imageModes[index] = ResourceMaterializer::RuntimeImageMode(info.images[index], snapshot.images.at(index), modes); + if (registrationModules && modes.size() > 1u) plan.specialization.push_back({PipelineSpecialization::ImageBase + static_cast(index) * PipelineSpecialization::ImageWords, imageModes[index]}); } for (std::uint32_t index = 0; index < info.buffers.size(); ++index) { const auto& descriptor = snapshot.buffers.at(index); diff --git a/core/shader/recompiler/Optimization/src/RedundantValueEliminator.cpp b/core/shader/recompiler/Optimization/src/RedundantValueEliminator.cpp index df61fa400d80..6345947879f7 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 694407995686..d030e64a85ad 100644 --- a/core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp +++ b/core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp @@ -2043,7 +2043,7 @@ std::vector ResourceMaterializer::RuntimeImageModes(const ImageRe const bool volumeLoad = (image.dimension == RdnaImageDimension::Dim2D || image.dimension == RdnaImageDimension::Dim2DArray) && image.fmaskCompatible && conversion != FmaskExpansion; const bool volumeStore = image.dimension == RdnaImageDimension::Dim2DArray && storage && image.written && !image.read && !image.atomic && image.mipMode != ImageMipMode::DynamicStorage; const bool volumePlaneBias = image.dimension == RdnaImageDimension::Dim2D && image.singleMipPlaneBiasCompatible && !storage && image.table == NoTable && conversion == IrBufferFormat::Invalid; - const bool volumeArraySample = image.dimension == RdnaImageDimension::Dim2DArray && image.volumeArraySampleCompatible && !storage && image.table == NoTable && conversion == IrBufferFormat::Invalid; + const bool volumeArraySample = image.dimension == RdnaImageDimension::Dim2DArray && image.volumeArraySampleCompatible && !image.adjustedSample && !storage && image.table == NoTable && conversion == IrBufferFormat::Invalid; if ((volumeLoad || volumeStore || volumePlaneBias || volumeArraySample) && !depth && packed == IrBufferFormat::Invalid && image.byElements == 0u) { auto volume = mode; volume.dimension = RdnaImageDimension::Dim3D; @@ -2078,7 +2078,7 @@ std::vector ResourceMaterializer::RuntimeImageModes(const ImageRe modes.push_back(line); } const bool cubeFaceStorage = image.written && !image.read && !image.atomic && image.mipMode != ImageMipMode::DynamicStorage; - if (image.dimension == RdnaImageDimension::Dim2D && image.cubeFaceCompatible && (!storage || cubeFaceStorage) && !depth && conversion == IrBufferFormat::Invalid && packed == IrBufferFormat::Invalid) { + if (image.dimension == RdnaImageDimension::Dim2D && image.cubeFaceCompatible && !image.adjustedSample && (!storage || cubeFaceStorage) && !depth && conversion == IrBufferFormat::Invalid && packed == IrBufferFormat::Invalid) { auto face = mode; face.dimension = RdnaImageDimension::Dim2DArray; face.cube = true; @@ -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/ResourceTracker.cpp b/core/shader/recompiler/Optimization/src/ResourceTracker.cpp index b9f871320960..d21036953387 100644 --- a/core/shader/recompiler/Optimization/src/ResourceTracker.cpp +++ b/core/shader/recompiler/Optimization/src/ResourceTracker.cpp @@ -2194,7 +2194,9 @@ class Tracker { image.depthBitsCompatible = image.depthBitsCompatible && memory.dataBits == 32u; image.constantSwizzleCompatible = image.constantSwizzleCompatible && (op == IrOpcode::ImageSampleRaw || op == IrOpcode::ImageGatherRaw); const bool cubeFaceLoad = op == IrOpcode::ImageRead && !memory.imageHasMip && memory.imageSampleFlags == 0u; - const bool cubeFaceSample = op == IrOpcode::ImageSampleRaw && (memory.imageSampleFlags == 0u || memory.imageSampleFlags == RdnaImageSampleFlagLevelZero || memory.imageSampleFlags == RdnaImageSampleFlagLod); + const auto addressedFlags = memory.imageSampleFlags & ~RdnaImageSampleFlagAdjust; + image.adjustedSample = image.adjustedSample || (op == IrOpcode::ImageSampleRaw && (memory.imageSampleFlags & RdnaImageSampleFlagAdjust) != 0u); + const bool cubeFaceSample = op == IrOpcode::ImageSampleRaw && (addressedFlags == 0u || addressedFlags == RdnaImageSampleFlagLevelZero || addressedFlags == RdnaImageSampleFlagLod); const bool cubeFaceStore = op == IrOpcode::ImageWrite && !memory.imageHasMip; image.cubeFaceCompatible = image.cubeFaceCompatible && (cubeFaceLoad || cubeFaceSample || cubeFaceStore) && !memory.imagePacked && memory.imageByElements == 0u; image.volumeArraySampleCompatible = image.volumeArraySampleCompatible && cubeFaceSample && !memory.imageR128 && !memory.imagePacked && memory.imageByElements == 0u; diff --git a/core/shader/recompiler/Optimization/src/ShaderInfoCollector.cpp b/core/shader/recompiler/Optimization/src/ShaderInfoCollector.cpp index 4d444d933cfd..de12941c6593 100644 --- a/core/shader/recompiler/Optimization/src/ShaderInfoCollector.cpp +++ b/core/shader/recompiler/Optimization/src/ShaderInfoCollector.cpp @@ -564,14 +564,16 @@ void AddTargetMerge(const ShaderPixelInputInfo& pixel, ShaderInfo& info) { ImageResource image; image.source = std::numeric_limits::max(); image.resourceClass = ImageResourceClass::Storage; - image.numericClass = pixel.mergeBlend.enabled ? IrTextureNumericClass::Float : IrTextureNumericClass::Uint; image.dimension = pixel.mergeSamples > 1u ? RdnaImageDimension::Dim2DMsaa : RdnaImageDimension::Dim2D; image.read = true; image.written = true; image.fmaskCompatible = false; image.targetMerge = true; - info.images.push_back(image); - info.runtimeImageModes.push_back(ResourceMaterializer::RuntimeImageModes(image)); + for (const auto& merge : pixel.merges) { + image.numericClass = merge.blend.enabled ? IrTextureNumericClass::Float : IrTextureNumericClass::Uint; + info.images.push_back(image); + info.runtimeImageModes.push_back(ResourceMaterializer::RuntimeImageModes(image)); + } AddInput(info, StageInputKind::FragCoord, 0, 4, "gl_FragCoord"); if (pixel.mergeSamples > 1u) AddInput(info, StageInputKind::SampleId, 0, 1, "gl_SampleID"); } @@ -619,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: @@ -648,7 +649,7 @@ void ShaderInfoCollector::Collect(IrProgram& program, const ShaderStageInputInfo } CollectBuiltinInputs(program, next); CollectOutputs(program, inputInfo, next); - if (program.Resources().stage == IrShaderStage::Pixel && inputInfo.pixel->mergeMask != 0u) AddTargetMerge(*inputInfo.pixel, next); + if (program.Resources().stage == IrShaderStage::Pixel && !inputInfo.pixel->merges.empty()) AddTargetMerge(*inputInfo.pixel, next); if ((program.Resources().stage == IrShaderStage::Vertex || program.Resources().stage == IrShaderStage::Mesh) && inputInfo.vertex != nullptr && inputInfo.vertex->pointList) AddOutput(next, StageOutputKind::PointSize, 0, 0, "gl_PointSize"); CollectSamplerUses(program, next); program.Info() = std::move(next); diff --git a/core/shader/recompiler/Optimization/src/SsaBuilder/SsaPass.cpp b/core/shader/recompiler/Optimization/src/SsaBuilder/SsaPass.cpp index 74181182b127..dcf069f2526d 100644 --- a/core/shader/recompiler/Optimization/src/SsaBuilder/SsaPass.cpp +++ b/core/shader/recompiler/Optimization/src/SsaBuilder/SsaPass.cpp @@ -23,6 +23,9 @@ void Pass::Write(Variable variable, IrBlock* block, IrValue* value) { } IrValue* Pass::Read(Variable variable, IrBlock* root) { + if (IrValue* cached = std::visit([&](auto tag) { return _definitions.Get(*root, tag); }, variable)) { + return cached; + } std::vector stack{ReadState{}, ReadState{.block = root}}; const auto preparePhi = [&]() { auto& state = stack.back(); @@ -45,7 +48,9 @@ IrValue* Pass::Read(Variable variable, IrBlock* root) { case ReadStep::Start: { IrValue* def = std::visit([&](auto tag) { return _definitions.Get(*block, tag); }, variable); if (def != nullptr) { - state.result = def; + stack.pop_back(); + stack.back().result = def; + break; } else if (!block->IsSsaSealed()) { IrValue& phi = _program.CreateValue(IrOpcode::Phi, VariableType(variable)); block->InsertInstructionBefore(nullptr, &phi); @@ -116,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/PatchSpirvTools.cmake b/core/shader/recompiler/PatchSpirvTools.cmake index 4acc117b3bd8..9ff099cc5591 100644 --- a/core/shader/recompiler/PatchSpirvTools.cmake +++ b/core/shader/recompiler/PatchSpirvTools.cmake @@ -166,3 +166,45 @@ foreach(validatorTarget IN ITEMS SPIRV-Tools-static SPIRV-Tools-shared) endif() set_property(TARGET ${validatorTarget} PROPERTY SOURCES "${patchedValidatorSources}") endforeach() + +set(spirvToolsBinarySource "${spirvToolsValidatorSourceDir}/binary.cpp") +set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${spirvToolsBinarySource}") +file(READ "${spirvToolsBinarySource}" spirvToolsBinary) +set(spirvToolsOldOperandInitialization [=[ + parsed_operand.number_kind = SPV_NUMBER_NONE; + parsed_operand.number_bit_width = 0; +]=]) +set(spirvToolsNewOperandInitialization [=[ + parsed_operand.number_kind = SPV_NUMBER_NONE; + parsed_operand.number_bit_width = 0; + parsed_operand.fp_encoding = SPV_FP_ENCODING_UNKNOWN; +]=]) +string(FIND "${spirvToolsBinary}" "${spirvToolsOldOperandInitialization}" spirvToolsOperandInitializationPosition) +string(FIND "${spirvToolsBinary}" "${spirvToolsNewOperandInitialization}" spirvToolsFixedOperandInitializationPosition) +if(spirvToolsOperandInitializationPosition EQUAL -1 OR NOT spirvToolsFixedOperandInitializationPosition EQUAL -1) + message(FATAL_ERROR "SPIRV-Tools operand initialization has changed; review the local parser fix") +endif() +string(REPLACE "${spirvToolsOldOperandInitialization}" "${spirvToolsNewOperandInitialization}" spirvToolsBinary "${spirvToolsBinary}") +set(spirvToolsPatchedBinary "${spirvToolsPatchedDir}/binary.cpp") +file(CONFIGURE OUTPUT "${spirvToolsPatchedBinary}" CONTENT "${spirvToolsBinary}" @ONLY) +foreach(parserTarget IN ITEMS SPIRV-Tools-static SPIRV-Tools-shared) + if(NOT TARGET ${parserTarget}) + continue() + endif() + get_target_property(parserSources ${parserTarget} SOURCES) + set(patchedParserSources) + set(parserReplacements 0) + foreach(source IN LISTS parserSources) + get_filename_component(sourcePath "${source}" ABSOLUTE BASE_DIR "${spirvToolsValidatorSourceDir}") + if(sourcePath STREQUAL spirvToolsBinarySource) + list(APPEND patchedParserSources "${spirvToolsPatchedBinary}") + math(EXPR parserReplacements "${parserReplacements} + 1") + else() + list(APPEND patchedParserSources "${source}") + endif() + endforeach() + if(NOT parserReplacements EQUAL 1) + message(FATAL_ERROR "SPIRV-Tools parser sources have changed; review the local parser fix") + endif() + set_property(TARGET ${parserTarget} PROPERTY SOURCES "${patchedParserSources}") +endforeach() diff --git a/core/shader/recompiler/Recompiler.cpp b/core/shader/recompiler/Recompiler.cpp index 73da42c9aa64..515f054b5a25 100644 --- a/core/shader/recompiler/Recompiler.cpp +++ b/core/shader/recompiler/Recompiler.cpp @@ -536,6 +536,7 @@ std::shared_ptr getSource(const RecompileRequest& request, ShaderPr ResourceProgram resource(request, preparation, reclaim); source->plan = std::move(resource.plan); if (!hasPreparedArtifact && std::ranges::none_of(source->variants, [&](const auto& variant) { return sameLayout(variant->layout, request.layout); })) { + resource.program->ReleaseUseArena(); source->program = std::move(resource.program); } } catch (...) { @@ -677,6 +678,7 @@ CompiledVariant emitVariant(const RecompileRequest& request, IrProgram& program) targetOptions.waveLdsMemoryBarriers = request.target.waveLdsMemoryBarriers; targetOptions.deviceScopeLdsMemoryBarriers = request.target.deviceScopeLdsMemoryBarriers; targetOptions.ldsLockFences = request.target.ldsLockFences; + targetOptions.meshWindowBuffer = request.target.meshWindowBuffer; constexpr SpirvEmitter spirvEmitter; CompiledShaderArtifact result; @@ -716,6 +718,7 @@ CompiledVariant emitVariant(const RecompileRequest& request, IrProgram& program) result.hostSubgroupSize = HostSubgroupSize(request); result.fullSubgroups = emitted.fullSubgroups; result.functionLdsBuffer = emitted.functionLdsBuffer; + result.meshWindowBuffer = emitted.meshWindowBuffer; result.vertexOffsetSgpr = program.Info().vertexOffsetSgpr; result.instanceOffsetSgpr = program.Info().instanceOffsetSgpr; result.vertexOffsetShared = program.Info().vertexOffsetShared; @@ -833,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); @@ -893,7 +897,7 @@ SpecializedSpirv buildSpecializedModule(const CompiledShaderArtifact& artifact, const auto count = materialized[cursor] >> 16u; const auto op = static_cast(materialized[cursor] & 0xffffu); if (op == spv::OpDecorate && count == 4u && materialized[cursor + 2u] == spv::DecorationBinding) bindingNumbers.emplace(materialized[cursor + 1u], materialized[cursor + 3u]); - if (op == spv::OpDecorate && count == 4u && materialized[cursor + 2u] == spv::DecorationDescriptorSet && materialized[cursor + 3u] == PixelFunctionLdsDescriptorSet) functionLdsBuffer.insert(materialized[cursor + 1u]); + if (op == spv::OpDecorate && count == 4u && materialized[cursor + 2u] == spv::DecorationDescriptorSet && (materialized[cursor + 3u] == PixelFunctionLdsDescriptorSet || materialized[cursor + 3u] == MeshWindowDescriptorSet)) functionLdsBuffer.insert(materialized[cursor + 1u]); if (op == spv::OpVariable && count >= 4u && !functionLdsBuffer.contains(materialized[cursor + 2u])) { if (const auto found = bindingNumbers.find(materialized[cursor + 2u]); found != bindingNumbers.end()) module->bindings.push_back(found->second); module->pushData |= materialized[cursor + 3u] == spv::StorageClassPushConstant; @@ -1064,16 +1068,20 @@ SpecializedSpirv specializeModule(const CompiledShaderArtifact& artifact, std::s const ResourceSnapshot& mergeTargetImage(const CompiledVariant& variant, const RecompileRequest& request, const ResourceSnapshot& snapshot, bool registrationDefaults, ResourceSnapshot& merged) { const auto& images = variant.info.info.images; - const auto image = std::ranges::find_if(images, [](const ImageResource& candidate) { return candidate.targetMerge; }); + const auto mergeImage = [](const ImageResource& candidate) { return candidate.targetMerge; }; + const auto image = std::ranges::find_if(images, mergeImage); if (image == images.end() || registrationDefaults) return snapshot; - if (!request.context.pixel || request.context.pixel->targetMerge.mask == 0u) throw std::runtime_error("ShaderRecompiler: a color target merge variant was materialized without the merged target"); - if (image + 1 != images.end() || snapshot.images.size() + 1u != images.size()) throw std::runtime_error("ShaderRecompiler: the captured images do not precede the color target merge image"); + if (!request.context.pixel || request.context.pixel->targetMerges.empty()) throw std::runtime_error("ShaderRecompiler: a color target merge variant was materialized without the merged target"); + const auto& merges = request.context.pixel->targetMerges; + if (static_cast(image - images.begin()) != snapshot.images.size() || snapshot.images.size() + merges.size() != images.size() || !std::all_of(image, images.end(), mergeImage)) throw std::runtime_error("ShaderRecompiler: the captured images do not precede the color target merge images"); merged = snapshot; - DescriptorValue descriptor; - std::ranges::copy(request.context.pixel->targetMerge.descriptor, descriptor.dwords.begin()); - descriptor.dwordCount = 8u; - descriptor.availableDwordMask = 0xffu; - merged.images.push_back(descriptor); + for (const auto& merge : merges) { + DescriptorValue descriptor; + std::ranges::copy(merge.descriptor, descriptor.dwords.begin()); + descriptor.dwordCount = 8u; + descriptor.availableDwordMask = 0xffu; + merged.images.push_back(descriptor); + } return merged; } @@ -1124,6 +1132,7 @@ RecompileResult materializeResult(const CompiledVariant& variant, const Recompil .hostSubgroupSize = artifact.hostSubgroupSize, .fullSubgroups = artifact.fullSubgroups, .functionLdsBuffer = artifact.functionLdsBuffer, + .meshWindowBuffer = artifact.meshWindowBuffer, .parameterExports = artifact.parameterExports, .fragmentParameters = artifact.fragmentParameters, .barycentricEmulation = artifact.barycentricEmulation, @@ -1750,12 +1759,13 @@ std::uint64_t snapshotHash(const RecompileRequest& request, const ResourceSnapsh mix(request.context.pixel->reversedBlend); mix(static_cast(request.context.pixel->rasterPrimitive)); mix(request.context.pixel->layerExported); - const auto& merge = request.context.pixel->targetMerge; - mix(merge.target); - mix(merge.mask); - mix(merge.samples); - for (const auto word : merge.descriptor) mix(word); - if (merge.blend.enabled) { + mix(request.context.pixel->targetMerges.size()); + for (const auto& merge : request.context.pixel->targetMerges) { + mix(merge.target); + mix(merge.mask); + mix(merge.samples); + for (const auto word : merge.descriptor) mix(word); + if (!merge.blend.enabled) continue; mix(merge.blend.snorm); mix(merge.blend.colorSource); mix(merge.blend.colorDestination); diff --git a/core/shader/recompiler/Recompiler.hpp b/core/shader/recompiler/Recompiler.hpp index 570c370a0128..899e832198fb 100644 --- a/core/shader/recompiler/Recompiler.hpp +++ b/core/shader/recompiler/Recompiler.hpp @@ -236,7 +236,7 @@ struct ShaderPixelStageInfo { bool iteratesSamples = false; PixelPositionLocation positionLocation = PixelPositionLocation::Center; std::array sampleLocations{}; - TargetMerge targetMerge{}; + std::vector targetMerges{}; std::array sampleOrder{}; }; @@ -351,6 +351,7 @@ struct SpirvTarget { bool deviceScopeLdsMemoryBarriers = false; bool ldsLockFences = false; bool fragmentBarycentricBuiltins = false; + bool meshWindowBuffer = false; }; struct BindingLayout { @@ -755,6 +756,7 @@ struct CompiledShaderArtifact { std::uint32_t hostSubgroupSize = 0; bool fullSubgroups = false; bool functionLdsBuffer = false; + bool meshWindowBuffer = false; std::vector parameterExports; std::vector fragmentParameters; BarycentricEmulation barycentricEmulation; @@ -824,7 +826,7 @@ struct RecompileResult : CompiledShaderArtifact, ShaderInvocation { }; mix(specialization.size()); for (const auto& constant : specialization) mix(constant.id | (static_cast(constant.value) << 32u)); - mix(hostSubgroupSize | (fullSubgroups ? 0x10000u : 0u) | (functionLdsBuffer ? 0x20000u : 0u) | (static_cast(workgroupMemoryDwords) << 32u)); + mix(hostSubgroupSize | (fullSubgroups ? 0x10000u : 0u) | (functionLdsBuffer ? 0x20000u : 0u) | (meshWindowBuffer ? 0x40000u : 0u) | (static_cast(workgroupMemoryDwords) << 32u)); mix(bindings.size()); for (const auto& binding : bindings) mix(binding.descriptorSet | (static_cast(binding.binding) << 16u) | (static_cast(binding.kind) << 40u) | (static_cast(binding.count) << 48u)); if (identity.Empty()) identity.low = 1; diff --git a/core/shader/recompiler/ShaderCacheDirectory.hpp b/core/shader/recompiler/ShaderCacheDirectory.hpp index d46558890b8d..b822e82fcb83 100644 --- a/core/shader/recompiler/ShaderCacheDirectory.hpp +++ b/core/shader/recompiler/ShaderCacheDirectory.hpp @@ -37,7 +37,7 @@ std::filesystem::path ShaderCacheDirectory(); inline std::filesystem::path NativeCachePath_nid_no_patch(const std::filesystem::path& path, std::error_code& error) { auto native = path; native.make_preferred(); - if (native.native().starts_with(L"\\\\?\\") || native.native().starts_with(L"\\\\.\\")) return native; + if (native.native().starts_with(L"\\\\?\\")) return native; const auto capacity = GetFullPathNameW(native.c_str(), 0, nullptr, nullptr); if (capacity == 0) { error = std::error_code(GetLastError(), std::system_category()); return {}; } std::wstring absolute(capacity, L'\0'); @@ -47,6 +47,10 @@ inline std::filesystem::path NativeCachePath_nid_no_patch(const std::filesystem: return {}; } absolute.resize(size); + if (absolute.starts_with(L"\\\\.\\")) { + if (absolute.size() >= 6 && absolute[5] == L':') return std::filesystem::path(L"\\\\?\\" + absolute.substr(4)); + return std::filesystem::path(absolute); + } if (absolute.starts_with(L"\\\\")) return std::filesystem::path(L"\\\\?\\UNC\\" + absolute.substr(2)); return std::filesystem::path(L"\\\\?\\" + absolute); } diff --git a/core/shader/recompiler/ShaderDiskCache.cpp b/core/shader/recompiler/ShaderDiskCache.cpp index 9be24e6ccb3b..a564f915631d 100644 --- a/core/shader/recompiler/ShaderDiskCache.cpp +++ b/core/shader/recompiler/ShaderDiskCache.cpp @@ -106,7 +106,7 @@ static_assert(sizeof(BindingAllocationResult) == 184, "BindingAllocationResult c static_assert(sizeof(CompiledBindingLayout) == 88, "CompiledBindingLayout changed: update the allocation encoder"); static_assert(sizeof(BindingLayout) == 16, "BindingLayout changed: update BuildKey"); static_assert(sizeof(IrResourcePlan) == 728, "IrResourcePlan changed: update EncodePlan and DecodePlan"); -static_assert(sizeof(IrValue) == 136, "IrValue changed: update the plan value encoder"); +static_assert(sizeof(IrValue) == 144, "IrValue changed: update the plan value encoder"); static_assert(sizeof(GuestRegister) == 8, "GuestRegister changed: update the plan value encoder"); static_assert(sizeof(MemoryInfo) == 80, "MemoryInfo changed: update the plan encoder"); static_assert(sizeof(DescriptorSource) == 192, "DescriptorSource changed: update the plan encoder"); @@ -141,7 +141,7 @@ constexpr std::size_t fieldCount() { static_assert(fieldCount() == 24, "ShaderInfo changed: update the info encoder"); static_assert(fieldCount() == 12, "BufferResource changed: update the info encoder"); -static_assert(fieldCount() == 45, "ImageResource changed: update the info encoder"); +static_assert(fieldCount() == 46, "ImageResource changed: update the info encoder"); static_assert(fieldCount() == 8, "SamplerResource changed: update the info encoder"); static_assert(fieldCount() == 3, "SampledResourcePair changed: update the info encoder"); static_assert(fieldCount() == 5, "StageInput changed: update the info encoder"); @@ -541,6 +541,7 @@ void encodeArtifact(Writer& writer, const CompiledShaderArtifact& result) { writer.Value(result.hostSubgroupSize); writer.Value(result.fullSubgroups); writer.Value(result.functionLdsBuffer); + writer.Value(result.meshWindowBuffer); writer.Values(std::span(result.parameterExports)); writer.List(result.fragmentParameters, [](Writer& out, const FragmentParameter& parameter) { out.Value(parameter.location); @@ -605,6 +606,7 @@ void decodeArtifact(Reader& reader, CompiledShaderArtifact& result) { reader.Value(result.hostSubgroupSize); reader.Value(result.fullSubgroups); reader.Value(result.functionLdsBuffer); + reader.Value(result.meshWindowBuffer); reader.Values(result.parameterExports); reader.List(result.fragmentParameters, 10, [](Reader& in, FragmentParameter& parameter) { in.Value(parameter.location); @@ -799,6 +801,7 @@ void encodeShaderInfo(Writer& writer, const ShaderInfo& info) { out.Value(image.flatVolumeCompatible); out.Value(image.singleMipPlaneBiasCompatible); out.Value(image.volumeArraySampleCompatible); + out.Value(image.adjustedSample); out.Value(image.flatLineCompatible); out.Value(image.flatVolumeLineCompatible); out.Value(image.dimensionQueryOnly); @@ -909,6 +912,7 @@ void decodeShaderInfo(Reader& reader, ShaderInfo& info) { in.Value(image.flatVolumeCompatible); in.Value(image.singleMipPlaneBiasCompatible); in.Value(image.volumeArraySampleCompatible); + in.Value(image.adjustedSample); in.Value(image.flatLineCompatible); in.Value(image.flatVolumeLineCompatible); in.Value(image.dimensionQueryOnly); diff --git a/core/shader/recompiler/ShaderDiskCache.hpp b/core/shader/recompiler/ShaderDiskCache.hpp index af6bba7ff747..5f25660eb725 100644 --- a/core/shader/recompiler/ShaderDiskCache.hpp +++ b/core/shader/recompiler/ShaderDiskCache.hpp @@ -13,7 +13,7 @@ namespace ShaderRecompiler::ShaderDiskCache { -inline constexpr std::uint32_t FormatVersion = 49; +inline constexpr std::uint32_t FormatVersion = 50; enum class LoadStatus { Loaded, diff --git a/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvAnalysis.hpp b/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvAnalysis.hpp index 2dbe8f7d038d..4dc191d3d9f7 100644 --- a/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvAnalysis.hpp +++ b/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvAnalysis.hpp @@ -30,19 +30,26 @@ 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; +inline constexpr std::uint32_t MeshWindowDescriptorSet = 3u; +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/SpirvEmitter.hpp b/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitter.hpp index 07f0dc29a004..876c3eddbe2f 100644 --- a/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitter.hpp +++ b/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitter.hpp @@ -44,11 +44,13 @@ struct SpirvTargetOptions { std::uint32_t pixelFunctionStorageDwords = 4096u; bool deviceScopeLdsMemoryBarriers = false; bool ldsLockFences = false; + bool meshWindowBuffer = false; }; struct SpirvEmitInfo { bool fullSubgroups = false; bool functionLdsBuffer = false; + bool meshWindowBuffer = false; }; struct SpannedWaveUnsupported : std::runtime_error { diff --git a/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterHelpers.hpp b/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterHelpers.hpp index 4be0132c1db6..f0f5a1c4d16a 100644 --- a/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterHelpers.hpp +++ b/core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterHelpers.hpp @@ -14,6 +14,7 @@ const ShaderVertexInputInfo& VertexInfo(const SpirvEmitterState& state); const ShaderPixelInputInfo& PixelInfo(const SpirvEmitterState& state); const ShaderWorkgroupInputInfo* ShaderWorkgroupInput(const SpirvEmitterState& state); std::array WorkgroupLocalSize(const SpirvEmitterState& state, const ShaderWorkgroupInputInfo& workgroup); +std::uint32_t MeshWindowInvocations(const SpirvEmitterState& state); const RdnaImageDimensionInfo& RdnaImageDimensionInfoFor(RdnaImageDimension dimension); std::uint32_t TypeVoid(SpirvEmitterState& state); std::uint32_t TypeBool(SpirvEmitterState& state); @@ -157,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 1025876941f1..21cefd63039c 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; @@ -218,6 +223,13 @@ struct SpirvEmitterState { std::array vectorWindowVariable {}; std::uint32_t vectorWindowIndexed = 0; std::array, 2> vectorWindowSlots {}; + bool meshWindowBuffer = false; + std::uint32_t meshWindowBufferVariable = 0; + std::uint32_t meshWindowSlotVariable = 0; + std::uint32_t meshWindowBaseVariable = 0; + std::unordered_set meshWindowBufferStores; + std::unordered_set meshWindowBufferLoads; + std::vector meshWindowEntryLive; std::array imageVariables {}; std::uint32_t samplerVariable = 0; std::vector tableImageVariables; @@ -236,9 +248,8 @@ struct SpirvEmitterState { std::uint32_t currentLabel = 0; const IrBlock* currentBlock = nullptr; std::uint32_t pixelValidMaskVariable = 0; - std::uint32_t mergeWordVariable = 0; - std::uint32_t mergeTexelVariable = 0; - std::uint32_t mergePendingVariable = 0; + std::vector mergeValueVariables; + std::vector mergePendingVariables; std::uint32_t quadPixelUncovered = 0; std::uint32_t sampleMaskInputVariable = 0; std::uint32_t quadSampleCoverage = 0; diff --git a/core/shader/recompiler/SpirvBackend/src/SpirvAlu/SpirvAluEmitterFloat64.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvAlu/SpirvAluEmitterFloat64.cpp index 7ce42d522bf3..74188bbc8d55 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}); } @@ -599,11 +848,12 @@ std::uint32_t EmitFPMax64(SpirvEmitterState& state, std::uint32_t arg0, std::uin } std::uint32_t EmitFPSaturate64(SpirvEmitterState& state, std::uint32_t arg0) { - const auto value = ToF64(state, arg0); - const auto positive = Binary(state, spv::OpFOrdGreaterThan, TypeBool(state), value, ConstantF64(state, 0u)); - const auto belowOne = Binary(state, spv::OpFOrdLessThan, TypeBool(state), value, ConstantF64(state, 0x3ff0000000000000ull)); - const auto upper = Select(state, TypeF64(state), belowOne, value, ConstantF64(state, 0x3ff0000000000000ull)); - return FromF64(state, Select(state, TypeF64(state), positive, upper, ConstantF64(state, 0u))); + const auto cls = Classify(state, arg0); + const auto atLeastOne = Binary(state, spv::OpUGreaterThanEqual, TypeBool(state), cls.bits.high, ConstantU32(state, 0x3ff00000u)); + const auto zero = Binary(state, spv::OpLogicalOr, TypeBool(state), cls.nan, cls.negative); + auto result = SelectBits(state, atLeastOne, {ConstantU32(state, 0u), ConstantU32(state, 0x3ff00000u)}, cls.bits); + result = SelectBits(state, zero, {ConstantU32(state, 0u), ConstantU32(state, 0u)}, result); + return Join(state, result); } std::uint32_t EmitFPLdexp64(SpirvEmitterState& state, std::uint32_t arg0, std::uint32_t arg1) { @@ -913,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()) { @@ -1084,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)); @@ -1094,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/SpirvAlu/SpirvAluEmitterMath.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvAlu/SpirvAluEmitterMath.cpp index 98a5c4d1bcc9..1f72259a7b3f 100644 --- a/core/shader/recompiler/SpirvBackend/src/SpirvAlu/SpirvAluEmitterMath.cpp +++ b/core/shader/recompiler/SpirvBackend/src/SpirvAlu/SpirvAluEmitterMath.cpp @@ -1,16 +1,22 @@ #include "SpirvBackend/SpirvEmitterInstructions.hpp" +#include "SpirvBackend/SpirvAnalysis.hpp" #include "SpirvBackend/SpirvMemory/SpirvSubgroup.hpp" #include "IntermediateRepresentation/IrBlock.hpp" #include "IntermediateRepresentation/IrValue.hpp" +#include "RdnaDecoder/RdnaInstructionDecoder.hpp" #include #include #include #include +#include #include #include #include +#include #include +#include #include +#include #include namespace ShaderRecompiler { @@ -615,7 +621,7 @@ bool CrossesRowsOf(const IrValue* value, const IrValue* scan, bool narrow) { return flags.x16 && !flags.fetchInactive && Resolved(permlane->Argument(0)) == scan && IsU32(permlane->Argument(1), 0xffffffffu) && IsU32(permlane->Argument(2), 0xffffffffu) && EveryLaneBit(permlane->Argument(3), narrow); } -std::optional MatchHalfWaveScan(const IrValue* value, IrShaderStage stage, bool narrow) { +std::optional MatchHalfWaveScan(const IrValue* value, IrShaderStage stage, bool narrow, bool anyKeys = false) { const auto* combined = Unmasked(Resolved(value), narrow); std::optional> operands; const auto reduction = std::find_if(WaveReductions.begin(), WaveReductions.end(), [&](const WaveReduction& candidate) { return (operands = ReductionOperands(combined, candidate)).has_value(); }); @@ -628,14 +634,279 @@ std::optional MatchHalfWaveScan(const IrValue* value, IrShaderStag const auto* source = Unmasked(scan, narrow); const bool entryKeys = Is(source, IrOpcode::SelectU32) && IsU32(source->Argument(2), reduction->identity) && EntryLaneWalk{stage}.ZeroBit(source->Argument(0)); const bool upperKeys = narrow && reduction->identity == 0u && !reduction->floating && UpperLaneWalk{stage}.ZeroValue(source); - if (!entryKeys && !upperKeys) return std::nullopt; + const bool selectedKeys = anyKeys && Is(source, IrOpcode::SelectU32) && IsU32(source->Argument(2), reduction->identity); + if (!entryKeys && !upperKeys && !selectedKeys) return std::nullopt; return HalfWaveScan{&*reduction, source}; } +std::optional> ExecWords(const IrValue* bit, std::uint32_t depth = 0u) { + bit = Resolved(bit); + if (const auto words = LaneBitWords(bit)) return words; + if (bit == nullptr || depth > 8u || !bit->IsPhi() || bit->Type() != IrType::Bool || bit->Parent() == nullptr) return std::nullopt; + std::vector> incoming; + for (std::size_t index = 0; index < bit->ArgumentCount(); ++index) { + const auto words = ExecWords(bit->Argument(index), depth + 1u); + if (!words) return std::nullopt; + incoming.push_back(*words); + } + std::array result{}; + for (std::size_t half = 0; half < 2u; ++half) { + for (const auto* candidate : bit->Parent()->Instructions()) { + if (!candidate->IsPhi() || candidate->Type() != IrType::U32 || candidate->ArgumentCount() != bit->ArgumentCount()) continue; + const bool matches = std::ranges::all_of(std::views::iota(std::size_t{0}, bit->ArgumentCount()), [&](std::size_t index) { + for (std::size_t other = 0; other < candidate->ArgumentCount(); ++other) { + if (candidate->PhiBlock(other) == bit->PhiBlock(index)) return Resolved(candidate->Argument(other)) == incoming[index][half]; + } + return false; + }); + if (matches) { + result[half] = candidate; + break; + } + } + if (result[half] == nullptr) return std::nullopt; + } + return result; +} + +std::optional ActiveBallotWord(const IrValue* word) { + if (!Is(word, IrOpcode::CompositeExtractU32x4)) return std::nullopt; + const auto* ballot = Resolved(word->Argument(0)); + const auto* active = Is(ballot, IrOpcode::Ballot) ? Resolved(ballot->Argument(0)) : nullptr; + const auto* index = Resolved(word->Argument(1)); + if (active == nullptr || !active->HasImmediate() || active->Type() != IrType::Bool || !active->ImmediateBool() || index == nullptr || !index->HasImmediate()) return std::nullopt; + return index->ImmediateU32(); +} + +bool WordImplies(const IrValue* stronger, const IrValue* weaker, std::uint32_t depth = 0u) { + stronger = Resolved(stronger); + weaker = Resolved(weaker); + if (stronger == nullptr || weaker == nullptr || depth > 8u) return false; + if (stronger == weaker) return true; + const auto ballot = ActiveBallotWord(weaker); + if (ballot && ActiveBallotWord(stronger) == ballot) return true; + if (Is(weaker, IrOpcode::BitwiseAnd32) && WordImplies(stronger, weaker->Argument(0), depth + 1u) && WordImplies(stronger, weaker->Argument(1), depth + 1u)) return true; + return Is(stronger, IrOpcode::BitwiseAnd32) && (WordImplies(stronger->Argument(0), weaker, depth + 1u) || WordImplies(stronger->Argument(1), weaker, depth + 1u)); +} + +bool LaneBitImplies(const IrValue* stronger, const IrValue* weaker) { + stronger = Resolved(stronger); + weaker = Resolved(weaker); + if (stronger == weaker) return true; + const auto strong = ExecWords(stronger); + const auto weak = ExecWords(weaker); + return strong && weak && WordImplies((*strong)[0], (*weak)[0]) && WordImplies((*strong)[1], (*weak)[1]); +} + +bool NonNegativeKeys(const IrValue* key, const IrValue* active, const IrProgram& program) { + std::unordered_map position; + for (std::size_t index = 0; index < program.BlockOrder().size(); ++index) position.emplace(program.BlockOrder()[index], index); + const auto backEdge = [&](const IrValue* phi, std::size_t index) { + const auto from = position.find(phi->PhiBlock(index)); + const auto to = position.find(phi->Parent()); + return from == position.end() || to == position.end() || from->second >= to->second; + }; + using Node = std::pair; + const auto hash = [](const Node& node) { return std::hash{}(node.first) ^ static_cast(node.second); }; + std::vector nodes; + std::unordered_map holds(0, hash); + std::unordered_set implied(0, hash); + std::vector pending{{Resolved(key), false}}; + while (!pending.empty()) { + const auto node = pending.back(); + pending.pop_back(); + const auto* value = node.first; + if (value == nullptr || holds.contains(node)) continue; + if (nodes.size() >= 4096u) return false; + holds.emplace(node, true); + nodes.push_back(node); + if (value->HasImmediate()) continue; + const auto push = [&](std::size_t index, bool carried) { pending.push_back({Resolved(value->Argument(index)), carried}); }; + switch (value->Opcode()) { + case IrOpcode::BitCastU32F32: + case IrOpcode::BitCastF32U32: push(0, node.second); break; + case IrOpcode::FPMax32: + case IrOpcode::BitwiseAnd32: push(0, node.second); push(1, node.second); break; + case IrOpcode::SelectU32: + case IrOpcode::SelectF32: + push(1, node.second); + if (!node.second && LaneBitImplies(active, value->Argument(0))) implied.insert(node); + else push(2, node.second); + break; + case IrOpcode::Phi: + for (std::size_t index = 0; index < value->ArgumentCount(); ++index) push(index, node.second || backEdge(value, index)); + break; + default: break; + } + } + const auto immediate = [](const IrValue* value) { + if (value->Type() == IrType::U32) return (value->ImmediateU32() & 0x80000000u) == 0u && value->ImmediateU32() <= 0x7f800000u; + if (value->Type() == IrType::F32) return std::bit_cast(value->ImmediateF32()) <= 0x7f800000u; + return false; + }; + const auto evaluate = [&](const Node& node) { + const auto* value = node.first; + const auto at = [&](std::size_t index, bool carried) { const auto found = holds.find({Resolved(value->Argument(index)), carried}); return found != holds.end() && found->second; }; + if (value->HasImmediate()) return immediate(value); + switch (value->Opcode()) { + case IrOpcode::BitCastU32F32: + case IrOpcode::BitCastF32U32: return at(0, node.second); + case IrOpcode::FPSaturate32: return true; + case IrOpcode::FPMax32: return at(0, node.second) || at(1, node.second); + case IrOpcode::BitwiseAnd32: return (IsU32(value->Argument(1), 0x80000000u) && at(0, node.second)) || (IsU32(value->Argument(0), 0x80000000u) && at(1, node.second)); + case IrOpcode::SelectU32: + case IrOpcode::SelectF32: return at(1, node.second) && (implied.contains(node) || at(2, node.second)); + case IrOpcode::Phi: return std::ranges::all_of(std::views::iota(std::size_t{0}, value->ArgumentCount()), [&](std::size_t index) { return at(index, node.second || backEdge(value, index)); }); + default: return false; + } + }; + for (bool changed = true; changed;) { + changed = false; + for (const auto& node : nodes) { + auto& current = holds[node]; + if (current && !evaluate(node)) { + current = false; + changed = true; + } + } + } + return holds[Node{Resolved(key), false}]; +} + +template +bool ReachesOnlyThroughBitOps(const IrValue* value, TSink&& sink) { + std::vector pending{value}; + std::unordered_set seen; + while (!pending.empty()) { + const auto* current = pending.back(); + pending.pop_back(); + for (const auto* user : current->Uses()) { + if (!seen.insert(user).second || sink(user)) continue; + if (!Is(user, IrOpcode::BitwiseAnd32) && !Is(user, IrOpcode::IEqual32) && !Is(user, IrOpcode::SelectU32) && !Is(user, IrOpcode::BitCastF32U32)) return false; + pending.push_back(user); + } + } + return true; +} + +const IrValue* ElectedAtomicMax(const IrValue* read, const HalfWaveScan& scan, const IrProgram& program) { + if (scan.reduction->opcode != IrOpcode::FPMax32 || read == nullptr) return nullptr; + const auto* active = Resolved(scan.source->Argument(0)); + const auto* key = Resolved(scan.source->Argument(1)); + std::array lanes{}; + for (const auto* user : read->Uses()) { + if (!Is(user, IrOpcode::ReadLane) || Resolved(user->Argument(0)) != read) return nullptr; + const auto* selector = Resolved(user->Argument(1)); + if (selector == nullptr || !selector->HasImmediate() || ((selector->ImmediateU32() & 63u) != 31u && (selector->ImmediateU32() & 63u) != 63u)) return nullptr; + auto& slot = lanes[(selector->ImmediateU32() & 63u) == 63u ? 1u : 0u]; + if (slot != nullptr) return nullptr; + slot = user; + } + if (lanes[0] == nullptr || lanes[1] == nullptr) return nullptr; + const IrValue* combined = nullptr; + const auto combine = [&](const IrValue* user) { + if (!Is(user, IrOpcode::FPMax32)) return false; + if (combined == nullptr) combined = user; + return user == combined; + }; + if (!ReachesOnlyThroughBitOps(lanes[0], combine) || !ReachesOnlyThroughBitOps(lanes[1], combine) || combined == nullptr || combined->UseCount() != 1u) return nullptr; + const auto* bits = *combined->Uses().begin(); + const auto operands = Is(bits, IrOpcode::BitCastU32F32) ? ReductionOperands(bits, *scan.reduction) : std::nullopt; + if (!operands || !EitherOrder(*operands, [&](const IrValue* low, const IrValue* high) { return low == lanes[0] && high == lanes[1]; })) return nullptr; + if (bits->UseCount() != 1u) return nullptr; + const auto* data = *bits->Uses().begin(); + if (!Is(data, IrOpcode::SelectU32) || Resolved(data->Argument(1)) != bits) return nullptr; + const auto* written = Resolved(data->Argument(0)); + if (!LaneBitImplies(written, active) || !LaneBitImplies(active, written)) return nullptr; + const IrValue* atomic = nullptr; + const IrValue* equal = nullptr; + const auto sink = [&](const IrValue* user) { + if ((Is(user, IrOpcode::BufferAtomicUMax32) || Is(user, IrOpcode::BufferAtomicSMax32)) && Resolved(user->Argument(4)) == data && atomic == nullptr) { + atomic = user; + return true; + } + if (Is(user, IrOpcode::FPOrdEqual32) && (equal == nullptr || equal == user)) { + equal = user; + return true; + } + return false; + }; + if (!ReachesOnlyThroughBitOps(data, sink) || atomic == nullptr || equal == nullptr || atomic->HasUses()) return nullptr; + const auto compared = [](const IrValue* operand) { + operand = Resolved(operand); + return Is(operand, IrOpcode::BitCastF32U32) ? Unflushed(Resolved(operand->Argument(0))) : nullptr; + }; + if (!EitherOrder(equal, [&](const IrValue* own, const IrValue* other) { return compared(own) == data && compared(other) == key; }) || equal->UseCount() != 1u) return nullptr; + const auto* elected = *equal->Uses().begin(); + if (!Is(elected, IrOpcode::LogicalAnd) || !EitherOrder(elected, [&](const IrValue* lane, const IrValue* test) { return lane == written && test == equal; })) return nullptr; + if (Resolved(atomic->Argument(5)) != elected) return nullptr; + for (const auto* user : elected->Uses()) { + if (user == atomic) continue; + if (Is(user, IrOpcode::LogicalNot) && std::ranges::all_of(user->Uses(), [](const IrValue* branch) { return Is(branch, IrOpcode::Reference); })) continue; + if (Is(user, IrOpcode::SelectU32) && Resolved(user->Argument(0)) == elected && std::ranges::all_of(user->Uses(), [&](const IrValue* consumer) { return consumer == atomic; })) continue; + return nullptr; + } + if (!NonNegativeKeys(key, active, program)) return nullptr; + const auto uniform = WaveUniformValues(program); + const auto steady = [&](std::size_t index) { + const auto* operand = Resolved(atomic->Argument(index)); + if (Is(operand, IrOpcode::SelectU32) && Resolved(operand->Argument(0)) == elected) operand = Resolved(operand->Argument(1)); + return operand != nullptr && (operand->HasImmediate() || uniform.contains(operand)); + }; + return steady(0u) && steady(1u) && steady(2u) && steady(3u) ? atomic : nullptr; +} + +std::optional MatchElectedMaxScan(const IrValue* read, const IrProgram& program) { + read = Resolved(read); + const auto scan = MatchHalfWaveScan(read, program.Resources().stage, false, true); + if (!scan || ElectedAtomicMax(read, *scan, program) == nullptr) return std::nullopt; + return scan; +} + +bool CrossesElectedMaxScan(const IrValue& permlane, const IrProgram& program) { + std::vector pending{&permlane}; + std::unordered_set seen; + std::vector reads; + std::vector masked; + while (!pending.empty()) { + const auto* current = pending.back(); + pending.pop_back(); + for (const auto* user : current->Uses()) { + if (!seen.insert(user).second) continue; + if (Is(user, IrOpcode::ReadLane)) { + reads.push_back(Resolved(user->Argument(0))); + continue; + } + if (Is(user, IrOpcode::SelectU32) && Resolved(user->Argument(2)) == current && Resolved(user->Argument(1)) != current && user->UseCount() == 1u) { + const auto* atomic = *user->Uses().begin(); + if ((Is(atomic, IrOpcode::BufferAtomicUMax32) || Is(atomic, IrOpcode::BufferAtomicSMax32)) && Resolved(atomic->Argument(5)) == Resolved(user->Argument(0)) && Resolved(atomic->Argument(4)) != user) { + masked.push_back(atomic); + continue; + } + } + if (!Is(user, IrOpcode::BitwiseAnd32) && !Is(user, IrOpcode::IEqual32) && !Is(user, IrOpcode::SelectU32) && !Is(user, IrOpcode::BitCastF32U32) && !Is(user, IrOpcode::BitCastU32F32) && !Is(user, IrOpcode::FPMax32)) return false; + pending.push_back(user); + } + } + std::vector elected; + const bool crossed = !reads.empty() && std::ranges::all_of(reads, [&](const IrValue* read) { + const auto* combined = Unmasked(read, false); + const auto operands = combined != nullptr ? ReductionOperands(combined, *std::ranges::find(WaveReductions, IrOpcode::FPMax32, &WaveReduction::opcode)) : std::nullopt; + const auto scan = MatchHalfWaveScan(read, program.Resources().stage, false, true); + const auto* atomic = scan ? ElectedAtomicMax(read, *scan, program) : nullptr; + if (atomic != nullptr) elected.push_back(atomic); + return operands && std::ranges::any_of(*operands, [&](const IrValue* operand) { return Unmasked(operand, false) == &permlane; }) && atomic != nullptr; + }); + return crossed && std::ranges::all_of(masked, [&](const IrValue* atomic) { return std::ranges::find(elected, atomic) != elected.end(); }); +} + std::optional EmitHalfWaveReduction(SpirvValueEmitContext& ctx, const IrValue& inst, std::uint32_t lane) { auto& state = ctx.state; if (state.program.WaveSize() != 64u || (lane & 31u) != 31u || state.spannedWave) return std::nullopt; const auto stage = state.program.Resources().stage; + if (HostSubgroupSingleLane(state)) { + if (const auto elected = MatchElectedMaxScan(inst.Argument(0), state.program)) return lane >= 32u ? ConstantU32(state, elected->reduction->identity) : ctx.Def(elected->source); + } auto scan = MatchHalfWaveScan(inst.Argument(0), stage, false); const bool narrow = !scan && HostSubgroupNarrowerThanWave(state) && state.hostSubgroupSize == 32u; if (narrow) scan = MatchHalfWaveScan(inst.Argument(0), stage, true); @@ -1043,10 +1314,10 @@ std::uint32_t SeriesWhenFar(SpirvEmitterState& state, std::uint32_t value, std:: return Select(state, TypeF32(state), Binary(state, spv::OpUGreaterThan, TypeBool(state), distance, ConstantU32(state, 4u)), series, value); } -std::uint32_t TrigLinearNearZero(SpirvEmitterState& state, std::uint32_t value, std::uint32_t distance, std::uint32_t linearConstant) { +std::uint32_t TrigLinearNearZero(SpirvEmitterState& state, std::uint32_t value, std::uint32_t distance, std::uint32_t linearConstant, std::uint32_t limit) { const auto linear = Binary(state, spv::OpFMul, TypeF32(state), distance, linearConstant); const auto magnitude = Binary(state, spv::OpBitwiseAnd, TypeU32(state), Unary(state, spv::OpBitcast, TypeU32(state), distance), ConstantU32(state, 0x7fffffffu)); - const auto near = Binary(state, spv::OpULessThan, TypeBool(state), magnitude, ConstantU32(state, 0x39800000u)); + const auto near = Binary(state, spv::OpULessThan, TypeBool(state), magnitude, limit); return Select(state, TypeF32(state), near, linear, value); } @@ -1060,7 +1331,8 @@ std::uint32_t EmitFPSin(SpirvEmitterState& state, std::uint32_t arg0) { const auto series = Select(state, TypeF32(state), pastEighth, CosTurnSeries(state, ExactSub(state, ConstantF32(state, 0x3e800000u), distance)), SinTurnSeries(state, distance)); const auto value = SeriesWhenFar(state, EmitExt(state, TypeF32(state), GLSLstd450Sin, {Binary(state, spv::OpFMul, TypeF32(state), absolute, ConstantF32(state, 0x40c90fdbu))}), series); const auto linearConstant = Select(state, TypeF32(state), nearHalf, ConstantF32(state, 0x40c90fdbu), ConstantF32(state, 0x40c90fd5u)); - const auto result = TrigLinearNearZero(state, value, distance, linearConstant); + const auto linearLimit = GcnGuestShaders() ? Select(state, TypeU32(state), nearHalf, ConstantU32(state, 0x39800000u), ConstantU32(state, 0x39c00000u)) : ConstantU32(state, 0x39800000u); + const auto result = TrigLinearNearZero(state, value, distance, linearConstant, linearLimit); return Unary(state, spv::OpBitcast, TypeF32(state), Binary(state, spv::OpBitwiseOr, TypeU32(state), Unary(state, spv::OpBitcast, TypeU32(state), result), signBits)); } @@ -1075,7 +1347,7 @@ std::uint32_t EmitFPCos(SpirvEmitterState& state, std::uint32_t arg0) { const auto pastThreeEighths = Binary(state, spv::OpFOrdGreaterThan, TypeBool(state), absolute, ConstantF32(state, 0x3ec00000u)); const auto series = Select(state, TypeF32(state), pastThreeEighths, high, Select(state, TypeF32(state), pastEighth, middle, low)); const auto value = SeriesWhenFar(state, EmitExt(state, TypeF32(state), GLSLstd450Cos, {Binary(state, spv::OpFMul, TypeF32(state), absolute, ConstantF32(state, 0x40c90fdbu))}), series); - return TrigLinearNearZero(state, value, distance, ConstantF32(state, 0x40c90fdbu)); + return TrigLinearNearZero(state, value, distance, ConstantF32(state, 0x40c90fdbu), ConstantU32(state, 0x39800000u)); } std::uint32_t EmitIdentity(SpirvValueEmitContext&, std::uint32_t value) { @@ -1177,7 +1449,10 @@ std::uint32_t EmitWriteLane(SpirvValueEmitContext& ctx, const IrValue& inst) { std::uint32_t EmitPermlane16U32(SpirvValueEmitContext& ctx, const IrValue& inst) { auto& state = ctx.state; const auto flags = inst.Flags(); - if (flags.x16 && state.hostSubgroupSize <= 16u && HostSubgroupNarrowerThanWave(state)) FailOutsideHostSubgroup(ctx, inst, "v_permlanex16_b32 from lanes 16-31"); + if (flags.x16 && state.hostSubgroupSize <= 16u && HostSubgroupNarrowerThanWave(state)) { + if (HostSubgroupSingleLane(state) && CrossesElectedMaxScan(inst, state.program)) return ctx.Arg(inst, 0); + FailOutsideHostSubgroup(ctx, inst, "v_permlanex16_b32 from lanes 16-31"); + } const auto subid = EmitSubgroupLocalInvocationId(state); const auto row = state.module.AllocateId(); const auto rowValue = state.module.AllocateId(); diff --git a/core/shader/recompiler/SpirvBackend/src/SpirvAlu/SpirvAluEmitterRegisters.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvAlu/SpirvAluEmitterRegisters.cpp index f38c0fe047ea..4b52a2f8f841 100644 --- a/core/shader/recompiler/SpirvBackend/src/SpirvAlu/SpirvAluEmitterRegisters.cpp +++ b/core/shader/recompiler/SpirvBackend/src/SpirvAlu/SpirvAluEmitterRegisters.cpp @@ -50,8 +50,18 @@ void EmitSetVectorRegister(SpirvValueEmitContext& ctx, const IrValue& inst) { namespace { -std::uint32_t VectorWindowElement(SpirvEmitterState& state, std::uint32_t index) { +std::uint32_t VectorWindowElement(SpirvEmitterState& state, std::uint32_t index, const IrValue* slot = nullptr) { const auto pointer = state.module.AllocateId(); + if (state.meshWindowBuffer) { + const auto invocations = MeshWindowInvocations(state); + const auto base = state.module.AllocateId(); + state.module.AddFunction(spv::OpLoad, TypeU32(state), base, state.meshWindowBaseVariable); + const auto lane = state.laneHalf * invocations; + const auto stride = state.laneCount * invocations; + const auto element = slot != nullptr && slot->HasImmediate() ? Binary(state, spv::OpIAdd, TypeU32(state), base, ConstantU32(state, lane + slot->ImmediateU32() * stride)) : Binary(state, spv::OpIAdd, TypeU32(state), Binary(state, spv::OpIAdd, TypeU32(state), base, ConstantU32(state, lane)), Binary(state, spv::OpIMul, TypeU32(state), index, ConstantU32(state, stride))); + state.module.AddFunction(spv::OpAccessChain, TypeStorageBufferElementPointer(state), pointer, state.meshWindowBufferVariable, ConstantU32(state, 0u), element); + return pointer; + } state.module.AddFunction(spv::OpAccessChain, TypePointer(state, spv::StorageClassFunction, TypeU32(state)), pointer, state.vectorWindowVariable.at(state.laneHalf), index); return pointer; } @@ -103,9 +113,9 @@ std::uint32_t AccessNarrowedWindow(SpirvEmitterState& state, std::uint32_t index std::uint32_t DirectWindowElement(SpirvValueEmitContext& ctx, const IrValue& inst) { auto& state = ctx.state; const IrValue* index = inst.Argument(0)->Resolve(); - if (state.vectorWindowIndexed == 0u) return VectorWindowElement(state, ctx.Arg(inst, 0u)); + if (state.vectorWindowIndexed == 0u) return VectorWindowElement(state, ctx.Arg(inst, 0u), index); if (!index->HasImmediate()) return 0u; - if (index->ImmediateU32() < state.vectorWindowIndexed) return VectorWindowElement(state, ctx.Arg(inst, 0u)); + if (index->ImmediateU32() < state.vectorWindowIndexed) return VectorWindowElement(state, ctx.Arg(inst, 0u), index); return state.vectorWindowSlots.at(state.laneHalf).at(index->ImmediateU32() - state.vectorWindowIndexed); } @@ -118,6 +128,19 @@ void EmitLoadVectorWindow(SpirvValueEmitContext& ctx, const IrValue& inst) { state.module.AddFunction(spv::OpLoad, TypeU32(state), value, pointer); return value; }; + if (state.meshWindowBuffer) { + const IrValue* index = inst.Argument(0)->Resolve(); + const auto& slots = state.vectorWindowSlots.at(state.laneHalf); + const bool direct = index->HasImmediate() && index->ImmediateU32() < slots.size(); + if (direct && !state.meshWindowBufferLoads.contains(&inst)) { + ctx.Define(inst, load(slots.at(index->ImmediateU32()))); + return; + } + const auto value = load(VectorWindowElement(state, ctx.Arg(inst, 0u), index)); + if (direct) state.module.AddFunction(spv::OpStore, slots.at(index->ImmediateU32()), value); + ctx.Define(inst, value); + return; + } const auto pointer = DirectWindowElement(ctx, inst); ctx.Define(inst, pointer != 0u ? load(pointer) : AccessNarrowedWindow(state, ctx.Arg(inst, 0u), load)); } @@ -129,6 +152,17 @@ void EmitStoreVectorWindow(SpirvValueEmitContext& ctx, const IrValue& inst) { state.module.AddFunction(spv::OpStore, pointer, value); return ConstantU32(state, 0u); }; + if (state.meshWindowBuffer) { + const IrValue* index = inst.Argument(0)->Resolve(); + const auto& slots = state.vectorWindowSlots.at(state.laneHalf); + if (index->HasImmediate() && index->ImmediateU32() < slots.size()) { + (void)store(slots.at(index->ImmediateU32())); + if (state.meshWindowBufferStores.contains(&inst)) (void)store(VectorWindowElement(state, ctx.Arg(inst, 0u), index)); + return; + } + (void)store(VectorWindowElement(state, ctx.Arg(inst, 0u), index)); + return; + } if (const auto pointer = DirectWindowElement(ctx, inst); pointer != 0u) (void)store(pointer); else (void)AccessNarrowedWindow(state, ctx.Arg(inst, 0u), store); } diff --git a/core/shader/recompiler/SpirvBackend/src/SpirvAnalysis.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvAnalysis.cpp index 6514d92cc14a..1462e360969f 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/SpirvEmitter.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp index 5bf8e747f409..230ddd8bbd1d 100644 --- a/core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp +++ b/core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp @@ -324,12 +324,14 @@ std::vector SpirvEmitter::Emit(const IrProgram& program, const Sh if (const char* guard = std::getenv("APS5_LOOP_GUARD")) state.loopGuardLimit = static_cast(std::strtoul(guard, nullptr, 0)); // Stopped invocations would leave the wave LDS barriers incomplete. state.bdaStopsInvocations = state.waveLdsScope == 0 && !state.spannedWave && BdaInvocationsMayStop(program) && program.Resources().stage != IrShaderStage::Mesh; + state.meshWindowBuffer = target.meshWindowBuffer && program.Resources().stage == IrShaderStage::Mesh && program.Metadata().vectorWindowSize != 0u && state.laneCount * MeshWindowInvocations(state) * program.Metadata().vectorWindowSize <= MeshWindowSlotDwords; EmitModuleHeader(state, bindings); EmitProgram(state); state.module.EmitEntryPoint(ExecutionModelForStage(state.program.Resources().stage), state.mainFunc, "main", state.interfaceVariables); if (info != nullptr) { info->fullSubgroups = state.spannedWave; info->functionLdsBuffer = state.pixelFunctionLdsBuffer; + info->meshWindowBuffer = state.meshWindowBuffer; } return state.module.Finalize(); } diff --git a/core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp index 051aa8a0971a..fae2fbf6a100 100644 --- a/core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp +++ b/core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp @@ -40,11 +40,6 @@ struct SampleSetup { std::uint32_t coord; }; -std::uint32_t RuntimeImageMode(SpirvEmitterState& state, std::uint32_t resource) { - const auto mode = Binary(state, spv::OpShiftRightLogical, TypeU32(state), RuntimeImageDword(state, resource, offsetof(RuntimeAbi::ResourceMetadata, flags) / sizeof(std::uint32_t)), ConstantU32(state, 1u)); - return state.registrationModules ? Binary(state, spv::OpBitwiseAnd, TypeU32(state), mode, ConstantU32(state, RuntimeAbi::ImageModeMask)) : mode; -} - std::uint32_t RuntimeImageSwizzle(SpirvEmitterState& state, std::uint32_t resource, std::uint32_t component) { const bool table = state.program.Info().images.at(resource).table != NoTable; if (!table && !state.registrationModules) return state.module.SpecializationConstant(TypeU32(state), PipelineSpecialization::ImageBase + resource * PipelineSpecialization::ImageWords + 1u + component, component + 4u); @@ -1429,7 +1424,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 +1470,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); @@ -2012,7 +2007,7 @@ void EmitImage(SpirvValueEmitContext& ctx, const IrValue& inst) { state.runtimeImage = nullptr; return; } - const auto selector = tables ? tableSelector : !state.registrationModules ? state.module.SpecializationConstant(TypeU32(state), PipelineSpecialization::ImageBase + memory.resource * PipelineSpecialization::ImageWords, 0u) : RuntimeImageMode(state, memory.resource); + const auto selector = tables ? tableSelector : state.module.SpecializationConstant(TypeU32(state), PipelineSpecialization::ImageBase + memory.resource * PipelineSpecialization::ImageWords, 0u); const bool returnsValue = inst.Opcode() != IrOpcode::ImageWrite; const auto guardedId = returnsValue ? ctx.Result(inst) : 0u; ctx.definitions.erase(&inst); diff --git a/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvEmitterHelpers.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvEmitterHelpers.cpp index 0fbd44881696..27ee03360075 100644 --- a/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvEmitterHelpers.cpp +++ b/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvEmitterHelpers.cpp @@ -69,6 +69,11 @@ std::array WorkgroupLocalSize(const SpirvEmitterState& state, return size; } +std::uint32_t MeshWindowInvocations(const SpirvEmitterState& state) { + const auto local = WorkgroupLocalSize(state, *ShaderWorkgroupInput(state)); + return local[0] * local[1] * local[2]; +} + namespace { constexpr std::uint32_t NoBuiltIn = std::numeric_limits::max(); @@ -578,6 +583,20 @@ void DefineDescriptors(SpirvEmitterState& state) { for (const auto variable : {state.ldsBufferVariable, state.ldsBufferU64Variable}) state.module.AddAnnotation(spv::OpDecorate, variable, spv::DecorationAliased); } } + if (state.meshWindowBuffer) { + state.meshWindowBufferVariable = state.module.DefineGlobalVariable(TypePointer(state, spv::StorageClassStorageBuffer, StorageBufferBlockType(state)), spv::StorageClassStorageBuffer); + state.module.AddName(state.meshWindowBufferVariable, "mesh_window"); + state.module.AddAnnotation(spv::OpDecorate, state.meshWindowBufferVariable, spv::DecorationDescriptorSet, MeshWindowDescriptorSet); + state.module.AddAnnotation(spv::OpDecorate, state.meshWindowBufferVariable, spv::DecorationBinding, 0u); + state.module.AddAnnotation(spv::OpDecorate, state.meshWindowBufferVariable, spv::DecorationRestrict); + state.meshWindowSlotVariable = state.module.DefineGlobalVariable(TypePointer(state, spv::StorageClassWorkgroup, TypeU32(state)), spv::StorageClassWorkgroup); + state.module.AddName(state.meshWindowSlotVariable, "mesh_window_slot"); + state.meshWindowBaseVariable = state.module.DefineGlobalVariable(TypePointer(state, spv::StorageClassPrivate, TypeU32(state)), spv::StorageClassPrivate); + state.module.AddName(state.meshWindowBaseVariable, "mesh_window_base"); + if (state.spirvVersion >= 0x00010400u) { + for (const auto variable : {state.meshWindowBufferVariable, state.meshWindowSlotVariable, state.meshWindowBaseVariable}) state.interfaceVariables.push_back(variable); + } + } if (state.pixelFunctionLdsBuffer) { state.ldsBufferVariable = state.module.DefineGlobalVariable(TypePointer(state, spv::StorageClassStorageBuffer, StorageBufferBlockType(state)), spv::StorageClassStorageBuffer); state.module.AddName(state.ldsBufferVariable, "pixel_function_lds"); diff --git a/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvInputOutput.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvInputOutput.cpp index ed3215659bb2..7032c6957d11 100644 --- a/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvInputOutput.cpp +++ b/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvInputOutput.cpp @@ -156,7 +156,7 @@ namespace ShaderRecompiler } bool OrderedPixelShader(const SpirvEmitterState& state) { - return state.program.Resources().stage == IrShaderStage::Pixel && state.inputInfo.pixel != nullptr && (state.inputInfo.pixel->psOrderedPixelShader || state.inputInfo.pixel->mergeMask != 0u); + return state.program.Resources().stage == IrShaderStage::Pixel && state.inputInfo.pixel != nullptr && (state.inputInfo.pixel->psOrderedPixelShader || !state.inputInfo.pixel->merges.empty()); } const SpirvInputBinding* SpirvInputBindingForParameter(const SpirvEmitterState& state, std::uint32_t location) { diff --git a/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp index 899b11619668..fc51264bfabc 100644 --- a/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp +++ b/core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp @@ -213,6 +213,101 @@ std::uint32_t IndexedWindowSlots(const IrProgram& program, std::uint32_t laneCou return static_cast(reached); } +void PlanMeshWindowBuffer(SpirvEmitterState& state) { + using Slots = std::vector; + const auto& program = state.program; + const std::size_t slots = program.Metadata().vectorWindowSize; + const auto constantSlot = [slots](const IrValue* inst) -> std::optional { + const IrValue* index = inst->Argument(0)->Resolve(); + if (!index->HasImmediate() || index->ImmediateU32() >= slots) return std::nullopt; + return index->ImmediateU32(); + }; + const auto& order = program.BlockOrder(); + const auto staleAfter = [&](const IrValue* inst, Slots& stale, bool collect) { + const bool load = inst->Opcode() == IrOpcode::LoadVectorWindow; + if (!load && inst->Opcode() != IrOpcode::StoreVectorWindow) return; + const auto slot = constantSlot(inst); + if (!slot) { + if (!load) stale.assign(slots, true); + return; + } + if (load && collect && stale[*slot]) state.meshWindowBufferLoads.insert(inst); + stale[*slot] = false; + }; + std::unordered_map staleOut; + for (const IrBlock* block : order) staleOut.emplace(block, Slots(slots, false)); + const auto staleIn = [&](const IrBlock* block) { + Slots stale(slots, false); + for (const IrBlock* predecessor : block->Predecessors()) { + const auto found = staleOut.find(predecessor); + if (found == staleOut.end()) return Slots(slots, true); + for (std::size_t slot = 0; slot < slots; ++slot) stale[slot] = stale[slot] || found->second[slot]; + } + return stale; + }; + for (bool changed = true; changed;) { + changed = false; + for (const IrBlock* block : order) { + auto stale = staleIn(block); + for (const IrValue* inst : block->Instructions()) staleAfter(inst, stale, false); + auto& exit = staleOut[block]; + if (stale != exit) { + exit = std::move(stale); + changed = true; + } + } + } + for (const IrBlock* block : order) { + auto stale = staleIn(block); + for (const IrValue* inst : block->Instructions()) staleAfter(inst, stale, true); + } + const auto liveBefore = [&](const IrValue* inst, Slots& live) { + if (inst->Opcode() == IrOpcode::LoadVectorWindow) { + const auto slot = constantSlot(inst); + if (!slot) live.assign(slots, true); + else if (state.meshWindowBufferLoads.contains(inst)) live[*slot] = true; + return; + } + if (inst->Opcode() != IrOpcode::StoreVectorWindow) return; + if (const auto slot = constantSlot(inst)) live[*slot] = false; + }; + std::unordered_map liveIn; + for (const IrBlock* block : order) liveIn.emplace(block, Slots(slots, false)); + const auto liveOut = [&](const IrBlock* block) { + Slots live(slots, false); + for (const IrBlock* successor : block->Successors()) { + const auto found = liveIn.find(successor); + if (found == liveIn.end()) return Slots(slots, true); + for (std::size_t slot = 0; slot < slots; ++slot) live[slot] = live[slot] || found->second[slot]; + } + return live; + }; + for (bool changed = true; changed;) { + changed = false; + for (auto block = order.rbegin(); block != order.rend(); ++block) { + auto live = liveOut(*block); + const auto& instructions = (*block)->Instructions(); + for (auto inst = instructions.rbegin(); inst != instructions.rend(); ++inst) liveBefore(*inst, live); + auto& entry = liveIn[*block]; + if (live != entry) { + entry = std::move(live); + changed = true; + } + } + } + for (const IrBlock* block : order) { + auto live = liveOut(block); + const auto& instructions = block->Instructions(); + for (auto inst = instructions.rbegin(); inst != instructions.rend(); ++inst) { + if ((*inst)->Opcode() == IrOpcode::StoreVectorWindow) { + if (const auto slot = constantSlot(*inst); slot && live[*slot]) state.meshWindowBufferStores.insert(*inst); + } + liveBefore(*inst, live); + } + } + state.meshWindowEntryLive = order.empty() ? Slots(slots, true) : liveIn.at(order.front()); +} + bool WritesGuestMemory(const IrProgram& program) { const auto& info = program.Info(); const auto writtenImage = [](const ImageResource& image) { return !image.targetMerge && (image.written || image.atomic || image.atomic64); }; @@ -250,10 +345,11 @@ void DefineModule(SpirvEmitterState& state) { } if (const auto window = state.program.Metadata().vectorWindowSize; window != 0u) { static const bool narrowWindow = std::getenv("APS5_NO_WINDOW_NARROWING") == nullptr; - state.vectorWindowIndexed = narrowWindow ? IndexedWindowSlots(state.program, state.laneCount) : 0u; + state.vectorWindowIndexed = narrowWindow && !state.meshWindowBuffer ? IndexedWindowSlots(state.program, state.laneCount) : 0u; + if (state.meshWindowBuffer) PlanMeshWindowBuffer(state); for (std::uint32_t half = 0; half < state.laneCount; half++) { state.vectorWindowVariable.at(half) = state.module.AllocateId(); - if (state.vectorWindowIndexed == 0u) continue; + if (state.vectorWindowIndexed == 0u && !state.meshWindowBuffer) continue; auto& slots = state.vectorWindowSlots.at(half); for (std::uint32_t slot = state.vectorWindowIndexed; slot < window; slot++) slots.push_back(state.module.AllocateId()); } @@ -375,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"); } @@ -410,8 +508,8 @@ void DefineModule(SpirvEmitterState& state) { state.module.EmitExtension("SPV_EXT_shader_stencil_export"); state.module.AddExecutionMode(state.mainFunc, spv::ExecutionModeStencilRefReplacingEXT); } - const bool merge = pixel.mergeMask != 0u; - const std::string mergeName = pixel.mergeBlend.enabled ? "blending into an unclamped normalized color target" : "a partial write of a packed color target"; + const bool merge = !pixel.merges.empty(); + const std::string mergeName = merge && pixel.merges.front().blend.enabled ? "blending into an unclamped normalized color target" : "a partial write of a packed color target"; if (merge && (state.depthVariable != 0 || state.stencilRefVariable != 0 || pixel.psDepthExportEnable || pixel.psSampleMaskExportEnable || pixel.psStencilRefExportEnable || pixel.psAlphaToCoverage || pixel.QuadMasked() || (pixel.psPixelKillEnable && !pixel.psEarlyZ && pixel.mergeDepthStencilWrites))) { throw std::runtime_error(mergeName + " merges inside the pixel shader after early depth and stencil tests, which a shader that kills pixels under late tests of a draw writing depth or stencil, exports depth, stencil or coverage, or runs with a quad sample mask cannot use"); } @@ -445,7 +543,7 @@ void DefineModule(SpirvEmitterState& state) { state.module.AddName(state.scratchVariable.at(half), "scratch_dwords"); } } - if (state.program.Metadata().vectorWindowSize != 0u) { + if (state.program.Metadata().vectorWindowSize != 0u && !state.meshWindowBuffer) { for (std::uint32_t half = 0; half < state.laneCount; half++) { state.module.AddName(state.vectorWindowVariable.at(half), "vector_window"); } diff --git a/core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp index 681dfcc98f8f..44beabfca94b 100644 --- a/core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp +++ b/core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp @@ -478,19 +478,19 @@ struct MergeTexel { std::uint32_t sample; }; -MergeTexel MergeTargetTexel(SpirvEmitterState& state) { +MergeTexel MergeTargetTexel(SpirvEmitterState& state, std::size_t entry) { const auto& pixel = PixelInfo(state); const auto& images = state.program.Info().images; - const auto image = std::ranges::find_if(images, [](const ImageResource& candidate) { return candidate.targetMerge; }); - if (image == images.end()) FailEmit("the color target merge image was not collected"); + const auto index = static_cast(std::ranges::find_if(images, [](const ImageResource& candidate) { return candidate.targetMerge; }) - images.begin()) + entry; + if (index >= images.size() || !images[index].targetMerge) FailEmit("the color target merge image was not collected"); if (InputVariableForKind(state, StageInputKind::FragCoord) == 0u || (pixel.mergeSamples > 1u && InputVariableForKind(state, StageInputKind::SampleId) == 0u)) FailEmit("the color target merge inputs were not declared"); - if ((state.mergeWordVariable == 0u && state.mergeTexelVariable == 0u) || state.mergePendingVariable == 0u) FailEmit("the color target merge variables were not declared"); + if (entry >= state.mergeValueVariables.size() || entry >= state.mergePendingVariables.size()) FailEmit("the color target merge variables were not declared"); const auto position = [&](std::uint32_t component) { return Unary(state, spv::OpConvertFToU, TypeU32(state), Unary(state, spv::OpBitcast, TypeF32(state), EmitBuiltinU32(state, StageInputKind::FragCoord, component))); }; const auto x = position(0u); const auto y = position(1u); const auto coord = state.module.AllocateId(); state.module.AddFunction(spv::OpCompositeConstruct, TypeU32Vector(state, 2u), coord, x, y); - return {static_cast(image - images.begin()), coord, pixel.mergeSamples > 1u ? EmitBuiltinU32(state, StageInputKind::SampleId, 0u) : 0u}; + return {static_cast(index), coord, pixel.mergeSamples > 1u ? EmitBuiltinU32(state, StageInputKind::SampleId, 0u) : 0u}; } std::uint32_t BlendComponent(SpirvEmitterState& state, std::uint32_t vector, std::uint32_t index) { @@ -511,8 +511,7 @@ std::uint32_t BlendGlsl(SpirvEmitterState& state, GLSLstd450 operation, std::uin return result; } -std::uint32_t BlendFactor(SpirvEmitterState& state, std::uint32_t kind, std::uint32_t channel, bool alpha, const std::array& source, const std::array& destination) { - const auto& blend = PixelInfo(state).mergeBlend; +std::uint32_t BlendFactor(SpirvEmitterState& state, const TargetBlend& blend, std::uint32_t kind, std::uint32_t channel, bool alpha, const std::array& source, const std::array& destination) { const auto one = ConstantF32(state, std::bit_cast(1.0f)); const auto complement = [&](std::uint32_t value) { return BlendArithmetic(state, spv::OpFSub, one, value); }; const std::uint32_t index = alpha ? 3u : channel; @@ -547,9 +546,9 @@ std::uint32_t BlendEquation(SpirvEmitterState& state, std::uint32_t operation, s } } -void MergeBlendTarget(SpirvEmitterState& state, std::uint32_t color) { - const auto& blend = PixelInfo(state).mergeBlend; - const auto [resource, coord, sample] = MergeTargetTexel(state); +void MergeBlendTarget(SpirvEmitterState& state, std::size_t entry, std::uint32_t color) { + const auto& blend = PixelInfo(state).merges[entry].blend; + const auto [resource, coord, sample] = MergeTargetTexel(state, entry); const auto stored = EmitStorageImageRead(state, resource, coord, sample); std::array source{}; std::array destination{}; @@ -562,8 +561,8 @@ void MergeBlendTarget(SpirvEmitterState& state, std::uint32_t color) { std::array result{}; for (std::uint32_t channel = 0; channel < 4u; ++channel) { const bool alpha = channel == 3u; - const auto sourceFactor = BlendFactor(state, alpha ? blend.alphaSource : blend.colorSource, channel, alpha, source, destination); - const auto destinationFactor = BlendFactor(state, alpha ? blend.alphaDestination : blend.colorDestination, channel, alpha, source, destination); + const auto sourceFactor = BlendFactor(state, blend, alpha ? blend.alphaSource : blend.colorSource, channel, alpha, source, destination); + const auto destinationFactor = BlendFactor(state, blend, alpha ? blend.alphaDestination : blend.colorDestination, channel, alpha, source, destination); const auto value = BlendEquation(state, alpha ? blend.alphaOperation : blend.colorOperation, sourceFactor, destinationFactor, source[channel], destination[channel]); const auto clamped = state.module.AllocateId(); state.module.AddFunction(spv::OpExtInst, TypeF32(state), clamped, GlslStd450(state), GLSLstd450NClamp, value, low, high); @@ -571,21 +570,21 @@ void MergeBlendTarget(SpirvEmitterState& state, std::uint32_t color) { } const auto merged = state.module.AllocateId(); state.module.AddFunction(spv::OpCompositeConstruct, TypeF32Vector(state, 4u), merged, result[0], result[1], result[2], result[3]); - state.module.AddFunction(spv::OpStore, state.mergeTexelVariable, merged); - state.module.AddFunction(spv::OpStore, state.mergePendingVariable, ConstantU32(state, 1u)); + state.module.AddFunction(spv::OpStore, state.mergeValueVariables[entry], merged); + state.module.AddFunction(spv::OpStore, state.mergePendingVariables[entry], ConstantU32(state, 1u)); } -void MergeColorTarget(SpirvEmitterState& state, std::uint32_t color) { - const auto& pixel = PixelInfo(state); - if (pixel.mergeBlend.enabled) return MergeBlendTarget(state, color); - const auto [resource, coord, sample] = MergeTargetTexel(state); +void MergeColorTarget(SpirvEmitterState& state, std::size_t entry, std::uint32_t color) { + const auto& merge = PixelInfo(state).merges[entry]; + if (merge.blend.enabled) return MergeBlendTarget(state, entry, color); + const auto [resource, coord, sample] = MergeTargetTexel(state, entry); const auto stored = state.module.AllocateId(); state.module.AddFunction(spv::OpCompositeExtract, TypeU32(state), stored, EmitStorageImageRead(state, resource, coord, sample), 0u); const auto word = PackExport(state, IrBufferFormat::Format4_4_4_4UNorm, color); - const auto kept = EmitBinaryU32(state, spv::OpBitwiseAnd, stored, ConstantU32(state, ~static_cast(pixel.mergeMask))); - const auto merged = EmitOrU32(state, kept, EmitBinaryU32(state, spv::OpBitwiseAnd, word, ConstantU32(state, pixel.mergeMask))); - state.module.AddFunction(spv::OpStore, state.mergeWordVariable, merged); - state.module.AddFunction(spv::OpStore, state.mergePendingVariable, ConstantU32(state, 1u)); + const auto kept = EmitBinaryU32(state, spv::OpBitwiseAnd, stored, ConstantU32(state, ~static_cast(merge.mask))); + const auto merged = EmitOrU32(state, kept, EmitBinaryU32(state, spv::OpBitwiseAnd, word, ConstantU32(state, merge.mask))); + state.module.AddFunction(spv::OpStore, state.mergeValueVariables[entry], merged); + state.module.AddFunction(spv::OpStore, state.mergePendingVariables[entry], ConstantU32(state, 1u)); } bool AlphaToCoverage(const SpirvEmitterState& state) { @@ -905,12 +904,9 @@ std::uint32_t ConvertPositionToClipSpace(SpirvEmitterState& state, std::uint32_t return converted; } -} - -void FlushColorTargetMerge(SpirvEmitterState& state) { - if (state.mergePendingVariable == 0u) return; +void FlushTargetMerge(SpirvEmitterState& state, std::size_t entry) { const auto pending = state.module.AllocateId(); - state.module.AddFunction(spv::OpLoad, TypeU32(state), pending, state.mergePendingVariable); + state.module.AddFunction(spv::OpLoad, TypeU32(state), pending, state.mergePendingVariables[entry]); auto write = Binary(state, spv::OpINotEqual, TypeBool(state), pending, ConstantU32(state, 0u)); if (state.pixelValidMaskVariable != 0u) { const auto valid = state.module.AllocateId(); @@ -918,21 +914,27 @@ void FlushColorTargetMerge(SpirvEmitterState& state) { write = Binary(state, spv::OpLogicalAnd, TypeBool(state), write, Binary(state, spv::OpINotEqual, TypeBool(state), valid, ConstantU32(state, 0u))); } EmitIfCondition(state, write, [&] { - const auto [resource, coord, sample] = MergeTargetTexel(state); - if (state.mergeTexelVariable != 0u) { + const auto [resource, coord, sample] = MergeTargetTexel(state, entry); + if (PixelInfo(state).merges[entry].blend.enabled) { const auto blended = state.module.AllocateId(); - state.module.AddFunction(spv::OpLoad, TypeF32Vector(state, 4u), blended, state.mergeTexelVariable); + state.module.AddFunction(spv::OpLoad, TypeF32Vector(state, 4u), blended, state.mergeValueVariables[entry]); EmitStorageImageWrite(state, resource, 0u, coord, blended, sample); return; } const auto merged = state.module.AllocateId(); - state.module.AddFunction(spv::OpLoad, TypeU32(state), merged, state.mergeWordVariable); + state.module.AddFunction(spv::OpLoad, TypeU32(state), merged, state.mergeValueVariables[entry]); const auto texel = state.module.AllocateId(); state.module.AddFunction(spv::OpCompositeConstruct, TypeU32Vector(state, 4u), texel, merged, ConstantU32(state, 0u), ConstantU32(state, 0u), ConstantU32(state, 0u)); EmitStorageImageWrite(state, resource, 0u, coord, texel, sample); }); } +} + +void FlushColorTargetMerge(SpirvEmitterState& state) { + for (std::size_t entry = 0; entry < state.mergePendingVariables.size(); ++entry) FlushTargetMerge(state, entry); +} + namespace { std::uint32_t MeshArray(SpirvEmitterState& state, std::uint32_t storage, std::uint32_t type, std::uint32_t count) { @@ -1270,6 +1272,65 @@ void EmitPixelEntryPoint(SpirvEmitterState& state) { state.module.AddFunction(spv::OpFunctionEnd); } +namespace { + +std::uint32_t MeshWindowWord(SpirvEmitterState& state, std::uint32_t index) { + const auto pointer = state.module.AllocateId(); + state.module.AddFunction(spv::OpAccessChain, TypeStorageBufferElementPointer(state), pointer, state.meshWindowBufferVariable, ConstantU32(state, 0u), index); + return pointer; +} + +void EmitMeshWindowClaim(SpirvEmitterState& state, std::uint32_t firstInvocation) { + const auto uniform = spv::MemorySemanticsUniformMemoryMask; + EmitIfCondition(state, firstInvocation, [&]() { + const auto header = state.module.AllocateId(); + const auto body = state.module.AllocateId(); + const auto next = state.module.AllocateId(); + const auto merge = state.module.AllocateId(); + state.module.AddFunction(spv::OpBranch, header); + EmitLabel(state, header); + state.module.AddFunction(spv::OpLoopMerge, merge, next, spv::LoopControlMaskNone); + state.module.AddFunction(spv::OpBranch, body); + EmitLabel(state, body); + const auto ticket = state.module.AllocateId(); + state.module.AddFunction(spv::OpAtomicIAdd, TypeU32(state), ticket, MeshWindowWord(state, ConstantU32(state, 0u)), ConstantU32(state, spv::ScopeDevice), ConstantU32(state, spv::MemorySemanticsMaskNone), ConstantU32(state, 1u)); + const auto slot = EmitBinaryU32(state, spv::OpBitwiseAnd, ticket, ConstantU32(state, MeshWindowSlots - 1u)); + const auto previous = state.module.AllocateId(); + state.module.AddFunction(spv::OpAtomicCompareExchange, TypeU32(state), previous, MeshWindowWord(state, EmitAddU32(state, slot, ConstantU32(state, 4u))), ConstantU32(state, spv::ScopeDevice), ConstantU32(state, spv::MemorySemanticsAcquireMask | uniform), ConstantU32(state, spv::MemorySemanticsMaskNone), ConstantU32(state, 1u), ConstantU32(state, 0u)); + state.module.AddFunction(spv::OpStore, state.meshWindowSlotVariable, slot); + const auto claimed = Binary(state, spv::OpIEqual, TypeBool(state), previous, ConstantU32(state, 0u)); + state.module.AddFunction(spv::OpBranchConditional, claimed, merge, next); + EmitLabel(state, next); + state.module.AddFunction(spv::OpBranch, header); + EmitLabel(state, merge); + }); + state.module.AddFunction(spv::OpControlBarrier, ConstantU32(state, spv::ScopeWorkgroup), ConstantU32(state, spv::ScopeDevice), ConstantU32(state, spv::MemorySemanticsAcquireReleaseMask | spv::MemorySemanticsWorkgroupMemoryMask | uniform)); + const auto slot = state.module.AllocateId(); + state.module.AddFunction(spv::OpLoad, TypeU32(state), slot, state.meshWindowSlotVariable); + const auto invocation = state.module.AllocateId(); + state.module.AddFunction(spv::OpLoad, TypeU32(state), invocation, InputVariableForKind(state, StageInputKind::LocalInvocationIndex)); + const auto base = EmitAddU32(state, EmitAddU32(state, EmitBinaryU32(state, spv::OpIMul, slot, ConstantU32(state, MeshWindowSlotDwords)), ConstantU32(state, MeshWindowHeaderDwords)), invocation); + state.module.AddFunction(spv::OpStore, state.meshWindowBaseVariable, base); + const auto invocations = MeshWindowInvocations(state); + const auto window = state.program.Metadata().vectorWindowSize; + const auto indexed = state.vectorWindowIndexed != 0u ? state.vectorWindowIndexed : window; + for (std::uint32_t entry = 0; entry < state.laneCount * indexed; entry++) { + if (entry / state.laneCount < state.meshWindowEntryLive.size() && !state.meshWindowEntryLive[entry / state.laneCount]) continue; + state.module.AddFunction(spv::OpStore, MeshWindowWord(state, EmitAddU32(state, base, ConstantU32(state, entry * invocations))), ConstantU32(state, 0u)); + } +} + +void EmitMeshWindowRelease(SpirvEmitterState& state, std::uint32_t firstInvocation) { + state.module.AddFunction(spv::OpControlBarrier, ConstantU32(state, spv::ScopeWorkgroup), ConstantU32(state, spv::ScopeDevice), ConstantU32(state, spv::MemorySemanticsAcquireReleaseMask | spv::MemorySemanticsUniformMemoryMask)); + EmitIfCondition(state, firstInvocation, [&]() { + const auto slot = state.module.AllocateId(); + state.module.AddFunction(spv::OpLoad, TypeU32(state), slot, state.meshWindowSlotVariable); + state.module.AddFunction(spv::OpAtomicStore, MeshWindowWord(state, EmitAddU32(state, slot, ConstantU32(state, 4u))), ConstantU32(state, spv::ScopeDevice), ConstantU32(state, spv::MemorySemanticsReleaseMask | spv::MemorySemanticsUniformMemoryMask), ConstantU32(state, 0u)); + }); +} + +} + void EmitMeshEntryPoint(SpirvEmitterState& state) { state.module.AddFunction(spv::OpFunction, TypeVoid(state), state.mainFunc, spv::FunctionControlMaskNone, TypeFunction(state)); EmitLabel(state, state.module.AllocateId()); @@ -1293,8 +1354,10 @@ void EmitMeshEntryPoint(SpirvEmitterState& state) { state.module.AddFunction(spv::OpStore, MeshElement(state, state.meshAllocation, spv::StorageClassWorkgroup, TypeU32(state), ConstantU32(state, field)), ConstantU32(state, 0u)); } }); + if (state.meshWindowBuffer) EmitMeshWindowClaim(state, firstInvocation); state.module.AddFunction(spv::OpFunctionCall, TypeVoid(state), state.module.AllocateId(), state.meshGuestFunc); state.module.AddFunction(spv::OpControlBarrier, ConstantU32(state, spv::ScopeWorkgroup), ConstantU32(state, spv::ScopeWorkgroup), ConstantU32(state, spv::MemorySemanticsAcquireReleaseMask | spv::MemorySemanticsWorkgroupMemoryMask)); + if (state.meshWindowBuffer) EmitMeshWindowRelease(state, firstInvocation); const auto& mesh = state.inputInfo.vertex->mesh; const auto clamp = [&](std::uint32_t value, std::uint32_t limit) { const auto result = state.module.AllocateId(); @@ -1597,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); @@ -1690,9 +1757,11 @@ void EmitProgram(SpirvEmitterState& state) { state.pixelValidMaskVariable = state.module.AllocateId(); state.module.AddName(state.pixelValidMaskVariable, "pixel_valid_mask_active"); } - if (state.program.Resources().stage == IrShaderStage::Pixel && state.inputInfo.pixel != nullptr && state.inputInfo.pixel->mergeMask != 0u) { - (state.inputInfo.pixel->mergeBlend.enabled ? state.mergeTexelVariable : state.mergeWordVariable) = state.module.AllocateId(); - state.mergePendingVariable = state.module.AllocateId(); + if (state.program.Resources().stage == IrShaderStage::Pixel && state.inputInfo.pixel != nullptr) { + for (std::size_t entry = 0; entry < state.inputInfo.pixel->merges.size(); ++entry) { + state.mergeValueVariables.push_back(state.module.AllocateId()); + state.mergePendingVariables.push_back(state.module.AllocateId()); + } } for (const IrBlock* block : program.BlockOrder()) { const auto label = state.module.AllocateId(); @@ -1700,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) { @@ -1734,7 +1804,7 @@ void EmitProgram(SpirvEmitterState& state) { const auto array = state.module.Type(spv::OpTypeArray, TypeU32(state), ConstantU32(state, indexed)); const auto zero = state.module.Constant(spv::OpConstantNull, array); for (std::uint32_t half = 0; half < state.laneCount; half++) { - state.module.AddFunction(spv::OpVariable, TypePointer(state, spv::StorageClassFunction, array), state.vectorWindowVariable.at(half), spv::StorageClassFunction, zero); + if (!state.meshWindowBuffer) state.module.AddFunction(spv::OpVariable, TypePointer(state, spv::StorageClassFunction, array), state.vectorWindowVariable.at(half), spv::StorageClassFunction, zero); for (const auto slot : state.vectorWindowSlots.at(half)) { state.module.AddFunction(spv::OpVariable, TypePointer(state, spv::StorageClassFunction, TypeU32(state)), slot, spv::StorageClassFunction, ConstantU32(state, 0u)); } @@ -1743,13 +1813,10 @@ void EmitProgram(SpirvEmitterState& state) { if (state.pixelValidMaskVariable != 0u) { state.module.AddFunction(spv::OpVariable, TypePointer(state, spv::StorageClassFunction, TypeU32(state)), state.pixelValidMaskVariable, spv::StorageClassFunction); } - if (state.mergePendingVariable != 0u) { - if (state.mergeTexelVariable != 0u) { - state.module.AddFunction(spv::OpVariable, TypePointer(state, spv::StorageClassFunction, TypeF32Vector(state, 4u)), state.mergeTexelVariable, spv::StorageClassFunction); - } else { - state.module.AddFunction(spv::OpVariable, TypePointer(state, spv::StorageClassFunction, TypeU32(state)), state.mergeWordVariable, spv::StorageClassFunction); - } - state.module.AddFunction(spv::OpVariable, TypePointer(state, spv::StorageClassFunction, TypeU32(state)), state.mergePendingVariable, spv::StorageClassFunction, ConstantU32(state, 0u)); + for (std::size_t entry = 0; entry < state.mergePendingVariables.size(); ++entry) { + const auto value = PixelInfo(state).merges[entry].blend.enabled ? TypeF32Vector(state, 4u) : TypeU32(state); + state.module.AddFunction(spv::OpVariable, TypePointer(state, spv::StorageClassFunction, value), state.mergeValueVariables[entry], spv::StorageClassFunction); + state.module.AddFunction(spv::OpVariable, TypePointer(state, spv::StorageClassFunction, TypeU32(state)), state.mergePendingVariables[entry], spv::StorageClassFunction, ConstantU32(state, 0u)); } for (std::uint32_t half = 0; half < state.laneCount; half++) { auto& lane = half == 0u ? ctx : high; @@ -2169,9 +2236,10 @@ void EmitSetAttribute(SpirvValueEmitContext& ctx, const IrValue& inst) { value = state.registrationModules ? EmitValueIfElse(state, EmitCompareU32Constant(state, spv::OpIEqual, EmitAndConstant(state, mapping, 0xffu), identityMapping), vectorType, [&] { return exported; }, mapped) : mapped(); if (exp.index == 0u && !uintOutput && AlphaToCoverage(state)) StoreAlphaCoverage(state, value); const auto mode = MrtOutputMode(state, exp); - if (PixelInfo(state).mergeMask != 0u && exp.index == PixelInfo(state).mergeTarget) { - if (uintOutput || mode == 5u || mode == 6u) FailEmit(std::string(PixelInfo(state).mergeBlend.enabled ? "blending into an unclamped normalized color target" : "a partial write of a packed color target") + " cannot take an integer or 16-bit normalized export"); - MergeColorTarget(state, value); + const auto& merges = PixelInfo(state).merges; + if (const auto merge = std::ranges::find(merges, exp.index, &TargetMerge::target); merge != merges.end()) { + if (uintOutput || mode == 5u || mode == 6u) FailEmit(std::string(merge->blend.enabled ? "blending into an unclamped normalized color target" : "a partial write of a packed color target") + " cannot take an integer or 16-bit normalized export"); + MergeColorTarget(state, static_cast(merge - merges.begin()), value); } if (!uintOutput && mode != 5u && mode != 6u) value = SelectExportPacking(state, exp.index, value); } diff --git a/core/shader/recompiler/SpirvBackend/src/SpirvRuntimeBuffer.cpp b/core/shader/recompiler/SpirvBackend/src/SpirvRuntimeBuffer.cpp index 65cef1375dc2..50e70196e408 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/Translation/src/ShaderInputInfoBuilder.cpp b/core/shader/recompiler/Translation/src/ShaderInputInfoBuilder.cpp index 6288dee040c6..9108ef7d4966 100644 --- a/core/shader/recompiler/Translation/src/ShaderInputInfoBuilder.cpp +++ b/core/shader/recompiler/Translation/src/ShaderInputInfoBuilder.cpp @@ -170,15 +170,16 @@ ShaderStageInputInfo BuildShaderStageInputInfo(ShaderStageKind stage, const Gues pixelStorage.psIteratesSamples = pixel.iteratesSamples; pixelStorage.psPositionLocation = pixel.positionLocation; pixelStorage.sampleLocations = pixel.sampleLocations; - if (pixel.targetMerge.mask != 0u && (pixel.targetMerge.target >= 8u || (pixel.targetMerge.samples != 1u && pixel.targetMerge.samples != 2u && pixel.targetMerge.samples != 4u && pixel.targetMerge.samples != 8u))) throw std::runtime_error("ShaderInputInfoBuilder: invalid color target merge"); - pixelStorage.mergeTarget = pixel.targetMerge.target; - pixelStorage.mergeMask = pixel.targetMerge.mask; - pixelStorage.mergeSamples = pixel.targetMerge.samples; - pixelStorage.mergeDepthStencilWrites = pixel.targetMerge.depthStencilWrites; - pixelStorage.mergeDepthStencilTests = pixel.targetMerge.depthStencilTests; - const auto& blend = pixel.targetMerge.blend; - if (blend.enabled && (pixel.targetMerge.mask == 0u || pixel.targetMerge.samples != 1u || blend.colorSource > 14u || blend.colorDestination > 14u || blend.alphaSource > 14u || blend.alphaDestination > 14u || blend.colorOperation > 4u || blend.alphaOperation > 4u || blend.writeMask > 0xfu)) throw std::runtime_error("ShaderInputInfoBuilder: invalid color target blend"); - pixelStorage.mergeBlend = blend; + for (const auto& merge : pixel.targetMerges) { + const auto& first = pixel.targetMerges.front(); + if (merge.mask == 0u || merge.target >= 8u || std::ranges::count(pixel.targetMerges, merge.target, &TargetMerge::target) != 1 || (merge.samples != 1u && merge.samples != 2u && merge.samples != 4u && merge.samples != 8u) || merge.samples != first.samples || merge.depthStencilWrites != first.depthStencilWrites || merge.depthStencilTests != first.depthStencilTests) throw std::runtime_error("ShaderInputInfoBuilder: invalid color target merge"); + const auto& blend = merge.blend; + if (blend.enabled && (merge.samples != 1u || blend.colorSource > 14u || blend.colorDestination > 14u || blend.alphaSource > 14u || blend.alphaDestination > 14u || blend.colorOperation > 4u || blend.alphaOperation > 4u || blend.writeMask > 0xfu)) throw std::runtime_error("ShaderInputInfoBuilder: invalid color target blend"); + pixelStorage.merges.push_back(merge); + pixelStorage.mergeSamples = merge.samples; + pixelStorage.mergeDepthStencilWrites = merge.depthStencilWrites; + pixelStorage.mergeDepthStencilTests = merge.depthStencilTests; + } pixelStorage.sampleOrder = pixel.sampleOrder; ShaderStageInputInfo result; result.pixel = &pixelStorage; diff --git a/core/shader/recompiler/tests/RequestSerializerTests.cpp b/core/shader/recompiler/tests/RequestSerializerTests.cpp index 911e3c9a6b03..2681510a6ae9 100644 --- a/core/shader/recompiler/tests/RequestSerializerTests.cpp +++ b/core/shader/recompiler/tests/RequestSerializerTests.cpp @@ -690,7 +690,7 @@ int main() { version42.pop_back(); version42[4] = 42u; const auto replay42 = serializer.Deserialize(EncodeBase64(version42)); - Require(replay42.request.context.pixel.has_value() && replay42.request.context.pixel->sampleOrder == pixel.sampleOrder && replay42.request.context.pixel->targetMerge == ShaderRecompiler::TargetMerge{}); + Require(replay42.request.context.pixel.has_value() && replay42.request.context.pixel->sampleOrder == pixel.sampleOrder && replay42.request.context.pixel->targetMerges.empty()); auto upgraded42 = replay42.request; upgraded42.target = request.target; Require(serializer.Serialize(upgraded42) == orderEncoded); diff --git a/core/shader/recompiler/tests/SpirvLiteralFloat.cpp b/core/shader/recompiler/tests/SpirvLiteralFloat.cpp new file mode 100644 index 000000000000..4236142ea5a2 --- /dev/null +++ b/core/shader/recompiler/tests/SpirvLiteralFloat.cpp @@ -0,0 +1,82 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +struct ParseState { + unsigned callbacks = 0; + bool correct = true; +}; + +spv_result_t ReadInstruction(void* data, const spv_parsed_instruction_t* instruction) { + auto& state = *static_cast(data); + ++state.callbacks; + if (instruction->opcode != static_cast(spv::Op::OpDecorate) || instruction->num_operands != 3) { + state.correct = false; + return SPV_SUCCESS; + } + const auto& operand = instruction->operands[2]; + if (operand.type != SPV_OPERAND_TYPE_LITERAL_FLOAT || operand.number_kind != SPV_NUMBER_FLOATING || + operand.number_bit_width != 32 || operand.num_words != 1 || operand.fp_encoding != SPV_FP_ENCODING_UNKNOWN) { + std::fprintf(stderr, "literal-float metadata: type=%d kind=%d width=%u words=%u encoding=%d\n", + operand.type, operand.number_kind, operand.number_bit_width, operand.num_words, operand.fp_encoding); + state.correct = false; + } + return SPV_SUCCESS; +} + +std::uint32_t Swap(std::uint32_t word) { + return (word >> 24) | ((word >> 8) & 0x0000ff00u) | ((word << 8) & 0x00ff0000u) | (word << 24); +} + +} + +int main() { + constexpr std::array literals{0, 0x80000000u, 0x3f800000u, 0xbf800000u, + 0x20202020u, 0x7f7fffffu, 1, 0x80800000u}; + spvtools::Context context(SPV_ENV_UNIVERSAL_1_6); + spvtools::SpirvTools tools(SPV_ENV_UNIVERSAL_1_6); + unsigned failed = 0; + unsigned roundTrips = 0; + unsigned controls = 0; + std::vector control; + std::string controlText; + if (tools.Assemble("%1 = OpTypeFloat 32\n%2 = OpConstant %1 1\n", &control, SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS) && + tools.Disassemble(control, &controlText, SPV_BINARY_TO_TEXT_OPTION_NO_HEADER)) ++controls; + else ++failed; + for (const auto literal : literals) { + const std::array words{spv::MagicNumber, 0x00010600u, 0, 2, 0, + (4u << 16) | static_cast(spv::Op::OpDecorate), 1, + static_cast(spv::Decoration::FPMaxErrorDecorationINTEL), literal}; + for (const bool swapped : {false, true}) { + auto input = words; + if (swapped) for (auto& word : input) word = Swap(word); + if (literal == 0 && !swapped) { + ParseState truncated; + if (spvBinaryParse(context.CContext(), &truncated, input.data(), input.size() - 1, + nullptr, ReadInstruction, nullptr) == SPV_ERROR_INVALID_BINARY && truncated.callbacks == 0) ++controls; + else ++failed; + } + ParseState state; + const auto result = spvBinaryParse(context.CContext(), &state, input.data(), input.size(), + nullptr, ReadInstruction, nullptr); + if (result != SPV_SUCCESS || state.callbacks != 1 || !state.correct) ++failed; + std::string text; + std::vector output; + if (!tools.Disassemble(input.data(), input.size(), &text, SPV_BINARY_TO_TEXT_OPTION_NO_HEADER) || + !tools.Assemble(text, &output, SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS) || + output.size() != words.size() || !std::equal(words.begin() + 5, words.end(), output.begin() + 5)) { + std::fprintf(stderr, "literal %08x swapped=%d failed round trip: %s\n", literal, swapped, text.c_str()); + ++failed; + } else ++roundTrips; + } + } + std::printf("SPIRV literal float: 16 parser checks, %u exact round trips, %u controls, %u failures\n", roundTrips, controls, failed); + return failed == 0 ? 0 : 1; +} diff --git a/core/shader/recompiler/tests/SsaPassReads.cpp b/core/shader/recompiler/tests/SsaPassReads.cpp new file mode 100644 index 000000000000..46894dedaf0f --- /dev/null +++ b/core/shader/recompiler/tests/SsaPassReads.cpp @@ -0,0 +1,136 @@ +#include "Optimization/SsaBuilder/SsaPass.hpp" +#include +#include +#include +#include + +using namespace ShaderRecompiler; +using namespace ShaderRecompiler::Detail; + +namespace { + +void Require(bool condition, const char* what) { + if (!condition) throw std::runtime_error(what); +} + +IrValue& Constant(IrProgram& program, Variable variable, std::uint32_t number) { + auto& value = program.CreateValue(IrOpcode::Void, VariableType(variable)); + if (VariableType(variable) == IrType::Bool) { + value.SetImmediateBool(number != 0u); + } else { + value.SetImmediateU32(number); + } + return value; +} + +std::size_t InstructionCount(const IrBlock& block) { + return block.Instructions().size(); +} + +void CheckDiamondAndLoop(Variable variable) { + IrProgram program; + Pass pass(program); + auto& entry = program.CreateBlock(); + auto& left = program.CreateBlock(); + auto& right = program.CreateBlock(); + auto& merge = program.CreateBlock(); + left.AddPredecessor(&entry); + right.AddPredecessor(&entry); + merge.AddPredecessor(&left); + merge.AddPredecessor(&right); + auto& first = Constant(program, variable, 0u); + auto& second = Constant(program, variable, 1u); + pass.Write(variable, &entry, &first); + pass.Seal(&entry); + pass.Seal(&left); + pass.Seal(&right); + Require(pass.Read(variable, &entry) == &first, "a read in the defining block does not return the definition"); + Require(pass.Read(variable, &left)->Resolve() == &first, "a single-predecessor read does not reach the definition"); + Require(pass.Read(variable, &right)->Resolve() == &first, "a second single-predecessor read does not reach the definition"); + pass.Write(variable, &right, &second); + Require(pass.Read(variable, &right) == &second, "a read after a replacement write does not return the new value"); + pass.Seal(&merge); + auto* phi = pass.Read(variable, &merge)->Resolve(); + Require(phi->IsPhi() && phi->ArgumentCount() == 2u, "a merge of two different values is not a two-operand phi"); + Require(phi->PhiBlock(0) == &left && phi->Argument(0)->Resolve() == &first, "the phi's first operand is not the left value"); + Require(phi->PhiBlock(1) == &right && phi->Argument(1)->Resolve() == &second, "the phi's second operand is not the right value"); + const auto mergeInstructions = InstructionCount(merge); + const auto leftInstructions = InstructionCount(left); + for (unsigned read = 0; read < 64u; ++read) Require(pass.Read(variable, &merge)->Resolve() == phi, "a repeated merge read returns another value"); + for (unsigned read = 0; read < 64u; ++read) Require(pass.Read(variable, &left)->Resolve() == &first, "a repeated predecessor read returns another value"); + Require(InstructionCount(merge) == mergeInstructions && InstructionCount(left) == leftInstructions, "a repeated read inserted instructions"); + pass.Write(variable, &merge, &second); + Require(pass.Read(variable, &merge) == &second, "a merge read after a replacement write does not return the new value"); + auto& loop = program.CreateBlock(); + loop.AddPredecessor(&entry); + loop.AddPredecessor(&loop); + 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"); +} + +void CheckLoopCarriedValue(Variable variable) { + IrProgram program; + Pass pass(program); + auto& entry = program.CreateBlock(); + auto& header = program.CreateBlock(); + auto& body = program.CreateBlock(); + header.AddPredecessor(&entry); + header.AddPredecessor(&body); + body.AddPredecessor(&header); + auto& first = Constant(program, variable, 0u); + auto& second = Constant(program, variable, 1u); + pass.Write(variable, &entry, &first); + pass.Seal(&entry); + auto* pending = pass.Read(variable, &header); + pass.Seal(&body); + Require(pass.Read(variable, &body) == pending, "a body read does not reach the pending header phi"); + pass.Write(variable, &body, &second); + pass.Seal(&header); + auto* phi = pass.Read(variable, &header)->Resolve(); + Require(phi->IsPhi() && phi->ArgumentCount() == 2u, "a loop-carried value is not a two-operand header phi"); + Require(phi->Argument(0)->Resolve() == &first && phi->Argument(1)->Resolve() == &second, "the header phi's operands are not the entry and body values"); +} + +void CheckUndefined(Variable variable) { + IrProgram program; + Pass pass(program); + auto& entry = program.CreateBlock(); + auto& next = program.CreateBlock(); + next.AddPredecessor(&entry); + pass.Seal(&entry); + pass.Seal(&next); + auto* value = pass.Read(variable, &next)->Resolve(); + Require(value->HasImmediate(), "a read without a definition is not an initial constant"); + Require(VariableType(variable) == IrType::Bool ? !value->ImmediateBool() : value->ImmediateU32() == 0u, "the initial constant is not zero"); + Require(pass.Read(variable, &entry)->Resolve() == value, "the entry block does not keep the initial constant"); +} + +} + +int main() { + const std::array variables{ScalarReg{5}, ThreadBitScalarReg{ScalarReg{6}}, ScalarMaskTag{ScalarReg{7}}, VectorReg{8}, GotoVariable{9}, SccTag{}, ExecTag{}, ExecLoTag{}, ExecHiTag{}, VccTag{}, VccLoTag{}, VccHiTag{}, M0Tag{}}; + try { + for (const auto& variable : variables) { + CheckDiamondAndLoop(variable); + CheckLoopCarriedValue(variable); + CheckUndefined(variable); + } + } catch (const std::exception& error) { + std::fprintf(stderr, "SSA pass read test failed: %s\n", error.what()); + return 1; + } + return 0; +} diff --git a/docs/dev/ARCHITECTURE.md b/docs/dev/ARCHITECTURE.md index 66f5788dbe5a..92a2e5d7b0c3 100644 --- a/docs/dev/ARCHITECTURE.md +++ b/docs/dev/ARCHITECTURE.md @@ -154,10 +154,10 @@ 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; the rest of a block the import only partly covers stays unwatched), 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. +- 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. ### Log output @@ -178,6 +178,8 @@ flowchart LR `agc_async_log` checks the order of deferred and written lines, long lines, the repeat limit, a `Flush` that waits for a held stream, a bounded flush that gives up, and a full queue that blocks its caller. `agc_async_log_fatal` starts the test executable as a child that queues lines behind a held stream and then calls `abort()`, calls `std::terminate()`, raises an access violation (Windows) or `SIGABRT` (elsewhere), or aborts without ever releasing the stream; the first four must leave every line in the file in order, the last must still end after the bound. +`ANYPS5_LOG_FILE=` (libc, [`LogFile.cpp`](../../core/libs/prx/libc/src/LogFile.cpp)) adds a copy of the runtime log that does not go through `WriteLogLine` or the sink. At load, libc keeps the real standard output and error, diverts descriptors 1 and 2 (the standard handles on Windows) into two pipes and starts one thread per pipe. Each thread writes what it reads to the kept stream at once and each whole line to the file under one lock, so a line of one stream never lands inside a line of the other. A line without a newline stays in a bounded carry (1 MiB) and is written to the file when it ends, when the carry is full or when the process ends. The crash and abort reporters do not use the pipes: `log_file::CrashWrite` takes the lock for at most 250 ms, moves what is still in the pipes into the file and writes the report to the kept stderr and the file directly. `LibcRunEndFlush_nid_no_patch` and an `atexit` handler drain at the end; `LogFileRelease_nid_no_patch` puts the real streams back before `sceSystemServiceLoadExec` replaces the process. Unset or empty, nothing is created. + ### Runtime image and sampler tables A T# or S# that a shader loads from a buffer at a runtime offset (`key * stride + addend`, or `(key << n) & mask`) is not a direct descriptor. [`ResourceTracker.cpp`](../../core/shader/recompiler/Optimization/src/ResourceTracker.cpp) plans it as a table column (`TableColumn`): the heap V#'s descriptor source, the record stride and addend, the descriptor's offset in the record, and the key domains that may narrow it. Accesses with the same heap and record shape share one column. The shader keeps computing the offset and indexes a table binding: images use one variable-count `SAMPLED_IMAGE` array (`RuntimeAbi::ImageTableBinding`, in the fragment set when pipeline libraries split the sets), samplers a `SAMPLER` array (`Binding::SamplerTable`). Devices without `runtimeDescriptorArray`, `descriptorBindingPartiallyBound` and `descriptorBindingVariableDescriptorCount` refuse such shaders. diff --git a/docs/dev/BUILD.md b/docs/dev/BUILD.md index 93f9b869fbdb..3c17f3087ec3 100644 --- a/docs/dev/BUILD.md +++ b/docs/dev/BUILD.md @@ -135,6 +135,7 @@ Project switches accept `ON` or `OFF`: | `-DAPS5_AGC_CREATE_LOG=OFF` | `ON` | No effect: `sceAgcCreateShader` logs nothing on success. | | `-DAGC_BUILD_VISUAL_TEST=ON` | `OFF` | Build the standalone AGC SPIR-V visual test. | | `-DANYPS5_REQUIRE_CPU_LEAD_TEST=ON` | `OFF` | With `BUILD_TESTING=ON`, also register `agc_driver_sparse_dma_buf_cpu_lead`, which runs `agc_driver_sparse_dma_buf_import_tests --require-cpu-lead` and fails instead of skipping when the nonzero-lead dma-buf CPU publish is not exercised, such as on Windows or without an accessible `/dev/udmabuf`. | +| `-DANYPS5_LIBRESSL_ORACLE=ON` | `OFF` | With `BUILD_TESTING=ON`, download LibreSSL 2.5.4 from ftp.openbsd.org at build time, check its SHA-256 and register `guest_libressl_oracle`, which compares `libSceLibreSsl` and `libSceLibreSsl3` exports with it and prints the cases and differences per function. Without the flag nothing is downloaded. | GCC and Clang compile libc with `-ffp-contract=off` whatever the target CPU. Toolchains that default to x86-64-v3, such as GCC 15 on Ubuntu 26.04, would otherwise fuse `a * b + c` into FMA instructions, which changes the last bit of math results that must match the console. @@ -286,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 9f22b8125544..5ce9bf15a841 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 | @@ -78,8 +80,10 @@ The code reads environment names through `getenv`, `IsEnvironmentSet`, `kibSetti | Name | Kind | Source | Default | Description | |------|------|--------|---------|-------------| | `ANYPS5_GPU` | string | `core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp` | | restricts physical device selection to device names containing this case-insensitive substring | +| `ANYPS5_HOST_REPORT` | string | `core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp` | 0 | prints the host report to stderr once when the presenting device is chosen: 1 prints it; 0, empty or unset prints nothing, and any other value stops the start with an error naming the variable | | `ANYPS5_OVERLAY` | string | `core/libs/prx/libSceAgcDriver/Execution/src/PerformanceOverlay.cpp` | 0 | the performance overlay's page at start: 1 the overlay, 2 its detailed page; 0 or unset hides it, and any other value is refused | | `ANYPS5_OVERLAY_POS` | string | `core/libs/prx/libSceAgcDriver/Execution/src/PerformanceOverlay.cpp` | tl | the overlay's corner: tl, tr, bl or br | +| `ANYPS5_PAD_STATUS` | string | `core/libs/prx/libSceAgcDriver/Execution/src/PadStatusOverlay.cpp` | 0 | 1 shows the controller status panel for 4 seconds when a controller connects, disconnects or enters a lower battery class; 0 or unset never shows it on its own (the `ShowPadStatus` key still does), and any other value is refused | | `ANYPS5_PRESENT_MODE` | string | `core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp` | fifo | selects the swapchain present mode: fifo, fifo_latest_ready, mailbox or immediate | | `ANYPS5_REQUIRE_DESCRIPTOR_BINDING_FLAGS` | presence | `core/libs/prx/libSceAgcDriver/tests/ComputePipelineReplay.cpp` | | fails the replay test instead of accepting a device that refuses descriptor binding flags | | `ANYPS5_REQUIRE_ROBUST2` | presence | `core/libs/prx/libSceAgcDriver/tests/execution/LdsMixedWidthAtomics.cpp` | | fails the LDS lock-budget test when the device does not enable robustBufferAccess2, instead of only printing it | @@ -92,6 +96,7 @@ The code reads environment names through `getenv`, `IsEnvironmentSet`, `kibSetti | `APS5_ALL_BUFFERS_WRITTEN` | presence | `core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp` | | notes every shader buffer element as written, as before bufferWritten existed | | `APS5_ASSERT_GPU_LOCK` | presence | `core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp` | | aborts when a guarded path is reached without holding GuestMemory::GpuMutex | | `APS5_ATOMIC_STAGE_MAX_KIB` | integer | `core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp` | 1024 | size cap in KiB on an atomic shader element covered by device-local staging | +| `APS5_BACKGROUND_COMPILE_KIB` | integer | `core/libs/prx/libSceAgcDriver/Execution/include/CompileBudget.hpp` | 8192 | KiB of SPIR-V that compute pipelines built ahead of their dispatch (dispatch prebuilds and the pipeline journal's replay) may be compiling at once; a build that does not fit waits, one larger than the limit builds alone, and 0 builds them one at a time. Dispatches that need a pipeline now are not limited | | `APS5_BARRIER_VALIDATE` | presence | `core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp` | | counts the barriers a hazard-tracking validator would emit and skip, by class and hazard kind | | `APS5_BATCH_CAP` | integer | `core/libs/prx/libSceAgcDriver/Execution/src/Driver/Synchronization/DeferredLabels.cpp` | 64 | recorded work since the last submit at which a label batch, flush or reap is forced (0 disables the cap) | | `APS5_BDA_FLUSH` | presence | `core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp` | | also flushes pending storage results over address-based shader regions, which are otherwise exempt | @@ -134,6 +139,7 @@ The code reads environment names through `getenv`, `IsEnvironmentSet`, `kibSetti | `APS5_DRAIN_COMPLETION_LABELS` | presence | `core/libs/prx/libSceAgcDriver/Execution/src/Driver/Synchronization/DeferredLabels.cpp` | | records completion labels immediately instead of deferring them with the batch, and drains a label recorded while a copied write-back is pending instead of storing it behind the write-backs | | `APS5_DRAW_CACHE_BYTES` | integer | `core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCache.cpp` | 268435456 | size of the draw cache in bytes, evicting least-recently-used entries past it (0 keeps the default of 256 MiB) | | `APS5_DRAW_CACHE_ENTRIES` | integer | `core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCache.cpp` | 4096 | number of entries in the draw cache; 0 keeps the default 4096 | +| `APS5_DRAW_CACHE_INDIRECT` | presence | `core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCache.cpp` | | also caches the draws an indirect packet runs on the CPU path (records read on the host, patched user words); a hit still recompiles the stages whose user words the record patches and reuses the other stages | | `APS5_DRAW_DRAIN` | presence | `core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketMemory.cpp` | | treats draw packets as drains, waiting for them instead of recording ahead | | `APS5_DRAW_INPUTS_IN_PLACE` | presence | `core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp` | | binds draw vertex and index ranges in place from host imports also with NVIDIA's Windows driver, which copies them by default | | `APS5_DRAW_KEY_ALL_USER_WORDS` | presence | `core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRegisterKey.cpp` | | includes all 32 user words in a draw's register key instead of the used count | @@ -153,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 | @@ -169,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 | @@ -208,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 | @@ -293,6 +301,7 @@ The code reads environment names through `getenv`, `IsEnvironmentSet`, `kibSetti | `APS5_NO_LEASE_MIRROR` | presence | `core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp` | | restores copies instead of image mirrors for address-based builds | | `APS5_NO_LIBRARY_PREBUILD` | presence | `core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp` | | disables prebuilding registration-form shader libraries (only 1 disables it) | | `APS5_NO_LOCK_PROFILE` | presence | `core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp` | | turns off GpuMutex wait profiling under APS5_PROFILE_DRAW | +| `APS5_NO_MESH_WINDOW_BUFFER` | presence | `core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp` | | keeps a mesh program's relative-addressing window in function arrays on NVIDIA's proprietary driver instead of moving it to a storage buffer | | `APS5_NO_MOVED_BUFFER_TEMPLATES` | presence | `core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp` | | keys the full descriptor words of read-only guest buffers instead of allowing a hit when they move | | `APS5_NO_OBSERVATION_GUARD` | presence | `core/libs/prx/libSceAgcDriver/Execution/src/Driver/Memory/WriteEvidence.cpp` | | observes every validated range, not only the ranges whose flush hook waited | | `APS5_NO_OPPORTUNISTIC_REAP` | presence | `core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp` | | skips retiring already-finished batches before a submit | @@ -376,7 +385,7 @@ The code reads environment names through `getenv`, `IsEnvironmentSet`, `kibSetti | `APS5_PM4_RING` | integer | `core/libs/prx/libSceAgcDriver/Execution/src/Driver/Queues/SubmissionRing.cpp` | 16 | number of submissions the PM4 ring keeps for dumps, from 0 to 4096; 0 disables the ring | | `APS5_POLL_REAP` | presence | `core/libs/prx/libSceAgcDriver/Execution/src/Driver/Synchronization/WaitMemory.cpp` | | reaps completions on every poll tick | | `APS5_POLL_TRY_EACH` | presence | `core/libs/prx/libSceAgcDriver/Execution/src/Driver/Synchronization/WaitMemory.cpp` | | tries the poll service on every tick instead of at the poll interval | -| `APS5_PREBUILD_THREADS` | integer | `core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp` | | threads in the pool that prebuilds registration-form shader libraries; unset uses half the hardware threads, at least two | +| `APS5_PREBUILD_THREADS` | integer | `core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp` | | threads in the pool that prebuilds registration-form shader libraries and compute pipelines; unset uses half the hardware threads, at least two. Compute pipeline prebuilds, which wait for `APS5_BACKGROUND_COMPILE_KIB`, run on at most half of them (at least one) | | `APS5_PRESENT_POLL_FENCE` | presence | `core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp` | | polls the present fence every 50 us instead of blocking on it | | `APS5_PROBE_DISPATCH` | string | `core/libs/prx/libSceAgcDriver/Execution/src/Driver/Dispatch/Dispatch.cpp` | | probes one dispatch at a hex program address (optionally `:index`) with debug output | | `APS5_PROFILE_DRAW` | presence | `core/libs/prx/libSceAgcDriver/Execution/src/Driver/Dispatch/Dispatch.cpp` | | prints the per-phase driver and draw timing totals | @@ -503,6 +512,9 @@ 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 | @@ -518,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 | @@ -534,6 +552,7 @@ The code reads environment names through `getenv`, `IsEnvironmentSet`, `kibSetti | Name | Kind | Source | Default | Description | |------|------|--------|---------|-------------| +| `ANYPS5_RUMBLE` | integer | `core/libs/prx/libScePad/include/PadRumbleIntensity.hpp` | 100 | host controller vibration strength as a whole percentage from 0 to 100, read once when the pad input starts and again by the audio-out controller sound card path; 100 or unset leaves vibration exactly as the title asks, 0 turns motor rumble, impulse-trigger rumble and controller-sound-card haptics off, in between scales the motor amplitudes with rounding and the haptic samples linearly; DualSense adaptive trigger effects are not scaled; any other value (empty, signed, fractional, above 100) stops the game with an error naming the variable | | `APS5_PAD_INPUT_FILE` | string | `core/libs/prx/libScePad/src/PadState.cpp` | | path of the file polled for injected pad button and stick commands | ### libScePlayGo @@ -547,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 @@ -567,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 | @@ -583,6 +604,7 @@ The code reads environment names through `getenv`, `IsEnvironmentSet`, `kibSetti | Name | Kind | Source | Default | Description | |------|------|--------|---------|-------------| +| `ANYPS5_LOG_FILE` | string | `core/libs/prx/libc/src/LogFilePlatform.cpp` | | path of a file that also receives everything the converted executable writes to standard output and standard error, appended line by line, while the terminal output goes on; relative paths resolve against the working directory; an empty value is the same as unset; a file that cannot be opened stops the executable at load with status 1 and an error naming the variable, the path and the operating system error | | `APS5_CRASH_INDIRECT_MEMORY` | presence | `core/libs/prx/libc/src/specifics/windows/CrashReport.cpp` | | adds to the Windows crash report up to 64 bytes from each pointer in the dump of the words the registers point at, as `[[reg+off]] @addr` lines; off when unset or empty | | `APS5_CRASH_STACK_BYTES` | integer | `core/libs/prx/libc/src/specifics/windows/CrashReport.cpp` | 0 | bytes of the faulting thread's stack from rsp, decimal or 0x hexadecimal and at most 1048576, that the Windows crash report prints with the data at the stack words pointing outside the stack; 0 prints none | | `APS5_HANG_DUMP_SECS` | integer | `core/libs/prx/libc/src/specifics/windows/CrashReport.cpp` | | on Windows, whole seconds after which a watchdog dumps all threads and aborts; 0 or a value that is not a decimal number is ignored | @@ -608,6 +630,7 @@ The code reads environment names through `getenv`, `IsEnvironmentSet`, `kibSetti |------|------|--------|---------|-------------| | `ANYPS5_LOADEXEC_ARGV_SKIP` | string | `core/libs/prx/libkernel/System/src/Process.cpp` | | on Windows, set to `1` to drop the first process argument and clear the variable | | `APS5_COARSE_TIMED_WAITS` | presence | `core/libs/prx/libkernel/Time/TimedWait.cpp` | | on Windows, rounds timed waits up to the scheduler tick | +| `APS5_GAME_MODE` | string | `core/libs/prx/libkernel/System/src/HostPerformanceProcess.cpp` | off | asks the host for its game or performance mode while the title runs, read when libkernel loads: `off`, `on` or `auto`; on Linux it requests Feral GameMode (`libgamemode.so.0`, loaded with dlopen) and on macOS it holds a user-initiated, latency-critical `NSProcessInfo` activity; `on` logs a missing library or backend once, `auto` stays silent about it, and a refused request is logged once in both; nothing here is fatal, and any other value stops the title with an error naming the variable | | `APS5_JOB_AFFINITY` | presence | `core/libs/prx/libkernel/Pthread/src/Thread.cpp` | | on Windows, pins the title's job worker threads to the efficiency cores of a hybrid CPU | | `APS5_JOB_AFFINITY_MASK` | integer | `core/libs/prx/libkernel/Pthread/src/Thread.cpp` | | on Windows, hex core mask that job worker threads are pinned to | | `APS5_MIMALLOC` | presence | `core/libs/prx/libkernel/System/src/MimallocMacOs.cpp` | | makes the process allocate through mimalloc instead of the system allocator: on Windows the entry stub (`core/relinker/elfpatcher/src/windows/WindowsEntryStubBuilder.cpp`) loads `mimalloc.dll`, on macOS libkernel restarts the title with `libmimalloc.dylib` in `DYLD_INSERT_LIBRARIES` | diff --git a/docs/dev/GAME_TESTING.md b/docs/dev/GAME_TESTING.md index 5a3ab4513d09..a750e37dc2e6 100644 --- a/docs/dev/GAME_TESTING.md +++ b/docs/dev/GAME_TESTING.md @@ -44,6 +44,7 @@ cmd /c '.\app.exe > run.log 2>&1' - `APS5_NO_PAD_INPUT=1` ignores keyboard and mouse, so a stray press doesn't move a measurement run. - `setarch x86_64 -R` (Linux only) turns off address randomisation so addresses match between runs. - On Windows, a `--windows-gui` build started without a console writes its output to `anyps5.log` beside the executable, replacing the previous run's file. +- Some homebrew reopen stdout and stderr into their own storage before `main`, so `run.log` ends at `Transferring control to ELF entry point` while the title keeps running. Titles built on ps5-homebrew-ui, such as CD Player (PPSA98427), Afterglow (PPSA47770) and Surround Sound Studio (PPSA99051), write `download0/hui/dev/app.log` beside the executable and keep the previous run's log as `app.prev.log`. Read that file before reporting a hang or a silent exit. - On Windows the title needs a signed-in desktop. Started from an SSH session (session 0) it has no usable window. Start it inside the user's session instead, for example with a scheduled task that runs interactively. A newly created task does not start on battery power by default and fails silently; allow that in its settings. ## Check the GPU and the caches @@ -111,7 +112,7 @@ Include, in this order: 1. The build: the `main` commit, each PR applied on top with its head, and any local change. A result from an integration branch should stay distinguishable after one of its PRs merges. 2. Title ID and content version, not only the game name. -3. Host: CPU, OS (and kernel on Linux), the GPU as the `Selected GPU name=` line names it, the driver version, AC or battery, and the display refresh rate. +3. Host: CPU, OS (and kernel on Linux), the GPU as the `Selected GPU name=` line names it, the driver version, AC or battery, and the display refresh rate. Start with `ANYPS5_HOST_REPORT=1` and paste the [host report](../user/USAGE.md#host-report) for the CPU, OS, GPU, driver and Vulkan items; AC or battery and the refresh rate are not in it. 4. The exact command and every `APS5_*` / `ANYPS5_*` variable, the in-game settings if they differ from the defaults, and whether the caches were empty or warm. 5. How far the title got (menu, a save, a scene) and what stopped it: the exit code and the last 200 log lines, plus the kernel line (Linux) or crash report (Windows) for a crash. 6. Presents per 10 s, and the storage-image and budget lines (`[gpu] host import budget`, `[gpu] sampled texture cache budget`, `[texture-cache]`) if memory is involved. diff --git a/docs/dev/PROGRESS.md b/docs/dev/PROGRESS.md index 47f52a5cd987..03e5813cebfc 100644 --- a/docs/dev/PROGRESS.md +++ b/docs/dev/PROGRESS.md @@ -22,7 +22,7 @@ Comparisons identify functions by library and name. When a head group becomes a Real removals and transitions back to stubs remain visible. Percentages retain the original snapshot totals, so eliminating duplicate accounting can change a percentage without changing available functionality. Older JSON snapshots without `shared_sources` are accepted. -PR reports include a table of changed libraries with implemented export counts, declared totals, percentages before and after, and changes in percentage points (`pp`). The table uses the same two JSON snapshots as the global report. A library appears when its counts, export names or shared-source owner change, including when its counts stay equal. Unchanged libraries are omitted, and the table lists at most 100 libraries in name order with a count of omitted rows. +PR reports include a table of changed libraries with implemented export counts, declared totals, percentages before and after, and the change in percent (`%`), the difference between the two percentages, written with the same unit as the headline of the report. The table uses the same two JSON snapshots as the global report. A library appears when its counts, export names or shared-source owner change, including when its counts stay equal. Unchanged libraries are omitted, and the table lists at most 100 libraries in name order with a count of omitted rows. New or removed libraries show `Not present` on the missing side. Libraries whose snapshots contain both counts and report zero exports show `No exports`; if either count is absent, the table shows `Counts unavailable`. Wrappers show `Shared sources` with the source library's name. These rows show `n/a` for the percentage change. The table retains the scanner's counting rules; it does not measure compatibility. diff --git a/docs/dev/TechnicalDebt.md b/docs/dev/TechnicalDebt.md index e3d2036b8f7f..9a4b57130e43 100644 --- a/docs/dev/TechnicalDebt.md +++ b/docs/dev/TechnicalDebt.md @@ -28,5 +28,5 @@ Throughout the project, every function at every stage either **does exactly what - [Cancellation coverage](ARCHITECTURE.md#thread-cancellation) checks deferred request handling and recovery, not full asynchronous support or console ABI compatibility. Cancellation during file/socket I/O, sleep interruption, cancellation versus exit/detach, condition signal conservation under cancellation, and safe rejection of non-null invalid or reclaimed thread handles remain unverified. No console title or homebrew establishes the cleanup NIDs or buffer layout. Accepted asynchronous mode currently has no diagnostic for its deferred behavior. - `--to-intel` guest module trampolines are covered only by a synthetic relinker test; no game title has been verified with them on Linux or Windows. - [Quick syntax checks](../../tools/check_compile.py) do not support Windows-style response-file quoting. GNU response files reject empty options, byte order marks, quoted CRLF, Windows text-mode EOF markers and escapes whose meanings differ between GCC and Clang, including backslashes in single quotes, most backslashes in double quotes and escaped line endings. Supply expanded compile arguments for those forms; the Ninja fallback uses `ninja -t compdb -x`. -- [Quick syntax checks](../../tools/check_compile.py) do not model every compiler option's operand count. A preprocessing mode following an unrecognized option without a joined value is rejected rather than risk removing that option's operand. Compiler wrappers with their own option grammar are not covered. Forwarded frontend actions (`-Xclang`, `-Xpreprocessor` and their joined forms) are rejected. Comma-forwarded options (`-Wp,`) allow only recognized macro/include operands; response-file tokens are rejected even as operands, and other options are rejected because unmodeled actions or output operands could bypass syntax analysis or write outputs. See the [Clang option grammar](https://clang.llvm.org/docs/ClangCommandLineReference.html). +- [Quick syntax checks](../../tools/check_compile.py) do not model every compiler option's operand count. A preprocessing mode following an unrecognized option without a joined value is rejected rather than risk removing that option's operand. Compiler wrappers with their own option grammar are not covered, except a leading `cmake -E env`, whose options other than `NAME=VALUE`, `--unset=`, `--modify` and `--` are rejected. Forwarded frontend actions (`-Xclang`, `-Xpreprocessor` and their joined forms) are rejected. Comma-forwarded options (`-Wp,`) allow only recognized macro/include operands; response-file tokens are rejected even as operands, and other options are rejected because unmodeled actions or output operands could bypass syntax analysis or write outputs. See the [Clang option grammar](https://clang.llvm.org/docs/ClangCommandLineReference.html). - [Quick syntax checks](../../tools/check_compile.py) reject `-save-temps=` and `--save-temps=` values other than `cwd` and `obj` instead of passing them to the compiler: an unknown value fails on GCC, while newer Clang builds take any value as an output prefix and write preprocessed files even under `-fsyntax-only` (measured on Apple clang 21), so a passed-through mode either fails the check on one compiler or silently writes outputs on the other. diff --git a/docs/dev/debt/libCprm.md b/docs/dev/debt/libCprm.md new file mode 100644 index 000000000000..6668953591ac --- /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 new file mode 100644 index 000000000000..133265d1ebd9 --- /dev/null +++ b/docs/dev/debt/libSceAbstractStorage.md @@ -0,0 +1,21 @@ +# libSceAbstractStorage technical debt + +### 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 000000000000..1235886bd694 --- /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/libSceAbstractYoutube.md b/docs/dev/debt/libSceAbstractYoutube.md new file mode 100644 index 000000000000..9b35c970a8c0 --- /dev/null +++ b/docs/dev/debt/libSceAbstractYoutube.md @@ -0,0 +1,5 @@ +# libSceAbstractYoutube technical debt + +### Known export names; ABI prototypes unverified + +- 17 pending exports in [Export.cpp](../../../core/libs/prx/libSceAbstractYoutube/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. diff --git a/docs/dev/debt/libSceAcm.md b/docs/dev/debt/libSceAcm.md index c94c8ce7171c..5f4d76cd1222 100644 --- a/docs/dev/debt/libSceAcm.md +++ b/docs/dev/debt/libSceAcm.md @@ -2,13 +2,42 @@ ### Silent stubs -- [libSceAcm](../../../core/libs/prx/libSceAcm/Export.cpp) batches execute as silent no-ops, and do not execute encoded panner and FFT commands. `sceAcm_ConvReverb_SharedInput` returns success without encoding audio 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 +- [Additional ACM exports](../../../core/libs/prx/libSceAcm/Export.cpp) - the eleven 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/libsceacm-a3566cc281.jsonl). Their ABIs and behaviour are unknown. Parameterless `int` declarations are import-resolution placeholders, not established signatures; every call throws `NotImplemented_nid_no_patch`. No audio-chain, reverb or telemetry behaviour is implemented. + +| Name | NID | +| --- | --- | +| `sceAcmChain_Audio3dPO1_Clear` | `+o6KUwnCB+0` | +| `sceAcmChain_Audio3dPO1_RenderObject` | `0P2PH7lou4g` | +| `sceAcmChain_Audio3dPO1_Activate` | `5pi7bGbV7JM` | +| `sceAcmChain_Audio3dPO1_Output` | `7EGMt3d6RAk` | +| `sceAcm_ConvReverb_SharedIr_2` | `PVx9oQUaDdk` | +| `sceAcmChain_Audio3dPO1_RenderAmbisonicsChannel` | `ZViifnXeAUc` | +| `sceAcmChain_Audio3dPO2_Activate` | `aUfAPcEySHU` | +| `sceAcmChain_Audio3dPO1_RenderPassthroughObject` | `eU9FRHNi+xU` | +| `sceAcmChain_Audio3dPO2_RenderDelay` | `p23f04CznHs` | +| `sceAcmGetTelemetry` | `vQb-lO9SzEI` | +| `sceAcm_ConvReverb_SharedInput_2` | `wM41Cc+ieog` | + - [libSceAcm](../../../core/libs/prx/libSceAcm/Export.cpp) context creation, batch submission and waiting use host identifiers instead of the native device and ioctl requests. Batch identifiers, timeout handling, DSP scheduling and service-side errors remain unimplemented. Panner source parameter and matrix payloads are forwarded by the native library; their DSP interpretation remains unverified. -- [sceAcm_ConvReverb_SharedIr, sceAcm_IFFT](../../../core/libs/prx/libSceAcm/Export.cpp) (libSceAcm) - their names and NIDs are in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceAcm.c), but no credible prototypes were found. They are declared without parameters solely to resolve known imports; this is not an ABI claim +- [sceAcm_ConvReverb_SharedIr](../../../core/libs/prx/libSceAcm/Export.cpp) (libSceAcm) - its name and NID are in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceAcm.c), but no credible prototype was found. It is declared without parameters solely to resolve known imports; this is not an ABI claim +- [`sceAcm_FFT` and `sceAcm_IFFT`](../../../core/libs/prx/libSceAcm/Export.cpp) encode their jobs as `libSceAcm.sprx` does on firmware 13.40, where both exports call one encoder with a direction flag (read from the module's code and compared with that code run on x86-64, not measured on a console). PPSA14632 imports `sceAcm_FFT`; no known title imports `sceAcm_IFFT`. The DSP meaning of the job words is unverified. - [`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`. -- The shared-input reverb signature and descriptor fields are recovered from native accesses. Input history indices are mutable; block metadata representation, reverb command encoding and DSP interpretation remain unimplemented in [libSceAcm](../../../core/libs/prx/libSceAcm/Export.cpp). +- [`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 d4e465635093..b0a8e0d7b169 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. @@ -46,6 +69,7 @@ - [Point geometry output](../../../core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp) (AGC driver) - a geometry program with `VGT_GS_OUT_PRIM_TYPE = 0` emits mesh points with `OutputPoints` and scalar `PrimitivePointIndicesEXT` as required by [SPV_EXT_mesh_shader](https://github.khronos.org/SPIRV-Registry/extensions/EXT/SPV_EXT_mesh_shader.html). Each packed primitive export contributes its first 9-bit vertex index and its null bit, using the same NGG primitive packing as line and triangle outputs. The subgroup reserves at least `GE_MAX_OUTPUT_PER_SUBGROUP` point slots, as the line path does; the console budget is not measured. Points use the register size or the misc-X point-size export and clamp interpreted by the vertex-point path; those register, clamp and rasterization inferences remain unmeasured on the console. Point sprites remain unsupported. Point output from a vertex workgroup still throws. Cocoon (PPSA08766) reaches this path with triangle-strip input. - [Line-strip geometry output](../../../core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp) (AGC driver) - a geometry program with `VGT_GS_OUT_PRIM_TYPE = 1` (line strip) runs as a mesh shader with `OutputLinesEXT`: each primitive export is one line whose two vertex indices are packed like the three of a triangle, as Mesa's NGG lowering exports line strips (`ac_nir_lower_ngg_gs.c`), and each input primitive gets `VGT_GS_MAX_VERT_OUT - 1` lines where a triangle strip gets `- 2` triangles. A subgroup gets at least `GE_MAX_OUTPUT_PER_SUBGROUP` line slots; whether the console does the same is unmeasured. A fast-launch subgroup takes its line count from `GE_NGG_SUBGRP_CNTL.PRIM_AMP_FACTOR`. Line output counts as lines for polygon offset decode. The lines are drawn 1 pixel wide with Vulkan default rasterization; `PA_SU_LINE_CNTL` is not read, and console line rules are not measured. - [Alpha-to-coverage](../../../core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp) (AGC driver) - `DB_ALPHA_TO_MASK = 0xaa01` is accepted: the enable bit with the four quad offsets at 2 and no `OFFSET_ROUND`, the undithered setting [radeonsi](https://gitlab.freedesktop.org/mesa/mesa/-/blob/bffd91947efc1932da99aca69fc540d6d4201b0c/src/gallium/drivers/radeonsi/si_state.c#L371-L381) programs. Draws are single-sampled, so the pixel shader [writes](../../../core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp) `SampleMask` 0 when its MRT0 alpha is below one half or NaN and all ones otherwise, and runs with late fragment tests. That rule was measured on a Radeon 660M (gfx1035, RADV with `RADV_DEBUG=noatocdithering`, which programs the same register) for 0, -0, 0.25, the two floats below one half, one half, the two above, 0.75, 1, 2, -1, both infinities and both NaNs, and is pinned in [AlphaToCoverage.cpp](../../../core/libs/prx/libSceAgcDriver/tests/execution/AlphaToCoverage.cpp); it is not measured on gfx1013. Vulkan's `alphaToCoverageEnable` is not used: the NVIDIA driver 615.78.08 dithers single-sample coverage (an alpha of 0.25 writes half the pixels of an RTX 3050 Laptop target). Other offsets, `OFFSET_ROUND`, a sample-mask export, and an MRT0 that is missing, swizzled, packed or exported without a floating-point alpha throw. A draw without a color target on MRT0 keeps alpha-to-coverage from its MRT0 export, as [radeonsi exports MRT0 as `32_AR` for alpha-to-coverage without a color buffer](https://gitlab.freedesktop.org/mesa/mesa/-/blob/mesa-24.0.0/src/gallium/drivers/radeonsi/si_state_shaders.cpp#L2425-L2431). A draw that enables alpha-to-coverage with no MRT0 export still throws: what the console covers then is not measured. Default dithered `DB_ALPHA_TO_MASK = 0x18701` additionally uses a per-quad sample-mask table [measured on gfx1036](https://github.com/boykopovar/AnyPS5/pull/4451#issuecomment-6124848921) for eight standard samples with FP16_ABGR or 32_ABGR exports; other sample counts, custom locations, EQAA combinations and dithered UNORM16/SNORM16 exports throw. The dithered rule is not measured on gfx1013. Two-sample `DB_ALPHA_TO_MASK = 0xe701` (Bugsnax, PPSA01503) uses an eight-level table measured on gfx1032 with the locations (4, 4), (-4, -4) and (-4, 4), (4, -4), not on gfx1013; other sample counts, locations and exports throw, and `MASK_EXPORT_NUM_SAMPLES` 0 is accepted though measured at 1 +- [Single-sample dithered alpha-to-coverage](../../../core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp) (AGC driver) - single-sample targets with dithered `DB_ALPHA_TO_MASK` (0xe701 or 0x18701) throw `requires two matched raster/DB_EQAA samples and one pixel iteration` (for 0xe701) or `requires eight matched raster/DB_EQAA samples and one pixel iteration` (for 0x18701) in `DecodeState` and `DrawRejection`. An initial Vulkan `alphaToCoverageEnable` readback on RADV (RX 6650 XT) for a 4x4 target exhibited quad-granular coverage rather than a per-pixel Bayer pattern inside each 2x2 quad, but the spatial repetition period and PS5 console silicon behaviour remain unmeasured across larger targets. Bugsnax (PPSA01503) reaches 0xe701 with one sample at the Flavor Falls bridge cutscene transition. Stays unsupported until measured on hardware. Closes when: spatial repetition period is measured on AMD RADV or PS5 hardware - [A one-sample target under a multisampled rasterizer without MSAA_ENABLE](../../../core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp) (AGC driver) - `PA_SC_AA_CONFIG.MSAA_NUM_SAMPLES` > 0 with `PA_SC_MODE_CNTL_0.MSAA_ENABLE` clear, one-sample color targets and no depth target, or a one-sample depth target with no color target or one-sample color targets, is drawn as a one-sample draw at the pixel center. Without the bit every sample is taken to be at the pixel center (see the entry for a multisampled target rasterized without MSAA_ENABLE below), and a one-sample target is taken to keep the coverage of sample 0, so a one-sample depth target is tested and written once per pixel with the depth at the pixel center. That is the rule [`VK_AMD_mixed_attachment_samples`](https://github.com/KhronosGroup/Vulkan-Docs/blob/193ebe195f47ffc5004683d1659e71c725658c4d/chapters/fragops.adoc#L2510-L2516) gives a color target with fewer samples than the rasterizer, but Vulkan reaches it only beside a depth or stencil target with the rasterizer's sample count ([VUID-VkGraphicsPipelineCreateInfo-subpass-01505](https://github.com/KhronosGroup/Vulkan-Docs/blob/193ebe195f47ffc5004683d1659e71c725658c4d/chapters/pipelines.adoc#L3033-L3041)), so here it is an analogy, and for a one-sample depth target an extension of it. [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/15abf68c9b52c4b04d094f2837719fdb871021f3/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp#L127-L128) also rasterizes with the largest sample count of the bound depth and color targets ([L416-L417](https://github.com/shadps4-emu/shadPS4/blob/15abf68c9b52c4b04d094f2837719fdb871021f3/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp#L416-L417), [L477-L480](https://github.com/shadps4-emu/shadPS4/blob/15abf68c9b52c4b04d094f2837719fdb871021f3/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp#L477-L480)), and reads `PA_SC_AA_CONFIG` only for a `SAMPLE_COVERAGE` input ([L174-L177](https://github.com/shadps4-emu/shadPS4/blob/15abf68c9b52c4b04d094f2837719fdb871021f3/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp#L174-L177)). This is not measured on hardware. An `ANCILLARY` or `SAMPLE_COVERAGE` pixel input and a sample-mask export throw in a pixel program that runs (with a one-sample depth target, `ANCILLARY` only under `PS_ITER_SAMPLE`), because what the console gives them under a multisampled configuration is not known; a depth-only draw that skips its pixel program is drawn with the null program, and its `PS_ITER_SAMPLE` and pixel input bits are ignored. A pixel program with `PS_ITER_SAMPLE` and neither input runs once per pixel; if the console runs it once per sample, its atomics and append or consume counters count differently. With a one-sample depth target and without `PS_ITER_SAMPLE`, the [packed ancillary word](../../../core/shader/recompiler/Optimization/src/ConstantFolder.cpp) gives a program that reads `ANCILLARY` sample index 0, inferred for a pixel the guest does not iterate, and that is the sample the one-sample draw keeps. Points and alpha-to-coverage throw as for a multisampled target. With a one-sample depth target, `DB_EQAA.INTERPOLATE_COMP_Z` is accepted: with every sample at the pixel center, Z interpolated to any sample position is the center's Z, which the one-sample draw tests. That rests on the same inference; neither [PAL](https://github.com/GPUOpen-Drivers/pal/blob/c5e800072a32f68b6ccc4422936d96167c6e0728/src/core/hw/gfxip/gfx9/gfx9MsaaState.cpp#L117-L118) nor [radeonsi](https://gitlab.freedesktop.org/mesa/mesa/-/blob/761d5c8a54f93b3d43608f718910ed742983dd0b/src/gallium/drivers/radeonsi/si_state.c#L3314-L3316) sets the bit, and its meaning is not documented. Line and point lists (`VGT_PRIMITIVE_TYPE` 1-3, even when a geometry program turns them into triangles), `INTERPOLATE_SRC_Z` and overrasterization (`OVERRASTERIZATION_AMOUNT`, `ENABLE_POSTZ_OVERRASTERIZATION`) still throw. METAL GEAR SOLID: Peace Walker (PPSA18216) draws a one-sample color target under a 4x configuration this way; the first draw of its opening movie binds a one-sample depth target and no color target under the same configuration. Gran Turismo 7 (PPSA01317) draws its main pass with a one-sample depth target, `DB_EQAA` 0x00050000 and a 4x configuration. - [One-fragment multisampled color target](../../../core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp) (AGC driver) - a color target with `CB_COLOR_ATTRIB` 4 samples and 1 fragment is decoded as one sample that keeps its coverage sample count and draws sample 0's coverage. Measured only on radeonsi GL (Radeon 610M and 680M); console behaviour is not measured. It requires static `DB_EQAA` anchors at the depth target's sample count and CMASK code 0 or 0xc-0xf. More than one but fewer fragments than samples, more fragments than samples, other CMASK codes and any guest read of the FMASK of a target the host drew still throw. - [Alpha-to-coverage `0x1aa01`](../../../core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp) (AGC driver) - `DB_ALPHA_TO_MASK = 0x1aa01` throws `dithered or rounded alpha-to-coverage is unsupported`. It differs from the accepted undithered `0xaa01` by bit 16 (`0x10000`), which the accepted dithered `0x18701` also has: [radeonsi](https://gitlab.freedesktop.org/mesa/mesa/-/blob/bffd91947efc1932da99aca69fc540d6d4201b0c/src/gallium/drivers/radeonsi/si_state.c#L371-L381) programs `OFFSET_ROUND(1)` only with the dithered offsets and `OFFSET_ROUND(0)` for `0xaa01`, so it never programs this combination. PPSA12361 reaches it on main 74acfad65b on an RTX 4080 SUPER (`run_024721.err` lines 3484-3486) and an RX 6400 (`run_025512.err` lines 2667-2671). What the console covers for this value is not measured, so it stays unsupported. @@ -63,8 +87,10 @@ - [Guest buffer region over 4 GiB copied whole](../../../core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp) (libSceAgcDriver) - `GuestBufferMemory::copyRegion` copies a guest buffer region over 4 GiB whole into one HOST_VISIBLE|HOST_COHERENT buffer of the region's size (0x102000000, 0x142000000 and 0x102000000 bytes in three runs of PPSA15246 on an AMD RX 6400), and `vkAllocateMemory` refuses it with -13 although the host heap (31961 MiB) had at most 5933 MiB in use; only a sparse region is cut to its backed and viewed extent. An RTX 4080 SUPER stops at the descriptor range check in `GuestBufferMemory::Descriptor` for the same shader instead; its `maxStorageBufferRange` was not measured. Which part of the region the shader reads is unknown. - [Vertex fetch overhang](../../../core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp) (libSceAgcDriver) - a zero-padded vertex fetch whose valid range (`num_records * stride`) ends less than one stride past the end of the readable memory at its base copies only the readable bytes and reads the rest as zeros, instead of failing the draw; a longer overhang still fails. This extends the strided buffer overhang rule above (the last record is the rounded-up `num_records`) to the staging copy and is not measured on hardware. The observed case is a fetch of 14858 records of 44 bytes that ends 8 bytes past the end of the 0xa0000-byte mapping holding it. - [Zero-stride vertex fetch range](../../../core/libs/prx/libSceAgcDriver/Graphics/include/VertexInput.hpp) (libSceAgcDriver) - a draw whose highest index is at or past a nonzero NUM_RECORDS of a stride-0 `OOB_SELECT` 1 V# throws: the pipeline binding has stride 0, so vertices cannot differ. Only the highest index is checked, so a draw with every index past it throws too, where the hardware reads zero. An indirect draw is not checked. Unmeasured on gfx1013 (the console), with an instruction offset or SOFFSET, with a swizzled V# and in a vertex shader. Rules from #8299, measured on an RX 6700 XT (gfx1031), same results on gfx1010, with raw ISA ([data](https://gist.github.com/thuanquang/3b25d677c1a32d79123dd2df1819dd83)). Stride 0 reads zero for `OOB_SELECT` 0 always; for 1 when index >= NUM_RECORDS (records); for 2 when NUM_RECORDS is 0; for 3 when NUM_RECORDS is under the fetch's bytes. Untyped loads check each dword under 3; only typed fetches are used here. -- [Resource registration](../../../core/libs/prx/libSceAgcDriver/Resource/src/Registration.cpp) (libSceAgcDriver) - registration always fails with `RESOURCE_REGISTRATION_UNAVAILABLE`, so the owner and resource queries, `sceAgcDriverSetResourceUserData`, `sceAgcDriverFindResourcesPublic` and `sceAgcDriverUnregisterAllResourcesForOwner` return the same error without reading their arguments. Their parameter lists follow the libSceGnmDriver counterparts and are unverified. `sceAgcDriverGetResourceRegistrationMaxNameLength` writes 0xfc and returns 0, as [prosper](https://github.com/mattias800/prosper) does from a title's registration configuration; the `uint32_t*` parameter matches the SDK wrapper `sce::Agc::ResourceRegistration::getMaxNameLength(unsigned int*)`. sharpemu writes 256 and KytyPS5 returns `RESOURCE_REGISTRATION_UNAVAILABLE`, so the value is unverified; a null output throws +- [Resource registration](../../../core/libs/prx/libSceAgcDriver/Resource/src/Registration.cpp) (libSceAgcDriver) - registration always fails with `RESOURCE_REGISTRATION_UNAVAILABLE`, so owner and resource queries, `sceAgcDriverSetResourceUserData`, `sceAgcDriverFindResourcesPublic`, `sceAgcDriverUnregisterOwnerAndResources`, `sceAgcDriverUnregisterResource` and `sceAgcDriverUnregisterAllResourcesForOwner` return that error without reading arguments. Parameter lists follow libSceGnmDriver and are unverified. `sceAgcDriverGetResourceRegistrationMaxNameLength` writes 0xfc and returns 0, as [prosper](https://github.com/mattias800/prosper) does; `uint32_t*` matches SDK wrapper `sce::Agc::ResourceRegistration::getMaxNameLength`. sharpemu writes 256 and KytyPS5 returns `RESOURCE_REGISTRATION_UNAVAILABLE`; null output throws +- [Workload stream registration](../../../core/libs/prx/libSceAgcDriver/Resource/src/Registration.cpp) (libSceAgcDriver) - workload stream registration tracks valid stream IDs 1 through 31 in memory without communicating with GPU capture or trace tools. Streams 0 and 32+ are rejected as invalid stream IDs. The stream registration and unregistration error codes and the tool communication semantics are unmeasured. - [sceAgcDriverRegisterMultipleResources](../../../core/libs/prx/libSceAgcDriver/Resource/src/Registration.cpp) uses the existing unavailable-registration state and leaves caller memory untouched. Its four arguments (uint32 handle output, uint32 owner, descriptor pointer, uint32 count) follow the original PPSA34502 / 01.010.000 codzm call. The caller builds 40-byte descriptors and explicitly accepts 0x8A6C9018 with an invalid output handle. Enabled registration and console argument-validation precedence are unverified. +- [Rendering wait packet generation](../../../core/libs/prx/libSceAgcDriver/Submit/src/Dcb.cpp) (libSceAgcDriver) - `sceAgcDriverWaitUntilSafeForRendering` validates the cursor pointer `command`, packet capacity (at least 4 words), `mode == 0`, and `index >= 0` before validating guest memory ranges (a null `*command` fails the range check) and emitting the wait packet. Memory access patterns and synchronization semantics for non-zero modes or alternate packet types are unverified on console hardware. - [Shader headers](../../../core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp) (libSceAgcDriver) - registration and ABI resolution read fixed header fields through aligned copies, so the header pointer itself may have any alignment. PPSA26344 passes headers 4 and 1 bytes past an 8-byte boundary, and PPSA01317 passes 4-byte-aligned headers to ABI resolution; console alignment requirements are unknown - [Registered shader types](../../../core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp) (libSceAgcDriver) - types 0, 1, 2, 4, 6 and 7 are prepared and type 5 is skipped. Any other type, such as type 8, is logged (`unsupported registered shader type 8; it is not prepared at registration`) and left unprepared at registration, and throws when it is used later. Hello Neighbor 2 (PPSA07426), Ad Infinitum (PPSA10600) and Ghostrunner (PPSA03685) register type 8 headers and run on past them; what a type 8 header describes is unknown, #1892 found no context registers in it. - [NGG vertex workgroups](../../../core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp) (libSceAgcDriver) - type-2 PRIMGEN programs using DS instructions or `s_barrier` are prepared with the draw's routing and primitive registers on the existing mesh path. The workgroup requirement follows [Mesa's NGG lowering](https://github.com/mihawk-99/PS5_Mesa/blob/b3588f78dd7fd46fbadc7ecd487e5f14d4213e4b/src/amd/common/nir/ac_nir_lower_ngg.c#L1135); the mesh path supplies LDS and two guest lanes per host invocation for wave64 on a 32-lane host subgroup. Console routing has not been measured. Passthrough and tessellation keep their existing paths; unsupported mesh assembly and subgroup budgets throw. @@ -77,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 @@ -101,14 +128,15 @@ - [Multisampled DCC comp-to-single clears](../../../core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp) (AGC driver) - RADV's multisampled comp-to-single clear dispatch ([`radv_clear_dcc_comp_to_single`](https://github.com/mihawk-99/PS5_Mesa/blob/1ba9874f478657ccf6da72ce55f0260164cc0bd0/src/amd/vulkan/meta/radv_meta_clear.c#L954)) is recognized by its code and not run. Its clear color (user data 5 to 8, which the shader stores as the four dwords of sample 0's texel) is recorded for the surface its image descriptor names, and DCC keys of 0x10 on a multisampled target of that surface, pipe-bank XOR, size and sample count import as a clear to it, for texels of 8 to 128 bits. A record is dropped when an unmap or allocation removal covers its surface's base. The guest's color memory doesn't get the color at the blocks' first pixels, and the recorded color is assumed to be the one the keys refer to: RADV writes 0x10 keys only in a fast clear that runs this dispatch for the same image right after, and initializes DCC to 0x00 or 0xff on an image's first use ([`radv_init_color_image_metadata`](https://github.com/mihawk-99/PS5_Mesa/blob/1ba9874f478657ccf6da72ce55f0260164cc0bd0/src/amd/vulkan/radv_cmd_buffer.c#L16894)). A new image on memory reused within one mapping, with the same address, XOR, size and sample count, whose clear runs a comp-to-single shader other than the recognized one, would still import the old color. - [Initial depth and stencil planes](../../../core/libs/prx/libSceAgcDriver/Execution/include/QueueState.hpp) - the console's reset values of `DB_Z_INFO` and `DB_STENCIL_INFO` (context `0x010`-`0x011`) are not measured. Both start, and return after `CLEAR_STATE`, at zero (formats `INVALID`), the value of Linux's [GFX10 clear-state table](https://github.com/torvalds/linux/blob/master/drivers/gpu/drm/amd/amdgpu/clearstate_gfx10.h). The public [register-default tables](../../../core/libs/prx/libSceAgc/Command/include/RegisterDefaultsData.hpp) write `0x80000180` and `0x20000180` instead, also with formats `INVALID`; of their other bits, only `TILE_STENCIL_DISABLE` would change a result: the HTILE layout of a multisampled depth plane whose `DB_STENCIL_INFO` was never written. - [Type-0 and type-1 texture descriptors](../../../core/libs/prx/libSceAgcDriver/Graphics/src/GuestTextureResource.cpp) (`TYPE` = 0 or 1 in dword 3) with a nonzero base are bound as null images, like a zero base. TYPE 0 comes from a gfx1036 (RDNA2) measurement in issue #4139, TYPE 1 from a gfx1010 (RDNA1) measurement in #4139 and #5828 with format 22 only. On a gfx1100 (RDNA3, RADV Mesa 25.2.8) both types answer zero with no fault from `image_sample_lz`, `image_sample_b`, `image_load`, `image_sample_c_lz` and `image_get_resinfo`, for formats 32_FLOAT, 16_SSCALED, 2_10_10_10_SNORM and 8_UNORM (GFX11 codes 22, 10, 37, 1), over a readable nonzero base and a zero base ([hardware oracle](../HW_ORACLE.md), 2D T# declared 64x32). The TYPE 9 control answers the stored texel, 64 and 32 from resinfo, and 1.0 from an ALWAYS `image_sample_c_lz` at 32_FLOAT, the only one of these formats gfx1100 compares. TYPE 1 is not measured on RDNA2, and neither type on the console's gfx1013. -- [Multisampled color targets](../../../core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp) lose their guest-read guards and cannot be reused after a successful allocation removal or unmap covers their full guarded range. The next target, sampled or storage lookup removes retired cache owners; recorded work and sampled views keep their images alive until their last reference is released. A target made from a multisampled texture that a sample reads before any draw is retired instead when a guest access overlaps it, until a draw, a dispatch's storage write or an absorbed color fill puts samples on the host only; it is rebuilt from guest memory at its next use. Partial unmaps keep the guard; partial allocation reuse and guest access to live multisampled data remain unsupported. +- [Multisampled color targets](../../../core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp) keep their samples on the host, and guest access to live samples throws. A guarded access retires a target instead when its samples are not only on the host (a texture sampled before any draw, until a draw, storage write or absorbed fill; it is rebuilt from guest memory at its next use), or when its memory was reused since that last use: a CPU write over the accessed bytes in watched memory, or a bind over any of its guarded ranges of a depth or stencil plane, HTILE or color target other than itself or its sRGB twin. A one-fragment target's FMASK guard is never claimed and still refuses. A bind is taken as reuse, so a target only sampled after one loses its samples. An unmap or allocation removal of a whole guarded range also retires it; partial unmaps keep the guard. Retired cache owners go at the next lookup; recorded work and sampled views keep their images until released. +- [Shader buffer access to native multisample targets](../../../core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp) - Shader buffer descriptors retain the existing native color/depth guest-access refusal during preparation, completion and binding, including cached bindings and moved draw ranges. The check covers logical descriptor ranges, not larger import windows; dynamically addressed BDA heaps and vertex/index input snapshots remain outside this check. Native MSAA buffer publication and console equivalence remain unimplemented or unmeasured. - [Stencil reference export replay](../../../core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp) on devices without `VK_EXT_shader_stencil_export` replays the low eight bits of the values proved from constant, select and phi exports, with an export proved on every kept path. An export the prover cannot bound replays all 256 eight-bit values, one pass per value per triangle (logged once per process). It records instances, then their triangles, then the reference classes of each triangle. One pipeline filters fragments at shader termination against a dynamic push value before late stencil and depth tests. The [Vulkan stencil-reference replacement rule](https://docs.vulkan.org/refpages/latest/refpages/source/FragStencilRefEXT.html) discards bits above the attachment's stencil width; supported stencil attachments have eight bits. Numeric subgroup observations throw except bounded own-lane mask plumbing and group control with kept-lane and derivative-helper coverage proved. WQM inputs must exclude helper contributions (a ballot of the active lanes, as in an EXEC copy, covers whole quads and is accepted), since [non-quad subgroup operations may treat helpers as inactive](https://docs.vulkan.org/glslext/latest/glslext/khr/GL_KHR_shader_subgroup.html). Readonly guarded SRT reads may report internal host faults, and read-only BDA reads may report faults; these draws wait and check faults before publishing results, and loops throw. Indirect draws, restart, strips, fans, tessellation, mesh, multisampling, early tests, ordered pixel execution, guest shader memory writes, other fault-producing memory access, clocks, primitive ID inputs, attachment feedback and pipeline face/channel splits throw. An exhausted stage push range throws. Equivalence to console ordering has not been measured on console hardware. - [32-bit depth-bits reads of guest memory](../../../core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp) (libSceAgcDriver): a sampled 32_UINT or 32_SINT T# with a depth swizzle mode that no live depth surface matches reads the guest bytes through an R32_SFLOAT image, as the recompiler's depth-bits read expects, and the shader casts the fetched value back to the stored dword. On RX 6700 XT (gfx1031, AMD Windows driver 32.0.21045.5002) the read keeps float denormals, the sign bit alone and quiet and signaling NaN payloads bit for bit. A host that canonicalizes NaNs or flushes denormals on a 32-bit float fetch would change those dwords, and other drivers are not measured. A live depth surface whose extent or base level differs from the T# is not used; the read takes the guest bytes, as the 32-bit float and 16-bit views already do. - [Reused depth storage](../../../core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp): a storage view with another extent or a format that cannot hold the cached depth plane uses guest memory. Depth rendering is not written back to those guest bytes; this admission rule does not prove allocation reuse or preserve a depth writer through an incompatible view. A 2D storage view, or a one-layer 2D array view of layer 0, of level 0 with the plane's extent and format (32-bit float or the 32-bit depth-bits layout for the depth plane, 16-bit unorm for D16, 8-bit uint for the stencil plane) is a storage image that is [filled](../../../core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp) from the depth image before every use and, when the shader writes it, copied back after the work: a whole-plane copy through a staging buffer each way. A dispatch of the 15-word 8x8x1 image clear kernel ([`MatchStorageImageClear`](../../../core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp): one colour read from the V# in `user[8..11]` stored to every texel of the T# in `user[0..7]`) that covers the whole plane and stores 0 or 1 through a 16-bit unorm view, 0 or 0xffff through a 16-bit uint view, or 0 or a normal float in (0, 1] through a 32-bit float or integer view leaves out the copy-in and replaces the copy-out by a clear of the depth image to that value; the dispatch still writes the storage image. The colour is read again when the copy-out is replaced, and a changed value keeps the copy-out. Indirect dispatches, partial last groups, dispatches that queue on the draw pipeline, other values and formats, a plane the kernel covers only partly and stencil planes keep both copies. A written view is also left pending like any other storage image, so the plane's content, drawn depth included, reaches guest memory on the next flush of that range. A 2D array view of more than one slice of the depth plane, or of a later slice, is a storage image over the slices from 0 to its last (`LayeredDepthStorage`); only the slices from its base slice to its last are copied: a slice that has a depth surface at the plane's address plus a whole depth slice per layer (`DepthSliceBytes`, as for the depth plane copies below) is copied from that surface before every use and back to it after the work, every bound slice each time, through a staging buffer; the other slices hold guest memory like any storage image. These images are kept per address, extent, slice count, base slice, format and tile mode until the device goes away, outside the storage cache's budget. Such a view needs a layer pitch equal to that slice size, and another view of the same memory (the 2D view of its first slice, a view from another base slice, or a sampled copy) is a separate image, copied in before and out after each use, so views that are written before a flush and share a slice do not merge: the later copy-out wins, so their results are not merged. A matching view still throws when it is a cube or a 2D array of more than one layer of the stencil plane or from a later slice, when the surface is multisampled, when it names the depth plane of a 16-bit depth with stencil surface the device stores in a wider format, and when it was written after another view of the same plane (another format, tile mode, address or dimension) replaced it, as two such views bound in one dispatch are. Stored depth values outside 0..1 are not clamped, and Vulkan leaves that copy undefined without `VK_EXT_depth_range_unrestricted`. `agc_driver_depth_storage_dispatch` pins these paths; none is measured on the console. - [Collapsed color array views](../../../core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp) preserve the selected slice in the XOR address equation when the view is represented as a shifted 2D surface. Native Vulkan coverage checks R_X draws, array reads, publication and re-upload for slices 1-3; Lost Soul Aside PPSA26358 validates the RGBA16F cube mip chain on Windows/NVIDIA. Other devices and console comparisons remain unverified. Full-array views retain their layer addressing. - A [depth surface](../../../core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp) (libSceAgcDriver) is retired when a color target or a written storage image it does not serve overlaps it, or when it is sampled through a view it cannot serve and guest memory over it was written since it was last bound; lookups then skip it, so sampling reads the memory like any texture. Bound again, it keeps its own depth instead of the bytes written over it, except for the depth planes the next entry keeps in guest memory. Without write watching, a view it cannot serve still throws. A retired surface also gives up its depth and stencil planes, so another surface sharing them no longer copies from it. -- [Depth planes in guest memory](../../../core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp) (libSceAgcDriver): only single-sample `D32_SFLOAT` and `D32_SFLOAT_S8_UINT` planes with the 64 KiB Z swizzle (`SW_MODE` 24) reach guest memory; D16, other swizzles and multisampled planes keep depth in the host image only. A plane drawn since its last store is stored, uncompressed, in 64 KiB units (128x128 tiles): a buffer upload, a `GuestBuffers` V#, an image lookup or a pending-store flush stores the units it overlaps, a color target or written storage image over the plane all of them. CPU reads and reads through address-based heaps are not caught. Guest writes are ordered when collected (bind, flush, collect epoch), not when made: a collected write reloads the units it touched unless an HTILE clear is pending. A store outside a recorder waits for the GPU. The console keeps HTILE-compressed tiles compressed in memory until a decompress (Mesa `ac_descriptors.h`). +- [Depth planes in guest memory](../../../core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp) (libSceAgcDriver): only single-sample `D32_SFLOAT` and `D32_SFLOAT_S8_UINT` planes with the 64 KiB Z swizzle (`SW_MODE` 24) reach guest memory; D16, other swizzles and multisampled planes keep depth in the host image only. A plane drawn since its last store is stored, uncompressed, in 64 KiB units (128x128 tiles): a buffer upload, a `GuestBuffers` V#, an image lookup or a pending-store flush stores the units it overlaps, a color target or written storage image over the plane all of them. CPU reads and reads through address-based heaps are not caught. Guest writes are ordered when collected (bind, sample, flush, collect epoch), not when made: a collected write reloads the units it touched unless an HTILE clear is pending. A store outside a recorder waits for the GPU. The console keeps HTILE-compressed tiles compressed in memory until a decompress (Mesa `ac_descriptors.h`). - [Stencil planes in guest memory](../../../core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp) (libSceAgcDriver): the stencil plane of a single-sample surface with the 64 KiB Z swizzle is stored and reloaded as a whole plane, not in units. Binding the surface for a draw marks it drawn whether or not the draw writes stencil; a read that overlaps it stores it; a guest write collected when the surface is next bound or its stencil sampled reloads it unless a stencil clear is pending. Its layout is taken to be the depth plane's swizzle at one byte per texel; that is not measured. PPSA05684 moves stencil between depth targets with buffer copies every frame. - [Depth surfaces over compared shared memory](../../../core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp) (libSceAgcDriver): a depth surface over Windows direct memory that is compared once it is shared sees CPU writes made after the sharing no more than one over unwatched memory does. Its generations come from refused collects (0) or `TrackerGeneration()`, and nothing stamps compared memory after the one report at the sharing. - [Unmapped depth planes](../../../core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp) (libSceAgcDriver): a drawn depth plane whose guest memory the title unmapped before it was stored is not stored; its pending depth is dropped with a one-time warning. What the console does with such a store is not known. Readable planes without write permission retain the unsupported-store failure and their pending results. @@ -137,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`. @@ -148,15 +176,15 @@ - [`APS5_SKIP_REFUSED_DRAWS`](../../../core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCapture.cpp) (libSceAgcDriver) drops a draw whose graphics stage the recompiler refuses instead of failing the queue, so the frame lacks that draw, and the stage is compiled and refused again at each such draw. Compute refusals still fail. - [Pending storage-image results over memory outside the write watch](../../../core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp) (libSceAgcDriver) leave to the CPU the 64 KiB blocks whose bytes differ from the ones saved at the upload, the fill, the image copy, the previous store or the moment their range left the watch (`Unwatch`, or a host import that does not stay watched or whose page walk fails), and the blocks the watch saw the CPU write before that moment. A store made on the GPU saves its bytes through a host-visible copy that becomes the saved bytes when its batch completes; a store or a refresh that needs them earlier waits for that batch. A unit without a write generation saves the guest bytes when results land in it outside the watch. One whose range leaves the watch while its results are pending saves its bytes through the unwatch hook, which also runs when a failed collect takes a range out of the watch. A range that leaves the watch without the hook running over it leaves its pending results without saved bytes; storing such results throws. A unit whose results were stored while its blocks were watched keeps only a generation; when its blocks leave the watch while nothing is pending, the hook saves nothing, and results that land in it afterwards have neither saved bytes nor a watch, so storing them throws too. - [Storage images over uncommitted guest memory](../../../core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp) (libSceAgcDriver) - a storage image whose guest range has no committed page when it is created throws in the `StorageTexture` constructor, which aborts the guest. Several titles reach this intermittently in runs of a few minutes, on AMD and NVIDIA alike; in two of the three logs, lines about storage images over released or rewritten memory (`memory no longer registered`, `guest memory changed while GPU results were pending`) come shortly before it. The log does not name the image's address. What the console does with a storage descriptor over memory that is not committed is unknown, and which allocation the guest recreates there was not found. -- Windows host-pointer imports of the guest mapping itself are compared instead of write-watched, except writable imports of private `MEM_WRITE_WATCH` memory when the import probe keeps the write watch and a settle queue exists: those of 1 MiB or more stay watched, and smaller ones return to the watch once their settle has completed, unless a storage image overlaps them (see Pages under an import window): a driver can mark imported pages dirty after the synchronous import window. Shared memory imported through a separate writable alias retains protection-based tracking on the guest views; driver access to the import alias does not disarm those views. [GuestMemory](../../../core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp) excludes every overlapping 64 KiB tracker block while its backing is retained. A full block replaced by fresh private backing regains tracking and gets a new generation; protection changes, partial replacements and shared remappings do not restore it. Excluded blocks keep their write-watch marks as a hint only (`UntrackedHint`): a storage image or a sampled texture snapshot over them compares its bytes again after a mark in its range, a driver store, a mapping change or a recorded GPU write instead of at every collect epoch or lookup, and a mark the driver makes without a CPU store costs one comparison. This preserves CPU edits through byte comparisons but limits snapshot reuse on excluded blocks to draws of one collect epoch and disables unit shadows for them; restoring tracking on import retirement without replacing the backing remains unimplemented. -- [Pages under an import window](../../../core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp) whose protection an import resolves count as stored only when their bytes change. A same-value CPU store during that window cannot be distinguished from driver activity and does not win over pending results. On Windows, NVIDIA 617.42 marks every private MEM_WRITE_WATCH page after import until a GPU use completes. The driver behavior was measured on this driver; other drivers are unverified. Imports of at least 1 MiB wait for a four-byte read on the separate settle queue inside the window. Smaller imports stay compared until a deferred read completes; a later lookup returns their pages to write watching, stamping their blocks as CPU stores; the rest of a partly covered block stays compared. Blocks overlapping a live storage image, blocks of an import retired before rewatching, and imports without a settle queue stay compared. Shared-memory imports retain their separate-alias tracking. -- [Deferred host-import reads](../../../core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp) use the main queue with barriers ordering earlier and later writes around the reads. Submission does not wait on the CPU. An initial multisampled DCC import needing a range whose import still awaits its read submits it if needed and waits under the GPU mutex (`WatchedAfterSettle`, #9724). Imports of partial 64 KiB blocks get no deferred read; only that path reads them, returning their pages as CPU stores unless a live, trimmed or parked compared import or storage image shares their blocks; one a recorder holds is unseen. The latency cost of placing batches behind main-queue work is unmeasured. The first-use test now checks that earlier main-queue reads finish before the import returns to write watching; the original two-queue canary measured driver marking while those reads were still in flight. The earlier-import canary still checks later use of another import of the same pages. +- Windows host-pointer imports of the guest mapping itself are compared instead of write-watched, except writable imports of private `MEM_WRITE_WATCH` memory when the import probe keeps the watch and a settle queue exists: those of 1 MiB or more stay watched, smaller ones return to the watch after their settle unless a storage image overlaps them. Shared memory imported through a separate writable alias keeps protection-based tracking on its guest views. [GuestMemory](../../../core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp) excludes the 4 KiB pages an import overlaps, each with the generation of its latest exclusion; a fresh private mapping restores the complete pages it covers, protection changes and shared remappings do not, nor does retiring an import (unimplemented). Blocks with excluded pages keep their write-watch marks as a hint only (`UntrackedHint`): byte comparisons keep CPU edits, but snapshot reuse lasts one collect epoch and unit shadows are off. +- [Pages under an import window](../../../core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp) whose protection an import resolves count as stored only when their bytes change. A same-value CPU store during that window cannot be distinguished from driver activity and does not win over pending results. On Windows, NVIDIA 617.42 marks every private MEM_WRITE_WATCH page after import until a GPU use completes. The driver behavior was measured on this driver; other drivers are unverified. Imports of at least 1 MiB wait for a four-byte read on the separate settle queue inside the window. Smaller imports stay compared until a deferred read completes; a later lookup returns their pages to write watching, stamping their blocks as CPU stores; the block's other pages keep their state. Blocks overlapping a live storage image, blocks of an import retired before rewatching, and imports without a settle queue stay compared. Shared-memory imports retain their separate-alias tracking. +- [Deferred host-import reads](../../../core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp) use the main queue with barriers ordering earlier and later writes around the reads. Submission does not wait on the CPU. An initial multisampled DCC import needing a range whose import still awaits its read submits it if needed and waits under the GPU mutex (`WatchedAfterSettle`, #9724). Imports of partial 64 KiB blocks are read the same way; that read or one on demand returns their pages as CPU stores unless a live, trimmed or parked compared import or storage image shares their blocks; one a recorder holds is unseen. The latency cost of placing batches behind main-queue work is unmeasured. The first-use test now checks that earlier main-queue reads finish before the import returns to write watching; the original two-queue canary measured driver marking while those reads were still in flight. The earlier-import canary still checks later use of another import of the same pages. - [Settled dma-buf imports](../../../core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp) (libSceAgcDriver): on Linux a dma-buf import of 1 MiB or more is read by a 4-byte copy on the settle queue right after it is made (`settleImport`), so the kernel maps its pages for the GPU there and not in the first submission that uses it (about 2 s for a 3 GiB import on RADV). The import's buffer is shared with the settle queue's family. An import made at map time settles on the guest thread that maps the range, inside its map call, so that thread waits while the kernel maps the pages: 0.47 to 2.2 s for the 3 GiB range of Hades (PPSA03355) and 0.49 to 4.3 s for the 4.5 GiB range of ASTRO BOT (PPSA21567) on RADV. Both titles map these ranges at start-up; a title that maps large ranges during gameplay stalls its mapping thread for as long. An import made from a submission settles under the GPU mutex, so its frame still pays for it; a smaller import, and every import on a device with no settle queue (one without a copy-capable queue besides the main one), pays in its first submission. A range imported through a host pointer, as lavapipe imports shared memory, is not settled - [Sparse dma-buf imports](../../../core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp) (libSceAgcDriver): on Linux a shared-backed range larger than one 64 MiB udmabuf buffer is imported as one sparse buffer bound to the 64 MiB buffers, on a queue of its own when the device has a second family that binds sparse memory. The path is decided before anything is imported, and a failure after that throws. A range whose offset in the backing file is not a multiple of 64 KiB starts its sparse buffer at the 64 KiB block below it (`HostImport::lead`). A range takes the single udmabuf import instead, which udmabuf's `size_limit_mb` refuses above 64 MiB by default so the range is copied, when the buffer's sparse block size is larger than 64 KiB (it is 64 KiB on RADV), when the sparse buffer does not accept every memory type a chunk import can have, when the backing file ends inside its last chunk, or when it is imported at map time on a device with no second family (the bind then needs the GPU mutex); the NVIDIA proprietary driver imports no dma-buf memory - [Presentation under the GPU mutex](../../../core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp) (libSceAgcDriver) - on a device whose presentation family has no queue left after the main and settle queues, such as RADV, lavapipe and Intel's Windows driver (Arc Graphics on Meteor Lake, 101.9150), which expose a single graphics queue, `vkQueuePresentKHR` still runs on the main queue under `GuestMemory::GpuMutex`, so the draw committer and the queue workers wait for as long as the present blocks. How long that is on those drivers was not measured; on NVIDIA in FIFO mode it is about 6 ms per present. AMD's Windows driver (Radeon 860M) has one too: a Quake II port's trace had 0.3 ms presents (max 3.5), no `GpuMutex.wait.*` behind them. A device with a free queue in that family presents on it under its own mutex, after the GPU mutex is released. Closes when: traces on RADV, lavapipe and Intel's Windows driver also show no `GpuMutex.wait.*` behind `Vulkan.QueuePresent`. - [Unnormalized S# coordinates](../../../core/libs/prx/libSceAgcDriver/Graphics/src/GuestSamplerResource.cpp) (libSceAgcDriver) - `FORCE_UNNORMALIZED` uses a Vulkan `unnormalizedCoordinates` sampler, so the S# LOD range, LOD bias and mip filter are not applied, which is exact only on a one-level view. -- An [unnormalized S#](../../../core/libs/prx/libSceAgcDriver/Graphics/src/GuestSamplerResource.cpp) (libSceAgcDriver) maps clamp mode 0 (repeat) on X and Y to clamp-to-edge as required by Vulkan unnormalized coordinates, and assigns the magnification filter when minification and magnification filters differ (since unnormalized coordinates sample at LOD 0). Anisotropy, TRUNC_COORD, MC_COORD_TRUNC and other clamp modes still throw. Secondary LOD bias (LOD_BIAS_SEC, bits [19:14]) is accepted and ignored, matching RDNA2 hardware measurements across explicit and implicit samples. High on Life (PPSA15388, #4736) uses secondary LOD bias and unnormalized coordinates with clamp mode 0 and differing min/mag filters during home base and city rendering. -- [TRUNC_COORD](../../../core/libs/prx/libSceAgcDriver/Graphics/src/GuestSamplerResource.cpp) (libSceAgcDriver) is not applied: the texel a point sample reads and the bilinear weights follow the host sampler's rounding. On RDNA 2 (RX 6700 XT), an S# with TRUNC_COORD 0 rounds the exact scaled coordinate to 8 fractional bits, ties to even, and one with TRUNC_COORD 1 truncates it, for point and bilinear filters. AMD's Windows driver (32.0.21045.5002) truncates for nearest samplers and rounds for linear ones. Under it, a TRUNC_COORD 0 point sample at most 1/512 texel below a texel edge reads the texel below the edge where the console reads the one above, and `k / width` computed in f32 lands there for about half of all k. A TRUNC_COORD 1 bilinear weight can be 1/256 above the console's. Other host drivers are not measured. +- An [unnormalized S#](../../../core/libs/prx/libSceAgcDriver/Graphics/src/GuestSamplerResource.cpp) (libSceAgcDriver) maps clamp mode 0 (repeat) on X and Y to clamp-to-edge as required by Vulkan unnormalized coordinates, and assigns the magnification filter when minification and magnification filters differ (since unnormalized coordinates sample at LOD 0). Anisotropy, MC_COORD_TRUNC and other clamp modes still throw. Secondary LOD bias (LOD_BIAS_SEC, bits [19:14]) is accepted and ignored, matching RDNA2 hardware measurements across explicit and implicit samples. High on Life (PPSA15388, #4736) uses secondary LOD bias and unnormalized coordinates with clamp mode 0 and differing min/mag filters during home base and city rendering. +- [TRUNC_COORD](../../../core/libs/prx/libSceAgcDriver/Graphics/src/GuestSamplerResource.cpp) (libSceAgcDriver) is not applied, with normalized or unnormalized coordinates: the texel a point sample reads and the bilinear weights follow the host sampler's rounding. On RDNA 2 (RX 6700 XT), an S# with TRUNC_COORD 0 rounds the exact scaled coordinate to 8 fractional bits, ties to even, and one with TRUNC_COORD 1 truncates it, for point and bilinear filters. AMD's Windows driver (32.0.21045.5002) truncates for nearest samplers and rounds for linear ones. Under it, a TRUNC_COORD 0 point sample at most 1/512 texel below a texel edge reads the texel below the edge where the console reads the one above, and `k / width` computed in f32 lands there for about half of all k. A TRUNC_COORD 1 bilinear weight can be 1/256 above the console's. Other host drivers are not measured. - [Background link-time-optimized relink of library pipelines](../../../core/libs/prx/libSceAgcDriver/Execution/include/PipelineLinkOptimization.hpp) (libSceAgcDriver) is skipped on every GPU under NVIDIA's proprietary Vulkan driver (`VK_DRIVER_ID_NVIDIA_PROPRIETARY`), so those pipelines keep their fast-linked form. The optimized link loses the device when bound on an RTX 3080 (Ampere, #2866) and an RTX 4060 (Ada, #3434); an RTX 5060 and an RTX 5080 (Blackwell) on the same driver do not, so the scope is wider than the evidence. No standard Vulkan query tells the architecture apart, and the driver version that fixes it is unknown. `APS5_NO_PIPELINE_LTO` disables the relink on every driver. - [8_SRGB and 8_8_SRGB textures](../../../core/libs/prx/libSceAgcDriver/Graphics/src/TextureFormat.cpp) (libSceAgcDriver) that the device samples as R8_SRGB or R8G8_SRGB use its own decode, which need not match gfx1035: NVIDIA's R8_SRGB is one bf16 step off in 29 of 256 codes. A device that cannot sample them gets an RGBA8 sRGB copy instead (a blit of the R8 or RG8 texels, refreshed with the storage image's version), whose decode is likewise the device's; 3D textures and storage images that are not single-depth and format-matched are copied from their snapshot instead. - [PM4 submission rings](../../../core/libs/prx/libSceAgcDriver/Execution/src/Driver/Queues/SubmissionRing.cpp) (libSceAgcDriver) keep only the first 512 dwords of each submission, so the packets past them are not printed. The [failure report](../../../core/libs/prx/libc/src/FailureReport.cpp) dump does not allocate from the C runtime heap: packet names come from static strings, each line is formatted with integer and string conversions into a 512-byte stack buffer and written with one `WriteFile`. It still runs on whatever state the crash left. It waits about 100 yields for each ring's lock and otherwise prints that queue as busy, so a crash while recording a submission loses that queue's ring. It reads the rings without checking them, so a crash that corrupted them can fault inside the dump; such a fault during the report of an unhandled exception stops in that report's `Sleep(INFINITE)` and the process hangs instead of ending. The reports run at most once per process. Linux has no crash report: there the rings are printed only by `APS5_STALL_WATCHDOG_SECS`. @@ -216,6 +244,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. @@ -228,6 +257,7 @@ - [5_6_5 color targets](../../../core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp) (libSceAgcDriver) render into R5G6B5. The field holding X is in bits 0-4, Y in 5-10 and Z in 11-15, as for the other AMD formats; the component swap picks which export fills them, following `ac_translate_colorswap` in [Mesa 26.2.2 ac_formats.c](https://gitlab.freedesktop.org/mesa/mesa/-/blob/mesa-26.2.2/src/amd/common/ac_formats.c), which programs `SWAP_STD_REV` (2) for a surface with red in bits 11-15. With `SWAP_STD_REV` red goes to bits 11-15, R5G6B5's red, so the exports are written as they are; with `SWAP_STD` (0) red goes to bits 0-4 and the exports are written with X and Z exchanged, as for 1_5_5_5. The decoded format, component mapping and write mask are tested, and an execution test draws 32_ABGR exports into tiled and linear targets in both orders and compares every stored texel with that layout on the host device; the export direction is not measured on a PS5. Only UNORM with those two component orders is accepted; `SWAP_ALT` and `SWAP_ALT_REV` keep throwing. Destination alpha reads as 1, as Vulkan defines it for a format without alpha, which is not measured on the console. Constant blend colors with `SWAP_STD` go through the `0xc6` component-swap handling, which is not tested for this format. R5G6B5 has no entry in the DCC and multisample clear-encoding tables, so a CB DCC decompress or eliminate of DCC clear codes other than 0000 and a fast clear of a multisampled 5_6_5 target throw, as for 1_5_5_5. PPSA27305 renders into this format with `SWAP_STD_REV` (discussion #6434). - [1_5_5_5 color targets](../../../core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp) (libSceAgcDriver) render into A1R5G5B5. AMD formats keep the first component in the least significant bits (X in bits 0-4, Y in 5-9, Z in 10-14, W in bit 15, as in the [fpPS4](https://github.com/red-prig/fpPS4) `kSurfaceFormat1_5_5_5` doc comment and as measured for textures in the packed 16-bit textures entry), while A1R5G5B5 keeps R in bits 10-14 and B in bits 0-4, so the pixel exports are written with X and Z exchanged, which makes the stored bits follow the guest layout. The decoded format, component mapping and write mask are tested, and an execution test draws 32_ABGR exports into tiled and linear targets and compares every stored texel with the guest layout on the host device; the export direction is not measured on a PS5. Only UNORM with the standard component swap is accepted. Constant blend colors go through the same component-swap handling as other targets with that export mapping (`0xc6`), which is not tested for this format. PPSA06699 renders into this format. - [4_4_4_4 partial writes, sample positions](../../../core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp) (libSceAgcDriver) - a partial write of a multisampled 4_4_4_4 UNORM target runs the pixel shader once per sample. For a shader the guest runs per pixel it throws on inputs that would follow the invocation's sample: the ancillary word and, unless every sample sits at the pixel centre, centroid, sample-located or pull-model barycentrics, Z, 1/W and positions at the centroid or a sample; off-centre samples make centre barycentrics throw without interpolation functions and fragment shader barycentrics. Centre barycentrics and positions, upper-left and fixed-point positions and the front face are kept, so each invocation reaches the console's colour and kill decision. A shader that writes guest memory throws, as each covered sample would repeat the writes, also when the guest iterates it itself (the request does not say). Not measured on a PS5. +- [4_4_4_4 partial writes with another merged target](../../../core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp) (libSceAgcDriver) - a partial write of a 4_4_4_4 UNORM target throws when another color target of the draw also merges in the pixel shader (a second partial write or an unclamped normalized blend), and so does any draw whose merged color targets share memory. - [4_4_4_4 CB resolves](../../../core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp) (libSceAgcDriver) - a CB resolve from a packed color target throws, so a 2-sample 4_4_4_4 target cannot be resolved by the color block. - [4_4_4_4 partial writes, merged coverage](../../../core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp) (libSceAgcDriver) - a partial write of a one-sample 4_4_4_4 UNORM target drawn with merged coverage (a multisampled rasterizer over a one-sample target, as radeonsi line and polygon smoothing does) throws: the merge leaves the target out of the colour attachments, so such a draw would rasterize the extra samples with no one-sample attachment for `VK_NV_framebuffer_mixed_samples` coverage reduction, a combination that is not tested. - [4_4_4_4 partial writes, measured hardware](../../../core/libs/prx/libSceAgcDriver/tests/execution/PackedUnorm4444MultisamplePartialWrite.cpp) (libSceAgcDriver) - the single-sample merges and the 2-, 4- and 8-sample merges are measured only on an NVIDIA RTX 4070 SUPER, not on other host GPUs or a PS5. @@ -270,7 +300,7 @@ - [16-bit depth with stencil](../../../core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp) (libSceAgcDriver) is stored as `D24_UNORM_S8_UINT`, or `D32_SFLOAT_S8_UINT`, on a device without `D16_UNORM_S8_UINT` as an attachment. Depth comparisons, clears and the depth image see the wider format's precision, so results at the 16-bit quantization boundary can differ from the console; the constant depth bias is scaled by 256 for D24, and a non-zero constant on the D32 float fallback throws. Not measured on console hardware. - [Depth surfaces created over storage writes](../../../core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp) (libSceAgcDriver): a depth surface created without HTILE copies its depth plane from the storage image at the plane's address, a pending one first, when that image has the plane's extent, one level, a 2D view or a 2D array view (its layer 0 is copied) and a 16-bit format for a 16-bit plane or a 32-bit format for a 32-bit plane. A multisampled surface, a surface the device stores in another format, a surface with HTILE and a surface without such an image start from `DB_DEPTH_CLEAR`, and the stencil plane from `DB_STENCIL_CLEAR`; CPU writes to the plane's memory are not read. Not measured on the console, where the plane is that memory. - [Flip packets raise the graphics end-of-pipe event](../../../core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketExecution.cpp) (libSceAgcDriver) - a flip delivers the queue's end-of-pipe event (`sceAgcDriverAddEqEvent`) once the work recorded before it completes, as a `RELEASE_MEM` with `INT_SEL` does, but only on a queue that has never delivered an interrupt from such a release: the queue is latched the first time a release interrupt reaches the event queue, and flips on that queue deliver nothing while its own release interrupts keep arriving. The latch is cleared when the queue has flipped five times without another interrupt from its own releases: the fifth flip delivers the event and unlatched the queue, so a title that waits on the flip event after latching recovers only if it submits further flips. The bound cannot be by time: the next release interrupt can arrive seconds later than a suppressed flip across loading stalls, and delivering an unexpected flip event on a queue that pairs flips with releases can crash; no fixed window short enough to unblock a waiting title keeps such a title alive. Whether the console raises the event from the flip itself or from an interrupt its flip sequence contains is not measured; nor is how the console behaves for a title that waits on the flip event and also raises release interrupts on the same queue. -- [Host import windows and budget](../../../core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp) (libSceAgcDriver): a registered range larger than 64 MiB is imported one 64 MiB window at a time for buffer and fill accesses; an access across window edges imports the cells it touches, grown to the union of the range's imports it overlaps. An address-based build (`AcquireRegistered`) imports the range whole and replaces its windows. Live imports stay under a budget: `APS5_HOST_IMPORT_MIB`, else the larger of 6 GiB and half the physical memory, at most the largest host heap less the larger of 2 GiB and half that heap (imports, type-3 mirrors and buffers and textures placed in host memory share it; on a 16 GiB machine whose host heap is half the memory, a 2 GiB reserve left too little for the rest). Where the device enables `VK_EXT_memory_budget`, that host heap's reported budget less its other usage and an eighth, in 64 MiB steps, read at most once a second, also bounds the default budget once an import's `vkAllocateMemory` has failed; a set `APS5_HOST_IMPORT_MIB` is never lowered by the report. The report's other usage includes the host-visible copies and heap mirrors that stand in for refused imports, so it grows with the refusals; the first time the report would lower the budget, `[gpu] host import budget: host heap ...` prints the heap's reported budget and usage and the live imports. An import's `vkAllocateMemory` failure within an eighth of the budget, or the third in a row, lowers the budget to the live imports until the device or the configured budget changes; an isolated failure further below only marks its range failed. Live imports are not capped by `maxMemoryAllocationCount`: NVIDIA's Windows driver reports 4096, while Village held 27,167 live imports without a failure. A new import beyond it retires the least recently used imports not used in the current or the previous frame (a frame ends at a flip packet or a CPU flip), so a set used in every frame keeps its imports and what does not fit is copied, as below the budget; until two frames have ended imports age by lookups, an import being evictable 256 lookups after its last use; after that, without flips (a loading stretch, compute-only work) no frame ends and nothing more becomes evictable, so imports that do not fit are copied instead of evicting by recency; one that would not fit even then is refused before anything is retired, and imports made when a range is mapped never evict. An address-based build does not evict either, except for a range the budget refused (or remembers refusing) and no mirror serves whose copy would take the build's copies past `APS5_ADDRESS_COPY_MAX_MIB`. A heap mirror, sparse or not, whose range has left the write watch is refreshed in full at each use, every block counted as written; a build plans its range again only once the import path takes the range. A request that may not evict (an address-based build, an import when a range is mapped) remembers a refused range or block, with the live bytes and the budget at the refusal, and is answered from that memory, still counted as refused, until live imports drop below those bytes, the budget changes or one of its ranges changes. A request that may evict remembers its refusal too, answering later requests for the same run from memory with the room the refusal left (a request whose range fits in that room steps down to a smaller block without scanning the imports again, and a refusal that stepped down is remembered for each block it tried), while no import was made or retired, the budget has not grown, the import window and the run are unchanged, and no import can have become evictable since: no frame has ended (or, before two frames have ended, 256 lookups have not passed), and no build holding an import two frames old has raised its floor. A join remembers its refusal the same way, apart from other requests for the same run, so a buffer bound across refused ranges does not try the join again at every upload. The shutdown line `[gpu] host imports at shutdown` gives the live, made, refused (and remembered) and failed counts per requester. The 64 MiB window, the two-frame protection, the 2 GiB reserve, the eighth, the 64 MiB steps and the three failures are choices, not measured. +- [Host import windows and budget](../../../core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp) (libSceAgcDriver): a registered range larger than 64 MiB is imported one 64 MiB window at a time for buffer and fill accesses; an access across window edges imports the cells it touches, grown to the union of the range's imports it overlaps. An address-based build (`AcquireRegistered`) imports the range whole and replaces its windows. Live imports stay under a budget: `APS5_HOST_IMPORT_MIB`, else the larger of 6 GiB and half the physical memory, at most the largest host heap less the larger of 2 GiB and half that heap (imports, type-3 mirrors and buffers and textures placed in host memory share it; on a 16 GiB machine whose host heap is half the memory, a 2 GiB reserve left too little for the rest). Where the device enables `VK_EXT_memory_budget`, that host heap's reported budget less its other usage and an eighth, in 64 MiB steps, read at most once a second, also bounds the default budget once an import's `vkAllocateMemory` has failed; a set `APS5_HOST_IMPORT_MIB` is never lowered by the report. The report's other usage includes the host-visible copies and heap mirrors that stand in for refused imports, so it grows with the refusals; the first time the report would lower the budget, `[gpu] host import budget: host heap ...` prints the heap's reported budget and usage and the live imports. An import's `vkAllocateMemory` failure within an eighth of the budget, or the third in a row, lowers the budget to the live imports until the device or the configured budget changes; an isolated failure further below only marks its range failed. Live imports are not capped by `maxMemoryAllocationCount`: NVIDIA's Windows driver reports 4096, while Village held 27,167 live imports without a failure. A new import beyond it retires the least recently used imports not used in the current or the previous frame (a frame ends at a flip packet or a CPU flip), so a set used in every frame keeps its imports and what does not fit is copied, as below the budget; until two frames have ended imports age by lookups, an import being evictable 256 lookups after its last use; after that, without flips (a loading stretch, compute-only work) no frame ends and nothing more becomes evictable, so imports that do not fit are copied instead of evicting by recency; one that would not fit even then is refused before anything is retired, and imports made when a range is mapped never evict. An address-based build does not evict either, except for a range the budget refused (or remembers refusing) and no mirror serves whose copy would take the build's copies past `APS5_ADDRESS_COPY_MAX_MIB`; that eviction also takes imports the recency rule protects whose single range is releasable and write-watched, so a heap mirror can serve it, as long as the build has not taken them yet. A heap mirror, sparse or not, whose range has left the write watch is refreshed in full at each use, every block counted as written, unless the build can import its range first, evicting for it as the copy cap does, with the imports of earlier builds no longer held; a build plans its range again only once the import path takes the range. A request that may not evict (an address-based build, an import when a range is mapped) remembers a refused range or block, with the live bytes and the budget at the refusal, and is answered from that memory, still counted as refused, until live imports drop below those bytes, the budget changes or one of its ranges changes. A request that may evict remembers its refusal too, answering later requests for the same run from memory with the room the refusal left (a request whose range fits in that room steps down to a smaller block without scanning the imports again, and a refusal that stepped down is remembered for each block it tried), while no import was made or retired, the budget has not grown, the import window and the run are unchanged, and no import can have become evictable since: no frame has ended (or, before two frames have ended, 256 lookups have not passed), and no build holding an import two frames old has raised its floor. A join remembers its refusal the same way, apart from other requests for the same run, so a buffer bound across refused ranges does not try the join again at every upload. The shutdown line `[gpu] host imports at shutdown` gives the live, made, refused (and remembered) and failed counts per requester. The 64 MiB window, the two-frame protection, the 2 GiB reserve, the eighth, the 64 MiB steps and the three failures are choices, not measured. - [Piece-split ranges over the host import budget](../../../core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp) (libSceAgcDriver): an address-based build imports a registered range larger than the device's largest allocation in pieces. If the budget refuses a piece, the range is mirrored or copied without the evicting retry other refused ranges get when their copy would pass `APS5_ADDRESS_COPY_MAX_MIB`, so such a copy can still exceed that cap and end the build. - [Device-local staging](../../../core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp) (libSceAgcDriver) - a written or atomic buffer element inside a host import, including one an address-based compute build reaches through its pointers, is copied to device memory before the dispatch and copied back whole after it, so a CPU store into that range in between is rolled back. - [Committed reads of released pages](../../../core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp) (libSceAgcDriver) - `ReadCommitted` and `EqualsCommitted` find the readable pages of a range first and read them afterwards. On Windows they read through `ReadProcessMemory`, so a page released in between reads as zero and is left out of the comparison instead of faulting: Demon's Souls (PPSA01342) samples a texture at 0x38400 of 352 MiB while it loads the tutorial level, a range that holds no guest allocation and on Windows covers host heap pages other threads release, which stopped it with an access violation. A texture outside every registered guest allocation still takes the host bytes found there, as it did before; what the console returns for it is not measured. On Linux the pages are copied directly, so a page released between the check and the copy still faults. @@ -280,7 +310,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 second merged target in one 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. @@ -296,10 +326,12 @@ - [Depth mip levels](../../../core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp) (libSceAgcDriver) - a depth view of mip `DB_DEPTH_VIEW.MIPID` in a chain of `DB_Z_INFO.MAXMIP` levels renders into that level as a surface of its own, at the level's offset and extent from `ComputeElementMipLayout` for the 64 KiB Z_X swizzle, the layout color target mips and sampled depth already use; slices of a chain step by the size of the whole chain. Taken from LEGO Builder's Journey (PPSA05496), which renders depth mip 1 of 64 KiB Z_X surfaces without HTILE; the placement was not compared with a console capture. Multisampled depth mips, other swizzle modes, levels in the packed mip tail and HTILE on a mip chain throw - [Depth view mip on a single-level surface](../../../core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp) (libSceAgcDriver) - a `DB_DEPTH_VIEW.MIPID` above zero on a surface whose `DB_Z_INFO.MAXMIP` is zero selects the first level. In Flashback (PPSA08546) the depth view follows a mipmapped colour target from mip 1 to 6 over six slices of a 128x128 Z_X depth array; the depth allocation is six 64 KiB slices (the next allocation starts 0x61000 bytes later, too small for a mip tail) and every view uses the same base and extent, so the field has no other level to select. The console was not measured. A depth copy from such a view still throws -- [Long Windows pipeline-cache paths](../../../core/libs/prx/libSceAgcDriver/Graphics/src/PipelineCache.cpp): `readHeader` and the failed-read existence check still use ordinary paths. A filename beyond MAX_PATH can prevent header reuse or be reported missing; the shared content reader and journal normalization do not cover these calls. +- [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. ### Opt-in draw paths diff --git a/docs/dev/debt/libSceAjm.md b/docs/dev/debt/libSceAjm.md new file mode 100644 index 000000000000..de8b68690760 --- /dev/null +++ b/docs/dev/debt/libSceAjm.md @@ -0,0 +1,5 @@ +# libSceAjm technical debt + +### Unknown function info + +- [sceAjmGetFailedInstance, sceAjmInstanceGetSize, sceAjmTelemetryGetLog](../../../core/libs/prx/libSceAjm/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/libsceajm-5217837f40.jsonl); signatures and behavior remain unknown. Parameterless `int` declarations are import placeholders, not verified prototypes or working implementations. diff --git a/docs/dev/debt/libSceAjm.native.md b/docs/dev/debt/libSceAjm.native.md index 5aaf9b983398..da7e79d8122d 100644 --- a/docs/dev/debt/libSceAjm.native.md +++ b/docs/dev/debt/libSceAjm.native.md @@ -25,6 +25,7 @@ - [sceAjmBatchJobControl](../../../core/libs/prx/libSceAjm.native/src/Ajm.cpp) (libSceAjm.native) - SIDEBAND_GAPLESS_DECODE with RESET overwrites both counts as in [RPCSX](https://github.com/RPCSX/rpcsx); shadPS4 ignores a zero count when the other is nonzero. Without RESET they differ, so it throws - [sceAjmBatchJobSetResampleParameters, sceAjmBatchJobGetResampleInfo](../../../core/libs/prx/libSceAjm.native/src/Ajm.cpp) (libSceAjm) - the ratio is taken as decoded samples per output sample and num_samples as the decoded samples the resampler holds, both inferred from FMOD (Hades II); the console's interpolation is unknown, a 4-point Catmull-Rom is used. The flags argument is ignored, as in shadPS4 and Kyty. In the one `sceAjmBatchJobSetResampleParameters` call of PPSA21480 (0x60af) the flags value is (b xor 1) * 2 for the byte b a virtual call returns, so 2 for 0 and 0 for 1, and a negative result is passed to a formatting call whose result goes to another call; the one `sceAjmBatchJobGetResampleInfo` call of PPSA02225 (0x1af1ba, made only when bit 0x10 of its request is set) does not look at the result. The calls do not show what the flags bit selects, so the flags argument stays ignored. - [sceAjmBatchJobControlBufferRa, sceAjmBatchJobRunBufferRa, sceAjmBatchJobRunSplitBufferRa, sceAjmBatchStartBuffer](../../../core/libs/prx/libSceAjm.native/src/Ajm.cpp) (libSceAjm, PS4) - the batch layout (chunk kinds, 20-bit payload, flags bits 32-51 as the flags chunk's payload, the builders' chunk order) follows [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/854b291c63360ff24e590809aff54cf5ab2dd4c9/src/core/libraries/ajm/ajm_batch.cpp) and was confirmed byte for byte for 64-byte control and 80-byte run jobs by a PS4 trace of Knowledge is Power: Decades (CUSA12435, Wwise, 32 545 batches dumped by a GoldHEN plugin). The console's builders write only bits 0-3 (kind), bit 4 (a buffer chunk's output direction) and bits 6-25 (payload) of the header word and leave bits 5, 26, 27 and 31 as the previous batch left them, so the kind is read as 4 bits plus the direction bit, not as 6 bits +- [sceAjmBatchJobRunBufferRa](../../../core/libs/prx/libSceAjm.native/src/Ajm.cpp) (libSceAjm, PS4) - follows firmware 13.42's routine as [run in an x86-64 emulator](https://github.com/boykopovar/AnyPS5/pull/11238#issuecomment-6442306780), not on a console: the flags are [masked to 0x0000e00000001fff](https://github.com/boykopovar/AnyPS5/pull/11238#issuecomment-6450694292), a job header and the flags chunk keep bits 26-31 of the old word, and a buffer chunk writes bits 0-4 and keeps the rest. The run's fill had bit 5 and bits 24-25 clear, so keeping bit 5 and writing bits 24-25 follow the PS4 trace above. sceAjmBatchJobControlBufferRa and sceAjmBatchJobRunSplitBufferRa were not run and still write fresh header words and every flag bit - [sceAjmBatchStartBuffer](../../../core/libs/prx/libSceAjm.native/src/Ajm.cpp) (libSceAjm, PS4) - the statistics instance 0x80000 comes from shadPS4 only and the inline chunk from shadPS4, fpPS4 and prosper (see sceAjmBatchJobInlineBuffer): the traced title builds every batch with the builders and a return address, and no title was seen writing an inline chunk. Flags are kept as passed. Unknown chunk kinds, control flags other than RESET, INITIALIZE and SIDEBAND_GAPLESS_DECODE, control jobs with run buffers and run jobs with a control input throw - [sceAjmBatchJobInlineBuffer](../../../core/libs/prx/libSceAjm.native/src/Ajm.cpp) (libSceAjm, PS4) - the behaviour is firmware 13.42's routine, [run in an x86-64 emulator](https://github.com/boykopovar/AnyPS5/pull/11238#issuecomment-6418132093) for `libSceAjm.sprx` and `libSceAjmi.sprx`, not measured on a console: bits 5-31 of the old header word are kept with kind 7, as in [fpPS4](https://github.com/red-prig/fpPS4/blob/04cefd43e6fddd1ab033e7980cd356d14c964905/src/ajm/ps4_libsceajm.pas#L399-L410), the second word holds the low 32 bits of the size rounded up to 8, the data follows with the padding left as it was, the batch address points at the copy, and nothing is checked - [sceAjmBatchStartBuffer refusals](../../../core/libs/prx/libSceAjm.native/src/Ajm.cpp) (libSceAjm, PS4) - probe batches through the console's builders on a PS4 showed that a run buffer chunk of size zero is dropped whatever its address (the job runs as without it: 0x10 and nothing consumed for no room, 0 for no input), and that a null address with a nonzero size refuses the batch before any of its jobs runs, with 0x80930011 returned and the error record holding 0x80930016, the job chunk's address, the chunk's offset in the job and the job's return address. Control buffer chunks follow the same rule here, not measured. A size not a multiple of 8, a chunk that overruns its job or the batch, or a job without flags are refused the same way with 0x80930011 in the record; the console's report for those was not measured @@ -45,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/libSceAjmi.md b/docs/dev/debt/libSceAjmi.md index 1a5289660d54..3d21dfd34d2d 100644 --- a/docs/dev/debt/libSceAjmi.md +++ b/docs/dev/debt/libSceAjmi.md @@ -2,4 +2,4 @@ ### Unknown function info -- [libSceAjmi pending exports](../../../core/libs/prx/libSceAjmi/Export.cpp) - of the 5 named callable exports identified in the PS5 3.20 export table and cross-checked against firmware 13.60, 2 are declared here, as `sceAjmBatchJobInlineBuffer_nid_disambig1` and `sceAjmBatchJobRunBufferRa_nid_disambig1`, which the NID patcher exports under the names' NIDs, because libSceAjm implements the same names for PS4 titles. `sceAjmBatchJobInlineBuffer` is firmware 13.42's routine, the same as libSceAjm's ([emulated run](https://github.com/boykopovar/AnyPS5/pull/11238#issuecomment-6418132093)). `sceAjmBatchJobRunBufferRa` still throws through `NotImplemented_nid_no_patch` with the unknown-signature convention: the same comment reports its code matches libSceAjm's, but it was not run. Evidence: [3.20 export list](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceAjmi.c). +- [libSceAjmi pending exports](../../../core/libs/prx/libSceAjmi/Export.cpp) - of the 5 named callable exports identified in the PS5 3.20 export table and cross-checked against firmware 13.60, 2 are declared here, as `sceAjmBatchJobInlineBuffer_nid_disambig1` and `sceAjmBatchJobRunBufferRa_nid_disambig1`, which the NID patcher exports under the names' NIDs, because libSceAjm implements the same names for PS4 titles. Both are firmware 13.42's routines, which write the same bytes as libSceAjm's in an emulator ([sceAjmBatchJobInlineBuffer](https://github.com/boykopovar/AnyPS5/pull/11238#issuecomment-6418132093), [sceAjmBatchJobRunBufferRa](https://github.com/boykopovar/AnyPS5/pull/11238#issuecomment-6442306780)); neither was run on a console. Evidence: [3.20 export list](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceAjmi.c). diff --git a/docs/dev/debt/libSceAmpr.md b/docs/dev/debt/libSceAmpr.md index 7c8307463695..0c9bbb353d84 100644 --- a/docs/dev/debt/libSceAmpr.md +++ b/docs/dev/debt/libSceAmpr.md @@ -2,11 +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 -- [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. +- [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`, `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 c75f621a36a9..9ea6e297ba9a 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 000000000000..904e4cc6ae37 --- /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 28ed171a1154..5c10aa50eae5 100644 --- a/docs/dev/debt/libSceAppInstUtil.md +++ b/docs/dev/debt/libSceAppInstUtil.md @@ -1,10 +1,44 @@ # 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. - [sceAppInstUtilGetInstallProgressInfo, sceAppInstUtilGetInstallProgress and sceAppInstUtilGetPrimaryAppSlot](../../../core/libs/prx/libSceAppInstUtil/Export.cpp) - take a title-id string and an output pointer. The IPC replies contain 48, 4 and 4 bytes respectively; callers and reply producers are needed to establish the field types. - [sceAppInstUtilAppPrepareOverwritePkg, sceAppInstUtilAppRecoverApp and sceAppInstUtilAppUnInstallTheme](../../../core/libs/prx/libSceAppInstUtil/Export.cpp) - absent from the supplied system module and from the supplied decompiled callers; the old export inventory establishes names but not prototypes. +- [sceAppInstUtilCheckLatestPatch2, sceAppInstUtilAppGetIrremovableAppList2, sceAppInstUtilGetAddons2, sceAppInstUtilInstallPatch2, sceAppInstUtilAppUnInstall3, sceAppInstUtilGetPatchInstallStatus2, sceAppInstUtilAppRequestMoveApps2, sceAppInstUtilGetContentSize3](../../../core/libs/prx/libSceAppInstUtil/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/libsceappinstutil-783ade3c34.jsonl); signatures and behavior remain unknown. Parameterless `int` declarations are import placeholders, not verified prototypes or working implementations. - [sceAppInstUtilAppGetAppInstallStatusByAppInfo](../../../core/libs/prx/libSceAppInstUtil/Export.cpp) (libSceAppInstUtil) - unknown signature - [sceAppInstUtilAppUnInstall2](../../../core/libs/prx/libSceAppInstUtil/Export.cpp) (libSceAppInstUtil) - unknown signature - [sceAppInstUtilAppUnInstallForRemote](../../../core/libs/prx/libSceAppInstUtil/Export.cpp) (libSceAppInstUtil) - unknown signature @@ -103,3 +137,5 @@ - [sceAppInstUtilGetNeededStorageSize](../../../core/libs/prx/libSceAppInstUtil/Export.cpp) (libSceAppInstUtil) - unknown signature - [sceAppInstUtilAppGetStorageDestType](../../../core/libs/prx/libSceAppInstUtil/Export.cpp) (libSceAppInstUtil) - unknown signature - [sceAppInstUtilInstallAddons](../../../core/libs/prx/libSceAppInstUtil/Export.cpp) (libSceAppInstUtil) - unknown signature +- [sceAppInstUtilAppConvertAppDiscToDownload, sceAppInstUtilAppGetCustomThemeInfo, sceAppInstUtilAppGetInstallAddcontFromDiscStatus and sceAppInstUtilAppInstallCloudGame](../../../core/libs/prx/libSceAppInstUtil/Export.cpp) (libSceAppInstUtil) - The list is the intersection of the export table of the console's libSceAppInstUtil (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/libSceAppInstUtil.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. +- [sceAppInstUtilAppInstallMediaPlayer, sceAppInstUtilAppInstallRequestAddcontFromDisc and sceAppInstUtilAppSetSavedataUploadStatus](../../../core/libs/prx/libSceAppInstUtil/Export.cpp) (libSceAppInstUtil) - The list is the intersection of the export table of the console's libSceAppInstUtil (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/libSceAppInstUtil.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. diff --git a/docs/dev/debt/libSceAsyncStorageInternal.md b/docs/dev/debt/libSceAsyncStorageInternal.md new file mode 100644 index 000000000000..c043bb94dd5b --- /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 fe59a534e22c..8e7cadd71339 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 c559aad66724..3118384ce978 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. 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) - 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. - [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,7 +79,7 @@ - [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. @@ -134,10 +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 f93a5065b4a8..ea8ae416146d 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/libSceAudioSystem.md b/docs/dev/debt/libSceAudioSystem.md index 0595a501f936..b572e26258ac 100644 --- a/docs/dev/debt/libSceAudioSystem.md +++ b/docs/dev/debt/libSceAudioSystem.md @@ -2,4 +2,5 @@ ### Unknown function info +- [sceAudioSystemInit, sceAudioSystemProcessAdd, sceAudioSystemProcessRemove, sceAudioSystemProcessResume, sceAudioSystemProcessSuspend, sceAudioSystemTerminate](../../../core/libs/prx/libSceAudioSystem/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/libsceaudiosystem-bfe74a18cc.jsonl). - [sceAudioSystemSystemResume and sceAudioSystemSystemSuspend](../../../core/libs/prx/libSceAudioSystem/Export.cpp) (libSceAudioSystem) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceAudioSystem.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/libSceAudiodec.md b/docs/dev/debt/libSceAudiodec.md index ea126704dac1..b5f8b83ee021 100644 --- a/docs/dev/debt/libSceAudiodec.md +++ b/docs/dev/debt/libSceAudiodec.md @@ -5,9 +5,10 @@ - [M4AAC extended parameters](../../../core/libs/prx/libSceAudiodec/Export.cpp): 28-byte and 32-byte parameter variants add fields at offsets 24 and 28, named by their range errors (`0x807F0305` `SCE_AUDIODEC_ERROR_M4AAC_INVALID_ENABLE_NONDELAY_OUTPUT`, `0x807F0306` `SCE_AUDIODEC_ERROR_M4AAC_INVALID_SURROUND_CHANNEL_INTERLEAVE_ORDER`, in fpPS4's `ps4_libsceaudiodec.pas`). Non-delay output 1 decodes every access unit to its own PCM from the first one on, as shadPS4's AJM AAC decoder does with `EnableNondelayOutput`; without that flag shadPS4 holds back the first 2 frames. Non-delay output 0 still decodes the same way, with no frame held back: no measurement shows whether the console delays it. Surround channel interleave orders 1 and 2 throw: shadPS4 names two AJM orders (`ExtlExtrLsRs`, `LsRsExtlExtr`) but uses neither, and no source says which value selects which order or which order 0 is. - [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 + - [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 01bc5f35335c..b268037461d4 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/libSceAvPlayerStreaming.md b/docs/dev/debt/libSceAvPlayerStreaming.md index 3e5621fb3e19..f6155e152e89 100644 --- a/docs/dev/debt/libSceAvPlayerStreaming.md +++ b/docs/dev/debt/libSceAvPlayerStreaming.md @@ -3,3 +3,5 @@ ### Unknown function info - [libSceAvPlayerStreaming pending exports](../../../core/libs/prx/libSceAvPlayerStreaming/Export.cpp) - 33 named callable exports are listed in the [PS5 3.20 export table](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceAvPlayerStreaming.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`. + +- [sceAvPlayerStreamingRegisterVprinf](../../../core/libs/prx/libSceAvPlayerStreaming/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/libsceavplayerstreaming-27cc7363f9.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/libSceAvSetting.md b/docs/dev/debt/libSceAvSetting.md index 56072cafbef6..9569bf18456c 100644 --- a/docs/dev/debt/libSceAvSetting.md +++ b/docs/dev/debt/libSceAvSetting.md @@ -11,6 +11,7 @@ - [sceAvControlSetDefaultVideoOutMode, sceAvControlSetDispclk, sceAvControlSetGamutMetadata, sceAvControlSetHdcpEncryption, sceAvControlSetHdcpStatus](../../../core/libs/prx/libSceAvSetting/Export.cpp) - names and NIDs match the [PS5 3.20 inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceAvSetting.c); signatures and behavior are unverified. No-parameter declarations resolve imports and throw through `NotImplemented_nid_no_patch` when called. - [sceAvControlSetHdmiGamutMetadata, sceAvControlSetHdrMetadata, sceAvControlSetVideoOutSource, sceAvControlSimulateProcessOutputModeArbitration, sceAvSettingAddCallbacks](../../../core/libs/prx/libSceAvSetting/Export.cpp) - names and NIDs match the [PS5 3.20 inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceAvSetting.c); signatures and behavior are unverified. No-parameter declarations resolve imports and throw through `NotImplemented_nid_no_patch` when called. - [sceAvSettingAddCallbacksForLnc, sceAvSettingAddCallbacksForSocialScreen, sceAvSettingCallbackFuncsInit, sceAvSettingCallbackFuncsInitForLnc, sceAvSettingCallbackFuncsInitForLnc_](../../../core/libs/prx/libSceAvSetting/Export.cpp) - names and NIDs match the [PS5 3.20 inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceAvSetting.c); signatures and behavior are unverified. No-parameter declarations resolve imports and throw through `NotImplemented_nid_no_patch` when called. +- [sceAvControlInit2](../../../core/libs/prx/libSceAvSetting/Export.cpp) throws on every call. Its name and NID `Jhcj4HDIw04` are confirmed in the pinned [PS5 13.60 inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libsceavsetting-620714af3c.jsonl); signature and behavior remain unknown. The parameterless `int` declaration is an import placeholder, not a verified prototype or working implementation. - [sceAvSettingCallbackFuncsInit_, sceAvSettingChangeOutputMode, sceAvSettingChangeOutputMode2, sceAvSettingChangeOutputMode3, sceAvSettingChangeOutputModeForDiag](../../../core/libs/prx/libSceAvSetting/Export.cpp) - names and NIDs match the [PS5 3.20 inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceAvSetting.c); signatures and behavior are unverified. No-parameter declarations resolve imports and throw through `NotImplemented_nid_no_patch` when called. - [sceAvSettingChangeProcessAttribute, sceAvSettingCheckCallback, sceAvSettingControlHdcpEncryption, sceAvSettingDebugAddCallbacks, sceAvSettingDebugClearDiagCommand](../../../core/libs/prx/libSceAvSetting/Export.cpp) - names and NIDs match the [PS5 3.20 inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceAvSetting.c); signatures and behavior are unverified. No-parameter declarations resolve imports and throw through `NotImplemented_nid_no_patch` when called. - [sceAvSettingDebugSetDiagState, sceAvSettingDebugSetHdmiMonitorInfo, sceAvSettingDebugSetProcessAttribute, sceAvSettingDriverChangeConnectionStatus, sceAvSettingDriverUpdateStatus](../../../core/libs/prx/libSceAvSetting/Export.cpp) - names and NIDs match the [PS5 3.20 inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceAvSetting.c); signatures and behavior are unverified. No-parameter declarations resolve imports and throw through `NotImplemented_nid_no_patch` when called. @@ -20,9 +21,9 @@ - [sceAvSettingInit, sceAvSettingIsSupportedAudioOutModeByHdmiMonitorInfo, sceAvSettingIsSupportedHdcpVersionByHdmiMonitorInfo, sceAvSettingIsSupportedVideoOutModeByHdmiMonitorInfo, sceAvSettingIsSuspendedProcessOutputModeAvailable](../../../core/libs/prx/libSceAvSetting/Export.cpp) - names and NIDs match the [PS5 3.20 inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceAvSetting.c); signatures and behavior are unverified. No-parameter declarations resolve imports and throw through `NotImplemented_nid_no_patch` when called. - [sceAvSettingIsSuspendedProcessOutputModeAvailable2, sceAvSettingIsVrSupportedByHdmiMonitorInfo2, sceAvSettingNotifyAudioOutMode, sceAvSettingNotifyResponseForSocialScreen, sceAvSettingNotifyUmdEvent](../../../core/libs/prx/libSceAvSetting/Export.cpp) - names and NIDs match the [PS5 3.20 inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceAvSetting.c); signatures and behavior are unverified. No-parameter declarations resolve imports and throw through `NotImplemented_nid_no_patch` when called. - [sceAvSettingNotifyVideoOutMode, sceAvSettingRemoveCallbacks, sceAvSettingRemoveProcessOutputMode, sceAvSettingSet2dVrMode, sceAvSettingSetAudioOutModeAny_](../../../core/libs/prx/libSceAvSetting/Export.cpp) - names and NIDs match the [PS5 3.20 inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceAvSetting.c); signatures and behavior are unverified. No-parameter declarations resolve imports and throw through `NotImplemented_nid_no_patch` when called. -- [sceAvSettingSetAudioOutModeInvalid_, sceAvSettingSetAvOutputMode, sceAvSettingSetDispclk, sceAvSettingSetDisplayBlackLevel, sceAvSettingSetHdcpMode](../../../core/libs/prx/libSceAvSetting/Export.cpp) - names and NIDs match the [PS5 3.20 inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceAvSetting.c); signatures and behavior are unverified. No-parameter declarations resolve imports and throw through `NotImplemented_nid_no_patch` when called. +- [sceAvSettingSetAudioOutModeInvalid_, sceAvSettingSetAvOutputMode, sceAvSettingSetDispclk, sceAvSettingSetHdcpMode](../../../core/libs/prx/libSceAvSetting/Export.cpp) - names and NIDs match the [PS5 3.20 inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceAvSetting.c); signatures and behavior are unverified. No-parameter declarations resolve imports and throw through `NotImplemented_nid_no_patch` when called. - [sceAvSettingSetHdcpStatus, sceAvSettingSetHdmiGamutMetadata_, sceAvSettingSetVideoOutModeAny_, sceAvSettingSetVideoOutModeInvalid_, sceAvSettingSetVideoOutSource](../../../core/libs/prx/libSceAvSetting/Export.cpp) - names and NIDs match the [PS5 3.20 inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceAvSetting.c); signatures and behavior are unverified. No-parameter declarations resolve imports and throw through `NotImplemented_nid_no_patch` when called. -- [sceAvSettingSetVideoOutputColorEffect, sceAvSettingSimulateProcessOutputModeArbitration_, sceAvSettingTerm, sceAvSettingWaitCallback](../../../core/libs/prx/libSceAvSetting/Export.cpp) - names and NIDs match the [PS5 3.20 inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceAvSetting.c); signatures and behavior are unverified. No-parameter declarations resolve imports and throw through `NotImplemented_nid_no_patch` when called. +- [sceAvSettingSetVideoOutputColorEffect, sceAvSettingSimulateProcessOutputModeArbitration_, sceAvSettingWaitCallback](../../../core/libs/prx/libSceAvSetting/Export.cpp) - names and NIDs match the [PS5 3.20 inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceAvSetting.c); signatures and behavior are unverified. No-parameter declarations resolve imports and throw through `NotImplemented_nid_no_patch` when called. - [sceAvControlGetPuTypeByMonitorInfo](../../../core/libs/prx/libSceAvSetting/Export.cpp) (libSceAvSetting) - unknown signature - [sceAvControlIsVideoOutModeSupportedByMonitorInfoWithOptions](../../../core/libs/prx/libSceAvSetting/Export.cpp) (libSceAvSetting) - unknown signature @@ -31,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 @@ -48,3 +86,4 @@ - [sceAvControlSetCheckoutputMode](../../../core/libs/prx/libSceAvSetting/Export.cpp) (libSceAvSetting) - unknown signature - [sceAvControlSetSystemVideoMode](../../../core/libs/prx/libSceAvSetting/Export.cpp) (libSceAvSetting) - unknown signature - [sceAvControlDebugAddCallbacks](../../../core/libs/prx/libSceAvSetting/Export.cpp) (libSceAvSetting) - unknown signature +- [sceAvSettingSetDisplayBlackLevel, sceAvSettingTerm](../../../core/libs/prx/libSceAvSetting/Export.cpp) - on firmware 13.42 both return `0x802A00FF` and do nothing else, measured in an emulator twice with null, small and all-ones arguments ([BunnyFl on #9449](https://github.com/boykopovar/AnyPS5/pull/9449#issuecomment-6401358322)); they return that code here. Signatures and behavior on other firmware are unverified. diff --git a/docs/dev/debt/libSceAvcap2.md b/docs/dev/debt/libSceAvcap2.md index 7e3b3c63cc81..5b4583743106 100644 --- a/docs/dev/debt/libSceAvcap2.md +++ b/docs/dev/debt/libSceAvcap2.md @@ -2,7 +2,15 @@ ### Unknown function info -The 7 exports in [Export.cpp](../../../core/libs/prx/libSceAvcap2/Export.cpp) are declared from the NIDs that the PS5 homebrew project [HearBridge-PS5](https://github.com/X-F1REBALL-X/HearBridge-PS5/blob/main/src/avcap2.c) resolves from `libSceAvcap2` (`avcap2.c`, lines 23-29); each NID was checked to equal the hash of the `sceAvcap2*` name given here. Whether these are all the exports of the PS5 module is unknown, and prototypes and behaviour are unverified: every function takes no parameters in the import-resolution convention and throws through `NotImplemented_nid_no_patch`. +Signatures and behavior are unverified for the 35 additional exports listed below, whose name/NID pairs are recorded in the [13.60 export inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libsceavcap2-9035a2a4ef.jsonl). Parameterless `int` declarations only resolve imports and make no ABI claim; every call throws through `NotImplemented_nid_no_patch`. Not measured on a console. + +- [sceAvcap2AllocateVideoEncoderMemory, sceAvcap2AllocateVideoEncoderMemory2, sceAvcap2FreeEncoderVideoMemory, sceAvcap2GetAudioOutVolume, sceAvcap2GetFramePitch, sceAvcap2GetImagePasteMemory, sceAvcap2GetMicVolume](../../../core/libs/prx/libSceAvcap2/Export.cpp) - unknown signatures and behavior; every call throws. +- [sceAvcap2GetNonVclNalUnitStream, sceAvcap2GetNonVclNalUnitStream2, sceAvcap2GetNonVclNalUnitStream3, sceAvcap2GetRecProhibit, sceAvcap2GetSupportInformation, sceAvcap2GetVideoOutMode, sceAvcap2LockInputDataBuffer](../../../core/libs/prx/libSceAvcap2/Export.cpp) - unknown signatures and behavior; every call throws. +- [sceAvcap2MapMemory, sceAvcap2OpenPadSpk, sceAvcap2OpenVideo, sceAvcap2QueryVideoEncoderMemorySize, sceAvcap2ReadPadSpk, sceAvcap2ReadVideo, sceAvcap2ReadVideo2](../../../core/libs/prx/libSceAvcap2/Export.cpp) - unknown signatures and behavior; every call throws. +- [sceAvcap2RequestKeyFrame, sceAvcap2Select, sceAvcap2SetAudioOutVolume, sceAvcap2SetAudioOutVolumeForRec, sceAvcap2SetChapterOpenLevel, sceAvcap2SetChapterPermissionLevel, sceAvcap2SetImagePaste](../../../core/libs/prx/libSceAvcap2/Export.cpp) - unknown signatures and behavior; every call throws. +- [sceAvcap2SetInvalidFrame, sceAvcap2SetMicVolume, sceAvcap2SetMicVolumeForRec, sceAvcap2SetPrivacyGuard, sceAvcap2SetPrivacyImage, sceAvcap2SetVideoEncodeConfig, sceAvcap2UnlockInputDataBuffer](../../../core/libs/prx/libSceAvcap2/Export.cpp) - unknown signatures and behavior; every call throws. + +The 7 original exports listed below in [Export.cpp](../../../core/libs/prx/libSceAvcap2/Export.cpp) are declared from the NIDs that the PS5 homebrew project [HearBridge-PS5](https://github.com/X-F1REBALL-X/HearBridge-PS5/blob/main/src/avcap2.c) resolves from `libSceAvcap2` (`avcap2.c`, lines 23-29); each NID was checked to equal the hash of the `sceAvcap2*` name given here. Their prototypes and behaviour are unverified: these functions take no parameters in the import-resolution convention and throw through `NotImplemented_nid_no_patch`. - [sceAvcap2Initialize](../../../core/libs/prx/libSceAvcap2/Export.cpp) (libSceAvcap2) - unknown signature (NID svzPXluOz8U) - [sceAvcap2Terminate](../../../core/libs/prx/libSceAvcap2/Export.cpp) (libSceAvcap2) - unknown signature (NID gojqghDU+1Y) diff --git a/docs/dev/debt/libSceAvcap2mvr.md b/docs/dev/debt/libSceAvcap2mvr.md new file mode 100644 index 000000000000..ca1d4510ba4c --- /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/libSceBackupRestoreUtil.md b/docs/dev/debt/libSceBackupRestoreUtil.md index 925f4c078c8e..d013d0c3cfab 100644 --- a/docs/dev/debt/libSceBackupRestoreUtil.md +++ b/docs/dev/debt/libSceBackupRestoreUtil.md @@ -2,4 +2,5 @@ ### Unknown function info +- [sceBackupRestoreUtilCalcRequiredSize, sceBackupRestoreUtilCancelCalcRequiredSize, sceBackupRestoreUtilGetBackupTelemetryInfo, sceBackupRestoreUtilGetRestoreFailedTitles, sceBackupRestoreUtilGetRestoreTelemetryInfo](../../../core/libs/prx/libSceBackupRestoreUtil/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/libscebackuprestoreutil-78effa9f1f.jsonl). - [sceBackupRestoreUtilBackupData, sceBackupRestoreUtilCancelBackupData, sceBackupRestoreUtilCancelGetRequiredSize, sceBackupRestoreUtilCancelGetTitles, sceBackupRestoreUtilCancelRestoreData, sceBackupRestoreUtilDeleteBackupData, sceBackupRestoreUtilGetBackupDataInfo, sceBackupRestoreUtilGetBackupParam, sceBackupRestoreUtilGetBackupProgress, sceBackupRestoreUtilGetRequiredSize, sceBackupRestoreUtilGetRestoreProgress, sceBackupRestoreUtilGetTitles, sceBackupRestoreUtilInitialize, sceBackupRestoreUtilPrepareBackup, sceBackupRestoreUtilRestoreData and sceBackupRestoreUtilTerminate](../../../core/libs/prx/libSceBackupRestoreUtil/Export.cpp) (libSceBackupRestoreUtil) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceBackupRestoreUtil.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/libSceBemp2sys.md b/docs/dev/debt/libSceBemp2sys.md index 558e91e63ada..e719f90a7be0 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 f8e91c27e728..f8123902e2a7 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 000000000000..45193dde5d67 --- /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 be27fc9da405..12df0e604c05 100644 --- a/docs/dev/debt/libSceCamera.md +++ b/docs/dev/debt/libSceCamera.md @@ -2,6 +2,8 @@ ### Unknown function info +- [sceCameraIsVrCaptureEnable](../../../core/libs/prx/libSceCamera/InventoryExports.cpp) (NID `bpet5OSAr1E`) 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 the name and NID are established by the [13.60 export inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libscecamera-4529c174dc.jsonl); not measured on a console. + - [libSceCamera additional exports](../../../core/libs/prx/libSceCamera/InventoryExports.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. | Name | NID | @@ -88,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 000000000000..689c278f551a --- /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 c6a2a8990a95..ccff940e1c8d 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/libSceCesCs.md b/docs/dev/debt/libSceCesCs.md index e32d7f346f1f..1022e41e4f2d 100644 --- a/docs/dev/debt/libSceCesCs.md +++ b/docs/dev/debt/libSceCesCs.md @@ -21,8 +21,9 @@ - [EUC-JP and Shift-JIS encoding](../../../core/libs/prx/libSceCesCs/Export.cpp) (libSceCesCs) with the CP51932 and CP932 profiles gives the result, lengths and bytes a payload process read on a PS5 (firmware 13.60) for every UCS-2 value through `sceCesUcs2StrToMbcsStr` (the test pins a hash of both sweeps): the JIS forms U+00A2, U+00A3, U+00A5, U+00AC, U+2014, U+2016, U+203E, U+2212 and U+301C encode to the cells of their Microsoft forms, U+FEFF is consumed and writes nothing, EUC-JP writes U+0080-U+009F other than U+008E and U+008F as single bytes and answers `UNASSIGNED_CODE` for U+000E, and Shift-JIS answers `0x805C0024` for U+0080-U+009F. Decoding those bytes back is unchanged - [Generic MBCS character and Shift-JIS code helpers](../../../core/libs/prx/libSceCesCs/Export.cpp) (libSceCesCs) - UTF-8/UTF-16 buffer errors and size pointers are unverified. Measured on a PS5: the single-character encoders (`sceCesUtf32ToMbc` over U+0000-U+110001 per profile, surrogates, a one-byte target) give 0x805C0015 for a surrogate, 0x805C0014 past U+10FFFF, the needed length with `DST_BUFFER_END` and 0 otherwise; a rejected decoded character (`sceCesMbcTo*` and each encoding's `To{Ucs2,Utf8,Utf16,Utf32}`, not `sceCesEucJpToUcs2`/`ToUtf8`) stores its length (the bytes before a NUL after the lead, the needed length when truncated, 1 for a bad lead, the sequence for a bad or unassigned trail), a zero UCS-2/UTF-32 character and no UTF-8/UTF-16 units. `sceCesMbcTo*` and `sceCes*ToMbc` take any profile the MBCS context accepts. `sceCesSJisGetCode`/`PutCode` are unchecked; `sceCesSJisCodeToJisX0213` and back use JIS X 0213 annex 1. Signatures follow Orbital - [EUC-JIS-2004 and Shift_JIS-2004 profiles](../../../core/libs/prx/libSceCesCs/JisX0213.hpp) (libSceCesCs) - the errors follow the other JIS profiles, unmeasured; the tables were measured on a PS5 (`sceCesMbcToUtf32` over every one-, two- and `0x8F`-led three-byte sequence, `sceCesUtf32ToMbc` over U+0000-U+110001). Both planes follow Project X0213's JIS X 0213:2004 table with the 90 cells it notes as having a fullwidth form mapped to that form, and also cells 1-17, 1-79 and 2-15 to 2-18 (U+FFE3, U+FFE5, U+FF07, U+FF02, U+FF0D, U+FF5E); U+203E and U+00A5 still encode into 1-17 and 1-79. EUC-JIS-2004's SS3 reads JIS X 0212 in the rows plane 2 leaves empty, both ways, with plane 2 preferred for a code point in both. The 25 cells the standard maps to two code points are unassigned both ways on the console (`A4F7` gives `0x805C0020`; U+304B U+309A encodes U+304B, then fails). Bytes below `0x80` are ASCII. The `sceCesEucJp*` and `sceCesSJis*` scalar helpers keep refusing these two profiles. +- [ISO-2022-JP profiles and string conversions](../../../core/libs/prx/libSceCesCs/Export.cpp) (libSceCesCs) - the signatures follow the MBCS string family by analogy (none in the type database). The UTF-16 and UCS-2 forms share the converters and were not measured separately. `sceCesIso2022UcsContextInit` with a null profile zeroes 256 context bytes and answers `INVALID_PARAMETER`, from a PC run of the firmware 13.42 module, not a console. `sceCesIso2022JpUcsProfileSetSbcs` still throws. Measured on a PS5 through the UTF-32 and UTF-8 forms (every BMP scalar, every designation then every byte and 94x94 pair, 46 strings per profile): RFC 1468 starts in JIS X 0201 Roman (`ESC ( B` and `ESC ( J` both select it) and uses the strict JIS X 0208 table; the code pages start in ASCII and use CP932's table plus the JIS forms. No profile has JIS X 0212. A trailing designation is not counted; one at the buffer end answers `SRC_BUFFER_END`. The encoder returns to the initial set only if it left it. - [Single-byte profiles](../../../core/libs/prx/libSceCesCs/SingleByte.hpp) (libSceCesCs) - the console's tables for these 27 profiles are not verified. Each returns a profile accepted by `sceCesSbcToUtf8`, `sceCesUtf8ToSbc` and the MBCS context conversions, with bytes 0x00-0x7F unchanged and the high half of a public table: ISO 8859-1, -2, -4, -5, -9, -10, -13, -14, -15 and -16 from [unicode.org](https://unicode.org/Public/MAPPINGS/ISO8859/), code pages 437, 737, 775, 850, 852, 855, 860-863, 865 and 866 from [Microsoft's PC tables](https://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/), KOI8-R and KOI8-U from [unicode.org](https://unicode.org/Public/MAPPINGS/VENDORS/MISC/), and 1254, 1256 and 1258 from Microsoft's [best-fit tables](https://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/), whose unassigned bytes map to C1 controls as in Cp1250. Profiles whose public table leaves bytes undefined or maps them to private use still throw - [sceCesRefersUcsProfileCp858](../../../core/libs/prx/libSceCesCs/SingleByte.hpp) (libSceCesCs) - the console's table is not verified. The profile is the Cp850 one with byte 0xD5 mapped to U+20AC instead of U+0131, which is the whole high half of ICU's [ibm-858_P100-1997.ucm](https://github.com/unicode-org/icu-data/blob/main/charset/data/ucm/ibm-858_P100-1997.ucm); bytes 0x00-0x7F stay unchanged as in the other single-byte profiles, not swapped as in IBM's control mapping -- [libSceCesCs firmware 3.20 pending exports](../../../core/libs/prx/libSceCesCs/PendingExports.cpp) - 47 symbol names are present in [the PS5 3.20 libSceCesCs export list](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceCesCs.c). Their signatures and console behaviour are unverified. The declarations use the existing no-parameter unknown-signature convention solely to resolve imports, and every call throws through `NotImplemented_nid_no_patch`. +- [libSceCesCs firmware 3.20 pending exports](../../../core/libs/prx/libSceCesCs/PendingExports.cpp) - 26 symbol names are present in [the PS5 3.20 libSceCesCs export list](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceCesCs.c). Their signatures and console behaviour are unverified. The declarations use the existing no-parameter unknown-signature convention solely to resolve imports, and every call throws through `NotImplemented_nid_no_patch`. - [EUC-KR, UHC and Big5 conversions](../../../core/libs/prx/libSceCesCs/Export.cpp) (libSceCesCs) - the errors are assumed; the decode tables and the Big5 duplicate choices were measured on a PS5 (`sceCesMbcToUtf32` and each `ToUtf8` over every one- and two-byte sequence): UHC and Big5 match, EUC-KR apart from its single bytes. The tables are Microsoft's [CP949.TXT](https://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP949.TXT), plus `0xA2E8` U+327E from KS X 1001:2002, and [CP950.TXT](https://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP950.TXT); EUC-KR is CP949 limited to bytes `0xA1`-`0xFE`, below `0x80` ASCII; the KS X 1003 profile is not implemented. User-defined areas answer `UNASSIGNED_CODE`. Big5 encoding takes the lower of two cells except for U+5341 and U+5345, as a PS5's `sceCesUtf32ToMbc` does for every scalar (CP950 takes the higher cell of U+2550, U+255E, U+2561 and U+256A; the console does not). The profiles tag the caller's sheet like the EUC-JP profile - [ISO 646 variants and JIS X 0201 profiles](../../../core/libs/prx/libSceCesCs/SingleByte.hpp) (libSceCesCs) - the tables and errors were measured on a PS5 with `sceCesSbcToUtf32` over every byte and `sceCesUtf32ToSbc` over every BMP scalar; the other single-byte forms share them and were not measured separately. The 7-bit sets (ASCII, BS 4730, GB 1988-80, JIS X 0201 Roman and Katakana, KS X 1003 and their `Tilde0x7e` variants) answer `INVALID_ENCODE` for bytes `0x80`-`0xFF`. BS 4730 changes only `0x23` (£), GB 1988-80 `0x24` (¥), JIS X 0201 Roman `0x5C` (¥) and KS X 1003 `0x5C` (₩); the base GB, JIS and KS profiles also map `0x7E` to overline and the `Tilde0x7e` variants keep a tilde. The katakana-only profile maps `0x21`-`0x5F` to U+FF61-U+FF9F and leaves `0x60`-`0x7E` unassigned; the 8-bit katakana profiles use `0xA1`-`0xDF`. diff --git a/docs/dev/debt/libSceCffMgr.md b/docs/dev/debt/libSceCffMgr.md new file mode 100644 index 000000000000..30fec26968cb --- /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 3cd9ebcc1506..43d2199a17e5 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/libSceComposite.md b/docs/dev/debt/libSceComposite.md index a83953b5f021..aa5a59ec2511 100644 --- a/docs/dev/debt/libSceComposite.md +++ b/docs/dev/debt/libSceComposite.md @@ -6,4 +6,10 @@ ### Unknown function info +- [sceCompositorGetNullCanvasHandle, sceCompositorIsVirtualCanvasHandle, sceCompositorSetMainPortPixelFormat, sceCompositorGetVirtualCanvasHandle, sceCompositorSetCanvasIdToCanvasHandle, sceCompositorSetMetaIdToCanvasHandle, sceCompositorSetMainPort and sceCompositorSetVirtualCanvasRenderTargetCommand](../../../core/libs/prx/libSceComposite/Export.cpp) - signatures and behavior remain unknown. The parameterless `int` declarations only resolve imports, make no ABI claim and every call throws through `NotImplemented_nid_no_patch`. Names and NIDs are recorded in the [13.60 export inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libscecomposite-23841193cf.jsonl); not measured on a console. + +- [sceCompositorMemoryPoolCommit, sceCompositorGetSecondaryMemorySize, sceCompositorGetMemoryPoolAddress, sceCompositorGetSecondaryMemoryAddress, sceCompositorSecondaryMemoryCreate, sceCompositorGetMemoryPoolSize, sceCompositorPermanentMemoryCreate and sceCompositorMemoryPoolCreate](../../../core/libs/prx/libSceComposite/Export.cpp) - signatures and behavior remain unknown. The parameterless `int` declarations only resolve imports, make no ABI claim and every call throws through `NotImplemented_nid_no_patch`. Names and NIDs are recorded in the [13.60 export inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libscecomposite-23841193cf.jsonl); not measured on a console. + +- [sceCompositorGetTFRing, sceCompositorStopSeeThroughBuffer, sceCompositorSetNativeVrVideoOutMode, sceCompositorWaitEndOfRenderingIfGpuWorking, sceCompositorSetFlipCommand3, sceCompositorSetTFRing and sceCompositorStartSeeThroughBuffer](../../../core/libs/prx/libSceComposite/Export.cpp) - signatures and behavior remain unknown. The parameterless `int` declarations only resolve imports, make no ABI claim and every call throws through `NotImplemented_nid_no_patch`. Names and NIDs are recorded in the [13.60 export inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libscecomposite-23841193cf.jsonl); not measured on a console. + - [sceCompositorAllocateIndex, sceCompositorCheckCrash, sceCompositorCommandGpuPerfBegin, sceCompositorCommandGpuPerfEnd, sceCompositorFlush, sceCompositorFlushWithRepeat, sceCompositorGetAnotherProcessSystemAddress, sceCompositorGetAnotherProcessSystemSize, sceCompositorGetAnotherProcessVideoAddress, sceCompositorGetAnotherProcessVideoSize, sceCompositorGetCanvasHandle, sceCompositorGetClientList, sceCompositorGetDmemOffset, sceCompositorGetDummyAddress, sceCompositorGetDummySize, sceCompositorGetRemainedCommandNum, sceCompositorGetRenderTargetResolution, sceCompositorGetSystemAddress, sceCompositorGetSystemSize, sceCompositorGetVideoAddress, sceCompositorGetVideoSize, sceCompositorHandleProcessEvents, sceCompositorInit, sceCompositorInitWithProcessOrder, sceCompositorInsertThreadTraceMarker, sceCompositorIsDebugCaptureEnabled, sceCompositorIsReady4K, sceCompositorLockCommandBuffer, sceCompositorMakeCanvasHandle, sceCompositorMapAnotherProcess, sceCompositorMemoryPoolDecommit, sceCompositorPrivacyMaskPushArea, sceCompositorQuit, sceCompositorReleaseCommandBuffer, sceCompositorReleaseIndex, sceCompositorReleaseLocalStall, sceCompositorReserveCommandBuffer, sceCompositorResetZoomCommand, sceCompositorSetAgcCompositeCanvasCommand, sceCompositorSetAgcContextCommand, sceCompositorSetCompositeCanvasCommandInC, sceCompositorSetCursorImageAddress, sceCompositorSetDebugPositionCommand, sceCompositorSetEndOfFrameCommand, sceCompositorSetEventCommand, sceCompositorSetFilterType, sceCompositorSetFlipCommand2, sceCompositorSetGameSufaceControlCommand, sceCompositorSetGnmContextCommand, sceCompositorSetInvisibleCanvasCommand, sceCompositorSetKeepDisplayBufferCommand, sceCompositorSetLocalStallCommand, sceCompositorSetMemoryCommand, sceCompositorSetPatchCommand, sceCompositorSetPostEventCommand, sceCompositorSetRepeatCommand, sceCompositorSetResolutionCommand, sceCompositorSetScalingLayoutInfo, sceCompositorSetSeparateContextCommand, sceCompositorSetSystemConfigWithMask, sceCompositorSetVideoOutMode, sceCompositorSetVirtualCanvasAgcContextCommand, sceCompositorSetVirtualCanvasCommandFooter, sceCompositorSetVirtualCanvasPatchCommand, sceCompositorSetVrMode, sceCompositorSetZoomCommand, sceCompositorSystemConfig, sceCompositorWaitEndOfRendering, sceCompositorWaitEvent, sceCompositorWaitPostEvent, sceCompsoitorGetGpuClock, sceCompsoitorGetProcessRenderingTime and sceCompsoitorGetRenderingTime](../../../core/libs/prx/libSceComposite/Export.cpp) (libSceComposite) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceComposite.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/libSceConnectAccountDialog.md b/docs/dev/debt/libSceConnectAccountDialog.md new file mode 100644 index 000000000000..86fd83fcc5d2 --- /dev/null +++ b/docs/dev/debt/libSceConnectAccountDialog.md @@ -0,0 +1,17 @@ +# libSceConnectAccountDialog technical debt + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceConnectAccountDialog/Export.cpp) - 7 entries observed in a 3.20-labelled image and a later 13.60-labelled image are import-resolution declarations only. Neither image label authenticates 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). + +[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 | +| --- | --- | +| `sceConnectAccountDialogClose` | `9ShAQi6BXhg` | +| `sceConnectAccountDialogGetResult` | `T+wthkoDDFE` | +| `sceConnectAccountDialogGetStatus` | `BsY6ldG11CU` | +| `sceConnectAccountDialogInitialize` | `41VeaFH-BlE` | +| `sceConnectAccountDialogOpen` | `5dDAY+FchRM` | +| `sceConnectAccountDialogTerminate` | `pr2u71StfRo` | +| `sceConnectAccountDialogUpdateStatus` | `B24oCJO6Awg` | diff --git a/docs/dev/debt/libSceContentListController.md b/docs/dev/debt/libSceContentListController.md new file mode 100644 index 000000000000..55416a254e3f --- /dev/null +++ b/docs/dev/debt/libSceContentListController.md @@ -0,0 +1,29 @@ +# libSceContentListController technical debt + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceContentListController/Export.cpp) - 19 entries observed in a 3.20-labelled image and a later 13.60-labelled image are import-resolution declarations only. Neither image label authenticates 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). + +[Version-pinned selected ELF export records](https://gist.github.com/kyon-eth/752e1b1d4a6ac8a26c97e693527fefbd/a7bddd315c7740a7d065af9e80b0447fcd5b91be) 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 module. The extract SHA-256 is `63256453dc9620091ce6af95f8b243b7da8f2ce76a585f4886f76aa6625b5b21`; its full-module sorted-function-NID digests and raw module-parameter words permit independent comparison. The extract is an analyst-produced metadata record, not independent authentication of the original images or proof of prototypes or behavior. The separately published 3.20 source catalog has no module file for this library. + +| Name | NID | +| --- | --- | +| `sceCLCClearFileList` | `nAF1xF5QRHk` | +| `sceCLCClearTrackList` | `yx2QM7H-nww` | +| `sceCLCGetDeviceInfo` | `dYe+SpaG3vI` | +| `sceCLCGetDeviceList` | `Aqs-JQ9uJUc` | +| `sceCLCGetFileInfo` | `cq8s1ijWULA` | +| `sceCLCGetFileList` | `GvFZOeEJ9aw` | +| `sceCLCGetFileListInfo` | `tulcX6FKfk0` | +| `sceCLCGetFolderInfo` | `lm4JK2NTzoA` | +| `sceCLCGetShuffle` | `2Vf60vmDN3A` | +| `sceCLCGetTrackInfo` | `ZidmCssGGUs` | +| `sceCLCGetTrackList` | `HECulNjRDBA` | +| `sceCLCGetTrackListInfo` | `H1lNYyrbrlQ` | +| `sceCLCGetUsbStorageCallback` | `DGHwTmra1QE` | +| `sceCLCRegisterEventCallback` | `ujyPLnX7SlE` | +| `sceCLCSetPlaybackResult` | `GC51I89ii44` | +| `sceCLCSetShuffle` | `EPOYwPzb14s` | +| `sceCLCSetTrackList` | `5nwdtz34v7I` | +| `sceCLCSetUsbStorageCallback` | `037hAMY7tHY` | +| `Unknown` | `SoBk-kuNLsE` | diff --git a/docs/dev/debt/libSceContentSearch.md b/docs/dev/debt/libSceContentSearch.md index ccb59cc6a2ed..8051fd4b39eb 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/libSceCustomMusicAudioOut.md b/docs/dev/debt/libSceCustomMusicAudioOut.md index 15ca7e3fa546..c0fff727bcf0 100644 --- a/docs/dev/debt/libSceCustomMusicAudioOut.md +++ b/docs/dev/debt/libSceCustomMusicAudioOut.md @@ -3,3 +3,5 @@ ### Unknown function info - [sceCustomMusicAudioOutFinalize, sceCustomMusicAudioOutGetAllMusicVolume, sceCustomMusicAudioOutGetMuted, sceCustomMusicAudioOutGetVolume and sceCustomMusicAudioOutSetAllMusicVolume](../../../core/libs/prx/libSceCustomMusicAudioOut/Export.cpp) (libSceCustomMusicAudioOut) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceCustomMusicAudioOut.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 + +- [sceCustomMusicAudioOutGetLastOutputTime, sceCustomMusicAudioOutInitialize, sceCustomMusicAudioOutOutput, sceCustomMusicAudioOutSetMuted, sceCustomMusicAudioOutSetVolume](../../../core/libs/prx/libSceCustomMusicAudioOut/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/libscecustommusicaudioout-b0940f5719.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/libSceCustomMusicCore.md b/docs/dev/debt/libSceCustomMusicCore.md index 9ffaf08475c3..76736e396410 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 000000000000..23ea10e415eb --- /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 34655c5a6cde..7cd330b31567 100644 --- a/docs/dev/debt/libSceDataTransfer.md +++ b/docs/dev/debt/libSceDataTransfer.md @@ -2,4 +2,9 @@ ### Unknown function info +- [sceDataTransferAbortAuthPS5, sceDataTransferAbortFgTransferPS5, sceDataTransferAbortLaunchPS4, sceDataTransferAbortLaunchPS5, sceDataTransferAbortPS5Request, sceDataTransferAbortRequestBeforeFgTransferPS5, sceDataTransferAbortSearchPS5](../../../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). +- [sceDataTransferEventIsAuthReadyPS4, sceDataTransferEventIsPwrReqReadyPS4, sceDataTransferEventIsPwrReqReadyPS5, sceDataTransferGetFgTransferProgressPS5, sceDataTransferGetPS4RebootData, sceDataTransferHostNotifyEasySignInReady, sceDataTransferRequestAuthPS4](../../../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). +- [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 9a67891d106e..1ddfa684820f 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 ee4e1f9b5c41..568f0d9d906a 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/libSceDipsw.md b/docs/dev/debt/libSceDipsw.md index cebac2c8b781..90189d7977ae 100644 --- a/docs/dev/debt/libSceDipsw.md +++ b/docs/dev/debt/libSceDipsw.md @@ -1,5 +1,6 @@ # libSceDipsw technical debt ### Unknown function info +- [sceKernelGetDiableBinaryVersionCheckValue](../../../core/libs/prx/libSceDipsw/Export.cpp) throws on every call. Its name and NID `LLKjFBEhTrc` are confirmed in the pinned [PS5 13.60 inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libscedipsw-f4b41af254.jsonl); signature and behavior remain unknown. The parameterless `int` declaration is an import placeholder, not a verified prototype or working implementation. - [sceKernelCheckDipsw, sceKernelInitializeDipsw, sceKernelIsAssistMode, sceKernelIsDevelopmentMode, sceKernelIsDisableRazor, sceKernelReadDipswData, sceKernelSetDipsw, sceKernelUnsetDipsw and sceKernelWriteDipswData](../../../core/libs/prx/libSceDipsw/Export.cpp) (libSceDipsw) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceDipsw.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/libSceDiscMap.md b/docs/dev/debt/libSceDiscMap.md index b058be4747c7..604eeb0732bb 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/libSceEditMp4.md b/docs/dev/debt/libSceEditMp4.md index 9619922e39ea..fbe006c17459 100644 --- a/docs/dev/debt/libSceEditMp4.md +++ b/docs/dev/debt/libSceEditMp4.md @@ -1,5 +1,10 @@ # libSceEditMp4 technical debt +### Silent stubs + +- [sceEditMp4QueryMemSize](../../../core/libs/prx/libSceEditMp4/Export.cpp) (libSceEditMp4) - returns 0x387d30 and reads no argument, as firmware 13.42's libSceEditMp4.sprx does (read from its disassembly and run natively on x86-64, not a console): the value is the sum of four internal functions that return constants and 0x980. Whether the public prototype has unused parameters is not established. + ### Unknown function info -- [sceEditMp4Abort, sceEditMp4Edit, sceEditMp4GetStatus, sceEditMp4Initialize, sceEditMp4InitializeParam, sceEditMp4QueryMemSize, sceEditMp4SetFinishCallback, sceEditMp4Terminate and sceEditMp4Unite](../../../core/libs/prx/libSceEditMp4/Export.cpp) (libSceEditMp4) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceEditMp4.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 +- [sceEditMp4Abort, sceEditMp4Edit, sceEditMp4GetStatus, sceEditMp4Initialize, sceEditMp4SetFinishCallback, sceEditMp4Terminate and sceEditMp4Unite](../../../core/libs/prx/libSceEditMp4/Export.cpp) (libSceEditMp4) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceEditMp4.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 +- [sceEditMp4InitializeParam](../../../core/libs/prx/libSceEditMp4/Export.cpp) (libSceEditMp4) - the size of the parameter structure and the meaning of its fields are unknown. It follows firmware 13.42's libSceEditMp4.sprx, read from its disassembly and run natively on x86-64 (not a console): it returns nothing, ignores a null pointer and otherwise clears bytes 0 to 15, stores the 64-bit value 0x3f at offset 16 and the 32-bit value 700 at offset 24, and leaves the bytes from offset 28 unchanged. diff --git a/docs/dev/debt/libSceErrorDialog.md b/docs/dev/debt/libSceErrorDialog.md index 33a1e3ad3b56..4b27a90ddc1a 100644 --- a/docs/dev/debt/libSceErrorDialog.md +++ b/docs/dev/debt/libSceErrorDialog.md @@ -2,8 +2,9 @@ ### Silent stubs -- [libSceErrorDialog](../../../core/libs/prx/libSceErrorDialog/Export.cpp) - the error dialog runs the state machine but shows nothing; the error code passed to `sceErrorDialogOpen` is only logged +- [libSceErrorDialog](../../../core/libs/prx/libSceErrorDialog/Export.cpp) - the error dialog shows UI only while the video output has a window to draw it and no other dialog is shown and a flip draws it within three seconds; otherwise it runs the state machine, finishes on the first `sceErrorDialogUpdateStatus` call and the error code passed to `sceErrorDialogOpen` is only logged ### Unknown function info - [sceErrorDialogOpenDetail, sceErrorDialogOpenWithReport](../../../core/libs/prx/libSceErrorDialog/Export.cpp) (libSceErrorDialog) - their names and NIDs are in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceErrorDialog.c); the no-parameter prototypes follow [shadPS4 `error_dialog.cpp`](https://github.com/shadps4-emu/shadPS4/blob/f68923fe807f657348e6719ce658bcbd0a2b1c72/src/core/libraries/ime/error_dialog.cpp#L167-L172) and are not measured on a console. They are declared without parameters solely to resolve known imports. This is not an ABI claim. Both currently return `kErrUnexpectedFatal` (`0x80ED0004`); this return behavior is covered by unit tests but has not been independently verified on console hardware. +- [sceErrorDialogOpen](../../../core/libs/prx/libSceErrorDialog/include/ErrorDialogRequest.hpp) (libSceErrorDialog) - the overlay dialog is not modelled on a PS5: the wording `An error occurred.` and `Error code:` and the label OK are the host's own and English, the code is shown as eight hex digits, and no text is looked up for the code. The 16-byte parameter is not measured beyond the size, error code and user id the function already reads. Closes when: measured on a PS5 diff --git a/docs/dev/debt/libSceEsvm.md b/docs/dev/debt/libSceEsvm.md index 099c999a95c4..ff5986e11208 100644 --- a/docs/dev/debt/libSceEsvm.md +++ b/docs/dev/debt/libSceEsvm.md @@ -2,4 +2,54 @@ ### Unknown function info +- [Additional libSceEsvm exports](../../../core/libs/prx/libSceEsvm/Export.cpp) - the 45 name/NID pairs below are defined function exports in the pinned [13.60-labelled inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libsceesvm-84c73245ba.jsonl). Their signatures and behavior are unknown; parameterless `int` declarations are import placeholders, not verified ABI prototypes. Every call throws through `NotImplemented_nid_no_patch`. No media processing, decryption or output behavior is implemented. The inventory label is not an independent console measurement. + +| Name | NID | +| --- | --- | +| `sceEsvmAddDecoder` | `2ALGsNZHUQY` | +| `sceEsvmAddDecoder2` | `ZqZiBfUv89c` | +| `sceEsvmCheckCallback` | `U9B-hD7Sqb4` | +| `sceEsvmCreateContext` | `047hNdtrcw4` | +| `sceEsvmCreateMediaKeySession` | `0I6PyLF6VGw` | +| `sceEsvmCreateMediaKeys` | `tTiBOviUHz4` | +| `sceEsvmDestroyContext` | `wOdoqv-EiKU` | +| `sceEsvmDestroyMediaKeySession` | `iCEcrEPsshU` | +| `sceEsvmDestroyMediaKeySystemAccess` | `pMHQM54XuSs` | +| `sceEsvmDestroyMediaKeys` | `Qww8wL0TmCk` | +| `sceEsvmFlush` | `w2N939ABS2Y` | +| `sceEsvmInitialize` | `h59QfNm3QKU` | +| `sceEsvmMediaKeySessionClose` | `TwlVpcBFeBM` | +| `sceEsvmMediaKeySessionDecryptAudioData` | `5Mq8RIwHCQ4` | +| `sceEsvmMediaKeySessionGenerateRequest` | `CD4uF8+rvIA` | +| `sceEsvmMediaKeySessionGetExpiration` | `Ket33imTVLw` | +| `sceEsvmMediaKeySessionGetKeyStatuses` | `aswwrgJ7I7k` | +| `sceEsvmMediaKeySessionGetSessionId` | `GKKv1LQWTIE` | +| `sceEsvmMediaKeySessionLoad` | `eSsrvlpgLtQ` | +| `sceEsvmMediaKeySessionRemove` | `LtFvG9euwwo` | +| `sceEsvmMediaKeySessionUpdate` | `QaDDoPYv9BY` | +| `sceEsvmMute` | `X33X6RmLLX0` | +| `sceEsvmPause` | `+iomwyWJU4o` | +| `sceEsvmPlay` | `fIdN5WzxNXg` | +| `sceEsvmPushAccessUnit` | `1XFXci4p4uU` | +| `sceEsvmReleaseVideoFrame` | `nz-tYwNrKAQ` | +| `sceEsvmRender` | `7h7bYwQQoOg` | +| `sceEsvmRenderById` | `dYfk+OPPpZU` | +| `sceEsvmSetAudiblePlaybackRate` | `A-fwc6NXEGA` | +| `sceEsvmSetCodecConfig` | `hG0sePjh+jk` | +| `sceEsvmSetPlaybackRate` | `DzqQnbjNcUo` | +| `sceEsvmSetVolume` | `Vpcm2hauAJs` | +| `sceEsvmTerminate` | `39VZ-wS-7mI` | +| `sceEsvmVideoOutAllowOutputResolutionWqhdDetection` | `yhZXWGA5+bM` | +| `sceEsvmVideoOutConfigureOutputEx` | `5pEox4L+M70` | +| `sceEsvmVideoOutGetMonitorInfo` | `UbQ5Ly--4bY` | +| `sceEsvmVideoOutGetOutputStatus` | `7iomFnqJKm8` | +| `sceEsvmVideoOutInitializeOutputOptions` | `GeTQwXMknSg` | +| `sceEsvmVideoOutIsHdcp14Enabled` | `GB2M1HPufrw` | +| `sceEsvmVideoOutIsHdcp23Enabled` | `LLr7I+Z8JgM` | +| `sceEsvmVideoOutIsOutputSupportedByMonitorInfo` | `7eWKfQClQ7M` | +| `sceEsvmVideoOutIsPortDeviceConnected` | `vD3nEWBfhLY` | +| `sceEsvmVideoOutIsPortStatusUsable` | `ouGTOwK1yDc` | +| `sceEsvmVideoOutSetContentDynamicRange` | `UEd8lhAwqXw` | +| `sceEsvmVideoOutSetContentType` | `oUGLWJNfVwM` | + - [sceEsvmAppAudioSyncCreateContext, sceEsvmAppAudioSyncFlush and sceEsvmSyncVideo](../../../core/libs/prx/libSceEsvm/Export.cpp) (libSceEsvm) - signatures and behavior are unverified; these parameterless declarations only resolve imports and throw through `NotImplemented_nid_no_patch`. diff --git a/docs/dev/debt/libSceEsvmEngine.md b/docs/dev/debt/libSceEsvmEngine.md index c7fd38798366..f7a97cafdc92 100644 --- a/docs/dev/debt/libSceEsvmEngine.md +++ b/docs/dev/debt/libSceEsvmEngine.md @@ -2,4 +2,57 @@ ### Unknown function info +- [Additional libSceEsvmEngine exports](../../../core/libs/prx/libSceEsvmEngine/Export.cpp) - the 13 name/NID pairs below are defined function exports in the pinned [13.60-labelled inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libsceesvmengine-c1d3867cc5.jsonl). Their signatures and behavior are unknown; parameterless `int` declarations are import placeholders, not verified ABI prototypes. Every call throws through `NotImplemented_nid_no_patch`. No media processing, decryption or output behavior is implemented. The inventory label is not an independent console measurement. + +| Name | NID | +| --- | --- | +| `sceEsvmEngineAddDecoder2` | `Ta5fE19XPak` | +| `sceEsvmEngineAppAudioSyncFlush` | `X-FCXoSphI8` | +| `sceEsvmEngineGetMetrics` | `gh3Zne9NOHc` | +| `sceEsvmEngineGetVideoPlaybackQuality` | `N8XIjTVfG0I` | +| `sceEsvmEngineInitializeCdm` | `RoPRqUDZyZ8` | +| `sceEsvmEngineMediaKeySessionDecryptAudioData` | `tRvIFde5wIY` | +| `sceEsvmEngineMediaKeysDecryptAudioData` | `bJlgPqkTyHI` | +| `sceEsvmEngineMediaKeysSetAppParameter` | `oTDWoz5VJ4c` | +| `sceEsvmEngineProcessAckResponse` | `RIWSlTAAgO4` | +| `sceEsvmEngineReleaseVideoFrame` | `hrURCROOha8` | +| `sceEsvmEngineSetAudiblePlaybackRate` | `SVxIJmOxpaA` | +| `sceEsvmEngineSetMediaKeys` | `KkzmX+PA+Hg` | +| `sceEsvmEngineSyncVideo` | `ZybN1iURGkk` | + - [sceEsvmEngineDestroyMediaKeySystemAccess, sceEsvmEngineMediaKeySessionClose, sceEsvmEngineMediaKeySessionGenerateRequest, sceEsvmEngineMediaKeySessionGetExpiration, sceEsvmEngineMediaKeySessionGetKeyStatuses, sceEsvmEngineMediaKeySessionGetSessionId, sceEsvmEngineMediaKeySessionLoad, sceEsvmEngineMediaKeySessionRemove, sceEsvmEngineMediaKeySessionSetEventHandler, sceEsvmEngineMediaKeySessionUpdate, sceEsvmEngineMediaKeySystemAccessCreateMediaKeys, sceEsvmEngineMediaKeySystemAccessDestroyMediaKeys, sceEsvmEngineMediaKeySystemAccessGetConfiguration, sceEsvmEngineMediaKeySystemAccessSetCdmStorageConfig, sceEsvmEngineMediaKeysCreateSession, sceEsvmEngineMediaKeysDestroySession, sceEsvmEngineMediaKeysSetEventHandler, sceEsvmEngineMediaKeysSetServerCertificate and sceEsvmEngineRequestMediaKeySystemAccess](../../../core/libs/prx/libSceEsvmEngine/Export.cpp) (libSceEsvmEngine) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceEsvmEngine.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/libSceEsvmEngine/Export.cpp) - 26 entries observed in a 3.20-labelled image and a later 13.60-labelled image are import-resolution declarations only. Neither image label authenticates 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). + +[Version-pinned selected ELF export records](https://gist.github.com/kyon-eth/752e1b1d4a6ac8a26c97e693527fefbd/a7bddd315c7740a7d065af9e80b0447fcd5b91be) 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 module. The extract SHA-256 is `63256453dc9620091ce6af95f8b243b7da8f2ce76a585f4886f76aa6625b5b21`; its full-module sorted-function-NID digests and raw module-parameter words permit independent comparison. The extract is an analyst-produced metadata record, not independent authentication of the original images or proof of prototypes or behavior. The separately published 3.20 source catalog has a module file but none of these selected NIDs. + +| Name | NID | +| --- | --- | +| `sceEsvmEngineAddDecoder` | `D4Ex5rUqcBM` | +| `sceEsvmEngineCreateContext` | `LOxl2o7S5EY` | +| `sceEsvmEngineDbgOverrideMediaKeySession` | `XE8RBNi6sUo` | +| `sceEsvmEngineDeleteContext` | `b7eplMCoF0g` | +| `sceEsvmEngineFlush` | `HHrTPYewPsA` | +| `sceEsvmEngineGetAudioFrame` | `B627rbCsTAs` | +| `sceEsvmEngineGetPlaybackRate` | `mTNCGmnJUkw` | +| `sceEsvmEngineGetProvisioningRequest` | `9biIbMBK5Ko` | +| `sceEsvmEngineGetServiceCertificateRequest` | `qp4iYAwTVOs` | +| `sceEsvmEngineGetVideoFrame` | `2GTglBJoeUI` | +| `sceEsvmEngineHandleProvisioningResponse` | `Ec5R6hlGOi0` | +| `sceEsvmEngineInitialize` | `fo4jUOJKgLQ` | +| `sceEsvmEngineIsProvisioned` | `O-viosYkkcA` | +| `sceEsvmEngineMediaKeySystemAccessCreateMediaKeys2` | `-14JqmMs00Y` | +| `sceEsvmEngineMediaKeySystemAccessGetKeySystem` | `r1PRJWghAn0` | +| `sceEsvmEngineParseAndLoadServerCertificateResponse` | `1MtR379QDeI` | +| `sceEsvmEnginePause` | `mCIo3hBAOcg` | +| `sceEsvmEnginePlay` | `2K+lAUqbQRU` | +| `sceEsvmEnginePushAccessUnit` | `mi7i29zTaIg` | +| `sceEsvmEngineQueryVideoMemory` | `pHP1Q3qF5ps` | +| `sceEsvmEngineRemoveDecoder` | `8Q9MxnhfP3M` | +| `sceEsvmEngineSetPlaybackRate` | `Mi+eloAOsKs` | +| `sceEsvmEngineSetServerCertificate2` | `bdutxKejMx8` | +| `sceEsvmEngineTerminate` | `e2j1lH088qw` | +| `Unknown` | `TLCfQqZ-6AU` | +| `Unknown` | `Y6Rtwfuj0Bw` | diff --git a/docs/dev/debt/libSceFlexContent.md b/docs/dev/debt/libSceFlexContent.md new file mode 100644 index 000000000000..9f7fdbf225de --- /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 a5b224d4f9dd..91b0dfc3a3fd 100644 --- a/docs/dev/debt/libSceFont.md +++ b/docs/dev/debt/libSceFont.md @@ -5,6 +5,18 @@ - [sceFontRenderCharGlyphImage, sceFontRenderCharGlyphImageHorizontal, sceFontRenderCharGlyphImageVertical](../../../core/libs/prx/libSceFont/src/Layout.cpp) (libSceFont) accept a surface whose width or height is 0, with any row stride, and return the glyph metrics and an empty update rectangle without writing to the surface. A negative width, height or stride, a zero stride on a surface with pixels, a null buffer and a pixel size other than 1 or 4 bytes still return `SCE_FONT_ERROR_NO_SUPPORT_SURFACE`; those cases and the exact console result for a zero-extent surface are not measured. The extent-0 behaviour is inferred from the Tekken Dark Resurrection PSP emulator which, to measure a string, initialises the surface with width 0 and height 31 and an unbound stride, renders each character and sums the returned advances. +The 44 additional exports below have unknown signatures and behavior. Their parameterless `int` declarations are import-resolution placeholders, not confirmed ABI signatures; every call throws through `NotImplemented_nid_no_patch`. Only 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/libscefont-63ba420c2e.jsonl). They have not been measured on a console. + +- [sceFontGraphicsCanvasStartDrawing, sceFontGraphicsGetDrawingFrameHandle, sceFontGraphicsGetIndexedVertexesGlyph, sceFontGraphicsProcessWaitAllSequences, sceFontGraphicsStructureVertexesGlyph, sceFontGraphicsTextureRefersSurface](../../../core/libs/prx/libSceFont/src/Unimplemented.cpp) - unknown signatures and behavior; every call throws. +- [sceFontGraphicsUndefineIndexedVertexesGlyph, sceFontGraphicsAppendGradientSegment, sceFontSupportSystemUpdation, sceFontGraphicsCanvasRenewal, sceFontGraphicsDesignStartDrawing, sceFontGraphicsGetVertexesGlyphMetrics](../../../core/libs/prx/libSceFont/src/Unimplemented.cpp) - unknown signatures and behavior; every call throws. +- [sceFontGraphicsUpdateSlantShift, sceFontGraphicsTextureMakeFillTexture, sceFontGraphicsTextureMakeFillTextureImage, sceFontGraphicsCanvasSetSurfaceFill, sceFontGraphicsDrawVertexesGlyph, sceFontGraphicsDrawRegionShape](../../../core/libs/prx/libSceFont/src/Unimplemented.cpp) - unknown signatures and behavior; every call throws. +- [sceFontGraphicsProcessWaitSequence, sceFontGraphicsTextureGetSurface, sceFontGraphicsUndefineIndexedVertexesGlyphs, sceFontGetCharVariationGlyphCode, sceFontGraphicsSetupSlantShift, sceFontGraphicsAdjustFillRadialGradient](../../../core/libs/prx/libSceFont/src/Unimplemented.cpp) - unknown signatures and behavior; every call throws. +- [sceFontGraphicsDrawupFillFlatColor, sceFontGraphicsDrawupFillLinearGradient, sceFontGraphicsSetVertexesGlyphScale, sceFontGlyphGetOutlineVertexes, sceFontGraphicsDrawupFillRadialGradient, sceFontGraphicsAdjustGradientSpread](../../../core/libs/prx/libSceFont/src/Unimplemented.cpp) - unknown signatures and behavior; every call throws. +- [sceFontGraphicsCanvasSetSurfaceFillWithLayout, sceFontGraphicsCanvasGetPreprocess, sceFontGraphicsReportError, sceFontGraphicsDrawRectangleShape, sceFontGraphicsProcessSetSyncPolicy, sceFontGraphicsCanvasSetSurfaceFillWithMapping](../../../core/libs/prx/libSceFont/src/Unimplemented.cpp) - unknown signatures and behavior; every call throws. +- [sceFontGraphicsUndefineIndexedVertexesGlyphAll, sceFontGraphicsGetVertexesGlyphScale, sceFontGraphicsCanvasClearPreprocess, sceFontGraphicsFindIndexedVertexesGlyph, sceFontGraphicsDefineIndexedVertexesGlyph, sceFontGraphicsProcessRenderSequence](../../../core/libs/prx/libSceFont/src/Unimplemented.cpp) - unknown signatures and behavior; every call throws. +- [sceFontOutlineVertexesInterfaceInit, sceFontGraphicsSurfaceSetTargetView](../../../core/libs/prx/libSceFont/src/Unimplemented.cpp) - unknown signatures and behavior; every call throws. + + - [sceFontCreateString](../../../core/libs/prx/libSceFont/src/Text.cpp): a string created from a default-form (0x10) text source gets the direction of its first strong character, 0x11 for right to left and 0x12 for left to right, and 0x12 when there is none; explicit 0x11 and 0x12 sources keep their form and [sceFontStringGetWritingForm](../../../core/libs/prx/libSceFont/src/Text.cpp) returns the stored form. LRM and RLM count as strong, embeddings and overrides do not, and text between an isolate initiator and its PDI is skipped. The rule follows a run of the firmware 13.42 library in a harness reported on the pull request: for non-empty text it was checked before a later glyph-stage failure and only empty text completed, so it is not full native right-to-left rendering. Which characters are strong is decided here by Unicode block ranges, not by the full bidi class tables. - [sceFontRenderCharGlyphImage, sceFontRenderCharGlyphImageHorizontal, sceFontRenderCharGlyphImageVertical](../../../core/libs/prx/libSceFont/src/Layout.cpp) (libSceFont) - four titles disassembled for this entry import them: PPSA01530 (CharGlyphImage, 2 call sites), PPSA13356 (CharGlyphImage, 4), PPSA15246 (Horizontal, 3) and PPSA14421 (Horizontal, 1); none imports Vertical. PPSA13356 initialises two surfaces of 64 x 64 and 1920 x 1080 at 1 byte per pixel (0xba084, 0xba5e8) and calls again with the character '_' (0x5f) at 0xba111 when the first call (0xba0e2) returns nonzero; PPSA15246 (0x229413) and PPSA14421 (0x1054d8) do not test the result. The extents of the other surfaces are run-time values, so whether any title passes 0 is not shown. @@ -20,9 +32,9 @@ - [sceFontCharacterGetSyllableStringState](../../../core/libs/prx/libSceFont/src/Text.cpp) (libSceFont) - the signature `(textCharacter, int* syllableStringState)` follows [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/main/src/SharpProspero/Interop/Font/SceFont.Engine.cs). Measured on PS4 firmware 11.00 `libSceFont.sprx` (not on a PS5): the state is 0 for Latin, CJK, Hangul, Arabic, Hebrew, Devanagari and the other scripts tried, and the library sets 1, 3 or 4 (never 2 on real text) for Thai while it creates the string; a null character or a null result returns `SCE_FONT_ERROR_INVALID_PARAMETER`, and a null character writes 0 to a non-null result. This returns 0 for every character outside the Thai block (U+0E00 to U+0E7F), as [KytyPS5](https://github.com/KytyPS5/KytyPS5/blob/d2413fc2ebd91d1b7234197c2dd5bd48e1cb6a51/src/libs/libFont.cpp#L1805-L1815) does, and throws for Thai characters, whose cluster states are not modelled. SharpProspero's `SceFontSyllableString` names 0 NonDetection, 1 Starting, 2 Following, 3 Depending and 4 Connecting. PPSA06699 (Hot Shots Golf 2) calls it. - [sceFontCharactersRefersTextCodes, sceFontTextCodesStepNext and sceFontTextCodesStepBack](../../../core/libs/prx/libSceFont/src/Text.cpp) (libSceFont) - the signatures follow the [Orbital](https://github.com/AlexAltea/orbital/blob/cc408367da6a6ebbf5ac1ac559fefeadc73b2831/tools/ida/db_types.json#L679) IDA type database and [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/5dfdb4b0b166e83dc9ae275001afb695f12c7174/src/SharpProspero/Interop/Font/SceFont.Engine.cs#L395-L406), and the 64-byte `FontTextCodes` with the order pointer at 0 and the code at 8 follows SharpProspero's [SceFontTextCodes](https://github.com/SvenGDK/SharpProspero/blob/5dfdb4b0b166e83dc9ae275001afb695f12c7174/src/SharpProspero/Interop/Font/SceFontStructs.cs#L216-L228). The traversal follows the PS4 11.00 `libSceFont.sprx` disassembly posted in [#4050](https://github.com/boykopovar/AnyPS5/pull/4050#issuecomment-6114504202), not a PS5 measurement: the cursor keeps the current, start and term characters at +0x28, +0x30 and +0x38; `Refers` never compares the character with the term and returns null for a clustered or synthetic character; `StepNext` returns null at the term after visiting it; `StepBack` returns null when the current character is the start; both steps skip synthetic characters. Assumed and not covered by the report, which says `StepNext` returns null only at the term: `StepNext` also returns null at the end of the chain (for example with a null term), and `StepBack` at the head of the chain. A null cursor or output returns null as in [KytyPS5](https://github.com/KytyPS5/KytyPS5/blob/d2413fc2ebd91d1b7234197c2dd5bd48e1cb6a51/src/libs/libFont.cpp#L1696-L1740); a null text character throws, as its console result is unknown -- [sceFontGraphicsDrawupFillTextureImageObject, sceFontGraphicsDrawupFillTexturePatternObject](../../../core/libs/prx/libSceFont/src/Unimplemented.cpp) (libSceFont) - still throwing. Both have bodies in the 4.03 `libSceFont.sprx` (670 and 871 bytes); the signature `(graphicsObject, fillObject, mode, out, x, y, w, h)` with an `int` error return is confirmed two ways. 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). PPSA20397's `libSceFontGsm.prx` caller confirms the argument construction: it 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. On valid input the body 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 +- [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. @@ -45,11 +57,11 @@ Frame lifecycle, drawing completion, device usage, frame policy, clipping and fi Positioning takes a mask and two floats. Control, word-character search and resource release/exchange/render signatures in [Unimplemented.cpp](../../../core/libs/prx/libSceFont/src/Unimplemented.cpp) are recovered; control payload types depend on the command and remain unmodeled. -Canvas, design, surface texture and fill-pattern construction signatures in [Unimplemented.cpp](../../../core/libs/prx/libSceFont/src/Unimplemented.cpp) are recovered. Pattern mode/count semantics and the graphics surface descriptor fields still require reconstruction; distinct opaque types preserve the confirmed object categories. +Canvas, design and surface texture construction signatures in [Unimplemented.cpp](../../../core/libs/prx/libSceFont/src/Unimplemented.cpp) are recovered. For the two drawup texture producers, the ABI described above places four pointer/integer arguments in integer registers and the rectangle in XMM0-XMM3; the former pattern declaration incorrectly passed the rectangle through integer registers. The PPSA20397 caller reads the mode from an 8-bit field at +0xf; the handling of the upper 24 bits of the ABI parameter has not been measured. Texture pattern payload semantics and graphics surface descriptor fields still require reconstruction; distinct opaque types preserve confirmed object categories. [Unimplemented.cpp](../../../core/libs/prx/libSceFont/src/Unimplemented.cpp) now defines the 32-byte fill method, 64-byte fill plot/rates and 96-byte device usage layouts, with size and field-offset assertions. Uninterpreted descriptor tails remain reserved; pool statistics expose capacity, current usage, available bytes, peak and signed change. -The [glyph support registration and texture-image fill signatures](../../../core/libs/prx/libSceFont/src/Unimplemented.cpp) are recovered from native argument use. The image constructor takes a byte span and four scalar coordinates; the decompiler omits its successful path. `CreateWords` and `CreateGraphicsServiceWithEdition` consume the output pointer in the fourth general-purpose argument slot but do not read the third slot, whose source type is not established. +The [glyph support registration and drawup texture signatures](../../../core/libs/prx/libSceFont/src/Unimplemented.cpp) are recovered from native argument use. The drawup texture producers consume an opaque fill-object pointer, a mode, an output pointer and four rectangle floats; they still throw because their queue, pool and renderer operations are not implemented. `CreateWords` and `CreateGraphicsServiceWithEdition` consume the output pointer in the fourth general-purpose argument slot but do not read the third slot, whose source type is not established. - [sceFontCreateGraphicsServiceWithEdition and sceFontCreateWords](../../../core/libs/prx/libSceFont/src/Unimplemented.cpp) take their handle output in the fourth integer argument slot. The third slot is not read by the supplied module and is represented as an opaque 64-bit value; its declared source type remains unknown. - [Word dictionaries](../../../core/libs/prx/libSceFont/src/Words.cpp): building, depth limit, sort and error rules and longest-match selection are read from disassembly, not measured on a console. The text source is parsed once instead of twice. More than 65535 nodes return `SCE_FONT_ERROR_FUNCTIONAL_LIMIT`, where the native 16-bit indices would wrap. The shape-entry test on the next character is skipped since strings built here have no shape entry. The low flag byte and flag bits 43-45 are tested as read; strings built here leave them clear, so names are ours. diff --git a/docs/dev/debt/libSceFontGs.md b/docs/dev/debt/libSceFontGs.md new file mode 100644 index 000000000000..5405d4e1addf --- /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 000000000000..8fafc9ce1c0c --- /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/libSceFreeType.md b/docs/dev/debt/libSceFreeType.md index e2d02b42f3c7..5f6f103b4719 100644 --- a/docs/dev/debt/libSceFreeType.md +++ b/docs/dev/debt/libSceFreeType.md @@ -1,6 +1,8 @@ # libSceFreeType technical debt ### Unknown function info +- [autofitter glyph-to-script-map](../../../core/libs/prx/libSceFreeType/src/ModuleProperties.cpp) assumes the FreeType LP64 face/map carrier and translates the guest face to its host face. The returned 16-bit map borrows host face storage and is valid only while that face is alive; the setter returns the bundled FreeType error. This is an exception to the general unsupported-property note below. Console ABI, glyph classification and firmware behavior are unverified. + - [FT_New_Size, FT_Activate_Size and FT_Done_Size](../../../core/libs/prx/libSceFreeType/Export.cpp) (libSceFreeType) - console signatures, errors and generic-finalizer ordering are unverified; the LP64 guest adapter follows bundled [FreeType 2.13.3](https://github.com/freetype/freetype/blob/42608f77f20749dd6ddc9e0536788eaad70ea4b5/src/base/ftobjs.c). Private size fields are bridge-owned. Sizes created outside the bridge throw when selected. - [FT_Get_PS_Font_Info and FT_Has_PS_Glyph_Names](../../../core/libs/prx/libSceFreeType/src/PostScriptInfo.cpp) (libSceFreeType) - console ABI, backend version and errors are unverified; these follow bundled FreeType 2.13.3. Font information uses an LP64 guest record with borrowed strings valid until the face is destroyed. Glyph-name reliability is queried from the font driver rather than inferred from the face flags. @@ -27,10 +29,10 @@ - [FT_Outline_Copy](../../../core/libs/prx/libSceFreeType/Export.cpp) (libSceFreeType) - compatibility with the console FreeType build and its errors is unverified. The LP64 guest adapter follows the unsigned counts and copy contract of bundled [FreeType 2.13.3](https://github.com/freetype/freetype/blob/42608f77f20749dd6ddc9e0536788eaad70ea4b5/src/base/ftoutln.c). -- [FT_Outline_Decompose](../../../core/libs/prx/libSceFreeType/src/OutlineDecompose.cpp) (libSceFreeType) - console callback ABI and FreeType-version equivalence are unverified; the LP64 adapter follows bundled [FreeType 2.13.3](https://github.com/freetype/freetype/blob/42608f77f20749dd6ddc9e0536788eaad70ea4b5/src/base/ftoutln.c). Nonempty outlines with shifts outside 0-62 or signed 64-bit overflow in scaling, translation or midpoint sums throw; native behavior for that arithmetic is undefined. Callers must supply valid point/tag/contour arrays and the callbacks their contours use. +- [FT_Outline_Decompose](../../../core/libs/prx/libSceFreeType/src/OutlineDecompose.cpp) (libSceFreeType) - console callback ABI and FreeType-version equivalence are unverified; the LP64 adapter follows bundled [FreeType 2.13.3](https://github.com/freetype/freetype/blob/42608f77f20749dd6ddc9e0536788eaad70ea4b5/src/base/ftoutln.c). Nonempty outlines with shifts outside 0-62, contour endpoints at or beyond `n_points` or signed 64-bit overflow in scaling, translation or midpoint sums throw; native behavior there is undefined. Callers must supply valid point/tag/contour arrays and the callbacks their contours use. - [FT_Init_FreeType, FT_New_Face, FT_Set_Pixel_Sizes, FT_Get_Char_Index, FT_Load_Glyph, FT_Render_Glyph](../../../core/libs/prx/libSceFreeType/Export.cpp) (libSceFreeType) - the PS4 library is taken to be FreeType 2 built for LP64: the face, size, charmap, glyph slot, bitmap and outline layouts follow the public headers of the bundled FreeType 2.13.3 with a 64-bit `long`, which matches the offsets the OpenOrbis samples read (`face->glyph` at 0x98, `slot->advance` at 0x80, `slot->bitmap` at 0x98, `slot->bitmap_left` at 0xc0). Which FreeType version and options the console library is built with is unknown, so the behaviour and error codes are those of FreeType 2.13.3. The OpenOrbis font, keyboard, threading, system and SDL2 samples import these six functions -- [FT_Get_Advance and FT_Get_Advances](../../../core/libs/prx/libSceFreeType/src/Advances.cpp) (libSceFreeType) - console signatures, errors and version-specific behavior are unverified; the LP64 guest adapter follows the bundled [FreeType 2.13.3](https://github.com/freetype/freetype/blob/42608f77f20749dd6ddc9e0536788eaad70ea4b5/src/base/ftadvanc.c). On Windows, native `FT_Fixed` is 32 bits; successful outputs are widened to guest 64-bit slots, but backend errors other than `Unimplemented_Feature` throw because partially written results cannot be distinguished from untouched slots. Host overflow behavior remains that of the bundled FreeType build. +- [FT_Get_Advance and FT_Get_Advances](../../../core/libs/prx/libSceFreeType/src/Advances.cpp) (libSceFreeType) - console signatures, errors and version-specific behavior are unverified; the LP64 guest adapter follows the bundled [FreeType 2.13.3](https://github.com/freetype/freetype/blob/42608f77f20749dd6ddc9e0536788eaad70ea4b5/src/base/ftadvanc.c). On Windows, native `FT_Fixed` is 32 bits: advances of 32768 pixels or more overflow it and differ from LP64 without an error, and each query runs twice to find the slots FreeType wrote and throws if the two runs return different errors. - [FT_Bitmap_Init, FT_Bitmap_New, FT_Bitmap_Copy, FT_Bitmap_Convert, FT_Bitmap_Done](../../../core/libs/prx/libSceFreeType/src/Bitmap.cpp) (libSceFreeType) - console behaviour and error codes are unmeasured; these follow bundled FreeType 2.13.3. Copy and Convert throw when source and target share a non-null buffer; Convert also throws when they are the same object. Other overlapping storage remains forbidden by the native API contract @@ -54,7 +56,7 @@ ### Functional - [FT_Sfnt_Table_Info and FT_Load_Sfnt_Table](../../../core/libs/prx/libSceFreeType/src/Sfnt.cpp) (libSceFreeType) - console ABI and errors are unverified; the LP64 adapter follows bundled [FreeType 2.13.3](https://github.com/freetype/freetype/blob/42608f77f20749dd6ddc9e0536788eaad70ea4b5/src/sfnt/ttload.c). On hosts with a 32-bit `FT_Long`, tagged reads through a native stream callback throw: their table offsets cannot be recovered without changing callback state. Memory-backed streams and whole-file reads are supported; current guest face constructors use memory-backed streams. -- [FT_Outline_Get_BBox](../../../core/libs/prx/libSceFreeType/src/CurveBounds.cpp) has no console ABI or behaviour verification; extrema and errors follow bundled [FreeType 2.13.3](https://github.com/freetype/freetype/blob/42608f77f20749dd6ddc9e0536788eaad70ea4b5/src/base/ftbbox.c). Curved outlines with any coordinate outside ±536870911 throw: conic differences and their sum can overflow native 32-bit arithmetic even when each input fits `FT_Pos`. Coordinates outside native `FT_Pos` (signed 32 bits on Windows) and missing nonempty arrays or inconsistent contour partitions also throw. Native output uses a local box; errors and unsupported inputs leave the guest output unchanged. Empty outlines do not inspect their arrays. +- [FT_Outline_Get_BBox](../../../core/libs/prx/libSceFreeType/src/CurveBounds.cpp) has no console ABI or behaviour verification; extrema and errors follow bundled [FreeType 2.13.3](https://github.com/freetype/freetype/blob/42608f77f20749dd6ddc9e0536788eaad70ea4b5/src/base/ftbbox.c) with LP64 arithmetic; the contour walk is `FT_Outline_Decompose` and throws where it does. Missing nonempty arrays, signed overflow in the extremum arithmetic, cubic control distances whose low 32 bits are zero and a negative cubic peak that must be shifted left throw; the bundled source is undefined there. - [FT_Set_Transform](../../../core/libs/prx/libSceFreeType/Export.cpp) (libSceFreeType) - console ABI, transform arithmetic and FreeType-version equivalence are unverified. The name and NID `bcM5xfX2SeA` come from the [PS5 3.20 inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceFreeTypeOt.c); the 32-byte LP64 matrix, 16-byte vector, null defaults and glyph behavior follow bundled [FreeType 2.13.3](https://github.com/freetype/freetype/blob/42608f77f20749dd6ddc9e0536788eaad70ea4b5/src/base/ftobjs.c). Input components outside the native `FT_Long` range throw without changing the transform; on Windows this rejects values outside signed 32 bits. Native arithmetic limits remain those of the host library. diff --git a/docs/dev/debt/libSceFreeTypeOt.md b/docs/dev/debt/libSceFreeTypeOt.md index 7013351fc5f0..8de27f976e8d 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 120 `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. @@ -13,3 +13,7 @@ - [ft_corner_is_flat, ft_corner_orientation](../../../core/libs/prx/libSceFreeTypeOt/Export.cpp) (libSceFreeTypeOt) - console prototypes and FreeType version equivalence are unverified. The LP64 signatures and 64-bit coordinate calculations follow bundled [FreeType 2.13.3](https://github.com/freetype/freetype/blob/42608f77f20749dd6ddc9e0536788eaad70ea4b5/src/base/ftcalc.c): orientation returns +1 for counter-clockwise turns, -1 for clockwise turns and 0 for collinear inputs using 64-bit coordinate cross-products; flatness compares hypotenuse approximations via the alpha-max-plus-beta-min metric and returns 1 when the corner angle deviation does not exceed the threshold, 0 otherwise. - [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 new file mode 100644 index 000000000000..bbfcbe020d26 --- /dev/null +++ b/docs/dev/debt/libSceGLSlimVSH.md @@ -0,0 +1,33 @@ +# libSceGLSlimVSH technical debt + +### 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/libSceGameLiveStreaming.md b/docs/dev/debt/libSceGameLiveStreaming.md index c025ffb571c3..3ebc7adc301b 100644 --- a/docs/dev/debt/libSceGameLiveStreaming.md +++ b/docs/dev/debt/libSceGameLiveStreaming.md @@ -14,7 +14,7 @@ ### Unknown function info - [sceGameLiveStreamingScreenInitialize](../../../core/libs/prx/libSceGameLiveStreaming/Export.cpp) (libSceGameLiveStreaming) - unknown signature -- [sceGameLiveStreamingScreenInitializeSeparateModeParameter](../../../core/libs/prx/libSceGameLiveStreaming/Export.cpp) (libSceGameLiveStreaming) - unknown signature +- [sceGameLiveStreamingScreenInitializeSeparateModeParameter](../../../core/libs/prx/libSceGameLiveStreaming/Export.cpp) (libSceGameLiveStreaming) - the layout of the 68-byte parameter block is unknown. It follows firmware 13.42's libSceGameLiveStreaming.sprx, read from its disassembly and run natively on x86-64 (not a console): a null pointer returns `0x80A00002`; otherwise bytes 0 to 67 are cleared, later bytes are left unchanged and it returns 0. It does not need `sceGameLiveStreamingInitialize`. - [sceGameLiveStreamingScreenTerminate](../../../core/libs/prx/libSceGameLiveStreaming/Export.cpp) (libSceGameLiveStreaming) - unknown signature - [sceGameLiveStreamingScreenCloseSeparateMode](../../../core/libs/prx/libSceGameLiveStreaming/Export.cpp) (libSceGameLiveStreaming) - unknown signature - [sceGameLiveStreamingScreenConfigureSeparateMode](../../../core/libs/prx/libSceGameLiveStreaming/Export.cpp) (libSceGameLiveStreaming) - unknown signature diff --git a/docs/dev/debt/libSceGameUpdate.md b/docs/dev/debt/libSceGameUpdate.md index f00df0b6381f..bd539a113029 100644 --- a/docs/dev/debt/libSceGameUpdate.md +++ b/docs/dev/debt/libSceGameUpdate.md @@ -4,6 +4,10 @@ - [sceGameUpdateCreateRequest, sceGameUpdateCheck](../../../core/libs/prx/libSceGameUpdate/Export.cpp) (libSceGameUpdate) - requests are kept in the module's 8 slots with ids from `0x20000000` (a ninth returns `0x80412806`, an aborted request's Check `0x80412807`), as [prosper](https://github.com/mattias800/prosper) reads the PS5 3.20 `libSceGameUpdate.sprx`. Check never asks a patch service: it always answers no update (`found` and the byte after it cleared, the rest of the result untouched, return 0), which is what the module returns when its service reports `0x80412883`; KytyPS5 also answers no update. What the service returns on an offline console is not measured. The answer only decides whether a title offers a patch. PPSA22408 aborted on the throw in sceGameUpdateCreateRequest at its title screen. Closes when: measured on a PS5 +### Unknown function info + +- [sceGameUpdateCheckTitle](../../../core/libs/prx/libSceGameUpdate/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 `sGNKn-jXzHQ` are established by the [13.60 export inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libscegameupdate-16da6af946.jsonl); not measured on a console. + ### Functional - [libSceGameUpdate](../../../core/libs/prx/libSceGameUpdate/Export.cpp): initialization tracks host state but does not connect the patch service. Entitlement version lookup throws. diff --git a/docs/dev/debt/libSceGic.md b/docs/dev/debt/libSceGic.md index c7b8a71c3ebc..1dde8cf32ddc 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 000000000000..f6faf762de5f --- /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 8aa80f974135..d38b5f9ac6b1 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 0c189f5ba00b..d1ac649c3be4 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/libSceHmd.md b/docs/dev/debt/libSceHmd.md index 01241796f557..e4c20de5bf63 100644 --- a/docs/dev/debt/libSceHmd.md +++ b/docs/dev/debt/libSceHmd.md @@ -24,3 +24,31 @@ [Distortion and 2D VR command queries](../../../core/libs/prx/libSceHmd/Export.cpp) take a 32-bit HMD handle, input descriptor and command-buffer output. The output contains a command pointer at offset zero and a 32-bit dword count at offset eight. Descriptor fields and GPU resource types remain incomplete; the standard, wide-near and 2D descriptors are distinct. Without a headset `sceHmdOpen` never issues a handle, so the stored handle stays 0. As firmware 13.42's libSceHmd does when its exports are run under an emulator ([#9577](https://github.com/boykopovar/AnyPS5/pull/9577#issuecomment-6336871370)), the distortion queries return `HANDLE_INVALID` for any other handle before checking initialization, and `NOT_INITIALIZED` for handle 0 before it when the title's compiled SDK version is below 4.50. The 2D VR query first returns `PARAMETER_NULL` for a null descriptor or output or a null pointer at descriptor offset 0, 8 or 0x20, and `PARAMETER_INVALID` for a non-zero field at 0x34 (32-bit) or 0x38 (64-bit). None writes the output. From SDK 4.50 the firmware first checks state the library sets up when it starts, which is not measured ([#9577](https://github.com/boykopovar/AnyPS5/pull/9577#issuecomment-6343495321)), and what handle 0 gets after initialization is not measured either, so both throw. The ELF export table aliases the [Distortion correction/2D command and work-memory queries](../../../core/libs/prx/libSceHmd/Export.cpp) to their corresponding HMD queries, confirming identical signatures. Distortion initialization consumes only a work-memory pointer. No shader code or calibration constants are copied; each aliased command query answers as its twin, and distortion initialization keeps its protected body. + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceHmd/Export.cpp) - 19 entries observed in a 3.20-labelled image and a later 13.60-labelled image are import-resolution declarations only. Neither image label authenticates 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). + +[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` | `-Bk71lPyry4` | +| `Unknown` | `-y4OUwFf4jE` | +| `Unknown` | `IC0NGmh-zS8` | +| `Unknown` | `NY2-gYo9ihI` | +| `Unknown` | `XMutp2-o9A4` | +| `Unknown` | `Y9QDFn3AjPA` | +| `Unknown` | `aTg7K0466r8` | +| `Unknown` | `eRVgwy9PbWg` | +| `Unknown` | `mVIneDkja6c` | +| `Unknown` | `miduc55U7q8` | +| `Unknown` | `nlAZlOKJy+c` | +| `Unknown` | `ox9NqLO9LhI` | +| `Unknown` | `oxoDINgOrZk` | +| `Unknown` | `qS18I6w2SZM` | +| `Unknown` | `rczCXLh2-b4` | +| `Unknown` | `sWZSZB-mnw4` | +| `Unknown` | `smQw6nT8PcA` | +| `Unknown` | `thTykLZ-tZs` | +| `Unknown` | `uab6BzXsfkk` | diff --git a/docs/dev/debt/libSceHmd2.md b/docs/dev/debt/libSceHmd2.md index ea4e8ceaaf99..c453ebbed22a 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 206b6857623e..f0f949af7cfe 100644 --- a/docs/dev/debt/libSceHttp2.md +++ b/docs/dev/debt/libSceHttp2.md @@ -29,10 +29,11 @@ - [Default TLS trust](../../../core/libs/prx/libSceHttp2/Transport.cpp) (libSceHttp2) - HTTPS connections also trust the system CA list, `//common/cert/CA_LIST.cer`, served by libkernel from the host trust store, after the title's own libSceSsl certificates. RetroArch (PPSA99169, [updater](https://github.com/mihawk-99/PS5_RetroArch/blob/7268510b12fe7461342e0cc4497c87a0910c1055/src/webui_update.cpp#L302-L312)), PS5LM (PPSA99575) and Porpoise (PPSA99764) send version-3 requests to public `https://` servers with no loaded certificate, verify callback or verification option, which pass the known-CA check only if the console trusts public roots by default. That the console's roots are exactly this file is not measured - [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. -- [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, nonzero resolve retries, gzip inflation and connection-slot wait timeouts throw. 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 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 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. - [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. @@ -41,3 +42,7 @@ - [libSceHttp2 automatic proxy configuration](../../../core/libs/prx/libSceHttp2/Export.cpp) - flags 0 and 1 both use direct connections, matching [libSceNetCtl](../../../core/libs/prx/libSceNetCtl/Export.cpp), which reports proxy configuration off, an empty server and port zero. Other flag values throw. This is the host configuration policy, not a console measurement of proxy discovery; PAC/WPAD and configured proxies remain unsupported. The boolean argument and acceptance of 1 by callers are evidenced by [OliSe Player](https://github.com/Marice/OliSePlayer/blob/fb06d7ac7467a50ba1f2ee299dac20e43213d674/src/netxm.c#L73) and [RetroArch](https://github.com/mihawk-99/PS5_RetroArch/blob/7268510b12fe7461342e0cc4497c87a0910c1055/src/webui_update.cpp#L305); call sites do not establish library behavior. - [libSceHttp2 default trust](../../../core/libs/prx/libSceHttp2/Transport.cpp) - HTTPS currently uses only authorities explicitly loaded into the caller's libSceSsl context; a fresh context cannot validate public servers. Verification remains enabled. Loading host roots is left to the shared per-connection SSL work in [#11134](https://github.com/boykopovar/AnyPS5/pull/11134) and the stacked HTTP2 follow-up [#11145](https://github.com/boykopovar/AnyPS5/pull/11145), rather than adding a second trust-store implementation here. The exact console root set, trust updates and pool accounting remain unverified. This transport alone does not enable stock HTTPS callers that load no roots. + +### Additional PS5 3.20 imports (xdCloudy #9485) + +- [sceHttp2Unknown_*_nid_no_patch](../../../core/libs/prx/libSceHttp2/Export.cpp) (libSceHttp2) - 1 PS5 3.20 import declarations (`_Z5dummyv`). Their prototypes and behavior are unverified; each uses the no-parameter import-resolution convention and throws through `NotImplemented_nid_no_patch`. This records the export names without claiming an ABI or behavior. Source: [PS5-3.20_Libs](https://github.com/DNNDHH/PS5-3.20_Libs). diff --git a/docs/dev/debt/libSceIcu.md b/docs/dev/debt/libSceIcu.md index 59f82af26847..8b1b49669fa6 100644 --- a/docs/dev/debt/libSceIcu.md +++ b/docs/dev/debt/libSceIcu.md @@ -4,16 +4,40 @@ - [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. - [C string helpers](../../../core/libs/prx/libSceIcu/CString.cpp) have no console ABI or behavior verification. Their names/NIDs are in the PS5 3.20 inventory; signatures and behavior follow ICU 78.1's [cstring.cpp](https://github.com/unicode-org/icu/blob/049e0d6a420629ac7db77256987d083a563287b5/icu4c/source/common/cstring.cpp), unchanged since 65.1 apart from casts. Formatting accepts radices 2–16; null buffers or other radices throw an invalid-argument exception, whereas ICU dereferences the buffer and only asserts the radix. Signed minima and outputs exceeding ICU's 30-byte temporary use unsigned arithmetic and caller storage without reproducing upstream undefined behavior. Parsing uses guest LP64 `strtoul` and keeps the low 32 bits; a null source throws. Cross-firmware availability, native invalid-input behavior and the undefined upstream cases remain unverified. +- [Converter STOP/SKIP callbacks](../../../core/libs/prx/libSceIcu/ConverterCallbacks.cpp) have no console ABI or behavior verification. Signatures and decisions follow ICU 78.1's [ucnv_err.h](https://github.com/unicode-org/icu/blob/049e0d6a420629ac7db77256987d083a563287b5/icu4c/source/common/unicode/ucnv_err.h) and [ucnv_err.cpp](https://github.com/unicode-org/icu/blob/049e0d6a420629ac7db77256987d083a563287b5/icu4c/source/common/ucnv_err.cpp). The callback-specific default-ignorable ranges include U+180F, which ICU 65.1 excludes; firmware-dependent selection is not implemented. Reasons outside the upstream enum's 0–7 value range and a null error pointer on a path that writes it throw `invalid_argument`; native behavior there is undefined. Untouched pointers remain unread, including the error pointer on no-write paths. Converter argument structures stay opaque because these callbacks do not access them; converter execution and other callbacks remain unavailable. + - [Escape decoding](../../../core/libs/prx/libSceIcu/Unescape.cpp) has no behavior or ABI verification on console hardware. It follows ICU 78.1's [ustring.cpp](https://github.com/unicode-org/icu/blob/049e0d6a420629ac7db77256987d083a563287b5/icu4c/source/common/ustring.cpp), including rejection of eight-digit braced hexadecimal escapes although its public header advertises up to eight digits. Null source or offset pointers and null callbacks with an in-range offset, which ICU dereferences, throw `std::invalid_argument`. A negative capacity writes nothing, as in ICU; source lengths exceeding `INT32_MAX` and a capacity that overflows ICU's signed `destCapacity - i` throw. Null-destination preflight ignores capacity. Closes when: compared with the console, including callback ABI, byte conversion, capacity limits and braced hexadecimal parsing. - [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 102 `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/libSceIdu.md b/docs/dev/debt/libSceIdu.md index 4ce48a2927bc..88062c695da4 100644 --- a/docs/dev/debt/libSceIdu.md +++ b/docs/dev/debt/libSceIdu.md @@ -3,3 +3,25 @@ ### Unknown function info - [sceIduGetEnv, sceIduInit, sceIduInstallPkg, sceIduIsAppInstalled, sceIduIsRifInstalled, sceIduIsStaffMode, sceIduReboot and sceIduTerm](../../../core/libs/prx/libSceIdu/Export.cpp) (libSceIdu) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceIdu.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/libSceIdu/Export.cpp) - 13 entries observed in a 3.20-labelled image and a later 13.60-labelled image are import-resolution declarations only. Neither image label authenticates 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). + +[Version-pinned selected ELF export records](https://gist.github.com/kyon-eth/752e1b1d4a6ac8a26c97e693527fefbd/a7bddd315c7740a7d065af9e80b0447fcd5b91be) 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 module. The extract SHA-256 is `63256453dc9620091ce6af95f8b243b7da8f2ce76a585f4886f76aa6625b5b21`; its full-module sorted-function-NID digests and raw module-parameter words permit independent comparison. The extract is an analyst-produced metadata record, not independent authentication of the original images or proof of prototypes or behavior. The separately published 3.20 source catalog has a module file but none of these selected NIDs. + +| Name | NID | +| --- | --- | +| `sceIduGetDiscTitleInfo` | `LgCWg-v74x0` | +| `sceIduGetFsStats` | `GtkUkPjD9Uk` | +| `sceIduGetHardwareId` | `thkjPe16qxc` | +| `sceIduGetPkgInstallStatus` | `wZNmq82rKVk` | +| `sceIduGetTitleList` | `aIki6P40SdY` | +| `sceIduInstallRif` | `GZhI4L2kqB0` | +| `sceIduNotificationHide` | `l6blKJegR98` | +| `sceIduNotificationShow` | `Dw68FfautUc` | +| `sceIduStartTitle` | `aOjpQPv29Mg` | +| `Unknown` | `3XKI6v75VEo` | +| `Unknown` | `J9y431a1uM0` | +| `Unknown` | `tmeq5nZRqIs` | +| `Unknown` | `uoHZCJW8Cdk` | diff --git a/docs/dev/debt/libSceImageUtil.md b/docs/dev/debt/libSceImageUtil.md new file mode 100644 index 000000000000..731a9a05d829 --- /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 8902fc80715f..d05f886ca911 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 @@ -16,6 +26,7 @@ - [sceImeConfigSet and sceImeConfigGet](../../../core/libs/prx/libSceIme/Export.cpp) preserve the native argument slots: an unused first slot, a 64-bit configuration value, a 32-bit key and, for set, a 32-bit value. The service receives a 24-byte request; configuration/key semantics and unused argument types remain unresolved. The getter advertises one output transfer but does not initialize its descriptor in this module. Protected bodies remain unchanged. - [libSceIme pending exports](../../../core/libs/prx/libSceIme/Export.cpp) - 2 named callable exports are listed in the [PS5 3.20 export table](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceIme.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`. +- [ModalDialog](../../../core/libs/prx/libSceIme/src/ModalDialog.cpp) (libSceIme) - the session that message and error dialogs share is a host design, not a console behaviour: one dialog at a time, owned by the library that opened it, which alone can poll, close or reset it; the IME keyboard or pad capture hides the dialog and takes its input until it ends; an opening is refused while another dialog shows. Closes when: measured on a PS5 ### Functional diff --git a/docs/dev/debt/libSceImeBackend.md b/docs/dev/debt/libSceImeBackend.md index fc528a331169..b39cf6144ba4 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 796df23dc817..e8ed9744c1f1 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 e1d0461397b7..e60923e470ce 100644 --- a/docs/dev/debt/libSceIpmi.md +++ b/docs/dev/debt/libSceIpmi.md @@ -5,3 +5,18 @@ - [libSceIpmi pending exports](../../../core/libs/prx/libSceIpmi/PendingExports.cpp) - 49 named callable exports are listed in the [PS5 3.20 export table](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceIpmi.c). Their signatures and behavior are unverified; the no-parameter declarations exist for import resolution and throw through `NotImplemented_nid_no_patch`. - [libSceIpmi pending exports](../../../core/libs/prx/libSceIpmi/Export.cpp) - 5 named callable exports are listed in the [PS5 3.20 export table](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceIpmi.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`. + +### 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 dbe443806043..2ceadd92885e 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 e425528f8677..f475ca4357e4 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 000000000000..6dd340db2c40 --- /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 12c1ff0c79f9..bc0154e9ae1f 100644 --- a/docs/dev/debt/libSceKeyboard.md +++ b/docs/dev/debt/libSceKeyboard.md @@ -6,6 +6,9 @@ ### 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. - [sceKeyboardGetDeviceInfo and sceKeyboardSetProcessFocus](../../../core/libs/prx/libSceKeyboard/Export.cpp): pointer arguments are passed to device ioctls. Device-info storage is 168 bytes in the connection-query caller, but its fields and the process-focus layout remain unresolved. - [sceKeyboardConnectPort, sceKeyboardDisconnectPort and sceKeyboardDeviceOpen](../../../core/libs/prx/libSceKeyboard/Export.cpp): argument widths are confirmed. The meaning/order of the two 32-bit port arguments and the final 32-bit device-open argument still require the device-service backend. diff --git a/docs/dev/debt/libSceLibcInternal.md b/docs/dev/debt/libSceLibcInternal.md index 704ce78dd004..48d3b4afb34c 100644 --- a/docs/dev/debt/libSceLibcInternal.md +++ b/docs/dev/debt/libSceLibcInternal.md @@ -1,7 +1,331 @@ # 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`. + +| Name | NID | +| --- | --- | +| `sceLibcMspaceSetMallocCallback` | `+CbwGRMnlfU` | +| `sceLibcPafMspaceReportMemoryBlocks` | `0FnzR6qum90` | +| `sceLibcHeapSetAddressRangeCallback` | `4iOzclpv1M0` | +| `sceLibcPafMspaceTrim` | `AUYdq63RG3U` | +| `sceLibcHeapMutexCalloc` | `HFtbbWvBO+U` | +| `sceLibcInternalSetMallocCallback` | `LXqt47GvaRA` | +| `sceLibcHeapSetTraceMarker` | `M6qiY0nhk54` | +| `sceLibcPafMspaceCheckMemoryBounds` | `Pcq7UoYAcFE` | +| `sceLibcHeapUnsetTraceMarker` | `RlhJVAYLSqU` | +| `sceLibcHeapGetAddressRanges` | `Sj3fKG7MwMk` | +| `sceLibcHeapMutexFree` | `jJKMkpqQr7I` | + - [_sceLibcInternalThreadAtexit, _sceLibcInternalThreadDtors](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - FreeBSD `__cxa_thread_atexit` semantics assumed; a null or non-image destructor and an allocation failure throw - [_sceLibcInternalForceTlsDestructor](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) - behaviour follows `sceLibcForceTlsDestructor(int)` in a title's `libc.prx` (disassembly): the calling thread's destructors whose dso belongs to the module run newest first, only if the dso's module is loaded and the dso points to itself, in up to 4 passes. The return type is unknown (that function returns nothing), 0 is returned. The module of each dso is looked up when the destructors are forced, not when they are registered as `libc.prx` does @@ -10,7 +334,7 @@ - [makecontext](../../../core/libs/prx/libSceLibcInternal/UserContext.cpp) (libSceLibcInternal) follows FreeBSD 11's `lib/libc/amd64/gen/makecontext.c`: at most six arguments, a stack of at least `MINSIGSTKSZ` (2048) bytes, and `exit(0)` when the function returns with no `uc_link`. The console's version is not verified - [makecontext](../../../core/libs/prx/libSceLibcInternal/UserContext.cpp) (libSceLibcInternal) on Windows pins its stack writable until a later `makecontext` stack overlaps it, since nothing tells the library when the guest frees the stack - [Thread exit destructors](../../../core/libs/prx/libSceLibcInternal/Export.cpp) (libSceLibcInternal) run when a libkernel thread finishes; on the main or a host thread only `_sceLibcInternalThreadDtors` runs them, as `exit` does, else they are dropped -- [__opendir2](../../../core/libs/prx/libSceLibcInternal/Directory.cpp) (libSceLibcInternal, NID `KOy7MeQ7OAU`) - opens the directory as `opendir` does and ignores `DTF_HIDEW`, `DTF_NODUP` and `DTF_REWIND`; any other flag throws. In FreeBSD 11's [`opendir.c`](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/lib/libc/gen/opendir.c#L76-L95) `DTF_NODUP` only changes what is read from a union mount, which AnyPS5 does not have; `DTF_HIDEW` also makes [`readdir`](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/lib/libc/gen/readdir.c#L85) skip whiteout (`DT_WHT`) entries, which AnyPS5 never returns; `DTF_REWIND` is not read; `__DTF_READALL` and `__DTF_SKIPREAD` make the call fail. The signature is the one ps5-payload-sdk [declares](https://github.com/ps5-payload-dev/sdk/blob/a7685ce8e97ce1f8a4f38253a41d54241c9124f1/include/freebsd/dirent.h#L89-L90); the SDK's `fts_build` in PPSA99793 passes 7, or 6 with `FTS_WHITEOUT`. The console's answer for any flag is not measured +- [__opendir2](../../../core/libs/prx/libSceLibcInternal/Directory.cpp) (libSceLibcInternal, NID `KOy7MeQ7OAU`) - the device's answer to any flag is not measured; the flags follow FreeBSD 11.4's [`__opendir2`](https://github.com/freebsd/freebsd-src/blob/d106002967eff712894ab8b5337bbbff106ce5e0/lib/libc/gen/opendir.c#L76-L95) - [fdopendir](../../../core/libs/prx/libSceLibcInternal/Directory.cpp) (libSceLibcInternal) follows FreeBSD 11's [`fdopendir`](https://github.com/freebsd/freebsd-src/blob/release/11.0.0/lib/libc/gen/opendir.c#L67-L74): it sets `FD_CLOEXEC` on the descriptor first, and the stream starts at the descriptor's current position instead of the first entry. On Windows the stream skips the entries the descriptor's cursor (`lseek` or `getdirentries`) has passed, which assumes that the descriptor and the stream list a directory in the same host order; on Linux the stream is opened on a duplicate of the descriptor, which shares its position. The Linux path is not run by the tests here. As in FreeBSD, a descriptor that is not open fails with `EBADF`, one that is not a directory with `ENOTDIR` (both leave it open, and `FD_CLOEXEC` stays set on the latter), and `closedir` closes it - [fstatvfs](../../../core/libs/prx/libSceLibcInternal/FilesystemStatistics.cpp) (libSceLibcInternal) converts `_fstatfs` to the 88-byte `struct statvfs` as FreeBSD 9.2's `sfs2svfs` does (`f_bsize` from the transfer size, `f_frsize` from the block size, `f_favail` equal to `f_ffree`, `f_fsid` 0, `ST_RDONLY` and `ST_NOSUID` only). Differences: `f_namemax` is the `statfs` value, not `fpathconf(_PC_NAME_MAX)`; negative `f_bavail` and `f_ffree` wrap to unsigned without `EOVERFLOW`, as the same-width copy in FreeBSD does; inode counts are 0 on Windows, inherited from `_fstatfs`; a null output returns `EFAULT` after the descriptor is validated, where FreeBSD would fault. Layout and conversion are unverified against the PS5 library (PS5MC imports `fstatvfs` but was not run) - [posix_spawn and posix_spawnp](../../../core/libs/prx/libSceLibcInternal/Spawn.cpp) (libSceLibcInternal) create a native child running the requested program's converted image, which must be under `/app0/` (`/app0/eboot.bin` maps to the running image); `posix_spawnp` searches `PATH` as FreeBSD 11's `_execvpe`, and the FreeBSD 11.4 file actions and attributes are applied to the child. A null `argv` returns `EFAULT`; a null `envp` inherits the parent environment; guest process IDs are the host's. Limits: the child executes the conversion made at relink time; Windows redirects only descriptors 0 to 2 and starts the child on the parent's std handles; Linux applies only `POSIX_SPAWN_RESETIDS` and `POSIX_SPAWN_SETPGROUP`, other flags or a nonzero set on Windows throw. The console sandbox's effect on child creation is unverified, and null or uninitialized objects, which FreeBSD dereferences, throw. PPSA99305 (Dusklight) reaches this when SDL looks for `zenity` @@ -191,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 a91e9e0c11c0..99dd5f957829 100644 --- a/docs/dev/debt/libSceLibreSsl.md +++ b/docs/dev/debt/libSceLibreSsl.md @@ -2,11 +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) - 299 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. @@ -21,6 +22,9 @@ - [sk_num, sk_value, sk_pop, sk_pop_free](../../../core/libs/prx/libSceLibreSsl/src/Stack.cpp) (libSceLibreSsl) - the 32-byte `_STACK` layout (`num`, `data`, `sorted`, `num_alloc`, `comp`) and the results follow [LibreSSL 2.5.4](https://github.com/libressl/openbsd/tree/2e2c612066aa993717528a0249c15c51128d61cb/src/lib/libcrypto/stack) `stack.h` and `stack.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. `sk_pop_free` releases the element array and the stack with the guest `free`, as the module would through libc. No export of this module creates a stack yet, so only stacks the caller builds reach them. A null element array that LibreSSL would read through, and a null free function with a non-null element, throw where LibreSSL faults - [RSA_flags, RSA_size](../../../core/libs/prx/libSceLibreSsl/src/Rsa.cpp) (libSceLibreSsl) - nothing is checked on the console. Layouts and results follow [LibreSSL 2.5.4](https://github.com/libressl/openbsd/tree/2e2c612066aa993717528a0249c15c51128d61cb/src/lib/libcrypto) `rsa.h`, `rsa_crpt.c` and `bn_lib.c`, the version in the [firmware 13.40 measurements](https://github.com/boykopovar/AnyPS5/discussions/8981#discussioncomment-19111214). No export of this module creates a key yet, so only keys the caller builds reach them. `RSA_size` counts the modulus bytes from its top word, as `BN_num_bytes`, so a zero top word is not skipped. A null method, a null key or modulus, and a positive word count with null words, which LibreSSL dereferences, throw, as do a negative word count and a bit count that overflows `int` - [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, 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 @@ -31,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 6607b4c8c56a..7a6b17f51b97 100644 --- a/docs/dev/debt/libSceLibreSsl3.md +++ b/docs/dev/debt/libSceLibreSsl3.md @@ -2,11 +2,200 @@ ### 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 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 | +| --- | --- | +| `unknown` | `++b0FizBrJk` | +| `unknown` | `+STC2BUY9vY` | +| `unknown` | `+Tu0gXSas9s` | +| `unknown` | `+bQfpiUHRVk` | +| `unknown` | `0BW+8jTsY54` | +| `unknown` | `0IxWzLyU8PI` | +| `SSL_SESSION_get_timeout` | `0JcHkrKJ9iw` | +| `unknown` | `13BHMSblVyY` | +| `unknown` | `27Fuliv3Om8` | +| `unknown` | `2bIZM-OfE8Y` | +| `unknown` | `2l+JidqxyZQ` | +| `TLS_method` | `31eWdro1jqs` | +| `unknown` | `3KZ-L4y1gak` | +| `unknown` | `3m4CmAyOXwQ` | +| `BIO_clear_flags` | `3sypCuBDdQs` | +| `unknown` | `3tGgkjBQ82A` | +| `unknown` | `3v2Omd4sqcU` | +| `unknown` | `3wlK0tLONvk` | +| `unknown` | `409ieWBMPUk` | +| `unknown` | `44M+SEbpNdQ` | +| `unknown` | `4Q3bvOy4LY8` | +| `unknown` | `4pEl-5DmrrM` | +| `SSL_set_accept_state` | `5BoCLZK9mGk` | +| `unknown` | `5DhOJmgra8E` | +| `unknown` | `5NBoRJYLH0U` | +| `unknown` | `5PWK0cYOpHs` | +| `i2d_SSL_SESSION` | `5aSlVeVSKVc` | +| `unknown` | `5ex+694ri90` | +| `tls_read` | `7RvDjfy4gUA` | +| `unknown` | `8A-gU2xQfjY` | +| `unknown` | `8AGfaSvdDq4` | +| `unknown` | `8kct4CSWwOA` | +| `tls_configure` | `8pwP-7j5UZI` | +| `X509_STORE_CTX_get0_param` | `8wroYNJAQpo` | +| `unknown` | `A-Hs-8mau+8` | +| `unknown` | `A0lZtFjhcTw` | +| `unknown` | `A65b+ZhOt9k` | +| `BN_clear_free` | `ABcJv8S1KEM` | +| `unknown` | `AiNud8LR8B4` | +| `unknown` | `Ax+Uu++rnrA` | +| `SSL_CTX_set_timeout` | `BBOgwZLvXHA` | +| `tls_config_new` | `BQNyLN2nA9w` | +| `unknown` | `BRjfzlGULmU` | +| `unknown` | `BS5yWv6X-hg` | +| `unknown` | `C7eFtWPfLdk` | +| `unknown` | `CFRaBB2+R+s` | +| `unknown` | `DZ6fywqpaik` | +| `TLS_server_method` | `EtM5Jwx4EFo` | +| `unknown` | `F7jknWesBTY` | +| `tls_close` | `Fqc0-3YCXjo` | +| `tls_client` | `GEK3LmjM9Q4` | +| `unknown` | `GFEaREp1UFw` | +| `EVP_PKEY_get0_EC_KEY` | `GY2X+VHs568` | +| `unknown` | `GjO5Ap3E-t4` | +| `unknown` | `HE-vihq-KKw` | +| `EVP_PKEY_verify` | `HEuvmk+aHs4` | +| `unknown` | `IOutZPRNNPo` | +| `d2i_SSL_SESSION` | `IiG4HLr+cOw` | +| `unknown` | `J437jVn9pjI` | +| `unknown` | `J5ZLHxWkT6k` | +| `unknown` | `JSqFTYGaWhU` | +| `unknown` | `JvoQz7GYOMo` | +| `unknown` | `Jzebx477Q3M` | +| `SSL_CTX_add1_chain_cert` | `L897DuAuXKk` | +| `unknown` | `LA1MlgDx80o` | +| `tls_config_free` | `LL8N+X6DA-4` | +| `HMAC_CTX_new` | `LcxutSyn11o` | +| `unknown` | `LdGe2IfIlpI` | +| `unknown` | `M7ze0mz2jQM` | +| `tls_error` | `N+G3Gxequt0` | +| `unknown` | `O9Thca3enw8` | +| `unknown` | `OqtHJ7QUZg8` | +| `unknown` | `PBYz0kpXwg8` | +| `unknown` | `PNfwr3s6dEs` | +| `unknown` | `PcUZS7XHwHk` | +| `unknown` | `QKIOxHfZLh8` | +| `unknown` | `QTV9Nyi7ryg` | +| `unknown` | `QYEjNnn6PT4` | +| `SSL_CIPHER_get_id` | `QaiPrM-RrrM` | +| `unknown` | `QhYzE+Jdvuk` | +| `unknown` | `QnjD8S6Rgk4` | +| `unknown` | `R3NyckUcClU` | +| `BN_dup` | `RMhEgJs6KLI` | +| `EVP_sha512_256` | `Sea+FOS2GOI` | +| `unknown` | `Sqn+7yQmQWc` | +| `unknown` | `Ssfu1yw4Em4` | +| `unknown` | `TKGJOgbeyuA` | +| `unknown` | `TpBvY92mrSM` | +| `unknown` | `U1dQZ1rXHdA` | +| `unknown` | `U3AsZ-9e2MI` | +| `SSL_CTX_set0_chain` | `UHkYqkyfwOs` | +| `unknown` | `UT6E1YgI8mw` | +| `unknown` | `UmAPG5bxYYk` | +| `X509_STORE_load_locations` | `V3JtebYui1A` | +| `ERR_func_error_string` | `VXuysR7ySzw` | +| `EVP_get_digestbyname` | `Wm24hhTLqWM` | +| `SSL_SESSION_set_time` | `XG3hIzt9VXY` | +| `unknown` | `XK3FmaTS6pg` | +| `HMAC_CTX_free` | `YAxGqtnKQFY` | +| `unknown` | `YJ7bfxMHniE` | +| `unknown` | `ZERQN8ewpgk` | +| `unknown` | `ZFeTGo4ybcw` | +| `unknown` | `ZQ3b6SakHkc` | +| `unknown` | `aKGUCnoiE+k` | +| `unknown` | `aLdgrI2jAF0` | +| `unknown` | `aSO3Svp7umY` | +| `unknown` | `agQxMaXVE8o` | +| `unknown` | `as+t2ZOg5fw` | +| `unknown` | `ba4o0Ih6kSs` | +| `unknown` | `bpOQdoGE2es` | +| `SSL_get_version` | `dL2V0os4TZ4` | +| `unknown` | `dQE7FIbNsUE` | +| `i2d_X509` | `e2ReciVG21w` | +| `unknown` | `eyrIagsax0w` | +| `unknown` | `f6Pa2rYH-dw` | +| `unknown` | `fR2Wat3ssHs` | +| `d2i_X509_CRL` | `fVos2kAqfMI` | +| `tls_write` | `fZJr2OF+KGw` | +| `unknown` | `fdvZNUHm-dE` | +| `unknown` | `fq1vAGKJNrI` | +| `unknown` | `gavhu7SX2FI` | +| `PEM_read_bio_PUBKEY` | `gn7mRF71J4k` | +| `EVP_PKEY_assign` | `gp5dGS14-pI` | +| `OPENSSL_init_ssl` | `hGiyDq-l4AE` | +| `unknown` | `iFlkTGEbE9k` | +| `unknown` | `iHetf873n+4` | +| `unknown` | `je-ydGAbgFg` | +| `unknown` | `k1AHUWet-oU` | +| `unknown` | `kO-jQ3HS9kE` | +| `unknown` | `kPCJUQuguzE` | +| `BIO_set_flags` | `lLHlEb1nt5U` | +| `unknown` | `lTdt9OsPAV0` | +| `SSL_set_alpn_protos` | `lyk0UDADPAc` | +| `unknown` | `mKlCMgWMU84` | +| `SSL_set_info_callback` | `mOQe5RQATT4` | +| `unknown` | `mXrusLhI3CI` | +| `unknown` | `mhAgol4ETgY` | +| `tls_server` | `nCOh70mg3K0` | +| `unknown` | `o0dpw6ZZ6K0` | +| `unknown` | `o3Q8yQAMT-k` | +| `EVP_PKEY_derive_set_peer` | `ovH4WphWIQQ` | +| `unknown` | `pW329hq95Hc` | +| `unknown` | `pdxCm9+CCc4` | +| `unknown` | `qGsc6uT6p1E` | +| `EVP_PKEY_verify_init` | `qseLIVbdvMQ` | +| `unknown` | `rJZ-aiNIYCA` | +| `unknown` | `s8WMaKNjwvE` | +| `unknown` | `sENJFZ7WbLU` | +| `EVP_PKEY_bits` | `ssruelYxprY` | +| `SSL_do_handshake` | `tJsbVTdWjT4` | +| `unknown` | `tZG2VIefbX0` | +| `unknown` | `uITUdhDDAg8` | +| `HKDF` | `uJ2ZXq4z3As` | +| `unknown` | `uM9UnC8KFjY` | +| `unknown` | `uihDBp74nLI` | +| `EVP_PKEY_CTX_free` | `ulzAPWCIBkw` | +| `tls_free` | `uz3bWkbHZu4` | +| `unknown` | `v1vHv4jOJxQ` | +| `unknown` | `vLuIwBfrxrk` | +| `unknown` | `vR0po3nBkBs` | +| `unknown` | `vnwZHU5FvBQ` | +| `unknown` | `vo-cv5gnPUA` | +| `unknown` | `vu4FgwGayHY` | +| `unknown` | `wHdymWL7CbE` | +| `unknown` | `wNQT6Zn4UG4` | +| `X509_EXTENSION_free` | `wbJDMMsje6s` | +| `unknown` | `whL1IRBxFZA` | +| `unknown` | `xBkcXV1OqWQ` | +| `unknown` | `xVv3qlSRldc` | +| `unknown` | `xZ1BME5qDv0` | +| `unknown` | `xf6anoZpWRM` | +| `X509_get0_pubkey` | `xj7cFYOV4+Y` | +| `unknown` | `xpB+BNkO2Z0` | +| `unknown` | `yLm956jsJpc` | +| `unknown` | `z8fsXF8JuL0` | +| `unknown` | `zCa75KLWWn4` | diff --git a/docs/dev/debt/libSceLoginMgrServer.md b/docs/dev/debt/libSceLoginMgrServer.md index 9c6b1255ce87..37140bc94722 100644 --- a/docs/dev/debt/libSceLoginMgrServer.md +++ b/docs/dev/debt/libSceLoginMgrServer.md @@ -1,5 +1,18 @@ # 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 +- [sceLoginMgrServerNotifySafetyNoticeShownForGen2Vr, sceLoginMgrServerCheckSafetyNoticeShownForGen2Vr](../../../core/libs/prx/libSceLoginMgrServer/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/libsceloginmgrserver-9d8badaba5.jsonl). These are system/VR UI-facing inventory entries only; safety-notice handling, VR behaviour and title use remain unverified. diff --git a/docs/dev/debt/libSceM4aacEnc.md b/docs/dev/debt/libSceM4aacEnc.md index fbb1f5292f91..4d595b0551d5 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 4fccfba7a640..89c4ff5e82d9 100644 --- a/docs/dev/debt/libSceMbus.md +++ b/docs/dev/debt/libSceMbus.md @@ -6,17 +6,23 @@ ### Unknown function info +- [sceMbusGetCurrentChatBalanceId, sceMbusGetInitialUser, sceMbusGetSimulatedBusUsableStatusByBusType2, sceMbusSetChatBalance, sceMbusSetCronosOutputMode, sceMbusSetCronosPrimaryUser, sceMbusSetHmd2SocialScreenAudioMode, sceMbusSetVibrationTriggerEffectWeakWhileEmbeddedMicInUse, sceMbusSetVolumeDownForDiscPlayerFG, sceMbusStartAudioOutScreenShare and sceMbusStopAudioOutScreenShare](../../../core/libs/prx/libSceMbus/PendingExports.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/libscembus-c03d5277f5.jsonl); not measured on a console. + - [sceDeviceServiceQueryDeviceInfo_](../../../core/libs/prx/libSceMbus/Export.cpp): the 112-byte device-info layout and the third argument's meaning remain unresolved. The second argument is a six-byte HID usage filter pointer, not an integer. Initialization takes an optional 16-byte parameter structure with an optional thread configuration; custom scheduling throws because the host has no event worker. `sceDeviceServiceGetEventState` takes a clear flag, not a device type. +- [sceMbusDebugGetStringToShow](../../../core/libs/prx/libSceMbus/PendingExports.cpp) (logical `libSceMbusDebug`, NID `k6Ki9MjO9sI`) - 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/libscembusdebug-82d8e50b8e.jsonl). + - [sceMbus remaining declarations](../../../core/libs/prx/libSceMbus/PendingExports.cpp): SetDeviceFunctionState takes a 64-bit device identifier and a 180-byte aggregate by value on the stack. Its service-side fields and source alignment remain unresolved; the declaration preserves the observed stack ABI with opaque storage. AcquireControlList and Term return constants without reading incoming arguments, so their original parameter lists cannot be established from the callees. - [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. -- [sceMbus event subscriptions](../../../core/libs/prx/libSceMbus/PendingExports.cpp): the subscription transports two 32-bit and two 64-bit fields whose service-side meanings remain unresolved. EventCreate uses 80-byte queue records and copies a 16-byte callback table; event fields still require the dispatch path; the overflow callback takes an event handle and user data, and the event callback additionally takes a pointer to the queued event. EventCallbackFuncsInit only clears memory and has no defined return value; its protected stub retains the existing integer return. Eight dump/BGM wrappers have confirmed zero-argument ABIs. EventBusStatusChangeUnsubscribe ignores its first incoming argument and consumes a 32-bit second argument; its first parameter type remains unresolved. +- [sceMbus event subscriptions](../../../core/libs/prx/libSceMbus/PendingExports.cpp): the subscription transports two 32-bit and two 64-bit fields whose service-side meanings remain unresolved. EventCreate uses 80-byte queue records and copies a 16-byte callback table; event fields still require the dispatch path; the overflow callback takes an event handle and user data, and the event callback additionally takes a pointer to the queued event. EventCallbackFuncsInit has no defined return value and its recovered behavior is to clear memory. The second argument is treated here as a byte count, but the source analysis in [merged PR #9137](https://github.com/boykopovar/AnyPS5/pull/9137) does not record firmware, function offset or instructions establishing whether the native routine clamps it to the 16-byte callback table; this must be verified before claiming full parity. A null callback pointer with a nonzero size is not validated and is not measured on a console. Eight dump/BGM wrappers have confirmed zero-argument ABIs. EventBusStatusChangeUnsubscribe ignores its first incoming argument and consumes a 32-bit second argument; its first parameter type remains unresolved. - [sceMbus device and driver payloads](../../../core/libs/prx/libSceMbus/PendingExports.cpp): device-info records occupy 256 bytes, descriptions 264 bytes, simulated-handle status and Spark state 16 bytes each. Their service-side fields remain unresolved. Driver registration copies four callback pointers; driver-event notification transports two 64-bit values without dereferencing them. Init, IsBgmProhibited, ReenableBgmForShellUi and RemoveCameraAppModuleFocus consume no incoming arguments. @@ -25,3 +31,16 @@ - [sceMbusGetDeviceInfoByCondition_](../../../core/libs/prx/libSceMbus/PendingExports.cpp): its first parameter points to a 256-byte query condition; the second is a 32-bit scalar. Two optional 32-bit outputs and the sized 256-byte record array are confirmed, while condition fields and output meanings remain unresolved. - [sceMbusGetDeviceInfoByConditionForDeviceService](../../../core/libs/prx/libSceMbus/PendingExports.cpp): assembly and its DeviceService caller confirm five register arguments followed by a 256-byte condition passed by value on the stack. The condition keeps opaque storage because its service-side fields remain unresolved; byte 228 contains the 16-bit device class. Output records occupy 112 bytes. The two optional outputs are 32-bit values whose meanings remain unresolved. + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceMbus/Export.cpp) - 4 entries observed in a 3.20-labelled image and a later 13.60-labelled image are import-resolution declarations only. Neither image label authenticates 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). + +[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` | `0mRAu1IWNEA` | +| `Unknown` | `2qdZlkIIFDU` | +| `Unknown` | `RGJ3Rebmm2w` | +| `Unknown` | `edYHYROxzx4` | diff --git a/docs/dev/debt/libSceMetadataReaderWriter.md b/docs/dev/debt/libSceMetadataReaderWriter.md index 297daf5a49e6..64397d05025e 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/libSceMouse.md b/docs/dev/debt/libSceMouse.md index 360ec5888a2d..df77103a2323 100644 --- a/docs/dev/debt/libSceMouse.md +++ b/docs/dev/debt/libSceMouse.md @@ -6,6 +6,7 @@ | Name | NID | | --- | --- | +| `sceMouseDisconnectAll` | `8fjFFh4zZXU` | | `sceMouseExtensionGetCursor` | `UBO+tFHvcyE` | | `sceMouseExtensionRead` | `doRbAW89lZE` | | `sceMouseExtensionReadState` | `CvUnq1gsWMg` | @@ -13,6 +14,11 @@ | `sceMouseExtensionSetConfig` | `T4BHUjH773k` | | `sceMouseExtensionSetCursor` | `2KVa2-HqIRs` | | `sceMouseGetHandle` | `P+9UQOe1F2g` | +| `sceMouseVirtualDeviceAddDevice` | `JB6ycme-yJ8` | +| `sceMouseVirtualDeviceDeleteDevice` | `HN2s86AOUiM` | +| `sceMouseVirtualDeviceGetCursor` | `rdrYJpbUJyA` | + +- [sceMouseDisconnectAll, sceMouseVirtualDeviceAddDevice, sceMouseVirtualDeviceDeleteDevice and sceMouseVirtualDeviceGetCursor](../../../core/libs/prx/libSceMouse/InventoryExports.cpp) - the names and NIDs are recorded in the [13.60 export inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/e495d3cf24aea17cefda59decdfda9e3e4e3e5ff/data/firmware-13.60/libscemouse-acdd5b5e23.jsonl). Signatures and behavior remain unknown; the parameterless `int` declarations only resolve imports and every call throws. Not measured on a console. - [sceMouseConnectPort, sceMouseDebugGetDeviceId, sceMouseDeviceOpen, sceMouseDisconnectDevice, sceMouseDisconnectPort, sceMouseGetDeviceInfo, sceMouseMbusInit, sceMouseSetHandType, sceMouseSetPointerSpeed and sceMouseSetProcessPrivilege](../../../core/libs/prx/libSceMouse/Export.cpp) (libSceMouse) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceMouse.c); the no-argument prototypes follow [shadPS4's PS4 stubs](https://github.com/shadps4-emu/shadPS4/blob/f68923fe807f657348e6719ce658bcbd0a2b1c72/src/core/libraries/mouse/mouse.cpp#L34-L146), not measured on a console. These declarations have no parameters solely to resolve known imports and make no ABI claim. - [sceMouseReadAbsolutePosition, sceMouseSetAbsoluteHighPrecisionMode and sceMouseSetAbsoluteVirtualScreenSize](../../../core/libs/prx/libSceMouse/Export.cpp) (libSceMouse) - the names match unresolved NIDs reported by a title, but their signatures and behavior are not verified. These no-argument declarations only resolve imports; the exports throw if called. diff --git a/docs/dev/debt/libSceMoveTracker.md b/docs/dev/debt/libSceMoveTracker.md index fdc58121d517..594d9b89ec9a 100644 --- a/docs/dev/debt/libSceMoveTracker.md +++ b/docs/dev/debt/libSceMoveTracker.md @@ -7,3 +7,4 @@ ### Unknown function info - [libSceMoveTracker](../../../core/libs/prx/libSceMoveTracker/Export.cpp) remains unimplemented. Calibration direction, camera/controller input, capture initialization, state query, memory-size query and playback output signatures are recovered. Camera and controller records occupy 24 bytes, state records 160 bytes, and playback metadata 16 bytes; their complete field meanings still require reconstruction. Initialization consumes a work-memory pointer, a required nonzero 64-bit argument and two 32-bit GPU queue selectors below eight. The second argument is only checked for zero; its declared type remains unresolved. Capture/playback helper signatures need further checking against caller register use. +- [sceMoveTrackerGetWorkingMemorySize](../../../core/libs/prx/libSceMoveTracker/Export.cpp) (libSceMoveTracker) - what the two sizes cover is unknown beyond the parameter names. It follows firmware 13.42's libSceMoveTracker.sprx, read from its disassembly and run natively on x86-64 (not a console): a null pointer returns `0x80ef0003` and writes nothing; otherwise it stores the 32-bit values 0xa00000 and 0x800000 through the first and second pointer and returns 0. The first is module data 0x200000 plus the 0x800000 that an internal function returns; every rip-relative reference to that data in the module reads it. diff --git a/docs/dev/debt/libSceMsgDialog.md b/docs/dev/debt/libSceMsgDialog.md index a0f4792f49b8..a4e20b95dd0a 100644 --- a/docs/dev/debt/libSceMsgDialog.md +++ b/docs/dev/debt/libSceMsgDialog.md @@ -2,8 +2,11 @@ ### Silent stubs -- [libSceMsgDialog](../../../core/libs/prx/libSceMsgDialog/Export.cpp) - message dialogs show no UI. `sceMsgDialogOpen` opens one without `sceMsgDialogInitialize` as well, and a user message or system message dialog finishes on the second `sceMsgDialogGetStatus` or `sceMsgDialogUpdateStatus` call; the first 160 characters of a user message are only logged. The button it picks (2 for `YES_NO_FOCUS_NO`, otherwise 1) is kept but not returned, as `sceMsgDialogGetResult` is exported by libSceMsgDialog.native. A progress bar dialog runs until `sceMsgDialogClose` or for 30 seconds, and `sceMsgDialogProgressBarInc`, `sceMsgDialogProgressBarSetMsg` and `sceMsgDialogProgressBarSetValue` ignore their arguments +- [libSceMsgDialog](../../../core/libs/prx/libSceMsgDialog/Export.cpp) - only a user message dialog with button type 0, 1, 3 or 4 shows UI, and only while the video output has a window to draw it. A progress bar, a system message, a user message of any other button type, a dialog opened with no window, one opened while another dialog is shown and one that no flip drew within three seconds show none: `sceMsgDialogOpen` opens them without `sceMsgDialogInitialize` as well, and they finish on the second `sceMsgDialogGetStatus` or `sceMsgDialogUpdateStatus` call; the first 160 characters of a user message are only logged. The button a player picks, or that a dialog without UI picks (2 for `YES_NO_FOCUS_NO`, otherwise 1), is kept but not returned, as `sceMsgDialogGetResult` is exported by libSceMsgDialog.native. +- [libSceMsgDialog](../../../core/libs/prx/libSceMsgDialog/Export.cpp) - a progress bar dialog runs until `sceMsgDialogClose` or for 30 seconds, and `sceMsgDialogProgressBarInc`, `sceMsgDialogProgressBarSetMsg` and `sceMsgDialogProgressBarSetValue` ignore their arguments ### Unknown function info - [sceMsgDialogOpen](../../../core/libs/prx/libSceMsgDialog/Export.cpp) (libSceMsgDialog) - the `SceMsgDialogParam` layout it reads is not measured on a PS5: the mode at 0x38 (1 user message, 2 progress bar, 3 system message), the user message parameter pointer at 0x40, and in that parameter the button type at 0 and the message pointer at 8. A mode outside 1 to 3, or a parameter that cannot be read, is treated as a user message; only Windows checks that the memory is readable, so on Linux any non-null pointer is read. The errors `0x80b80003` (not initialized), `0x80b80007` (busy), `0x80b8000b` (not running) and `0x80b8000d` (null argument) are not measured either. PPSA21564 01.007.000 (at 0x1D8C) and PPSA30839 01.003.000 (0x19690), disassembled for this entry, write this layout: 0x88 at 0x30, mode 1 and the parameter at 0x40 with the message at 8, and PPSA21564 the button type at 0. Closes when: measured on a PS5 +- [sceMsgDialogOpen](../../../core/libs/prx/libSceMsgDialog/include/MsgDialogRequest.hpp) (libSceMsgDialog) - the dialog the overlay draws is not modelled on a PS5: the labels OK, Yes, No and Cancel are English and fixed, the message is drawn with the system keyboard's bitmap font, wrapped at 36 columns and cut to 8 lines with dots, and a character the font lacks is drawn as a box. Closes when: measured on a PS5 +- [sceMsgDialogOpen](../../../core/libs/prx/libSceMsgDialog/include/MsgDialogRequest.hpp) (libSceMsgDialog) - the button ids of an answer are the button's position plus one (OK 1; YES 1 and NO 2; OK 1 and CANCEL 2) and a cancel input picks the last button; neither is measured on a PS5, nor is the id after the title closes the dialog (libSceMsgDialog.native keeps 1). Button types from 5 on are not shown. Closes when: measured on a PS5 diff --git a/docs/dev/debt/libSceMsgDialog.native.md b/docs/dev/debt/libSceMsgDialog.native.md index bcd6bc6be924..48eb0c188bd8 100644 --- a/docs/dev/debt/libSceMsgDialog.native.md +++ b/docs/dev/debt/libSceMsgDialog.native.md @@ -2,4 +2,8 @@ ### Silent stubs -- [libSceMsgDialog.native](../../../core/libs/prx/libSceMsgDialog.native/Export.cpp) - dialogs finish at `sceMsgDialogOpen` without UI and answer with button 1, so `sceMsgDialogClose` returns `NOT_RUNNING`; its result before `sceMsgDialogInitialize` follows libSceMsgDialog. `sceMsgDialogTerminate` resets running or finished dialogs and returns OK, rejecting uninitialized calls with `COMMON_DIALOG_ERROR_NOT_INITIALIZED` following shadPS4; null pointer arguments return `COMMON_DIALOG_ERROR_ARG_NULL`. +- [libSceMsgDialog.native](../../../core/libs/prx/libSceMsgDialog.native/Export.cpp) - only the user message dialogs that [libSceMsgDialog](libSceMsgDialog.md) lists as shown wait for the player; every other dialog finishes at `sceMsgDialogOpen` without UI and answers with button 1, so `sceMsgDialogClose` returns `NOT_RUNNING` for it, and a shown one that no flip drew within three seconds finishes at the next status call with button 1; its result before `sceMsgDialogInitialize` follows libSceMsgDialog. `sceMsgDialogTerminate` resets running or finished dialogs and returns OK, rejecting uninitialized calls with `COMMON_DIALOG_ERROR_NOT_INITIALIZED` following shadPS4; null pointer arguments return `COMMON_DIALOG_ERROR_ARG_NULL`. + +### Unknown function info + +- [sceMsgDialogGetResult](../../../core/libs/prx/libSceMsgDialog.native/Export.cpp) (libSceMsgDialog.native) returns the button id the player picked in a shown dialog, and 1 for every other dialog and for one the title closed; the result code is always 0. Which button ids and result codes a PS5 reports after a close or a cancel is not measured. `sceMsgDialogOpen` closes a dialog that is still waiting and shows the new one, instead of failing as libSceMsgDialog does with busy. Closes when: measured on a PS5 diff --git a/docs/dev/debt/libSceNKWeb.md b/docs/dev/debt/libSceNKWeb.md index 5b311c43edff..b1e70144a069 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/libSceNKWebCdlgInjectedBundle.md b/docs/dev/debt/libSceNKWebCdlgInjectedBundle.md new file mode 100644 index 000000000000..a4c0320fb3d1 --- /dev/null +++ b/docs/dev/debt/libSceNKWebCdlgInjectedBundle.md @@ -0,0 +1,5 @@ +# libSceNKWebCdlgInjectedBundle technical debt + +### Known export names; ABI prototypes unverified + +- [sceNKWebCdlgInjectedBundleUnknown_*_nid_no_patch](../../../core/libs/prx/libSceNKWebCdlgInjectedBundle/Export.cpp) (libSceNKWebCdlgInjectedBundle) - 1 PS5 3.20 import declarations (`WKBundleInitialize`). Their prototypes and behavior are unverified; each uses the no-parameter import-resolution convention and throws through `NotImplemented_nid_no_patch`. This records the export names without claiming an ABI or behavior. Source: [PS5-3.20_Libs](https://github.com/DNNDHH/PS5-3.20_Libs). diff --git a/docs/dev/debt/libSceNKWebKit.md b/docs/dev/debt/libSceNKWebKit.md index f257a01ba899..787e89801bb4 100644 --- a/docs/dev/debt/libSceNKWebKit.md +++ b/docs/dev/debt/libSceNKWebKit.md @@ -1,5 +1,7612 @@ # 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) - 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 | +| --- | --- | +| `JSContextCreateBacktrace` | `s77ZLU-juKw` | +| `JSRemoteInspectorDisableAutoStart` | `5xaAcGH9QLs` | +| `JSRemoteInspectorServerStart` | `2CZKDvi+xV4` | +| `JSRemoteInspectorSetLogToSystemConsole` | `K7KNByP46vs` | +| `JSRemoteInspectorSetParentProcessInformation` | `M829RJ26qMA` | +| `JSRemoteInspectorStart` | `u2XjomABnhY` | +| `JSRunLoop` | `Olb6L5-YCBE` | +| `JSSetOptions` | `vE61ounVJEI` | +| `WKAXObjectButtonState` | `Dp64o6lCLkM` | +| `WKAXObjectCopyDescription` | `YHG4TtOxLmw` | +| `WKAXObjectCopyHelpText` | `XEncuQcKGeQ` | +| `WKAXObjectCopyTitle` | `KYRL0uRR90o` | +| `WKAXObjectCopyURL` | `Np-E0FZrqkQ` | +| `WKAXObjectFrame` | `huPnixU5dNc` | +| `WKAXObjectPage` | `KrVXrd3WyfM` | +| `WKAXObjectRole` | `pt0Eyg26hqw` | +| `WKAccessibilityCanUseSecondaryAXThread` | `7bL9hbEC1w0` | +| `WKAccessibilityEnableEnhancedAccessibility` | `SFLp7Zjq3n8` | +| `WKAccessibilityEnhancedAccessibilityEnabled` | `b5bQfU9tUKo` | +| `WKAccessibilityFocusedObject` | `WqnB6ITORdg` | +| `WKAccessibilityRootObject` | `LGfu3uVGjDY` | +| `WKAddMockMediaDevice` | `OI-UUz7zMzo` | +| `WKApplicationCacheManagerDeleteAllEntries` | `RHV1W6LLOZQ` | +| `WKApplicationCacheManagerDeleteEntriesForOrigin` | `RNqLyINmGek` | +| `WKApplicationCacheManagerGetApplicationCacheOrigins` | `fquLkyv1zr4` | +| `WKAuthenticationChallengCopyRequestURL` | `A49tCnZlNyw` | +| `WKAuthenticationChallengeGetDecisionListener` | `lJhs-zI+A50` | +| `WKAuthenticationChallengeGetPreviousFailureCount` | `qqg8sYkQrGY` | +| `WKAuthenticationChallengeGetProposedCredential` | `3L6XDc-UNVA` | +| `WKAuthenticationChallengeGetProtectionSpace` | `V7Zs0n4FEKs` | +| `WKAuthenticationChallengeIsForMainResource` | `cSHyMR8vSNo` | +| `WKAuthenticationChallengeIsInMainFrame` | `HWZd3fXbPio` | +| `WKAuthenticationDecisionListenerCancel` | `Pu16MviGh5o` | +| `WKAuthenticationDecisionListenerRejectProtectionSpaceAndContinue` | `BwzMDOLhDYI` | +| `WKAuthenticationDecisionListenerUseCredential` | `opFenFdq3F4` | +| `WKBackForwardListClear` | `DF2gm2NCGhY` | +| `WKBackForwardListCopyBackListWithLimit` | `nVJKRq8gRoQ` | +| `WKBackForwardListCopyForwardListWithLimit` | `Cwoo0lEAtMQ` | +| `WKBackForwardListGetBackItem` | `xe7jxinnieM` | +| `WKBackForwardListGetBackListCount` | `dhgZVtpnSPE` | +| `WKBackForwardListGetCurrentItem` | `xA074SXcjRo` | +| `WKBackForwardListGetForwardItem` | `r2P4v9m3K3s` | +| `WKBackForwardListGetForwardListCount` | `b5kj+VbcJOI` | +| `WKBackForwardListGetItemAtIndex` | `XSK4jllLpbM` | +| `WKBackForwardListItemCopyOriginalURL` | `8PKVhejBM2Q` | +| `WKBackForwardListItemCopyTitle` | `epLzR2+diVQ` | +| `WKBackForwardListItemCopyURL` | `LcWGak3Mp3c` | +| `WKBundleAddOriginAccessAllowListEntry` | `Ec6dqG56Kog` | +| `WKBundleBackForwardListClear` | `uDz2mwaGQxc` | +| `WKBundleBackForwardListCopyItemAtIndex` | `w7TgSPl+20I` | +| `WKBundleBackForwardListGetBackListCount` | `jbkqtarv--A` | +| `WKBundleBackForwardListItemCopyChildren` | `FbPgeyqyKxw` | +| `WKBundleBackForwardListItemCopyOriginalURL` | `A3HuqQOmdmA` | +| `WKBundleBackForwardListItemCopyTarget` | `eNlDM--QehI` | +| `WKBundleBackForwardListItemCopyTitle` | `oA7TAoIYksg` | +| `WKBundleBackForwardListItemCopyURL` | `lW7Qtc4Q4bI` | +| `WKBundleBackForwardListItemHasCachedPageExpired` | `AMLRfnzY1CU` | +| `WKBundleBackForwardListItemIsInBackForwardCache` | `LKMVeWFdRNk` | +| `WKBundleBackForwardListItemIsSame` | `Q7y-M7olJkc` | +| `WKBundleBackForwardListItemIsTargetItem` | `6yQTKzljpcM` | +| `WKBundleClearHistoryForTesting` | `4XbhuyqB6pA` | +| `WKBundleClearResourceLoadStatistics` | `zm7AblpGSLk` | +| `WKBundleCreateWKDataFromUInt8Array` | `IOaozfGUAFI` | +| `WKBundleDOMWindowExtensionCreate` | `fI5-EhJqxeA` | +| `WKBundleDOMWindowExtensionGetFrame` | `VN5TX+cUFf4` | +| `WKBundleDOMWindowExtensionGetScriptWorld` | `CFtAcs7A434` | +| `WKBundleExtendClassesForParameterCoder` | `11DvPWLfwtU` | +| `WKBundleFileHandleCreateWithPath` | `wWExpSMGya0` | +| `WKBundleFrameAllowsFollowingLink` | `pmZi4yM8pxM` | +| `WKBundleFrameCallShouldCloseOnWebView` | `N+icA-jvTHs` | +| `WKBundleFrameClearOpener` | `5XkPh73uOas` | +| `WKBundleFrameContainsAnyFormControls` | `1a09+paCT5k` | +| `WKBundleFrameContainsAnyFormElements` | `H7ocC6jKOVs` | +| `WKBundleFrameCopyChildFrames` | `OfwgHjJZyGo` | +| `WKBundleFrameCopyCounterValue` | `rF5BMbyEszI` | +| `WKBundleFrameCopyInnerText` | `ZD2MP6Vzxu4` | +| `WKBundleFrameCopyLayerTreeAsText` | `lDHhVVXL4z8` | +| `WKBundleFrameCopyMIMETypeForResourceWithURL` | `9j3jntJ9Nfw` | +| `WKBundleFrameCopyName` | `HfwSYBY9ybg` | +| `WKBundleFrameCopyProvisionalURL` | `pK81BVjswyQ` | +| `WKBundleFrameCopySecurityOrigin` | `-s98d979pPQ` | +| `WKBundleFrameCopySuggestedFilenameForResourceWithURL` | `kGAitTwtXq0` | +| `WKBundleFrameCopyURL` | `xoaQMJQ9JFg` | +| `WKBundleFrameCopyWebArchiveFilteringSubframes` | `gkYgrCQKKrk` | +| `WKBundleFrameCopyWebArchive` | `kWLVY4iAwME` | +| `WKBundleFrameCreateFrameHandle` | `URUBvWtDFRU` | +| `WKBundleFrameCreateHitTestResult` | `OuVGXFusQvs` | +| `WKBundleFrameFocus` | `kgGUjo9h2ao` | +| `WKBundleFrameForJavaScriptContext` | `26sRl2nNXaE` | +| `WKBundleFrameGetContentBounds` | `NC762sOoy-g` | +| `WKBundleFrameGetDocumentBackgroundColor` | `qXfTToOHVgs` | +| `WKBundleFrameGetFrameLoadState` | `jB0PrHhQOZ8` | +| `WKBundleFrameGetJavaScriptContextForWorld` | `dmRRBt+qPcs` | +| `WKBundleFrameGetJavaScriptContext` | `eI2iByoOtYU` | +| `WKBundleFrameGetJavaScriptWrapperForFileForWorld` | `ERgb4lPId44` | +| `WKBundleFrameGetJavaScriptWrapperForNodeForWorld` | `uvtLlI3dT8o` | +| `WKBundleFrameGetJavaScriptWrapperForRangeForWorld` | `b5yYFj7O3kk` | +| `WKBundleFrameGetPage` | `P8y9OgqOGts` | +| `WKBundleFrameGetParentFrame` | `v2hk1-AZ06A` | +| `WKBundleFrameGetPendingUnloadCount` | `4ZQbnnW1z+Q` | +| `WKBundleFrameGetScrollOffset` | `hYAhYYYeVZA` | +| `WKBundleFrameGetVisibleContentBounds` | `53ZFAkGdDkU` | +| `WKBundleFrameGetVisibleContentBoundsExcludingScrollbars` | `cPtt38dvZK8` | +| `WKBundleFrameHandlesPageScaleGesture` | `-0ETdbxl-Kg` | +| `WKBundleFrameHasHorizontalScrollbar` | `PvA6Ayn4Kjk` | +| `WKBundleFrameHasVerticalScrollbar` | `v1lCb6JzKZ0` | +| `WKBundleFrameIsMainFrame` | `GJ+VEmIdxUQ` | +| `WKBundleFrameSetAccessibleName` | `IVaowWLHMK0` | +| `WKBundleFrameSetTextDirection` | `cwtdZPMOggg` | +| `WKBundleFrameStopLoading` | `6yYwCC3Gfmo` | +| `WKBundleGarbageCollectJavaScriptObjectsOnAlternateThreadForDebugging` | `aus1pUvQ7ts` | +| `WKBundleGarbageCollectJavaScriptObjects` | `vNNCUDOFpFY` | +| `WKBundleGetApplicationConnection` | `L4ZuA2XEwzw` | +| `WKBundleGetJavaScriptObjectsCount` | `IzxyWmghAig` | +| `WKBundleHitTestResultCopyAbsoluteImageURL` | `H2oBJVmx0XQ` | +| `WKBundleHitTestResultCopyAbsoluteLinkURL` | `0gETKZk91ig` | +| `WKBundleHitTestResultCopyAbsoluteMediaURL` | `rW+n1QeUDdo` | +| `WKBundleHitTestResultCopyAbsolutePDFURL` | `9+nPgH-HAXs` | +| `WKBundleHitTestResultCopyImage` | `SKZ7PFisSuc` | +| `WKBundleHitTestResultCopyLinkLabel` | `dKzR0C0qpTM` | +| `WKBundleHitTestResultCopyLinkSuggestedFilename` | `mf6n1uCzOY8` | +| `WKBundleHitTestResultCopyLinkTitle` | `-j+JFiFPjnc` | +| `WKBundleHitTestResultCopyNodeHandle` | `y-ZCGGbJyUU` | +| `WKBundleHitTestResultCopyURLElementHandle` | `S2Sb-NajDeo` | +| `WKBundleHitTestResultGetFrame` | `mGM-NRBuZvE` | +| `WKBundleHitTestResultGetImageRect` | `CHPZFRIZO7o` | +| `WKBundleHitTestResultGetIsSelected` | `-tEPJ84QOzw` | +| `WKBundleHitTestResultGetMediaType` | `YaGMXGYIWJ0` | +| `WKBundleHitTestResultGetTargetFrame` | `w32pxSSQ4Rs` | +| `WKBundleHitTestResultIsDownloadableMedia` | `moAKVLhGVOQ` | +| `WKBundleHitTestResultMediaHasAudio` | `Oe33uOtx7sI` | +| `WKBundleHitTestResultMediaIsInFullscreen` | `W6+fHPVq9Sc` | +| `WKBundleInspectorClose` | `xTfnxYXtinY` | +| `WKBundleInspectorEvaluateScriptForTest` | `b6+hAoAkJl8` | +| `WKBundleInspectorSetPageProfilingEnabled` | `-r23ePSw30o` | +| `WKBundleInspectorShow` | `KVehJeKp2gE` | +| `WKBundleIsPageBoxVisible` | `ysYpNHM+f2U` | +| `WKBundleIsProcessingUserGesture` | `flLt+xWYloc` | +| `WKBundleNavigationActionCopyDownloadAttribute` | `25mS80V8okg` | +| `WKBundleNavigationActionCopyFormElement` | `5EIJscg02gs` | +| `WKBundleNavigationActionCopyHitTestResult` | `kRoezIaLVtk` | +| `WKBundleNavigationActionGetEventModifiers` | `tyF8jxT9cso` | +| `WKBundleNavigationActionGetEventMouseButton` | `TuYK6TAg+UY` | +| `WKBundleNavigationActionGetNavigationType` | `tnvxzeWju10` | +| `WKBundleNavigationActionGetShouldOpenExternalURLs` | `Ez-Pj0QWgSc` | +| `WKBundleNavigationActionGetShouldTryAppLinks` | `x2Bw3o33jBY` | +| `WKBundleNodeHandleCopyDocumentFrame` | `o1BJoFZNBYo` | +| `WKBundleNodeHandleCopyDocument` | `H7cknGH2DVo` | +| `WKBundleNodeHandleCopyHTMLFrameElementContentFrame` | `aHUVAX-1UOA` | +| `WKBundleNodeHandleCopyHTMLIFrameElementContentFrame` | `tS9cMOapHWU` | +| `WKBundleNodeHandleCopyHTMLTableCellElementCellAbove` | `kFXtge4WNeg` | +| `WKBundleNodeHandleCopySnapshotWithOptions` | `splXjoRt+jY` | +| `WKBundleNodeHandleCopyVisibleRange` | `WisAKbUAQO0` | +| `WKBundleNodeHandleCreate` | `QJxnRATldPc` | +| `WKBundleNodeHandleGetElementBounds` | `eQyyR4yPFKQ` | +| `WKBundleNodeHandleGetHTMLInputElementAutoFillAvailable` | `wgIKemgsVmc` | +| `WKBundleNodeHandleGetHTMLInputElementAutoFillButtonBounds` | `hjt6ZGKuEfo` | +| `WKBundleNodeHandleGetHTMLInputElementAutoFillButtonEnabled` | `kuwpvpIwSXU` | +| `WKBundleNodeHandleGetHTMLInputElementAutoFillButtonType` | `O9k0o6Iqejs` | +| `WKBundleNodeHandleGetHTMLInputElementAutoFilled` | `2atcqaHtnO0` | +| `WKBundleNodeHandleGetHTMLInputElementAutofilled` | `Q13L4R2-JYU` | +| `WKBundleNodeHandleGetHTMLInputElementLastAutoFillButtonType` | `6Z7V+FlXSE8` | +| `WKBundleNodeHandleGetHTMLInputElementLastChangeWasUserEdit` | `p3uXvmETGok` | +| `WKBundleNodeHandleGetHTMLTextAreaElementLastChangeWasUserEdit` | `R+2FUI+qUB4` | +| `WKBundleNodeHandleGetRenderRect` | `TBGBVDzPzh0` | +| `WKBundleNodeHandleSetHTMLInputElementAutoFillAvailable` | `xWvs8ZzLQSI` | +| `WKBundleNodeHandleSetHTMLInputElementAutoFillButtonEnabledWithButtonType` | `F6hnPpozF2M` | +| `WKBundleNodeHandleSetHTMLInputElementAutoFillButtonEnabled` | `w07dR+ym+z8` | +| `WKBundleNodeHandleSetHTMLInputElementAutoFilledAndViewable` | `QflGzVw8KlA` | +| `WKBundleNodeHandleSetHTMLInputElementAutoFilled` | `nO8W67-kbko` | +| `WKBundleNodeHandleSetHTMLInputElementAutofilled` | `WdBxzIdie+w` | +| `WKBundleNodeHandleSetHTMLInputElementSpellcheckEnabled` | `KpfPb4yrOIM` | +| `WKBundleNodeHandleSetHTMLInputElementValueForUser` | `617HDWTYn7I` | +| `WKBundleNumberOfPages` | `Z57lo0FHij4` | +| `WKBundlePageAddUserScript` | `EizhQNDGt8o` | +| `WKBundlePageAddUserScriptInWorld` | `12tIV7cplJA` | +| `WKBundlePageAddUserStyleSheet` | `RRYOPpBTMmg` | +| `WKBundlePageCallAfterTasksAndTimers` | `udPSdxup+Q4` | +| `WKBundlePageCanHandleRequest` | `x5Ab8Um6X3k` | +| `WKBundlePageCanShowMIMEType` | `Fux56rPNtvs` | +| `WKBundlePageClearApplicationCacheForOrigin` | `fR7EjbzyBiI` | +| `WKBundlePageClearApplicationCache` | `aVtHmPYrANg` | +| `WKBundlePageClearMainFrameName` | `iP5usIxGDAI` | +| `WKBundlePageClickMenuItem` | `loO7FEttses` | +| `WKBundlePageClose` | `Y9OWNvuSVJg` | +| `WKBundlePageConfirmComposition` | `T4vOLGegdvQ` | +| `WKBundlePageConfirmCompositionWithText` | `4eheJycBxI0` | +| `WKBundlePageCopyContextMenuAtPointInWindow` | `MgyEz5SwXAI` | +| `WKBundlePageCopyContextMenuItems` | `IKfdBNxQ0Nw` | +| `WKBundlePageCopyGroupIdentifier` | `R9X0jHsH64E` | +| `WKBundlePageCopyOriginsWithApplicationCache` | `cN8iJ612c0k` | +| `WKBundlePageCopyRenderLayerTree` | `dCVd7TqyhYA` | +| `WKBundlePageCopyRenderTree` | `8Wcn9B8z17M` | +| `WKBundlePageCopyRenderTreeExternalRepresentationForPrinting` | `63tAnrWmYsQ` | +| `WKBundlePageCopyRenderTreeExternalRepresentation` | `TNbQMd1lZxU` | +| `WKBundlePageCopyTrackedRepaintRects` | `GEUAFDNuhBc` | +| `WKBundlePageCreateScaledSnapshotInDocumentCoordinates` | `RQ3j4p7RBcw` | +| `WKBundlePageCreateSnapshotInDocumentCoordinates` | `NkqH32IMG2A` | +| `WKBundlePageCreateSnapshotInViewCoordinates` | `cZrLCe6EKEA` | +| `WKBundlePageCreateSnapshotWithOptions` | `Kqv-zZ9xSIU` | +| `WKBundlePageDidEnterFullScreen` | `yR+B+74egrE` | +| `WKBundlePageDidExitFullScreen` | `GwhI3go+ZZY` | +| `WKBundlePageDumpHistoryForTesting` | `T-xpaIGNLXU` | +| `WKBundlePageExecuteEditingCommand` | `n5uAZspm8I0` | +| `WKBundlePageExtendIncrementalRenderingSuppression` | `QzaA1qde-1c` | +| `WKBundlePageFindStringMatches` | `aL5cBoo7qhs` | +| `WKBundlePageFindString` | `YPNqhQCRUS0` | +| `WKBundlePageFlushPendingEditorStateUpdate` | `iG3Y7R3AFOM` | +| `WKBundlePageForceRepaint` | `jaQ3h3J4zd4` | +| `WKBundlePageGetAppCacheUsageForOrigin` | `qjrn0E95Tak` | +| `WKBundlePageGetBackForwardList` | `myZvY137tks` | +| `WKBundlePageGetBackingScaleFactor` | `PS5n3xxFDXQ` | +| `WKBundlePageGetInspector` | `Gl9UFzi54FQ` | +| `WKBundlePageGetMainFrame` | `78YSUMVcvLY` | +| `WKBundlePageGetPageZoomFactor` | `bNfhkICjfEk` | +| `WKBundlePageGetRenderTreeSize` | `U2LcSWAxv6I` | +| `WKBundlePageGetTextZoomFactor` | `YYbrGICsiyQ` | +| `WKBundlePageHasComposition` | `v08CAVZPz-0` | +| `WKBundlePageHasLocalDataForURL` | `LDKb9CdjDC4` | +| `WKBundlePageInsertNewlineInQuotedContent` | `gOfB92L-2uE` | +| `WKBundlePageInstallPageOverlayWithAnimation` | `kUzykn1qM6c` | +| `WKBundlePageInstallPageOverlay` | `i5paVISLR78` | +| `WKBundlePageIsControlledByAutomation` | `PqTXHcj8G7U` | +| `WKBundlePageIsEditingCommandEnabled` | `UT8x3GgcrzQ` | +| `WKBundlePageIsSuspended` | `NVjEy07nN2o` | +| `WKBundlePageIsTrackingRepaints` | `viw0OkjLHgQ` | +| `WKBundlePageIsUsingDarkAppearance` | `xBZFJROAY60` | +| `WKBundlePageIsUsingEphemeralSession` | `glsQJ5HCC-U` | +| `WKBundlePageListenForLayoutMilestones` | `l5JzEGDSvhk` | +| `WKBundlePageNumberForElementById` | `wUbSyYekZ2Y` | +| `WKBundlePageOverlayClear` | `LVb-RgymeuY` | +| `WKBundlePageOverlayCreate` | `PZlpwRuzFII` | +| `WKBundlePageOverlayFractionFadedIn` | `F2mHImVJQPM` | +| `WKBundlePageOverlaySetAccessibilityClient` | `JBugz1LKFAA` | +| `WKBundlePageOverlaySetNeedsDisplay` | `InWCDUOqVQI` | +| `WKBundlePagePostMessageIgnoringFullySynchronousMode` | `EjX3MmMvpTs` | +| `WKBundlePagePostMessage` | `guJxsLkYX9Q` | +| `WKBundlePagePostSynchronousMessageForTesting` | `ehmCBZYH-cM` | +| `WKBundlePageRegisterScrollOperationCompletionCallback` | `2HHbbKYM7DE` | +| `WKBundlePageRemoveAllUserContent` | `iPFjGWz0FJc` | +| `WKBundlePageReplaceStringMatches` | `h7sU7HPh5QU` | +| `WKBundlePageResetApplicationCacheOriginQuota` | `PzOv16iXyDg` | +| `WKBundlePageResetTrackedRepaints` | `6IFQEEuM7Yg` | +| `WKBundlePageSetAppCacheMaximumSize` | `sSb3te485KU` | +| `WKBundlePageSetApplicationCacheOriginQuota` | `d1bcQFkjzUE` | +| `WKBundlePageSetBottomOverhangImage` | `8KiOeSAspEg` | +| `WKBundlePageSetComposition` | `xFnlhQw0Zfc` | +| `WKBundlePageSetContextMenuClient` | `5zSE85dlaJM` | +| `WKBundlePageSetDefersLoading` | `Rm6Y9lnzm3c` | +| `WKBundlePageSetEditorClient` | `TLWK+2sKnf8` | +| `WKBundlePageSetEventThrottlingBehaviorOverride` | `e2FFaTvxUkI` | +| `WKBundlePageSetFooterBanner` | `QGKXBRNQtXw` | +| `WKBundlePageSetFormClient` | `Wt+5HR0R1Qw` | +| `WKBundlePageSetFullScreenClient` | `pszozBA4Ceo` | +| `WKBundlePageSetHeaderBanner` | `dzrr2-LTKnA` | +| `WKBundlePageSetPageLoaderClient` | `fE-UQfy62Jk` | +| `WKBundlePageSetPageZoomFactor` | `ijPJrSMtqIY` | +| `WKBundlePageSetPaintedObjectsCounterThreshold` | `Z8ZrDDxJDjY` | +| `WKBundlePageSetPolicyClient` | `kl9cnbrBzrA` | +| `WKBundlePageSetResourceLoadClient` | `o1r9YJZRP+Y` | +| `WKBundlePageSetScaleAtOrigin` | `wnMuJEY0ZwE` | +| `WKBundlePageSetTextZoomFactor` | `2YvlXyxJyaE` | +| `WKBundlePageSetTopOverhangImage` | `cfnEnkthkGo` | +| `WKBundlePageSetTracksRepaints` | `K57m00RjFaQ` | +| `WKBundlePageSetUIClient` | `XsDPaQ2pLiY` | +| `WKBundlePageSetUseDarkAppearance` | `3csGEmgGKTs` | +| `WKBundlePageSimulateMouseDown` | `ngbXXOIU8do` | +| `WKBundlePageSimulateMouseMotion` | `ZdzEii0dolA` | +| `WKBundlePageSimulateMouseUp` | `Vpb7K6EYJJk` | +| `WKBundlePageSizeAndMarginsInPixels` | `jkegjwQVzUM` | +| `WKBundlePageStartMonitoringScrollOperations` | `WiHMx2bAvlI` | +| `WKBundlePageStopExtendingIncrementalRenderingSuppression` | `Xzpfd5uJNNk` | +| `WKBundlePageStopLoading` | `RLX+9a49tZU` | +| `WKBundlePageUninstallPageOverlay` | `AXkUptcZr1w` | +| `WKBundlePageUninstallPageOverlayWithAnimation` | `fl+SfiowG5M` | +| `WKBundlePageWillEnterFullScreen` | `YK+c8n2US1E` | +| `WKBundlePageWillExitFullScreen` | `1nU++CN0ObE` | +| `WKBundlePostMessage` | `ZAywbC2T+Nw` | +| `WKBundlePostSynchronousMessage` | `q2EidydGLu8` | +| `WKBundleRangeHandleCopySnapshotWithOptions` | `DUFkuflD2aY` | +| `WKBundleRangeHandleCreate` | `FRDcroFI5oQ` | +| `WKBundleRangeHandleGetBoundingRectInWindowCoordinates` | `u2vunBIph6w` | +| `WKBundleReleaseMemory` | `Zuc39RxgKlE` | +| `WKBundleRemoveAllWebNotificationPermissions` | `ldxacgzSYVM` | +| `WKBundleRemoveOriginAccessAllowListEntry` | `YkgkKjq1zjk` | +| `WKBundleReportException` | `JiaW5n2B77U` | +| `WKBundleResetOriginAccessAllowLists` | `8wD6Sq3WBcA` | +| `WKBundleResourceLoadStatisticsNotifyObserver` | `HWRP4l2b7pE` | +| `WKBundleScriptWorldClearWrappers` | `MzpjLnMjdwE` | +| `WKBundleScriptWorldCopyName` | `DvKkBV1hFE8` | +| `WKBundleScriptWorldCreateWorld` | `f2hz+NhGpbw` | +| `WKBundleScriptWorldDisableOverrideBuiltinsBehavior` | `arhBKRy2grc` | +| `WKBundleScriptWorldMakeAllShadowRootsOpen` | `MddMup7PwZk` | +| `WKBundleScriptWorldNormalWorld` | `2SSw6lT8qJo` | +| `WKBundleSetClient` | `6Sajlv-clVQ` | +| `WKBundleSetDatabaseQuota` | `TIWikmyjjYo` | +| `WKBundleSetServiceWorkerProxyCreationCallback` | `tow2sT8FF3c` | +| `WKBundleSetTabKeyCyclesThroughElements` | `t7K3DznwwOU` | +| `WKBundleSetWebNotificationPermission` | `-67rxYq1qZo` | +| `WKClearMockMediaDevices` | `ogjjVYnBJR8` | +| `WKConnectionPostMessage` | `HRkYAo+HK5w` | +| `WKConnectionSetConnectionClient` | `YRlm9YSeOYE` | +| `WKContextAddSupportedPlugin` | `REZbDZa4btY` | +| `WKContextAddVisitedLink` | `AtKeeOk+CQI` | +| `WKContextAllowSpecificHTTPSCertificateForHost` | `Wb5DMLak0yg` | +| `WKContextClearCurrentModifierStateForTesting` | `Yk2qJg3VRBY` | +| `WKContextClearSupportedPlugins` | `XIckVUXyJsE` | +| `WKContextClearVisitedLinks` | `HiehcAiEDCc` | +| `WKContextCopyPlugInAutoStartOriginHashes` | `G4+RWlGLEt0` | +| `WKContextCreate` | `EnYKPlIQ0DA` | +| `WKContextCreateWithConfiguration` | `XgehYXFKMDs` | +| `WKContextCreateWithInjectedBundlePath` | `2lRXRLy4Pfc` | +| `WKContextDisableProcessTermination` | `2jwy6+fFilk` | +| `WKContextDownloadURLRequest` | `DDW8PFTS+1g` | +| `WKContextEnableProcessTermination` | `FJB0fZbTUWY` | +| `WKContextGarbageCollectJavaScriptObjects` | `MBIrQeS3ILw` | +| `WKContextGetAccessibilityEnabled` | `YREfLD1wwT0` | +| `WKContextGetApplicationCacheManager` | `PZzcUP8YYkg` | +| `WKContextGetCacheModel` | `vdM7J5Xjh2A` | +| `WKContextGetGeolocationManager` | `GJsL9usTdig` | +| `WKContextGetGlobalStatistics` | `cLN+-CVotuU` | +| `WKContextGetIconDatabase` | `YQEg-76vfzE` | +| `WKContextGetKeyValueStorageManager` | `XlTwFUI6oSI` | +| `WKContextGetMaximumNumberOfProcesses` | `5sd-RroOg-w` | +| `WKContextGetNotificationManager` | `ZGEEHCN2FvE` | +| `WKContextGetResourceCacheManager` | `N3bGYLHZl48` | +| `WKContextGetStatisticsWithOptions` | `lihFGjz1c-c` | +| `WKContextGetStatistics` | `dNMdheP8oUQ` | +| `WKContextGetUsesSingleWebProcess` | `qZDRsY7kQ0s` | +| `WKContextGetWebsiteDataStore` | `dDc6-iayAyg` | +| `WKContextJavaScriptConfigurationFileEnabled` | `efD5N1zaabU` | +| `WKContextMenuCopySubmenuItems` | `PyySvnK-JGM` | +| `WKContextMenuItemCopyTitle` | `r0bRjKqIBxE` | +| `WKContextMenuItemCreateAsAction` | `FL+PbMcEVGI` | +| `WKContextMenuItemCreateAsCheckableAction` | `k0495LPSWPU` | +| `WKContextMenuItemCreateAsSubmenu` | `VpslPflOWdM` | +| `WKContextMenuItemGetChecked` | `42HcmdjlDmc` | +| `WKContextMenuItemGetEnabled` | `gEV0JIqdYdg` | +| `WKContextMenuItemGetTag` | `I849n0yCszo` | +| `WKContextMenuItemGetType` | `bIdRTPcRP7w` | +| `WKContextMenuItemGetUserData` | `oRR5HoDuB7Y` | +| `WKContextMenuItemSeparatorItem` | `yOyUp3CncVw` | +| `WKContextMenuItemSetUserData` | `nsNNFzmax7s` | +| `WKContextPostMessageToInjectedBundle` | `N93Nb5-YJsw` | +| `WKContextPreconnectToServer` | `MQI+nL6CJkU` | +| `WKContextRefreshPlugIns` | `F+7llwLcYHI` | +| `WKContextRegisterURLSchemeAsBypassingContentSecurityPolicy` | `FTDt5KHGsco` | +| `WKContextRegisterURLSchemeAsCachePartitioned` | `DHbAda1fa1k` | +| `WKContextRegisterURLSchemeAsCanDisplayOnlyIfCanRequest` | `rAU9SRsnG3E` | +| `WKContextRegisterURLSchemeAsEmptyDocument` | `ad1-t6xKVtA` | +| `WKContextRegisterURLSchemeAsSecure` | `6P04fQkPVec` | +| `WKContextResumeDownload` | `bIU19RyXVUg` | +| `WKContextSetAccessibilityEnabled` | `05HZtE0FPg0` | +| `WKContextSetAdditionalPluginsDirectory` | `BFnY5ZzK7-Q` | +| `WKContextSetAlwaysUsesComplexTextCodePath` | `Y3Z2695WJ8E` | +| `WKContextSetCacheModel` | `4mVOglFcW8E` | +| `WKContextSetCanHandleHTTPSServerTrustEvaluation` | `L205EzJvP-Q` | +| `WKContextSetClient` | `s19dG0nY-dE` | +| `WKContextSetConnectionClient` | `S4qCVFS2p1Y` | +| `WKContextSetCustomWebContentServiceBundleIdentifier` | `HS0m+kyKMKc` | +| `WKContextSetDiskCacheSpeculativeValidationEnabled` | `ukKiCHfFJVQ` | +| `WKContextSetDomainRelaxationForbiddenForURLScheme` | `WxgH0vvD708` | +| `WKContextSetFontAllowList` | `MhG9BMS7pSQ` | +| `WKContextSetHTTPPipeliningEnabled` | `JephqDWR6Pc` | +| `WKContextSetHistoryClient` | `voUp4sJ5mfU` | +| `WKContextSetIconDatabasePath` | `b9TiSloCiTs` | +| `WKContextSetInitializationUserDataForInjectedBundle` | `lAIOtUCPCdo` | +| `WKContextSetInjectedBundleClient` | `VULFTpwEXW0` | +| `WKContextSetInvalidMessageFunction` | `v+TCMUBUWog` | +| `WKContextSetJavaScriptConfigurationFileEnabled` | `NkDv+zQRTXw` | +| `WKContextSetJavaScriptGarbageCollectorTimerEnabled` | `CDa5R6cq2+M` | +| `WKContextSetMaximumNumberOfProcesses` | `zgt5jBUZjPw` | +| `WKContextSetMemoryCacheDisabled` | `Gy--AnYjtr8` | +| `WKContextSetPlugInAutoStartOriginHashes` | `TrdyIAAxZHw` | +| `WKContextSetPlugInAutoStartOriginsFilteringOutEntriesAddedAfterTime` | `l1XmBaP5k6w` | +| `WKContextSetPlugInAutoStartOrigins` | `d-GQB0t83+s` | +| `WKContextSetPrewarmsProcessesAutomatically` | `9LzZhiXxOL8` | +| `WKContextSetPrimaryWebsiteDataStore` | `Kk9wy--VFwo` | +| `WKContextSetUseSeparateServiceWorkerProcess` | `nd01aT+29+Y` | +| `WKContextSetUsesNetworkProcess` | `5yZOVXSHWpo` | +| `WKContextSetUsesSingleWebProcess` | `kIR9uG8dfTY` | +| `WKContextStartMemorySampler` | `xXWslPRXf9Y` | +| `WKContextStopMemorySampler` | `4k3e7qWpRcU` | +| `WKContextTerminateServiceWorkers` | `i8HHFDiCd4U` | +| `WKContextWarmInitialProcess` | `MmCFL5GXGL8` | +| `WKCookieManagerDeleteAllCookies` | `HuqEAwuDxe8` | +| `WKCookieManagerDeleteAllCookiesModifiedAfterDate` | `iEypYwTA7F0` | +| `WKCookieManagerDeleteCookiesForHostname` | `4gJ2MFHUsvY` | +| `WKCookieManagerGetHTTPCookieAcceptPolicy` | `d9tCx7OTo00` | +| `WKCookieManagerGetHostnamesWithCookies` | `FNCVZgUSgfw` | +| `WKCookieManagerSetClient` | `q-Hwxr4yls0` | +| `WKCookieManagerSetHTTPCookieAcceptPolicy` | `a7yz7vOyBxk` | +| `WKCookieManagerStartObservingCookieChanges` | `vyOiJyvWOik` | +| `WKCookieManagerStopObservingCookieChanges` | `ebPeu+4eyj8` | +| `WKDownloadCopyRequest` | `9AGT4R9XxlU` | +| `WKDownloadGetOriginatingPage` | `44ygghy3b4E` | +| `WKDownloadGetWasUserInitiated` | `YqiQrQV1Wbk` | +| `WKErrorCopyDomain` | `CbWxMDgV5WQ` | +| `WKErrorCopyFailingURL` | `Rcz4V01xRBo` | +| `WKErrorGetErrorCode` | `Jx+jaw-BVuE` | +| `WKFormSubmissionListenerContinue` | `NRF4gBL1p9o` | +| `WKFrameCanProvideSource` | `pupKRlW6z-w` | +| `WKFrameCanShowMIMEType` | `K5V0IcHAoOE` | +| `WKFrameCopyMIMEType` | `UwMYQFss8oM` | +| `WKFrameCopyProvisionalURL` | `dAKWNwkRfZw` | +| `WKFrameCopyTitle` | `kEags+FqdZQ` | +| `WKFrameCopyURL` | `3PiMrWNwmgw` | +| `WKFrameCopyUnreachableURL` | `U4g7RC9mWd8` | +| `WKFrameCreateFrameHandle` | `3MUp7-9-xkg` | +| `WKFrameCreateFrameInfo` | `iUg3lPaKd4E` | +| `WKFrameGetCertificateInfo` | `L1HtA3ROv5k` | +| `WKFrameGetFrameLoadState` | `82n4LwLnE3s` | +| `WKFrameGetMainResourceData` | `wd3NsMeiyj4` | +| `WKFrameGetPage` | `pAEazR4ifq8` | +| `WKFrameGetResourceData` | `heyzb1EgSYg` | +| `WKFrameGetWebArchive` | `OF6uR63q+Ss` | +| `WKFrameHandleGetFrameID` | `LPzmQHV7qEo` | +| `WKFrameInfoCreateFrameHandleRef` | `lQUbnRQ699M` | +| `WKFrameIsDisplayingMarkupDocument` | `vwFaWsNoiQw` | +| `WKFrameIsDisplayingStandaloneImageDocument` | `3HDn1r7lsGM` | +| `WKFrameIsFrameSet` | `BTOv1017JlU` | +| `WKFrameIsMainFrame` | `fo3MaNfUAUE` | +| `WKFramePolicyListenerDownload` | `IT1HfKWFBQ0` | +| `WKFramePolicyListenerIgnore` | `0ppk-ExuWJA` | +| `WKFramePolicyListenerUseInNewProcess` | `P67QGjv0uSA` | +| `WKFramePolicyListenerUseInNewProcessWithPolicies` | `vDrj6vV4d60` | +| `WKFramePolicyListenerUse` | `K-2wOp7OEL8` | +| `WKFramePolicyListenerUseWithPolicies` | `82bVw8qSCFc` | +| `WKFrameStopLoading` | `R8pxYSQQqcY` | +| `WKGeolocationManagerProviderDidChangePosition` | `NB5lJxGW9Ro` | +| `WKGeolocationManagerProviderDidFailToDeterminePosition` | `0jIcJu0tb+o` | +| `WKGeolocationManagerProviderDidFailToDeterminePositionWithErrorMessage` | `NTLwhm+Wfk8` | +| `WKGeolocationManagerSetProvider` | `55QR+rnq6FI` | +| `WKGeolocationPermissionRequestAllow` | `d1IXlZ0caEU` | +| `WKGeolocationPermissionRequestDeny` | `GB8w2Gfd0Ag` | +| `WKHTTPCookieStoreDeleteAllCookies` | `mVoWS3zTfxs` | +| `WKHTTPCookieStoreSetCookieForHostname` | `bXKJvpaEKpk` | +| `WKHTTPCookieStoreSetHTTPCookieAcceptPolicy` | `AP4g3QKWeFg` | +| `WKHitTestResultCopyAbsoluteImageURL` | `P12aEEi4s4E` | +| `WKHitTestResultCopyAbsoluteLinkURL` | `OH5zZpRwHFU` | +| `WKHitTestResultCopyAbsoluteMediaURL` | `YB3XBmlN7VY` | +| `WKHitTestResultCopyAbsolutePDFURL` | `xvOmFQg-ZsM` | +| `WKHitTestResultCopyLinkLabel` | `hMO1lc6DG4o` | +| `WKHitTestResultCopyLinkTitle` | `5kKBK5wylwI` | +| `WKHitTestResultCopyLookupText` | `9bbMhTfv3nY` | +| `WKHitTestResultGetElementBoundingBox` | `MybHsH8cii0` | +| `WKHitTestResultIsContentEditable` | `iioP3xFfzJ8` | +| `WKIconDatabaseCheckIntegrityBeforeOpening` | `Q6e57L2Vat8` | +| `WKIconDatabaseClose` | `D6zZXKyK2XI` | +| `WKIconDatabaseCopyIconDataForPageURL` | `ErWkFcqcBYE` | +| `WKIconDatabaseCopyIconURLForPageURL` | `PEWusNk7cIM` | +| `WKIconDatabaseEnableDatabaseCleanup` | `Fg2BRITDYDg` | +| `WKIconDatabaseReleaseIconForURL` | `pKUEWyAWkeI` | +| `WKIconDatabaseRemoveAllIcons` | `LMXftlH0v2Y` | +| `WKIconDatabaseRetainIconForURL` | `0parhLSAuME` | +| `WKIconDatabaseSetIconDataForIconURL` | `djSqL8eVr2s` | +| `WKIconDatabaseSetIconDatabaseClient` | `onHPS6AKnl0` | +| `WKIconDatabaseSetIconURLForPageURL` | `jUMADs-SOQc` | +| `WKImageCreate` | `AxkrIoArfIs` | +| `WKImageCreateCairoSurface` | `1QfyjHj40es` | +| `WKImageCreateFromCairoSurface` | `jJePHioTWw0` | +| `WKImageGetSize` | `NfSMc-E4OA0` | +| `WKImeEventGetInputLanguage` | `YZP9-KrWVgc` | +| `WKImeEventMake` | `E5qbM3aFc2s` | +| `WKImeEventRelease` | `7Oc5AygU+9Q` | +| `WKInspectorAttach` | `MPUvOTneByk` | +| `WKInspectorClose` | `BjYGyklZu78` | +| `WKInspectorConnect` | `il8-JtRpqUk` | +| `WKInspectorDetach` | `xhDUq5emaGw` | +| `WKInspectorGetPage` | `qs+B5yWiMc4` | +| `WKInspectorHide` | `AhwGp7JtQjI` | +| `WKInspectorIsAttached` | `rMnQ2wsSy-c` | +| `WKInspectorIsConnected` | `ceIT7njviKk` | +| `WKInspectorIsElementSelectionActive` | `myuvNr1jabQ` | +| `WKInspectorIsFront` | `5ixVUdmlq1o` | +| `WKInspectorIsProfilingPage` | `iqeXTpstIeg` | +| `WKInspectorIsVisible` | `pSqC0JZWBsU` | +| `WKInspectorShowConsole` | `tYLQOjzG0RI` | +| `WKInspectorShowMainResourceForFrame` | `Fa62NGp3wkk` | +| `WKInspectorShow` | `PZyF8v8vWmo` | +| `WKInspectorShowResources` | `m4fssAbVP-k` | +| `WKInspectorToggleElementSelection` | `mdJr3sGWWoU` | +| `WKInspectorTogglePageProfiling` | `rTTWU3xHaCE` | +| `WKKeyValueStorageManagerDeleteAllEntries` | `l+EnasCRj9M` | +| `WKKeyValueStorageManagerDeleteEntriesForOrigin` | `uUq1q3l2pD0` | +| `WKKeyValueStorageManagerGetCreationTimeKey` | `peSbz8jaqpo` | +| `WKKeyValueStorageManagerGetKeyValueStorageOrigins` | `oGlYuEguJWk` | +| `WKKeyValueStorageManagerGetModificationTimeKey` | `luMlXp-022c` | +| `WKKeyValueStorageManagerGetOriginKey` | `Bk3H5AlkwIM` | +| `WKKeyValueStorageManagerGetStorageDetailsByOrigin` | `D2O5KU7KlMo` | +| `WKKeyboardEventMake` | `UJXHm7AkPK8` | +| `WKMessageListenerSendReply` | `9Rvb-lG-IYI` | +| `WKMouseEventMake` | `4LPi8JtvxYQ` | +| `WKNavigationActionShouldPerformDownload` | `dy5gXrUocbc` | +| `WKNavigationDataCopyNavigationDestinationURL` | `VBpaH-iDg48` | +| `WKNavigationDataCopyOriginalRequest` | `S-xPXI+4q9E` | +| `WKNavigationDataCopyTitle` | `4zsaU7SmJeE` | +| `WKNavigationDataCopyURL` | `Iz8WjECFHIY` | +| `WKNavigationResponseCanShowMIMEType` | `zDNEy9hON-w` | +| `WKNotificationCopyBody` | `mLDfb0Bl+A8` | +| `WKNotificationCopyIconURL` | `WFLFSRXPRn0` | +| `WKNotificationCopyLang` | `C0Zzwfz-3bw` | +| `WKNotificationCopyTag` | `OP-xJR9Y+G0` | +| `WKNotificationCopyTitle` | `TFclhiSEXqI` | +| `WKNotificationGetID` | `6+JjX8dugXY` | +| `WKNotificationGetSecurityOrigin` | `f5y9sv5r5hs` | +| `WKNotificationManagerProviderDidClickNotification` | `U3ua0NGm+jE` | +| `WKNotificationManagerProviderDidCloseNotifications` | `IeQSRVoUfPw` | +| `WKNotificationManagerProviderDidRemoveNotificationPolicies` | `gjIRPiBLogA` | +| `WKNotificationManagerProviderDidShowNotification` | `7mQ26kdVI1U` | +| `WKNotificationManagerSetProvider` | `7LaChig9ovU` | +| `WKNotificationPermissionRequestDeny` | `b9wqZKzgejI` | +| `WKOpenPanelParametersCopyAcceptedFileExtensions` | `13zq0KIVJJg` | +| `WKOpenPanelParametersCopyAcceptedMIMETypes` | `FajrozYzGvw` | +| `WKOpenPanelParametersCopyAllowedMIMETypes` | `YacE5rS1b3k` | +| `WKOpenPanelParametersCopyCapture` | `9HzWfg82K2w` | +| `WKOpenPanelParametersCopySelectedFileNames` | `Oa8DwUsT8yg` | +| `WKOpenPanelParametersGetAllowsDirectories` | `yZ8MpxQizWM` | +| `WKOpenPanelParametersGetAllowsMultipleFiles` | `6JUqQUan7cM` | +| `WKOpenPanelParametersGetMediaCaptureType` | `UYD2jkWiCr0` | +| `WKOpenPanelResultListenerCancel` | `O0YiYsUaleQ` | +| `WKOpenPanelResultListenerChooseFiles` | `2ChSmFDC91I` | +| `WKPageAreScrollbarAnimationsSuppressed` | `OQYQvowtC6I` | +| `WKPageBackgroundExtendsBeyondPage` | `qKJ2G1pGKmU` | +| `WKPageBeginPrinting` | `hujPhSbtd4A` | +| `WKPageBlurFocusedNode` | `vAi26oOxOMw` | +| `WKPageCallAfterNextPresentationUpdate` | `yIrZrdWAxtc` | +| `WKPageCanGoBack` | `pX7xZaOlPk8` | +| `WKPageCanGoForward` | `-ol1QIFvnE4` | +| `WKPageCenterSelectionInVisibleArea` | `Cc6pT9g-ZIk` | +| `WKPageClearLoadedSubresourceDomains` | `fikio+oFpEs` | +| `WKPageClearSelection` | `Wl0OUqhLPnk` | +| `WKPageClearUserMediaState` | `SLmN+1BEUig` | +| `WKPageClearWheelEventTestMonitor` | `XJLGUoS-3wI` | +| `WKPageClose` | `h2cIHUQsu9w` | +| `WKPageComputePagesForPrinting` | `uuF9vP1RSZ8` | +| `WKPageCopyActiveURL` | `xKQvzQ1q63A` | +| `WKPageCopyApplicationNameForUserAgent` | `0PYkLRuvLMw` | +| `WKPageCopyCommittedURL` | `KKdrRaSLnoA` | +| `WKPageCopyCustomTextEncodingName` | `Vrdrxhj+Ijg` | +| `WKPageCopyCustomUserAgent` | `71-1jbC1u24` | +| `WKPageCopyPageConfiguration` | `DKUoV-3Xc6A` | +| `WKPageCopyPendingAPIRequestURL` | `ZXTUvqK3vIs` | +| `WKPageCopyProvisionalURL` | `2DE3xMWxTBI` | +| `WKPageCopyRelatedPages` | `ad80l3NdwB0` | +| `WKPageCopySessionState` | `8f-nCwwanrs` | +| `WKPageCopyStandardUserAgentWithApplicationName` | `5ZB8LnSchsU` | +| `WKPageCopyTitle` | `0X7Pah5xV04` | +| `WKPageCopyUserAgent` | `Koswc4Sp+N4` | +| `WKPageCountStringMatches` | `gOGhJBRxnS8` | +| `WKPageDidAllowPointerLock` | `q0vhGj7e1tU` | +| `WKPageDidDenyPointerLock` | `O2XMxxTJU8w` | +| `WKPageEndPrinting` | `ffNVq81OG9I` | +| `WKPageExecuteCommand` | `YbG9PpCoMm8` | +| `WKPageFindString` | `7I+E3HMa9PI` | +| `WKPageFindStringMatches` | `n8IqpiMeeZ4` | +| `WKPageFixedLayoutSize` | `qMOzfrrKkfo` | +| `WKPageForceRepaint` | `L2jVFKnqSH8` | +| `WKPageGetAddsVisitedLinks` | `YdnEIPIgM98` | +| `WKPageGetAllowsRemoteInspection` | `X20cr8FFQkI` | +| `WKPageGetBackForwardList` | `tgt2iAIloys` | +| `WKPageGetBackingScaleFactor` | `e0jjfsQdveM` | +| `WKPageGetBytecodeProfile` | `pnGWJKqlAss` | +| `WKPageGetContentsAsMHTMLData` | `HFaF1BclnSo` | +| `WKPageGetContentsAsString` | `wyMkX6F1ijI` | +| `WKPageGetContext` | `fLfh+wZ12vQ` | +| `WKPageGetEstimatedProgress` | `EEXgOrxJ1go` | +| `WKPageGetFocusedFrame` | `a0SVtiDOBgM` | +| `WKPageGetFrameSetLargestFrame` | `dKIIZYGCGhQ` | +| `WKPageGetGapBetweenPages` | `F-vtAS2uuns` | +| `WKPageGetImageForFindMatch` | `KPPJLasPz+o` | +| `WKPageGetInspector` | `QUMw9Z2Ia1I` | +| `WKPageGetIsControlledByAutomation` | `+uRH8ci2Zu8` | +| `WKPageGetMainFrame` | `LbWS4xY+szs` | +| `WKPageGetMediaCaptureEnabled` | `c4qOBt1+nO8` | +| `WKPageGetMediaState` | `F4AnS9A-OSc` | +| `WKPageGetPageCount` | `SnlaglxT1-4` | +| `WKPageGetPageGroup` | `hNDMuB-dgfE` | +| `WKPageGetPageLength` | `FeYrnuEZxkI` | +| `WKPageGetPageZoomFactor` | `fPJ3h4AHMkU` | +| `WKPageGetPaginationBehavesLikeColumns` | `QyAWkI0ffLQ` | +| `WKPageGetPaginationLineGridEnabled` | `vHCGXG+KeDA` | +| `WKPageGetPaginationMode` | `kk2zHgt--8E` | +| `WKPageGetProcessIdentifier` | `llISO4CgRb8` | +| `WKPageGetRenderTreeSize` | `kfVCX7XUVkM` | +| `WKPageGetSamplingProfilerOutput` | `tnytRb-rZp4` | +| `WKPageGetScaleFactor` | `is2FV8Y-bMc` | +| `WKPageGetScrollPinningBehavior` | `L6HDX5ZnQps` | +| `WKPageGetSelectionAsWebArchiveData` | `Ck7bElZaJ-4` | +| `WKPageGetSessionBackForwardListItemValueType` | `Xadpbt8wQXo` | +| `WKPageGetSessionHistoryURLValueType` | `lfWRbhGF-vQ` | +| `WKPageGetSourceForFrame` | `plbxmi4Te84` | +| `WKPageGetTextZoomFactor` | `pNy9E8Now3M` | +| `WKPageGoBack` | `o2fPZBklfHg` | +| `WKPageGoForward` | `T2GU7yBLQNA` | +| `WKPageGoToBackForwardListItem` | `YE3MRmCjo0Y` | +| `WKPageHandleImeEvent` | `7cGuv-8-6jE` | +| `WKPageHandleKeyboardEvent` | `KT3+V4XYj7w` | +| `WKPageHandleMouseEvent` | `zf4+IDdC57s` | +| `WKPageHandleWheelEvent` | `9HtGt7M9cMs` | +| `WKPageHasHorizontalScrollbar` | `gqkmh6zYT9U` | +| `WKPageHasSelectedRange` | `pY1NNqZbJ+4` | +| `WKPageHasVerticalScrollbar` | `gmh9dPLZ8rE` | +| `WKPageHideFindUI` | `BSE1GBeHulw` | +| `WKPageHorizontalRubberBandingIsEnabled` | `2S-hLekYP7g` | +| `WKPageIsClosed` | `ErgHdDWCpVc` | +| `WKPageIsContentEditable` | `Jub+F7uGS58` | +| `WKPageIsMockRealtimeMediaSourceCenterEnabled` | `AfexwR3oSR8` | +| `WKPageIsPinnedToBottomSide` | `0Snx5Y8fnAk` | +| `WKPageIsPinnedToLeftSide` | `KwQN78iZcJU` | +| `WKPageIsPinnedToRightSide` | `NbMwXYcno7g` | +| `WKPageIsPinnedToTopSide` | `pWFZWkRX16M` | +| `WKPageIsPlayingAudio` | `Khlt38metko` | +| `WKPageListenForLayoutMilestones` | `nyocBnafYt8` | +| `WKPageLoadAlternateHTMLStringWithUserData` | `Qc7JdXm7QLA` | +| `WKPageLoadAlternateHTMLString` | `pxsEKRiWAMw` | +| `WKPageLoadData` | `BqraEMdP6jc` | +| `WKPageLoadDataWithUserData` | `AWvkva1I29A` | +| `WKPageLoadFileWithUserData` | `4u5CIZrB1wU` | +| `WKPageLoadHTMLString` | `60PjHzkyxhA` | +| `WKPageLoadHTMLStringWithUserData` | `V7pB9s2vJY8` | +| `WKPageLoadPlainTextString` | `2FLN6z7Tga0` | +| `WKPageLoadPlainTextStringWithUserData` | `yZ9-GqpKktw` | +| `WKPageLoadURL` | `8nRcqN+Rt-Q` | +| `WKPageLoadURLRequest` | `NqAbR6zFA64` | +| `WKPageLoadURLRequestWithUserData` | `WlFOMTjIwrc` | +| `WKPageLoadURLWithShouldOpenExternalURLsPolicy` | `Kw7arNPVPak` | +| `WKPageLoadURLWithUserData` | `0xQypcNgVg0` | +| `WKPageLoadWebArchiveData` | `L8K+i+0CWw8` | +| `WKPageLoadWebArchiveDataWithUserData` | `CqvGTLhOV70` | +| `WKPageLoadedSubresourceDomains` | `444+v4xOtlA` | +| `WKPageLookUpFrameFromHandle` | `OS2EuVvqy6g` | +| `WKPagePostMessageToInjectedBundle` | `iHPXwHi7Qwk` | +| `WKPageReloadExpiredOnly` | `EpAnju3ofLU` | +| `WKPageReloadFromOrigin` | `QXXRejGXJrc` | +| `WKPageReload` | `MAmLGadodRE` | +| `WKPageReloadWithoutContentBlockers` | `rza9NDv-OoI` | +| `WKPageRenderTreeExternalRepresentation` | `jLmjAIno8oQ` | +| `WKPageRequestStorageAccessConfirmResultListenerCall` | `JfGd39hq3Ik` | +| `WKPageRestoreFromSessionState` | `0vC8zP+wJyI` | +| `WKPageRestoreFromSessionStateWithoutNavigation` | `60j3hXkW9+4` | +| `WKPageResumeActiveDOMObjectsAndAnimations` | `3GC9QQlTKoU` | +| `WKPageRubberBandsAtBottom` | `l4ZCWwdqXko` | +| `WKPageRubberBandsAtLeft` | `caZqJUbMXKc` | +| `WKPageRubberBandsAtRight` | `tI-w0kRXieM` | +| `WKPageRubberBandsAtTop` | `ErwSbohShIc` | +| `WKPageRunBeforeUnloadConfirmPanelResultListenerCall` | `T-GOS0yg738` | +| `WKPageRunJavaScriptAlertResultListenerCall` | `6LmTCyxtXgo` | +| `WKPageRunJavaScriptConfirmResultListenerCall` | `8tUBw7skPZ0` | +| `WKPageRunJavaScriptInMainFrame` | `BRYaC0en9CQ` | +| `WKPageRunJavaScriptPromptResultListenerCall` | `e+Fq1ZZzkyE` | +| `WKPageSelectContextMenuItem` | `GvAwpvKsjPc` | +| `WKPageSelectFindMatch` | `HX9slXuFM5c` | +| `WKPageSetAddsVisitedLinks` | `OCteYQ6w5Ok` | +| `WKPageSetAllowsRemoteInspection` | `NPIf8oAxOuM` | +| `WKPageSetApplicationNameForUserAgent` | `x+PBjiexUWI` | +| `WKPageSetBackgroundExtendsBeyondPage` | `iT5rGSq18GI` | +| `WKPageSetCaretVisible` | `9BHilYtCbmo` | +| `WKPageSetControlledByAutomation` | `EgErBK3HZNc` | +| `WKPageSetCustomBackingScaleFactor` | `iot3o+WKLVI` | +| `WKPageSetCustomUserAgent` | `wyOUIvHW0EE` | +| `WKPageSetEnableHorizontalRubberBanding` | `s7QZGcHR6hI` | +| `WKPageSetEnableVerticalRubberBanding` | `7ZTLaTyAWFA` | +| `WKPageSetFixedLayoutSize` | `hwMqSlpTWCk` | +| `WKPageSetGapBetweenPages` | `1UKzOMAA3bM` | +| `WKPageSetIgnoresViewportScaleLimits` | `B0VJOvGWnWk` | +| `WKPageSetMaintainsInactiveSelection` | `Iqpp9WOrXeE` | +| `WKPageSetMayStartMediaWhenInWindow` | `5acW3MSCndw` | +| `WKPageSetMediaCaptureEnabled` | `QoItjQ1VB1E` | +| `WKPageSetMediaVolume` | `UC703hx3DrM` | +| `WKPageSetMockCameraOrientation` | `VHxoAYeD2q4` | +| `WKPageSetMuted` | `XUBgIGb3ae0` | +| `WKPageSetPageAndTextZoomFactors` | `k+0t4ZFxfT0` | +| `WKPageSetPageContextMenuClient` | `LddfS0Uiwr0` | +| `WKPageSetPageDiagnosticLoggingClient` | `cdYzqB96vXg` | +| `WKPageSetPageFindClient` | `tWIbltNkRvU` | +| `WKPageSetPageFindMatchesClient` | `7wjIexo6MvQ` | +| `WKPageSetPageFormClient` | `cWHdm8MyA08` | +| `WKPageSetPageInjectedBundleClient` | `uyg+XHR4HbQ` | +| `WKPageSetPageLength` | `ikZjNtJlWTs` | +| `WKPageSetPageLoaderClient` | `8Gl+aYTYdtU` | +| `WKPageSetPageNavigationClient` | `3g8MMjaAs0M` | +| `WKPageSetPagePolicyClient` | `pJ4iBZ6LEA0` | +| `WKPageSetPageStateClient` | `8dbxlsbVzdY` | +| `WKPageSetPageUIClient` | `6RXuTZIVqIg` | +| `WKPageSetPageZoomFactor` | `pCJUJOonjAM` | +| `WKPageSetPaginationBehavesLikeColumns` | `iUarLNk0Dkg` | +| `WKPageSetPaginationLineGridEnabled` | `uqcmh9mV7sI` | +| `WKPageSetPaginationMode` | `JjOoUWau3hA` | +| `WKPageSetRubberBandsAtBottom` | `078ew7gQLwA` | +| `WKPageSetRubberBandsAtLeft` | `E6OA1UUy8+4` | +| `WKPageSetRubberBandsAtRight` | `GuIr1eWRunc` | +| `WKPageSetRubberBandsAtTop` | `Nn6eNKOy98M` | +| `WKPageSetScaleFactor` | `LDsNIDCwcLY` | +| `WKPageSetScrollPinningBehavior` | `XxfxrsCBl5o` | +| `WKPageSetSuppressScrollbarAnimations` | `mCIjZT8nfvg` | +| `WKPageSetTextZoomFactor` | `f-vSeWHQsW4` | +| `WKPageSetUseFixedLayout` | `0M-vF0rurfc` | +| `WKPageStopLoading` | `BGuvmFH0-Uo` | +| `WKPageSupportsTextEncoding` | `3tolGFkslb4` | +| `WKPageSupportsTextZoom` | `vq8FBoJCd7c` | +| `WKPageSuspendActiveDOMObjectsAndAnimations` | `WtwJKh+NPQU` | +| `WKPageTerminate` | `x5CgqP9ManE` | +| `WKPageTryClose` | `DxUrwaURmnw` | +| `WKPageTryRestoreScrollPosition` | `yHiQUEutgJ0` | +| `WKPageUpdateWebsitePolicies` | `ky0keBcpiTk` | +| `WKPageUseFixedLayout` | `OufFIenC01c` | +| `WKPageValidateCommand` | `K82wly5zJoc` | +| `WKPageVerticalRubberBandingIsEnabled` | `p-jMGxCpEF4` | +| `WKPageWillHandleHorizontalScrollEvents` | `pYHt5lL67G8` | +| `WKPlugInInformationReplacementObscuredKey` | `O2dvtjs5sWU` | +| `WKPluginInformationBundleIdentifierKey` | `nBYJ4942-WQ` | +| `WKPluginInformationBundleShortVersionKey` | `C-blDyZOIa8` | +| `WKPluginInformationBundleVersionKey` | `w8rgJiyY10M` | +| `WKPluginInformationDefaultLoadPolicyKey` | `gx130ttraj0` | +| `WKPluginInformationDisplayNameKey` | `m2Sd6gEcz9o` | +| `WKPluginInformationFrameURLKey` | `nSm+f63zez0` | +| `WKPluginInformationHasSandboxProfileKey` | `h+E3nihI2mM` | +| `WKPluginInformationMIMETypeKey` | `zN3TYAlQEsk` | +| `WKPluginInformationPageURLKey` | `-+9ekha4fN0` | +| `WKPluginInformationPathKey` | `xP6Sta4xjvs` | +| `WKPluginInformationPluginURLKey` | `BgnV9ciabNs` | +| `WKPluginInformationPluginspageAttributeURLKey` | `WKUanh-oVyc` | +| `WKPluginInformationUpdatePastLastBlockedVersionIsKnownAvailableKey` | `w5yd8587Xyo` | +| `WKPopupMenuItemCopyText` | `xmQq6hB1vqE` | +| `WKPopupMenuItemIsEnabled` | `DUF5lHKpf6o` | +| `WKPopupMenuItemIsItem` | `w6uemFn00hc` | +| `WKPopupMenuItemIsSeparator` | `cIEUZ-pzXZo` | +| `WKPreferencesGetAccelerated2DCanvasEnabled` | `DrEP3qaThDE` | +| `WKPreferencesGetQTKitEnabled` | `8N-4nYLwXak` | +| `WKPreferencesGetTypeID` | `dyqLbVYkq3o` | +| `WKPreferencesSetAccelerated2DCanvasEnabled` | `UEBk9iGqhPo` | +| `WKPreferencesSetQTKitEnabled` | `6jkxaKVf01A` | +| `WKProtectionSpaceCopyCertificateInfo` | `FdhooB4MqkE` | +| `WKProtectionSpaceCopyHost` | `U0xPrr5rnH4` | +| `WKProtectionSpaceCopyRealm` | `osSHWP92dx4` | +| `WKProtectionSpaceGetAuthenticationScheme` | `aO1clLvwumw` | +| `WKProtectionSpaceGetIsProxy` | `NsJycqh1KFs` | +| `WKProtectionSpaceGetPort` | `ABcMO6bA+mw` | +| `WKProtectionSpaceGetReceivesCredentialSecurely` | `GbcKdx3JDJw` | +| `WKProtectionSpaceGetServerType` | `ZcwgROJJWSo` | +| `WKRegistrableDomainCreate` | `BjwTHxBa4gc` | +| `WKRemoveMockMediaDevice` | `Dr2VufJK70A` | +| `WKRenderLayerCopyElementID` | `lRlQXPSYfTI` | +| `WKRenderLayerCopyElementTagName` | `mtWy8+9VNV4` | +| `WKRenderLayerCopyRendererName` | `AG7ICWq3N8w` | +| `WKRenderLayerGetAbsoluteBounds` | `8glOPCWDXVo` | +| `WKRenderLayerGetBackingStoreMemoryEstimate` | `NjhW50dNxss` | +| `WKRenderLayerGetCompositingLayerType` | `T3gLp2xSZis` | +| `WKRenderLayerGetElementClassNames` | `egi+cPsL7jc` | +| `WKRenderLayerGetFrameContentsLayer` | `vMQPol5T6DY` | +| `WKRenderLayerGetNegativeZOrderList` | `pYwJJhTpTSY` | +| `WKRenderLayerGetNormalFlowList` | `mFGaMlruNv4` | +| `WKRenderLayerGetPositiveZOrderList` | `AKduh-C7Ukw` | +| `WKRenderLayerGetRenderer` | `FgHJrrJSptw` | +| `WKRenderLayerIsClipped` | `qnVSx0dMIj4` | +| `WKRenderLayerIsClipping` | `TTHhexfjJ1E` | +| `WKRenderLayerIsReflection` | `AIOn++bTCGY` | +| `WKRenderObjectCopyElementID` | `BcSL9PGBRzg` | +| `WKRenderObjectCopyElementTagName` | `laUc7-fpK-M` | +| `WKRenderObjectCopyName` | `yorRU1THn4M` | +| `WKRenderObjectCopyTextSnippet` | `jbZom6ZMBR8` | +| `WKRenderObjectGetAbsolutePosition` | `yrWwBt9NZPY` | +| `WKRenderObjectGetChildren` | `ajyl7RSiYH4` | +| `WKRenderObjectGetElementClassNames` | `NkEITXscsR4` | +| `WKRenderObjectGetFrameRect` | `CvLd+zsiNGM` | +| `WKRenderObjectGetTextLength` | `QQwtijo98qI` | +| `WKResetMockMediaDevices` | `atK8tRkYvFI` | +| `WKResourceCacheManagerClearCacheForAllOrigins` | `g-SjvruXQtc` | +| `WKResourceCacheManagerClearCacheForOrigin` | `Sq7E7Dwlq0w` | +| `WKResourceCacheManagerGetCacheOrigins` | `v+SAyXDkOCI` | +| `WKRunLoopCallOnMainThread` | `2haZWaB3Gcs` | +| `WKRunLoopInitializeMain` | `L8wKvGYzNDU` | +| `WKRunLoopRunMain` | `7REoZxCEojI` | +| `WKRunLoopStopMain` | `B-uwQDniNXM` | +| `WKSecurityOriginCopyDatabaseIdentifier` | `YE5ube8wC4w` | +| `WKSecurityOriginCopyHost` | `OcwbcLWLjAQ` | +| `WKSecurityOriginCopyProtocol` | `gQce1dRFLic` | +| `WKSecurityOriginCopyToString` | `9KibQmcN8IA` | +| `WKSecurityOriginCreate` | `2Fzd4IszRAY` | +| `WKSecurityOriginCreateFromDatabaseIdentifier` | `50a9aq8a5AQ` | +| `WKSecurityOriginCreateFromString` | `SfMLraLeAvo` | +| `WKSecurityOriginGetPort` | `8QtMUIaB7Uk` | +| `WKSendDisplayConfigurationChangedMessageForTesting` | `CQsllLq8d7I` | +| `WKSerializedScriptValueCreate` | `10fsdhg9448` | +| `WKSerializedScriptValueDeserialize` | `GzcqLy9vAYY` | +| `WKSessionStateCopyData` | `Uybzrh+1nJE` | +| `WKSessionStateCreateFromData` | `AMrPlFNJec8` | +| `WKTextCheckerSetTestingMode` | `uhbwdrVWKnk` | +| `WKURLCopyHostName` | `eL7PAmyp2fs` | +| `WKURLCopyLastPathComponent` | `zjB-cbY-OcE` | +| `WKURLCopyPath` | `DZzXHBYmlw0` | +| `WKURLCopyScheme` | `GmJyq9LDPJs` | +| `WKURLCreateWithBaseURL` | `W+FQt2MUK+4` | +| `WKURLIsEqual` | `S9pzhyNVdFE` | +| `WKURLRequestCopyFirstPartyForCookies` | `l0Hmd0lFea8` | +| `WKURLRequestCopyHTTPMethod` | `SxWVkTIB01Y` | +| `WKURLRequestCopySettingHTTPBody` | `LOgEfXqoLL0` | +| `WKURLRequestCopyURL` | `n-9+9Xe90t4` | +| `WKURLRequestCreateWithWKURL` | `TC9965WYLHM` | +| `WKURLRequestSetDefaultTimeoutInterval` | `YXTIbI-WYtE` | +| `WKURLResponseCopyMIMEType` | `byPai8g0cxM` | +| `WKURLResponseCopySuggestedFilename` | `+xdJWXA20fg` | +| `WKURLResponseCopyURL` | `fsZdiho79Qs` | +| `WKURLResponseGetExpectedContentLength` | `urWbmBbaVjM` | +| `WKURLResponseHTTPStatusCode` | `V8sTDUESRVE` | +| `WKURLResponseIsAttachment` | `73gjSG1YiTU` | +| `WKUserContentExtensionStoreCompile` | `6g8aRptom6Y` | +| `WKUserContentExtensionStoreCreate` | `qlWLlgf0DyY` | +| `WKUserContentExtensionStoreLookup` | `l8gsEeVfp+s` | +| `WKUserContentURLPatternMatchesURL` | `JfpZWg77-Zw` | +| `WKUserMediaPermissionCheckSetUserMediaAccessInfo` | `MBwkZncofuk` | +| `WKUserMediaPermissionRequestAllow` | `luXC7N4AUUk` | +| `WKUserMediaPermissionRequestAudioDeviceUIDs` | `AZbcxbfE7Ik` | +| `WKUserMediaPermissionRequestDeny` | `u4w4eIh6yBI` | +| `WKUserMediaPermissionRequestVideoDeviceUIDs` | `Ayqs7t7iPd4` | +| `WKViewAccessibilityFocusedObject` | `mQOmuuuwvXk` | +| `WKViewAccessibilityHitTest` | `9XouNrl+xF0` | +| `WKViewAccessibilityRootObject` | `7R83-mIE4ik` | +| `WKViewCreate` | `HvpAPSloiLA` | +| `WKViewDidEnterFullScreen` | `8Ji9q7l-y1I` | +| `WKViewDidExitFullScreen` | `5mppAJEHox0` | +| `WKViewGetPage` | `JHuFHzY5Ov0` | +| `WKViewGetPunchHoles` | `3MWI7gn4dfY` | +| `WKViewIsFullScreen` | `NsRv+sKcZ6Y` | +| `WKViewRequestExitFullScreen` | `CPpDO+iVEQY` | +| `WKViewSetActive` | `mZQNSovP058` | +| `WKViewSetFocus` | `eYcl-oTV7Ng` | +| `WKViewSetSize` | `1DkPR0np8Xc` | +| `WKViewSetViewAccessibilityClient` | `IMJ+G6b6cx0` | +| `WKViewSetViewClient` | `7ptEBVx3d5g` | +| `WKViewSetViewPopupMenuClient` | `T-iLbWI4WfU` | +| `WKViewSetVisible` | `8j9ZB-vGetc` | +| `WKViewValueChangedForPopupMenu` | `rr8g0GkA+GE` | +| `WKViewWillEnterFullScreen` | `Qv917g7goow` | +| `WKViewWillExitFullScreen` | `6o4itIbqsY8` | +| `WKWebsiteDataStoreClearAllDeviceOrientationPermissions` | `4go6vGk6E+A` | +| `WKWebsiteDataStoreClearAppBoundSession` | `YujMtLJPOok` | +| `WKWebsiteDataStoreClearBundleIdentifierInNetworkProcess` | `Mrp3OVQ9jI4` | +| `WKWebsiteDataStoreCreateNonPersistentDataStore` | `hzBAQGt4hMw` | +| `WKWebsiteDataStoreCreateWithConfiguration` | `gJCqCiXkwDU` | +| `WKWebsiteDataStoreDisableNetworkProxySettings` | `k2niR5Rxn84` | +| `WKWebsiteDataStoreDoesStatisticsDomainIDExistInDatabase` | `QYz4VP6wsuQ` | +| `WKWebsiteDataStoreDumpResourceLoadStatistics` | `9gda3JloLFE` | +| `WKWebsiteDataStoreEnableCustomNetworkProxySettings` | `rmT-cQv3G4I` | +| `WKWebsiteDataStoreEnableDefaultNetworkProxySettings` | `iXGeleOV-c8` | +| `WKWebsiteDataStoreGetAllStorageAccessEntries` | `A4dOumHPyNQ` | +| `WKWebsiteDataStoreGetDefaultDataStore` | `1Y6ds6X6q+8` | +| `WKWebsiteDataStoreGetFetchCacheOrigins` | `W2jeMfa3etw` | +| `WKWebsiteDataStoreGetFetchCacheSizeForOrigin` | `hZS58BxCAV8` | +| `WKWebsiteDataStoreGetHTTPCookieStore` | `hOXOdd6Lp5g` | +| `WKWebsiteDataStoreGetResourceLoadStatisticsEnabled` | `2H0q+W0RyYk` | +| `WKWebsiteDataStoreIsStatisticsEphemeral` | `TzInlmRQcHw` | +| `WKWebsiteDataStoreIsStatisticsGrandfathered` | `Ud+1jEz8LWc` | +| `WKWebsiteDataStoreIsStatisticsHasHadUserInteraction` | `7EqOpt3gTIg` | +| `WKWebsiteDataStoreIsStatisticsOnlyInDatabaseOnce` | `FQXDGkLo5lw` | +| `WKWebsiteDataStoreIsStatisticsPrevalentResource` | `crFg3k+BM2A` | +| `WKWebsiteDataStoreIsStatisticsRegisteredAsRedirectingTo` | `nrWEGAxN9sw` | +| `WKWebsiteDataStoreIsStatisticsRegisteredAsSubFrameUnder` | `XsfCncK1ixk` | +| `WKWebsiteDataStoreIsStatisticsRegisteredAsSubresourceUnder` | `KlpVs+cuiKk` | +| `WKWebsiteDataStoreIsStatisticsVeryPrevalentResource` | `cNJLCdCvpRs` | +| `WKWebsiteDataStoreReinitializeAppBoundDomains` | `pVYj0EAFKIU` | +| `WKWebsiteDataStoreRemoveAllFetchCaches` | `rxZjrt0XJUc` | +| `WKWebsiteDataStoreRemoveAllIndexedDatabases` | `2s+Z9J73DSA` | +| `WKWebsiteDataStoreRemoveAllServiceWorkerRegistrations` | `scGRzF-d0Cs` | +| `WKWebsiteDataStoreRemoveFetchCacheForOrigin` | `1bG95FiZS-k` | +| `WKWebsiteDataStoreRemoveITPDataForDomain` | `XuiSa0e8NQs` | +| `WKWebsiteDataStoreRemoveLocalStorage` | `5ti4Vc-Mp6I` | +| `WKWebsiteDataStoreResetQuota` | `zdKa8rNTi2s` | +| `WKWebsiteDataStoreSetAdditionalRootCA` | `vTcRCX6SQVo` | +| `WKWebsiteDataStoreSetAppBoundDomainsForTesting` | `SDZK3XYrvkk` | +| `WKWebsiteDataStoreSetCacheModelSynchronouslyForTesting` | `SirJwzKHMmQ` | +| `WKWebsiteDataStoreSetClientCertificate` | `9dwA+t5a9BU` | +| `WKWebsiteDataStoreSetPerOriginStorageQuota` | `qqKbZiXA178` | +| `WKWebsiteDataStoreSetResourceLoadStatisticsDebugModeWithCompletionHandler` | `CRR5HsrCpXA` | +| `WKWebsiteDataStoreSetResourceLoadStatisticsDebugMode` | `Zdtwqk-44gU` | +| `WKWebsiteDataStoreSetResourceLoadStatisticsEnabled` | `E3r6Cg7w4XM` | +| `WKWebsiteDataStoreSetResourceLoadStatisticsFirstPartyHostCNAMEDomainForTesting` | `a5ee7veMD9k` | +| `WKWebsiteDataStoreSetResourceLoadStatisticsFirstPartyWebsiteDataRemovalModeForTesting` | `ng+jNZCCEJ0` | +| `WKWebsiteDataStoreSetResourceLoadStatisticsPrevalentResourceForDebugMode` | `KhR7n5Pphnw` | +| `WKWebsiteDataStoreSetResourceLoadStatisticsShouldBlockThirdPartyCookiesForTesting` | `rneEgXU3tg4` | +| `WKWebsiteDataStoreSetResourceLoadStatisticsShouldDowngradeReferrerForTesting` | `qzt6F50Wxic` | +| `WKWebsiteDataStoreSetResourceLoadStatisticsThirdPartyCNAMEDomainForTesting` | `1Pc2TYyPh1w` | +| `WKWebsiteDataStoreSetResourceLoadStatisticsToSameSiteStrictCookiesForTesting` | `Nvwr7UfPzfE` | +| `WKWebsiteDataStoreSetStatisticsCacheMaxAgeCap` | `LWGDlFquGeo` | +| `WKWebsiteDataStoreSetStatisticsCrossSiteLoadWithLinkDecoration` | `QFCvRLoLMfY` | +| `WKWebsiteDataStoreSetStatisticsExpiredStatistic` | `rMqqdr74UvQ` | +| `WKWebsiteDataStoreSetStatisticsGrandfathered` | `5B3XPC0hGC0` | +| `WKWebsiteDataStoreSetStatisticsGrandfatheringTime` | `GvwE97PtrZY` | +| `WKWebsiteDataStoreSetStatisticsHasHadUserInteraction` | `m2PuBAQ06e0` | +| `WKWebsiteDataStoreSetStatisticsIsRunningTest` | `OwVWMhieaHs` | +| `WKWebsiteDataStoreSetStatisticsLastSeen` | `StCY5gaFH-g` | +| `WKWebsiteDataStoreSetStatisticsMaxStatisticsEntries` | `60IXulCxepw` | +| `WKWebsiteDataStoreSetStatisticsMergeStatistic` | `4NsbNbRkUiM` | +| `WKWebsiteDataStoreSetStatisticsMinimumTimeBetweenDataRecordsRemoval` | `Cfbsupt+BBk` | +| `WKWebsiteDataStoreSetStatisticsNotifyPagesWhenDataRecordsWereScanned` | `3BDHghdSgog` | +| `WKWebsiteDataStoreSetStatisticsPrevalentResource` | `yor08VzFtZo` | +| `WKWebsiteDataStoreSetStatisticsPruneEntriesDownTo` | `FPVANrBOCqM` | +| `WKWebsiteDataStoreSetStatisticsShouldClassifyResourcesBeforeDataRecordsRemoval` | `qvnC4OYmLhw` | +| `WKWebsiteDataStoreSetStatisticsSubframeUnderTopFrameOrigin` | `7Jn6EsJwZN8` | +| `WKWebsiteDataStoreSetStatisticsSubresourceUnderTopFrameOrigin` | `hHV7qVIxQLQ` | +| `WKWebsiteDataStoreSetStatisticsSubresourceUniqueRedirectFrom` | `lB4tTNqJXKw` | +| `WKWebsiteDataStoreSetStatisticsSubresourceUniqueRedirectTo` | `jslI0CQzOIw` | +| `WKWebsiteDataStoreSetStatisticsTimeToLiveUserInteraction` | `miwM3X1F+Zs` | +| `WKWebsiteDataStoreSetStatisticsTopFrameUniqueRedirectFrom` | `cRl-GP5GGx8` | +| `WKWebsiteDataStoreSetStatisticsTopFrameUniqueRedirectTo` | `R+JSrG8sb5s` | +| `WKWebsiteDataStoreSetStatisticsVeryPrevalentResource` | `jS-45Q4H8Tw` | +| `WKWebsiteDataStoreStatisticsClearInMemoryAndPersistentStoreModifiedSinceHours` | `-Y2pCXfH-dQ` | +| `WKWebsiteDataStoreStatisticsClearInMemoryAndPersistentStore` | `oW6a6GUAFr0` | +| `WKWebsiteDataStoreStatisticsClearThroughWebsiteDataRemoval` | `GwtdQhe3AUM` | +| `WKWebsiteDataStoreStatisticsDeleteCookiesForTesting` | `DDxCFdQ8YyU` | +| `WKWebsiteDataStoreStatisticsHasIsolatedSession` | `wlHuQ9YdrAg` | +| `WKWebsiteDataStoreStatisticsHasLocalStorage` | `roAJqGa0EE8` | +| `WKWebsiteDataStoreStatisticsProcessStatisticsAndDataRecords` | `8shc+gbpJ5w` | +| `WKWebsiteDataStoreStatisticsResetToConsistentState` | `cPsMwFBQkYw` | +| `WKWebsiteDataStoreStatisticsUpdateCookieBlocking` | `eVnCOMC5iO4` | +| `WKWebsiteDataStoreUpdateBundleIdentifierInNetworkProcess` | `bg+X3d1K+mU` | +| `_ZN14OpaqueJSString9tryCreateEON3WTF6StringE` | `mcOkVwJvgME` | +| `_ZN14OpaqueJSString9tryCreateERKN3WTF6StringE` | `PVV6vSXtXwE` | +| `_ZN3JSC10ConfigFile14setProcessNameEPKc` | `gU19IpVh5DQ` | +| `_ZN3JSC10ConfigFile20setParentProcessNameEPKc` | `AeTgkm3kN-k` | +| `_ZN3JSC10ConfigFile5parseEv` | `6Ur0PoWQ2mc` | +| `_ZN3JSC10ConfigFileC1EPKc` | `wyivI8dViTw` | +| `_ZN3JSC10ConfigFileC2EPKc` | `mcWtDgxzRgc` | +| `_ZN3JSC10Identifier27checkCurrentAtomStringTableERNS_2VME` | `951o4aXk+P8` | +| `_ZN3JSC10Identifier4fromERNS_2VMEd` | `DPLMrrm0plU` | +| `_ZN3JSC10Identifier4fromERNS_2VMEi` | `H8U6orIrfzg` | +| `_ZN3JSC10Identifier4fromERNS_2VMEj` | `V9ThtCzV4Zc` | +| `_ZN3JSC10IsoCellSet33parallelNotEmptyMarkedBlockSourceEv` | `6yXHAKO8Fwg` | +| `_ZN3JSC10JSCellLock10unlockSlowEv` | `qu2b52fLA+Q` | +| `_ZN3JSC10JSCellLock8lockSlowEv` | `9pcai2KJAjk` | +| `_ZN3JSC10JSFunction11displayNameERNS_2VME` | `I5Fv27RVaXA` | +| `_ZN3JSC10JSFunction21calculatedDisplayNameERNS_2VME` | `8o6hZ+sX7OU` | +| `_ZN3JSC10JSFunction4nameERNS_2VME` | `EbmFmabti7g` | +| `_ZN3JSC10JSFunction6createERNS_2VMEPNS_18FunctionExecutableEPNS_7JSScopeE` | `xVyBpIhTAxg` | +| `_ZN3JSC10JSFunctionC1ERNS_2VMEPNS_16NativeExecutableEPNS_14JSGlobalObjectEPNS_9StructureE` | `uNBcuOM-orU` | +| `_ZN3JSC10JSFunctionC2ERNS_2VMEPNS_16NativeExecutableEPNS_14JSGlobalObjectEPNS_9StructureE` | `eVxwyigpkZI` | +| `_ZN3JSC10LinkBuffer31finalizeCodeWithDisassemblyImplEbPKcz` | `ePgPaHobEOc` | +| `_ZN3JSC10LinkBuffer34finalizeCodeWithoutDisassemblyImplEv` | `BHAPXQ4-8eQ` | +| `_ZN3JSC10initializeEv` | `es22a5w83e4` | +| `_ZN3JSC10loadModuleEPNS_14JSGlobalObjectERKNS_10SourceCodeENS_7JSValueE` | `dcDNSplc0kE` | +| `_ZN3JSC11ArrayBuffer10transferToERNS_2VMERNS_19ArrayBufferContentsE` | `vdZLA9D5hks` | +| `_ZN3JSC11ArrayBuffer27primitiveGigacageDestructorEv` | `3QbvZ3xoajQ` | +| `_ZN3JSC11ArrayBuffer6createEONS_19ArrayBufferContentsE` | `FIwGkGMVpS4` | +| `_ZN3JSC11ArrayBuffer6createERS0_` | `hjJwVskIVxg` | +| `_ZN3JSC11ArrayBuffer9shareWithERNS_19ArrayBufferContentsE` | `ZScuSU2kBf0` | +| `_ZN3JSC11ArrayBuffer9tryCreateERS0_` | `WQbjb+C736Q` | +| `_ZN3JSC11FuzzerAgent13getPredictionEPNS_9CodeBlockERKNS_10CodeOriginEm` | `bPu4g9cnHTE` | +| `_ZN3JSC11FuzzerAgentD0Ev` | `SUbGVeFQQns` | +| `_ZN3JSC11FuzzerAgentD1Ev` | `lcpUikuxzYU` | +| `_ZN3JSC11FuzzerAgentD2Ev` | `h0tRdxavoc0` | +| `_ZN3JSC11IsoSubspaceD0Ev` | `2nw7QLyE9FA` | +| `_ZN3JSC11IsoSubspaceD1Ev` | `tI5IAnzhn2U` | +| `_ZN3JSC11IsoSubspaceD2Ev` | `mll5UrllME0` | +| `_ZN3JSC11JSWithScope6createERNS_2VMEPNS_14JSGlobalObjectEPNS_7JSScopeEPNS_8JSObjectE` | `E8OnvxcALi0` | +| `_ZN3JSC11MarkedBlock13areMarksStaleEv` | `k4PNvKkDUxg` | +| `_ZN3JSC11MarkedBlock15aboutToMarkSlowEj` | `688gmLp3oeA` | +| `_ZN3JSC11MarkedBlock6Handle13areMarksStaleEv` | `fmDMZjA+Eg4` | +| `_ZN3JSC11ProxyObject14finishCreationERNS_2VMEPNS_14JSGlobalObjectENS_7JSValueES5_` | `drijYCj6+ZM` | +| `_ZN3JSC11ProxyObject18structureForTargetEPNS_14JSGlobalObjectENS_7JSValueE` | `YkdlRu0VagU` | +| `_ZN3JSC11ProxyObjectC2ERNS_2VMEPNS_9StructureE` | `ojRh5YSi1cs` | +| `_ZN3JSC11SlotVisitor10appendSlowEPNS_6JSCellEN3WTF10DependencyE` | `XSXteKISekw` | +| `_ZN3JSC11SlotVisitor16appendHiddenSlowEPNS_6JSCellEN3WTF10DependencyE` | `iN6h1zseVxw` | +| `_ZN3JSC11SymbolTableC1ERNS_2VME` | `bORoxqBlkmc` | +| `_ZN3JSC11SymbolTableC2ERNS_2VME` | `6fjpoeCJVmg` | +| `_ZN3JSC11VMInspector11isValidCellEPNS_4HeapEPNS_6JSCellE` | `gxkBbZ5cUNY` | +| `_ZN3JSC11VMInspector13dumpCallFrameEPNS_2VMEPNS_9CallFrameEj` | `vLLuuDx92lU` | +| `_ZN3JSC11VMInspector13dumpRegistersEPNS_9CallFrameE` | `Q7kSVKlMJmA` | +| `_ZN3JSC11VMInspector14dumpCellMemoryEPNS_6JSCellE` | `YsiVd2KRHzg` | +| `_ZN3JSC11VMInspector16isValidCodeBlockEPNS_2VMEPNS_9CodeBlockE` | `58CUfuxZsUg` | +| `_ZN3JSC11VMInspector17codeBlockForFrameEPNS_2VMEPNS_9CallFrameEj` | `SIb1ZrHqPNI` | +| `_ZN3JSC11VMInspector18dumpSubspaceHashesEPNS_2VME` | `9m+rQFPwOPI` | +| `_ZN3JSC11VMInspector22dumpCellMemoryToStreamEPNS_6JSCellERN3WTF11PrintStreamE` | `P4HU0NvfOtk` | +| `_ZN3JSC11VMInspector23currentThreadOwnsJSLockEPNS_2VME` | `OocnfcUM7Bk` | +| `_ZN3JSC11VMInspector2gcEPNS_2VME` | `8QwZe+atlOg` | +| `_ZN3JSC11VMInspector6edenGCEPNS_2VME` | `mqnQI0BbgcI` | +| `_ZN3JSC11VMInspector8isInHeapEPNS_4HeapEPv` | `RseMy5PTCOo` | +| `_ZN3JSC11VMInspector9dumpStackEPNS_2VMEPNS_9CallFrameEj` | `PxpHnt2AM8k` | +| `_ZN3JSC11checkSyntaxEPNS_14JSGlobalObjectERKNS_10SourceCodeEPNS_7JSValueE` | `FkLOvGvslX4` | +| `_ZN3JSC11checkSyntaxERNS_2VMERKNS_10SourceCodeERNS_11ParserErrorE` | `PLq-2ecJl0k` | +| `_ZN3JSC11createErrorEPNS_14JSGlobalObjectENS_22ErrorTypeWithExtensionERKN3WTF6StringE` | `y4MDLBBNwcU` | +| `_ZN3JSC11createErrorEPNS_14JSGlobalObjectENS_9ErrorTypeERKN3WTF6StringE` | `EqMYo6+xXPk` | +| `_ZN3JSC11createErrorEPNS_14JSGlobalObjectERKN3WTF6StringE` | `aKJk1caqFc8` | +| `_ZN3JSC12BigIntObject14finishCreationERNS_2VMENS_7JSValueE` | `Q7QU8cdMbzM` | +| `_ZN3JSC12BigIntObject6createERNS_2VMEPNS_14JSGlobalObjectENS_7JSValueE` | `V12DdBWf8Xk` | +| `_ZN3JSC12BigIntObjectC1ERNS_2VMEPNS_9StructureE` | `L+04tR03SKg` | +| `_ZN3JSC12BigIntObjectC2ERNS_2VMEPNS_9StructureE` | `KPEyZyiVZbw` | +| `_ZN3JSC12CachePayload16makeEmptyPayloadEv` | `kC-1WFDy3EU` | +| `_ZN3JSC12CachePayload17makeMallocPayloadEON3WTF9MallocPtrIhNS1_10FastMallocEEEm` | `8O0T16ycgH8` | +| `_ZN3JSC12CachePayload17makeMappedPayloadEON3WTF14FileSystemImpl14MappedFileDataE` | `7fqPcHU-PQU` | +| `_ZN3JSC12CachePayloadC1EOS0_` | `pp+0lObTso0` | +| `_ZN3JSC12CachePayloadC2EOS0_` | `pm1zY5K6mBA` | +| `_ZN3JSC12CachePayloadD1Ev` | `GbLGdmiF5BI` | +| `_ZN3JSC12DateInstance14finishCreationERNS_2VMEd` | `w1qonuIftF0` | +| `_ZN3JSC12DateInstanceC1ERNS_2VMEPNS_9StructureE` | `EwdSfaUJOnI` | +| `_ZN3JSC12DateInstanceC2ERNS_2VMEPNS_9StructureE` | `6lWlcHu15Jw` | +| `_ZN3JSC12GlobalJSLockC1Ev` | `rAKTv3Z5OQQ` | +| `_ZN3JSC12GlobalJSLockC2Ev` | `YMXMDRZhMl8` | +| `_ZN3JSC12GlobalJSLockD1Ev` | `rjBYoBJ59xQ` | +| `_ZN3JSC12GlobalJSLockD2Ev` | `UtwP654XpTw` | +| `_ZN3JSC12HeapAnalyzerC2ERKS0_` | `aZ9GDQ0F6cM` | +| `_ZN3JSC12HeapAnalyzerC2Ev` | `cCJNCoH0AOY` | +| `_ZN3JSC12HeapAnalyzerD0Ev` | `Un28DpZj4ec` | +| `_ZN3JSC12HeapAnalyzerD1Ev` | `uvkGGQN9d2A` | +| `_ZN3JSC12HeapAnalyzerD2Ev` | `E4iOn3dUTKg` | +| `_ZN3JSC12HeapAnalyzeraSERKS0_` | `liOD0-XlX-c` | +| `_ZN3JSC12HeapCellTypeC1ENS_14CellAttributesE` | `4ISBwqOsxVU` | +| `_ZN3JSC12HeapCellTypeC2ENS_14CellAttributesE` | `GPFmSUAPZNU` | +| `_ZN3JSC12HeapCellTypeD0Ev` | `iyzkWLmgruc` | +| `_ZN3JSC12HeapCellTypeD1Ev` | `oxwcZIHAevA` | +| `_ZN3JSC12HeapCellTypeD2Ev` | `8kAjbRlEC5I` | +| `_ZN3JSC12HeapVerifier12validateCellEPNS_8HeapCellEPNS_2VME` | `HaJZszqZGWU` | +| `_ZN3JSC12HeapVerifier15checkIfRecordedEm` | `DWNSBXMqW64` | +| `_ZN3JSC12JSLockHolderC1EPNS_14JSGlobalObjectE` | `X1QtBligH2Y` | +| `_ZN3JSC12JSLockHolderC1EPNS_2VME` | `epzp7wxd+yE` | +| `_ZN3JSC12JSLockHolderC2EPNS_14JSGlobalObjectE` | `y0v3kg9elKc` | +| `_ZN3JSC12JSLockHolderC2EPNS_2VME` | `HImvLVPw6oM` | +| `_ZN3JSC12JSLockHolderC2ERNS_2VME` | `g96Sq2k+-zE` | +| `_ZN3JSC12JSLockHolderD1Ev` | `RGyb4+EFqIA` | +| `_ZN3JSC12JSLockHolderD2Ev` | `E4TfKCZ60P0` | +| `_ZN3JSC12SmallStrings24singleCharacterStringRepEh` | `ycB339rTvzI` | +| `_ZN3JSC12StackVisitor13gotoNextFrameEv` | `pfEdqnJygn4` | +| `_ZN3JSC12StackVisitor5Frame8sourceIDEv` | `T0R5EFfwaTg` | +| `_ZN3JSC12StackVisitorC1EPNS_9CallFrameERNS_2VME` | `Ke2gIV4Q7+w` | +| `_ZN3JSC12StackVisitorC2EPNS_9CallFrameERNS_2VME` | `ifZEieMZ7QM` | +| `_ZN3JSC12StringObject14finishCreationERNS_2VMEPNS_8JSStringE` | `BvRmL6IYCgM` | +| `_ZN3JSC12StringObjectC2ERNS_2VMEPNS_9StructureE` | `aFXG-4hvVBk` | +| `_ZN3JSC12SymbolObject14finishCreationERNS_2VMEPNS_6SymbolE` | `GMWX0+Oz9WA` | +| `_ZN3JSC12SymbolObjectC1ERNS_2VMEPNS_9StructureE` | `potS1HOUEe4` | +| `_ZN3JSC12SymbolObjectC2ERNS_2VMEPNS_9StructureE` | `tvnxawGcaOU` | +| `_ZN3JSC12addErrorInfoEPNS_14JSGlobalObjectEPNS_8JSObjectEb` | `IGFTSBRJiHk` | +| `_ZN3JSC12isFromJSCodeEPv` | `Tb2NxhCO51o` | +| `_ZN3JSC12iteratorStepEPNS_14JSGlobalObjectENS_15IterationRecordE` | `6LvU2UX265I` | +| `_ZN3JSC12profiledCallEPNS_14JSGlobalObjectENS_15ProfilingReasonENS_7JSValueERKNS_8CallDataES3_RKNS_7ArgListERN3WTF8NakedPtrINS_9ExceptionEEE` | `Y2W62LZvRHA` | +| `_ZN3JSC12profiledCallEPNS_14JSGlobalObjectENS_15ProfilingReasonENS_7JSValueERKNS_8CallDataES3_RKNS_7ArgListE` | `tmHQakReRvI` | +| `_ZN3JSC13BooleanObjectC1ERNS_2VMEPNS_9StructureE` | `jBGTcK8HeTc` | +| `_ZN3JSC13BooleanObjectC2ERNS_2VMEPNS_9StructureE` | `zonHaB54R9U` | +| `_ZN3JSC13ConsoleClient19printConsoleMessageENS_13MessageSourceENS_11MessageTypeENS_12MessageLevelERKN3WTF6StringES7_jj` | `baDcxL3GLBo` | +| `_ZN3JSC13DebuggerScope6createERNS_2VMEPNS_7JSScopeE` | `lh+5Uj6SVzM` | +| `_ZN3JSC13ErrorInstance17sanitizedToStringEPNS_14JSGlobalObjectE` | `CWX8y31zqQM` | +| `_ZN3JSC13JSMapIterator14finishCreationERNS_2VMEPNS_5JSMapENS_13IterationKindE` | `2EY+5-CTFXc` | +| `_ZN3JSC13JSONStringifyEPNS_14JSGlobalObjectENS_7JSValueES2_` | `hmZCJGU0rCE` | +| `_ZN3JSC13JSONStringifyEPNS_14JSGlobalObjectENS_7JSValueEj` | `uOWeAeBDuM0` | +| `_ZN3JSC13JSSetIterator10createPairEPNS_14JSGlobalObjectENS_7JSValueES3_` | `fxkG2Qd5kmE` | +| `_ZN3JSC13RuntimeMethod14finishCreationERNS_2VMERKN3WTF6StringE` | `MjqzYLK2kJA` | +| `_ZN3JSC13RuntimeMethod15createPrototypeERNS_2VMERNS_14JSGlobalObjectE` | `38B5Qc5Doj0` | +| `_ZN3JSC13RuntimeMethod15createStructureERNS_2VMEPNS_14JSGlobalObjectENS_7JSValueE` | `k10QLMNGGTo` | +| `_ZN3JSC13RuntimeMethod15subspaceForImplERNS_2VME` | `E51l7UtV1-A` | +| `_ZN3JSC13RuntimeMethod4infoEv` | `pXVPlSQxwKM` | +| `_ZN3JSC13RuntimeMethod6createEPNS_14JSGlobalObjectES2_PNS_9StructureERKN3WTF6StringEPNS_8Bindings6MethodE` | `-FwfsUYAVcc` | +| `_ZN3JSC13RuntimeMethodC1ERNS_2VMEPNS_9StructureEPNS_8Bindings6MethodE` | `Z4Xc1x3gxgg` | +| `_ZN3JSC13RuntimeMethodC2ERNS_2VMEPNS_9StructureEPNS_8Bindings6MethodE` | `5l4-Ye9uFuA` | +| `_ZN3JSC13ShadowChicken16functionsOnStackEPNS_14JSGlobalObjectEPNS_9CallFrameE` | `BEsBaj8K0Bs` | +| `_ZN3JSC13WatchpointSet11fireAllSlowERNS_2VMEPKc` | `P5hjbjUCnqM` | +| `_ZN3JSC13WatchpointSet11fireAllSlowERNS_2VMEPNS_22DeferredWatchpointFireE` | `98kInJrpGRo` | +| `_ZN3JSC13WatchpointSet11fireAllSlowERNS_2VMERKNS_10FireDetailE` | `qqhKZavy4Pg` | +| `_ZN3JSC13WatchpointSetC1ENS_15WatchpointStateE` | `hIhXV8DgVnI` | +| `_ZN3JSC13WatchpointSetC2ENS_15WatchpointStateE` | `zF4GnUv7KPw` | +| `_ZN3JSC13WatchpointSetD1Ev` | `9mP+epi+9zU` | +| `_ZN3JSC13WatchpointSetD2Ev` | `Wztwg+APnsg` | +| `_ZN3JSC13iteratorValueEPNS_14JSGlobalObjectENS_7JSValueE` | `mir9WnxDvVI` | +| `_ZN3JSC14JSGlobalObject13clearRareDataEPNS_6JSCellE` | `PnslheyT+CQ` | +| `_ZN3JSC14JSGlobalObject14exposeDollarVMERNS_2VME` | `hTW3lKG0koI` | +| `_ZN3JSC14JSGlobalObject14finishCreationERNS_2VMEPNS_8JSObjectE` | `GjgsXQ+-x+I` | +| `_ZN3JSC14JSGlobalObject14finishCreationERNS_2VME` | `yvnsZ36Cok0` | +| `_ZN3JSC14JSGlobalObject16addStaticGlobalsEPNS0_18GlobalPropertyInfoEi` | `4vvHlyI6cvk` | +| `_ZN3JSC14JSGlobalObject4initERNS_2VME` | `NawdcanSzD8` | +| `_ZN3JSC14JSGlobalObject6createERNS_2VMEPNS_9StructureE` | `2HrAYiI1XS8` | +| `_ZN3JSC14JSGlobalObjectC1ERNS_2VMEPNS_9StructureEPKNS_23GlobalObjectMethodTableE` | `yNpM5BWhI70` | +| `_ZN3JSC14JSGlobalObjectC2ERNS_2VMEPNS_9StructureEPKNS_23GlobalObjectMethodTableE` | `rlZA2fu7noY` | +| `_ZN3JSC14JSGlobalObjectD1Ev` | `OZObyI1LBiA` | +| `_ZN3JSC14JSGlobalObjectD2Ev` | `tFhQrz2mnCg` | +| `_ZN3JSC14JSRunLoopTimerD0Ev` | `xYHAR2W390o` | +| `_ZN3JSC14JSRunLoopTimerD1Ev` | `nJNBTl3iOL0` | +| `_ZN3JSC14JSRunLoopTimerD2Ev` | `4mOMvysd4IA` | +| `_ZN3JSC14ProtoCallFrame11setArgumentEmNS_7JSValueE` | `qgS+x1WhS-c` | +| `_ZN3JSC14ProtoCallFrame12setCodeBlockEPNS_9CodeBlockE` | `ql2w-SrRGbI` | +| `_ZN3JSC14ProtoCallFrame12setThisValueENS_7JSValueE` | `fF-B+-kmzuU` | +| `_ZN3JSC14ProtoCallFrame15clearCurrentVPCEv` | `qiuiYDTTSv0` | +| `_ZN3JSC14ProtoCallFrame15setGlobalObjectEPNS_14JSGlobalObjectE` | `rbqZK23Mr1M` | +| `_ZN3JSC14ProtoCallFrame17setPaddedArgCountEj` | `PaG1xovlZvk` | +| `_ZN3JSC14ProtoCallFrame29setArgumentCountIncludingThisEi` | `UrIl1bIUtak` | +| `_ZN3JSC14ProtoCallFrame8argumentEm` | `sq4hb-Vo1+0` | +| `_ZN3JSC14ProtoCallFrame9setCalleeEPNS_8JSObjectE` | `1tKwS9K7BZA` | +| `_ZN3JSC14ProtoCallFrameC1Ev` | `CIszVLmspgo` | +| `_ZN3JSC14ProtoCallFrameC2Ev` | `SJJia2hm2ig` | +| `_ZN3JSC14ProtoCallFrameaSERKS0_` | `WfbtnyN65i0` | +| `_ZN3JSC14SourceProvider5getIDEv` | `1maKcwFOk3E` | +| `_ZN3JSC14SourceProviderD0Ev` | `4AeMF+7VG38` | +| `_ZN3JSC14SourceProviderD1Ev` | `nTDzCOsvf2I` | +| `_ZN3JSC14SourceProviderD2Ev` | `iJVjfm64Qro` | +| `_ZN3JSC14StructureCache32emptyObjectStructureForPrototypeEPNS_14JSGlobalObjectEPNS_8JSObjectEjbPNS_18FunctionExecutableE` | `Q49E8rXwtWM` | +| `_ZN3JSC14StructureCache43emptyStructureForPrototypeFromBaseStructureEPNS_14JSGlobalObjectEPNS_8JSObjectEPNS_9StructureE` | `4wAbvDDNr-8` | +| `_ZN3JSC14constructArrayEPNS_14JSGlobalObjectEPNS_9StructureEPKNS_7JSValueEj` | `SeZxztzqUh8` | +| `_ZN3JSC14constructArrayEPNS_14JSGlobalObjectEPNS_9StructureERKNS_7ArgListE` | `V+nPRqUu3gE` | +| `_ZN3JSC14createURIErrorEPNS_14JSGlobalObjectERKN3WTF6StringE` | `CHG4TrPt7qw` | +| `_ZN3JSC14iteratorMethodEPNS_14JSGlobalObjectEPNS_8JSObjectE` | `9NrxNGZX24U` | +| `_ZN3JSC14setNeverInlineEPK15OpaqueJSContextPK13OpaqueJSValue` | `Qr-oWwgS12k` | +| `_ZN3JSC14setNeverInlineEPNS_14JSGlobalObjectEPNS_9CallFrameE` | `wBas1oKAXRU` | +| `_ZN3JSC14throwTypeErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeEN3WTF12ASCIILiteralE` | `vq1bwQVjgTI` | +| `_ZN3JSC14throwTypeErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeERKN3WTF6StringE` | `hsTOEgJ8fy8` | +| `_ZN3JSC14throwTypeErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeE` | `jNsLCw-eHp8` | +| `_ZN3JSC15IsoHeapCellTypeC1ENS_15DestructionModeEPFvPNS_6JSCellEE` | `yjW9EWkjwmw` | +| `_ZN3JSC15IsoHeapCellTypeC2ENS_15DestructionModeEPFvPNS_6JSCellEE` | `8R5ivzpkmFk` | +| `_ZN3JSC15TypeProfilerLog17processLogEntriesERNS_2VMERKN3WTF6StringE` | `9U7Jh-C5384` | +| `_ZN3JSC15WeakHandleOwner8finalizeENS_6HandleINS_7UnknownEEEPv` | `OBwl-d2wkJ0` | +| `_ZN3JSC15WeakHandleOwnerC1ERKS0_` | `GZMY2InuGqM` | +| `_ZN3JSC15WeakHandleOwnerC1Ev` | `CuJ1lpUapSs` | +| `_ZN3JSC15WeakHandleOwnerC2ERKS0_` | `M+HQlnym0PY` | +| `_ZN3JSC15WeakHandleOwnerC2Ev` | `ZsUOENm0Vc8` | +| `_ZN3JSC15WeakHandleOwnerD0Ev` | `zkbV8yksKAg` | +| `_ZN3JSC15WeakHandleOwnerD1Ev` | `pVUPcUmtmck` | +| `_ZN3JSC15WeakHandleOwnerD2Ev` | `a3dbw1f68PQ` | +| `_ZN3JSC15constructNumberEPNS_14JSGlobalObjectENS_7JSValueE` | `7rxnZJsitOo` | +| `_ZN3JSC15constructStringERNS_2VMEPNS_14JSGlobalObjectENS_7JSValueE` | `dEhwVd9TAi8` | +| `_ZN3JSC15createEvalErrorEPNS_14JSGlobalObjectERKN3WTF6StringE` | `sv84XKn8F-Q` | +| `_ZN3JSC15createTypeErrorEPNS_14JSGlobalObjectE` | `6sJIpuPp6Ug` | +| `_ZN3JSC15createTypeErrorEPNS_14JSGlobalObjectERKN3WTF6StringE` | `1xzeyYMI2hQ` | +| `_ZN3JSC15encodeCodeBlockERNS_2VMERKNS_13SourceCodeKeyEPKNS_17UnlinkedCodeBlockE` | `bnvFqPkCGLQ` | +| `_ZN3JSC15encodeCodeBlockERNS_2VMERKNS_13SourceCodeKeyEPKNS_17UnlinkedCodeBlockEiRNS_18BytecodeCacheErrorE` | `LscaQ4auCU8` | +| `_ZN3JSC15ordinarySetSlowEPNS_14JSGlobalObjectEPNS_8JSObjectENS_12PropertyNameENS_7JSValueES5_b` | `p2GJO7T3y0U` | +| `_ZN3JSC16CompleteSubspace12allocateSlowERNS_2VMEmPNS_17GCDeferralContextENS_21AllocationFailureModeE` | `ED16d20jrsY` | +| `_ZN3JSC16CompleteSubspace16allocatorForSlowEm` | `15JBN0lRT1s` | +| `_ZN3JSC16CompleteSubspaceD0Ev` | `6S0zsQ1cbTs` | +| `_ZN3JSC16CompleteSubspaceD1Ev` | `XZlysiYiszY` | +| `_ZN3JSC16CompleteSubspaceD2Ev` | `a0crzpewbKY` | +| `_ZN3JSC16InternalFunction23createSubclassStructureEPNS_14JSGlobalObjectEPNS_8JSObjectEPNS_9StructureE` | `a+BuNNnR2XU` | +| `_ZN3JSC16InternalFunction4nameEv` | `cHk-bAGOD1g` | +| `_ZN3JSC16IsoSubspacePerVMD1Ev` | `tKv2udX-bTw` | +| `_ZN3JSC16IsoSubspacePerVMD2Ev` | `dIwj75rcnHc` | +| `_ZN3JSC16SamplingProfiler17stackTracesAsJSONEv` | `NA5D9n4TpzE` | +| `_ZN3JSC16SamplingProfiler18reportTopBytecodesERN3WTF11PrintStreamE` | `Okiw6xdoX00` | +| `_ZN3JSC16SamplingProfiler18reportTopBytecodesEv` | `WULWTEqDWFE` | +| `_ZN3JSC16SamplingProfiler18reportTopFunctionsERN3WTF11PrintStreamE` | `scRASIAEXKc` | +| `_ZN3JSC16SamplingProfiler18reportTopFunctionsEv` | `GphNWAcTBGE` | +| `_ZN3JSC16SamplingProfiler39noticeCurrentThreadAsJSCExecutionThreadEv` | `s7ZkDunmDMo` | +| `_ZN3JSC16SamplingProfiler5startEv` | `z8s5YSelTK8` | +| `_ZN3JSC16SymbolTableEntry16freeFatEntrySlowEv` | `LyiYFmzddAU` | +| `_ZN3JSC16createRangeErrorEPNS_14JSGlobalObjectERKN3WTF6StringE` | `EKW4neZCdQQ` | +| `_ZN3JSC16profiledEvaluateEPNS_14JSGlobalObjectENS_15ProfilingReasonERKNS_10SourceCodeENS_7JSValueERN3WTF8NakedPtrINS_9ExceptionEEE` | `Lvv0FhW0b-0` | +| `_ZN3JSC16setNeverOptimizeEPK15OpaqueJSContextPK13OpaqueJSValue` | `P2QIyj9sjR0` | +| `_ZN3JSC16setNeverOptimizeEPNS_14JSGlobalObjectEPNS_9CallFrameE` | `AWQ7UtNyAYQ` | +| `_ZN3JSC16slowValidateCellEPNS_14JSGlobalObjectE` | `NTUHXImziBk` | +| `_ZN3JSC16slowValidateCellEPNS_6JSCellE` | `JQ5PeKXGA2Y` | +| `_ZN3JSC16throwSyntaxErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeE` | `64MyBNwaY5I` | +| `_ZN3JSC16throwSyntaxErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeERKN3WTF6StringE` | `QuZkgn3rjsg` | +| `_ZN3JSC17CommonIdentifiers18appendExternalNameERKNS_10IdentifierES3_` | `bdVrqz-l+pU` | +| `_ZN3JSC17DebuggerCallFrame10invalidateEv` | `jYFpdilteh4` | +| `_ZN3JSC17DebuggerCallFrame11callerFrameEv` | `zqzpiMbGPjk` | +| `_ZN3JSC17DebuggerCallFrame15currentPositionERNS_2VME` | `ubtOpuxX4qM` | +| `_ZN3JSC17DebuggerCallFrame20sourceIDForCallFrameEPNS_9CallFrameE` | `XBGl9HsG7rs` | +| `_ZN3JSC17DeferredWorkTimer10runRunLoopEv` | `7VYFuUMRvuo` | +| `_ZN3JSC17DeferredWorkTimer14addPendingWorkERNS_2VMEPNS_8JSObjectEON3WTF6VectorINS_6StrongINS_6JSCellELNS_30ShouldStrongDestructorGrabLockE0EEELm0ENS5_15CrashOnOverflowELm16ENS5_10FastMallocEEE` | `J9p4ZJdhRlU` | +| `_ZN3JSC17DeferredWorkTimer16stopRunningTasksEv` | `mc2Ulvzkoz8` | +| `_ZN3JSC17DeferredWorkTimer6createERNS_2VME` | `Tv0drkccu+8` | +| `_ZN3JSC17DeferredWorkTimer6doWorkERNS_2VME` | `Fmy9vMwwroc` | +| `_ZN3JSC17DeferredWorkTimerC1ERNS_2VME` | `8en6fwz81Lk` | +| `_ZN3JSC17DeferredWorkTimerC2ERNS_2VME` | `z3lrumdQe0c` | +| `_ZN3JSC17DeferredWorkTimerD0Ev` | `DWWNTz7HFiA` | +| `_ZN3JSC17DeferredWorkTimerD1Ev` | `QTygOIlgkjY` | +| `_ZN3JSC17DeferredWorkTimerD2Ev` | `U41P7N8ZrsI` | +| `_ZN3JSC17FuzzerPredictionsC1EPKc` | `5y8l2xECbuA` | +| `_ZN3JSC17FuzzerPredictionsC2EPKc` | `wejAWiNi3WM` | +| `_ZN3JSC17JSArrayBufferView14unsharedBufferEv` | `kWxItDKnRsQ` | +| `_ZN3JSC17JSArrayBufferView18possiblySharedImplEv` | `d4kYK4Z+ay8` | +| `_ZN3JSC17JSArrayBufferView22slowDownAndWasteMemoryEv` | `6pkxvoufGrI` | +| `_ZN3JSC17JSArrayBufferViewC1ERNS_2VMERNS0_19ConstructionContextE` | `IGcJ6U0SuHU` | +| `_ZN3JSC17JSInternalPromise4thenEPNS_14JSGlobalObjectEPNS_10JSFunctionES4_` | `We80-1Wp+Ek` | +| `_ZN3JSC17JSInternalPromise6createERNS_2VMEPNS_9StructureE` | `dU-omZFCg+w` | +| `_ZN3JSC17MarkingConstraint17quickWorkEstimateERNS_11SlotVisitorE` | `DD08+9TAImA` | +| `_ZN3JSC17MarkingConstraintC2EN3WTF7CStringES2_NS_20ConstraintVolatilityENS_21ConstraintConcurrencyENS_21ConstraintParallelismE` | `MtR8ggC--RU` | +| `_ZN3JSC17MarkingConstraintD0Ev` | `gGkAhbLKpaU` | +| `_ZN3JSC17MarkingConstraintD1Ev` | `vpOkYyu4J8A` | +| `_ZN3JSC17MarkingConstraintD2Ev` | `bd0k19pL-YM` | +| `_ZN3JSC17createSyntaxErrorEPNS_14JSGlobalObjectERKN3WTF6StringE` | `pWmgWzoTWIE` | +| `_ZN3JSC17hasIteratorMethodEPNS_14JSGlobalObjectENS_7JSValueE` | `iG0gNTcPCY4` | +| `_ZN3JSC17processConfigFileEPKcS1_S1_` | `MscERR8fj+g` | +| `_ZN3JSC17profiledConstructEPNS_14JSGlobalObjectENS_15ProfilingReasonENS_7JSValueERKNS_8CallDataERKNS_7ArgListES3_` | `BP+G79hAkeI` | +| `_ZN3JSC18BytecodeCacheErroraSERKNS0_10WriteErrorE` | `B+VIoA9pLb0` | +| `_ZN3JSC18BytecodeCacheErroraSERKNS0_13StandardErrorE` | `pUw8oIcCMXk` | +| `_ZN3JSC18BytecodeCacheErroraSERKNS_11ParserErrorE` | `M9T9g4aScws` | +| `_ZN3JSC18ErrorHandlingScopeC1ERNS_2VME` | `NKquI3oYzZk` | +| `_ZN3JSC18ErrorHandlingScopeC2ERNS_2VME` | `LIGGPWn25+U` | +| `_ZN3JSC18ErrorHandlingScopeD1Ev` | `6ad8er4wBPw` | +| `_ZN3JSC18ErrorHandlingScopeD2Ev` | `NR6txoDIsrg` | +| `_ZN3JSC18GCActivityCallback10setEnabledEb` | `rU0ByKESekI` | +| `_ZN3JSC18GCActivityCallback11didAllocateERNS_4HeapEm` | `hhHqiyjZV08` | +| `_ZN3JSC18GCActivityCallback11willCollectEv` | `NTlX451IQBY` | +| `_ZN3JSC18GCActivityCallback13scheduleTimerEN3WTF7SecondsE` | `29i3Hdvg9zw` | +| `_ZN3JSC18GCActivityCallback18tryCreateEdenTimerEPNS_4HeapE` | `sQKeaOlUKJE` | +| `_ZN3JSC18GCActivityCallback6cancelEv` | `1Gm03etxDkU` | +| `_ZN3JSC18GCActivityCallback6doWorkERNS_2VME` | `qDIjYbghS7o` | +| `_ZN3JSC18GCActivityCallbackC2EPNS_4HeapE` | `47OujMZvKOE` | +| `_ZN3JSC18GCActivityCallbackC2ERNS_2VME` | `ZCxdJPvigpE` | +| `_ZN3JSC18GCActivityCallbackD0Ev` | `4xSvkMgasQc` | +| `_ZN3JSC18GCActivityCallbackD1Ev` | `VoyTsrKlfdg` | +| `_ZN3JSC18GCActivityCallbackD2Ev` | `EAQVV1xK9tI` | +| `_ZN3JSC18IncrementalSweeper13startSweepingERNS_4HeapE` | `giqKNgVN4+w` | +| `_ZN3JSC18IncrementalSweeperC1EPNS_4HeapE` | `zQmtzzBK6wQ` | +| `_ZN3JSC18IncrementalSweeperC2EPNS_4HeapE` | `2X3KbR1J6-c` | +| `_ZN3JSC18PropertyDescriptor11setWritableEb` | `TPYlzWierqc` | +| `_ZN3JSC18PropertyDescriptor12setUndefinedEv` | `KJAQlWsQKf8` | +| `_ZN3JSC18PropertyDescriptor13setDescriptorENS_7JSValueEj` | `6yS9uNax8IU` | +| `_ZN3JSC18PropertyDescriptor13setEnumerableEb` | `UGdSsj17Fm8` | +| `_ZN3JSC18PropertyDescriptor15setConfigurableEb` | `6kO8OVYUL7U` | +| `_ZN3JSC18PropertyDescriptor21setAccessorDescriptorEPNS_12GetterSetterEj` | `1U1HXAR-PdU` | +| `_ZN3JSC18PropertyDescriptor9setGetterENS_7JSValueE` | `9tHTHaoaTRU` | +| `_ZN3JSC18PropertyDescriptor9setSetterENS_7JSValueE` | `nJ0Pu5MzLBw` | +| `_ZN3JSC19HeapSnapshotBuilder11analyzeNodeEPNS_6JSCellE` | `6+Ilj5seAW8` | +| `_ZN3JSC19HeapSnapshotBuilder13buildSnapshotEv` | `KJoz6a9hUJQ` | +| `_ZN3JSC19HeapSnapshotBuilder15setLabelForCellEPNS_6JSCellERKN3WTF6StringE` | `WudmiYuePRQ` | +| `_ZN3JSC19HeapSnapshotBuilder16analyzeIndexEdgeEPNS_6JSCellES2_j` | `U1M1KcuS+Bw` | +| `_ZN3JSC19HeapSnapshotBuilder23analyzePropertyNameEdgeEPNS_6JSCellES2_PN3WTF17UniquedStringImplE` | `VF2AmkYy2ho` | +| `_ZN3JSC19HeapSnapshotBuilder23analyzeVariableNameEdgeEPNS_6JSCellES2_PN3WTF17UniquedStringImplE` | `xULVsMb2kto` | +| `_ZN3JSC19HeapSnapshotBuilder23getNextObjectIdentifierEv` | `XqLvpNjc4Wc` | +| `_ZN3JSC19HeapSnapshotBuilder23setWrappedObjectForCellEPNS_6JSCellEPv` | `HY6bZLf09XA` | +| `_ZN3JSC19HeapSnapshotBuilder30previousSnapshotHasNodeForCellEPNS_6JSCellERj` | `GVa9wfF+3Mo` | +| `_ZN3JSC19HeapSnapshotBuilder34resetNextAvailableObjectIdentifierEv` | `AVBWiTSDdMg` | +| `_ZN3JSC19HeapSnapshotBuilder38setOpaqueRootReachabilityReasonForCellEPNS_6JSCellEPKc` | `54i4mVgs+44` | +| `_ZN3JSC19HeapSnapshotBuilder4jsonEN3WTF8FunctionIFbRKNS_16HeapSnapshotNodeEEEE` | `wAzC8QJlE7I` | +| `_ZN3JSC19HeapSnapshotBuilder4jsonEv` | `SfLr5McD14w` | +| `_ZN3JSC19HeapSnapshotBuilderC1ERNS_12HeapProfilerENS0_12SnapshotTypeE` | `HMSfP0oCnvY` | +| `_ZN3JSC19HeapSnapshotBuilderC2ERNS_12HeapProfilerENS0_12SnapshotTypeE` | `yLsRvY6gTfM` | +| `_ZN3JSC19HeapSnapshotBuilderD0Ev` | `b3xXLyo06sQ` | +| `_ZN3JSC19HeapSnapshotBuilderD1Ev` | `Q01bWyOPayI` | +| `_ZN3JSC19HeapSnapshotBuilderD2Ev` | `9f6kIC+gbnk` | +| `_ZN3JSC19HeapSnapshotBuilderdaEPv` | `ndHeGl-LhLE` | +| `_ZN3JSC19HeapSnapshotBuilderdlEPv` | `9903eIDpTjw` | +| `_ZN3JSC19HeapSnapshotBuildernaEm` | `BhGJXRKJg5c` | +| `_ZN3JSC19HeapSnapshotBuildernaEmPv` | `tRrh53bVLq4` | +| `_ZN3JSC19HeapSnapshotBuildernwEm10NotNullTagPv` | `B0HIBmg7JR4` | +| `_ZN3JSC19HeapSnapshotBuildernwEmPv` | `z+hRdf8ZPp0` | +| `_ZN3JSC19HeapSnapshotBuildernwEm` | `QLsj+YmMqu0` | +| `_ZN3JSC19InlineWatchpointSet11inflateSlowEv` | `hRVJOIGfek0` | +| `_ZN3JSC19InlineWatchpointSet7fireAllERNS_2VMEPKc` | `uMuGhA2DXkw` | +| `_ZN3JSC19InlineWatchpointSet7freeFatEv` | `M3nB2b1kxnQ` | +| `_ZN3JSC19SourceProviderCache5clearEv` | `fIWHyK5ncmg` | +| `_ZN3JSC19SourceProviderCacheD1Ev` | `bWq0yN2dxGA` | +| `_ZN3JSC19SourceProviderCacheD2Ev` | `LcMJhTa9y+c` | +| `_ZN3JSC19iteratorForIterableEPNS_14JSGlobalObjectENS_7JSValueE` | `MQZ5eEw6RLk` | +| `_ZN3JSC19iteratorForIterableEPNS_14JSGlobalObjectEPNS_8JSObjectENS_7JSValueE` | `KuwfGqH0wQs` | +| `_ZN3JSC19numberOfDFGCompilesENS_7JSValueE` | `hRh5HG-czGg` | +| `_ZN3JSC19numberOfDFGCompilesEPK15OpaqueJSContextPK13OpaqueJSValue` | `78B+yM0R6Dc` | +| `_ZN3JSC19reifyStaticAccessorERNS_2VMERKNS_14HashTableValueERNS_8JSObjectENS_12PropertyNameE` | `OBxd2d6mdOA` | +| `_ZN3JSC20TypedArrayControllerD0Ev` | `dfRy73zK7WU` | +| `_ZN3JSC20TypedArrayControllerD1Ev` | `RdP7GBs5Bhc` | +| `_ZN3JSC20TypedArrayControllerD2Ev` | `ChYUCyXH4LU` | +| `_ZN3JSC20createReferenceErrorEPNS_14JSGlobalObjectERKN3WTF6StringE` | `rA7E7LfU7Sk` | +| `_ZN3JSC20failNextNewCodeBlockEPK15OpaqueJSContext` | `qdvU43se+yY` | +| `_ZN3JSC20failNextNewCodeBlockEPNS_14JSGlobalObjectE` | `w00D0ddSQLA` | +| `_ZN3JSC21MarkedJSValueRefArrayC2EP15OpaqueJSContextj` | `YnZOHtC8PgY` | +| `_ZN3JSC21MarkedJSValueRefArrayD1Ev` | `nYh9OiczTZM` | +| `_ZN3JSC21getInt8ArrayClassInfoEv` | `lNZ3n4I2ifo` | +| `_ZN3JSC21linkAndEvaluateModuleEPNS_14JSGlobalObjectERKNS_10IdentifierENS_7JSValueE` | `rS+3o7dQQzQ` | +| `_ZN3JSC21loadAndEvaluateModuleEPNS_14JSGlobalObjectEPNS_6SymbolENS_7JSValueES4_` | `d+qljVI5Zyg` | +| `_ZN3JSC21loadAndEvaluateModuleEPNS_14JSGlobalObjectERKN3WTF6StringENS_7JSValueES6_` | `I5JDizVSxbY` | +| `_ZN3JSC21loadAndEvaluateModuleEPNS_14JSGlobalObjectERKNS_10SourceCodeENS_7JSValueE` | `167jPcYThXk` | +| `_ZN3JSC21objectConstructorSealEPNS_14JSGlobalObjectEPNS_8JSObjectE` | `ZPhz6tYV1ZU` | +| `_ZN3JSC21throwOutOfMemoryErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeERKN3WTF6StringE` | `Rw0L25eAWzQ` | +| `_ZN3JSC21throwOutOfMemoryErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeE` | `lf-7QriZ25o` | +| `_ZN3JSC22ArrayAllocationProfile13updateProfileEv` | `Ik1djcgFM70` | +| `_ZN3JSC22DeferredWatchpointFire21takeWatchpointsToFireEPNS_13WatchpointSetE` | `eaSfA39dQjs` | +| `_ZN3JSC22EdenGCActivityCallback11gcTimeSliceEm` | `5L1e-VHcPLQ` | +| `_ZN3JSC22EdenGCActivityCallback12lastGCLengthERNS_4HeapE` | `ROmH4NlodXE` | +| `_ZN3JSC22EdenGCActivityCallback9deathRateERNS_4HeapE` | `OAFgPnD3Mh0` | +| `_ZN3JSC22EdenGCActivityCallbackC1EPNS_4HeapE` | `Ej4A0AumbJ4` | +| `_ZN3JSC22EdenGCActivityCallbackC2EPNS_4HeapE` | `H6HfiL+Wk9k` | +| `_ZN3JSC22EdenGCActivityCallbackD0Ev` | `OM8XPyh1Dc4` | +| `_ZN3JSC22EdenGCActivityCallbackD1Ev` | `rwjfy+8+84c` | +| `_ZN3JSC22EdenGCActivityCallbackD2Ev` | `BXbQ9Rmo4Ck` | +| `_ZN3JSC22FullGCActivityCallback11gcTimeSliceEm` | `FGYellVj5iA` | +| `_ZN3JSC22FullGCActivityCallback12doCollectionERNS_2VME` | `rYBIlc3NXHA` | +| `_ZN3JSC22FullGCActivityCallback12lastGCLengthERNS_4HeapE` | `cRMHBi70QRE` | +| `_ZN3JSC22FullGCActivityCallback16setDidGCRecentlyEv` | `GNAx4p223bE` | +| `_ZN3JSC22FullGCActivityCallback9deathRateERNS_4HeapE` | `hGpsqO58uHQ` | +| `_ZN3JSC22FullGCActivityCallbackC1EPNS_4HeapE` | `41DAwvtJO4w` | +| `_ZN3JSC22FullGCActivityCallbackC2EPNS_4HeapE` | `aP9pvilFrX0` | +| `_ZN3JSC22FullGCActivityCallbackD1Ev` | `hdZwdtQb1HM` | +| `_ZN3JSC22FullGCActivityCallbackD2Ev` | `eavBwou4xKI` | +| `_ZN3JSC22JSFinalizationRegistry9liveCountERKN3WTF6LockerINS_10JSCellLockEEE` | `wknrJ6zVkZM` | +| `_ZN3JSC22createOutOfMemoryErrorEPNS_14JSGlobalObjectE` | `4jplQ0DHupo` | +| `_ZN3JSC22createOutOfMemoryErrorEPNS_14JSGlobalObjectERKN3WTF6StringE` | `IEEiIV664i8` | +| `_ZN3JSC22generateModuleBytecodeERNS_2VMERKNS_10SourceCodeEiRNS_18BytecodeCacheErrorE` | `XkZ2V6beUDs` | +| `_ZN3JSC22getInt16ArrayClassInfoEv` | `Ixz55FaZ1gQ` | +| `_ZN3JSC22getInt32ArrayClassInfoEv` | `siYafTIfQdU` | +| `_ZN3JSC22getUint8ArrayClassInfoEv` | `RMDMvfUBN9I` | +| `_ZN3JSC22globalMemoryStatisticsEv` | `6+mBcQlHzNg` | +| `_ZN3JSC22optimizeNextInvocationENS_7JSValueE` | `QtEl0Z5ogAE` | +| `_ZN3JSC22optimizeNextInvocationEPNS_14JSGlobalObjectEPNS_9CallFrameE` | `9WSnQEt0mxM` | +| `_ZN3JSC23AbstractSamplingCounter4dumpEv` | `NO8LGTKyCTk` | +| `_ZN3JSC23JSModuleNamespaceObjectC1ERNS_2VMEPNS_9StructureE` | `fRcAtZp5MOQ` | +| `_ZN3JSC23JSModuleNamespaceObjectC2ERNS_2VMEPNS_9StructureE` | `whnNR7vJo40` | +| `_ZN3JSC23MacroAssemblerX86Common18collectCPUFeaturesEv` | `bFDUu1ddOjs` | +| `_ZN3JSC23SimpleMarkingConstraintD0Ev` | `OYYVq9oiK2g` | +| `_ZN3JSC23SimpleMarkingConstraintD1Ev` | `c5xBxHitULA` | +| `_ZN3JSC23SimpleMarkingConstraintD2Ev` | `MvbIJ1nE4dk` | +| `_ZN3JSC23VariableWriteFireDetail5touchERNS_2VMEPNS_13WatchpointSetEPNS_8JSObjectERKNS_12PropertyNameE` | `z1IULOyUpdw` | +| `_ZN3JSC23encodeFunctionCodeBlockERNS_2VMEPKNS_25UnlinkedFunctionCodeBlockERNS_18BytecodeCacheErrorE` | `D1fR9PnAdJU` | +| `_ZN3JSC23generateProgramBytecodeERNS_2VMERKNS_10SourceCodeEiRNS_18BytecodeCacheErrorE` | `gUgoiHAV0rM` | +| `_ZN3JSC23getUint16ArrayClassInfoEv` | `Ab-yq+iJFlE` | +| `_ZN3JSC23getUint32ArrayClassInfoEv` | `Wo1Sfjy-hKk` | +| `_ZN3JSC23objectConstructorFreezeEPNS_14JSGlobalObjectEPNS_8JSObjectE` | `JHYAZN267Cw` | +| `_ZN3JSC23setUpStaticFunctionSlotERNS_2VMEPKNS_9ClassInfoEPKNS_14HashTableValueEPNS_8JSObjectENS_12PropertyNameERNS_12PropertySlotE` | `PQZ+NlJivDo` | +| `_ZN3JSC23throwStackOverflowErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeE` | `fJQ2S9PqkhE` | +| `_ZN3JSC24createStackOverflowErrorEPNS_14JSGlobalObjectE` | `Mw9Tmw6Yjhg` | +| `_ZN3JSC24getCalculatedDisplayNameERNS_2VMEPNS_8JSObjectE` | `Njk1vr6oNSQ` | +| `_ZN3JSC24getExecutableForFunctionENS_7JSValueE` | `0yaNya-i2-U` | +| `_ZN3JSC24getFloat32ArrayClassInfoEv` | `i0Za8oZgEJE` | +| `_ZN3JSC24getFloat64ArrayClassInfoEv` | `7pN3P801eUw` | +| `_ZN3JSC24reportZappedCellAndCrashERNS_4HeapEPKNS_6JSCellE` | `r74Ku+5taTc` | +| `_ZN3JSC25JSSegmentedVariableObject12addVariablesEjNS_7JSValueE` | `3+Qr0+VLg+0` | +| `_ZN3JSC25JSSegmentedVariableObject17findVariableIndexEPv` | `pyKuV2SE-jQ` | +| `_ZN3JSC25jsStringWithCacheSlowCaseERNS_2VMERN3WTF10StringImplE` | `kfaKs9xDzbo` | +| `_ZN3JSC26createIteratorResultObjectEPNS_14JSGlobalObjectENS_7JSValueEb` | `zemLlPNbl-g` | +| `_ZN3JSC26evaluateWithScopeExtensionEPNS_14JSGlobalObjectERKNS_10SourceCodeEPNS_8JSObjectERN3WTF8NakedPtrINS_9ExceptionEEE` | `MZdPfTkA+uc` | +| `_ZN3JSC26setCannotUseOSRExitFuzzingEPNS_14JSGlobalObjectEPNS_9CallFrameE` | `p8J-f9vV8so` | +| `_ZN3JSC28getHashMapBucketKeyClassInfoEv` | `79OE9ov2-JQ` | +| `_ZN3JSC29constructArrayNegativeIndexedEPNS_14JSGlobalObjectEPNS_9StructureEPKNS_7JSValueEj` | `cSsNeg1iICY` | +| `_ZN3JSC29createNotEnoughArgumentsErrorEPNS_14JSGlobalObjectE` | `6sNCMCcDva8` | +| `_ZN3JSC29ensureGlobalFuzzerPredictionsEv` | `C+nqkA-1ro0` | +| `_ZN3JSC29getUint8ClampedArrayClassInfoEv` | `Habqtw0NHUI` | +| `_ZN3JSC2VM10ClientDataD0Ev` | `aNZOcfGHsDI` | +| `_ZN3JSC2VM10ClientDataD2Ev` | `ZrCNEgNghCU` | +| `_ZN3JSC2VM13deleteAllCodeENS_19DeleteAllCodeEffortE` | `I0gE8x3npgg` | +| `_ZN3JSC2VM14throwExceptionEPNS_14JSGlobalObjectENS_7JSValueE` | `pgTUnz0y0Z4` | +| `_ZN3JSC2VM14throwExceptionEPNS_14JSGlobalObjectEPNS_8JSObjectE` | `QEHeEZGfFs4` | +| `_ZN3JSC2VM14throwExceptionEPNS_14JSGlobalObjectEPNS_9ExceptionE` | `TeEgc2M+77E` | +| `_ZN3JSC2VM15canUseAssemblerEv` | `K1-NvM0A0vs` | +| `_ZN3JSC2VM15drainMicrotasksEv` | `6q6V19pMwLs` | +| `_ZN3JSC2VM17addImpurePropertyEPN3WTF17UniquedStringImplE` | `QyLuN1Mhk6Q` | +| `_ZN3JSC2VM18ensureHeapProfilerEv` | `OP6cnN8qBtQ` | +| `_ZN3JSC2VM19deleteAllLinkedCodeENS_19DeleteAllCodeEffortE` | `RW7oeSOy2H8` | +| `_ZN3JSC2VM20dumpTypeProfilerDataEv` | `20VhWlfulVM` | +| `_ZN3JSC2VM20sharedInstanceExistsEv` | `7JrPBRw53sM` | +| `_ZN3JSC2VM21sentinelMapBucketSlowEv` | `atWsdzCXk6E` | +| `_ZN3JSC2VM21sentinelSetBucketSlowEv` | `ZERYoMH2fX8` | +| `_ZN3JSC2VM6createENS_8HeapTypeEPN3WTF7RunLoopE` | `O0EG+VLus-I` | +| `_ZN3JSC2VM8whenIdleEON3WTF8FunctionIFvvEEE` | `K8py1aN3Kj8` | +| `_ZN3JSC2VM9tryCreateENS_8HeapTypeEPN3WTF7RunLoopE` | `u4YLcz+Oh-M` | +| `_ZN3JSC2VMD1Ev` | `cQvetBe+n6M` | +| `_ZN3JSC2VMD2Ev` | `y8YNNx71uI0` | +| `_ZN3JSC32JSDestructibleObjectHeapCellTypeC1Ev` | `Ot6Xfs+KjC4` | +| `_ZN3JSC32JSDestructibleObjectHeapCellTypeC2Ev` | `3X+cZHapioA` | +| `_ZN3JSC32JSDestructibleObjectHeapCellTypeD0Ev` | `YxdY94Fw670` | +| `_ZN3JSC32JSDestructibleObjectHeapCellTypeD1Ev` | `rPRlHpErskQ` | +| `_ZN3JSC32JSDestructibleObjectHeapCellTypeD2Ev` | `r5AXj55AGYo` | +| `_ZN3JSC32throwDOMAttributeGetterTypeErrorEPNS_14JSGlobalObjectERNS_10ThrowScopeEPKNS_9ClassInfoENS_12PropertyNameE` | `hcr91gUh9Mw` | +| `_ZN3JSC33getHashMapBucketKeyValueClassInfoEv` | `FMhcXpjqzIc` | +| `_ZN3JSC35getSomeBaselineCodeBlockForFunctionENS_7JSValueE` | `CYkcE1YQNeg` | +| `_ZN3JSC3DFG18getNumCompilationsEv` | `36QNLZCsGZ8` | +| `_ZN3JSC41constructFunctionSkippingEvalEnabledCheckEPNS_14JSGlobalObjectERKNS_7ArgListERKNS_10IdentifierERKNS_12SourceOriginERKN3WTF6StringERKNSB_12TextPositionEiNS_24FunctionConstructionModeENS_7JSValueE` | `1usDFC2WXJ4` | +| `_ZN3JSC41constructObjectFromPropertyDescriptorSlowEPNS_14JSGlobalObjectERKNS_18PropertyDescriptorE` | `RoiTvhwOekc` | +| `_ZN3JSC4Heap10collectNowENS_15SynchronousnessENS_9GCRequestE` | `IbuWiz2xOr0` | +| `_ZN3JSC4Heap11collectSyncENS_9GCRequestE` | `D9sF1x4r39w` | +| `_ZN3JSC4Heap11objectCountEv` | `kI7pnL9KnSM` | +| `_ZN3JSC4Heap12addFinalizerEPNS_6JSCellEN3WTF8FunctionIFvS2_EEE` | `oGKC1n1oPjc` | +| `_ZN3JSC4Heap12addFinalizerEPNS_6JSCellEPFvS2_E` | `hMwB4k7Cdwk` | +| `_ZN3JSC4Heap12collectAsyncENS_9GCRequestE` | `YyEZYQquw+g` | +| `_ZN3JSC4Heap15extraMemorySizeEv` | `by7vCLgfftE` | +| `_ZN3JSC4Heap17acquireAccessSlowEv` | `mGFiIm0Scn0` | +| `_ZN3JSC4Heap17globalObjectCountEv` | `1sUwwFuHW5g` | +| `_ZN3JSC4Heap17releaseAccessSlowEv` | `zQDUtwE4ChY` | +| `_ZN3JSC4Heap18addToRememberedSetEPKNS_6JSCellE` | `tdwyUqTenRI` | +| `_ZN3JSC4Heap18sweepSynchronouslyEv` | `t3suZsEB5dA` | +| `_ZN3JSC4Heap19stopIfNecessarySlowEv` | `N4mBXKAqz+o` | +| `_ZN3JSC4Heap20fullActivityCallbackEv` | `NQcS-Y0DyQ4` | +| `_ZN3JSC4Heap20protectedObjectCountEv` | `srcPt2vU6ok` | +| `_ZN3JSC4Heap20writeBarrierSlowPathEPKNS_6JSCellE` | `v0uBZ16Lx-0` | +| `_ZN3JSC4Heap24reportExtraMemoryVisitedEm` | `C1ujZwhvzhI` | +| `_ZN3JSC4Heap26protectedGlobalObjectCountEv` | `DrOgvTqPxuA` | +| `_ZN3JSC4Heap26reportAbandonedObjectGraphEv` | `pbl-VhuKb8g` | +| `_ZN3JSC4Heap31collectNowFullIfNotDoneRecentlyENS_15SynchronousnessE` | `RzAvXcBNNiQ` | +| `_ZN3JSC4Heap32setGarbageCollectionTimerEnabledEb` | `uMPfxHtGcSA` | +| `_ZN3JSC4Heap34reportExtraMemoryAllocatedSlowCaseEm` | `lbz5X8Wvmv8` | +| `_ZN3JSC4Heap35deprecatedReportExtraMemorySlowCaseEm` | `DIdt7mJ-+Mo` | +| `_ZN3JSC4Heap39decrementDeferralDepthAndGCIfNeededSlowEv` | `5aS5ecSjlVc` | +| `_ZN3JSC4Heap4sizeEv` | `ioA19fwdJlg` | +| `_ZN3JSC4Heap7collectENS_15SynchronousnessENS_9GCRequestE` | `qTqH7FctY-U` | +| `_ZN3JSC4Heap7protectENS_7JSValueE` | `7W9czm7cuNg` | +| `_ZN3JSC4Heap7sweeperEv` | `R6MsE03xutI` | +| `_ZN3JSC4Heap8capacityEv` | `uCSXhLtoeZo` | +| `_ZN3JSC4Heap9unprotectENS_7JSValueE` | `stegXBPbxWE` | +| `_ZN3JSC4Yarr12errorMessageENS0_9ErrorCodeE` | `CT7Mjy8Qyss` | +| `_ZN3JSC4Yarr12errorToThrowEPNS_14JSGlobalObjectENS0_9ErrorCodeE` | `tavzoCklAu4` | +| `_ZN3JSC4Yarr17RegularExpressionC1ERKS1_` | `MEted8DT97Y` | +| `_ZN3JSC4Yarr17RegularExpressionC2ERKS1_` | `W0owwPgCHfg` | +| `_ZN3JSC4Yarr17RegularExpressionD1Ev` | `dp1-zpR8Tmc` | +| `_ZN3JSC4Yarr17RegularExpressionD2Ev` | `899jyvgvJO8` | +| `_ZN3JSC4Yarr17RegularExpressionaSERKS1_` | `lSppkDFatb8` | +| `_ZN3JSC4Yarr17RegularExpressiondaEPv` | `1+Y+ykZkTwg` | +| `_ZN3JSC4Yarr17RegularExpressiondlEPv` | `XBeeGMsUfMY` | +| `_ZN3JSC4Yarr17RegularExpressionnaEm` | `C7Fqw7M-LiE` | +| `_ZN3JSC4Yarr17RegularExpressionnaEmPv` | `SkGtNek9SeI` | +| `_ZN3JSC4Yarr17RegularExpressionnwEm10NotNullTagPv` | `4Mm-D4wuWxg` | +| `_ZN3JSC4Yarr17RegularExpressionnwEm` | `4lP1J2jYQBU` | +| `_ZN3JSC4Yarr17RegularExpressionnwEmPv` | `CZT07J4ApsE` | +| `_ZN3JSC4callEPNS_14JSGlobalObjectENS_7JSValueERKNS_8CallDataES2_RKNS_7ArgListE` | `iX56hX3H4Yk` | +| `_ZN3JSC6Config25disableFreezingForTestingEv` | `bEXUKe-l3WM` | +| `_ZN3JSC6JSCell14deletePropertyEPS0_PNS_14JSGlobalObjectENS_12PropertyNameE` | `12Rb63-+3s4` | +| `_ZN3JSC6JSCell9getObjectEv` | `MNu0IMCZZ6A` | +| `_ZN3JSC6JSLock12DropAllLocksC1EPNS_14JSGlobalObjectE` | `cYUS1snGtYU` | +| `_ZN3JSC6JSLock12DropAllLocksC1EPNS_2VME` | `s7UPLV3pQ5w` | +| `_ZN3JSC6JSLock12DropAllLocksC1ERNS_2VME` | `i6EfO55+pwo` | +| `_ZN3JSC6JSLock12DropAllLocksC2EPNS_2VME` | `SUrDM-br4Tw` | +| `_ZN3JSC6JSLock12DropAllLocksD1Ev` | `C-hTkXLSvCk` | +| `_ZN3JSC6JSLock12DropAllLocksD2Ev` | `X7pDV+6BR6Y` | +| `_ZN3JSC6JSLock4lockEv` | `V885Latyg4I` | +| `_ZN3JSC6JSLock6unlockEv` | `L4ZP2znGFRY` | +| `_ZN3JSC6JSLockD1Ev` | `VTw9dgPJup4` | +| `_ZN3JSC6JSLockD2Ev` | `XABg0vypnik` | +| `_ZN3JSC6RegExp5matchEPNS_14JSGlobalObjectERKN3WTF6StringEj` | `LWIrVUh8HTA` | +| `_ZN3JSC6RegExp5matchEPNS_14JSGlobalObjectERKN3WTF6StringEjRNS3_6VectorIiLm0ENS3_15CrashOnOverflowELm16ENS3_10FastMallocEEE` | `WnMssl-k6vA` | +| `_ZN3JSC6RegExp6createERNS_2VMERKN3WTF6StringENS3_9OptionSetINS_4Yarr5FlagsEEE` | `EXuTtQMJ0Lw` | +| `_ZN3JSC6Symbol6createERNS_2VMERN3WTF10SymbolImplE` | `PFto-dqmGdE` | +| `_ZN3JSC7JSArray15copyToArgumentsEPNS_14JSGlobalObjectEPNS_7JSValueEjj` | `tS4Vnaq2L4Y` | +| `_ZN3JSC7JSArray26shiftCountWithArrayStorageERNS_2VMEjjPNS_12ArrayStorageE` | `C3bLQX0d+So` | +| `_ZN3JSC7JSArray32tryCreateUninitializedRestrictedERNS_25ObjectInitializationScopeEPNS_17GCDeferralContextEPNS_9StructureEj` | `52QCt9SI414` | +| `_ZN3JSC7JSArray38isIteratorProtocolFastAndNonObservableEv` | `9VhFNFfyadA` | +| `_ZN3JSC7JSArray3popEPNS_14JSGlobalObjectE` | `tCXJCVmBvp0` | +| `_ZN3JSC7JSArray4pushEPNS_14JSGlobalObjectENS_7JSValueE` | `Dowlirg4J24` | +| `_ZN3JSC7JSArray9setLengthEPNS_14JSGlobalObjectEjb` | `FDHnwGEShOQ` | +| `_ZN3JSC7JSValue14putToPrimitiveEPNS_14JSGlobalObjectENS_12PropertyNameES0_RNS_15PutPropertySlotE` | `cW-s-XmLgjM` | +| `_ZN3JSC7JSValue21putToPrimitiveByIndexEPNS_14JSGlobalObjectEjS0_b` | `3JHUyDc9vDI` | +| `_ZN3JSC7Options10initializeEv` | `WmknbtEBGi8` | +| `_ZN3JSC7Options10setOptionsEPKc` | `CYG4ENFhXdA` | +| `_ZN3JSC7Options21dumpAllOptionsInALineERN3WTF13StringBuilderE` | `bmDCAVeZmjo` | +| `_ZN3JSC7WeakSet13findAllocatorENS_13CellContainerE` | `ADSvTqX7Moc` | +| `_ZN3JSC8Bindings10RootObjectD0Ev` | `Xk7pXSVYt5Q` | +| `_ZN3JSC8Bindings10RootObjectD1Ev` | `WwCE+zCxsaA` | +| `_ZN3JSC8Bindings10RootObjectD2Ev` | `76SwZUP7i1w` | +| `_ZN3JSC8Bindings13RuntimeObject10invalidateEv` | `rhd-8JSGyIE` | +| `_ZN3JSC8Bindings13RuntimeObject14finishCreationERNS_2VME` | `Ub1E3ls9MSU` | +| `_ZN3JSC8Bindings13RuntimeObject15createPrototypeERNS_2VMERNS_14JSGlobalObjectE` | `HIWq9DRwkyc` | +| `_ZN3JSC8Bindings13RuntimeObject15createStructureERNS_2VMEPNS_14JSGlobalObjectENS_7JSValueE` | `7hqQnjtxqf4` | +| `_ZN3JSC8Bindings13RuntimeObject15subspaceForImplERNS_2VME` | `y-xe7dpaNBY` | +| `_ZN3JSC8Bindings13RuntimeObject4infoEv` | `Dw6bhZUmD4w` | +| `_ZN3JSC8Bindings13RuntimeObjectC1ERKS1_` | `3C9BB4+ICx4` | +| `_ZN3JSC8Bindings13RuntimeObjectC2ERKS1_` | `lIb8Z1dZrZ8` | +| `_ZN3JSC8Bindings13RuntimeObjectD1Ev` | `mryKx6akQCM` | +| `_ZN3JSC8Bindings13RuntimeObjectD2Ev` | `xX9ex6bQiBI` | +| `_ZN3JSC8Bindings13RuntimeObjectaSERKS1_` | `uuJB4mOieYU` | +| `_ZN3JSC8Bindings8Instance16newRuntimeObjectEPNS_14JSGlobalObjectE` | `tIo9oybpiyU` | +| `_ZN3JSC8Bindings8Instance19createRuntimeObjectEPNS_14JSGlobalObjectE` | `IdQufwgHtEM` | +| `_ZN3JSC8Bindings8InstanceD0Ev` | `gPYiacKjOTw` | +| `_ZN3JSC8Bindings8InstanceD1Ev` | `nzThMO3IUjc` | +| `_ZN3JSC8Bindings8InstanceD2Ev` | `z3VLCO88RDo` | +| `_ZN3JSC8Debugger10isAttachedEPNS_14JSGlobalObjectE` | `oAF2eBhe0Zw` | +| `_ZN3JSC8Debugger11handlePauseEPNS_14JSGlobalObjectENS0_14ReasonForPauseE` | `du0sJLoB+Ok` | +| `_ZN3JSC8Debugger23recompileAllJSFunctionsEv` | `XqiAwG3iE0c` | +| `_ZN3JSC8Debugger23setBreakpointsActivatedEb` | `yKKINymjSZA` | +| `_ZN3JSC8Debugger24currentDebuggerCallFrameEv` | `a7MJrCW6DS8` | +| `_ZN3JSC8Debugger6attachEPNS_14JSGlobalObjectE` | `OGQkWY0JBkg` | +| `_ZN3JSC8Debugger6detachEPNS_14JSGlobalObjectENS0_15ReasonForDetachE` | `agQoH0seOCg` | +| `_ZN3JSC8DebuggerC2ERNS_2VME` | `yZEzHFP7Z-Y` | +| `_ZN3JSC8DebuggerD0Ev` | `OLC0QBXKywQ` | +| `_ZN3JSC8DebuggerD1Ev` | `bpHOgDvr8D0` | +| `_ZN3JSC8DebuggerD2Ev` | `xHBi0i+z3VU` | +| `_ZN3JSC8JSBigInt10createFromEPNS_14JSGlobalObjectEi` | `xebyez5Qcm4` | +| `_ZN3JSC8JSBigInt10createZeroEPNS_14JSGlobalObjectE` | `W8peIGAlB+M` | +| `_ZN3JSC8JSBigInt12tryRightTrimERNS_2VME` | `ZyClRtTBv5w` | +| `_ZN3JSC8JSBigInt13equalsToInt32Ei` | `b+h9maAAa7s` | +| `_ZN3JSC8JSBigInt13tryCreateZeroERNS_2VME` | `GIeprzAUR84` | +| `_ZN3JSC8JSBigInt16createWithLengthEPNS_14JSGlobalObjectEj` | `X9wbEGzDPr8` | +| `_ZN3JSC8JSBigInt19tryCreateWithLengthERNS_2VMEj` | `SVsQArztR4E` | +| `_ZN3JSC8JSBigInt6equalsEPS0_S1_` | `B3mdrwFTe5E` | +| `_ZN3JSC8JSBigInt9rightTrimEPNS_14JSGlobalObjectE` | `Mri-l8u7dGs` | +| `_ZN3JSC8JSCalleeC1ERNS_2VMEPNS_14JSGlobalObjectEPNS_9StructureE` | `bK1L5xuKeq8` | +| `_ZN3JSC8JSCalleeC2ERNS_2VMEPNS_14JSGlobalObjectEPNS_9StructureE` | `DKGaYsA1wCg` | +| `_ZN3JSC8JSObject11hasInstanceEPNS_14JSGlobalObjectENS_7JSValueE` | `3najRojKZIo` | +| `_ZN3JSC8JSObject11hasInstanceEPNS_14JSGlobalObjectENS_7JSValueES3_` | `EBluxG-e6IE` | +| `_ZN3JSC8JSObject13putInlineSlowEPNS_14JSGlobalObjectENS_12PropertyNameENS_7JSValueERNS_15PutPropertySlotE` | `2xnQXfB-1xc` | +| `_ZN3JSC8JSObject18setPrototypeDirectERNS_2VMENS_7JSValueE` | `gl4W0PoYmcA` | +| `_ZN3JSC8JSObject19calculatedClassNameEPS0_` | `QrRGh27dwGo` | +| `_ZN3JSC8JSObject19convertToDictionaryERNS_2VME` | `52xmQd6HEaE` | +| `_ZN3JSC8JSObject19putDirectMayBeIndexEPNS_14JSGlobalObjectENS_12PropertyNameENS_7JSValueE` | `m3WSppWmx-g` | +| `_ZN3JSC8JSObject22ensureArrayStorageSlowERNS_2VME` | `MH56CdAJmFA` | +| `_ZN3JSC8JSObject22fillGetterPropertySlotERNS_2VMERNS_12PropertySlotEPNS_6JSCellEji` | `f8L-LqsJwhw` | +| `_ZN3JSC8JSObject23putDirectCustomAccessorERNS_2VMENS_12PropertyNameENS_7JSValueEj` | `PXoD+IoA-uQ` | +| `_ZN3JSC8JSObject24getOwnPropertyDescriptorEPNS_14JSGlobalObjectENS_12PropertyNameERNS_18PropertyDescriptorE` | `wK7wakwDDQY` | +| `_ZN3JSC8JSObject24getOwnStaticPropertySlotERNS_2VMENS_12PropertyNameERNS_12PropertySlotE` | `ZjAh2OVi9bE` | +| `_ZN3JSC8JSObject24putDirectBuiltinFunctionERNS_2VMEPNS_14JSGlobalObjectERKNS_12PropertyNameEPNS_18FunctionExecutableEj` | `bZVohbbA+ks` | +| `_ZN3JSC8JSObject26setPrototypeWithCycleCheckERNS_2VMEPNS_14JSGlobalObjectENS_7JSValueEb` | `cYwm3B+Hsc8` | +| `_ZN3JSC8JSObject28allocateMoreOutOfLineStorageERNS_2VMEmm` | `Q6GhEnkh2+c` | +| `_ZN3JSC8JSObject30convertToUncacheableDictionaryERNS_2VME` | `Xusa19jU2dE` | +| `_ZN3JSC8JSObject38putDirectIndexSlowOrBeyondVectorLengthEPNS_14JSGlobalObjectEjNS_7JSValueEjNS_18PutDirectIndexModeE` | `OvStpPCEbbE` | +| `_ZN3JSC8JSObject48convertDoubleToContiguousWhilePerformingSetIndexERNS_2VMEjNS_7JSValueE` | `3YAMfWDAvQo` | +| `_ZN3JSC8JSObject4sealERNS_2VME` | `OU1YgSmh-5c` | +| `_ZN3JSC8JSObject55convertInt32ToDoubleOrContiguousWhilePerformingSetIndexERNS_2VMEjNS_7JSValueE` | `33scBRpv12o` | +| `_ZN3JSC8JSObject6freezeERNS_2VME` | `xdP1IeSO2T4` | +| `_ZN3JSC8JSObject9getMethodEPNS_14JSGlobalObjectERNS_8CallDataERKNS_10IdentifierERKN3WTF6StringE` | `SXJ-X-sa3Mo` | +| `_ZN3JSC8Profiler8Database8logEventEPNS_9CodeBlockEPKcRKN3WTF7CStringE` | `iuu9xmvipyE` | +| `_ZN3JSC8Profiler8DatabaseC1ERNS_2VME` | `JCZkULz99oQ` | +| `_ZN3JSC8Profiler8DatabaseC2ERNS_2VME` | `h8D4E0COHcs` | +| `_ZN3JSC8Profiler8DatabaseD1Ev` | `D0C-8tUYQsI` | +| `_ZN3JSC8Profiler8DatabaseD2Ev` | `ZPWTRiiu6N0` | +| `_ZN3JSC8Subspace33parallelNotEmptyMarkedBlockSourceEv` | `wOIw2laLcl8` | +| `_ZN3JSC8SubspaceD0Ev` | `bQ6p+FqArAg` | +| `_ZN3JSC8SubspaceD1Ev` | `Qu0IHkUM-ek` | +| `_ZN3JSC8SubspaceD2Ev` | `IgpdIk+DbIY` | +| `_ZN3JSC9CallFrame13describeFrameEv` | `OWAU-hYF2ZU` | +| `_ZN3JSC9CallFrame18callerSourceOriginERNS_2VME` | `iV3nsYj7oVA` | +| `_ZN3JSC9CodeBlock19baselineAlternativeEv` | `57r68Byk4gk` | +| `_ZN3JSC9CodeBlockD1Ev` | `Z5lmsU8hL4A` | +| `_ZN3JSC9CodeBlockD2Ev` | `QRyzd3Sx+AI` | +| `_ZN3JSC9Exception6createERNS_2VMENS_7JSValueENS0_18StackCaptureActionE` | `G4bcOddzB7o` | +| `_ZN3JSC9HandleSet4growEv` | `EtAkabgjh3U` | +| `_ZN3JSC9Integrity6Random29reloadAndCheckShouldAuditSlowERNS_2VME` | `wjffxAKdynU` | +| `_ZN3JSC9JSPromise15rejectAsHandledEPNS_14JSGlobalObjectENS_7JSValueE` | `Yt3xP1UTR1w` | +| `_ZN3JSC9JSPromise15rejectAsHandledEPNS_14JSGlobalObjectEPNS_9ExceptionE` | `O2FhzBmFTEk` | +| `_ZN3JSC9JSPromise15resolvedPromiseEPNS_14JSGlobalObjectENS_7JSValueE` | `PzTaeImZ7Qc` | +| `_ZN3JSC9JSPromise6createERNS_2VMEPNS_9StructureE` | `3MXVqP+S-MQ` | +| `_ZN3JSC9JSPromise6rejectEPNS_14JSGlobalObjectENS_7JSValueE` | `o9NlGwT45X8` | +| `_ZN3JSC9JSPromise6rejectEPNS_14JSGlobalObjectEPNS_9ExceptionE` | `OEP1yV1d0Kw` | +| `_ZN3JSC9JSPromise7resolveEPNS_14JSGlobalObjectENS_7JSValueE` | `3qeW+zqfuhQ` | +| `_ZN3JSC9Structure16allocateRareDataERNS_2VME` | `R6RIy5e80SU` | +| `_ZN3JSC9Structure16isValidPrototypeENS_7JSValueE` | `mTUZfpGBKD4` | +| `_ZN3JSC9Structure21addPropertyTransitionERNS_2VMEPS0_NS_12PropertyNameEjRi` | `cBckE9-Thps` | +| `_ZN3JSC9Structure24addNewPropertyTransitionERNS_2VMEPS0_NS_12PropertyNameEjRiNS_15PutPropertySlot7ContextEPNS_41DeferredStructureTransitionWatchpointFireE` | `KLZh24-59WY` | +| `_ZN3JSC9Structure24materializePropertyTableERNS_2VMEb` | `Ti1E8o9ZswE` | +| `_ZN3JSC9Structure25attributeChangeTransitionERNS_2VMEPS0_NS_12PropertyNameEjPNS_41DeferredStructureTransitionWatchpointFireE` | `9hyq-EJUn8I` | +| `_ZN3JSC9Structure31toCacheableDictionaryTransitionERNS_2VMEPS0_PNS_41DeferredStructureTransitionWatchpointFireE` | `YjiCAunLHjI` | +| `_ZN3JSC9Structure8isFrozenERNS_2VME` | `G1g1T9IQFEY` | +| `_ZN3JSC9Structure8isSealedERNS_2VME` | `ChLHxk0SgNg` | +| `_ZN3JSC9StructureC1ERNS_2VMEPNS_14JSGlobalObjectENS_7JSValueERKNS_8TypeInfoEPKNS_9ClassInfoEhj` | `JvQlBVLkDuU` | +| `_ZN3JSC9StructureC2ERNS_2VMEPNS_14JSGlobalObjectENS_7JSValueERKNS_8TypeInfoEPKNS_9ClassInfoEhj` | `wA33q23RD+A` | +| `_ZN3JSC9constructEPNS_14JSGlobalObjectENS_7JSValueERKNS_8CallDataERKNS_7ArgListES2_` | `kfbMCFJxb6E` | +| `_ZN3PAL12CryptoDigest11computeHashEv` | `XCaHXZDgzVk` | +| `_ZN3PAL12CryptoDigest8addBytesEPKvm` | `k0PVLsctcUs` | +| `_ZN3PAL12CryptoDigestD1Ev` | `OT1pwqHrDKg` | +| `_ZN3PAL12CryptoDigestD2Ev` | `Qni0CoOBDkU` | +| `_ZN3PAL13SleepDisablerD0Ev` | `QfBibggI2M0` | +| `_ZN3PAL13SleepDisablerD1Ev` | `yyuK50fsLYY` | +| `_ZN3PAL13SleepDisablerD2Ev` | `wIua3QUWZ10` | +| `_ZN3PAL19fileSizeDescriptionEm` | `Pbp5FkR35mI` | +| `_ZN3PAL8KillRing16setToYankedStateEv` | `Zys2AhUVVN4` | +| `_ZN3PAL8KillRing16startNewSequenceEv` | `OVuwx4R7Rxc` | +| `_ZN3PAL8KillRing4yankEv` | `0zIN2tg-XUM` | +| `_ZN3PAL8KillRing6appendERKN3WTF6StringE` | `XfqOSandGfA` | +| `_ZN3PAL8KillRing7prependERKN3WTF6StringE` | `OOTZze9igVc` | +| `_ZN3PAL9SessionID26enableGenerationProtectionEv` | `EmWcBzV6g0w` | +| `_ZN3PAL9SessionID26generateEphemeralSessionIDEv` | `1qKq5FPtbUk` | +| `_ZN3PAL9SessionID27generatePersistentSessionIDEv` | `WMV2-2v7vDQ` | +| `_ZN3WTF10AtomString16fromUTF8InternalEPKcS2_` | `e3wIdaiVEEM` | +| `_ZN3WTF10AtomString6numberEd` | `CLzum2VlVAQ` | +| `_ZN3WTF10AtomString6numberEf` | `hUrC-aKSSHw` | +| `_ZN3WTF10AtomString6numberEi` | `UKKtpWz--YA` | +| `_ZN3WTF10AtomString6numberEj` | `p-7NOjeWS7g` | +| `_ZN3WTF10AtomString6numberEm` | `58J79QECdTA` | +| `_ZN3WTF10AtomString6numberEy` | `YWAonY+kUEQ` | +| `_ZN3WTF10ParkingLot11forEachImplERKNS_12ScopedLambdaIFvRNS_6ThreadEPKvEEE` | `5yXyWGB2WNE` | +| `_ZN3WTF10ParkingLot11unparkCountEPKvj` | `o1Tw6r1096E` | +| `_ZN3WTF10ParkingLot13unparkOneImplEPKvRKNS_12ScopedLambdaIFlNS0_12UnparkResultEEEE` | `spOa93PWZk8` | +| `_ZN3WTF10ParkingLot21parkConditionallyImplEPKvRKNS_12ScopedLambdaIFbvEEERKNS3_IFvvEEERKNS_24TimeWithDynamicClockTypeE` | `NRUy9MCPBJI` | +| `_ZN3WTF10ParkingLot9unparkAllEPKv` | `ocD3Wh0yT1E` | +| `_ZN3WTF10ParkingLot9unparkOneEPKv` | `56Wsrmx3txk` | +| `_ZN3WTF10StringImpl17utf8ForCharactersEPKDsjNS_14ConversionModeE` | `NvD7vqlu22E` | +| `_ZN3WTF10StringImpl17utf8ForCharactersEPKhj` | `o5VwYgTgLtU` | +| `_ZN3WTF10StringImpl28convertToLowercaseWithLocaleERKNS_10AtomStringE` | `5SrekqH5TJQ` | +| `_ZN3WTF10StringImpl28convertToUppercaseWithLocaleERKNS_10AtomStringE` | `LO6XXCwAPyU` | +| `_ZN3WTF10StringImpl31convertToLowercaseWithoutLocaleEv` | `ANdfelUexnk` | +| `_ZN3WTF10StringImpl31convertToUppercaseWithoutLocaleEv` | `cN2zfHMPS5A` | +| `_ZN3WTF10StringImpl57convertToLowercaseWithoutLocaleStartingAtFailingIndex8BitEj` | `mlL4YzHlNa4` | +| `_ZN3WTF10StringImpl5adoptEONS_12StringBufferIDsEE` | `jnH78zLM6qY` | +| `_ZN3WTF10StringImpl5adoptEONS_12StringBufferIhEE` | `E0H-Rg9JQxQ` | +| `_ZN3WTF10StringImpl7destroyEPS0_` | `yxwlKktzy6Y` | +| `_ZN3WTF10StringImpl7replaceEDsDs` | `DLW++1OroYc` | +| `_ZN3WTF10StringImpl7replaceEDsPKhj` | `F4xfUw8Mo+A` | +| `_ZN3WTF10StringView11SplitResult8Iterator17findNextSubstringEv` | `85VvItGKSso` | +| `_ZN3WTF10StringView11SplitResult8IteratorppEv` | `o+fLdWYVdAY` | +| `_ZN3WTF10StringView16GraphemeClusters8IteratorC1EOS2_` | `WKOxC3orqKk` | +| `_ZN3WTF10StringView16GraphemeClusters8IteratorC2EOS2_` | `Tuygbxm9F-A` | +| `_ZN3WTF10StringView16GraphemeClusters8IteratorD1Ev` | `SsbDxo-RZfo` | +| `_ZN3WTF10StringView16GraphemeClusters8IteratorD2Ev` | `C+IZRnhqqG8` | +| `_ZN3WTF10StringView16GraphemeClusters8IteratorppEv` | `YD77iANnIzg` | +| `_ZN3WTF10SymbolImpl16createNullSymbolEv` | `mi8ipN3nDyg` | +| `_ZN3WTF10SymbolImpl17nextHashForSymbolEv` | `AaU89EqjdQ4` | +| `_ZN3WTF10SymbolImpl6createERNS_10StringImplE` | `24SDQYS0N4M` | +| `_ZN3WTF10TextStream10startGroupEv` | `7KjKZ1IVMSc` | +| `_ZN3WTF10TextStream11writeIndentEv` | `miR5GweF1bI` | +| `_ZN3WTF10TextStream7releaseEv` | `qUP3pQuGplg` | +| `_ZN3WTF10TextStream8endGroupEv` | `OoOcl7cXBC8` | +| `_ZN3WTF10TextStream8nextLineEv` | `uG59t516E9Y` | +| `_ZN3WTF10TextStreamlsEPKc` | `Yn4fNeuLEHQ` | +| `_ZN3WTF10TextStreamlsEPKv` | `q-u3UcSDz54` | +| `_ZN3WTF10TextStreamlsERKNS_6StringE` | `emGrjWcFUpg` | +| `_ZN3WTF10TextStreamlsEb` | `ZNFyGf1tkF0` | +| `_ZN3WTF10TextStreamlsEc` | `hr8P3owweqU` | +| `_ZN3WTF10TextStreamlsEd` | `gEYDrUZ4RH0` | +| `_ZN3WTF10TextStreamlsEf` | `zgdoEsexgpk` | +| `_ZN3WTF10TextStreamlsEi` | `tKaE15lxeA8` | +| `_ZN3WTF10TextStreamlsEj` | `vdsj9De6dXc` | +| `_ZN3WTF10TextStreamlsEl` | `WCrQ7baRnjE` | +| `_ZN3WTF10TextStreamlsEm` | `YfUi1bomEh0` | +| `_ZN3WTF10TextStreamlsEx` | `OVWIH7kpWNA` | +| `_ZN3WTF10TextStreamlsEy` | `ZEgja1SGUP8` | +| `_ZN3WTF10URLHelpers14userVisibleURLERKNS_7CStringE` | `2lI1xw8MWoE` | +| `_ZN3WTF10WorkerPool8postTaskEONS_8FunctionIFvvEEE` | `rKBbPSETkpU` | +| `_ZN3WTF10WorkerPoolC1ENS_12ASCIILiteralEjNS_7SecondsE` | `Awb0lcEV300` | +| `_ZN3WTF10WorkerPoolC2ENS_12ASCIILiteralEjNS_7SecondsE` | `R6yTbCLOMSI` | +| `_ZN3WTF10WorkerPoolD1Ev` | `2QBxm43-Rr8` | +| `_ZN3WTF10WorkerPoolD2Ev` | `aL6nI2orYZk` | +| `_ZN3WTF10initializeEv` | `B9f0KrVp8No` | +| `_ZN3WTF11LogArgumentIPKvE8toStringES2_` | `IAZgenCVKNE` | +| `_ZN3WTF11OSAllocator18releaseDecommittedEPvm` | `UFKtijmAhkM` | +| `_ZN3WTF11OSAllocator23hintMemoryNotNeededSoonEPvm` | `XhrUc+9K1xQ` | +| `_ZN3WTF11OSAllocator6commitEPvmbb` | `NeYe5cZQXg8` | +| `_ZN3WTF11OSAllocator8decommitEPvm` | `CFjj7pKSrS4` | +| `_ZN3WTF11Persistence5CoderINS_10AtomStringEE6encodeERNS0_7EncoderERKS2_` | `MIKMQltVsW4` | +| `_ZN3WTF11Persistence5CoderINS_6StringEE6encodeERNS0_7EncoderERKS2_` | `sg+qkgx+sQc` | +| `_ZN3WTF11Persistence5CoderINS_7CStringEE6encodeERNS0_7EncoderERKS2_` | `mUvnZv0tgS4` | +| `_ZN3WTF11Persistence7Decoder14verifyChecksumEv` | `DpHQ8Z9f9SE` | +| `_ZN3WTF11Persistence7DecoderD1Ev` | `KwtehBFKMNY` | +| `_ZN3WTF11Persistence7DecoderD2Ev` | `1lehOfA09zk` | +| `_ZN3WTF11Persistence7Encoder14encodeChecksumEv` | `KkdDDm70AMY` | +| `_ZN3WTF11Persistence7EncoderC1Ev` | `zLzJ8SYXeSg` | +| `_ZN3WTF11Persistence7EncoderC2Ev` | `xy3ZAbOfOU0` | +| `_ZN3WTF11Persistence7EncoderD1Ev` | `qHr9fv68O3E` | +| `_ZN3WTF11Persistence7EncoderD2Ev` | `XadSeFx0sW4` | +| `_ZN3WTF11Persistence7EncoderlsEb` | `rN+7ZJ865FI` | +| `_ZN3WTF11Persistence7EncoderlsEd` | `oVBgNjhMWCo` | +| `_ZN3WTF11Persistence7EncoderlsEf` | `SjhNfgXFUJs` | +| `_ZN3WTF11Persistence7EncoderlsEh` | `2cCuivTnfHI` | +| `_ZN3WTF11Persistence7EncoderlsEi` | `pmqZU82Xnbo` | +| `_ZN3WTF11Persistence7EncoderlsEj` | `rI9jlW2FAC4` | +| `_ZN3WTF11Persistence7EncoderlsEl` | `210fV99FlRk` | +| `_ZN3WTF11Persistence7EncoderlsEm` | `xGGfdp3gJME` | +| `_ZN3WTF11Persistence7EncoderlsEs` | `2WpUBRnLMNg` | +| `_ZN3WTF11Persistence7EncoderlsEt` | `jS+3kWmWE3I` | +| `_ZN3WTF11PrintStream20printfVariableFormatEPKcz` | `wdbdMn2JHZc` | +| `_ZN3WTF11PrintStream3endEv` | `FyOMUdXa5Tc` | +| `_ZN3WTF11PrintStream5beginEv` | `EMO8fbfieRI` | +| `_ZN3WTF11PrintStream6printfEPKcz` | `Idp+8dpnrr8` | +| `_ZN3WTF11StackBounds32currentThreadStackBoundsInternalEv` | `ycxHHEa11OI` | +| `_ZN3WTF11ThreadGroup3addERKNS_14AbstractLockerERNS_6ThreadE` | `wxOWH7WVHa0` | +| `_ZN3WTF11ThreadGroup3addERNS_6ThreadE` | `yI8ZKsn2NmU` | +| `_ZN3WTF11ThreadGroupD2Ev` | `6L90iL-CjWA` | +| `_ZN3WTF11TimingScope11scopeDidEndEv` | `vNFWwy493LY` | +| `_ZN3WTF11portAllowedERKNS_3URLE` | `tRrU4kb6AtE` | +| `_ZN3WTF11setDataFileEPKc` | `mxYK3TBPDro` | +| `_ZN3WTF11setNonBlockEi` | `ZH232ViZnko` | +| `_ZN3WTF12CountingLock10unlockSlowEv` | `y9CL7tutRKQ` | +| `_ZN3WTF12CountingLock8lockSlowEv` | `QSRjO+sqoFU` | +| `_ZN3WTF12isMainThreadEv` | `MKhFWAdCyCw` | +| `_ZN3WTF13FastBitVector10clearRangeEmm` | `q1+R1z2aE0E` | +| `_ZN3WTF13MetaAllocator17addFreshFreeSpaceEPvm` | `RPLKRR7vgYE` | +| `_ZN3WTF13MetaAllocator17currentStatisticsERKNS_6LockerINS_4LockEEE` | `3SW2Rs+BCYE` | +| `_ZN3WTF13MetaAllocator17freeFreeSpaceNodeEPNS0_13FreeSpaceNodeE` | `sIQ2j-9PjgU` | +| `_ZN3WTF13MetaAllocator18debugFreeSpaceSizeEv` | `HjS-hWzdVyw` | +| `_ZN3WTF13MetaAllocator19isInAllocatedMemoryERKNS_14AbstractLockerEPv` | `HT5RnWbzRwc` | +| `_ZN3WTF13MetaAllocator7releaseERKNS_6LockerINS_4LockEEERNS_19MetaAllocatorHandleE` | `kwKBptlN1OA` | +| `_ZN3WTF13MetaAllocator8allocateERKNS_6LockerINS_4LockEEEm` | `Mb2fweNBShA` | +| `_ZN3WTF13MetaAllocatorC2ERNS_4LockEmm` | `7GF7CfOKTBw` | +| `_ZN3WTF13MetaAllocatorD0Ev` | `bWPSP8A71Rk` | +| `_ZN3WTF13MetaAllocatorD2Ev` | `55-0EcgDmz8` | +| `_ZN3WTF13ReadWriteLock10readUnlockEv` | `yPRGiJGWA-4` | +| `_ZN3WTF13ReadWriteLock11writeUnlockEv` | `trYWw7dUt9Y` | +| `_ZN3WTF13ReadWriteLock8readLockEv` | `tbhRqP+K-1c` | +| `_ZN3WTF13ReadWriteLock9writeLockEv` | `cKaXv3V+n+k` | +| `_ZN3WTF13StringBuilder11shrinkToFitEv` | `2n+gsAD8UIc` | +| `_ZN3WTF13StringBuilder15reserveCapacityEj` | `ZE+kvBSZtjw` | +| `_ZN3WTF13StringBuilder16appendCharactersEPKDsj` | `ZWHpG+3pbDg` | +| `_ZN3WTF13StringBuilder16appendCharactersEPKhj` | `E2TkkVyRubQ` | +| `_ZN3WTF13StringBuilder22appendQuotedJSONStringERKNS_6StringE` | `xJRNEp2d-Wg` | +| `_ZN3WTF13aboutBlankURLEv` | `3nmBMeZtd+Y` | +| `_ZN3WTF13dumpCharacterERNS_11PrintStreamEc` | `rpsD9ynfjc0` | +| `_ZN3WTF13isMainRunLoopEv` | `5K-9Y7aFV60` | +| `_ZN3WTF13normalizedNFCENS_10StringViewE` | `bgrxJM-HmMM` | +| `_ZN3WTF13normalizedNFCERKNS_6StringE` | `2LUk8Ch0mJY` | +| `_ZN3WTF13printInternalERNS_11PrintStreamEN3JSC14TypedArrayModeE` | `DwwpqTcKG0Q` | +| `_ZN3WTF13printInternalERNS_11PrintStreamENS_10RawPointerE` | `bwThPa6WtDc` | +| `_ZN3WTF13printInternalERNS_11PrintStreamENS_9ClockTypeE` | `6cO1aKnHM64` | +| `_ZN3WTF13printInternalERNS_11PrintStreamEPKNS_10StringImplE` | `iZmKEESJ3mw` | +| `_ZN3WTF13printInternalERNS_11PrintStreamEPKc` | `P-HGfOZxkgU` | +| `_ZN3WTF13printInternalERNS_11PrintStreamEPN3JSC9CodeBlockE` | `RFKbaZAsHKs` | +| `_ZN3WTF13printInternalERNS_11PrintStreamERKNS_6StringE` | `KDRPZeaauUQ` | +| `_ZN3WTF13printInternalERNS_11PrintStreamERKNS_7CStringE` | `dY5HI1HhX8Q` | +| `_ZN3WTF13printInternalERNS_11PrintStreamEa` | `ejLjAkmwuMc` | +| `_ZN3WTF13printInternalERNS_11PrintStreamEb` | `laF+cd2rvw8` | +| `_ZN3WTF13printInternalERNS_11PrintStreamEd` | `yHE4d2C-Ius` | +| `_ZN3WTF13printInternalERNS_11PrintStreamEf` | `Nvu+-KKztN4` | +| `_ZN3WTF13printInternalERNS_11PrintStreamEh` | `j4qPZlQyJUc` | +| `_ZN3WTF13printInternalERNS_11PrintStreamEi` | `YzM19lL-JGU` | +| `_ZN3WTF13printInternalERNS_11PrintStreamEj` | `BEzuHMRRYIs` | +| `_ZN3WTF13printInternalERNS_11PrintStreamEl` | `OwyHvMkCWP8` | +| `_ZN3WTF13printInternalERNS_11PrintStreamEm` | `d4mB8nRN2tU` | +| `_ZN3WTF13printInternalERNS_11PrintStreamEs` | `TGBn8YLhSro` | +| `_ZN3WTF13printInternalERNS_11PrintStreamEt` | `7WVXLziXGtM` | +| `_ZN3WTF13printInternalERNS_11PrintStreamEx` | `tTW6TdBv6wo` | +| `_ZN3WTF13printInternalERNS_11PrintStreamEy` | `BiM6ri5fwo8` | +| `_ZN3WTF14AtomStringImpl10addLiteralEPKcj` | `m+-AT4JRFBw` | +| `_ZN3WTF14AtomStringImpl11addSlowCaseERNS_10StringImplE` | `47H3Xt0ke9s` | +| `_ZN3WTF14AtomStringImpl11addSlowCaseERNS_15AtomStringTableERNS_10StringImplE` | `cUU3-6ewPWM` | +| `_ZN3WTF14AtomStringImpl14lookUpSlowCaseERNS_10StringImplE` | `57WAc7JREYI` | +| `_ZN3WTF14AtomStringImpl3addEPKDsj` | `QHaMM3hoxqk` | +| `_ZN3WTF14AtomStringImpl3addEPKNS_10StringImpl16StaticStringImplE` | `CHSR+Bn4MmA` | +| `_ZN3WTF14AtomStringImpl3addEPKhj` | `4SU1b9bcL18` | +| `_ZN3WTF14AtomStringImpl3addEPNS_10StringImplEjj` | `Rt3lL1byIzc` | +| `_ZN3WTF14AtomStringImpl6lookUpEPKDsj` | `F8WuSFdu4is` | +| `_ZN3WTF14AtomStringImpl6lookUpEPKhj` | `BuAIhZn+1Rs` | +| `_ZN3WTF14FileSystemImpl10deleteFileERKNS_6StringE` | `wfDoJ0yldXQ` | +| `_ZN3WTF14FileSystemImpl10fileExistsERKNS_6StringE` | `nsUltDlbQsU` | +| `_ZN3WTF14FileSystemImpl12truncateFileEix` | `Hf+v9bM1guY` | +| `_ZN3WTF14FileSystemImpl14MappedFileData13mapFileHandleEiNS0_12FileOpenModeENS0_14MappedFileModeE` | `DhTjWwepv6I` | +| `_ZN3WTF14FileSystemImpl14MappedFileDataC1ERKNS_6StringENS0_14MappedFileModeERb` | `7S1e4l2WT+4` | +| `_ZN3WTF14FileSystemImpl14MappedFileDataC1EiNS0_12FileOpenModeENS0_14MappedFileModeERb` | `ACazp+XQF6E` | +| `_ZN3WTF14FileSystemImpl14MappedFileDataC1EiNS0_14MappedFileModeERb` | `d+G-F27Z0RI` | +| `_ZN3WTF14FileSystemImpl14MappedFileDataC2ERKNS_6StringENS0_14MappedFileModeERb` | `kvKr7MWgCMI` | +| `_ZN3WTF14FileSystemImpl14MappedFileDataD1Ev` | `GhSIARptbG8` | +| `_ZN3WTF14FileSystemImpl14MappedFileDataD2Ev` | `xONraGfpcUI` | +| `_ZN3WTF14FileSystemImpl14setMetadataURLERKNS_6StringES3_S3_` | `Cubm05Z7E7I` | +| `_ZN3WTF14FileSystemImpl17encodeForFileNameERKNS_6StringE` | `DM39YN-X56M` | +| `_ZN3WTF14FileSystemImpl18createSymbolicLinkERKNS_6StringES3_` | `dbycEreQEcg` | +| `_ZN3WTF14FileSystemImpl18decodeFromFilenameERKNS_6StringE` | `dlR6Z857IFs` | +| `_ZN3WTF14FileSystemImpl18hardLinkOrCopyFileERKNS_6StringES3_` | `8R3APcMguxY` | +| `_ZN3WTF14FileSystemImpl18makeAllDirectoriesERKNS_6StringE` | `yUU8KDyU5Xw` | +| `_ZN3WTF14FileSystemImpl18unlockAndCloseFileEi` | `QpQN5xlV+7w` | +| `_ZN3WTF14FileSystemImpl19filesHaveSameVolumeERKNS_6StringES3_` | `1tXDV45yh2Y` | +| `_ZN3WTF14FileSystemImpl20deleteEmptyDirectoryERKNS_6StringE` | `bmn8kprCF+U` | +| `_ZN3WTF14FileSystemImpl24fileSystemRepresentationERKNS_6StringE` | `sxavOcVMOFA` | +| `_ZN3WTF14FileSystemImpl25createTemporaryZipArchiveERKNS_6StringE` | `9FdGIgYrVF4` | +| `_ZN3WTF14FileSystemImpl25pathByAppendingComponentsENS_10StringViewERKNS_6VectorIS1_Lm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEE` | `k73D+1jaJZ0` | +| `_ZN3WTF14FileSystemImpl27isSafeToUseMemoryMapForPathERKNS_6StringE` | `7++HyggGH44` | +| `_ZN3WTF14FileSystemImpl29makeSafeToUseMemoryMapForPathERKNS_6StringE` | `GzaGT-nX+vk` | +| `_ZN3WTF14FileSystemImpl30appendFileContentsToFileHandleERKNS_6StringERi` | `bFLwUoQqNHM` | +| `_ZN3WTF14FileSystemImpl34stringFromFileSystemRepresentationEPKc` | `Q5IWykchiD8` | +| `_ZN3WTF14FileSystemImpl40lastComponentOfPathIgnoringTrailingSlashERKNS_6StringE` | `3TsXk8jA39E` | +| `_ZN3WTF14FileSystemImpl8hardLinkERKNS_6StringES3_` | `PduV0fym+xE` | +| `_ZN3WTF14FileSystemImpl8moveFileERKNS_6StringES3_` | `Pr98fHFIZlQ` | +| `_ZN3WTF14FileSystemImpl8openFileERKNS_6StringENS0_12FileOpenModeENS0_20FileAccessPermissionEb` | `SQRcDBsMDZU` | +| `_ZN3WTF14FileSystemImpl8realPathERKNS_6StringE` | `5DmxNjwctv4` | +| `_ZN3WTF14FileSystemImpl8seekFileEixNS0_14FileSeekOriginE` | `sJKs4SnHxXk` | +| `_ZN3WTF14FileSystemImpl9closeFileERi` | `WNXNRq0O8PY` | +| `_ZN3WTF14SymbolRegistry12symbolForKeyERKNS_6StringE` | `4eO+y6WtOIw` | +| `_ZN3WTF14SymbolRegistryD1Ev` | `4wHuG6WpyF0` | +| `_ZN3WTF14SymbolRegistryD2Ev` | `l8UKHjO29+w` | +| `_ZN3WTF14aboutSrcDocURLEv` | `Mw84qLwnIs4` | +| `_ZN3WTF14createIteratorENS_10StringViewE` | `svIkqWCw-LU` | +| `_ZN3WTF14dataLogFStringEPKc` | `xQQ4VSubx-k` | +| `_ZN3WTF14dupCloseOnExecEi` | `wQ9-tXakN90` | +| `_ZN3WTF14isVersion4UUIDENS_10StringViewE` | `XbR6JVGM+0U` | +| `_ZN3WTF14setCloseOnExecEi` | `YebyCbJ7X7k` | +| `_ZN3WTF15AtomStringTableD1Ev` | `YHjoCx7QaOs` | +| `_ZN3WTF15AtomStringTableD2Ev` | `JxkGFAxlPa8` | +| `_ZN3WTF15AutomaticThread11shouldSleepERKNS_14AbstractLockerE` | `IRiggzlySno` | +| `_ZN3WTF15AutomaticThread14threadDidStartEv` | `WgCZ0HyfQ3I` | +| `_ZN3WTF15AutomaticThread16threadIsStoppingERKNS_14AbstractLockerE` | `s-PEdREq5oE` | +| `_ZN3WTF15AutomaticThread4joinEv` | `SJux-9UF6Qo` | +| `_ZN3WTF15AutomaticThread5startERKNS_14AbstractLockerE` | `FEFV7Ogfd8E` | +| `_ZN3WTF15AutomaticThread6notifyERKNS_14AbstractLockerE` | `cvMvbwgBuQQ` | +| `_ZN3WTF15AutomaticThread7tryStopERKNS_14AbstractLockerE` | `EuCGceMHgS8` | +| `_ZN3WTF15AutomaticThread9isWaitingERKNS_14AbstractLockerE` | `qGldV9JFaJ8` | +| `_ZN3WTF15AutomaticThreadD0Ev` | `WEVBe0m-ZBo` | +| `_ZN3WTF15AutomaticThreadD1Ev` | `Nt-NqCbSe9c` | +| `_ZN3WTF15AutomaticThreadD2Ev` | `hNenJjJBBXI` | +| `_ZN3WTF15BinarySemaphore9waitUntilERKNS_24TimeWithDynamicClockTypeE` | `JqN5MQOaJVs` | +| `_ZN3WTF15FilePrintStreamD0Ev` | `9yaO7ovhE7o` | +| `_ZN3WTF15FilePrintStreamD1Ev` | `f4A+i2Tlrmk` | +| `_ZN3WTF15FilePrintStreamD2Ev` | `2o3n0iKkjwY` | +| `_ZN3WTF15ThreadCondition4waitERNS_5MutexE` | `Gabnudg8bzM` | +| `_ZN3WTF15ThreadCondition6signalEv` | `FNJN5HdvU90` | +| `_ZN3WTF15ThreadCondition9broadcastEv` | `cmb3wIXQ-Js` | +| `_ZN3WTF15ThreadCondition9timedWaitERNS_5MutexENS_8WallTimeE` | `iulVS7DGVeg` | +| `_ZN3WTF15ThreadConditionD1Ev` | `jfeZA8a0GbA` | +| `_ZN3WTF15ThreadConditionD2Ev` | `FD7Kfj4cCDs` | +| `_ZN3WTF15isWordTextBreakEP14UBreakIterator` | `Jb1OVO08cOE` | +| `_ZN3WTF15memoryFootprintEv` | `DLog94EYwFI` | +| `_ZN3WTF16addSignalHandlerENS_6SignalEONS_8FunctionIFNS_12SignalActionES0_RNS_7SigInfoERNS_17PlatformRegistersEEEE` | `l0Z0NQiqr3M` | +| `_ZN3WTF16callOnMainThreadEONS_8FunctionIFvvEEE` | `DDIR4QpfiIg` | +| `_ZN3WTF16codePointCompareENS_10StringViewES0_` | `PAp-xS1m7bI` | +| `_ZN3WTF16codePointCompareERKNS_6StringES2_` | `qpi9pgZKF5g` | +| `_ZN3WTF17GregorianDateTimeC1EdNS_15LocalTimeOffsetE` | `9NbKoZNi0Jo` | +| `_ZN3WTF17GregorianDateTimeC2EdNS_15LocalTimeOffsetE` | `jRKHSzq25WA` | +| `_ZN3WTF17PrivateSymbolImpl6createERNS_10StringImplE` | `S6NzIicbleU` | +| `_ZN3WTF17StringPrintStream11tryToStringEv` | `TrwAHMfEpsw` | +| `_ZN3WTF17StringPrintStream26toStringWithLatin1FallbackEv` | `cE9rGwgKhic` | +| `_ZN3WTF17StringPrintStream5resetEv` | `6PPm2rZiMcs` | +| `_ZN3WTF17StringPrintStream7vprintfEPKcP13__va_list_tag` | `iXgnlJmCSP4` | +| `_ZN3WTF17StringPrintStream8toStringEv` | `52xCgnSgAkY` | +| `_ZN3WTF17StringPrintStream9toCStringEv` | `7RZABO0cMFI` | +| `_ZN3WTF17StringPrintStreamC1Ev` | `wNhdQWqZALM` | +| `_ZN3WTF17StringPrintStreamC2Ev` | `zQLVD+vqI0Y` | +| `_ZN3WTF17StringPrintStreamD0Ev` | `eSdAHApUsso` | +| `_ZN3WTF17StringPrintStreamD1Ev` | `EOmLhk6TiW4` | +| `_ZN3WTF17StringPrintStreamD2Ev` | `DyzD9dy1J9M` | +| `_ZN3WTF17callOnMainRunLoopEONS_8FunctionIFvvEEE` | `9v4s2WAlWKI` | +| `_ZN3WTF17double_conversion23DoubleToStringConverter19EcmaScriptConverterEv` | `vYLd9fXeOkc` | +| `_ZN3WTF17languageDidChangeEv` | `6kL-6MlnOos` | +| `_ZN3WTF17wordBreakIteratorENS_10StringViewE` | `fmD6lvba-e0` | +| `_ZN3WTF18ExternalStringImpl6createEPKDsjONS_8FunctionIFvPS0_PvjEEE` | `8Elqwzjf6KQ` | +| `_ZN3WTF18ExternalStringImpl6createEPKhjONS_8FunctionIFvPS0_PvjEEE` | `g6gKfjgJEGU` | +| `_ZN3WTF18FunctionDispatcherC2Ev` | `YsRNfwMQmtQ` | +| `_ZN3WTF18FunctionDispatcherD0Ev` | `5qqjEdxEeeU` | +| `_ZN3WTF18FunctionDispatcherD1Ev` | `m9d0vmu44PI` | +| `_ZN3WTF18FunctionDispatcherD2Ev` | `GagczbmtfhI` | +| `_ZN3WTF18ParallelHelperPool13doSomeHelpingEv` | `Jn3pDwHhNS0` | +| `_ZN3WTF18ParallelHelperPool13ensureThreadsEj` | `OpcGwZFMmHs` | +| `_ZN3WTF18ParallelHelperPoolC1EONS_7CStringE` | `iXrXlr3XK4w` | +| `_ZN3WTF18ParallelHelperPoolC2EONS_7CStringE` | `hY2tr-X7ytM` | +| `_ZN3WTF18ParallelHelperPoolD1Ev` | `xfQm3FWZ-og` | +| `_ZN3WTF18ParallelHelperPoolD2Ev` | `zWhqEwkF-C0` | +| `_ZN3WTF19MetaAllocatorHandle6shrinkEm` | `gsZfTYKMm7o` | +| `_ZN3WTF19MetaAllocatorHandleD1Ev` | `xECsbsDabJE` | +| `_ZN3WTF19MetaAllocatorHandleD2Ev` | `JbEwAVpz8zE` | +| `_ZN3WTF19ParallelEnvironment7executeEPv` | `u1jYWyP2OeU` | +| `_ZN3WTF19ParallelEnvironmentC1EPFvPvEmi` | `Efn-a1tGPqw` | +| `_ZN3WTF19ParallelEnvironmentC2EPFvPvEmi` | `ciXM3j2URKk` | +| `_ZN3WTF19isCompilationThreadEv` | `qoO6VaMuvG0` | +| `_ZN3WTF19mimeTypeFromDataURLENS_10StringViewE` | `kie+nv-1HCM` | +| `_ZN3WTF19numGraphemeClustersENS_10StringViewE` | `K7qAbz7P3rs` | +| `_ZN3WTF20ConcurrentPtrHashSet15deleteOldTablesEv` | `K59xDVxbCyM` | +| `_ZN3WTF20ConcurrentPtrHashSet5clearEv` | `sDuWnr1d9ko` | +| `_ZN3WTF20ConcurrentPtrHashSet7addSlowEPNS0_5TableEjjjPv` | `V-fPa0Bhh0w` | +| `_ZN3WTF20ConcurrentPtrHashSetC1Ev` | `CQtwXOnCU1M` | +| `_ZN3WTF20ConcurrentPtrHashSetC2Ev` | `ZVyMTXVUQN0` | +| `_ZN3WTF20ConcurrentPtrHashSetD1Ev` | `NWIItqDdYTQ` | +| `_ZN3WTF20ConcurrentPtrHashSetD2Ev` | `VZF7dCw7zNo` | +| `_ZN3WTF20ParallelHelperClient13doSomeHelpingEv` | `jLYyt8tfmkE` | +| `_ZN3WTF20ParallelHelperClient6finishEv` | `X+GUHRxWSq4` | +| `_ZN3WTF20ParallelHelperClientD1Ev` | `pCPHOY0VhUY` | +| `_ZN3WTF20ParallelHelperClientD2Ev` | `80LTtL71Ics` | +| `_ZN3WTF20initializeMainThreadEv` | `IDANRncW4HU` | +| `_ZN3WTF20resetAccumulatedLogsEv` | `v4r2uz0R1ys` | +| `_ZN3WTF21MemoryPressureHandler12setPageCountEj` | `AAkVf-cyiwM` | +| `_ZN3WTF21MemoryPressureHandler13releaseMemoryENS_8CriticalENS_11SynchronousE` | `LiJyR7R9j9s` | +| `_ZN3WTF21MemoryPressureHandler24currentMemoryUsagePolicyEv` | `3pFQHWls4Ug` | +| `_ZN3WTF21MemoryPressureHandler26endSimulatedMemoryPressureEv` | `6+8N+ozBlqQ` | +| `_ZN3WTF21MemoryPressureHandler26triggerMemoryPressureEventEb` | `baWyExNVtvs` | +| `_ZN3WTF21MemoryPressureHandler28beginSimulatedMemoryPressureEv` | `ePwlNh81Abk` | +| `_ZN3WTF21MemoryPressureHandler33setShouldUsePeriodicMemoryMonitorEb` | `9Xx7YdPMoFY` | +| `_ZN3WTF21MemoryPressureHandler7installEv` | `guwl-qH06sY` | +| `_ZN3WTF21MemoryPressureHandler9singletonEv` | `uLAfeeY2T2Y` | +| `_ZN3WTF21RefCountedLeakCounter24cancelMessageSuppressionEPKc` | `SM0Cf+K17Yw` | +| `_ZN3WTF21RefCountedLeakCounter9decrementEv` | `rtWWBSqgRzo` | +| `_ZN3WTF21RefCountedLeakCounter9incrementEv` | `FpxnD+vtdFQ` | +| `_ZN3WTF21RefCountedLeakCounterC1EPKc` | `7l4jBeWiHI4` | +| `_ZN3WTF21RefCountedLeakCounterC2EPKc` | `opqf3CJzhms` | +| `_ZN3WTF21RefCountedLeakCounterD1Ev` | `huPt1cKM3Ws` | +| `_ZN3WTF21RefCountedLeakCounterD2Ev` | `dbty069DxEI` | +| `_ZN3WTF21bootSessionUUIDStringEv` | `8Wal1MC0Llo` | +| `_ZN3WTF21currentSearchLocaleIDEv` | `D0gLApZm36c` | +| `_ZN3WTF21makeRFC2822DateStringEjjjjjjji` | `uj+HLgqmsTY` | +| `_ZN3WTF21sentenceBreakIteratorENS_10StringViewE` | `poSZevJzCfA` | +| `_ZN3WTF22CrossThreadTaskHandler13postTaskReplyEONS_15CrossThreadTaskE` | `ygkwGUwd8fE` | +| `_ZN3WTF22CrossThreadTaskHandler21setCompletionCallbackEONS_8FunctionIFvvEEE` | `3QQmCLX9eCA` | +| `_ZN3WTF22CrossThreadTaskHandler4killEv` | `XQKghntbq6E` | +| `_ZN3WTF22CrossThreadTaskHandler8postTaskEONS_15CrossThreadTaskE` | `S08oVMvT-8c` | +| `_ZN3WTF22CrossThreadTaskHandlerC1EPKcNS0_25AutodrainedPoolForRunLoopE` | `r3wY39B7+oo` | +| `_ZN3WTF22CrossThreadTaskHandlerC2EPKcNS0_25AutodrainedPoolForRunLoopE` | `QtCPGohNzqI` | +| `_ZN3WTF22CrossThreadTaskHandlerD0Ev` | `aMwGXRZ6024` | +| `_ZN3WTF22CrossThreadTaskHandlerD1Ev` | `RQGUZHWVCLY` | +| `_ZN3WTF22CrossThreadTaskHandlerD2Ev` | `F9bDxOEGeA8` | +| `_ZN3WTF22FastBitVectorWordOwner10resizeSlowEm` | `NetEd5QBLRw` | +| `_ZN3WTF22FastBitVectorWordOwner13setEqualsSlowERKS0_` | `qY895ndHoiI` | +| `_ZN3WTF22TextBreakIteratorCache9singletonEv` | `m9nEKMAp80k` | +| `_ZN3WTF22isMainThreadOrGCThreadEv` | `UHbf2fZIrxk` | +| `_ZN3WTF23callOnMainThreadAndWaitEONS_8FunctionIFvvEEE` | `95FhkfvoGQM` | +| `_ZN3WTF24AutomaticThreadCondition4waitERNS_4LockE` | `4Xe0NrWsndM` | +| `_ZN3WTF24AutomaticThreadCondition7waitForERNS_4LockENS_7SecondsE` | `6VIC0pMsv30` | +| `_ZN3WTF24AutomaticThreadCondition9notifyAllERKNS_14AbstractLockerE` | `Ei7Gxq2j6e8` | +| `_ZN3WTF24AutomaticThreadCondition9notifyOneERKNS_14AbstractLockerE` | `9hjcEW15Tyw` | +| `_ZN3WTF24AutomaticThreadConditionC1Ev` | `eyBB0eDGq5Y` | +| `_ZN3WTF24AutomaticThreadConditionC2Ev` | `AiOIdr8qlv8` | +| `_ZN3WTF24AutomaticThreadConditionD1Ev` | `eW8DnRSDucM` | +| `_ZN3WTF24AutomaticThreadConditionD2Ev` | `qjebiZKT83w` | +| `_ZN3WTF24callOnMainRunLoopAndWaitEONS_8FunctionIFvvEEE` | `uTDkdY+Gquc` | +| `_ZN3WTF24currentTextBreakLocaleIDEv` | `xr2263Do-NU` | +| `_ZN3WTF24isDefaultPortForProtocolEtNS_10StringViewE` | `SC58p5kvRVg` | +| `_ZN3WTF24normalizeLineEndingsToLFEONS_6VectorIhLm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEE` | `aRe4HfMOslA` | +| `_ZN3WTF25activateSignalHandlersForENS_6SignalE` | `Pyu7Zyt6XUE` | +| `_ZN3WTF25addLanguageChangeObserverEPvPFvS0_E` | `dsxMZLBYKOU` | +| `_ZN3WTF26getAndResetAccumulatedLogsEv` | `bD3nxh6Om44` | +| `_ZN3WTF26normalizeLineEndingsToCRLFEONS_6VectorIhLm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEE` | `oUjgPUMQcao` | +| `_ZN3WTF27protocolHostAndPortAreEqualERKNS_3URLES2_` | `tDDzvLlQ7CE` | +| `_ZN3WTF28displayNameForLanguageLocaleERKNS_6StringE` | `8RYSSEu8pUk` | +| `_ZN3WTF28encodeWithURLEscapeSequencesERKNS_6StringE` | `3DqiPW3mayI` | +| `_ZN3WTF28normalizeLineEndingsToNativeEONS_6VectorIhLm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEE` | `KWwKlT9hDkc` | +| `_ZN3WTF28removeLanguageChangeObserverEPv` | `1aiL+Rc87Zg` | +| `_ZN3WTF30numCodeUnitsInGraphemeClustersENS_10StringViewEj` | `3PZOiy2oZ9w` | +| `_ZN3WTF30overrideUserPreferredLanguagesERKNS_6VectorINS_6StringELm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEE` | `21V5nmYlWm4` | +| `_ZN3WTF30userPreferredLanguagesOverrideEv` | `2aMiAKRnwgk` | +| `_ZN3WTF31NonSharedCharacterBreakIteratorC1ENS_10StringViewE` | `Ug-4pREiQoY` | +| `_ZN3WTF31NonSharedCharacterBreakIteratorC2ENS_10StringViewE` | `I5vyOoVvcEw` | +| `_ZN3WTF31NonSharedCharacterBreakIteratorD1Ev` | `gD1m+NqX994` | +| `_ZN3WTF31NonSharedCharacterBreakIteratorD2Ev` | `mihp249C15g` | +| `_ZN3WTF31equalIgnoringFragmentIdentifierERKNS_3URLES2_` | `WkZpN6r-c+A` | +| `_ZN3WTF33indexOfBestMatchingLanguageInListERKNS_6StringERKNS_6VectorIS0_Lm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEERb` | `RoOulmakF2U` | +| `_ZN3WTF37canCurrentThreadAccessThreadLocalDataERNS_6ThreadE` | `UY123Q3mRZI` | +| `_ZN3WTF37parseDateFromNullTerminatedCharactersEPKc` | `Eisgz+sqX1g` | +| `_ZN3WTF3ICU12majorVersionEv` | `VZkUzpN-EW8` | +| `_ZN3WTF3ICU12minorVersionEv` | `GMRugn+lVTw` | +| `_ZN3WTF3URL11setProtocolENS_10StringViewE` | `dnZM2KrZii0` | +| `_ZN3WTF3URL14setHostAndPortENS_10StringViewE` | `w1JXzWCP5UM` | +| `_ZN3WTF3URL15hostIsIPAddressENS_10StringViewE` | `yMosJYTG-QI` | +| `_ZN3WTF3URL17removeCredentialsEv` | `U0i8CT7bRsg` | +| `_ZN3WTF3URL21setFragmentIdentifierENS_10StringViewE` | `piUmuhIuQBs` | +| `_ZN3WTF3URL23fakeURLWithRelativePartENS_10StringViewE` | `d5zAkrYGC2w` | +| `_ZN3WTF3URL25fileURLWithFileSystemPathENS_10StringViewE` | `kQyNibZId5k` | +| `_ZN3WTF3URL32removeQueryAndFragmentIdentifierEv` | `StUsdXpZIa8` | +| `_ZN3WTF3URL7setHostENS_10StringViewE` | `RoG6zFjMczI` | +| `_ZN3WTF3URL7setPathENS_10StringViewE` | `LZyPi2q90gA` | +| `_ZN3WTF3URL7setUserENS_10StringViewE` | `K79kvESFqPQ` | +| `_ZN3WTF3URL8setQueryENS_10StringViewE` | `EFDd0QoYyP4` | +| `_ZN3WTF3URLC2ERKS0_RKNS_6StringEPKNS_15URLTextEncodingE` | `ANq4kcABc7A` | +| `_ZN3WTF3absERKNS_9MediaTimeE` | `qcwPekjtvyE` | +| `_ZN3WTF40clearDefaultPortForProtocolMapForTestingEv` | `AuhjTeWbn5Y` | +| `_ZN3WTF40registerDefaultPortForProtocolForTestingEtRKNS_6StringE` | `Sn3WBciBmSE` | +| `_ZN3WTF4Lock10unlockSlowEv` | `e4I+fGvwugs` | +| `_ZN3WTF4Lock13safepointSlowEv` | `UX5VJ-OZdTg` | +| `_ZN3WTF4Lock8lockSlowEv` | `GciZ5UdsizU` | +| `_ZN3WTF4SHA116computeHexDigestEv` | `Ow27qMGiCBU` | +| `_ZN3WTF4SHA1C1Ev` | `f4Y+BVScAcc` | +| `_ZN3WTF4SHA1C2Ev` | `Dq5bk2mU2xw` | +| `_ZN3WTF5Mutex4lockEv` | `GCXtBIZJoFY` | +| `_ZN3WTF5Mutex6unlockEv` | `qr+T1Bp3AqE` | +| `_ZN3WTF5Mutex7tryLockEv` | `fFZmV5BzYC0` | +| `_ZN3WTF5MutexC1Ev` | `zFwxBZREkG8` | +| `_ZN3WTF5MutexC2Ev` | `ut8I892aPW8` | +| `_ZN3WTF5MutexD1Ev` | `SVYZa9hbTh8` | +| `_ZN3WTF5MutexD2Ev` | `WBxQfbet+nY` | +| `_ZN3WTF5sleepENS_7SecondsE` | `gsFoqQ-R5js` | +| `_ZN3WTF6String24numberToStringFixedWidthEdj` | `EIwwRbyxZTM` | +| `_ZN3WTF6String28numberToStringFixedPrecisionEdjNS_29TrailingZerosTruncatingPolicyE` | `KtgcveZxnco` | +| `_ZN3WTF6String28numberToStringFixedPrecisionEfjNS_29TrailingZerosTruncatingPolicyE` | `16H0tI43iL8` | +| `_ZN3WTF6String6numberEd` | `I6gS9R3DurY` | +| `_ZN3WTF6String6numberEf` | `7qx9ZPDsDq4` | +| `_ZN3WTF6Thread13mayBeGCThreadEv` | `QIdqG9iFqwI` | +| `_ZN3WTF6Thread14changePriorityEi` | `wITj6RMihC4` | +| `_ZN3WTF6Thread16registerGCThreadENS_12GCThreadTypeE` | `46Y8UjUJPK0` | +| `_ZN3WTF6Thread17waitForCompletionEv` | `Y0aSX0IFJCg` | +| `_ZN3WTF6Thread20initializeCurrentTLSEv` | `gE+M+U9p4Mo` | +| `_ZN3WTF6Thread20numberOfThreadGroupsEv` | `QK-dmxAhbJ8` | +| `_ZN3WTF6Thread27exchangeIsCompilationThreadEb` | `tEDVOghTIbw` | +| `_ZN3WTF6Thread31setCurrentThreadIsUserInitiatedEi` | `OP-5v92RXRc` | +| `_ZN3WTF6Thread33setCurrentThreadIsUserInteractiveEi` | `Bo7kzN9vOT0` | +| `_ZN3WTF6Thread6detachEv` | `RWfjXBukpYU` | +| `_ZN3WTF6Thread6signalEi` | `S2XXSC1X2l8` | +| `_ZN3WTF6ThreadD1Ev` | `KdxtVUZ-nyY` | +| `_ZN3WTF6ThreadD2Ev` | `wEGeGTNWR1A` | +| `_ZN3WTF7RunLoop13dispatchAfterENS_7SecondsEONS_8FunctionIFvvEEE` | `JkZwD6Lu-cg` | +| `_ZN3WTF7RunLoop17setWakeUpCallbackEONS_8FunctionIFvvEEE` | `qIz+DBSTKZM` | +| `_ZN3WTF7RunLoop38suspendFunctionDispatchForCurrentCycleEv` | `fKaloYAyEOM` | +| `_ZN3WTF7RunLoop3runEv` | `c5zBiTJEZH8` | +| `_ZN3WTF7RunLoop4mainEv` | `OOC9ufkAGWE` | +| `_ZN3WTF7RunLoop4stopEv` | `Wg-SBhw2nm8` | +| `_ZN3WTF7RunLoop5cycleEj` | `CKJOqWLNaIA` | +| `_ZN3WTF7RunLoop7currentEv` | `jdKlGaUSjOw` | +| `_ZN3WTF7RunLoop8dispatchEONS_8FunctionIFvvEEE` | `HOOe-g7LcDI` | +| `_ZN3WTF7RunLoop9TimerBase4stopEv` | `ga3epfbYdYw` | +| `_ZN3WTF7RunLoop9TimerBase5startENS_7SecondsEb` | `5ehgoYyaJmA` | +| `_ZN3WTF7RunLoop9TimerBaseC2ERS0_` | `7fOcpBLva2Y` | +| `_ZN3WTF7RunLoop9TimerBaseD1Ev` | `Fj3K7fq81Nw` | +| `_ZN3WTF7RunLoop9TimerBaseD2Ev` | `CmEb6NZaH44` | +| `_ZN3WTF8CollatorC1EPKcb` | `8DP3Cufk2xw` | +| `_ZN3WTF8CollatorC2EPKcb` | `jPO4DqIdSig` | +| `_ZN3WTF8CollatorD1Ev` | `YyCzoJifhqg` | +| `_ZN3WTF8CollatorD2Ev` | `E3vh3HLyXrI` | +| `_ZN3WTF8JSONImpl10ObjectBase6removeERKNS_6StringE` | `nIH6ALR8JYA` | +| `_ZN3WTF8JSONImpl5Array6createEv` | `ASltWpUx6Zg` | +| `_ZN3WTF8JSONImpl5Value4nullEv` | `MkJD9O9pXvI` | +| `_ZN3WTF8JSONImpl5Value6createERKNS_6StringE` | `naQq-gbo7oM` | +| `_ZN3WTF8JSONImpl5Value6createEb` | `vKjxH-Yw7Ls` | +| `_ZN3WTF8JSONImpl5Value6createEd` | `ScILQ+zz87Y` | +| `_ZN3WTF8JSONImpl5Value6createEi` | `JqYcaf0shsQ` | +| `_ZN3WTF8JSONImpl5ValueC1ENS1_4TypeE` | `5I4KfoHqFck` | +| `_ZN3WTF8JSONImpl5ValueC1ERKNS_6StringE` | `6-TkLF+tmkM` | +| `_ZN3WTF8JSONImpl5ValueC1Eb` | `UJnaiUeCe9Q` | +| `_ZN3WTF8JSONImpl5ValueC1Ed` | `6q8q0z2Te1c` | +| `_ZN3WTF8JSONImpl5ValueC1Ei` | `HDSXTb38UlQ` | +| `_ZN3WTF8JSONImpl5ValueC1Ev` | `ZxAOrkVdUbM` | +| `_ZN3WTF8JSONImpl5ValueC2ENS1_4TypeE` | `FGKZ7P+hueQ` | +| `_ZN3WTF8JSONImpl5ValueC2ERKNS_6StringE` | `Ip3FGULx7ng` | +| `_ZN3WTF8JSONImpl5ValueC2Eb` | `4MaZZrV8E6I` | +| `_ZN3WTF8JSONImpl5ValueC2Ed` | `ZqKPLKSRnfg` | +| `_ZN3WTF8JSONImpl5ValueC2Ei` | `jWSGkxnrdis` | +| `_ZN3WTF8JSONImpl5ValueC2Ev` | `UR30bUSo1dc` | +| `_ZN3WTF8JSONImpl5ValueD0Ev` | `Uwkiwe8UVz8` | +| `_ZN3WTF8JSONImpl5ValueD1Ev` | `fkNJrxbUFCw` | +| `_ZN3WTF8JSONImpl5ValueD2Ev` | `VkuqrdPi5Gc` | +| `_ZN3WTF8JSONImpl6Object6createEv` | `Ceq8ieFRG+0` | +| `_ZN3WTF8JSONImpl9ArrayBase10pushDoubleEd` | `SnhnFeqNSlk` | +| `_ZN3WTF8JSONImpl9ArrayBase10pushStringERKNS_6StringE` | `ILp2f6r3-X8` | +| `_ZN3WTF8JSONImpl9ArrayBase11pushBooleanEb` | `nJg34cKegcE` | +| `_ZN3WTF8JSONImpl9ArrayBase11pushIntegerEi` | `CjZOCyNpKsk` | +| `_ZN3WTF8JSONImpl9ArrayBase3endEv` | `VOHLzdv2qls` | +| `_ZN3WTF8JSONImpl9ArrayBase5beginEv` | `IOgsbCKaKDU` | +| `_ZN3WTF8JSONImpl9ArrayBaseC1Ev` | `tMejy0jA0N8` | +| `_ZN3WTF8JSONImpl9ArrayBaseC2Ev` | `VYQqKZrhPn4` | +| `_ZN3WTF8JSONImpl9ArrayBaseD0Ev` | `BOBj7UfI96k` | +| `_ZN3WTF8JSONImpl9ArrayBaseD1Ev` | `zWaD-ACT3yg` | +| `_ZN3WTF8WordLock10unlockSlowEv` | `MffI7wLS6TM` | +| `_ZN3WTF8WordLock8lockSlowEv` | `Acl7E8U+V44` | +| `_ZN3WTF8dataFileEv` | `iZD+UvpXBfg` | +| `_ZN3WTF9BitVector11excludeSlowERKS0_` | `fVOcX2+6qiI` | +| `_ZN3WTF9BitVector13OutOfLineBits6createEm` | `x9Et46dq93c` | +| `_ZN3WTF9BitVector13OutOfLineBits7destroyEPS1_` | `ptecTDe+jIU` | +| `_ZN3WTF9BitVector6resizeEm` | `wn3UsfmQPbI` | +| `_ZN3WTF9BitVector7setSlowERKS0_` | `MCCQhElIfYo` | +| `_ZN3WTF9BitVector8clearAllEv` | `vhJR0H0Mb9Q` | +| `_ZN3WTF9BitVector9mergeSlowERKS0_` | `rrhx6wXU41g` | +| `_ZN3WTF9MediaTime11invalidTimeEv` | `NqV8zMoVdAs` | +| `_ZN3WTF9MediaTime12setTimeScaleEjNS0_13RoundingFlagsE` | `HW0dx8g3GnU` | +| `_ZN3WTF9MediaTime14indefiniteTimeEv` | `nsc5rBVPrJ8` | +| `_ZN3WTF9MediaTime15createWithFloatEf` | `223yzNUMJKw` | +| `_ZN3WTF9MediaTime15createWithFloatEfj` | `mezh2RA6bAM` | +| `_ZN3WTF9MediaTime16createWithDoubleEdj` | `cfsLfZLMLVw` | +| `_ZN3WTF9MediaTime16createWithDoubleEd` | `rRgC2-nilx8` | +| `_ZN3WTF9MediaTime20negativeInfiniteTimeEv` | `xziWz-gUiXs` | +| `_ZN3WTF9MediaTime20positiveInfiniteTimeEv` | `EbaxxSIUfsk` | +| `_ZN3WTF9MediaTime8zeroTimeEv` | `QKN0Iu6Ujgg` | +| `_ZN3WTF9MediaTimeC1ERKS0_` | `ms8kCVrvykA` | +| `_ZN3WTF9MediaTimeC1Eljh` | `Sf6u84e0Qw4` | +| `_ZN3WTF9MediaTimeC1Ev` | `h1v6F8shCaM` | +| `_ZN3WTF9MediaTimeC2ERKS0_` | `hHLR+tB3U7Y` | +| `_ZN3WTF9MediaTimeC2Eljh` | `ZHUzIIIwj1c` | +| `_ZN3WTF9MediaTimeC2Ev` | `dacK3EAK3-0` | +| `_ZN3WTF9MediaTimeaSERKS0_` | `gR8P+QJ3YlQ` | +| `_ZN3WTF9MediaTimedaEPv` | `HaWSmfYQX0M` | +| `_ZN3WTF9MediaTimedlEPv` | `r0NLdipzCw8` | +| `_ZN3WTF9MediaTimemIERKS0_` | `N+upxnXuFPs` | +| `_ZN3WTF9MediaTimenaEm` | `1t9U+QGX7w0` | +| `_ZN3WTF9MediaTimenaEmPv` | `p8WqfV5JBM4` | +| `_ZN3WTF9MediaTimenwEm10NotNullTagPv` | `emSpWE2Ps5k` | +| `_ZN3WTF9MediaTimenwEmPv` | `4Fp5Pq1VTWs` | +| `_ZN3WTF9MediaTimenwEm` | `Q+IdDa+f7P4` | +| `_ZN3WTF9MediaTimepLERKS0_` | `S2G9jJwRMqs` | +| `_ZN3WTF9URLParser14allValuesEqualERKNS_3URLES3_` | `MlSHagwBWI4` | +| `_ZN3WTF9URLParser19parseURLEncodedFormENS_10StringViewE` | `Ev+2GetBNwE` | +| `_ZN3WTF9URLParser24internalValuesConsistentERKNS_3URLE` | `jKPJKar5yGY` | +| `_ZN3WTF9URLParser9serializeERKNS_6VectorINS_12KeyValuePairINS_6StringES3_EELm0ENS_15CrashOnOverflowELm16ENS_10FastMallocEEE` | `sx-mGnQPyeg` | +| `_ZN3WTFlsERNS_10TextStreamENS_7SecondsE` | `UgIITEJeYRo` | +| `_ZN3WTFlsERNS_10TextStreamERKNS_3URLE` | `8M6cv85VPG4` | +| `_ZN6WebKit14WebProcessMainEiPPc` | `xQI1SMBDGvk` | +| `_ZN6WebKit18NetworkProcessMainEiPPc` | `SJWwfPd52Ug` | +| `_ZN7Nicosia6Buffer6createERKN7WebCore7IntSizeEj` | `MfJ3R1TdXCY` | +| `_ZN7Nicosia6BufferD1Ev` | `VKOM+R2KVYk` | +| `_ZN7Nicosia6BufferD2Ev` | `8mn-7ut9drU` | +| `_ZN7Nicosia9AnimationC1ERKS0_` | `Jhj07sXaEnU` | +| `_ZN7Nicosia9AnimationC2ERKS0_` | `z755FgX+8GE` | +| `_ZN7WebCore10CookieUtil17defaultPathForURLERKN3WTF3URLE` | `itSSjy-a4Ig` | +| `_ZN7WebCore10FileHandle4openERKN3WTF6StringENS1_14FileSystemImpl12FileOpenModeE` | `hFk9FKLENG8` | +| `_ZN7WebCore10FileHandle4openEv` | `FUbGs1rzI6g` | +| `_ZN7WebCore10FileHandle4readEPvi` | `tmUOdbwJw1E` | +| `_ZN7WebCore10FileHandle5closeEv` | `MbuvuN84TNc` | +| `_ZN7WebCore10FileHandle5writeEPKvi` | `UpER4IpzKH0` | +| `_ZN7WebCore10FileHandle6printfEPKcz` | `WEVIlPFp9Rk` | +| `_ZN7WebCore10FileHandleC1EOS0_` | `KPJLpACpg6k` | +| `_ZN7WebCore10FileHandleC1ERKN3WTF6StringENS1_14FileSystemImpl12FileOpenModeENS1_9OptionSetINS5_12FileLockModeEEE` | `e-mG5kgUUIM` | +| `_ZN7WebCore10FileHandleC1ERKN3WTF6StringENS1_14FileSystemImpl12FileOpenModeE` | `oT0mxPLVvvQ` | +| `_ZN7WebCore10FileHandleC1Ev` | `l9nuY5Wn5+c` | +| `_ZN7WebCore10FileHandleC2EOS0_` | `c2EZZ1IdQAE` | +| `_ZN7WebCore10FileHandleC2ERKN3WTF6StringENS1_14FileSystemImpl12FileOpenModeENS1_9OptionSetINS5_12FileLockModeEEE` | `sfw1zSO4sd8` | +| `_ZN7WebCore10FileHandleC2ERKN3WTF6StringENS1_14FileSystemImpl12FileOpenModeE` | `c9v8NHVu0NU` | +| `_ZN7WebCore10FileHandleC2Ev` | `ctto9lYZYhA` | +| `_ZN7WebCore10FileHandleD1Ev` | `dcRpnwhqCwc` | +| `_ZN7WebCore10FileHandleD2Ev` | `0tjbqZDVPp8` | +| `_ZN7WebCore10FileHandleaSEOS0_` | `Em5voBytaq0` | +| `_ZN7WebCore10ISOFullBoxC1ERKS0_` | `zCgYva0hGps` | +| `_ZN7WebCore10ISOFullBoxC1Ev` | `m3TcEKpIGo4` | +| `_ZN7WebCore10ISOFullBoxC2ERKS0_` | `GMDlBS2FjfA` | +| `_ZN7WebCore10ISOFullBoxC2Ev` | `Bw+7-OwsnYM` | +| `_ZN7WebCore10JSDocument14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `vOFs-wz9T-k` | +| `_ZN7WebCore10JSDocument15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `rXL9V01Y7wM` | +| `_ZN7WebCore10JSDocument15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `rEaoUJRD8Wk` | +| `_ZN7WebCore10JSDocument15subspaceForImplERN3JSC2VME` | `BIGLukID1tA` | +| `_ZN7WebCore10JSDocument4infoEv` | `THh1aXQLUk4` | +| `_ZN7WebCore10JSDocument9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `eZQga6mLjWA` | +| `_ZN7WebCore10JSDocument9toWrappedERN3JSC2VMENS1_7JSValueE` | `WkoNcCX2OV4` | +| `_ZN7WebCore10JSDocumentC1ERKS0_` | `CvrQw-QIoxQ` | +| `_ZN7WebCore10JSDocumentC2ERKS0_` | `dZ7FLitHdjs` | +| `_ZN7WebCore10JSDocumentD1Ev` | `46bLh4C9Dio` | +| `_ZN7WebCore10JSDocumentD2Ev` | `xVcVD7jgI9k` | +| `_ZN7WebCore10JSLocation14finishCreationERN3JSC2VME` | `-afcebKwwd8` | +| `_ZN7WebCore10JSLocation14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `FrPx59tZ91Y` | +| `_ZN7WebCore10JSLocation15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `B3Q4YpFuW20` | +| `_ZN7WebCore10JSLocation15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `tajPa-5Fx9M` | +| `_ZN7WebCore10JSLocation15subspaceForImplERN3JSC2VME` | `yUUbHmWz8uA` | +| `_ZN7WebCore10JSLocation4infoEv` | `IFFtgsiRyGQ` | +| `_ZN7WebCore10JSLocation9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `mVYxeYUaohc` | +| `_ZN7WebCore10JSLocation9toWrappedERN3JSC2VMENS1_7JSValueE` | `XRpCWUw66Y0` | +| `_ZN7WebCore10JSLocationC1ERKS0_` | `fczC6fqKCAo` | +| `_ZN7WebCore10JSLocationC2ERKS0_` | `9EcTld4VfWE` | +| `_ZN7WebCore10JSLocationD1Ev` | `fOqDU02-CDk` | +| `_ZN7WebCore10JSLocationD2Ev` | `ki7myINNcOA` | +| `_ZN7WebCore10JSLocationaSERKS0_` | `dcYyto60A7Q` | +| `_ZN7WebCore10JSNodeList9toWrappedERN3JSC2VMENS1_7JSValueE` | `PMX1wD5abbk` | +| `_ZN7WebCore10OriginLockD1Ev` | `pmS3ZsTZjRo` | +| `_ZN7WebCore10OriginLockD2Ev` | `cTkrwldaa1w` | +| `_ZN7WebCore10Pasteboard10readOriginEv` | `kBiv08+TCFs` | +| `_ZN7WebCore10Pasteboard10readStringERKN3WTF6StringE` | `BBRMvk1Qo4w` | +| `_ZN7WebCore10Pasteboard11writeMarkupERKN3WTF6StringE` | `ZgJhmu25z0w` | +| `_ZN7WebCore10Pasteboard11writeStringERKN3WTF6StringES4_` | `6zGNzBYG3-8` | +| `_ZN7WebCore10Pasteboard14readAllStringsERKN3WTF6StringE` | `28y+c5-yi2c` | +| `_ZN7WebCore10Pasteboard14writePlainTextERKN3WTF6StringENS0_18SmartReplaceOptionE` | `QH664gYg5n8` | +| `_ZN7WebCore10Pasteboard15canSmartReplaceEv` | `VW8s48m0Ieo` | +| `_ZN7WebCore10Pasteboard15writeCustomDataERKN3WTF6VectorINS_20PasteboardCustomDataELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE` | `DDmxBXZkpHo` | +| `_ZN7WebCore10Pasteboard16fileContentStateEv` | `fx-H-TjSi0Y` | +| `_ZN7WebCore10Pasteboard20typesSafeForBindingsERKN3WTF6StringE` | `LyRrwIE5yMA` | +| `_ZN7WebCore10Pasteboard22readStringInCustomDataERKN3WTF6StringE` | `gygzdpUOeyI` | +| `_ZN7WebCore10Pasteboard28typesForLegacyUnsafeBindingsEv` | `fEC20q42qRw` | +| `_ZN7WebCore10Pasteboard33writeTrustworthyWebURLsPboardTypeERKNS_13PasteboardURLE` | `PEI-+9NQV6s` | +| `_ZN7WebCore10Pasteboard5clearERKN3WTF6StringE` | `L+HtHRV6uMs` | +| `_ZN7WebCore10Pasteboard5clearEv` | `SIyekYGjGW8` | +| `_ZN7WebCore10Pasteboard5writeERKNS_13PasteboardURLE` | `rZr8MolSf60` | +| `_ZN7WebCore10Pasteboard5writeERKNS_15PasteboardImageE` | `cXWnhYkh4iA` | +| `_ZN7WebCore10Pasteboard5writeERKNS_20PasteboardWebContentE` | `JT1UHZPbMas` | +| `_ZN7WebCore10Pasteboard5writeERKNS_5ColorE` | `Y3ovKe32X2U` | +| `_ZN7WebCore10Pasteboard7hasDataEv` | `EnZD-OcBOWA` | +| `_ZN7WebCore10RenderView10compositorEv` | `kOEP3Dqn1B4` | +| `_ZN7WebCore10ScrollView11removeChildERNS_6WidgetE` | `Xo3ypKAGtNk` | +| `_ZN7WebCore10ScrollView15setScrollOffsetERKNS_8IntPointE` | `1HL-sO1sAZU` | +| `_ZN7WebCore10ScrollView16setParentVisibleEb` | `sgdGnQMxHrQ` | +| `_ZN7WebCore10ScrollView17setScrollbarModesENS_13ScrollbarModeES1_bb` | `7EjM25S0-Rk` | +| `_ZN7WebCore10ScrollView17setUseFixedLayoutEb` | `yOJC0BpCABE` | +| `_ZN7WebCore10ScrollView18setFixedLayoutSizeERKNS_7IntSizeE` | `URNifsiKAk0` | +| `_ZN7WebCore10ScrollView20setCanHaveScrollbarsEb` | `qZzUY4uyYsY` | +| `_ZN7WebCore10ScrollView21setExposedContentRectERKNS_9FloatRectE` | `6epPZ2UYJTk` | +| `_ZN7WebCore10ScrollView23setPaintsEntireContentsEb` | `kDHvtssgHfY` | +| `_ZN7WebCore10ScrollView23setScrollbarsSuppressedEbb` | `pLctuikJSes` | +| `_ZN7WebCore10ScrollView24setUnobscuredContentSizeERKNS_9FloatSizeE` | `w8W-dnXAAGs` | +| `_ZN7WebCore10ScrollView36scrollOffsetChangedViaPlatformWidgetERKNS_8IntPointES3_` | `M8MMEkTAmSk` | +| `_ZN7WebCore10ScrollView4hideEv` | `z9Dal4vwKOQ` | +| `_ZN7WebCore10ScrollView4showEv` | `mYA73TXJq6I` | +| `_ZN7WebCore10ScrollView8addChildERNS_6WidgetE` | `WnKkAvrrmFM` | +| `_ZN7WebCore10StorageMap10removeItemERKN3WTF6StringERS2_` | `QpaYYDZ84Gk` | +| `_ZN7WebCore10StorageMap20setItemIgnoringQuotaERKN3WTF6StringES4_` | `yr9EzrSEsfo` | +| `_ZN7WebCore10StorageMap3keyEj` | `TDRCoFObHro` | +| `_ZN7WebCore10StorageMap7setItemERKN3WTF6StringES4_RS2_Rb` | `fNAsEJUeDYQ` | +| `_ZN7WebCore10TimeRanges13intersectWithERKS0_` | `Eqrp-3495x8` | +| `_ZN7WebCore10TimeRanges3addEdd` | `pU5QYX+50hM` | +| `_ZN7WebCore10TimeRanges6createEdd` | `R1nj8SOcBTI` | +| `_ZN7WebCore10TimeRanges6createEv` | `qeVN+wIVdAM` | +| `_ZN7WebCore10TimeRangesC1Edd` | `pf0-lfD-+mk` | +| `_ZN7WebCore10TimeRangesC1Ev` | `VWbjB+zNNKg` | +| `_ZN7WebCore10TimeRangesC2Edd` | `xPgm+IdmVVY` | +| `_ZN7WebCore10TimeRangesC2Ev` | `Oy52YlgLGxA` | +| `_ZN7WebCore10TreeWalker10firstChildEv` | `ReAKpCiSdJg` | +| `_ZN7WebCore10TreeWalker10parentNodeEv` | `viIZ4QRZU9Q` | +| `_ZN7WebCore10TreeWalker11nextSiblingEv` | `JFg1otUfi+Q` | +| `_ZN7WebCore10TreeWalker12previousNodeEv` | `hon3yzBLbh8` | +| `_ZN7WebCore10TreeWalker14setCurrentNodeERNS_4NodeE` | `f4eEnzXZCuk` | +| `_ZN7WebCore10TreeWalker15previousSiblingEv` | `CziCQrOhJ60` | +| `_ZN7WebCore10TreeWalker8nextNodeEv` | `0lqDXuBdOxs` | +| `_ZN7WebCore10TreeWalker9lastChildEv` | `D8uS+3LygrY` | +| `_ZN7WebCore10XLinkNames4initEv` | `vlhN1cAt9VA` | +| `_ZN7WebCore10XMLNSNames4initEv` | `BoCQ-IBM4I0` | +| `_ZN7WebCore10handCursorEv` | `WvfpvB7jUig` | +| `_ZN7WebCore10inSameLineERKNS_15VisiblePositionES2_` | `dxHvXvfXua4` | +| `_ZN7WebCore10resolveDNSERKN3WTF6StringEmONS0_17CompletionHandlerIFvONSt12experimental15fundamentals_v38expectedINS0_6VectorINS_9IPAddressELm0ENS0_15CrashOnOverflowELm16ENS0_10FastMallocEEENS_8DNSErrorEEEEEE` | `wWJyB5whlAk` | +| `_ZN7WebCore11BidiContext41copyStackRemovingUnicodeEmbeddingContextsEv` | `pugWCMMWZ6w` | +| `_ZN7WebCore11BidiContext6createEh14UCharDirectionbNS_19BidiEmbeddingSourceEPS0_` | `Uwy5H0xJugI` | +| `_ZN7WebCore11BitmapImageC1EPNS_13ImageObserverE` | `sLTFA0Bgofc` | +| `_ZN7WebCore11BitmapImageC2EPNS_13ImageObserverE` | `h0O4HmfKZK4` | +| `_ZN7WebCore11CSSPageRule15setSelectorTextERKN3WTF6StringE` | `o8gTS8Zd4lU` | +| `_ZN7WebCore11CSSPageRule5styleEv` | `nYn0Q3iUFqM` | +| `_ZN7WebCore11CachedFrame23cachedFramePlatformDataEv` | `JR5LaqZ9Fxg` | +| `_ZN7WebCore11CachedImage16imageForRendererEPKNS_12RenderObjectE` | `oHfmDziL9kY` | +| `_ZN7WebCore11ContentType15codecsParameterEv` | `QnfSjWrFiVQ` | +| `_ZN7WebCore11ContentTypeC1EON3WTF6StringE` | `VASPkNGtNOk` | +| `_ZN7WebCore11ContentTypeC1ERKN3WTF6StringE` | `wQPkA8yHr4M` | +| `_ZN7WebCore11ContentTypeC2EON3WTF6StringE` | `mveIcwSS2+U` | +| `_ZN7WebCore11ContentTypeC2ERKN3WTF6StringE` | `pFEBy8mr++k` | +| `_ZN7WebCore11CryptoKeyEC12generatePairENS_25CryptoAlgorithmIdentifierERKN3WTF6StringEbi` | `UvU6Uh2YH-s` | +| `_ZN7WebCore11CryptoKeyEC9importRawENS_25CryptoAlgorithmIdentifierERKN3WTF6StringEONS2_6VectorIhLm0ENS2_15CrashOnOverflowELm16ENS2_10FastMallocEEEbi` | `9b-5iZGs0Fc` | +| `_ZN7WebCore11DOMRectListC1ERKN3WTF6VectorINS_9FloatQuadELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE` | `kOwgVpE5FIs` | +| `_ZN7WebCore11DOMRectListC1ERKN3WTF6VectorINS_9FloatRectELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE` | `s8Ld3Pj8+1M` | +| `_ZN7WebCore11DOMRectListC2ERKN3WTF6VectorINS_9FloatQuadELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE` | `lGp2LofF+9I` | +| `_ZN7WebCore11DOMRectListC2ERKN3WTF6VectorINS_9FloatRectELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE` | `z9vqrN1CUBU` | +| `_ZN7WebCore11DOMRectListD1Ev` | `MeT81dgytRg` | +| `_ZN7WebCore11DOMRectListD2Ev` | `ckm37QV1V8c` | +| `_ZN7WebCore11DisplayList11DisplayList5clearEv` | `QT3HL3shrsk` | +| `_ZN7WebCore11DisplayList14DrawingContext17replayDisplayListERNS_15GraphicsContextE` | `vOnN7+ssLAU` | +| `_ZN7WebCore11DisplayList14DrawingContext26setTracksDisplayListReplayEb` | `4Q3EVWDe1nA` | +| `_ZN7WebCore11DisplayList20FillRectWithGradientC1ERKNS_9FloatRectERNS_8GradientE` | `hgbEy0LBEgc` | +| `_ZN7WebCore11DisplayList20FillRectWithGradientC2ERKNS_9FloatRectERNS_8GradientE` | `J+uDQ2Xphdo` | +| `_ZN7WebCore11DisplayList8RecorderD0Ev` | `TNo4xzYkEW0` | +| `_ZN7WebCore11DisplayList8RecorderD1Ev` | `cFonhkV3dB4` | +| `_ZN7WebCore11DisplayList8RecorderD2Ev` | `USHNwEi-H9g` | +| `_ZN7WebCore11DisplayList8Replayer6replayERKNS_9FloatRectEb` | `rmZhkWIZkNo` | +| `_ZN7WebCore11EditCommand18setEndingSelectionERKNS_16VisibleSelectionE` | `0-gXGwKpQWA` | +| `_ZN7WebCore11EventRegionC1Ev` | `OtHCBIW+1UM` | +| `_ZN7WebCore11EventRegionC2Ev` | `ld+V9lNBhJc` | +| `_ZN7WebCore11EventTarget24dispatchEventForBindingsERNS_5EventE` | `P7ffGUoQ824` | +| `_ZN7WebCore11FetchLoaderD0Ev` | `LzrIP543zJ4` | +| `_ZN7WebCore11FetchLoaderD1Ev` | `iXwXkTuztI8` | +| `_ZN7WebCore11FetchLoaderD2Ev` | `GGSRAj71-Ag` | +| `_ZN7WebCore11FileChooser10chooseFileERKN3WTF6StringE` | `XMTGMU8kQFc` | +| `_ZN7WebCore11FileChooser11chooseFilesERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEES8_` | `MosmRj5LPwY` | +| `_ZN7WebCore11FileChooserD1Ev` | `KXMqfl+qPpU` | +| `_ZN7WebCore11FileChooserD2Ev` | `yPni3AwPKpg` | +| `_ZN7WebCore11FileMonitorD1Ev` | `p367GVhNpE4` | +| `_ZN7WebCore11FileMonitorD2Ev` | `CDjDlxkoWhU` | +| `_ZN7WebCore11FontCascade11setCodePathENS0_8CodePathE` | `BfT4dv3a02o` | +| `_ZN7WebCore11FontCascadeC1EONS_22FontCascadeDescriptionEff` | `vDAAek4FGdM` | +| `_ZN7WebCore11FontCascadeC1Ev` | `g+MtnvgmCMk` | +| `_ZN7WebCore11FontCascadeC2EONS_22FontCascadeDescriptionEff` | `v6+kwbqmq5Y` | +| `_ZN7WebCore11FontCascadeC2Ev` | `P9bHf+GJkCc` | +| `_ZN7WebCore11FontCascadeaSERKS0_` | `XcZcIM5Jyqs` | +| `_ZN7WebCore11FrameLoader11shouldCloseEv` | `56zNcQIs4+U` | +| `_ZN7WebCore11FrameLoader14detachChildrenEv` | `GCB3rQOEXNk` | +| `_ZN7WebCore11FrameLoader16detachFromParentEv` | `6PADv578bD0` | +| `_ZN7WebCore11FrameLoader17HistoryController14setCurrentItemERNS_11HistoryItemE` | `Lppmvb1S2gw` | +| `_ZN7WebCore11FrameLoader17HistoryController18replaceCurrentItemEPNS_11HistoryItemE` | `jY4A0HXFXpE` | +| `_ZN7WebCore11FrameLoader17HistoryController26saveDocumentAndScrollStateEv` | `H79hvSjD4-w` | +| `_ZN7WebCore11FrameLoader17HistoryController33restoreScrollPositionAndViewStateEv` | `i-beSY2PTnE` | +| `_ZN7WebCore11FrameLoader17HistoryController36saveScrollPositionAndViewStateToItemEPNS_11HistoryItemE` | `uRhqnylvSug` | +| `_ZN7WebCore11FrameLoader17stopForUserCancelEb` | `V-PeYfVNu98` | +| `_ZN7WebCore11FrameLoader21clearTestingOverridesEv` | `Q3ZDbJ3QzkY` | +| `_ZN7WebCore11FrameLoader22findFrameForNavigationERKN3WTF10AtomStringEPNS_8DocumentE` | `UkchSX+i+tc` | +| `_ZN7WebCore11FrameLoader25detachFromAllOpenedFramesEv` | `RnAMRwEK40U` | +| `_ZN7WebCore11FrameLoader26reloadWithOverrideEncodingERKN3WTF6StringE` | `VEHP-JHIfR4` | +| `_ZN7WebCore11FrameLoader32setOriginalURLForDownloadRequestERNS_15ResourceRequestE` | `jiS8qhpykyc` | +| `_ZN7WebCore11FrameLoader4initEv` | `WUuB5pmqW1Y` | +| `_ZN7WebCore11FrameLoader4loadEONS_16FrameLoadRequestE` | `V43l3qXnB+U` | +| `_ZN7WebCore11FrameLoader6openerEv` | `P+T9JtolZRw` | +| `_ZN7WebCore11FrameLoader6reloadEN3WTF9OptionSetINS_12ReloadOptionEEE` | `MKqzHRl6vRc` | +| `_ZN7WebCore11FrameLoader9setOpenerEPNS_5FrameE` | `hc6rJqmTZ0o` | +| `_ZN7WebCore11HTMLElement12setDraggableEb` | `xuGZeGhiElE` | +| `_ZN7WebCore11HTMLElement12setTranslateEb` | `B7UcjiIEWJA` | +| `_ZN7WebCore11HTMLElement13setSpellcheckEb` | `YCSRE4f3Ezs` | +| `_ZN7WebCore11HTMLElement18setContentEditableERKN3WTF6StringE` | `eG8KMjqrESQ` | +| `_ZN7WebCore11HTMLElement5clickEv` | `JKl4a2-u08Q` | +| `_ZN7WebCore11HTMLElement6setDirERKN3WTF10AtomStringE` | `qP2DGnK-hWI` | +| `_ZN7WebCore11HistoryItem11setReferrerERKN3WTF6StringE` | `ISu-gIjBX9Q` | +| `_ZN7WebCore11HistoryItem12setURLStringERKN3WTF6StringE` | `g8iiJ8JhJmY` | +| `_ZN7WebCore11HistoryItem15setIsTargetItemEb` | `eOVCR-oZ8MM` | +| `_ZN7WebCore11HistoryItem17setAlternateTitleERKN3WTF6StringE` | `IEeMuJVSFtI` | +| `_ZN7WebCore11HistoryItem17setScrollPositionERKNS_8IntPointE` | `dzlfWs2+nVo` | +| `_ZN7WebCore11HistoryItem18setFormContentTypeERKN3WTF6StringE` | `9uu1wS0n4Jw` | +| `_ZN7WebCore11HistoryItem18setPageScaleFactorEf` | `a2xaqg4pYVg` | +| `_ZN7WebCore11HistoryItem20setOriginalURLStringERKN3WTF6StringE` | `snRhWp5iOYc` | +| `_ZN7WebCore11HistoryItem30setShouldRestoreScrollPositionEb` | `jgSVnCNr55o` | +| `_ZN7WebCore11HistoryItem31setShouldOpenExternalURLsPolicyENS_28ShouldOpenExternalURLsPolicyE` | `OzLx1hQ0HLg` | +| `_ZN7WebCore11HistoryItem8setTitleERKN3WTF6StringE` | `68hfPMwG3UQ` | +| `_ZN7WebCore11HistoryItemC1ERKN3WTF6StringES4_` | `5AfAYG74PQE` | +| `_ZN7WebCore11HistoryItemC1ERKN3WTF6StringES4_S4_` | `QBp4IOFhbaA` | +| `_ZN7WebCore11HistoryItemC1Ev` | `G9Hp-BbB1Cs` | +| `_ZN7WebCore11HistoryItemC2ERKN3WTF6StringES4_` | `OWbX4UakOPI` | +| `_ZN7WebCore11HistoryItemC2ERKN3WTF6StringES4_S4_` | `4ZjyKz4IjQo` | +| `_ZN7WebCore11HistoryItemC2Ev` | `p9lalSG5Ois` | +| `_ZN7WebCore11HistoryItemD1Ev` | `ahAkwbH9gio` | +| `_ZN7WebCore11HistoryItemD2Ev` | `D3lMEqYuTXc` | +| `_ZN7WebCore11ImageBufferD0Ev` | `jabcrdjwdUs` | +| `_ZN7WebCore11ImageBufferD1Ev` | `84955-7DGwQ` | +| `_ZN7WebCore11ImageBufferD2Ev` | `AUcgHfu+700` | +| `_ZN7WebCore11ImageSource10frameCountEv` | `aEmkGkyLVRQ` | +| `_ZN7WebCore11ImageSource20frameDurationAtIndexEm` | `vW0zRb6OvR0` | +| `_ZN7WebCore11ImageSource4sizeENS_16ImageOrientationE` | `2rzwEKVe3yY` | +| `_ZN7WebCore11JSDOMMatrix14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `3r-EMEkvCTo` | +| `_ZN7WebCore11JSDOMMatrix15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `Fl2+3kVkZMY` | +| `_ZN7WebCore11JSDOMMatrix15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `KaBSJa6nI+o` | +| `_ZN7WebCore11JSDOMMatrix15subspaceForImplERN3JSC2VME` | `9dFvRCRI8tg` | +| `_ZN7WebCore11JSDOMMatrix4infoEv` | `jH148QDT-E8` | +| `_ZN7WebCore11JSDOMMatrix9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `LWJUq5ljyUY` | +| `_ZN7WebCore11JSDOMMatrixC1ERKS0_` | `AY5HtCxTNwQ` | +| `_ZN7WebCore11JSDOMMatrixC2ERKS0_` | `I9O9l17oQIo` | +| `_ZN7WebCore11JSDOMMatrixD1Ev` | `+zKDeetJAMk` | +| `_ZN7WebCore11JSDOMMatrixD2Ev` | `Y3loWkCBFRg` | +| `_ZN7WebCore11JSDOMObjectC1EPN3JSC9StructureERNS1_14JSGlobalObjectE` | `-0gVe38p4Ow` | +| `_ZN7WebCore11JSDOMObjectC2EPN3JSC9StructureERNS1_14JSGlobalObjectE` | `RNFFmk6vm9o` | +| `_ZN7WebCore11JSImageData14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `a8lqpn258Mc` | +| `_ZN7WebCore11JSImageData15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `37szA7sW+Gg` | +| `_ZN7WebCore11JSImageData15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `XH2M0C5vXwE` | +| `_ZN7WebCore11JSImageData15subspaceForImplERN3JSC2VME` | `eMg6XrCpbEc` | +| `_ZN7WebCore11JSImageData4infoEv` | `BVx2kjgq3x8` | +| `_ZN7WebCore11JSImageData9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `EqIA-2uMpIo` | +| `_ZN7WebCore11JSImageData9toWrappedERN3JSC2VMENS1_7JSValueE` | `NdPPsuDC5ko` | +| `_ZN7WebCore11JSImageDataC1ERKS0_` | `r3Y3UiOISoo` | +| `_ZN7WebCore11JSImageDataC2ERKS0_` | `N1Fa3I-h3+s` | +| `_ZN7WebCore11JSImageDataD1Ev` | `pB7q2sBApu0` | +| `_ZN7WebCore11JSImageDataD2Ev` | `zX7rzx9kd4k` | +| `_ZN7WebCore11JSImageDataaSERKS0_` | `lNHNe-Ae8Vs` | +| `_ZN7WebCore11JSMediaList9toWrappedERN3JSC2VMENS1_7JSValueE` | `NtZqoErk7n4` | +| `_ZN7WebCore11JSTextTrack9toWrappedERN3JSC2VMENS1_7JSValueE` | `WqXCb6la+Gs` | +| `_ZN7WebCore11MathMLNames4initEv` | `AJHz2Jpq0IU` | +| `_ZN7WebCore11MediaPlayer10cancelLoadEv` | `ONXrD9F8ExY` | +| `_ZN7WebCore11MediaPlayer10invalidateEv` | `C8aXkfk9P0A` | +| `_ZN7WebCore11MediaPlayer11invalidTimeEv` | `gwIt6VK-SdA` | +| `_ZN7WebCore11MediaPlayer11isAvailableEv` | `zvbdw+VaDnQ` | +| `_ZN7WebCore11MediaPlayer11muteChangedEb` | `VwqoXNdHHNA` | +| `_ZN7WebCore11MediaPlayer11naturalSizeEv` | `dGAcIVHLm8o` | +| `_ZN7WebCore11MediaPlayer11rateChangedEv` | `c-jBFhrvm2g` | +| `_ZN7WebCore11MediaPlayer11sizeChangedEv` | `5KgmHsaCxXg` | +| `_ZN7WebCore11MediaPlayer11timeChangedEv` | `kFkr8Q7gREk` | +| `_ZN7WebCore11MediaPlayer12addTextTrackERNS_22InbandTextTrackPrivateE` | `jGEtfWnk1J4` | +| `_ZN7WebCore11MediaPlayer12networkStateEv` | `3wBlLV8DiaY` | +| `_ZN7WebCore11MediaPlayer12supportsTypeERKNS_28MediaEngineSupportParametersE` | `TwqdN6hlLyA` | +| `_ZN7WebCore11MediaPlayer13addAudioTrackERNS_17AudioTrackPrivateE` | `IoDV+oqRRWo` | +| `_ZN7WebCore11MediaPlayer13prepareToPlayEv` | `Inh5Z-OfpQo` | +| `_ZN7WebCore11MediaPlayer13tracksChangedEv` | `d++4nnx2Qr0` | +| `_ZN7WebCore11MediaPlayer13volumeChangedEd` | `xCeTs4XzS8k` | +| `_ZN7WebCore11MediaPlayer15clearMediaCacheERKN3WTF6StringENS1_8WallTimeE` | `kY3qp23saNA` | +| `_ZN7WebCore11MediaPlayer15durationChangedEv` | `2Vi3aJUlabI` | +| `_ZN7WebCore11MediaPlayer15nextMediaEngineEPKNS_18MediaPlayerFactoryE` | `Dal5tHOLXIM` | +| `_ZN7WebCore11MediaPlayer15removeTextTrackERNS_22InbandTextTrackPrivateE` | `J5j1pBL1cjg` | +| `_ZN7WebCore11MediaPlayer16removeAudioTrackERNS_17AudioTrackPrivateE` | `hJRPzfJPa34` | +| `_ZN7WebCore11MediaPlayer16removeVideoTrackERNS_17VideoTrackPrivateE` | `mBE-rCYG6xg` | +| `_ZN7WebCore11MediaPlayer17readyStateChangedEv` | `sNsnvyObgWI` | +| `_ZN7WebCore11MediaPlayer17resetMediaEnginesEv` | `sj2z5W3eMhE` | +| `_ZN7WebCore11MediaPlayer17seekWithToleranceERKN3WTF9MediaTimeES4_S4_` | `8LJOLHmWey4` | +| `_ZN7WebCore11MediaPlayer17setPreservesPitchEb` | `3a+wuXU3LT0` | +| `_ZN7WebCore11MediaPlayer17supportsKeySystemERKN3WTF6StringES4_` | `GxLRCIuSI2M` | +| `_ZN7WebCore11MediaPlayer18liveUpdateIntervalEv` | `qQ96-aBFJz0` | +| `_ZN7WebCore11MediaPlayer18mediaEngineUpdatedEv` | `Hcukgmlncpk` | +| `_ZN7WebCore11MediaPlayer19networkStateChangedEv` | `oj-nLrSCRao` | +| `_ZN7WebCore11MediaPlayer19nextBestMediaEngineEPKNS_18MediaPlayerFactoryE` | `bdE4ZOXsBks` | +| `_ZN7WebCore11MediaPlayer19originsInMediaCacheERKN3WTF6StringE` | `xO2liLZlQcA` | +| `_ZN7WebCore11MediaPlayer19prepareForRenderingEv` | `6MuMVeHVIA0` | +| `_ZN7WebCore11MediaPlayer19syncTextTrackBoundsEv` | `uJUGbADcTTg` | +| `_ZN7WebCore11MediaPlayer20cachedResourceLoaderEv` | `VJFsO+gjT+c` | +| `_ZN7WebCore11MediaPlayer20createResourceLoaderEv` | `gv+Gly1fMT8` | +| `_ZN7WebCore11MediaPlayer20playbackStateChangedEv` | `xgjt4Dkhfuo` | +| `_ZN7WebCore11MediaPlayer20resourceNotSupportedEv` | `Zo-iipctpP0` | +| `_ZN7WebCore11MediaPlayer21characteristicChangedEv` | `QWAd+Vrr4mY` | +| `_ZN7WebCore11MediaPlayer21endSimulatedHDCPErrorEv` | `4UZZcXmQt9Y` | +| `_ZN7WebCore11MediaPlayer21setShouldDisableSleepEb` | `DXdvy5xNlE4` | +| `_ZN7WebCore11MediaPlayer22performTaskAtMediaTimeEON3WTF8FunctionIFvvEEERKNS1_9MediaTimeE` | `3SmmHWPetYc` | +| `_ZN7WebCore11MediaPlayer22setPrivateBrowsingModeEb` | `vpD3oDcNC7s` | +| `_ZN7WebCore11MediaPlayer23beginSimulatedHDCPErrorEv` | `Td8wQ0FqTqg` | +| `_ZN7WebCore11MediaPlayer23loadWithNextMediaEngineEPKNS_18MediaPlayerFactoryE` | `ux-0NhndeA0` | +| `_ZN7WebCore11MediaPlayer24firstVideoFrameAvailableEv` | `Q2r4AKLMrac` | +| `_ZN7WebCore11MediaPlayer24remoteEngineFailedToLoadEv` | `UoMZIQx7JiI` | +| `_ZN7WebCore11MediaPlayer24setClosedCaptionsVisibleEb` | `NFMPkcE9feI` | +| `_ZN7WebCore11MediaPlayer25bufferedTimeRangesChangedEv` | `-h9+qj63jl8` | +| `_ZN7WebCore11MediaPlayer25nativeImageForCurrentTimeEv` | `BzeFBYkcR3w` | +| `_ZN7WebCore11MediaPlayer25seekableTimeRangesChangedEv` | `iovLyay-VDk` | +| `_ZN7WebCore11MediaPlayer25shouldIgnoreIntrinsicSizeEv` | `7w0tVnYH3KI` | +| `_ZN7WebCore11MediaPlayer26activeSourceBuffersChangedEv` | `3yfS8opxosg` | +| `_ZN7WebCore11MediaPlayer26applicationDidBecomeActiveEv` | `AplSHRUidGA` | +| `_ZN7WebCore11MediaPlayer26setTextTrackRepresentationEPNS_23TextTrackRepresentationE` | `GuGxzhc35rM` | +| `_ZN7WebCore11MediaPlayer27applicationWillResignActiveEv` | `7ZGiKfb37l0` | +| `_ZN7WebCore11MediaPlayer28setPreferredDynamicRangeModeENS_16DynamicRangeModeE` | `On4LzFMH93c` | +| `_ZN7WebCore11MediaPlayer28setShouldMaintainAspectRatioEb` | `5cQZYmhq8JE` | +| `_ZN7WebCore11MediaPlayer29acceleratedCompositingEnabledEv` | `zmIG3Jx3Cbc` | +| `_ZN7WebCore11MediaPlayer32acceleratedRenderingStateChangedEv` | `tSM6+q9HRmU` | +| `_ZN7WebCore11MediaPlayer34seekableTimeRangesLastModifiedTimeEv` | `Het7UaL5QvI` | +| `_ZN7WebCore11MediaPlayer4playEv` | `tpslt5d45m4` | +| `_ZN7WebCore11MediaPlayer4seekERKN3WTF9MediaTimeE` | `cmFnNND+sAo` | +| `_ZN7WebCore11MediaPlayer5paintERNS_15GraphicsContextERKNS_9FloatRectE` | `047cYEcKtJA` | +| `_ZN7WebCore11MediaPlayer5pauseEv` | `1HH1+iMik7U` | +| `_ZN7WebCore11MediaPlayer6createERNS_17MediaPlayerClientE` | `1zJdp+3xH20` | +| `_ZN7WebCore11MediaPlayer7repaintEv` | `I55q7IbIU-A` | +| `_ZN7WebCore11MediaPlayer7setRateEd` | `Hhki7ncbDjg` | +| `_ZN7WebCore11MediaPlayer8setMutedEb` | `L+MKiauGHXU` | +| `_ZN7WebCore11MediaPlayer9setVolumeEd` | `woGXdge3elg` | +| `_ZN7WebCore11MediaPlayerC1ERNS_17MediaPlayerClientE` | `P8QD9lY82pI` | +| `_ZN7WebCore11MediaPlayerC2ERNS_17MediaPlayerClientE` | `P7CvsMqVTPo` | +| `_ZN7WebCore11MediaPlayerD1Ev` | `XzBpmNFa5uc` | +| `_ZN7WebCore11MediaPlayerD2Ev` | `B2+7Qkl8Hbo` | +| `_ZN7WebCore11MediaPlayerdaEPv` | `BOaUT257JQE` | +| `_ZN7WebCore11MediaPlayerdlEPv` | `eSvhG4rsH6M` | +| `_ZN7WebCore11MediaPlayernaEmPv` | `u2ws57jhxSc` | +| `_ZN7WebCore11MediaPlayernaEm` | `V5NNlbE52Zc` | +| `_ZN7WebCore11MediaPlayernwEm10NotNullTagPv` | `j2-q2HpgmFg` | +| `_ZN7WebCore11MediaPlayernwEm` | `FTCfSvqy0HE` | +| `_ZN7WebCore11MediaPlayernwEmPv` | `lR0xukIgXJs` | +| `_ZN7WebCore11MemoryCache11setDisabledEb` | `qbOCEUdzp4g` | +| `_ZN7WebCore11MemoryCache13getStatisticsEv` | `ytsTenQqDuY` | +| `_ZN7WebCore11MemoryCache13setCapacitiesEjjj` | `WzYkM53NpFM` | +| `_ZN7WebCore11MemoryCache14evictResourcesEN3PAL9SessionIDE` | `1Ce55-O0RmU` | +| `_ZN7WebCore11MemoryCache14evictResourcesEv` | `snVIK-VDeCo` | +| `_ZN7WebCore11MemoryCache18pruneDeadResourcesEv` | `HIoPdOf0ylg` | +| `_ZN7WebCore11MemoryCache18pruneLiveResourcesEb` | `sPlY1lQ48pY` | +| `_ZN7WebCore11MemoryCache18resourceForRequestERKNS_15ResourceRequestEN3PAL9SessionIDE` | `mb6R-w+qlok` | +| `_ZN7WebCore11MemoryCache24pruneDeadResourcesToSizeEj` | `tIeRJikd80s` | +| `_ZN7WebCore11MemoryCache24pruneLiveResourcesToSizeEjb` | `0uCvAguExZQ` | +| `_ZN7WebCore11MemoryCache30destroyDecodedDataForAllImagesEv` | `11N69VhY3v8` | +| `_ZN7WebCore11MemoryCache9singletonEv` | `hC1QrRVamZ8` | +| `_ZN7WebCore11MessagePort16messageAvailableEv` | `qbrU92iCLn8` | +| `_ZN7WebCore11MessagePort22notifyMessageAvailableERKNS_21MessagePortIdentifierE` | `gPlivtgaQkE` | +| `_ZN7WebCore11PageOverlay15setNeedsDisplayERKNS_7IntRectE` | `uprMqgSaDGg` | +| `_ZN7WebCore11PageOverlay15setNeedsDisplayEv` | `xNhOneyp6W8` | +| `_ZN7WebCore11PageOverlay20stopFadeOutAnimationEv` | `YUVk+nsVGtE` | +| `_ZN7WebCore11PageOverlay5clearEv` | `a6X9xlobc84` | +| `_ZN7WebCore11PageOverlay5layerEv` | `wCzksa5NdKc` | +| `_ZN7WebCore11PageOverlay8setFrameENS_7IntRectE` | `-7FHWVgAqME` | +| `_ZN7WebCore11PageOverlayD1Ev` | `DnbNi+2KqNc` | +| `_ZN7WebCore11PageOverlayD2Ev` | `fSkyAVj+C74` | +| `_ZN7WebCore11RenderLayer21simulateFrequentPaintEv` | `MnQLt6LlgIU` | +| `_ZN7WebCore11RenderStyleD1Ev` | `K-1Q9aFLzz8` | +| `_ZN7WebCore11RenderStyleD2Ev` | `9CdadcNnX+E` | +| `_ZN7WebCore11RenderTheme9singletonEv` | `M9wKVlQLlos` | +| `_ZN7WebCore11SimpleRangeC1EONS_13BoundaryPointES2_` | `Yh3Q1rMIGXo` | +| `_ZN7WebCore11SimpleRangeC1ERKNS_13BoundaryPointES3_` | `qrmirrWJQR8` | +| `_ZN7WebCore11SimpleRangeC2EONS_13BoundaryPointES2_` | `4vKq7BQr9Og` | +| `_ZN7WebCore11SimpleRangeC2ERKNS_13BoundaryPointES3_` | `PtI6Z08-raU` | +| `_ZN7WebCore11WindowProxy12globalObjectERNS_15DOMWrapperWorldE` | `uzgggMZ2EPg` | +| `_ZN7WebCore11WindowProxy22releaseJSWindowProxiesEv` | `JoWQsIsLfwk` | +| `_ZN7WebCore11WindowProxy40createJSWindowProxyWithInitializedScriptERNS_15DOMWrapperWorldE` | `6j48Q9Te2Po` | +| `_ZN7WebCore11WindowProxyD1Ev` | `u0mv-G5GWxg` | +| `_ZN7WebCore11WindowProxyD2Ev` | `4zE6cBWL8ac` | +| `_ZN7WebCore11XPathResult11iterateNextEv` | `dw64kVqtuKM` | +| `_ZN7WebCore11XPathResult12snapshotItemEj` | `uSCkLIMckMk` | +| `_ZN7WebCore11XPathResultD1Ev` | `MQKw1ar2Lak` | +| `_ZN7WebCore11XPathResultD2Ev` | `6GmKgqTuk30` | +| `_ZN7WebCore11iBeamCursorEv` | `WvLsYBhq6RQ` | +| `_ZN7WebCore11isEndOfLineERKNS_15VisiblePositionE` | `5bZk93kkE5w` | +| `_ZN7WebCore11prefetchDNSERKN3WTF6StringE` | `3h1io5JBDcA` | +| `_ZN7WebCore11startOfLineERKNS_15VisiblePositionE` | `lVxn1IsZyGE` | +| `_ZN7WebCore11startOfWordERKNS_15VisiblePositionENS_9EWordSideE` | `jwIZMWyLmuY` | +| `_ZN7WebCore12BlobRegistry16blobRegistryImplEv` | `1sWmNDp+0To` | +| `_ZN7WebCore12BlobRegistryC2ERKS0_` | `Dys3YgSazRQ` | +| `_ZN7WebCore12BlobRegistryC2Ev` | `pmZ0xgBMeqo` | +| `_ZN7WebCore12BlobRegistryD0Ev` | `GKDQvZF6sRk` | +| `_ZN7WebCore12BlobRegistryD1Ev` | `BDv+BtxRrDw` | +| `_ZN7WebCore12BlobRegistryD2Ev` | `HeTyl3dKJxs` | +| `_ZN7WebCore12CSSStyleRule15setSelectorTextERKN3WTF6StringE` | `Dn4hfvMyAFQ` | +| `_ZN7WebCore12CSSStyleRule5styleEv` | `YW1tv-1DCUw` | +| `_ZN7WebCore12CryptoKeyAES9importRawENS_25CryptoAlgorithmIdentifierEON3WTF6VectorIhLm0ENS2_15CrashOnOverflowELm16ENS2_10FastMallocEEEbi` | `K6ZnlaOFL+0` | +| `_ZN7WebCore12DOMException11descriptionENS_13ExceptionCodeE` | `9kGnP+jnLiI` | +| `_ZN7WebCore12DOMTokenList6tokensEv` | `r9FFtkT+gYM` | +| `_ZN7WebCore12DataTransferD1Ev` | `NpqX-u41+kA` | +| `_ZN7WebCore12DataTransferD2Ev` | `SV1G6Vt3Qk0` | +| `_ZN7WebCore12EditingStyle21styleAtSelectionStartERKNS_16VisibleSelectionEb` | `5YnHXcwYZVs` | +| `_ZN7WebCore12EditingStyle8hasStyleENS_13CSSPropertyIDERKN3WTF6StringE` | `yB530dMX22E` | +| `_ZN7WebCore12EditingStyleC1EPKNS_19CSSStyleDeclarationE` | `asUHs4suKzU` | +| `_ZN7WebCore12EditingStyleC2EPKNS_19CSSStyleDeclarationE` | `E15mAwfzwXU` | +| `_ZN7WebCore12EditingStyleD1Ev` | `q7SUMx9iSKQ` | +| `_ZN7WebCore12EditingStyleD2Ev` | `UvL4tfruRO4` | +| `_ZN7WebCore12EventHandler10mouseMovedERKNS_18PlatformMouseEventE` | `hx203o+MZSo` | +| `_ZN7WebCore12EventHandler14scrollOverflowENS_15ScrollDirectionENS_17ScrollGranularityEPNS_4NodeE` | `f0GV9zbaSgc` | +| `_ZN7WebCore12EventHandler15handleAccessKeyERKNS_21PlatformKeyboardEventE` | `1uCdVAqt+YA` | +| `_ZN7WebCore12EventHandler17scrollRecursivelyENS_15ScrollDirectionENS_17ScrollGranularityEPNS_4NodeE` | `GyVmPPMYRA4` | +| `_ZN7WebCore12EventHandler18accessKeyModifiersEv` | `BZEcdytvUYM` | +| `_ZN7WebCore12EventHandler20sendContextMenuEventERKNS_18PlatformMouseEventE` | `yv8JYywpwz8` | +| `_ZN7WebCore12EventHandler21handleMousePressEventERKNS_18PlatformMouseEventE` | `P0mseHxZBwA` | +| `_ZN7WebCore12EventHandler21handleMousePressEventERKNS_28MouseEventWithHitTestResultsE` | `Y0eI-b+mHIw` | +| `_ZN7WebCore12EventHandler23handleMouseReleaseEventERKNS_18PlatformMouseEventE` | `c+9g-vYGACo` | +| `_ZN7WebCore12EventHandler23handleMouseReleaseEventERKNS_28MouseEventWithHitTestResultsE` | `amNASK6thPE` | +| `_ZN7WebCore12EventHandler23setImmediateActionStageENS_20ImmediateActionStageE` | `wz5xdJm7GsY` | +| `_ZN7WebCore12EventHandler24logicalScrollRecursivelyENS_22ScrollLogicalDirectionENS_17ScrollGranularityEPNS_4NodeE` | `BNWaP6gbDjo` | +| `_ZN7WebCore12EventHandler26sendContextMenuEventForKeyEv` | `0CYh09Kj6Yg` | +| `_ZN7WebCore12EventHandler30dispatchFakeMouseMoveEventSoonEv` | `7iZdbVWxIGg` | +| `_ZN7WebCore12EventHandler30setCapturingMouseEventsElementEPNS_7ElementE` | `Ho7945yolEI` | +| `_ZN7WebCore12EventHandler31passMouseMovedEventToScrollbarsERKNS_18PlatformMouseEventE` | `PLrCgkwlBtA` | +| `_ZN7WebCore12EventHandler40selectionExtentRespectingEditingBoundaryERKNS_16VisibleSelectionERKNS_11LayoutPointEPNS_4NodeE` | `tg42oMO6+Yc` | +| `_ZN7WebCore12EventHandler47handleKeyboardSelectionMovementForAccessibilityERNS_13KeyboardEventE` | `NZoIm1F6Hc8` | +| `_ZN7WebCore12EventHandler8keyEventERKNS_21PlatformKeyboardEventE` | `atu-QRHqvgo` | +| `_ZN7WebCore12GCController13deleteAllCodeEN3JSC19DeleteAllCodeEffortE` | `Nx4k-7yySd0` | +| `_ZN7WebCore12GCController17garbageCollectNowEv` | `9jII5bWqm40` | +| `_ZN7WebCore12GCController18garbageCollectSoonEv` | `X152zTK+hgM` | +| `_ZN7WebCore12GCController19deleteAllLinkedCodeEN3JSC19DeleteAllCodeEffortE` | `OY3FZCTqNGM` | +| `_ZN7WebCore12GCController34garbageCollectNowIfNotDoneRecentlyEv` | `aGziYMudPJs` | +| `_ZN7WebCore12GCController41setJavaScriptGarbageCollectorTimerEnabledEb` | `EwZGwzhgDAA` | +| `_ZN7WebCore12GCController43garbageCollectOnAlternateThreadForDebuggingEb` | `o+RkbLSDzsw` | +| `_ZN7WebCore12GCController9singletonEv` | `YxDQKiFZy2k` | +| `_ZN7WebCore12GridPosition15setSpanPositionEiRKN3WTF6StringE` | `uJOiRR205j8` | +| `_ZN7WebCore12GridPosition19setExplicitPositionEiRKN3WTF6StringE` | `p9Wh6mJoIyU` | +| `_ZN7WebCore12GridPosition24setMaxPositionForTestingEj` | `LSCqsMBsDt8` | +| `_ZN7WebCore12HTMLDocument5widthEv` | `UzxpjXk1rBk` | +| `_ZN7WebCore12HTMLDocument6heightEv` | `sap+QiqYRhA` | +| `_ZN7WebCore12ISOWebVTTCue5parseERN3JSC8DataViewERj` | `SOa1TPmDQJA` | +| `_ZN7WebCore12ISOWebVTTCueD0Ev` | `AMXD4SYEIIg` | +| `_ZN7WebCore12ISOWebVTTCueD1Ev` | `9AOghtzX6t8` | +| `_ZN7WebCore12ISOWebVTTCueD2Ev` | `66lUg3KSBQs` | +| `_ZN7WebCore12JSAudioTrack14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `MYkYhqa6qOQ` | +| `_ZN7WebCore12JSAudioTrack15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `UhPDjkajj0I` | +| `_ZN7WebCore12JSAudioTrack15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `g8Ijr2P+ShQ` | +| `_ZN7WebCore12JSAudioTrack15subspaceForImplERN3JSC2VME` | `RtYrWZBWJhU` | +| `_ZN7WebCore12JSAudioTrack4infoEv` | `mAjGpyN7i9s` | +| `_ZN7WebCore12JSAudioTrack9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `Qw5CVIRhDyE` | +| `_ZN7WebCore12JSAudioTrack9toWrappedERN3JSC2VMENS1_7JSValueE` | `XHzAsOyfJcI` | +| `_ZN7WebCore12JSAudioTrackD1Ev` | `z5gEC3cj9vo` | +| `_ZN7WebCore12JSAudioTrackD2Ev` | `74E3+ZonU5Q` | +| `_ZN7WebCore12JSAudioTrackaSERKS0_` | `rPHhEmlHVaI` | +| `_ZN7WebCore12JSStyleSheet9toWrappedERN3JSC2VMENS1_7JSValueE` | `QZrHxVWrlbQ` | +| `_ZN7WebCore12JSTimeRanges14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `P--EhS6lDxw` | +| `_ZN7WebCore12JSTimeRanges15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `JrlR1gNboYQ` | +| `_ZN7WebCore12JSTimeRanges15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `wwa18JPi0d8` | +| `_ZN7WebCore12JSTimeRanges15subspaceForImplERN3JSC2VME` | `KS3seHdYUDw` | +| `_ZN7WebCore12JSTimeRanges4infoEv` | `65bNfW1vqBI` | +| `_ZN7WebCore12JSTimeRanges9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `W-oLY1TOyv4` | +| `_ZN7WebCore12JSTimeRanges9toWrappedERN3JSC2VMENS1_7JSValueE` | `41uFpyfOR7s` | +| `_ZN7WebCore12JSTimeRangesC1ERKS0_` | `5VDOSnuKQcI` | +| `_ZN7WebCore12JSTimeRangesC2ERKS0_` | `A6IB1hIEwCw` | +| `_ZN7WebCore12JSTimeRangesD1Ev` | `gLU-NsaNP3k` | +| `_ZN7WebCore12JSTimeRangesD2Ev` | `P2S3--pUqtw` | +| `_ZN7WebCore12JSTimeRangesaSERKS0_` | `z5ufrutjJsA` | +| `_ZN7WebCore12JSTreeWalker9toWrappedERN3JSC2VMENS1_7JSValueE` | `yiUUfhRhKqE` | +| `_ZN7WebCore12NamedNodeMap12setNamedItemERNS_4AttrE` | `OjJcnVmKx9M` | +| `_ZN7WebCore12NamedNodeMap15removeNamedItemERKN3WTF10AtomStringE` | `Fsa9M5D8Dko` | +| `_ZN7WebCore12NamedNodeMap17removeNamedItemNSERKN3WTF10AtomStringES4_` | `lmvLKteDg+Q` | +| `_ZN7WebCore12NamedNodeMap3refEv` | `9GasEzC4uFE` | +| `_ZN7WebCore12NamedNodeMap5derefEv` | `X1NXjHDq918` | +| `_ZN7WebCore12NodeIterator12previousNodeEv` | `us4G15wBdCY` | +| `_ZN7WebCore12NodeIterator8nextNodeEv` | `vtHb71Bu0WA` | +| `_ZN7WebCore12NodeIteratorD1Ev` | `qheRt4fL0BU` | +| `_ZN7WebCore12NodeIteratorD2Ev` | `f5BjEtSShgw` | +| `_ZN7WebCore12PrintContext16computePageRectsERKNS_9FloatRectEfffRfb` | `JJ7N0ybvaHU` | +| `_ZN7WebCore12PrintContext16computedPageSizeENS_9FloatSizeENS_9RectEdgesIfEE` | `O-yD-vQbaEE` | +| `_ZN7WebCore12PrintContext18computedPageMarginENS_9RectEdgesIfEE` | `S-1GFNVykSk` | +| `_ZN7WebCore12PrintContext20pageNumberForElementEPNS_7ElementERKNS_9FloatSizeE` | `JcwL-sCzYFo` | +| `_ZN7WebCore12PrintContext27computeAutomaticScaleFactorERKNS_9FloatSizeE` | `N7kmCi5hOdc` | +| `_ZN7WebCore12PrintContext28computePageRectsWithPageSizeERKNS_9FloatSizeEb` | `1aYJxRI69x0` | +| `_ZN7WebCore12PrintContext3endEv` | `64sasHZlD+E` | +| `_ZN7WebCore12PrintContext5beginEff` | `3PH3sDVuI20` | +| `_ZN7WebCore12PrintContext9spoolPageERNS_15GraphicsContextEif` | `zgD0fDO3nh0` | +| `_ZN7WebCore12PrintContext9spoolRectERNS_15GraphicsContextERKNS_7IntRectE` | `oq8zayuAqeI` | +| `_ZN7WebCore12PrintContextD0Ev` | `QSWpsSZDHig` | +| `_ZN7WebCore12PrintContextD1Ev` | `NL6CCjSnAM4` | +| `_ZN7WebCore12PrintContextD2Ev` | `iIiC1HlEOac` | +| `_ZN7WebCore12RenderObject16paintingRootRectERNS_10LayoutRectE` | `yTCmRbF6f4A` | +| `_ZN7WebCore12SettingsBase26setMinimumDOMTimerIntervalEN3WTF7SecondsE` | `lC2+-6XMW38` | +| `_ZN7WebCore12SettingsBase33platformDefaultMediaSourceEnabledEv` | `4I3iUsZeMIM` | +| `_ZN7WebCore12SettingsBase44setMediaContentTypesRequiringHardwareSupportERKN3WTF6StringE` | `305+7Bx1JWY` | +| `_ZN7WebCore12SettingsBase44setMediaContentTypesRequiringHardwareSupportERKN3WTF6VectorINS_11ContentTypeELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE` | `uvEBlyPL0pU` | +| `_ZN7WebCore12SharedBufferC1EON3WTF14FileSystemImpl14MappedFileDataE` | `VuC0CBsgzIU` | +| `_ZN7WebCore12SharedBufferC1Ev` | `T9Y7kdTM9V4` | +| `_ZN7WebCore12SharedBufferC2EON3WTF14FileSystemImpl14MappedFileDataE` | `OwdCvNr3VXs` | +| `_ZN7WebCore12SharedBufferC2Ev` | `wPGlix12L-k` | +| `_ZN7WebCore12SourceBuffer30setMaximumQueueDepthForTrackIDERKN3WTF10AtomStringEm` | `BFC5N2hmJDQ` | +| `_ZN7WebCore12SourceBuffer41minimumUpcomingPresentationTimeForTrackIDERKN3WTF10AtomStringE` | `NRinysU9VcE` | +| `_ZN7WebCore12TextIterator7advanceEv` | `wzTeHvzmD-Q` | +| `_ZN7WebCore12TextIteratorD1Ev` | `uAQuprnfbIo` | +| `_ZN7WebCore12TextIteratorD2Ev` | `ONHCFGvD0vw` | +| `_ZN7WebCore12WebAnimation9instancesEv` | `TPldTG849XM` | +| `_ZN7WebCore12WorkerThread17workerThreadCountEv` | `FdVPEWL8spY` | +| `_ZN7WebCore12blobRegistryEv` | `sdYVzaZgFbY` | +| `_ZN7WebCore12commonVMSlowEv` | `FR4wjgGyss4` | +| `_ZN7WebCore13AXObjectCache10rootObjectEv` | `beHxaK7HT5s` | +| `_ZN7WebCore13AXObjectCache11getOrCreateEPNS_4NodeE` | `NZemRl2yal4` | +| `_ZN7WebCore13AXObjectCache19enableAccessibilityEv` | `T4UaFjUdbCo` | +| `_ZN7WebCore13AXObjectCache20disableAccessibilityEv` | `1Cw1MMnI89Y` | +| `_ZN7WebCore13AXObjectCache37setEnhancedUserInterfaceAccessibilityEb` | `KOxWYkiprIY` | +| `_ZN7WebCore13CSSStyleSheet10deleteRuleEj` | `lC5PrZi8XSE` | +| `_ZN7WebCore13CSSStyleSheet10insertRuleERKN3WTF6StringEj` | `8G392ayhCbI` | +| `_ZN7WebCore13CSSStyleSheet8cssRulesEv` | `pWbsmM0vKvI` | +| `_ZN7WebCore13CharacterData10appendDataERKN3WTF6StringE` | `oENf1QxsRcU` | +| `_ZN7WebCore13CharacterData10deleteDataEjj` | `bl5399SXCSc` | +| `_ZN7WebCore13CharacterData10insertDataEjRKN3WTF6StringE` | `6v9-ne7wt+4` | +| `_ZN7WebCore13CharacterData11replaceDataEjjRKN3WTF6StringE` | `75xioEk4rX0` | +| `_ZN7WebCore13CharacterData13substringDataEjj` | `ou7XGX2I+f0` | +| `_ZN7WebCore13CharacterData7setDataERKN3WTF6StringE` | `nR-7G2rX8Kc` | +| `_ZN7WebCore13ContainerNode11appendChildERNS_4NodeE` | `grWi+vB2srs` | +| `_ZN7WebCore13ContainerNode11removeChildERNS_4NodeE` | `d7YcMYGNv0M` | +| `_ZN7WebCore13ContainerNode13querySelectorERKN3WTF6StringE` | `Xb1jumQeo0g` | +| `_ZN7WebCore13ContainerNode16querySelectorAllERKN3WTF6StringE` | `owavSCxIMxE` | +| `_ZN7WebCore13ContainerNode20getElementsByTagNameERKN3WTF10AtomStringE` | `w3OPGzG+9lo` | +| `_ZN7WebCore13ContainerNode22getElementsByClassNameERKN3WTF10AtomStringE` | `AbxQCXQKsNY` | +| `_ZN7WebCore13ContainerNode22getElementsByTagNameNSERKN3WTF10AtomStringES4_` | `vvC9W8aejhg` | +| `_ZN7WebCore13ContainerNode8childrenEv` | `GrqTpQcB-j0` | +| `_ZN7WebCore13GraphicsLayer11clearClientEv` | `YTaCSIVc9DQ` | +| `_ZN7WebCore13GraphicsLayer12setZPositionEf` | `KrJLG5ck2IA` | +| `_ZN7WebCore13GraphicsLayer15willBeDestroyedEv` | `lXMiv1MLPrA` | +| `_ZN7WebCore13GraphicsLayer16removeFromParentEv` | `ts4l3D9+mhA` | +| `_ZN7WebCore13GraphicsLayer16resumeAnimationsEv` | `QnocxaQBZOM` | +| `_ZN7WebCore13GraphicsLayer17removeAllChildrenEv` | `oajJqVTlu-M` | +| `_ZN7WebCore13GraphicsLayer17suspendAnimationsEN3WTF13MonotonicTimeE` | `JPMZdhX2qEA` | +| `_ZN7WebCore13GraphicsLayer18setBackgroundColorERKNS_5ColorE` | `8dEZbWDA6-4` | +| `_ZN7WebCore13GraphicsLayer54noteDeviceOrPageScaleFactorChangedIncludingDescendantsEv` | `ZjPWlTi4iXM` | +| `_ZN7WebCore13GraphicsLayer6createEPNS_20GraphicsLayerFactoryERNS_19GraphicsLayerClientENS0_4TypeE` | `HqUX52XTFc4` | +| `_ZN7WebCore13GraphicsLayer7setSizeERKNS_9FloatSizeE` | `FwXIWwbIPrI` | +| `_ZN7WebCore13GraphicsLayer9setClientERNS_19GraphicsLayerClientE` | `k7Sga5WS4zU` | +| `_ZN7WebCore13GraphicsLayerC2ENS0_4TypeERNS_19GraphicsLayerClientE` | `OEdu+lsMIho` | +| `_ZN7WebCore13GraphicsLayerD0Ev` | `5Rj2MyJZATM` | +| `_ZN7WebCore13GraphicsLayerD1Ev` | `Qf7JVe4YMQ8` | +| `_ZN7WebCore13GraphicsLayerD2Ev` | `YXN2MQWUcQE` | +| `_ZN7WebCore13HTTPHeaderMap3setERKN3WTF6StringES4_` | `CUlajtWO-L4` | +| `_ZN7WebCore13HTTPHeaderMap6appendERKN3WTF6StringES4_` | `17lDGYhSTx4` | +| `_ZN7WebCore13HTTPHeaderMap6removeENS_14HTTPHeaderNameE` | `+uk5J35y6WQ` | +| `_ZN7WebCore13HTTPHeaderMap6removeERKN3WTF6StringE` | `-LVXigKk--w` | +| `_ZN7WebCore13HTTPHeaderMapC1Ev` | `qVrMxeDN6Zs` | +| `_ZN7WebCore13HTTPHeaderMapC2Ev` | `lsMB2OXXR-Q` | +| `_ZN7WebCore13HitTestResult12setInnerNodeEPNS_4NodeE` | `SCoaMrvikBA` | +| `_ZN7WebCore13HitTestResultC1ERKNS_10LayoutRectE` | `Eheq1igFqCM` | +| `_ZN7WebCore13HitTestResultC1ERKNS_11LayoutPointE` | `8IR1mG6ZOnM` | +| `_ZN7WebCore13HitTestResultC1ERKNS_15HitTestLocationE` | `g5S0kerYDgw` | +| `_ZN7WebCore13HitTestResultC1ERKS0_` | `Xb4BaqIusJk` | +| `_ZN7WebCore13HitTestResultC1Ev` | `IfIiHBio398` | +| `_ZN7WebCore13HitTestResultC2ERKNS_10LayoutRectE` | `ATPVUw7-QEM` | +| `_ZN7WebCore13HitTestResultC2ERKNS_11LayoutPointE` | `32MZ7PBVe1k` | +| `_ZN7WebCore13HitTestResultC2ERKNS_15HitTestLocationE` | `mQwyBMwgRRw` | +| `_ZN7WebCore13HitTestResultC2ERKS0_` | `UHPYA2oZS2A` | +| `_ZN7WebCore13HitTestResultC2Ev` | `WqDGv5ILjDI` | +| `_ZN7WebCore13HitTestResultD1Ev` | `-1CenoQjRY4` | +| `_ZN7WebCore13HitTestResultD2Ev` | `C3UpIfLGRbA` | +| `_ZN7WebCore13HitTestResultaSERKS0_` | `0qgA9UUOBaM` | +| `_ZN7WebCore13IdentifierRep3getEPKc` | `r4wCfU5dxr4` | +| `_ZN7WebCore13IdentifierRep3getEi` | `dwjYscuo6Tg` | +| `_ZN7WebCore13IdentifierRep7isValidEPS0_` | `9HSHM5kvg64` | +| `_ZN7WebCore13JSCSSRuleList9toWrappedERN3JSC2VMENS1_7JSValueE` | `RNr2kL13DVc` | +| `_ZN7WebCore13JSDOMRectList14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `oG7dPt1Hoyk` | +| `_ZN7WebCore13JSDOMRectList15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `jBS6-ydg+A4` | +| `_ZN7WebCore13JSDOMRectList15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `PBP4KSDTyII` | +| `_ZN7WebCore13JSDOMRectList15subspaceForImplERN3JSC2VME` | `ly6mnTvew0U` | +| `_ZN7WebCore13JSDOMRectList4infoEv` | `uSeJeaPNBFQ` | +| `_ZN7WebCore13JSDOMRectList9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `a849B27ELfU` | +| `_ZN7WebCore13JSDOMRectList9toWrappedERN3JSC2VMENS1_7JSValueE` | `Te-OfFFSnBQ` | +| `_ZN7WebCore13JSDOMRectListC1ERKS0_` | `zOySpeRm7w8` | +| `_ZN7WebCore13JSDOMRectListC2ERKS0_` | `yzAdSdSXLLE` | +| `_ZN7WebCore13JSDOMRectListD1Ev` | `36vtOQuRF8o` | +| `_ZN7WebCore13JSDOMRectListD2Ev` | `JI4ly8BJLdc` | +| `_ZN7WebCore13JSDOMRectListaSERKS0_` | `hhF-BMjB2+0` | +| `_ZN7WebCore13JSHTMLElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `EuHCn7yiExw` | +| `_ZN7WebCore13JSHTMLElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `Mtgxq87OiqQ` | +| `_ZN7WebCore13JSHTMLElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `CfYEYTOHv+8` | +| `_ZN7WebCore13JSHTMLElement15subspaceForImplERN3JSC2VME` | `16DOGRFnVaE` | +| `_ZN7WebCore13JSHTMLElement4infoEv` | `QAtIMIg9bXk` | +| `_ZN7WebCore13JSHTMLElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `ysPsWcgN2LU` | +| `_ZN7WebCore13JSHTMLElement9toWrappedERN3JSC2VMENS1_7JSValueE` | `TGuMd7Mc+Bc` | +| `_ZN7WebCore13JSHTMLElementC1ERKS0_` | `192-IV4CFa8` | +| `_ZN7WebCore13JSHTMLElementC2ERKS0_` | `TuAOjJM7csM` | +| `_ZN7WebCore13JSHTMLElementD1Ev` | `irgXGd58omE` | +| `_ZN7WebCore13JSHTMLElementD2Ev` | `v6CSwwcnMO8` | +| `_ZN7WebCore13JSWindowProxy9toWrappedERN3JSC2VMENS1_7JSValueE` | `fRCDWK73I38` | +| `_ZN7WebCore13JSXPathResult9toWrappedERN3JSC2VMENS1_7JSValueE` | `bzGg3d-Bwgg` | +| `_ZN7WebCore13MIMETypeCache13canDecodeTypeERKN3WTF6StringE` | `x-za71ceNzM` | +| `_ZN7WebCore13MIMETypeCache14supportedTypesEv` | `ywU-pWrM-Vw` | +| `_ZN7WebCore13MIMETypeCache17addSupportedTypesERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE` | `xA+rJXMHbqo` | +| `_ZN7WebCore13MIMETypeCache21canDecodeExtendedTypeERKNS_11ContentTypeE` | `JqqHwIrj160` | +| `_ZN7WebCore13MIMETypeCache21supportsContainerTypeERKN3WTF6StringE` | `TNpVhxCBHCA` | +| `_ZN7WebCore13MIMETypeCache26isUnsupportedContainerTypeERKN3WTF6StringE` | `Ua86vx5IaDU` | +| `_ZN7WebCore13MIMETypeCacheC1ERKS0_` | `d5vSl0NN8vg` | +| `_ZN7WebCore13MIMETypeCacheC1Ev` | `XQ79w+11C78` | +| `_ZN7WebCore13MIMETypeCacheC2ERKS0_` | `toO3YXHsAdg` | +| `_ZN7WebCore13MIMETypeCacheC2Ev` | `s6qnyKuSfU8` | +| `_ZN7WebCore13MIMETypeCacheD0Ev` | `7VBlVFPhir4` | +| `_ZN7WebCore13MIMETypeCacheD1Ev` | `04jmNcEmNs4` | +| `_ZN7WebCore13MIMETypeCacheD2Ev` | `47WhLC3+uRA` | +| `_ZN7WebCore13MIMETypeCacheaSERKS0_` | `EbS+N1MbOBw` | +| `_ZN7WebCore13MIMETypeCachedaEPv` | `-qvSeihxW6k` | +| `_ZN7WebCore13MIMETypeCachedlEPv` | `M8+wbBy-2n0` | +| `_ZN7WebCore13MIMETypeCachenaEmPv` | `ah7gMVFXK8I` | +| `_ZN7WebCore13MIMETypeCachenaEm` | `dxwLuIoVZ6E` | +| `_ZN7WebCore13MIMETypeCachenwEm` | `PIa6V635TSQ` | +| `_ZN7WebCore13MIMETypeCachenwEmPv` | `BwDiCf2Irzg` | +| `_ZN7WebCore13MediaStrategyC1ERKS0_` | `UoyxMN47fmw` | +| `_ZN7WebCore13MediaStrategyC1Ev` | `FKp2wB9uPwY` | +| `_ZN7WebCore13MediaStrategyC2ERKS0_` | `w3lhMQ7YIM8` | +| `_ZN7WebCore13MediaStrategyC2Ev` | `O+e+IS12924` | +| `_ZN7WebCore13MediaStrategyD0Ev` | `HSQ3lpRwL2E` | +| `_ZN7WebCore13MediaStrategyD1Ev` | `p480YiSI5ME` | +| `_ZN7WebCore13MediaStrategyD2Ev` | `Tp34V5MfLI4` | +| `_ZN7WebCore13MutationEvent17initMutationEventERKN3WTF10AtomStringEbbPNS_4NodeERKNS1_6StringES9_S9_t` | `EpmkRKzqbXw` | +| `_ZN7WebCore13NodeTraversal13deepLastChildERNS_4NodeE` | `YMdfx4CK+Jo` | +| `_ZN7WebCore13NodeTraversal19nextAncestorSiblingERKNS_4NodeE` | `E0o0m00RS1E` | +| `_ZN7WebCore13NodeTraversal19nextAncestorSiblingERKNS_4NodeEPS2_` | `IaQoBoi2WTQ` | +| `_ZN7WebCore13NodeTraversal4lastERKNS_13ContainerNodeE` | `uGjapTSgkJE` | +| `_ZN7WebCore13OverflowEvent17initOverflowEventEtbb` | `TjSJmL+4ZCU` | +| `_ZN7WebCore13PathUtilities26pathWithShrinkWrappedRectsERKN3WTF6VectorINS_9FloatRectELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEEf` | `vPhuUqRWid0` | +| `_ZN7WebCore13PathUtilities27pathsWithShrinkWrappedRectsERKN3WTF6VectorINS_9FloatRectELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEEf` | `it2X59IDj80` | +| `_ZN7WebCore13QualifiedName17QualifiedNameImplD1Ev` | `OTYijt1nJSg` | +| `_ZN7WebCore13QualifiedName17QualifiedNameImplD2Ev` | `b9FUk-VCqmY` | +| `_ZN7WebCore13QualifiedName4initEv` | `hnsadt+539M` | +| `_ZN7WebCore13QualifiedNameC1ERKN3WTF10AtomStringES4_S4_` | `fcSlD2VtHxY` | +| `_ZN7WebCore13QualifiedNameC2ERKN3WTF10AtomStringES4_S4_` | `kJG1DY2qLJ4` | +| `_ZN7WebCore13SleepDisablerD1Ev` | `tspJxRlPFj0` | +| `_ZN7WebCore13SleepDisablerD2Ev` | `nrPF1HGjG+0` | +| `_ZN7WebCore13StyledElement10cssomStyleEv` | `1g0z4DFlFKk` | +| `_ZN7WebCore13StyledElement22setInlineStylePropertyENS_13CSSPropertyIDEdNS_11CSSUnitTypeEb` | `QZdZ5Su9d48` | +| `_ZN7WebCore13TextIndicator15createWithRangeERKNS_11SimpleRangeEN3WTF9OptionSetINS_19TextIndicatorOptionEEENS_35TextIndicatorPresentationTransitionENS_9FloatSizeE` | `4LlJl8jv+2Y` | +| `_ZN7WebCore13TextIndicator6createERKNS_17TextIndicatorDataE` | `uTQbKfuJXAM` | +| `_ZN7WebCore13TextIndicatorD1Ev` | `GZOVXCOJ+L4` | +| `_ZN7WebCore13TextIndicatorD2Ev` | `464OLzpKUHs` | +| `_ZN7WebCore13displayStringERKN3WTF6StringEPKNS_4NodeE` | `lkcoWfBi-Eo` | +| `_ZN7WebCore13enclosingListEPNS_4NodeE` | `e5UfP5N62yQ` | +| `_ZN7WebCore13endOfDocumentEPKNS_4NodeE` | `N+vcSXzdOJY` | +| `_ZN7WebCore13endOfDocumentERKNS_15VisiblePositionE` | `-rlG+vYrV58` | +| `_ZN7WebCore13endOfSentenceERKNS_15VisiblePositionE` | `kvemsBD8L0I` | +| `_ZN7WebCore13getLogChannelERKN3WTF6StringE` | `gRNu4fkK4tw` | +| `_ZN7WebCore13internalErrorERKN3WTF3URLE` | `n+bQ6u1wxSk` | +| `_ZN7WebCore13isStartOfLineERKNS_15VisiblePositionE` | `pu8CWYnACfE` | +| `_ZN7WebCore13pointerCursorEv` | `clQC+AAy6pw` | +| `_ZN7WebCore13releaseMemoryEN3WTF8CriticalENS0_11SynchronousENS_24MaintainBackForwardCacheENS_19MaintainMemoryCacheE` | `e2p7e93EDgs` | +| `_ZN7WebCore14CachedResource12removeClientERNS_20CachedResourceClientE` | `MrFAGlGu+Ro` | +| `_ZN7WebCore14CachedResource16unregisterHandleEPNS_24CachedResourceHandleBaseE` | `cqyQcHkWLko` | +| `_ZN7WebCore14CachedResource9addClientERNS_20CachedResourceClientE` | `aveafNCCxgI` | +| `_ZN7WebCore14CredentialBase7compareERKNS_10CredentialES3_` | `8Tzx7cA1XHU` | +| `_ZN7WebCore14CredentialBaseC1ERKN3WTF6StringES4_NS_21CredentialPersistenceE` | `NtsiAMxyp2E` | +| `_ZN7WebCore14CredentialBaseC1Ev` | `YJ1jvDZ7x2E` | +| `_ZN7WebCore14CredentialBaseC2ERKN3WTF6StringES4_NS_21CredentialPersistenceE` | `AI1aDzdpDTk` | +| `_ZN7WebCore14CredentialBaseC2Ev` | `h4OJbwjtbYc` | +| `_ZN7WebCore14DOMCacheEngine15queryCacheMatchERKNS_15ResourceRequestES3_RKNS_16ResourceResponseERKNS_17CacheQueryOptionsE` | `OiT8pniW1pA` | +| `_ZN7WebCore14DocumentLoader13attachToFrameEv` | `Ks9FCieTJsk` | +| `_ZN7WebCore14DocumentLoader14notifyFinishedERNS_14CachedResourceERKNS_18NetworkLoadMetricsE` | `h1205-UYfiQ` | +| `_ZN7WebCore14DocumentLoader15detachFromFrameEv` | `rEeMuMnKvSA` | +| `_ZN7WebCore14DocumentLoader16redirectReceivedERNS_14CachedResourceEONS_15ResourceRequestERKNS_16ResourceResponseEON3WTF17CompletionHandlerIFvS4_EEE` | `qXMrp9KnLqc` | +| `_ZN7WebCore14DocumentLoader16responseReceivedERNS_14CachedResourceERKNS_16ResourceResponseEON3WTF17CompletionHandlerIFvvEEE` | `x1SNXYN7BMc` | +| `_ZN7WebCore14DocumentLoader17addConsoleMessageEN3JSC13MessageSourceENS1_12MessageLevelERKN3WTF6StringEm` | `XFMxCYLAQI0` | +| `_ZN7WebCore14DocumentLoader21setCustomHeaderFieldsEON3WTF6VectorINS_18CustomHeaderFieldsELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE` | `pjVGJ0B1cfo` | +| `_ZN7WebCore14DocumentLoader22cancelMainResourceLoadERKNS_13ResourceErrorE` | `yX91W3884fA` | +| `_ZN7WebCore14DocumentLoader23applyPoliciesToSettingsEv` | `FFGrIADI-ko` | +| `_ZN7WebCore14DocumentLoader8setTitleERKNS_19StringWithDirectionE` | `cakV3vAIHjs` | +| `_ZN7WebCore14DocumentLoaderC1ERKNS_15ResourceRequestERKNS_14SubstituteDataE` | `dSlrvp54kDg` | +| `_ZN7WebCore14DocumentLoaderC2ERKNS_15ResourceRequestERKNS_14SubstituteDataE` | `2CfT-vnJtBA` | +| `_ZN7WebCore14DocumentLoaderD0Ev` | `TxDI56HeuOQ` | +| `_ZN7WebCore14DocumentLoaderD1Ev` | `ZnO2Qp4WkFU` | +| `_ZN7WebCore14DocumentLoaderD2Ev` | `xp-IoIUYCaQ` | +| `_ZN7WebCore14DocumentWriter3endEv` | `u7BCcu2R+jA` | +| `_ZN7WebCore14FrameSelection12setSelectionERKNS_16VisibleSelectionEN3WTF9OptionSetINS0_18SetSelectionOptionEEENS_23AXTextStateChangeIntentENS0_19CursorAlignOnScrollENS_15TextGranularityE` | `TG0rdm+BHyw` | +| `_ZN7WebCore14FrameSelection16updateAppearanceEv` | `bEc8Ixq0Tnk` | +| `_ZN7WebCore14FrameSelection19absoluteCaretBoundsEPb` | `sjRyWirEJOI` | +| `_ZN7WebCore14FrameSelection20setSelectionFromNoneEv` | `mrG66gJmZig` | +| `_ZN7WebCore14FrameSelection5clearEv` | `OffDHonzAk4` | +| `_ZN7WebCore14FrameSelection9selectAllEv` | `HlTxzdeueXA` | +| `_ZN7WebCore14FrameSelectionC1EPNS_8DocumentE` | `r-11HWJyOiY` | +| `_ZN7WebCore14FrameSelectionC2EPNS_8DocumentE` | `lLQkvk3me0E` | +| `_ZN7WebCore14HTMLMapElement5areasEv` | `c4ctz7qKB-g` | +| `_ZN7WebCore14JSNamedNodeMap9toWrappedERN3JSC2VMENS1_7JSValueE` | `YcsyHbZQBKY` | +| `_ZN7WebCore14JSNodeIterator9toWrappedERN3JSC2VMENS1_7JSValueE` | `BOQB98GDDvA` | +| `_ZN7WebCore14JSSourceBuffer14finishCreationERN3JSC2VME` | `Lp8d6ewrI1Q` | +| `_ZN7WebCore14JSSourceBuffer14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `4SNRci1vJZM` | +| `_ZN7WebCore14JSSourceBuffer15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `96bs+HAP8DY` | +| `_ZN7WebCore14JSSourceBuffer15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `+02A3a282fI` | +| `_ZN7WebCore14JSSourceBuffer15subspaceForImplERN3JSC2VME` | `ds9C4lKL22g` | +| `_ZN7WebCore14JSSourceBuffer9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `+jEmzj1AEbE` | +| `_ZN7WebCore14JSSourceBuffer9toWrappedERN3JSC2VMENS1_7JSValueE` | `qS7LNBh79Hk` | +| `_ZN7WebCore14JSVoidCallback11handleEventEv` | `BMJN7feeTqs` | +| `_ZN7WebCore14JSVoidCallback12callbackDataEv` | `TaBfmPSAaTE` | +| `_ZN7WebCore14JSVoidCallback6createEPN3JSC8JSObjectEPNS_17JSDOMGlobalObjectE` | `DnXatGyC6cw` | +| `_ZN7WebCore14JSVoidCallbackC1EPN3JSC8JSObjectEPNS_17JSDOMGlobalObjectE` | `lWAsnnbARz8` | +| `_ZN7WebCore14JSVoidCallbackC2EPN3JSC8JSObjectEPNS_17JSDOMGlobalObjectE` | `P6DuZ6UTmmk` | +| `_ZN7WebCore14JSVoidCallbackD0Ev` | `nClH8DV3dsg` | +| `_ZN7WebCore14JSVoidCallbackD1Ev` | `Gy3nDLxHAaM` | +| `_ZN7WebCore14JSVoidCallbackD2Ev` | `4IdW0jsDZ5o` | +| `_ZN7WebCore14JSWebAnimation14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `4mUxj6KnMsU` | +| `_ZN7WebCore14JSWebAnimation15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `o252tIwiufQ` | +| `_ZN7WebCore14JSWebAnimation15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `bLuyjdtbY40` | +| `_ZN7WebCore14JSWebAnimation15subspaceForImplERN3JSC2VME` | `AU5+XoLXqFc` | +| `_ZN7WebCore14JSWebAnimation4infoEv` | `KmB93+0Mmm0` | +| `_ZN7WebCore14JSWebAnimation9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `fk9IJZ-BpN8` | +| `_ZN7WebCore14JSWebAnimation9toWrappedERN3JSC2VMENS1_7JSValueE` | `KRl8rZt7rts` | +| `_ZN7WebCore14JSWebAnimationC1ERKS0_` | `SWejTyuxZXQ` | +| `_ZN7WebCore14JSWebAnimationC2ERKS0_` | `6x1JXGn6Yqk` | +| `_ZN7WebCore14JSWebAnimationD1Ev` | `L3Nq23JAlvU` | +| `_ZN7WebCore14JSWebAnimationD2Ev` | `MmSyyiaXiho` | +| `_ZN7WebCore14LoaderStrategyC2ERKS0_` | `jSddVL0G9xk` | +| `_ZN7WebCore14LoaderStrategyC2Ev` | `k4-n-E3wOE4` | +| `_ZN7WebCore14LoaderStrategyD0Ev` | `EHrOTTgMxXo` | +| `_ZN7WebCore14LoaderStrategyD1Ev` | `DBfLmGdgef0` | +| `_ZN7WebCore14LoaderStrategyD2Ev` | `UE3oF6rx8nk` | +| `_ZN7WebCore14LoggedInStatus13setTimeToLiveEN3WTF7SecondsE` | `3DFYSB4Xk68` | +| `_ZN7WebCore14LoggedInStatus6createERKNS_17RegistrableDomainERKN3WTF6StringENS0_19CredentialTokenTypeENS0_18AuthenticationTypeE` | `NDfv8voZjPU` | +| `_ZN7WebCore14LoggedInStatus6createERKNS_17RegistrableDomainERKN3WTF6StringENS0_19CredentialTokenTypeENS0_18AuthenticationTypeENS4_7SecondsE` | `iZ+sJFzLU7U` | +| `_ZN7WebCore14MicrotaskQueue26performMicrotaskCheckpointEv` | `QsSS-qvdZYA` | +| `_ZN7WebCore14MicrotaskQueueD1Ev` | `DY7yTh8tqiI` | +| `_ZN7WebCore14MicrotaskQueueD2Ev` | `2zPKdOEo22s` | +| `_ZN7WebCore14PluginDocument12pluginWidgetEv` | `NRtszc6OYPQ` | +| `_ZN7WebCore14ProcessWarming15initializeNamesEv` | `ZwbWkee2EK8` | +| `_ZN7WebCore14ProcessWarming15prewarmGloballyEv` | `KV8Q4aVSLWI` | +| `_ZN7WebCore14ProcessWarming25collectPrewarmInformationEv` | `uJhCMIgHtBo` | +| `_ZN7WebCore14ResourceHandle11clearClientEv` | `xCU2xwTBJP8` | +| `_ZN7WebCore14ResourceHandle12firstRequestEv` | `j4kIUS5T3TY` | +| `_ZN7WebCore14ResourceHandle16setDefersLoadingEb` | `9HFZvESTOhk` | +| `_ZN7WebCore14ResourceHandle20forceContentSniffingEv` | `wI4UPNf5YNY` | +| `_ZN7WebCore14ResourceHandle6cancelEv` | `5H5ytGoOj0A` | +| `_ZN7WebCore14ResourceHandleD0Ev` | `h+v1uJNkdY4` | +| `_ZN7WebCore14ResourceHandleD1Ev` | `wCYFnwyl09w` | +| `_ZN7WebCore14ResourceHandleD2Ev` | `OElVA+B5PAg` | +| `_ZN7WebCore14ResourceLoader14cancelledErrorEv` | `mFx3dcK+S2c` | +| `_ZN7WebCore14ResourceLoader31didBlockAuthenticationChallengeEv` | `VrN20sLNYT8` | +| `_ZN7WebCore14ResourceLoader6cancelERKNS_13ResourceErrorE` | `RZQAxhch46s` | +| `_ZN7WebCore14ResourceLoader6cancelEv` | `G84OiYjxe2w` | +| `_ZN7WebCore14SQLiteDatabase12lastErrorMsgEv` | `QZg17ZNOwtc` | +| `_ZN7WebCore14SQLiteDatabase14clearAllTablesEv` | `Jr8SilBIzTk` | +| `_ZN7WebCore14SQLiteDatabase16runVacuumCommandEv` | `QJCcZ0vgv54` | +| `_ZN7WebCore14SQLiteDatabase20setCollationFunctionERKN3WTF6StringEONS1_8FunctionIFiiPKviS7_EEE` | `7uInq-rV0oc` | +| `_ZN7WebCore14SQLiteDatabase27runIncrementalVacuumCommandEv` | `jmHFoFUQoi8` | +| `_ZN7WebCore14SQLiteDatabase27turnOnIncrementalAutoVacuumEv` | `DfZB2uu86Gw` | +| `_ZN7WebCore14SQLiteDatabase29setIsDatabaseOpeningForbiddenEb` | `-OrgQoBbx8M` | +| `_ZN7WebCore14SQLiteDatabase5closeEv` | `cL5ASE2-dwg` | +| `_ZN7WebCore14SQLiteDatabase9interruptEv` | `8m8-UQTKyUc` | +| `_ZN7WebCore14SQLiteDatabase9lastErrorEv` | `96iwUEq1jKY` | +| `_ZN7WebCore14SQLiteDatabaseC1Ev` | `dYLaCFvC8Nk` | +| `_ZN7WebCore14SQLiteDatabaseC2Ev` | `B6gqPm8EtR8` | +| `_ZN7WebCore14SQLiteDatabaseD1Ev` | `z-Vtoq+OkUU` | +| `_ZN7WebCore14SQLiteDatabaseD2Ev` | `ox8PemJycj8` | +| `_ZN7WebCore14ScrollableArea15contentsResizedEv` | `srbMS5I5r+w` | +| `_ZN7WebCore14ScrollableArea15didAddScrollbarEPNS_9ScrollbarENS_20ScrollbarOrientationE` | `W0VwyqKSJy4` | +| `_ZN7WebCore14ScrollableArea17willEndLiveResizeEv` | `jadS3Vb4gdk` | +| `_ZN7WebCore14ScrollableArea19invalidateScrollbarERNS_9ScrollbarERKNS_7IntRectE` | `ErDg0p+d4AE` | +| `_ZN7WebCore14ScrollableArea19willRemoveScrollbarEPNS_9ScrollbarENS_20ScrollbarOrientationE` | `zYdHFbS40bA` | +| `_ZN7WebCore14ScrollableArea19willStartLiveResizeEv` | `le8u-T8QXYQ` | +| `_ZN7WebCore14ScrollableArea21scrollbarStyleChangedENS_14ScrollbarStyleEb` | `xUt7yXvFz3M` | +| `_ZN7WebCore14ScrollableArea22invalidateScrollCornerERKNS_7IntRectE` | `MCHUB4D8fqw` | +| `_ZN7WebCore14ScrollableArea24setScrollbarOverlayStyleENS_21ScrollbarOverlayStyleE` | `Nl2rJlORyIc` | +| `_ZN7WebCore14ScrollableArea27availableContentSizeChangedENS0_25AvailableSizeChangeReasonE` | `97V-KpyIRRw` | +| `_ZN7WebCore14ScrollableArea27notifyScrollPositionChangedERKNS_8IntPointE` | `7nhDWYNO3lw` | +| `_ZN7WebCore14ScrollableArea28setScrollOffsetFromInternalsERKNS_8IntPointE` | `IqcrfZx0zKs` | +| `_ZN7WebCore14ScrollableArea30scrollToOffsetWithoutAnimationERKNS_10FloatPointENS_14ScrollClampingE` | `3JU1ZUdvOO8` | +| `_ZN7WebCore14ScrollableArea32computeScrollbarValueAndOverhangEfffRfS1_` | `kRCyhNPMrpg` | +| `_ZN7WebCore14ScrollableArea34constrainScrollPositionForOverhangERKNS_10LayoutRectERKNS_10LayoutSizeERKNS_11LayoutPointES9_ii` | `I3Cm2PthpHQ` | +| `_ZN7WebCore14ScrollableAreaC2Ev` | `8DA2XBZ-VqY` | +| `_ZN7WebCore14ScrollableAreaD0Ev` | `BVaird4y-R8` | +| `_ZN7WebCore14ScrollableAreaD1Ev` | `OC-U7LadwqI` | +| `_ZN7WebCore14ScrollableAreaD2Ev` | `Rl7DmeuWZ08` | +| `_ZN7WebCore14ScrollbarTheme5themeEv` | `na3KO+Tiyu8` | +| `_ZN7WebCore14SecurityOrigin16createFromStringERKN3WTF6StringE` | `bim4ILT718Q` | +| `_ZN7WebCore14SecurityOrigin30isLocalHostOrLoopbackIPAddressEN3WTF10StringViewE` | `umvikw1If0c` | +| `_ZN7WebCore14SecurityOrigin6createERKN3WTF3URLE` | `a8oad1ei+k0` | +| `_ZN7WebCore14SecurityPolicy18setLocalLoadPolicyENS0_15LocalLoadPolicyE` | `smU-F8Y1zfs` | +| `_ZN7WebCore14SecurityPolicy18shouldHideReferrerERKN3WTF3URLERKNS1_6StringE` | `V8i2vIgKigI` | +| `_ZN7WebCore14SecurityPolicy27resetOriginAccessAllowlistsEv` | `McQdg5+JTcc` | +| `_ZN7WebCore14SecurityPolicy29addOriginAccessAllowlistEntryERKNS_14SecurityOriginERKN3WTF6StringES7_b` | `UjUPSlx8Hzc` | +| `_ZN7WebCore14SecurityPolicy32removeOriginAccessAllowlistEntryERKNS_14SecurityOriginERKN3WTF6StringES7_b` | `JIHFGaq4brI` | +| `_ZN7WebCore14SocketProviderC2Ev` | `3tUO7QWZzvo` | +| `_ZN7WebCore14SocketProviderD0Ev` | `Lz1QWf3VBhU` | +| `_ZN7WebCore14SocketProviderD1Ev` | `LIB9DiyTbJk` | +| `_ZN7WebCore14SocketProviderD2Ev` | `mYw-ELNDTOg` | +| `_ZN7WebCore14StaticNodeListD0Ev` | `rbngEtORXxs` | +| `_ZN7WebCore14StaticNodeListD1Ev` | `eg2lXvjFIPQ` | +| `_ZN7WebCore14StaticNodeListD2Ev` | `S6Sf-zsPTgc` | +| `_ZN7WebCore14StaticNodeListdaEPv` | `2Qzl3gA29ls` | +| `_ZN7WebCore14StaticNodeListdlEPv` | `QTlT1P84RL8` | +| `_ZN7WebCore14StaticNodeListnaEm` | `2U6LEZ5b8z8` | +| `_ZN7WebCore14StaticNodeListnwEm` | `419zeSm4NX0` | +| `_ZN7WebCore14StaticNodeListnwEmPv` | `2NHlTAhVJQM` | +| `_ZN7WebCore14StyleSheetList4itemEj` | `NdU-LyVKPZ4` | +| `_ZN7WebCore14StyleSheetListD1Ev` | `8nV64L7-0bI` | +| `_ZN7WebCore14StyleSheetListD2Ev` | `cJnd8bs-Pws` | +| `_ZN7WebCore14XMLHttpRequestD0Ev` | `vnLqlsltLJs` | +| `_ZN7WebCore14XMLHttpRequestD2Ev` | `yrbzVXtDvXg` | +| `_ZN7WebCore14endOfParagraphERKNS_15VisiblePositionENS_27EditingBoundaryCrossingRuleE` | `0QZ4ACiysus` | +| `_ZN7WebCore14foldQuoteMarksERKN3WTF6StringE` | `7-dpn36Q3qc` | +| `_ZN7WebCore14stopResolveDNSEm` | `EvaWvuniNCE` | +| `_ZN7WebCore14valueForLengthERKNS_6LengthENS_10LayoutUnitE` | `Aioru3Sp3WQ` | +| `_ZN7WebCore15ActiveDOMObject15suspendIfNeededEv` | `q629pGti59c` | +| `_ZN7WebCore15ActiveDOMObject20queueTaskInEventLoopENS_10TaskSourceEON3WTF8FunctionIFvvEEE` | `CM8jw+2tnHc` | +| `_ZN7WebCore15ActiveDOMObject4stopEv` | `7Uoplf70Yus` | +| `_ZN7WebCore15ActiveDOMObject6resumeEv` | `nSoL-e4quJU` | +| `_ZN7WebCore15ActiveDOMObject7suspendENS_19ReasonForSuspensionE` | `xUBz9+Iln64` | +| `_ZN7WebCore15ActiveDOMObjectC2EPNS_22ScriptExecutionContextENS0_33CheckedScriptExecutionContextTypeE` | `uMm2FXLD5Og` | +| `_ZN7WebCore15ActiveDOMObjectC2EPNS_22ScriptExecutionContextE` | `h+OfxlwNP6s` | +| `_ZN7WebCore15ActiveDOMObjectC2EPNS_8DocumentE` | `yigC8-yxwo0` | +| `_ZN7WebCore15ActiveDOMObjectC2ERKS0_` | `6A9x05T0dgE` | +| `_ZN7WebCore15ActiveDOMObjectC2ERNS_8DocumentE` | `ustthZNDMRM` | +| `_ZN7WebCore15ActiveDOMObjectD0Ev` | `mNIajby8IWQ` | +| `_ZN7WebCore15ActiveDOMObjectD1Ev` | `2-pbW8Uw8FI` | +| `_ZN7WebCore15ActiveDOMObjectD2Ev` | `VBi3vzGVTyI` | +| `_ZN7WebCore15AsyncFileStream11openForReadERKN3WTF6StringExx` | `VKJiHsvURZA` | +| `_ZN7WebCore15AsyncFileStream5closeEv` | `dEVr74VmImA` | +| `_ZN7WebCore15AsyncFileStream7performEON3WTF8FunctionIFNS2_IFvRNS_16FileStreamClientEEEERNS_10FileStreamEEEE` | `ZVpEkHLDZbI` | +| `_ZN7WebCore15AsyncFileStreamC1ERNS_16FileStreamClientE` | `6aHLe+p7amI` | +| `_ZN7WebCore15AsyncFileStreamC2ERNS_16FileStreamClientE` | `koLfx+JR4pU` | +| `_ZN7WebCore15AsyncFileStreamD1Ev` | `1oa4qrszUrE` | +| `_ZN7WebCore15AsyncFileStreamD2Ev` | `cU-HOGpi5TQ` | +| `_ZN7WebCore15AsyncFileStreamdaEPv` | `5O+fi8P4g+M` | +| `_ZN7WebCore15AsyncFileStreamdlEPv` | `l5FnLbE1-sM` | +| `_ZN7WebCore15AsyncFileStreamnaEmPv` | `o+nLzPY-ObY` | +| `_ZN7WebCore15AsyncFileStreamnaEm` | `ztvVfnQawjQ` | +| `_ZN7WebCore15AsyncFileStreamnwEm` | `Edi1I6slWTU` | +| `_ZN7WebCore15AsyncFileStreamnwEmPv` | `pU54jHctkAs` | +| `_ZN7WebCore15CSSFontFaceRule5styleEv` | `v7Pd1fwDpIs` | +| `_ZN7WebCore15CSSGroupingRule10deleteRuleEj` | `mOQZbw5ZIPs` | +| `_ZN7WebCore15CSSGroupingRule10insertRuleERKN3WTF6StringEj` | `tdkeGhuxqZM` | +| `_ZN7WebCore15DOMWrapperWorld13clearWrappersEv` | `rwJsqFwpr5Q` | +| `_ZN7WebCore15DOMWrapperWorldD1Ev` | `TzXiE0YCpTc` | +| `_ZN7WebCore15DOMWrapperWorldD2Ev` | `8PEuKhIthlw` | +| `_ZN7WebCore15DatabaseManager10initializeERKN3WTF6StringE` | `Pb4ZbPFaVQ8` | +| `_ZN7WebCore15DatabaseManager14setIsAvailableEb` | `R9HHtazgMJY` | +| `_ZN7WebCore15DatabaseManager16hasOpenDatabasesERNS_8DocumentE` | `-jKSe2Flx6E` | +| `_ZN7WebCore15DatabaseManager19fullPathForDatabaseERNS_14SecurityOriginERKN3WTF6StringEb` | `u1+cfR6UUP4` | +| `_ZN7WebCore15DatabaseManager23detailsForNameAndOriginERKN3WTF6StringERNS_14SecurityOriginE` | `IEUh8Xtxsn0` | +| `_ZN7WebCore15DatabaseManager9setClientEPNS_21DatabaseManagerClientE` | `pFIaDCkohN8` | +| `_ZN7WebCore15DatabaseTracker12deleteOriginERKNS_18SecurityOriginDataE` | `k2LxVh9VNW4` | +| `_ZN7WebCore15DatabaseTracker13databaseNamesERKNS_18SecurityOriginDataE` | `dhjAyKgWIFg` | +| `_ZN7WebCore15DatabaseTracker13isInitializedEv` | `VuddC0lOQ9s` | +| `_ZN7WebCore15DatabaseTracker14deleteDatabaseERKNS_18SecurityOriginDataERKN3WTF6StringE` | `t8YrYpCU5dg` | +| `_ZN7WebCore15DatabaseTracker17closeAllDatabasesENS_20CurrentQueryBehaviorE` | `a08n9C9z+2A` | +| `_ZN7WebCore15DatabaseTracker19fullPathForDatabaseERKNS_18SecurityOriginDataERKN3WTF6StringEb` | `0uvtTMIR7-A` | +| `_ZN7WebCore15DatabaseTracker28deleteDatabasesModifiedSinceEN3WTF8WallTimeE` | `N6jdzDR6Zpk` | +| `_ZN7WebCore15DatabaseTracker29deleteAllDatabasesImmediatelyEv` | `X1OqjWAM7NM` | +| `_ZN7WebCore15DatabaseTracker5quotaERKNS_18SecurityOriginDataE` | `LS+eIyIPVgM` | +| `_ZN7WebCore15DatabaseTracker5usageERKNS_18SecurityOriginDataE` | `JGECjvSLd+s` | +| `_ZN7WebCore15DatabaseTracker7originsEv` | `NMQahLvHDPo` | +| `_ZN7WebCore15DatabaseTracker9singletonEv` | `bKSKjuolj7o` | +| `_ZN7WebCore15DeferredPromise6rejectENS_13ExceptionCodeERKN3WTF6StringENS_15RejectAsHandledE` | `TPSSbm1lXrU` | +| `_ZN7WebCore15DeferredPromise6rejectENS_9ExceptionENS_15RejectAsHandledE` | `LG2QVcYXqqo` | +| `_ZN7WebCore15FocusController10setFocusedEb` | `u-pmtvu14hE` | +| `_ZN7WebCore15FocusController15setInitialFocusENS_14FocusDirectionEPNS_13KeyboardEventE` | `uRj8BEc2NKk` | +| `_ZN7WebCore15FocusController20nextFocusableElementERNS_4NodeE` | `30FldU7FPQs` | +| `_ZN7WebCore15FocusController23relinquishFocusToChromeENS_14FocusDirectionE` | `flMkyOcNc+k` | +| `_ZN7WebCore15FocusController24previousFocusableElementERNS_4NodeE` | `bnE1rABdiKU` | +| `_ZN7WebCore15FocusController9setActiveEb` | `Nab6bIqxc84` | +| `_ZN7WebCore15FontDescriptionC1Ev` | `ojkbYSTY3As` | +| `_ZN7WebCore15FontDescriptionC2Ev` | `PTrYtP4u8fg` | +| `_ZN7WebCore15GraphicsContext15drawImageBufferERNS_11ImageBufferERKNS_10FloatPointERKNS_20ImagePaintingOptionsE` | `YkXInh+sJ80` | +| `_ZN7WebCore15GraphicsContext15drawLineForTextERKNS_9FloatRectEbbNS_11StrokeStyleE` | `MP78udfnuS8` | +| `_ZN7WebCore15GraphicsContext20endTransparencyLayerEv` | `yCBKPL04RH0` | +| `_ZN7WebCore15GraphicsContext22beginTransparencyLayerEf` | `hMCy3h9Z-ME` | +| `_ZN7WebCore15GraphicsContext4saveEv` | `Z9-kpqvmMUg` | +| `_ZN7WebCore15GraphicsContext7restoreEv` | `IzQZsHx7TXE` | +| `_ZN7WebCore15GraphicsContext9drawImageERNS_5ImageERKNS_10FloatPointERKNS_20ImagePaintingOptionsE` | `V8zLQVo5sxE` | +| `_ZN7WebCore15GraphicsContext9drawImageERNS_5ImageERKNS_9FloatRectERKNS_20ImagePaintingOptionsE` | `aGmHbcAj42g` | +| `_ZN7WebCore15GraphicsContextD1Ev` | `Mb7-DoEC+nE` | +| `_ZN7WebCore15GraphicsContextD2Ev` | `gzUyAMoXgzg` | +| `_ZN7WebCore15HTMLBaseElement7setHrefERKN3WTF10AtomStringE` | `9RY5wR3m+BA` | +| `_ZN7WebCore15HTMLFormElement13checkValidityEv` | `CDZqEyHuQBw` | +| `_ZN7WebCore15HTMLFormElement15setAutocompleteERKN3WTF10AtomStringE` | `Y0R876TZju4` | +| `_ZN7WebCore15HTMLFormElement25elementsForNativeBindingsEv` | `sPELpAWhcQQ` | +| `_ZN7WebCore15HTMLFormElement5resetEv` | `Y2RudaWFT7I` | +| `_ZN7WebCore15HTMLFormElement6submitEv` | `26liLpqGRjo` | +| `_ZN7WebCore15HTMLLinkElement14setCrossOriginERKN3WTF10AtomStringE` | `H8KVeCoTFeQ` | +| `_ZN7WebCore15HTMLLinkElement5setAsERKN3WTF10AtomStringE` | `G6ftGG8w5Ik` | +| `_ZN7WebCore15HTMLLinkElement7relListEv` | `GnimSlf3jqg` | +| `_ZN7WebCore15HTTPHeaderFieldC1EON3WTF6StringES3_` | `RSEWnJoasFU` | +| `_ZN7WebCore15HTTPHeaderFieldC1ERKS0_` | `aGTNhHZfOvY` | +| `_ZN7WebCore15HTTPHeaderFieldC2EON3WTF6StringES3_` | `TB+cYQ89RiM` | +| `_ZN7WebCore15HTTPHeaderFieldC2ERKS0_` | `iY9c5nf+LCQ` | +| `_ZN7WebCore15HTTPHeaderFieldD1Ev` | `1gZ4CtaI+r4` | +| `_ZN7WebCore15HTTPHeaderFieldD2Ev` | `BgJaal3eOJg` | +| `_ZN7WebCore15HTTPHeaderFieldaSERKS0_` | `UFzKxNIuPO8` | +| `_ZN7WebCore15HitTestLocationC1ERKS0_` | `WaA+akXnqK4` | +| `_ZN7WebCore15HitTestLocationC1Ev` | `FtC9uKqXDjg` | +| `_ZN7WebCore15HitTestLocationC2ERKS0_` | `oliwAKLVWgM` | +| `_ZN7WebCore15HitTestLocationC2Ev` | `7rCiCCIa8Jo` | +| `_ZN7WebCore15HitTestLocationD1Ev` | `KpbPWzWAgCM` | +| `_ZN7WebCore15HitTestLocationD2Ev` | `5WZsWfoc3GQ` | +| `_ZN7WebCore15JSDOMWindowBase14finishCreationERN3JSC2VMEPNS_13JSWindowProxyE` | `W-cGzhINllg` | +| `_ZN7WebCore15JSDOMWindowBase14updateDocumentEv` | `LBzty5qElcE` | +| `_ZN7WebCore15JSDOMWindowBase15createStructureERN3JSC2VMENS1_7JSValueE` | `GEjhu-eMbeY` | +| `_ZN7WebCore15JSDOMWindowBase25willRemoveFromWindowProxyEv` | `wppQMWb54-c` | +| `_ZN7WebCore15JSDOMWindowBase4infoEv` | `rI39CFx2B58` | +| `_ZN7WebCore15JSDOMWindowBaseD2Ev` | `deKZXB9S3YU` | +| `_ZN7WebCore15JSFetchResponse14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `V+CdBngDepo` | +| `_ZN7WebCore15JSFetchResponse15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `ePo0zF7lI5o` | +| `_ZN7WebCore15JSFetchResponse15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `yeL7tJilPGk` | +| `_ZN7WebCore15JSFetchResponse15subspaceForImplERN3JSC2VME` | `w6DbBUELkM0` | +| `_ZN7WebCore15JSFetchResponse4infoEv` | `tgqe6pejnj4` | +| `_ZN7WebCore15JSFetchResponse9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `kUcnaZV-hLs` | +| `_ZN7WebCore15JSFetchResponse9toWrappedERN3JSC2VMENS1_7JSValueE` | `vC9xr5PCWzo` | +| `_ZN7WebCore15JSFetchResponseC1ERKS0_` | `XJT39Czi22Q` | +| `_ZN7WebCore15JSFetchResponseC2ERKS0_` | `X2YwmzkrrcQ` | +| `_ZN7WebCore15JSFetchResponseD1Ev` | `OKaYwlwKZG4` | +| `_ZN7WebCore15JSFetchResponseD2Ev` | `SQW8red2Ny4` | +| `_ZN7WebCore15JSFetchResponseaSERKS0_` | `ax6MAHig4vY` | +| `_ZN7WebCore15JSSVGSVGElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `meFowhylT54` | +| `_ZN7WebCore15JSSVGSVGElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `yG1+UXqztsA` | +| `_ZN7WebCore15JSSVGSVGElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `fX0+oza0hpA` | +| `_ZN7WebCore15JSSVGSVGElement15subspaceForImplERN3JSC2VME` | `6uRfe3kru7g` | +| `_ZN7WebCore15JSSVGSVGElement4infoEv` | `5bFNnMc9ebU` | +| `_ZN7WebCore15JSSVGSVGElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `HNJUerldoxg` | +| `_ZN7WebCore15JSSVGSVGElement9toWrappedERN3JSC2VMENS1_7JSValueE` | `QfRYjyv9Ews` | +| `_ZN7WebCore15JSSVGSVGElementC1ERKS0_` | `0Bsyz501NWA` | +| `_ZN7WebCore15JSSVGSVGElementC2ERKS0_` | `1AbLXkyjTJo` | +| `_ZN7WebCore15JSSVGSVGElementD1Ev` | `HsBiFJJIQ5Q` | +| `_ZN7WebCore15JSSVGSVGElementD2Ev` | `JZ7r1NnPrt4` | +| `_ZN7WebCore15NavigatorBeacon4fromERNS_9NavigatorE` | `r7GpJXebmjg` | +| `_ZN7WebCore15PlatformDisplay13sharedDisplayEv` | `mLVdNCQJmJ8` | +| `_ZN7WebCore15PlatformDisplay16sharingGLContextEv` | `3Zkj-D8lfnU` | +| `_ZN7WebCore15PlatformDisplay27sharedDisplayForCompositingEv` | `CrxnEM1JJ9g` | +| `_ZN7WebCore15RenderBlockFlow30findClosestTextAtAbsolutePointERKNS_10FloatPointE` | `Jnm7yYsPwGA` | +| `_ZN7WebCore15ResourceRequest41updateFromDelegatePreservingOldPropertiesERKS0_` | `1PjHjfI8ncQ` | +| `_ZN7WebCore15SQLiteStatement10bindDoubleEid` | `PVBHZjcjzo0` | +| `_ZN7WebCore15SQLiteStatement14executeCommandEv` | `pgfsfmVnZ80` | +| `_ZN7WebCore15SQLiteStatement22isColumnDeclaredAsBlobEi` | `wYCxExkKxYA` | +| `_ZN7WebCore15SQLiteStatement4stepEv` | `ZO39wK-KwXE` | +| `_ZN7WebCore15SQLiteStatement5resetEv` | `fZbmrDb2Wl4` | +| `_ZN7WebCore15SQLiteStatement7bindIntEii` | `su0zXmF7Cto` | +| `_ZN7WebCore15SQLiteStatement8bindBlobEiRKN3WTF6StringE` | `L3OgkCd-Wws` | +| `_ZN7WebCore15SQLiteStatement8bindNullEi` | `1HJmJsAhIVU` | +| `_ZN7WebCore15SQLiteStatement9bindInt64Eil` | `3hRFngR3flU` | +| `_ZN7WebCore15SQLiteStatementD1Ev` | `C-lrlIiUeZs` | +| `_ZN7WebCore15SQLiteStatementD2Ev` | `6W+ovJY9kVo` | +| `_ZN7WebCore15StringTruncator12leftTruncateERKN3WTF6StringEfRKNS_11FontCascadeERfbf` | `UzUQwo6GPQQ` | +| `_ZN7WebCore15StringTruncator13rightTruncateERKN3WTF6StringEfRKNS_11FontCascadeERfbf` | `N64zIkwmxG0` | +| `_ZN7WebCore15StringTruncator13rightTruncateERKN3WTF6StringEfRKNS_11FontCascadeE` | `fd0deLslWTs` | +| `_ZN7WebCore15StringTruncator14centerTruncateERKN3WTF6StringEfRKNS_11FontCascadeE` | `DtdiNU9AStc` | +| `_ZN7WebCore15StringTruncator14centerTruncateERKN3WTF6StringEfRKNS_11FontCascadeERfbf` | `7YGj8EFGdm4` | +| `_ZN7WebCore15StringTruncator15rightClipToWordERKN3WTF6StringEfRKNS_11FontCascadeERfbfb` | `86mSgXjesi4` | +| `_ZN7WebCore15StringTruncator20rightClipToCharacterERKN3WTF6StringEfRKNS_11FontCascadeERfbf` | `Pf6JfPjQq-w` | +| `_ZN7WebCore15StringTruncator5widthERKN3WTF6StringERKNS_11FontCascadeE` | `QbsJwXsd+YA` | +| `_ZN7WebCore15UserInputBridge11loadRequestEONS_16FrameLoadRequestENS_11InputSourceE` | `l0Ca3nIU1yA` | +| `_ZN7WebCore15UserInputBridge12tryClosePageENS_11InputSourceE` | `WEd+Yfs8auY` | +| `_ZN7WebCore15UserInputBridge14handleKeyEventERKNS_21PlatformKeyboardEventENS_11InputSourceE` | `GqK+hm6Mdp0` | +| `_ZN7WebCore15UserInputBridge17scrollRecursivelyENS_15ScrollDirectionENS_17ScrollGranularityENS_11InputSourceE` | `WnDNXOqq1FE` | +| `_ZN7WebCore15UserInputBridge20handleAccessKeyEventERKNS_21PlatformKeyboardEventENS_11InputSourceE` | `aw5Hx2PySrk` | +| `_ZN7WebCore15UserInputBridge20handleMouseMoveEventERKNS_18PlatformMouseEventENS_11InputSourceE` | `UC2vD95tn0k` | +| `_ZN7WebCore15UserInputBridge21handleMouseForceEventERKNS_18PlatformMouseEventENS_11InputSourceE` | `Er0f6YqPDCA` | +| `_ZN7WebCore15UserInputBridge21handleMousePressEventERKNS_18PlatformMouseEventENS_11InputSourceE` | `NiV9OwU4DeE` | +| `_ZN7WebCore15UserInputBridge23handleMouseReleaseEventERKNS_18PlatformMouseEventENS_11InputSourceE` | `HsX3lXxmzHQ` | +| `_ZN7WebCore15UserInputBridge24logicalScrollRecursivelyENS_22ScrollLogicalDirectionENS_17ScrollGranularityENS_11InputSourceE` | `a0zs2ITV-lo` | +| `_ZN7WebCore15UserInputBridge31handleMouseMoveOnScrollbarEventERKNS_18PlatformMouseEventENS_11InputSourceE` | `0-AQoeTc9kM` | +| `_ZN7WebCore15WindowEventLoop27breakToAllowRenderingUpdateEv` | `tX+X7SrADMY` | +| `_ZN7WebCore15XPathExpression8evaluateERNS_4NodeEtPNS_11XPathResultE` | `N1AE5kZeN98` | +| `_ZN7WebCore15XPathExpressionD1Ev` | `aKaMcVLBKfM` | +| `_ZN7WebCore15XPathExpressionD2Ev` | `RhG8+YJU75Q` | +| `_ZN7WebCore15XPathNSResolverC2Ev` | `FPwp7ypjzlc` | +| `_ZN7WebCore15XPathNSResolverD0Ev` | `MhXub7fXkKw` | +| `_ZN7WebCore15XPathNSResolverD1Ev` | `61IVWsR1+yw` | +| `_ZN7WebCore15XPathNSResolverD2Ev` | `138vohStwzY` | +| `_ZN7WebCore15addToBackingSetERN3JSC14JSGlobalObjectERNS0_8JSObjectENS0_7JSValueE` | `cvfT6ImYn30` | +| `_ZN7WebCore15clearBackingMapERN3JSC14JSGlobalObjectERNS0_8JSObjectE` | `fVGDgMU9zbw` | +| `_ZN7WebCore15clearBackingSetERN3JSC14JSGlobalObjectERNS0_8JSObjectE` | `vOwhzBrEV4E` | +| `_ZN7WebCore15createLiveRangeERKNS_11SimpleRangeE` | `Q95JDAMcB6I` | +| `_ZN7WebCore15defaultMIMETypeEv` | `2dXihgWrxE4` | +| `_ZN7WebCore15isDraggableLinkERKNS_7ElementE` | `fTCzMLWb9eg` | +| `_ZN7WebCore15isEndOfDocumentERKNS_15VisiblePositionE` | `IkDe9ajjgrc` | +| `_ZN7WebCore15localizedStringEPKc` | `0cKbHa0gdeg` | +| `_ZN7WebCore15makeSimpleRangeERKNS_5RangeE` | `UeOJlAxhp98` | +| `_ZN7WebCore15makeSimpleRangeERNS_4NodeERKNS_14DocumentMarkerE` | `Z+1yF3nUzb0` | +| `_ZN7WebCore15setToBackingMapERN3JSC14JSGlobalObjectERNS0_8JSObjectENS0_7JSValueES5_` | `jzDgtYoh8-Y` | +| `_ZN7WebCore15startOfDocumentEPKNS_4NodeE` | `lJvKp35od0A` | +| `_ZN7WebCore15startOfDocumentERKNS_15VisiblePositionE` | `4vEQrYUFJxI` | +| `_ZN7WebCore15startOfSentenceERKNS_15VisiblePositionE` | `BaILhlzfYu4` | +| `_ZN7WebCore16BackForwardCache10setMaxSizeEj` | `6EV409ek-d4` | +| `_ZN7WebCore16BackForwardCache14addIfCacheableERNS_11HistoryItemEPNS_4PageE` | `bI0R631jRPA` | +| `_ZN7WebCore16BackForwardCache14pruneToSizeNowEjNS_13PruningReasonE` | `pU3xyTxVS+w` | +| `_ZN7WebCore16BackForwardCache6removeERNS_11HistoryItemE` | `Hrl76mzEvrc` | +| `_ZN7WebCore16BackForwardCache9singletonEv` | `0G7a3zE4Hao` | +| `_ZN7WebCore16BlobRegistryImpl17unregisterBlobURLERKN3WTF3URLE` | `2UpHdcB6ZHI` | +| `_ZN7WebCore16BlobRegistryImpl18appendStorageItemsEPNS_8BlobDataERKN3WTF6VectorINS_12BlobDataItemELm0ENS3_15CrashOnOverflowELm16ENS3_10FastMallocEEExx` | `OlH1UyhHvgQ` | +| `_ZN7WebCore16BlobRegistryImpl20createResourceHandleERKNS_15ResourceRequestEPNS_20ResourceHandleClientE` | `l4nTLLl7Ma4` | +| `_ZN7WebCore16BlobRegistryImpl27populateBlobsForFileWritingERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEERNS2_INS0_18BlobForFileWritingELm0ES4_Lm16ES5_EE` | `AKCvSvrjbaM` | +| `_ZN7WebCore16BlobRegistryImpl8blobSizeERKN3WTF3URLE` | `9Ks+gN027W0` | +| `_ZN7WebCore16BlobRegistryImplC1ERKS0_` | `hxcr96px0ww` | +| `_ZN7WebCore16BlobRegistryImplC1Ev` | `o5z9VIc1MWQ` | +| `_ZN7WebCore16BlobRegistryImplC2ERKS0_` | `oR1hI6e7AGE` | +| `_ZN7WebCore16BlobRegistryImplC2Ev` | `4aHyuLG09aw` | +| `_ZN7WebCore16BlobRegistryImplD0Ev` | `TEVrkWV4tsA` | +| `_ZN7WebCore16BlobRegistryImplD1Ev` | `nEVyOIFw+90` | +| `_ZN7WebCore16BlobRegistryImplD2Ev` | `amZi2FCVjEw` | +| `_ZN7WebCore16BlobRegistryImpldaEPv` | `rBoGFnN+Hrw` | +| `_ZN7WebCore16BlobRegistryImpldlEPv` | `cJH9bcWJgME` | +| `_ZN7WebCore16BlobRegistryImplnaEm` | `AxD0nee82Qk` | +| `_ZN7WebCore16BlobRegistryImplnaEmPv` | `J7qYAZ8QNkE` | +| `_ZN7WebCore16BlobRegistryImplnwEm10NotNullTagPv` | `cnWEojGLoFg` | +| `_ZN7WebCore16BlobRegistryImplnwEm` | `Dhs9LkoqV8Y` | +| `_ZN7WebCore16BlobRegistryImplnwEmPv` | `iV0oqHXZhvs` | +| `_ZN7WebCore16CSSParserContextC1ERKNS_8DocumentERKN3WTF3URLERKNS4_6StringE` | `TT4K6hxGZSY` | +| `_ZN7WebCore16CSSParserContextC2ERKNS_8DocumentERKN3WTF3URLERKNS4_6StringE` | `fr-jP7r1PQk` | +| `_ZN7WebCore16DOMGuardedObject16contextDestroyedEv` | `0tT-egOV1R0` | +| `_ZN7WebCore16DOMGuardedObject5clearEv` | `sEaygI2j4GI` | +| `_ZN7WebCore16DOMGuardedObjectC1ERNS_17JSDOMGlobalObjectERN3JSC6JSCellE` | `MdQcEXxlqLo` | +| `_ZN7WebCore16DOMGuardedObjectC2ERNS_17JSDOMGlobalObjectERN3JSC6JSCellE` | `ucxfOk6R-B8` | +| `_ZN7WebCore16DOMGuardedObjectD0Ev` | `-NAi4kLuiTw` | +| `_ZN7WebCore16DOMGuardedObjectD1Ev` | `KXj7+ueLvdo` | +| `_ZN7WebCore16DOMGuardedObjectD2Ev` | `G4yQyiIWb2s` | +| `_ZN7WebCore16DatabaseProviderC2Ev` | `ycSZmq4JInA` | +| `_ZN7WebCore16DatabaseProviderD0Ev` | `mRQXgXKYsCo` | +| `_ZN7WebCore16DatabaseProviderD1Ev` | `x0rDFBY8wus` | +| `_ZN7WebCore16DatabaseProviderD2Ev` | `sfyZ8ToBf0M` | +| `_ZN7WebCore16DeviceMotionData6createEv` | `nRNa+ZeFvnY` | +| `_ZN7WebCore16FileReaderLoader5startEPNS_22ScriptExecutionContextERNS_4BlobE` | `w9LQhp4wNfE` | +| `_ZN7WebCore16FileReaderLoader6cancelEv` | `zRiYco2OGYk` | +| `_ZN7WebCore16FileReaderLoaderC1ENS0_8ReadTypeEPNS_22FileReaderLoaderClientE` | `1aPXW6zlPz4` | +| `_ZN7WebCore16FileReaderLoaderC2ENS0_8ReadTypeEPNS_22FileReaderLoaderClientE` | `6QL1C4uv4T0` | +| `_ZN7WebCore16FontCascadeFonts23realizeFallbackRangesAtERKNS_22FontCascadeDescriptionEj` | `WhHAwtSeEVY` | +| `_ZN7WebCore16FontCascadeFontsD1Ev` | `jhinn3TXn5g` | +| `_ZN7WebCore16FontCascadeFontsD2Ev` | `zREgl-R2PHU` | +| `_ZN7WebCore16FrameLoadRequestC1EOS0_` | `teLywa5jrbk` | +| `_ZN7WebCore16FrameLoadRequestC2EOS0_` | `tCAFLc4j724` | +| `_ZN7WebCore16FrameLoadRequestD1Ev` | `3Z7T+yqwlBc` | +| `_ZN7WebCore16FrameLoadRequestD2Ev` | `vgcKWwf4kk4` | +| `_ZN7WebCore16FrameLoadRequestaSEOS0_` | `sRblWBmBbH8` | +| `_ZN7WebCore16HTMLImageElement14setCrossOriginERKN3WTF10AtomStringE` | `adjFB0jX3n8` | +| `_ZN7WebCore16HTMLImageElement8setWidthEj` | `lqCgNLJHlw0` | +| `_ZN7WebCore16HTMLImageElement9setHeightEj` | `6lewWDIQodI` | +| `_ZN7WebCore16HTMLInputElement10setCheckedEb` | `LilbhN7PAuk` | +| `_ZN7WebCore16HTMLInputElement11selectColorEN3WTF10StringViewE` | `WMmW8ChmYdE` | +| `_ZN7WebCore16HTMLInputElement13setAutoFilledEb` | `7Arj-FS88Kk` | +| `_ZN7WebCore16HTMLInputElement16setIndeterminateEb` | `XZqv4gIsqTU` | +| `_ZN7WebCore16HTMLInputElement16setValueAsNumberEdNS_22TextFieldEventBehaviorE` | `keQTYykAIN4` | +| `_ZN7WebCore16HTMLInputElement21setShowAutoFillButtonENS_18AutoFillButtonTypeE` | `TWUXKVxmn2E` | +| `_ZN7WebCore16HTMLInputElement24setAutoFilledAndViewableEb` | `MuBCFAVXErM` | +| `_ZN7WebCore16HTMLInputElement5filesEv` | `TEmyq2mz3QU` | +| `_ZN7WebCore16HTMLInputElement6stepUpEi` | `lI9iaIkgrCI` | +| `_ZN7WebCore16HTMLInputElement7setSizeEj` | `xphwiQQzH+M` | +| `_ZN7WebCore16HTMLInputElement7setTypeERKN3WTF10AtomStringE` | `3KK-Q0bl7oI` | +| `_ZN7WebCore16HTMLInputElement8setWidthEj` | `MRPjPRjYHnI` | +| `_ZN7WebCore16HTMLInputElement8stepDownEi` | `U5PbkU5XLhk` | +| `_ZN7WebCore16HTMLInputElement9setHeightEj` | `pL+mk3X2b2M` | +| `_ZN7WebCore16HTMLMediaElement11setControlsEb` | `E3pqm309ql4` | +| `_ZN7WebCore16HTMLMediaElement12endScrubbingEv` | `iPgEtDFsNa8` | +| `_ZN7WebCore16HTMLMediaElement14beginScrubbingEv` | `JpLvQJmZ33Y` | +| `_ZN7WebCore16HTMLMediaElement14exitFullscreenEv` | `czMa+cNtY5E` | +| `_ZN7WebCore16HTMLMediaElement14setCrossOriginERKN3WTF10AtomStringE` | `jNkXfZU3hzY` | +| `_ZN7WebCore16HTMLMediaElement14setCurrentTimeEd` | `mZaw3JtFNPY` | +| `_ZN7WebCore16HTMLMediaElement15clearMediaCacheERKN3WTF6StringENS1_8WallTimeE` | `LlmmrLyssoY` | +| `_ZN7WebCore16HTMLMediaElement15enterFullscreenEv` | `sK7rb1+0III` | +| `_ZN7WebCore16HTMLMediaElement15togglePlayStateEv` | `wfqHM5ztNrk` | +| `_ZN7WebCore16HTMLMediaElement16allMediaElementsEv` | `heO6fLodsG8` | +| `_ZN7WebCore16HTMLMediaElement16returnToRealtimeEv` | `k5rdY0oueBE` | +| `_ZN7WebCore16HTMLMediaElement19mediaCacheDirectoryEv` | `u4uYkZNxIcg` | +| `_ZN7WebCore16HTMLMediaElement19originsInMediaCacheERKN3WTF6StringE` | `M-aG2xrDafY` | +| `_ZN7WebCore16HTMLMediaElement22setMediaCacheDirectoryERKN3WTF6StringE` | `eokEwsWT7zI` | +| `_ZN7WebCore16HTMLMediaElement23setWebkitPreservesPitchEb` | `HnEU93QBgkw` | +| `_ZN7WebCore16HTMLMediaElement25setCurrentTimeForBindingsEd` | `FzrPo3xk3aI` | +| `_ZN7WebCore16HTMLMediaElement25setVideoFullscreenStandbyEb` | `6Ogwaprthfs` | +| `_ZN7WebCore16HTMLMediaElement26didBecomeFullscreenElementEv` | `cm-iX2uBwkw` | +| `_ZN7WebCore16HTMLMediaElement27purgeBufferedDataIfPossibleEv` | `omOKwHLJ90U` | +| `_ZN7WebCore16HTMLMediaElement29getCurrentMediaControlsStatusEv` | `IHZD-nXKzPw` | +| `_ZN7WebCore16HTMLMediaElement30setWebkitClosedCaptionsVisibleEb` | `xYmwUKajQbI` | +| `_ZN7WebCore16HTMLMediaElement32prepareForVideoFullscreenStandbyEv` | `5DLa+e3Daho` | +| `_ZN7WebCore16HTMLMediaElement36setOverridePreferredDynamicRangeModeENS_16DynamicRangeModeE` | `2Fu4CKX9Va4` | +| `_ZN7WebCore16HTMLMediaElement4loadEv` | `3mStN5GBS80` | +| `_ZN7WebCore16HTMLMediaElement4playEv` | `a1UTZkIReDs` | +| `_ZN7WebCore16HTMLMediaElement5pauseEv` | `N3O5khw1t6Y` | +| `_ZN7WebCore16HTMLMediaElement6rewindEd` | `gtdtzx6Ps3g` | +| `_ZN7WebCore16HTMLMediaElement8fastSeekERKN3WTF9MediaTimeE` | `oMQqGkDVkZ4` | +| `_ZN7WebCore16HTMLMediaElement8fastSeekEd` | `7oEHtlR1sXw` | +| `_ZN7WebCore16HTMLMediaElement8setMutedEb` | `cWqvLZtFrOw` | +| `_ZN7WebCore16HTMLMediaElement9setVolumeEd` | `B3OwcJfuhCQ` | +| `_ZN7WebCore16HTMLOListElement19setStartForBindingsEi` | `PUsOFHI1iBo` | +| `_ZN7WebCore16HTMLStyleElement11setDisabledEb` | `PGyCIh2cxS0` | +| `_ZN7WebCore16HTMLTableElement11createTBodyEv` | `S+Y25kH5Rn4` | +| `_ZN7WebCore16HTMLTableElement11createTFootEv` | `S6wlKLdicxQ` | +| `_ZN7WebCore16HTMLTableElement11createTHeadEv` | `7pv4GMWAJws` | +| `_ZN7WebCore16HTMLTableElement11deleteTFootEv` | `SBuVOyegEnA` | +| `_ZN7WebCore16HTMLTableElement11deleteTHeadEv` | `Zk0NeF-GSmw` | +| `_ZN7WebCore16HTMLTableElement13createCaptionEv` | `bUwn05J4BZc` | +| `_ZN7WebCore16HTMLTableElement13deleteCaptionEv` | `SMBeFW-E0gQ` | +| `_ZN7WebCore16HTMLTableElement4rowsEv` | `hfKjHJWHnF0` | +| `_ZN7WebCore16HTMLTableElement7tBodiesEv` | `OhC6hmD2VYw` | +| `_ZN7WebCore16HTMLTableElement9deleteRowEi` | `FaEwVkG3PY0` | +| `_ZN7WebCore16HTMLTableElement9insertRowEi` | `X15BbHVE+80` | +| `_ZN7WebCore16HTMLVideoElement20webkitExitFullscreenEv` | `1l3T06lc6cI` | +| `_ZN7WebCore16HTMLVideoElement21webkitEnterFullscreenEv` | `v2yM9OvxVKU` | +| `_ZN7WebCore16HTMLVideoElement24webkitSupportsFullscreenEv` | `CNVHR5xfEqI` | +| `_ZN7WebCore16HTMLVideoElement26webkitDisplayingFullscreenEv` | `SwVRb5Q7GCQ` | +| `_ZN7WebCore16HTMLVideoElement6createERNS_8DocumentE` | `GLRtuC2tjQY` | +| `_ZN7WebCore16ISOSchemeTypeBox11boxTypeNameEv` | `pH77OiapXx0` | +| `_ZN7WebCore16ISOSchemeTypeBox5parseERN3JSC8DataViewERj` | `F963GLVx2ek` | +| `_ZN7WebCore16ISOSchemeTypeBoxC1ERKS0_` | `sDW6WO4WMd4` | +| `_ZN7WebCore16ISOSchemeTypeBoxC1Ev` | `E4-gy9tn-e4` | +| `_ZN7WebCore16ISOSchemeTypeBoxC2ERKS0_` | `4hpGSSn9t74` | +| `_ZN7WebCore16ISOSchemeTypeBoxC2Ev` | `VMrJHWuCy3Q` | +| `_ZN7WebCore16ISOSchemeTypeBoxD0Ev` | `jS4vIPXC3Jc` | +| `_ZN7WebCore16ISOSchemeTypeBoxD1Ev` | `nkQjPDHLTnE` | +| `_ZN7WebCore16ISOSchemeTypeBoxD2Ev` | `4Gj1pCDEEFk` | +| `_ZN7WebCore16JSHTMLCollection9toWrappedERN3JSC2VMENS1_7JSValueE` | `Es2NKgJgvdw` | +| `_ZN7WebCore16JSStringCallback11handleEventERKN3WTF6StringE` | `wac+NJFrLjw` | +| `_ZN7WebCore16JSStringCallback12callbackDataEv` | `L7KtgkMSjT4` | +| `_ZN7WebCore16JSStringCallback6createEPN3JSC8JSObjectEPNS_17JSDOMGlobalObjectE` | `mzFdkwKGq-I` | +| `_ZN7WebCore16JSStringCallbackC1EPN3JSC8JSObjectEPNS_17JSDOMGlobalObjectE` | `MUVvRbWZJhM` | +| `_ZN7WebCore16JSStringCallbackC2EPN3JSC8JSObjectEPNS_17JSDOMGlobalObjectE` | `RTZW4GbFgYU` | +| `_ZN7WebCore16JSStringCallbackD0Ev` | `js0MFg3iZcU` | +| `_ZN7WebCore16JSStringCallbackD1Ev` | `4mfcPUFbik4` | +| `_ZN7WebCore16JSStringCallbackD2Ev` | `2jbA+-Cyl-w` | +| `_ZN7WebCore16JSStyleSheetList9toWrappedERN3JSC2VMENS1_7JSValueE` | `U7UY7XgW1z4` | +| `_ZN7WebCore16JSXMLHttpRequest14finishCreationERN3JSC2VME` | `dz0+6+b1oVM` | +| `_ZN7WebCore16JSXMLHttpRequest14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `kA0ggtLgY0I` | +| `_ZN7WebCore16JSXMLHttpRequest15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `DCaq-waberM` | +| `_ZN7WebCore16JSXMLHttpRequest15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `4KY0luF+mAk` | +| `_ZN7WebCore16JSXMLHttpRequest15subspaceForImplERN3JSC2VME` | `u-ZZQ0nnX4A` | +| `_ZN7WebCore16JSXMLHttpRequest4infoEv` | `avfJcMV8UJM` | +| `_ZN7WebCore16JSXMLHttpRequest9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `me+5VXmudjU` | +| `_ZN7WebCore16JSXMLHttpRequest9toWrappedERN3JSC2VMENS1_7JSValueE` | `9b1Vl4heYfc` | +| `_ZN7WebCore16JSXMLHttpRequestC1ERKS0_` | `eDeAbQ8q28w` | +| `_ZN7WebCore16JSXMLHttpRequestC2ERKS0_` | `gfA0BLJiywk` | +| `_ZN7WebCore16JSXMLHttpRequestD1Ev` | `KIIYva3fxFM` | +| `_ZN7WebCore16JSXMLHttpRequestD2Ev` | `L2BqedAiKTk` | +| `_ZN7WebCore16MIMETypeRegistry13isXMLMIMETypeERKN3WTF6StringE` | `Z--iFci25hA` | +| `_ZN7WebCore16MIMETypeRegistry14isTextMIMETypeERKN3WTF6StringE` | `0lD2Oypwty8` | +| `_ZN7WebCore16MIMETypeRegistry15canShowMIMETypeERKN3WTF6StringE` | `HJ3vdF4LmxM` | +| `_ZN7WebCore16MIMETypeRegistry16allowedMIMETypesERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEES8_` | `PiZeyClurI4` | +| `_ZN7WebCore16MIMETypeRegistry19isXMLEntityMIMETypeEN3WTF10StringViewE` | `kzP8wjZhZNA` | +| `_ZN7WebCore16MIMETypeRegistry21allowedFileExtensionsERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEES8_` | `GnTXkxscE8k` | +| `_ZN7WebCore16MIMETypeRegistry21extensionsForMIMETypeERKN3WTF6StringE` | `2iORhW4G1F4` | +| `_ZN7WebCore16MIMETypeRegistry23isSupportedJSONMIMETypeERKN3WTF6StringE` | `IHClyogk-U0` | +| `_ZN7WebCore16MIMETypeRegistry23supportedImageMIMETypesEv` | `c29hhxlHcfk` | +| `_ZN7WebCore16MIMETypeRegistry23supportedMediaMIMETypesEv` | `lW6dX7Z0aq4` | +| `_ZN7WebCore16MIMETypeRegistry24isSupportedImageMIMETypeERKN3WTF6StringE` | `PiajzJbyAUU` | +| `_ZN7WebCore16MIMETypeRegistry24isSupportedMediaMIMETypeERKN3WTF6StringE` | `RNAdd6DpntM` | +| `_ZN7WebCore16MIMETypeRegistry24unsupportedTextMIMETypesEv` | `uWXZu+HXZw0` | +| `_ZN7WebCore16MIMETypeRegistry25isPDFOrPostScriptMIMETypeERKN3WTF6StringE` | `78+MUflpKSE` | +| `_ZN7WebCore16MIMETypeRegistry26supportedNonImageMIMETypesEv` | `TkTwUQTXIMA` | +| `_ZN7WebCore16MIMETypeRegistry27isSupportedNonImageMIMETypeERKN3WTF6StringE` | `K7Ebfde-JmE` | +| `_ZN7WebCore16MIMETypeRegistry28isSupportedTextTrackMIMETypeERKN3WTF6StringE` | `RE2FpJnJOGw` | +| `_ZN7WebCore16MIMETypeRegistry29isSupportedJavaScriptMIMETypeERKN3WTF6StringE` | `Lw3aQwNM3Mo` | +| `_ZN7WebCore16MIMETypeRegistry29preferredExtensionForMIMETypeERKN3WTF6StringE` | `ODx7UiCP0gQ` | +| `_ZN7WebCore16MIMETypeRegistry30appendFileExtensionIfNecessaryERKN3WTF6StringES4_` | `Upt4yMKJOZ0` | +| `_ZN7WebCore16MIMETypeRegistry32containsImageMIMETypeForEncodingERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEES8_` | `1wtqJZpO4Dw` | +| `_ZN7WebCore16MIMETypeRegistry33preferredImageMIMETypeForEncodingERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEES8_` | `6vQllokbxsQ` | +| `_ZN7WebCore16MIMETypeRegistry34isSupportedImageVideoOrSVGMIMETypeERKN3WTF6StringE` | `zOznE5hOJHU` | +| `_ZN7WebCore16NavigationActionC1ERKS0_` | `d6ZIY03VGsw` | +| `_ZN7WebCore16NavigationActionC1ERNS_8DocumentERKNS_15ResourceRequestENS_20InitiatedByMainFrameENS_14NavigationTypeENS_28ShouldOpenExternalURLsPolicyEPNS_5EventERKN3WTF10AtomStringE` | `ci-AORZCeIw` | +| `_ZN7WebCore16NavigationActionC2ERKS0_` | `myR4iQ03csY` | +| `_ZN7WebCore16NavigationActionC2ERNS_8DocumentERKNS_15ResourceRequestENS_20InitiatedByMainFrameENS_14NavigationTypeENS_28ShouldOpenExternalURLsPolicyEPNS_5EventERKN3WTF10AtomStringE` | `gbpFrV-NLa8` | +| `_ZN7WebCore16NavigationActionD1Ev` | `-kPgTCLEL-U` | +| `_ZN7WebCore16NavigationActionD2Ev` | `DSHoRUTWQD0` | +| `_ZN7WebCore16NetworkSendQueue15processMessagesEv` | `8Y-Bro92C7Y` | +| `_ZN7WebCore16NetworkSendQueue5clearEv` | `zmujoSR7YuA` | +| `_ZN7WebCore16NetworkSendQueue7enqueueEON3WTF7CStringE` | `P-DYctUODfM` | +| `_ZN7WebCore16NetworkSendQueue7enqueueERKN3JSC11ArrayBufferEjj` | `nYdMXcX71j8` | +| `_ZN7WebCore16NetworkSendQueue7enqueueERNS_4BlobE` | `sx2zpRS6VjA` | +| `_ZN7WebCore16NetworkSendQueueD1Ev` | `A4SdYgoAxIM` | +| `_ZN7WebCore16NetworkSendQueueD2Ev` | `iiikn8yCV4I` | +| `_ZN7WebCore16SQLiteFileSystem18deleteDatabaseFileERKN3WTF6StringE` | `nU+IegSkBWk` | +| `_ZN7WebCore16SQLiteFileSystem29ensureDatabaseDirectoryExistsERKN3WTF6StringE` | `MRGoMKt8Wr0` | +| `_ZN7WebCore16ScriptController11createWorldERKN3WTF6StringENS0_9WorldTypeE` | `u3sH1KCFd9U` | +| `_ZN7WebCore16ScriptController11windowProxyEv` | `EgwcFZpfkbQ` | +| `_ZN7WebCore16ScriptController13jsWindowProxyERNS_15DOMWrapperWorldE` | `6dnqmpbSP98` | +| `_ZN7WebCore16ScriptController16createRootObjectEPv` | `I7i7e1LGVZI` | +| `_ZN7WebCore16ScriptController17bindingRootObjectEv` | `joaerP21Z2U` | +| `_ZN7WebCore16ScriptController17canExecuteScriptsENS_33ReasonForCallingCanExecuteScriptsE` | `zhn3KOT4QNQ` | +| `_ZN7WebCore16ScriptController24jsObjectForPluginElementEPNS_17HTMLPlugInElementE` | `vLl0C9Oq5Ls` | +| `_ZN7WebCore16ScriptController29cleanupScriptObjectsForPluginEPv` | `MdpEzweRN2E` | +| `_ZN7WebCore16ScriptController29executeUserAgentScriptInWorldERNS_15DOMWrapperWorldERKN3WTF6StringEb` | `dYZbnR7ROJA` | +| `_ZN7WebCore16ScriptController30executeScriptIgnoringExceptionERKN3WTF6StringEb` | `dxphfFDV-4Y` | +| `_ZN7WebCore16ScriptController37executeScriptInWorldIgnoringExceptionERNS_15DOMWrapperWorldERKN3WTF6StringEb` | `2kN4k0fxVrI` | +| `_ZN7WebCore16ScriptController41executeAsynchronousUserAgentScriptInWorldERNS_15DOMWrapperWorldEONS_23RunJavaScriptParametersEON3WTF17CompletionHandlerIFvNSt12experimental15fundamentals_v38expectedIN3JSC7JSValueENS_16ExceptionDetailsEEEEEE` | `kS90uDHCoSA` | +| `_ZN7WebCore16ScriptController46executeUserAgentScriptInWorldIgnoringExceptionERNS_15DOMWrapperWorldERKN3WTF6StringEb` | `NdBqXtlmBY4` | +| `_ZN7WebCore16ThreadGlobalDataC1Ev` | `w8MmFAAxfqM` | +| `_ZN7WebCore16ThreadGlobalDataC2Ev` | `nmDWFehIWBQ` | +| `_ZN7WebCore16ThreadGlobalDataD1Ev` | `Er2rl6X-19s` | +| `_ZN7WebCore16ThreadGlobalDataD2Ev` | `uCDdgFMfEb0` | +| `_ZN7WebCore16TrackPrivateBase13willBeRemovedEv` | `bRuD-8BJ4nI` | +| `_ZN7WebCore16TrackPrivateBaseC2Ev` | `kU02TR5VIpU` | +| `_ZN7WebCore16TrackPrivateBaseD0Ev` | `s1DS0Vvz-18` | +| `_ZN7WebCore16TrackPrivateBaseD1Ev` | `tXwdR3KKGTY` | +| `_ZN7WebCore16TrackPrivateBaseD2Ev` | `Bf-1cIE-brw` | +| `_ZN7WebCore16TrackPrivateBasedaEPv` | `TJPfcVnZnUk` | +| `_ZN7WebCore16TrackPrivateBasedlEPv` | `su3S99ot9hg` | +| `_ZN7WebCore16TrackPrivateBasenaEmPv` | `vZaJVJV+K7M` | +| `_ZN7WebCore16TrackPrivateBasenaEm` | `mdwtkp-FqnI` | +| `_ZN7WebCore16TrackPrivateBasenwEm10NotNullTagPv` | `jm8YSQFNhDk` | +| `_ZN7WebCore16TrackPrivateBasenwEmPv` | `oxVasBZxFVE` | +| `_ZN7WebCore16TrackPrivateBasenwEm` | `f0X68Ail+co` | +| `_ZN7WebCore16UserGestureToken60setMaximumIntervalForUserGestureForwardingForFetchForTestingEN3WTF7SecondsE` | `8hZJK-1l7VY` | +| `_ZN7WebCore16UserGestureTokenD1Ev` | `X62s7-3mQYs` | +| `_ZN7WebCore16UserGestureTokenD2Ev` | `gLb38-yOLMw` | +| `_ZN7WebCore16VisibleSelection20adjustPositionForEndERKNS_8PositionEPNS_4NodeE` | `hGKVouD1cSI` | +| `_ZN7WebCore16VisibleSelection22adjustPositionForStartERKNS_8PositionEPNS_4NodeE` | `kJ7QpdWODn8` | +| `_ZN7WebCore16VisibleSelection22expandUsingGranularityENS_15TextGranularityE` | `WDZgjwCSKFs` | +| `_ZN7WebCore16VisibleSelection27selectionFromContentsOfNodeEPNS_4NodeE` | `d29IopDYFrI` | +| `_ZN7WebCore16VisibleSelectionC1ERKNS_15VisiblePositionES3_b` | `SUrt1mgUxNI` | +| `_ZN7WebCore16VisibleSelectionC1ERKNS_15VisiblePositionEb` | `UB3xm2ZyJl8` | +| `_ZN7WebCore16VisibleSelectionC1Ev` | `M2dlUKAGMNM` | +| `_ZN7WebCore16VisibleSelectionC2ERKNS_15VisiblePositionES3_b` | `iHVPBLE8qV4` | +| `_ZN7WebCore16VisibleSelectionC2ERKNS_15VisiblePositionEb` | `MfbsiQU271E` | +| `_ZN7WebCore16VisibleSelectionC2Ev` | `erxK6j2uncY` | +| `_ZN7WebCore16VisitedLinkStore23invalidateStylesForLinkEj` | `v1nFz9ePsQk` | +| `_ZN7WebCore16VisitedLinkStore27invalidateStylesForAllLinksEv` | `5xXdtHf+CbU` | +| `_ZN7WebCore16VisitedLinkStoreC2Ev` | `iIeJWwhbaG0` | +| `_ZN7WebCore16VisitedLinkStoreD0Ev` | `mqQ1TbImxtg` | +| `_ZN7WebCore16VisitedLinkStoreD1Ev` | `vhOKW8oKZwc` | +| `_ZN7WebCore16VisitedLinkStoreD2Ev` | `qYUBbnO9I4Q` | +| `_ZN7WebCore16convertToIntegerIaEET_RN3JSC14JSGlobalObjectENS2_7JSValueE` | `Qv+UvXhcDjE` | +| `_ZN7WebCore16convertToIntegerIhEET_RN3JSC14JSGlobalObjectENS2_7JSValueE` | `uF0tF9gRZvw` | +| `_ZN7WebCore16convertToIntegerIiEET_RN3JSC14JSGlobalObjectENS2_7JSValueE` | `xaC6Jbw2pLg` | +| `_ZN7WebCore16convertToIntegerIjEET_RN3JSC14JSGlobalObjectENS2_7JSValueE` | `hmy0JczT6YA` | +| `_ZN7WebCore16convertToIntegerIlEET_RN3JSC14JSGlobalObjectENS2_7JSValueE` | `cijiMJ14LBI` | +| `_ZN7WebCore16convertToIntegerImEET_RN3JSC14JSGlobalObjectENS2_7JSValueE` | `PRi-5flaksc` | +| `_ZN7WebCore16convertToIntegerIsEET_RN3JSC14JSGlobalObjectENS2_7JSValueE` | `41XIke70jMw` | +| `_ZN7WebCore16convertToIntegerItEET_RN3JSC14JSGlobalObjectENS2_7JSValueE` | `QslKfV15MYY` | +| `_ZN7WebCore16enclosingIntRectERKNS_10LayoutRectE` | `aZ1gCm7lYhU` | +| `_ZN7WebCore16enclosingIntRectERKNS_9FloatRectE` | `VFvo8Ldr2iw` | +| `_ZN7WebCore16findIntersectionERKNS_10FloatPointES2_S2_S2_RS0_` | `SE+sQrvs7vQ` | +| `_ZN7WebCore16isEndOfParagraphERKNS_15VisiblePositionENS_27EditingBoundaryCrossingRuleE` | `tVGIPxZgQr4` | +| `_ZN7WebCore16nextWordPositionERKNS_15VisiblePositionE` | `1NgqWZM7bts` | +| `_ZN7WebCore16parseHTMLIntegerEN3WTF10StringViewE` | `yK8R9Noa6Yg` | +| `_ZN7WebCore16startOfParagraphERKNS_15VisiblePositionENS_27EditingBoundaryCrossingRuleE` | `gbcpFiojSAk` | +| `_ZN7WebCore16valueToUSVStringERN3JSC14JSGlobalObjectENS0_7JSValueE` | `YKRSVD5BhhU` | +| `_ZN7WebCore17CharacterIterator7advanceEi` | `ssOYh2vfiQs` | +| `_ZN7WebCore17CredentialStorage16clearCredentialsEv` | `SGAQzmDIoqQ` | +| `_ZN7WebCore17CredentialStorage24getFromPersistentStorageERKNS_15ProtectionSpaceE` | `7-2glF9P8AI` | +| `_ZN7WebCore17CredentialStorage27removeCredentialsWithOriginERKNS_18SecurityOriginDataE` | `eADv5sPWzgY` | +| `_ZN7WebCore17CredentialStorage3getERKN3WTF6StringERKNS1_3URLE` | `V+gyrfRGzm4` | +| `_ZN7WebCore17CredentialStorage3getERKN3WTF6StringERKNS_15ProtectionSpaceE` | `lsUORZxXYDQ` | +| `_ZN7WebCore17CredentialStorage3setERKN3WTF6StringERKNS_10CredentialERKNS1_3URLE` | `5MOUT7xkwgU` | +| `_ZN7WebCore17CredentialStorage3setERKN3WTF6StringERKNS_10CredentialERKNS_15ProtectionSpaceERKNS1_3URLE` | `hqvhdICEeSk` | +| `_ZN7WebCore17CredentialStorage6removeERKN3WTF6StringERKNS_15ProtectionSpaceE` | `h74WDkmnaDY` | +| `_ZN7WebCore17DOMImplementation19createCSSStyleSheetERKN3WTF6StringES4_` | `un-D0PsVeKI` | +| `_ZN7WebCore17DebugPageOverlays15settingsChangedERNS_4PageE` | `V-zyId3-sG0` | +| `_ZN7WebCore17FullscreenManager16cancelFullscreenEv` | `ylUF8H4Wsu4` | +| `_ZN7WebCore17FullscreenManager17didExitFullscreenEv` | `GwpODXE2OFk` | +| `_ZN7WebCore17FullscreenManager18didEnterFullscreenEv` | `y8zF9ff5Vfo` | +| `_ZN7WebCore17FullscreenManager18willExitFullscreenEv` | `uLMT97BG-mM` | +| `_ZN7WebCore17FullscreenManager19willEnterFullscreenERNS_7ElementE` | `akU0JKo9--s` | +| `_ZN7WebCore17FullscreenManager22setAnimatingFullscreenEb` | `0QP4K+xAQ6U` | +| `_ZN7WebCore17FullscreenManager27setFullscreenControlsHiddenEb` | `tEz9h727kzw` | +| `_ZN7WebCore17HTMLAnchorElement4textEv` | `c6d0lcEF-j4` | +| `_ZN7WebCore17HTMLAnchorElement7relListEv` | `iOK0zwqr4Io` | +| `_ZN7WebCore17HTMLButtonElement7setTypeERKN3WTF10AtomStringE` | `0-r7qGk8u00` | +| `_ZN7WebCore17HTMLCanvasElement25setUsesDisplayListDrawingEb` | `TRjT6D-Pt2o` | +| `_ZN7WebCore17HTMLCanvasElement8setWidthEj` | `BVPFezY-v1c` | +| `_ZN7WebCore17HTMLCanvasElement9setHeightEj` | `LD+cqdwBSWM` | +| `_ZN7WebCore17HTMLCanvasElement9toDataURLERKN3WTF6StringEN3JSC7JSValueE` | `KnIv2Ehxegc` | +| `_ZN7WebCore17HTMLCanvasElement9toDataURLERKN3WTF6StringE` | `uTL5h-iE3u0` | +| `_ZN7WebCore17HTMLOptionElement11setSelectedEb` | `mARrHQ6vFV8` | +| `_ZN7WebCore17HTMLPlugInElement14setReplacementENS_20RenderEmbeddedObject26PluginUnavailabilityReasonERKN3WTF6StringE` | `Yk0XZtys6xw` | +| `_ZN7WebCore17HTMLPlugInElement21isReplacementObscuredEv` | `18+ldEmxB6w` | +| `_ZN7WebCore17HTMLScriptElement14setCrossOriginERKN3WTF10AtomStringE` | `gcU8xigyavI` | +| `_ZN7WebCore17HTMLScriptElement8setAsyncEb` | `6FhHfJM+cC8` | +| `_ZN7WebCore17HTMLSelectElement16setSelectedIndexEi` | `-iCEEHuKDcU` | +| `_ZN7WebCore17HTMLSelectElement20optionSelectedByUserEibb` | `zlC2eo7bXAs` | +| `_ZN7WebCore17HTMLSelectElement4itemEj` | `WMUF6eteYNA` | +| `_ZN7WebCore17HTMLSelectElement6removeEi` | `Dg6MPQ7C2Vc` | +| `_ZN7WebCore17HTMLSelectElement7optionsEv` | `sNB-wBpi-uM` | +| `_ZN7WebCore17HTMLSelectElement7setSizeEj` | `rLUW3fPPXvg` | +| `_ZN7WebCore17HTMLSelectElement8setValueERKN3WTF6StringE` | `RSAX7ffj4kM` | +| `_ZN7WebCore17HTMLSelectElement9namedItemERKN3WTF10AtomStringE` | `JkQGVHdk9iQ` | +| `_ZN7WebCore17JSDOMGlobalObject12globalObjectEv` | `+xYBFG96wpU` | +| `_ZN7WebCore17JSDOMGlobalObject14finishCreationERN3JSC2VMEPNS1_8JSObjectE` | `KW5c3L4opsQ` | +| `_ZN7WebCore17JSDOMGlobalObject14finishCreationERN3JSC2VME` | `ToTgULkheEM` | +| `_ZN7WebCore17JSDOMGlobalObject15createStructureERN3JSC2VMENS1_7JSValueE` | `mFkAY973pGc` | +| `_ZN7WebCore17JSDOMGlobalObject17addBuiltinGlobalsERN3JSC2VME` | `2Z89SocEqmo` | +| `_ZN7WebCore17JSDOMGlobalObject21offsetOfWorldIsNormalEv` | `2ApsCsIuALw` | +| `_ZN7WebCore17JSDOMGlobalObject24builtinInternalFunctionsEv` | `8of6l1u8E4U` | +| `_ZN7WebCore17JSDOMGlobalObject4infoEv` | `Ry2Bjw-gItY` | +| `_ZN7WebCore17JSDOMGlobalObject5worldEv` | `19bXLmSr5Pg` | +| `_ZN7WebCore17JSDOMGlobalObject6gcLockEv` | `pI4UL7r2y-U` | +| `_ZN7WebCore17JSDOMGlobalObjectD1Ev` | `daYJeqtKNh8` | +| `_ZN7WebCore17JSDOMGlobalObjectD2Ev` | `Z6ibdQrVdRQ` | +| `_ZN7WebCore17JSDOMRectReadOnly14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `Us6vIm-5258` | +| `_ZN7WebCore17JSDOMRectReadOnly15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `j7Evw9-OEfo` | +| `_ZN7WebCore17JSDOMRectReadOnly15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `maW5cbhbYTY` | +| `_ZN7WebCore17JSDOMRectReadOnly15subspaceForImplERN3JSC2VME` | `TUnAHZhIAO4` | +| `_ZN7WebCore17JSDOMRectReadOnly4infoEv` | `FljuSdm2Iek` | +| `_ZN7WebCore17JSDOMRectReadOnly9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `WXKRNJq2jbY` | +| `_ZN7WebCore17JSDOMRectReadOnly9toWrappedERN3JSC2VMENS1_7JSValueE` | `N+2oRHGeT0E` | +| `_ZN7WebCore17JSDOMRectReadOnlyC1ERKS0_` | `KW5JnX-5g-M` | +| `_ZN7WebCore17JSDOMRectReadOnlyC2ERKS0_` | `pX-zIvHeGYI` | +| `_ZN7WebCore17JSDOMRectReadOnlyD1Ev` | `QQlaRvQNenY` | +| `_ZN7WebCore17JSDOMRectReadOnlyD2Ev` | `ueiLds63ryU` | +| `_ZN7WebCore17JSDOMRectReadOnlyaSERKS0_` | `8dhjNuhwRhE` | +| `_ZN7WebCore17JSHTMLLinkElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `SjUR30z0mo4` | +| `_ZN7WebCore17JSHTMLLinkElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `AWWg03aji6s` | +| `_ZN7WebCore17JSHTMLLinkElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `xH+Wozh5WZY` | +| `_ZN7WebCore17JSHTMLLinkElement15subspaceForImplERN3JSC2VME` | `0jXh4mvLVZw` | +| `_ZN7WebCore17JSHTMLLinkElement4infoEv` | `uJiGR0cme+g` | +| `_ZN7WebCore17JSHTMLLinkElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `MVgF-65FS5Y` | +| `_ZN7WebCore17JSHTMLLinkElement9toWrappedERN3JSC2VMENS1_7JSValueE` | `rwcYBorkaIo` | +| `_ZN7WebCore17JSHTMLLinkElementC1ERKS0_` | `tft0vpf8GIs` | +| `_ZN7WebCore17JSHTMLLinkElementC2ERKS0_` | `bd-3fcfIMCk` | +| `_ZN7WebCore17JSHTMLLinkElementD1Ev` | `Pph0Anbgy3w` | +| `_ZN7WebCore17JSHTMLLinkElementD2Ev` | `D32g7jPlu4E` | +| `_ZN7WebCore17JSXPathExpression9toWrappedERN3JSC2VMENS1_7JSValueE` | `qXUXM3P1VlM` | +| `_ZN7WebCore17LinkIconCollector12iconsOfTypesEN3WTF9OptionSetINS_12LinkIconTypeEEE` | `5kng5eAMagw` | +| `_ZN7WebCore17MouseRelatedEvent7offsetXEv` | `OvVp7GMRnMI` | +| `_ZN7WebCore17MouseRelatedEvent7offsetYEv` | `5BOCgzM-dGE` | +| `_ZN7WebCore17NowPlayingManagerC1Ev` | `mhk9cFFoeho` | +| `_ZN7WebCore17NowPlayingManagerC2Ev` | `kfYgv5hOs2w` | +| `_ZN7WebCore17NowPlayingManagerD0Ev` | `N+JkZ-EmyFQ` | +| `_ZN7WebCore17NowPlayingManagerD1Ev` | `xQnFpj+cG5I` | +| `_ZN7WebCore17NowPlayingManagerD2Ev` | `kiEcKeRXOsI` | +| `_ZN7WebCore17NowPlayingManagerdaEPv` | `FmCpUwzsqqo` | +| `_ZN7WebCore17NowPlayingManagerdlEPv` | `Kd0LYm4o0I0` | +| `_ZN7WebCore17NowPlayingManagernaEmPv` | `4KcC+IEgQ48` | +| `_ZN7WebCore17NowPlayingManagernwEm` | `E5bewLdZ0JA` | +| `_ZN7WebCore17NowPlayingManagernwEmPv` | `vZctofy+yiU` | +| `_ZN7WebCore17PageConfigurationD1Ev` | `qKZxQYEA7lk` | +| `_ZN7WebCore17PageConsoleClient10addMessageEN3JSC13MessageSourceENS1_12MessageLevelERKN3WTF6StringEmPNS_8DocumentE` | `ClKv7yGVu6s` | +| `_ZN7WebCore17PageConsoleClient10countResetEPN3JSC14JSGlobalObjectERKN3WTF6StringE` | `lvw1tvNIyoU` | +| `_ZN7WebCore17PageConsoleClient10profileEndEPN3JSC14JSGlobalObjectERKN3WTF6StringE` | `WCMjIvYqQl8` | +| `_ZN7WebCore17PageConsoleClient16takeHeapSnapshotEPN3JSC14JSGlobalObjectERKN3WTF6StringE` | `8WH4Pm72J5A` | +| `_ZN7WebCore17PageConsoleClient21shouldPrintExceptionsEv` | `rbRlgPbLAMY` | +| `_ZN7WebCore17PageConsoleClient24setShouldPrintExceptionsEb` | `3A1eJRAF6Ic` | +| `_ZN7WebCore17PageConsoleClient4muteEv` | `iq7Iszogzis` | +| `_ZN7WebCore17PageConsoleClient4timeEPN3JSC14JSGlobalObjectERKN3WTF6StringE` | `A-ZO370RoSA` | +| `_ZN7WebCore17PageConsoleClient5countEPN3JSC14JSGlobalObjectERKN3WTF6StringE` | `n-tHH4IKZFM` | +| `_ZN7WebCore17PageConsoleClient6unmuteEv` | `oFBSUGIKTvs` | +| `_ZN7WebCore17PageConsoleClient7profileEPN3JSC14JSGlobalObjectERKN3WTF6StringE` | `mZCIdRQX2zM` | +| `_ZN7WebCore17PageConsoleClient7timeEndEPN3JSC14JSGlobalObjectERKN3WTF6StringE` | `GKpz0qjwEIY` | +| `_ZN7WebCore17PageConsoleClientC1ERNS_4PageE` | `5iPoUxHRg1U` | +| `_ZN7WebCore17PageConsoleClientC2ERNS_4PageE` | `lPSu56iEcdA` | +| `_ZN7WebCore17PageConsoleClientD0Ev` | `1VG+T070SBU` | +| `_ZN7WebCore17PageConsoleClientD1Ev` | `EnOKtxgFjSU` | +| `_ZN7WebCore17PageConsoleClientD2Ev` | `qMavPJYZ3cE` | +| `_ZN7WebCore17PageConsoleClientdaEPv` | `YCqM6M4hxG4` | +| `_ZN7WebCore17PageConsoleClientdlEPv` | `dmCVOjcaQq0` | +| `_ZN7WebCore17PageConsoleClientnaEmPv` | `Q1xklO-HjOQ` | +| `_ZN7WebCore17PageConsoleClientnaEm` | `Q0Wxk8nDIew` | +| `_ZN7WebCore17PageConsoleClientnwEm10NotNullTagPv` | `hmLXa6ptcdU` | +| `_ZN7WebCore17PageConsoleClientnwEmPv` | `FriXzburZN8` | +| `_ZN7WebCore17PageConsoleClientnwEm` | `Vj9yHRW-BTE` | +| `_ZN7WebCore17ResourceErrorBase7setTypeENS0_4TypeE` | `O9YsW44maCs` | +| `_ZN7WebCore17SQLiteTransaction5beginEv` | `KfpqmLwti6U` | +| `_ZN7WebCore17SQLiteTransaction6commitEv` | `qpSe9uajx7c` | +| `_ZN7WebCore17SQLiteTransaction8rollbackEv` | `cM1AOABqE-Y` | +| `_ZN7WebCore17SQLiteTransactionC1ERNS_14SQLiteDatabaseEb` | `2yorpzmHA-w` | +| `_ZN7WebCore17SQLiteTransactionC2ERNS_14SQLiteDatabaseEb` | `81MD+QADYBA` | +| `_ZN7WebCore17SQLiteTransactionD1Ev` | `r-3VcPGTSfs` | +| `_ZN7WebCore17SQLiteTransactionD2Ev` | `Myvbbodp9dU` | +| `_ZN7WebCore17TextureMapperTile5paintERNS_13TextureMapperERKNS_20TransformationMatrixEfj` | `nC34ZWPrJk8` | +| `_ZN7WebCore17cacheDOMStructureERNS_17JSDOMGlobalObjectEPN3JSC9StructureEPKNS2_9ClassInfoE` | `WJkpnZkmw9Q` | +| `_ZN7WebCore17computeCurrentAgeERKNS_16ResourceResponseEN3WTF8WallTimeE` | `zFaau6WD5yo` | +| `_ZN7WebCore17cssValueKeywordIDEN3WTF10StringViewE` | `FyMm5OSA9Mw` | +| `_ZN7WebCore17isStartOfDocumentERKNS_15VisiblePositionE` | `YLTGftleg3Y` | +| `_ZN7WebCore17standardUserAgentERKN3WTF6StringES3_` | `Al3HAN0xvfw` | +| `_ZN7WebCore17valueToByteStringERN3JSC14JSGlobalObjectENS0_7JSValueE` | `wS5flYFv0H0` | +| `_ZN7WebCore18CustomHeaderFieldsC1ERKS0_` | `D7s7dVKRTtU` | +| `_ZN7WebCore18CustomHeaderFieldsC1Ev` | `WxG8d887NM8` | +| `_ZN7WebCore18CustomHeaderFieldsC2ERKS0_` | `9iAZcHT7FBg` | +| `_ZN7WebCore18CustomHeaderFieldsC2Ev` | `wQpMj4CVRs8` | +| `_ZN7WebCore18CustomHeaderFieldsD1Ev` | `hCNssVZANCU` | +| `_ZN7WebCore18CustomHeaderFieldsD2Ev` | `qQzi4cx9FYc` | +| `_ZN7WebCore18CustomHeaderFieldsaSERKS0_` | `eYCzCuWMibg` | +| `_ZN7WebCore18DOMWindowExtensionD0Ev` | `wTZgIXezihg` | +| `_ZN7WebCore18DOMWindowExtensionD1Ev` | `0xgWqLXrJYI` | +| `_ZN7WebCore18DOMWindowExtensionD2Ev` | `S8KDfwsVl+A` | +| `_ZN7WebCore18EventLoopTaskGroup14queueMicrotaskEON3WTF8FunctionIFvvEEE` | `rrmN7i-Wx-c` | +| `_ZN7WebCore18EventLoopTaskGroup9queueTaskENS_10TaskSourceEON3WTF8FunctionIFvvEEE` | `DAcbr5ogFno` | +| `_ZN7WebCore18HTMLMarqueeElement15setScrollAmountEj` | `I+-pHtw7CLo` | +| `_ZN7WebCore18HTMLMarqueeElement4stopEv` | `xJUQDRAno+Q` | +| `_ZN7WebCore18HTMLMarqueeElement5startEv` | `kLWG4PzbY7E` | +| `_ZN7WebCore18HTMLMarqueeElement7setLoopEi` | `9rU9t0IVmC8` | +| `_ZN7WebCore18ImageBufferBackend19sinkIntoNativeImageEv` | `Y2qIwrc5PnQ` | +| `_ZN7WebCore18ImageBufferBackend22convertToLuminanceMaskEv` | `ZcXGHz0Se7k` | +| `_ZN7WebCore18ImageBufferBackendD0Ev` | `suczT1Sa7kc` | +| `_ZN7WebCore18ImageBufferBackendD1Ev` | `pfBItkEwD0U` | +| `_ZN7WebCore18ImageBufferBackendD2Ev` | `LwfoWagdxPw` | +| `_ZN7WebCore18InspectorPageAgent7frameIdEPNS_5FrameE` | `Flv4OG+-cjQ` | +| `_ZN7WebCore18JSHTMLImageElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `fKMBLdIP74k` | +| `_ZN7WebCore18JSHTMLImageElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `HhyDCyUZAGE` | +| `_ZN7WebCore18JSHTMLImageElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `5GXbIFVAO5E` | +| `_ZN7WebCore18JSHTMLImageElement15subspaceForImplERN3JSC2VME` | `t65Y1ezjxZg` | +| `_ZN7WebCore18JSHTMLImageElement4infoEv` | `nP1iDzJb4mE` | +| `_ZN7WebCore18JSHTMLImageElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `Yav2yCjCam8` | +| `_ZN7WebCore18JSHTMLImageElement9toWrappedERN3JSC2VMENS1_7JSValueE` | `nj8P0Y1JToE` | +| `_ZN7WebCore18JSHTMLImageElementC1ERKS0_` | `Obg5jzvJ3Po` | +| `_ZN7WebCore18JSHTMLImageElementC2ERKS0_` | `l-NrXOC-Z4o` | +| `_ZN7WebCore18JSHTMLImageElementD1Ev` | `MSRPfRgj8d4` | +| `_ZN7WebCore18JSHTMLImageElementD2Ev` | `P-X-pyb+DqQ` | +| `_ZN7WebCore18JSHTMLInputElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `wcZfH4Ik-EY` | +| `_ZN7WebCore18JSHTMLInputElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `uFDGJA7FHNU` | +| `_ZN7WebCore18JSHTMLInputElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `U5Mg10Dz2ec` | +| `_ZN7WebCore18JSHTMLInputElement15subspaceForImplERN3JSC2VME` | `2k0lZXN7wYo` | +| `_ZN7WebCore18JSHTMLInputElement4infoEv` | `nd29CKcg4Kk` | +| `_ZN7WebCore18JSHTMLInputElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `-UrE3veEVz8` | +| `_ZN7WebCore18JSHTMLInputElement9toWrappedERN3JSC2VMENS1_7JSValueE` | `1J6Ix6mepsw` | +| `_ZN7WebCore18JSHTMLInputElementC1ERKS0_` | `mDE8dam-vJw` | +| `_ZN7WebCore18JSHTMLInputElementD1Ev` | `3Qhb7xN3SlY` | +| `_ZN7WebCore18JSHTMLInputElementD2Ev` | `ruaWrFPIjFw` | +| `_ZN7WebCore18JSHTMLMediaElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `6SckwBNQpR4` | +| `_ZN7WebCore18JSHTMLMediaElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `NrOueQY3scw` | +| `_ZN7WebCore18JSHTMLMediaElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `3zLyTNiXgXc` | +| `_ZN7WebCore18JSHTMLMediaElement15subspaceForImplERN3JSC2VME` | `pDmpH6oM4dM` | +| `_ZN7WebCore18JSHTMLMediaElement4infoEv` | `TsFjKDXSAEI` | +| `_ZN7WebCore18JSHTMLMediaElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `pkvTLVJ+Crs` | +| `_ZN7WebCore18JSHTMLMediaElement9toWrappedERN3JSC2VMENS1_7JSValueE` | `oy8+lROvWc8` | +| `_ZN7WebCore18JSHTMLMediaElementC1ERKS0_` | `TXSNtR-LjE4` | +| `_ZN7WebCore18JSHTMLMediaElementC2ERKS0_` | `Ve-npIABD0g` | +| `_ZN7WebCore18JSHTMLMediaElementD1Ev` | `Irg3UX8TFzM` | +| `_ZN7WebCore18JSHTMLMediaElementD2Ev` | `t9T3rqRsy40` | +| `_ZN7WebCore18JSHTMLVideoElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `Ni79apw1wDg` | +| `_ZN7WebCore18JSHTMLVideoElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `1HQ20rRMmb4` | +| `_ZN7WebCore18JSHTMLVideoElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `J-rh9f-5jPY` | +| `_ZN7WebCore18JSHTMLVideoElement15subspaceForImplERN3JSC2VME` | `VbEKRLldQiM` | +| `_ZN7WebCore18JSHTMLVideoElement4infoEv` | `XowhukYxBhY` | +| `_ZN7WebCore18JSHTMLVideoElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `MPlv0h7F8XU` | +| `_ZN7WebCore18JSHTMLVideoElement9toWrappedERN3JSC2VMENS1_7JSValueE` | `N8PebyNzMzk` | +| `_ZN7WebCore18JSHTMLVideoElementC1ERKS0_` | `XAF7SiZDFto` | +| `_ZN7WebCore18JSHTMLVideoElementC2ERKS0_` | `TGyF9uiUGQY` | +| `_ZN7WebCore18JSHTMLVideoElementD1Ev` | `lA9AH3d2f18` | +| `_ZN7WebCore18JSHTMLVideoElementD2Ev` | `7RoTnYEHEFw` | +| `_ZN7WebCore18ParsedContentRangeC1ERKN3WTF6StringE` | `NjxgeprW2uw` | +| `_ZN7WebCore18ParsedContentRangeC1Elll` | `T48ikVhJ2eM` | +| `_ZN7WebCore18ParsedContentRangeC2ERKN3WTF6StringE` | `9+iSQViDda8` | +| `_ZN7WebCore18ParsedContentRangeC2Elll` | `zcyv1BcVoYc` | +| `_ZN7WebCore18PerformanceLogging21memoryUsageStatisticsENS_34ShouldIncludeExpensiveComputationsE` | `Twv2J+xbqTg` | +| `_ZN7WebCore18PerformanceLogging22javaScriptObjectCountsEv` | `K0sTKrYVnmk` | +| `_ZN7WebCore18PlatformPasteboard5writeERKN3WTF6StringES4_` | `smwyQcAh3tk` | +| `_ZN7WebCore18PlatformPasteboard5writeERKN3WTF6VectorINS_20PasteboardCustomDataELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE` | `C6lWET8ErOA` | +| `_ZN7WebCore18PlatformPasteboard5writeERKNS_20PasteboardCustomDataE` | `x6LF3hMLGPA` | +| `_ZN7WebCore18PlatformPasteboard5writeERKNS_20PasteboardWebContentE` | `aMH6eRoQoDA` | +| `_ZN7WebCore18PlatformPasteboardC1ERKN3WTF6StringE` | `Khws8dt04Sk` | +| `_ZN7WebCore18PlatformPasteboardC1Ev` | `knX2cGAmdW8` | +| `_ZN7WebCore18PlatformPasteboardC2ERKN3WTF6StringE` | `HjhPNUX3UO8` | +| `_ZN7WebCore18PlatformPasteboardC2Ev` | `kxvsg8MG-r8` | +| `_ZN7WebCore18PlatformTimeRanges13intersectWithERKS0_` | `FOX5cdgzoRA` | +| `_ZN7WebCore18PlatformTimeRanges3addERKN3WTF9MediaTimeES4_` | `adCAikkTibw` | +| `_ZN7WebCore18PlatformTimeRanges5clearEv` | `8-bkqei4PMY` | +| `_ZN7WebCore18PlatformTimeRanges6invertEv` | `mj8JPPMIzYQ` | +| `_ZN7WebCore18PlatformTimeRanges9unionWithERKS0_` | `IrAYtHdJ2HA` | +| `_ZN7WebCore18PlatformTimeRangesC1EON3WTF6VectorINS0_5RangeELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE` | `6iAhwmHrW1g` | +| `_ZN7WebCore18PlatformTimeRangesC1ERKN3WTF9MediaTimeES4_` | `CBMBWsSrlq8` | +| `_ZN7WebCore18PlatformTimeRangesC1ERKS0_` | `wQgEa1jmctg` | +| `_ZN7WebCore18PlatformTimeRangesC1Ev` | `cL58Z6yRYDk` | +| `_ZN7WebCore18PlatformTimeRangesC2EON3WTF6VectorINS0_5RangeELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE` | `owVFGNaLz6g` | +| `_ZN7WebCore18PlatformTimeRangesC2ERKN3WTF9MediaTimeES4_` | `Xt2cS8a6Xj4` | +| `_ZN7WebCore18PlatformTimeRangesC2ERKS0_` | `8CZkNnI1+r8` | +| `_ZN7WebCore18PlatformTimeRangesC2Ev` | `G-6N-vLNZ10` | +| `_ZN7WebCore18PlatformTimeRangesD1Ev` | `Bzvv4mzBISM` | +| `_ZN7WebCore18PlatformTimeRangesD2Ev` | `PcT-A0bz7N8` | +| `_ZN7WebCore18PlatformTimeRangesaSERKS0_` | `mOJJLx3R04I` | +| `_ZN7WebCore18PlatformTimeRangesdaEPv` | `oIsFI2cGbqA` | +| `_ZN7WebCore18PlatformTimeRangesdlEPv` | `RLrOsXrQe58` | +| `_ZN7WebCore18PlatformTimeRangesnaEmPv` | `yAx+ucBv8Ks` | +| `_ZN7WebCore18PlatformTimeRangesnwEm10NotNullTagPv` | `EO7L0IQDZlE` | +| `_ZN7WebCore18PlatformTimeRangesnwEm` | `7NL6s-ybpfg` | +| `_ZN7WebCore18PlatformTimeRangesnwEmPv` | `vuNSwp-c4Aw` | +| `_ZN7WebCore18PluginInfoProvider10removePageERNS_4PageE` | `YcA1SgtiPb4` | +| `_ZN7WebCore18PluginInfoProvider20clearPagesPluginDataEv` | `hSNXnh4fS6w` | +| `_ZN7WebCore18PluginInfoProvider7addPageERNS_4PageE` | `soxJ6tUOKC0` | +| `_ZN7WebCore18PluginInfoProvider7refreshEb` | `xYWiGBLHydA` | +| `_ZN7WebCore18PluginInfoProviderC2Ev` | `1XvItBGOHII` | +| `_ZN7WebCore18PluginInfoProviderD0Ev` | `umRPVA-p9k4` | +| `_ZN7WebCore18PluginInfoProviderD1Ev` | `ocIKEffh7po` | +| `_ZN7WebCore18PluginInfoProviderD2Ev` | `w-M4Kng47xs` | +| `_ZN7WebCore18PrewarmInformationC1ERKS0_` | `TWMdmWZVXVo` | +| `_ZN7WebCore18PrewarmInformationC1Ev` | `qfwf0ujsr-w` | +| `_ZN7WebCore18PrewarmInformationC2ERKS0_` | `Tg0xDBpwAJI` | +| `_ZN7WebCore18PrewarmInformationC2Ev` | `bYI-b31XduA` | +| `_ZN7WebCore18PrewarmInformationD1Ev` | `S+OTMjuF3sk` | +| `_ZN7WebCore18PrewarmInformationD2Ev` | `I2IwTiwoWkQ` | +| `_ZN7WebCore18PrewarmInformationaSERKS0_` | `NvVqG8w2D7c` | +| `_ZN7WebCore18PrewarmInformationdaEPv` | `vDt7lFXpdvc` | +| `_ZN7WebCore18PrewarmInformationdlEPv` | `TLJjJYmivbA` | +| `_ZN7WebCore18PrewarmInformationnaEm` | `jAQVKoDldcU` | +| `_ZN7WebCore18PrewarmInformationnwEmPv` | `2VD2Ej+58XY` | +| `_ZN7WebCore18PrewarmInformationnwEm` | `VZRzMxjltTE` | +| `_ZN7WebCore18RenderLayerBacking25setUsesDisplayListDrawingEb` | `J7WxT-sXnz0` | +| `_ZN7WebCore18RenderLayerBacking30setIsTrackingDisplayListReplayEb` | `EhRJ-yl2m9E` | +| `_ZN7WebCore18StyleSheetContents11parseStringERKN3WTF6StringE` | `UeYdo-L+tuA` | +| `_ZN7WebCore18StyleSheetContentsC1EPNS_15StyleRuleImportERKN3WTF6StringERKNS_16CSSParserContextE` | `BGjQVtu-vTo` | +| `_ZN7WebCore18StyleSheetContentsC2EPNS_15StyleRuleImportERKN3WTF6StringERKNS_16CSSParserContextE` | `0+6f5xRnrB0` | +| `_ZN7WebCore18StyleSheetContentsD1Ev` | `TgyMj2hXBZ4` | +| `_ZN7WebCore18StyleSheetContentsD2Ev` | `9z38jdn1Yxw` | +| `_ZN7WebCore18TextureMapperLayer10setFiltersERKNS_16FilterOperationsE` | `Szp04yaBKyM` | +| `_ZN7WebCore18TextureMapperLayer10setOpacityEf` | `yn2JoBJXOik` | +| `_ZN7WebCore18TextureMapperLayer11setChildrenERKN3WTF6VectorIPS0_Lm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE` | `Bh7kyHndjrU` | +| `_ZN7WebCore18TextureMapperLayer11setPositionERKNS_10FloatPointE` | `z9VhBzk67Yw` | +| `_ZN7WebCore18TextureMapperLayer12setMaskLayerEPS0_` | `Se3TVBPK02E` | +| `_ZN7WebCore18TextureMapperLayer12setTransformERKNS_20TransformationMatrixE` | `ETBRnmr8FCA` | +| `_ZN7WebCore18TextureMapperLayer12sortByZOrderERN3WTF6VectorIPS0_Lm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE` | `jt+emrF-LlA` | +| `_ZN7WebCore18TextureMapperLayer13setAnimationsERKN7Nicosia10AnimationsE` | `zdX1bs4u4m0` | +| `_ZN7WebCore18TextureMapperLayer13setSolidColorERKNS_5ColorE` | `9aG1Y+TwE4k` | +| `_ZN7WebCore18TextureMapperLayer14setAnchorPointERKNS_12FloatPoint3DE` | `490GyRIQAu0` | +| `_ZN7WebCore18TextureMapperLayer14setPreserves3DEb` | `s7YLdo2-V3E` | +| `_ZN7WebCore18TextureMapperLayer14syncAnimationsEN3WTF13MonotonicTimeE` | `0W9b8BHz5k8` | +| `_ZN7WebCore18TextureMapperLayer15setBackingStoreEPNS_25TextureMapperBackingStoreE` | `nqR3CLMiJoM` | +| `_ZN7WebCore18TextureMapperLayer15setContentsRectERKNS_9FloatRectE` | `iaaAR8GaGaU` | +| `_ZN7WebCore18TextureMapperLayer15setDebugVisualsEbRKNS_5ColorEf` | `jMFGWezg5Sc` | +| `_ZN7WebCore18TextureMapperLayer15setDrawsContentEb` | `hP0LBvbf3IY` | +| `_ZN7WebCore18TextureMapperLayer15setReplicaLayerEPS0_` | `tsV6KkeyJEE` | +| `_ZN7WebCore18TextureMapperLayer16removeFromParentEv` | `lR6b+yl6u3c` | +| `_ZN7WebCore18TextureMapperLayer16replicaTransformEv` | `xXZXZyGw65E` | +| `_ZN7WebCore18TextureMapperLayer16setBackdropLayerEPS0_` | `xZposkLLevs` | +| `_ZN7WebCore18TextureMapperLayer16setContentsLayerEPNS_26TextureMapperPlatformLayerE` | `GtdVS0krX2M` | +| `_ZN7WebCore18TextureMapperLayer16setMasksToBoundsEb` | `Kky+pXcoHFY` | +| `_ZN7WebCore18TextureMapperLayer17removeAllChildrenEv` | `kozdUl5szDE` | +| `_ZN7WebCore18TextureMapperLayer17setContentsOpaqueEb` | `3MoxakHN9Eg` | +| `_ZN7WebCore18TextureMapperLayer17setRepaintCounterEbi` | `1RO3nBwi2W4` | +| `_ZN7WebCore18TextureMapperLayer18setContentsVisibleEb` | `4YzcZ4koEWo` | +| `_ZN7WebCore18TextureMapperLayer19setContentsTileSizeERKNS_9FloatSizeE` | `AO0LHG1yvPw` | +| `_ZN7WebCore18TextureMapperLayer20setChildrenTransformERKNS_20TransformationMatrixE` | `K7YUr62EN+E` | +| `_ZN7WebCore18TextureMapperLayer20setContentsTilePhaseERKNS_9FloatSizeE` | `rvjIztKWq64` | +| `_ZN7WebCore18TextureMapperLayer21setBackfaceVisibilityEb` | `wvS9v2o0piQ` | +| `_ZN7WebCore18TextureMapperLayer23setContentsClippingRectERKNS_16FloatRoundedRectE` | `VrIbNi47c+o` | +| `_ZN7WebCore18TextureMapperLayer26applyAnimationsRecursivelyEN3WTF13MonotonicTimeE` | `DGrij8GoG00` | +| `_ZN7WebCore18TextureMapperLayer29setAnimatedBackingStoreClientEPN7Nicosia26AnimatedBackingStoreClientE` | `6eNHqStx1U0` | +| `_ZN7WebCore18TextureMapperLayer2idEv` | `xetF04gznxY` | +| `_ZN7WebCore18TextureMapperLayer5setIDEj` | `kS92Nwfsyrg` | +| `_ZN7WebCore18TextureMapperLayer7setSizeERKNS_9FloatSizeE` | `uD5cnILClQk` | +| `_ZN7WebCore18TextureMapperLayer8addChildEPS0_` | `cO7RaIjn428` | +| `_ZN7WebCore18TextureMapperLayerC1Ev` | `cUKI3HHyPbA` | +| `_ZN7WebCore18TextureMapperLayerC2Ev` | `BSKR+tn0yyU` | +| `_ZN7WebCore18TextureMapperLayerD0Ev` | `kONYtx9Wm-w` | +| `_ZN7WebCore18TextureMapperLayerD1Ev` | `8FZB4rMZL7A` | +| `_ZN7WebCore18TextureMapperLayerD2Ev` | `XJ4KxOknPSU` | +| `_ZN7WebCore18TextureMapperLayerdaEPv` | `x5CxXKVuMeU` | +| `_ZN7WebCore18TextureMapperLayerdlEPv` | `Ya2sPNPiw+o` | +| `_ZN7WebCore18TextureMapperLayernaEmPv` | `49W0007WCSc` | +| `_ZN7WebCore18TextureMapperLayernaEm` | `T0AEgFJcnzc` | +| `_ZN7WebCore18TextureMapperLayernwEm10NotNullTagPv` | `RRTxkkZOR88` | +| `_ZN7WebCore18TextureMapperLayernwEmPv` | `TtJ8lOeiQyU` | +| `_ZN7WebCore18TextureMapperLayernwEm` | `fzYRZqywpBk` | +| `_ZN7WebCore18composedTreeAsTextERNS_13ContainerNodeENS_22ComposedTreeAsTextModeE` | `jHaDBgiK3qo` | +| `_ZN7WebCore18documentTypeStringERKNS_8DocumentE` | `oXgkWQRuOzU` | +| `_ZN7WebCore18isEditablePositionERKNS_8PositionENS_12EditableTypeE` | `XoqhvWYzuvU` | +| `_ZN7WebCore18isStartOfParagraphERKNS_15VisiblePositionENS_27EditingBoundaryCrossingRuleE` | `Q0Ockqsjzp0` | +| `_ZN7WebCore18isValidContentTypeERKN3WTF6StringENS_4ModeE` | `ewE3P6Jh1n4` | +| `_ZN7WebCore18platformStrategiesEv` | `tBw4xNkm5xY` | +| `_ZN7WebCore18pluginScriptObjectEPN3JSC14JSGlobalObjectEPNS_13JSHTMLElementE` | `RbuBuPUm5-0` | +| `_ZN7WebCore18pluginTooSmallTextEv` | `ryA0BvjZKrY` | +| `_ZN7WebCore18throwThisTypeErrorERN3JSC14JSGlobalObjectERNS0_10ThrowScopeEPKcS6_` | `7mLDMf26EJ8` | +| `_ZN7WebCore19AccessibilityObject13isARIAControlENS_17AccessibilityRoleE` | `it74w78c9NI` | +| `_ZN7WebCore19AccessibilityObject21ariaRoleToWebCoreRoleERKN3WTF6StringE` | `Xp4D7IRIHE0` | +| `_ZN7WebCore19BlurFilterOperation6createENS_6LengthE` | `CdS6RU1tzh8` | +| `_ZN7WebCore19BlurFilterOperationC1ENS_6LengthE` | `Gssl8v-q4A4` | +| `_ZN7WebCore19BlurFilterOperationC2ENS_6LengthE` | `eKuGGkmzC4o` | +| `_ZN7WebCore19BlurFilterOperationD0Ev` | `nxREzUJ97nA` | +| `_ZN7WebCore19BlurFilterOperationD1Ev` | `xIz9VSusdWk` | +| `_ZN7WebCore19BlurFilterOperationD2Ev` | `JIo6KXGWql0` | +| `_ZN7WebCore19HTMLTableColElement7setSpanEj` | `M7zDhMX8ddM` | +| `_ZN7WebCore19HTMLTableRowElement10deleteCellEi` | `FeCbAqqYAJc` | +| `_ZN7WebCore19HTMLTableRowElement10insertCellEi` | `6puN-DdtP0s` | +| `_ZN7WebCore19HTMLTableRowElement5cellsEv` | `Zzl5LrYHPYI` | +| `_ZN7WebCore19HTMLTextAreaElement7setColsEj` | `EJl0Y6keGco` | +| `_ZN7WebCore19HTMLTextAreaElement7setRowsEj` | `c70Dvb+wW+Y` | +| `_ZN7WebCore19InspectorController13setIndicatingEb` | `XMyaaMt9knk` | +| `_ZN7WebCore19InspectorController15connectFrontendERN9Inspector15FrontendChannelEbb` | `4KNZgER6re0` | +| `_ZN7WebCore19InspectorController15ensurePageAgentEv` | `eCLWlA78Faw` | +| `_ZN7WebCore19InspectorController18disconnectFrontendERN9Inspector15FrontendChannelE` | `lhOLsQkhIos` | +| `_ZN7WebCore19InspectorController22disconnectAllFrontendsEv` | `KvozVIZh-kE` | +| `_ZN7WebCore19InspectorController25evaluateForTestInFrontendERKN3WTF6StringE` | `YqGRE0nOcNI` | +| `_ZN7WebCore19InspectorController26setInspectorFrontendClientEPNS_23InspectorFrontendClientE` | `IWP1omvGMT8` | +| `_ZN7WebCore19InspectorController27dispatchMessageFromFrontendERKN3WTF6StringE` | `frL0X70yzJo` | +| `_ZN7WebCore19InspectorController4showEv` | `BXbijPH89Sc` | +| `_ZN7WebCore19JSAnimationTimeline14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `obCLy8k+BB4` | +| `_ZN7WebCore19JSAnimationTimeline15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `8OuJzCvCV84` | +| `_ZN7WebCore19JSAnimationTimeline15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `gxdBUXqv5-4` | +| `_ZN7WebCore19JSAnimationTimeline15subspaceForImplERN3JSC2VME` | `ojc+hdwBaYw` | +| `_ZN7WebCore19JSAnimationTimeline4infoEv` | `3oV6cGFfxmk` | +| `_ZN7WebCore19JSAnimationTimeline9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `vuAHSJGCTmw` | +| `_ZN7WebCore19JSAnimationTimeline9toWrappedERN3JSC2VMENS1_7JSValueE` | `5rp0gDy116g` | +| `_ZN7WebCore19JSAnimationTimelineC1ERKS0_` | `A6xEYmcRiho` | +| `_ZN7WebCore19JSAnimationTimelineC2ERKS0_` | `sEgWSAmTMvc` | +| `_ZN7WebCore19JSAnimationTimelineD1Ev` | `xkLfem4ShVY` | +| `_ZN7WebCore19JSAnimationTimelineD2Ev` | `FxH74ylow+Q` | +| `_ZN7WebCore19JSAnimationTimelineaSERKS0_` | `1XgfJXwnZio` | +| `_ZN7WebCore19JSDOMImplementation9toWrappedERN3JSC2VMENS1_7JSValueE` | `NIH35yrD3TY` | +| `_ZN7WebCore19JSDOMMatrixReadOnly14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `3LBwhPy74PU` | +| `_ZN7WebCore19JSDOMMatrixReadOnly15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `KRiPNCiwQLA` | +| `_ZN7WebCore19JSDOMMatrixReadOnly15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `PqtGZPrM+h8` | +| `_ZN7WebCore19JSDOMMatrixReadOnly15subspaceForImplERN3JSC2VME` | `BnjBFMDiOAg` | +| `_ZN7WebCore19JSDOMMatrixReadOnly4infoEv` | `1XQEj7-jjXc` | +| `_ZN7WebCore19JSDOMMatrixReadOnly9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `7kbOG9Y7SXM` | +| `_ZN7WebCore19JSDOMMatrixReadOnly9toWrappedERN3JSC2VMENS1_7JSValueE` | `-+e9NvViaBc` | +| `_ZN7WebCore19JSDOMMatrixReadOnlyC1ERKS0_` | `Bm7i18g1Vaw` | +| `_ZN7WebCore19JSDOMMatrixReadOnlyC2ERKS0_` | `vHWd4Z92rhQ` | +| `_ZN7WebCore19JSDOMMatrixReadOnlyD1Ev` | `ds5oXoQw2HY` | +| `_ZN7WebCore19JSDOMMatrixReadOnlyD2Ev` | `dL7+b8hSxmk` | +| `_ZN7WebCore19JSDOMMatrixReadOnlyaSERKS0_` | `GFKGvgOqeMY` | +| `_ZN7WebCore19JSHTMLSelectElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `pDcP19rE8is` | +| `_ZN7WebCore19JSHTMLSelectElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `0gMTyY1aBcg` | +| `_ZN7WebCore19JSHTMLSelectElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `YPGwUQu5P9g` | +| `_ZN7WebCore19JSHTMLSelectElement15subspaceForImplERN3JSC2VME` | `ZPhCI3jKe5g` | +| `_ZN7WebCore19JSHTMLSelectElement4infoEv` | `h7k8ivlcKW4` | +| `_ZN7WebCore19JSHTMLSelectElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `WCYxrEsEjRI` | +| `_ZN7WebCore19JSHTMLSelectElement9toWrappedERN3JSC2VMENS1_7JSValueE` | `E5Pe45LDRqI` | +| `_ZN7WebCore19JSHTMLSelectElementC1ERKS0_` | `33EJeb8F35g` | +| `_ZN7WebCore19JSHTMLSelectElementC2ERKS0_` | `1GzMA6ls7io` | +| `_ZN7WebCore19JSHTMLSelectElementD1Ev` | `GWy1Z5IV65E` | +| `_ZN7WebCore19JSHTMLSelectElementD2Ev` | `6ljlgovZafE` | +| `_ZN7WebCore19MediaElementSession22addBehaviorRestrictionEj` | `IMMFx7XRySI` | +| `_ZN7WebCore19MediaElementSession25removeBehaviorRestrictionEj` | `Cmmtdh--N9s` | +| `_ZN7WebCore19MediaElementSession25updateMediaUsageIfChangedEv` | `g+wQ5ZXT7i8` | +| `_ZN7WebCore19MediaResourceLoader25recordResponsesForTestingEv` | `1AGh4Iic7S4` | +| `_ZN7WebCore19MediaResourceLoaderD0Ev` | `VVR2dI1029A` | +| `_ZN7WebCore19MediaResourceLoaderD1Ev` | `QEppJQAXTjk` | +| `_ZN7WebCore19MediaResourceLoaderD2Ev` | `TiTaYOe80UY` | +| `_ZN7WebCore19ProtectionSpaceBase7compareERKNS_15ProtectionSpaceES3_` | `6ePLnfc4Qgo` | +| `_ZN7WebCore19ResourceRequestBase11setPriorityENS_20ResourceLoadPriorityE` | `Ns8YtHWBLyk` | +| `_ZN7WebCore19ResourceRequestBase12clearPurposeEv` | `gwVFNCkuOQk` | +| `_ZN7WebCore19ResourceRequestBase12setIsTopSiteEb` | `Cyb-5L6XKbo` | +| `_ZN7WebCore19ResourceRequestBase13partitionNameERKN3WTF6StringE` | `1ULaJ4WPLtI` | +| `_ZN7WebCore19ResourceRequestBase13setHTTPMethodERKN3WTF6StringE` | `5wTstW4Gvks` | +| `_ZN7WebCore19ResourceRequestBase13setIsSameSiteEb` | `0qAqkGzBFMY` | +| `_ZN7WebCore19ResourceRequestBase14setCachePolicyENS_26ResourceRequestCachePolicyE` | `xsDEHCFMIlw` | +| `_ZN7WebCore19ResourceRequestBase15clearHTTPOriginEv` | `OrPeJ6qQgw4` | +| `_ZN7WebCore19ResourceRequestBase15setHTTPReferrerERKN3WTF6StringE` | `wLP4k8D3hWw` | +| `_ZN7WebCore19ResourceRequestBase16setHTTPUserAgentERKN3WTF6StringE` | `0NE9SkyhX-s` | +| `_ZN7WebCore19ResourceRequestBase17clearHTTPReferrerEv` | `ZjGWQIfLDE4` | +| `_ZN7WebCore19ResourceRequestBase17makeUnconditionalEv` | `cruxCoR-osY` | +| `_ZN7WebCore19ResourceRequestBase17setAsIsolatedCopyERKNS_15ResourceRequestE` | `bXhOOnwplgg` | +| `_ZN7WebCore19ResourceRequestBase17setCachePartitionERKN3WTF6StringE` | `vLOl08NCj+0` | +| `_ZN7WebCore19ResourceRequestBase18addHTTPHeaderFieldENS_14HTTPHeaderNameERKN3WTF6StringE` | `Xbwk6lRTyrw` | +| `_ZN7WebCore19ResourceRequestBase18addHTTPHeaderFieldERKN3WTF6StringES4_` | `FnJ0pXF0gR0` | +| `_ZN7WebCore19ResourceRequestBase18setHTTPContentTypeERKN3WTF6StringE` | `Jh+T2cXEtyA` | +| `_ZN7WebCore19ResourceRequestBase18setHTTPHeaderFieldENS_14HTTPHeaderNameERKN3WTF6StringE` | `AFeZCFKJd3k` | +| `_ZN7WebCore19ResourceRequestBase18setHTTPHeaderFieldERKN3WTF6StringES4_` | `lKyAvVz10f4` | +| `_ZN7WebCore19ResourceRequestBase19setHTTPHeaderFieldsENS_13HTTPHeaderMapE` | `cJokY6wAIvA` | +| `_ZN7WebCore19ResourceRequestBase20clearHTTPContentTypeEv` | `EID1OUoD76g` | +| `_ZN7WebCore19ResourceRequestBase22clearHTTPAuthorizationEv` | `SBn5gEySZK4` | +| `_ZN7WebCore19ResourceRequestBase22defaultTimeoutIntervalEv` | `i1VFpGXSPos` | +| `_ZN7WebCore19ResourceRequestBase23setFirstPartyForCookiesERKN3WTF3URLE` | `op7lZfbflp4` | +| `_ZN7WebCore19ResourceRequestBase25setDefaultTimeoutIntervalEd` | `sTTKtmcsvyg` | +| `_ZN7WebCore19ResourceRequestBase30addHTTPHeaderFieldIfNotPresentENS_14HTTPHeaderNameERKN3WTF6StringE` | `zi-eyYOv8Yw` | +| `_ZN7WebCore19ResourceRequestBase37setExistingHTTPReferrerToOriginStringEv` | `3hl+3pWsRNY` | +| `_ZN7WebCore19ResourceRequestBase50setResponseContentDispositionEncodingFallbackArrayERKN3WTF6StringES4_S4_` | `XMPmjIgxBPc` | +| `_ZN7WebCore19ResourceRequestBase5equalERKNS_15ResourceRequestES3_` | `-swGGmA0SP8` | +| `_ZN7WebCore19ResourceRequestBase6setURLERKN3WTF3URLE` | `MUMPpV8t3bg` | +| `_ZN7WebCore19StorageQuotaManager20resetQuotaForTestingEv` | `HngLT8ghSjc` | +| `_ZN7WebCore19StorageQuotaManager24requestSpaceOnMainThreadEmON3WTF17CompletionHandlerIFvNS0_8DecisionEEEE` | `P9Tm-o0KYfo` | +| `_ZN7WebCore19StorageQuotaManager30requestSpaceOnBackgroundThreadEm` | `z3CYZN32+ow` | +| `_ZN7WebCore19StorageQuotaManager39resetQuotaUpdatedBasedOnUsageForTestingEv` | `GRYGvRhpD-g` | +| `_ZN7WebCore19TextResourceDecoder14decodeAndFlushEPKcm` | `Za1R5SRCnkU` | +| `_ZN7WebCore19TextResourceDecoder5flushEv` | `xOo2f6redWI` | +| `_ZN7WebCore19TextResourceDecoder6decodeEPKcm` | `d6pRzr7hbZk` | +| `_ZN7WebCore19TextResourceDecoderD1Ev` | `3CB6yKkDe6Y` | +| `_ZN7WebCore19TextResourceDecoderD2Ev` | `QW+eAUlZtBk` | +| `_ZN7WebCore19TextTrackCueGeneric6createERNS_22ScriptExecutionContextERKN3WTF9MediaTimeES6_RKNS3_6StringE` | `FttaQVGuJpA` | +| `_ZN7WebCore19UserContentProvider54invalidateInjectedStyleSheetCacheInAllFramesInAllPagesEv` | `SiJJ2ssCwYY` | +| `_ZN7WebCore19UserContentProvider60invalidateAllRegisteredUserMessageHandlerInvalidationClientsEv` | `FueXOxLWLAo` | +| `_ZN7WebCore19UserContentProviderC2Ev` | `UtDLjo9rPmw` | +| `_ZN7WebCore19UserContentProviderD0Ev` | `aN4xuJLVnKc` | +| `_ZN7WebCore19UserContentProviderD1Ev` | `auKLpZXdSfw` | +| `_ZN7WebCore19UserContentProviderD2Ev` | `9cFgcwjP8fw` | +| `_ZN7WebCore19enclosingLayoutRectERKNS_9FloatRectE` | `BRAEBSsyFho` | +| `_ZN7WebCore19floatValueForLengthERKNS_6LengthEf` | `aaPDegynKuY` | +| `_ZN7WebCore19makeMapBetweenRectsERKNS_9FloatRectES2_` | `ACv0fKVga70` | +| `_ZN7WebCore19serializationForCSSERKNS_5ColorE` | `13YTEVlQaOM` | +| `_ZN7WebCore19toAutofillFieldNameERKN3WTF10AtomStringE` | `PhM-93-E9p8` | +| `_ZN7WebCore19unitedBoundingBoxesERKN3WTF6VectorINS_9FloatQuadELm0ENS0_15CrashOnOverflowELm16ENS0_10FastMallocEEE` | `WzM2QIMJhO8` | +| `_ZN7WebCore19watchAdaptationNameEv` | `ndXiA4gT0qY` | +| `_ZN7WebCore20ApplicationCacheHost17maybeLoadResourceERNS_14ResourceLoaderERKNS_15ResourceRequestERKN3WTF3URLE` | `zMV+5IFxYFI` | +| `_ZN7WebCore20ApplicationCacheHost25maybeLoadFallbackForErrorEPNS_14ResourceLoaderERKNS_13ResourceErrorE` | `R45OuqCl6l8` | +| `_ZN7WebCore20ApplicationCacheHost28maybeLoadFallbackForRedirectEPNS_14ResourceLoaderERNS_15ResourceRequestERKNS_16ResourceResponseE` | `t591rxAGAd0` | +| `_ZN7WebCore20ApplicationCacheHost28maybeLoadFallbackForResponseEPNS_14ResourceLoaderERKNS_16ResourceResponseE` | `AhJgNdYmkZo` | +| `_ZN7WebCore20CanvasActivityRecord27recordWrittenOrMeasuredTextERKN3WTF6StringE` | `oRclA0Y2+x4` | +| `_ZN7WebCore20FocusNavigationScope7scopeOfERNS_4NodeE` | `voGUWdA8Dr8` | +| `_ZN7WebCore20HTMLFrameElementBase11setLocationERKN3WTF6StringE` | `ct32qasNtNY` | +| `_ZN7WebCore20HTMLTableCellElement10setColSpanEj` | `1eejHQ3QcE8` | +| `_ZN7WebCore20HTMLTableCellElement21setRowSpanForBindingsEj` | `sFjcaILv9NQ` | +| `_ZN7WebCore20HTMLTableCellElement8setScopeERKN3WTF10AtomStringE` | `2JXVTjOe-qM` | +| `_ZN7WebCore20ISOOriginalFormatBox11boxTypeNameEv` | `ZI2IUkQLm0w` | +| `_ZN7WebCore20ISOOriginalFormatBox5parseERN3JSC8DataViewERj` | `kGwtyyyhjyE` | +| `_ZN7WebCore20ISOOriginalFormatBoxC1ERKS0_` | `IP1evjq7z2E` | +| `_ZN7WebCore20ISOOriginalFormatBoxC1Ev` | `5xnIXBGQEV8` | +| `_ZN7WebCore20ISOOriginalFormatBoxC2ERKS0_` | `NmoY1elGnu4` | +| `_ZN7WebCore20ISOOriginalFormatBoxC2Ev` | `cO8rAm3Bthg` | +| `_ZN7WebCore20ISOOriginalFormatBoxD0Ev` | `6THw24x30eg` | +| `_ZN7WebCore20ISOOriginalFormatBoxD1Ev` | `58mTXoDizKM` | +| `_ZN7WebCore20ISOOriginalFormatBoxD2Ev` | `nRaqLkGmjVs` | +| `_ZN7WebCore20ISOOriginalFormatBoxaSERKS0_` | `rIT2ClXDu7Q` | +| `_ZN7WebCore20LegacySchemeRegistry15isBuiltinSchemeERKN3WTF6StringE` | `WDbZ1WsOBxc` | +| `_ZN7WebCore20LegacySchemeRegistry24registerURLSchemeAsLocalERKN3WTF6StringE` | `R+aBKlxV69c` | +| `_ZN7WebCore20LegacySchemeRegistry25registerURLSchemeAsSecureERKN3WTF6StringE` | `eIvOQqvtBuQ` | +| `_ZN7WebCore20LegacySchemeRegistry27registerURLSchemeAsNoAccessERKN3WTF6StringE` | `pbNoy5OiS3k` | +| `_ZN7WebCore20LegacySchemeRegistry30registerURLSchemeAsCORSEnabledERKN3WTF6StringE` | `aRpErCNFrjg` | +| `_ZN7WebCore20LegacySchemeRegistry32registerURLSchemeAsEmptyDocumentERKN3WTF6StringE` | `wRcRGwS8arU` | +| `_ZN7WebCore20LegacySchemeRegistry34registerURLSchemeAsDisplayIsolatedERKN3WTF6StringE` | `EIr1K8rUHqw` | +| `_ZN7WebCore20LegacySchemeRegistry35registerURLSchemeAsCachePartitionedERKN3WTF6StringE` | `oqmE44po4Eo` | +| `_ZN7WebCore20LegacySchemeRegistry36allURLSchemesRegisteredAsCORSEnabledEv` | `zgDj49uMFxw` | +| `_ZN7WebCore20LegacySchemeRegistry36registerAsCanDisplayOnlyIfCanRequestERKN3WTF6StringE` | `K3efgJ7YQ7M` | +| `_ZN7WebCore20LegacySchemeRegistry36registerURLSchemeAsAlwaysRevalidatedERKN3WTF6StringE` | `KxvJlq1yxeI` | +| `_ZN7WebCore20LegacySchemeRegistry40setDomainRelaxationForbiddenForURLSchemeEbRKN3WTF6StringE` | `ID7vMKqWzNM` | +| `_ZN7WebCore20LegacySchemeRegistry49registerURLSchemeAsBypassingContentSecurityPolicyERKN3WTF6StringE` | `GU2pC4ZB4II` | +| `_ZN7WebCore20LegacySchemeRegistry57removeURLSchemeRegisteredAsBypassingContentSecurityPolicyERKN3WTF6StringE` | `Rr5ZbDFqTrs` | +| `_ZN7WebCore20LegacySchemeRegistry58registerURLSchemeAsAllowingDatabaseAccessInPrivateBrowsingERKN3WTF6StringE` | `rcgyexsX9sc` | +| `_ZN7WebCore20LowPowerModeNotifierC1EON3WTF8FunctionIFvbEEE` | `iraaucgzhMA` | +| `_ZN7WebCore20LowPowerModeNotifierC2EON3WTF8FunctionIFvbEEE` | `-N8JU4FqoZg` | +| `_ZN7WebCore20LowPowerModeNotifierD1Ev` | `OBbhBuxmNpQ` | +| `_ZN7WebCore20LowPowerModeNotifierD2Ev` | `t9F9hDCrx8s` | +| `_ZN7WebCore20NetworkStateNotifier11addListenerEON3WTF8FunctionIFvbEEE` | `7pOP1-HcGd8` | +| `_ZN7WebCore20NetworkStateNotifier6onLineEv` | `N7xnOTDMh1s` | +| `_ZN7WebCore20NetworkStateNotifier9singletonEv` | `u2gfAW6xw8k` | +| `_ZN7WebCore20PasteboardCustomData16fromSharedBufferERKNS_12SharedBufferE` | `gGRP10YAMnU` | +| `_ZN7WebCore20PasteboardCustomData22fromPersistenceDecoderEON3WTF11Persistence7DecoderE` | `2VRrmqcEmrA` | +| `_ZN7WebCore20PasteboardCustomData5EntryC1EOS1_` | `rLV7ZbjxqD0` | +| `_ZN7WebCore20PasteboardCustomData5EntryC1ERKS1_` | `jqLCVPYZF24` | +| `_ZN7WebCore20PasteboardCustomData5EntryC1Ev` | `8q0o+-HUPBE` | +| `_ZN7WebCore20PasteboardCustomData5EntryC2EOS1_` | `TaCxSAxB9U8` | +| `_ZN7WebCore20PasteboardCustomData5EntryC2ERKS1_` | `3Ts9sXMsLDg` | +| `_ZN7WebCore20PasteboardCustomData5EntryC2Ev` | `GAOGiBWWxD0` | +| `_ZN7WebCore20PasteboardCustomData5EntryaSEOS1_` | `jVdD5Xr7il4` | +| `_ZN7WebCore20PasteboardCustomData5EntryaSERKS1_` | `Xksn+zj4x60` | +| `_ZN7WebCore20PasteboardCustomDataC1EON3WTF6StringEONS1_6VectorINS0_5EntryELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE` | `ec46hZwJups` | +| `_ZN7WebCore20PasteboardCustomDataC1EOS0_` | `71MqbV1TZQA` | +| `_ZN7WebCore20PasteboardCustomDataC1ERKS0_` | `HvoRj7fP+dU` | +| `_ZN7WebCore20PasteboardCustomDataC1Ev` | `cSUfCJp7YEw` | +| `_ZN7WebCore20PasteboardCustomDataC2EON3WTF6StringEONS1_6VectorINS0_5EntryELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE` | `y-m7ObwVY-8` | +| `_ZN7WebCore20PasteboardCustomDataC2EOS0_` | `HuHO7Bn9W5k` | +| `_ZN7WebCore20PasteboardCustomDataC2ERKS0_` | `ymWO6sZglMw` | +| `_ZN7WebCore20PasteboardCustomDataC2Ev` | `8htex21zoHw` | +| `_ZN7WebCore20PasteboardCustomDataD1Ev` | `jgrJPZW1x8o` | +| `_ZN7WebCore20PasteboardCustomDataD2Ev` | `KOgTsORWgd4` | +| `_ZN7WebCore20PasteboardCustomDataaSERKS0_` | `CbNwLqSqKDw` | +| `_ZN7WebCore20PasteboardWriterData10WebContentD1Ev` | `4rn5Ptg2kuE` | +| `_ZN7WebCore20PasteboardWriterData10WebContentD2Ev` | `qMwyrQPxwc4` | +| `_ZN7WebCore20PasteboardWriterDataC1Ev` | `KhG5XEHZYsM` | +| `_ZN7WebCore20PasteboardWriterDataC2Ev` | `H-PxK0DNH70` | +| `_ZN7WebCore20PasteboardWriterDataD1Ev` | `EDHPIv3WKb0` | +| `_ZN7WebCore20PasteboardWriterDataD2Ev` | `A9MS1-aXvKI` | +| `_ZN7WebCore20RenderEmbeddedObject29setPluginUnavailabilityReasonENS0_26PluginUnavailabilityReasonE` | `wVAUKJ+Y+4I` | +| `_ZN7WebCore20RenderEmbeddedObject37setUnavailablePluginIndicatorIsHiddenEb` | `Snq9yuqDfvY` | +| `_ZN7WebCore20RenderEmbeddedObject44setPluginUnavailabilityReasonWithDescriptionENS0_26PluginUnavailabilityReasonERKN3WTF6StringE` | `VVKQCCyv0Hc` | +| `_ZN7WebCore20ResourceHandleClientC2Ev` | `VUHgtZo50Xo` | +| `_ZN7WebCore20ResourceHandleClientD1Ev` | `QfgcM9i1GVI` | +| `_ZN7WebCore20ResourceHandleClientD2Ev` | `K3HAYA0cG6w` | +| `_ZN7WebCore20ResourceLoadObserver14sharedIfExistsEv` | `wwNmjWmlsls` | +| `_ZN7WebCore20ResourceLoadObserver6sharedEv` | `IClE1UosCoM` | +| `_ZN7WebCore20ResourceLoadObserver9setSharedERS0_` | `TXmUfk23SAk` | +| `_ZN7WebCore20ResourceResponseBase17setHTTPStatusCodeEi` | `KCJmvB04zUM` | +| `_ZN7WebCore20ResourceResponseBase18addHTTPHeaderFieldENS_14HTTPHeaderNameERKN3WTF6StringE` | `G4NgZuAegEE` | +| `_ZN7WebCore20ResourceResponseBase18addHTTPHeaderFieldERKN3WTF6StringES4_` | `hYnXqynsu7M` | +| `_ZN7WebCore20ResourceResponseBase18setHTTPHeaderFieldENS_14HTTPHeaderNameERKN3WTF6StringE` | `eNp9ZnG0MEI` | +| `_ZN7WebCore20ResourceResponseBase18setHTTPHeaderFieldERKN3WTF6StringES4_` | `xxaJLwPko8I` | +| `_ZN7WebCore20ResourceResponseBase24sanitizeHTTPHeaderFieldsENS0_16SanitizationTypeE` | `C6oLAUS1iPc` | +| `_ZN7WebCore20ResourceResponseBase24setExpectedContentLengthEx` | `JeTseBuY-YI` | +| `_ZN7WebCore20ResourceResponseBase25sanitizeSuggestedFilenameERKN3WTF6StringE` | `sm2gEcdUZjE` | +| `_ZN7WebCore20ResourceResponseBase25syntheticRedirectResponseERKN3WTF3URLES4_` | `kP96QYFv1KY` | +| `_ZN7WebCore20ResourceResponseBase6setURLERKN3WTF3URLE` | `2V8DFaBEiNs` | +| `_ZN7WebCore20ResourceResponseBase7setTypeENS0_4TypeE` | `hBBRr8UkWd8` | +| `_ZN7WebCore20ResourceResponseBaseC1ERKN3WTF3URLERKNS1_6StringExS7_` | `xacsaU-hKOE` | +| `_ZN7WebCore20ResourceResponseBaseC1Ev` | `-Ysw9ZsBANs` | +| `_ZN7WebCore20ResourceResponseBaseC2ERKN3WTF3URLERKNS1_6StringExS7_` | `28-zrObSsN8` | +| `_ZN7WebCore20ResourceResponseBaseC2Ev` | `RzkJnWJ9iOs` | +| `_ZN7WebCore20SVGPathStringBuilder12curveToCubicERKNS_10FloatPointES3_S3_NS_18PathCoordinateModeE` | `WlBBtkMRe9s` | +| `_ZN7WebCore20SVGPathStringBuilder16curveToQuadraticERKNS_10FloatPointES3_NS_18PathCoordinateModeE` | `ExazMHZlYGM` | +| `_ZN7WebCore20SVGPathStringBuilder6lineToERKNS_10FloatPointENS_18PathCoordinateModeE` | `NaYyo8flntU` | +| `_ZN7WebCore20SVGPathStringBuilder6moveToERKNS_10FloatPointEbNS_18PathCoordinateModeE` | `Fyogm-tTBOc` | +| `_ZN7WebCore20SVGPathStringBuilder6resultEv` | `CiKXl603eqg` | +| `_ZN7WebCore20SVGPathStringBuilder9closePathEv` | `ib2kd7o1mlk` | +| `_ZN7WebCore20SVGPathStringBuilderC2Ev` | `3akdRDQT+nU` | +| `_ZN7WebCore20SVGPathStringBuilderD0Ev` | `oP2ILJnZAkg` | +| `_ZN7WebCore20SVGPathStringBuilderD1Ev` | `U-UjANPLJlM` | +| `_ZN7WebCore20SVGPathStringBuilderD2Ev` | `kNMZlFmxBH8` | +| `_ZN7WebCore20ScrollingCoordinator13pageDestroyedEv` | `2Nlpj99LvVo` | +| `_ZN7WebCore20ScrollingCoordinator45setForceSynchronousScrollLayerPositionUpdatesEb` | `Rf1XDVI64Ck` | +| `_ZN7WebCore20UserGestureIndicator18currentUserGestureEv` | `FB9S-dovCx0` | +| `_ZN7WebCore20UserGestureIndicator29processingUserGestureForMediaEv` | `UU20U-U-Nmk` | +| `_ZN7WebCore20UserGestureIndicatorD1Ev` | `G-+SmxcuaMA` | +| `_ZN7WebCore20UserGestureIndicatorD2Ev` | `y8w4lDQtlAo` | +| `_ZN7WebCore20endOfEditableContentERKNS_15VisiblePositionE` | `c9gkeiGoRPU` | +| `_ZN7WebCore20findClosestPlainTextERKNS_11SimpleRangeERKN3WTF6StringENS3_9OptionSetINS_14FindOptionFlagEEEm` | `S-JBod0h2e0` | +| `_ZN7WebCore20httpHeaderNameStringENS_14HTTPHeaderNameE` | `jajO-tAdNek` | +| `_ZN7WebCore20lastOffsetForEditingERKNS_4NodeE` | `GSIH23bQiUk` | +| `_ZN7WebCore20nextSentencePositionERKNS_15VisiblePositionE` | `0P2v-cE-4Hg` | +| `_ZN7WebCore20previousWordPositionERKNS_15VisiblePositionE` | `6ZjTW1uImXg` | +| `_ZN7WebCore20serializationForHTMLERKNS_5ColorE` | `acIXxXfqttk` | +| `_ZN7WebCore21AudioHardwareListener6createERNS0_6ClientE` | `G1RwFxS5NPo` | +| `_ZN7WebCore21BackForwardController11currentItemEv` | `X23-bMY6HME` | +| `_ZN7WebCore21BackForwardController11forwardItemEv` | `GnU5P3SpJ1Q` | +| `_ZN7WebCore21BackForwardController11itemAtIndexEi` | `pLYxXzkI0wg` | +| `_ZN7WebCore21BackForwardController6goBackEv` | `tEhDOOiD+Lk` | +| `_ZN7WebCore21BackForwardController8backItemEv` | `vFVAvC5qdNw` | +| `_ZN7WebCore21BackForwardController9goForwardEv` | `h0k8FLhotoM` | +| `_ZN7WebCore21BlobDataFileReference16revokeFileAccessEv` | `rNxUdFXvbmY` | +| `_ZN7WebCore21BlobDataFileReference20prepareForFileAccessEv` | `xw7nZtsLETs` | +| `_ZN7WebCore21BlobDataFileReference26startTrackingModificationsEv` | `d38462nDjJg` | +| `_ZN7WebCore21BlobDataFileReference4pathEv` | `omzWoelkO8E` | +| `_ZN7WebCore21BlobDataFileReference4sizeEv` | `BX9yrnbQ6aY` | +| `_ZN7WebCore21BlobDataFileReference6createERKN3WTF6StringES4_` | `NKg-qME4uN0` | +| `_ZN7WebCore21BlobDataFileReferenceC1ERKN3WTF6StringES4_` | `3u-CRxg2b0Q` | +| `_ZN7WebCore21BlobDataFileReferenceC2ERKN3WTF6StringES4_` | `ngT2rbyKTXc` | +| `_ZN7WebCore21BlobDataFileReferenceD0Ev` | `XGP2MNQH0o8` | +| `_ZN7WebCore21BlobDataFileReferenceD1Ev` | `-Zst47j36u4` | +| `_ZN7WebCore21BlobDataFileReferenceD2Ev` | `98EKVFkCQDI` | +| `_ZN7WebCore21ComplexTextController14ComplexTextRunC1ERKN3WTF6VectorINS_9FloatSizeELm0ENS2_15CrashOnOverflowELm16ENS2_10FastMallocEEERKNS3_INS_10FloatPointELm0ES5_Lm16ES6_EERKNS3_ItLm0ES5_Lm16ES6_EERKNS3_IjLm0ES5_Lm16ES6_EES4_RKNS_4FontEPKDsjjjjb` | `3P9D732NTrQ` | +| `_ZN7WebCore21ComplexTextController14ComplexTextRunC2ERKN3WTF6VectorINS_9FloatSizeELm0ENS2_15CrashOnOverflowELm16ENS2_10FastMallocEEERKNS3_INS_10FloatPointELm0ES5_Lm16ES6_EERKNS3_ItLm0ES5_Lm16ES6_EERKNS3_IjLm0ES5_Lm16ES6_EES4_RKNS_4FontEPKDsjjjjb` | `O4JnrYhtn68` | +| `_ZN7WebCore21ContentSecurityPolicy17didReceiveHeadersERKNS_36ContentSecurityPolicyResponseHeadersEON3WTF6StringENS0_19ReportParsingErrorsE` | `9GF0V3-pKSg` | +| `_ZN7WebCore21ContentSecurityPolicyD1Ev` | `M3zkWIxtrOQ` | +| `_ZN7WebCore21ContentSecurityPolicyD2Ev` | `toINCwQIbPc` | +| `_ZN7WebCore21DiagnosticLoggingKeys10webViewKeyEv` | `GFii35jH7fk` | +| `_ZN7WebCore21DiagnosticLoggingKeys11cpuUsageKeyEv` | `CdsviRGZSIY` | +| `_ZN7WebCore21DiagnosticLoggingKeys11inactiveKeyEv` | `AHmW2IKU5HY` | +| `_ZN7WebCore21DiagnosticLoggingKeys11occurredKeyEv` | `vIJU0OBb-0g` | +| `_ZN7WebCore21DiagnosticLoggingKeys11timedOutKeyEv` | `qHgbK+xwr+0` | +| `_ZN7WebCore21DiagnosticLoggingKeys12retrievalKeyEv` | `tm5DPUBTjxE` | +| `_ZN7WebCore21DiagnosticLoggingKeys13webGLStateKeyEv` | `ilbVirqwQrY` | +| `_ZN7WebCore21DiagnosticLoggingKeys14streamingMediaEv` | `V3Ky6zD8Slc` | +| `_ZN7WebCore21DiagnosticLoggingKeys15isAttachmentKeyEv` | `VghGSTR7j2U` | +| `_ZN7WebCore21DiagnosticLoggingKeys15networkCacheKeyEv` | `Ys9wh-pfoNA` | +| `_ZN7WebCore21DiagnosticLoggingKeys15revalidatingKeyEv` | `pMVc-tS+h2s` | +| `_ZN7WebCore21DiagnosticLoggingKeys16internalErrorKeyEv` | `80J1+bA9ZIk` | +| `_ZN7WebCore21DiagnosticLoggingKeys16notHTTPFamilyKeyEv` | `3TXZl5TizHU` | +| `_ZN7WebCore21DiagnosticLoggingKeys17userZoomActionKeyEv` | `LGhpaoJcPiQ` | +| `_ZN7WebCore21DiagnosticLoggingKeys18neverSeenBeforeKeyEv` | `31yoQG8UtcY` | +| `_ZN7WebCore21DiagnosticLoggingKeys18noLongerInCacheKeyEv` | `qMn0KHwwAlQ` | +| `_ZN7WebCore21DiagnosticLoggingKeys18nonVisibleStateKeyEv` | `W3VXXbPyZoA` | +| `_ZN7WebCore21DiagnosticLoggingKeys18unlikelyToReuseKeyEv` | `OrrXBYSyN+o` | +| `_ZN7WebCore21DiagnosticLoggingKeys19invalidSessionIDKeyEv` | `br1m2bKu-gs` | +| `_ZN7WebCore21DiagnosticLoggingKeys19retrievalRequestKeyEv` | `GSgQGxgTtBU` | +| `_ZN7WebCore21DiagnosticLoggingKeys20needsRevalidationKeyEv` | `SWEDAhIHkMI` | +| `_ZN7WebCore21DiagnosticLoggingKeys20telemetryPageLoadKeyEv` | `avm1fE1zqH4` | +| `_ZN7WebCore21DiagnosticLoggingKeys21domainCausingCrashKeyEv` | `mRYtMJ1AGU8` | +| `_ZN7WebCore21DiagnosticLoggingKeys21simulatedPageCrashKeyEv` | `VISJGrCmQw8` | +| `_ZN7WebCore21DiagnosticLoggingKeys22backNavigationDeltaKeyEv` | `m0alrQTxjRI` | +| `_ZN7WebCore21DiagnosticLoggingKeys22cacheControlNoStoreKeyEv` | `mevhH+2IP8Q` | +| `_ZN7WebCore21DiagnosticLoggingKeys22domainCausingJetsamKeyEv` | `a5ESb9DEKkQ` | +| `_ZN7WebCore21DiagnosticLoggingKeys22unknownEntryRequestKeyEv` | `jpVunYq0+Vg` | +| `_ZN7WebCore21DiagnosticLoggingKeys23isConditionalRequestKeyEv` | `lWs2iFS1rkc` | +| `_ZN7WebCore21DiagnosticLoggingKeys24activeInForegroundTabKeyEv` | `mWmEo3ddFA0` | +| `_ZN7WebCore21DiagnosticLoggingKeys24networkProcessCrashedKeyEv` | `jiOGjZPAc-s` | +| `_ZN7WebCore21DiagnosticLoggingKeys24uncacheableStatusCodeKeyEv` | `SMXx+EUireA` | +| `_ZN7WebCore21DiagnosticLoggingKeys24unsupportedHTTPMethodKeyEv` | `W2qE6sLTyWQ` | +| `_ZN7WebCore21DiagnosticLoggingKeys24varyingHeaderMismatchKeyEv` | `jxFQgW-VK1U` | +| `_ZN7WebCore21DiagnosticLoggingKeys24visibleAndActiveStateKeyEv` | `Yd7Iz7EAL6c` | +| `_ZN7WebCore21DiagnosticLoggingKeys24visibleNonActiveStateKeyEv` | `hKc+WLAD2-o` | +| `_ZN7WebCore21DiagnosticLoggingKeys25failedLessThan2SecondsKeyEv` | `SOKQacNlDTw` | +| `_ZN7WebCore21DiagnosticLoggingKeys25failedLessThan5SecondsKeyEv` | `W39wYLkcbbk` | +| `_ZN7WebCore21DiagnosticLoggingKeys25missingValidatorFieldsKeyEv` | `uZuLK3v55JY` | +| `_ZN7WebCore21DiagnosticLoggingKeys26entryRightlyNotWarmedUpKeyEv` | `S3yDQivx8Iw` | +| `_ZN7WebCore21DiagnosticLoggingKeys26entryWronglyNotWarmedUpKeyEv` | `j4OuYrBmx60` | +| `_ZN7WebCore21DiagnosticLoggingKeys26failedLessThan20SecondsKeyEv` | `xy4m3oQ08NE` | +| `_ZN7WebCore21DiagnosticLoggingKeys26failedMoreThan20SecondsKeyEv` | `VvaRHKvH0cU` | +| `_ZN7WebCore21DiagnosticLoggingKeys27canceledLessThan2SecondsKeyEv` | `NKWWyWgw5Us` | +| `_ZN7WebCore21DiagnosticLoggingKeys27canceledLessThan5SecondsKeyEv` | `vWgVOv3-IjI` | +| `_ZN7WebCore21DiagnosticLoggingKeys27createSharedBufferFailedKeyEv` | `44f4XR6IFVo` | +| `_ZN7WebCore21DiagnosticLoggingKeys27networkCacheReuseFailureKeyEv` | `UIAqKbVG7ek` | +| `_ZN7WebCore21DiagnosticLoggingKeys27networkCacheUnusedReasonKeyEv` | `gEe-fgf+6ao` | +| `_ZN7WebCore21DiagnosticLoggingKeys27synchronousMessageFailedKeyEv` | `bXdcBn6G0jg` | +| `_ZN7WebCore21DiagnosticLoggingKeys28activeInBackgroundTabOnlyKeyEv` | `F7trORiQaSc` | +| `_ZN7WebCore21DiagnosticLoggingKeys28canceledLessThan20SecondsKeyEv` | `dWtzkMtOQgs` | +| `_ZN7WebCore21DiagnosticLoggingKeys28canceledMoreThan20SecondsKeyEv` | `ARrbEsbHQlI` | +| `_ZN7WebCore21DiagnosticLoggingKeys28exceededActiveMemoryLimitKeyEv` | `kpdWM-W53PQ` | +| `_ZN7WebCore21DiagnosticLoggingKeys28isReloadIgnoringCacheDataKeyEv` | `WGpHmUU-UoU` | +| `_ZN7WebCore21DiagnosticLoggingKeys28networkCacheFailureReasonKeyEv` | `4tB7KLDYBu4` | +| `_ZN7WebCore21DiagnosticLoggingKeys28succeededLessThan2SecondsKeyEv` | `oKz+Da7cSXg` | +| `_ZN7WebCore21DiagnosticLoggingKeys28succeededLessThan5SecondsKeyEv` | `wardDDbhb30` | +| `_ZN7WebCore21DiagnosticLoggingKeys29exceededBackgroundCPULimitKeyEv` | `h-HCQG2lRQo` | +| `_ZN7WebCore21DiagnosticLoggingKeys29succeededLessThan20SecondsKeyEv` | `i5mr2DobQXk` | +| `_ZN7WebCore21DiagnosticLoggingKeys29succeededMoreThan20SecondsKeyEv` | `--3LQVV+qcE` | +| `_ZN7WebCore21DiagnosticLoggingKeys30exceededInactiveMemoryLimitKeyEv` | `hFVxpy3JUR4` | +| `_ZN7WebCore21DiagnosticLoggingKeys33memoryUsageToDiagnosticLoggingKeyEm` | `ehHTSpqwKBk` | +| `_ZN7WebCore21DiagnosticLoggingKeys40backgroundCPUUsageToDiagnosticLoggingKeyEd` | `q0xAlUzTa-Y` | +| `_ZN7WebCore21DiagnosticLoggingKeys40foregroundCPUUsageToDiagnosticLoggingKeyEd` | `emI-mvU1vNs` | +| `_ZN7WebCore21DiagnosticLoggingKeys42wastedSpeculativeWarmupWithRevalidationKeyEv` | `bWJrDRxsfaQ` | +| `_ZN7WebCore21DiagnosticLoggingKeys45wastedSpeculativeWarmupWithoutRevalidationKeyEv` | `QMLPrsdMwMQ` | +| `_ZN7WebCore21DiagnosticLoggingKeys46successfulSpeculativeWarmupWithRevalidationKeyEv` | `bf54N7AEBTc` | +| `_ZN7WebCore21DiagnosticLoggingKeys49successfulSpeculativeWarmupWithoutRevalidationKeyEv` | `N3h7zyMwHWU` | +| `_ZN7WebCore21DiagnosticLoggingKeys8otherKeyEv` | `zHgIPaK+F4c` | +| `_ZN7WebCore21DiagnosticLoggingKeys9unusedKeyEv` | `-eTUfliWVzQ` | +| `_ZN7WebCore21DisplayRefreshMonitorC2Ej` | `RlnmEoT+BEA` | +| `_ZN7WebCore21DisplayRefreshMonitorD0Ev` | `x-SSNEsxvWU` | +| `_ZN7WebCore21DisplayRefreshMonitorD1Ev` | `E4vxp+IU3dg` | +| `_ZN7WebCore21DisplayRefreshMonitorD2Ev` | `jqUGi9VvXUY` | +| `_ZN7WebCore21HTMLOptionsCollection16setSelectedIndexEi` | `a2VWRSroXlY` | +| `_ZN7WebCore21HTMLOptionsCollection6removeEi` | `1zovCBzwnbc` | +| `_ZN7WebCore21HTMLOptionsCollection9setLengthEj` | `kR09Tm7VQbw` | +| `_ZN7WebCore21ISOTrackEncryptionBox11boxTypeNameEv` | `QByiQ+otd5o` | +| `_ZN7WebCore21ISOTrackEncryptionBox5parseERN3JSC8DataViewERj` | `eCjonvf5rso` | +| `_ZN7WebCore21ISOTrackEncryptionBoxC1ERKS0_` | `gBcHNw5c3Ng` | +| `_ZN7WebCore21ISOTrackEncryptionBoxC2ERKS0_` | `ILkZXXuyNWc` | +| `_ZN7WebCore21ISOTrackEncryptionBoxC2Ev` | `T9QNcoIsEqs` | +| `_ZN7WebCore21ISOTrackEncryptionBoxD0Ev` | `GEs31bClO0g` | +| `_ZN7WebCore21ISOTrackEncryptionBoxD1Ev` | `Rqr11daK9Y8` | +| `_ZN7WebCore21ISOTrackEncryptionBoxD2Ev` | `wzg3WcRMCfg` | +| `_ZN7WebCore21InspectorFrontendHost16disconnectClientEv` | `-1X3PhkFDT8` | +| `_ZN7WebCore21InspectorFrontendHost28addSelfToGlobalObjectInWorldERNS_15DOMWrapperWorldE` | `f0uoqUwlUG4` | +| `_ZN7WebCore21InspectorFrontendHostC1EPNS_23InspectorFrontendClientEPNS_4PageE` | `-KdbpcGgEXU` | +| `_ZN7WebCore21InspectorFrontendHostC2EPNS_23InspectorFrontendClientEPNS_4PageE` | `Sdm1lxP+5yA` | +| `_ZN7WebCore21InspectorFrontendHostD1Ev` | `fN7BnrWdcd0` | +| `_ZN7WebCore21InspectorFrontendHostD2Ev` | `7UdG6FtbrJg` | +| `_ZN7WebCore21JSCSSStyleDeclaration14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `eqpr6i37N7Q` | +| `_ZN7WebCore21JSCSSStyleDeclaration15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `T327+NdBshc` | +| `_ZN7WebCore21JSCSSStyleDeclaration15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `f+00KPkkmWE` | +| `_ZN7WebCore21JSCSSStyleDeclaration15subspaceForImplERN3JSC2VME` | `rO8tQwOajrw` | +| `_ZN7WebCore21JSCSSStyleDeclaration4infoEv` | `ZnOk1jHEYbs` | +| `_ZN7WebCore21JSCSSStyleDeclaration9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `HEdLKMssW34` | +| `_ZN7WebCore21JSCSSStyleDeclaration9toWrappedERN3JSC2VMENS1_7JSValueE` | `Pjjg+htjN1Q` | +| `_ZN7WebCore21JSCSSStyleDeclarationC1ERKS0_` | `ENCQTNg5e+k` | +| `_ZN7WebCore21JSCSSStyleDeclarationC2ERKS0_` | `NNtRrAFE6+U` | +| `_ZN7WebCore21JSCSSStyleDeclarationD1Ev` | `jZGAl9Y-FkM` | +| `_ZN7WebCore21JSCSSStyleDeclarationD2Ev` | `kf57RhzuP0g` | +| `_ZN7WebCore21JSCSSStyleDeclarationaSERKS0_` | `AqtTZeLtvwU` | +| `_ZN7WebCore21JSDeprecatedCSSOMRect9toWrappedERN3JSC2VMENS1_7JSValueE` | `tq8LnCPE9tQ` | +| `_ZN7WebCore21JSRemoteDOMWindowBase4infoEv` | `UNaphEVAupM` | +| `_ZN7WebCore21JSRemoteDOMWindowBaseD1Ev` | `vnBo2BIrkYI` | +| `_ZN7WebCore21JSRemoteDOMWindowBaseD2Ev` | `gbZY27lvTq4` | +| `_ZN7WebCore21JSTextTrackCueGeneric15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `TYEr3zjqOxo` | +| `_ZN7WebCore21JSTextTrackCueGeneric15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `w9aKAn3xJRA` | +| `_ZN7WebCore21JSTextTrackCueGeneric15subspaceForImplERN3JSC2VME` | `Hv9QKbZceis` | +| `_ZN7WebCore21JSTextTrackCueGeneric4infoEv` | `sBfT3Gm2ks4` | +| `_ZN7WebCore21JSTextTrackCueGeneric9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `hZ9kXOm-Kes` | +| `_ZN7WebCore21JSTextTrackCueGeneric9toWrappedERN3JSC2VMENS1_7JSValueE` | `029SwUP7kXc` | +| `_ZN7WebCore21JSTextTrackCueGenericD1Ev` | `1mFJ6hh-6yk` | +| `_ZN7WebCore21JSTextTrackCueGenericD2Ev` | `h5X9wHxHGOY` | +| `_ZN7WebCore21MediaRecorderProviderC1ERKS0_` | `M9G58ZJkHUw` | +| `_ZN7WebCore21MediaRecorderProviderC1Ev` | `yZ6tARqyAas` | +| `_ZN7WebCore21MediaRecorderProviderC2ERKS0_` | `5euVemDnv+M` | +| `_ZN7WebCore21MediaRecorderProviderC2Ev` | `NpFXqFyIxOY` | +| `_ZN7WebCore21MediaRecorderProviderD0Ev` | `mKqK1QDP4A4` | +| `_ZN7WebCore21MediaRecorderProviderD1Ev` | `xEjBSjulggc` | +| `_ZN7WebCore21MediaRecorderProviderD2Ev` | `sN-LluSZTCQ` | +| `_ZN7WebCore21MediaRecorderProvideraSERKS0_` | `n1fVBauLrig` | +| `_ZN7WebCore21MediaRecorderProviderdaEPv` | `HCOb-FMNF18` | +| `_ZN7WebCore21MediaRecorderProviderdlEPv` | `TfbkNorL4C4` | +| `_ZN7WebCore21MediaRecorderProvidernaEm` | `ONIhJ+wHKWI` | +| `_ZN7WebCore21MediaRecorderProvidernaEmPv` | `glOjchjSBHQ` | +| `_ZN7WebCore21MediaRecorderProvidernwEmPv` | `cO+5GDZdVq8` | +| `_ZN7WebCore21MediaRecorderProvidernwEm` | `yU4Dlx9Wgtk` | +| `_ZN7WebCore21NetworkStorageSession10getCookiesERKN3WTF3URLE` | `L2dkX9ZmiqM` | +| `_ZN7WebCore21NetworkStorageSession10setCookiesERKN3WTF6VectorINS_6CookieELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEERKNS1_3URLESB_` | `3mCQTzEUTMQ` | +| `_ZN7WebCore21NetworkStorageSession13getAllCookiesEv` | `Rjf8NliPAj8` | +| `_ZN7WebCore21NetworkStorageSession17domCookiesForHostERKN3WTF6StringE` | `6ajQEiaMYXw` | +| `_ZN7WebCore21NetworkStorageSession22processMayUseCookieAPIEv` | `u31bZNgtlrs` | +| `_ZN7WebCore21NetworkStorageSession22removeAllStorageAccessEv` | `8iOyY3+3Rvg` | +| `_ZN7WebCore21NetworkStorageSession27permitProcessToUseCookieAPIEb` | `HZPRG8FmMc4` | +| `_ZN7WebCore21NetworkStorageSession29setAllCookiesToSameSiteStrictERKNS_17RegistrableDomainEON3WTF17CompletionHandlerIFvvEEE` | `O7trcBs3d5g` | +| `_ZN7WebCore21NetworkStorageSession31setThirdPartyCookieBlockingModeENS_28ThirdPartyCookieBlockingModeE` | `l22aiCQV8jY` | +| `_ZN7WebCore21NetworkStorageSession38setCacheMaxAgeCapForPrevalentResourcesEN3WTF7SecondsE` | `KLwC9-FN8yo` | +| `_ZN7WebCore21NetworkStorageSession40resetCacheMaxAgeCapForPrevalentResourcesEv` | `olGQFkStv1c` | +| `_ZN7WebCore21NetworkStorageSession41setDomainsWithUserInteractionAsFirstPartyERKN3WTF6VectorINS_17RegistrableDomainELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE` | `j9XPYaU-Ft0` | +| `_ZN7WebCore21NetworkStorageSession43setPrevalentDomainsToBlockButKeepCookiesForERKN3WTF6VectorINS_17RegistrableDomainELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE` | `8EKL1meARlk` | +| `_ZN7WebCore21NetworkStorageSession45setPrevalentDomainsToBlockAndDeleteCookiesForERKN3WTF6VectorINS_17RegistrableDomainELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE` | `Sdb-IIQqyyM` | +| `_ZN7WebCore21NetworkStorageSession47resetCrossSiteLoadsWithLinkDecorationForTestingEv` | `59ZJ9flQTpA` | +| `_ZN7WebCore21NetworkStorageSession9setCookieERKNS_6CookieE` | `C4L3jt-+8E0` | +| `_ZN7WebCore21NetworkStorageSessionD1Ev` | `gOMVClnL0Mg` | +| `_ZN7WebCore21NetworkStorageSessionD2Ev` | `ujJhGfJ7Hl8` | +| `_ZN7WebCore21PageOverlayController18installPageOverlayERNS_11PageOverlayENS1_8FadeModeE` | `UNOrI4X5kz0` | +| `_ZN7WebCore21PageOverlayController20uninstallPageOverlayERNS_11PageOverlayENS1_8FadeModeE` | `S1PBRKjSstQ` | +| `_ZN7WebCore21PageOverlayController26didChangeDeviceScaleFactorEv` | `OXdFEkUtslc` | +| `_ZN7WebCore21PageOverlayController32copyAccessibilityAttributesNamesEb` | `eioBaGW46xA` | +| `_ZN7WebCore21PageOverlayController43copyAccessibilityAttributeBoolValueForPointEN3WTF6StringENS_10FloatPointERb` | `2ZkjWav84Zs` | +| `_ZN7WebCore21PageOverlayController45copyAccessibilityAttributeStringValueForPointEN3WTF6StringENS_10FloatPointERS2_` | `-Ih6ikmQLbE` | +| `_ZN7WebCore21PlatformKeyboardEvent20currentCapsLockStateEv` | `4ufGsV2Qxvo` | +| `_ZN7WebCore21PlatformKeyboardEvent23getCurrentModifierStateERbS1_S1_S1_` | `MqLM8CBC9FM` | +| `_ZN7WebCore21RemoteCommandListener6createERNS_27RemoteCommandListenerClientE` | `x1AP-G3h75A` | +| `_ZN7WebCore21SQLiteDatabaseTracker24hasTransactionInProgressEv` | `caM6qseCSfI` | +| `_ZN7WebCore21SQLiteDatabaseTracker35decrementTransactionInProgressCountEv` | `PoPlzSr6JaQ` | +| `_ZN7WebCore21SQLiteDatabaseTracker35incrementTransactionInProgressCountEv` | `ZSogkXtiB+0` | +| `_ZN7WebCore21SQLiteDatabaseTracker9setClientEPNS_27SQLiteDatabaseTrackerClientE` | `Z5YoPnCOHA8` | +| `_ZN7WebCore21SerializedScriptValue11deserializeEPK15OpaqueJSContextPPK13OpaqueJSValue` | `uFZKofgqDxQ` | +| `_ZN7WebCore21SerializedScriptValue6createEN3WTF10StringViewE` | `ezTggyZ6StQ` | +| `_ZN7WebCore21SerializedScriptValue6createEPK15OpaqueJSContextPK13OpaqueJSValuePS6_` | `gOjURFF2pJk` | +| `_ZN7WebCore21SerializedScriptValueD1Ev` | `1dCYHXYPqRQ` | +| `_ZN7WebCore21SerializedScriptValueD2Ev` | `XUxhGAFCMvU` | +| `_ZN7WebCore21UserContentController16removeUserScriptERNS_15DOMWrapperWorldERKN3WTF3URLE` | `iFzwhERLa6A` | +| `_ZN7WebCore21UserContentController17removeUserScriptsERNS_15DOMWrapperWorldE` | `OhmAoBvGMd4` | +| `_ZN7WebCore21UserContentController20removeAllUserContentEv` | `Y4vWmmTKoLM` | +| `_ZN7WebCore21UserContentController20removeUserStyleSheetERNS_15DOMWrapperWorldERKN3WTF3URLE` | `JNktKOUPYCQ` | +| `_ZN7WebCore21UserContentController21removeUserStyleSheetsERNS_15DOMWrapperWorldE` | `-BFUCKzy5ts` | +| `_ZN7WebCore21UserContentController6createEv` | `dDthhs1K+LQ` | +| `_ZN7WebCore21UserContentControllerD0Ev` | `Eggp2vvHgmE` | +| `_ZN7WebCore21UserContentControllerD1Ev` | `29I8pJ49Hc0` | +| `_ZN7WebCore21UserContentControllerD2Ev` | `IXW6gHdbpMc` | +| `_ZN7WebCore21WebKitFontFamilyNames4initEv` | `-FwGo9dtzKY` | +| `_ZN7WebCore21WheelEventTestMonitor14deferForReasonEPKvNS0_11DeferReasonE` | `kyGmfmhB6S8` | +| `_ZN7WebCore21WheelEventTestMonitor21clearAllTestDeferralsEv` | `C+5oNT1ESfY` | +| `_ZN7WebCore21WheelEventTestMonitor23removeDeferralForReasonEPKvNS0_11DeferReasonE` | `DJ--iSo4x+I` | +| `_ZN7WebCore21WheelEventTestMonitor33setTestCallbackAndStartMonitoringEbbON3WTF8FunctionIFvvEEE` | `LkOgJS6ES+w` | +| `_ZN7WebCore21convertToIntegerClampIaEET_RN3JSC14JSGlobalObjectENS2_7JSValueE` | `MR--eBzfvkg` | +| `_ZN7WebCore21convertToIntegerClampIhEET_RN3JSC14JSGlobalObjectENS2_7JSValueE` | `sJmYKWu+TbY` | +| `_ZN7WebCore21convertToIntegerClampIiEET_RN3JSC14JSGlobalObjectENS2_7JSValueE` | `1lw12IB1HrA` | +| `_ZN7WebCore21convertToIntegerClampIjEET_RN3JSC14JSGlobalObjectENS2_7JSValueE` | `hNe91PKQcOc` | +| `_ZN7WebCore21convertToIntegerClampIlEET_RN3JSC14JSGlobalObjectENS2_7JSValueE` | `5jk63e4y8qA` | +| `_ZN7WebCore21convertToIntegerClampImEET_RN3JSC14JSGlobalObjectENS2_7JSValueE` | `vBLfTFUvgyI` | +| `_ZN7WebCore21convertToIntegerClampIsEET_RN3JSC14JSGlobalObjectENS2_7JSValueE` | `kHuGSHvt3As` | +| `_ZN7WebCore21convertToIntegerClampItEET_RN3JSC14JSGlobalObjectENS2_7JSValueE` | `r2+NfKBLFUQ` | +| `_ZN7WebCore21identifierToUSVStringERN3JSC14JSGlobalObjectERKNS0_10IdentifierE` | `eX0m5bz4rZc` | +| `_ZN7WebCore21mainThreadNormalWorldEv` | `BHCyHXCvQZ8` | +| `_ZN7WebCore21setPlatformStrategiesEPNS_18PlatformStrategiesE` | `zUMbo2HaFrU` | +| `_ZN7WebCore22CanvasRenderingContext5derefEv` | `ASfhwEyh1cI` | +| `_ZN7WebCore22CryptoAlgorithmAES_CBC15platformDecryptERKNS_30CryptoAlgorithmAesCbcCfbParamsERKNS_12CryptoKeyAESERKN3WTF6VectorIhLm0ENS7_15CrashOnOverflowELm16ENS7_10FastMallocEEENS0_7PaddingE` | `lC6NyPIlPns` | +| `_ZN7WebCore22CryptoAlgorithmAES_CBC15platformEncryptERKNS_30CryptoAlgorithmAesCbcCfbParamsERKNS_12CryptoKeyAESERKN3WTF6VectorIhLm0ENS7_15CrashOnOverflowELm16ENS7_10FastMallocEEENS0_7PaddingE` | `D4Jb9-xqqBk` | +| `_ZN7WebCore22DefaultFilterOperationD1Ev` | `FDStlKcia7Y` | +| `_ZN7WebCore22DefaultFilterOperationD2Ev` | `ifjgccZulhg` | +| `_ZN7WebCore22EmptyFrameLoaderClient10sendH2PingERKN3WTF3URLEONS1_17CompletionHandlerIFvONSt12experimental15fundamentals_v38expectedINS1_7SecondsENS_13ResourceErrorEEEEEE` | `aQZkTZSB9Q4` | +| `_ZN7WebCore22EmptyFrameLoaderClient11prefetchDNSERKN3WTF6StringE` | `mkI7vGRy-U4` | +| `_ZN7WebCore22EmptyFrameLoaderClient12dispatchShowEv` | `ysdXgAoy-XY` | +| `_ZN7WebCore22EmptyFrameLoaderClient13didFinishLoadEv` | `zQDZtAHh-RM` | +| `_ZN7WebCore22EmptyFrameLoaderClient13startDownloadERKNS_15ResourceRequestERKN3WTF6StringE` | `fBhl01ZwcGc` | +| `_ZN7WebCore22EmptyFrameLoaderClient14didChangeTitleEPNS_14DocumentLoaderE` | `CdtXvtmle9M` | +| `_ZN7WebCore22EmptyFrameLoaderClient15finishedLoadingEPNS_14DocumentLoaderE` | `lNAJstgvTDI` | +| `_ZN7WebCore22EmptyFrameLoaderClient15willChangeTitleEPNS_14DocumentLoaderE` | `G5ZDNtddzSk` | +| `_ZN7WebCore22EmptyFrameLoaderClient16restoreViewStateEv` | `tx5pKeUBkgE` | +| `_ZN7WebCore22EmptyFrameLoaderClient17cancelPolicyCheckEv` | `4ySoP73IpDQ` | +| `_ZN7WebCore22EmptyFrameLoaderClient17dispatchWillCloseEv` | `e8P9xcYmFp4` | +| `_ZN7WebCore22EmptyFrameLoaderClient17objectContentTypeERKN3WTF3URLERKNS1_6StringE` | `Symql6+eiQk` | +| `_ZN7WebCore22EmptyFrameLoaderClient17setCopiesOnScrollEv` | `SYuiZEPIJOg` | +| `_ZN7WebCore22EmptyFrameLoaderClient18frameLoadCompletedEv` | `xaZIwYQG0rw` | +| `_ZN7WebCore22EmptyFrameLoaderClient18makeRepresentationEPNS_14DocumentLoaderE` | `xCC2+A1QU2M` | +| `_ZN7WebCore22EmptyFrameLoaderClient19detachedFromParent2Ev` | `BraS9NFJCzA` | +| `_ZN7WebCore22EmptyFrameLoaderClient19detachedFromParent3Ev` | `TxBSWS65aos` | +| `_ZN7WebCore22EmptyFrameLoaderClient19dispatchDidFailLoadERKNS_13ResourceErrorE` | `3Q1Rm8ZQILU` | +| `_ZN7WebCore22EmptyFrameLoaderClient19saveViewStateToItemERNS_11HistoryItemE` | `h1Ft1kj6f0g` | +| `_ZN7WebCore22EmptyFrameLoaderClient19updateGlobalHistoryEv` | `HpgdHWqIO28` | +| `_ZN7WebCore22EmptyFrameLoaderClient20createDocumentLoaderERKNS_15ResourceRequestERKNS_14SubstituteDataE` | `HxybCxtAU6k` | +| `_ZN7WebCore22EmptyFrameLoaderClient20redirectDataToPluginERNS_6WidgetE` | `6Eu5XtKCAy0` | +| `_ZN7WebCore22EmptyFrameLoaderClient20setMainDocumentErrorEPNS_14DocumentLoaderERKNS_13ResourceErrorE` | `NU3hnL+BDoQ` | +| `_ZN7WebCore22EmptyFrameLoaderClient21didRunInsecureContentERNS_14SecurityOriginERKN3WTF3URLE` | `szwrXfLPPlE` | +| `_ZN7WebCore22EmptyFrameLoaderClient21dispatchDidFinishLoadEv` | `PQpV7EQ5L3A` | +| `_ZN7WebCore22EmptyFrameLoaderClient21forceLayoutForNonHTMLEv` | `dc29NN1u8hs` | +| `_ZN7WebCore22EmptyFrameLoaderClient22dispatchWillSubmitFormERNS_9FormStateEON3WTF17CompletionHandlerIFvvEEE` | `doi98SgdAqA` | +| `_ZN7WebCore22EmptyFrameLoaderClient22provisionalLoadStartedEv` | `KbH6XiiluUs` | +| `_ZN7WebCore22EmptyFrameLoaderClient23createNetworkingContextEv` | `HKQJY7aViYI` | +| `_ZN7WebCore22EmptyFrameLoaderClient23dispatchDidReceiveTitleERKNS_19StringWithDirectionE` | `WSiZNjSOyqM` | +| `_ZN7WebCore22EmptyFrameLoaderClient24revertToProvisionalStateEPNS_14DocumentLoaderE` | `aRwBsP0ib1E` | +| `_ZN7WebCore22EmptyFrameLoaderClient25didDisplayInsecureContentEv` | `J7IVFPM6rXM` | +| `_ZN7WebCore22EmptyFrameLoaderClient25setMainFrameDocumentReadyEb` | `QlFo-lidi-Q` | +| `_ZN7WebCore22EmptyFrameLoaderClient26didReplaceMultipartContentEv` | `fe-BQU7Mx7Q` | +| `_ZN7WebCore22EmptyFrameLoaderClient26updateCachedDocumentLoaderERNS_14DocumentLoaderE` | `WZuPFqNHaW4` | +| `_ZN7WebCore22EmptyFrameLoaderClient27willReplaceMultipartContentEv` | `cIcJ41juvWI` | +| `_ZN7WebCore22EmptyFrameLoaderClient29dispatchDidFinishDocumentLoadEv` | `XlIysvPfuNQ` | +| `_ZN7WebCore22EmptyFrameLoaderClient29dispatchDidPopStateWithinPageEv` | `5aXKyDH-FQs` | +| `_ZN7WebCore22EmptyFrameLoaderClient29hasFrameSpecificStorageAccessEv` | `MrJUmRrcu5A` | +| `_ZN7WebCore22EmptyFrameLoaderClient29savePlatformDataToCachedFrameEPNS_11CachedFrameE` | `DF2bDNLQbUM` | +| `_ZN7WebCore22EmptyFrameLoaderClient30didRestoreFromBackForwardCacheEv` | `r4o4j3iaN64` | +| `_ZN7WebCore22EmptyFrameLoaderClient30dispatchDidPushStateWithinPageEv` | `mYuf10s9APM` | +| `_ZN7WebCore22EmptyFrameLoaderClient31dispatchDidCancelClientRedirectEv` | `tkNek0GUewk` | +| `_ZN7WebCore22EmptyFrameLoaderClient31dispatchDidDispatchOnloadEventsEv` | `fZtIw2Exp58` | +| `_ZN7WebCore22EmptyFrameLoaderClient31dispatchDidReachLayoutMilestoneEN3WTF9OptionSetINS_15LayoutMilestoneEEE` | `SwNTIE7lkj4` | +| `_ZN7WebCore22EmptyFrameLoaderClient31dispatchDidStartProvisionalLoadEv` | `GDxzthIy7Qk` | +| `_ZN7WebCore22EmptyFrameLoaderClient31dispatchUnableToImplementPolicyERKNS_13ResourceErrorE` | `Ctm-m3Y326Q` | +| `_ZN7WebCore22EmptyFrameLoaderClient31prepareForDataSourceReplacementEv` | `6C8Npd4b2w4` | +| `_ZN7WebCore22EmptyFrameLoaderClient31transitionToCommittedForNewPageEv` | `kxuIic9ejsg` | +| `_ZN7WebCore22EmptyFrameLoaderClient32updateGlobalHistoryRedirectLinksEv` | `701xv4i88-g` | +| `_ZN7WebCore22EmptyFrameLoaderClient33convertMainResourceLoadToDownloadEPNS_14DocumentLoaderERKNS_15ResourceRequestERKNS_16ResourceResponseE` | `Ts-nQ4c4kTg` | +| `_ZN7WebCore22EmptyFrameLoaderClient33dispatchDidReplaceStateWithinPageEv` | `h2l92tnR88Y` | +| `_ZN7WebCore22EmptyFrameLoaderClient33dispatchWillPerformClientRedirectERKN3WTF3URLEdNS1_8WallTimeENS_19LockBackForwardListE` | `6q1eUV0OZoE` | +| `_ZN7WebCore22EmptyFrameLoaderClient36transitionToCommittedFromCachedFrameEPNS_11CachedFrameE` | `pHmVAreojKs` | +| `_ZN7WebCore22EmptyFrameLoaderClient37dispatchDidReachVisuallyNonEmptyStateEv` | `8RJJo61fpeg` | +| `_ZN7WebCore22EmptyFrameLoaderClient38dispatchDidLoadResourceFromMemoryCacheEPNS_14DocumentLoaderERKNS_15ResourceRequestERKNS_16ResourceResponseEi` | `3ip78Y0ydtU` | +| `_ZN7WebCore22EmptyFrameLoaderClient50dispatchDidReceiveServerRedirectForProvisionalLoadEv` | `Oy92GWEKFIQ` | +| `_ZN7WebCore22EmptyFrameLoaderClient8setTitleERKNS_19StringWithDirectionERKN3WTF3URLE` | `2oNey8Gkn4M` | +| `_ZN7WebCore22EmptyFrameLoaderClientC1ERKS0_` | `E2pRXDTKB68` | +| `_ZN7WebCore22EmptyFrameLoaderClientC1Ev` | `GcUPkO7ruRw` | +| `_ZN7WebCore22EmptyFrameLoaderClientC2ERKS0_` | `YQZ9c5jMwJc` | +| `_ZN7WebCore22EmptyFrameLoaderClientC2Ev` | `DrzwGvqQVZc` | +| `_ZN7WebCore22EmptyFrameLoaderClientD0Ev` | `LQouFiom26k` | +| `_ZN7WebCore22EmptyFrameLoaderClientD1Ev` | `2wiYanBFmKc` | +| `_ZN7WebCore22EmptyFrameLoaderClientD2Ev` | `mgFnQx7tp0M` | +| `_ZN7WebCore22EmptyFrameLoaderClientaSERKS0_` | `M+XOGquY4SY` | +| `_ZN7WebCore22FontCascadeDescriptionC1Ev` | `q1GAmySAovY` | +| `_ZN7WebCore22FontCascadeDescriptionC2Ev` | `zkLhehDz0Mc` | +| `_ZN7WebCore22GraphicsLayerTransformC1Ev` | `4yaTIedbZwQ` | +| `_ZN7WebCore22GraphicsLayerTransformC2Ev` | `bOwxkVkQ5uA` | +| `_ZN7WebCore22HTMLFormControlElement13setFormActionERKN3WTF10AtomStringE` | `KyEyVSdTW7U` | +| `_ZN7WebCore22HistoricalVelocityData18velocityForNewDataENS_10FloatPointEdN3WTF13MonotonicTimeE` | `TJbM4gtL7mU` | +| `_ZN7WebCore22JSDeprecatedCSSOMValue9toWrappedERN3JSC2VMENS1_7JSValueE` | `fF6UuzMinKo` | +| `_ZN7WebCore22MutableStyleProperties25ensureCSSStyleDeclarationEv` | `pGV40iopOv0` | +| `_ZN7WebCore22MutableStylePropertiesD1Ev` | `7S5wcWqncYU` | +| `_ZN7WebCore22MutableStylePropertiesD2Ev` | `rv8Kv-PnXJ4` | +| `_ZN7WebCore22ResourceLoadStatistics20reduceTimeResolutionEN3WTF8WallTimeE` | `yHUuMr3FiFw` | +| `_ZN7WebCore22ResourceLoadStatistics5mergeERKS0_` | `Abv1Cb-pj2w` | +| `_ZN7WebCore22ResourceLoadStatistics6decodeERNS_12KeyedDecoderEj` | `9D40kL7Jyes` | +| `_ZN7WebCore22counterValueForElementEPNS_7ElementE` | `Agu-33Jlq+Q` | +| `_ZN7WebCore22createFragmentFromTextERKNS_11SimpleRangeERKN3WTF6StringE` | `dRmKsRxRCj4` | +| `_ZN7WebCore22externalRepresentationEPNS_7ElementEN3WTF9OptionSetINS_16RenderAsTextFlagEEE` | `LEQB-MXRK-I` | +| `_ZN7WebCore22identifierToByteStringERN3JSC14JSGlobalObjectERKNS0_10IdentifierE` | `alkDBoyYoQM` | +| `_ZN7WebCore22multipleFileUploadTextEj` | `3aeIfu8G6SE` | +| `_ZN7WebCore22startOfEditableContentERKNS_15VisiblePositionE` | `-DDelvzvDI4` | +| `_ZN7WebCore22strictCSSParserContextEv` | `HdE+dwXD45U` | +| `_ZN7WebCore22throwArgumentTypeErrorERN3JSC14JSGlobalObjectERNS0_10ThrowScopeEjPKcS6_S6_S6_` | `NaGc6KEsNxs` | +| `_ZN7WebCore22throwSequenceTypeErrorERN3JSC14JSGlobalObjectERNS0_10ThrowScopeE` | `ZrUUA39Xu+Q` | +| `_ZN7WebCore23ApplicationCacheStorage14setMaximumSizeEl` | `btgimHAqS2Y` | +| `_ZN7WebCore23ApplicationCacheStorage15deleteAllCachesEv` | `CtO0q0-CWfY` | +| `_ZN7WebCore23ApplicationCacheStorage16deleteAllEntriesEv` | `ydF4H0hkWJI` | +| `_ZN7WebCore23ApplicationCacheStorage21setDefaultOriginQuotaEl` | `Iq-nLBtQE7U` | +| `_ZN7WebCore23ApplicationCacheStorage23calculateQuotaForOriginERKNS_14SecurityOriginERl` | `mQxh1QCEoG8` | +| `_ZN7WebCore23ApplicationCacheStorage26storeUpdatedQuotaForOriginEPKNS_14SecurityOriginEl` | `1xchZd188u0` | +| `_ZN7WebCore23ApplicationCacheStorage5emptyEv` | `BWMWo+5rLW0` | +| `_ZN7WebCore23ApplicationCacheStorageC1ERKN3WTF6StringES4_` | `IsPcsC1N-6I` | +| `_ZN7WebCore23ApplicationCacheStorageC2ERKN3WTF6StringES4_` | `24QWHtxr2EM` | +| `_ZN7WebCore23HTMLTableSectionElement4rowsEv` | `vj1wM+GCC1g` | +| `_ZN7WebCore23HTMLTableSectionElement9deleteRowEi` | `dAYfKRKR2QQ` | +| `_ZN7WebCore23HTMLTableSectionElement9insertRowEi` | `7bTJr1njnSc` | +| `_ZN7WebCore23ISOSchemeInformationBox11boxTypeNameEv` | `5++VaMgcCng` | +| `_ZN7WebCore23ISOSchemeInformationBox5parseERN3JSC8DataViewERj` | `48WiSdjl-uQ` | +| `_ZN7WebCore23ISOSchemeInformationBoxC1Ev` | `CFvmCVk6TfI` | +| `_ZN7WebCore23ISOSchemeInformationBoxC2Ev` | `RfDI9yBTxRM` | +| `_ZN7WebCore23ISOSchemeInformationBoxD0Ev` | `3rZOepV0sMM` | +| `_ZN7WebCore23ISOSchemeInformationBoxD1Ev` | `nmQLo50WaFA` | +| `_ZN7WebCore23ISOSchemeInformationBoxD2Ev` | `MWIpAB8h3ls` | +| `_ZN7WebCore23JSHTMLOptionsCollection9toWrappedERN3JSC2VMENS1_7JSValueE` | `OAjyHghTAKM` | +| `_ZN7WebCore23MediaQueryParserContextC1ERKNS_8DocumentE` | `vtJllvqhN2I` | +| `_ZN7WebCore23MediaQueryParserContextC2ERKNS_8DocumentE` | `7UkDkleTd3I` | +| `_ZN7WebCore23SynchronousLoaderClient24platformBadResponseErrorEv` | `5HfzFsObscc` | +| `_ZN7WebCore23TextureMapperFPSCounter19updateFPSAndDisplayERNS_13TextureMapperERKNS_10FloatPointERKNS_20TransformationMatrixE` | `1oasg2vyO8U` | +| `_ZN7WebCore23TextureMapperFPSCounterC1Ev` | `oSeqX90U4IE` | +| `_ZN7WebCore23TextureMapperFPSCounterC2Ev` | `enk2-X2re5s` | +| `_ZN7WebCore23atBoundaryOfGranularityERKNS_15VisiblePositionENS_15TextGranularityENS_18SelectionDirectionE` | `EKRMmXMHBrs` | +| `_ZN7WebCore23computeSharedStringHashEPKDsj` | `mxfm5iKxLJk` | +| `_ZN7WebCore23computeSharedStringHashERKN3WTF6StringE` | `STrp1nbSFLw` | +| `_ZN7WebCore23standardUserAgentForURLERKN3WTF3URLE` | `cPB4kSdgPxg` | +| `_ZN7WebCore23throwNonFiniteTypeErrorERN3JSC14JSGlobalObjectERNS0_10ThrowScopeE` | `rTcK9MJi7XQ` | +| `_ZN7WebCore23wrapSerializedCryptoKeyERKN3WTF6VectorIhLm0ENS0_15CrashOnOverflowELm16ENS0_10FastMallocEEES6_RS4_` | `wd4TA00miTA` | +| `_ZN7WebCore24CachedResourceHandleBase11setResourceEPNS_14CachedResourceE` | `uOWuJZyEwUM` | +| `_ZN7WebCore24CachedResourceHandleBaseC1EPNS_14CachedResourceE` | `6jxmRAS4nQ0` | +| `_ZN7WebCore24CachedResourceHandleBaseC1ERKS0_` | `ZaMKAXv7fAA` | +| `_ZN7WebCore24CachedResourceHandleBaseC1Ev` | `2pkq+agYpkc` | +| `_ZN7WebCore24CachedResourceHandleBaseC2EPNS_14CachedResourceE` | `6MV3LG2T8hU` | +| `_ZN7WebCore24CachedResourceHandleBaseC2ERKS0_` | `lPrzNCs0+B4` | +| `_ZN7WebCore24CachedResourceHandleBaseC2Ev` | `270EeLhlxKE` | +| `_ZN7WebCore24CachedResourceHandleBaseD1Ev` | `hFOQQbKvSes` | +| `_ZN7WebCore24CachedResourceHandleBaseD2Ev` | `TiAPv02ITxs` | +| `_ZN7WebCore24CachedResourceHandleBaseaSERKS0_` | `vHDtsqbebfs` | +| `_ZN7WebCore24CoordinatedGraphicsLayer10setFiltersERKNS_16FilterOperationsE` | `jch+HROEKCc` | +| `_ZN7WebCore24CoordinatedGraphicsLayer10setOpacityEf` | `iuSBiGPYMI0` | +| `_ZN7WebCore24CoordinatedGraphicsLayer11setPositionERKNS_10FloatPointE` | `gsk7fVctu5U` | +| `_ZN7WebCore24CoordinatedGraphicsLayer12addAnimationERKNS_17KeyframeValueListERKNS_9FloatSizeEPKNS_9AnimationERKN3WTF6StringEd` | `jmFWAzJgio4` | +| `_ZN7WebCore24CoordinatedGraphicsLayer12setTransformERKNS_20TransformationMatrixE` | `Iwjgb9Q6nLg` | +| `_ZN7WebCore24CoordinatedGraphicsLayer12syncPositionERKNS_10FloatPointE` | `tj6YdqFHAiI` | +| `_ZN7WebCore24CoordinatedGraphicsLayer14pauseAnimationERKN3WTF6StringEd` | `eWYj-OrOBC4` | +| `_ZN7WebCore24CoordinatedGraphicsLayer14setAnchorPointERKNS_12FloatPoint3DE` | `6yCcv3jyMfk` | +| `_ZN7WebCore24CoordinatedGraphicsLayer14setDebugBorderERKNS_5ColorEf` | `HxzaHLBNjzs` | +| `_ZN7WebCore24CoordinatedGraphicsLayer14setPreserves3DEb` | `OfP1a5uBcs4` | +| `_ZN7WebCore24CoordinatedGraphicsLayer15removeAnimationERKN3WTF6StringE` | `4eIK+jvU-gQ` | +| `_ZN7WebCore24CoordinatedGraphicsLayer15setBoundsOriginERKNS_10FloatPointE` | `p902te3L1dk` | +| `_ZN7WebCore24CoordinatedGraphicsLayer15setContentsRectERKNS_9FloatRectE` | `7uEKCJNwdgI` | +| `_ZN7WebCore24CoordinatedGraphicsLayer15setDrawsContentEb` | `tKx8sTtdtpk` | +| `_ZN7WebCore24CoordinatedGraphicsLayer15setNeedsDisplayEv` | `MuTCNpW9Tn4` | +| `_ZN7WebCore24CoordinatedGraphicsLayer16didChangeFiltersEv` | `-NopEkuDKSI` | +| `_ZN7WebCore24CoordinatedGraphicsLayer16removeFromParentEv` | `5OcP9EZ2O0U` | +| `_ZN7WebCore24CoordinatedGraphicsLayer16resumeAnimationsEv` | `6hvkAQuPiTc` | +| `_ZN7WebCore24CoordinatedGraphicsLayer16setMasksToBoundsEb` | `npXHlgPpwI0` | +| `_ZN7WebCore24CoordinatedGraphicsLayer16syncBoundsOriginERKNS_10FloatPointE` | `jCsaBBpVu8U` | +| `_ZN7WebCore24CoordinatedGraphicsLayer17didChangeChildrenEv` | `20u2l0mDMQ8` | +| `_ZN7WebCore24CoordinatedGraphicsLayer17didChangeGeometryENS0_17FlushNotificationE` | `40j64VDDOVw` | +| `_ZN7WebCore24CoordinatedGraphicsLayer17setContentsOpaqueEb` | `mRX62Ymdb6o` | +| `_ZN7WebCore24CoordinatedGraphicsLayer17suspendAnimationsEN3WTF13MonotonicTimeE` | `DCbHrYNuMXo` | +| `_ZN7WebCore24CoordinatedGraphicsLayer18purgeBackingStoresEv` | `6P+15JGEmX8` | +| `_ZN7WebCore24CoordinatedGraphicsLayer18setBackdropFiltersERKNS_16FilterOperationsE` | `86ZN9dRzLSY` | +| `_ZN7WebCore24CoordinatedGraphicsLayer18setContentsToImageEPNS_5ImageE` | `QU2RS5gXYEU` | +| `_ZN7WebCore24CoordinatedGraphicsLayer18setContentsVisibleEb` | `8cq1G692WXA` | +| `_ZN7WebCore24CoordinatedGraphicsLayer18setShowDebugBorderEb` | `if5ULtFmeIA` | +| `_ZN7WebCore24CoordinatedGraphicsLayer19didChangeAnimationsEv` | `mw0r+WP8nK8` | +| `_ZN7WebCore24CoordinatedGraphicsLayer19notifyFlushRequiredEv` | `j9yaF1MkGiM` | +| `_ZN7WebCore24CoordinatedGraphicsLayer19setContentsTileSizeERKNS_9FloatSizeE` | `SPWCS7YkH5s` | +| `_ZN7WebCore24CoordinatedGraphicsLayer19updatePlatformLayerEv` | `c0DOxHbUSQU` | +| `_ZN7WebCore24CoordinatedGraphicsLayer20didUpdateTileBuffersEv` | `Sv328nOfyDo` | +| `_ZN7WebCore24CoordinatedGraphicsLayer20setChildrenTransformERKNS_20TransformationMatrixE` | `Lj0pi48ul+o` | +| `_ZN7WebCore24CoordinatedGraphicsLayer20setContentsTilePhaseERKNS_9FloatSizeE` | `9Vw1T+nh1ug` | +| `_ZN7WebCore24CoordinatedGraphicsLayer20updateContentBuffersEv` | `zO8MS-Rrk0U` | +| `_ZN7WebCore24CoordinatedGraphicsLayer21computePixelAlignmentERNS_10FloatPointERNS_9FloatSizeERNS_12FloatPoint3DES4_` | `P0iS-Z3SJ7U` | +| `_ZN7WebCore24CoordinatedGraphicsLayer21flushCompositingStateERKNS_9FloatRectE` | `m3plRJj6PGE` | +| `_ZN7WebCore24CoordinatedGraphicsLayer21invalidateCoordinatorEv` | `ultFJQj8-yY` | +| `_ZN7WebCore24CoordinatedGraphicsLayer21setBackfaceVisibilityEb` | `pbQYmZ8YkFs` | +| `_ZN7WebCore24CoordinatedGraphicsLayer21setNeedsDisplayInRectERKNS_9FloatRectENS_13GraphicsLayer17ShouldClipToLayerE` | `Z6cYhFDue3A` | +| `_ZN7WebCore24CoordinatedGraphicsLayer21setShowRepaintCounterEb` | `qWrpSb35t4M` | +| `_ZN7WebCore24CoordinatedGraphicsLayer22effectiveContentsScaleEv` | `3pf1uFd13oU` | +| `_ZN7WebCore24CoordinatedGraphicsLayer22setBackdropFiltersRectERKNS_16FloatRoundedRectE` | `z554oW2MmsQ` | +| `_ZN7WebCore24CoordinatedGraphicsLayer22transformedVisibleRectEv` | `-M9AqqLEF+k` | +| `_ZN7WebCore24CoordinatedGraphicsLayer23setContentsClippingRectERKNS_16FloatRoundedRectE` | `2T2lkjZnNAA` | +| `_ZN7WebCore24CoordinatedGraphicsLayer23setContentsNeedsDisplayEv` | `xqLXNRuiapQ` | +| `_ZN7WebCore24CoordinatedGraphicsLayer23setContentsToSolidColorERKNS_5ColorE` | `OhDth-x4CUo` | +| `_ZN7WebCore24CoordinatedGraphicsLayer24didChangeBackdropFiltersEv` | `Z7-cPFrH4hM` | +| `_ZN7WebCore24CoordinatedGraphicsLayer25requestBackingStoreUpdateEv` | `jujg+gUXTx0` | +| `_ZN7WebCore24CoordinatedGraphicsLayer26setContentsToPlatformLayerEPN7Nicosia13PlatformLayerENS_13GraphicsLayer20ContentsLayerPurposeE` | `gZmImv89cqQ` | +| `_ZN7WebCore24CoordinatedGraphicsLayer26setShouldUpdateVisibleRectEv` | `EUMq7VbMM4A` | +| `_ZN7WebCore24CoordinatedGraphicsLayer28didChangeBackdropFiltersRectEv` | `0gHxaT0Icu4` | +| `_ZN7WebCore24CoordinatedGraphicsLayer29computePositionRelativeToBaseEv` | `fhHAF+7kH08` | +| `_ZN7WebCore24CoordinatedGraphicsLayer29computeTransformedVisibleRectEv` | `jPUHFmeAfHQ` | +| `_ZN7WebCore24CoordinatedGraphicsLayer29setNeedsVisibleRectAdjustmentEv` | `W0c2iL1rKmI` | +| `_ZN7WebCore24CoordinatedGraphicsLayer30deviceOrPageScaleFactorChangedEv` | `Rv4UH0cDulY` | +| `_ZN7WebCore24CoordinatedGraphicsLayer37flushCompositingStateForThisLayerOnlyEv` | `XPtc6krrgeE` | +| `_ZN7WebCore24CoordinatedGraphicsLayer37selfOrAncestorHaveNonAffineTransformsEv` | `4Eur8eZ9By0` | +| `_ZN7WebCore24CoordinatedGraphicsLayer38updateContentBuffersIncludingSubLayersEv` | `PyO5rPUsqi4` | +| `_ZN7WebCore24CoordinatedGraphicsLayer40setCoordinatorIncludingSubLayersIfNeededEPNS_30CoordinatedGraphicsLayerClientE` | `G2VfL6sFcuk` | +| `_ZN7WebCore24CoordinatedGraphicsLayer41syncPendingStateChangesIncludingSubLayersEv` | `sHFtASIGevU` | +| `_ZN7WebCore24CoordinatedGraphicsLayer7setSizeERKNS_9FloatSizeE` | `SX4ghJcVKuw` | +| `_ZN7WebCore24CoordinatedGraphicsLayerC1ENS_13GraphicsLayer4TypeERNS_19GraphicsLayerClientE` | `5A9QHOsqHvo` | +| `_ZN7WebCore24CoordinatedGraphicsLayerC2ENS_13GraphicsLayer4TypeERNS_19GraphicsLayerClientE` | `HvPrgqyNx4U` | +| `_ZN7WebCore24CoordinatedGraphicsLayerD0Ev` | `m8JHnyIOhiY` | +| `_ZN7WebCore24CoordinatedGraphicsLayerD1Ev` | `SJ4QncjRIbY` | +| `_ZN7WebCore24CoordinatedGraphicsLayerD2Ev` | `6cBZ2UaxePg` | +| `_ZN7WebCore24DeprecatedGlobalSettings24setMockScrollbarsEnabledEb` | `T3Go5GjqGNk` | +| `_ZN7WebCore24DeprecatedGlobalSettings24setUsesOverlayScrollbarsEb` | `O+MKIQG6G6M` | +| `_ZN7WebCore24DeprecatedGlobalSettings26setAllowsAnySSLCertificateEb` | `6qX9DWxWU2I` | +| `_ZN7WebCore24DocumentMarkerController10markersForERNS_4NodeEN3WTF9OptionSetINS_14DocumentMarker10MarkerTypeEEE` | `GST6G3qdBrw` | +| `_ZN7WebCore24DocumentMarkerController13removeMarkersEN3WTF9OptionSetINS_14DocumentMarker10MarkerTypeEEE` | `JPFa5NRl0JI` | +| `_ZN7WebCore24DocumentMarkerController13removeMarkersERKNS_11SimpleRangeEN3WTF9OptionSetINS_14DocumentMarker10MarkerTypeEEENS_32RemovePartiallyOverlappingMarkerE` | `MOjoTJV36qE` | +| `_ZN7WebCore24DocumentMarkerController14markersInRangeERKNS_11SimpleRangeEN3WTF9OptionSetINS_14DocumentMarker10MarkerTypeEEE` | `OoSsuUyGSv0` | +| `_ZN7WebCore24DocumentMarkerController23renderedRectsForMarkersENS_14DocumentMarker10MarkerTypeE` | `Vv+r6l8KTNs` | +| `_ZN7WebCore24DocumentMarkerController38updateRectsForInvalidatedMarkersOfTypeENS_14DocumentMarker10MarkerTypeE` | `RmvjkhQol34` | +| `_ZN7WebCore24DocumentParserYieldTokenC1ERNS_8DocumentE` | `BUVDl9VOFvA` | +| `_ZN7WebCore24DocumentParserYieldTokenC2ERNS_8DocumentE` | `2EXbWy6w4Z0` | +| `_ZN7WebCore24DocumentParserYieldTokenD1Ev` | `5+3b0iloKdw` | +| `_ZN7WebCore24DocumentParserYieldTokenD2Ev` | `JUbN6tGxXnQ` | +| `_ZN7WebCore24FrameDestructionObserver14frameDestroyedEv` | `O4ZJfw-mmKg` | +| `_ZN7WebCore24FrameDestructionObserver14willDetachPageEv` | `lbarclZ21IU` | +| `_ZN7WebCore24FrameDestructionObserverD0Ev` | `CkXUW6BfNPM` | +| `_ZN7WebCore24FrameDestructionObserverD1Ev` | `XQQ6p4SAdOw` | +| `_ZN7WebCore24FrameDestructionObserverD2Ev` | `pimWNsC+fcM` | +| `_ZN7WebCore24ImmutableStylePropertiesD1Ev` | `kOVSJf52zg8` | +| `_ZN7WebCore24ImmutableStylePropertiesD2Ev` | `luLH2PzqTIM` | +| `_ZN7WebCore24JSDeprecatedCSSOMCounter9toWrappedERN3JSC2VMENS1_7JSValueE` | `yJQmnLc1uBU` | +| `_ZN7WebCore24MatrixTransformOperation6createERKNS_20TransformationMatrixE` | `3B0UjWrE4F0` | +| `_ZN7WebCore24PerformanceLoggingClient35synchronousScrollingReasonsAsStringEN3WTF9OptionSetINS_26SynchronousScrollingReasonEEE` | `O7lIAGERevo` | +| `_ZN7WebCore24StorageNamespaceProvider21localStorageNamespaceEN3PAL9SessionIDE` | `gGNk4Be0XjU` | +| `_ZN7WebCore24StorageNamespaceProviderC2Ev` | `hMjn6z51jLI` | +| `_ZN7WebCore24StorageNamespaceProviderD0Ev` | `CT3th2KZ+4o` | +| `_ZN7WebCore24StorageNamespaceProviderD1Ev` | `yPQg5zkuE+s` | +| `_ZN7WebCore24StorageNamespaceProviderD2Ev` | `qFkvfDxBWGM` | +| `_ZN7WebCore24TemporarySelectionChangeD1Ev` | `I4sXVq8FNbw` | +| `_ZN7WebCore24TemporarySelectionChangeD2Ev` | `jniFKYdQ3jg` | +| `_ZN7WebCore24charactersAroundPositionERKNS_15VisiblePositionERiS3_S3_` | `4QXiWC+ejP0` | +| `_ZN7WebCore24distanceBetweenPositionsERKNS_15VisiblePositionES2_` | `rFejiB5ds6Y` | +| `_ZN7WebCore24passesAccessControlCheckERKNS_16ResourceResponseENS_23StoredCredentialsPolicyERKNS_14SecurityOriginEPKNS_37CrossOriginAccessControlCheckDisablerE` | `NKP6ONc0Yds` | +| `_ZN7WebCore24presentingApplicationPIDEv` | `mu7FzFTWB7Q` | +| `_ZN7WebCore24previousSentencePositionERKNS_15VisiblePositionE` | `Gcx7jKVH4Fo` | +| `_ZN7WebCore24redirectChainAllowsReuseENS_24RedirectChainCacheStatusENS_28ReuseExpiredRedirectionOrNotE` | `OlR31NI-DCY` | +| `_ZN7WebCore25ArchiveResourceCollection21archiveResourceForURLERKN3WTF3URLE` | `yfRB4uRKs38` | +| `_ZN7WebCore25DropShadowFilterOperation6createERKNS_8IntPointEiRKNS_5ColorE` | `3rQTgVQshN0` | +| `_ZN7WebCore25DropShadowFilterOperationC1ERKNS_8IntPointEiRKNS_5ColorE` | `sHnaF6S19xA` | +| `_ZN7WebCore25DropShadowFilterOperationC2ERKNS_8IntPointEiRKNS_5ColorE` | `a36cmst-zBY` | +| `_ZN7WebCore25DropShadowFilterOperationD0Ev` | `9JpQlCkEpMA` | +| `_ZN7WebCore25DropShadowFilterOperationD1Ev` | `2i6PbN7F88k` | +| `_ZN7WebCore25DropShadowFilterOperationD2Ev` | `AA4U9nG9L2E` | +| `_ZN7WebCore25JSDeprecatedCSSOMRGBColor9toWrappedERN3JSC2VMENS1_7JSValueE` | `X1vBIfxrUjs` | +| `_ZN7WebCore25TextureMapperBackingStore25calculateExposedTileEdgesERKNS_9FloatRectES3_` | `HYFSl8uM4GI` | +| `_ZN7WebCore25WebSocketChannelInspectorC1ERNS_8DocumentE` | `e3HfkECgcUE` | +| `_ZN7WebCore25WebSocketChannelInspectorC2ERNS_8DocumentE` | `JA9b3iqvtHo` | +| `_ZN7WebCore25computeViewportAttributesENS_17ViewportArgumentsEiiifNS_7IntSizeE` | `NugBItcC7YY` | +| `_ZN7WebCore25directionOfEnclosingBlockERKNS_8PositionE` | `d2IOtQGjd-M` | +| `_ZN7WebCore25encloseRectToDevicePixelsERKNS_9FloatRectEf` | `N13NkeOmCiU` | +| `_ZN7WebCore25enclosingBlockFlowElementERKNS_15VisiblePositionE` | `nLnz3XxhWuM` | +| `_ZN7WebCore25getOutOfLineCachedWrapperEPNS_17JSDOMGlobalObjectERNS_4NodeE` | `YKwPUXLyid0` | +| `_ZN7WebCore25unwrapSerializedCryptoKeyERKN3WTF6VectorIhLm0ENS0_15CrashOnOverflowELm16ENS0_10FastMallocEEES6_RS4_` | `m2S0+pUgP1s` | +| `_ZN7WebCore25updateRedirectChainStatusERNS_24RedirectChainCacheStatusERKNS_16ResourceResponseE` | `p0gmbQAKkSg` | +| `_ZN7WebCore26ContextDestructionObserver16contextDestroyedEv` | `yDx4ChtWlr8` | +| `_ZN7WebCore26ContextDestructionObserverC1EPNS_22ScriptExecutionContextE` | `agNCTw395Jg` | +| `_ZN7WebCore26ContextDestructionObserverC2EPNS_22ScriptExecutionContextE` | `3j07a9DNBEY` | +| `_ZN7WebCore26ContextDestructionObserverD0Ev` | `llD6Bs1Iec4` | +| `_ZN7WebCore26ContextDestructionObserverD1Ev` | `Mu+y6pZP2nw` | +| `_ZN7WebCore26ContextDestructionObserverD2Ev` | `PRt5TR3b1NE` | +| `_ZN7WebCore26CustomElementReactionStack12processQueueEPN3JSC14JSGlobalObjectE` | `-5cV-3bxnS4` | +| `_ZN7WebCore26HTMLTextFormControlElement12setMaxLengthEi` | `SMevfKx0uXk` | +| `_ZN7WebCore26HTMLTextFormControlElement21setCanShowPlaceholderEb` | `iSolxX558O0` | +| `_ZN7WebCore26HTMLTextFormControlElement21setSelectionDirectionERKN3WTF6StringE` | `5lqFaOk9rQE` | +| `_ZN7WebCore26HTMLTextFormControlElement6selectENS_19SelectionRevealModeERKNS_23AXTextStateChangeIntentE` | `2P789Qo27CQ` | +| `_ZN7WebCore26ISOProtectionSchemeInfoBox11boxTypeNameEv` | `BgqMT+9JnBk` | +| `_ZN7WebCore26ISOProtectionSchemeInfoBox5parseERN3JSC8DataViewERj` | `dpnSZ6bCdKs` | +| `_ZN7WebCore26ISOProtectionSchemeInfoBoxC1Ev` | `4gLqVhLngro` | +| `_ZN7WebCore26ISOProtectionSchemeInfoBoxC2Ev` | `O5XvFuIJg4Y` | +| `_ZN7WebCore26ISOProtectionSchemeInfoBoxD0Ev` | `RdGRa17Q91g` | +| `_ZN7WebCore26ISOProtectionSchemeInfoBoxD1Ev` | `3yVtByzKow4` | +| `_ZN7WebCore26ISOProtectionSchemeInfoBoxD2Ev` | `0TEQ2c-FFK8` | +| `_ZN7WebCore26IdentityTransformOperation6createEv` | `xPYPMODatn4` | +| `_ZN7WebCore26Matrix3DTransformOperation6createERKNS_20TransformationMatrixE` | `juxjuz-22RA` | +| `_ZN7WebCore26MessagePortChannelProvider17setSharedProviderERS0_` | `EuJ8rkwxX9c` | +| `_ZN7WebCore26MessagePortChannelRegistry19didCloseMessagePortERKNS_21MessagePortIdentifierE` | `6ZoLlhh15CA` | +| `_ZN7WebCore26MessagePortChannelRegistry22didPostMessageToRemoteEONS_23MessageWithMessagePortsERKNS_21MessagePortIdentifierE` | `vKaC4HP88c8` | +| `_ZN7WebCore26MessagePortChannelRegistry25didDisentangleMessagePortERKNS_21MessagePortIdentifierE` | `2HQ55UMlE5s` | +| `_ZN7WebCore26MessagePortChannelRegistry25messagePortChannelCreatedERNS_18MessagePortChannelE` | `OWpK2Dj6-R8` | +| `_ZN7WebCore26MessagePortChannelRegistry27didCreateMessagePortChannelERKNS_21MessagePortIdentifierES3_` | `LLV4uk6ZnYg` | +| `_ZN7WebCore26MessagePortChannelRegistry27messagePortChannelDestroyedERNS_18MessagePortChannelE` | `xjKlGy9x95I` | +| `_ZN7WebCore26MessagePortChannelRegistry29existingChannelContainingPortERKNS_21MessagePortIdentifierE` | `JQTLT4u+1Go` | +| `_ZN7WebCore26MessagePortChannelRegistryD1Ev` | `MBvOb2GxOPg` | +| `_ZN7WebCore26MessagePortChannelRegistryD2Ev` | `fsMou-R4zfM` | +| `_ZN7WebCore26UserTypingGestureIndicator27processingUserTypingGestureEv` | `wX+icr0jCqo` | +| `_ZN7WebCore26UserTypingGestureIndicator28focusedElementAtGestureStartEv` | `fEl7vm4p-tI` | +| `_ZN7WebCore26UserTypingGestureIndicatorD1Ev` | `aKDkxJobGsk` | +| `_ZN7WebCore26UserTypingGestureIndicatorD2Ev` | `0cS888QfmWg` | +| `_ZN7WebCore26propagateExceptionSlowPathERN3JSC14JSGlobalObjectERNS0_10ThrowScopeEONS_9ExceptionE` | `Qsw5iOv5DiE` | +| `_ZN7WebCore27AuthenticationChallengeBase7nullifyEv` | `FGotBpRW4fs` | +| `_ZN7WebCore27AuthenticationChallengeBaseC1ERKNS_15ProtectionSpaceERKNS_10CredentialEjRKNS_16ResourceResponseERKNS_13ResourceErrorE` | `NLO8s4jB0E4` | +| `_ZN7WebCore27AuthenticationChallengeBaseC1Ev` | `mxdiKUT7eAI` | +| `_ZN7WebCore27AuthenticationChallengeBaseC2ERKNS_15ProtectionSpaceERKNS_10CredentialEjRKNS_16ResourceResponseERKNS_13ResourceErrorE` | `RzRsLY0gRWM` | +| `_ZN7WebCore27AuthenticationChallengeBaseC2Ev` | `-czxS5OBjQE` | +| `_ZN7WebCore27CSSComputedStyleDeclaration3refEv` | `p46F89e+PsY` | +| `_ZN7WebCore27CSSComputedStyleDeclaration5derefEv` | `dqxQeperDHk` | +| `_ZN7WebCore27CSSComputedStyleDeclaration6createERNS_7ElementEbN3WTF10StringViewE` | `ZnhNmHCwuu4` | +| `_ZN7WebCore27ContentSecurityPolicyClientC2ERKS0_` | `mDeup2ozJz4` | +| `_ZN7WebCore27ContentSecurityPolicyClientC2Ev` | `dQ3p09wGMvQ` | +| `_ZN7WebCore27ContentSecurityPolicyClientD0Ev` | `UoaDfV72Frw` | +| `_ZN7WebCore27ContentSecurityPolicyClientD1Ev` | `cMEdJ1S+9Pk` | +| `_ZN7WebCore27ContentSecurityPolicyClientD2Ev` | `9loQX1sfAyo` | +| `_ZN7WebCore27ContentSecurityPolicyClientaSERKS0_` | `YrDZBurK+Fc` | +| `_ZN7WebCore27DeviceOrientationClientMockC1Ev` | `Tr-khnFGJqA` | +| `_ZN7WebCore27DeviceOrientationClientMockC2Ev` | `E0QCvEG2ONQ` | +| `_ZN7WebCore27DocumentTimelinesController16resumeAnimationsEv` | `fqHL2fhC7Lw` | +| `_ZN7WebCore27DocumentTimelinesController17suspendAnimationsEv` | `OGPOVyvRKkw` | +| `_ZN7WebCore27PlatformMediaSessionManager12restrictionsENS_20PlatformMediaSession9MediaTypeE` | `OJnJ+0Hi9S0` | +| `_ZN7WebCore27PlatformMediaSessionManager13sharedManagerEv` | `UTXH2LMXej8` | +| `_ZN7WebCore27PlatformMediaSessionManager14addRestrictionENS_20PlatformMediaSession9MediaTypeEj` | `mUy-LEiEf9k` | +| `_ZN7WebCore27PlatformMediaSessionManager15endInterruptionENS_20PlatformMediaSession20EndInterruptionFlagsE` | `3e6bFf4-3+8` | +| `_ZN7WebCore27PlatformMediaSessionManager16processDidResumeEv` | `C0yCmcRkfH8` | +| `_ZN7WebCore27PlatformMediaSessionManager17beginInterruptionENS_20PlatformMediaSession16InterruptionTypeE` | `q9-vE4ZHT7k` | +| `_ZN7WebCore27PlatformMediaSessionManager17removeRestrictionENS_20PlatformMediaSession9MediaTypeEj` | `K3dYYv4B434` | +| `_ZN7WebCore27PlatformMediaSessionManager18processWillSuspendEv` | `HOjCRclP1Lw` | +| `_ZN7WebCore27PlatformMediaSessionManager20processSystemDidWakeEv` | `Zeqe6awrWVM` | +| `_ZN7WebCore27PlatformMediaSessionManager21addAudioCaptureSourceERNS_20PlatformMediaSession18AudioCaptureSourceE` | `LExasWS3ZTg` | +| `_ZN7WebCore27PlatformMediaSessionManager21sharedManagerIfExistsEv` | `9QLkVzWD0Z8` | +| `_ZN7WebCore27PlatformMediaSessionManager22processSystemWillSleepEv` | `hsNxIw6p60g` | +| `_ZN7WebCore27PlatformMediaSessionManager24removeAudioCaptureSourceERNS_20PlatformMediaSession18AudioCaptureSourceE` | `xbH8wKcAz6o` | +| `_ZN7WebCore27PlatformMediaSessionManager26applicationDidBecomeActiveEv` | `4rNrGeXUMCU` | +| `_ZN7WebCore27PlatformMediaSessionManager28shouldDeactivateAudioSessionEv` | `Y248zKEoozw` | +| `_ZN7WebCore27PlatformMediaSessionManager29applicationDidEnterBackgroundEb` | `ZlTzqRRuq7o` | +| `_ZN7WebCore27PlatformMediaSessionManager29applicationWillBecomeInactiveEv` | `xbsFHrTpdoc` | +| `_ZN7WebCore27PlatformMediaSessionManager30applicationWillEnterForegroundEb` | `Aw3HmCDPjnw` | +| `_ZN7WebCore27PlatformMediaSessionManager31setShouldDeactivateAudioSessionEb` | `ej7wlPeKlro` | +| `_ZN7WebCore27PlatformMediaSessionManager32setIsPlayingToAutomotiveHeadUnitEb` | `kYgNNhsYnJA` | +| `_ZN7WebCore27parseCacheControlDirectivesERKNS_13HTTPHeaderMapE` | `kB7iRn6G2NQ` | +| `_ZN7WebCore27parseHTMLNonNegativeIntegerEN3WTF10StringViewE` | `V4T4zWxST6E` | +| `_ZN7WebCore27screenSupportsExtendedColorEPNS_6WidgetE` | `V0+T-rQTbe0` | +| `_ZN7WebCore27withinTextUnitOfGranularityERKNS_15VisiblePositionENS_15TextGranularityENS_18SelectionDirectionE` | `3M4Zu3TOlcI` | +| `_ZN7WebCore28BackingStoreBackendCairoImplC1ERKNS_7IntSizeEf` | `h3up3fILBXA` | +| `_ZN7WebCore28BackingStoreBackendCairoImplC2ERKNS_7IntSizeEf` | `SW7SgFwOmu4` | +| `_ZN7WebCore28BackingStoreBackendCairoImplD0Ev` | `DXJAxIde0V0` | +| `_ZN7WebCore28BackingStoreBackendCairoImplD1Ev` | `48hqfJY4ZT0` | +| `_ZN7WebCore28BackingStoreBackendCairoImplD2Ev` | `s-757sLlVkE` | +| `_ZN7WebCore28DisplayRefreshMonitorManager13sharedManagerEv` | `uQ6pBAcK42U` | +| `_ZN7WebCore28InspectorFrontendClientLocal10resetStateEv` | `djDvnpnog-E` | +| `_ZN7WebCore28InspectorFrontendClientLocal11showConsoleEv` | `lzNy6QrJNW8` | +| `_ZN7WebCore28InspectorFrontendClientLocal12moveWindowByEff` | `HsNDwPVrVQA` | +| `_ZN7WebCore28InspectorFrontendClientLocal13showResourcesEv` | `O02W1w+o6SQ` | +| `_ZN7WebCore28InspectorFrontendClientLocal14frontendLoadedEv` | `C0MWlYbPFGA` | +| `_ZN7WebCore28InspectorFrontendClientLocal15canAttachWindowEv` | `VrOadwAC89o` | +| `_ZN7WebCore28InspectorFrontendClientLocal15changeSheetRectERKNS_9FloatRectE` | `9AXx+6CVOxs` | +| `_ZN7WebCore28InspectorFrontendClientLocal17setAttachedWindowENS_23InspectorFrontendClient8DockSideE` | `N23FocGkWvw` | +| `_ZN7WebCore28InspectorFrontendClientLocal18isDebuggingEnabledEv` | `ctsXSiaG96w` | +| `_ZN7WebCore28InspectorFrontendClientLocal18requestSetDockSideENS_23InspectorFrontendClient8DockSideE` | `LFNGiVQF9iM` | +| `_ZN7WebCore28InspectorFrontendClientLocal19setDebuggingEnabledEb` | `8-64JQpyWp0` | +| `_ZN7WebCore28InspectorFrontendClientLocal19windowObjectClearedEv` | `lDIOMm81QJk` | +| `_ZN7WebCore28InspectorFrontendClientLocal20sendMessageToBackendERKN3WTF6StringE` | `nB5P77Apjzw` | +| `_ZN7WebCore28InspectorFrontendClientLocal21isProfilingJavaScriptEv` | `Ta2tL2y1+u4` | +| `_ZN7WebCore28InspectorFrontendClientLocal21setDockingUnavailableEb` | `0SYMhAX9h6k` | +| `_ZN7WebCore28InspectorFrontendClientLocal24startProfilingJavaScriptEv` | `rNX5+wtR2nY` | +| `_ZN7WebCore28InspectorFrontendClientLocal25changeAttachedWindowWidthEj` | `a7g2st0fBKY` | +| `_ZN7WebCore28InspectorFrontendClientLocal26changeAttachedWindowHeightEj` | `qSfNDAxTqSA` | +| `_ZN7WebCore28InspectorFrontendClientLocal26isTimelineProfilingEnabledEv` | `IkmBuACxfkg` | +| `_ZN7WebCore28InspectorFrontendClientLocal27restoreAttachedWindowHeightEv` | `cbav3fQYrjw` | +| `_ZN7WebCore28InspectorFrontendClientLocal27setTimelineProfilingEnabledEb` | `o+HtxlKwm38` | +| `_ZN7WebCore28InspectorFrontendClientLocal30constrainedAttachedWindowWidthEjj` | `nXK4qHSpPvQ` | +| `_ZN7WebCore28InspectorFrontendClientLocal31constrainedAttachedWindowHeightEjj` | `BbiDee1C8AE` | +| `_ZN7WebCore28InspectorFrontendClientLocal8Settings11setPropertyERKN3WTF6StringES5_` | `I9uZ6uF29YY` | +| `_ZN7WebCore28InspectorFrontendClientLocal8Settings14deletePropertyERKN3WTF6StringE` | `QfBKuqPXKZo` | +| `_ZN7WebCore28InspectorFrontendClientLocal8SettingsC1ERKS1_` | `n8Re5ynSfjU` | +| `_ZN7WebCore28InspectorFrontendClientLocal8SettingsC1Ev` | `WvNZUdSvf6E` | +| `_ZN7WebCore28InspectorFrontendClientLocal8SettingsC2ERKS1_` | `1KYfLN5YfnI` | +| `_ZN7WebCore28InspectorFrontendClientLocal8SettingsC2Ev` | `SrZqj8GEkmM` | +| `_ZN7WebCore28InspectorFrontendClientLocal8SettingsD0Ev` | `1fxTJU+D6n0` | +| `_ZN7WebCore28InspectorFrontendClientLocal8SettingsD1Ev` | `i0Ipda+ehgc` | +| `_ZN7WebCore28InspectorFrontendClientLocal8SettingsD2Ev` | `WpOA+METUbw` | +| `_ZN7WebCore28InspectorFrontendClientLocal8SettingsaSERKS1_` | `8S2712b7L7o` | +| `_ZN7WebCore28InspectorFrontendClientLocal8SettingsdaEPv` | `5TlM-h+ipBU` | +| `_ZN7WebCore28InspectorFrontendClientLocal8SettingsdlEPv` | `JFRj1nTrGl4` | +| `_ZN7WebCore28InspectorFrontendClientLocal8SettingsnaEmPv` | `wWhSR9TfAr4` | +| `_ZN7WebCore28InspectorFrontendClientLocal8SettingsnaEm` | `ivkMzBxwCsY` | +| `_ZN7WebCore28InspectorFrontendClientLocal8SettingsnwEmPv` | `F+EdH4XRvTw` | +| `_ZN7WebCore28InspectorFrontendClientLocal8SettingsnwEm` | `s46e1bVNWNg` | +| `_ZN7WebCore28InspectorFrontendClientLocalD0Ev` | `2ZnBc9ZCIqw` | +| `_ZN7WebCore28InspectorFrontendClientLocalD1Ev` | `QmGv7hQbpfo` | +| `_ZN7WebCore28InspectorFrontendClientLocalD2Ev` | `OjzayySo58A` | +| `_ZN7WebCore28convertToIntegerEnforceRangeIaEET_RN3JSC14JSGlobalObjectENS2_7JSValueE` | `cL2mamO1FO8` | +| `_ZN7WebCore28convertToIntegerEnforceRangeIhEET_RN3JSC14JSGlobalObjectENS2_7JSValueE` | `ezFSbCdCU9o` | +| `_ZN7WebCore28convertToIntegerEnforceRangeIiEET_RN3JSC14JSGlobalObjectENS2_7JSValueE` | `Yhosbd4E8gg` | +| `_ZN7WebCore28convertToIntegerEnforceRangeIjEET_RN3JSC14JSGlobalObjectENS2_7JSValueE` | `U7NqWR0tCXk` | +| `_ZN7WebCore28convertToIntegerEnforceRangeIlEET_RN3JSC14JSGlobalObjectENS2_7JSValueE` | `yqROfLGUmDg` | +| `_ZN7WebCore28convertToIntegerEnforceRangeImEET_RN3JSC14JSGlobalObjectENS2_7JSValueE` | `PmW8tQ5KXZU` | +| `_ZN7WebCore28convertToIntegerEnforceRangeIsEET_RN3JSC14JSGlobalObjectENS2_7JSValueE` | `ibPpWj9p9aE` | +| `_ZN7WebCore28convertToIntegerEnforceRangeItEET_RN3JSC14JSGlobalObjectENS2_7JSValueE` | `HlaoRo4Ttd0` | +| `_ZN7WebCore28throwArgumentMustBeEnumErrorERN3JSC14JSGlobalObjectERNS0_10ThrowScopeEjPKcS6_S6_S6_` | `vnz5qqFZXZg` | +| `_ZN7WebCore28throwRequiredMemberTypeErrorERN3JSC14JSGlobalObjectERNS0_10ThrowScopeEPKcS6_S6_` | `1oeM2V1M67o` | +| `_ZN7WebCore28topPrivatelyControlledDomainERKN3WTF6StringE` | `GxVDSv5dIws` | +| `_ZN7WebCore29SQLiteStatementAutoResetScopeC1EOS0_` | `EiOhI0xdnqs` | +| `_ZN7WebCore29SQLiteStatementAutoResetScopeC1EPNS_15SQLiteStatementE` | `uYdGxAnSrr4` | +| `_ZN7WebCore29SQLiteStatementAutoResetScopeC2EOS0_` | `I6BK+r-jqhk` | +| `_ZN7WebCore29SQLiteStatementAutoResetScopeC2EPNS_15SQLiteStatementE` | `db4-SF3n8lE` | +| `_ZN7WebCore29SQLiteStatementAutoResetScopeD1Ev` | `-D-Dsk4CZXA` | +| `_ZN7WebCore29SQLiteStatementAutoResetScopeD2Ev` | `W4vhaG7GsbI` | +| `_ZN7WebCore29SQLiteStatementAutoResetScopeaSEOS0_` | `5Z7z4XjqxcA` | +| `_ZN7WebCore29createDefaultParagraphElementERNS_8DocumentE` | `20UTKti9SoQ` | +| `_ZN7WebCore29updateRequestForAccessControlERNS_15ResourceRequestERNS_14SecurityOriginENS_23StoredCredentialsPolicyE` | `JC5ommFaOHo` | +| `_ZN7WebCore30InspectorInstrumentationPublic12hasFrontendsEv` | `jaa1AktSI-g` | +| `_ZN7WebCore30InspectorInstrumentationWebKit16interceptRequestERNS_14ResourceLoaderEON3WTF8FunctionIFvRKNS_15ResourceRequestEEEE` | `gsU+cMJEcWw` | +| `_ZN7WebCore30InspectorInstrumentationWebKit24interceptRequestInternalERNS_14ResourceLoaderEON3WTF8FunctionIFvRKNS_15ResourceRequestEEEE` | `G+6r8z+ZKDY` | +| `_ZN7WebCore30InvertLightnessFilterOperation6createEv` | `hw4Jl+IMDhA` | +| `_ZN7WebCore30InvertLightnessFilterOperationC1Ev` | `Xorc5+tFQm8` | +| `_ZN7WebCore30InvertLightnessFilterOperationC2Ev` | `Ug6uMIR1xcs` | +| `_ZN7WebCore30InvertLightnessFilterOperationD0Ev` | `8UCA-GchFo0` | +| `_ZN7WebCore30InvertLightnessFilterOperationD1Ev` | `9qmxcoe8Y4A` | +| `_ZN7WebCore30InvertLightnessFilterOperationD2Ev` | `AhNHpLBVqAI` | +| `_ZN7WebCore30closestWordBoundaryForPositionERKNS_15VisiblePositionE` | `wGksbXEKspk` | +| `_ZN7WebCore30forwardForEachCallToBackingMapERNS_17JSDOMGlobalObjectERN3JSC9CallFrameERNS2_8JSObjectE` | `ohECoBXM0fg` | +| `_ZN7WebCore30forwardForEachCallToBackingSetERNS_17JSDOMGlobalObjectERN3JSC9CallFrameERNS2_8JSObjectE` | `JMwBt9GFCBo` | +| `_ZN7WebCore30makeRangeSelectingNodeContentsERNS_4NodeE` | `veUz0LV2k1w` | +| `_ZN7WebCore30rejectPromiseWithThisTypeErrorERN3JSC14JSGlobalObjectEPKcS4_` | `dLvYqphQ+l8` | +| `_ZN7WebCore30rejectPromiseWithThisTypeErrorERNS_15DeferredPromiseEPKcS3_` | `KAC-e9-fPB0` | +| `_ZN7WebCore30throwArgumentMustBeObjectErrorERN3JSC14JSGlobalObjectERNS0_10ThrowScopeEjPKcS6_S6_` | `nL9HXk4CVXY` | +| `_ZN7WebCore31BasicColorMatrixFilterOperationD0Ev` | `b4VomvIAJcg` | +| `_ZN7WebCore31BasicColorMatrixFilterOperationD1Ev` | `u5QsY4w3PH4` | +| `_ZN7WebCore31BasicColorMatrixFilterOperationD2Ev` | `eYib7znGCTY` | +| `_ZN7WebCore31CrossOriginPreflightResultCache5clearEv` | `KVJX+ztPuYI` | +| `_ZN7WebCore31CrossOriginPreflightResultCache9singletonEv` | `ZJYGaq4z9Pc` | +| `_ZN7WebCore31MediaEngineConfigurationFactory10enableMockEv` | `0lZViUngUpg` | +| `_ZN7WebCore31MediaEngineConfigurationFactory11disableMockEv` | `9w+kRyuPZOM` | +| `_ZN7WebCore31SimplifiedBackwardsTextIterator7advanceEv` | `avUJ35W2eSs` | +| `_ZN7WebCore31SimplifiedBackwardsTextIteratorC1ERKNS_11SimpleRangeE` | `r0CpwRVV56g` | +| `_ZN7WebCore31SimplifiedBackwardsTextIteratorC2ERKNS_11SimpleRangeE` | `0hM0IsN0uGo` | +| `_ZN7WebCore31forwardFunctionCallToBackingMapERN3JSC14JSGlobalObjectERNS0_9CallFrameERNS0_8JSObjectERKNS0_10IdentifierE` | `RRJH3Fu-5qY` | +| `_ZN7WebCore31forwardFunctionCallToBackingSetERN3JSC14JSGlobalObjectERNS0_9CallFrameERNS0_8JSObjectERKNS0_10IdentifierE` | `FvxQvacs+F8` | +| `_ZN7WebCore31rejectPromiseWithExceptionIfAnyERN3JSC14JSGlobalObjectERNS_17JSDOMGlobalObjectERNS0_9JSPromiseERNS0_10CatchScopeE` | `MLTGlp9tCpg` | +| `_ZN7WebCore32WorkerThreadableWebSocketChannelC1ERNS_17WorkerGlobalScopeERNS_22WebSocketChannelClientERKN3WTF6StringERNS_14SocketProviderE` | `CpVHU7S7LN0` | +| `_ZN7WebCore32WorkerThreadableWebSocketChannelC2ERNS_17WorkerGlobalScopeERNS_22WebSocketChannelClientERKN3WTF6StringERNS_14SocketProviderE` | `HKNLNiIM8TY` | +| `_ZN7WebCore32isSimpleCrossOriginAccessRequestERKN3WTF6StringERKNS_13HTTPHeaderMapE` | `eNFR5wiR41Y` | +| `_ZN7WebCore32serializationForRenderTreeAsTextERKNS_5ColorE` | `efuMHaAx5-M` | +| `_ZN7WebCore32throwArgumentMustBeFunctionErrorERN3JSC14JSGlobalObjectERNS0_10ThrowScopeEjPKcS6_S6_` | `8wr9i3BWSBw` | +| `_ZN7WebCore32useBlockedPlugInContextMenuTitleEv` | `KYICSuDQehA` | +| `_ZN7WebCore33testPreloadScannerViewportSupportEPNS_8DocumentE` | `28uM7rlJq0g` | +| `_ZN7WebCore34forwardAttributeGetterToBackingMapERN3JSC14JSGlobalObjectERNS0_8JSObjectERKNS0_10IdentifierE` | `X510jAtyfhk` | +| `_ZN7WebCore34forwardAttributeGetterToBackingSetERN3JSC14JSGlobalObjectERNS0_8JSObjectERKNS0_10IdentifierE` | `duJfiox9YWI` | +| `_ZN7WebCore35isEndOfEditableOrNonEditableContentERKNS_15VisiblePositionE` | `PUp9TlmpDys` | +| `_ZN7WebCore35positionOfNextBoundaryOfGranularityERKNS_15VisiblePositionENS_15TextGranularityENS_18SelectionDirectionE` | `9WlCI-P6Q6A` | +| `_ZN7WebCore35serializePreservingVisualAppearanceERKNS_11SimpleRangeEPN3WTF6VectorIPNS_4NodeELm0ENS3_15CrashOnOverflowELm16ENS3_10FastMallocEEENS_22AnnotateForInterchangeENS_22ConvertBlocksToInlinesENS_11ResolveURLsE` | `9rGzyu0ZL0w` | +| `_ZN7WebCore36ContentSecurityPolicyResponseHeadersC1ERKNS_16ResourceResponseE` | `01beKkjIUv8` | +| `_ZN7WebCore36ContentSecurityPolicyResponseHeadersC2ERKNS_16ResourceResponseE` | `2gPLknvqjzk` | +| `_ZN7WebCore36ISOProtectionSystemSpecificHeaderBox11boxTypeNameEv` | `OvTLUSlWifE` | +| `_ZN7WebCore36ISOProtectionSystemSpecificHeaderBox5parseERN3JSC8DataViewERj` | `PkKivtUQ5Mc` | +| `_ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxC1ERKS0_` | `NqUcrCZ7+f4` | +| `_ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxC1Ev` | `Wt4UzkFSXI8` | +| `_ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxC2ERKS0_` | `XWreHmEfxDo` | +| `_ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxC2Ev` | `tSFoKsNPwds` | +| `_ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxD0Ev` | `d-tpkqffj6I` | +| `_ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxD1Ev` | `kQWc+ifDQvA` | +| `_ZN7WebCore36ISOProtectionSystemSpecificHeaderBoxD2Ev` | `bksmE6fo+6E` | +| `_ZN7WebCore36parseCrossOriginResourcePolicyHeaderEN3WTF10StringViewE` | `2sTzwlghBUU` | +| `_ZN7WebCore36registerMemoryReleaseNotifyCallbacksEv` | `XTRBMujlKzo` | +| `_ZN7WebCore36visiblePositionForPositionWithOffsetERKNS_15VisiblePositionEi` | `GwfKLihv7-o` | +| `_ZN7WebCore37BasicComponentTransferFilterOperationD0Ev` | `FeSYwKImb80` | +| `_ZN7WebCore37BasicComponentTransferFilterOperationD1Ev` | `gE+nHqJuNlU` | +| `_ZN7WebCore37BasicComponentTransferFilterOperationD2Ev` | `tcVeGFc80oQ` | +| `_ZN7WebCore37CrossOriginAccessControlCheckDisabler39setCrossOriginAccessControlCheckEnabledEb` | `ludyUJShlO0` | +| `_ZN7WebCore37CrossOriginAccessControlCheckDisabler9singletonEv` | `0TEnTEgQABA` | +| `_ZN7WebCore37CrossOriginAccessControlCheckDisablerC1ERKS0_` | `Fl4Z1PFgaro` | +| `_ZN7WebCore37CrossOriginAccessControlCheckDisablerC1Ev` | `13RlUJaR9MI` | +| `_ZN7WebCore37CrossOriginAccessControlCheckDisablerC2ERKS0_` | `PAZLRuN7rC8` | +| `_ZN7WebCore37CrossOriginAccessControlCheckDisablerC2Ev` | `gev25uQduyQ` | +| `_ZN7WebCore37CrossOriginAccessControlCheckDisablerD0Ev` | `UMkUmoECbCc` | +| `_ZN7WebCore37CrossOriginAccessControlCheckDisablerD1Ev` | `du6k+jO8Pno` | +| `_ZN7WebCore37CrossOriginAccessControlCheckDisablerD2Ev` | `cAaLgTefBKE` | +| `_ZN7WebCore37CrossOriginAccessControlCheckDisableraSERKS0_` | `q+SQjILxj1o` | +| `_ZN7WebCore37WidgetHierarchyUpdatesSuspensionScope11moveWidgetsEv` | `XDdMkcoXOGE` | +| `_ZN7WebCore37computeFreshnessLifetimeForHTTPFamilyERKNS_16ResourceResponseEN3WTF8WallTimeE` | `bbkcYO2xEa8` | +| `_ZN7WebCore38updateResponseHeadersAfterRevalidationERNS_16ResourceResponseERKS0_` | `zM6YDpjXj9E` | +| `_ZN7WebCore39cleanHTTPRequestHeadersForAccessControlERNS_15ResourceRequestEN3WTF9OptionSetINS_29HTTPHeadersToKeepFromCleaningEEE` | `PfN-ltCCZaU` | +| `_ZN7WebCore40restrictMinimumScaleFactorToViewportSizeERNS_18ViewportAttributesENS_7IntSizeEf` | `6-68Bw2XP0Q` | +| `_ZN7WebCore44computeMinimumScaleFactorForContentContainedERKNS_18ViewportAttributesERKNS_7IntSizeES5_` | `4ClN4aYoaK0` | +| `_ZN7WebCore46visibleImageElementsInRangeWithNonLoadedImagesERKNS_11SimpleRangeE` | `1Nf0+rjfAs0` | +| `_ZN7WebCore48closestEditablePositionInElementForAbsolutePointERKNS_7ElementERKNS_8IntPointE` | `8xXJUdXNHL4` | +| `_ZN7WebCore49reportExtraMemoryAllocatedForCollectionIndexCacheEm` | `4S-fEuv1EaE` | +| `_ZN7WebCore4Attr5styleEv` | `5d77I8lC8Ek` | +| `_ZN7WebCore4Attr8setValueERKN3WTF10AtomStringE` | `nO7lhWYZA+8` | +| `_ZN7WebCore4BlobC1EPNS_22ScriptExecutionContextE` | `-FDuN-QPtQc` | +| `_ZN7WebCore4BlobC2EPNS_22ScriptExecutionContextE` | `eBmVcCoq0dI` | +| `_ZN7WebCore4FontD1Ev` | `v9N11LJEe1M` | +| `_ZN7WebCore4FontD2Ev` | `MxmYa9wUIWk` | +| `_ZN7WebCore4Icon18createIconForFilesERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE` | `KJgvss90XpU` | +| `_ZN7WebCore4IconD1Ev` | `uFupHs7z5AI` | +| `_ZN7WebCore4IconD2Ev` | `NPbIhNzp7tY` | +| `_ZN7WebCore4Node10childNodesEv` | `AChB3w1OeOg` | +| `_ZN7WebCore4Node10renderRectEPb` | `X8YZWdgpCTs` | +| `_ZN7WebCore4Node11appendChildERS0_` | `nKaqdLF-yoo` | +| `_ZN7WebCore4Node11removeChildERS0_` | `pgnOeOF2Nkc` | +| `_ZN7WebCore4Node12insertBeforeERS0_PS0_` | `Hwk+RGbntvs` | +| `_ZN7WebCore4Node12replaceChildERS0_S1_` | `HPKQqF68JGw` | +| `_ZN7WebCore4Node14removedLastRefEv` | `S33W6I2T8x8` | +| `_ZN7WebCore4Node17stopIgnoringLeaksEv` | `mx3h6KLAu9Y` | +| `_ZN7WebCore4Node18dispatchInputEventEv` | `juoVF+HEj1k` | +| `_ZN7WebCore4Node18startIgnoringLeaksEv` | `4c1ohhNTURs` | +| `_ZN7WebCore4Node20cloneNodeForBindingsEb` | `eLqCz3qQ-wA` | +| `_ZN7WebCore4Node23compareDocumentPositionERS0_` | `KrP+Brx0nFA` | +| `_ZN7WebCore4Node6removeEv` | `OVD8IJm1crQ` | +| `_ZN7WebCore4Node7inspectEv` | `Ku-NWyHoPiE` | +| `_ZN7WebCore4Node9normalizeEv` | `bTqbGNsvALM` | +| `_ZN7WebCore4Page10findStringERKN3WTF6StringENS1_9OptionSetINS_14FindOptionFlagEEEPNS_7DidWrapE` | `hsQBBJvoKfI` | +| `_ZN7WebCore4Page10pluginDataEv` | `6SFD859+uLU` | +| `_ZN7WebCore4Page11forEachPageERKN3WTF8FunctionIFvRS0_EEE` | `UrGQ+Gt1JRY` | +| `_ZN7WebCore4Page12setGroupNameERKN3WTF6StringE` | `N+6icO7uEd0` | +| `_ZN7WebCore4Page12setIsVisibleEb` | `zPDRirPat0g` | +| `_ZN7WebCore4Page12setSessionIDEN3PAL9SessionIDE` | `7SMZl95BBCk` | +| `_ZN7WebCore4Page12whenUnnestedEON3WTF8FunctionIFvvEEE` | `fQjii2zz1Vk` | +| `_ZN7WebCore4Page13setIsInWindowEb` | `icNdSConcbs` | +| `_ZN7WebCore4Page13setPaginationERKNS_10PaginationE` | `fB4+YDTIlsQ` | +| `_ZN7WebCore4Page14layoutIfNeededEv` | `tMkgUvy3XaQ` | +| `_ZN7WebCore4Page14setIsPrerenderEv` | `kh0okTVsSq4` | +| `_ZN7WebCore4Page14setMediaVolumeEf` | `2gLa4w1nQqM` | +| `_ZN7WebCore4Page15setHeaderHeightEi` | `sFDXBmJvlSQ` | +| `_ZN7WebCore4Page15updateRenderingEv` | `QbegXjA71IY` | +| `_ZN7WebCore4Page16countFindMatchesERKN3WTF6StringENS1_9OptionSetINS_14FindOptionFlagEEEj` | `h7JE0iSewi4` | +| `_ZN7WebCore4Page16setCanStartMediaEb` | `HDjIl2Orp6k` | +| `_ZN7WebCore4Page16setDefersLoadingEb` | `QiyjwGiIndQ` | +| `_ZN7WebCore4Page16userAgentChangedEv` | `w18yIZcPEuE` | +| `_ZN7WebCore4Page18setPageScaleFactorEfRKNS_8IntPointEb` | `ACVeBkbSTvI` | +| `_ZN7WebCore4Page18setTopContentInsetEf` | `omgyrKgp3bQ` | +| `_ZN7WebCore4Page18setViewScaleFactorEf` | `hKIBf2+zj-4` | +| `_ZN7WebCore4Page19addLayoutMilestonesEN3WTF9OptionSetINS_15LayoutMilestoneEEE` | `hn6OmDjk0ao` | +| `_ZN7WebCore4Page19appearanceDidChangeEv` | `vdxxSjPNWcc` | +| `_ZN7WebCore4Page19setDelegatesScalingEb` | `3p1EBzuU7lg` | +| `_ZN7WebCore4Page19setFullscreenInsetsERKNS_9RectEdgesIfEE` | `QBA+njDpP7A` | +| `_ZN7WebCore4Page19userContentProviderEv` | `ANSEMiIMnOM` | +| `_ZN7WebCore4Page20injectUserStyleSheetERNS_14UserStyleSheetE` | `a3thfBcgdFc` | +| `_ZN7WebCore4Page20scrollingCoordinatorEv` | `iZ5JYUTbjuA` | +| `_ZN7WebCore4Page20setDeviceScaleFactorEf` | `1rOfBYZN9ww` | +| `_ZN7WebCore4Page20unmarkAllTextMatchesEv` | `FrIZp6mPIq0` | +| `_ZN7WebCore4Page21markAllMatchesForTextERKN3WTF6StringENS1_9OptionSetINS_14FindOptionFlagEEEbj` | `RVFeL4V1-pM` | +| `_ZN7WebCore4Page21replaceRangesWithTextERKN3WTF6VectorINS_11SimpleRangeELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEERKNS1_6StringEb` | `mUoaNvxznHs` | +| `_ZN7WebCore4Page21resumeAnimatingImagesEv` | `zytPJruS5qI` | +| `_ZN7WebCore4Page22removeLayoutMilestonesEN3WTF9OptionSetINS_15LayoutMilestoneEEE` | `R3nFNsfiGUQ` | +| `_ZN7WebCore4Page22resumeAllMediaPlaybackEv` | `lOi2xW4VGvE` | +| `_ZN7WebCore4Page22revealCurrentSelectionEv` | `h0AD0dCrvSc` | +| `_ZN7WebCore4Page22setUseSystemAppearanceEb` | `gdduqOWJpMo` | +| `_ZN7WebCore4Page23clearUndoRedoOperationsEv` | `cyTN4IIukQU` | +| `_ZN7WebCore4Page23dispatchAfterPrintEventEv` | `VbqVvelTDGI` | +| `_ZN7WebCore4Page23finalizeRenderingUpdateEN3WTF9OptionSetINS_28FinalizeRenderingUpdateFlagsEEE` | `6Lv5NxeQdlE` | +| `_ZN7WebCore4Page23invalidateStylesForLinkEj` | `UOAJwlM34N4` | +| `_ZN7WebCore4Page23resumeAllMediaBufferingEv` | `3gGbs2iwSdM` | +| `_ZN7WebCore4Page23suspendAllMediaPlaybackEv` | `B6KaJRpSuIc` | +| `_ZN7WebCore4Page24dispatchBeforePrintEventEv` | `1lRj0KYFqu4` | +| `_ZN7WebCore4Page24replaceSelectionWithTextERKN3WTF6StringE` | `J2wE7kcMwmA` | +| `_ZN7WebCore4Page24resumeScriptedAnimationsEv` | `hoTMzMqGIYk` | +| `_ZN7WebCore4Page24scrollingStateTreeAsTextEv` | `-sTHNB0pBec` | +| `_ZN7WebCore4Page24setCORSDisablingPatternsEON3WTF6VectorINS_21UserContentURLPatternELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE` | `Vi48XDpvR-M` | +| `_ZN7WebCore4Page24suspendAllMediaBufferingEv` | `FW9SB4Gw0AM` | +| `_ZN7WebCore4Page25notifyToInjectUserScriptsEv` | `Ne8m91Q1Hts` | +| `_ZN7WebCore4Page25screenPropertiesDidChangeEv` | `jIjtYfrv7VU` | +| `_ZN7WebCore4Page25suspendScriptedAnimationsEv` | `PGcxtCMq4cg` | +| `_ZN7WebCore4Page26applicationDidBecomeActiveEv` | `YaE3CclqDOw` | +| `_ZN7WebCore4Page26clearWheelEventTestMonitorEv` | `KfGOHm3Eikw` | +| `_ZN7WebCore4Page26startMonitoringWheelEventsEb` | `2bdiy8B-X2A` | +| `_ZN7WebCore4Page27applicationWillResignActiveEv` | `X53w3lTzX-w` | +| `_ZN7WebCore4Page27enableICECandidateFilteringEv` | `KM3HTLCv0tk` | +| `_ZN7WebCore4Page27invalidateStylesForAllLinksEv` | `bwD91LR4GWs` | +| `_ZN7WebCore4Page27setFullscreenControlsHiddenEb` | `3DcW5F8pk34` | +| `_ZN7WebCore4Page27setUnobscuredSafeAreaInsetsERKNS_9RectEdgesIfEE` | `nzdgKYmGj2w` | +| `_ZN7WebCore4Page27setVerticalScrollElasticityENS_16ScrollElasticityE` | `KTijpWQ0zuc` | +| `_ZN7WebCore4Page27setZoomedOutPageScaleFactorEf` | `sjDOTvQZaro` | +| `_ZN7WebCore4Page28disableICECandidateFilteringEv` | `ZPlZo-3S8XM` | +| `_ZN7WebCore4Page28effectiveAppearanceDidChangeEbb` | `7CY1Q4PhKOI` | +| `_ZN7WebCore4Page28removeInjectedUserStyleSheetERNS_14UserStyleSheetE` | `Z0Om0daCDpI` | +| `_ZN7WebCore4Page29applicationDidEnterBackgroundEv` | `EqcvUDNk4kE` | +| `_ZN7WebCore4Page29clearPreviousItemFromAllPagesEPNS_11HistoryItemE` | `5Hnl+iQQPyc` | +| `_ZN7WebCore4Page29setFullscreenAutoHideDurationEN3WTF7SecondsE` | `4rJypnZmwSw` | +| `_ZN7WebCore4Page29setHorizontalScrollElasticityENS_16ScrollElasticityE` | `pMxOeBivMSo` | +| `_ZN7WebCore4Page29startTrackingRenderingUpdatesEv` | `SQ9HlRcwJac` | +| `_ZN7WebCore4Page30accessibilitySettingsDidChangeEv` | `94dqjDJwsRY` | +| `_ZN7WebCore4Page30addActivityStateChangeObserverERNS_27ActivityStateChangeObserverE` | `o+roiKCkHO0` | +| `_ZN7WebCore4Page30applicationWillEnterForegroundEv` | `2aa1x2FcJT0` | +| `_ZN7WebCore4Page30setNeedsRecalcStyleInAllFramesEv` | `59wLmumrkno` | +| `_ZN7WebCore4Page31setRemoteInspectionNameOverrideERKN3WTF6StringE` | `isdbBZoLdo4` | +| `_ZN7WebCore4Page31setUserInterfaceLayoutDirectionENS_28UserInterfaceLayoutDirectionE` | `kNmqbnlvatM` | +| `_ZN7WebCore4Page32nonFastScrollableRectsForTestingEv` | `1pJCgibxzYs` | +| `_ZN7WebCore4Page32setMemoryCacheClientCallsEnabledEb` | `YTSpNCfCpGU` | +| `_ZN7WebCore4Page33removeActivityStateChangeObserverERNS_27ActivityStateChangeObserverE` | `7tpfL-ChrcI` | +| `_ZN7WebCore4Page33synchronousScrollingReasonsAsTextEv` | `I8DjaU4h+T8` | +| `_ZN7WebCore4Page34setInitialScaleIgnoringContentSizeEf` | `EWOfML0pnaI` | +| `_ZN7WebCore4Page35resumeActiveDOMObjectsAndAnimationsEv` | `Y6HgZMlmutM` | +| `_ZN7WebCore4Page36setAllowsMediaDocumentInlinePlaybackEb` | `J7Dkz4Xqu4k` | +| `_ZN7WebCore4Page36setShouldSuppressScrollbarAnimationsEb` | `A+ZaAAv53ZU` | +| `_ZN7WebCore4Page36suspendActiveDOMObjectsAndAnimationsEv` | `PMsge+8fcWI` | +| `_ZN7WebCore4Page37setInLowQualityImageInterpolationModeEb` | `yHZvUA01NKo` | +| `_ZN7WebCore4Page40passiveTouchEventListenerRectsForTestingEv` | `ExTBCFtg+Wc` | +| `_ZN7WebCore4Page40updateMediaElementRateChangeRestrictionsEv` | `II+m39Ytbfs` | +| `_ZN7WebCore4Page41setDOMTimerAlignmentIntervalIncreaseLimitEN3WTF7SecondsE` | `ljPTWMFwyIM` | +| `_ZN7WebCore4Page45setOutsideViewportThrottlingEnabledForTestingEb` | `AEG-wbnO1Yc` | +| `_ZN7WebCore4Page52updateStyleForAllPagesAfterGlobalChangeInEnvironmentEv` | `XRSJGYwX4fg` | +| `_ZN7WebCore4Page8goToItemERNS_11HistoryItemENS_13FrameLoadTypeENS_27ShouldTreatAsContinuingLoadE` | `LSHuxNtYMxU` | +| `_ZN7WebCore4Page9initGroupEv` | `KA-NoTpTTbU` | +| `_ZN7WebCore4PageC1EONS_17PageConfigurationE` | `PAcXDENC3IM` | +| `_ZN7WebCore4PageC2EONS_17PageConfigurationE` | `gD21JXx6j-U` | +| `_ZN7WebCore4PageD1Ev` | `GUOkMlvO7D4` | +| `_ZN7WebCore4PageD2Ev` | `4-v5LYnR2Vg` | +| `_ZN7WebCore4Path12closeSubpathEv` | `7QDa1ULaJ7k` | +| `_ZN7WebCore4Path14addQuadCurveToERKNS_10FloatPointES3_` | `F16solOlH-M` | +| `_ZN7WebCore4Path6moveToERKNS_10FloatPointE` | `bsxd9YWqXzE` | +| `_ZN7WebCore4Path9addLineToERKNS_10FloatPointE` | `JePhOKqxF-A` | +| `_ZN7WebCore4PathC1ERKS0_` | `YGF3QRMwOME` | +| `_ZN7WebCore4PathC2ERKS0_` | `WgmTo8l6bAM` | +| `_ZN7WebCore4PathaSERKS0_` | `Ae7Kk0Xypu0` | +| `_ZN7WebCore4Text16replaceWholeTextERKN3WTF6StringE` | `j0n2i6H5JeA` | +| `_ZN7WebCore4Text9splitTextEj` | `3-epgMMMEQ8` | +| `_ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_10AudioTrackE` | `zdSsGpN+fyM` | +| `_ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_10TimeRangesE` | `9qAPLsjRPg4` | +| `_ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_11DOMRectListE` | `uwb9P8Z6SZE` | +| `_ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_12SourceBufferE` | `8IzLkAQdUd8` | +| `_ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_12WebAnimationE` | `w3PQxs6fUrk` | +| `_ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_13FetchResponseE` | `SVtmUw-TJR4` | +| `_ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_14XMLHttpRequestE` | `o3BXFNgV8O0` | +| `_ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_15DOMRectReadOnlyE` | `qK2RJYzNooQ` | +| `_ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_16HTMLImageElementE` | `pXU3zucemj8` | +| `_ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_17AnimationTimelineE` | `m2lRFfVmh-I` | +| `_ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_17DOMMatrixReadOnlyE` | `culi-G6AG7s` | +| `_ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_19CSSStyleDeclarationE` | `G1s+fE+00M4` | +| `_ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_19TextTrackCueGenericE` | `iD-q2ef7s5Y` | +| `_ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_4FileE` | `RAcOLwTQyxc` | +| `_ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_5RangeE` | `64TfvPwyhPM` | +| `_ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_6DOMURLE` | `Um1VUK4rrac` | +| `_ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_6Path2DE` | `ilZYBLM0oXw` | +| `_ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_7DOMRectE` | `P2M834ekYIw` | +| `_ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_7ElementE` | `n1KPXvNBMyA` | +| `_ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_8DocumentE` | `NJP+6AtDiU8` | +| `_ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_8LocationE` | `irlyiBZcAGc` | +| `_ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_9DOMMatrixE` | `fjExfciM3XA` | +| `_ZN7WebCore4toJSEPN3JSC14JSGlobalObjectEPNS_17JSDOMGlobalObjectERNS_9ImageDataE` | `LIS2n5ur2HY` | +| `_ZN7WebCore4toJSEPN3JSC14JSGlobalObjectERNS_11WindowProxyE` | `ZZ2l9nX-CoM` | +| `_ZN7WebCore4toJSERNS_12VoidCallbackE` | `NyZx5EzS4-U` | +| `_ZN7WebCore4toJSERNS_14StringCallbackE` | `AwR16YyyVdI` | +| `_ZN7WebCore50restrictScaleFactorToInitialScaleIfNotUserScalableERNS_18ViewportAttributesE` | `kHd8jF+QltI` | +| `_ZN7WebCore5Cairo11ShadowStateC1ERKNS_20GraphicsContextStateE` | `ugZkPwKokqE` | +| `_ZN7WebCore5Cairo11ShadowStateC2ERKNS_20GraphicsContextStateE` | `UL7nmmoYEsU` | +| `_ZN7WebCore5Event9initEventERKN3WTF10AtomStringEbb` | `HCYsekMO4e4` | +| `_ZN7WebCore5Image12supportsTypeERKN3WTF6StringE` | `bxLuTQ2Uv28` | +| `_ZN7WebCore5Image20loadPlatformResourceEPKc` | `tqo89+Bqhk0` | +| `_ZN7WebCore5Image6createERNS_13ImageObserverE` | `SIs881ae+Us` | +| `_ZN7WebCore5Image9nullImageEv` | `wSZKMWhisbM` | +| `_ZN7WebCore5Range10selectNodeERNS_4NodeE` | `6KS1ap6Jtz0` | +| `_ZN7WebCore5Range11setEndAfterERNS_4NodeE` | `NT7QROKXFRY` | +| `_ZN7WebCore5Range12setEndBeforeERNS_4NodeE` | `ezaYencgnIE` | +| `_ZN7WebCore5Range13cloneContentsEv` | `dioJZ1zC+BY` | +| `_ZN7WebCore5Range13setStartAfterERNS_4NodeE` | `sd8GFcARuLg` | +| `_ZN7WebCore5Range14deleteContentsEv` | `hmLDjpBojik` | +| `_ZN7WebCore5Range14isPointInRangeERNS_4NodeEj` | `HNTSSfhy2tE` | +| `_ZN7WebCore5Range14setStartBeforeERNS_4NodeE` | `A77t-NPbEOE` | +| `_ZN7WebCore5Range15extractContentsEv` | `bohNz-tz6oM` | +| `_ZN7WebCore5Range16surroundContentsERNS_4NodeE` | `bEyPZm9p+kk` | +| `_ZN7WebCore5Range18selectNodeContentsERNS_4NodeE` | `6grFSpPJQ1w` | +| `_ZN7WebCore5Range24createContextualFragmentERKN3WTF6StringE` | `1wcdIyiFb94` | +| `_ZN7WebCore5Range6createERNS_8DocumentE` | `hsnWHtg+tNE` | +| `_ZN7WebCore5Range6expandERKN3WTF6StringE` | `3dMKwTK6ZFE` | +| `_ZN7WebCore5Range8collapseEb` | `eWLH5SbvL4M` | +| `_ZN7WebCore5RangeD1Ev` | `J6Qxs-B3yUc` | +| `_ZN7WebCore5RangeD2Ev` | `QSQ5LUbIA2Q` | +| `_ZN7WebCore5Style5Scope22flushPendingSelfUpdateEv` | `J-0wEQz2H5I` | +| `_ZN7WebCore5Style5Scope29flushPendingDescendantUpdatesEv` | `CWRQgaUPkmM` | +| `_ZN7WebCore5Style5Scope30didChangeStyleSheetEnvironmentEv` | `kWDfHDajpZM` | +| `_ZN7WebCore5Style5Scope8resolverEv` | `XcEf7b3gYfM` | +| `_ZN7WebCore6Chrome23enableSuddenTerminationEv` | `mkZZVt6In6c` | +| `_ZN7WebCore6Chrome24disableSuddenTerminationEv` | `39tjjgU19JY` | +| `_ZN7WebCore6Cursor8fromTypeENS0_4TypeE` | `8-33e2lOOC8` | +| `_ZN7WebCore6CursorC1EPNS_5ImageERKNS_8IntPointE` | `m38rIXXKp48` | +| `_ZN7WebCore6CursorC2EPNS_5ImageERKNS_8IntPointE` | `JAEgKfRXTnY` | +| `_ZN7WebCore6Editor10applyStyleEPNS_15StylePropertiesENS_10EditActionE` | `uswjVhjstSM` | +| `_ZN7WebCore6Editor10findStringERKN3WTF6StringENS1_9OptionSetINS_14FindOptionFlagEEE` | `-PYy6gszSBU` | +| `_ZN7WebCore6Editor10insertTextERKN3WTF6StringEPNS_5EventENS_18TextEventInputTypeE` | `O5IwLWfx+s4` | +| `_ZN7WebCore6Editor13canDHTMLPasteEv` | `E3Ur-rzcMUg` | +| `_ZN7WebCore6Editor13performDeleteEv` | `yYzno8-lK3g` | +| `_ZN7WebCore6Editor14simplifyMarkupEPNS_4NodeES2_` | `S2gJq55GuKE` | +| `_ZN7WebCore6Editor16pasteAsPlainTextERKN3WTF6StringEb` | `0HDAWBfKVpQ` | +| `_ZN7WebCore6Editor17cancelCompositionEv` | `5MZEPxUs0oE` | +| `_ZN7WebCore6Editor17insertOrderedListEv` | `uqO-mdcKdLY` | +| `_ZN7WebCore6Editor18confirmCompositionERKN3WTF6StringE` | `6V1F6Yvjivg` | +| `_ZN7WebCore6Editor18confirmCompositionEv` | `Px7+XlVanjA` | +| `_ZN7WebCore6Editor18insertDictatedTextERKN3WTF6StringERKNS1_6VectorINS_20DictationAlternativeELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEEPNS_5EventE` | `tvZ6C2fY7zw` | +| `_ZN7WebCore6Editor19deleteWithDirectionENS_18SelectionDirectionENS_15TextGranularityEbb` | `Jfgwu4mfP1M` | +| `_ZN7WebCore6Editor19insertUnorderedListEv` | `7FQrD9yTNcU` | +| `_ZN7WebCore6Editor20canSmartCopyOrDeleteEv` | `Hj3klsYNFCU` | +| `_ZN7WebCore6Editor21applyStyleToSelectionEPNS_15StylePropertiesENS_10EditActionE` | `chdPn50-ZPc` | +| `_ZN7WebCore6Editor21insertTextPlaceholderERKNS_7IntSizeE` | `FBqILEKqTbk` | +| `_ZN7WebCore6Editor21removeTextPlaceholderERNS_22TextPlaceholderElementE` | `-zdIQTx0P1Q` | +| `_ZN7WebCore6Editor22writeImageToPasteboardERNS_10PasteboardERNS_7ElementERKN3WTF3URLERKNS5_6StringE` | `N8X38WX+rYU` | +| `_ZN7WebCore6Editor23changeSelectionListTypeEv` | `-R7czbHyr0E` | +| `_ZN7WebCore6Editor23handleAcceptedCandidateENS_18TextCheckingResultE` | `GnNvLp8818o` | +| `_ZN7WebCore6Editor23setBaseWritingDirectionENS_16WritingDirectionE` | `iOZzhl-sc4A` | +| `_ZN7WebCore6Editor24advanceToNextMisspellingEb` | `NrEX6bDyN58` | +| `_ZN7WebCore6Editor24computeAndSetTypingStyleERNS_15StylePropertiesENS_10EditActionE` | `dcdqMikPEKg` | +| `_ZN7WebCore6Editor24replaceSelectionWithTextERKN3WTF6StringENS0_17SelectReplacementENS0_12SmartReplaceENS_10EditActionE` | `C3MP-Pl8Wo8` | +| `_ZN7WebCore6Editor25setIgnoreSelectionChangesEbNS0_15RevealSelectionE` | `kiOnjE4+tqs` | +| `_ZN7WebCore6Editor26changeBackToReplacedStringERKN3WTF6StringE` | `YZtEu0qz4UA` | +| `_ZN7WebCore6Editor26decreaseSelectionListLevelEv` | `FrFSe3WaYFk` | +| `_ZN7WebCore6Editor26increaseSelectionListLevelEv` | `DekmG75HsNQ` | +| `_ZN7WebCore6Editor26toggleOverwriteModeEnabledEv` | `l5qMgwcStrs` | +| `_ZN7WebCore6Editor26writeSelectionToPasteboardERNS_10PasteboardE` | `Azw7PDTow7I` | +| `_ZN7WebCore6Editor28replaceRangeForSpellCheckingERKNS_11SimpleRangeERKN3WTF6StringE` | `mPe+gxeE3IM` | +| `_ZN7WebCore6Editor28replaceSelectionWithFragmentERNS_16DocumentFragmentENS0_17SelectReplacementENS0_12SmartReplaceENS0_10MatchStyleENS_10EditActionENS_22MailBlockquoteHandlingE` | `pws9868taPs` | +| `_ZN7WebCore6Editor28updateEditorUINowIfScheduledEv` | `H-G7WrXqsZE` | +| `_ZN7WebCore6Editor29canDecreaseSelectionListLevelEv` | `ooxmfHvkXQ4` | +| `_ZN7WebCore6Editor29canIncreaseSelectionListLevelEv` | `-RD2dLOtrY8` | +| `_ZN7WebCore6Editor29handleAlternativeTextUIResultERKN3WTF6StringE` | `DHo6TWtuGmg` | +| `_ZN7WebCore6Editor29toggleContinuousSpellCheckingEv` | `PLcqkyzTIeY` | +| `_ZN7WebCore6Editor30deleteSelectionWithSmartDeleteEbNS_10EditActionE` | `jeThsDH9l6Y` | +| `_ZN7WebCore6Editor30pasteAsPlainTextBypassingDHTMLEv` | `0os+lhwq2go` | +| `_ZN7WebCore6Editor33increaseSelectionListLevelOrderedEv` | `nukppJUzhrs` | +| `_ZN7WebCore6Editor33markMisspellingsAfterTypingToWordERKNS_15VisiblePositionERKNS_16VisibleSelectionEb` | `8PGaueckmNE` | +| `_ZN7WebCore6Editor34setMarkedTextMatchesAreHighlightedEb` | `qyWDKCx4To8` | +| `_ZN7WebCore6Editor35increaseSelectionListLevelUnorderedEv` | `pPVeaW3oK5s` | +| `_ZN7WebCore6Editor38commandIsSupportedFromMenuOrKeyBindingERKN3WTF6StringE` | `udwfbBwAWVc` | +| `_ZN7WebCore6Editor39insertParagraphSeparatorInQuotedContentEv` | `xez2fQ-9XM0` | +| `_ZN7WebCore6Editor3cutENS0_20FromMenuOrKeyBindingE` | `23axeMp33b8` | +| `_ZN7WebCore6Editor4copyENS0_20FromMenuOrKeyBindingE` | `6NezXKGHglU` | +| `_ZN7WebCore6Editor5pasteENS0_20FromMenuOrKeyBindingE` | `Nqla0jO15A8` | +| `_ZN7WebCore6Editor6indentEv` | `lGb63PP7XDE` | +| `_ZN7WebCore6Editor7CommandC1Ev` | `WPZPyKB1qYY` | +| `_ZN7WebCore6Editor7CommandC2Ev` | `SjNoAv1glVM` | +| `_ZN7WebCore6Editor7commandERKN3WTF6StringE` | `T59dz+-nR38` | +| `_ZN7WebCore6Editor7copyURLERKN3WTF3URLERKNS1_6StringE` | `CiHv9vxLw-g` | +| `_ZN7WebCore6Editor7outdentEv` | `XLlxJWGgUcc` | +| `_ZN7WebCore6Editor9copyImageERKNS_13HitTestResultE` | `VjthMfexIg0` | +| `_ZN7WebCore6ISOBox4readERN3JSC8DataViewE` | `B1GJfvSoSCA` | +| `_ZN7WebCore6ISOBoxC1ERKS0_` | `gt1iXQ4Er+w` | +| `_ZN7WebCore6ISOBoxC1Ev` | `TiRnQB6S6dE` | +| `_ZN7WebCore6ISOBoxC2ERKS0_` | `KZF4xGSQH5c` | +| `_ZN7WebCore6ISOBoxC2Ev` | `WU9IUHm2Kgs` | +| `_ZN7WebCore6ISOBoxD0Ev` | `Fz+So9vLtw0` | +| `_ZN7WebCore6ISOBoxD1Ev` | `OP+iChnwfIE` | +| `_ZN7WebCore6ISOBoxD2Ev` | `VWJtvXhQaUY` | +| `_ZN7WebCore6JSFile14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `pWwmsDizpB0` | +| `_ZN7WebCore6JSFile15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `6ah1fimhTeo` | +| `_ZN7WebCore6JSFile15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `uCievourBqo` | +| `_ZN7WebCore6JSFile15subspaceForImplERN3JSC2VME` | `pQntjcFYZZo` | +| `_ZN7WebCore6JSFile4infoEv` | `zrxfyCmnlBE` | +| `_ZN7WebCore6JSFile9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `hDiY8h7tAlg` | +| `_ZN7WebCore6JSFile9toWrappedERN3JSC2VMENS1_7JSValueE` | `bXZ6r1qeASU` | +| `_ZN7WebCore6JSFileC1ERKS0_` | `fsTc6ANOby8` | +| `_ZN7WebCore6JSFileC2ERKS0_` | `2YXmevi4vQ0` | +| `_ZN7WebCore6JSFileD1Ev` | `5YqK1eWNQnM` | +| `_ZN7WebCore6JSFileD2Ev` | `keOaOFLkcQQ` | +| `_ZN7WebCore6JSNode14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `EkR0YuNu6P8` | +| `_ZN7WebCore6JSNode15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `Qdp1-2HijVI` | +| `_ZN7WebCore6JSNode15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `YEL7H7n4jtg` | +| `_ZN7WebCore6JSNode15subspaceForImplERN3JSC2VME` | `6-ioRtwmTdA` | +| `_ZN7WebCore6JSNode4infoEv` | `c869dTyTgeY` | +| `_ZN7WebCore6JSNode9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `E1WfUIH8KTg` | +| `_ZN7WebCore6JSNode9toWrappedERN3JSC2VMENS1_7JSValueE` | `E8pE7QZK8y8` | +| `_ZN7WebCore6JSNodeC1ERKS0_` | `tJc2S26es-Q` | +| `_ZN7WebCore6JSNodeC2ERKS0_` | `5wDkfxnmbfI` | +| `_ZN7WebCore6JSNodeD1Ev` | `t4PRYawDi44` | +| `_ZN7WebCore6JSNodeD2Ev` | `JQrajDnmJR0` | +| `_ZN7WebCore6JSNodeaSERKS0_` | `4kRA6RackUU` | +| `_ZN7WebCore6Path2D6createERKNS_4PathE` | `bfEQm8gos5s` | +| `_ZN7WebCore6Path2D6createERKS0_` | `b7fR5ZUglgM` | +| `_ZN7WebCore6Path2D6createEv` | `6h94BuC6RWk` | +| `_ZN7WebCore6Path2D7addPathERS0_ONS_15DOMMatrix2DInitE` | `Uw+N2MbMav8` | +| `_ZN7WebCore6Path2DC1ERKNS_4PathE` | `yRsuqVarybc` | +| `_ZN7WebCore6Path2DC1Ev` | `fXWK5vOFkeI` | +| `_ZN7WebCore6Path2DC2ERKNS_4PathE` | `1XWGeZDA09Q` | +| `_ZN7WebCore6Path2DC2Ev` | `bqSfVVT2INY` | +| `_ZN7WebCore6Path2DD0Ev` | `DaBdguwimxA` | +| `_ZN7WebCore6Path2DD1Ev` | `e+J178oTm+Y` | +| `_ZN7WebCore6Path2DD2Ev` | `ijkui5Woco4` | +| `_ZN7WebCore6Path2DdaEPv` | `xK56zMV6L4g` | +| `_ZN7WebCore6Path2DdlEPv` | `Rwt38wvN3Fw` | +| `_ZN7WebCore6Path2DnaEm` | `54e6aO3EayI` | +| `_ZN7WebCore6Path2DnaEmPv` | `N0NlOnbnMKg` | +| `_ZN7WebCore6Path2DnwEm10NotNullTagPv` | `tRtElxBLU-0` | +| `_ZN7WebCore6Path2DnwEm` | `NJsu0fy42TY` | +| `_ZN7WebCore6Path2DnwEmPv` | `MiR3rQFLTmU` | +| `_ZN7WebCore6Region5Shape9translateERKNS_7IntSizeE` | `oCaql820uPM` | +| `_ZN7WebCore6Region5uniteERKS0_` | `5zMJOGM2sLQ` | +| `_ZN7WebCore6Region8subtractERKS0_` | `GhO6L9-UJS4` | +| `_ZN7WebCore6Region9intersectERKS0_` | `0dYM623+hwI` | +| `_ZN7WebCore6Region9translateERKNS_7IntSizeE` | `YzyhwhvERzg` | +| `_ZN7WebCore6RegionC1EOS0_` | `vvNLZvvxBmE` | +| `_ZN7WebCore6RegionC1ERKNS_7IntRectE` | `5CuHZwTDEtk` | +| `_ZN7WebCore6RegionC1ERKS0_` | `12rsFW04hrk` | +| `_ZN7WebCore6RegionC1Ev` | `-YGgZXLCrgM` | +| `_ZN7WebCore6RegionC2EOS0_` | `SN5oTjTdwlE` | +| `_ZN7WebCore6RegionC2ERKNS_7IntRectE` | `leWppF5NDa8` | +| `_ZN7WebCore6RegionC2ERKS0_` | `do6R-c248fo` | +| `_ZN7WebCore6RegionC2Ev` | `owaql6iYlCE` | +| `_ZN7WebCore6RegionD1Ev` | `icwhmckYj8E` | +| `_ZN7WebCore6RegionD2Ev` | `6i3NZOqWDPQ` | +| `_ZN7WebCore6RegionaSEOS0_` | `gSJ7ylJWzo0` | +| `_ZN7WebCore6RegionaSERKS0_` | `sN0yJ8MrDBY` | +| `_ZN7WebCore6Widget12setFrameRectERKNS_7IntRectE` | `PcOXjZjsab4` | +| `_ZN7WebCore6Widget16removeFromParentEv` | `mvVhzhPPtag` | +| `_ZN7WebCore6Widget4hideEv` | `Cs4aegJdHFU` | +| `_ZN7WebCore6Widget4showEv` | `ee2ww7pIttw` | +| `_ZN7WebCore6Widget8setFocusEb` | `t1svU-fltEM` | +| `_ZN7WebCore6Widget9setParentEPNS_10ScrollViewE` | `Z9zhgHSctqM` | +| `_ZN7WebCore6WidgetC2EPv` | `7TCfNv4qszM` | +| `_ZN7WebCore6WidgetD0Ev` | `MXDmNHNZdHE` | +| `_ZN7WebCore6WidgetD1Ev` | `D0WQtfZWtK0` | +| `_ZN7WebCore6WidgetD2Ev` | `vD07bzuy3RM` | +| `_ZN7WebCore7CSSRule10setCssTextERKN3WTF6StringE` | `ix+R6upTWRo` | +| `_ZN7WebCore7Element10clientLeftEv` | `0rxKpH+LqNk` | +| `_ZN7WebCore7Element10offsetLeftEv` | `rwC+kk9Ir-0` | +| `_ZN7WebCore7Element11clientWidthEv` | `7vfm0eUVXQc` | +| `_ZN7WebCore7Element11offsetWidthEv` | `NY34yXxoq7Q` | +| `_ZN7WebCore7Element12clientHeightEv` | `or96x8OaRrU` | +| `_ZN7WebCore7Element12offsetHeightEv` | `ZGURGK061ts` | +| `_ZN7WebCore7Element12setAttributeERKN3WTF10AtomStringES4_` | `2qPIzbtSTHw` | +| `_ZN7WebCore7Element12setAttributeERKNS_13QualifiedNameERKN3WTF10AtomStringE` | `SsMBIYv9GNg` | +| `_ZN7WebCore7Element12setInnerHTMLERKN3WTF6StringE` | `IlMyo-kG9VM` | +| `_ZN7WebCore7Element12setOuterHTMLERKN3WTF6StringE` | `rtYUAxh2gSA` | +| `_ZN7WebCore7Element13scrollByLinesEi` | `GN-EOqRvz0A` | +| `_ZN7WebCore7Element13scrollByPagesEi` | `wLpBqSY0Su4` | +| `_ZN7WebCore7Element14getClientRectsEv` | `JSphJHGztUM` | +| `_ZN7WebCore7Element14scrollIntoViewEb` | `7lo+0LUsYuw` | +| `_ZN7WebCore7Element14setAttributeNSERKN3WTF10AtomStringES4_S4_` | `otpJ9du+n9s` | +| `_ZN7WebCore7Element15removeAttributeERKN3WTF10AtomStringE` | `Ebuv-rVlBX4` | +| `_ZN7WebCore7Element16getAttributeNodeERKN3WTF10AtomStringE` | `EIjrkvleaPE` | +| `_ZN7WebCore7Element16setAttributeNodeERNS_4AttrE` | `DmTIYZfrF1I` | +| `_ZN7WebCore7Element17removeAttributeNSERKN3WTF10AtomStringES4_` | `8R5hS9urFg4` | +| `_ZN7WebCore7Element18boundingClientRectEv` | `PVGkLk5i0Lc` | +| `_ZN7WebCore7Element18getAttributeNodeNSERKN3WTF10AtomStringES4_` | `4HD3KMh8YCU` | +| `_ZN7WebCore7Element18insertAdjacentHTMLERKN3WTF6StringES4_` | `jImW-wfqIL8` | +| `_ZN7WebCore7Element18setAttributeNodeNSERNS_4AttrE` | `Kgk1kkr5Zi0` | +| `_ZN7WebCore7Element19removeAttributeNodeERNS_4AttrE` | `-WOpbmHCVJ0` | +| `_ZN7WebCore7Element19setBooleanAttributeERKNS_13QualifiedNameEb` | `hXCr94yw154` | +| `_ZN7WebCore7Element20offsetTopForBindingsEv` | `DzzQ9IwMZ38` | +| `_ZN7WebCore7Element20setIntegralAttributeERKNS_13QualifiedNameEi` | `qES1DKEVmNk` | +| `_ZN7WebCore7Element21boundsInRootViewSpaceEv` | `3D-lb52KBks` | +| `_ZN7WebCore7Element21insertAdjacentElementERKN3WTF6StringERS0_` | `typPPaFDo34` | +| `_ZN7WebCore7Element21offsetLeftForBindingsEv` | `-Apk7yibRiQ` | +| `_ZN7WebCore7Element22scrollIntoViewIfNeededEb` | `3+LtR6YEub4` | +| `_ZN7WebCore7Element22setTabIndexForBindingsEi` | `2EeZIfN5hXw` | +| `_ZN7WebCore7Element23offsetParentForBindingsEv` | `XoFtVU00iXs` | +| `_ZN7WebCore7Element23webkitRequestFullscreenEv` | `7YKK3bU5bwc` | +| `_ZN7WebCore7Element25ensureUserAgentShadowRootEv` | `BEpYI1rpnnw` | +| `_ZN7WebCore7Element28setUnsignedIntegralAttributeERKNS_13QualifiedNameEj` | `fBBK-B4APJs` | +| `_ZN7WebCore7Element34invalidateStyleAndLayerCompositionEv` | `2cbKu53mAVw` | +| `_ZN7WebCore7Element34setAttributeWithoutSynchronizationERKNS_13QualifiedNameERKN3WTF10AtomStringE` | `F6cl3MZpGV0` | +| `_ZN7WebCore7Element7closestERKN3WTF6StringE` | `XmJwv9OLio8` | +| `_ZN7WebCore7Element7matchesERKN3WTF6StringE` | `sfhuVL3MA7Y` | +| `_ZN7WebCore7Element9classListEv` | `2X9VrsiM+-Y` | +| `_ZN7WebCore7Element9clientTopEv` | `n7Qrf8HhJ2E` | +| `_ZN7WebCore7Element9innerTextEv` | `GjV1xAe92pA` | +| `_ZN7WebCore7Element9offsetTopEv` | `BCzsWDsn9L0` | +| `_ZN7WebCore7Element9outerTextEv` | `DgOXxr1ZN8A` | +| `_ZN7WebCore7Element9setPseudoERKN3WTF10AtomStringE` | `KlRDG7pC24w` | +| `_ZN7WebCore7JSEvent9toWrappedERN3JSC2VMENS1_7JSValueE` | `EqRj7d5zUU4` | +| `_ZN7WebCore7JSRange14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `DjQzK3OnWAE` | +| `_ZN7WebCore7JSRange15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `75qcBN57jBQ` | +| `_ZN7WebCore7JSRange15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `hkStGkCsKck` | +| `_ZN7WebCore7JSRange15subspaceForImplERN3JSC2VME` | `LCZB2VTbDwM` | +| `_ZN7WebCore7JSRange4infoEv` | `ge4hjd0OiFM` | +| `_ZN7WebCore7JSRange9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `6k2J3Q6Ybb8` | +| `_ZN7WebCore7JSRange9toWrappedERN3JSC2VMENS1_7JSValueE` | `DrAv+rMOOtE` | +| `_ZN7WebCore7JSRangeC1ERKS0_` | `UkhNxEGudWI` | +| `_ZN7WebCore7JSRangeC2ERKS0_` | `G2kjkUnsxJ4` | +| `_ZN7WebCore7JSRangeD1Ev` | `RgMwHBEqK0o` | +| `_ZN7WebCore7JSRangeD2Ev` | `hCyY74swF4U` | +| `_ZN7WebCore7JSRangeaSERKS0_` | `O7i9LDSwWKY` | +| `_ZN7WebCore7PatternD1Ev` | `FXz1QSPJDvo` | +| `_ZN7WebCore7PatternD2Ev` | `jRlpsSgGxU0` | +| `_ZN7WebCore7Process10identifierEv` | `nyPJWvkvO0A` | +| `_ZN7WebCore8DOMTimerD0Ev` | `-yxXF7H5Wfk` | +| `_ZN7WebCore8DOMTimerD1Ev` | `vukVSPgromM` | +| `_ZN7WebCore8DOMTimerD2Ev` | `sVxqnXkAYXs` | +| `_ZN7WebCore8Document10importNodeERNS_4NodeEb` | `KhiuXZEixEo` | +| `_ZN7WebCore8Document10setCharsetERKN3WTF6StringE` | `9tfT3KiaerY` | +| `_ZN7WebCore8Document11createEventERKN3WTF6StringE` | `cDpoSmpISFo` | +| `_ZN7WebCore8Document11createRangeEv` | `xtgoMt+v-H0` | +| `_ZN7WebCore8Document11execCommandERKN3WTF6StringEbS4_` | `xWk5R+wvzNA` | +| `_ZN7WebCore8Document11styleSheetsEv` | `wqT9gHXJ1Ag` | +| `_ZN7WebCore8Document12allDocumentsEv` | `mog98eYZd3Q` | +| `_ZN7WebCore8Document12updateLayoutEv` | `3fWyc4r03Qg` | +| `_ZN7WebCore8Document13activeElementEv` | `FssNW3GALk0` | +| `_ZN7WebCore8Document13createElementERKNS_13QualifiedNameEb` | `vlphmbz43Oo` | +| `_ZN7WebCore8Document13setDesignModeERKN3WTF6StringE` | `IBpqUH0M8ao` | +| `_ZN7WebCore8Document13setXMLVersionERKN3WTF6StringE` | `HsBUGXopmbQ` | +| `_ZN7WebCore8Document14implementationEv` | `fdDaJ9MjJtU` | +| `_ZN7WebCore8Document14setDocumentURIERKN3WTF6StringE` | `ZlZ4TA0eSiQ` | +| `_ZN7WebCore8Document15allDocumentsMapEv` | `ZLjAhq-2lvE` | +| `_ZN7WebCore8Document15openForBindingsEPS0_RKN3WTF6StringES5_` | `gl0pi-MyS0o` | +| `_ZN7WebCore8Document16addAudioProducerERNS_13MediaProducerE` | `KxkOl8nbei4` | +| `_ZN7WebCore8Document16closeForBindingsEv` | `wkUYiXcwABA` | +| `_ZN7WebCore8Document16createNSResolverERNS_4NodeE` | `ggH7tBY5y5c` | +| `_ZN7WebCore8Document16isPageBoxVisibleEi` | `cLVQtfiOm+4` | +| `_ZN7WebCore8Document16scrollingElementEv` | `0UcnBev8dqc` | +| `_ZN7WebCore8Document16setXMLStandaloneEb` | `k7OvvamK5A0` | +| `_ZN7WebCore8Document17addConsoleMessageEN3JSC13MessageSourceENS1_12MessageLevelERKN3WTF6StringEm` | `XwueuOfD+Q8` | +| `_ZN7WebCore8Document17queryCommandStateERKN3WTF6StringE` | `4doOKZvqnq8` | +| `_ZN7WebCore8Document17queryCommandValueERKN3WTF6StringE` | `7bV0114o7Pk` | +| `_ZN7WebCore8Document18registerCollectionERNS_14HTMLCollectionE` | `OOo4Dxqj8wQ` | +| `_ZN7WebCore8Document19accessSVGExtensionsEv` | `w-+wrYo+NLE` | +| `_ZN7WebCore8Document19caretRangeFromPointEii` | `R7sTQjrakqE` | +| `_ZN7WebCore8Document19dispatchWindowEventERNS_5EventEPNS_11EventTargetE` | `usfzZN9cTCA` | +| `_ZN7WebCore8Document19queryCommandEnabledERKN3WTF6StringE` | `Yw65RxUpwqg` | +| `_ZN7WebCore8Document19removeAudioProducerERNS_13MediaProducerE` | `lxwnew9-clE` | +| `_ZN7WebCore8Document19updateStyleIfNeededEv` | `X2K34ExGOBY` | +| `_ZN7WebCore8Document20queryCommandIndetermERKN3WTF6StringE` | `WbiP5Ed-hIo` | +| `_ZN7WebCore8Document21queryCommandSupportedERKN3WTF6StringE` | `1CNmt9x20pM` | +| `_ZN7WebCore8Document22createDocumentFragmentEv` | `VeSd8Ra6b6Y` | +| `_ZN7WebCore8Document22scrollingElementForAPIEv` | `k+1jPKKqLqE` | +| `_ZN7WebCore8Document23setAsRunningUserScriptsEv` | `IB3mxHrpJnA` | +| `_ZN7WebCore8Document24addMediaCanStartListenerERNS_21MediaCanStartListenerE` | `SVSxof5YKAc` | +| `_ZN7WebCore8Document24createElementForBindingsERKN3WTF10AtomStringE` | `Qce-fO+SEwk` | +| `_ZN7WebCore8Document24scheduleFullStyleRebuildEv` | `emcHF9855Uw` | +| `_ZN7WebCore8Document24setShouldCreateRenderersEb` | `HZvInRgsr8M` | +| `_ZN7WebCore8Document25createCSSStyleDeclarationEv` | `82ZOvyi9kZs` | +| `_ZN7WebCore8Document25ensureTimelinesControllerEv` | `ouIKBztSwrM` | +| `_ZN7WebCore8Document25startTrackingStyleRecalcsEv` | `ID6l3yU4Gwg` | +| `_ZN7WebCore8Document26pageSizeAndMarginsInPixelsEiRNS_7IntSizeERiS3_S3_S3_` | `YfAbM5dIAQY` | +| `_ZN7WebCore8Document26textManipulationControllerEv` | `0lJ2j9lHumo` | +| `_ZN7WebCore8Document27removeMediaCanStartListenerERNS_21MediaCanStartListenerE` | `gp9RuTftqFo` | +| `_ZN7WebCore8Document28setNeedsDOMWindowResizeEventEv` | `9iXt34+oIKI` | +| `_ZN7WebCore8Document36updateLayoutIgnorePendingStylesheetsENS0_18RunPostLayoutTasksE` | `HnVgP2pQrgE` | +| `_ZN7WebCore8Document46wasLoadedWithDataTransferFromPrevalentResourceEv` | `wDve80ZAAYU` | +| `_ZN7WebCore8Document4headEv` | `G3Fa5r+f11U` | +| `_ZN7WebCore8Document4openEPS0_` | `deFQEVRcKuQ` | +| `_ZN7WebCore8Document56hasRequestedPageSpecificStorageAccessWithUserInteractionERKNS_17RegistrableDomainE` | `URxENN44a6k` | +| `_ZN7WebCore8Document59setHasRequestedPageSpecificStorageAccessWithUserInteractionERKNS_17RegistrableDomainE` | `PICeLa8CPnE` | +| `_ZN7WebCore8Document5formsEv` | `Xl3RItA-Euc` | +| `_ZN7WebCore8Document5linksEv` | `7lfSx6Ni9oE` | +| `_ZN7WebCore8Document6cookieEv` | `a3GTqTQrSRI` | +| `_ZN7WebCore8Document6embedsEv` | `U6lrpHJgqYM` | +| `_ZN7WebCore8Document6imagesEv` | `2nbbUmPHyG8` | +| `_ZN7WebCore8Document6setDirERKN3WTF10AtomStringE` | `hYpuY0UpXU8` | +| `_ZN7WebCore8Document7anchorsEv` | `hVBTaS+kl6Q` | +| `_ZN7WebCore8Document7appletsEv` | `H5t0P5fgBHU` | +| `_ZN7WebCore8Document7hitTestERKNS_14HitTestRequestERNS_13HitTestResultE` | `jB92woGZxrk` | +| `_ZN7WebCore8Document7pluginsEv` | `5CtU+6RQAHM` | +| `_ZN7WebCore8Document7scriptsEv` | `saGH8j4QSPI` | +| `_ZN7WebCore8Document8postTaskEONS_22ScriptExecutionContext4TaskE` | `y7-9PnwOxIA` | +| `_ZN7WebCore8Document8referrerEv` | `zDr2ObG0dkA` | +| `_ZN7WebCore8Document8timelineEv` | `3OGWd5HYT4Y` | +| `_ZN7WebCore8Document9adoptNodeERNS_4NodeE` | `YbVlQLd0iss` | +| `_ZN7WebCore8Document9setCookieERKN3WTF6StringE` | `A2Ru3JRG0dE` | +| `_ZN7WebCore8FormData10appendBlobERKN3WTF3URLE` | `4rCdnji8r8o` | +| `_ZN7WebCore8FormData10appendDataEPKvm` | `3WCA+6clvlo` | +| `_ZN7WebCore8FormData16prepareForUploadEv` | `Xv7gsbvyLsM` | +| `_ZN7WebCore8FormData21resolveBlobReferencesEPNS_16BlobRegistryImplE` | `p81jnGe7Z6s` | +| `_ZN7WebCore8FormData6createEPKvm` | `g8Euucf0v3s` | +| `_ZN7WebCore8FormData6createEv` | `Yd7vowOw4fc` | +| `_ZN7WebCore8FormDataD1Ev` | `6l8Ua3l0RQU` | +| `_ZN7WebCore8FormDataD2Ev` | `21cUbLIHG+s` | +| `_ZN7WebCore8JSDOMURL14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `NASakyO6sMo` | +| `_ZN7WebCore8JSDOMURL15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `i5FMHLlAuCQ` | +| `_ZN7WebCore8JSDOMURL15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `k66VgjV17-M` | +| `_ZN7WebCore8JSDOMURL15subspaceForImplERN3JSC2VME` | `7IwKPW53RMs` | +| `_ZN7WebCore8JSDOMURL4infoEv` | `eYL+aHEWbXQ` | +| `_ZN7WebCore8JSDOMURL9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `B4UeKdrvlvE` | +| `_ZN7WebCore8JSDOMURLC1ERKS0_` | `4gN-r7nYdYY` | +| `_ZN7WebCore8JSDOMURLC2ERKS0_` | `MJ8jW45b-Ws` | +| `_ZN7WebCore8JSDOMURLD1Ev` | `nJjLXvaaLRk` | +| `_ZN7WebCore8JSDOMURLD2Ev` | `3z2UGDyKklI` | +| `_ZN7WebCore8JSDOMURLaSERKS0_` | `zOupd5FZLOM` | +| `_ZN7WebCore8JSPath2D14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `EqmzIcR5AVc` | +| `_ZN7WebCore8JSPath2D15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `YjNx9Hiq5Tw` | +| `_ZN7WebCore8JSPath2D15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `PYJ+DaIvLlA` | +| `_ZN7WebCore8JSPath2D15subspaceForImplERN3JSC2VME` | `hmbWwc570tg` | +| `_ZN7WebCore8JSPath2D4infoEv` | `LUa+RfJHTwQ` | +| `_ZN7WebCore8JSPath2D9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `Ouz5ybi7b0c` | +| `_ZN7WebCore8JSPath2D9toWrappedERN3JSC2VMENS1_7JSValueE` | `BEut3UqoLv8` | +| `_ZN7WebCore8JSPath2DC1ERKS0_` | `NEWQfiblmOM` | +| `_ZN7WebCore8JSPath2DC2ERKS0_` | `cu+gVDIlA4w` | +| `_ZN7WebCore8JSPath2DD1Ev` | `Atil+QRPGs8` | +| `_ZN7WebCore8JSPath2DD2Ev` | `zIttPL4lCv0` | +| `_ZN7WebCore8JSPath2DaSERKS0_` | `7rfErhFzrTM` | +| `_ZN7WebCore8PositionC1EPNS_4NodeENS0_10AnchorTypeE` | `fJDljVbG4e4` | +| `_ZN7WebCore8PositionC1EPNS_4NodeEjNS0_10AnchorTypeE` | `lkKJnS1gDRk` | +| `_ZN7WebCore8PositionC1EPNS_4NodeEjNS0_25LegacyEditingPositionFlagE` | `7aQnOMQKj8w` | +| `_ZN7WebCore8PositionC2EPNS_4NodeENS0_10AnchorTypeE` | `V2JbrOdI4B0` | +| `_ZN7WebCore8PositionC2EPNS_4NodeEjNS0_10AnchorTypeE` | `RJ+khi-q6YY` | +| `_ZN7WebCore8PositionC2EPNS_4NodeEjNS0_25LegacyEditingPositionFlagE` | `fZASv0EgXdI` | +| `_ZN7WebCore8SVGNames4initEv` | `pqkUIVdtoD0` | +| `_ZN7WebCore8SVGTests27hasFeatureForLegacyBindingsERKN3WTF6StringES4_` | `5wJ799-PseQ` | +| `_ZN7WebCore8Settings16setImagesEnabledEb` | `BJKpbkn0Rto` | +| `_ZN7WebCore8Settings17setPluginsEnabledEb` | `KcsG+O4IWSU` | +| `_ZN7WebCore8Settings18setFrameFlatteningENS_15FrameFlatteningE` | `TJkl66wcxuo` | +| `_ZN7WebCore8Settings19setShowDebugBordersEb` | `2RVlVZ1oJAw` | +| `_ZN7WebCore8Settings20setCoreMathMLEnabledEb` | `vBhjjg+rbsQ` | +| `_ZN7WebCore8Settings20setMediaTypeOverrideERKN3WTF6StringE` | `y5C1ublO8hg` | +| `_ZN7WebCore8Settings21setColorFilterEnabledEb` | `D189LBn9o-0` | +| `_ZN7WebCore8Settings21setShowRepaintCounterEb` | `14QyV2LP+tE` | +| `_ZN7WebCore8Settings23setUsesBackForwardCacheEb` | `TlX0LQPNYFs` | +| `_ZN7WebCore8Settings24setDNSPrefetchingEnabledEb` | `-aG0k61CdWY` | +| `_ZN7WebCore8Settings24setTextAreasAreResizableEb` | `WxVd11+n+HQ` | +| `_ZN7WebCore8Settings24setVisualViewportEnabledEb` | `Wxxk5GbijWc` | +| `_ZN7WebCore8Settings25setUserStyleSheetLocationERKN3WTF3URLE` | `uNCARQQDkbg` | +| `_ZN7WebCore8Settings29setAsyncFrameScrollingEnabledEb` | `KdkNXmhyLOM` | +| `_ZN7WebCore8Settings29setAuthorAndUserStylesEnabledEb` | `Pays4s+a5y8` | +| `_ZN7WebCore8Settings30setResourceUsageOverlayVisibleEb` | `xS5S5V+3uQ4` | +| `_ZN7WebCore8Settings31setICECandidateFilteringEnabledEb` | `sJrQ1OIhBYw` | +| `_ZN7WebCore8Settings32setAcceleratedCompositingEnabledEb` | `9rw-dYdn3bA` | +| `_ZN7WebCore8Settings32setAsyncOverflowScrollingEnabledEb` | `YWD+zZlCA8k` | +| `_ZN7WebCore8Settings32setShouldAllowUserInstalledFontsEb` | `VsjLgu8EHe8` | +| `_ZN7WebCore8Settings33setFontFallbackPrefersPictographsEb` | `JKsefjJ5H7A` | +| `_ZN7WebCore8Settings35setBackgroundShouldExtendBeyondPageEb` | `bhz5NSDEBqU` | +| `_ZN7WebCore8Settings37setPunchOutWhiteBackgroundsInDarkModeEb` | `50TB0tEQ3g4` | +| `_ZN7WebCore8Settings38setHiddenPageDOMTimerThrottlingEnabledEb` | `4Dp8cC4noCs` | +| `_ZN7WebCore8Settings38setLayoutViewportHeightExpansionFactorEd` | `g8sFOa+vaUU` | +| `_ZN7WebCore8Settings41setAcceleratedCompositedAnimationsEnabledEb` | `1Iv-JJC7joU` | +| `_ZN7WebCore8Settings42setHiddenPageCSSAnimationSuspensionEnabledEb` | `Bja9Lr9ZuyA` | +| `_ZN7WebCore8Settings44setClientCoordinatesRelativeToLayoutViewportEb` | `bWYhKmtyu1M` | +| `_ZN7WebCore8Settings44setHiddenPageDOMTimerThrottlingAutoIncreasesEb` | `4BAhWOEnY4M` | +| `_ZN7WebCore8XMLNames4initEv` | `hkP+sGvpPns` | +| `_ZN7WebCore9AnimationC1Ev` | `LSXwKvlefUA` | +| `_ZN7WebCore9AnimationC2Ev` | `yDe86KCEP4s` | +| `_ZN7WebCore9AnimationD1Ev` | `mwFPufuvMpk` | +| `_ZN7WebCore9AnimationD2Ev` | `XwyKrGzWNag` | +| `_ZN7WebCore9CSSParser16parseDeclarationERNS_22MutableStylePropertiesERKN3WTF6StringE` | `f+OTc4UWuGU` | +| `_ZN7WebCore9CSSParserC1ERKNS_16CSSParserContextE` | `Zd5Z6TPdFMY` | +| `_ZN7WebCore9CSSParserC2ERKNS_16CSSParserContextE` | `YShMyaANbf8` | +| `_ZN7WebCore9CSSParserD1Ev` | `mwSKc1t2fYA` | +| `_ZN7WebCore9CSSParserD2Ev` | `dO8sEmzD75U` | +| `_ZN7WebCore9CookieJar10clearCacheEv` | `Fo--ToR1fsg` | +| `_ZN7WebCore9CookieJar10setCookiesERNS_8DocumentERKN3WTF3URLERKNS3_6StringE` | `yge0amJn5G4` | +| `_ZN7WebCore9CookieJar12setRawCookieERKNS_8DocumentERKNS_6CookieE` | `fef-SprJ7Fk` | +| `_ZN7WebCore9CookieJar17clearCacheForHostERKN3WTF6StringE` | `aTamWRbZ1Y8` | +| `_ZN7WebCore9CookieJar26shouldIncludeSecureCookiesERKNS_8DocumentERKN3WTF3URLE` | `H43OUnX46hU` | +| `_ZN7WebCore9CookieJar29cookieRequestHeaderFieldProxyERKNS_8DocumentERKN3WTF3URLE` | `A5wwW5tmsgE` | +| `_ZN7WebCore9CookieJarD0Ev` | `N6JHDaGTItI` | +| `_ZN7WebCore9CookieJarD1Ev` | `KbmwmZUeE7o` | +| `_ZN7WebCore9CookieJarD2Ev` | `aVxqedJqfFA` | +| `_ZN7WebCore9DragImageC1EOS0_` | `Gblk9Tyt0B0` | +| `_ZN7WebCore9DragImageC1Ev` | `qAqfKFQJNFk` | +| `_ZN7WebCore9DragImageC2EOS0_` | `kl03klwNnE0` | +| `_ZN7WebCore9DragImageC2Ev` | `mWHQR9TI4wQ` | +| `_ZN7WebCore9DragImageD1Ev` | `0jsZGfvAN3g` | +| `_ZN7WebCore9DragImageD2Ev` | `g2fw8kXx2IU` | +| `_ZN7WebCore9DragImageaSEOS0_` | `jRX3E9YPAyk` | +| `_ZN7WebCore9FontCache17inactiveFontCountEv` | `cH2+t98qn1g` | +| `_ZN7WebCore9FontCache19fontForPlatformDataERKNS_16FontPlatformDataE` | `SPFz9bHH5Kg` | +| `_ZN7WebCore9FontCache21purgeInactiveFontDataEj` | `sD6DlU9wkwc` | +| `_ZN7WebCore9FontCache22lastResortFallbackFontERKNS_15FontDescriptionE` | `xpZ6UBuyYx4` | +| `_ZN7WebCore9FontCache9fontCountEv` | `ckyaqk5dfP4` | +| `_ZN7WebCore9FrameTree11appendChildERNS_5FrameE` | `81vTH6onyXk` | +| `_ZN7WebCore9FrameTree9clearNameEv` | `W82U1g0Smzs` | +| `_ZN7WebCore9GLContext18makeContextCurrentEv` | `fZErMMgXHH4` | +| `_ZN7WebCore9GLContextD1Ev` | `iG6VTE9CEiY` | +| `_ZN7WebCore9GLContextD2Ev` | `emySnZSCXWs` | +| `_ZN7WebCore9HTMLNames4initEv` | `F8SVjLhhPs4` | +| `_ZN7WebCore9ImageData6createERKNS_7IntSizeE` | `JipDCX9bCgk` | +| `_ZN7WebCore9JSCSSRule9toWrappedERN3JSC2VMENS1_7JSValueE` | `xwmX4Gh8-qk` | +| `_ZN7WebCore9JSDOMRect14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `fS2V3AJIwt8` | +| `_ZN7WebCore9JSDOMRect15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `PrjTtnup+U8` | +| `_ZN7WebCore9JSDOMRect15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `AvfzO51zGKI` | +| `_ZN7WebCore9JSDOMRect15subspaceForImplERN3JSC2VME` | `rjFtynMQeHU` | +| `_ZN7WebCore9JSDOMRect4infoEv` | `uLVGXwLzfME` | +| `_ZN7WebCore9JSDOMRect9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `d7TCmjy+C-4` | +| `_ZN7WebCore9JSDOMRectC1ERKS0_` | `VhwtC33fcrw` | +| `_ZN7WebCore9JSDOMRectC2ERKS0_` | `eSmlvBGD3QM` | +| `_ZN7WebCore9JSDOMRectD1Ev` | `FCyEmxhHRsk` | +| `_ZN7WebCore9JSDOMRectD2Ev` | `Tdg135n6cNQ` | +| `_ZN7WebCore9JSElement14getConstructorERN3JSC2VMEPKNS1_14JSGlobalObjectE` | `n9pedsJlpxk` | +| `_ZN7WebCore9JSElement15createPrototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `Wwg0QH+oUSs` | +| `_ZN7WebCore9JSElement15createStructureERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `btdsviuXUYw` | +| `_ZN7WebCore9JSElement15subspaceForImplERN3JSC2VME` | `iCjHv43B15Q` | +| `_ZN7WebCore9JSElement4infoEv` | `2MsnEddYS5w` | +| `_ZN7WebCore9JSElement9prototypeERN3JSC2VMERNS_17JSDOMGlobalObjectE` | `2IC-EspCqXs` | +| `_ZN7WebCore9JSElement9toWrappedERN3JSC2VMENS1_7JSValueE` | `RYDvQkQCgJc` | +| `_ZN7WebCore9JSElementC1ERKS0_` | `wCfhaj6ayFw` | +| `_ZN7WebCore9JSElementC2ERKS0_` | `dW0RTlUeeMI` | +| `_ZN7WebCore9JSElementD1Ev` | `uuTo7JlfhX4` | +| `_ZN7WebCore9MediaList12appendMediumERKN3WTF6StringE` | `iJgcFywfmnA` | +| `_ZN7WebCore9MediaList12deleteMediumERKN3WTF6StringE` | `LZwZV0R1gd8` | +| `_ZN7WebCore9MediaList12setMediaTextERKN3WTF6StringE` | `ZApWOKVm7-g` | +| `_ZN7WebCore9MediaListD1Ev` | `oxpki6k4hwY` | +| `_ZN7WebCore9MediaListD2Ev` | `k-ds+HGkVNI` | +| `_ZN7WebCore9PageGroup25captionPreferencesChangedEv` | `EGTj1EB5ypU` | +| `_ZN7WebCore9PageGroup9pageGroupERKN3WTF6StringE` | `kNn56Z36kZU` | +| `_ZN7WebCore9PageGroupC1ERKN3WTF6StringE` | `yyaxDUR3t1U` | +| `_ZN7WebCore9PageGroupC2ERKN3WTF6StringE` | `KvDqpabvhtI` | +| `_ZN7WebCore9SampleMap12removeSampleEPNS_11MediaSampleE` | `dcYDmPuMrvs` | +| `_ZN7WebCore9SampleMap5clearEv` | `zoIu9W2wWcw` | +| `_ZN7WebCore9SampleMap9addSampleERNS_11MediaSampleE` | `F1o13VbrKb4` | +| `_ZN7WebCore9Scrollbar10mouseMovedERKNS_18PlatformMouseEventE` | `FJAg8-+kSWs` | +| `_ZN7WebCore9Scrollbar11mouseExitedEv` | `IR4x7c3IhCw` | +| `_ZN7WebCore9Scrollbar12mouseEnteredEv` | `mNmvZ+wLzEs` | +| `_ZN7WebCore9Scrollbar13setProportionEii` | `gdVoksa+OAc` | +| `_ZN7WebCore9Scrollbar22maxOverlapBetweenPagesEv` | `V1hf3XuxJXE` | +| `_ZN7WebCore9Scrollbar7mouseUpERKNS_18PlatformMouseEventE` | `i-lh1gEcVes` | +| `_ZN7WebCore9Scrollbar8setStepsEiii` | `JpQQKNklSMw` | +| `_ZN7WebCore9Scrollbar9mouseDownERKNS_18PlatformMouseEventE` | `ruP-T7+cy1g` | +| `_ZN7WebCore9TimerBase4stopEv` | `FIORIf42lEA` | +| `_ZN7WebCore9TimerBase5startEN3WTF7SecondsES2_` | `lswnCQS09uk` | +| `_ZN7WebCore9TimerBaseC2Ev` | `T5Y5L0Em2xw` | +| `_ZN7WebCore9TimerBaseD0Ev` | `YK76WadcCQI` | +| `_ZN7WebCore9TimerBaseD1Ev` | `mqXE3Scze9I` | +| `_ZN7WebCore9TimerBaseD2Ev` | `AR9ZlkEfHkc` | +| `_ZN7WebCore9TreeScope16elementFromPointEdd` | `G6uTAEOzoFM` | +| `_ZN7WebCore9TreeScope17elementsFromPointERKNS_10FloatPointE` | `LASo+347Irs` | +| `_ZN7WebCore9TreeScope17elementsFromPointEdd` | `rAkuRf44hSE` | +| `_ZN7WebCore9endOfLineERKNS_15VisiblePositionE` | `KR+lNUwO7oo` | +| `_ZN7WebCore9endOfWordERKNS_15VisiblePositionENS_9EWordSideE` | `MCXbvH462z4` | +| `_ZN7WebCore9unionRectERKN3WTF6VectorINS_9FloatRectELm0ENS0_15CrashOnOverflowELm16ENS0_10FastMallocEEE` | `Yd+FzGZ5llY` | +| `_ZN7WebCoreeqERKNS_18SecurityOriginDataES2_` | `7qJpOjZSSkI` | +| `_ZN7WebCorelsERN3WTF10TextStreamENS_10ColorSpaceE` | `TXhrTaaJM1Y` | +| `_ZN7WebCorelsERN3WTF10TextStreamENS_10ScrollTypeE` | `6P-xIACeryI` | +| `_ZN7WebCorelsERN3WTF10TextStreamENS_11TouchActionE` | `D5Y1cX5ZyLU` | +| `_ZN7WebCorelsERN3WTF10TextStreamENS_14ScrollClampingE` | `xtiudkYGWWA` | +| `_ZN7WebCorelsERN3WTF10TextStreamENS_15ScrollAlignment8BehaviorE` | `2veNqr3JMos` | +| `_ZN7WebCorelsERN3WTF10TextStreamENS_17CompositeOperatorE` | `j7lQdOHSaMU` | +| `_ZN7WebCorelsERN3WTF10TextStreamENS_17ScrollingNodeTypeE` | `bPQqCte+e9g` | +| `_ZN7WebCorelsERN3WTF10TextStreamENS_21ViewportRectStabilityE` | `ZzX1jJqNVwg` | +| `_ZN7WebCorelsERN3WTF10TextStreamENS_22AlphaPremultiplicationE` | `O6lWW7BbeuM` | +| `_ZN7WebCorelsERN3WTF10TextStreamENS_24ScrollableAreaParametersE` | `vrqGZr3Opv8` | +| `_ZN7WebCorelsERN3WTF10TextStreamENS_25ScrollPositioningBehaviorE` | `gheMsedUIlo` | +| `_ZN7WebCorelsERN3WTF10TextStreamENS_26GraphicsLayerPaintingPhaseE` | `K-hhscQm6wI` | +| `_ZN7WebCorelsERN3WTF10TextStreamENS_28ScrollingLayerPositionActionE` | `bEd1IOCblmo` | +| `_ZN7WebCorelsERN3WTF10TextStreamENS_30ScrollBehaviorForFixedElementsE` | `zWvkcHmDHnw` | +| `_ZN7WebCorelsERN3WTF10TextStreamENS_7LineCapE` | `UCkJEiS8Qb8` | +| `_ZN7WebCorelsERN3WTF10TextStreamENS_8LineJoinE` | `v9VWGQSj02A` | +| `_ZN7WebCorelsERN3WTF10TextStreamENS_8WindRuleE` | `cRCjGx+U+og` | +| `_ZN7WebCorelsERN3WTF10TextStreamENS_9BlendModeE` | `C+-sGGnws9A` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_10FloatPointE` | `-WRsXUoZ948` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_10LayoutRectE` | `2s+xE16XQRA` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_10LayoutSizeE` | `8DvXQqbHbJU` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_10LayoutUnitE` | `WEd2137pGp8` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_11EventRegionE` | `eUaXBqzdC0Y` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_11LayoutPointE` | `tnTAwqsdFUM` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_12FilterEffectE` | `oIrASpTTrW8` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_12FloatPoint3DE` | `IzffkhPRxw0` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_12VelocityDataE` | `BTXZgU0oot8` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_13GraphicsLayer16CustomAppearanceE` | `8IX8TlRX0DQ` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_14TimingFunctionE` | `y3GWJqWbvIo` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_15AffineTransformE` | `RjCz7r4tq1o` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_15FilterOperationE` | `bP1QOJouxCM` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_15ScrollAlignmentE` | `N7gOJ1+zbhQ` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_15VisiblePositionE` | `at-9g8ayvfA` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_16FilterOperationsE` | `1Jbvipwn+Mg` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_16FloatRoundedRectE` | `0kJTcu2ueOE` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_16VisibleSelectionE` | `WsBJZWjWhmc` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_20TransformationMatrixE` | `y64VGUuAHFk` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_27AbsolutePositionConstraintsE` | `3s8eZwwVACU` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_32FixedPositionViewportConstraintsE` | `gkrDbcAYMyA` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_33StickyPositionViewportConstraintsE` | `grWXn3ZlkYM` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_5ColorE` | `MkKcrZ9pT0Q` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_6RegionE` | `4W0wxLj52NI` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_7IntRectE` | `2f4X7OpBu5c` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_7IntSizeE` | `8xYY2l-Ugoc` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_8IntPointE` | `11DM5mLVBA4` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_9FloatRectE` | `FxG0371AIgc` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_9FloatSizeE` | `8o+NY6J8sdY` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_9ImageDataE` | `aFJnQE4CaWw` | +| `_ZN7WebCorelsERN3WTF10TextStreamERKNS_9RectEdgesIfEE` | `s8ZoG4mimcw` | +| `_ZN7bmalloc11AllIsoHeaps3addEPNS_15IsoHeapImplBaseE` | `LEKGLwltPt8` | +| `_ZN7bmalloc11AllIsoHeaps4headEv` | `Da0OiEp6X68` | +| `_ZN7bmalloc11Deallocator18deallocateSlowCaseEPv` | `ho+7cKMXCuA` | +| `_ZN7bmalloc11IsoPageBase18allocatePageMemoryEv` | `ahGKKIJ8ZTg` | +| `_ZN7bmalloc11IsoTLSEntryC2Em` | `6-GmQWtFE6Y` | +| `_ZN7bmalloc11IsoTLSEntryD0Ev` | `psjVBg5y6OM` | +| `_ZN7bmalloc11IsoTLSEntryD1Ev` | `JmOEMbPsk8A` | +| `_ZN7bmalloc11IsoTLSEntryD2Ev` | `r4zVk342NH4` | +| `_ZN7bmalloc11IsoTLSEntrydlEPv` | `Dg05dR7Cut0` | +| `_ZN7bmalloc11IsoTLSEntrynaEmPv` | `v3EVw6+3tLM` | +| `_ZN7bmalloc11IsoTLSEntrynaEm` | `vMsePZhPOLY` | +| `_ZN7bmalloc11IsoTLSEntrynwEmPv` | `6a1KgkULyqs` | +| `_ZN7bmalloc11IsoTLSEntrynwEm` | `cg5bcS+k9P8` | +| `_ZN7bmalloc12IsoTLSLayout3addEPNS_11IsoTLSEntryE` | `tMWlx2AgEiY` | +| `_ZN7bmalloc13IsoSharedPage9tryCreateEv` | `A4P8aG8cGz0` | +| `_ZN7bmalloc15IsoHeapImplBase11didDecommitEPvm` | `skIfr3+tx9E` | +| `_ZN7bmalloc15IsoHeapImplBase11scavengeNowEv` | `LizLWDLOZt4` | +| `_ZN7bmalloc15IsoHeapImplBase13isNowFreeableEPvm` | `QdYNXcesqSo` | +| `_ZN7bmalloc15IsoHeapImplBase14freeableMemoryEv` | `YUFXgWDC3cg` | +| `_ZN7bmalloc15IsoHeapImplBase16addToAllIsoHeapsEv` | `ezAh2UH+pyE` | +| `_ZN7bmalloc15IsoHeapImplBase16finishScavengingERNS_6VectorINS_16DeferredDecommitEEE` | `FC2Iy9XAhrE` | +| `_ZN7bmalloc15IsoHeapImplBase18isNoLongerFreeableEPvm` | `LF1S4j5d23g` | +| `_ZN7bmalloc15IsoHeapImplBase9didCommitEPvm` | `Zkl+J182WlE` | +| `_ZN7bmalloc15IsoHeapImplBase9footprintEv` | `HorGWGukVpo` | +| `_ZN7bmalloc15IsoHeapImplBaseC2ERNS_5MutexE` | `PyFQ+tpKjuc` | +| `_ZN7bmalloc15IsoHeapImplBaseD0Ev` | `mLfgWSYY3pY` | +| `_ZN7bmalloc15IsoHeapImplBaseD1Ev` | `lkqZwKJZ0oo` | +| `_ZN7bmalloc15IsoHeapImplBaseD2Ev` | `Tv53+aRRcwY` | +| `_ZN7bmalloc15IsoHeapImplBasedlEPv` | `3Xsf6cttiRo` | +| `_ZN7bmalloc15IsoHeapImplBasenaEmPv` | `T4RZ2R4QNj8` | +| `_ZN7bmalloc15IsoHeapImplBasenaEm` | `lekMQNRdlRs` | +| `_ZN7bmalloc15IsoHeapImplBasenwEm` | `E0pHVD7uJ+E` | +| `_ZN7bmalloc17getPerProcessDataEjPKcmm` | `FbvROv13LwA` | +| `_ZN7bmalloc5Cache25allocateSlowCaseNullCacheENS_8HeapKindEm` | `7oKMHilvjQA` | +| `_ZN7bmalloc5Cache25allocateSlowCaseNullCacheENS_8HeapKindEmm` | `G33UVyzplCY` | +| `_ZN7bmalloc5Cache27deallocateSlowCaseNullCacheENS_8HeapKindEPv` | `xWpmqXWWI4A` | +| `_ZN7bmalloc5Cache27reallocateSlowCaseNullCacheENS_8HeapKindEPvm` | `Qg50ik598bk` | +| `_ZN7bmalloc5Cache28tryAllocateSlowCaseNullCacheENS_8HeapKindEm` | `kDewIzcDLis` | +| `_ZN7bmalloc5Cache28tryAllocateSlowCaseNullCacheENS_8HeapKindEmm` | `Y7cMrHHJWiY` | +| `_ZN7bmalloc5Cache30tryReallocateSlowCaseNullCacheENS_8HeapKindEPvm` | `21N4NbEuAjY` | +| `_ZN7bmalloc5Cache8scavengeENS_8HeapKindE` | `Z+-FesiIsPQ` | +| `_ZN7bmalloc6IsoTLS13ensureEntriesEj` | `XNux2a0QhQ8` | +| `_ZN7bmalloc6IsoTLS8scavengeEv` | `4Lq+4mBCicA` | +| `_ZN7bmalloc8FreeList14initializeBumpEPcj` | `tQd-CVQUoko` | +| `_ZN7bmalloc8FreeList14initializeListEPNS_8FreeCellEmj` | `JBCYpr7Atp0` | +| `_ZN7bmalloc8FreeList5clearEv` | `rHVNXPmC65Q` | +| `_ZN7bmalloc8FreeListC1Ev` | `Xa4Kt1r84HM` | +| `_ZN7bmalloc8FreeListD1Ev` | `nun+WRYNLXM` | +| `_ZN7bmalloc9Allocator12allocateImplEmmNS_13FailureActionE` | `CYJC0YsH4u4` | +| `_ZN7bmalloc9Scavenger29scheduleIfUnderMemoryPressureEm` | `e6cCjttumPM` | +| `_ZN7bmalloc9Scavenger8scheduleEm` | `KYfHQoyY9Uc` | +| `_ZN9Inspector13AgentRegistry13discardValuesEv` | `BGd4bkSC3gA` | +| `_ZN9Inspector13AgentRegistry27didCreateFrontendAndBackendEPNS_14FrontendRouterEPNS_17BackendDispatcherE` | `HQayaNjjt4w` | +| `_ZN9Inspector13AgentRegistry29willDestroyFrontendAndBackendENS_16DisconnectReasonE` | `MxGDaM0UkSY` | +| `_ZN9Inspector13AgentRegistryC2Ev` | `U2-E1yYvnxw` | +| `_ZN9Inspector13AgentRegistryD1Ev` | `2+U7T3s-8fw` | +| `_ZN9Inspector13AgentRegistryD2Ev` | `IPKTmjbeQ6M` | +| `_ZN9Inspector14ConsoleMessage13addToFrontendERNS_25ConsoleFrontendDispatcherERNS_21InjectedScriptManagerEb` | `qO-gljTv7Dk` | +| `_ZN9Inspector14ConsoleMessage14incrementCountEv` | `uIIZREKsTQU` | +| `_ZN9Inspector14ConsoleMessage20autogenerateMetadataEPN3JSC14JSGlobalObjectE` | `v6I4XZYurCw` | +| `_ZN9Inspector14ConsoleMessage26updateRepeatCountInConsoleERNS_25ConsoleFrontendDispatcherE` | `3BVpZh2e4Ho` | +| `_ZN9Inspector14ConsoleMessage5clearEv` | `FjP4ZsLHhpI` | +| `_ZN9Inspector14ConsoleMessageD1Ev` | `iC8g+ZWxbFE` | +| `_ZN9Inspector14ConsoleMessageD2Ev` | `JHSSw7eLWAg` | +| `_ZN9Inspector14ConsoleMessagedaEPv` | `txl9WEJMVGk` | +| `_ZN9Inspector14ConsoleMessagedlEPv` | `GWfexl813eg` | +| `_ZN9Inspector14ConsoleMessagenaEmPv` | `M7c9P1DiVjE` | +| `_ZN9Inspector14ConsoleMessagenaEm` | `VlL7D8EyZ1M` | +| `_ZN9Inspector14ConsoleMessagenwEmPv` | `lWzHkMyiyp0` | +| `_ZN9Inspector14ConsoleMessagenwEm` | `Uhlr4ATPsWQ` | +| `_ZN9Inspector14FrontendRouter15connectFrontendERNS_15FrontendChannelE` | `Q4f93lSW0lk` | +| `_ZN9Inspector14FrontendRouter18disconnectFrontendERNS_15FrontendChannelE` | `9Z0gNNdVsQo` | +| `_ZN9Inspector14FrontendRouter22disconnectAllFrontendsEv` | `PbJcgQdU4CY` | +| `_ZN9Inspector14FrontendRouter6createEv` | `qyzUBXXLwfw` | +| `_ZN9Inspector14FrontendRouterC1Ev` | `uffEeeP+lNU` | +| `_ZN9Inspector14FrontendRouterC2Ev` | `yMsrqRsZRLs` | +| `_ZN9Inspector14FrontendRouterD1Ev` | `KLHGwPPGQEA` | +| `_ZN9Inspector14FrontendRouterD2Ev` | `EbP8tz9rbWs` | +| `_ZN9Inspector14InjectedScript13inspectObjectEN3JSC7JSValueE` | `WCV0pmdA2pI` | +| `_ZN9Inspector14InjectedScript13releaseObjectERKN3WTF6StringE` | `7+XbDOTe2S0` | +| `_ZN9Inspector14InjectedScript13setEventValueEN3JSC7JSValueE` | `m-aLrxrcxzA` | +| `_ZN9Inspector14InjectedScript15arrayFromVectorEON3WTF6VectorIN3JSC7JSValueELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE` | `fRiM9Hno+H0` | +| `_ZN9Inspector14InjectedScript15clearEventValueEv` | `f-ch6EGylTI` | +| `_ZN9Inspector14InjectedScript17setExceptionValueEN3JSC7JSValueE` | `nQBJrxkM-5U` | +| `_ZN9Inspector14InjectedScript18releaseObjectGroupERKN3WTF6StringE` | `BK2h2pP0g2U` | +| `_ZN9Inspector14InjectedScript19clearExceptionValueEv` | `DTTrQJRdCQ4` | +| `_ZN9Inspector14InjectedScriptC1ERKS0_` | `w1bUtZYR1Y4` | +| `_ZN9Inspector14InjectedScriptC1Ev` | `gVbkspALW1k` | +| `_ZN9Inspector14InjectedScriptC2ERKS0_` | `VcDzy9LLnYg` | +| `_ZN9Inspector14InjectedScriptC2Ev` | `quDzSFP+4w8` | +| `_ZN9Inspector14InjectedScriptD0Ev` | `FA5W-aFckfU` | +| `_ZN9Inspector14InjectedScriptD1Ev` | `kNbP1x4atrg` | +| `_ZN9Inspector14InjectedScriptD2Ev` | `YEKoSHIvP70` | +| `_ZN9Inspector14InjectedScriptaSERKS0_` | `4cZX7bAkRdA` | +| `_ZN9Inspector14InspectorAgent25evaluateForTestInFrontendERKN3WTF6StringE` | `ikHEfVYiB5g` | +| `_ZN9Inspector14InspectorAgent27didCreateFrontendAndBackendEPNS_14FrontendRouterEPNS_17BackendDispatcherE` | `mhviITFdt+M` | +| `_ZN9Inspector14InspectorAgentD0Ev` | `XEzAnNpXVaw` | +| `_ZN9Inspector14InspectorAgentD2Ev` | `evOComLiuD4` | +| `_ZN9Inspector14InspectorAgentdaEPv` | `LU4M2+VIi8U` | +| `_ZN9Inspector14InspectorAgentdlEPv` | `fXmilqjYipI` | +| `_ZN9Inspector14InspectorAgentnaEmPv` | `XNZA9DDHP1o` | +| `_ZN9Inspector14InspectorAgentnwEm10NotNullTagPv` | `qQwC0qx1Sdo` | +| `_ZN9Inspector14InspectorAgentnwEmPv` | `qjNxRFy6JC0` | +| `_ZN9Inspector14InspectorAgentnwEm` | `hjHWPtJ4p4E` | +| `_ZN9Inspector15AsyncStackTrace18didCancelAsyncCallEv` | `91bSJvzfgEA` | +| `_ZN9Inspector15AsyncStackTrace20didDispatchAsyncCallEv` | `67P8MiTuxKc` | +| `_ZN9Inspector15AsyncStackTrace21willDispatchAsyncCallEm` | `sy62mPCxbTs` | +| `_ZN9Inspector15AsyncStackTrace6removeEv` | `tmeC+p2Gbr0` | +| `_ZN9Inspector15AsyncStackTrace8truncateEm` | `kkTcZskp1i4` | +| `_ZN9Inspector15AsyncStackTraceD1Ev` | `6Z+fdt4pe2s` | +| `_ZN9Inspector15AsyncStackTraceD2Ev` | `IaYzxLnoJWE` | +| `_ZN9Inspector15InspectorTarget17setResumeCallbackEON3WTF8FunctionIFvvEEE` | `mpk5RNj6HKg` | +| `_ZN9Inspector15InspectorTarget5pauseEv` | `JGYMjGdyi+E` | +| `_ZN9Inspector15InspectorTarget6resumeEv` | `XiMnw9g4tsI` | +| `_ZN9Inspector15InspectorTargetC2Ev` | `42nlgcQ5Rv8` | +| `_ZN9Inspector15InspectorTargetD1Ev` | `GtEbqvEBuK4` | +| `_ZN9Inspector15InspectorTargetD2Ev` | `1pOW-QRdqbE` | +| `_ZN9Inspector15RemoteInspector11setupFailedEj` | `Oww35T-VZ34` | +| `_ZN9Inspector15RemoteInspector12stopInternalENS0_10StopSourceE` | `yU4Ev02ViDc` | +| `_ZN9Inspector15RemoteInspector12updateTargetEPNS_24RemoteControllableTargetE` | `PVX51Pp3iFo` | +| `_ZN9Inspector15RemoteInspector13startDisabledEv` | `hvtNX8toVTk` | +| `_ZN9Inspector15RemoteInspector14registerTargetEPNS_24RemoteControllableTargetE` | `OyNM6zDYiTo` | +| `_ZN9Inspector15RemoteInspector14setupCompletedEj` | `gY1GiSuGTtU` | +| `_ZN9Inspector15RemoteInspector15pushListingsNowEv` | `5yD7mtyHFIs` | +| `_ZN9Inspector15RemoteInspector15updateTargetMapEPNS_24RemoteControllableTargetE` | `7GlkHqJMVSc` | +| `_ZN9Inspector15RemoteInspector16pushListingsSoonEv` | `4asyR6+TvFE` | +| `_ZN9Inspector15RemoteInspector16unregisterTargetEPNS_24RemoteControllableTargetE` | `cLwJi62oO5E` | +| `_ZN9Inspector15RemoteInspector19sendMessageToRemoteEjRKN3WTF6StringE` | `PnbfogQQRus` | +| `_ZN9Inspector15RemoteInspector19sendMessageToTargetEjPKc` | `caF3ritf1d4` | +| `_ZN9Inspector15RemoteInspector19updateTargetListingERKNS_24RemoteControllableTargetE` | `lCLtbKBM05c` | +| `_ZN9Inspector15RemoteInspector19updateTargetListingEj` | `XQg8Mv1VjjM` | +| `_ZN9Inspector15RemoteInspector24updateClientCapabilitiesEv` | `VheCZrwJ7hg` | +| `_ZN9Inspector15RemoteInspector27clientCapabilitiesDidChangeEv` | `aanMqRmIwds` | +| `_ZN9Inspector15RemoteInspector27updateHasActiveDebugSessionEv` | `Bi4hN2Y66TM` | +| `_ZN9Inspector15RemoteInspector29nextAvailableTargetIdentifierEv` | `cDm890W5EK8` | +| `_ZN9Inspector15RemoteInspector29waitingForAutomaticInspectionEj` | `1LXGEu7l1es` | +| `_ZN9Inspector15RemoteInspector34updateAutomaticInspectionCandidateEPNS_22RemoteInspectionTargetE` | `viUDmJaqUSw` | +| `_ZN9Inspector15RemoteInspector4stopEv` | `nIUaIX+FH2c` | +| `_ZN9Inspector15RemoteInspector5setupEj` | `8MrvDWzE5Eo` | +| `_ZN9Inspector15RemoteInspector5startEv` | `xxNgaOEz9Es` | +| `_ZN9Inspector15RemoteInspector6ClientC2ERKS1_` | `fm5iMf1GSvg` | +| `_ZN9Inspector15RemoteInspector6ClientC2Ev` | `VwdSDjyPJ6s` | +| `_ZN9Inspector15RemoteInspector6ClientD0Ev` | `qM6EjseJ7ro` | +| `_ZN9Inspector15RemoteInspector6ClientD1Ev` | `Zt2jWHJQ3OA` | +| `_ZN9Inspector15RemoteInspector6ClientD2Ev` | `e90ZQRXzAXE` | +| `_ZN9Inspector15RemoteInspector7connectEj` | `4TuXOTNLRZ0` | +| `_ZN9Inspector15RemoteInspectorC1Ev` | `XK+J28qoso8` | +| `_ZN9Inspector15RemoteInspectorC2Ev` | `9GV+bfjgtYw` | +| `_ZN9Inspector15RemoteInspectorD0Ev` | `akjIhi9hoC4` | +| `_ZN9Inspector15RemoteInspectorD1Ev` | `J9kgQ5G6WSc` | +| `_ZN9Inspector15RemoteInspectorD2Ev` | `fRpvLQylHb0` | +| `_ZN9Inspector15ScriptArguments6createEPN3JSC14JSGlobalObjectEON3WTF6VectorINS1_6StrongINS1_7UnknownELNS1_30ShouldStrongDestructorGrabLockE0EEELm0ENS4_15CrashOnOverflowELm16ENS4_10FastMallocEEE` | `zjOYFNW9IPE` | +| `_ZN9Inspector15ScriptArgumentsC1EPN3JSC14JSGlobalObjectEON3WTF6VectorINS1_6StrongINS1_7UnknownELNS1_30ShouldStrongDestructorGrabLockE0EEELm0ENS4_15CrashOnOverflowELm16ENS4_10FastMallocEEE` | `Ma3zQSNipOQ` | +| `_ZN9Inspector15ScriptArgumentsC2EPN3JSC14JSGlobalObjectEON3WTF6VectorINS1_6StrongINS1_7UnknownELNS1_30ShouldStrongDestructorGrabLockE0EEELm0ENS4_15CrashOnOverflowELm16ENS4_10FastMallocEEE` | `AvV0x-vhNR4` | +| `_ZN9Inspector15ScriptArgumentsD1Ev` | `cALfJh14EPs` | +| `_ZN9Inspector15ScriptArgumentsD2Ev` | `Y9SIVGvL-80` | +| `_ZN9Inspector15ScriptCallFrameC1ERKS0_` | `eMu9G7-Gub4` | +| `_ZN9Inspector15ScriptCallFrameC2ERKS0_` | `7dFxmg4wSRM` | +| `_ZN9Inspector15ScriptCallFrameD1Ev` | `Er4YajbBg2k` | +| `_ZN9Inspector15ScriptCallFrameD2Ev` | `sJYcP569Utk` | +| `_ZN9Inspector15ScriptCallFrameaSERKS0_` | `IwOCxQwCP9o` | +| `_ZN9Inspector15ScriptCallStack6createEv` | `iXu7XuFfBhU` | +| `_ZN9Inspector15ScriptCallStackC1Ev` | `6gMiKfIw270` | +| `_ZN9Inspector15ScriptCallStackC2Ev` | `6z6RTJBjblE` | +| `_ZN9Inspector15ScriptCallStackD1Ev` | `xeHNDZ8Sk3E` | +| `_ZN9Inspector15ScriptCallStackD2Ev` | `WYtEjQIlrDY` | +| `_ZN9Inspector16toInspectorValueEPN3JSC14JSGlobalObjectENS0_7JSValueE` | `4T4GgJjNBHA` | +| `_ZN9Inspector17BackendDispatcher12CallbackBase11sendFailureERKN3WTF6StringE` | `uEN6W+91atQ` | +| `_ZN9Inspector17BackendDispatcher12CallbackBase7disableEv` | `GvHRNpJ7Qts` | +| `_ZN9Inspector17BackendDispatcher12CallbackBaseD1Ev` | `Tp+Q2ZxmFn4` | +| `_ZN9Inspector17BackendDispatcher12CallbackBaseD2Ev` | `eaSD4VTr548` | +| `_ZN9Inspector17BackendDispatcher17sendPendingErrorsEv` | `s8kM7N-y-eI` | +| `_ZN9Inspector17BackendDispatcher19reportProtocolErrorENS0_15CommonErrorCodeERKN3WTF6StringE` | `ayoDeN-D0MM` | +| `_ZN9Inspector17BackendDispatcher27registerDispatcherForDomainERKN3WTF6StringEPNS_29SupplementalBackendDispatcherE` | `PvizYcVs3Zc` | +| `_ZN9Inspector17BackendDispatcher8dispatchERKN3WTF6StringE` | `1HngmisEcBY` | +| `_ZN9Inspector17BackendDispatcherD1Ev` | `vZuL5d4VEJQ` | +| `_ZN9Inspector17BackendDispatcherD2Ev` | `l33jN8bqpfs` | +| `_ZN9Inspector18IdentifiersFactory16createIdentifierEv` | `B0MuvNsV9e0` | +| `_ZN9Inspector18IdentifiersFactory9requestIdEm` | `YGPQ2f427zQ` | +| `_ZN9Inspector18InjectedScriptBaseC1ERKN3WTF6StringE` | `9j+Pah7d6mg` | +| `_ZN9Inspector18InjectedScriptBaseC1ERKS0_` | `Kd+yyekmbjg` | +| `_ZN9Inspector18InjectedScriptBaseC2ERKN3WTF6StringE` | `8pViWaQiKhA` | +| `_ZN9Inspector18InjectedScriptBaseC2ERKS0_` | `BhGX3nzI6QI` | +| `_ZN9Inspector18InjectedScriptBaseD0Ev` | `BetsiFQjxSU` | +| `_ZN9Inspector18InjectedScriptBaseD1Ev` | `5YuPh3NUQ9Q` | +| `_ZN9Inspector18InjectedScriptBaseD2Ev` | `AMhoOLgG9e8` | +| `_ZN9Inspector18InjectedScriptBaseaSERKS0_` | `5pMktPrQ1pg` | +| `_ZN9Inspector18InjectedScriptHost16clearAllWrappersEv` | `c+YCXKe0E34` | +| `_ZN9Inspector18InjectedScriptHost19isHTMLAllCollectionERN3JSC2VMENS1_7JSValueE` | `x32zUERnINY` | +| `_ZN9Inspector18InjectedScriptHost21getInternalPropertiesERN3JSC2VMEPNS1_14JSGlobalObjectENS1_7JSValueE` | `xKiOo15Kcn0` | +| `_ZN9Inspector18InjectedScriptHost6createEv` | `2SMzgmzR-6Q` | +| `_ZN9Inspector18InjectedScriptHost7wrapperEPN3JSC14JSGlobalObjectE` | `Cw74jJ7Cvzs` | +| `_ZN9Inspector18InjectedScriptHostC1Ev` | `QFj6QQ4cxXU` | +| `_ZN9Inspector18InjectedScriptHostC2Ev` | `G9G4n6xskuE` | +| `_ZN9Inspector18InjectedScriptHostD0Ev` | `jLnpY6jw8GY` | +| `_ZN9Inspector18InjectedScriptHostD1Ev` | `exkh5YVuwLo` | +| `_ZN9Inspector18InjectedScriptHostD2Ev` | `igYCKlMX2RI` | +| `_ZN9Inspector18InspectorHeapAgent17didGarbageCollectEN3JSC15CollectionScopeE` | `FuyOGJaB15A` | +| `_ZN9Inspector18InspectorHeapAgent18clearHeapSnapshotsEv` | `u1jBAAJQh4A` | +| `_ZN9Inspector18InspectorHeapAgent18willGarbageCollectEv` | `sUpnddNKE3A` | +| `_ZN9Inspector18InspectorHeapAgent27didCreateFrontendAndBackendEPNS_14FrontendRouterEPNS_17BackendDispatcherE` | `m8QzC6ghMnE` | +| `_ZN9Inspector18InspectorHeapAgent29dispatchGarbageCollectedEventENS_8Protocol4Heap17GarbageCollection4TypeEN3WTF7SecondsES6_` | `NQ4SAyyv9yk` | +| `_ZN9Inspector18InspectorHeapAgent29willDestroyFrontendAndBackendENS_16DisconnectReasonE` | `FktuuBJlOws` | +| `_ZN9Inspector18InspectorHeapAgentC1ERNS_12AgentContextE` | `JA6GJCmFIjY` | +| `_ZN9Inspector18InspectorHeapAgentC2ERNS_12AgentContextE` | `t2VeaVgUBLI` | +| `_ZN9Inspector18InspectorHeapAgentD0Ev` | `cbxQvl0FscU` | +| `_ZN9Inspector18InspectorHeapAgentD1Ev` | `nC0Zgj4tVAY` | +| `_ZN9Inspector18InspectorHeapAgentD2Ev` | `t7Sao1Z9Vgc` | +| `_ZN9Inspector18InspectorHeapAgentdaEPv` | `fyEt+b7Vf2k` | +| `_ZN9Inspector18InspectorHeapAgentdlEPv` | `HdqkxFL0nGo` | +| `_ZN9Inspector18InspectorHeapAgentnaEm` | `6Voi0Jp1SqE` | +| `_ZN9Inspector18InspectorHeapAgentnaEmPv` | `5Z1c0doVn20` | +| `_ZN9Inspector18InspectorHeapAgentnwEm10NotNullTagPv` | `4CiIyjuiGiE` | +| `_ZN9Inspector18InspectorHeapAgentnwEm` | `BLWN2--HrXA` | +| `_ZN9Inspector18InspectorHeapAgentnwEmPv` | `DZF93h86bFk` | +| `_ZN9Inspector19InspectorAuditAgent11muteConsoleEv` | `i3jcNNLDrjA` | +| `_ZN9Inspector19InspectorAuditAgent13unmuteConsoleEv` | `vGOMeCbW94Q` | +| `_ZN9Inspector19InspectorAuditAgent19populateAuditObjectEPN3JSC14JSGlobalObjectERNS1_6StrongINS1_8JSObjectELNS1_30ShouldStrongDestructorGrabLockE0EEE` | `Vn6ks6XTMtQ` | +| `_ZN9Inspector19InspectorAuditAgent21injectedScriptManagerEv` | `YDNFh8ey+n4` | +| `_ZN9Inspector19InspectorAuditAgent27didCreateFrontendAndBackendEPNS_14FrontendRouterEPNS_17BackendDispatcherE` | `U+h+LTp3UDg` | +| `_ZN9Inspector19InspectorAuditAgent29willDestroyFrontendAndBackendENS_16DisconnectReasonE` | `ezuirSOFGDo` | +| `_ZN9Inspector19InspectorAuditAgentC2ERNS_12AgentContextE` | `mk-apZiLe-0` | +| `_ZN9Inspector19InspectorAuditAgentD0Ev` | `QRVGV6+ykOU` | +| `_ZN9Inspector19InspectorAuditAgentD1Ev` | `seiFdosfod4` | +| `_ZN9Inspector19InspectorAuditAgentD2Ev` | `6jTdIXHSF4E` | +| `_ZN9Inspector19InspectorAuditAgentdaEPv` | `wYRIszRYC0Y` | +| `_ZN9Inspector19InspectorAuditAgentdlEPv` | `qXTJPJYZQrA` | +| `_ZN9Inspector19InspectorAuditAgentnaEmPv` | `w7coJpIhnaY` | +| `_ZN9Inspector19InspectorAuditAgentnaEm` | `h9CpAVBkQJM` | +| `_ZN9Inspector19InspectorAuditAgentnwEm` | `4x33lGf0eEE` | +| `_ZN9Inspector19InspectorAuditAgentnwEmPv` | `SjUQXWH4oQc` | +| `_ZN9Inspector20CSSBackendDispatcher6createERNS_17BackendDispatcherEPNS_27CSSBackendDispatcherHandlerE` | `hEA4jRhQHeE` | +| `_ZN9Inspector20CSSBackendDispatcherC1ERNS_17BackendDispatcherEPNS_27CSSBackendDispatcherHandlerE` | `LN2PdsxVp4k` | +| `_ZN9Inspector20CSSBackendDispatcherC2ERNS_17BackendDispatcherEPNS_27CSSBackendDispatcherHandlerE` | `uk137jXZTd8` | +| `_ZN9Inspector20CSSBackendDispatcherD0Ev` | `YylKwUHOZS4` | +| `_ZN9Inspector20CSSBackendDispatcherD1Ev` | `Kj28M63p0NI` | +| `_ZN9Inspector20CSSBackendDispatcherD2Ev` | `geZonYeFLhA` | +| `_ZN9Inspector20DOMBackendDispatcher6createERNS_17BackendDispatcherEPNS_27DOMBackendDispatcherHandlerE` | `bW3WshEIgsA` | +| `_ZN9Inspector20DOMBackendDispatcherC1ERNS_17BackendDispatcherEPNS_27DOMBackendDispatcherHandlerE` | `khIC4oLafeY` | +| `_ZN9Inspector20DOMBackendDispatcherC2ERNS_17BackendDispatcherEPNS_27DOMBackendDispatcherHandlerE` | `PlM8QvuGgq8` | +| `_ZN9Inspector20DOMBackendDispatcherD0Ev` | `rd+L-TM71fk` | +| `_ZN9Inspector20DOMBackendDispatcherD1Ev` | `x4CazkClw00` | +| `_ZN9Inspector20DOMBackendDispatcherD2Ev` | `OZd9hHmLUgM` | +| `_ZN9Inspector20InjectedScriptModule14ensureInjectedEPNS_21InjectedScriptManagerEPN3JSC14JSGlobalObjectE` | `cZfsvErAAbE` | +| `_ZN9Inspector20InjectedScriptModule14ensureInjectedEPNS_21InjectedScriptManagerERKNS_14InjectedScriptE` | `FsaVxexOmig` | +| `_ZN9Inspector20InjectedScriptModuleC2ERKN3WTF6StringE` | `kyfuY2YfrwA` | +| `_ZN9Inspector20InjectedScriptModuleC2ERKS0_` | `KP6q-p7tajM` | +| `_ZN9Inspector20InjectedScriptModuleD0Ev` | `TnCgJO3CzGw` | +| `_ZN9Inspector20InjectedScriptModuleD1Ev` | `O0u43HQhnAE` | +| `_ZN9Inspector20InjectedScriptModuleD2Ev` | `ppR2zSPkEJE` | +| `_ZN9Inspector20InspectorTargetAgent13targetCreatedERNS_15InspectorTargetE` | `O51Z4cnLYDk` | +| `_ZN9Inspector20InspectorTargetAgent15targetDestroyedERNS_15InspectorTargetE` | `R3QGYKdeeYI` | +| `_ZN9Inspector20InspectorTargetAgent16connectToTargetsEv` | `u6aU7eizxRM` | +| `_ZN9Inspector20InspectorTargetAgent21disconnectFromTargetsEv` | `hb+0MXp9Cgc` | +| `_ZN9Inspector20InspectorTargetAgent26didCommitProvisionalTargetERKN3WTF6StringES4_` | `wny-gONKbF8` | +| `_ZN9Inspector20InspectorTargetAgent27didCreateFrontendAndBackendEPNS_14FrontendRouterEPNS_17BackendDispatcherE` | `DtwAECfqj1w` | +| `_ZN9Inspector20InspectorTargetAgent29willDestroyFrontendAndBackendENS_16DisconnectReasonE` | `c4n8cDBXLZ0` | +| `_ZN9Inspector20InspectorTargetAgent31sendMessageFromTargetToFrontendERKN3WTF6StringES4_` | `YyLUhjo8VdI` | +| `_ZN9Inspector20InspectorTargetAgentC1ERNS_14FrontendRouterERNS_17BackendDispatcherE` | `WPvQCdvn+6U` | +| `_ZN9Inspector20InspectorTargetAgentC2ERNS_14FrontendRouterERNS_17BackendDispatcherE` | `9YY6kfBKCV4` | +| `_ZN9Inspector20InspectorTargetAgentD0Ev` | `WerviCFtn04` | +| `_ZN9Inspector20InspectorTargetAgentD1Ev` | `9shFdrb5VAs` | +| `_ZN9Inspector20InspectorTargetAgentD2Ev` | `nIY9DpOIvR8` | +| `_ZN9Inspector20InspectorTargetAgentdaEPv` | `G0gdWIZvnKI` | +| `_ZN9Inspector20InspectorTargetAgentdlEPv` | `4ulPySgBJGQ` | +| `_ZN9Inspector20InspectorTargetAgentnaEm` | `K42ka7NaGvY` | +| `_ZN9Inspector20InspectorTargetAgentnaEmPv` | `9z-T9X9IMXE` | +| `_ZN9Inspector20InspectorTargetAgentnwEmPv` | `MVpW7W1+7cE` | +| `_ZN9Inspector20InspectorTargetAgentnwEm` | `zyCqcJqhpds` | +| `_ZN9Inspector21CSSFrontendDispatcher17styleSheetChangedERKN3WTF6StringE` | `ki3Vuu7oPhg` | +| `_ZN9Inspector21CSSFrontendDispatcher17styleSheetRemovedERKN3WTF6StringE` | `OxDS41BqXws` | +| `_ZN9Inspector21CSSFrontendDispatcher23mediaQueryResultChangedEv` | `PQ3n7JgVcUw` | +| `_ZN9Inspector21CSSFrontendDispatcherC1ERNS_14FrontendRouterE` | `KWYqIOv7gJk` | +| `_ZN9Inspector21CSSFrontendDispatcherC2ERNS_14FrontendRouterE` | `Sr+YQoaMQds` | +| `_ZN9Inspector21CSSFrontendDispatcherdaEPv` | `kCyuvXqGXu0` | +| `_ZN9Inspector21CSSFrontendDispatcherdlEPv` | `TumAKF0QLX0` | +| `_ZN9Inspector21CSSFrontendDispatchernaEmPv` | `QABMTc77l10` | +| `_ZN9Inspector21CSSFrontendDispatchernwEm` | `JaNjljrSqyg` | +| `_ZN9Inspector21CSSFrontendDispatchernwEmPv` | `VXzAXY+RUM4` | +| `_ZN9Inspector21DOMFrontendDispatcher15documentUpdatedEv` | `jwsSD7ZhRvw` | +| `_ZN9Inspector21DOMFrontendDispatcher16attributeRemovedEiRKN3WTF6StringE` | `xzkqkH5qWbc` | +| `_ZN9Inspector21DOMFrontendDispatcher16childNodeRemovedEii` | `v+mo-+xOSx8` | +| `_ZN9Inspector21DOMFrontendDispatcher16shadowRootPoppedEii` | `73OOfmlKsoY` | +| `_ZN9Inspector21DOMFrontendDispatcher17attributeModifiedEiRKN3WTF6StringES4_` | `HRpZp6CCUcM` | +| `_ZN9Inspector21DOMFrontendDispatcher19didAddEventListenerEi` | `BWgXtAe6mPM` | +| `_ZN9Inspector21DOMFrontendDispatcher20pseudoElementRemovedEii` | `tMyRfRbu-90` | +| `_ZN9Inspector21DOMFrontendDispatcher21characterDataModifiedEiRKN3WTF6StringE` | `NMTIQpo3uXs` | +| `_ZN9Inspector21DOMFrontendDispatcher21childNodeCountUpdatedEii` | `vw0sBeeULiY` | +| `_ZN9Inspector21DOMFrontendDispatcher23willRemoveEventListenerEi` | `WqzBma32q5c` | +| `_ZN9Inspector21DOMFrontendDispatcher25customElementStateChangedEiNS_8Protocol3DOM18CustomElementStateE` | `GYqyvAJtRdw` | +| `_ZN9Inspector21DOMFrontendDispatcher34powerEfficientPlaybackStateChangedEidb` | `B-fuSvib9CA` | +| `_ZN9Inspector21DOMFrontendDispatcher7inspectEi` | `JcUZCNbdFGA` | +| `_ZN9Inspector21DOMFrontendDispatcherC1ERNS_14FrontendRouterE` | `UqhA2SigBj8` | +| `_ZN9Inspector21DOMFrontendDispatcherC2ERNS_14FrontendRouterE` | `Eb3SYtDAAj0` | +| `_ZN9Inspector21DOMFrontendDispatcherdaEPv` | `a1S5ypgxOOI` | +| `_ZN9Inspector21DOMFrontendDispatcherdlEPv` | `UvxHBngd1H8` | +| `_ZN9Inspector21DOMFrontendDispatchernaEmPv` | `kihUpacjs+I` | +| `_ZN9Inspector21DOMFrontendDispatchernaEm` | `hdkkR+M8CDc` | +| `_ZN9Inspector21DOMFrontendDispatchernwEm` | `H0jxp-CXk3o` | +| `_ZN9Inspector21DOMFrontendDispatchernwEmPv` | `CgBCrLvqRUQ` | +| `_ZN9Inspector21HeapBackendDispatcherC1ERNS_17BackendDispatcherEPNS_28HeapBackendDispatcherHandlerE` | `zd3EU-HBSf8` | +| `_ZN9Inspector21HeapBackendDispatcherC2ERNS_17BackendDispatcherEPNS_28HeapBackendDispatcherHandlerE` | `vfjcDZZ8eBY` | +| `_ZN9Inspector21HeapBackendDispatcherD1Ev` | `yu0tB6uMU5s` | +| `_ZN9Inspector21HeapBackendDispatcherD2Ev` | `6bJFALRs0l8` | +| `_ZN9Inspector21InjectedScriptManager10disconnectEv` | `uK-XPIiI+jQ` | +| `_ZN9Inspector21InjectedScriptManager15clearEventValueEv` | `vYUsnwafPbg` | +| `_ZN9Inspector21InjectedScriptManager17injectedScriptForEPN3JSC14JSGlobalObjectE` | `Ue+9QQsd6IU` | +| `_ZN9Inspector21InjectedScriptManager18injectedScriptHostEv` | `4ZZAP3Ty9To` | +| `_ZN9Inspector21InjectedScriptManager18releaseObjectGroupERKN3WTF6StringE` | `7exmsg3vl2Q` | +| `_ZN9Inspector21InjectedScriptManager19clearExceptionValueEv` | `QD1pgB8owo8` | +| `_ZN9Inspector21InjectedScriptManager19injectedScriptForIdEi` | `7ZOWt4eQzMs` | +| `_ZN9Inspector21InjectedScriptManager19injectedScriptIdForEPN3JSC14JSGlobalObjectE` | `kqcVtm9p8GE` | +| `_ZN9Inspector21InjectedScriptManager22discardInjectedScriptsEv` | `NW4U-4dzVIU` | +| `_ZN9Inspector21InjectedScriptManager23didCreateInjectedScriptERKNS_14InjectedScriptE` | `3PnKtGBM91A` | +| `_ZN9Inspector21InjectedScriptManager25injectedScriptForObjectIdERKN3WTF6StringE` | `oT8md3hcNLI` | +| `_ZN9Inspector21InjectedScriptManager7connectEv` | `7fXJ1BHjMmY` | +| `_ZN9Inspector21InjectedScriptManagerD0Ev` | `HywoTZ3E+V4` | +| `_ZN9Inspector21InjectedScriptManagerD1Ev` | `dgy+itLNWbM` | +| `_ZN9Inspector21InjectedScriptManagerD2Ev` | `jPHPessHa1Q` | +| `_ZN9Inspector21InjectedScriptManagerdlEPv` | `Or5qGUqr53A` | +| `_ZN9Inspector21InjectedScriptManagernaEm` | `JMBlA4Sqkek` | +| `_ZN9Inspector21InjectedScriptManagernaEmPv` | `zcD6WcvPfrs` | +| `_ZN9Inspector21InjectedScriptManagernwEm10NotNullTagPv` | `icCnwM4vE+E` | +| `_ZN9Inspector21InjectedScriptManagernwEmPv` | `2oT3cKT3h5w` | +| `_ZN9Inspector21InjectedScriptManagernwEm` | `y6xETTqSGWM` | +| `_ZN9Inspector21InspectorConsoleAgent10countResetEPN3JSC14JSGlobalObjectERKN3WTF6StringE` | `1UFWAsaTuXg` | +| `_ZN9Inspector21InspectorConsoleAgent10stopTimingEPN3JSC14JSGlobalObjectERKN3WTF6StringE` | `C3uEVqmgg48` | +| `_ZN9Inspector21InspectorConsoleAgent12setHeapAgentEPNS_18InspectorHeapAgentE` | `OGrbPHHcWHM` | +| `_ZN9Inspector21InspectorConsoleAgent13discardValuesEv` | `Jw82p29mYBk` | +| `_ZN9Inspector21InspectorConsoleAgent16takeHeapSnapshotERKN3WTF6StringE` | `HSY0-IPlV4k` | +| `_ZN9Inspector21InspectorConsoleAgent27didCreateFrontendAndBackendEPNS_14FrontendRouterEPNS_17BackendDispatcherE` | `Vo3OWY+Pr9Q` | +| `_ZN9Inspector21InspectorConsoleAgent29willDestroyFrontendAndBackendENS_16DisconnectReasonE` | `yqlejW6-6OE` | +| `_ZN9Inspector21InspectorConsoleAgent5countEPN3JSC14JSGlobalObjectERKN3WTF6StringE` | `VD7TJRp5dt8` | +| `_ZN9Inspector21InspectorConsoleAgentC1ERNS_12AgentContextE` | `11Kr-BPqNGE` | +| `_ZN9Inspector21InspectorConsoleAgentC2ERNS_12AgentContextE` | `BPsYUrdqw34` | +| `_ZN9Inspector21InspectorConsoleAgentD0Ev` | `Cbgna+rzoKg` | +| `_ZN9Inspector21InspectorConsoleAgentD1Ev` | `8-R5U3iiEI8` | +| `_ZN9Inspector21InspectorConsoleAgentD2Ev` | `9majkc5-mso` | +| `_ZN9Inspector21InspectorConsoleAgentdaEPv` | `z9oMRRuS3fk` | +| `_ZN9Inspector21InspectorConsoleAgentdlEPv` | `JxzDXFEr-jg` | +| `_ZN9Inspector21InspectorConsoleAgentnaEm` | `7G7hHL9msVg` | +| `_ZN9Inspector21InspectorConsoleAgentnaEmPv` | `nsqL77brn7c` | +| `_ZN9Inspector21InspectorConsoleAgentnwEm10NotNullTagPv` | `8FKB-KCBLXU` | +| `_ZN9Inspector21InspectorConsoleAgentnwEmPv` | `8IEd1z5hqb8` | +| `_ZN9Inspector21InspectorConsoleAgentnwEm` | `WYWJIM3mt+M` | +| `_ZN9Inspector21InspectorRuntimeAgent21injectedScriptManagerEv` | `MyM-PBaGyn4` | +| `_ZN9Inspector21InspectorRuntimeAgent27didCreateFrontendAndBackendEPNS_14FrontendRouterEPNS_17BackendDispatcherE` | `e9w1QH3vMDw` | +| `_ZN9Inspector21InspectorRuntimeAgent27setTypeProfilerEnabledStateEb` | `IVfINJV3j44` | +| `_ZN9Inspector21InspectorRuntimeAgent29willDestroyFrontendAndBackendENS_16DisconnectReasonE` | `xdtEozwG5LM` | +| `_ZN9Inspector21InspectorRuntimeAgent34setControlFlowProfilerEnabledStateEb` | `nsN1RbvzhTg` | +| `_ZN9Inspector21InspectorRuntimeAgentC2ERNS_12AgentContextE` | `wjM4V2CBwFA` | +| `_ZN9Inspector21InspectorRuntimeAgentD0Ev` | `ilvKlfjyUHo` | +| `_ZN9Inspector21InspectorRuntimeAgentD1Ev` | `TJmeruk9Dh4` | +| `_ZN9Inspector21InspectorRuntimeAgentD2Ev` | `ME+KyIgladA` | +| `_ZN9Inspector21InspectorRuntimeAgentdaEPv` | `BtNM6TJROc4` | +| `_ZN9Inspector21InspectorRuntimeAgentdlEPv` | `NObsUCdW7IE` | +| `_ZN9Inspector21InspectorRuntimeAgentnaEmPv` | `dairlPhr80o` | +| `_ZN9Inspector21InspectorRuntimeAgentnaEm` | `ebYz12wDUNI` | +| `_ZN9Inspector21InspectorRuntimeAgentnwEm10NotNullTagPv` | `bBAsdwQLvIs` | +| `_ZN9Inspector21InspectorRuntimeAgentnwEm` | `8P3ImXX5UX8` | +| `_ZN9Inspector21InspectorRuntimeAgentnwEmPv` | `BxYkFlE891I` | +| `_ZN9Inspector21PageBackendDispatcher6createERNS_17BackendDispatcherEPNS_28PageBackendDispatcherHandlerE` | `QUJD3ow+ARM` | +| `_ZN9Inspector21PageBackendDispatcherC1ERNS_17BackendDispatcherEPNS_28PageBackendDispatcherHandlerE` | `IYEzYmDr9lQ` | +| `_ZN9Inspector21PageBackendDispatcherC2ERNS_17BackendDispatcherEPNS_28PageBackendDispatcherHandlerE` | `bMH1rw20+e8` | +| `_ZN9Inspector21PageBackendDispatcherD1Ev` | `cyZff9dyxEQ` | +| `_ZN9Inspector21PageBackendDispatcherD2Ev` | `WqfoS9r2UU4` | +| `_ZN9Inspector21RemoteInspectorServer5startEPKct` | `oOLdJrSCQfM` | +| `_ZN9Inspector21RemoteInspectorServer9singletonEv` | `T6jaOV62tbI` | +| `_ZN9Inspector21createScriptArgumentsEPN3JSC14JSGlobalObjectEPNS0_9CallFrameEj` | `YdAW3oCHB1M` | +| `_ZN9Inspector21createScriptCallStackEPN3JSC14JSGlobalObjectEm` | `sHE-Q-kf2Ds` | +| `_ZN9Inspector22AuditBackendDispatcher6createERNS_17BackendDispatcherEPNS_29AuditBackendDispatcherHandlerE` | `fYPW6rJM4Lw` | +| `_ZN9Inspector22AuditBackendDispatcherC1ERNS_17BackendDispatcherEPNS_29AuditBackendDispatcherHandlerE` | `wXfO-QmzhV4` | +| `_ZN9Inspector22AuditBackendDispatcherC2ERNS_17BackendDispatcherEPNS_29AuditBackendDispatcherHandlerE` | `Y5miljnycaI` | +| `_ZN9Inspector22AuditBackendDispatcherD0Ev` | `Q10zljdilhw` | +| `_ZN9Inspector22AuditBackendDispatcherD1Ev` | `FQhhAq8485I` | +| `_ZN9Inspector22AuditBackendDispatcherD2Ev` | `gG8yHEM0d-4` | +| `_ZN9Inspector22ContentSearchUtilities19searchInTextByLinesERKN3WTF6StringES4_bb` | `f3NfGChYjEs` | +| `_ZN9Inspector22ContentSearchUtilities22textPositionFromOffsetEmRKN3WTF6VectorImLm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEE` | `jnonZqJRfQE` | +| `_ZN9Inspector22ContentSearchUtilities26findStylesheetSourceMapURLERKN3WTF6StringE` | `VwaGH4DPYxg` | +| `_ZN9Inspector22ContentSearchUtilities29countRegularExpressionMatchesERKN3JSC4Yarr17RegularExpressionERKN3WTF6StringE` | `jmHSpqaEYMI` | +| `_ZN9Inspector22ContentSearchUtilities38createRegularExpressionForSearchStringERKN3WTF6StringEbNS0_16SearchStringTypeE` | `UlQSBk8DDBg` | +| `_ZN9Inspector22HeapFrontendDispatcher16trackingCompleteEdRKN3WTF6StringE` | `kD4ppqGHUsI` | +| `_ZN9Inspector22HeapFrontendDispatcherC1ERNS_14FrontendRouterE` | `FZacimxYLYc` | +| `_ZN9Inspector22HeapFrontendDispatcherC2ERNS_14FrontendRouterE` | `JYuYFcPEJhw` | +| `_ZN9Inspector22HeapFrontendDispatcherdaEPv` | `MYopeEAoQeU` | +| `_ZN9Inspector22HeapFrontendDispatcherdlEPv` | `lz5UM9uG8w0` | +| `_ZN9Inspector22HeapFrontendDispatchernaEmPv` | `Bea-ElS5IZA` | +| `_ZN9Inspector22HeapFrontendDispatchernaEm` | `wW-C9fYsgnU` | +| `_ZN9Inspector22HeapFrontendDispatchernwEm` | `Nhyhn2JgQ1M` | +| `_ZN9Inspector22HeapFrontendDispatchernwEmPv` | `s8GYJeFHkAM` | +| `_ZN9Inspector22InspectorDebuggerAgent11addListenerERNS0_8ListenerE` | `gVyCSJTFRbY` | +| `_ZN9Inspector22InspectorDebuggerAgent11didContinueEv` | `O6bxDsGmlvg` | +| `_ZN9Inspector22InspectorDebuggerAgent12assertPausedERN3WTF6StringE` | `Hkm3Dfu-aW4` | +| `_ZN9Inspector22InspectorDebuggerAgent13didBecomeIdleEv` | `V5NGN4l-iUY` | +| `_ZN9Inspector22InspectorDebuggerAgent14removeListenerERNS0_8ListenerE` | `52gEDarUguI` | +| `_ZN9Inspector22InspectorDebuggerAgent17clearPauseDetailsEv` | `5rbqI4X4rOs` | +| `_ZN9Inspector22InspectorDebuggerAgent17currentCallFramesERKNS_14InjectedScriptE` | `nESq6gIQEFY` | +| `_ZN9Inspector22InspectorDebuggerAgent19clearExceptionValueEv` | `yeRcOaMeUE0` | +| `_ZN9Inspector22InspectorDebuggerAgent19failedToParseSourceERKN3WTF6StringES4_iiS4_` | `XYqzGj07i5U` | +| `_ZN9Inspector22InspectorDebuggerAgent19handleConsoleAssertERKN3WTF6StringE` | `U3MmjwQX0tU` | +| `_ZN9Inspector22InspectorDebuggerAgent19registerIdleHandlerEv` | `lnaMfsRbwE0` | +| `_ZN9Inspector22InspectorDebuggerAgent20didClearGlobalObjectEv` | `LRllj8g+OPw` | +| `_ZN9Inspector22InspectorDebuggerAgent20setSuppressAllPausesEb` | `Po-3sCgpU9c` | +| `_ZN9Inspector22InspectorDebuggerAgent21breakpointActionSoundEi` | `lzEtlJdFYEI` | +| `_ZN9Inspector22InspectorDebuggerAgent24clearAsyncStackTraceDataEv` | `DHm6fDoGDBs` | +| `_ZN9Inspector22InspectorDebuggerAgent24willStepAndMayBecomeIdleEv` | `RW1h2gf6vfI` | +| `_ZN9Inspector22InspectorDebuggerAgent25buildExceptionPauseReasonEN3JSC7JSValueERKNS_14InjectedScriptE` | `ZD+kPxvs3no` | +| `_ZN9Inspector22InspectorDebuggerAgent26buildBreakpointPauseReasonEm` | `FtOPxGScdLw` | +| `_ZN9Inspector22InspectorDebuggerAgent27didClearAsyncStackTraceDataEv` | `yLNkraMvdcg` | +| `_ZN9Inspector22InspectorDebuggerAgent27scriptExecutionBlockedByCSPERKN3WTF6StringE` | `m4V2R4vHnMM` | +| `_ZN9Inspector22InspectorDebuggerAgent28clearDebuggerBreakpointStateEv` | `TUas95IjiX8` | +| `_ZN9Inspector22InspectorDebuggerAgent29clearInspectorBreakpointStateEv` | `nlwpUngmVeM` | +| `_ZN9Inspector22InspectorDebuggerAgent29willDestroyFrontendAndBackendENS_16DisconnectReasonE` | `YgaMfJaW8YM` | +| `_ZN9Inspector22InspectorDebuggerAgent6enableEv` | `Om7GCXZ3ygM` | +| `_ZN9Inspector22InspectorDebuggerAgentC2ERNS_12AgentContextE` | `zfSj4nfmhN4` | +| `_ZN9Inspector22InspectorDebuggerAgentD0Ev` | `XMJPvWiQWd4` | +| `_ZN9Inspector22InspectorDebuggerAgentD1Ev` | `FB4JbLYOZmA` | +| `_ZN9Inspector22InspectorDebuggerAgentD2Ev` | `z-Wy213lFiE` | +| `_ZN9Inspector22InspectorDebuggerAgentdaEPv` | `bFzmBgAHSww` | +| `_ZN9Inspector22InspectorDebuggerAgentdlEPv` | `XIKVdH7HuBg` | +| `_ZN9Inspector22InspectorDebuggerAgentnaEmPv` | `eP76KjYIEJo` | +| `_ZN9Inspector22InspectorDebuggerAgentnwEm10NotNullTagPv` | `dyp2qrY2k58` | +| `_ZN9Inspector22InspectorDebuggerAgentnwEm` | `ENS6KVTAqYw` | +| `_ZN9Inspector22PageFrontendDispatcher13frameDetachedERKN3WTF6StringE` | `cOEmyDiWGOM` | +| `_ZN9Inspector22PageFrontendDispatcher14loadEventFiredEd` | `O7LqfJ24JqM` | +| `_ZN9Inspector22PageFrontendDispatcher19frameStartedLoadingERKN3WTF6StringE` | `RWWT2HmVAGQ` | +| `_ZN9Inspector22PageFrontendDispatcher19frameStoppedLoadingERKN3WTF6StringE` | `SNxP9g4ifrE` | +| `_ZN9Inspector22PageFrontendDispatcher20domContentEventFiredEd` | `hk2Vi4aJODY` | +| `_ZN9Inspector22PageFrontendDispatcher24frameScheduledNavigationERKN3WTF6StringEd` | `e50w9CgqAVM` | +| `_ZN9Inspector22PageFrontendDispatcherC1ERNS_14FrontendRouterE` | `w-J2Q4evZwQ` | +| `_ZN9Inspector22PageFrontendDispatcherC2ERNS_14FrontendRouterE` | `wWyRB5M4a3Y` | +| `_ZN9Inspector22PageFrontendDispatcherdaEPv` | `wvB-vvrz6Es` | +| `_ZN9Inspector22PageFrontendDispatcherdlEPv` | `QHTLo69uRWI` | +| `_ZN9Inspector22PageFrontendDispatchernaEmPv` | `u3NmAGMYF2E` | +| `_ZN9Inspector22PageFrontendDispatchernaEm` | `e+sSKboL3VY` | +| `_ZN9Inspector22PageFrontendDispatchernwEm` | `2ljzHKoKet8` | +| `_ZN9Inspector22PageFrontendDispatchernwEmPv` | `n2jDNez3pz8` | +| `_ZN9Inspector22RemoteAutomationTarget11setIsPairedEb` | `VyeMG5If2f8` | +| `_ZN9Inspector22RemoteAutomationTargetC2Ev` | `R1UArToVtOY` | +| `_ZN9Inspector22RemoteAutomationTargetD0Ev` | `ewpJla+Xdkk` | +| `_ZN9Inspector22RemoteAutomationTargetD1Ev` | `tA4JXxjzLVA` | +| `_ZN9Inspector22RemoteAutomationTargetD2Ev` | `yk3V1q4WZhI` | +| `_ZN9Inspector22RemoteInspectionTarget13setIndicatingEb` | `OVjZSfT7QFM` | +| `_ZN9Inspector22RemoteInspectionTarget30unpauseForInitializedInspectorEv` | `ECv+6+YUPCE` | +| `_ZN9Inspector22RemoteInspectionTargetC2ERKS0_` | `ShZDGe2pqmk` | +| `_ZN9Inspector22RemoteInspectionTargetC2Ev` | `wurmB0Y21Xs` | +| `_ZN9Inspector22RemoteInspectionTargetD1Ev` | `gw6eHbjfARY` | +| `_ZN9Inspector22RemoteInspectionTargetaSERKS0_` | `yWefaqPBkOE` | +| `_ZN9Inspector23CanvasBackendDispatcherC1ERNS_17BackendDispatcherEPNS_30CanvasBackendDispatcherHandlerE` | `63irgN+Sqf4` | +| `_ZN9Inspector23CanvasBackendDispatcherD0Ev` | `qdKPuKgz4dE` | +| `_ZN9Inspector23CanvasBackendDispatcherD1Ev` | `lftcyoraBOU` | +| `_ZN9Inspector23CanvasBackendDispatcherD2Ev` | `gwsWEALPum4` | +| `_ZN9Inspector23TargetBackendDispatcher6createERNS_17BackendDispatcherEPNS_30TargetBackendDispatcherHandlerE` | `vQzQFaYfxtg` | +| `_ZN9Inspector23TargetBackendDispatcherC1ERNS_17BackendDispatcherEPNS_30TargetBackendDispatcherHandlerE` | `LXppT-p0ojg` | +| `_ZN9Inspector23TargetBackendDispatcherC2ERNS_17BackendDispatcherEPNS_30TargetBackendDispatcherHandlerE` | `EgKNWVm7Pv4` | +| `_ZN9Inspector23TargetBackendDispatcherD0Ev` | `h9v3R3VV5mM` | +| `_ZN9Inspector23TargetBackendDispatcherD1Ev` | `q1-YfqGcZYE` | +| `_ZN9Inspector23TargetBackendDispatcherD2Ev` | `xIGhjgZac+0` | +| `_ZN9Inspector23WorkerBackendDispatcher6createERNS_17BackendDispatcherEPNS_30WorkerBackendDispatcherHandlerE` | `ouuS6yaSDvg` | +| `_ZN9Inspector23WorkerBackendDispatcherC1ERNS_17BackendDispatcherEPNS_30WorkerBackendDispatcherHandlerE` | `jM1GeUyL2ZI` | +| `_ZN9Inspector23WorkerBackendDispatcherC2ERNS_17BackendDispatcherEPNS_30WorkerBackendDispatcherHandlerE` | `NFOpTpQBrc8` | +| `_ZN9Inspector23WorkerBackendDispatcherD0Ev` | `srJj-3x1CkA` | +| `_ZN9Inspector23WorkerBackendDispatcherD1Ev` | `t3XMeHmtcbs` | +| `_ZN9Inspector23WorkerBackendDispatcherD2Ev` | `gkugmNmgDEc` | +| `_ZN9Inspector24BrowserBackendDispatcher6createERNS_17BackendDispatcherEPNS_31BrowserBackendDispatcherHandlerE` | `QSyVGX2GyXQ` | +| `_ZN9Inspector24BrowserBackendDispatcherC1ERNS_17BackendDispatcherEPNS_31BrowserBackendDispatcherHandlerE` | `w4RYpvkqVzY` | +| `_ZN9Inspector24BrowserBackendDispatcherC2ERNS_17BackendDispatcherEPNS_31BrowserBackendDispatcherHandlerE` | `AoNF3RLJ4W8` | +| `_ZN9Inspector24BrowserBackendDispatcherD0Ev` | `s1UIJXfLWkA` | +| `_ZN9Inspector24BrowserBackendDispatcherD1Ev` | `gE2z3yI+8Fw` | +| `_ZN9Inspector24BrowserBackendDispatcherD2Ev` | `hOxrrGTtiGA` | +| `_ZN9Inspector24CanvasFrontendDispatcher13canvasRemovedERKN3WTF6StringE` | `8A0knFNsfrQ` | +| `_ZN9Inspector24CanvasFrontendDispatcher16extensionEnabledERKN3WTF6StringES4_` | `mHLewiXwbMo` | +| `_ZN9Inspector24CanvasFrontendDispatcher16recordingStartedERKN3WTF6StringENS_8Protocol9Recording9InitiatorE` | `16iE1U5SFuk` | +| `_ZN9Inspector24CanvasFrontendDispatcher18clientNodesChangedERKN3WTF6StringE` | `6Ah3qEzF5fg` | +| `_ZN9Inspector24CanvasFrontendDispatcher19canvasMemoryChangedERKN3WTF6StringEd` | `XrTJtDbKnHg` | +| `_ZN9Inspector24CanvasFrontendDispatcherC1ERNS_14FrontendRouterE` | `zv7EBvM-xCQ` | +| `_ZN9Inspector24CanvasFrontendDispatcherC2ERNS_14FrontendRouterE` | `z8TY8SaPtIw` | +| `_ZN9Inspector24CanvasFrontendDispatcherdaEPv` | `NVkKQ0n1t8U` | +| `_ZN9Inspector24CanvasFrontendDispatcherdlEPv` | `1O9g6WFku7c` | +| `_ZN9Inspector24CanvasFrontendDispatchernaEmPv` | `9uLllMP6nhU` | +| `_ZN9Inspector24CanvasFrontendDispatchernaEm` | `yBzQ4LTnp8U` | +| `_ZN9Inspector24CanvasFrontendDispatchernwEm` | `NJt4CMd3J74` | +| `_ZN9Inspector24CanvasFrontendDispatchernwEmPv` | `GpDR4arH8lM` | +| `_ZN9Inspector24ConsoleBackendDispatcher6createERNS_17BackendDispatcherEPNS_31ConsoleBackendDispatcherHandlerE` | `lJ3w1fkalI0` | +| `_ZN9Inspector24ConsoleBackendDispatcherC1ERNS_17BackendDispatcherEPNS_31ConsoleBackendDispatcherHandlerE` | `XFzf4GhJqa0` | +| `_ZN9Inspector24ConsoleBackendDispatcherC2ERNS_17BackendDispatcherEPNS_31ConsoleBackendDispatcherHandlerE` | `wSISvG5+77c` | +| `_ZN9Inspector24ConsoleBackendDispatcherD1Ev` | `RUPepd6YjLU` | +| `_ZN9Inspector24ConsoleBackendDispatcherD2Ev` | `MCnMnMU64e0` | +| `_ZN9Inspector24NetworkBackendDispatcher6createERNS_17BackendDispatcherEPNS_31NetworkBackendDispatcherHandlerE` | `DowkuRBDu1c` | +| `_ZN9Inspector24NetworkBackendDispatcherC1ERNS_17BackendDispatcherEPNS_31NetworkBackendDispatcherHandlerE` | `e8x71aUZBe4` | +| `_ZN9Inspector24NetworkBackendDispatcherC2ERNS_17BackendDispatcherEPNS_31NetworkBackendDispatcherHandlerE` | `6ahgTYgo898` | +| `_ZN9Inspector24NetworkBackendDispatcherD0Ev` | `6SKAMuUgdIg` | +| `_ZN9Inspector24NetworkBackendDispatcherD1Ev` | `x6aTU6zBgYg` | +| `_ZN9Inspector24NetworkBackendDispatcherD2Ev` | `15Cz0VyipAQ` | +| `_ZN9Inspector24RemoteControllableTarget19setTargetIdentifierEj` | `8LNY0wNMOFo` | +| `_ZN9Inspector24RemoteControllableTarget4initEv` | `B6OMnyK7ouA` | +| `_ZN9Inspector24RemoteControllableTarget6updateEv` | `mGd9i+ILujA` | +| `_ZN9Inspector24RemoteControllableTargetC2ERKS0_` | `XRmIkQ5gbwA` | +| `_ZN9Inspector24RemoteControllableTargetC2Ev` | `pngra5JlGpI` | +| `_ZN9Inspector24RemoteControllableTargetD0Ev` | `z1TlnsoaCKY` | +| `_ZN9Inspector24RemoteControllableTargetD1Ev` | `Wyh34qiSCN0` | +| `_ZN9Inspector24RemoteControllableTargetD2Ev` | `Zxwv65E2iCs` | +| `_ZN9Inspector24RemoteControllableTargetaSERKS0_` | `IO2yE8-du0I` | +| `_ZN9Inspector24RuntimeBackendDispatcher6createERNS_17BackendDispatcherEPNS_31RuntimeBackendDispatcherHandlerE` | `7pQUqytL4AY` | +| `_ZN9Inspector24RuntimeBackendDispatcherC1ERNS_17BackendDispatcherEPNS_31RuntimeBackendDispatcherHandlerE` | `VVNqKCMGKTs` | +| `_ZN9Inspector24RuntimeBackendDispatcherC2ERNS_17BackendDispatcherEPNS_31RuntimeBackendDispatcherHandlerE` | `UQLOia3yTW0` | +| `_ZN9Inspector24RuntimeBackendDispatcherD0Ev` | `LKZcmQ6G+v0` | +| `_ZN9Inspector24RuntimeBackendDispatcherD1Ev` | `GBiW5PxQtbA` | +| `_ZN9Inspector24RuntimeBackendDispatcherD2Ev` | `ljacL714xNI` | +| `_ZN9Inspector24TargetFrontendDispatcher15targetDestroyedERKN3WTF6StringE` | `eVUG1wzRuAA` | +| `_ZN9Inspector24TargetFrontendDispatcher25dispatchMessageFromTargetERKN3WTF6StringES4_` | `E6XSG7zCNk8` | +| `_ZN9Inspector24TargetFrontendDispatcher26didCommitProvisionalTargetERKN3WTF6StringES4_` | `NWZbcznrH4E` | +| `_ZN9Inspector24TargetFrontendDispatcherC1ERNS_14FrontendRouterE` | `vxx2FqLL02Y` | +| `_ZN9Inspector24TargetFrontendDispatcherC2ERNS_14FrontendRouterE` | `IqvI72sPVyw` | +| `_ZN9Inspector24TargetFrontendDispatcherdaEPv` | `b3LcL-LNpus` | +| `_ZN9Inspector24TargetFrontendDispatcherdlEPv` | `LrKTHvwbMM0` | +| `_ZN9Inspector24TargetFrontendDispatchernaEmPv` | `4rIiwRN5juk` | +| `_ZN9Inspector24TargetFrontendDispatchernaEm` | `kP1VqcMdVqk` | +| `_ZN9Inspector24TargetFrontendDispatchernwEmPv` | `LrVLyMhdlF4` | +| `_ZN9Inspector24WorkerFrontendDispatcher13workerCreatedERKN3WTF6StringES4_S4_` | `Nk-XIvILlUQ` | +| `_ZN9Inspector24WorkerFrontendDispatcher16workerTerminatedERKN3WTF6StringE` | `apl6KD3oTLg` | +| `_ZN9Inspector24WorkerFrontendDispatcher25dispatchMessageFromWorkerERKN3WTF6StringES4_` | `4Mbb6GJcxos` | +| `_ZN9Inspector24WorkerFrontendDispatcherC1ERNS_14FrontendRouterE` | `9LcAvVHbGqg` | +| `_ZN9Inspector24WorkerFrontendDispatcherC2ERNS_14FrontendRouterE` | `qyEX-fuiboI` | +| `_ZN9Inspector24WorkerFrontendDispatcherdaEPv` | `qYjc+6V1cmo` | +| `_ZN9Inspector24WorkerFrontendDispatcherdlEPv` | `ZAWn29mGSe8` | +| `_ZN9Inspector24WorkerFrontendDispatchernaEmPv` | `5I8V274Iw9Y` | +| `_ZN9Inspector24WorkerFrontendDispatchernaEm` | `y7Y2k8D6Bv4` | +| `_ZN9Inspector24WorkerFrontendDispatchernwEmPv` | `X3xFNY5k+MQ` | +| `_ZN9Inspector24WorkerFrontendDispatchernwEm` | `Yy7p8z0z7Nk` | +| `_ZN9Inspector25BrowserFrontendDispatcherC1ERNS_14FrontendRouterE` | `TuNDnlmOxTw` | +| `_ZN9Inspector25BrowserFrontendDispatcherC2ERNS_14FrontendRouterE` | `kbzzvMGjXIA` | +| `_ZN9Inspector25BrowserFrontendDispatcherdaEPv` | `er6KKExFGgc` | +| `_ZN9Inspector25BrowserFrontendDispatcherdlEPv` | `eWWZEruU6eQ` | +| `_ZN9Inspector25BrowserFrontendDispatchernaEmPv` | `BQyTr76CMQc` | +| `_ZN9Inspector25BrowserFrontendDispatchernaEm` | `oYJAITu1ga8` | +| `_ZN9Inspector25BrowserFrontendDispatchernwEm` | `Fa3M9vt2GNg` | +| `_ZN9Inspector25BrowserFrontendDispatchernwEmPv` | `8p8NfEvYtak` | +| `_ZN9Inspector25ConsoleFrontendDispatcherC1ERNS_14FrontendRouterE` | `gHW1YCnRe9s` | +| `_ZN9Inspector25ConsoleFrontendDispatcherC2ERNS_14FrontendRouterE` | `nVn730pUTh4` | +| `_ZN9Inspector25ConsoleFrontendDispatcherdaEPv` | `7ht8b5GNMMY` | +| `_ZN9Inspector25ConsoleFrontendDispatcherdlEPv` | `tkfkwdKXdSM` | +| `_ZN9Inspector25ConsoleFrontendDispatchernaEmPv` | `XjmU-UvchPg` | +| `_ZN9Inspector25ConsoleFrontendDispatchernaEm` | `y25WcIE0ly0` | +| `_ZN9Inspector25ConsoleFrontendDispatchernwEmPv` | `zvvWMJWZYmk` | +| `_ZN9Inspector25ConsoleFrontendDispatchernwEm` | `fejyIlCPzIA` | +| `_ZN9Inspector25DatabaseBackendDispatcher6createERNS_17BackendDispatcherEPNS_32DatabaseBackendDispatcherHandlerE` | `o34cne4Sze8` | +| `_ZN9Inspector25DatabaseBackendDispatcherC1ERNS_17BackendDispatcherEPNS_32DatabaseBackendDispatcherHandlerE` | `t4zuLZWFIwE` | +| `_ZN9Inspector25DatabaseBackendDispatcherC2ERNS_17BackendDispatcherEPNS_32DatabaseBackendDispatcherHandlerE` | `bQh0h2PF49M` | +| `_ZN9Inspector25DatabaseBackendDispatcherD0Ev` | `UDQUp4iBK2A` | +| `_ZN9Inspector25DatabaseBackendDispatcherD1Ev` | `gpRW3yUQPWg` | +| `_ZN9Inspector25DatabaseBackendDispatcherD2Ev` | `X7gTF-zHNOI` | +| `_ZN9Inspector25DebuggerBackendDispatcher6createERNS_17BackendDispatcherEPNS_32DebuggerBackendDispatcherHandlerE` | `MYWGcogoxsw` | +| `_ZN9Inspector25DebuggerBackendDispatcherC1ERNS_17BackendDispatcherEPNS_32DebuggerBackendDispatcherHandlerE` | `xA129Wck6j4` | +| `_ZN9Inspector25DebuggerBackendDispatcherC2ERNS_17BackendDispatcherEPNS_32DebuggerBackendDispatcherHandlerE` | `5Ev5KNi-bdE` | +| `_ZN9Inspector25DebuggerBackendDispatcherD0Ev` | `LSxaF7YhbHs` | +| `_ZN9Inspector25DebuggerBackendDispatcherD1Ev` | `bD5RtTjevng` | +| `_ZN9Inspector25DebuggerBackendDispatcherD2Ev` | `9ohwTl0Bcnk` | +| `_ZN9Inspector25NetworkFrontendDispatcher12dataReceivedERKN3WTF6StringEdii` | `ogFCy9EBtYo` | +| `_ZN9Inspector25NetworkFrontendDispatcher15webSocketClosedERKN3WTF6StringEd` | `NgTYaNYsSsk` | +| `_ZN9Inspector25NetworkFrontendDispatcher16webSocketCreatedERKN3WTF6StringES4_` | `X9OuYB-jm2A` | +| `_ZN9Inspector25NetworkFrontendDispatcher19webSocketFrameErrorERKN3WTF6StringEdS4_` | `RZsx7hJC89c` | +| `_ZN9Inspector25NetworkFrontendDispatcherC1ERNS_14FrontendRouterE` | `Y7kPU5plvt4` | +| `_ZN9Inspector25NetworkFrontendDispatcherC2ERNS_14FrontendRouterE` | `XFo3ZOD4wKo` | +| `_ZN9Inspector25NetworkFrontendDispatcherdaEPv` | `HH3KJFVK2Kg` | +| `_ZN9Inspector25NetworkFrontendDispatcherdlEPv` | `C5ifI-ABvq0` | +| `_ZN9Inspector25NetworkFrontendDispatchernaEm` | `LJj90HDolFE` | +| `_ZN9Inspector25NetworkFrontendDispatchernaEmPv` | `SJZPlWOFp24` | +| `_ZN9Inspector25NetworkFrontendDispatchernwEm` | `JHBmUO0py9w` | +| `_ZN9Inspector25NetworkFrontendDispatchernwEmPv` | `a39DFeFUxK0` | +| `_ZN9Inspector25RuntimeFrontendDispatcherC1ERNS_14FrontendRouterE` | `Fcve1msoJH0` | +| `_ZN9Inspector25RuntimeFrontendDispatcherC2ERNS_14FrontendRouterE` | `CpHAdNB7hs4` | +| `_ZN9Inspector25RuntimeFrontendDispatcherdaEPv` | `fO2b1mAdv+w` | +| `_ZN9Inspector25RuntimeFrontendDispatcherdlEPv` | `IT-rstTbKL8` | +| `_ZN9Inspector25RuntimeFrontendDispatchernaEmPv` | `LCPCX6fHPQY` | +| `_ZN9Inspector25RuntimeFrontendDispatchernaEm` | `TsCf6iWDcSo` | +| `_ZN9Inspector25RuntimeFrontendDispatchernwEm` | `8pokA8LyOtk` | +| `_ZN9Inspector25RuntimeFrontendDispatchernwEmPv` | `JbWUV6K+82c` | +| `_ZN9Inspector25TimelineBackendDispatcher6createERNS_17BackendDispatcherEPNS_32TimelineBackendDispatcherHandlerE` | `aY2-NdiJ7es` | +| `_ZN9Inspector25TimelineBackendDispatcherC1ERNS_17BackendDispatcherEPNS_32TimelineBackendDispatcherHandlerE` | `3u2GoRYVhr8` | +| `_ZN9Inspector25TimelineBackendDispatcherC2ERNS_17BackendDispatcherEPNS_32TimelineBackendDispatcherHandlerE` | `aMhqQdD0-Ho` | +| `_ZN9Inspector25TimelineBackendDispatcherD0Ev` | `veTpNwFxcog` | +| `_ZN9Inspector25TimelineBackendDispatcherD1Ev` | `LRDCp97A9HM` | +| `_ZN9Inspector25TimelineBackendDispatcherD2Ev` | `bJ9NDrBlzSk` | +| `_ZN9Inspector26AnimationBackendDispatcher6createERNS_17BackendDispatcherEPNS_33AnimationBackendDispatcherHandlerE` | `hWtTMIOy3Xc` | +| `_ZN9Inspector26AnimationBackendDispatcherC1ERNS_17BackendDispatcherEPNS_33AnimationBackendDispatcherHandlerE` | `kmZFGloXNak` | +| `_ZN9Inspector26AnimationBackendDispatcherC2ERNS_17BackendDispatcherEPNS_33AnimationBackendDispatcherHandlerE` | `QXoN8WJ6Elc` | +| `_ZN9Inspector26AnimationBackendDispatcherD0Ev` | `pQ+OGYuSoTM` | +| `_ZN9Inspector26AnimationBackendDispatcherD1Ev` | `RuRXBh3D8E0` | +| `_ZN9Inspector26AnimationBackendDispatcherD2Ev` | `q1HXJrqXhwQ` | +| `_ZN9Inspector26DatabaseFrontendDispatcherC1ERNS_14FrontendRouterE` | `knYA790Sgto` | +| `_ZN9Inspector26DatabaseFrontendDispatcherC2ERNS_14FrontendRouterE` | `QpFhGrmIqhE` | +| `_ZN9Inspector26DatabaseFrontendDispatcherdaEPv` | `DB4go2kMtxo` | +| `_ZN9Inspector26DatabaseFrontendDispatcherdlEPv` | `vEGSpl7lJQY` | +| `_ZN9Inspector26DatabaseFrontendDispatchernaEmPv` | `crUhCyhBS3k` | +| `_ZN9Inspector26DatabaseFrontendDispatchernaEm` | `sJIve7S2o-0` | +| `_ZN9Inspector26DatabaseFrontendDispatchernwEm` | `FeHJNqnyMNg` | +| `_ZN9Inspector26DatabaseFrontendDispatchernwEmPv` | `vtxQvXlNvHk` | +| `_ZN9Inspector26DebuggerFrontendDispatcher19globalObjectClearedEv` | `To0+90ONW9w` | +| `_ZN9Inspector26DebuggerFrontendDispatcher19scriptFailedToParseERKN3WTF6StringES4_iiS4_` | `a-YNP4O13AU` | +| `_ZN9Inspector26DebuggerFrontendDispatcher25playBreakpointActionSoundEi` | `nz2Vn7gXKYE` | +| `_ZN9Inspector26DebuggerFrontendDispatcher7resumedEv` | `CNQLeYqffyw` | +| `_ZN9Inspector26DebuggerFrontendDispatcherC1ERNS_14FrontendRouterE` | `cWsZ0K-ZAJU` | +| `_ZN9Inspector26DebuggerFrontendDispatcherC2ERNS_14FrontendRouterE` | `ItO4km85h7E` | +| `_ZN9Inspector26DebuggerFrontendDispatcherdaEPv` | `bjbrUuq+lso` | +| `_ZN9Inspector26DebuggerFrontendDispatcherdlEPv` | `jk04YK+R0HU` | +| `_ZN9Inspector26DebuggerFrontendDispatchernaEm` | `EZOP9rEdz30` | +| `_ZN9Inspector26DebuggerFrontendDispatchernaEmPv` | `bM5szLq16Ds` | +| `_ZN9Inspector26DebuggerFrontendDispatchernwEmPv` | `7lO9jFyTA4A` | +| `_ZN9Inspector26DebuggerFrontendDispatchernwEm` | `uGChIgrdASs` | +| `_ZN9Inspector26InspectorBackendDispatcher6createERNS_17BackendDispatcherEPNS_33InspectorBackendDispatcherHandlerE` | `4mDB1uYisIk` | +| `_ZN9Inspector26InspectorBackendDispatcherC1ERNS_17BackendDispatcherEPNS_33InspectorBackendDispatcherHandlerE` | `HngShRrV5kE` | +| `_ZN9Inspector26InspectorBackendDispatcherC2ERNS_17BackendDispatcherEPNS_33InspectorBackendDispatcherHandlerE` | `iA-vC0yvhuU` | +| `_ZN9Inspector26InspectorBackendDispatcherD0Ev` | `98-71sEmEjM` | +| `_ZN9Inspector26InspectorBackendDispatcherD1Ev` | `5dJ+h7s5eoI` | +| `_ZN9Inspector26InspectorBackendDispatcherD2Ev` | `ep62GVUAPso` | +| `_ZN9Inspector26LayerTreeBackendDispatcher6createERNS_17BackendDispatcherEPNS_33LayerTreeBackendDispatcherHandlerE` | `qUWj0hHoNrc` | +| `_ZN9Inspector26LayerTreeBackendDispatcherC1ERNS_17BackendDispatcherEPNS_33LayerTreeBackendDispatcherHandlerE` | `CRqfzns7jWc` | +| `_ZN9Inspector26LayerTreeBackendDispatcherC2ERNS_17BackendDispatcherEPNS_33LayerTreeBackendDispatcherHandlerE` | `aZDf8iQPKdk` | +| `_ZN9Inspector26LayerTreeBackendDispatcherD1Ev` | `ZsyoHY8zmGw` | +| `_ZN9Inspector26LayerTreeBackendDispatcherD2Ev` | `ed0BkTf42Tc` | +| `_ZN9Inspector26TimelineFrontendDispatcher16recordingStartedEd` | `zptosxCqOgw` | +| `_ZN9Inspector26TimelineFrontendDispatcher16recordingStoppedEd` | `MzZ1vXfWlaY` | +| `_ZN9Inspector26TimelineFrontendDispatcher18autoCaptureStartedEv` | `gSjDXUEB5Uk` | +| `_ZN9Inspector26TimelineFrontendDispatcherC1ERNS_14FrontendRouterE` | `mhBjKWf7rGE` | +| `_ZN9Inspector26TimelineFrontendDispatcherC2ERNS_14FrontendRouterE` | `zWP0d9r9zl4` | +| `_ZN9Inspector26TimelineFrontendDispatcherdaEPv` | `DJLMNkz6oP8` | +| `_ZN9Inspector26TimelineFrontendDispatcherdlEPv` | `15DNj4tGe8c` | +| `_ZN9Inspector26TimelineFrontendDispatchernaEm` | `JsiXZ27Fmcg` | +| `_ZN9Inspector26TimelineFrontendDispatchernaEmPv` | `NcCsEd0v9bM` | +| `_ZN9Inspector26TimelineFrontendDispatchernwEmPv` | `M7nvMGJySqk` | +| `_ZN9Inspector26TimelineFrontendDispatchernwEm` | `nrg-o7sXbKk` | +| `_ZN9Inspector27AnimationFrontendDispatcher13targetChangedERKN3WTF6StringE` | `hd9m4Ozb-zU` | +| `_ZN9Inspector27AnimationFrontendDispatcher13trackingStartEd` | `bb5o-YHu8vM` | +| `_ZN9Inspector27AnimationFrontendDispatcher16trackingCompleteEd` | `RZHQT5QnVPQ` | +| `_ZN9Inspector27AnimationFrontendDispatcher18animationDestroyedERKN3WTF6StringE` | `bMlLM2uzdB8` | +| `_ZN9Inspector27AnimationFrontendDispatcherC1ERNS_14FrontendRouterE` | `zn4MCC35uZw` | +| `_ZN9Inspector27AnimationFrontendDispatcherC2ERNS_14FrontendRouterE` | `RZ5glqNEI6g` | +| `_ZN9Inspector27AnimationFrontendDispatcherdaEPv` | `mcHjNU1s-LI` | +| `_ZN9Inspector27AnimationFrontendDispatcherdlEPv` | `GnqKwm4KHMA` | +| `_ZN9Inspector27AnimationFrontendDispatchernaEm` | `G7yXWAlfjTw` | +| `_ZN9Inspector27AnimationFrontendDispatchernaEmPv` | `cj7hx7O-vF4` | +| `_ZN9Inspector27AnimationFrontendDispatchernwEmPv` | `KaUFjN7Vu+s` | +| `_ZN9Inspector27AnimationFrontendDispatchernwEm` | `U2Ewy7tmla0` | +| `_ZN9Inspector27CSSBackendDispatcherHandlerC2ERKS0_` | `EgHudGJawMs` | +| `_ZN9Inspector27CSSBackendDispatcherHandlerC2Ev` | `CEQjJzzBB+M` | +| `_ZN9Inspector27CSSBackendDispatcherHandlerD0Ev` | `k801tcAVuJg` | +| `_ZN9Inspector27CSSBackendDispatcherHandlerD1Ev` | `e2jQsb44n7g` | +| `_ZN9Inspector27CSSBackendDispatcherHandlerD2Ev` | `X33tJyO5k+E` | +| `_ZN9Inspector27DOMBackendDispatcherHandlerC2ERKS0_` | `6ZXtFYaM5Os` | +| `_ZN9Inspector27DOMBackendDispatcherHandlerC2Ev` | `I+pR0r79q1A` | +| `_ZN9Inspector27DOMBackendDispatcherHandlerD0Ev` | `Nj40sbvN+pk` | +| `_ZN9Inspector27DOMBackendDispatcherHandlerD1Ev` | `ne3CqrAouMo` | +| `_ZN9Inspector27DOMBackendDispatcherHandlerD2Ev` | `zINGw6gUtWg` | +| `_ZN9Inspector27DOMStorageBackendDispatcher6createERNS_17BackendDispatcherEPNS_34DOMStorageBackendDispatcherHandlerE` | `IU2hAFuSeo0` | +| `_ZN9Inspector27DOMStorageBackendDispatcherC1ERNS_17BackendDispatcherEPNS_34DOMStorageBackendDispatcherHandlerE` | `61EC2LTV350` | +| `_ZN9Inspector27DOMStorageBackendDispatcherC2ERNS_17BackendDispatcherEPNS_34DOMStorageBackendDispatcherHandlerE` | `KP5mNSzvl9M` | +| `_ZN9Inspector27DOMStorageBackendDispatcherD0Ev` | `xcuJj4t8vWQ` | +| `_ZN9Inspector27DOMStorageBackendDispatcherD1Ev` | `2RVtNYjCrT0` | +| `_ZN9Inspector27DOMStorageBackendDispatcherD2Ev` | `o-CU61gUP2A` | +| `_ZN9Inspector27InspectorFrontendDispatcher25evaluateForTestInFrontendERKN3WTF6StringE` | `jALEBkxiGfU` | +| `_ZN9Inspector27InspectorFrontendDispatcherC1ERNS_14FrontendRouterE` | `5-aNCKDNRNs` | +| `_ZN9Inspector27InspectorFrontendDispatcherC2ERNS_14FrontendRouterE` | `72Xc-Zdql7E` | +| `_ZN9Inspector27InspectorFrontendDispatcherdaEPv` | `OX-s5D0nKW8` | +| `_ZN9Inspector27InspectorFrontendDispatcherdlEPv` | `3040bxCvolo` | +| `_ZN9Inspector27InspectorFrontendDispatchernaEmPv` | `up4R3KfldIo` | +| `_ZN9Inspector27InspectorFrontendDispatchernaEm` | `gftOFNpk4Cg` | +| `_ZN9Inspector27InspectorFrontendDispatchernwEm` | `4PQ+-MoYPRw` | +| `_ZN9Inspector27InspectorFrontendDispatchernwEmPv` | `EPdBkepv-2k` | +| `_ZN9Inspector27LayerTreeFrontendDispatcher18layerTreeDidChangeEv` | `eS6QfGn5eCY` | +| `_ZN9Inspector27LayerTreeFrontendDispatcherC1ERNS_14FrontendRouterE` | `ZI4mwckKD1s` | +| `_ZN9Inspector27LayerTreeFrontendDispatcherC2ERNS_14FrontendRouterE` | `7WjTCZdhnXE` | +| `_ZN9Inspector27LayerTreeFrontendDispatcherdaEPv` | `lMjUdn4xQqk` | +| `_ZN9Inspector27LayerTreeFrontendDispatcherdlEPv` | `ETSlSSaZxGw` | +| `_ZN9Inspector27LayerTreeFrontendDispatchernaEm` | `EyqqC2OwC9M` | +| `_ZN9Inspector27LayerTreeFrontendDispatchernaEmPv` | `QOQ5LTPxvK4` | +| `_ZN9Inspector27LayerTreeFrontendDispatchernwEm` | `Guk9aLNk+yE` | +| `_ZN9Inspector27LayerTreeFrontendDispatchernwEmPv` | `zmtI0YFu-VU` | +| `_ZN9Inspector27PerGlobalObjectWrapperWorld10addWrapperEPN3JSC14JSGlobalObjectEPNS1_8JSObjectE` | `GXnv8GxjAYw` | +| `_ZN9Inspector27PerGlobalObjectWrapperWorld10getWrapperEPN3JSC14JSGlobalObjectE` | `RVTSv7erUVw` | +| `_ZN9Inspector27PerGlobalObjectWrapperWorld16clearAllWrappersEv` | `aTRth+22E8I` | +| `_ZN9Inspector27PerGlobalObjectWrapperWorldC1ERKS0_` | `L-Fn-NcbXuk` | +| `_ZN9Inspector27PerGlobalObjectWrapperWorldC1Ev` | `bgd3ki6qpxU` | +| `_ZN9Inspector27PerGlobalObjectWrapperWorldC2ERKS0_` | `WN6O1SjvVRo` | +| `_ZN9Inspector27PerGlobalObjectWrapperWorldC2Ev` | `8rjATNfmywY` | +| `_ZN9Inspector27PerGlobalObjectWrapperWorldD1Ev` | `N4KQNE+qIp8` | +| `_ZN9Inspector27PerGlobalObjectWrapperWorldD2Ev` | `s4-olElR8+M` | +| `_ZN9Inspector27PerGlobalObjectWrapperWorldaSERKS0_` | `RE9ECIrD-9U` | +| `_ZN9Inspector28DOMDebuggerBackendDispatcher6createERNS_17BackendDispatcherEPNS_35DOMDebuggerBackendDispatcherHandlerE` | `sFGaQpsGDc4` | +| `_ZN9Inspector28DOMDebuggerBackendDispatcherC1ERNS_17BackendDispatcherEPNS_35DOMDebuggerBackendDispatcherHandlerE` | `n169H+q43G0` | +| `_ZN9Inspector28DOMDebuggerBackendDispatcherC2ERNS_17BackendDispatcherEPNS_35DOMDebuggerBackendDispatcherHandlerE` | `a-1bf8VqyHk` | +| `_ZN9Inspector28DOMDebuggerBackendDispatcherD1Ev` | `dA7DMksqQNo` | +| `_ZN9Inspector28DOMDebuggerBackendDispatcherD2Ev` | `pyTwHOBu94E` | +| `_ZN9Inspector28DOMStorageFrontendDispatcherC1ERNS_14FrontendRouterE` | `TUf9SbYk2cs` | +| `_ZN9Inspector28DOMStorageFrontendDispatcherC2ERNS_14FrontendRouterE` | `HMX8NtsKaC4` | +| `_ZN9Inspector28DOMStorageFrontendDispatcherdaEPv` | `zN1Nt4FdDG0` | +| `_ZN9Inspector28DOMStorageFrontendDispatcherdlEPv` | `nClGsf5G8Bs` | +| `_ZN9Inspector28DOMStorageFrontendDispatchernaEm` | `GgSXKx2xATk` | +| `_ZN9Inspector28DOMStorageFrontendDispatchernaEmPv` | `sBxCIRS9NKs` | +| `_ZN9Inspector28DOMStorageFrontendDispatchernwEm` | `5B+TSfX4cRc` | +| `_ZN9Inspector28DOMStorageFrontendDispatchernwEmPv` | `ZRga3V8LApU` | +| `_ZN9Inspector28HeapBackendDispatcherHandlerC2ERKS0_` | `IDYAnLE0+kM` | +| `_ZN9Inspector28HeapBackendDispatcherHandlerC2Ev` | `tai-HSaPBZU` | +| `_ZN9Inspector28HeapBackendDispatcherHandlerD0Ev` | `k4HfprWhc0Q` | +| `_ZN9Inspector28HeapBackendDispatcherHandlerD1Ev` | `LzcJ0RIItxI` | +| `_ZN9Inspector28HeapBackendDispatcherHandlerD2Ev` | `BLbG44GXk8c` | +| `_ZN9Inspector28InspectorScriptProfilerAgent16trackingCompleteEv` | `L7naR6ftYz4` | +| `_ZN9Inspector28InspectorScriptProfilerAgent17didEvaluateScriptEN3WTF7SecondsEN3JSC15ProfilingReasonE` | `2SiHIPaxvxw` | +| `_ZN9Inspector28InspectorScriptProfilerAgent18willEvaluateScriptEv` | `hgbtIqjf5jo` | +| `_ZN9Inspector28InspectorScriptProfilerAgent27didCreateFrontendAndBackendEPNS_14FrontendRouterEPNS_17BackendDispatcherE` | `SK-rxk8oEIU` | +| `_ZN9Inspector28InspectorScriptProfilerAgent29stopSamplingWhenDisconnectingEv` | `ifCCmQZ87f8` | +| `_ZN9Inspector28InspectorScriptProfilerAgent29willDestroyFrontendAndBackendENS_16DisconnectReasonE` | `VOI-2uhETB0` | +| `_ZN9Inspector28InspectorScriptProfilerAgent8addEventEN3WTF7SecondsES2_N3JSC15ProfilingReasonE` | `CCjsMjCwCWE` | +| `_ZN9Inspector28InspectorScriptProfilerAgentC1ERNS_12AgentContextE` | `x5RhYy0RLb4` | +| `_ZN9Inspector28InspectorScriptProfilerAgentC2ERNS_12AgentContextE` | `mKc-BBJE-C0` | +| `_ZN9Inspector28InspectorScriptProfilerAgentD0Ev` | `ikTNlkIaVhU` | +| `_ZN9Inspector28InspectorScriptProfilerAgentD1Ev` | `XAqBKPLfJnQ` | +| `_ZN9Inspector28InspectorScriptProfilerAgentdaEPv` | `HFxRr3-fCPc` | +| `_ZN9Inspector28InspectorScriptProfilerAgentdlEPv` | `ZAURFIgPZk8` | +| `_ZN9Inspector28InspectorScriptProfilerAgentnaEmPv` | `F0e60JHYx9M` | +| `_ZN9Inspector28InspectorScriptProfilerAgentnaEm` | `wQRrOOXbxlM` | +| `_ZN9Inspector28InspectorScriptProfilerAgentnwEm10NotNullTagPv` | `X26HnO3yPb8` | +| `_ZN9Inspector28InspectorScriptProfilerAgentnwEmPv` | `NV1hReHpVgo` | +| `_ZN9Inspector28InspectorScriptProfilerAgentnwEm` | `mOBKWn-eJc0` | +| `_ZN9Inspector28PageBackendDispatcherHandlerC2ERKS0_` | `Eh7uskcjFl4` | +| `_ZN9Inspector28PageBackendDispatcherHandlerC2Ev` | `xAE5zO3kEi0` | +| `_ZN9Inspector28PageBackendDispatcherHandlerD0Ev` | `AEnBqqmNJBA` | +| `_ZN9Inspector28PageBackendDispatcherHandlerD1Ev` | `P9vsWZVDqJ8` | +| `_ZN9Inspector28PageBackendDispatcherHandlerD2Ev` | `Yp89fv3xmKU` | +| `_ZN9Inspector29AuditBackendDispatcherHandlerC2ERKS0_` | `SZRzgfkPiGA` | +| `_ZN9Inspector29AuditBackendDispatcherHandlerC2Ev` | `4hsvw3h04JU` | +| `_ZN9Inspector29AuditBackendDispatcherHandlerD0Ev` | `m+Ju06sMg5k` | +| `_ZN9Inspector29AuditBackendDispatcherHandlerD1Ev` | `AUqKSgnOwRc` | +| `_ZN9Inspector29AuditBackendDispatcherHandlerD2Ev` | `3AWH2FaJfxE` | +| `_ZN9Inspector29SupplementalBackendDispatcherC2ERNS_17BackendDispatcherE` | `r2RAGCixu6c` | +| `_ZN9Inspector29SupplementalBackendDispatcherD0Ev` | `WmpYOowrcIE` | +| `_ZN9Inspector29SupplementalBackendDispatcherD1Ev` | `AjSWJSHcOIk` | +| `_ZN9Inspector29SupplementalBackendDispatcherD2Ev` | `YbwxxrfPW10` | +| `_ZN9Inspector30CanvasBackendDispatcherHandlerC2ERKS0_` | `60+np84nu94` | +| `_ZN9Inspector30CanvasBackendDispatcherHandlerC2Ev` | `eNLB1x1rwMk` | +| `_ZN9Inspector30CanvasBackendDispatcherHandlerD0Ev` | `Rcqpep1AOTM` | +| `_ZN9Inspector30CanvasBackendDispatcherHandlerD1Ev` | `hExkzfpmDKw` | +| `_ZN9Inspector30CanvasBackendDispatcherHandlerD2Ev` | `MWQQeS9F9Hg` | +| `_ZN9Inspector30TargetBackendDispatcherHandlerC2ERKS0_` | `9RYsSzqyNrM` | +| `_ZN9Inspector30TargetBackendDispatcherHandlerC2Ev` | `vfXUizQrSRo` | +| `_ZN9Inspector30TargetBackendDispatcherHandlerD0Ev` | `qjHCYVd2NH0` | +| `_ZN9Inspector30TargetBackendDispatcherHandlerD1Ev` | `jS5DA4y606Q` | +| `_ZN9Inspector30TargetBackendDispatcherHandlerD2Ev` | `2yAjfzUQhYU` | +| `_ZN9Inspector30WorkerBackendDispatcherHandlerC2ERKS0_` | `3fxY0RvS5h0` | +| `_ZN9Inspector30WorkerBackendDispatcherHandlerC2Ev` | `JZZchPyTk2k` | +| `_ZN9Inspector30WorkerBackendDispatcherHandlerD0Ev` | `MPv4gGj4a4I` | +| `_ZN9Inspector30WorkerBackendDispatcherHandlerD1Ev` | `l7Am6d7QKnE` | +| `_ZN9Inspector30WorkerBackendDispatcherHandlerD2Ev` | `1ktwPRAf19w` | +| `_ZN9Inspector31BrowserBackendDispatcherHandlerC2ERKS0_` | `Uj4E1Axicy4` | +| `_ZN9Inspector31BrowserBackendDispatcherHandlerC2Ev` | `bAc0bWqJiE0` | +| `_ZN9Inspector31BrowserBackendDispatcherHandlerD0Ev` | `w4tKwcFJp-c` | +| `_ZN9Inspector31BrowserBackendDispatcherHandlerD1Ev` | `gayqtDapH2w` | +| `_ZN9Inspector31BrowserBackendDispatcherHandlerD2Ev` | `RP9i-bN+790` | +| `_ZN9Inspector31ConsoleBackendDispatcherHandlerC2ERKS0_` | `F3ILcSPTa-c` | +| `_ZN9Inspector31ConsoleBackendDispatcherHandlerC2Ev` | `iBQ6lAQw5Hw` | +| `_ZN9Inspector31ConsoleBackendDispatcherHandlerD0Ev` | `cEcdsDQcKXU` | +| `_ZN9Inspector31ConsoleBackendDispatcherHandlerD1Ev` | `tPkqsYtozCE` | +| `_ZN9Inspector31ConsoleBackendDispatcherHandlerD2Ev` | `qPaL89nLj2M` | +| `_ZN9Inspector31NetworkBackendDispatcherHandler20LoadResourceCallback11sendSuccessERKN3WTF6StringES5_i` | `g3ladeyxtWk` | +| `_ZN9Inspector31NetworkBackendDispatcherHandler20LoadResourceCallbackD1Ev` | `6nkw2jvWJUY` | +| `_ZN9Inspector31NetworkBackendDispatcherHandlerC2ERKS0_` | `wFpxQmjDScM` | +| `_ZN9Inspector31NetworkBackendDispatcherHandlerC2Ev` | `zm2i2w7R9tU` | +| `_ZN9Inspector31NetworkBackendDispatcherHandlerD0Ev` | `6eATaUH-V4Q` | +| `_ZN9Inspector31NetworkBackendDispatcherHandlerD1Ev` | `cJkb9aUGrzA` | +| `_ZN9Inspector31NetworkBackendDispatcherHandlerD2Ev` | `WKLgUAHhFxs` | +| `_ZN9Inspector31RuntimeBackendDispatcherHandlerC2ERKS0_` | `ZVwY7ywc-0U` | +| `_ZN9Inspector31RuntimeBackendDispatcherHandlerC2Ev` | `fK+DFgxPnbY` | +| `_ZN9Inspector31RuntimeBackendDispatcherHandlerD0Ev` | `P01hbLcSwL8` | +| `_ZN9Inspector31RuntimeBackendDispatcherHandlerD1Ev` | `psL2NgHxoHk` | +| `_ZN9Inspector31RuntimeBackendDispatcherHandlerD2Ev` | `6rB5RFDqlLw` | +| `_ZN9Inspector31ScriptProfilerBackendDispatcher6createERNS_17BackendDispatcherEPNS_38ScriptProfilerBackendDispatcherHandlerE` | `pvAkZRnxwHg` | +| `_ZN9Inspector31ScriptProfilerBackendDispatcherC1ERNS_17BackendDispatcherEPNS_38ScriptProfilerBackendDispatcherHandlerE` | `3i2WgunIGIQ` | +| `_ZN9Inspector31ScriptProfilerBackendDispatcherC2ERNS_17BackendDispatcherEPNS_38ScriptProfilerBackendDispatcherHandlerE` | `HVKPCah7GPU` | +| `_ZN9Inspector31ScriptProfilerBackendDispatcherD0Ev` | `8fxZwyicsRQ` | +| `_ZN9Inspector31ScriptProfilerBackendDispatcherD1Ev` | `h84nIzPihdM` | +| `_ZN9Inspector31ScriptProfilerBackendDispatcherD2Ev` | `s53pj2RetQQ` | +| `_ZN9Inspector31createScriptCallStackForConsoleEPN3JSC14JSGlobalObjectEm` | `Cl2V3DEEHcs` | +| `_ZN9Inspector32DatabaseBackendDispatcherHandler18ExecuteSQLCallbackD1Ev` | `vlJgDNWp6EM` | +| `_ZN9Inspector32DatabaseBackendDispatcherHandler18ExecuteSQLCallbackD2Ev` | `UpfMQXD5L4M` | +| `_ZN9Inspector32DatabaseBackendDispatcherHandlerC2ERKS0_` | `B1a1QgRyfug` | +| `_ZN9Inspector32DatabaseBackendDispatcherHandlerC2Ev` | `PL2LcQggy9Q` | +| `_ZN9Inspector32DatabaseBackendDispatcherHandlerD0Ev` | `8XCozccg+jU` | +| `_ZN9Inspector32DatabaseBackendDispatcherHandlerD1Ev` | `5dj7CsbAu2w` | +| `_ZN9Inspector32DatabaseBackendDispatcherHandlerD2Ev` | `a7k0prJJpKA` | +| `_ZN9Inspector32DatabaseBackendDispatcherHandleraSERKS0_` | `md5zoSWseNM` | +| `_ZN9Inspector32DebuggerBackendDispatcherHandlerC2ERKS0_` | `JhsJWxsvkZg` | +| `_ZN9Inspector32DebuggerBackendDispatcherHandlerC2Ev` | `tGIL+vkTlJA` | +| `_ZN9Inspector32DebuggerBackendDispatcherHandlerD0Ev` | `TI5ES3rnuTI` | +| `_ZN9Inspector32DebuggerBackendDispatcherHandlerD1Ev` | `Ea6Vodkv13Q` | +| `_ZN9Inspector32ScriptProfilerFrontendDispatcher13trackingStartEd` | `wf6EuM9IZW0` | +| `_ZN9Inspector32ScriptProfilerFrontendDispatcherC1ERNS_14FrontendRouterE` | `lbC468bO8Xs` | +| `_ZN9Inspector32ScriptProfilerFrontendDispatcherC2ERNS_14FrontendRouterE` | `ui4s+3Sg6is` | +| `_ZN9Inspector32ScriptProfilerFrontendDispatcherdaEPv` | `wn316XLYBO8` | +| `_ZN9Inspector32ScriptProfilerFrontendDispatcherdlEPv` | `C-PgX-qZLhk` | +| `_ZN9Inspector32ScriptProfilerFrontendDispatchernaEmPv` | `eIWOmJNeKUs` | +| `_ZN9Inspector32ScriptProfilerFrontendDispatchernaEm` | `SyQOI661UwU` | +| `_ZN9Inspector32ScriptProfilerFrontendDispatchernwEmPv` | `lcKHRKrE2sY` | +| `_ZN9Inspector32ScriptProfilerFrontendDispatchernwEm` | `QviDmlafc6I` | +| `_ZN9Inspector32TimelineBackendDispatcherHandlerC2ERKS0_` | `kFw-B-SsQUM` | +| `_ZN9Inspector32TimelineBackendDispatcherHandlerD2Ev` | `WRfSxgIk43M` | +| `_ZN9Inspector33AnimationBackendDispatcherHandlerC2ERKS0_` | `ueohGT35aPU` | +| `_ZN9Inspector33AnimationBackendDispatcherHandlerC2Ev` | `Az0wDZ2JLeY` | +| `_ZN9Inspector33AnimationBackendDispatcherHandlerD0Ev` | `sHIZ2KSx1C4` | +| `_ZN9Inspector33AnimationBackendDispatcherHandlerD1Ev` | `fksEUwl6bJ8` | +| `_ZN9Inspector33AnimationBackendDispatcherHandlerD2Ev` | `8LVL407LqN8` | +| `_ZN9Inspector33ApplicationCacheBackendDispatcher6createERNS_17BackendDispatcherEPNS_40ApplicationCacheBackendDispatcherHandlerE` | `40j-usQaBwE` | +| `_ZN9Inspector33ApplicationCacheBackendDispatcherC1ERNS_17BackendDispatcherEPNS_40ApplicationCacheBackendDispatcherHandlerE` | `DS4MYWsBtZM` | +| `_ZN9Inspector33ApplicationCacheBackendDispatcherC2ERNS_17BackendDispatcherEPNS_40ApplicationCacheBackendDispatcherHandlerE` | `NDsGZA8ppAQ` | +| `_ZN9Inspector33ApplicationCacheBackendDispatcherD0Ev` | `IzIy0lJWD08` | +| `_ZN9Inspector33ApplicationCacheBackendDispatcherD1Ev` | `ttJy+1DbvDo` | +| `_ZN9Inspector33ApplicationCacheBackendDispatcherD2Ev` | `PvyFzyJLLgQ` | +| `_ZN9Inspector33InspectorBackendDispatcherHandlerC2ERKS0_` | `RSa71yEfRqU` | +| `_ZN9Inspector33InspectorBackendDispatcherHandlerC2Ev` | `psb-WHk17uM` | +| `_ZN9Inspector33InspectorBackendDispatcherHandlerD0Ev` | `REOBGOfo4WE` | +| `_ZN9Inspector33InspectorBackendDispatcherHandlerD1Ev` | `CBNZ5OjzUdo` | +| `_ZN9Inspector33InspectorBackendDispatcherHandlerD2Ev` | `Vt1kIfFn28M` | +| `_ZN9Inspector33LayerTreeBackendDispatcherHandlerC2ERKS0_` | `p+K1iHfbEbY` | +| `_ZN9Inspector33LayerTreeBackendDispatcherHandlerC2Ev` | `xnIArSSzecM` | +| `_ZN9Inspector33LayerTreeBackendDispatcherHandlerD0Ev` | `ClO-QNFpK2k` | +| `_ZN9Inspector33LayerTreeBackendDispatcherHandlerD1Ev` | `QOYZRDPTq94` | +| `_ZN9Inspector33LayerTreeBackendDispatcherHandlerD2Ev` | `PYfXsUMOaic` | +| `_ZN9Inspector34ApplicationCacheFrontendDispatcher19networkStateUpdatedEb` | `hMmahzTAYpo` | +| `_ZN9Inspector34ApplicationCacheFrontendDispatcher29applicationCacheStatusUpdatedERKN3WTF6StringES4_i` | `WuHl28C+7k0` | +| `_ZN9Inspector34ApplicationCacheFrontendDispatcherC1ERNS_14FrontendRouterE` | `kbFaB1rGobk` | +| `_ZN9Inspector34ApplicationCacheFrontendDispatcherC2ERNS_14FrontendRouterE` | `PZnzfneCpcI` | +| `_ZN9Inspector34ApplicationCacheFrontendDispatcherdaEPv` | `im5DNzT35to` | +| `_ZN9Inspector34ApplicationCacheFrontendDispatcherdlEPv` | `hoAwJetLmro` | +| `_ZN9Inspector34ApplicationCacheFrontendDispatchernaEmPv` | `eaUO-kQF49o` | +| `_ZN9Inspector34ApplicationCacheFrontendDispatchernaEm` | `zEdJ-HenBsU` | +| `_ZN9Inspector34ApplicationCacheFrontendDispatchernwEm` | `3ItcbZh5emo` | +| `_ZN9Inspector34ApplicationCacheFrontendDispatchernwEmPv` | `NnRO7tgv4Ok` | +| `_ZN9Inspector34DOMStorageBackendDispatcherHandlerC2ERKS0_` | `ti05wqo4hwA` | +| `_ZN9Inspector34DOMStorageBackendDispatcherHandlerC2Ev` | `8Y6RLatuTeM` | +| `_ZN9Inspector34DOMStorageBackendDispatcherHandlerD0Ev` | `kfT6hC5SF+g` | +| `_ZN9Inspector34DOMStorageBackendDispatcherHandlerD1Ev` | `8O9hi9-+3kE` | +| `_ZN9Inspector34DOMStorageBackendDispatcherHandlerD2Ev` | `JNUH68bpuxI` | +| `_ZN9Inspector34createScriptCallStackFromExceptionEPN3JSC14JSGlobalObjectEPNS0_9ExceptionEm` | `ynJ1rTAPsZU` | +| `_ZN9Inspector35DOMDebuggerBackendDispatcherHandlerC2ERKS0_` | `NlMX-au+A9M` | +| `_ZN9Inspector35DOMDebuggerBackendDispatcherHandlerC2Ev` | `54Tc57Y9FUA` | +| `_ZN9Inspector35DOMDebuggerBackendDispatcherHandlerD0Ev` | `VF5HDDm3ZMk` | +| `_ZN9Inspector35DOMDebuggerBackendDispatcherHandlerD1Ev` | `eV5igYrwsy0` | +| `_ZN9Inspector35DOMDebuggerBackendDispatcherHandlerD2Ev` | `jcwLN-bFEMA` | +| `_ZN9Inspector38ScriptProfilerBackendDispatcherHandlerC2ERKS0_` | `HK0XarL0FJ0` | +| `_ZN9Inspector38ScriptProfilerBackendDispatcherHandlerC2Ev` | `4dhx-ioq00U` | +| `_ZN9Inspector38ScriptProfilerBackendDispatcherHandlerD0Ev` | `yaBlj3xh9TA` | +| `_ZN9Inspector38ScriptProfilerBackendDispatcherHandlerD1Ev` | `A+sAjT9zHM8` | +| `_ZN9Inspector38ScriptProfilerBackendDispatcherHandlerD2Ev` | `pQktOxWPJUs` | +| `_ZN9Inspector40ApplicationCacheBackendDispatcherHandlerC2ERKS0_` | `jHgwTMWTHPc` | +| `_ZN9Inspector40ApplicationCacheBackendDispatcherHandlerC2Ev` | `YUU0Q9XyjqE` | +| `_ZN9Inspector40ApplicationCacheBackendDispatcherHandlerD0Ev` | `pbs5-GMRRKY` | +| `_ZN9Inspector40ApplicationCacheBackendDispatcherHandlerD1Ev` | `b2xdRCXjUlk` | +| `_ZN9Inspector40ApplicationCacheBackendDispatcherHandlerD2Ev` | `LVjM0Tcnov0` | +| `_ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime12EntryPreviewEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE` | `SHKtkCDxH6c` | +| `_ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime12RemoteObject4TypeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE` | `kY+dD6kxIkY` | +| `_ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime12RemoteObject7SubtypeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE` | `XWyKAz4u0EU` | +| `_ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime12RemoteObjectEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE` | `a9quSKletss` | +| `_ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime13ObjectPreview4TypeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE` | `mTcMd-2kivA` | +| `_ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime13ObjectPreview7SubtypeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE` | `SFzo39L-Hgo` | +| `_ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime13ObjectPreviewEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE` | `mtEs2TQIWSo` | +| `_ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime15CollectionEntryEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE` | `k-+aF1Coi9E` | +| `_ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime15PropertyPreview4TypeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE` | `VIk8LuJJOU0` | +| `_ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime15PropertyPreview7SubtypeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE` | `4yC41GMuUq8` | +| `_ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime15PropertyPreviewEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE` | `BsnnhuudXLE` | +| `_ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime18PropertyDescriptorEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE` | `ZVoZm66RCz8` | +| `_ZN9Inspector8Protocol13BindingTraitsINS0_7Runtime26InternalPropertyDescriptorEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE` | `6LjLZQePY74` | +| `_ZN9Inspector8Protocol13BindingTraitsINS0_8Debugger15FunctionDetailsEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE` | `GOo1xl+bTjQ` | +| `_ZN9Inspector8Protocol13BindingTraitsINS0_8Debugger5Scope4TypeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE` | `bAjTIXtsWIY` | +| `_ZN9Inspector8Protocol13BindingTraitsINS0_8Debugger5ScopeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE` | `I84EUs864es` | +| `_ZN9Inspector8Protocol13BindingTraitsINS0_8Debugger8LocationEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE` | `PBc4LFKaGVw` | +| `_ZN9Inspector8Protocol13BindingTraitsINS0_8Debugger9CallFrameEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE` | `87mnHfWxrbQ` | +| `_ZN9Inspector8Protocol13BindingTraitsINS0_8Timeline9EventTypeEE26assertValueHasExpectedTypeEPN3WTF8JSONImpl5ValueE` | `8aN1sGR1vfg` | +| `_ZNK14OpaqueJSString6stringEv` | `7Xdw2-E1v4c` | +| `_ZNK3JSC10CodeOrigin4dumpERN3WTF11PrintStreamE` | `63bmb0nlVdw` | +| `_ZNK3JSC10JSFunction10sourceCodeEv` | `hfoBPdMDBhg` | +| `_ZNK3JSC10JSFunction23isHostFunctionNonInlineEv` | `O5OcbI7EiiQ` | +| `_ZNK3JSC11ArrayBuffer5sliceEd` | `9giznW5Belc` | +| `_ZNK3JSC11ArrayBuffer5sliceEdd` | `RQ0CG53TYao` | +| `_ZNK3JSC12JSRopeString11resolveRopeEPNS_14JSGlobalObjectE` | `2QJx9Y8S7EI` | +| `_ZNK3JSC12JSRopeString23resolveRopeToAtomStringEPNS_14JSGlobalObjectE` | `1YgG-kRZn1Q` | +| `_ZNK3JSC12JSRopeString31resolveRopeToExistingAtomStringEPNS_14JSGlobalObjectE` | `TA33hG8chaM` | +| `_ZNK3JSC12PropertySlot14functionGetterEPNS_14JSGlobalObjectE` | `PSZR9gFmrHQ` | +| `_ZNK3JSC12StackVisitor5Frame12functionNameEv` | `ucKj65n4dCM` | +| `_ZNK3JSC12StackVisitor5Frame20computeLineAndColumnERjS2_` | `xJZvN8ywcko` | +| `_ZNK3JSC12StackVisitor5Frame8toStringEv` | `bUNIGb3Qom4` | +| `_ZNK3JSC12StackVisitor5Frame9sourceURLEv` | `QCqEjslTj40` | +| `_ZNK3JSC13JSArrayBuffer8isSharedEv` | `hRBnfwBJIq4` | +| `_ZNK3JSC13RuntimeMethod6methodEv` | `28MHn3Mx6wE` | +| `_ZNK3JSC14CachedBytecode13commitUpdatesERKN3WTF8FunctionIFvlPKvmEEE` | `k7Ho8t5zisU` | +| `_ZNK3JSC14CellAttributes4dumpERN3WTF11PrintStreamE` | `X4pGci2dAvc` | +| `_ZNK3JSC14FullCodeOrigin4dumpERN3WTF11PrintStreamE` | `KrVSgCx9Fos` | +| `_ZNK3JSC14ProtoCallFrame13argumentCountEv` | `mH0s73L5x28` | +| `_ZNK3JSC14ProtoCallFrame26argumentCountIncludingThisEv` | `cMtsMmic4fQ` | +| `_ZNK3JSC14ProtoCallFrame6calleeEv` | `k-NDOMP7m2M` | +| `_ZNK3JSC14ProtoCallFrame9thisValueEv` | `Th7C+5G0ycQ` | +| `_ZNK3JSC16ScriptExecutable8lastLineEv` | `OzE-5G8NTN8` | +| `_ZNK3JSC16ScriptExecutable9endColumnEv` | `68VnGYcPyAc` | +| `_ZNK3JSC17DebuggerCallFrame8positionEv` | `cIhoIkS4McU` | +| `_ZNK3JSC17DebuggerCallFrame8sourceIDEv` | `bzEEfsZZIug` | +| `_ZNK3JSC17DebuggerCallFrame9thisValueERNS_2VME` | `avNGvstpJLs` | +| `_ZNK3JSC18BasicBlockLocation8dumpDataEv` | `SW1xFycyC90` | +| `_ZNK3JSC18BytecodeCacheError7isValidEv` | `uBoKXflFvyo` | +| `_ZNK3JSC18BytecodeCacheError7messageEv` | `tzLyXXPWt64` | +| `_ZNK3JSC18GCActivityCallback9isEnabledEv` | `CAOt1d2AT44` | +| `_ZNK3JSC18PropertyDescriptor10enumerableEv` | `8VxnZ-Os8hU` | +| `_ZNK3JSC18PropertyDescriptor16isDataDescriptorEv` | `TO6C8Mw-kjo` | +| `_ZNK3JSC18PropertyDescriptor20isAccessorDescriptorEv` | `JlMrGMLBCAA` | +| `_ZNK3JSC18PropertyDescriptor6getterEv` | `aQJnG7oMhNU` | +| `_ZNK3JSC18PropertyDescriptor8writableEv` | `cStwmF0rgi8` | +| `_ZNK3JSC19CacheableIdentifier4dumpERN3WTF11PrintStreamE` | `BER1Mhcfk28` | +| `_ZNK3JSC19ControlFlowProfiler8dumpDataEv` | `KrAUJMghj1A` | +| `_ZNK3JSC19HeapSnapshotBuilder18descriptionForCellEPNS_6JSCellE` | `nRR4MuQjSqY` | +| `_ZNK3JSC22FullGCActivityCallback13didGCRecentlyEv` | `fuwxa+XM0rQ` | +| `_ZNK3JSC23VariableWriteFireDetail4dumpERN3WTF11PrintStreamE` | `VpBDJNUL7Gw` | +| `_ZNK3JSC2VM29deprecatedVMEntryGlobalObjectEPNS_14JSGlobalObjectE` | `GCwNfdTwjtA` | +| `_ZNK3JSC4Yarr17RegularExpression13matchedLengthEv` | `TWnxOQaUhBI` | +| `_ZNK3JSC6DOMJIT9HeapRange4dumpERN3WTF11PrintStreamE` | `ti74yN+Sg8o` | +| `_ZNK3JSC6JSCell11toPrimitiveEPNS_14JSGlobalObjectENS_22PreferredPrimitiveTypeE` | `31bPq9RXAls` | +| `_ZNK3JSC6JSCell12toObjectSlowEPNS_14JSGlobalObjectE` | `pPVQ8STok8k` | +| `_ZNK3JSC6JSCell8toNumberEPNS_14JSGlobalObjectE` | `e7kDPzD5e8g` | +| `_ZNK3JSC6JSCell9getStringEPNS_14JSGlobalObjectE` | `DhyTyaZbGfQ` | +| `_ZNK3JSC6JSCell9getStringEPNS_14JSGlobalObjectERN3WTF6StringE` | `yapg7kJD7IY` | +| `_ZNK3JSC7ArgList8getSliceEiRS0_` | `fOiH3XmYUI0` | +| `_ZNK3JSC7JSValue16toNumberSlowCaseEPNS_14JSGlobalObjectE` | `D6W4pe7Eyzo` | +| `_ZNK3JSC7JSValue16toObjectSlowCaseEPNS_14JSGlobalObjectE` | `snrg9ysE6-k` | +| `_ZNK3JSC7JSValue16toStringSlowCaseEPNS_14JSGlobalObjectEb` | `6XP+Lw1Nby0` | +| `_ZNK3JSC7JSValue19synthesizePrototypeEPNS_14JSGlobalObjectE` | `rfNM54bi+fc` | +| `_ZNK3JSC7JSValue19toWTFStringSlowCaseEPNS_14JSGlobalObjectE` | `P7Ibge-VoSQ` | +| `_ZNK3JSC7JSValue20toIntegerPreserveNaNEPNS_14JSGlobalObjectE` | `AtnrY+b9Rcg` | +| `_ZNK3JSC7JSValue4dumpERN3WTF11PrintStreamE` | `LqcMfJHJHzk` | +| `_ZNK3JSC8Bindings10RootObject12globalObjectEv` | `toA08wQSTX8` | +| `_ZNK3JSC8Bindings13RuntimeObject19getInternalInstanceEv` | `8Ke58pr-Nn0` | +| `_ZNK3JSC8FreeList4dumpERN3WTF11PrintStreamE` | `w-pn1iTYQo0` | +| `_ZNK3JSC8JSObject11hasPropertyEPNS_14JSGlobalObjectENS_12PropertyNameE` | `TcazRMchOFs` | +| `_ZNK3JSC8JSObject11hasPropertyEPNS_14JSGlobalObjectEj` | `vdTyx2A8pMc` | +| `_ZNK3JSC8JSObject11toPrimitiveEPNS_14JSGlobalObjectENS_22PreferredPrimitiveTypeE` | `POMFOJXVHwU` | +| `_ZNK3JSC8JSObject8toNumberEPNS_14JSGlobalObjectE` | `aTLvyNkK6mA` | +| `_ZNK3JSC8JSObject8toStringEPNS_14JSGlobalObjectE` | `HB27YbLPkU4` | +| `_ZNK3JSC8JSString13equalSlowCaseEPNS_14JSGlobalObjectEPS0_` | `ShYbbZFPrdU` | +| `_ZNK3JSC8Profiler8Database4saveEPKc` | `W-ACkskGXtw` | +| `_ZNK3JSC9CallFrame10codeOriginEv` | `8W5b+PNZYwI` | +| `_ZNK3JSC9CallFrame11callerFrameERPNS_10EntryFrameE` | `FQf7z9EVOYQ` | +| `_ZNK3JSC9ClassInfo4dumpERN3WTF11PrintStreamE` | `L9Hmp6AYcQU` | +| `_ZNK3JSC9CodeBlock26reoptimizationRetryCounterEv` | `8qygzLD+JkI` | +| `_ZNK3JSC9CodeBlock4dumpERN3WTF11PrintStreamE` | `4f4k1BywICY` | +| `_ZNK3JSC9JSPromise6resultERNS_2VME` | `Ctz7dKz3Da0` | +| `_ZNK3JSC9JSPromise6statusERNS_2VME` | `u9H28omaVEc` | +| `_ZNK3JSC9JSPromise9isHandledERNS_2VME` | `NgxfVG1k2Vg` | +| `_ZNK3WTF10AtomString23convertToASCIILowercaseEv` | `MUpSmygnJSM` | +| `_ZNK3WTF10AtomString23convertToASCIIUppercaseEv` | `uXJeEurJF8c` | +| `_ZNK3WTF10StringView16GraphemeClusters8IteratordeEv` | `gStShPRXKPk` | +| `_ZNK3WTF10StringView16GraphemeClusters8IteratoreqERKS2_` | `DYcMsG69kBo` | +| `_ZNK3WTF11Persistence7Decoder28bufferIsLargeEnoughToContainEm` | `OuoVW-SJiZQ` | +| `_ZNK3WTF12ASCIILiteral4dumpERNS_11PrintStreamE` | `IdIO1h6EW3I` | +| `_ZNK3WTF13MonotonicTime4dumpERNS_11PrintStreamE` | `K-UfI+QGiEU` | +| `_ZNK3WTF13StringBuilder11reifyStringEv` | `DmOJ1MfHFrw` | +| `_ZNK3WTF14MediaTimeRange12toJSONStringEv` | `mz868SDp4PI` | +| `_ZNK3WTF15AutomaticThread19hasUnderlyingThreadERKNS_14AbstractLockerE` | `U7n0UvpCFFw` | +| `_ZNK3WTF15AutomaticThread4nameEv` | `r8Md8WuqsoA` | +| `_ZNK3WTF17double_conversion23DoubleToStringConverter13ToExponentialEdiPNS0_13StringBuilderE` | `9qxUiFlS1A4` | +| `_ZNK3WTF19MetaAllocatorHandle4dumpERNS_11PrintStreamE` | `BPh+itev3WQ` | +| `_ZNK3WTF24TimeWithDynamicClockType4dumpERNS_11PrintStreamE` | `Ea+86Wd8S-g` | +| `_ZNK3WTF3URL11hostAndPortEv` | `RZHqKvX5z+E` | +| `_ZNK3WTF3URL14fileSystemPathEv` | `lOFTLo+dG3Y` | +| `_ZNK3WTF3URL16isMatchingDomainENS_10StringViewE` | `Ub4JvxZ0KE4` | +| `_ZNK3WTF3URL17lastPathComponentEv` | `ElXcYHtYqtE` | +| `_ZNK3WTF3URL19protocolHostAndPortEv` | `q8fEMeIqd5w` | +| `_ZNK3WTF3URL21truncatedForUseAsBaseEv` | `uekVJTVqBGc` | +| `_ZNK3WTF3URL24strippedForUseAsReferrerEv` | `CyN41AniueA` | +| `_ZNK3WTF3URL30stringCenterEllipsizedToLengthEj` | `JRPrmfTHt08` | +| `_ZNK3WTF3URL4dumpERNS_11PrintStreamE` | `ITwB6pPwmRc` | +| `_ZNK3WTF3URL4userEv` | `ETN4mn+-5l0` | +| `_ZNK3WTF3URL8passwordEv` | `aCtpeXWclTE` | +| `_ZNK3WTF6Logger17LogSiteIdentifier8toStringEv` | `kkWkqBuJiDU` | +| `_ZNK3WTF6String18simplifyWhiteSpaceEPFbDsE` | `xuaSjMP7VYc` | +| `_ZNK3WTF6String25splitAllowingEmptyEntriesEDs` | `nDlY546YL3E` | +| `_ZNK3WTF6String28convertToLowercaseWithLocaleERKNS_10AtomStringE` | `oxQpdsUY-cg` | +| `_ZNK3WTF6String28convertToUppercaseWithLocaleERKNS_10AtomStringE` | `7IN+T9v1oAg` | +| `_ZNK3WTF6String29charactersWithNullTerminationEv` | `TTlQMk6YTRM` | +| `_ZNK3WTF6String31convertToLowercaseWithoutLocaleEv` | `vQwAX-xV-Dg` | +| `_ZNK3WTF6String31convertToUppercaseWithoutLocaleEv` | `xZYXhT-qMno` | +| `_ZNK3WTF6String57convertToLowercaseWithoutLocaleStartingAtFailingIndex8BitEj` | `XStmVdN3R7Y` | +| `_ZNK3WTF6String5splitEDs` | `ku8lWRpthiU` | +| `_ZNK3WTF6String7toFloatEPb` | `BbKt5wzlOsU` | +| `_ZNK3WTF6String8foldCaseEv` | `dXm2FJEv86k` | +| `_ZNK3WTF6String8toDoubleEPb` | `NwMHWqfNEmg` | +| `_ZNK3WTF6Thread4dumpERNS_11PrintStreamE` | `IEIydcJjkbo` | +| `_ZNK3WTF7RunLoop9TimerBase16secondsUntilFireEv` | `9ym46rnYKZA` | +| `_ZNK3WTF7RunLoop9TimerBase8isActiveEv` | `uh7RQK-+n20` | +| `_ZNK3WTF7Seconds4dumpERNS_11PrintStreamE` | `hrTPOtnC7Mw` | +| `_ZNK3WTF8Collator11collateUTF8EPKcS2_` | `Ds3V4AkI+J4` | +| `_ZNK3WTF8Collator7collateENS_10StringViewES1_` | `g46lcz7ehyY` | +| `_ZNK3WTF8JSONImpl10ObjectBase10memoryCostEv` | `MnJYzxTchUY` | +| `_ZNK3WTF8JSONImpl10ObjectBase9getStringERKNS_6StringERS2_` | `uoSZQi-ImGo` | +| `_ZNK3WTF8JSONImpl5Value10memoryCostEv` | `3A0IOfgA2K4` | +| `_ZNK3WTF8JSONImpl5Value12toJSONStringEv` | `H9Atnn27DDQ` | +| `_ZNK3WTF8JSONImpl5Value4typeEv` | `O45k4G7xU28` | +| `_ZNK3WTF8JSONImpl5Value6isNullEv` | `lNMaLXFQN9w` | +| `_ZNK3WTF8JSONImpl5Value8asDoubleERd` | `UQ5xmSJIDds` | +| `_ZNK3WTF8JSONImpl5Value9asIntegerERi` | `CORMWSC+MDc` | +| `_ZNK3WTF8JSONImpl5Value9writeJSONERNS_13StringBuilderE` | `i2H+zidMP3Y` | +| `_ZNK3WTF8JSONImpl9ArrayBase10memoryCostEv` | `pra1acTrS9Y` | +| `_ZNK3WTF8JSONImpl9ArrayBase3getEm` | `hQxOExuMeQQ` | +| `_ZNK3WTF8JSONImpl9ArrayBase5beginEv` | `vDSseQ4HPRc` | +| `_ZNK3WTF8JSONImpl9ArrayBase9writeJSONERNS_13StringBuilderE` | `T8fOjmwNgOI` | +| `_ZNK3WTF8WallTime4dumpERNS_11PrintStreamE` | `BXpm0S4olVo` | +| `_ZNK3WTF9BitVector11isEmptySlowEv` | `aPI3JqrIPEw` | +| `_ZNK3WTF9BitVector12bitCountSlowEv` | `IzXg6-zWJ5E` | +| `_ZNK3WTF9BitVector12hashSlowCaseEv` | `zB-63450NPk` | +| `_ZNK3WTF9BitVector14equalsSlowCaseERKS0_` | `CaW5gixDGFw` | +| `_ZNK3WTF9BitVector4dumpERNS_11PrintStreamE` | `o2Z-He35x8w` | +| `_ZNK3WTF9MediaTime11toTimeScaleEjNS0_13RoundingFlagsE` | `lnhZ1Sjisfo` | +| `_ZNK3WTF9MediaTime12isIndefiniteEv` | `YPSbsFsVzUs` | +| `_ZNK3WTF9MediaTime12toJSONObjectEv` | `E75NKjfPoEg` | +| `_ZNK3WTF9MediaTime12toJSONStringEv` | `D-8cZ6N7n4g` | +| `_ZNK3WTF9MediaTime14hasBeenRoundedEv` | `y6Kl6Jt1Moo` | +| `_ZNK3WTF9MediaTime14hasDoubleValueEv` | `HV3hA9XLITE` | +| `_ZNK3WTF9MediaTime18isNegativeInfiniteEv` | `HYL2II2G4fQ` | +| `_ZNK3WTF9MediaTime18isPositiveInfiniteEv` | `3hDjShMJO7U` | +| `_ZNK3WTF9MediaTime4dumpERNS_11PrintStreamE` | `tbWxzNR07RQ` | +| `_ZNK3WTF9MediaTime7compareERKS0_` | `qhXb7tPYUZ8` | +| `_ZNK3WTF9MediaTime7isValidEv` | `O7WlaO97OAs` | +| `_ZNK3WTF9MediaTime7toFloatEv` | `WME1vtuIAzc` | +| `_ZNK3WTF9MediaTime8toDoubleEv` | `ZePDOvkI13A` | +| `_ZNK3WTF9MediaTime8toStringEv` | `GraLckR1SPU` | +| `_ZNK3WTF9MediaTime9isBetweenERKS0_S2_` | `mX7jg1kvaNI` | +| `_ZNK3WTF9MediaTime9isInvalidEv` | `5KG2sHpzEmo` | +| `_ZNK3WTF9MediaTime9timeFlagsEv` | `UWKzMNYXxKs` | +| `_ZNK3WTF9MediaTime9timeScaleEv` | `oBvkeL9i7eo` | +| `_ZNK3WTF9MediaTime9timeValueEv` | `vsT-G8rVr3U` | +| `_ZNK3WTF9MediaTimecvbEv` | `F0Mf2UJ06v8` | +| `_ZNK3WTF9MediaTimeeqERKS0_` | `w5uuoBZXSpY` | +| `_ZNK3WTF9MediaTimegeERKS0_` | `gq5T-bvtQMQ` | +| `_ZNK3WTF9MediaTimegtERKS0_` | `yGyMlXr7b94` | +| `_ZNK3WTF9MediaTimeleERKS0_` | `yN9P84N3C9k` | +| `_ZNK3WTF9MediaTimeltERKS0_` | `dW6FDk7b4KY` | +| `_ZNK3WTF9MediaTimemiERKS0_` | `mC8pNZYmjEQ` | +| `_ZNK3WTF9MediaTimemlEi` | `WQHqbbvC9O4` | +| `_ZNK3WTF9MediaTimengEv` | `cJR8BP83cZk` | +| `_ZNK3WTF9MediaTimentEv` | `82yg+EfjqV4` | +| `_ZNK3WTF9MediaTimeplERKS0_` | `KliQ-mvV3Y0` | +| `_ZNK7WebCore10FileHandlecvbEv` | `1WM6fw+AXm0` | +| `_ZNK7WebCore10FontRanges16fontForCharacterEi` | `a9NTPM3fgrs` | +| `_ZNK7WebCore10FontRanges17fontForFirstRangeEv` | `J4q5kQaotFE` | +| `_ZNK7WebCore10FontRanges21glyphDataForCharacterEiNS_30ExternalResourceDownloadPolicyE` | `wFLNa9nYSIU` | +| `_ZNK7WebCore10JSDocument7wrappedEv` | `v5la07-B+AE` | +| `_ZNK7WebCore10MouseEvent11fromElementEv` | `-5xLBHcLnNk` | +| `_ZNK7WebCore10MouseEvent9toElementEv` | `wH4XZCjtfW0` | +| `_ZNK7WebCore10PluginData16supportsMimeTypeERKN3WTF6StringENS0_18AllowedPluginTypesE` | `E27wOOhC3n0` | +| `_ZNK7WebCore10PluginData17webVisiblePluginsEv` | `2yVUJa-WJtg` | +| `_ZNK7WebCore10PluginData19webVisibleMimeTypesEv` | `iPbWXfJjz50` | +| `_ZNK7WebCore10PluginData26supportsWebVisibleMimeTypeERKN3WTF6StringENS0_18AllowedPluginTypesE` | `o429xYSQUUg` | +| `_ZNK7WebCore10PluginData32supportsWebVisibleMimeTypeForURLERKN3WTF6StringENS0_18AllowedPluginTypesERKNS1_3URLE` | `0X3a7GqVYZ4` | +| `_ZNK7WebCore10RenderText16firstRunLocationEv` | `Qxf9w6r2Lkg` | +| `_ZNK7WebCore10RenderText16linesBoundingBoxEv` | `oCDj+HBOEGU` | +| `_ZNK7WebCore10RenderText8textNodeEv` | `tZoBhu3Y-qY` | +| `_ZNK7WebCore10RenderView12documentRectEv` | `1PiWxLaHTps` | +| `_ZNK7WebCore10RenderView15usesCompositingEv` | `lhzUScLJE8g` | +| `_ZNK7WebCore10RenderView20unscaledDocumentRectEv` | `dDE-YNkxwCU` | +| `_ZNK7WebCore10ScrollView10layoutSizeEv` | `mKnkHtudXvM` | +| `_ZNK7WebCore10ScrollView12contentsSizeEv` | `jG3ibzr-KtA` | +| `_ZNK7WebCore10ScrollView14scrollbarModesERNS_13ScrollbarModeES2_` | `B7gQbkr+FVU` | +| `_ZNK7WebCore10ScrollView14useFixedLayoutEv` | `Ev4YVLUDVe0` | +| `_ZNK7WebCore10ScrollView15fixedLayoutSizeEv` | `QZdY0rHz0n0` | +| `_ZNK7WebCore10ScrollView16contentsToScreenERKNS_7IntRectE` | `b2FAINuffyQ` | +| `_ZNK7WebCore10ScrollView16contentsToWindowERKNS_7IntRectE` | `o0y3LLtKpG0` | +| `_ZNK7WebCore10ScrollView16contentsToWindowERKNS_8IntPointE` | `9uOxriAeVYg` | +| `_ZNK7WebCore10ScrollView16windowToContentsERKNS_7IntRectE` | `AawjM-DVEyQ` | +| `_ZNK7WebCore10ScrollView16windowToContentsERKNS_8IntPointE` | `8b1MlBzgg9c` | +| `_ZNK7WebCore10ScrollView18contentsToRootViewERKNS_10FloatPointE` | `GlcXYq3EsV0` | +| `_ZNK7WebCore10ScrollView18contentsToRootViewERKNS_7IntRectE` | `2ZA13DYhKPQ` | +| `_ZNK7WebCore10ScrollView18contentsToRootViewERKNS_8IntPointE` | `7KB0OLPbezI` | +| `_ZNK7WebCore10ScrollView18contentsToRootViewERKNS_9FloatRectE` | `jn2YAk8JdPU` | +| `_ZNK7WebCore10ScrollView18exposedContentRectEv` | `GOkU1fV7sBM` | +| `_ZNK7WebCore10ScrollView18rootViewToContentsERKNS_10FloatPointE` | `ng+3+brMOpE` | +| `_ZNK7WebCore10ScrollView18rootViewToContentsERKNS_7IntRectE` | `mGxK+mqJW+4` | +| `_ZNK7WebCore10ScrollView18rootViewToContentsERKNS_8IntPointE` | `nTt6qZfEXh8` | +| `_ZNK7WebCore10ScrollView18rootViewToContentsERKNS_9FloatRectE` | `tPmBneGv-8Y` | +| `_ZNK7WebCore10ScrollView21unobscuredContentRectENS_14ScrollableArea36VisibleContentRectIncludesScrollbarsE` | `IDzHMvOZsdo` | +| `_ZNK7WebCore10ScrollView21unobscuredContentSizeEv` | `+wHXWfgVJ8k` | +| `_ZNK7WebCore10ScrollView22contentsScrollPositionEv` | `HJK-E0zrL9Y` | +| `_ZNK7WebCore10ScrollView23rootViewToTotalContentsERKNS_8IntPointE` | `fdH810n2Y-I` | +| `_ZNK7WebCore10ScrollView29unobscuredContentRectInternalENS_14ScrollableArea36VisibleContentRectIncludesScrollbarsE` | `8yBHRDWbIGs` | +| `_ZNK7WebCore10ScrollView42documentScrollPositionRelativeToViewOriginEv` | `Pft+NpFz9z4` | +| `_ZNK7WebCore10StorageMap6lengthEv` | `R78-0PPJcBk` | +| `_ZNK7WebCore10StorageMap7getItemERKN3WTF6StringE` | `HYz9i0PIHWs` | +| `_ZNK7WebCore10StorageMap8containsERKN3WTF6StringE` | `2PVKr6w9AM4` | +| `_ZNK7WebCore10TimeRanges3endEj` | `WRBCEhbuHHQ` | +| `_ZNK7WebCore10TimeRanges4copyEv` | `dBR94+JFRc0` | +| `_ZNK7WebCore10TimeRanges5startEj` | `HaphP42WhtQ` | +| `_ZNK7WebCore10TimeRanges6lengthEv` | `VWW3af5-a08` | +| `_ZNK7WebCore10TimeRanges7nearestEd` | `FRiELCz5i8Y` | +| `_ZNK7WebCore11BitmapImage21decodeCountForTestingEv` | `ZF9k6RbNZoY` | +| `_ZNK7WebCore11CSSPageRule12selectorTextEv` | `NYD1q3qp-FM` | +| `_ZNK7WebCore11CachedImage20imageSizeForRendererEPKNS_13RenderElementENS0_8SizeTypeE` | `jO7CDRdzrq0` | +| `_ZNK7WebCore11ContentType13containerTypeEv` | `q7I0E-KhAOI` | +| `_ZNK7WebCore11ContentType9parameterERKN3WTF6StringE` | `CMMNfYf0nGw` | +| `_ZNK7WebCore11EventRegioneqERKS0_` | `VlNJHzNQNFU` | +| `_ZNK7WebCore11FontCascadeeqERKS0_` | `Zk8idfXrCP0` | +| `_ZNK7WebCore11FontChanges18createEditingStyleEv` | `iJmD+-6YH9U` | +| `_ZNK7WebCore11FrameLoader10isCompleteEv` | `P2sq9TH-fEA` | +| `_ZNK7WebCore11FrameLoader14cancelledErrorERKNS_15ResourceRequestE` | `dshFTGH2COc` | +| `_ZNK7WebCore11FrameLoader14frameHasLoadedEv` | `gGVdICktIww` | +| `_ZNK7WebCore11FrameLoader16outgoingReferrerEv` | `zccRzonVGec` | +| `_ZNK7WebCore11FrameLoader17networkingContextEv` | `VdpqcDG0YtU` | +| `_ZNK7WebCore11FrameLoader20activeDocumentLoaderEv` | `qv3QDQALDk0` | +| `_ZNK7WebCore11FrameLoader27numPendingOrLoadingRequestsEb` | `jGd4b-rP2zk` | +| `_ZNK7WebCore11FrameLoader28blockedByContentBlockerErrorERKNS_15ResourceRequestE` | `BlFY-yUwqKA` | +| `_ZNK7WebCore11FrameLoader7frameIDEv` | `fB20kfX+6s0` | +| `_ZNK7WebCore11FrameLoader8loadTypeEv` | `BbLWFSkBPRk` | +| `_ZNK7WebCore11HTMLElement10spellcheckEv` | `9P1D1NwRok0` | +| `_ZNK7WebCore11HTMLElement15contentEditableEv` | `Sm6n-8gnA5A` | +| `_ZNK7WebCore11HTMLElement18canonicalInputModeEv` | `c-gPnt4LSyg` | +| `_ZNK7WebCore11HTMLElement21canonicalEnterKeyHintEv` | `D4mQ1WnfVCk` | +| `_ZNK7WebCore11HTMLElement3dirEv` | `r5uv3mpXnXg` | +| `_ZNK7WebCore11HTMLElement5titleEv` | `6ocqaJ6b3sM` | +| `_ZNK7WebCore11HTMLElement9translateEv` | `6pOSfbf0n2s` | +| `_ZNK7WebCore11HistoryItem11hasChildrenEv` | `KGhYQqdb2l4` | +| `_ZNK7WebCore11HistoryItem11originalURLEv` | `Eb7c1T8MuSo` | +| `_ZNK7WebCore11HistoryItem12isTargetItemEv` | `CDxz+odUzjk` | +| `_ZNK7WebCore11HistoryItem13documentStateEv` | `-Yk4NyVHTMs` | +| `_ZNK7WebCore11HistoryItem14alternateTitleEv` | `Q5NwWWuerbQ` | +| `_ZNK7WebCore11HistoryItem14scrollPositionEv` | `elW8cmDqX+w` | +| `_ZNK7WebCore11HistoryItem15formContentTypeEv` | `63SzfoRv414` | +| `_ZNK7WebCore11HistoryItem15pageScaleFactorEv` | `apWO3tteYGs` | +| `_ZNK7WebCore11HistoryItem17originalURLStringEv` | `h6XL2wyRFpM` | +| `_ZNK7WebCore11HistoryItem20hasCachedPageExpiredEv` | `KAcWEAGdd+c` | +| `_ZNK7WebCore11HistoryItem27shouldRestoreScrollPositionEv` | `WEaj30cTtgk` | +| `_ZNK7WebCore11HistoryItem28shouldOpenExternalURLsPolicyEv` | `6f0LylaXd7o` | +| `_ZNK7WebCore11HistoryItem3urlEv` | `MlqeBoQNTJE` | +| `_ZNK7WebCore11HistoryItem4copyEv` | `keZTgaBCdFs` | +| `_ZNK7WebCore11HistoryItem5titleEv` | `pJOHRRnVOv8` | +| `_ZNK7WebCore11HistoryItem6targetEv` | `QmHTw0yTTwE` | +| `_ZNK7WebCore11HistoryItem8childrenEv` | `FNq4SsbRtKg` | +| `_ZNK7WebCore11HistoryItem8referrerEv` | `Z9m12hOCc+0` | +| `_ZNK7WebCore11HistoryItem9urlStringEv` | `e9kq80v5TTI` | +| `_ZNK7WebCore11JSDOMMatrix7wrappedEv` | `g-qkr5NChcY` | +| `_ZNK7WebCore11MediaPlayer11currentTimeEv` | `Um8wfeu9KeI` | +| `_ZNK7WebCore11MediaPlayer11initialTimeEv` | `vPN5TrcOIY4` | +| `_ZNK7WebCore11MediaPlayer12getStartDateEv` | `-9rpiBpO0+c` | +| `_ZNK7WebCore11MediaPlayer13isVideoPlayerEv` | `RoIWhEt0jTg` | +| `_ZNK7WebCore11MediaPlayer13movieLoadTypeEv` | `EIdtyyQIVFE` | +| `_ZNK7WebCore11MediaPlayer13platformLayerEv` | `BdmkDCjE3fE` | +| `_ZNK7WebCore11MediaPlayer13playerPrivateEv` | `+yMOX81TeWE` | +| `_ZNK7WebCore11MediaPlayer13requestedRateEv` | `m1Y7YpNH-OY` | +| `_ZNK7WebCore11MediaPlayer14preservesPitchEv` | `Ch0rwJ8oqIA` | +| `_ZNK7WebCore11MediaPlayer15contentMIMETypeEv` | `aePIC2GrVwI` | +| `_ZNK7WebCore11MediaPlayer15extraMemoryCostEv` | `iycxBMYLgHQ` | +| `_ZNK7WebCore11MediaPlayer16canSaveMediaDataEv` | `fg0HFN49oxg` | +| `_ZNK7WebCore11MediaPlayer16supportsScanningEv` | `xnARf4a4prE` | +| `_ZNK7WebCore11MediaPlayer17contentTypeCodecsEv` | `5dclua8Io5s` | +| `_ZNK7WebCore11MediaPlayer17decodedFrameCountEv` | `nfc7UmDvD5k` | +| `_ZNK7WebCore11MediaPlayer17doesHaveAttributeERKN3WTF10AtomStringEPS2_` | `DjWf03qkdoY` | +| `_ZNK7WebCore11MediaPlayer17droppedFrameCountEv` | `dLwUVYV1jA0` | +| `_ZNK7WebCore11MediaPlayer17engineDescriptionEv` | `hV4yTCUcogU` | +| `_ZNK7WebCore11MediaPlayer17hasClosedCaptionsEv` | `GMtQuGiE5MI` | +| `_ZNK7WebCore11MediaPlayer17platformErrorCodeEv` | `mfbOiuhry-o` | +| `_ZNK7WebCore11MediaPlayer18maxFastForwardRateEv` | `iJVourQXpgQ` | +| `_ZNK7WebCore11MediaPlayer18minFastReverseRateEv` | `f1HAS+flwvE` | +| `_ZNK7WebCore11MediaPlayer18shouldDisableSleepEv` | `rRCIxcuzMgs` | +| `_ZNK7WebCore11MediaPlayer18supportsFullscreenEv` | `zUBEypuu+Qk` | +| `_ZNK7WebCore11MediaPlayer19mediaCacheDirectoryEv` | `AMvdjcTxfbs` | +| `_ZNK7WebCore11MediaPlayer19playerContentsScaleEv` | `6VJpFkVmh5g` | +| `_ZNK7WebCore11MediaPlayer20playerContentBoxRectEv` | `KHCFjwCNxoQ` | +| `_ZNK7WebCore11MediaPlayer20renderingModeChangedEv` | `Yd1Rm-5Quo0` | +| `_ZNK7WebCore11MediaPlayer21audioDecodedByteCountEv` | `go8pfVYxUDw` | +| `_ZNK7WebCore11MediaPlayer21mediaTimeForTimeValueERKN3WTF9MediaTimeE` | `sBRYY54nTLo` | +| `_ZNK7WebCore11MediaPlayer21videoDecodedByteCountEv` | `LgC+bA2tQUg` | +| `_ZNK7WebCore11MediaPlayer22didPassCORSAccessCheckEv` | `xboOgWkcWVw` | +| `_ZNK7WebCore11MediaPlayer22documentSecurityOriginEv` | `zJ8KXrFK1Zw` | +| `_ZNK7WebCore11MediaPlayer22hasAvailableVideoFrameEv` | `5vyXyk7zR6M` | +| `_ZNK7WebCore11MediaPlayer24shouldUsePersistentCacheEv` | `7QTMSPEe1lw` | +| `_ZNK7WebCore11MediaPlayer24supportsPictureInPictureEv` | `SIibyT2wPaU` | +| `_ZNK7WebCore11MediaPlayer25preferredDynamicRangeModeEv` | `h1oT-Ke-wl0` | +| `_ZNK7WebCore11MediaPlayer25renderingCanBeAcceleratedEv` | `NkFH5mAgFjE` | +| `_ZNK7WebCore11MediaPlayer26shouldCheckHardwareSupportEv` | `dbSDLYu3gzY` | +| `_ZNK7WebCore11MediaPlayer27languageOfPrimaryAudioTrackEv` | `NtlWM0ZU2wY` | +| `_ZNK7WebCore11MediaPlayer27sourceApplicationIdentifierEv` | `etBYEprfg+c` | +| `_ZNK7WebCore11MediaPlayer28requiresImmediateCompositingEv` | `gCWqjdrnC9g` | +| `_ZNK7WebCore11MediaPlayer28supportsAcceleratedRenderingEv` | `rlnpPNMzl70` | +| `_ZNK7WebCore11MediaPlayer29preferredAudioCharacteristicsEv` | `v+FLN9Ew6t4` | +| `_ZNK7WebCore11MediaPlayer31maximumDurationToCacheMediaTimeEv` | `8rRzoDFknyk` | +| `_ZNK7WebCore11MediaPlayer31requiresTextTrackRepresentationEv` | `12gexxIy+t0` | +| `_ZNK7WebCore11MediaPlayer35platformVolumeConfigurationRequiredEv` | `XwQprd-SN94` | +| `_ZNK7WebCore11MediaPlayer39contentMIMETypeWasInferredFromExtensionEv` | `ibqF5xhmbmI` | +| `_ZNK7WebCore11MediaPlayer41mediaContentTypesRequiringHardwareSupportEv` | `gY2judYG38M` | +| `_ZNK7WebCore11MediaPlayer4rateEv` | `uYpN3d-+c9o` | +| `_ZNK7WebCore11MediaPlayer5endedEv` | `P-Zhj99ghLM` | +| `_ZNK7WebCore11MediaPlayer5mutedEv` | `hjULUs7uHiA` | +| `_ZNK7WebCore11MediaPlayer6clientEv` | `UFiQk867m7o` | +| `_ZNK7WebCore11MediaPlayer6pausedEv` | `svFP+RQpUbk` | +| `_ZNK7WebCore11MediaPlayer6volumeEv` | `qOGvhm61g-E` | +| `_ZNK7WebCore11MediaPlayer7preloadEv` | `LsaZNLQQwUY` | +| `_ZNK7WebCore11MediaPlayer7seekingEv` | `tRPZufpBbYs` | +| `_ZNK7WebCore11MediaPlayer8durationEv` | `t4VsMdzH3ns` | +| `_ZNK7WebCore11MediaPlayer8fileSizeEv` | `zCqaT-DJauA` | +| `_ZNK7WebCore11MediaPlayer8hasAudioEv` | `Y5pqmZuI9KA` | +| `_ZNK7WebCore11MediaPlayer8hasVideoEv` | `PvP3AczVrzY` | +| `_ZNK7WebCore11MediaPlayer8referrerEv` | `NLJ-Wr9aNww` | +| `_ZNK7WebCore11MediaPlayer9isLoopingEv` | `6EkiZ2KuQ1U` | +| `_ZNK7WebCore11MediaPlayer9startTimeEv` | `884z2EqDTyQ` | +| `_ZNK7WebCore11MemoryCache16originsWithCacheEN3PAL9SessionIDE` | `Tk1ECWD4Lso` | +| `_ZNK7WebCore11MessagePort3refEv` | `8qdVicknu9M` | +| `_ZNK7WebCore11PageOverlay10controllerEv` | `JZ-SbEchaVI` | +| `_ZNK7WebCore11PageOverlay19viewToOverlayOffsetEv` | `xH5BX74yfvg` | +| `_ZNK7WebCore11PageOverlay5frameEv` | `jEi9RHoe5+o` | +| `_ZNK7WebCore11PageOverlay6boundsEv` | `mKK1NJYJNcQ` | +| `_ZNK7WebCore11RenderLayer19absoluteBoundingBoxEv` | `H4EgMfEASyE` | +| `_ZNK7WebCore11RenderLayer35isTransparentRespectingParentFramesEv` | `Lkox4DrvpWU` | +| `_ZNK7WebCore11RenderStyle10lineHeightEv` | `mjaR1-gcxBM` | +| `_ZNK7WebCore11RenderStyle11fontCascadeEv` | `yyrCVUOCeZo` | +| `_ZNK7WebCore11RenderStyle15fontDescriptionEv` | `ZPuAH1rVJ7k` | +| `_ZNK7WebCore11RenderStyle18computedLineHeightEv` | `Hq8zMjWpUu8` | +| `_ZNK7WebCore11RenderStyle26colorByApplyingColorFilterERKNS_5ColorE` | `T1-Z1I8I17o` | +| `_ZNK7WebCore11RenderVideo8videoBoxEv` | `5Dkyawhp0TE` | +| `_ZNK7WebCore11XPathResult10resultTypeEv` | `zWdJYlMai5M` | +| `_ZNK7WebCore11XPathResult11numberValueEv` | `emfrItA6E3w` | +| `_ZNK7WebCore11XPathResult11stringValueEv` | `krX3uZpoV3c` | +| `_ZNK7WebCore11XPathResult12booleanValueEv` | `yv-3EmS1Z80` | +| `_ZNK7WebCore11XPathResult14snapshotLengthEv` | `g6-f2xOHwvU` | +| `_ZNK7WebCore11XPathResult15singleNodeValueEv` | `CsVvgas0eUo` | +| `_ZNK7WebCore11XPathResult20invalidIteratorStateEv` | `CtVkHM1vW7A` | +| `_ZNK7WebCore12BlobDataItem6lengthEv` | `wAWyYd8-0Bk` | +| `_ZNK7WebCore12CSSMediaRule5mediaEv` | `urD45QcJ6Zg` | +| `_ZNK7WebCore12CSSStyleRule12selectorTextEv` | `ptB75ZpQkTk` | +| `_ZNK7WebCore12DOMTokenList5valueEv` | `PWzIeSR0K-Q` | +| `_ZNK7WebCore12DOMTokenList8containsERKN3WTF10AtomStringE` | `ZNMUPGLACI0` | +| `_ZNK7WebCore12EventHandler27capsLockStateMayHaveChangedEv` | `Wb664WLzebs` | +| `_ZNK7WebCore12GridPosition12spanPositionEv` | `DM1eyIdcmqw` | +| `_ZNK7WebCore12GridPosition15integerPositionEv` | `UiuOtk07joA` | +| `_ZNK7WebCore12NamedNodeMap12getNamedItemERKN3WTF10AtomStringE` | `fgqfPqcWPM0` | +| `_ZNK7WebCore12NamedNodeMap14getNamedItemNSERKN3WTF10AtomStringES4_` | `HopnL7CuhJk` | +| `_ZNK7WebCore12NamedNodeMap4itemEj` | `x0OgOogmxQM` | +| `_ZNK7WebCore12NamedNodeMap6lengthEv` | `LeU1W3saPaM` | +| `_ZNK7WebCore12RenderInline16linesBoundingBoxEv` | `TK8KB0Wy-ug` | +| `_ZNK7WebCore12RenderObject12enclosingBoxEv` | `L60K-UtS9fA` | +| `_ZNK7WebCore12RenderObject14enclosingLayerEv` | `Mt7YT3Eg06E` | +| `_ZNK7WebCore12RenderObject15containingBlockEv` | `u+g1hu2lQ+c` | +| `_ZNK7WebCore12RenderObject16repaintRectangleERKNS_10LayoutRectEb` | `6iTzJRMsnkw` | +| `_ZNK7WebCore12RenderObject17useDarkAppearanceEv` | `TFu1HTQqTsM` | +| `_ZNK7WebCore12RenderObject23absoluteBoundingBoxRectEbPb` | `yeDwxm1ilhQ` | +| `_ZNK7WebCore12RenderObject39pixelSnappedAbsoluteClippedOverflowRectEv` | `Acz3w+5PgUA` | +| `_ZNK7WebCore12RenderObject44hasNonEmptyVisibleRectRespectingParentFramesEv` | `+tyM95Aw07M` | +| `_ZNK7WebCore12RenderObject7childAtEj` | `83tS6HRLhis` | +| `_ZNK7WebCore12RenderWidget14windowClipRectEv` | `dgQidT1on4k` | +| `_ZNK7WebCore12SettingsBase15fixedFontFamilyE11UScriptCode` | `voLOq3g1XTI` | +| `_ZNK7WebCore12SettingsBase15serifFontFamilyE11UScriptCode` | `i4eT3QOzLNI` | +| `_ZNK7WebCore12SettingsBase17cursiveFontFamilyE11UScriptCode` | `CMKyrGMW54Y` | +| `_ZNK7WebCore12SettingsBase17fantasyFontFamilyE11UScriptCode` | `LYNNj5rNb7w` | +| `_ZNK7WebCore12SettingsBase18standardFontFamilyE11UScriptCode` | `7RpkbtIp-o4` | +| `_ZNK7WebCore12SettingsBase19sansSerifFontFamilyE11UScriptCode` | `5j4kGT4mYL8` | +| `_ZNK7WebCore12SettingsBase20pictographFontFamilyE11UScriptCode` | `C9lhqCz3iZ0` | +| `_ZNK7WebCore12SharedBuffer4dataEv` | `dP+1suucXso` | +| `_ZNK7WebCore12TextIterator4nodeEv` | `Jb0VJFvx0Qk` | +| `_ZNK7WebCore12TextIterator5rangeEv` | `M+bKURAEUWQ` | +| `_ZNK7WebCore12WebAnimation14timeToNextTickEv` | `T0RtzSCY4FE` | +| `_ZNK7WebCore13CSSImportRule10styleSheetEv` | `Cykko0lPS3I` | +| `_ZNK7WebCore13CSSImportRule4hrefEv` | `Lr3a15XWIGw` | +| `_ZNK7WebCore13CSSImportRule5mediaEv` | `gsOx0pvAwDQ` | +| `_ZNK7WebCore13ContainerNode15countChildNodesEv` | `8B4VW7ug08U` | +| `_ZNK7WebCore13ContainerNode16lastElementChildEv` | `fGDYHA+uG4g` | +| `_ZNK7WebCore13ContainerNode17childElementCountEv` | `u0hSyMPmgr4` | +| `_ZNK7WebCore13ContainerNode17firstElementChildEv` | `pllJ6xDOUj8` | +| `_ZNK7WebCore13ContainerNode17traverseToChildAtEj` | `3Af3+T3MOdY` | +| `_ZNK7WebCore13FetchResponse16resourceResponseEv` | `FAKbB9NPYHA` | +| `_ZNK7WebCore13GraphicsLayer18getDebugBorderInfoERNS_5ColorERf` | `PjcqP0lC4U8` | +| `_ZNK7WebCore13GraphicsLayer26backingStoreMemoryEstimateEv` | `NDAHXMuRQ5M` | +| `_ZNK7WebCore13HTTPHeaderMap3getENS_14HTTPHeaderNameE` | `Zkmt7pm3d5M` | +| `_ZNK7WebCore13HTTPHeaderMap8containsENS_14HTTPHeaderNameE` | `oKamLgrFO+k` | +| `_ZNK7WebCore13HTTPHeaderMap8containsERKN3WTF6StringE` | `9w0VG82erX8` | +| `_ZNK7WebCore13HitTestResult10isSelectedEv` | `dkCPPTsZyu4` | +| `_ZNK7WebCore13HitTestResult10targetNodeEv` | `p8H37RdDza0` | +| `_ZNK7WebCore13HitTestResult11targetFrameEv` | `kwYsxmyDsvU` | +| `_ZNK7WebCore13HitTestResult11textContentEv` | `XW73Ink4DfA` | +| `_ZNK7WebCore13HitTestResult12mediaIsVideoEv` | `SMk2lpzuDmU` | +| `_ZNK7WebCore13HitTestResult12selectedTextEv` | `ZUm8heKi4SY` | +| `_ZNK7WebCore13HitTestResult13mediaHasAudioEv` | `uMm5jtE1kS0` | +| `_ZNK7WebCore13HitTestResult13targetElementEv` | `0n26Y1SBD7Y` | +| `_ZNK7WebCore13HitTestResult14absolutePDFURLEv` | `u5dPpeNUOj4` | +| `_ZNK7WebCore13HitTestResult14innerNodeFrameEv` | `sngv+7kclEc` | +| `_ZNK7WebCore13HitTestResult15absoluteLinkURLEv` | `0cEED80Q7cU` | +| `_ZNK7WebCore13HitTestResult15spellingToolTipERNS_13TextDirectionE` | `KMx1YNQUM6M` | +| `_ZNK7WebCore13HitTestResult16absoluteImageURLEv` | `jwO6mScIWL0` | +| `_ZNK7WebCore13HitTestResult16absoluteMediaURLEv` | `cmSxsBCpzS0` | +| `_ZNK7WebCore13HitTestResult16altDisplayStringEv` | `NxKYXPb-CHA` | +| `_ZNK7WebCore13HitTestResult17isContentEditableEv` | `-dSe2YtNqog` | +| `_ZNK7WebCore13HitTestResult18titleDisplayStringEv` | `lTV7W53O5ss` | +| `_ZNK7WebCore13HitTestResult19isDownloadableMediaEv` | `MCPsmT2jOnM` | +| `_ZNK7WebCore13HitTestResult19listBasedTestResultEv` | `wMZWLJunf5c` | +| `_ZNK7WebCore13HitTestResult19mediaIsInFullscreenEv` | `0a-wfUFlLzU` | +| `_ZNK7WebCore13HitTestResult21innerNonSharedElementEv` | `B5icjC5-YJ0` | +| `_ZNK7WebCore13HitTestResult21linkSuggestedFilenameEv` | `KuR0yJpMwps` | +| `_ZNK7WebCore13HitTestResult34isOverTextInsideFormControlElementEv` | `Sxs0gMc4giY` | +| `_ZNK7WebCore13HitTestResult5imageEv` | `K7m4Ku1jWBw` | +| `_ZNK7WebCore13HitTestResult5titleERNS_13TextDirectionE` | `V2k1Ff-ujM8` | +| `_ZNK7WebCore13HitTestResult9imageRectEv` | `qpZ3oQs9aoQ` | +| `_ZNK7WebCore13ImageDocument12imageElementEv` | `FTVOVsiCzrI` | +| `_ZNK7WebCore13JSHTMLElement21pushEventHandlerScopeEPN3JSC14JSGlobalObjectEPNS1_7JSScopeE` | `EyLiGmBVSo8` | +| `_ZNK7WebCore13JSHTMLElement7wrappedEv` | `gRyLWstYGXM` | +| `_ZNK7WebCore13KeyboardEvent7keyCodeEv` | `bElrc3VqGXk` | +| `_ZNK7WebCore13KeyboardEvent8charCodeEv` | `O4PQrbyLS7k` | +| `_ZNK7WebCore13MIMETypeCache11isAvailableEv` | `XPpjBuVLPVA` | +| `_ZNK7WebCore13MIMETypeCache7isEmptyEv` | `l+OspgT++TA` | +| `_ZNK7WebCore13RenderElement16imageOrientationEv` | `ttg3VJv7+Wg` | +| `_ZNK7WebCore13ScriptElement13scriptContentEv` | `rlTwz32Y4kY` | +| `_ZNK7WebCore14CredentialBase11hasPasswordEv` | `RG4bcvS0caE` | +| `_ZNK7WebCore14CredentialBase11persistenceEv` | `lEMJBGmSagw` | +| `_ZNK7WebCore14CredentialBase4userEv` | `prqMnBIs0A8` | +| `_ZNK7WebCore14CredentialBase7isEmptyEv` | `6vopFVc7RLI` | +| `_ZNK7WebCore14CredentialBase8passwordEv` | `9V0j0gYaQBM` | +| `_ZNK7WebCore14DOMCacheEngine6Record4copyEv` | `qXuAm4m41Do` | +| `_ZNK7WebCore14DocumentLoader11frameLoaderEv` | `vMQuL4mBxU0` | +| `_ZNK7WebCore14DocumentLoader11subresourceERKN3WTF3URLE` | `Ru5P+vR-vao` | +| `_ZNK7WebCore14DocumentLoader12subresourcesEv` | `P0vACtrVWtw` | +| `_ZNK7WebCore14DocumentLoader13urlForHistoryEv` | `KDLaJiY6Wt8` | +| `_ZNK7WebCore14DocumentLoader16mainResourceDataEv` | `Cqfbm5pTMIw` | +| `_ZNK7WebCore14DocumentLoader16mouseEventPolicyEv` | `5FVmKLxFnys` | +| `_ZNK7WebCore14DocumentLoader18mainResourceLoaderEv` | `QA6wRe52nLI` | +| `_ZNK7WebCore14DocumentLoader19isLoadingInAPISenseEv` | `xbjUjDk2Ov4` | +| `_ZNK7WebCore14DocumentLoader21archiveResourceForURLERKN3WTF3URLE` | `wchZ9bYTOdM` | +| `_ZNK7WebCore14DocumentLoader28urlForHistoryReflectsFailureEv` | `IK3c4F7EKu0` | +| `_ZNK7WebCore14DocumentLoader9isLoadingEv` | `EQP-RPsXOCA` | +| `_ZNK7WebCore14FrameSelection11currentFormEv` | `82mm6jhmlXM` | +| `_ZNK7WebCore14FrameSelection15copyTypingStyleEv` | `gve8e5wHgEw` | +| `_ZNK7WebCore14FrameSelection18isFocusedAndActiveEv` | `8Rc62+-s1+M` | +| `_ZNK7WebCore14FrameSelection31getClippedVisibleTextRectanglesERN3WTF6VectorINS_9FloatRectELm0ENS1_15CrashOnOverflowELm16ENS1_10FastMallocEEENS0_19TextRectangleHeightE` | `WyUGMSJ+iaY` | +| `_ZNK7WebCore14FrameSelection36rootEditableElementOrDocumentElementEv` | `knrcu8CFvhw` | +| `_ZNK7WebCore14HTMLCollection13namedItemSlowERKN3WTF10AtomStringE` | `XKZPrb4Pfqg` | +| `_ZNK7WebCore14JSVoidCallback22scriptExecutionContextEv` | `hHkNFU67uNM` | +| `_ZNK7WebCore14JSWebAnimation7wrappedEv` | `rlOCpNWBbhQ` | +| `_ZNK7WebCore14LoaderStrategy11usePingLoadEv` | `FhapblPGTsQ` | +| `_ZNK7WebCore14LoaderStrategy12ongoingLoadsEv` | `m8rqXLGqxH4` | +| `_ZNK7WebCore14LoaderStrategy27havePerformedSecurityChecksERKNS_16ResourceResponseE` | `goURkCMz2mY` | +| `_ZNK7WebCore14LoaderStrategy27shouldPerformSecurityChecksEv` | `768mKI7DmSk` | +| `_ZNK7WebCore14LoggedInStatus10hasExpiredEv` | `mgNAFnYj41Q` | +| `_ZNK7WebCore14LoggedInStatus6expiryEv` | `0uCtvJ7t7X8` | +| `_ZNK7WebCore14ResourceHandle6clientEv` | `Cgh0i6SAWZo` | +| `_ZNK7WebCore14ResourceLoader11frameLoaderEv` | `ZeJH5yn7Ye4` | +| `_ZNK7WebCore14ResourceLoader28shouldIncludeCertificateInfoEv` | `2vPr-tg31UY` | +| `_ZNK7WebCore14ResourceLoader32isAllowedToAskUserForCredentialsEv` | `E5JRO12DLtU` | +| `_ZNK7WebCore14ScrollableArea12scrollOffsetEv` | `Wk00PLpcA8M` | +| `_ZNK7WebCore14ScrollableArea13scrolledToTopEv` | `ERhlT6vYvfA` | +| `_ZNK7WebCore14ScrollableArea14scrollAnimatorEv` | `fZ5o5ZBaz4U` | +| `_ZNK7WebCore14ScrollableArea14scrolledToLeftEv` | `u9XQPaGXOiI` | +| `_ZNK7WebCore14ScrollableArea15scrolledToRightEv` | `wnmjinMVP1o` | +| `_ZNK7WebCore14ScrollableArea16scrolledToBottomEv` | `5H2j5vefKBg` | +| `_ZNK7WebCore14ScrollableArea17totalContentsSizeEv` | `tWKhEaNvFCc` | +| `_ZNK7WebCore14ScrollableArea18scrollbarIntrusionEv` | `UxRFBHALbSI` | +| `_ZNK7WebCore14ScrollableArea18visibleContentRectENS0_26VisibleContentRectBehaviorE` | `W6uqyYgfehY` | +| `_ZNK7WebCore14ScrollableArea20contentAreaWillPaintEv` | `ris-XwSqzyM` | +| `_ZNK7WebCore14ScrollableArea21mouseEnteredScrollbarEPNS_9ScrollbarE` | `etZLnoayRdo` | +| `_ZNK7WebCore14ScrollableArea21scrollbarsCanBeActiveEv` | `mBMPV-oC2EU` | +| `_ZNK7WebCore14ScrollableArea22mouseExitedContentAreaEv` | `J6I-dnVtvEc` | +| `_ZNK7WebCore14ScrollableArea23mouseEnteredContentAreaEv` | `xUxaNqgIvEI` | +| `_ZNK7WebCore14ScrollableArea23mouseMovedInContentAreaEv` | `xXe+Dc3g6Lc` | +| `_ZNK7WebCore14ScrollableArea24scrollOffsetFromPositionENS_8IntPointE` | `fsf54xvCbtM` | +| `_ZNK7WebCore14ScrollableArea24scrollPositionFromOffsetENS_8IntPointE` | `0GkIAcBgKFg` | +| `_ZNK7WebCore14ScrollableArea26reachableTotalContentsSizeEv` | `5TazKXr9t+Q` | +| `_ZNK7WebCore14ScrollableArea26visibleContentRectInternalENS0_36VisibleContentRectIncludesScrollbarsENS0_26VisibleContentRectBehaviorE` | `ODZh5zCuc9E` | +| `_ZNK7WebCore14ScrollableArea32verticalScrollbarStateForTestingEv` | `tlIqwG4H+zs` | +| `_ZNK7WebCore14ScrollableArea34horizontalScrollbarStateForTestingEv` | `tyIYDSPN1WA` | +| `_ZNK7WebCore14ScrollableArea37visibleContentRectIncludingScrollbarsENS0_26VisibleContentRectBehaviorE` | `ya10xz-PpUs` | +| `_ZNK7WebCore14SecurityOrigin11toRawStringEv` | `RXVRxJBMUP8` | +| `_ZNK7WebCore14SecurityOrigin12isolatedCopyEv` | `Djc6lP7YppU` | +| `_ZNK7WebCore14SecurityOrigin14isSameOriginAsERKS0_` | `OVH5Rc8SZ0U` | +| `_ZNK7WebCore14SecurityOrigin23domainForCachePartitionEv` | `sit3xZSmxGo` | +| `_ZNK7WebCore14SecurityOrigin33isMatchingRegistrableDomainSuffixERKN3WTF6StringEb` | `LQ1mr+-wJaQ` | +| `_ZNK7WebCore14SecurityOrigin5equalEPKS0_` | `KVIBeoIIX3o` | +| `_ZNK7WebCore14SecurityOrigin8toStringEv` | `JZmn6lNGFyU` | +| `_ZNK7WebCore14StaticNodeList4itemEj` | `ljRSoeZdr5s` | +| `_ZNK7WebCore14StaticNodeList6lengthEv` | `KczZ-oYJWig` | +| `_ZNK7WebCore14StyleSheetList6lengthEv` | `ey4ejaqVqfA` | +| `_ZNK7WebCore15ActiveDOMObject16isContextStoppedEv` | `x9nBgCbadYs` | +| `_ZNK7WebCore15ActiveDOMObject18hasPendingActivityEv` | `H-gEkxHy3s8` | +| `_ZNK7WebCore15ActiveDOMObject20isAllowedToRunScriptEv` | `6ot8v-aJp4w` | +| `_ZNK7WebCore15ActiveDOMObject25virtualHasPendingActivityEv` | `iNX6kO6iSaM` | +| `_ZNK7WebCore15ActiveDOMObject30assertSuspendIfNeededWasCalledEv` | `wRA9-Ih1MkU` | +| `_ZNK7WebCore15AffineTransform9mapRegionERKNS_6RegionE` | `D-MYWruwiUQ` | +| `_ZNK7WebCore15CSSGroupingRule8cssRulesEv` | `FfRPM8I9Wvw` | +| `_ZNK7WebCore15CertificateInfo12isolatedCopyEv` | `F-cW5QXnhxo` | +| `_ZNK7WebCore15FocusController18focusedOrMainFrameEv` | `JdKoblsgg00` | +| `_ZNK7WebCore15HTMLAreaElement11computeRectEPNS_12RenderObjectE` | `utdV0Hz4lDw` | +| `_ZNK7WebCore15HTMLAreaElement12imageElementEv` | `kBUw9BF1N28` | +| `_ZNK7WebCore15HTMLBaseElement4hrefEv` | `P-T-RQ+3D1s` | +| `_ZNK7WebCore15HTMLFormElement12autocompleteEv` | `xBOnLORfxB4` | +| `_ZNK7WebCore15HTMLFormElement6actionEv` | `zWvOap1xKUE` | +| `_ZNK7WebCore15HTMLFormElement6lengthEv` | `Snyf4vc4Grg` | +| `_ZNK7WebCore15HTMLFormElement6methodEv` | `vQgTn573K8A` | +| `_ZNK7WebCore15HTMLLinkElement11crossOriginEv` | `eoUoCaaDpCA` | +| `_ZNK7WebCore15HTMLLinkElement2asEv` | `-xHVS4PppCM` | +| `_ZNK7WebCore15HTMLLinkElement3relEv` | `71FWawHH1NU` | +| `_ZNK7WebCore15HTTPHeaderField4nameEv` | `IzC+la5Js9c` | +| `_ZNK7WebCore15HTTPHeaderField5valueEv` | `Ludc0ycnXxQ` | +| `_ZNK7WebCore15JSDOMWindowBase17printErrorMessageERKN3WTF6StringE` | `d7nXqiztOaU` | +| `_ZNK7WebCore15JSDOMWindowBase22scriptExecutionContextEv` | `SHmLauSB1MU` | +| `_ZNK7WebCore15JSDOMWindowBase5proxyEv` | `fqsYz9A6rOA` | +| `_ZNK7WebCore15JSDOMWindowBase7wrappedEv` | `6lCkJVSEkCo` | +| `_ZNK7WebCore15JSSVGSVGElement7wrappedEv` | `WcmZSfOjKrc` | +| `_ZNK7WebCore15ProgressTracker17estimatedProgressEv` | `yKesHVodhLA` | +| `_ZNK7WebCore15SQLiteStatement18bindParameterCountEv` | `8tE06sxxee8` | +| `_ZNK7WebCore15SecurityContext14securityOriginEv` | `LJaVcBjiivQ` | +| `_ZNK7WebCore15StyleProperties11mutableCopyEv` | `ej0xGPHrclM` | +| `_ZNK7WebCore15StyleProperties16getPropertyValueENS_13CSSPropertyIDE` | `BtF3FDGEhR4` | +| `_ZNK7WebCore15StyleProperties19getPropertyCSSValueENS_13CSSPropertyIDE` | `wnzAlf1xqko` | +| `_ZNK7WebCore15VisiblePosition14characterAfterEv` | `0jlL4fJ6ixA` | +| `_ZNK7WebCore15VisiblePosition19absoluteCaretBoundsEPb` | `acxeAsX7154` | +| `_ZNK7WebCore15VisiblePosition30absoluteSelectionBoundsForLineEv` | `CgJ2nGibrIo` | +| `_ZNK7WebCore15VisiblePosition45lineDirectionPointForBlockDirectionNavigationEv` | `Rg6U0jZ1qqg` | +| `_ZNK7WebCore15VisiblePosition4leftEbPb` | `pEWDYfJwYlc` | +| `_ZNK7WebCore15VisiblePosition4nextENS_27EditingBoundaryCrossingRuleEPb` | `T8b+oe2DcgE` | +| `_ZNK7WebCore15VisiblePosition5rightEbPb` | `ieOpq0KLu40` | +| `_ZNK7WebCore15VisiblePosition8previousENS_27EditingBoundaryCrossingRuleEPb` | `WkUqYTkTzeI` | +| `_ZNK7WebCore16BackForwardCache10frameCountEv` | `Fjaafcv5byY` | +| `_ZNK7WebCore16BlobRegistryImpl11filesInBlobERKN3WTF3URLE` | `YJxbbli-KAM` | +| `_ZNK7WebCore16BlobRegistryImpl18getBlobDataFromURLERKN3WTF3URLE` | `IIhlecN4L84` | +| `_ZNK7WebCore16DOMGuardedObject11isSuspendedEv` | `J0v4IwoeBvc` | +| `_ZNK7WebCore16DOMGuardedObject12globalObjectEv` | `vUx-PsH0wAA` | +| `_ZNK7WebCore16DOMGuardedObject13guardedObjectEv` | `w90fasGOyHU` | +| `_ZNK7WebCore16DOMGuardedObject7isEmptyEv` | `E0LGxTnifDc` | +| `_ZNK7WebCore16DocumentFragment14getElementByIdERKN3WTF10AtomStringE` | `7Sd1KuCKyww` | +| `_ZNK7WebCore16DocumentTimeline17animationIntervalEv` | `vyOS18Unsuw` | +| `_ZNK7WebCore16DocumentTimeline34numberOfActiveAnimationsForTestingEv` | `g9YJnS7j2Bk` | +| `_ZNK7WebCore16DocumentTimeline48numberOfAnimationTimelineInvalidationsForTestingEv` | `P8hfXGY4+2U` | +| `_ZNK7WebCore16FileReaderLoader17arrayBufferResultEv` | `9z5ilnoxdQU` | +| `_ZNK7WebCore16HTMLImageElement11cachedImageEv` | `sYj1Nwq78yQ` | +| `_ZNK7WebCore16HTMLImageElement11crossOriginEv` | `fq6PWnRgTgI` | +| `_ZNK7WebCore16HTMLImageElement12naturalWidthEv` | `GUuhLSwsTAM` | +| `_ZNK7WebCore16HTMLImageElement1xEv` | `vKHE7wNteLg` | +| `_ZNK7WebCore16HTMLImageElement1yEv` | `j6mWU1nccSQ` | +| `_ZNK7WebCore16HTMLImageElement36pendingDecodePromisesCountForTestingEv` | `FuHXBscOxGk` | +| `_ZNK7WebCore16HTMLImageElement3altEv` | `UAjZYIjP-aI` | +| `_ZNK7WebCore16HTMLImageElement8completeEv` | `T7zncgvFweM` | +| `_ZNK7WebCore16HTMLInputElement10isURLFieldEv` | `XypQPgXg0KE` | +| `_ZNK7WebCore16HTMLInputElement11isDateFieldEv` | `WHqhzve17Eg` | +| `_ZNK7WebCore16HTMLInputElement11isTextFieldEv` | `TeE+ktl+Cw8` | +| `_ZNK7WebCore16HTMLInputElement11isTimeFieldEv` | `BLylHdCcD2o` | +| `_ZNK7WebCore16HTMLInputElement11isWeekFieldEv` | `MUlXrcCBGO0` | +| `_ZNK7WebCore16HTMLInputElement11valueAsDateEv` | `LTE1dovGMro` | +| `_ZNK7WebCore16HTMLInputElement12defaultValueEv` | `YmGU-+-hmIs` | +| `_ZNK7WebCore16HTMLInputElement12isEmailFieldEv` | `mDwiQvBlU90` | +| `_ZNK7WebCore16HTMLInputElement12isFileUploadEv` | `vZikpIeFVMY` | +| `_ZNK7WebCore16HTMLInputElement12isMonthFieldEv` | `I4q+6sukCEc` | +| `_ZNK7WebCore16HTMLInputElement13isNumberFieldEv` | `VV5P3L0DrP0` | +| `_ZNK7WebCore16HTMLInputElement13isSearchFieldEv` | `wd+PTkXXAKQ` | +| `_ZNK7WebCore16HTMLInputElement13valueAsNumberEv` | `rLsPBLktI-A` | +| `_ZNK7WebCore16HTMLInputElement15isPasswordFieldEv` | `wda1xC2CEiM` | +| `_ZNK7WebCore16HTMLInputElement15suggestedColorsEv` | `4CD5YSD9fvg` | +| `_ZNK7WebCore16HTMLInputElement16isTelephoneFieldEv` | `y5jp97KAQuQ` | +| `_ZNK7WebCore16HTMLInputElement17validationMessageEv` | `rU5NxTYe880` | +| `_ZNK7WebCore16HTMLInputElement18shouldAutocompleteEv` | `c8n7HQCsv3E` | +| `_ZNK7WebCore16HTMLInputElement20isDateTimeLocalFieldEv` | `1G5Prf1bClU` | +| `_ZNK7WebCore16HTMLInputElement21autoFillButtonElementEv` | `dsKVK6wUloE` | +| `_ZNK7WebCore16HTMLInputElement3altEv` | `b89Y6mVMg+Q` | +| `_ZNK7WebCore16HTMLInputElement5valueEv` | `CoRa1vHix+4` | +| `_ZNK7WebCore16HTMLInputElement5widthEv` | `m2gmPnFLeck` | +| `_ZNK7WebCore16HTMLInputElement6heightEv` | `PZEeC9wi0qo` | +| `_ZNK7WebCore16HTMLInputElement6isTextEv` | `w1CdZU2Srwo` | +| `_ZNK7WebCore16HTMLInputElement8multipleEv` | `FxOa6zwDh1c` | +| `_ZNK7WebCore16HTMLLabelElement4formEv` | `Niz5Bj08+f8` | +| `_ZNK7WebCore16HTMLLabelElement7controlEv` | `L13sQFzk+cs` | +| `_ZNK7WebCore16HTMLMediaElement11canPlayTypeERKN3WTF6StringE` | `timf-m2k7j4` | +| `_ZNK7WebCore16HTMLMediaElement11crossOriginEv` | `UiYyNSsGSA0` | +| `_ZNK7WebCore16HTMLMediaElement11currentTimeEv` | `GqN5h-zFfOI` | +| `_ZNK7WebCore16HTMLMediaElement12getStartDateEv` | `db7qZKvMOAo` | +| `_ZNK7WebCore16HTMLMediaElement12isFullscreenEv` | `SUuc7HQehIA` | +| `_ZNK7WebCore16HTMLMediaElement12networkStateEv` | `JQx-yaSToZ8` | +| `_ZNK7WebCore16HTMLMediaElement12playbackRateEv` | `TWe9e+Jmwz4` | +| `_ZNK7WebCore16HTMLMediaElement15bufferingPolicyEv` | `Zo6ks32VHL4` | +| `_ZNK7WebCore16HTMLMediaElement20webkitPreservesPitchEv` | `f7bEpmyxkiA` | +| `_ZNK7WebCore16HTMLMediaElement23webkitHasClosedCaptionsEv` | `2XFOG9cQuV4` | +| `_ZNK7WebCore16HTMLMediaElement27webkitClosedCaptionsVisibleEv` | `MtuVljq6Sq8` | +| `_ZNK7WebCore16HTMLMediaElement33lastMediaResourceLoaderForTestingEv` | `911IbjFdJDA` | +| `_ZNK7WebCore16HTMLMediaElement5endedEv` | `HCM1EwLWQf8` | +| `_ZNK7WebCore16HTMLMediaElement5errorEv` | `fKZYpNfkFNE` | +| `_ZNK7WebCore16HTMLMediaElement5mutedEv` | `7iKAJFysZaM` | +| `_ZNK7WebCore16HTMLMediaElement6pausedEv` | `5uxtaxT7+2U` | +| `_ZNK7WebCore16HTMLMediaElement6volumeEv` | `uAKuqBgtD-Q` | +| `_ZNK7WebCore16HTMLMediaElement7canPlayEv` | `dNtSIr75Zws` | +| `_ZNK7WebCore16HTMLMediaElement7preloadEv` | `XI2J3o+cnl8` | +| `_ZNK7WebCore16HTMLMediaElement7seekingEv` | `FEWhRykt9L0` | +| `_ZNK7WebCore16HTMLMediaElement8controlsEv` | `RpoSU2ZTsd4` | +| `_ZNK7WebCore16HTMLMediaElement8durationEv` | `0wgB8VmdqR8` | +| `_ZNK7WebCore16HTMLOListElement9itemCountEv` | `u4GPog8SXto` | +| `_ZNK7WebCore16HTMLStyleElement8disabledEv` | `34rw3yhC59w` | +| `_ZNK7WebCore16HTMLTableElement5tFootEv` | `dEpGQRMxIQg` | +| `_ZNK7WebCore16HTMLTableElement5tHeadEv` | `hHW4K+H+NTY` | +| `_ZNK7WebCore16HTMLTableElement7captionEv` | `tZyvY1I7uqk` | +| `_ZNK7WebCore16HTMLTitleElement4textEv` | `npyROZbXXpw` | +| `_ZNK7WebCore16HTMLVideoElement10videoWidthEv` | `NbJPSHOrNEA` | +| `_ZNK7WebCore16HTMLVideoElement11videoHeightEv` | `clr3IhTz4SM` | +| `_ZNK7WebCore16ISOSchemeTypeBox10schemeTypeEv` | `HqZ0tOXvi+A` | +| `_ZNK7WebCore16ISOSchemeTypeBox13schemeVersionEv` | `1lDe4Fqoias` | +| `_ZNK7WebCore16JSStringCallback22scriptExecutionContextEv` | `CtqqsxZ-lpo` | +| `_ZNK7WebCore16JSXMLHttpRequest7wrappedEv` | `kQEacF2vg-k` | +| `_ZNK7WebCore16JSXMLHttpRequest8responseERN3JSC14JSGlobalObjectE` | `8oQrlcWx0fg` | +| `_ZNK7WebCore16TrackPrivateBase10trackIndexEv` | `m99zKY4J6BQ` | +| `_ZNK7WebCore16TrackPrivateBase17startTimeVarianceEv` | `AYaZ5CHXzNA` | +| `_ZNK7WebCore16TrackPrivateBase2idEv` | `DaYfJlkP-0k` | +| `_ZNK7WebCore16TrackPrivateBase5labelEv` | `W+KOtirSb7U` | +| `_ZNK7WebCore16TrackPrivateBase8languageEv` | `K+XKFHF4O0w` | +| `_ZNK7WebCore16URLDecomposition4hashEv` | `djfNyVDLFz4` | +| `_ZNK7WebCore16URLDecomposition4hostEv` | `yM6UFAsJJr4` | +| `_ZNK7WebCore16URLDecomposition4portEv` | `gnsIZjIH-Mw` | +| `_ZNK7WebCore16URLDecomposition6searchEv` | `lZybtDrBJ60` | +| `_ZNK7WebCore16URLDecomposition8hostnameEv` | `sBYBAkdDGPY` | +| `_ZNK7WebCore16URLDecomposition8pathnameEv` | `GfBvEsyC8oY` | +| `_ZNK7WebCore16URLDecomposition8protocolEv` | `BwoYh9eiWvw` | +| `_ZNK7WebCore16VisibleSelection16hasEditableStyleEv` | `5Eyqy6FVc18` | +| `_ZNK7WebCore16VisibleSelection17isContentEditableEv` | `Q2p7ULYnJZo` | +| `_ZNK7WebCore16VisibleSelection17isInPasswordFieldEv` | `wgiQlxsZrYg` | +| `_ZNK7WebCore16VisibleSelection19rootEditableElementEv` | `V5+PiQVi82U` | +| `_ZNK7WebCore16VisibleSelection23isContentRichlyEditableEv` | `coemIHqKrrI` | +| `_ZNK7WebCore16VisibleSelection5isAllENS_27EditingBoundaryCrossingRuleE` | `pLoXvGTu73w` | +| `_ZNK7WebCore17ActiveDOMCallback17canInvokeCallbackEv` | `Vnj7Ahtg1Zc` | +| `_ZNK7WebCore17ActiveDOMCallback25activeDOMObjectAreStoppedEv` | `FfZ7dAUmTMw` | +| `_ZNK7WebCore17ActiveDOMCallback28activeDOMObjectsAreSuspendedEv` | `KwfoMI5b8j4` | +| `_ZNK7WebCore17CSSPrimitiveValue11stringValueEv` | `blx6kdu-ilQ` | +| `_ZNK7WebCore17CharacterIterator5rangeEv` | `rSa46Z635eI` | +| `_ZNK7WebCore17CredentialStorage22originsWithCredentialsEv` | `lO+DtQrVJiw` | +| `_ZNK7WebCore17FullscreenManager19isFullscreenEnabledEv` | `tB7JUWg6kMY` | +| `_ZNK7WebCore17FullscreenManager21isAnimatingFullscreenEv` | `0nmzC8IaJ3s` | +| `_ZNK7WebCore17FullscreenManager27areFullscreenControlsHiddenEv` | `240U4cfeeh8` | +| `_ZNK7WebCore17HTMLAnchorElement4hrefEv` | `o9on6vm3xLw` | +| `_ZNK7WebCore17HTMLAnchorElement6originEv` | `WR6ho9coRQ4` | +| `_ZNK7WebCore17HTMLLegendElement4formEv` | `H-LpvQe2GB0` | +| `_ZNK7WebCore17HTMLOptionElement18ownerSelectElementEv` | `THWDguS4dME` | +| `_ZNK7WebCore17HTMLOptionElement21isDisabledFormControlEv` | `CJVE5cb1btY` | +| `_ZNK7WebCore17HTMLOptionElement4textEv` | `jEN44InFKLs` | +| `_ZNK7WebCore17HTMLOptionElement5indexEv` | `0EhLtR7plbI` | +| `_ZNK7WebCore17HTMLOptionElement5labelEv` | `uv8tYCzpgvM` | +| `_ZNK7WebCore17HTMLOptionElement5valueEv` | `forQVyt9ycQ` | +| `_ZNK7WebCore17HTMLPlugInElement12pluginWidgetENS0_19PluginLoadingPolicyE` | `IyaKR2FqFXU` | +| `_ZNK7WebCore17HTMLScriptElement11crossOriginEv` | `OnRiwSaBWME` | +| `_ZNK7WebCore17HTMLScriptElement5asyncEv` | `fn2e1KifVKM` | +| `_ZNK7WebCore17HTMLSelectElement13selectedIndexEv` | `ay0k5Z39kmA` | +| `_ZNK7WebCore17HTMLSelectElement5valueEv` | `1wLhpGWDFlM` | +| `_ZNK7WebCore17HTMLSelectElement6lengthEv` | `XE18t1sfj-s` | +| `_ZNK7WebCore17HTMLSelectElement9listItemsEv` | `YPE1upd3gRs` | +| `_ZNK7WebCore17JSDOMGlobalObject13worldIsNormalEv` | `mS8j1EcK2tk` | +| `_ZNK7WebCore17JSDOMGlobalObject22scriptExecutionContextEv` | `nW024V4Y0+E` | +| `_ZNK7WebCore17JSHTMLLinkElement7wrappedEv` | `NVosi5pjeYc` | +| `_ZNK7WebCore17MouseRelatedEvent1xEv` | `B+anQG1XI-A` | +| `_ZNK7WebCore17MouseRelatedEvent29locationInRootViewCoordinatesEv` | `jlr-kEPajrA` | +| `_ZNK7WebCore17ParsedContentType9serializeEv` | `eHjmc+fw1jc` | +| `_ZNK7WebCore17RenderTextControl22textFormControlElementEv` | `y59QUpecpOE` | +| `_ZNK7WebCore17ResourceErrorBase12isolatedCopyEv` | `RIXLOUDwuUg` | +| `_ZNK7WebCore17ResourceErrorBase8lazyInitEv` | `TasWJCEWUlI` | +| `_ZNK7WebCore17SMILTimeContainer19animationFrameDelayEv` | `pU9V579IXI8` | +| `_ZNK7WebCore17SubresourceLoader15originalHeadersEv` | `RDGYqqmyHWc` | +| `_ZNK7WebCore17TiledBackingStore13mapToContentsERKNS_7IntRectE` | `dEydpmJiJ+0` | +| `_ZNK7WebCore18CustomHeaderFields22thirdPartyDomainsMatchERKN3WTF3URLE` | `-ivWQ60ptck` | +| `_ZNK7WebCore18DOMWindowExtension5frameEv` | `Xy24q3qh8eQ` | +| `_ZNK7WebCore18HTMLMarqueeElement11scrollDelayEv` | `QT1h9iol+Bk` | +| `_ZNK7WebCore18HTMLMarqueeElement12scrollAmountEv` | `lpZ3yCy11bo` | +| `_ZNK7WebCore18HTMLMarqueeElement4loopEv` | `4TB+JrM5q8I` | +| `_ZNK7WebCore18JSHTMLImageElement7wrappedEv` | `Q4GAFaW6NbQ` | +| `_ZNK7WebCore18JSHTMLInputElement7wrappedEv` | `UnydC8GhZ1Q` | +| `_ZNK7WebCore18JSHTMLMediaElement7wrappedEv` | `GutQ9FSUsSw` | +| `_ZNK7WebCore18JSHTMLVideoElement7wrappedEv` | `7YkI001aHmw` | +| `_ZNK7WebCore18MessagePortChannel31hasAnyMessagesPendingOrInFlightEv` | `F0fNBmtdOgo` | +| `_ZNK7WebCore18ParsedContentRange11headerValueEv` | `MeM0QvOkJUA` | +| `_ZNK7WebCore18PlatformPasteboard10readStringEmRKN3WTF6StringE` | `xT+rhsQNLfw` | +| `_ZNK7WebCore18PlatformPasteboard29typesSafeForDOMToReadAndWriteERKN3WTF6StringE` | `LEoZMfSH6Ls` | +| `_ZNK7WebCore18PlatformTimeRanges13totalDurationEv` | `S7Loz68r3RI` | +| `_ZNK7WebCore18PlatformTimeRanges19maximumBufferedTimeEv` | `oc8HXLVgc6E` | +| `_ZNK7WebCore18PlatformTimeRanges3endEj` | `ODlm57o3SdA` | +| `_ZNK7WebCore18PlatformTimeRanges3endEjRb` | `i9dPKYiYaM0` | +| `_ZNK7WebCore18PlatformTimeRanges4dumpERN3WTF11PrintStreamE` | `PeTaOgXASCo` | +| `_ZNK7WebCore18PlatformTimeRanges4findERKN3WTF9MediaTimeE` | `of6gh97dpGU` | +| `_ZNK7WebCore18PlatformTimeRanges5startEj` | `HRwqg1GDJyQ` | +| `_ZNK7WebCore18PlatformTimeRanges5startEjRb` | `sbTemob+-Zw` | +| `_ZNK7WebCore18PlatformTimeRanges6lengthEv` | `idKmQNHkLSs` | +| `_ZNK7WebCore18PlatformTimeRanges7containERKN3WTF9MediaTimeE` | `rJd1hbDatCY` | +| `_ZNK7WebCore18PlatformTimeRanges7nearestERKN3WTF9MediaTimeE` | `o3SdGbKfEHc` | +| `_ZNK7WebCore18PlatformTimeRanges8durationEj` | `oY9+jelulX0` | +| `_ZNK7WebCore18RenderLayerBacking11contentsBoxEv` | `LPlPRM2ATjE` | +| `_ZNK7WebCore18RenderLayerBacking12tiledBackingEv` | `g7VJwWXQAP0` | +| `_ZNK7WebCore18RenderLayerBacking20compositingLayerTypeEv` | `U3Tnd2vCYRM` | +| `_ZNK7WebCore18RenderLayerBacking26backingStoreMemoryEstimateEv` | `BHutqch9tAQ` | +| `_ZNK7WebCore18SecurityOriginData14securityOriginEv` | `Kz-S-XwSOGA` | +| `_ZNK7WebCore18SecurityOriginData18databaseIdentifierEv` | `z5ob91+BOkA` | +| `_ZNK7WebCore18SecurityOriginData8toStringEv` | `W9VSuYfuzAI` | +| `_ZNK7WebCore18StyleSheetContents21isLoadingSubresourcesEv` | `fKyJdxYdvJI` | +| `_ZNK7WebCore18TextureMapperLayer10hasFiltersEv` | `VLD5cTfiN0o` | +| `_ZNK7WebCore18TextureMapperLayer11shouldBlendEv` | `GamJ8jA0W5A` | +| `_ZNK7WebCore18TextureMapperLayer12drawsContentEv` | `EXRZRH444-o` | +| `_ZNK7WebCore18TextureMapperLayer18contentsAreVisibleEv` | `QpeaElnNU7k` | +| `_ZNK7WebCore18TextureMapperLayer38descendantsOrSelfHaveRunningAnimationsEv` | `caYaUIzCYvM` | +| `_ZNK7WebCore18TextureMapperLayer4sizeEv` | `emD8FbF5skg` | +| `_ZNK7WebCore18TextureMapperLayer7opacityEv` | `sWGGR-emFt0` | +| `_ZNK7WebCore18TextureMapperLayer8childrenEv` | `KxbWXf8o08c` | +| `_ZNK7WebCore18TextureMapperLayer9isVisibleEv` | `W1Y0eBHhb1w` | +| `_ZNK7WebCore18TextureMapperLayer9layerRectEv` | `og6IDmhKqO4` | +| `_ZNK7WebCore18TextureMapperLayer9rootLayerEv` | `KUMJF3eI5qg` | +| `_ZNK7WebCore18TextureMapperLayer9transformEv` | `gj02Pc41dZk` | +| `_ZNK7WebCore19BlurFilterOperation11movesPixelsEv` | `i1KnWrxf1c0` | +| `_ZNK7WebCore19BlurFilterOperation12stdDeviationEv` | `uqTupLakPfA` | +| `_ZNK7WebCore19BlurFilterOperation14affectsOpacityEv` | `JcGel5E1+KU` | +| `_ZNK7WebCore19BlurFilterOperation5cloneEv` | `UFwDzfdUExo` | +| `_ZNK7WebCore19BlurFilterOperationeqERKNS_15FilterOperationE` | `H9RRA3+Ow28` | +| `_ZNK7WebCore19DragCaretController23isContentRichlyEditableEv` | `8zj2LYparBk` | +| `_ZNK7WebCore19DragCaretController30caretRectInRootViewCoordinatesEv` | `JcCWxUGoKF8` | +| `_ZNK7WebCore19DragCaretController40editableElementRectInRootViewCoordinatesEv` | `FZRXp-BlmOI` | +| `_ZNK7WebCore19HTMLOptGroupElement14groupLabelTextEv` | `pwKvaV-T4UI` | +| `_ZNK7WebCore19HTMLOptGroupElement18ownerSelectElementEv` | `wZmGZj5fkwo` | +| `_ZNK7WebCore19HTMLTableRowElement15sectionRowIndexEv` | `trS9Z6W2Avs` | +| `_ZNK7WebCore19HTMLTableRowElement8rowIndexEv` | `ZBbwvge1ZI8` | +| `_ZNK7WebCore19HTMLTextAreaElement12defaultValueEv` | `TVVlqC4KOco` | +| `_ZNK7WebCore19HTMLTextAreaElement5valueEv` | `k-MLK6CAyUQ` | +| `_ZNK7WebCore19InspectorController13drawHighlightERNS_15GraphicsContextE` | `mh-o6enVZ-Y` | +| `_ZNK7WebCore19InspectorController17shouldShowOverlayEv` | `adHqmwiJwXU` | +| `_ZNK7WebCore19JSHTMLSelectElement7wrappedEv` | `taRc5-z61so` | +| `_ZNK7WebCore19MediaElementSession20behaviorRestrictionsEv` | `SC0YIeezXfI` | +| `_ZNK7WebCore19MediaElementSession22allowsPictureInPictureEv` | `DRNmoIUMxyk` | +| `_ZNK7WebCore19ProtectionSpaceBase15isPasswordBasedEv` | `14QqltFJ+xk` | +| `_ZNK7WebCore19ProtectionSpaceBase26receivesCredentialSecurelyEv` | `r5QyX8BvB2c` | +| `_ZNK7WebCore19ProtectionSpaceBase7isProxyEv` | `tHkyOSFwdIc` | +| `_ZNK7WebCore19ResourceRequestBase10httpMethodEv` | `jZRyJ1VcPnA` | +| `_ZNK7WebCore19ResourceRequestBase10httpOriginEv` | `lPNr2mEWUBU` | +| `_ZNK7WebCore19ResourceRequestBase10isSameSiteEv` | `kOKDFcsjZrA` | +| `_ZNK7WebCore19ResourceRequestBase11cachePolicyEv` | `KKNE1wLaEEk` | +| `_ZNK7WebCore19ResourceRequestBase12httpReferrerEv` | `+vdnJZRFUEg` | +| `_ZNK7WebCore19ResourceRequestBase12isolatedCopyEv` | `FnhAa5JKqhE` | +| `_ZNK7WebCore19ResourceRequestBase13httpUserAgentEv` | `ydppzeaHCGY` | +| `_ZNK7WebCore19ResourceRequestBase13isConditionalEv` | `tPMgXN+Gp0w` | +| `_ZNK7WebCore19ResourceRequestBase15httpContentTypeEv` | `igDJIsdI3AA` | +| `_ZNK7WebCore19ResourceRequestBase15httpHeaderFieldENS_14HTTPHeaderNameE` | `lsBWl8HgZSs` | +| `_ZNK7WebCore19ResourceRequestBase15timeoutIntervalEv` | `coeYWTjevFM` | +| `_ZNK7WebCore19ResourceRequestBase16httpHeaderFieldsEv` | `3Yr1O6r-8ms` | +| `_ZNK7WebCore19ResourceRequestBase18hasHTTPHeaderFieldENS_14HTTPHeaderNameE` | `hr4I-u22P2w` | +| `_ZNK7WebCore19ResourceRequestBase20firstPartyForCookiesEv` | `k6hVHTe+PaY` | +| `_ZNK7WebCore19ResourceRequestBase3urlEv` | `rrh3-CBqrZQ` | +| `_ZNK7WebCore19ResourceRequestBase6isNullEv` | `feRK21LbWio` | +| `_ZNK7WebCore19ResourceRequestBase7isEmptyEv` | `ryUXM2DuqT4` | +| `_ZNK7WebCore19ResourceRequestBase8httpBodyEv` | `pLh4waaqW7c` | +| `_ZNK7WebCore19ResourceRequestBase8priorityEv` | `1LiSfUnDEpM` | +| `_ZNK7WebCore19ResourceRequestBase9hasUploadEv` | `9aGME3ZvhCY` | +| `_ZNK7WebCore19ResourceRequestBase9isTopSiteEv` | `IAjYih7HkWE` | +| `_ZNK7WebCore19UIEventWithKeyState16getModifierStateERKN3WTF6StringE` | `QSE-2TsMW0M` | +| `_ZNK7WebCore20CachedResourceLoader11isPreloadedERKN3WTF6StringE` | `27EhhOjbt+4` | +| `_ZNK7WebCore20DeprecatedCSSOMValue12cssValueTypeEv` | `Gu4NynMMIE4` | +| `_ZNK7WebCore20DeprecatedCSSOMValue7cssTextEv` | `X2aGBDIpZDE` | +| `_ZNK7WebCore20FontAttributeChanges10editActionEv` | `ADwmp-WX02I` | +| `_ZNK7WebCore20FontAttributeChanges18createEditingStyleEv` | `H+ED9TvVwUQ` | +| `_ZNK7WebCore20HTMLTableCellElement18rowSpanForBindingsEv` | `Iz8Nn79wHVQ` | +| `_ZNK7WebCore20HTMLTableCellElement5scopeEv` | `doBOzDy5T70` | +| `_ZNK7WebCore20HTMLTableCellElement7colSpanEv` | `0csAf8o+EwQ` | +| `_ZNK7WebCore20HTMLTableCellElement9cellAboveEv` | `o+X-i3Y20j4` | +| `_ZNK7WebCore20HTMLTableCellElement9cellIndexEv` | `yLtMsTWo9zs` | +| `_ZNK7WebCore20ISOOriginalFormatBox10dataFormatEv` | `OzsnvV0TdHA` | +| `_ZNK7WebCore20LowPowerModeNotifier21isLowPowerModeEnabledEv` | `mkMdmnmWONA` | +| `_ZNK7WebCore20PasteboardCustomData18createSharedBufferEv` | `oNgcYv7sg2E` | +| `_ZNK7WebCore20PasteboardWriterData7isEmptyEv` | `pCjXnlN6R4c` | +| `_ZNK7WebCore20RenderBoxModelObject18inlineContinuationEv` | `nV9al8rbOKg` | +| `_ZNK7WebCore20ResourceResponseBase11httpVersionEv` | `qJpr45shtzs` | +| `_ZNK7WebCore20ResourceResponseBase12isAttachmentEv` | `C+morSMfP84` | +| `_ZNK7WebCore20ResourceResponseBase12isSuccessfulEv` | `3a6B43jFjX8` | +| `_ZNK7WebCore20ResourceResponseBase13isRedirectionEv` | `BrSesfxNNvs` | +| `_ZNK7WebCore20ResourceResponseBase14httpStatusCodeEv` | `bFhYDNofRSE` | +| `_ZNK7WebCore20ResourceResponseBase14httpStatusTextEv` | `MYd7F5R6ryw` | +| `_ZNK7WebCore20ResourceResponseBase14isInHTTPFamilyEv` | `wW+Pyy9LiGA` | +| `_ZNK7WebCore20ResourceResponseBase15httpHeaderFieldENS_14HTTPHeaderNameE` | `JkEYUFSjoXw` | +| `_ZNK7WebCore20ResourceResponseBase16httpHeaderFieldsEv` | `cots5mYtZpo` | +| `_ZNK7WebCore20ResourceResponseBase16textEncodingNameEv` | `wTRdXzKM3u4` | +| `_ZNK7WebCore20ResourceResponseBase17suggestedFilenameEv` | `fBVtigUQ-qk` | +| `_ZNK7WebCore20ResourceResponseBase21expectedContentLengthEv` | `i4zxQPHkqJs` | +| `_ZNK7WebCore20ResourceResponseBase23hasCacheValidatorFieldsEv` | `qAv1-ceZ9iQ` | +| `_ZNK7WebCore20ResourceResponseBase24isAttachmentWithFilenameEv` | `ClZ8vxvE28U` | +| `_ZNK7WebCore20ResourceResponseBase27cacheControlContainsNoCacheEv` | `bTMmuXgrk-4` | +| `_ZNK7WebCore20ResourceResponseBase27cacheControlContainsNoStoreEv` | `CchgKVep+h8` | +| `_ZNK7WebCore20ResourceResponseBase29cacheControlContainsImmutableEv` | `OKrc5AyAqtM` | +| `_ZNK7WebCore20ResourceResponseBase34cacheControlContainsMustRevalidateEv` | `8956F1voabk` | +| `_ZNK7WebCore20ResourceResponseBase3urlEv` | `VljXeIAPJoA` | +| `_ZNK7WebCore20ResourceResponseBase6sourceEv` | `Nc4OHQvmIOM` | +| `_ZNK7WebCore20ResourceResponseBase8isHTTP09Ev` | `JjPx6bo9fbs` | +| `_ZNK7WebCore20ResourceResponseBase8lazyInitENS0_9InitLevelE` | `o+TiqWzvS8s` | +| `_ZNK7WebCore20ResourceResponseBase8mimeTypeEv` | `HDR9zkTEoJ4` | +| `_ZNK7WebCore20ScrollingCoordinator25scrollableContainerNodeIDERKNS_12RenderObjectE` | `DVeoAh0xG6w` | +| `_ZNK7WebCore20ScrollingCoordinator36coordinatesScrollingForOverflowLayerERKNS_11RenderLayerE` | `1nxJkpm8wLA` | +| `_ZNK7WebCore21BackForwardController12forwardCountEv` | `wmkk8v-vEI0` | +| `_ZNK7WebCore21BackForwardController18canGoBackOrForwardEi` | `No2407W5Jes` | +| `_ZNK7WebCore21BackForwardController9backCountEv` | `AZ+JE981Lgg` | +| `_ZNK7WebCore21ContentSecurityPolicy15responseHeadersEv` | `g0McDMiyiN8` | +| `_ZNK7WebCore21ContentSecurityPolicy22overridesXFrameOptionsEv` | `qvPRZI8SUG4` | +| `_ZNK7WebCore21ContentSecurityPolicy30upgradeInsecureRequestIfNeededERN3WTF3URLENS0_19InsecureRequestTypeE` | `FLT8j7VcOko` | +| `_ZNK7WebCore21ContentSecurityPolicy30upgradeInsecureRequestIfNeededERNS_15ResourceRequestENS0_19InsecureRequestTypeE` | `f+J50jd6woI` | +| `_ZNK7WebCore21HTMLFrameOwnerElement13contentWindowEv` | `o7uKGbtAGs0` | +| `_ZNK7WebCore21HTMLFrameOwnerElement15contentDocumentEv` | `7ZxRBz8a270` | +| `_ZNK7WebCore21HTMLOptionsCollection13selectedIndexEv` | `ls8GrkE8nr8` | +| `_ZNK7WebCore21ISOTrackEncryptionBox10defaultKIDEv` | `yBSbIidwuO0` | +| `_ZNK7WebCore21ISOTrackEncryptionBox17defaultConstantIVEv` | `JqeGWVkKzPY` | +| `_ZNK7WebCore21ISOTrackEncryptionBox18defaultIsProtectedEv` | `5D2GzAMcjL4` | +| `_ZNK7WebCore21ISOTrackEncryptionBox22defaultPerSampleIVSizeEv` | `qtSwAppE7YY` | +| `_ZNK7WebCore21JSRemoteDOMWindowBase7wrappedEv` | `djNJb4glilI` | +| `_ZNK7WebCore21JSTextTrackCueGeneric7wrappedEv` | `C3Xnff4rgk4` | +| `_ZNK7WebCore21NetworkStorageSession10hasCookiesERKNS_17RegistrableDomainEON3WTF17CompletionHandlerIFvbEEE` | `PuQVBIh7Djw` | +| `_ZNK7WebCore21NetworkStorageSession18cookieAcceptPolicyEv` | `NG5BY8rlbLw` | +| `_ZNK7WebCore21NetworkStorageSession26getAllStorageAccessEntriesEv` | `DazasauPTPE` | +| `_ZNK7WebCore21NetworkStorageSession28shouldBlockThirdPartyCookiesERKNS_17RegistrableDomainE` | `3DJJcxlaGok` | +| `_ZNK7WebCore21NetworkStorageSession33hasHadUserInteractionAsFirstPartyERKNS_17RegistrableDomainE` | `RzkzW7iyGFI` | +| `_ZNK7WebCore21NetworkStorageSession55shouldBlockThirdPartyCookiesButKeepFirstPartyCookiesForERKNS_17RegistrableDomainE` | `36Qn7igYkTQ` | +| `_ZNK7WebCore21PageOverlayController20viewOverlayRootLayerEv` | `8Why0SPsQa0` | +| `_ZNK7WebCore21PageOverlayController24documentOverlayRootLayerEv` | `WQ6AFryD-OM` | +| `_ZNK7WebCore21RenderLayerCompositor15rootRenderLayerEv` | `oYipfXRE1HQ` | +| `_ZNK7WebCore21WheelEventDeltaFilter13filteredDeltaEv` | `XOHmQ9KpwxA` | +| `_ZNK7WebCore21WheelEventDeltaFilter16filteredVelocityEv` | `uoDJDAlVmgs` | +| `_ZNK7WebCore22DefaultFilterOperation15representedTypeEv` | `ksB78CcT0mg` | +| `_ZNK7WebCore22DefaultFilterOperation5cloneEv` | `mx1YlEp90mU` | +| `_ZNK7WebCore22DefaultFilterOperationeqERKNS_15FilterOperationE` | `EWVFpBhoEGg` | +| `_ZNK7WebCore22EmptyFrameLoaderClient10hasWebViewEv` | `gv8bC38U34E` | +| `_ZNK7WebCore22EmptyFrameLoaderClient12blockedErrorERKNS_15ResourceRequestE` | `X1bFhjwBxXU` | +| `_ZNK7WebCore22EmptyFrameLoaderClient12canCachePageEv` | `1YFXTueqrU8` | +| `_ZNK7WebCore22EmptyFrameLoaderClient14cancelledErrorERKNS_15ResourceRequestE` | `BywqS3Q8szU` | +| `_ZNK7WebCore22EmptyFrameLoaderClient14shouldFallBackERKNS_13ResourceErrorE` | `v0GvL1SMt8M` | +| `_ZNK7WebCore22EmptyFrameLoaderClient15canShowMIMETypeERKN3WTF6StringE` | `JZQPxcMK+ZA` | +| `_ZNK7WebCore22EmptyFrameLoaderClient16canHandleRequestERKNS_15ResourceRequestE` | `glKx1Zdz50w` | +| `_ZNK7WebCore22EmptyFrameLoaderClient17overrideMediaTypeEv` | `bh4bKfeivgQ` | +| `_ZNK7WebCore22EmptyFrameLoaderClient18cannotShowURLErrorERKNS_15ResourceRequestE` | `Hn+oQHUrE1M` | +| `_ZNK7WebCore22EmptyFrameLoaderClient21canShowMIMETypeAsHTMLERKN3WTF6StringE` | `75fdGWpRw34` | +| `_ZNK7WebCore22EmptyFrameLoaderClient21fileDoesNotExistErrorERKNS_16ResourceResponseE` | `fajGVxixYQg` | +| `_ZNK7WebCore22EmptyFrameLoaderClient21shouldGoToHistoryItemERNS_11HistoryItemE` | `s+Gety9ZDs4` | +| `_ZNK7WebCore22EmptyFrameLoaderClient23cannotShowMIMETypeErrorERKNS_16ResourceResponseE` | `ab+5Dimx0Kw` | +| `_ZNK7WebCore22EmptyFrameLoaderClient24isEmptyFrameLoaderClientEv` | `VVzGt0RzJZc` | +| `_ZNK7WebCore22EmptyFrameLoaderClient25pluginWillHandleLoadErrorERKNS_16ResourceResponseE` | `mGriYqpliqc` | +| `_ZNK7WebCore22EmptyFrameLoaderClient28blockedByContentBlockerErrorERKNS_15ResourceRequestE` | `0d9jr6TzI-o` | +| `_ZNK7WebCore22EmptyFrameLoaderClient31interruptedForPolicyChangeErrorERKNS_15ResourceRequestE` | `tRdCmMXTagg` | +| `_ZNK7WebCore22EmptyFrameLoaderClient9userAgentERKN3WTF3URLE` | `ppuI25hXypA` | +| `_ZNK7WebCore22HTMLFormControlElement10formActionEv` | `C4qe0TvWEKQ` | +| `_ZNK7WebCore22HTMLFormControlElement10formMethodEv` | `9hSchU+U-8w` | +| `_ZNK7WebCore22HTMLFormControlElement11formEnctypeEv` | `Ap1qJIX6ZgU` | +| `_ZNK7WebCore22HTMLFormControlElement12autocompleteEv` | `nZj1LlF55Uo` | +| `_ZNK7WebCore22HTMLFormControlElement12autofillDataEv` | `fiVzPKkPWZU` | +| `_ZNK7WebCore22ResourceLoadStatistics6encodeERNS_12KeyedEncoderE` | `eFrm70bYHn0` | +| `_ZNK7WebCore22ResourceLoadStatistics8toStringEv` | `Vffv7VcV358` | +| `_ZNK7WebCore22ScriptExecutionContext23domainForCachePartitionEv` | `6S2fV6tfkuM` | +| `_ZNK7WebCore23ApplicationCacheStorage11maximumSizeEv` | `1xCI3sEgjhk` | +| `_ZNK7WebCore23FrameLoaderStateMachine15firstLayoutDoneEv` | `YAoMMSxEIkE` | +| `_ZNK7WebCore23FrameLoaderStateMachine23committingFirstRealLoadEv` | `mUNgfT4aGQs` | +| `_ZNK7WebCore23FrameLoaderStateMachine28creatingInitialEmptyDocumentEv` | `1Zy6+G3PD0M` | +| `_ZNK7WebCore23FrameLoaderStateMachine32isDisplayingInitialEmptyDocumentEv` | `CeSQvxUUIYs` | +| `_ZNK7WebCore23ISOSchemeInformationBox18schemeSpecificDataEv` | `-7d2AWzYgDw` | +| `_ZNK7WebCore24CachedResourceHandleBase3getEv` | `1yNctDJdXNM` | +| `_ZNK7WebCore24CachedResourceHandleBasecvMS0_PNS_14CachedResourceEEv` | `uTd181B3Y58` | +| `_ZNK7WebCore24CachedResourceHandleBasentEv` | `LwiybUx9yTw` | +| `_ZNK7WebCore24CoordinatedGraphicsLayer13platformLayerEv` | `Q8-xUM+RO48` | +| `_ZNK7WebCore24CoordinatedGraphicsLayer14primaryLayerIDEv` | `xikhaDNOD-8` | +| `_ZNK7WebCore24CoordinatedGraphicsLayer16compositionLayerEv` | `eW2LN4E7Zh8` | +| `_ZNK7WebCore24CoordinatedGraphicsLayer17usesContentsLayerEv` | `pf2fwfamoG0` | +| `_ZNK7WebCore24CoordinatedGraphicsLayer22filtersCanBeCompositedERKNS_16FilterOperationsE` | `deY8cQlIt9U` | +| `_ZNK7WebCore24CoordinatedGraphicsLayer22shouldHaveBackingStoreEv` | `osZckBsVgRg` | +| `_ZNK7WebCore24CoordinatedGraphicsLayer26isCoordinatedGraphicsLayerEv` | `Ex6z08qINEI` | +| `_ZNK7WebCore24CoordinatedGraphicsLayer28shouldDirectlyCompositeImageEPNS_5ImageE` | `RUB6zNhQUJQ` | +| `_ZNK7WebCore24CoordinatedGraphicsLayer2idEv` | `NQvgMXcGmjs` | +| `_ZNK7WebCore24CoordinatedGraphicsLayer41selfOrAncestorHasActiveTransformAnimationEv` | `8reqGK4Jslw` | +| `_ZNK7WebCore25DropShadowFilterOperation11movesPixelsEv` | `oDR18NZmOgg` | +| `_ZNK7WebCore25DropShadowFilterOperation12stdDeviationEv` | `Zwz6pQRbIaI` | +| `_ZNK7WebCore25DropShadowFilterOperation14affectsOpacityEv` | `y7uxQXIITME` | +| `_ZNK7WebCore25DropShadowFilterOperation1xEv` | `ACFqSfIdK+4` | +| `_ZNK7WebCore25DropShadowFilterOperation1yEv` | `dSXGljvWG7Q` | +| `_ZNK7WebCore25DropShadowFilterOperation5cloneEv` | `lrKNEr+8Ilk` | +| `_ZNK7WebCore25DropShadowFilterOperation5colorEv` | `qFXamgC8dMU` | +| `_ZNK7WebCore25DropShadowFilterOperation8locationEv` | `s-v6QLCddRE` | +| `_ZNK7WebCore25DropShadowFilterOperationeqERKNS_15FilterOperationE` | `oPnneTu2bro` | +| `_ZNK7WebCore26HTMLTextFormControlElement12selectionEndEv` | `BIelQlNTFGc` | +| `_ZNK7WebCore26HTMLTextFormControlElement14selectionStartEv` | `5Xn4Ygw7nlE` | +| `_ZNK7WebCore26HTMLTextFormControlElement18selectionDirectionEv` | `9KLjPjbLuLY` | +| `_ZNK7WebCore26HTMLTextFormControlElement21lastChangeWasUserEditEv` | `WDXCvc2O4hU` | +| `_ZNK7WebCore26HTMLTextFormControlElement23visiblePositionForIndexEi` | `JbLS-O2Uyr0` | +| `_ZNK7WebCore26HTMLTextFormControlElement26isInnerTextElementEditableEv` | `8F-6OAVX8Ao` | +| `_ZNK7WebCore26ISOProtectionSchemeInfoBox13schemeTypeBoxEv` | `nu-YBQYFZ98` | +| `_ZNK7WebCore26ISOProtectionSchemeInfoBox17originalFormatBoxEv` | `IyvtvpZPpPg` | +| `_ZNK7WebCore26ISOProtectionSchemeInfoBox20schemeInformationBoxEv` | `IaNsGTooh7A` | +| `_ZNK7WebCore26NetscapePlugInStreamLoader6isDoneEv` | `18oHpHPSHnY` | +| `_ZNK7WebCore27AuthenticationChallengeBase15failureResponseEv` | `n8Pye6iV5Fk` | +| `_ZNK7WebCore27AuthenticationChallengeBase15protectionSpaceEv` | `M+ApfvAXtGM` | +| `_ZNK7WebCore27AuthenticationChallengeBase18proposedCredentialEv` | `1SNozVB6JHU` | +| `_ZNK7WebCore27AuthenticationChallengeBase20previousFailureCountEv` | `D6whRx5uJjA` | +| `_ZNK7WebCore27AuthenticationChallengeBase5errorEv` | `feaB+bz3g60` | +| `_ZNK7WebCore27AuthenticationChallengeBase6isNullEv` | `mxh32RfHg5Y` | +| `_ZNK7WebCore27ScriptedAnimationController17throttlingReasonsEv` | `V0EEd3DZsj8` | +| `_ZNK7WebCore27ScriptedAnimationController8intervalEv` | `WsEitd57LfE` | +| `_ZNK7WebCore28InspectorFrontendClientLocal13inspectedPageEv` | `jI-FEg4JO+M` | +| `_ZNK7WebCore28InspectorFrontendClientLocal15inspectionLevelEv` | `pE7esinD1MQ` | +| `_ZNK7WebCore28InspectorFrontendClientLocal28userInterfaceLayoutDirectionEv` | `d20WUyyiSr8` | +| `_ZNK7WebCore29DeprecatedCSSOMPrimitiveValue12getRectValueEv` | `ja0ysg7RR10` | +| `_ZNK7WebCore29DeprecatedCSSOMPrimitiveValue13getFloatValueEt` | `A8qBzXjvXvg` | +| `_ZNK7WebCore29DeprecatedCSSOMPrimitiveValue13primitiveTypeEv` | `f3CpiiwbKas` | +| `_ZNK7WebCore29DeprecatedCSSOMPrimitiveValue14getStringValueEv` | `j-NhaWA0Xgk` | +| `_ZNK7WebCore29DeprecatedCSSOMPrimitiveValue15getCounterValueEv` | `hPZqFseD4ro` | +| `_ZNK7WebCore29DeprecatedCSSOMPrimitiveValue16getRGBColorValueEv` | `F9xskYej0KY` | +| `_ZNK7WebCore30InvertLightnessFilterOperation5cloneEv` | `kZU3yHbsYWs` | +| `_ZNK7WebCore30InvertLightnessFilterOperationeqERKNS_15FilterOperationE` | `Q3q-Iqk-Sqg` | +| `_ZNK7WebCore31BasicColorMatrixFilterOperation17passthroughAmountEv` | `klmI66i8Ok8` | +| `_ZNK7WebCore31BasicColorMatrixFilterOperation5cloneEv` | `PKGMqoQ2uCc` | +| `_ZNK7WebCore31BasicColorMatrixFilterOperation6amountEv` | `2hxunnGMnBU` | +| `_ZNK7WebCore31BasicColorMatrixFilterOperationeqERKNS_15FilterOperationE` | `DxGwDArtbAo` | +| `_ZNK7WebCore31SimplifiedBackwardsTextIterator5rangeEv` | `izfIZqB40b4` | +| `_ZNK7WebCore32FixedPositionViewportConstraints28layerPositionForViewportRectERKNS_9FloatRectE` | `BEErbU1FwoI` | +| `_ZNK7WebCore33StickyPositionViewportConstraints32layerPositionForConstrainingRectERKNS_9FloatRectE` | `RjbmUrQcU28` | +| `_ZNK7WebCore36ISOProtectionSystemSpecificHeaderBox4dataEv` | `xpYOrYjAoUc` | +| `_ZNK7WebCore36ISOProtectionSystemSpecificHeaderBox6keyIDsEv` | `xpSP40U+pqc` | +| `_ZNK7WebCore36ISOProtectionSystemSpecificHeaderBox8systemIDEv` | `Gi7XC+1X+8o` | +| `_ZNK7WebCore37BasicComponentTransferFilterOperation14affectsOpacityEv` | `liqE096ThEk` | +| `_ZNK7WebCore37BasicComponentTransferFilterOperation17passthroughAmountEv` | `qWGMU2q898I` | +| `_ZNK7WebCore37BasicComponentTransferFilterOperation5cloneEv` | `w0KIjnDwdP4` | +| `_ZNK7WebCore37BasicComponentTransferFilterOperation6amountEv` | `2POQ965uUbU` | +| `_ZNK7WebCore37BasicComponentTransferFilterOperationeqERKNS_15FilterOperationE` | `O8S9GxUH2Eo` | +| `_ZNK7WebCore37CrossOriginAccessControlCheckDisabler36crossOriginAccessControlCheckEnabledEv` | `PPFaXycu-Ek` | +| `_ZNK7WebCore4Attr5valueEv` | `MTaAdeZUa8U` | +| `_ZNK7WebCore4Blob4sizeEv` | `1RhlQHv339E` | +| `_ZNK7WebCore4File12lastModifiedEv` | `Ewg+pBX78M8` | +| `_ZNK7WebCore4Node10shadowHostEv` | `t-lgJRT2GeA` | +| `_ZNK7WebCore4Node11isEqualNodeEPS0_` | `H9hFHYFmT6A` | +| `_ZNK7WebCore4Node11textContentEb` | `XdvNKwJ7h50` | +| `_ZNK7WebCore4Node12lookupPrefixERKN3WTF10AtomStringE` | `jBm03rIbPXw` | +| `_ZNK7WebCore4Node13ownerDocumentEv` | `z2YMNmnyqa0` | +| `_ZNK7WebCore4Node14isDescendantOfERKS0_` | `vWbEQjE5O9g` | +| `_ZNK7WebCore4Node16computeNodeIndexEv` | `bYKYwPaS8Hw` | +| `_ZNK7WebCore4Node18computeEditabilityENS0_22UserSelectAllTreatmentENS0_17ShouldUpdateStyleE` | `UPjyTBi78ow` | +| `_ZNK7WebCore4Node18isDefaultNamespaceERKN3WTF10AtomStringE` | `TFaZLdYPbls` | +| `_ZNK7WebCore4Node18lookupNamespaceURIERKN3WTF10AtomStringE` | `w61Pg+jLO8I` | +| `_ZNK7WebCore4Node18nextElementSiblingEv` | `AK1Vjnd7Yuk` | +| `_ZNK7WebCore4Node19rootEditableElementEv` | `UX0nfjo7ACw` | +| `_ZNK7WebCore4Node21isRootEditableElementEv` | `o9hlqKNXyww` | +| `_ZNK7WebCore4Node22previousElementSiblingEv` | `Fg7DTuZhN2U` | +| `_ZNK7WebCore4Node26containsIncludingShadowDOMEPKS0_` | `gdWx1H0BU3k` | +| `_ZNK7WebCore4Node7baseURIEv` | `IoGwVQHItWY` | +| `_ZNK7WebCore4Node9renderBoxEv` | `z1-BWq3Vxa4` | +| `_ZNK7WebCore4Page15forEachDocumentERKN3WTF8FunctionIFvRNS_8DocumentEEEE` | `7t3lPIaxzws` | +| `_ZNK7WebCore4Page15visibilityStateEv` | `9QZluZ4dNDY` | +| `_ZNK7WebCore4Page16hasSeenAnyPluginEv` | `5HR+YnAQc14` | +| `_ZNK7WebCore4Page17useDarkAppearanceEv` | `K3n-MX0qBKg` | +| `_ZNK7WebCore4Page17viewportArgumentsEv` | `5Q9eXxWwvAg` | +| `_ZNK7WebCore4Page19disabledAdaptationsEv` | `ilM1cSlkdrg` | +| `_ZNK7WebCore4Page20renderingUpdateCountEv` | `MjKAjGkB7Mk` | +| `_ZNK7WebCore4Page21wheelEventTestMonitorEv` | `xtB+gqdTSZc` | +| `_ZNK7WebCore4Page22editableElementsInRectERKNS_9FloatRectE` | `jIrXMDNIgFY` | +| `_ZNK7WebCore4Page23diagnosticLoggingClientEv` | `MyZwPRUnPDg` | +| `_ZNK7WebCore4Page23isMonitoringWheelEventsEv` | `Akm3oZiReFc` | +| `_ZNK7WebCore4Page27pageExtendedBackgroundColorEv` | `EJbXsBT7uts` | +| `_ZNK7WebCore4Page28remoteInspectionNameOverrideEv` | `6tg0fDb-1CI` | +| `_ZNK7WebCore4Page34inLowQualityImageInterpolationModeEv` | `FUxAKQOPLHU` | +| `_ZNK7WebCore4Page9groupNameEv` | `HIrgQNzR7JU` | +| `_ZNK7WebCore4Page9pageCountEv` | `7liQqSHn5fc` | +| `_ZNK7WebCore4Page9selectionEv` | `Ot1iqePgqhc` | +| `_ZNK7WebCore4Page9sessionIDEv` | `DCC67J1Y-Qg` | +| `_ZNK7WebCore4Path16fastBoundingRectEv` | `deHBNJOPqkQ` | +| `_ZNK7WebCore4Text9wholeTextEv` | `M8mhZ0K1zNE` | +| `_ZNK7WebCore5Range10cloneRangeEv` | `vh9S93S1eCM` | +| `_ZNK7WebCore5Range11compareNodeERNS_4NodeE` | `HxT+avGg5Os` | +| `_ZNK7WebCore5Range12comparePointERNS_4NodeEj` | `f5B2kxRIerw` | +| `_ZNK7WebCore5Range14intersectsNodeERNS_4NodeE` | `XmdBAiAQqK8` | +| `_ZNK7WebCore5Range8toStringEv` | `OZpARF+Fvsw` | +| `_ZNK7WebCore6Chrome10windowRectEv` | `CnoiK3ePTEA` | +| `_ZNK7WebCore6Cookie4hashEv` | `skipUpdQW1w` | +| `_ZNK7WebCore6CookieeqERKS0_` | `1FST2EMhfHk` | +| `_ZNK7WebCore6Cursor14platformCursorEv` | `f7bWbfWnclc` | +| `_ZNK7WebCore6Cursor19setAsPlatformCursorEv` | `wewK46-v8RA` | +| `_ZNK7WebCore6Editor11textCheckerEv` | `AnNQFsvufuc` | +| `_ZNK7WebCore6Editor12selectedTextEv` | `Jbc3ZPBpEx4` | +| `_ZNK7WebCore6Editor13canEditRichlyEv` | `yUjzhXw23N0` | +| `_ZNK7WebCore6Editor16hasBidiSelectionEv` | `7YNtGn8Fecw` | +| `_ZNK7WebCore6Editor17firstRectForRangeERKNS_11SimpleRangeE` | `iqS3bVfzFk4` | +| `_ZNK7WebCore6Editor17selectionHasStyleENS_13CSSPropertyIDERKN3WTF6StringE` | `ca9NTixtg94` | +| `_ZNK7WebCore6Editor23getCompositionSelectionERjS1_` | `69-JXZw10I4` | +| `_ZNK7WebCore6Editor25stringForCandidateRequestEv` | `Bxni4gpqvRE` | +| `_ZNK7WebCore6Editor26selectionStartHasMarkerForENS_14DocumentMarker10MarkerTypeEii` | `6xesGyeWJfQ` | +| `_ZNK7WebCore6Editor30applyEditingStyleToBodyElementEv` | `HM5P36b7Ldo` | +| `_ZNK7WebCore6Editor32isContinuousSpellCheckingEnabledEv` | `i4eu6D3sU+s` | +| `_ZNK7WebCore6Editor37baseWritingDirectionForSelectionStartEv` | `gQe-+kFX0j8` | +| `_ZNK7WebCore6Editor6canCutEv` | `7xR6RTQA3YQ` | +| `_ZNK7WebCore6Editor6clientEv` | `m8h5wdC8xOw` | +| `_ZNK7WebCore6Editor7Command11isSupportedEv` | `qB2iptxCJXY` | +| `_ZNK7WebCore6Editor7Command15isTextInsertionEv` | `zpyebY9tjPM` | +| `_ZNK7WebCore6Editor7Command26allowExecutionWhenDisabledEv` | `tvqMmuD-7pA` | +| `_ZNK7WebCore6Editor7Command5stateEPNS_5EventE` | `Vx97KCUtnBo` | +| `_ZNK7WebCore6Editor7Command7executeEPNS_5EventE` | `yv-2j-rlxIA` | +| `_ZNK7WebCore6Editor7Command7executeERKN3WTF6StringEPNS_5EventE` | `WhgyN04dHCk` | +| `_ZNK7WebCore6Editor7Command9isEnabledEPNS_5EventE` | `n09JRKQpbrw` | +| `_ZNK7WebCore6Editor7canCopyEv` | `lQQ-nJpCyqU` | +| `_ZNK7WebCore6Editor7canEditEv` | `dpcMJMWSBkg` | +| `_ZNK7WebCore6Editor9canDeleteEv` | `Rsrf1HN3218` | +| `_ZNK7WebCore6JSFile7wrappedEv` | `-e4BbPwQWfk` | +| `_ZNK7WebCore6JSNode21pushEventHandlerScopeEPN3JSC14JSGlobalObjectEPNS1_7JSScopeE` | `S8rXFsBP23Q` | +| `_ZNK7WebCore6JSNode7wrappedEv` | `1F1hzq+jsgw` | +| `_ZNK7WebCore6JSNode8nodeTypeERN3JSC14JSGlobalObjectE` | `e9NdD5ijfyA` | +| `_ZNK7WebCore6Length3refEv` | `8OHZsn1lLv0` | +| `_ZNK7WebCore6Length5derefEv` | `CKQm3LRNxFQ` | +| `_ZNK7WebCore6Path2D4pathEv` | `Z-n9eCkcABY` | +| `_ZNK7WebCore6Quirks25needsYouTubeMouseOutQuirkEv` | `SLSp+Z+-W9Y` | +| `_ZNK7WebCore6Quirks29shouldAvoidUsingIOS13ForGmailEv` | `86JgtVBApTw` | +| `_ZNK7WebCore6Quirks32isNeverRichlyEditableForTouchBarEv` | `ABPW-f1l6DA` | +| `_ZNK7WebCore6Quirks44shouldAvoidResizingWhenInputViewBoundsChangeEv` | `zPWH7YflRh4` | +| `_ZNK7WebCore6Quirks47shouldIgnoreContentObservationForSyntheticClickEb` | `7MeYabjRcQo` | +| `_ZNK7WebCore6Quirks49isTouchBarUpdateSupressedForHiddenContentEditableEv` | `YFqTNZQwPwM` | +| `_ZNK7WebCore6Quirks50shouldIgnoreAriaForFastPathContentObservationCheckEv` | `sJVPrwAjvos` | +| `_ZNK7WebCore6Quirks56shouldDispatchSyntheticMouseEventsWhenModifyingSelectionEv` | `G3FORkp2ePs` | +| `_ZNK7WebCore6Quirks61shouldUseLegacySelectPopoverDismissalBehaviorInDataActivationEv` | `M97BIVb8Vs8` | +| `_ZNK7WebCore6Quirks62shouldLayOutAtMinimumWindowWidthWhenIgnoringScalingConstraintsEv` | `9tvPjSs-M-o` | +| `_ZNK7WebCore6Region10intersectsERKS0_` | `1dDqFMD4gVY` | +| `_ZNK7WebCore6Region5rectsEv` | `nRsq6ZWfSgU` | +| `_ZNK7WebCore6Region8containsERKNS_8IntPointE` | `SU7Tu7C4TYs` | +| `_ZNK7WebCore6Region8containsERKS0_` | `xjBjT+qFC5Q` | +| `_ZNK7WebCore6Region9totalAreaEv` | `6HSff9awO94` | +| `_ZNK7WebCore6Widget14platformWidgetEv` | `n+LcSnkfUvw` | +| `_ZNK7WebCore6Widget17convertToRootViewERKNS_7IntRectE` | `L0hTvNW1JUo` | +| `_ZNK7WebCore6Widget23convertToContainingViewERKNS_10FloatPointE` | `8JrILsiO4Ik` | +| `_ZNK7WebCore6Widget23convertToContainingViewERKNS_7IntRectE` | `IsUM7dDdAaQ` | +| `_ZNK7WebCore6Widget23convertToContainingViewERKNS_8IntPointE` | `PWaO8OLOqvE` | +| `_ZNK7WebCore6Widget23convertToContainingViewERKNS_9FloatRectE` | `2k5ECGBBVc4` | +| `_ZNK7WebCore6Widget25convertFromContainingViewERKNS_10FloatPointE` | `qlKTLH4tj-I` | +| `_ZNK7WebCore6Widget25convertFromContainingViewERKNS_7IntRectE` | `YRfnGuAB5gw` | +| `_ZNK7WebCore6Widget25convertFromContainingViewERKNS_9FloatRectE` | `QPOc37Cy-oU` | +| `_ZNK7WebCore6Widget25convertToContainingWindowERKNS_7IntRectE` | `DAvBs8LZWDM` | +| `_ZNK7WebCore6Widget25convertToContainingWindowERKNS_8IntPointE` | `jIh0oWzlkf8` | +| `_ZNK7WebCore6Widget6parentEv` | `ZRfyTwW-Xx8` | +| `_ZNK7WebCore6Widget9frameRectEv` | `p8dGWrY3d1s` | +| `_ZNK7WebCore7Element10attributesEv` | `qmL9I2PfTtI` | +| `_ZNK7WebCore7Element10screenRectEv` | `7bQhjofI9Hk` | +| `_ZNK7WebCore7Element12getAttributeERKN3WTF10AtomStringE` | `a8rk9qLBEXc` | +| `_ZNK7WebCore7Element12getAttributeERKNS_13QualifiedNameE` | `IyizMqqpWnY` | +| `_ZNK7WebCore7Element12hasAttributeERKN3WTF10AtomStringE` | `Qu4OtBMIDpU` | +| `_ZNK7WebCore7Element12hasAttributeERKNS_13QualifiedNameE` | `1nK3z-539Sw` | +| `_ZNK7WebCore7Element13hasAttributesEv` | `lV71GenMZQM` | +| `_ZNK7WebCore7Element14getAttributeNSERKN3WTF10AtomStringES4_` | `lZFjwMoscvA` | +| `_ZNK7WebCore7Element14hasAttributeNSERKN3WTF10AtomStringES4_` | `Raa-kQ7942Q` | +| `_ZNK7WebCore7Element15absoluteLinkURLEv` | `EtO3z7ToC6Y` | +| `_ZNK7WebCore7Element15getURLAttributeERKNS_13QualifiedNameE` | `BBQurH6VtfA` | +| `_ZNK7WebCore7Element18afterPseudoElementEv` | `0mSwGG8QhX4` | +| `_ZNK7WebCore7Element19beforePseudoElementEv` | `ZgKTOshxDEw` | +| `_ZNK7WebCore7Element20getIntegralAttributeERKNS_13QualifiedNameE` | `qOGZyzFCrzI` | +| `_ZNK7WebCore7Element28getUnsignedIntegralAttributeERKNS_13QualifiedNameE` | `ssNlwZtVGgY` | +| `_ZNK7WebCore7Element9innerHTMLEv` | `7h1gxkWw9Ec` | +| `_ZNK7WebCore7Element9outerHTMLEv` | `lDt1EAkv2fc` | +| `_ZNK7WebCore8DOMTimer24intervalClampedToMinimumEv` | `vYz7gkTnLis` | +| `_ZNK7WebCore8Document10alinkColorEv` | `uN9iGVRcQNI` | +| `_ZNK7WebCore8Document10compatModeEv` | `BkmXm7XvXJI` | +| `_ZNK7WebCore8Document10designModeEv` | `-OWrx4Cio+M` | +| `_ZNK7WebCore8Document10vlinkColorEv` | `gTDwXA62D5Y` | +| `_ZNK7WebCore8Document11completeURLERKN3WTF6StringENS_22ScriptExecutionContext9ForceUTF8E` | `8d3OO75O9R4` | +| `_ZNK7WebCore8Document11contentTypeEv` | `Z7tv-rPsB1A` | +| `_ZNK7WebCore8Document11topDocumentEv` | `CpnNC74lyvk` | +| `_ZNK7WebCore8Document11windowProxyEv` | `Kz9qqimlh48` | +| `_ZNK7WebCore8Document12lastModifiedEv` | `PLIkDz0bOeI` | +| `_ZNK7WebCore8Document13axObjectCacheEv` | `pfrX1wK6Pn4` | +| `_ZNK7WebCore8Document14bodyOrFramesetEv` | `MD4QBE77KXY` | +| `_ZNK7WebCore8Document15visibilityStateEv` | `2QZ6i6cRmI4` | +| `_ZNK7WebCore8Document16styleRecalcCountEv` | `TWsueeM6bWo` | +| `_ZNK7WebCore8Document17useDarkAppearanceEPKNS_11RenderStyleE` | `iHtlQT13Zwo` | +| `_ZNK7WebCore8Document17viewportArgumentsEv` | `rBSF8DcDRLU` | +| `_ZNK7WebCore8Document18monotonicTimestampEv` | `CFGT373U98c` | +| `_ZNK7WebCore8Document19useSystemAppearanceEv` | `dsgJ2cWHLOc` | +| `_ZNK7WebCore8Document20isRunningUserScriptsEv` | `Z0bnBaoXk7w` | +| `_ZNK7WebCore8Document20linkColorForBindingsEv` | `StXnL46JBH8` | +| `_ZNK7WebCore8Document21haveStylesheetsLoadedEv` | `u39XzpncQzA` | +| `_ZNK7WebCore8Document22touchEventHandlerCountEv` | `Amlk9ZNFJag` | +| `_ZNK7WebCore8Document22wheelEventHandlerCountEv` | `csW7BKwFn60` | +| `_ZNK7WebCore8Document28characterSetWithUTF8FallbackEv` | `NrKtvW0gC-Q` | +| `_ZNK7WebCore8Document29originIdentifierForPasteboardEv` | `6QWMcGENlPE` | +| `_ZNK7WebCore8Document29useElevatedUserInterfaceLevelEv` | `8BpjJImTYOo` | +| `_ZNK7WebCore8Document31defaultCharsetForLegacyBindingsEv` | `87c5Woa1HE8` | +| `_ZNK7WebCore8Document31displayStringModifiedByEncodingERKN3WTF6StringE` | `VxoMWVH-lxg` | +| `_ZNK7WebCore8Document3dirEv` | `0ARVE3ZNWvQ` | +| `_ZNK7WebCore8Document42shouldBypassMainWorldContentSecurityPolicyEv` | `Qr1agrvN7Qw` | +| `_ZNK7WebCore8Document4bodyEv` | `Vubr42yhipE` | +| `_ZNK7WebCore8Document6domainEv` | `xUDTB4S7g20` | +| `_ZNK7WebCore8Document6hiddenEv` | `36ApFwdg3pw` | +| `_ZNK7WebCore8Document6loaderEv` | `eMma2ftKEZ4` | +| `_ZNK7WebCore8Document7bgColorEv` | `TIkDupljJqY` | +| `_ZNK7WebCore8Document7doctypeEv` | `6uvnoqZfJDU` | +| `_ZNK7WebCore8Document8hasFocusEv` | `ozhniOH0KGs` | +| `_ZNK7WebCore8FileList4itemEj` | `QmpZNJfjuNE` | +| `_ZNK7WebCore8FormData12isolatedCopyEv` | `bJ8hpx4xk-w` | +| `_ZNK7WebCore8FormData13lengthInBytesEv` | `x72MwKv0+Bo` | +| `_ZNK7WebCore8FormData14asSharedBufferEv` | `poQaKh1C0pI` | +| `_ZNK7WebCore8FormData7flattenEv` | `H0CXchtam5k` | +| `_ZNK7WebCore8FormData9asBlobURLEv` | `FscFh70QHyg` | +| `_ZNK7WebCore8Location4hostEv` | `NCHVBc1E3+c` | +| `_ZNK7WebCore8Position10downstreamENS_27EditingBoundaryCrossingRuleE` | `5gELNQcC+f8` | +| `_ZNK7WebCore8Position13containerNodeEv` | `-d0d1BTY40s` | +| `_ZNK7WebCore8Position24computeNodeAfterPositionEv` | `81cc-11uj3k` | +| `_ZNK7WebCore8Position24parentAnchoredEquivalentEv` | `YHshPHlRYjg` | +| `_ZNK7WebCore8Position25computeNodeBeforePositionEv` | `vqTAC3fu1io` | +| `_ZNK7WebCore8Position28offsetForPositionAfterAnchorEv` | `MHwQiqUEBwQ` | +| `_ZNK7WebCore8Position4nextENS_16PositionMoveTypeE` | `iOihgthBWfs` | +| `_ZNK7WebCore8Position8previousENS_16PositionMoveTypeE` | `mGacX4duSZc` | +| `_ZNK7WebCore8Position8upstreamENS_27EditingBoundaryCrossingRuleE` | `xnkBcS0p1KM` | +| `_ZNK7WebCore8Settings15isScriptEnabledEv` | `qDQ3PKPFeKc` | +| `_ZNK7WebCore8Settings16areImagesEnabledEv` | `nNudbOEqKVI` | +| `_ZNK7WebCore8Settings16showDebugBordersEv` | `jXkt81d8RC8` | +| `_ZNK7WebCore8Settings18showRepaintCounterEv` | `1xbdPOXWMkY` | +| `_ZNK7WebCore8Settings18webSecurityEnabledEv` | `ZThM23+9DUQ` | +| `_ZNK7WebCore8Settings23needsSiteSpecificQuirksEv` | `ueZqqz5clfg` | +| `_ZNK7WebCore8Settings26authorAndUserStylesEnabledEv` | `yP8syAvWyWI` | +| `_ZNK7WebCore8Settings28iceCandidateFilteringEnabledEv` | `4QzvMaxdGlw` | +| `_ZNK7WebCore9CookieJar13getRawCookiesERKNS_8DocumentERKN3WTF3URLERNS4_6VectorINS_6CookieELm0ENS4_15CrashOnOverflowELm16ENS4_10FastMallocEEE` | `MnFQRdyEFHk` | +| `_ZNK7WebCore9CookieJar14cookiesEnabledERKNS_8DocumentE` | `9FIdF0nhg00` | +| `_ZNK7WebCore9CookieJar29cookieRequestHeaderFieldValueERNS_8DocumentERKN3WTF3URLE` | `UDYkHFjCgi0` | +| `_ZNK7WebCore9CookieJar7cookiesERNS_8DocumentERKN3WTF3URLE` | `nfMZQIjYo5U` | +| `_ZNK7WebCore9FrameTree10childCountEv` | `NF1s99Jgzow` | +| `_ZNK7WebCore9FrameTree11scopedChildEj` | `cLEfGWxS0OU` | +| `_ZNK7WebCore9FrameTree12traverseNextENS_7CanWrapEPNS_7DidWrapE` | `8v50ik3N8zs` | +| `_ZNK7WebCore9FrameTree12traverseNextEPKNS_5FrameE` | `ANRxBkkTRPg` | +| `_ZNK7WebCore9FrameTree14isDescendantOfEPKNS_5FrameE` | `mdoGohzjCsY` | +| `_ZNK7WebCore9FrameTree16traversePreviousENS_7CanWrapEPNS_7DidWrapE` | `lHRazILohDQ` | +| `_ZNK7WebCore9FrameTree20traverseNextRenderedEPKNS_5FrameE` | `TKYXtGzdYLw` | +| `_ZNK7WebCore9FrameTree3topEv` | `9J8+IeONNco` | +| `_ZNK7WebCore9FrameTree6parentEv` | `1Ohhg185yUQ` | +| `_ZNK7WebCore9JSDOMRect7wrappedEv` | `hYU2Riiaj08` | +| `_ZNK7WebCore9JSElement7wrappedEv` | `UbHmZPp2tCU` | +| `_ZNK7WebCore9MediaList4itemEj` | `Raf7ROy36d8` | +| `_ZNK7WebCore9RenderBox11borderRadiiEv` | `jusJu1ps6I8` | +| `_ZNK7WebCore9RenderBox11clientWidthEv` | `5iZG-E-Tj3o` | +| `_ZNK7WebCore9RenderBox12clientHeightEv` | `jMu+DiqDZBs` | +| `_ZNK7WebCore9RenderBox19absoluteContentQuadEv` | `-SGh0agyaUk` | +| `_ZNK7WebCore9RenderBox20flippedClientBoxRectEv` | `neGlsHeGLCM` | +| `_ZNK7WebCore9RenderBox22verticalScrollbarWidthEv` | `JuRURKO3-F8` | +| `_ZNK7WebCore9RenderBox25horizontalScrollbarHeightEv` | `UqpuHPllTdE` | +| `_ZNK7WebCore9RenderBox33canBeScrolledAndHasScrollableAreaEv` | `ZlrqWz3NRA8` | +| `_ZNK7WebCore9SampleMap5emptyEv` | `Rg7MLXyCmtU` | +| `_ZNK7WebCore9TimerBase16nextFireIntervalEv` | `zguOEvG9DWs` | +| `_ZNK7WebCore9TreeScope14getElementByIdERKN3WTF10AtomStringE` | `mPIuvpUHm18` | +| `_ZNK7WebCore9TreeScope14getElementByIdERKN3WTF6StringE` | `2XLg3fHDKgQ` | +| `_ZNK7WebCore9TreeScope16getElementByNameERKN3WTF10AtomStringE` | `fZPmoavbyp4` | +| `_ZNK7WebCore9TreeScope23ancestorNodeInThisScopeEPNS_4NodeE` | `ViHXU52nAU4` | +| `_ZNK7WebCore9TreeScope26ancestorElementInThisScopeEPNS_7ElementE` | `PbiFMWQuGuI` | +| `_ZNK7bmalloc11IsoTLSEntry4sizeEv` | `zkhfTgB1ABM` | +| `_ZNK7bmalloc11IsoTLSEntry6extentEv` | `1UchwEvKOCY` | +| `_ZNK7bmalloc11IsoTLSEntry6offsetEv` | `lRFFPidOgTg` | +| `_ZNK7bmalloc11IsoTLSEntry9alignmentEv` | `75nTISHl6cY` | +| `_ZNK9Inspector14ConsoleMessage12globalObjectEv` | `ijTy57nFYLw` | +| `_ZNK9Inspector14ConsoleMessage13argumentCountEv` | `DR5-oCJNvBU` | +| `_ZNK9Inspector14ConsoleMessage3urlEv` | `In5ugGO8zCE` | +| `_ZNK9Inspector14ConsoleMessage4lineEv` | `uGGFqiI9Ets` | +| `_ZNK9Inspector14ConsoleMessage4typeEv` | `mX2cjtETZtI` | +| `_ZNK9Inspector14ConsoleMessage5levelEv` | `gD32LzUw9AQ` | +| `_ZNK9Inspector14ConsoleMessage6columnEv` | `S9NQxKXLYMw` | +| `_ZNK9Inspector14ConsoleMessage6sourceEv` | `tRhekl227Io` | +| `_ZNK9Inspector14ConsoleMessage7isEqualEPS0_` | `86w9gD5145M` | +| `_ZNK9Inspector14ConsoleMessage7messageEv` | `488namPY+tQ` | +| `_ZNK9Inspector14ConsoleMessage9argumentsEv` | `Bd-EIoPzXJs` | +| `_ZNK9Inspector14FrontendRouter12hasFrontendsEv` | `lcLx31xx-4M` | +| `_ZNK9Inspector14FrontendRouter12sendResponseERKN3WTF6StringE` | `qKUojuHYhw8` | +| `_ZNK9Inspector14FrontendRouter13frontendCountEv` | `YcsTWpdaG28` | +| `_ZNK9Inspector14FrontendRouter16hasLocalFrontendEv` | `85Dwu5xralY` | +| `_ZNK9Inspector14FrontendRouter17hasRemoteFrontendEv` | `vfj-qG-ZQx8` | +| `_ZNK9Inspector14FrontendRouter9sendEventERKN3WTF6StringE` | `wtSeaM-ASQM` | +| `_ZNK9Inspector14InjectedScript10wrapObjectEN3JSC7JSValueERKN3WTF6StringEb` | `1n43cN8DP6E` | +| `_ZNK9Inspector14InjectedScript12previewValueEN3JSC7JSValueE` | `y7LneQXMe7E` | +| `_ZNK9Inspector14InjectedScript14findObjectByIdERKN3WTF6StringE` | `cFOaAP9V4YE` | +| `_ZNK9Inspector14InjectedScript14wrapCallFramesEN3JSC7JSValueE` | `VfrdBRicGBA` | +| `_ZNK9Inspector14InjectedScript14wrapJSONStringERKN3WTF6StringES4_b` | `mCR32lk338U` | +| `_ZNK9Inspector14InjectedScript9wrapTableEN3JSC7JSValueES2_` | `5G4TSqmhiF4` | +| `_ZNK9Inspector15AsyncStackTrace20buildInspectorObjectEv` | `XS8CSiOlDVI` | +| `_ZNK9Inspector15AsyncStackTrace8isLockedEv` | `zXiD0GC9Vh8` | +| `_ZNK9Inspector15AsyncStackTrace9isPendingEv` | `YPyYVEu-17g` | +| `_ZNK9Inspector15InspectorTarget13isProvisionalEv` | `ZcQzzUTFsJU` | +| `_ZNK9Inspector15InspectorTarget8isPausedEv` | `KrfpsXXdW-w` | +| `_ZNK9Inspector15RemoteInspector16listingForTargetERKNS_24RemoteControllableTargetE` | `w+T7oawE1mg` | +| `_ZNK9Inspector15RemoteInspector21hasActiveDebugSessionEv` | `P0V8cbW+Z-E` | +| `_ZNK9Inspector15RemoteInspector26listingForInspectionTargetERKNS_22RemoteInspectionTargetE` | `jsYJFoq3pQo` | +| `_ZNK9Inspector15RemoteInspector6Client11browserNameEv` | `36hv5tEW5cc` | +| `_ZNK9Inspector15RemoteInspector6Client14browserVersionEv` | `NcuyC-lqbs4` | +| `_ZNK9Inspector15RemoteInspector6clientEv` | `JmgmezqTXic` | +| `_ZNK9Inspector15RemoteInspector7enabledEv` | `iTANhsf3zHk` | +| `_ZNK9Inspector15ScriptArguments10argumentAtEm` | `8cAU0GeME54` | +| `_ZNK9Inspector15ScriptArguments12globalObjectEv` | `UFKbZ7T8IB4` | +| `_ZNK9Inspector15ScriptArguments13argumentCountEv` | `1Xe4M+2mfNo` | +| `_ZNK9Inspector15ScriptArguments24getFirstArgumentAsStringERN3WTF6StringE` | `rCyg+xFA0kA` | +| `_ZNK9Inspector15ScriptArguments7isEqualERKS0_` | `oHFYzEYKvhw` | +| `_ZNK9Inspector15ScriptCallFrame10lineNumberEv` | `Q9v0SoVlNwA` | +| `_ZNK9Inspector15ScriptCallFrame12columnNumberEv` | `J5VVuT74c6c` | +| `_ZNK9Inspector15ScriptCallFrame12functionNameEv` | `n1O+i3JtWqk` | +| `_ZNK9Inspector15ScriptCallFrame20buildInspectorObjectEv` | `k0+WgfI1FWM` | +| `_ZNK9Inspector15ScriptCallFrame7isEqualERKS0_` | `osFy-sM72sI` | +| `_ZNK9Inspector15ScriptCallFrame8isNativeEv` | `uyWPJAXD42g` | +| `_ZNK9Inspector15ScriptCallFrame8sourceIDEv` | `7U1sopoeo0Q` | +| `_ZNK9Inspector15ScriptCallFrame9sourceURLEv` | `wa8NEoWeUeI` | +| `_ZNK9Inspector15ScriptCallFrameeqERKS0_` | `Dvmf1wsD9Ew` | +| `_ZNK9Inspector15ScriptCallStack19buildInspectorArrayEv` | `7SpuXhuQ4xs` | +| `_ZNK9Inspector15ScriptCallStack23firstNonNativeCallFrameEv` | `jYo1kdU3L-E` | +| `_ZNK9Inspector15ScriptCallStack2atEm` | `vJDHUZsipug` | +| `_ZNK9Inspector15ScriptCallStack4sizeEv` | `K26-A5vG090` | +| `_ZNK9Inspector15ScriptCallStack7isEqualEPS0_` | `i6Bx31ccE6g` | +| `_ZNK9Inspector17BackendDispatcher12CallbackBase8isActiveEv` | `5nd7FB7MQhE` | +| `_ZNK9Inspector17BackendDispatcher17hasProtocolErrorsEv` | `ODo1XDHSsx0` | +| `_ZNK9Inspector17BackendDispatcher8isActiveEv` | `dSs0x+rJyoI` | +| `_ZNK9Inspector18InjectedScriptBase10hasNoValueEv` | `zm28lXJU440` | +| `_ZNK9Inspector18InjectedScriptBase12globalObjectEv` | `D5ON0NveW+U` | +| `_ZNK9Inspector18InjectedScriptBase20injectedScriptObjectEv` | `KH4302QYBDI` | +| `_ZNK9Inspector18InjectedScriptBase20inspectorEnvironmentEv` | `Spw3-DvOJ8Y` | +| `_ZNK9Inspector18InjectedScriptBase31hasAccessToInspectedScriptStateEv` | `gNQcjhVwM+U` | +| `_ZNK9Inspector18InjectedScriptBase4nameEv` | `h6T-jO2nhTc` | +| `_ZNK9Inspector19InspectorAuditAgent14hasActiveAuditEv` | `Dcu5h6UKIKE` | +| `_ZNK9Inspector20InspectorTargetAgent14connectionTypeEv` | `3wDKZRIqEA0` | +| `_ZNK9Inspector21InjectedScriptManager20inspectorEnvironmentEv` | `xeyXzjIu2IA` | +| `_ZNK9Inspector21InspectorConsoleAgent22developerExtrasEnabledEv` | `7zFt1IsCMf4` | +| `_ZNK9Inspector21InspectorConsoleAgent7enabledEv` | `2IKm-BXcq9g` | +| `_ZNK9Inspector22InspectorDebuggerAgent17breakpointsActiveEv` | `Fpchv+-9IbQ` | +| `_ZNK9Inspector22InspectorDebuggerAgent17shouldBlackboxURLERKN3WTF6StringE` | `va7Me5Jwuzs` | +| `_ZNK9Inspector22InspectorDebuggerAgent21injectedScriptManagerEv` | `yG3VRjWUFh8` | +| `_ZNK9Inspector22InspectorDebuggerAgent27pauseOnNextStatementEnabledEv` | `25lgQJ93JO4` | +| `_ZNK9Inspector22InspectorDebuggerAgent7enabledEv` | `1DD+9cjt3hU` | +| `_ZNK9Inspector22InspectorDebuggerAgent8isPausedEv` | `Jgg+mJLsHHs` | +| `_ZNK9Inspector22RemoteAutomationTarget4typeEv` | `E9lS19wjNII` | +| `_ZNK9Inspector22RemoteAutomationTarget8isPairedEv` | `ew8ebxoQMLo` | +| `_ZNK9Inspector22RemoteInspectionTarget20remoteControlAllowedEv` | `QGapaf1-Pp0` | +| `_ZNK9Inspector22RemoteInspectionTarget26automaticInspectionAllowedEv` | `OVQXcjKPf8M` | +| `_ZNK9Inspector22RemoteInspectionTarget3urlEv` | `r20Y87D+ibY` | +| `_ZNK9Inspector22RemoteInspectionTarget4nameEv` | `hep5VUibI2A` | +| `_ZNK9Inspector24RemoteControllableTarget16targetIdentifierEv` | `untnO4d6OQs` | +| `_ZNK9Inspector28InspectorScriptProfilerAgent18isAlreadyProfilingEv` | `tH-+IbGsGNE` | +| `_ZNKR3WTF6String12isolatedCopyEv` | `KNRiHsP-bNQ` | +| `_ZNO3WTF6String12isolatedCopyEv` | `S911A3deFpc` | +| `_ZThn112_N7WebCore18HTMLMarqueeElement4stopEv` | `jTItNnritjU` | +| `_ZThn112_NK7WebCore16HTMLInputElement17validationMessageEv` | `0fVIASifMP4` | +| `_ZThn136_N7WebCore16HTMLMediaElement12endScrubbingEv` | `X3ir9Mseh44` | +| `_ZThn136_N7WebCore16HTMLMediaElement14beginScrubbingEv` | `WMBup7YfG1I` | +| `_ZThn136_N7WebCore16HTMLMediaElement14setCurrentTimeEd` | `qT0ciXOUTpo` | +| `_ZThn136_N7WebCore16HTMLMediaElement15enterFullscreenEv` | `2W8raUaXJ8o` | +| `_ZThn136_N7WebCore16HTMLMediaElement16returnToRealtimeEv` | `4x0HXWXB6rQ` | +| `_ZThn136_N7WebCore16HTMLMediaElement4playEv` | `-MoZKJXBTlM` | +| `_ZThn136_N7WebCore16HTMLMediaElement5pauseEv` | `HJz9ZIS7gQI` | +| `_ZThn136_N7WebCore16HTMLMediaElement8setMutedEb` | `35fc0lxWKkY` | +| `_ZThn136_N7WebCore16HTMLMediaElement9setVolumeEd` | `bm81W6BNQbs` | +| `_ZThn136_NK7WebCore16HTMLMediaElement11currentTimeEv` | `oQOlGmWOjvg` | +| `_ZThn136_NK7WebCore16HTMLMediaElement12isFullscreenEv` | `HzRe5zmL5zM` | +| `_ZThn136_NK7WebCore16HTMLMediaElement12playbackRateEv` | `nVSOF8lrIqQ` | +| `_ZThn136_NK7WebCore16HTMLMediaElement5mutedEv` | `Ns+Q-IBcpuQ` | +| `_ZThn136_NK7WebCore16HTMLMediaElement6pausedEv` | `i8MGif9wksg` | +| `_ZThn136_NK7WebCore16HTMLMediaElement6volumeEv` | `cTu3lvym8us` | +| `_ZThn136_NK7WebCore16HTMLMediaElement7canPlayEv` | `r91VXwrT5AI` | +| `_ZThn136_NK7WebCore16HTMLMediaElement8durationEv` | `vhXUFXPBbJg` | +| `_ZThn16_N9Inspector14InspectorAgentD0Ev` | `UQzEKNbOEzI` | +| `_ZThn16_N9Inspector14InspectorAgentD1Ev` | `EbEbBKHhqvM` | +| `_ZThn16_N9Inspector18InspectorHeapAgentD0Ev` | `6ZG4asYB-+M` | +| `_ZThn16_N9Inspector18InspectorHeapAgentD1Ev` | `L+EQZi9lhrE` | +| `_ZThn16_N9Inspector19InspectorAuditAgentD0Ev` | `OqPy5+E3JrY` | +| `_ZThn16_N9Inspector20InspectorTargetAgentD0Ev` | `tSxzKJq0HIw` | +| `_ZThn16_N9Inspector20InspectorTargetAgentD1Ev` | `5U-VsLRlRsY` | +| `_ZThn16_N9Inspector21InspectorConsoleAgentD0Ev` | `wCnSbQWYyP4` | +| `_ZThn16_N9Inspector21InspectorConsoleAgentD1Ev` | `gal08O8mPU4` | +| `_ZThn16_N9Inspector21InspectorRuntimeAgentD0Ev` | `AqqoCHSoK7Y` | +| `_ZThn16_N9Inspector21InspectorRuntimeAgentD1Ev` | `TxVzovyEODc` | +| `_ZThn16_N9Inspector22InspectorDebuggerAgentD0Ev` | `Bt4ps1bQCis` | +| `_ZThn16_N9Inspector22InspectorDebuggerAgentD1Ev` | `a7fTFoY9UJw` | +| `_ZThn16_N9Inspector28InspectorScriptProfilerAgentD0Ev` | `dbzPEmNY4C0` | +| `_ZThn16_N9Inspector28InspectorScriptProfilerAgentD1Ev` | `8h1tiaq-9Fc` | +| `_ZThn24_N7WebCore14DocumentLoader17addConsoleMessageEN3JSC13MessageSourceENS1_12MessageLevelERKN3WTF6StringEm` | `8qrE3g8lggI` | +| `_ZThn24_N7WebCore14DocumentLoaderD0Ev` | `056NZahTIcE` | +| `_ZThn24_N7WebCore14DocumentLoaderD1Ev` | `fpFa0fYJ6JM` | +| `_ZThn24_N7WebCore19MediaResourceLoaderD0Ev` | `NQao9f52Vtc` | +| `_ZThn24_N7WebCore19MediaResourceLoaderD1Ev` | `Wa+taop41-Q` | +| `_ZThn24_N9Inspector18InspectorHeapAgent17didGarbageCollectEN3JSC15CollectionScopeE` | `pyCXumhqCwA` | +| `_ZThn24_N9Inspector18InspectorHeapAgent18willGarbageCollectEv` | `uvdBMpdVn1A` | +| `_ZThn24_N9Inspector18InspectorHeapAgentD1Ev` | `kyf-GqSLmwg` | +| `_ZThn24_N9Inspector22InspectorDebuggerAgentD0Ev` | `U6TtqBmL14A` | +| `_ZThn24_N9Inspector22InspectorDebuggerAgentD1Ev` | `L9K9PzqUWDA` | +| `_ZThn24_N9Inspector28InspectorScriptProfilerAgent17didEvaluateScriptEN3WTF7SecondsEN3JSC15ProfilingReasonE` | `wOPGv1BomT4` | +| `_ZThn24_N9Inspector28InspectorScriptProfilerAgent18willEvaluateScriptEv` | `lKrU+Hgdiyg` | +| `_ZThn24_N9Inspector28InspectorScriptProfilerAgentD0Ev` | `ei92h4vDiPU` | +| `_ZThn24_N9Inspector28InspectorScriptProfilerAgentD1Ev` | `G4J2MwKCa2Q` | +| `_ZThn24_NK9Inspector28InspectorScriptProfilerAgent18isAlreadyProfilingEv` | `W5zgLuJ-xXU` | +| `_ZThn32_N7WebCore14DocumentLoader14notifyFinishedERNS_14CachedResourceERKNS_18NetworkLoadMetricsE` | `4Unpe75CXLE` | +| `_ZThn32_N7WebCore14DocumentLoader16redirectReceivedERNS_14CachedResourceEONS_15ResourceRequestERKNS_16ResourceResponseEON3WTF17CompletionHandlerIFvS4_EEE` | `A4MMgh3fkgY` | +| `_ZThn32_N7WebCore14DocumentLoader16responseReceivedERNS_14CachedResourceERKNS_16ResourceResponseEON3WTF17CompletionHandlerIFvvEEE` | `vKE2vwnumf0` | +| `_ZThn32_N7WebCore14DocumentLoaderD0Ev` | `v9lOD9R-HzU` | +| `_ZThn32_N7WebCore14DocumentLoaderD1Ev` | `9SQVys0xk5U` | +| `_ZThn32_N7WebCore14XMLHttpRequestD0Ev` | `w8S6R14D7AE` | +| `_ZThn32_N7WebCore14XMLHttpRequestD1Ev` | `y7qIpQmewS8` | +| `_ZThn40_N7WebCore8DOMTimerD0Ev` | `5O+uFe6GMlA` | +| `_ZThn40_N7WebCore8DOMTimerD1Ev` | `ZeMBTDU48+g` | +| `_ZThn64_N7WebCore10ScrollView15setScrollOffsetERKNS_8IntPointE` | `A0Xp97hSdNo` | +| `_ZThn64_NK7WebCore10ScrollView12contentsSizeEv` | `Fbq6rkrW44s` | +| `Unknown` | `+H5DiAmt0Wg` | +| `Unknown` | `+dfBTQ1j6Js` | +| `Unknown` | `+iT2E6TqDRA` | +| `Unknown` | `+jMtDhtTFk4` | +| `Unknown` | `+lO+dHJcs8s` | +| `Unknown` | `+ngYlUyHe4E` | +| `Unknown` | `+obB7JQzFPQ` | +| `Unknown` | `+pjCBeSm+Mo` | +| `Unknown` | `-f9D0krLNVY` | +| `Unknown` | `-iWQeHsj1dE` | +| `Unknown` | `0bXmnUq4gwI` | +| `Unknown` | `0huQF0dbE0o` | +| `Unknown` | `0mmhAX7HkfE` | +| `Unknown` | `10YPt3GqbxY` | +| `Unknown` | `19-F55ZVpzU` | +| `Unknown` | `1Xyu2Y+DRxk` | +| `Unknown` | `1txZExqLvYw` | +| `Unknown` | `1u18UyZ7bHY` | +| `Unknown` | `24IjD9uyTSU` | +| `Unknown` | `2F-oNXA1MXc` | +| `Unknown` | `2FxExcQ9PYE` | +| `Unknown` | `2rJ8CmSDM5o` | +| `Unknown` | `2sfEbx4JS38` | +| `Unknown` | `3Oj6rYJvl7s` | +| `Unknown` | `3bBJrqsgl1U` | +| `Unknown` | `3qBM+viOLME` | +| `Unknown` | `4zR-a4gyEvc` | +| `Unknown` | `52A38mxHq6w` | +| `Unknown` | `5vUkf-djbu4` | +| `Unknown` | `5xmf8qd0G3k` | +| `Unknown` | `62Yoy7tQOL0` | +| `Unknown` | `66IkT+JzKhw` | +| `Unknown` | `6tgXhVYoYlY` | +| `Unknown` | `6vb9oUDGcQo` | +| `Unknown` | `7+n3DMXSzSE` | +| `Unknown` | `7E9sTJnkGUA` | +| `Unknown` | `7ECLZAHhILg` | +| `Unknown` | `7o1fdnbBqO8` | +| `Unknown` | `93nt7EIfhlE` | +| `Unknown` | `97tJ0PznsuU` | +| `Unknown` | `9GZlzGiHmiI` | +| `Unknown` | `9L1qYllxgbc` | +| `Unknown` | `9TW5grDg3v0` | +| `Unknown` | `9cP+chWmYl8` | +| `Unknown` | `A-SF0B-Wgzk` | +| `Unknown` | `AiYZXV2DRdQ` | +| `Unknown` | `Ar4Na2HZO8g` | +| `Unknown` | `B4M-2hTd0W4` | +| `Unknown` | `BGTXdn5vfxg` | +| `Unknown` | `BhG0O6haZXQ` | +| `Unknown` | `Br-D2BUR-Iw` | +| `Unknown` | `Bxf0zoi3GY4` | +| `Unknown` | `C+MZtiNSLBs` | +| `Unknown` | `C8SexpcEgQ4` | +| `Unknown` | `CGvkW2Az0X4` | +| `Unknown` | `CP+qopfXoYQ` | +| `Unknown` | `CQ+q4JsAm-w` | +| `Unknown` | `CgfCLhQfJLQ` | +| `Unknown` | `D0QOURyc7aQ` | +| `Unknown` | `D3wxDn5e0xg` | +| `Unknown` | `DCWpYGMshdw` | +| `Unknown` | `DN41lb55zW4` | +| `Unknown` | `DT0eiz4BN20` | +| `Unknown` | `DgtgDTeMzF8` | +| `Unknown` | `DkwdxsYZRYQ` | +| `Unknown` | `E8ePwwwNRsQ` | +| `Unknown` | `EgPhZKt-1lQ` | +| `Unknown` | `EiSQq9E9PtE` | +| `Unknown` | `EoSAdnIx72g` | +| `Unknown` | `ErgQM8++hcc` | +| `Unknown` | `FG4XeXSkFqY` | +| `Unknown` | `FN-0fRyWoqM` | +| `Unknown` | `FVC6kJsyKJY` | +| `Unknown` | `FYDuVX3thgU` | +| `Unknown` | `GI9q6I2Qeos` | +| `Unknown` | `GLBjWBPNUQ8` | +| `Unknown` | `Gjr9DWbY1bQ` | +| `Unknown` | `GmRdv8ApCm4` | +| `Unknown` | `GzDzGfYhw0I` | +| `Unknown` | `Himr5mdF6Bw` | +| `Unknown` | `HlAUGg263Vg` | +| `Unknown` | `Hx6YjhwHCiM` | +| `Unknown` | `I21gB8IitFM` | +| `Unknown` | `I4M3ZZ1zZwA` | +| `Unknown` | `I9zB3lkeKUY` | +| `Unknown` | `IKozz2ee2QI` | +| `Unknown` | `IbWVb5T-4sg` | +| `Unknown` | `InD3pJjwRIg` | +| `Unknown` | `IryOBuDL8AA` | +| `Unknown` | `IvZO+CDouSY` | +| `Unknown` | `JFp1Q4L92AQ` | +| `Unknown` | `JG6Capn3giE` | +| `Unknown` | `JnoPIZMkoPw` | +| `Unknown` | `K7nvR+Og0IE` | +| `Unknown` | `KF-xR65HsDM` | +| `Unknown` | `KQopY6r3-WI` | +| `Unknown` | `KfHDmVh2QZs` | +| `Unknown` | `KwQfk41GCp4` | +| `Unknown` | `KxSMJdyXAxs` | +| `Unknown` | `Lkwzsov+QQA` | +| `Unknown` | `M+laxFpMQ3U` | +| `Unknown` | `MC5MbWLEZ+w` | +| `Unknown` | `MCk9+s-Cubg` | +| `Unknown` | `MFj9kn-GNfU` | +| `Unknown` | `MQ58Akv23e8` | +| `Unknown` | `MXxNWED0LrM` | +| `Unknown` | `MYg-Fz6MYtw` | +| `Unknown` | `MaTAqdYSJyU` | +| `Unknown` | `Mslf2tqdBfU` | +| `Unknown` | `N0i04lmGs4o` | +| `Unknown` | `NcQfxPPgBPU` | +| `Unknown` | `O+V6Vy5G-yA` | +| `Unknown` | `OPBo8z7aVME` | +| `Unknown` | `P4DTWOYuot0` | +| `Unknown` | `PL1EHt+qRcY` | +| `Unknown` | `POLEsspzXmY` | +| `Unknown` | `PRRF5Nmoaa4` | +| `Unknown` | `PqqDSc9iQ3U` | +| `Unknown` | `QTSb0ybillk` | +| `Unknown` | `QUsmkyWDf6U` | +| `Unknown` | `Qj6ArxlMxX4` | +| `Unknown` | `ROMVKpYxnTg` | +| `Unknown` | `Rm5k66YadKA` | +| `Unknown` | `Rq9ndxzAB5I` | +| `Unknown` | `Rt1kyGp7vvI` | +| `Unknown` | `RyZ+H8AVDrw` | +| `Unknown` | `S8qb5wE+Igg` | +| `Unknown` | `T-8QMcPvuMc` | +| `Unknown` | `T7dBbW1f580` | +| `Unknown` | `THqjfA0aAvA` | +| `Unknown` | `Tc3t6jAA0os` | +| `Unknown` | `U2f0i-WrUkM` | +| `Unknown` | `UF7HRHKcccs` | +| `Unknown` | `UJtrfCZVn7k` | +| `Unknown` | `Up3kMId+acM` | +| `Unknown` | `V+MPxUiaORk` | +| `Unknown` | `VGtnWbWhDhY` | +| `Unknown` | `VJmxbf8istY` | +| `Unknown` | `VeLInYDKa7A` | +| `Unknown` | `W53m431Ss7s` | +| `Unknown` | `WUsnAZlX1Dg` | +| `Unknown` | `X2yLKCepV-k` | +| `Unknown` | `XixW5lX0CgU` | +| `Unknown` | `YKete9tBjsY` | +| `Unknown` | `YvcO2G5lKoQ` | +| `Unknown` | `Z6atenHrfkE` | +| `Unknown` | `ZXy6SJ2Riao` | +| `Unknown` | `ZvAYTmLyhdI` | +| `Unknown` | `aI7kkH5Z-lI` | +| `Unknown` | `aziZFf3SDqw` | +| `Unknown` | `b2IK7rPPt8E` | +| `Unknown` | `b3RFtTnv8Fg` | +| `Unknown` | `blJN0lVQvZI` | +| `Unknown` | `btUJuALscxA` | +| `Unknown` | `budC85CToRw` | +| `Unknown` | `c0N9i6oV7IM` | +| `Unknown` | `cH-aumPCdHM` | +| `Unknown` | `cXEDVAQX3Fc` | +| `Unknown` | `cgHFzzG-vSI` | +| `Unknown` | `cr2QQgRG6GM` | +| `Unknown` | `d15ogzvwTrk` | +| `Unknown` | `dK49+WeN-gk` | +| `Unknown` | `dSgDlyiYnYY` | +| `Unknown` | `dkGhdrkxhrs` | +| `Unknown` | `eQjQ+S3U2uk` | +| `Unknown` | `eeMQkJtbsig` | +| `Unknown` | `fB6zdl3zD6E` | +| `Unknown` | `fBfcr+qmDEo` | +| `Unknown` | `fCvXNSyUEuE` | +| `Unknown` | `gAnW2Yr6n0g` | +| `Unknown` | `gTdmADaMRe0` | +| `Unknown` | `gujdrhsDcMs` | +| `Unknown` | `h-e3-Qg2Ono` | +| `Unknown` | `h6sZ3gbVGX8` | +| `Unknown` | `hEGmhPYapBY` | +| `Unknown` | `hFNrqlvAkXc` | +| `Unknown` | `hTGCEc48Zj4` | +| `Unknown` | `iKRrgYVp6S0` | +| `Unknown` | `iNYe3UoflbY` | +| `Unknown` | `iSdZVLoB2kE` | +| `Unknown` | `ilXDl9dNrrM` | +| `Unknown` | `irUfhteXKrA` | +| `Unknown` | `iwgB7OzeXUo` | +| `Unknown` | `jQ4nDAtS-PM` | +| `Unknown` | `jjK6N+E8+Cg` | +| `Unknown` | `kNTNOi2-U7o` | +| `Unknown` | `kOvGLeFNGdc` | +| `Unknown` | `kaCNhe3QpYg` | +| `Unknown` | `kvu7hliEMys` | +| `Unknown` | `kz6X0pS4SG8` | +| `Unknown` | `l9srnyCetFE` | +| `Unknown` | `leK1TrejUUw` | +| `Unknown` | `llM-dpRB7Mw` | +| `Unknown` | `m1XFXFjVpNw` | +| `Unknown` | `mFaisQfUAAg` | +| `Unknown` | `mOoh3Od4g3Q` | +| `Unknown` | `mT506d+sCAQ` | +| `Unknown` | `nP556DHyidA` | +| `Unknown` | `nhq2F3w9E2I` | +| `Unknown` | `oMuplmK3nAU` | +| `Unknown` | `oc6iPxX9C+c` | +| `Unknown` | `p1i6MDRD28k` | +| `Unknown` | `p8Ut5oFbuxM` | +| `Unknown` | `pBix1-RkB9A` | +| `Unknown` | `pHIzm0yagek` | +| `Unknown` | `pM6ykA+YtCk` | +| `Unknown` | `pQIRD5SWwj4` | +| `Unknown` | `pWefH-dpMBA` | +| `Unknown` | `pXakmlfsmRk` | +| `Unknown` | `pr1UlGaL88w` | +| `Unknown` | `q3BuDxwPFHU` | +| `Unknown` | `r-zAYe+5gog` | +| `Unknown` | `r24cilB09mA` | +| `Unknown` | `rmA5tn4jLdQ` | +| `Unknown` | `s9wqBPkorek` | +| `Unknown` | `sAg+FMnYByg` | +| `Unknown` | `seSrrrKdnHw` | +| `Unknown` | `t3DFHfo-p+Y` | +| `Unknown` | `t4n17VBUIls` | +| `Unknown` | `tTZjpnAVThM` | +| `Unknown` | `tf8dixrssQ0` | +| `Unknown` | `thYkFBIuGH4` | +| `Unknown` | `u3kBISGMpIQ` | +| `Unknown` | `ucyMIuaVk5s` | +| `Unknown` | `uelAYhLRe-w` | +| `Unknown` | `urEMhc69pFU` | +| `Unknown` | `vNFtHXo1Ed4` | +| `Unknown` | `vfJ-ijvltjg` | +| `Unknown` | `vluz6M8UkvM` | +| `Unknown` | `wBCHSy0aDjI` | +| `Unknown` | `wsVwohWrtTs` | +| `Unknown` | `wtMtCOBdzgk` | +| `Unknown` | `x-YR8cjXcBA` | +| `Unknown` | `xQDhxDsfSjE` | +| `Unknown` | `xhsbzHioskg` | +| `Unknown` | `xsj+huJK6VQ` | +| `Unknown` | `y5leGuMayQk` | +| `Unknown` | `yoIiwgv1oCk` | +| `Unknown` | `yq6071CQAqo` | +| `Unknown` | `ysn78y77zN0` | +| `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 new file mode 100644 index 000000000000..f58ab6cd25ba --- /dev/null +++ b/docs/dev/debt/libSceNKWebKitRequirements.md @@ -0,0 +1,44 @@ +# libSceNKWebKitRequirements technical debt + +### 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. + +### 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 b6e258648e03..86749242b8bb 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 @@ -67,7 +82,7 @@ - [sceNetResolverStartNtoaMultipleRecords](../../../core/libs/prx/libSceNet/Export.cpp) (libSceNet) - 13 title binaries disassembled for this entry call it at 15 sites (PPSA01285 0x3abd107, PPSA01746 0x220463f, PPSA03001 0x248f401, PPSA03490 0x349d725, PPSA03685 0x1876475, PPSA07426 0x1869ee2, PPSA10600 0x1fcffd2, PPSA17226 0x37e3d4f, PPSA20612 0x1fee52f, PPSA23126 0x344582a, PPSA26223 0x8696a5 and 0x16ba5a1, PPSA27752 0x88f2b5 and 0x164e651, PPSA35154 0x18afcdf). At the three sites read in the listing (PPSA01285, PPSA03001, PPSA07426) the fourth, fifth and sixth arguments are 0, so none of them passes a flag value that the entry above says throws; that the sixth argument is the flags follows the signature used here, not the listing. - [sceNetResolverStartNtoa6](../../../core/libs/prx/libSceNet/Export.cpp) (libSceNet) resolves a host name to its first IPv6 address through the host resolver (`getaddrinfo` with `AF_INET6`) and writes the 16-byte address; the `(rid, hostname, addr, timeout, retry, flags)` signature follows `sceNetResolverStartNtoa`. A name with no IPv6 address fails with `RESOLVER_ENODNS` (`0x804101E1`) like a failed lookup; whether the console returns IPv4-mapped addresses instead is not verified. Timeout and retry are ignored as in `sceNetResolverStartNtoa`, and any nonzero flags throw because their meaning for this call is not known. Unverified on hardware. - [sceNetInetPton](../../../core/libs/prx/libSceNet/Export.cpp) (libSceNet) - an IPv6 conversion with a null `dst` returns `NET_EINVAL` here, where it crashed a payload process on a PS5 (firmware 13.60). On that PS5 and on PS4 firmware 10.71 an IPv4 address ends at the first space, tab, LF, VT, FF or CR and the rest is ignored (`"1.2.3.4 x"` converts), and a failed conversion leaves the destination and `sceNetErrnoLoc` unchanged. On the PS5 the dotted IPv4 part of IPv6 text is read the same way (`"::ffff:1.2.3.4 x"` converts, `"::ffff:01.2.3.4"` fails), and an IPv4 conversion with a null `dst` returns 1 or 0 without writing. Leading whitespace, any other trailing byte (`0x01`, `0xa0`) and whitespace after hexadecimal IPv6 text fail -- [sceNetInetPton, sceNetInetNtop](../../../core/libs/prx/libSceNet/Export.cpp) (libSceNet) convert IPv6 text with libkernel's [inet_pton and inet_ntop](../../../core/libs/prx/libkernel/Socket/src/AddressConversion.cpp), so they take the same FreeBSD 11.4 text forms; beyond the PS5 measurements in the entry above, these are unverified on a console. IPv4 text keeps the host conversion. The checks and errors before the conversion are libSceNet's own and unchanged +- [sceNetInetPton, sceNetInetNtop](../../../core/libs/prx/libSceNet/Export.cpp) (libSceNet) convert IPv6 text with libkernel's [inet_pton and inet_ntop](../../../core/libs/prx/libkernel/Socket/src/AddressConversion.cpp), so they take the same FreeBSD 11.4 text forms; beyond the PS5 measurements in the entry above, these are unverified on a console. IPv4 text keeps the host conversion. The checks and errors before the conversion are libSceNet's own and unchanged. In the executables of the 53 titles run here, 36 call `sceNetInetPton` at 107 call sites and 22 call `sceNetInetNtop` at 67; every one of those call sites loads the family 2 (`AF_INET`) into the first argument, none loads 28 (`AF_INET6`) and none leaves it undetermined, so the IPv6 text conversion that is unverified on a console is not reached by a direct call in those executables (read from the instructions, not measured; calls from the titles' library modules and through function pointers are not seen). - [sceNetResolverStartNtoa](../../../core/libs/prx/libSceNet/Export.cpp) (libSceNet) ignores flag bits 0x1 and 0x10000 and does not apply the timeout or retry count: every lookup runs once, synchronously, through the host resolver. What those two bits do on a console is not known; the sceNetResolverAbort entry above gives shadPS4's names for them. A negative timeout or retry and any other flag bit fail with `EINVAL` before anything else is checked, as [prosper's reading of the libSceNet module](https://github.com/mattias800/prosper/blob/6c09a34a092a00898fcead5f855200ca7c368cd2/prosper/src/hle/net/hle_net.cpp#L579-L587) gives - [sceNetDhcpStart, sceNetAddrConfig6Start, sceNetDuplicateIpStart and sceNetInfoDumpStart](../../../core/libs/prx/libSceNet/Export.cpp) - argument widths and callback ABI are recovered. Address callbacks receive user data, a 32-bit event and a 32-bit error. DHCP configuration is mutable; the 512-byte IPv6 configuration is read-only. Their complete field layouts remain unknown. The two 32-bit thread parameters are stored but not consumed by this firmware thread wrapper, so their original names and units are unconfirmed. Information-dump options contain flags, an interval in seconds and a 64-byte path. All four exports remain unimplemented. diff --git a/docs/dev/debt/libSceNetCtl.md b/docs/dev/debt/libSceNetCtl.md index 5eaf80a88a24..75e854922d15 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 f25b3c941df5..7e7507801377 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 ba2cf8b635c3..cd2eba6df288 100644 --- a/docs/dev/debt/libSceNgs2.native.md +++ b/docs/dev/debt/libSceNgs2.native.md @@ -6,6 +6,8 @@ - [NGS2 voice validation](../../../core/libs/prx/libSceNgs2.native/src/Voice.cpp) returns `0x804A8203` for an invalid voice in Control, RunCommands, GetState, GetStateFlags, GetPortInfo and QueryInfo, following the type-4 handle error in [prosper's PS5 module analysis](https://github.com/mattias800/prosper/blob/d61eb2c0ad2de879ef74df9c4aa050c512804a18/prosper/src/hle/audio/hle_audio.cpp#L4478). Control checks a null parameter list first (`0x804A8360`); GetState resolves the voice before output validation, and GetState rejects sizes below 8 before a null output. Existing rack-specific exact state sizes, other argument precedence and command layouts are retained; arbitrary-sized state copies and full console behavior remain unverified. These values follow module analysis, not new console execution. +- [NGS2 PS4 voice state errors](../../../core/libs/prx/libSceNgs2.native/src/Voice.cpp) (libSceNgs2) - the PS4 build answers GetState with `0x804A0054` for a size below 4 before it resolves the voice and `0x804A0300` for an invalid voice, and GetStateFlags writes 0 and returns `0x804A0300` for an invalid voice, as measured with `libSceNgs2.sprx` on a PS4 firmware 10.71 console. Null outputs, a valid voice with a size of 4 to 7 and the invalid-voice errors of the other voice exports are not measured and keep the values above. Whether a PS5 title that imports `libSceNgs2` rather than `libSceNgs2.native` sees the PS4 codes is unknown. + - [NGS2 system and rack handle errors](../../../core/libs/prx/libSceNgs2.native/include/Ngs2Types.hpp) use `0x804A8201` and `0x804A8202`, following the native handle-type error helper recorded in [prosper's PS5 module analysis](https://github.com/mattias800/prosper/blob/d61eb2c0ad2de879ef74df9c4aa050c512804a18/prosper/src/hle/audio/hle_audio.cpp). [sceNgs2RackGetVoiceHandle](../../../core/libs/prx/libSceNgs2.native/src/Rack.cpp) resolves the rack before checking the output pointer, matching the export in firmware 1.00 through 12.70 reported in [#5916](https://github.com/boykopovar/AnyPS5/pull/5916#issuecomment-6172832590). Other exports retain their existing validation order; complete invalid-input precedence and console execution remain unverified. - [NGS2 system option flags](../../../core/libs/prx/libSceNgs2.native/src/System.cpp) (libSceNgs2.native) - `sceNgs2SystemQueryBufferSize`, `sceNgs2SystemCreate` and `sceNgs2SystemCreateWithAllocator` accept `flags` 2 (bit 1) and ignore it. PPSA04540 (Rise of the Ronin) passes it when creating its system. The firmware's shared option validator, as read in [prosper](https://github.com/mattias800/prosper/blob/9b0698b1f51258a52dc2c0d9640e02caa9fcc0fa/prosper/src/hle/audio/hle_audio.cpp#L4155-L4188), checks the size and the fields from +0x6c on but not `flags` at +0x68. What bit 1 selects is unknown. Every other bit still throws, including bit 31, which shadPS4 reads. @@ -16,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 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 @@ -38,27 +41,28 @@ - [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. 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, 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. +- [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. +- [NGS2 custom submixer rack channels](../../../core/libs/prx/libSceNgs2.native/src/Rack.cpp) (libSceNgs2.native, rack 0x4002) - a custom submixer rack accepts 9 to 37 channels, but its voices take at most 8 inputs and 8 outputs ([13.42](https://github.com/boykopovar/AnyPS5/pull/11347#issuecomment-6416673360): 9/9, 12/12 and 37/37 return `0x804A8052`), so a matrixless port above 8 channels throws and the extra rack channels' role is unknown - [NGS2 reverb rack](../../../core/libs/prx/libSceNgs2.native/src/Reverb.cpp) (libSceNgs2.native, rack 0x2001) - follows the PS4 firmware 11.00 `libSceNgs2.sprx`, read and checked against its output at 11.025 to 48 kHz, including parameter changes during playback (differences at float rounding level); not yet compared with the PS5 library. Structure layouts come from [shadPS4](https://github.com/shadps4-emu/shadPS4)'s `ngs2_reverb.h` and the param ids 0x20010000 (setup) and 0x20010001 (I3DL2) from PPSA22520. Only the default `reverb_size` of 1 is handled, with its 14400-sample reflection buffer; other sizes and the library's half-rate mode throw. System sample rates below about 7.5 kHz, where an allpass delay would have no samples, throw. Setup only accepts equal input and output channel counts - [sceNgs2ReportRegisterHandler, sceNgs2ReportUnregisterHandler](../../../core/libs/prx/libSceNgs2.native/src/System.cpp) (libSceNgs2.native, NIDs `uBIN24Tv2MI`, `nPzb7Ly-VjE`) keep a registry of report handlers. Register rejects a null handler with an invalid argument and returns `INVALID_OUT_ADDRESS` for a null out handle, then stores the report type, handler and user data under a freshly allocated opaque handle; unregister removes and frees the matching record and throws for a handle that is not registered. The signatures (report type, handler, user data, out handle) and (report handle) follow [SharpProspero](https://github.com/SvenGDK/SharpProspero) and [shadPS4](https://github.com/shadps4-emu/shadPS4)'s `ngs2_report.h`, and the 24-byte `Ngs2ReportDataHeader` passed to a handler is its `OrbisNgs2ReportDataHeader`. No report is produced yet, so no registered handler is ever invoked and PPSA04540, which imports both and registers a CPU load handler (type 5), still receives none. - [sceNgs2SystemSetUserData, sceNgs2SystemGetUserData, sceNgs2SystemLock, sceNgs2SystemUnlock](../../../core/libs/prx/libSceNgs2.native/src/System.cpp) (libSceNgs2.native) - shadPS4 only checks the system handle (`INVALID_SYSTEM_HANDLE`) and SharpProspero names what each call does; neither gives the other limits. A null user data pointer throws. `sceNgs2SystemLock` and `sceNgs2SystemUnlock` follow [prosper's notes](https://github.com/mattias800/prosper/blob/d61eb2c0ad2de879ef74df9c4aa050c512804a18/prosper/src/hle/audio/hle_audio.cpp#L4367-L4384) on the PS5 module: Lock takes a per-system lock and counts nested holds, Unlock releases one hold from any thread and returns 0 without a hold, and `sceNgs2SystemRender` only tries the lock: while another thread holds it, Render clears one grain of each output, leaves the render count and voices unchanged and returns 0. The other calls do not wait for the system lock. Peace Walker (PPSA18216) holds it while it spins on a flag that its audio thread clears only after `sceNgs2SystemRender` and eight `sceNgs2VoiceGetStateFlags` calls, so on the console neither can wait for it. Whether the console's voice and rack calls take the lock at all is not known. `sceNgs2RackLock` still holds the library's lock until `sceNgs2RackUnlock`, as before -- [sceNgs2GetWaveformFrameInfo](../../../core/libs/prx/libSceNgs2.native/src/Atrac9.cpp) (libSceNgs2.native) - not measured on a console; shadPS4 only stubs it, and prosper does not cover the call. The outputs are taken to be the frame fields of the parsed waveform info, which [prosper's reading of `libSceNgs2.native.sprx`](https://github.com/mattias800/prosper/blob/30572df43ae20ff28f995db56149f7af42235741/prosper/src/hle/audio/ngs2_waveform.cpp#L224-L231) fills for ATRAC9 with the superframe bytes and samples, the frames per superframe and a one-frame delay, whatever the `fact` chunk says. `PCM_I16L` answers channels * 2 bytes, 1 sample, 1 unit and no delay, as for parsed 16-bit PCM, itself assumed. Other types throw. Null outputs return `INVALID_OUT_ADDRESS` and an ATRAC9 format the codec does not accept `INVALID_WAVEFORM_FORMAT`; the codes are unverified +- [sceNgs2GetWaveformFrameInfo](../../../core/libs/prx/libSceNgs2.native/src/Atrac9.cpp) (libSceNgs2.native) - not measured on a console; shadPS4 only stubs it, and prosper does not cover the call. The outputs are taken to be the frame fields of the parsed waveform info, which [prosper's reading of `libSceNgs2.native.sprx`](https://github.com/mattias800/prosper/blob/30572df43ae20ff28f995db56149f7af42235741/prosper/src/hle/audio/ngs2_waveform.cpp#L224-L231) fills for ATRAC9 with the superframe bytes and samples, the frames per superframe and a one-frame delay, whatever the `fact` chunk says. Every little-endian PCM type the parser accepts (`U8`, `I16L`, `I24L`, `I32L`, `F32L` and `F64L`) answers channels * sample bytes, 1 sample, 1 unit and no delay, assumed to match the parsed waveform. `I16B` and VAG still throw. Null outputs return `INVALID_OUT_ADDRESS` and an ATRAC9 format the codec does not accept `INVALID_WAVEFORM_FORMAT`; the codes are unverified - [sceNgs2RackSetUserData, sceNgs2RackGetUserData](../../../core/libs/prx/libSceNgs2.native/src/Rack.cpp) (libSceNgs2.native) - the signatures follow [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/5dfdb4b0b166e83dc9ae275001afb695f12c7174/src/SharpProspero/Interop/Audio/Ngs2.cs#L418-L421) and [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/15abf68c9b52c4b04d094f2837719fdb871021f3/src/core/libraries/ngs2/ngs2.cpp#L86-L111), which only logs them; neither gives an error. A handle that is not a live rack answers `INVALID_RACK_HANDLE` before a null user data pointer is checked, and the null pointer throws, as in `sceNgs2SystemGetUserData`. A new rack starts with 0. Not measured on a console - [sceNgs2RackGetInfo](../../../core/libs/prx/libSceNgs2.native/src/Rack.cpp) (libSceNgs2.native) - detached queries are deliberately rejected: the reference faults while reading the absent owning system, even with a valid 232-byte output. Custom extended queries that would write past the supplied size also throw instead of reproducing the reference overflow. The 232-byte base, family extensions, untouched bytes, owned custom-module options, per-system rack UIDs, rack-local render counts and default-configuration active counters are checked against the reference. Profiling-enabled configurations remain unverified; observed default configurations publish zero process ratio and tick. PPSA13356 passes 232 bytes and reads the count at offset 164, as recorded in [#10037](https://github.com/boykopovar/AnyPS5/pull/10037); that field is preserved by the corrected layout. - [NGS2 system option checks](../../../core/libs/prx/libSceNgs2.native/src/System.cpp) (libSceNgs2.native) - not verified on a console. `sceNgs2SystemQueryBufferSize`, `sceNgs2SystemCreate` and `sceNgs2SystemCreateWithAllocator` return `0x804A8013` (size), `0x804A8311` (max grain, a multiple of 64 up to 2048), `0x804A8310` (grain, a multiple of 64 up to the max), `0x804A8051` (one of ten sample rates) and `0x804A8052` (1 to 37 channels) in that order, following [prosper's PS5 module analysis](https://github.com/mattias800/prosper/blob/8dcb5dfdb9997ede7c76783995010d6abd1222f8/prosper/src/hle/audio/hle_audio.cpp#L4151-L4226). - [NGS2 external job managers](../../../core/libs/prx/libSceNgs2.native/src/System.cpp) - supports all four manager lifecycles and slot 0 rendering, with the 112-byte scheduler option, capacity checks, query/init error propagation, reverse cleanup after failed initialization and slot-order destruction. Custom and default-pool comparisons cover synchronous and deferred submissions, dependency barriers, concurrent workers, completion before callbacks and sampler state publication. Native tests use host kernel adapters, not console execution. The host retains job contexts until join. Very small native batch-storage reuse is not an equivalence oracle. -- [NGS2 worker control updates](../../../core/libs/prx/libSceNgs2.native/src/Voice.cpp) - Setup/block/filter/patch updates, raw module commands, rack creation, system grain/rate changes, exclusive locks and recursive rendering from active jobs still throw. Slots 1 to 3 have manager lifecycle support but no `sceNgs2Stream*` routing. Supported events and render parameters retain the current grain snapshot; port volume/matrix products ramp over the next grain. Queries expose pending port/matrix values and PLAY. Paused samplers finish decode-ahead before stopping. Matrix-info requires 5,480 bytes. Host-adapted native checks cover worker order, event reduction, copied matrices and PitchShift updates at 256 samples. Active 64-sample PitchShift reports reference buffer-integrity errors and is not an equivalence oracle. KILL/restart is checked before downstream mixing; other callback dependency positions remain unverified. +- [NGS2 worker control updates](../../../core/libs/prx/libSceNgs2.native/src/Voice.cpp) - Other setup and filter updates, raw module commands, rack creation, system grain/rate changes, exclusive locks and recursive rendering from active jobs still throw. Slots 1 to 3 have manager lifecycle support but no `sceNgs2Stream*` routing. Setups, blocks and patches buffer in call order until the next grain. Supported events and render parameters retain the current grain snapshot; port volume/matrix products ramp over the next grain. Queries expose pending port/matrix values and PLAY. Paused samplers finish decode-ahead before stopping. Matrix-info requires 5,480 bytes. Host-adapted native checks cover worker order, event reduction, copied matrices and PitchShift updates at 256 samples. Active 64-sample PitchShift reports reference buffer-integrity errors and is not an equivalence oracle. KILL/restart is checked before downstream mixing; other callback dependency positions remain unverified. - [NGS2 mixer and custom UserFx worker controls](../../../core/libs/prx/libSceNgs2.native/src/Voice.cpp) - Other custom-module parameters, including Gain, and raw worker command encodings still throw. Custom mastering modules and additional callback dependency positions remain unverified. Oversized inactive-master output buffers differ: the reference clears the full capacity; the host clears one grain. Supported mixer events, handler replacement and UserFx2 parameters preserve the current render snapshot. Submixer STOP fades its final grain; KILL suppresses current output and sends a final callback next grain. Paused callbacks continue. Mastering keeps its distinct envelope behavior. Failed UserFx2 edits remain in control storage without publishing to rendering; later controls see them. Native comparisons use host kernel adapters, not console execution. This does not establish full custom-FX or stream support. - [NGS2 UserFx2 activation and control reentry](../../../core/libs/prx/libSceNgs2.native/src/Voice.cpp) - Additional callback dependency positions, UserFx2 work/state layouts and custom mastering modules remain unverified. Same-voice control/query reentry waits in the reference; the host throws, as it does for A-to-B-to-A cycles and destruction/rendering of a live control owner. These guards are host behavior, not native error codes. Modules activate only after control. Setup restores the initial parameter image without rerunning setup callbacks. Failed edits remain in control storage and activate on a later PLAY, including failures before first PLAY. Process callbacks buffer self-controls until the next grain; control callbacks can query/control independent voices. Native comparisons use host kernel adapters; guard tests are host-only, with reference waits independently observed. - [NGS2 cross-thread control/process callbacks](../../../core/libs/prx/libSceNgs2.native/src/Voice.cpp) - Same-voice callback joins and cross-thread dependency cycles still wait in the reference and require caller coordination. Host-adapted native checks cover independent-voice handoffs, process self-handoffs, successful/failed controls under contention, query serialization, cleanup, system destruction and render/control overlap. Control callbacks retain per-voice ownership while releasing the global mutex; unrelated voices progress. API calls pin rack/system storage while waiting. Rendering waits before snapshot publication, without blocking peer controls. Handles become unavailable before rack cleanup. System destruction detaches live racks; explicit rack destruction later invalidates their handles. These checks use host kernel/TLS adapters, not console execution. - [NGS2 UserFx2 lifecycle callbacks](../../../core/libs/prx/libSceNgs2.native/src/Custom.cpp) - Additional option layouts and retained callback context pointers remain unverified. C++ exceptions use host cleanup semantics: unpublished construction is discarded and detached cleanup storage is freed before rethrowing. Setup/cleanup callbacks release the global mutex for independent controls, renders and rack operations. Racks publish after setup and attachment; destroying the target system during setup returns `INVALID_SYSTEM_HANDLE`. Cleanup follows handle invalidation, disconnection and detachment. Setup uses a shared module template copied to voices afterward; cleanup receives that template in module/voice order. Negative setup skips cleanup; negative cleanup skips that module's remaining voices without failing destruction. Native comparisons use host kernel/TLS adapters, not a console. - [NGS2 detached racks](../../../core/libs/prx/libSceNgs2.native/src/System.cpp) - Detached `RackGetInfo` deliberately rejects a verified reference fault. Additional option layouts and callback dependency positions remain outside the checks. No public reattachment path was found; attachment is called only by rack construction. System destruction retains rack storage, handles, parameters, work and state, clears active routes and preserves configured destinations. Explicit rack destruction releases storage through its original allocator. Detached filter controls own their parameter copy and defer coefficients until attachment. New detached controls apply earlier queued worker updates before reset/setup. Native comparisons cover sampler/custom-FX state, released-system buffer overwrite, matrices, ports, filters and delayed cleanup under default/external schedulers using host adapters, not console execution. -- [sceNgs2SystemSetGrainSamples, sceNgs2SystemSetSampleRate](../../../core/libs/prx/libSceNgs2.native/src/System.cpp) (libSceNgs2.native) - a grain that is not a multiple of 64 is accepted, where the module returns `0x804A8310`, because the NGS2 tests render 8-sample grains. Changing the rate while a sampler filter is enabled throws, as the filter coefficients were computed for the old rate. After the handle check, a grain of 0 or above the system's maximum returns `0x804A8310`, and a rate other than 11025, 12000, 22050, 24000, 44100, 48000, 88200, 96000, 176400 or 192000 returns `0x804A8051`, per [prosper's reading of the module's command validators](https://github.com/mattias800/prosper/blob/8dcb5dfdb9997ede7c76783995010d6abd1222f8/prosper/src/hle/audio/hle_audio.cpp#L4355-L4399); not measured on a console +- [sceNgs2SystemSetSampleRate](../../../core/libs/prx/libSceNgs2.native/src/System.cpp) (libSceNgs2.native) - Changing the rate while a sampler filter is enabled throws, as the filter coefficients were computed for the old rate. After the handle check, a rate other than 11025, 12000, 22050, 24000, 44100, 48000, 88200, 96000, 176400 or 192000 returns `0x804A8051`, per [prosper's reading of the module's command validators](https://github.com/mattias800/prosper/blob/8dcb5dfdb9997ede7c76783995010d6abd1222f8/prosper/src/hle/audio/hle_audio.cpp#L4355-L4399); not measured on a console - [sceNgs2VoiceQueryInfo](../../../core/libs/prx/libSceNgs2.native/src/Voice.cpp) (libSceNgs2.native) - only info id 0x4001 is known: PPSA22520 passes an 8-byte buffer and branches on the first word being 1 or 2, so it is assumed to be the voice channel count (0 before the voice is set up); the second word is zeroed and other ids throw - [sceNgs2SystemCreateWithAllocator free handler](../../../core/libs/prx/libSceNgs2.native/src/System.cpp) (libSceNgs2.native) - an allocator with an `alloc_handler` but no `free_handler` throws after the option checks: the module only checks the `alloc_handler`, and what it does without a free handler is unknown. Otherwise `sceNgs2SystemCreate` returns `0x804A8020` for a null buffer info or host buffer, and `sceNgs2SystemCreateWithAllocator` `0x804A8023` for a null allocator or `alloc_handler`, before the null-handle `0x804A8010` and the option checks, per [prosper's reading of the module](https://github.com/mattias800/prosper/blob/8dcb5dfdb9997ede7c76783995010d6abd1222f8/prosper/src/hle/audio/hle_audio.cpp#L4246-L4334); not measured on a console - [sceNgs2VoiceGetOwner](../../../core/libs/prx/libSceNgs2.native/src/Voice.cpp) (libSceNgs2.native) - the signature `(voiceHandle, outOwnerRack, outVoiceIndex)` follows [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/5dfdb4b0b166e83dc9ae275001afb695f12c7174/src/SharpProspero/Interop/Audio/Ngs2.cs#L439-L440) and [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/15abf68c9b52c4b04d094f2837719fdb871021f3/src/core/libraries/ngs2/ngs2.cpp#L322-L326), which only logs it; neither gives an error. The errors are unmeasured: a handle that is not a live voice answers `INVALID_VOICE_HANDLE` before the outputs are checked, as in `sceNgs2RackGetVoiceHandle`, and either output pointer null answers `INVALID_OUT_ADDRESS` without writing the other diff --git a/docs/dev/debt/libSceNpAuthAuthorizedAppDialog.md b/docs/dev/debt/libSceNpAuthAuthorizedAppDialog.md index ff59e272559f..009a232b1764 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 762eed120715..a4bb61b2f16f 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 268e974bf4cd..8d62a98e68ed 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,8 +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. @@ -55,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`. @@ -63,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`. @@ -77,11 +77,9 @@ 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`. -- [_ZN3sce2np6ObjectdaEPv](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `1x0jThSUr4w`) - 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`. - [_ZN3sce2np14CalloutContextD0Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `WR4mjQeqz6s`) - 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`. - [_ZN3sce2np9Semaphore4WaitEj](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `hQLw6eE4O44`) - 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`. - [_ZN3sce2npeqERKNS0_4TimeES3_](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `UVLmT9lzRYA`) - 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`. @@ -95,8 +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`. -- [_ZN3sce2np9NpTitleId5ParseEPS1_PKcm](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `-swgMjedLUQ`) - 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`. @@ -104,7 +100,6 @@ Pending import declarations are matched to names in the local libSceNpCommon.spr - [_ZN3sce2np3ipc10IpmiClient11IsConnectedEv](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `prj9aMR74bA`) - 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`. - [_ZN3sce2np12HttpTemplate19SetAuthInfoCallbackEPFii15SceHttpAuthTypePKcPcS5_iPPhPmPiPvESA_](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `ezJnmv7hkAg`) - 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`. - [sceNpUtilParseJid](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `oz2SlXNAnuI`) - 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`. -- [_ZN3sce2np6ObjectnaEmR16SceNpAllocatorEx](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `bKMVqRcCQ1U`) - 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`. - [_ZN3sce2np9Semaphore6CreateEiiPKc](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `wcOCedFKan4`) - 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`. - [_ZN3sce2npleERKNS0_4TimeERK10SceRtcTick](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `cAeFZE72SXU`) - 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`. - [sceNpUtilXmlUnescape](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `+0rj9KhmYb0`) - 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`. @@ -124,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`. @@ -154,55 +146,43 @@ 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`. - [_ZN3sce2np14JsonDocBuilderC1ERKNS0_9JsonValueE](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `ikFI73f3hP4`) - 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`. -- [_ZN3sce2np6ObjectdlEPvR16SceNpAllocatorEx](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `iwDNdnEGyhI`) - 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`. - [_ZN3sce2np9HttpTransD2Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `GSVe-aaTiEg`) - 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`. - [_ZN3sce2np12HttpTemplateC2Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `hw-UPUK9T+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`. -- [_ZN3sce2np6ObjectdaEPvR14SceNpAllocator](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `4il4PZAZOnQ`) - 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`. - [_ZN3sce2np9EventFlag6CreateEPKcj](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `amFi-Av19hU`) - 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`. - [_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`. -- [_ZN3sce2np6ObjectnwEmR16SceNpAllocatorEx](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `orRb69nSo64`) - 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`. - [_sceNpHeapMalloc](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `kwW5qddf+Lo`) - 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`. - [_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`. - [_ZN3sce2np6Thread4dtorEv](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `-3gV5N2u-sc`) - 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`. - [_ZN3sce2np4Time8AddHoursEl](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `Zc+a6k6i7gY`) - 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`. -- [_ZN3sce2np9NpTitleIdC2ERK12SceNpTitleId](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `9n60S+t4Cxs`) - 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`. - [_ZN3sce2np12WorkerThreadD0Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `f5L6ax7EWHk`) - 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`. - [_ZN3sce2np13RingBufMemoryD0Ev](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `70qFzq4z3UI`) - 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`. - [_ZN3sce2np9LocalFile5CloseEv](../../../core/libs/prx/libSceNpCommon/PendingExportsRound7.cpp) (NID `9q+h2q5YprU`) - 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`. - [_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 2b3559a12b58..fa757b8560a1 100644 --- a/docs/dev/debt/libSceNpCppWebApi.md +++ b/docs/dev/debt/libSceNpCppWebApi.md @@ -2,11 +2,12 @@ ### 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::UserProfile::V1, ProfanityFilter::V2, CommunicationRestrictionStatus::V3](../../../core/libs/prx/libSceNpCppWebApi/Export.cpp) (libSceNpCppWebApi) - parameter bookkeeping succeeds without storing state: `FriendsApi::ParameterToGetFriends`, `PresenceApi::ParameterToGetBasicPresences`, `BlocksApi::ParameterToGetBlockingUsers`, `ProfanityApi::ParameterToFilterProfanity` and `CommunicationRestrictionStatusApi::ParameterToGetCommunicationRestrictionStatus`, each `{ctor,dtor,initialize,terminate}` +- [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 f5273ae15ed3..bda7dcc847c0 100644 --- a/docs/dev/debt/libSceNpEntitlementAccess.md +++ b/docs/dev/debt/libSceNpEntitlementAccess.md @@ -4,11 +4,14 @@ - [sceNpEntitlementAccessInitialize](../../../core/libs/prx/libSceNpEntitlementAccess/Export.cpp) (libSceNpEntitlementAccess) - returns 0 without reading the init parameter or writing the boot parameter, so the boot parameter keeps what the caller put there. Both are 32 reserved bytes here, and PPSA01494 (at both of its calls), PPSA02225, PPSA03984, PPSA30839, PPSA31162 and PPSA34502 zero exactly 32 bytes of each right before the call. PPSA03984 and PPSA31162 test the result for a negative value. What the console writes into the boot parameter is unknown +- [sceNpEntitlementAccessAbortRequest, sceNpEntitlementAccessDeleteRequest](../../../core/libs/prx/libSceNpEntitlementAccess/Export.cpp) - no request exists while signed out, so there is nothing to abort or delete; both ignore the request ID and return 0, following [sharpemu](https://github.com/sharpemu/sharpemu-mac/blob/main/src/SharpEmu.Libs/Np/NpEntitlementAccessExports.cs) (Gen4|Gen5, asserted by its lifecycle test) and the RAGE title that treats a negative cleanup result as log-only. Aborting or deleting an ID a signed-in console's table would still hold is unmeasured + ### 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; abort and delete go through `NotImplemented_nid_no_patch` until request tracking is implemented, as the library keeps no request table. +- [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. ### Functional diff --git a/docs/dev/debt/libSceNpFriendListDialog.md b/docs/dev/debt/libSceNpFriendListDialog.md index 2d5b73e230ed..20d29a05eda5 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 73d5beeabccf..5c42d83c559e 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 27edb961fb93..7f7fe238500a 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/libSceNpPartnerSubscription.md b/docs/dev/debt/libSceNpPartnerSubscription.md new file mode 100644 index 000000000000..e743e3d7cff8 --- /dev/null +++ b/docs/dev/debt/libSceNpPartnerSubscription.md @@ -0,0 +1,11 @@ +# libSceNpPartnerSubscription technical debt + +### Unknown function info + +- [libSceNpPartnerSubscription named exports](../../../core/libs/prx/libSceNpPartnerSubscription/Export.cpp) - signatures and behavior are unknown. The parameterless `int` declarations are import placeholders, not ABI prototypes, and immediately throw through `NotImplemented_nid_no_patch`. The pinned [firmware 13.60 inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libscenppartnersubscription-5a04610102.jsonl) identifies the two name/NID pairs below; the pinned [module map](https://github.com/boykopovar/ps5-nid-map/blob/cc1d586fddab576a520f226da6b2632b031e6d09/data/Modules/libSceNpPartnerSubscription.inc) assigns them to `libSceNpPartnerSubscription.sprx`. +- [Unresolved exports](../../../core/libs/prx/libSceNpPartnerSubscription/Export.cpp) - PartnerSubscription NIDs `8w1khP7hjwE` and `J8xmLvppAtA` have unresolved names. The same physical module also provides the separate logical library `libSceNpUbisoftPlus`; its [four inventory NIDs](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libscenpubisoftplus-6af4f14135.jsonl) are ownership-pending and have unresolved names. None of those six is declared. + +| Name | NID | +| --- | --- | +| `sceNpPartnerSubscriptionInitialize` | `gLYGYNEMo3o` | +| `sceNpPartnerSubscriptionTerminate` | `Xd00XKD1NSM` | diff --git a/docs/dev/debt/libSceNpParty.md b/docs/dev/debt/libSceNpParty.md index 8d6176415e59..c75326e5ccbd 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 54a1f1b59136..5d274e85440f 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/libSceNpRemotePlaySessionSignaling.md b/docs/dev/debt/libSceNpRemotePlaySessionSignaling.md index 98a7efb65f6a..71895f66839a 100644 --- a/docs/dev/debt/libSceNpRemotePlaySessionSignaling.md +++ b/docs/dev/debt/libSceNpRemotePlaySessionSignaling.md @@ -2,4 +2,5 @@ ### Unknown function info +- [sceNpRemotePlaySessionSignalingAbortConnection, sceNpRemotePlaySessionSignalingEstablishConnection, sceNpRemotePlaySessionSignalingManualUdpCreateJoinSession, sceNpRemotePlaySessionSignalingManualUdpJoinSession](../../../core/libs/prx/libSceNpRemotePlaySessionSignaling/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/libscenpremoteplaysessionsignaling-4680662e05.jsonl). - [sceNpRemotePlaySessionSignalingCreateJoinSession, sceNpRemotePlaySessionSignalingGetConnectionStatus, sceNpRemotePlaySessionSignalingGetCustomProperty, sceNpRemotePlaySessionSignalingGetLocalNetInfo, sceNpRemotePlaySessionSignalingGetMemoryInfo, sceNpRemotePlaySessionSignalingInitialize, sceNpRemotePlaySessionSignalingJoinSession, sceNpRemotePlaySessionSignalingLeaveSession, sceNpRemotePlaySessionSignalingSetCustomProperty and sceNpRemotePlaySessionSignalingTerminate](../../../core/libs/prx/libSceNpRemotePlaySessionSignaling/Export.cpp) (libSceNpRemotePlaySessionSignaling) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceNpRemotePlaySessionSignaling.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/libSceNpSessionSignaling.md b/docs/dev/debt/libSceNpSessionSignaling.md index f370687fb124..463498b1a58a 100644 --- a/docs/dev/debt/libSceNpSessionSignaling.md +++ b/docs/dev/debt/libSceNpSessionSignaling.md @@ -7,6 +7,9 @@ - [sceNpSessionSignalingGetConnectionStatus, sceNpSessionSignalingActivateSession and sceNpSessionSignalingActivateUser](../../../core/libs/prx/libSceNpSessionSignaling/Export.cpp) - initialization, context lookup and output validation follow the system library. Connections never activate in the offline runtime; activation returns unavailable and a connection query on a valid context returns connection-not-found without writing outputs. SDK-dependent peer-address validation and local-network discovery remain incomplete. - [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 - [sceNpSessionSignalingGetGroupInfo, sceNpSessionSignalingGetGroupFromSessionId, sceNpSessionSignalingGetConnectionFromNetAddress, sceNpSessionSignalingGetConnectionFromNetAddress2, sceNpSessionSignalingGetConnectionFromPeerAddress, sceNpSessionSignalingGetConnectionFromPeerAddress2](../../../core/libs/prx/libSceNpSessionSignaling/Export.cpp) (libSceNpSessionSignaling) - no session ever activates here, so every lookup on a valid context ends at not-found (group 0x8055330A, connection 0x8055330C). The signatures and the checks before it are the PS5 13.60 module's, read from disassembly: 0x80553301 before initialization, 0x80553303 for a null pointer, then 0x80553308 for an unknown context diff --git a/docs/dev/debt/libSceNpSessionSignalingCrossplay.md b/docs/dev/debt/libSceNpSessionSignalingCrossplay.md new file mode 100644 index 000000000000..160c31e2865f --- /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 5ec4954b21ef..627dee78b0c0 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/libSceNpSpeechToText.md b/docs/dev/debt/libSceNpSpeechToText.md new file mode 100644 index 000000000000..3c8874dce47e --- /dev/null +++ b/docs/dev/debt/libSceNpSpeechToText.md @@ -0,0 +1,17 @@ +# libSceNpSpeechToText technical debt + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceNpSpeechToText/Export.cpp) - 7 entries observed in a 3.20-labelled image and a later 13.60-labelled image are import-resolution declarations only. Neither image label authenticates 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). + +[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 | +| --- | --- | +| `sceNpSpeechToTextCreateContext` | `H24VD7D+W4w` | +| `sceNpSpeechToTextDestroyContext` | `aJNJLj8lveA` | +| `sceNpSpeechToTextGetEvent` | `Xdx4YH9x88w` | +| `sceNpSpeechToTextInitialize` | `WuUZSVsrAUM` | +| `sceNpSpeechToTextStart` | `Ufh61EFu4RA` | +| `sceNpSpeechToTextStop` | `AP42vOnjWbA` | +| `sceNpSpeechToTextTerminate` | `Jea9OjMN7Eg` | diff --git a/docs/dev/debt/libSceNpTcs.md b/docs/dev/debt/libSceNpTcs.md index 3f4822e6e5ab..f22ccbfae851 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/libSceNpTextToSpeech.md b/docs/dev/debt/libSceNpTextToSpeech.md new file mode 100644 index 000000000000..547e6121107e --- /dev/null +++ b/docs/dev/debt/libSceNpTextToSpeech.md @@ -0,0 +1,21 @@ +# libSceNpTextToSpeech technical debt + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceNpTextToSpeech/Export.cpp) - 11 entries observed in a 3.20-labelled image and a later 13.60-labelled image are import-resolution declarations only. Neither image label authenticates 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). + +[Version-pinned selected ELF export records](https://gist.github.com/kyon-eth/752e1b1d4a6ac8a26c97e693527fefbd/a7bddd315c7740a7d065af9e80b0447fcd5b91be) 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 module. The extract SHA-256 is `63256453dc9620091ce6af95f8b243b7da8f2ce76a585f4886f76aa6625b5b21`; its full-module sorted-function-NID digests and raw module-parameter words permit independent comparison. The extract is an analyst-produced metadata record, not independent authentication of the original images or proof of prototypes or behavior. The separately published 3.20 source catalog has no module file for this library. + +| Name | NID | +| --- | --- | +| `sceNpTextToSpeechCreateContext` | `haRamb8yLZA` | +| `sceNpTextToSpeechDestroyContext` | `TxNIFtShi5k` | +| `sceNpTextToSpeechGetEvent` | `j3hQPQAk3Tw` | +| `sceNpTextToSpeechInitialize` | `r7RfvNSphGE` | +| `sceNpTextToSpeechTerminate` | `r93hi3wAJOU` | +| `Unknown` | `-wGjkwcjXWs` | +| `Unknown` | `APYz0RAIugo` | +| `Unknown` | `Fp7i5mx3JWM` | +| `Unknown` | `i3MidGD-Zfk` | +| `Unknown` | `oIMRm6q4pUM` | +| `Unknown` | `rIXr2WILhUE` | diff --git a/docs/dev/debt/libSceNpTrophy.md b/docs/dev/debt/libSceNpTrophy.md index 8e29331e4aa6..c5a1f5bb5a2b 100644 --- a/docs/dev/debt/libSceNpTrophy.md +++ b/docs/dev/debt/libSceNpTrophy.md @@ -1,18 +1,39 @@ # libSceNpTrophy technical debt +### Silent stubs + +- [sceNpTrophySystemDbgCtl, sceNpTrophySystemGetDbgParam, sceNpTrophySystemGetDbgParamInt, sceNpTrophySystemSetDbgParam and sceNpTrophySystemSetDbgParamInt](../../../core/libs/prx/libSceNpTrophy/Export.cpp) (libSceNpTrophy) - return `0x80551692` and do nothing else, which is all firmware 13.42's module does: it makes no calls and writes no memory for null, small or all-ones arguments ([run in an emulator](https://github.com/boykopovar/AnyPS5/pull/9874#issuecomment-6401358829)). The parameter lists stay unknown and unused + ### Unknown function info - [sceNpTrophyRegisterContext, sceNpTrophyGetTrophyUnlockState, sceNpTrophyUnlockTrophy](../../../core/libs/prx/libSceNpTrophy/Export.cpp) (libSceNpTrophy, PS4) - the trophy definitions in `TROPCONF.ESFM` are encrypted, so the trophy count is the number of consecutive `TROPnnn.PNG` icons in the title's `/app0/sce_sys/trophy/trophyNN.trp`. Unlocks are kept per user and service label in `_trophy/trophyNN.` under the working directory, no platinum trophy is reported (`platinumId` is -1), and a locked trophy's icon fails with `TROPHY_NOT_UNLOCKED`. None of it is checked on a console. - [sceNpTrophyAbortHandle](../../../core/libs/prx/libSceNpTrophy/Export.cpp) (libSceNpTrophy, PS4) - measured on a PS4 Pro (firmware 10.71): after an abort, `sceNpTrophyGetTrophyUnlockState` and `sceNpTrophyGetGameIcon` through that handle answer 0x80551607, before the not-registered check, and `sceNpTrophyRegisterContext` answers 0x80551607 before the missing trophy package (0x80551626 for a live handle); aborting again answers 0. The other calls that take the handle are assumed to answer 0x80551607 the same way, as `libSceNpTrophy.sprx` of firmware 10.71 maps the service's abort answer to it on the shared request path. On the console `sceNpTrophyRegisterContext` checks the process's NP title id before it reaches the service, so a title without one gets the NP title id error instead; AnyPS5 has no NP title id and does not model that step - [sceNpTrophyCaptureScreenshot, sceNpTrophyConfigGetTrophyDetails, sceNpTrophyConfigGetTrophyFlagArray, sceNpTrophyConfigGetTrophyGroupArray, sceNpTrophyConfigGetTrophyGroupDetails, sceNpTrophyConfigGetTrophySetInfo, sceNpTrophyConfigGetTrophySetInfoInGroup, sceNpTrophyConfigGetTrophySetVersion, sceNpTrophyConfigGetTrophyTitleDetails, sceNpTrophyConfigHasGroupFeature, sceNpTrophyGroupArrayGetNum, sceNpTrophyIntAbortHandle, sceNpTrophyIntCheckNetSyncTitles, sceNpTrophyIntCreateHandle](../../../core/libs/prx/libSceNpTrophy/Export.cpp) (libSceNpTrophy) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceNpTrophy.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 - [sceNpTrophyIntDestroyHandle, sceNpTrophyIntGetLocalTrophySummary, sceNpTrophyIntGetProgress, sceNpTrophyIntGetRunningTitle, sceNpTrophyIntGetRunningTitles, sceNpTrophyIntGetTrpIconByUri, sceNpTrophyIntNetSyncTitle, sceNpTrophyIntNetSyncTitles, sceNpTrophyNumInfoGetTotal, sceNpTrophySetInfoGetTrophyFlagArray, sceNpTrophySetInfoGetTrophyNum, sceNpTrophyShowTrophyList, sceNpTrophySystemAbortHandle, sceNpTrophySystemBuildGroupIconUri, sceNpTrophySystemBuildNetTrophyIconUri, sceNpTrophySystemBuildTitleIconUri](../../../core/libs/prx/libSceNpTrophy/Export.cpp) (libSceNpTrophy) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceNpTrophy.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 -- [sceNpTrophySystemBuildTrophyIconUri, sceNpTrophySystemCheckCallback, sceNpTrophySystemCheckNetSyncTitles, sceNpTrophySystemCheckRecoveryRequired, sceNpTrophySystemCloseStorage, sceNpTrophySystemCreateContext, sceNpTrophySystemCreateHandle, sceNpTrophySystemDbgCtl, sceNpTrophySystemDebugLockTrophy, sceNpTrophySystemDebugUnlockTrophy, sceNpTrophySystemDestroyContext, sceNpTrophySystemDestroyHandle, sceNpTrophySystemDestroyTrophyConfig, sceNpTrophySystemGetDbgParam, sceNpTrophySystemGetDbgParamInt](../../../core/libs/prx/libSceNpTrophy/Export.cpp) (libSceNpTrophy) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceNpTrophy.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 +- [sceNpTrophySystemBuildTrophyIconUri, sceNpTrophySystemCheckCallback, sceNpTrophySystemCheckNetSyncTitles, sceNpTrophySystemCheckRecoveryRequired, sceNpTrophySystemCloseStorage, sceNpTrophySystemCreateContext, sceNpTrophySystemCreateHandle, sceNpTrophySystemDebugLockTrophy, sceNpTrophySystemDebugUnlockTrophy, sceNpTrophySystemDestroyContext, sceNpTrophySystemDestroyHandle, sceNpTrophySystemDestroyTrophyConfig](../../../core/libs/prx/libSceNpTrophy/Export.cpp) (libSceNpTrophy) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceNpTrophy.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 - [sceNpTrophySystemGetGroupIcon, sceNpTrophySystemGetLocalTrophySummary, sceNpTrophySystemGetNextTitleFileEntryStatus, sceNpTrophySystemGetProgress, sceNpTrophySystemGetTitleFileStatus, sceNpTrophySystemGetTitleIcon, sceNpTrophySystemGetTitleSyncStatus, sceNpTrophySystemGetTrophyConfig, sceNpTrophySystemGetTrophyData, sceNpTrophySystemGetTrophyGroupData, sceNpTrophySystemGetTrophyIcon, sceNpTrophySystemGetTrophyTitleData, sceNpTrophySystemGetUserFileInfo, sceNpTrophySystemGetUserFileStatus](../../../core/libs/prx/libSceNpTrophy/Export.cpp) (libSceNpTrophy) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceNpTrophy.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 -- [sceNpTrophySystemIsServerAvailable, sceNpTrophySystemNetSyncTitle, sceNpTrophySystemNetSyncTitles, sceNpTrophySystemOpenStorage, sceNpTrophySystemPerformRecovery, sceNpTrophySystemRegisterTitleSyncedCallback, sceNpTrophySystemRegisterTitleUpdateCallback, sceNpTrophySystemRemoveAll, sceNpTrophySystemRemoveTitleData, sceNpTrophySystemRemoveUserData, sceNpTrophySystemSetDbgParam, sceNpTrophySystemSetDbgParamInt, sceNpTrophySystemUnregisterTitleSyncedCallback, sceNpTrophySystemUnregisterTitleUpdateCallback](../../../core/libs/prx/libSceNpTrophy/Export.cpp) (libSceNpTrophy) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceNpTrophy.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 +- [sceNpTrophySystemIsServerAvailable, sceNpTrophySystemNetSyncTitle, sceNpTrophySystemNetSyncTitles, sceNpTrophySystemOpenStorage, sceNpTrophySystemPerformRecovery, sceNpTrophySystemRegisterTitleSyncedCallback, sceNpTrophySystemRegisterTitleUpdateCallback, sceNpTrophySystemRemoveAll, sceNpTrophySystemRemoveTitleData, sceNpTrophySystemRemoveUserData, sceNpTrophySystemUnregisterTitleSyncedCallback, sceNpTrophySystemUnregisterTitleUpdateCallback](../../../core/libs/prx/libSceNpTrophy/Export.cpp) (libSceNpTrophy) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceNpTrophy.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 - [sceNpTrophySystemWrapDebugLockTrophy, sceNpTrophySystemWrapDebugUnlockTrophy, sceNpTrophySystemWrapGetGroupDetails, sceNpTrophySystemWrapGetPlayedTrophyTitles, sceNpTrophySystemWrapGetTitleDetails, sceNpTrophySystemWrapGetTrophyDetailsArray, sceNpTrophySystemWrapGetTrophyTitleIdsByNpTitleId, sceNpTrophySystemWrapRemoveAll, sceNpTrophySystemWrapRemoveTitleData, sceNpTrophySystemWrapRemoveUserData](../../../core/libs/prx/libSceNpTrophy/Export.cpp) (libSceNpTrophy) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceNpTrophy.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 +- [sceNpTrophySystemWrapGetGroupData, sceNpTrophySystemWrapGetGroupDataArray, sceNpTrophySystemWrapGetGroupDetailsArray, sceNpTrophySystemWrapGetTitleData, sceNpTrophySystemWrapGetTrophyData, sceNpTrophySystemWrapGetTrophyDataArray, sceNpTrophySystemWrapGetTrophyDetails](../../../core/libs/prx/libSceNpTrophy/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/libscenptrophy-838da4c283.jsonl). + ### Functional - [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 399efb305873..8ea4acfe3231 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 4e348841632d..d6ce715c3a28 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/libSceNpUniversalDataSystem.md b/docs/dev/debt/libSceNpUniversalDataSystem.md index cf98cd290813..9a086e25b45f 100644 --- a/docs/dev/debt/libSceNpUniversalDataSystem.md +++ b/docs/dev/debt/libSceNpUniversalDataSystem.md @@ -41,3 +41,4 @@ - [Trophy events](../../../core/libs/prx/libSceNpUniversalDataSystem/src/Event.cpp): `sceNpUniversalDataSystemPostEvent` stores an `_UnlockTrophy` event with an int32 `_trophy_id` of 0 or more as an unlock for the user and service label of its context, as KytyPS5 does, except an id that [libSceNpTrophy2](../../../core/libs/prx/libSceNpTrophy2/src/TrophyStore.cpp) refuses when the title's trophy data is loaded (one not in the data, a platinum or a progressive trophy). `_UpdateTrophyProgress` goes through the title's statistic rules like any other event (below). A context need not be registered, and every post of an event that `sceNpUniversalDataSystemCreateEvent` returned and that is not yet destroyed returns success (a null or any other event pointer stops the game): KytyPS5's errors for an unknown or unregistered context and for a malformed unlock are not verified. The storage statistics stay zero. - [Statistics](../../../core/libs/prx/libSceNpUniversalDataSystem/src/Event.cpp): every other event goes through the title's rules in `sce_sys/uds/udsNN.ucp`, which [libSceNpTrophy2](../../../core/libs/prx/libSceNpTrophy2/src/TitleTrophies.cpp) reads. Only `"aggregation":"latest"` and `"max"` statistics of `dataType` `uint32`, `uint64` or `int32` are kept; no public source documents the other aggregations (such as `count`, `collection` and `eachLatest`) or types, so their definitions and rules are skipped. Only rules whose input is a `$.name` path (dotted for nested objects) are applied. A value is used when it is an integer of any width that is not negative and fits the statistic's type and `minValue`/`maxValue`; KytyPS5 requires the statistic's exact width, and whether the console converts, clamps or rejects other values is not known. Statistics are stored per user and service label, and every trophy's `unlockCondition` is compared after each event that sets one. +- [Event checks](../../../core/libs/prx/libSceNpUniversalDataSystem/src/Event.cpp): before `sceNpUniversalDataSystemInitialize` the 13.42 module returns 0x80553117 from the event and property functions (creating, setting, destroying, sizing and describing), even for null arguments; these functions keep no initialized state and run normally. The module's `sceNpUniversalDataSystemCreateEvent` also compares packed sizes with 0x5000 bytes when `prop` is given (read from its disassembly, not measured); this one does not. `sceNpUniversalDataSystemEventToString` writes NaN and infinite properties as `std::to_chars` does; the console's text for them is not measured. diff --git a/docs/dev/debt/libSceNpWebApi.md b/docs/dev/debt/libSceNpWebApi.md index ce821ad674ae..e9c32534597d 100644 --- a/docs/dev/debt/libSceNpWebApi.md +++ b/docs/dev/debt/libSceNpWebApi.md @@ -1,9 +1,77 @@ # 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. - [sceNpWebApiInitialize, sceNpWebApiTerminate, sceNpWebApiCreateHandle, sceNpWebApiDeleteHandle, sceNpWebApiCreatePushEventFilter, sceNpWebApiDeletePushEventFilter](../../../core/libs/prx/libSceNpWebApi/Export.cpp) (libSceNpWebApi, PS4) - signatures, id ranges (library contexts 1 to 0x7fff, handles and filters below 0xf0000000) and errors (`LIB_CONTEXT_NOT_FOUND`, `HANDLE_NOT_FOUND`, `PUSH_EVENT_FILTER_NOT_FOUND`, `INVALID_ARGUMENT` for a missing filter parameter) follow [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/main/src/core/libraries/np/np_web_api/np_web_api_internal.cpp); they are not checked on a console. The libHttp context and pool size are kept but not used, since no request is ever sent. Limbo (CUSA01664) creates a context, a handle and filters when its game starts. + +- [The firmware inventory exports listed below](../../../core/libs/prx/libSceNpWebApi/Export.cpp) have unknown signatures and behaviour. Only their 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/libscenpwebapi-30b6435a6f.jsonl). Their parameterless `int` declarations are import-resolution placeholders, not confirmed ABI signatures, and every call throws through `NotImplemented_nid_no_patch`. + +| Name | NID | +| --- | --- | +| `sceNpWebApiAddMultipartPart` | `19KgfJXgM+U` | +| `sceNpWebApiClearAllUnusedConnection` | `KQIkDGf80PQ` | +| `sceNpWebApiClearUnusedConnection` | `f-pgaNSd1zc` | +| `sceNpWebApiGetConnectionStats` | `UJ8H+7kVQUE` | +| `sceNpWebApiGetErrorCode` | `2qSZ0DgwTsc` | +| `sceNpWebApiIntCreateCtxIndExtdPushEventFilter` | `c1pKoztonB8` | +| `sceNpWebApiIntCreateServicePushEventFilter` | `TZSep4xB4EY` | +| `sceNpWebApiIntRegisterServicePushEventCallback` | `VjVukb2EWPc` | +| `sceNpWebApiIntRegisterServicePushEventCallbackA` | `sfq23ZVHVEw` | +| `sceNpWebApiRegisterExtdPushEventCallback` | `vrM02A5Gy1M` | +| `sceNpWebApiSendMultipartRequest` | `KCItz6QkeGs` | +| `sceNpWebApiSendMultipartRequest2` | `DsPOTEvSe7M` | +| `sceNpWebApiSetMaxConnection` | `gRiilVCvfAI` | + +- [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. -- [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. That homebrew probe, with a non-retail SDK version, accepted method 99, so `INVALID_ARGUMENT` for a method after DELETE from SDK 2.50 is unverified. `sceNpWebApiTerminate` also deletes user contexts and requests; shadPS4 stops after the first user context. +- [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 4a122ad7a030..f6f1f467a9e0 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/libSceOpusCeltEnc.md b/docs/dev/debt/libSceOpusCeltEnc.md index 6540f74459eb..2b4623ddac8b 100644 --- a/docs/dev/debt/libSceOpusCeltEnc.md +++ b/docs/dev/debt/libSceOpusCeltEnc.md @@ -2,6 +2,8 @@ ### Unknown function info +- [sceOpusCeltEncGetAjmContext, sceOpusCeltMultistreamEncCreate, sceOpusCeltMultistreamEncCtl and sceOpusCeltMultistreamEncCreateEx](../../../core/libs/prx/libSceOpusCeltEnc/Export.cpp) have unknown signatures and behaviour. Only 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/libsceopusceltenc-b31be2adfa.jsonl). The parameterless `int` declarations are import-resolution placeholders, not confirmed ABI signatures, and every call throws through `NotImplemented_nid_no_patch`. + - [sceOpusCeltEncCtl, sceOpusCeltEncEncodeFloatWithPriority and sceOpusCeltEncEncodeWithPriority](../../../core/libs/prx/libSceOpusCeltEnc/Export.cpp) (libSceOpusCeltEnc) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceOpusCeltEnc.c). The prototypes mirror the sibling encoder declarations and libopus's own ctl and priority entry points, but the console's request codes, priority and batch semantics were not recovered. They throw through `NotImplemented_nid_no_patch`; this is not an ABI claim. ### Functional diff --git a/docs/dev/debt/libSceOpusDec.md b/docs/dev/debt/libSceOpusDec.md index 18d5334b3da8..900f43efef7f 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/libSceOpusSilkEnc.md b/docs/dev/debt/libSceOpusSilkEnc.md index ef82072a5a91..666f609d9791 100644 --- a/docs/dev/debt/libSceOpusSilkEnc.md +++ b/docs/dev/debt/libSceOpusSilkEnc.md @@ -2,6 +2,8 @@ ### Unknown function info +- [sceOpusSilkEncGetAjmContext](../../../core/libs/prx/libSceOpusSilkEnc/Export.cpp) has an unknown signature and behaviour. Only its name and NID are established by the [13.60 export inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libsceopussilkenc-5db8f0bbee.jsonl). The parameterless `int` declaration is an import-resolution placeholder, not a confirmed ABI signature, and every call throws through `NotImplemented_nid_no_patch`. + - [sceOpusSilkEncCancel, sceOpusSilkEncCtl, sceOpusSilkEncEncodeFloatWithPriority, sceOpusSilkEncEncodeFloatWithPriorityAndTimeout, sceOpusSilkEncEncodeWithPriority and sceOpusSilkEncEncodeWithPriorityAndTimeout](../../../core/libs/prx/libSceOpusSilkEnc/Export.cpp) (libSceOpusSilkEnc) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceOpusSilkEnc.c). The prototypes mirror the sibling encoder declarations and libopus's own ctl, priority and batch-id entry points, but the console's request codes, priority, timeout and batch semantics were not recovered. They throw through `NotImplemented_nid_no_patch`; this is not an ABI claim. ### Functional diff --git a/docs/dev/debt/libScePSNowGkp.md b/docs/dev/debt/libScePSNowGkp.md index 3cc3313d6b7c..44aba605ba7b 100644 --- a/docs/dev/debt/libScePSNowGkp.md +++ b/docs/dev/debt/libScePSNowGkp.md @@ -3,3 +3,17 @@ ### Unknown function info - [sceCloudClientCancelRequestGame, sceCloudClientReset, sceCloudClientSetAuthCodes, sceCloudClientTestConnection](../../../core/libs/prx/libScePSNowGkp/Export.cpp) (libScePSNowGkp) - names and NIDs verified from the pinned [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libScePSNowGkp.c) (`libScePSNowGkp.c`), with NID match confirmed via `tools/nid_names.py` `compute_nid`. Signatures, parameter layouts, and runtime behavior remain unverified; all paths throw through `NotImplemented_nid_no_patch`. + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libScePSNowGkp/Export.cpp) - 5 entries observed in a 3.20-labelled image and a later 13.60-labelled image are import-resolution declarations only. Neither image label authenticates 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). + +[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 | +| --- | --- | +| `sceCloudClientGetStatus` | `Eg5P0M+xBOM` | +| `sceCloudClientInitialize` | `LILdILcY8dI` | +| `sceCloudClientRequestClientId` | `yzaZSAU-A-g` | +| `sceCloudClientSetSettings` | `a-lj-Jt2mfI` | +| `sceCloudClientTerminate` | `VKl8jwyV6Y0` | diff --git a/docs/dev/debt/libScePad.md b/docs/dev/debt/libScePad.md index 4a5921596c37..a89fb25fe7db 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/libScePadTracker.md b/docs/dev/debt/libScePadTracker.md index 31110367065e..09d4dc9521df 100644 --- a/docs/dev/debt/libScePadTracker.md +++ b/docs/dev/debt/libScePadTracker.md @@ -2,4 +2,5 @@ ### Unknown function info -- [scePadTrackerCalibrate, scePadTrackerGetWorkingMemorySize, scePadTrackerInit, scePadTrackerReadState, scePadTrackerTerm and scePadTrackerUpdate](../../../core/libs/prx/libScePadTracker/Export.cpp) (libScePadTracker) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libScePadTracker.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 +- [scePadTrackerCalibrate, scePadTrackerInit, scePadTrackerReadState, scePadTrackerTerm and scePadTrackerUpdate](../../../core/libs/prx/libScePadTracker/Export.cpp) (libScePadTracker) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libScePadTracker.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 +- [scePadTrackerGetWorkingMemorySize](../../../core/libs/prx/libScePadTracker/Export.cpp) (libScePadTracker) - what the two sizes are for is unknown. It follows firmware 13.42's libScePadTracker.sprx, read from its disassembly and run natively on x86-64 (not a console): a null first or second pointer returns `0x80c40003` and writes nothing; otherwise it stores the 32-bit value 0x800000 through each pointer and returns 0. Both values are module data that no other code in the module references. diff --git a/docs/dev/debt/libScePlayGo.md b/docs/dev/debt/libScePlayGo.md index 5abaab162207..2d42e4c1c59e 100644 --- a/docs/dev/debt/libScePlayGo.md +++ b/docs/dev/debt/libScePlayGo.md @@ -2,8 +2,9 @@ ### Unknown function info -- [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 c7677e9529a6..ef111888206e 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/libScePlayReady2.md b/docs/dev/debt/libScePlayReady2.md index e3a51504a93f..c259df2bc6f5 100644 --- a/docs/dev/debt/libScePlayReady2.md +++ b/docs/dev/debt/libScePlayReady2.md @@ -2,6 +2,8 @@ ### Unknown function info +- [13.60 inventory additions](../../../core/libs/prx/libScePlayReady2/Export.cpp) - `scePlayReadyApiSetInitParamFlags` (`O24y38B4uqY`) have unknown signatures and behavior. The parameterless `int` declarations only resolve imports and are not verified ABI prototypes; every call throws through `NotImplemented_nid_no_patch`. Name/NID bindings are from the [13.60 inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libsceplayready2-cf140a4c7d.jsonl). + - [scePlayReadyBufferInitWithData, scePlayReadyCloneDecryptContext, scePlayReadyDebugPrintf, scePlayReadyDebugSetLevel, scePlayReadyLicenseDelete, scePlayReadyLicenseDeleteInMemory, scePlayReadyLicenseGetExpirationTime, scePlayReadyLicenseGetProperty, scePlayReadyReaderClose, scePlayReadyReaderDecryptMultiple, scePlayReadyReaderDecryptMultipleOpaque, scePlayReadyReaderDecryptOpaque, scePlayReadyReaderDecrypt_Legacy, scePlayReadyReaderFreeOpaqueContent, scePlayReadyReaderRetrieveOpaqueContent and scePlayReadyReinitialize](../../../core/libs/prx/libScePlayReady2/Export.cpp) (libScePlayReady2) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libScePlayReady2.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 ### Inventory exports declared elsewhere diff --git a/docs/dev/debt/libScePlayReady4.md b/docs/dev/debt/libScePlayReady4.md index 5ee34a2ccff7..8e36a19cf7b1 100644 --- a/docs/dev/debt/libScePlayReady4.md +++ b/docs/dev/debt/libScePlayReady4.md @@ -2,7 +2,29 @@ ### Unknown function info +- [13.60 inventory additions](../../../core/libs/prx/libScePlayReady4/Export.cpp) - `scePlayReadyCdmiProcessLicenseAckResponse` (`CG-PDnXEyns`), `scePlayReadyCdmiGetSessionId2` (`POnQSapoh38`), `scePlayReadyCdmiGenerateLicenseAckRequest` (`dxbGiL38h+4`), `scePlayReadyCdmiGenerateRequest2` (`iZk5IYEltB8`), `scePlayReadyDomainJoinProcessResponse2` (`k5bAoX35xgg`) have unknown signatures and behavior. The parameterless `int` declarations only resolve imports and are not verified ABI prototypes; every call throws through `NotImplemented_nid_no_patch`. Name/NID bindings are from the [13.60 inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libsceplayready4-e431478f47.jsonl). + - [scePlayReadyApiPlatform, scePlayReadyCdmiClose, scePlayReadyCdmiCreateMediaKeySession, scePlayReadyCdmiCreateMediaKeySystemAccess, scePlayReadyCdmiCreateMediaKeys, scePlayReadyCdmiDecryptMultipleOpaque, scePlayReadyCdmiDecryptOpaque, scePlayReadyCdmiDecryptOpaque2, scePlayReadyCdmiDestroyMediaKeySession, scePlayReadyCdmiDestroyMediaKeySystemAccess, scePlayReadyCdmiDestroyMediaKeys, scePlayReadyCdmiFreeOpaqueDecryptedContent, scePlayReadyCdmiGenerateRequest, scePlayReadyCdmiGetConfiguration, scePlayReadyCdmiGetExpiration, scePlayReadyCdmiGetKeySystem, scePlayReadyCdmiGetMediaKeyCount, scePlayReadyCdmiGetMediaKeyStatus, scePlayReadyCdmiGetSessionAppContext, scePlayReadyCdmiGetSessionId, scePlayReadyCdmiIsLicenseAckRequired, scePlayReadyCdmiLoad, scePlayReadyCdmiRemove, scePlayReadyCdmiRetrieveOpaqueDecryptedContent, scePlayReadyCdmiSetServerCertificate, scePlayReadyCdmiSetSessionCallbacks, scePlayReadyCdmiUpdate, scePlayReadyLicenseCount, scePlayReadyProfileClear, scePlayReadyProfileEnter, scePlayReadyProfileLeave, scePlayReadyProfilePause, scePlayReadyProfileResume, scePlayReadyProfileStart and scePlayReadyProfileStop](../../../core/libs/prx/libScePlayReady4/Export.cpp) (libScePlayReady4) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libScePlayReady4.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 ### 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 000000000000..81e37c07b4f0 --- /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 000000000000..4b2066453a69 --- /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 eee8a19074a4..3027e125da24 100644 --- a/docs/dev/debt/libSceRazorCpu.md +++ b/docs/dev/debt/libSceRazorCpu.md @@ -12,10 +12,23 @@ | `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 -- [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. +- [Additional profiling exports](../../../core/libs/prx/libSceRazorCpu/Export.cpp) - signatures and behavior are unknown. The parameterless `int` declarations only resolve imports, make no ABI claim and every call throws through `NotImplemented_nid_no_patch`. Names and NIDs are from the [13.60 inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libscerazorcpu-98b3fdc87b.jsonl); not measured on a console. + +| Name | NID | +| --- | --- | +| `sceRazorCpuUserSignalWaitBegin` | `7y2mIfBZO+I` | +| `sceRazorCpuUserSignalPost` | `9qdtVVdPT-0` | +| `sceRazorCpuWriteBookmarkEnd` | `Ay3X-hss71o` | +| `sceRazorCpuUserSignalWaitEnd` | `C0QNDdQW+8M` | +| `sceRazorCpuWorkloadRunBeginEx` | `Crha9LvwvJM` | +| `sceRazorCpuUserSignalPostEx` | `cKl+d8u8mbk` | +| `sceRazorCpuUserSignalWaitBeginEx` | `lC8-7cVnkHA` | + +- [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 fb8bc0c728d0..05d1010c7675 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. @@ -65,3 +80,7 @@ - [sceRegMgrLogPull](../../../core/libs/prx/libSceRegMgr/Export.cpp) (libSceRegMgr) - unknown signature - [sceRegMgrCntlStopHdd](../../../core/libs/prx/libSceRegMgr/Export.cpp) (libSceRegMgr) - unknown signature - [sceRegMgrPrintInfo](../../../core/libs/prx/libSceRegMgr/Export.cpp) (libSceRegMgr) - unknown signature + +### Additional PS5 3.20 imports (xdCloudy #9485) + +- [sceRegMgrUnknown_*_nid_no_patch](../../../core/libs/prx/libSceRegMgr/Export.cpp) (libSceRegMgr) - 1 PS5 3.20 import declarations (`sceRegMgrLogStart`). Their prototypes and behavior are unverified; each uses the no-parameter import-resolution convention and throws through `NotImplemented_nid_no_patch`. This records the export names without claiming an ABI or behavior. Source: [PS5-3.20_Libs](https://github.com/DNNDHH/PS5-3.20_Libs). diff --git a/docs/dev/debt/libSceRemotePlayClientIpc.md b/docs/dev/debt/libSceRemotePlayClientIpc.md new file mode 100644 index 000000000000..9592f444fdf3 --- /dev/null +++ b/docs/dev/debt/libSceRemotePlayClientIpc.md @@ -0,0 +1,28 @@ +# libSceRemotePlayClientIpc technical debt + +### Additional callable exports + +- [Additional callable exports](../../../core/libs/prx/libSceRemotePlayClientIpc/Export.cpp) - 18 entries observed in a 3.20-labelled image and a later 13.60-labelled image are import-resolution declarations only. Neither image label authenticates 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). + +[Version-pinned selected ELF export records](https://gist.github.com/kyon-eth/752e1b1d4a6ac8a26c97e693527fefbd/a7bddd315c7740a7d065af9e80b0447fcd5b91be) 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 module. The extract SHA-256 is `63256453dc9620091ce6af95f8b243b7da8f2ce76a585f4886f76aa6625b5b21`; its full-module sorted-function-NID digests and raw module-parameter words permit independent comparison. The extract is an analyst-produced metadata record, not independent authentication of the original images or proof of prototypes or behavior. The separately published 3.20 source catalog has no module file for this library. + +| Name | NID | +| --- | --- | +| `sceRemotePlayClientIpcGetClientStatus` | `irNARl+D5xU` | +| `sceRemotePlayClientIpcInitialize` | `jJ38aat7wbo` | +| `sceRemotePlayClientIpcSetClientStatus` | `GJM1+qhe8hU` | +| `sceRemotePlayClientIpcTerminateStreaming` | `9CcjWFByTOA` | +| `sceRemotePlayClientIpcTerminate` | `iFHBKxCdlwI` | +| `sceRemotePlayClientIpcWaitConnectionAsync` | `70mIea0Xnxk` | +| `Unknown` | `0Ezd4jv7F-4` | +| `Unknown` | `2dzIQ1US7Ag` | +| `Unknown` | `4+sKR9yWkWY` | +| `Unknown` | `EVbYn8UOvMs` | +| `Unknown` | `JGKtr0+B87A` | +| `Unknown` | `JVKO2gPlWPw` | +| `Unknown` | `M16-T2ERA8c` | +| `Unknown` | `PnLBwmAGb-g` | +| `Unknown` | `RiyUwZBmS-k` | +| `Unknown` | `a3LqZtr60o4` | +| `Unknown` | `gO3jwkOQ834` | +| `Unknown` | `gqmq4cTnR0M` | diff --git a/docs/dev/debt/libSceRemoteplay.md b/docs/dev/debt/libSceRemoteplay.md index d25434e10ce7..084ffa7ca9c3 100644 --- a/docs/dev/debt/libSceRemoteplay.md +++ b/docs/dev/debt/libSceRemoteplay.md @@ -1,12 +1,24 @@ # 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, sceRemoteplayInitialize, sceRemoteplayTerminate](../../../core/libs/prx/libSceRemoteplay/Export.cpp) (libSceRemoteplay) - `sceRemoteplayGetConnectionStatus` reports `REMOTEPLAY_CONNECTION_STATUS_DISCONNECT` (0) for any user ID; `sceRemoteplayInitialize` and `sceRemoteplayTerminate` perform no remote play session setup or teardown +- [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 + +### Functional + +- [sceRemoteplayInitialize, sceRemoteplayTerminate](../../../core/libs/prx/libSceRemoteplay/Export.cpp) (libSceRemoteplay) - the state machine follows the firmware 11.00 module (`libSceRemoteplay.sprx`), not checked on 13.x or on a console. `Initialize` (`0x13a0`) and `Terminate` (`0x13d0`) are thin wrappers over one singleton. An absent heap is accepted and the module allocates and aligns a 0x1800-byte heap itself, whose allocation failure is `0x80fc0002`; a present heap must be at least 0x1800 (`0x80fc0001`), and a call while the state is initialized returns `0x80fc0003`. Terminate returns `0x80fc0004` unless the module is initialized and leaves a terminated state that a later initialize accepts, so the state is not a boolean +- [sceRemoteplayInitialize](../../../core/libs/prx/libSceRemoteplay/Export.cpp) (libSceRemoteplay) - the 0x1800 heap contents (the session object), the 5,000,000-unit timeout and the two virtual calls that initialize performs are unmodelled +- [sceRemoteplayGetConnectionStatus](../../../core/libs/prx/libSceRemoteplay/Export.cpp) (libSceRemoteplay) - the state checks follow the 11.00 module (`0x1520`), not checked on 13.x or on a console: it returns `0x80fc0004` unless the module is initialized, checks the state before the output pointer and answers `0x80fc0001` for a null output ### 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/libSceResourceArbitrator.md b/docs/dev/debt/libSceResourceArbitrator.md new file mode 100644 index 000000000000..b9a620e292b7 --- /dev/null +++ b/docs/dev/debt/libSceResourceArbitrator.md @@ -0,0 +1,30 @@ +# libSceResourceArbitrator technical debt + +### Additional callable export inventory + +- [Additional exports](../../../core/libs/prx/libSceResourceArbitrator/Export.cpp) - 14 import-resolution declarations (7 named candidates and 7 unresolved NIDs). All entries call `NotImplemented_nid_no_patch`. Parameterless `int` declarations do not establish parameter or return ABI; no runtime implementation or title unblock is claimed. + +#### Membership and identity evidence + +The inspected `PT_SCE_MODULEPARAM` record contains version words `0x13590001` at offset `0x10` and `0x13600007` at offset `0x14`. The 13.60 label refers to the latter SDK-formatted word, not independently authenticated retail firmware or an introduction date. The [reproducible static audit](https://github.com/boykopovar/AnyPS5/pull/12367#issuecomment-6470603298) records the extraction/filtering procedure and the observed NID-set digest. Each row below was read as a defined `STT_FUNC` entry; RVA and size are symbol-table values, not runtime addresses or function bytes. + +Unique function NIDs in the inspected module: **14**. SHA-256 of sorted unique NIDs (one ASCII NID plus LF per row): `fd766716d98fc4ed8ecea0d6b4cb81602405a5deadc62fc98efeb3a1850cd179`. All 14 proposed NIDs are members of that set. + +Candidate names marked **aerolib** occur in the [repository-pinned table](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv). Names marked **public candidate** occur in the [public ps5rs identity database at commit `2304be5131221bae0dac24b9767cabffda33f747`](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv). Every named candidate was recomputed with the repository NID algorithm and matched to a function NID in the inspected table; no name was assigned by ordinal or adjacent address. Those databases support spelling, not firmware attribution, prototypes or behavior. Unresolved names remain explicit NID aliases. + +| Candidate / unresolved | NID | Name evidence | ELF RVA | Symbol bytes | +| --- | --- | --- | --- | ---: | +| `sceResourceArbitratorChangeState` | `CYjfezkWcaE` | aerolib | `0x10b0` | 168 | +| `sceResourceArbitratorClearCallback` | `LqmYZGB-UEQ` | aerolib | `0xee0` | 172 | +| `sceResourceArbitratorGetFeatureIdList` | `fBX+DBOwNis` | public candidate | `0x11f0` | 308 | +| `sceResourceArbitratorIsExecutable` | `3iZXcGeRgJk` | aerolib | `0x1160` | 142 | +| `sceResourceArbitratorPostTelemetry` | `GmaE0Ew4h4s` | aerolib | `0x1420` | 168 | +| `sceResourceArbitratorSendDebugFunction` | `mtLIcm9hwFM` | aerolib | `0x1b30` | 108 | +| `sceResourceArbitratorSetCallback` | `kJvjeet+f9I` | aerolib | `0xdb0` | 292 | +| `Unknown` | `3xRoVp7fPPY` | unresolved | `0x1a90` | 157 | +| `Unknown` | `OM6SXhDZdiU` | unresolved | `0x1550` | 229 | +| `Unknown` | `TYiIrKTzQ8s` | unresolved | `0x17a0` | 157 | +| `Unknown` | `cT1vA0DTMcs` | unresolved | `0x14d0` | 120 | +| `Unknown` | `jzKwHzhEBIQ` | unresolved | `0x1330` | 235 | +| `Unknown` | `rMJnXXj6GIo` | unresolved | `0x1840` | 396 | +| `Unknown` | `ru9qkt9UCLQ` | unresolved | `0x1640` | 348 | diff --git a/docs/dev/debt/libSceRnpsAppMgr.md b/docs/dev/debt/libSceRnpsAppMgr.md index b430381f91cf..709985f2cec6 100644 --- a/docs/dev/debt/libSceRnpsAppMgr.md +++ b/docs/dev/debt/libSceRnpsAppMgr.md @@ -3,3 +3,7 @@ ### Unknown function info - [sceRnpsAppMgrBlockAppInstall, sceRnpsAppMgrCreateUpdateRequest, sceRnpsAppMgrCreateUrlRequest, sceRnpsAppMgrDestroyBundle, sceRnpsAppMgrDestroyUpdateRequest, sceRnpsAppMgrFinishUrlRequest, sceRnpsAppMgrGetAppInfo, sceRnpsAppMgrGetAppInfoDebugString, sceRnpsAppMgrGetAppInfoList, sceRnpsAppMgrGetEventForShellUI, sceRnpsAppMgrGetUpdateProgress, sceRnpsAppMgrHasEventForShellUI, sceRnpsAppMgrInitialize, sceRnpsAppMgrPushEventForShellUI, sceRnpsAppMgrRecoverUfsImage, sceRnpsAppMgrRegisterShellUI, sceRnpsAppMgrRemoveApp, sceRnpsAppMgrRemoveAppOnSystemShutdown, sceRnpsAppMgrRemoveUfsImageOnSystemShutdown, sceRnpsAppMgrRequestUpdateCheck, sceRnpsAppMgrSetCrlUrl, sceRnpsAppMgrSetEventFlagForClients, sceRnpsAppMgrSetUpdateUrl, sceRnpsAppMgrStartService, sceRnpsAppMgrTerminate, sceRnpsAppMgrUnblockAppInstall and sceRnpsAppMgrUnregisterShellUI](../../../core/libs/prx/libSceRnpsAppMgr/Export.cpp) (libSceRnpsAppMgr) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceRnpsAppMgr.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 + +- [sceRnpsAppMgrGetEvent, sceRnpsAppMgrGetMboInfo, sceRnpsAppMgrGetMboManifestDebugString, sceRnpsAppMgrIsBgsInstallReady](../../../core/libs/prx/libSceRnpsAppMgr/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/libscernpsappmgr-cd4e6339be.jsonl); signatures and behaviour remain unknown. Parameterless `int` declarations are import-resolution placeholders, not confirmed ABI signatures. These exports provide no application-management implementation. + +- [sceRnpsAppMgrIsCrlUpdated, sceRnpsAppMgrIsMboUpdated, sceRnpsAppMgrVerifyApp, sceRnpsAppMgrVerifyFileInApp](../../../core/libs/prx/libSceRnpsAppMgr/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/libscernpsappmgr-cd4e6339be.jsonl); signatures and behaviour remain unknown. Parameterless `int` declarations are import-resolution placeholders, not confirmed ABI signatures. These exports provide no application-management implementation. diff --git a/docs/dev/debt/libSceRtc.md b/docs/dev/debt/libSceRtc.md index 32629a01377c..62b5d6b9399b 100644 --- a/docs/dev/debt/libSceRtc.md +++ b/docs/dev/debt/libSceRtc.md @@ -21,4 +21,5 @@ ### Functional +- [sceRtcParseRFC3339, sceRtcParseDateTime](../../../core/libs/prx/libSceRtc/Export.cpp) (libSceRtc) - when `second == 60`, both functions return 0 (success) but do not write the tick for the leap second; they still subtract the timezone offset from the existing output tick. `sceRtcParseDateTime` has the same behavior for digit-led (RFC 3339 style) input. Measured on PS5 firmware 13.60; see PR #1397. - The process-local clocks set by [sceRtcSetCurrentTick, sceRtcSetCurrentNetworkTick, sceRtcSetCurrentAdNetworkTick and sceRtcSetCurrentDebugNetworkTick](../../../core/libs/prx/libSceRtc/Export.cpp) are visible only through libSceRtc. The system clock and libkernel clock APIs keep reporting host time; cross-library clock consistency is not modelled. The console's clock interactions are not measured diff --git a/docs/dev/debt/libSceRudp.md b/docs/dev/debt/libSceRudp.md index a709e28c7325..21ac9a84ef1c 100644 --- a/docs/dev/debt/libSceRudp.md +++ b/docs/dev/debt/libSceRudp.md @@ -15,4 +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. +- [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 67e0b2ff8cb0..453b8375a90c 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 43d64a5831b7..c0256b775860 100644 --- a/docs/dev/debt/libSceSaveData.native.md +++ b/docs/dev/debt/libSceSaveData.native.md @@ -2,10 +2,15 @@ ### 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. ### Unknown function info +- [sceSaveDataCheckPremiumMember, sceSaveDataCheckSyncStatus, sceSaveDataGetAllSizeProspero, sceSaveDataGetAutoSyncInfo, sceSaveDataGetCloudInfo, sceSaveDataNotifySaveDataDownload, sceSaveDataSetAutoSyncSettings](../../../core/libs/prx/libSceSaveData.native/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/libscesavedata-f92dab8a68.jsonl). The shared source exports them from both `libSceSaveData` and `libSceSaveData.native`. - [sceSaveDataCreateTransactionResource, sceSaveDataDeleteTransactionResource](../../../core/libs/prx/libSceSaveData.native/Export.cpp) (libSceSaveData.native) - transaction resources return synthetic positive identifiers and validate initialization state; resource parameter validation and transactional rollback semantics on host filesystem storage are unknown. Nine of the ten local titles call `sceSaveDataCreateTransactionResource`, at 15 sites: ten pass a size of 0xC0000 (768 KiB), four pass 0 (PPSA03984, PPSA25286 and both PPSA34502 sites), and one PPSA18194 site passes a value loaded from a global - [sceSaveDataPrepareForTransferring](../../../core/libs/prx/libSceSaveData.native/Export.cpp): the native wrapper confirms the same 16-byte mount point and 40-byte preparation parameter transport as `sceSaveDataPrepare`. Transfer preparation still requires the save-data service backend; its protected stub is unchanged. - [sceSaveDataTransferringMountPs4, sceSaveDataDirNameSearchPs4](../../../core/libs/prx/libSceSaveData.native/Export.cpp) (libSceSaveData.native) - arguments assumed to be those of `sceSaveDataTransferringMount` and `sceSaveDataDirNameSearch`: KytyPS5 binds both NIDs to the PS5 functions, and [prosper](https://github.com/mattias800/prosper) captured the same result layout on a title for the search. There is no PS4 save area, so the mount returns `NOT_FOUND` and the search reports zero hits @@ -16,7 +21,7 @@ - [sceSaveDataDirNameSearch, sceSaveDataGetMountInfo, sceSaveDataMount3](../../../core/libs/prx/libSceSaveData.native/Export.cpp) (libSceSaveData.native) - the 64 KiB block of [SharpEmu](https://github.com/sharpemu/sharpemu/blob/c6d304cc3328bad62cb671327ace181110cf2ddb/src/SharpEmu.Libs/SaveData/SaveDataExports.cs#L82-L84) and the 48 to 16384-block range of SharpEmu and [KytyPS5](https://github.com/KytyPS5/KytyPS5/blob/569ec04d1a77127c601eed522ad5bba187173f9d/src/libs/libSaveData.cpp#L30-L31) are not measured on a console, and file system overhead is not counted. What the console does with a `blocks` outside that range is unknown: KytyPS5 rejects the creating mount and SharpEmu clamps it; here a larger one is kept as 16384 and a smaller non-zero one as given. A save's size is the `blocks` of the mount that created it, kept in `.blocks`, else that of its next mount that names one, else 16384; its free blocks are that size less its files, each rounded up to 64 KiB blocks - [sceSaveDataInitialize3](../../../core/libs/prx/libSceSaveData.native/Export.cpp) (libSceSaveData.native) - a repeated initialize succeeds: PPSA12544's executable and its Unity SaveData plugin both initialize, and the plugin fails on any error. Initializations are counted and `sceSaveDataTerminate` ends the session at the last one; how the console pairs them is unknown. In PPSA12544 the executable calls it once (0x1721d8f) with 0 as its argument, only while a flag byte of its object is 0, and does not import `sceSaveDataTerminate`; the plugin calls it once (0x1fd2) with 0, skips the call while a flag byte of its own is set, and calls `sceSaveDataTerminate` from two functions (0x2059, 0x20d9) that clear that byte. Of 53 local titles, all import and call it and 28 import `sceSaveDataTerminate` (25 do not); counting tail jumps as calls and ignoring indirect calls, 17 of those 28 call both once, 10 call both twice and 1 calls it once and `sceSaveDataTerminate` twice. - [sceSaveDataCheckIpmiIfSize, sceSaveDataDebug, sceSaveDataDebugCheckBackupData, sceSaveDataDebugCleanMount, sceSaveDataDebugCompiledSdkVersion, sceSaveDataDebugCreateSaveDataRoot, sceSaveDataDebugProspero, sceSaveDataDebugRemoveSaveDataRoot and sceSaveDataDebugTarget](../../../core/libs/prx/libSceSaveData.native/Export.cpp) (libSceSaveData.native) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceSaveData.native.c). The seven no-argument prototypes follow the PS4 stubs in [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/f68923fe807f657348e6719ce658bcbd0a2b1c72/src/core/libraries/save_data/savedata.cpp#L653-L725), not measured on a console; no credible prototypes were found for the other two. All declarations have no parameters solely to resolve known imports and make no ABI claim. -- The following pending declarations have unverified signatures and behavior; they are parameterless import-resolution declarations and throw through `NotImplemented_nid_no_patch`: [`sceSaveDataAbort`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataBindPsnAccount`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataBindPsnAccountForSystemBackup`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataChangeDatabase`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataChangeInternal`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataCheckBackupData`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataCheckBackupDataForCdlg`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataCheckBackupDataInternal`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataCheckBackupDataLight`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataCheckCloudData`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataCheckSaveDataBroken`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataCheckSaveDataVersion`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataCheckSaveDataVersionLatest`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataClearProgress`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataCreateUploadData`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataDebugGetThreadId`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataDeleteAllUser`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataDeleteBackupData`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataDeleteCloudData`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataDeleteProspero`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataDeleteTitle`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataDeleteUser`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataDirNameSearchInternal`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataDownload`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetAllSize`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetAppLaunchedUser`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetAutoUploadConditions`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetAutoUploadRequestInfo`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetAutoUploadSetting`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetBoundPsnAccountCount`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetClientThreadPriority`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetCloudQuotaInfo`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetEventInfo`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetMountedSaveDataCount`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetProgress`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetSaveDataCount`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetSaveDataRootDir`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetSaveDataRootPath`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetSaveDataRootUsbPath`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetSavePoint`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetUpdatedDataCount`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataInitialize2`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataInitializeForCdlg`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataIsDeletingUsbDb`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataIsMounted`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataManualDelete`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataManualDownload`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataManualUpload`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataMount5`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataMountInternal`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataMountSys`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataRebuildDatabase`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataRegisterEventCallback`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataRestoreBackupData`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataRestoreBackupDataForCdlg`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataRestoreLoadSaveDataMemory`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataSetAutoUploadSetting`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataSetEventInfo`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataSetSaveDataLibraryUser`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataShutdownStart`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataSupportedFakeBrokenStatus`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataSyncCloudList`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataUmountSys`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataUmountWithBackup`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataUnregisterEventCallback`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataUpload`](../../../core/libs/prx/libSceSaveData.native/Export.cpp). +- The following pending declarations have unverified signatures and behavior; they are parameterless import-resolution declarations and throw through `NotImplemented_nid_no_patch`: [`sceSaveDataBindPsnAccount`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataBindPsnAccountForSystemBackup`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataChangeDatabase`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataChangeInternal`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataCheckBackupData`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataCheckBackupDataForCdlg`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataCheckBackupDataInternal`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataCheckBackupDataLight`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataCheckCloudData`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataCheckSaveDataBroken`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataCheckSaveDataVersion`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataCheckSaveDataVersionLatest`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataCreateUploadData`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataDebugGetThreadId`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataDeleteAllUser`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataDeleteBackupData`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataDeleteCloudData`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataDeleteProspero`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataDeleteTitle`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataDeleteUser`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataDirNameSearchInternal`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataDownload`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetAllSize`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetAppLaunchedUser`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetAutoUploadConditions`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetAutoUploadRequestInfo`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetAutoUploadSetting`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetBoundPsnAccountCount`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetClientThreadPriority`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetCloudQuotaInfo`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetEventInfo`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetProgress`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetSaveDataCount`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetSaveDataRootDir`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetSaveDataRootPath`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetSaveDataRootUsbPath`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetSavePoint`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataGetUpdatedDataCount`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataInitialize2`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataInitializeForCdlg`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataIsDeletingUsbDb`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataIsMounted`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataManualDelete`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataManualDownload`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataManualUpload`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataMount5`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataMountInternal`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataMountSys`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataRebuildDatabase`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataRegisterEventCallback`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataRestoreBackupData`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataRestoreBackupDataForCdlg`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataRestoreLoadSaveDataMemory`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataSetAutoUploadSetting`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataSetEventInfo`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataSetSaveDataLibraryUser`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataShutdownStart`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataSupportedFakeBrokenStatus`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataSyncCloudList`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataUmountSys`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataUmountWithBackup`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataUnregisterEventCallback`](../../../core/libs/prx/libSceSaveData.native/Export.cpp), [`sceSaveDataUpload`](../../../core/libs/prx/libSceSaveData.native/Export.cpp). ### Functional @@ -24,6 +29,12 @@ - [sceSaveDataDirNameSearch2](../../../core/libs/prx/libSceSaveData.native/Export.cpp) (libSceSaveData.native) runs the same search as `sceSaveDataDirNameSearch` with the same condition and result structures, as [SharpEmu](https://github.com/sharpemu/sharpemu/blob/main/src/SharpEmu.Libs/SaveData/SaveDataExports.cs) does, its only source; what distinguishes it on the console is unknown. One title (PPSA35669, in a plugin) disassembled for this entry has one call site (0x2eda71); it clears 56 bytes for the result structure first (the size of the structure used here), puts a value returned by a call with the argument 0x8000 at offset 8 and 0x400 at offset 0x10, and afterwards branches on a negative result and reads the 32-bit field at offset 0, skipping its loop when it is 0. That agrees with the result structure of `sceSaveDataDirNameSearch`. The condition structure was not read. - [sceSaveDataMount3](../../../core/libs/prx/libSceSaveData.native/Export.cpp) (libSceSaveData.native) - a failed mount (BUSY, EXISTS, NOT_FOUND, MOUNT_FULL) leaves the result as it was, as shadPS4 does; not checked on hardware. Animal Well (PPSA22520) depends on it: it checks for its save with a mount it never unmounts, then saves with a second mount of the same directory, ignores its BUSY and keeps using the first mount point for `sceSaveDataPrepare`, its file and `sceSaveDataUmount2`. In PPSA05347 the function that calls it at 0x235fbb5 zeroes its 0x40-byte result before the call and, for a negative result other than 0x809f0008 and 0x809f000f (BUSY included), logs the code and returns it without recording the mount; no abort follows. - [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/libSceSaveDataDialog.native.md b/docs/dev/debt/libSceSaveDataDialog.native.md index b4c8901752db..a601fa1e29a7 100644 --- a/docs/dev/debt/libSceSaveDataDialog.native.md +++ b/docs/dev/debt/libSceSaveDataDialog.native.md @@ -5,3 +5,7 @@ - [libSceSaveDataDialog.native](../../../core/libs/prx/libSceSaveDataDialog.native/Export.cpp) shows no UI and ignores progress values. Progress-bar mode (5) stays running until the caller closes it, matching Skyrim PPSA03747's save sequence; other modes still finish immediately and return button 1 and the first nonempty directory name. Console dialog timing and selection behavior remain unverified. Lifecycle state error codes follow shadPS4: `sceSaveDataDialogClose` returns `SAVE_DATA_DIALOG_ERROR_NOT_RUNNING` whenever not running, `sceSaveDataDialogGetResult` returns `SAVE_DATA_DIALOG_ERROR_NOT_FINISHED` whenever not finished (checked before null pointer), and `sceSaveDataDialogTerminate` closes running dialogs and returns OK, rejecting uninitialized calls with `SAVE_DATA_DIALOG_ERROR_NOT_INITIALIZED`, and progress updates (`sceSaveDataDialogProgressBarInc`, `sceSaveDataDialogProgressBarSetValue`) return `SAVE_DATA_DIALOG_ERROR_NOT_RUNNING` whenever not running. Parameter size in `sceSaveDataDialogOpen` is unvalidated as console behaviour is unmeasured. - [sceSaveDataDialogIsReadyToDisplay](../../../core/libs/prx/libSceSaveDataDialog.native/Export.cpp) returns 1 without checking dialog initialization or display readiness. + +### Unknown function info + +- [sceSaveDataDialogOpen](../../../core/libs/prx/libSceSaveDataDialog.native/Export.cpp) (libSceSaveDataDialog.native) - no overlay dialog is drawn for any mode: the layouts of the user message, system message and error code parameters that the `SaveDataDialogParam` pointers lead to have no source in this repository or measurement on a PS5, so a dialog is not built from them. Closes when: the parameter layouts are measured on a PS5 diff --git a/docs/dev/debt/libSceShare.md b/docs/dev/debt/libSceShare.md index fb1150aa7e2e..0efc92a2b64f 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 000000000000..fe4c54295806 --- /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 915f67c4c298..5358701d5356 100644 --- a/docs/dev/debt/libSceSharePlay.md +++ b/docs/dev/debt/libSceSharePlay.md @@ -5,9 +5,22 @@ - [sceSharePlayCrashDaemon, sceSharePlayGetCurrentInfo, sceSharePlayGetEvent, sceSharePlayNotifyDialogOpen, sceSharePlayNotifyForceCloseForCdlg, sceSharePlayResumeScreenForCdlg, sceSharePlayServerLock](../../../core/libs/prx/libSceSharePlay/Export.cpp) (libSceSharePlay) - the list is the intersection of the export table of the console's [libSceSharePlay](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceSharePlay.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. - [sceSharePlayServerUnLock, sceSharePlaySetMode, sceSharePlaySetProhibition, sceSharePlaySetProhibitionModeWithAppId, sceSharePlayStartStandby, sceSharePlayStartStreaming, sceSharePlayStopStandby, sceSharePlayStopStreaming](../../../core/libs/prx/libSceSharePlay/Export.cpp) (libSceSharePlay) - the list is the intersection of the export table of the console's [libSceSharePlay](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceSharePlay.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. +- [sceSharePlaySetShareScreenStatus](../../../core/libs/prx/libSceSharePlay/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 `zOdmo1vWHIc` are established by the [13.60 export inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libsceshareplay-b821361f17.jsonl); not measured on a console. + ### Functional - [sceSharePlayInitialize and sceSharePlayTerminate](../../../core/libs/prx/libSceSharePlay/Export.cpp) - native heap validation and initialization state are recovered: a null heap ignores the supplied size, a supplied heap requires at least 0x1800 bytes, repeated initialization returns 0x810E0003 and termination before initialization returns 0x810E0004. The host does not allocate the native internal heap, connect to the Share Play service or reproduce its failures. - [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/libSceShellUIUtil.md b/docs/dev/debt/libSceShellUIUtil.md index 12414a8ba7bb..49b574c29208 100644 --- a/docs/dev/debt/libSceShellUIUtil.md +++ b/docs/dev/debt/libSceShellUIUtil.md @@ -3,3 +3,5 @@ ### Unknown function info - [libSceShellUIUtil](../../../core/libs/prx/libSceShellUIUtil/Export.cpp) remains unimplemented. Native wrappers confirm the export signatures, including two input strings, output buffer, 32-bit capacity and optional 32-bit output size for `GetAppUrl`. The precise string meanings and the second word of the 8-byte `LaunchByUri` parameter require the receiving IPC service; the wrapper only checks its leading size. Task completion, IPC errors and lifecycle behavior are not implemented. + +- [sceShellUIUtilAbortTask](../../../core/libs/prx/libSceShellUIUtil/Export.cpp) throws through `NotImplemented_nid_no_patch`. Its name and NID `20O48GLcA-w` are bound by the [13.60 firmware inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libsceshelluiutil-8fc7bce6b8.jsonl); its signature and behaviour remain unknown. The parameterless `int` declaration is an import-resolution placeholder, not a confirmed ABI. Task cancellation and its errors are unimplemented. diff --git a/docs/dev/debt/libSceSocialScreen.md b/docs/dev/debt/libSceSocialScreen.md index 1978669c08d8..484b1fb809f5 100644 --- a/docs/dev/debt/libSceSocialScreen.md +++ b/docs/dev/debt/libSceSocialScreen.md @@ -2,4 +2,5 @@ ### Unknown function info -- [sceSocialScreenCloseSeparateMode, sceSocialScreenConfigureSeparateMode, sceSocialScreenCrashDaemon, sceSocialScreenGetIgnoreSeparateMode, sceSocialScreenInitialize, sceSocialScreenInitializeSeparateModeParameter, sceSocialScreenOpenSeparateMode, sceSocialScreenReserveHighFrameRateVideoCaptureRequest, sceSocialScreenSetIgnoreSeparateMode, sceSocialScreenSetMode and sceSocialScreenTerminate](../../../core/libs/prx/libSceSocialScreen/Export.cpp) (libSceSocialScreen) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceSocialScreen.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 +- [sceSocialScreenCloseSeparateMode, sceSocialScreenConfigureSeparateMode, sceSocialScreenCrashDaemon, sceSocialScreenGetIgnoreSeparateMode, sceSocialScreenInitialize, sceSocialScreenOpenSeparateMode, sceSocialScreenReserveHighFrameRateVideoCaptureRequest, sceSocialScreenSetIgnoreSeparateMode, sceSocialScreenSetMode and sceSocialScreenTerminate](../../../core/libs/prx/libSceSocialScreen/Export.cpp) (libSceSocialScreen) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceSocialScreen.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 +- [sceSocialScreenInitializeSeparateModeParameter](../../../core/libs/prx/libSceSocialScreen/Export.cpp) (libSceSocialScreen) - the layout of the 32-byte parameter block is unknown. It follows firmware 13.42's libSceSocialScreen.sprx, read from its disassembly and run natively on x86-64 (not a console): a null pointer returns `0x81440003`; otherwise it stores the 32-bit value 1 at offset 0, clears bytes 4 to 31, leaves later bytes unchanged and returns 0. diff --git a/docs/dev/debt/libSceSrcUtl.md b/docs/dev/debt/libSceSrcUtl.md index bb8018ab3a7a..240ff5ee4b53 100644 --- a/docs/dev/debt/libSceSrcUtl.md +++ b/docs/dev/debt/libSceSrcUtl.md @@ -2,4 +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 a45d758ec624..977b4879695a 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 386b64d98d9d..bfc9747c9ca7 100644 --- a/docs/dev/debt/libSceSysCore.md +++ b/docs/dev/debt/libSceSysCore.md @@ -2,6 +2,18 @@ ### Unknown function info +- [Additional SysCore exports](../../../core/libs/prx/libSceSysCore/Export.cpp) - the seven name/NID pairs below are defined exports in the [13.60 inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libscesyscore-d26d4fb57b.jsonl). Their signatures and behavior are unverified. Parameterless `int` declarations are import placeholders, not verified ABI prototypes; every call throws through `NotImplemented_nid_no_patch`. No application, coredump or debugger behavior is implemented. + +| Name | NID | +| --- | --- | +| `sceApplicationExitSpawn3` | `45owwvXWN+o` | +| `sceApplicationKickCoredump3` | `jPgvaIiVhRU` | +| `sceApplicationNotifyUnmountForExitSpawn` | `gsItPZhA9-s` | +| `sceApplicationSendResultOfDebuggerRestoreRequest` | `KVWYLwWcpHs` | +| `sceApplicationSendResultOfDebuggerSaveRequest` | `sMlp8+iJX-U` | +| `sceApplicationSwitchToPprNativeMode` | `GEsnTMR3YAA` | +| `sceApplicationSwitchToPprNativeMode2` | `EO-wjsuZdRM` | + - [sceApplicationGetAppInfoByAppId](../../../core/libs/prx/libSceSysCore/Export.cpp) takes a 32-bit application ID and a writable 152-byte record. The service fills the record through IPC; its complete field layout remains unresolved. The SystemService caller consumes a subrecord beginning at byte 48. - [_sceApplicationGetAppId, sceApplicationAddProcess2, sceApplicationBeginSclkChange, sceApplicationBlockingKill2, sceApplicationBlockingKill3, sceApplicationContinue, sceApplicationCrashSyscore, sceApplicationCrashSystemProcess](../../../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. @@ -15,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 7049c717ee0d..42d7b48f5285 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. @@ -14,4 +26,5 @@ ### Functional +- [sceSysmoduleGetModuleInfoForUnwind](../../../core/libs/prx/libSceSysmodule/Export.cpp) (WebAssembly) throws through the unsupported `sceKernelGetModuleInfoForUnwind` path instead of consulting host process mappings - [sceSysmoduleGetModuleInfoForUnwind](../../../core/libs/prx/libSceSysmodule/Export.cpp) (libSceSysmodule) - on Windows the region and file name of an address inside a loaded image are cached after the first lookup, because `VirtualQuery` on a large image section is slow. An entry is used only while the loader still reports the same image for the address (same base, time stamp and size). A page protection change inside the image after the first lookup, which would split or merge the region `VirtualQuery` reports, is not noticed. Addresses outside loaded images are queried every time diff --git a/docs/dev/debt/libSceSystemGesture.md b/docs/dev/debt/libSceSystemGesture.md index 5d9acec69022..37c5e5b6b20a 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 3d17ac6069e0..c19b58a61581 100644 --- a/docs/dev/debt/libSceSystemLogger2.md +++ b/docs/dev/debt/libSceSystemLogger2.md @@ -3,3 +3,15 @@ ### Unknown function info - [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/libSceSystemLogger2Delivery.md b/docs/dev/debt/libSceSystemLogger2Delivery.md index c97c25f582db..ca237f9abe73 100644 --- a/docs/dev/debt/libSceSystemLogger2Delivery.md +++ b/docs/dev/debt/libSceSystemLogger2Delivery.md @@ -3,3 +3,4 @@ ### Unknown function info - [sceSystemLogger2DeliveryGetBatchResult, sceSystemLogger2DeliveryGetResult, sceSystemLogger2DeliverySetBatchDeliveryEvent and sceSystemLogger2DeliveryTerminate](../../../core/libs/prx/libSceSystemLogger2Delivery/Export.cpp) (libSceSystemLogger2Delivery) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceSystemLogger2Delivery.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 +- [sceSystemLogger2DeliveryResume, sceSystemLogger2DeliverySuspend, sceSystemLogger2DeliveryInitialize](../../../core/libs/prx/libSceSystemLogger2Delivery/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/libscesystemlogger2delivery-84263dcdd4.jsonl). diff --git a/docs/dev/debt/libSceSystemLogger2NativeQueueClient.md b/docs/dev/debt/libSceSystemLogger2NativeQueueClient.md index 378c25920027..26e154640cb3 100644 --- a/docs/dev/debt/libSceSystemLogger2NativeQueueClient.md +++ b/docs/dev/debt/libSceSystemLogger2NativeQueueClient.md @@ -3,3 +3,6 @@ ### Unknown function info - [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 baf22a627129..7c344f7bf8d5 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 593c01117dfc..e9bc19d219fd 100644 --- a/docs/dev/debt/libSceSystemTts.md +++ b/docs/dev/debt/libSceSystemTts.md @@ -1,5 +1,11 @@ # 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). - [sceSystemTtsCancel, sceSystemTtsIsAccessibilityAvailable, sceSystemTtsRegisterCallback, sceSystemTtsSpeakRequest and sceSystemTtsUnregisterCallback](../../../core/libs/prx/libSceSystemTts/Export.cpp) (libSceSystemTts) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceSystemTts.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/libSceTEEClient.md b/docs/dev/debt/libSceTEEClient.md index 04823e75e660..9fb36e3b9925 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 4098de045df1..cc139c6ce1cb 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/libSceTextToSpeech2.md b/docs/dev/debt/libSceTextToSpeech2.md index 58ba1298f648..2ada2e885a61 100644 --- a/docs/dev/debt/libSceTextToSpeech2.md +++ b/docs/dev/debt/libSceTextToSpeech2.md @@ -2,8 +2,9 @@ ### Silent stubs -- [libSceTextToSpeech2](../../../core/libs/prx/libSceTextToSpeech2/Export.cpp) has no speech engine: `sceTextToSpeech2Initialize` and the other exports return `EOPNOTSUPP`. PPSA01317 skips its narration set-up when initialization fails +- [libSceTextToSpeech2](../../../core/libs/prx/libSceTextToSpeech2/Export.cpp) has no speech engine: `sceTextToSpeech2Initialize`, `sceTextToSpeech2Open`, `sceTextToSpeech2Speak`, `sceTextToSpeech2Cancel`, `sceTextToSpeech2Close`, `sceTextToSpeech2Terminate` and the system/speech status queries return `EOPNOTSUPP`. PPSA01317 skips its narration set-up when initialization fails ### Unknown function info +- [sceTextToSpeech2ConvertTextInt, sceTextToSpeech2GetAudioInt, sceTextToSpeech2InitializeInt, sceTextToSpeech2OpenInt, sceTextToSpeech2RegisterTextConversionItem and sceTextToSpeech2SynthesizeInt](../../../core/libs/prx/libSceTextToSpeech2/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/libscetexttospeech2-b43e9ee18c.jsonl); not measured on a console. - [sceTextToSpeech2Initialize](../../../core/libs/prx/libSceTextToSpeech2/Export.cpp) (libSceTextToSpeech2) - the console's error for an unavailable speech engine is unknown; it returns the kernel's `EOPNOTSUPP` (0x8002002D). PPSA01317 passes a param that starts with 0x2000000 and only tests the result for non-zero. diff --git a/docs/dev/debt/libSceTtsCoreG3Bc.md b/docs/dev/debt/libSceTtsCoreG3Bc.md new file mode 100644 index 000000000000..5f75ede8baae --- /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 000000000000..423630b7565e --- /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 000000000000..97c0f0e9eec8 --- /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 000000000000..e1237ea1e310 --- /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/libSceUpdateService.md b/docs/dev/debt/libSceUpdateService.md index 73c61c3d321b..dc167da2a018 100644 --- a/docs/dev/debt/libSceUpdateService.md +++ b/docs/dev/debt/libSceUpdateService.md @@ -2,4 +2,34 @@ ### Unknown function info +- [Additional libSceUpdateService exports](../../../core/libs/prx/libSceUpdateService/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/libsceupdateservice-b7f2a7b06c.jsonl). Their ABIs and behaviour are unknown. Parameterless `int` declarations are import-resolution placeholders, not established signatures; every call throws `NotImplemented_nid_no_patch`. + +| Name | NID | +| --- | --- | +| `sceUpsrvFlushHttpCookie` | `9SVS4rCdJvo` | + - [sceUpsrvGetCompletedTaskId, sceUpsrvGetRebootFlag, sceUpsrvGetSystemExUpdateTaskState, sceUpsrvInitialize, sceUpsrvPostErrorLog, sceUpsrvResumePausedTask, sceUpsrvSetFakeVersion, sceUpsrvStartUpdateSession, sceUpsrvSwitchSystemExBank, sceUpsrvSwitchSystemExBankWithoutVerify, sceUpsrvTerminate, sceUpsrvUpdateCancelBDUpdate, sceUpsrvUpdateCheckCancel, sceUpsrvUpdateCheckCreateHandler, sceUpsrvUpdateCheckDestroyHandler, sceUpsrvUpdateCheckDoCheckSystem, sceUpsrvUpdateCheckDoCheckSystemForDevKit, sceUpsrvUpdateCheckDoCheckSystemForSettings, sceUpsrvUpdateCheckDoCheckSystemWithPupInfo, sceUpsrvUpdateCreateUpdateTask, sceUpsrvUpdateDestroyUpdateTask, sceUpsrvUpdateDoCheckBootUpdate, sceUpsrvUpdateDoUpdateSystemEx, sceUpsrvUpdateDoUpdateWithEntitlement, sceUpsrvUpdateDoUpdateWithPupInfo, sceUpsrvUpdateDoUpdateWithPupPath2, sceUpsrvUpdateGetBetaAgreementUrl, sceUpsrvUpdateGetEulaDisplay, sceUpsrvUpdateGetEulaStr, sceUpsrvUpdateGetEulaStrLen, sceUpsrvUpdateGetFeatureListUrl, sceUpsrvUpdateGetFeatureListUrlForSystemExUpdate, sceUpsrvUpdateGetFeatureListUrlForUpdate, sceUpsrvUpdateGetImageWritingProgress, sceUpsrvUpdateGetProgress, sceUpsrvUpdateGetUpdateTaskInfo, sceUpsrvUpdateGetUpdateTaskMgrInfo, sceUpsrvUpdateSetEulaAccept, sceUpsrvUpdateStartUpdateTask and sceUpsrvVerifySystemExBank](../../../core/libs/prx/libSceUpdateService/Export.cpp) (libSceUpdateService) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceUpdateService.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/libSceUpdateService/Export.cpp) - 15 entries observed in a 3.20-labelled image and a later 13.60-labelled image are import-resolution declarations only. Neither image label authenticates 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). + +[Version-pinned selected ELF export records](https://gist.github.com/kyon-eth/752e1b1d4a6ac8a26c97e693527fefbd/a7bddd315c7740a7d065af9e80b0447fcd5b91be) 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 module. The extract SHA-256 is `63256453dc9620091ce6af95f8b243b7da8f2ce76a585f4886f76aa6625b5b21`; its full-module sorted-function-NID digests and raw module-parameter words permit independent comparison. The extract is an analyst-produced metadata record, not independent authentication of the original images or proof of prototypes or behavior. The separately published 3.20 source catalog has a module file but none of these selected NIDs. + +| Name | NID | +| --- | --- | +| `sceUpsrvDisableAutoInstall` | `-zy2KlVydQ8` | +| `sceUpsrvEndUpdateSession` | `6en3NM0YeJM` | +| `sceUpsrvNotifyUpdatedEvent` | `DKztVI6QmEU` | +| `sceUpsrvUpdateCheckDoCheckSystemWithDownloadTypeForSettings` | `yMBuJ0+PATE` | +| `sceUpsrvUpdateCheckDoCheckSystemWithReleaseType` | `-YtT5FR8mHg` | +| `sceUpsrvUpdateCheckIsTestPeriod` | `71dId93IAPw` | +| `sceUpsrvUpdateConfirmUpdate` | `Hyt+jnG8ktg` | +| `sceUpsrvUpdateStartUpdateModeWithParam` | `x72adjkymuQ` | +| `sceUpsrvUpdateStartUpdateMode` | `c2VqN+tPVMU` | +| `Unknown` | `33Z2z4kXKq0` | +| `Unknown` | `ItlDmxWppec` | +| `Unknown` | `SpnzKCdKA+4` | +| `Unknown` | `sEcvo34+ihg` | +| `Unknown` | `vrw9HD-1Gs0` | +| `Unknown` | `yyy3cEojLOw` | diff --git a/docs/dev/debt/libSceUsbStorage.md b/docs/dev/debt/libSceUsbStorage.md index 08030f3d5ddf..27518d700989 100644 --- a/docs/dev/debt/libSceUsbStorage.md +++ b/docs/dev/debt/libSceUsbStorage.md @@ -2,6 +2,8 @@ ### Unknown function info +- [Additional libSceUsbStorageForShellUI bindings](../../../core/libs/prx/libSceUsbStorage/Export.cpp) - `sceUsbStorageClearFakeMapLockForDebug` (`+qWixV5x-qc`) and `sceUsbStorageCheckSystemDefaultMountPoint` (`mKr8vDF+NUA`) have unknown signatures and behavior. The [13.60 logical-library inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libsceusbstorageforshellui-826a4d467f.jsonl) confirms these name/NID pairs. Parameterless `int` declarations are import placeholders, not verified ABI prototypes; every call throws through `NotImplemented_nid_no_patch`. + - [sceUsbStorageRegisterCallback, sceUsbStorageUnregisterCallback](../../../core/libs/prx/libSceUsbStorage/Export.cpp) (libSceUsbStorage) - the answers for a registration before `sceUsbStorageInit`, a second registration of the same callback for the same event type and the unregistration of a callback that is not registered are unknown, so the first two throw and the third keeps the marker. Whether the console raises mount events for devices attached before the registration is unknown; none are raised. A registration keeps its user data and receives [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/5dfdb4b0b166e83dc9ae275001afb695f12c7174/src/SharpProspero/Platform/UsbStorage.cs#L186-L199)'s 16-byte event (1 for a mount and 2 for an unmount, the device id, the device flags) for its event type only, on a service thread that rescans the host once a second instead of the automounter's IPC thread; an unregistered callback is not called again. Closes when: measured on a PS5 - [sceUsbStorageRegisterCallbackForMapAvailable, sceUsbStorageUnregisterCallbackForMapAvailable, sceUsbStorageRegisterCallbackForMapUnavailable, sceUsbStorageUnregisterCallbackForMapUnavailable](../../../core/libs/prx/libSceUsbStorage/Export.cpp) (libSceUsbStorage) - what a successful registration stores and when the callbacks fire is unverified: [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/f68923fe807f657348e6719ce658bcbd0a2b1c72/src/core/libraries/usbd/usbstorage.cpp#L128-L174) logs all four as `(STUBBED)` and returns 0 without storing anything, the success-without-a-reference pattern #6288 was closed for. The argument validation is implemented (0x80f40002 for a null callback or a null directory); past it they keep the marker until a reference or a measurement says what success does. - [sceUsbStorageRequestUnmap, sceUsbStorageGetdentsClose](../../../core/libs/prx/libSceUsbStorage/Export.cpp) (libSceUsbStorage) - what the console answers for a mount point that is not mapped and a getdents descriptor that is not open is unknown: shadPS4's [unmap](https://github.com/shadps4-emu/shadPS4/blob/f68923fe807f657348e6719ce658bcbd0a2b1c72/src/core/libraries/usbd/usbstorage.cpp#L281-L288) only logs without keeping state and its [close](https://github.com/shadps4-emu/shadPS4/blob/f68923fe807f657348e6719ce658bcbd0a2b1c72/src/core/libraries/usbd/usbstorage.cpp#L378-L383) succeeds only because `erase` ignores a missing key. Both keep the marker on that path, after their argument validation; unmapping a mount point a map request returned, as [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/5dfdb4b0b166e83dc9ae275001afb695f12c7174/src/SharpProspero/Platform/UsbStorage.cs#L386-L398) does, and closing an open scan succeed. @@ -20,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 985559602875..02816f549f59 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 -- [sceUserServiceGetNpAccountId](../../../core/libs/prx/libSceUserService/Export.cpp) (libSceUserService) - the account id for a 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` +- [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/libSceVdecCore.md b/docs/dev/debt/libSceVdecCore.md index a6803142e36a..bcf25a3a4f2d 100644 --- a/docs/dev/debt/libSceVdecCore.md +++ b/docs/dev/debt/libSceVdecCore.md @@ -1,5 +1,11 @@ # libSceVdecCore technical debt ### Unknown function info +- [Additional libSceVdecCore exports](../../../core/libs/prx/libSceVdecCore/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/libscevdeccore-219f557635.jsonl). Their ABIs and behaviour are unknown. Parameterless `int` declarations are import-resolution placeholders, not established signatures; every call throws `NotImplemented_nid_no_patch`. + +| Name | NID | +| --- | --- | +| `sceVdecCoreQueryMemorySizeSvp` | `uAsJCITzX5k` | + - [sceVdecCoreAnalyzeStream, sceVdecCoreCreateDecoder, sceVdecCoreDeleteDecoder, sceVdecCoreFinalizeComputeResource, sceVdecCoreFlushDecodeOutput, sceVdecCoreGetDecodeOutput, sceVdecCoreInitializeComputeResource, sceVdecCoreMapMemoryBlock, sceVdecCoreQueryComputeResourceInfo, sceVdecCoreQueryFrameBufferInfo, sceVdecCoreQueryInstanceSize, sceVdecCoreResetDecoder, sceVdecCoreSetDecodeInput, sceVdecCoreSetDecodeOutputSw, sceVdecCoreSyncDecode, sceVdecCoreSyncDecodeOutputSw, sceVdecCoreSyncDecodeWptr, sceVdecCoreTrySyncDecode, sceVdecCoreTrySyncDecodeOutputSw and sceVdecCoreTrySyncDecodeWptr](../../../core/libs/prx/libSceVdecCore/Export.cpp) (libSceVdecCore) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceVdecCore.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/libSceVdecShevc.md b/docs/dev/debt/libSceVdecShevc.md index 0413883bb5f1..06785045aa7f 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 000000000000..8b0d83579540 --- /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 92c646042537..ff9adb999938 100644 --- a/docs/dev/debt/libSceVenc.md +++ b/docs/dev/debt/libSceVenc.md @@ -3,3 +3,16 @@ ### Unknown function info - [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 f332e1ccbdb1..813235f9e69d 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 5004c2a21594..32536ce84e16 100644 --- a/docs/dev/debt/libSceVideoOut.md +++ b/docs/dev/debt/libSceVideoOut.md @@ -6,6 +6,7 @@ - [sceVideoOutOpen](../../../core/libs/prx/libSceVideoOut/src/Output.cpp) validates the priority and CPU affinity that the open param requests for the VideoOut service thread but does not apply them: the port's present and vblank threads are host threads, and guest priorities and affinities do not reach host scheduling. Of the 16 calls in ten titles checked, all pass user 255 and index 0, 13 pass bus type 0 and three read it from a field (one call each in Borderlands 4, MXGP 26 and Super Meat Boy 3D), and 13 pass no open param. Metal Gear Solid 4 (PPSA18194) passes one from `mgs4.elf` with neither flag set and one from its launcher that sets only the affinity, 0x3e. Astro Bot (PPSA21564) sets priority 256 and affinity 0x1fff - [sceVideoOutAddVrrStatusFlagsPrivilege](../../../core/libs/prx/libSceVideoOut/src/Output.cpp) returns 0 and does nothing: the host output has no VRR state to report. The name comes from an assert message in a title that requires `SCE_VIDEO_OUT_OK`; the NID hashes to it, the arguments are unknown (it is called without any) - [sceVideoOutVrrPegToFixedRate, sceVideoOutVrrUnpegFromFixedRate](../../../core/libs/prx/libSceVideoOut/src/Output.cpp) (libSceVideoOut) - PPSA05684 passes the handle to both, two further zero arguments to `sceVideoOutVrrPegToFixedRate`, and ignores the results. The meaning of those two arguments is unknown, so only zeros are accepted. VRR is not modelled and the output always runs at a fixed rate, so both calls only validate the handle and return 0 +- [sceVideoOutCursorSet2xMagnify](../../../core/libs/prx/libSceVideoOut/src/Output.cpp) takes the handle and the cursor index like the other cursor calls and returns 0: no cursor image is drawn, so a magnified cursor cannot be observed, and the console's answer is unmeasured. PC5 (PPSA11018) imports it. The signature `(handle, index, enable)` and the effect of the flag are unverified ### Unknown function info @@ -17,6 +18,7 @@ - [sceVideoOutRegisterBuffers2](../../../core/libs/prx/libSceVideoOut/src/Buffer.cpp) (libSceVideoOut) - buffer option 8 (STRICT_COLORIMETRY) is presented as option 0, with the stored values unchanged; what the console changes for it is unknown. Only options 0 and 8 are accepted - [sceVideoOutAddBufferAttributeOption](../../../core/libs/prx/libSceVideoOut/src/Buffer.cpp) (libSceVideoOut, NID `MBlv8YWoyOk`) - the signature `(VideoOutBufferAttribute2*, uint64_t option)` comes from [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/60977b29103452b9681ae10c7a9011d44965bf16/src/SharpProspero/Interop/VideoOut/VideoOut.cs#L174-L176) and the call site in PPSA25380, which passes 0x20 and ignores the result. The option is ORed into `attribute->option`; whether the console validates the bits, keeps them elsewhere or fails on an unknown option is unknown. A null attribute throws. Option 0x20 makes `sceVideoOutRegisterBuffers2` throw, as every option other than 0 and 8; what it selects for an overlay buffer is unknown - [sceVideoOutRegisterBuffers2](../../../core/libs/prx/libSceVideoOut/src/Buffer.cpp) (libSceVideoOut) - DCC buffers (category 1): `dcc_control` is taken as the CB_DCC_CONTROL block layout, only bits 0x10026c are accepted; `dcc_cb_register_clear_color` as the register-clear texel, only 32-bit values are presented +- [sceVideoOutUnregisterBuffers](../../../core/libs/prx/libSceVideoOut/src/Buffer.cpp) (libSceVideoOut) - on a main-bus port (bus type 0) the set holding the buffer on screen is refused with `RESOURCE_BUSY` (0x80290009) and stays registered. EVO Player (PPSA99039) [measured](https://github.com/sainsaji/EVO-PLAYER-PS5/blob/2db44b5294657b12bf91666154a05f029ddb5aa2/projects/evoplayer/media/src/evo_agc_runtime.c#L2830-L2838) that, with a re-registration then failing `SLOT_OCCUPIED`, and Prospero Win (PPSA99995) [measured](https://github.com/mpereiraesaa/prospero-win/blob/59c48117119fd57cd33e7bc91c11fa0c8ebf8b3d/native/pw_videoout_ps5.c#L92-L97) it on firmware 12.02 after its flips went idle, with `sceVideoOutClose` succeeding next. Both titles open bus type 0. Not measured: the overlay bus, whose on-screen set is still released and taken off the composited output; a set with a pending flip that is not on screen, which still throws; and the answer after a blank flip. - [sceVideoOutIsOutputSupported](../../../core/libs/prx/libSceVideoOut/src/Output.cpp) (libSceVideoOut) - mode 1 is supported; mode 15 is supported when the current host display runs at 120 Hz or above, and otherwise answers 0 while `sceVideoOutConfigureOutput(15)` returns `UNAVAILABLE_OUTPUT_MODE` (0x80290019): [PS5_Vulkan measured](https://github.com/mihawk-99/PS5_Vulkan/blob/f410e67a0241b3e8edcdbcd2a9b285dfc4a412ed/docs/HARDWARE_FINDINGS.md#L3793-L3835) both on a base PS5 whose output was set to 1080p, in a title declaring high-frame-rate output, and 1 and 0 at 1440p. Which code a title without the declaration gets when both apply is not measured; the declaration is checked first here. Configuring mode 15 requires attribute3 bit 0x40; this single-bit mask is inferred from the measured full value 0x80040, not isolated by a console measurement. Vblanks run at 119.88 Hz until mode 1 restores 59.94 Hz. Display modes are read through SDL; a move to a slower display falls back the configured output mode to mode 1, fires the output-mode event and continues at 59.94 Hz. The console's exact fallback behaviour when a 120 Hz display is lost has not been measured; this fallback avoids the abort in #7877 and matches the HDMI output mode renegotiation that a display change requires. Selecting another host display mode and VRR are not implemented. The console answers per display and per title: with a 120 Hz TV it also answers 1 for mode 15 (119.88 Hz), and [PS5_Vulkan](https://github.com/mihawk-99/PS5_Vulkan/blob/5b5e4fc2d80fdb67a4f61ba9e6a8a424026bb8a5/docs/HARDWARE_FINDINGS.md) measured that `sceVideoOutConfigureOutput` accepts 15 only from a title whose param.json declares high-frame-rate output (attribute3 0x80040). Modes 4, 7, 8, 12-14, 16-17 and 19 return `VIDEO_OUT_ERROR_UNSUPPORTED_OUTPUT_MODE` here, as they did on the measured display. Mode 18 throws, because one console answered 0x80290016 and two others 0x8029001E, the last a PS5 on 13.40 with a 120 Hz TV (measured 2026-10-19 inside a retail title), whose answers for every other mode match the ones here. The name `VIDEO_OUT_ERROR_UNKNOWN_OUTPUT_MODE` for 0x8029001E is ours. Word 3 of the output options is accepted with any value, as on the console, and its meaning is unknown. PPSA12544 probes `0xd000000a`, which the console answers with 0x8029001E, so the title selects 3840 pixels; PPSA26344 at `0xCD0946` passes `(handle, 0xf, nullptr, nullptr, 0)` and branches on the result equalling 1 - [sceVideoOutGetResolutionStatus](../../../core/libs/prx/libSceVideoOut/src/Output.cpp) (libSceVideoOut) - `screenSizeInInch` is 0, the value EDID uses for an undefined size, since the host display's size is not read; a PS5 (firmware 13.40, measured 2026-10-19 inside a retail title) reported its TV's 60.0f. The 48-byte layout, from the declarations in ps5-opengl and EVO-PLAYER-PS5 (#1578), is confirmed there: full size and pane 3840 x 2160, `refreshRate` 3, `flags` 0 and the rest 0 on the title's handle, 0x8029000B for handles 0 to 8. `flags` is 0 here too; its bits are unknown. The pane equals the full size because `sceVideoOutSetWindowModeMargins` applies no margins - [sceVideoOutGetOutputStatus](../../../core/libs/prx/libSceVideoOut/src/Output.cpp) (libSceVideoOut) - the status after a buffer is registered, a 1440p output and a display below 4K with the console's resolution on Automatic were not measured. A payload process on a PS5 (firmware 12.70) with no buffer registered reported `resolution` 2 right after `sceVideoOutOpen(0xff, 0, 0, NULL)` with the console's resolution on Automatic on a 4K display and 1 with it set to 1080p, and `dynamicRange` 2 with `flags` 0 on an HDR display with HDR on, while this code sets flag bit 0 whenever it reports dynamic range 2. `resolution` is 2 when the current display mode SDL reports for the window's display is at least 3840 pixels wide or 2160 high and 1 otherwise, read with the refresh rate and independent of the registered buffers; on Wayland SDL's mode is the output's logical size (from SDL's source, not run), so a scaled 3840x2160 output reports 1. `APS5_OUTPUT_RESOLUTION` replaces that size @@ -28,6 +30,8 @@ - [sceVideoOutAddPreVblankStartEvent](../../../core/libs/prx/libSceVideoOut/src/Event.cpp) (libSceVideoOut) - how long before the vblank the console signals pre-vblank start is unknown. The event is triggered on each emulated vblank tick immediately before the vblank event, with its own count as the event data - [sceVideoOutRegisterBuffers, sceVideoOutGetFlipStatus, sceVideoOutGetVblankStatus](../../../core/libs/prx/libSceVideoOut/src/Buffer.cpp) (libSceVideoOut) - PS4 callers. A handle is treated as PS4 once buffers are registered through the PS4 `sceVideoOutRegisterBuffers`; from then on its flip and vblank status are written in the PS4 64- and 32-byte layouts, with `tsc` and `submitTsc` 0. A PS4 title that reads a status before it registers buffers gets the larger PS5 layout. The PS4 function accepts only linear A8R8G8B8_SRGB (0x80000000) and A8B8G8R8_SRGB (0x80002200) buffers without options; tiled PS4 buffers throw, as their layout differs from the PS5 tiling. Linear PS4 buffers may be 4 KiB aligned: the OpenOrbis graphics sample registers its second 1920x1080 buffer 8,294,400 bytes after the first. The PS4 alignment rule is not known - [sceVideoOutGetFlipStatus, sceVideoOutIsFlipPending](../../../core/libs/prx/libSceVideoOut/src/Output.cpp) (libSceVideoOut) - a null output together with an invalid handle throws, as only each alone was measured; a closed handle is unmeasured and answered like an invalid one. Measured in a payload process on a PS5 (firmware 12.70) on a handle from `sceVideoOutOpen(0xff, 0, 0, NULL)` with no buffer registered: `sceVideoOutGetFlipStatus` returned 0 and wrote 128 bytes, all zero except `flipArg` and `currentBuffer`, which were -1; a null output returned 0x80290002 and handle -1 returned 0x8029000b without writing the output; `sceVideoOutIsFlipPending` returned 0, and 0x8029000b for handle -1 +- [DialogInput](../../../core/libs/prx/libSceVideoOut/src/DialogInput.cpp) (libSceVideoOut) - the inputs that drive the overlay dialog are not measured: Enter, Space, a left click and Cross confirm; Escape, a right click and Circle cancel, whatever the confirm-button setting of the console; the arrow keys, Tab, the mouse wheel, the D-pad and the left stick move the focus. A click confirms the focused button wherever it lands, as the overlay has no hit test. Closes when: measured on a PS5 +- [VideoOutDriver](../../../core/libs/prx/libSceVideoOut/src/VideoOutDriver.cpp) (libSceVideoOut) - the overlay dialog is drawn only while a window exists and the title keeps flipping: a dialog that no flip drew within three seconds of its open is dropped, its caller finishes with the automatic answer and the input is released, while one that was drawn waits for the player even if the title stops flipping. The three seconds are a host choice. An IME keyboard or pad capture takes the overlay and the input from the dialog until it ends. While the dialog is shown the title gets no pad, keyboard or mouse input, and a key or mouse button the title saw pressed is released once. Closes when: measured on a PS5 - [sceVideoOutRegisterBuffers2 past the last buffer](../../../core/libs/prx/libSceVideoOut/src/Buffer.cpp) (libSceVideoOut) - a call whose buffers run past index 15 returns `INVALID_VALUE` (0x80290001) and registers nothing. [PS5_Vulkan measured](https://github.com/mihawk-99/PS5_Vulkan/blob/f410e67a0241b3e8edcdbcd2a9b285dfc4a412ed/docs/HARDWARE_FINDINGS.md#L3773-L3791) that answer on a PS5 (firmware 13.40) for a fourth set at buffers 15 to 19, after three sets took buffers 0 to 14. Whether the console refused it for the sixteen buffer indices or for the number of sets is not measured: here four sets are accepted, and the other out-of-range arguments still throw. ### Functional @@ -42,3 +46,200 @@ - [Windows game controllers](../../../core/libs/prx/libSceVideoOut/src/VideoOutDriver.cpp) (libSceVideoOut) - SDL's DirectInput joystick backend is disabled at default hint priority before `SDL_InitSubSystem`, because its device enumeration blocks forever on some vendor HID devices (#1042). XInput and HIDAPI controllers are detected; controllers reachable only through DirectInput are not. Setting `SDL_DIRECTINPUT_ENABLED=1` restores them on hosts without such a device. SDL's Windows.Gaming.Input backend stays on by default. Setting `APS5_NO_WGI` turns it off at default hint priority, for hosts where it faults at `Windows.Gaming.Input.dll+0x10a84` a few seconds into every run: seen on Windows 10 Pro 22H2 (19045) with the Nefarius and Oculus virtual gamepad emulation buses installed and no physical controller connected. With it off, devices and features reachable only through Windows.Gaming.Input are lost: racing wheels, arcade sticks, flight sticks, HID pads without an HIDAPI driver, and Xbox One and Series trigger rumble. - 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. + +- [Additional callable exports](../../../core/libs/prx/libSceVideoOut/InventoryExports.cpp) - 182 entries observed in a 3.20-labelled image and a later 13.60-labelled image; 107 match the public 3.20 catalogue and 75 do not. These are import-resolution declarations only. Neither image label authenticates 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 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 | +| --- | --- | +| `sceVideoOutAddBuffer` | `4iy9hG9Du1s` | +| `sceVideoOutAddBuffer4k2kPrivilege` | `twrSaoZ9cJs` | +| `sceVideoOutAddBufferAnisoPrivilege` | `lm+1oyWKwy0` | +| `sceVideoOutAddBufferHdrPrivilege` | `VAlir52gpQI` | +| `sceVideoOutAddBufferYccPrivilege` | `D3s8DoEnuR4` | +| `sceVideoOutAddDisplayPositionEvent` | `Cxb2w82t7lw` | +| `sceVideoOutAddDriver` | `HtwSd4H2Tws` | +| `sceVideoOutAddS3dHmdPrivilege` | `iT+aFczA7ak` | +| `sceVideoOutAddSetModeEvent` | `AjtlFa2HRws` | +| `sceVideoOutAddStereoBuffer` | `Ax1Qs3Cm95Q` | +| `sceVideoOutAdjustColor2_` | `8Lf4Fp1TxA0` | +| `sceVideoOutClearVrrMaster` | `WnHBARNFUyw` | +| `sceVideoOutConfigureLayout` | `PeUUCAS9Kso` | +| `sceVideoOutConfigureOptionsInitialize_` | `ktP9j1fN-zE` | +| `sceVideoOutConfigureOutputEx` | `2CxY28ewv8g` | +| `sceVideoOutConfigureOutputModeExSubmitDoneUnsafe_` | `-gYpMonpw2M` | +| `sceVideoOutConfigureOutputModeEx_` | `lQh55Q8DUAg` | +| `sceVideoOutConfigureOutputMode_` | `N1bEoJ4SRw4` | +| `sceVideoOutControlHdcpEncryption` | `M-JkRj7X+No` | +| `sceVideoOutCursorIsUpdatePending` | `HibOtezzT6M` | +| `sceVideoOutCursorSetPositionStereo` | `735GfVO9v2s` | +| `sceVideoOutCurveSamplePointsCalc_` | `kazBRXPqR7c` | +| `sceVideoOutDebugAddVrrPrivilege` | `rAYR4zzw414` | +| `sceVideoOutDebugBlankPipe` | `-9YA0lVAq+U` | +| `sceVideoOutDebugReadCrc` | `4E8qvHf7Cj0` | +| `sceVideoOutDebugSetDrr` | `itbQplM5K74` | +| `sceVideoOutDebugSetGlobalAlpha` | `Y+0m4suevbk` | +| `sceVideoOutDebugTriggerRefresh` | `8ZWscRWE6-s` | +| `sceVideoOutDeleteDisplayPositionEvent` | `gbJ8QxXOR6g` | +| `sceVideoOutDeleteDriver` | `KA515kD5rAY` | +| `sceVideoOutDeleteSetModeEvent` | `fXCSkDTpJFg` | +| `sceVideoOutDriverAddEvent` | `oeNtdmvV4II` | +| `sceVideoOutDriverDecrementBufferLabel` | `0jGJbNTpSV4` | +| `sceVideoOutDriverDeleteEvent` | `lOR+Nos+Je8` | +| `sceVideoOutDriverGetBufferLabelAddress` | `NGyEl5aT4fc` | +| `sceVideoOutDriverGetEopHandle` | `P1bIHoga4jE` | +| `sceVideoOutDriverGetFinishedEopHandle` | `G6peSSDP4iA` | +| `sceVideoOutDriverGetLatestEopHandle` | `GL8+3RHW5vk` | +| `sceVideoOutDriverIncrementBufferLabel` | `Ztx4b2LhRDk` | +| `sceVideoOutDriverResetBufferLabel` | `soAIjspgdt8` | +| `sceVideoOutDriverTriggerEvent` | `OHnnkrUcShM` | +| `sceVideoOutGetBufferInformation` | `5V8YGx9g0UA` | +| `sceVideoOutGetCoredumpOutputMode` | `IZw2TINic+0` | +| `sceVideoOutGetCurrentOutputMode_` | `W0iQAbGaTBg` | +| `sceVideoOutGetDeviceInfoExOts_` | `p7FV-mU6EM0` | +| `sceVideoOutGetDeviceInfoEx_` | `k6JLQGuPEYA` | +| `sceVideoOutGetHdmiKsvList_` | `hZvzQy2VLKY` | +| `sceVideoOutGetHdmiMonitorInfoNoMask_` | `421cr+-5Mus` | +| `sceVideoOutGetHdmiMonitorInfo_` | `+XlDnumvLVA` | +| `sceVideoOutGetHdmiRawEdid_` | `+sXvR1JH9Aw` | +| `sceVideoOutGetMonitorInfo` | `lafoiUl5-5U` | +| `sceVideoOutGetOutputStatusEx` | `HqiYk8A4mZ0` | +| `sceVideoOutGetPipelineStatus` | `Ygv0S+Hi+hA` | +| `sceVideoOutGetPortStatusInfoByBusSpecifier_` | `4TPW3H2f-lM` | +| `sceVideoOutGetPortStatusInfo_` | `SDoPm73tOyI` | +| `sceVideoOutGetPortStatusInfo` | `y4l-VBLsNio` | +| `sceVideoOutGetStatusForWebcore` | `+tB28CUr9W0` | +| `sceVideoOutGetVideoOutModeByBusSpecifier_` | `UazrNFzZPRU` | +| `sceVideoOutHdmiMonitorInfoIsSupportedHdcpVersion` | `XNtZ16LIhf0` | +| `sceVideoOutHdmiMonitorInfoIsSupportedVideoOutMode_` | `WBZrUaQY+EU` | +| `sceVideoOutLockBuffer` | `7ifZFxWJ9Q4` | +| `sceVideoOutRazorAddCallback` | `ZX7C79uOujU` | +| `sceVideoOutRazorRecallCallbacks` | `hGcTks-qqIU` | +| `sceVideoOutRazorRemoveCallback` | `zUDW7kIFclI` | +| `sceVideoOutRegisterBufferAttribute` | `EJQifjOp8s4` | +| `sceVideoOutRegisterStereoBuffers` | `lCTCOogRbk0` | +| `sceVideoOutRemoveBuffer` | `H8teLntGkWs` | +| `sceVideoOutSetAlphaControl` | `-zRnJ7WoWSY` | +| `sceVideoOutSetBlankAfterResume` | `zILy8t+5bPo` | +| `sceVideoOutSetContentType` | `KHBNAkJhT64` | +| `sceVideoOutSetDisplayEventPosition` | `18NPivA-byc` | +| `sceVideoOutSetGamutMetadata_` | `emayD9LHYsc` | +| `sceVideoOutSetGlobalAlpha` | `Ujsmw0VOqOo` | +| `sceVideoOutSetToneMap_` | `CxUz3nU06NE` | +| `sceVideoOutSetVrrMaster` | `zzi147PCXzI` | +| `sceVideoOutSubmitChangeBufferAttribute` | `IOdgHlCGU-k` | +| `sceVideoOutSysAddSetModeEvent2` | `fYWVVDKZOCk` | +| `sceVideoOutSysAddSetModeEvent` | `X8FN-5Nk-yE` | +| `sceVideoOutSysAddVblankEvent2` | `Am8Hlr7tlxA` | +| `sceVideoOutSysAddVblankEvent` | `Ek+VR4lcJQI` | +| `sceVideoOutSysChangePipelineLayout` | `7gnD2bc0zvs` | +| `sceVideoOutSysClose` | `dIb9LsrpkQM` | +| `sceVideoOutSysConfigureLayout` | `FDTOhhPHtps` | +| `sceVideoOutSysConfigureOutputMode` | `ox3wD142jZQ` | +| `sceVideoOutSysConfigureOutput` | `ofkhJRiQua0` | +| `sceVideoOutSysDeleteVblankEvent2` | `2EBuouuYKgM` | +| `sceVideoOutSysDeleteVblankEvent` | `iwsJdAZCg34` | +| `sceVideoOutSysFloatPort` | `sKtbl0gCX64` | +| `sceVideoOutSysGetBus` | `7VSZJxxcTL8` | +| `sceVideoOutSysGetColorConversionStatus` | `IpMhRnVgJUU` | +| `sceVideoOutSysGetCurrentOutputMode` | `IysRiVOGIVM` | +| `sceVideoOutSysGetDeviceInfo` | `2sgenMqwczM` | +| `sceVideoOutSysGetFlipStatus` | `21sS8EU45cw` | +| `sceVideoOutSysGetKsvList` | `Ur8iOIm0tyE` | +| `sceVideoOutSysGetMonitorInfo_` | `vMLWuJckGv0` | +| `sceVideoOutSysGetOutputStatus` | `Ip78YCQUrTo` | +| `sceVideoOutSysGetPipelineStatus` | `dFhciCfO31s` | +| `sceVideoOutSysGetResolutionStatus2` | `qLDCAl8ygCw` | +| `sceVideoOutSysGetResolutionStatus` | `8XGijEoThE0` | +| `sceVideoOutSysGetVblankStatus2` | `iYrCszX93AM` | +| `sceVideoOutSysGetVblankStatus` | `d1AjT2uZJn0` | +| `sceVideoOutSysGetVideoOutModeByBusSpecifier` | `AAELy8Yc3Mc` | +| `sceVideoOutSysHdmiMonitorInfoIsMorpheus` | `3-9DXFGVg0M` | +| `sceVideoOutSysInitMode` | `9cmjhjqa7Sg` | +| `sceVideoOutSysIsModeS3d` | `iUigHJ2op4M` | +| `sceVideoOutSysIsOutputSupported` | `Z0EyU29WqOg` | +| `sceVideoOutSysIsSupportedByMonitorInfo_` | `mfxElr79O7Q` | +| `sceVideoOutSysIsUserStatusHdr` | `q+vWPvYIh8o` | +| `sceVideoOutSysIsUserStatusSystemDefault` | `O57F5ikhGxo` | +| `sceVideoOutSysIsUserStatusVr` | `4XsQdhiOaAc` | +| `sceVideoOutSysModeIsHdr` | `I7-lGGvFgBM` | +| `sceVideoOutSysModeIsSystemDefault` | `5Y8uUbGMio0` | +| `sceVideoOutSysModeIsVrLegacy` | `zecl8Gox+P0` | +| `sceVideoOutSysModeIsVrNative` | `SgA2MtojPto` | +| `sceVideoOutSysModeIsVr` | `QEiuHxjungc` | +| `sceVideoOutSysOpenInternal` | `kP4l+nyBjRA` | +| `sceVideoOutSysOpenVrNative` | `WUU+ufqgLJg` | +| `sceVideoOutSysReadCrc64` | `eBvoaLwfBBQ` | +| `sceVideoOutSysReadCrc` | `E8C608-pFng` | +| `sceVideoOutSysResetAtGpuReset` | `djc8fOzOXxk` | +| `sceVideoOutSysSetColorMode` | `gqK4its31ck` | +| `sceVideoOutSysSetDcePipeMode` | `jvPer4hz+UU` | +| `sceVideoOutSysSetDimmer2` | `X7tWmHNtoKg` | +| `sceVideoOutSysSetDimmer` | `OOF0YO73GTA` | +| `sceVideoOutSysSetHdcpEncryption` | `kxDKWwEobyA` | +| `sceVideoOutSysSetHdrMetadata` | `-ka14VvHSX0` | +| `sceVideoOutSysSetOverscanRatio` | `nMbAqI1ty8w` | +| `sceVideoOutSysUpdateDisplayParameter` | `UFDoqv4XXC0` | +| `sceVideoOutSysUpdatePrivilege` | `Jl91AhxKc0w` | +| `sceVideoOutSysUpdateRenderingMode` | `4G37EIMMD+Q` | +| `sceVideoOutUnlockBuffer` | `amghnA-Ev5s` | +| `sceVideoOutUnregisterBufferAttribute` | `SRQSpP4QK5U` | +| `Unknown` | `-5AIEU9+11g` | +| `Unknown` | `0y3VgFMy99k` | +| `Unknown` | `1r0tse0IXgU` | +| `Unknown` | `32RkOEsOvQE` | +| `Unknown` | `3xrSV8U0Hsg` | +| `Unknown` | `7ZOVeum-aAg` | +| `Unknown` | `8nnuVJFfTaM` | +| `Unknown` | `99wK8O6hGtY` | +| `Unknown` | `9ho7J3ihMlg` | +| `Unknown` | `BIfepC2zRH4` | +| `Unknown` | `Ek7XQBAkFYA` | +| `Unknown` | `F3cj7Bea07w` | +| `Unknown` | `IQMqDChUkMM` | +| `Unknown` | `InORxXcUzR8` | +| `Unknown` | `JDjWoYVTvdk` | +| `Unknown` | `Ji+6MtHGDHU` | +| `Unknown` | `LMgBlt8J+8A` | +| `Unknown` | `M4lTPTxoeN0` | +| `Unknown` | `MuM1bZDAvV8` | +| `Unknown` | `N0AyfJuu8-w` | +| `Unknown` | `NyVCSlocu3k` | +| `Unknown` | `OWn+sZtXKbg` | +| `Unknown` | `P5a32OulZQk` | +| `Unknown` | `P96+z-0vEqs` | +| `Unknown` | `QLfXO66LPcI` | +| `Unknown` | `RGGakYPkFIo` | +| `Unknown` | `UW7CnswVJFQ` | +| `Unknown` | `VKBIGfxIuAA` | +| `Unknown` | `Wu+K43K3ToE` | +| `Unknown` | `XGIE4BsuS6A` | +| `Unknown` | `aB6EqO5VB38` | +| `Unknown` | `d7eh3psk1J8` | +| `Unknown` | `fWJeR0LHh1s` | +| `Unknown` | `iUybgvm4EPM` | +| `Unknown` | `l-NHggThj7U` | +| `Unknown` | `nrZ1di4tauc` | +| `Unknown` | `oNJ4gsibB6c` | +| `Unknown` | `pTxsULu4Nh0` | +| `Unknown` | `q9HFykGcuWU` | +| `Unknown` | `qWRDqFaC9GE` | +| `Unknown` | `tHObJYt1qSM` | +| `Unknown` | `udcfTO7aAyM` | +| `Unknown` | `v9gmbZSAovI` | +| `Unknown` | `vXMpe7Murfc` | +| `Unknown` | `wKJpFhCTrX0` | +| `Unknown` | `wZI4fmUJMlw` | +| `Unknown` | `xqlbOlrMbBs` | +| `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 000000000000..06faf1cd37d6 --- /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/libSceVideoRecordingP.md b/docs/dev/debt/libSceVideoRecordingP.md index 835fa5eb213e..a8ea47c5b453 100644 --- a/docs/dev/debt/libSceVideoRecordingP.md +++ b/docs/dev/debt/libSceVideoRecordingP.md @@ -4,6 +4,8 @@ - [sceVideoRecordingGetInfo, sceVideoRecordingSetInfo](../../../core/libs/prx/libSceVideoRecordingP/Export.cpp) support native validation and errors before a recording context exists. Open and initialization remain protected unimplemented exports; live recording queries, control and volume changes are unavailable. +- [13.60 remaining inventory exports](../../../core/libs/prx/libSceVideoRecordingP/Export.cpp) - `sceVideoRecordingGetCopyrightImageMemory` (`PAKwtO6i9d8`), `sceVideoRecordingCloseWithTruncationByHandle` (`oryBI-2iyxw`) have unknown signatures and behavior. Parameterless `int` declarations are import-resolution placeholders, not verified ABI prototypes; every call throws through `NotImplemented_nid_no_patch`. These defined name/NID bindings come from the [13.60 export inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libscevideorecordingp-2f2509cb1b.jsonl). + - [_sceVideoRecordingQueryParam_nid_postfix](../../../core/libs/prx/libSceVideoRecordingP/Export.cpp): the supplied module reads a 64-bit size and writes a 32-bit mode at offset 12 for sizes at least 16, plus a 32-bit option at offset 28 for sizes at least 64. Mode/option meanings remain unresolved; the protected implementation is unchanged. - [sceVideoRecordingCloseByHandle, sceVideoRecordingGetInfoByHandle](../../../core/libs/prx/libSceVideoRecordingP/Export.cpp) - native handles are context pointers. Recording state and per-handle queries remain unimplemented. - [sceVideoRecordingCopyBGRAtoNV12](../../../core/libs/prx/libSceVideoRecordingP/Export.cpp) - the destination, source, 32-bit width and height arguments are confirmed. Pixel conversion remains unimplemented. diff --git a/docs/dev/debt/libSceVideoStreamingEngine.md b/docs/dev/debt/libSceVideoStreamingEngine.md index 216d7f8beb9f..fc9cc52c4bdf 100644 --- a/docs/dev/debt/libSceVideoStreamingEngine.md +++ b/docs/dev/debt/libSceVideoStreamingEngine.md @@ -2,4 +2,67 @@ ### Unknown function info +- [Additional libSceVideoStreamingEngine exports](../../../core/libs/prx/libSceVideoStreamingEngine/Export.cpp) - the 58 name/NID pairs below are defined function exports in the pinned [13.60-labelled inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libscevideostreamingengine-5abc5612ed.jsonl). Their signatures and behavior are unknown; parameterless `int` declarations are import placeholders, not verified ABI prototypes. Every call throws through `NotImplemented_nid_no_patch`. No media processing, decryption or output behavior is implemented. The inventory label is not an independent console measurement. + +| Name | NID | +| --- | --- | +| `sceVideoStreamingEngineAbortAuxMessage` | `G7mvPDnYwQQ` | +| `sceVideoStreamingEngineAbortParsing` | `fb3kqOU6eiI` | +| `sceVideoStreamingEngineAddSourceBuffer` | `ncXmalKo5TE` | +| `sceVideoStreamingEngineAppendBuffer` | `s3oaAI0fKwU` | +| `sceVideoStreamingEngineCancelThumbnail` | `ob+vzpK-ePI` | +| `sceVideoStreamingEngineClearLiveSeekableRange` | `YZnFDSSQFE8` | +| `sceVideoStreamingEngineCreatePlayer` | `VY4Mr66uSqA` | +| `sceVideoStreamingEngineDeleteMediaSample` | `SfDRCMJoaLE` | +| `sceVideoStreamingEngineDeletePlayer` | `TBPjAg6a2E4` | +| `sceVideoStreamingEngineDivideMediaSample` | `hZEb-EhU-4g` | +| `sceVideoStreamingEngineEnableAudioTrack` | `GFPBvjLfimA` | +| `sceVideoStreamingEngineEndOfStream` | `j4b+RLwmg3k` | +| `sceVideoStreamingEngineEnqueueMediaSample` | `G9GFBN1xtH8` | +| `sceVideoStreamingEngineGenerateThumbnail` | `rcTQ2SilW60` | +| `sceVideoStreamingEngineGetAudioFrame` | `Svch6mxCneE` | +| `sceVideoStreamingEngineGetAudioTrackInfo` | `6x9vvo92flo` | +| `sceVideoStreamingEngineGetBufferedInfo` | `Q2+ul4Jj7-4` | +| `sceVideoStreamingEngineGetDuration` | `tFgCMXYLEYo` | +| `sceVideoStreamingEngineGetLoadingProgress` | `w6Y73Ubl0jw` | +| `sceVideoStreamingEngineGetLoop` | `x7Vr+deBKo0` | +| `sceVideoStreamingEngineGetMediaKeys` | `EhFuWvHld1w` | +| `sceVideoStreamingEngineGetPlaybackRange` | `Xq9X3kt49Fk` | +| `sceVideoStreamingEngineGetPlaybackRate` | `-RBoTh3JsaM` | +| `sceVideoStreamingEngineGetResolution` | `f8LzETNbCYk` | +| `sceVideoStreamingEngineGetTimeProperty` | `p1jJjKjTEvU` | +| `sceVideoStreamingEngineGetVideoTrackInfo` | `5-P4R09btQQ` | +| `sceVideoStreamingEngineInitialize` | `kruTFfx-BDM` | +| `sceVideoStreamingEngineIsLiveStreaming` | `tcZ2XNW8PO4` | +| `sceVideoStreamingEngineIsTransparentVideoMode` | `vLAERdvUknc` | +| `sceVideoStreamingEngineLoad` | `iv5nnUPe-ls` | +| `sceVideoStreamingEngineMediaKeySessionClose` | `RWCz4Gc+lW0` | +| `sceVideoStreamingEngineMediaKeySessionRemove` | `MB+kfLoZFWE` | +| `sceVideoStreamingEngineMediaKeySessionUpdate` | `+gqhFOBhLj4` | +| `sceVideoStreamingEngineMediaKeySystemAccessGetConfiguration` | `l42jJq+1X9M` | +| `sceVideoStreamingEngineMediaKeysDestroySession` | `tUuzW-ctqRY` | +| `sceVideoStreamingEngineMediaKeysSetServerCertificate` | `o9B+2IRDKow` | +| `sceVideoStreamingEnginePause` | `WFsVlc9eIQs` | +| `sceVideoStreamingEnginePlay` | `VInB8YRmmZg` | +| `sceVideoStreamingEngineQueryInitEsvmMemory` | `ptFhKGXird8` | +| `sceVideoStreamingEngineQueryVideoMemory` | `x32O4iKHZyA` | +| `sceVideoStreamingEngineReleaseThumbnailData` | `bg-209imcPc` | +| `sceVideoStreamingEngineRemoveSourceBuffer` | `zNMGLpbvKpw` | +| `sceVideoStreamingEngineRequestMediaKeySystemAccess` | `Y-Bp-73pyIs` | +| `sceVideoStreamingEngineSeek` | `EYLkNGuJu+k` | +| `sceVideoStreamingEngineSelectVideoTrack` | `nEAyXrcgaMY` | +| `sceVideoStreamingEngineSendAuxMessageForRepeatedResults` | `u3lPXPjdo2k` | +| `sceVideoStreamingEngineSendAuxMessageSync` | `7i7Em8QPYIU` | +| `sceVideoStreamingEngineSetDuration` | `KjTwhkkB52s` | +| `sceVideoStreamingEngineSetLiveSeekableRange` | `UWEHx8qeF6Y` | +| `sceVideoStreamingEngineSetLoop` | `dC6mRLm1HQc` | +| `sceVideoStreamingEngineSetMediaKeys` | `sDX++cFuQiE` | +| `sceVideoStreamingEngineSetPlaybackRange` | `q04I0wREB5c` | +| `sceVideoStreamingEngineSetPlaybackRate` | `eXS-hegAVDU` | +| `sceVideoStreamingEngineSetPtsDtsToMediaSample` | `d3AkZn2emRY` | +| `sceVideoStreamingEngineStop` | `IX7AgdtkNsI` | +| `sceVideoStreamingEngineStopDecode` | `-SNGJumdRkc` | +| `sceVideoStreamingEngineTerminate` | `bbKGMzUU5fA` | +| `sceVideoStreamingEngineUpdateByteStreamFormatSpecification` | `Qg0tKcaHdCA` | + - [sceVideoStreamingEngineDestroyMediaKeySystemAccess, sceVideoStreamingEngineMediaKeySessionGenerateRequest, sceVideoStreamingEngineMediaKeySessionGetExpiration, sceVideoStreamingEngineMediaKeySessionGetKeyStatuses, sceVideoStreamingEngineMediaKeySessionGetSessionId, sceVideoStreamingEngineMediaKeySessionLoad, sceVideoStreamingEngineMediaKeySessionSetEventHandler, sceVideoStreamingEngineMediaKeySystemAccessCreateMediaKeys, sceVideoStreamingEngineMediaKeySystemAccessDestroyMediaKeys, sceVideoStreamingEngineMediaKeySystemAccessGetKeySystem, sceVideoStreamingEngineMediaKeySystemAccessSetCdmStorageConfig and sceVideoStreamingEngineMediaKeysCreateSession](../../../core/libs/prx/libSceVideoStreamingEngine/Export.cpp) (libSceVideoStreamingEngine) - names and NIDs are present in the [PS5 3.20 export inventory](https://github.com/DNNDHH/PS5-3.20_Libs/blob/b2a77c09cd71c01f34c790cfbe98c751a13262ad/libSceVideoStreamingEngine.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/libSceVideoStreamingEngineAudioOnly.md b/docs/dev/debt/libSceVideoStreamingEngineAudioOnly.md new file mode 100644 index 000000000000..c5b7f3ebea75 --- /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/libSceVideodec.md b/docs/dev/debt/libSceVideodec.md index 2f7471176e6c..c22b5e158939 100644 --- a/docs/dev/debt/libSceVideodec.md +++ b/docs/dev/debt/libSceVideodec.md @@ -10,6 +10,6 @@ - [sceVideodecQueryResourceInfo](../../../core/libs/prx/libSceVideodec/Export.cpp) (libSceVideodec) - the sizes it reports are libSceVideodec2's, not the console's: the CPU memory, CPU-GPU memory and frame buffer sizes and the frame buffer alignment that `sceVideodec2QueryDecoderMemoryInfo` gives for the configuration mapped as `sceVideodecCreateDecoder` maps it. The GPU memory size that query also gives has no field in this structure and is dropped. The memory pointers and `thisSize` are left as the caller passed them, where [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/c2814041e546bf75c12756dbec9da911c721ce1c/src/core/libraries/videodec/videodec.cpp#L137-L187) clears the pointers; what the console writes there is not known. A larger structure is accepted, as by the module's other exports, where shadPS4 requires the exact size, and a configuration without a maximum frame size is refused with the configuration error, where shadPS4 assumes 1920x1080 or 3840x2160 -- [sceVideodecDecode and sceVideodecFlush](../../../core/libs/prx/libSceVideodec/Export.cpp) (libSceVideodec) - the picture information's video usability information (the tick rate, the sample aspect ratio and the colour description) stays zero, as the decoder does not report it, and the crop offsets are the decoded picture's crop halved, the unit the H.264 offsets use. The frame buffer holds the coded picture the decoder reports, so the rows the crop covers are in it and the caller crops them +- [sceVideodecDecode and sceVideodecFlush](../../../core/libs/prx/libSceVideodec/Export.cpp) (libSceVideodec) - the picture information's video usability information (the tick rate, the sample aspect ratio and the colour description) stays zero, as the decoder does not report it, and the crop offsets are the decoded picture's crop halved, the unit the H.264 offsets use. The frame buffer holds the coded picture the decoder reports, so the rows the crop covers are in it and the caller crops them. A picture deeper than 8 bits, such as one of a High 10 stream, throws, as what the console writes for it is not known; when its rows do not fit the staging buffer sized for 8-bit pictures of the configured size, the decode fails with the decode error before that - [sceVideodecMapMemory](../../../core/libs/prx/libSceVideodec/Export.cpp) (libSceVideodec) - its name is listed in the PS5 3.20 export table and cross-checked against PS5 13.60. Its signature and behaviour are unverified; this no-parameter declaration only resolves the import and throws through NotImplemented_nid_no_patch. diff --git a/docs/dev/debt/libSceVisionManager.md b/docs/dev/debt/libSceVisionManager.md index f8f41d421e5c..f75a2c52e14a 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 000000000000..1802fcabc390 --- /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 bf7419e63f98..8b292707d90f 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/libSceVrHand.md b/docs/dev/debt/libSceVrHand.md index 6b9642959772..a08a9d93a453 100644 --- a/docs/dev/debt/libSceVrHand.md +++ b/docs/dev/debt/libSceVrHand.md @@ -2,4 +2,5 @@ ### Unknown function info -- [sceVrHandFinalize, sceVrHandGetMesh, sceVrHandGetMeshSize, sceVrHandGetResult, sceVrHandInitialize, sceVrHandQueryMemory, sceVrHandStart, sceVrHandStop](../../../core/libs/prx/libSceVrHand/Export.cpp) (libSceVrHand) - names and NIDs verified from pinned [ps5rs stubs](https://github.com/claimore22/ps5rs/tree/5f252a658ff470bcb2b6cd15205fd8ca64ae4477/data/stubs/by_library) (`libSceVrHand.txt`), with NID match confirmed via `tools/nid_names.py` `compute_nid`. Signatures, parameter layouts, and runtime behavior remain unverified; all paths throw through `NotImplemented_nid_no_patch`. +- [sceVrHandFinalize, sceVrHandGetMesh, sceVrHandGetMeshSize, sceVrHandGetResult, sceVrHandInitialize, sceVrHandStart, sceVrHandStop](../../../core/libs/prx/libSceVrHand/Export.cpp) (libSceVrHand) - names and NIDs verified from pinned [ps5rs stubs](https://github.com/claimore22/ps5rs/tree/5f252a658ff470bcb2b6cd15205fd8ca64ae4477/data/stubs/by_library) (`libSceVrHand.txt`), with NID match confirmed via `tools/nid_names.py` `compute_nid`. Signatures, parameter layouts, and runtime behavior remain unverified; all paths throw through `NotImplemented_nid_no_patch`. +- [sceVrHandQueryMemory](../../../core/libs/prx/libSceVrHand/Export.cpp) (libSceVrHand) - the meaning of the parameter and output fields is unknown. It follows firmware 13.42's libSceVrHand.sprx, read from its disassembly and run natively on x86-64 (not a console): a null pointer, a first 32-bit parameter word other than 0x20, or any nonzero parameter byte from offset 4 to 31 returns `0x8a870006` and writes nothing; otherwise it stores the 32-bit values 0x3c00000 and 0x10000 at output offsets 0 and 4, clears output bytes 8 to 27 and returns 0. Parameter bytes from offset 32 are not read. diff --git a/docs/dev/debt/libSceVrTracker.md b/docs/dev/debt/libSceVrTracker.md index a3e50959cb86..68539e03506a 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 000000000000..a7b766bd50ed --- /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 ba44c2159d56..4637724ad494 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 000000000000..f7aac810ce37 --- /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 000000000000..5f2c91626eaf --- /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 000000000000..12b9c834093e --- /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 165da5246f96..34ee59a045c8 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 4e98250364d0..ae986ac7aa9c 100644 --- a/docs/dev/debt/libc.md +++ b/docs/dev/debt/libc.md @@ -18,7 +18,8 @@ - [__std_max_8i](../../../core/libs/prx/libc/src/VectorAlgorithms.cpp) (libc, NID `oLoo17ObE4A`) throws for null, empty, reversed or partial-element ranges; their native failure behavior is not reproduced. The nonempty-range signature, signed 64-bit value result and unaligned reads follow PPSA03671 v01.001.005's bundled `libc.prx` at RVA `0x63790`, size `0x1f4`, read from disassembly and run directly on the host, not measured on a console. - [_Mtx_trylock](../../../core/libs/prx/libc/src/Threads.cpp) (libc, NID `k6pGNMwJB08`) - returns busy for a non-recursive mutex already owned by the caller. The `libc.prx` that titles ship (read from disassembly of PPSA13934's copy, 0x5cf0, not measured on a console) passes its argument to `scePthreadMutexTrylock` and returns 0 for success, `_Thrd_busy` (3) for `SCE_KERNEL_ERROR_EBUSY` and `_Thrd_error` (4) for any other error, so busy for an owned non-recursive mutex comes from the kernel mutex there; this libc keeps its own owner and count instead, and its result for a kernel error other than busy is not compared. -- [nearbyintf](../../../core/libs/prx/libc/src/Math.cpp) (libc, NID `c+4r-T-tEIc`) rounds with the MXCSR rounding mode, as the console's `libSceLibcInternal.sprx` does in a payload process on a PS5 (firmware 13.60): with the x87 mode set to upward and MXCSR to nearest it rounded 2.5 to 2, and with MXCSR upward to 3, and the four modes gave the results the host gives. The console also raised `FE_INEXACT` for those inexact inputs, which the host's `nearbyintf` does not; whether it does for exact inputs was not measured +- [nearbyintf](../../../core/libs/prx/libc/src/MathExact.cpp) (libc, NID `c+4r-T-tEIc`) - whether the console raises `FE_INEXACT` for exact inputs remains unmeasured. A PS5 firmware 13.60 payload measured MXCSR-controlled rounding and `FE_INEXACT` for inexact inputs; this implementation uses host `rintf` for those measured cases. +- [nearbyint and nearbyintl](../../../core/libs/prx/libc/src/Math.cpp) (libc) - both use host `nearbyint`, which suppresses `FE_INEXACT` for inexact inputs. A comparison with the bundled libc of PPSA07923 and PPSA05916 found that `nearbyint` raises `FE_INEXACT` for inexact inputs; `nearbyintl` was not compared. - [__std_min_4u](../../../core/libs/prx/libc/src/VectorAlgorithms.cpp) (libc, NID `60rcqDrkUNY`) throws for null, empty, reversed or partial-element ranges; their native failure behavior is not reproduced. The nonempty-range signature, unsigned 32-bit value result and unaligned reads follow PPSA03671 v01.001.005's bundled `libc.prx` at RVA `0x62680`, size `0x1a2`, read from disassembly and run directly on the host, not measured on a console. - [__std_min_8u](../../../core/libs/prx/libc/src/VectorAlgorithms.cpp) (libc, NID `i8DeU1sI6I4`) throws for null, empty, reversed or partial-element ranges; their native failure behavior is not reproduced. The nonempty-range signature, unsigned 64-bit value result and unaligned reads follow PPSA03671 v01.001.005's bundled `libc.prx` at RVA `0x62a30`, size `0x2a4`, read from disassembly and run directly on the host, not measured on a console. - [__std_max_4i](../../../core/libs/prx/libc/src/VectorAlgorithms.cpp) (libc, NID `GE0yqFd83PA`) throws for null, empty, reversed or partial-element ranges; their native failure behavior is not reproduced. The nonempty-range signature, signed 32-bit value result and unaligned reads follow PPSA03671 v01.001.005's bundled `libc.prx` at RVA `0x63430`, size `0x1a2`, read from disassembly and run directly on the host, not measured on a console. @@ -48,6 +49,7 @@ - [malloc, calloc, realloc, reallocarray, memalign, aligned_alloc, reallocalign and posix_memalign](../../../core/libs/prx/libc/src/FileAndHeap.cpp) (libc) - the console's own heap was measured in a payload process on firmware 13.60, not in a title. A heap a title replaces was not measured and keeps the FreeBSD jemalloc behaviour: `ENOMEM` on failure, `EINVAL` for an alignment that is zero or not a power of two, and `realloc(ptr, 0)` frees the block. With the console's heap, failures set `EINVAL`, and `errno` is left alone for a size above `SIZE_MAX - 0x1008f` (`SIZE_MAX - (A + 0x100af)` for an alignment over 32 rounded up to A), a `calloc` overflow or an alignment of 2^63 or more. Alignments round up to a power of two, and `realloc(ptr, 0)` keeps the block with 0 usable bytes. - [reallocalign](../../../core/libs/prx/libc/src/FileAndHeap.cpp) (libc) - `reallocalign(ptr, 0, alignment)` for a block without that alignment throws, where the console's heap in a payload process on PS5 firmware 13.60 returned a different block with that alignment and 0 usable bytes, `errno` untouched (a 64-aligned block given 256); whether it frees the old block is not known. There, as here, `reallocalign(ptr, 0, 16)` on a 256-aligned block returned it unchanged, `reallocalign(NULL, 0, 256)` a 256-aligned block with 0 usable bytes, and alignment 3 a moved block that kept its bytes - [reallocf](../../../core/libs/prx/libc/src/FileAndHeap.cpp) (libSceLibcInternal, implemented in libc) - follows FreeBSD 11 `lib/libc/stdlib/reallocf.c` on top of this libc's `realloc`, as a payload process on a PS5 (firmware 13.60) does with the default heap (null and 0, size 0, 2^40 with `errno` 22 and the block freed, `SIZE_MAX` with `errno` untouched): size 0 does what `realloc` does here, keeping the block with 0 usable bytes with the default heap and freeing it and returning null with an application allocator, so the block is not freed twice; when `realloc` fails, the block is freed through the same allocator and null is returned with the `errno` that `realloc` left. Other failures (a commit failure that is not out of memory, an unknown pointer) throw, as they do for `realloc` +- [recallocarray](../../../core/libs/prx/libc/src/FileAndHeap.cpp) (libc) - adapted from OpenBSD `lib/libc/stdlib/recallocarray.c` at commit `2cb7cdfc21` (ISC licensed, Otto Moerbeek): console behavior is unmeasured. Delegates to `calloc` on null pointer, checks multiplication overflow on new and old counts setting `ENOMEM` (12) and `EINVAL` (22), zeroes small shrunken tails in place (under half the old size and modeled 16 KiB page size), taking old count on trust as in reference (a caller passing `oldnmemb` larger than the block zeroes past it), and otherwise allocates new storage, copies elements, zeroes new memory or clears the old allocation, and frees old pointer - [sceLibcMspaceReallocalign](../../../core/libs/prx/libc/src/Mspace.cpp) (libSceLibcInternal, implemented in libc) takes `(void* heap, void* block, size_t alignment, size_t size)`, the order of the console's `libSceLibcInternal.sprx` (SDK 4.5x build of `J03950001`, 0x13880, whose internal routine at 0x12390 treats the third argument as the alignment and, for a null block, passes it to the routine `sceLibcMspaceMemalign` uses). Measured on a PS5 (firmware 13.60) from a homebrew payload: a null block with alignment 4096 and size 100 returns a 4096-aligned block; an alignment of 0 or 3 succeeds and 100 gives a 128-aligned block, as the routine raises it to at least 32 and to the next power of two; an alignment of 2^63 or more returns null, keeps the block and leaves `errno` alone; and a size of 0 returns a block (the same one when it is already suitable) instead of freeing it. A block that is aligned and large enough is kept where it is, without giving back the bytes past the new size as the console's in-place resize does - [acosl](../../../core/libs/prx/libc/src/Math.cpp) (libc) - computed by the host's math library, like the other libc math functions here, not by the console's (FreeBSD msun ld80 code in Sony's `libc.prx`): results can differ from the console's in the last bit, and on Linux glibc sets `errno` to `EDOM` for `acosl` outside [-1, 1] where msun only raises the floating-point exception. `long double` is the x87 80-bit format, as Sony's `frexpl` uses it (`fldt 0x8(%rsp)`, result in `st(0)`) - [atanl, sinl, cosl, tanl, sinhl, coshl, tanhl, expl, exp2l, logl, log10l and powl](../../../core/libs/prx/libc/src/Math.cpp) (libc) - computed by the host's math library, as `acosl` is, not by the console's FreeBSD msun ld80 code: results can differ from the console's in the last bit (glibc's `log10l(1000)` is not exactly 3), and on Linux glibc sets `errno` to `EDOM` or `ERANGE` where msun only raises the floating-point exception. `ldexpl` and `truncl` are exact operations and give the console's result; `logb` and `remainder` give the console's value too, but on Linux glibc sets `errno` (`ERANGE` for `logb(0)`, `EDOM` for `remainder` by zero or of an infinity) where msun only raises the floating-point exception @@ -56,6 +58,7 @@ - [std_execute_once](../../../core/libs/prx/libc/Export.cpp) (libc) - assumed to be the plain-named twin of `std::_Execute_once` (`_ZSt13_Execute_onceRSt9once_flagPFiPvS1_PS1_ES1_`, the callee of Dinkumware `call_once`): it delegates there and gets the [thread.once.callonce] semantics already verified for that symbol (one invocation per flag, concurrent callers block until it completes, and a failing or throwing invocation leaves the flag unready so the next caller runs it). The name equivalence is not confirmed on a title, and the callback convention (called with (null, arg, null), non-zero return meaning success) is the twin's, unverified for this symbol - [__atomic_load, __atomic_store, __atomic_exchange and __atomic_compare_exchange](../../../core/libs/prx/libc/src/AtomicBuiltins.cpp) (libc) - the generic, size-parameterised libatomic entry points are a single `ud2` in the `libc.prx` bundled with PPSA08427 (disassembly), so the console traps on any call; these throw instead - [Sized __atomic calls](../../../core/libs/prx/libc/src/DinkumwareAtomics.cpp) (libc) - the 36 `__atomic_load_N`, `__atomic_store_N`, `__atomic_exchange_N`, `__atomic_compare_exchange_N` and `__atomic_fetch_{add,sub,and,or,xor}_N` calls (N = 1, 2, 4, 8) are sequentially consistent whatever order they are given. The `libc.prx` bundled with PPSA08427, run side by side on random values and on every order from -1 to 7, switches on the order but always uses a locked instruction or CAS loop, except that a store with an order other than `memory_order_seq_cst` is a plain store, so these are never weaker than the console. Unlike `_Atomic_load_8` and the 8-byte `_Atomic_*` exchange and fetch calls above, the console accepts every order here, including release, acq_rel and invalid ones, and these do the same +- [null_memory_resource, _Aligned_new_delete_resource, _Unaligned_new_delete_resource, _Aligned_get_default_resource, _Unaligned_get_default_resource, _Aligned_set_default_resource and _Unaligned_set_default_resource](../../../core/libs/prx/libc/src/MemoryResource.cpp) (libc) - read from the disassembly of the `libc.prx` bundled with PPSA21564 (build `J03093718`), not measured on a console. The resource objects (`0x18f870`, `0x18f8f0`, `0x18f948`), their vtables, the type-info names (including the local class `Z20null_memory_resourceE14_Null_resource`), the single default slot (`0x19b908`) shared by the aligned and unaligned get/set functions, the 32-byte alignment threshold of the allocation paths (Microsoft's STL uses `__STDCPP_DEFAULT_NEW_ALIGNMENT__`) and the deleting destructor calling unsized `operator delete(void*)` rest only on that binary. Closes when: measured on a PS5. - [Dinkumware mutexes and conditions](../../../core/libs/prx/libc/src/Threads.cpp) (libc) use pointer-to-handle arguments, matching the console aerolib signatures reported in [#3079](https://github.com/boykopovar/AnyPS5/pull/3079). The title's `_Mtx_lock` maps `0` to `_Thrd_success` (0), `0x8002000b` to `_Thrd_busy` (3), and other failures to `_Thrd_error` (4); its internal mutex init recognizes recursive flag `0x100`, while every other type uses default attributes. The observed relock failure for a plain mutex suggests those defaults are error-checking, but that has not been confirmed on hardware. The title's `_Mtx_unlock` and `_Cnd_wait` return success regardless of their internal result. The host implementation treats invalid ownership preconditions as no-ops, and throws for invalid handles, host wait errors and destroying a locked mutex as debug guards; those cases are not confirmed against the console. - [feraiseexcept](../../../core/libs/prx/libc/src/FloatingPoint.cpp) (libSceLibcInternal, implemented in libc, NID `NIfFNcyeCTo`) - console behavior and module/library versions have not been measured. The signature follows the [public PS5 SDK](https://github.com/ps5-payload-dev/sdk/blob/a7685ce8e97ce1f8a4f38253a41d54241c9124f1/include/freebsd/fenv.h); flag updates and x87 trap delivery follow [FreeBSD amd64 fenv.c](https://github.com/freebsd/freebsd-src/blob/d106002967eff712894ab8b5337bbbff106ce5e0/lib/msun/amd64/fenv.c). All six defined exception bits are supported. Unlike the FreeBSD reference, which does not mask or validate the requested bits, this implementation rejects other bits with `std::invalid_argument` before modifying state; console behavior for those bits is unknown. This is distinct from `_Feraise`, which also modifies errno and adds inexact for range exceptions. - [stdc_count_zeros_uc, us, ui, ul and ull](../../../core/libs/prx/libc/src/IntegerBuiltins.cpp) (libc) have not been measured on a console. Their unsigned 8/16/32/64/64-bit arguments and zero-bit counts follow PPSA03671 v01.001.005's bundled libc.prx, read from disassembly and run directly on a Windows host; the ul argument remains 64-bit on Windows. @@ -68,22 +71,23 @@ - [stdc_count_ones_uc, us, ui, ul and ull](../../../core/libs/prx/libc/src/IntegerBuiltins.cpp) (libc) have not been measured on a console. Their unsigned 8/16/32/64/64-bit arguments and count result follow PPSA03671 v01.001.005's bundled libc.prx, read from disassembly and run directly on a Windows host; the ul argument remains 64-bit on Windows. - [stdc_leading_ones_uc, us, ui, ul and ull; stdc_trailing_ones_uc, us, ui, ul and ull](../../../core/libs/prx/libc/src/IntegerBuiltins.cpp) (libc) have not been measured on a console. Their unsigned 8/16/32/64/64-bit arguments, all-ones results and leading/trailing one counts follow PPSA03671 v01.001.005's bundled libc.prx, read from disassembly and run directly on a Windows host; ul remains 64-bit on Windows. - [Integer compiler-rt builtins](../../../core/libs/prx/libc/src/IntegerBuiltins.cpp) (libc) - the console traps in `__divsi3`, `__modsi3` and the 64- and 128-bit divisions on a zero divisor (`div`) and in `__negv*`, `__absv*` and `__mulv*` on overflow (an abort helper, then `ud2`); these throw instead. As in the `libc.prx` bundled with PPSA08427 (disassembly), `__addv*` and `__subv*` wrap without an overflow check, and `__udivsi3`, `__umodsi3` and `__udivmodsi4` divide in software, giving a quotient of 0 and the dividend as remainder for a zero divisor; `__clzdi2` and `__ctzdi2` of 0 return 32 and `__clzti2` and `__ctzti2` of 0 return 64 -- [qsort](../../../core/libs/prx/libc/src/FileAndHeap.cpp) (libc) follows FreeBSD 11 [qsort.c](https://github.com/freebsd/freebsd-src/blob/5ed7eb0d97ba4436218e810f61bd059acba984c2/lib/libc/stdlib/qsort.c): Bentley and McIlroy's quicksort, with insertion sort below 7 elements and after a partition pass that swaps nothing, so elements that compare equal end in FreeBSD's order and the comparator is called in the same sequence. That the console's libc uses this FreeBSD code is unverified +- [qsort and qsort_r](../../../core/libs/prx/libc/src/FileAndHeap.cpp) (libc) follow FreeBSD 11 [qsort.c](https://github.com/freebsd/freebsd-src/blob/5ed7eb0d97ba4436218e810f61bd059acba984c2/lib/libc/stdlib/qsort.c): Bentley and McIlroy's quicksort, with insertion sort below 7 elements and after a partition pass that swaps nothing, so elements that compare equal end in FreeBSD's order and the comparator is called in the same sequence; `qsort_r` passes its thunk as the comparator's first argument. That the console's libc uses this FreeBSD code is unverified - [memcpy_s, memmove_s, strcpy_s, strncpy_s, strcat_s, strncat_s, wmemcpy_s, wmemmove_s, wcsncpy_s, wcscat_s, wcsncat_s](../../../core/libs/prx/libc/src/Strings.cpp) (libc) use the C11 Annex K destination size constraints, with RSIZE_MAX taken as (SIZE_MAX >> 1) / sizeof(char16_t) for wide operations and SIZE_MAX >> 1 for byte operations. An oversized destination size returns ERANGE (34) without touching the destination; the console's RSIZE_MAX and exact error value are unverified. Constraint violations return an error without invoking the registered constraint handler, as before. - [wcsncat_s and wcscat_s](../../../core/libs/prx/libc/src/Strings.cpp) (libc) refuse a copy as overlapping only when the written range `[dest + len1, dest + len1 + len2)` meets the read range `[src, src + len2)`. The rule comes from a static reading of the console's `wcsncat_s` in `libc.prx` (not run on a console); `wcscat_s` gets it through `wcsncat_s`, and its own console code was not read. The narrow `strncat_s` keeps a wider rule, `[dest, dest + used + length + 1)` against `[src, src + length + 1)`, whose console code was not read either, so it refuses some copies whose wide equivalent proceeds. - [snwprintf_s](../../../core/libs/prx/libc/src/FormattingWide.cpp) (libc) - follows C11 K.3.9.1.3 with `RSIZE_MAX` assumed to be `SIZE_MAX >> 1`. A runtime-constraint violation only returns a negative value: the handler installed with `set_constraint_handler_s` is not invoked, and the console's default handler is unknown. An invalid multibyte `%s` argument is copied byte by byte instead of being reported as an encoding error, as in `vswprintf` - [swprintf_s and vswprintf_s](../../../core/libs/prx/libc/src/FormattingWide.cpp) (libc) - follow C11 K.3.9.1.4 with `RSIZE_MAX` assumed to be `(SIZE_MAX >> 1) / sizeof(char16_t)`: the complete output, including the terminating null, must fit in the buffer, otherwise it is a runtime-constraint violation that sets `buffer[0]` to zero and returns a negative value, and the buffer is not partially written. Argument and encoding checks match `snwprintf_s` -- [strerror, strerror_r and perror](../../../core/libs/prx/libc/src/Errors.cpp) (libc) - match the system `libSceLibcInternal` of PS5 firmware 13.60 and the `libc.prx` that CUSA04865 and CUSA12435 ship, loaded on a PS4 Pro (firmware 10.71): 0 gives "No error", 1 to 94 the FreeBSD texts and any other number "error_code=0x%08x"; `perror` prints the same texts; errno is left alone. `strerror_r` follows the `libc.prx` that PPSA31872 ships, read statically: a buffer under 23 bytes returns `ERANGE` (34) without writing, otherwise it `strncpy`s length - 1 bytes, terminates the last byte and returns 0, so a long text is cut. Firmware 13.60 agreed at 0, 1, 5, 16 and 256 bytes; 17 to 255 bytes and the cut were not run on a console. A null buffer of 23 bytes or more throws, as the console writes through it. -- [strerror_s and strerrorlen_s](../../../core/libs/prx/libc/src/WideConversion.cpp) (libc) - a null destination, a capacity of 0 or one above `RSIZE_MAX` (`SIZE_MAX >> 1` here) calls the registered guest-ABI constraint handler with `EINVAL` and leaves the destination untouched, following [C11 K.3.7.4.2](https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf); what the console does then, its `RSIZE_MAX` and its default handler are not measured. Otherwise they match the system `libSceLibcInternal` of PS5 firmware 13.60: the `strerror` texts, a short buffer truncated with "..." when it holds more than 3 bytes and a return of 0 either way, and `errno` left alone +- [strerror, strerror_r and perror](../../../core/libs/prx/libc/src/Errors.cpp) (libc) - follow the `libc.prx` that PPSA05916, PPSA07923 and PPSA13934 ship, run natively over -2000 to 2000, `INT_MAX` and `INT_MIN`: 0 gives "No error", 1 to 94 the FreeBSD texts, 107, 108, 152, 1040, 1050, 1051, 1062 and 1074 their own texts, and any other number "error_code=0x%08x"; `perror` prints the same texts and errno is left alone. Firmware 13.60's `libSceLibcInternal` and the PS4 `libc.prx` of CUSA04865 and CUSA12435 agreed at the numbers measured there (0 to 96, 97, 100, 1000, -1, `INT_MAX`, `INT_MIN`); the eight extra names were not run on a console. `strerror_r` follows PPSA31872's `libc.prx`, read statically: under 23 bytes it returns `ERANGE` (34) without writing, otherwise it `strncpy`s length - 1 bytes, terminates the last byte and returns 0. Firmware 13.60 agreed at 0, 1, 5, 16 and 256 bytes. A null buffer of 23 bytes or more throws, as the console writes through it. +- [strerror_s and strerrorlen_s](../../../core/libs/prx/libc/src/WideConversion.cpp) (libc) - a null destination, a capacity of 0 or one above `SIZE_MAX >> 3` calls the registered guest-ABI constraint handler with "strerror_s: bad argument", `EINVAL` and a null pointer and leaves the destination untouched, as the `libc.prx` PPSA07923 and PPSA05916 ship does; the system `libSceLibcInternal` is not measured for these. Otherwise they match the system `libSceLibcInternal` of PS5 firmware 13.60 for the numbers it was measured on (0 to 96, 97, 100, 1000, -1, `INT_MAX`, `INT_MIN`): the `strerror` texts (the eight extended names of `strerror` were taken from the titles' `libc.prx`, not run on firmware 13.60), a short buffer truncated with "..." when it holds more than 3 bytes and a return of 0 either way, and `errno` left alone - [getw and putw](../../../core/libs/prx/libc/src/BinaryWordIo.cpp) (libc) follow FreeBSD 11.4 [getw.c](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/lib/libc/stdio/getw.c) and [putw.c](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/lib/libc/stdio/putw.c): one 32-bit little-endian word, `getw` returns -1 for EOF or an error, and `putw` returns 0 on success or -1 on error while holding the stream lock. They use the existing host-backed streams, so buffering and error timing follow the host CRT. Null streams throw and closed streams return -1 with `EBADF`, as existing byte I/O does. Console behavior is unverified. A payload process on a PS5 (firmware 13.60) gave the same results: two words written little-endian, -1 with end of file after them and for a 2-byte file, and -1 with the error flag for `putw` on a read-only stream - [vsnwprintf_s](../../../core/libs/prx/libc/src/FormattingWide.cpp) (libc) - `va_list` counterpart of `snwprintf_s` (C11 K.3.9.1.3): truncates to the buffer and returns the full length, with the same constraints and argument checks - [strndup and strdup](../../../core/libs/prx/libc/src/AllocatingStrings.cpp) (libc) return null with `errno` set to `EINVAL` (22) when `source` is null, preventing a host segfault on invalid guest input. POSIX.1-2008 and FreeBSD 11.4 libc leave `strndup(NULL)` and `strdup(NULL)` undefined (faulting). The `libc.prx` that titles ship has no null check either (read from disassembly of PPSA13934's copy, not measured on a console): `strdup` (0x6b440) calls `strlen` and `strndup` (0x6b650) calls `strnlen` on the source before allocating, so both fault on a null source there, except `strndup(NULL, 0)`, whose `strnlen` reads nothing and which returns an empty copy; here it returns null with `EINVAL`. +- [dprintf and vdprintf](../../../core/libs/prx/libc/src/AllocatingStrings.cpp) (libc, NIDs `EYmqRgFzU6I`, `pr-qZYCHfTE`) follow POSIX.1-2008 and FreeBSD 11.4 [dprintf.c](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/lib/libc/stdio/dprintf.c) and [vdprintf.c](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/lib/libc/stdio/vdprintf.c): dynamically format output via `vasprintf` and write to the descriptor using the guest write hook registered by libkernel (`_write_nid_postfix`), falling back to host write when unhooked. Retries after positive short writes until complete or an error occurs as in FreeBSD `fflush.c`, and preserves the guest `errno` across heap deallocation. Descriptors above `SHRT_MAX` return -1 with `errno` set to `EMFILE` (24) as in FreeBSD `vdprintf.c`, checked first; then descriptors below 0 return -1 with `EBADF` (9), before the format is read; null format strings return -1 with `errno` set to `EINVAL` (22). Console behavior is unmeasured. - [snprintf_s and vsnprintf_s](../../../core/libs/prx/libc/src/Formatting.cpp) (libc) - follow C11 K.3.5.3.5 and K.3.5.3.12 with `RSIZE_MAX` assumed to be `SIZE_MAX >> 1`, as `snwprintf_s` does: a null buffer or format, `size` of 0 or above `RSIZE_MAX`, any `%n` and a null `%s`, `%ls` or `%S` argument return a negative value and set `buffer[0]` to zero when the buffer and size allow it; otherwise the output is truncated to the buffer and the full length is returned. A violation only returns: the constraint handler is not invoked, and the console's error value is unverified. Not confirmed on a PS5 title - [vsscanf_s](../../../core/libs/prx/libc/src/Formatting.cpp) (libc) - returns the count of items converted before an undersized `%s`/`%c`/`%[` destination (0 when it is the first), not EOF. Not confirmed on a PS5 title - [localeconv](../../../core/libs/prx/libc/src/LocaleSupport.cpp) (libc, re-exported by libSceAmpr) - the 0x90-byte Dinkumware struct (empty monetary strings, `CHAR_MAX` for the 14 `char` fields, `decimal_point` ".", `_False`/`_True` "false"/"true") is read from the `libc.prx` that Astro's Playroom ships. It is a fixed C-locale table, which `setlocale` cannot change: it accepts only "C" in the system `libSceLibcInternal` of PS5 firmware 13.60 and in the `libc.prx` titles ship. The console's own table is not measured, and `_Frac_grouping`, `_Frac_sep`, `_No`, `_Yes` are empty strings as in that dump - [set_constraint_handler_s](../../../core/libs/prx/libc/src/WideConversion.cpp) (libc, re-exported by libSceAmpr) - the default handler is assumed to abort; each module keeps its own handler state, so a handler set through one library is not seen by the other. Within a module every `_s` function calls the installed handler, with the guest's calling convention. `ctime_s` and `asctime_s` follow the Dinkumware 26-byte format with `EINVAL` for a buffer under 26 bytes, a null pointer or an out-of-range weekday/month; `ctime_s` uses the guest time zone of `localtime_s`, and the console's exact checks are not verified - [qsort_s](../../../core/libs/prx/libc/src/FileAndHeap.cpp) (libc) sorts as `qsort` does and passes its context as the comparator's third argument, as FreeBSD 13's [`qsort_s`](https://github.com/freebsd/freebsd-src/blob/release/13.0.0/lib/libc/stdlib/qsort.c#L97-L127) (C11 Annex K) does. It returns `EINVAL` after calling the constraint handler when `n` or `es` exceeds `RSIZE_MAX`, or when `n` is not 0 and `a` or `cmp` is null; FreeBSD 11, which the rest of libc follows, has no `qsort_s`. An element size of 0 sorts nothing, where FreeBSD loops over the same address. The console's behaviour is unverified; the Quake homebrew (#6698) imports it from its `libOSMesa.so.8` -- [bsearch_s](../../../core/libs/prx/libc/src/BoundsChecking.cpp) (libc) - a non-zero element count with an element size of 0 calls the registered constraint handler and returns null with errno set to `EINVAL` (22). C11 Annex K K.3.6.3.1 does not list zero element size among its runtime constraints for `bsearch_s` (unlike `qsort_s` K.3.6.3.2); this acts as a guard against probing the first element repeatedly with zero stride. With no handler installed (the default) the call returns null without aborting, where before it called the comparator on the first element and could return `base`. Console behavior is unverified. +- [bsearch_s](../../../core/libs/prx/libc/src/BoundsChecking.cpp) (libc) accepts a zero element size: a nonempty search calls the comparator with the base address, while a zero count calls no comparator. Argument validation, callback counts, unchanged errno and lack of a constraint violation for zero stride match CPU-only executions of the converted PPSA03766 and PPSA07923 bundled `libc.prx` modules. Console execution, other SDK versions and the default constraint handler remain unverified. - [__udivti3](../../../core/libs/prx/libc/src/RuntimeSupport.cpp) (libc, re-exported by libSceAmpr) - the hardware traps on a zero divisor; this throws instead - [__umodti3](../../../core/libs/prx/libc/src/RuntimeSupport.cpp) (libc) - the hardware traps on a zero divisor; this throws instead - [__modti3](../../../core/libs/prx/libc/src/RuntimeSupport.cpp) (libc) - the hardware traps on a zero divisor; this throws instead @@ -96,6 +100,7 @@ ### Functional +- [Math.cpp](../../../core/libs/prx/libc/src/Math.cpp) (libc) and [SignalList.cpp](../../../core/libs/prx/libSceLibcInternal/SignalList.cpp) (libSceLibcInternal) start with comments that keep the upstream FreeBSD, Sun Microsystems and University of California licence notices of the code they are derived from. The licences require the notices to stay with the code, so they are comments although they are not technical debt, and the conventions check cannot tell them from other comments. Closes when: the conventions check accepts licence notices without a debt entry - [_Cosh](../../../core/libs/prx/libc/src/Math.cpp) (libc) follows the two-argument Dinkumware CRT helper used by `std::complex`, including a scaled large-finite-input path; the signature, exact result and floating-point exception behavior are not verified against the console. - [std::thread::hardware_concurrency](../../../core/libs/prx/libc/src/Threads.cpp) (libc, NID `CHrhwd8QSBs`) - the starting mask of a title's process, and so the value a title sees, are not measured, and neither is whether the console's count follows a process-wide `cpuset_setaffinity`. This returns 13, the number of CPUs in libkernel's default thread mask (`0x1FFF`), and a process-wide `cpuset_setaffinity` does not change it. In payload processes whose threads started with mask `0xea00` it returned 5 on PS5 firmware 13.60 and 12.70, while `hw.ncpu` read 16 and `sceKernelGetAvailableCpumask` `0x1fff` (both on 13.60). On 12.70 it still returned 5 when called first after `scePthreadSetaffinity` had narrowed the calling thread to one CPU, after the mask was restored, and in a thread created with a two-CPU mask. PPSA34015 imports it. - [fmodf](../../../core/libs/prx/libc/src/Math.cpp) (libc) - console `errno`, exception flags and NaN payloads remain unverified. The wrapper preserves `errno` like the existing double `fmod`, following FreeBSD 11.4 [`e_fmodf.c`](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/lib/msun/src/e_fmodf.c); host `std::fmod` still supplies the result and exception flags. @@ -103,10 +108,15 @@ - [modf and modff](../../../core/libs/prx/libc/src/Math.cpp) (libc) - native PS5 execution, Windows and unmasked exceptions remain unverified. Linux comparisons with bundled libraries from PPSA03766 and PPSA07923 cover result and integral bits, errno, SSE/x87 flags and control state. Signaling NaNs retain their payload and quiet bit; the measured float path raises SSE invalid while the double path leaves flags unchanged. - [_FSinh and _FCosh](../../../core/libs/prx/libc/src/Math.cpp) (libc) finite results are not verified bit for bit against the console: the scaled product uses the host's binary64 hyperbolic function before rounding to binary32, rather than the float rational and `_FExp` sequence in PRAGMATA's bundled `libc.prx`. NaN preference and payloads, signed zeros, infinite operands and the range-error thresholds follow that binary's instructions; the system `libSceLibcInternal` implementation and nondefault flush-to-zero modes are unverified. Against `libSceLibcInternal.sprx` on a PS5 (firmware 13.60), 12 of 36 measured results differ by one unit in the last place (`_FSinh(0.5, y)` and `_FCosh(1, y)`, `_FCosh(10, y)` for y of 0.5, 1 and 2); zeros, the overflow to infinity at 89 and 90 and the tiny-argument results matched - [_Divide, _FDivide, _Recip and _FRecip](../../../core/libs/prx/libc/src/DinkumwareInternals.cpp) (libc) follow the Dinkumware CRT division and reciprocal contracts with IEEE-754 signed-zero, infinity and NaN behavior. The exact console results, signaling-NaN handling and floating-point exception behavior are not verified. +- [Host stdout preservation](../../../core/libs/prx/libc/src/General.cpp) (WebAssembly) - redirecting stdout with `dup2` throws because Emscripten's stdout pointer cannot be rebound to a retained host stream +- [Host stderr preservation](../../../core/libs/prx/libc/src/General.cpp) (WebAssembly) uses descriptor 2 directly, so host diagnostics do not retain an independent stream across guest stderr redirection +- [Guest arena](../../../core/libs/prx/libc/src/GuestArena.cpp) (WebAssembly) is limited to an 8 GiB reservation, WebAssembly linear memory does not enforce guest page read, write or execute protections, and host region release throws because host virtual-address reservations are unavailable +- [Guest long double conversions](../../../core/libs/prx/libc/include/GuestLongDouble.hpp) (WebAssembly) - storing a binary128 value discards fraction bits beyond x87 precision instead of rounding them; noncanonical x87 encodings are unverified - [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`. @@ -133,7 +143,8 @@ - [strtod](../../../core/libs/prx/libc/src/Strings.cpp) (libc) sets `ERANGE` for tested decimal inputs with a nonzero subnormal result, including the exact decimal expansion of 2^-1074, matching nine distinct title-bundled `libc.prx` builds measured on Windows. Two other `libc.prx` builds and the console's `libSceLibcInternal.sprx` leave `errno` alone for decimal subnormals. `wcstod` still parses through the host `std::strtod` path without this explicit rule; title and console `wcstod` behavior for decimal subnormals is unverified. Hexadecimal subnormal `strtod` and `wcstod` match one title's `libc.prx` only (PPSA08329, SHA-256 a485b34ef160, run on Linux, not on a console). Results of at least 2^-1074 come from the host `strtod`, and glibc 2.35 rounds some a unit low: `0x3ffffffffffff5p-1077` gives `0x0007fffffffffffe`, that `libc.prx` `0x0007ffffffffffff`. - [remquol](../../../core/libs/prx/libc/src/MathExact.cpp) (libc) leaves `*quo` unchanged when the result is NaN; the `libc.prx` bundled with PPSA08427 writes a value that depends on earlier x87 state (`remquol(1, 0)` stored 0 on a first call and 4 on later ones) - [_Stod, _Stodx, _Stofx, _Stoldx, _Stof and _Stold](../../../core/libs/prx/libc/src/DinkumwareInternals.cpp) (libSceLibcInternal, implemented in libc) throw for hexadecimal text with a non-zero power-of-ten scale. The console's result there does not follow a simple rule: `0x3` with a scale of -1 gives 0.29999999999999999. A nonzero subnormal result sets neither `errno` nor the error argument, as measured in firmware 13.60's `libSceLibcInternal.sprx` run in a Linux host process, not on a console; there about a fifth of decimal inputs with a subnormal result come out one unit apart in the last place (`_Stodx("2.2250738585072014e-308", 0)` is the largest subnormal), which is not reproduced. Hexadecimal underflow and subnormal results with a zero scale are unverified for `libSceLibcInternal.sprx`; they follow the `strtod` rule of PPSA08329's `libc.prx`, so `_Stodx("0x1.00000000000001p-1075", 0)` gives 0 with an error of 1, not 2^-1074 -- [_LLog](../../../core/libs/prx/libc/src/DinkumwareInternals.cpp) (libc) follows the public Dinkumware CRT contract for its base flag (`0` natural, positive base 10, negative base 2). The exact console results, signaling-NaN behavior and floating-point exception behavior are not verified. +- [Scaled floating NaN subjects](../../../core/libs/prx/libc/src/DinkumwareInternals.cpp) (libc) - non-C locales, other SDK variants and console execution are unverified; references are the `libc.prx` bundled with PPSA03766 and PPSA07923, run in Linux host processes. +- [_LLog](../../../core/libs/prx/libc/src/DinkumwareInternals.cpp) (libc) runs at the caller's x87 precision, as the binary does, so a guest thread that starts at 53 bits (see `asinl`) gets the binary's 53-bit result, not the console's 64-bit one. It follows the `_LLog` of the `libc.prx` bundled with PPSA21564 (0x3fd50): Dinkumware's `_LDunscale` split, the 8-term `_LPoly` table and the split `ln 2`, `log10 e` and `log2 e` constants taken from the binary, with `_Feraise` raising `FE_DIVBYZERO` and `ERANGE` for a zero mantissa, pseudo-zeros included, and `FE_INVALID` and `EDOM` below zero. 4 million random arguments under bases 0, 1, -1, 7 and -9 give the same bits, `errno` and flags as that code run natively on Linux at 64-, 53- and 24-bit precision; the host `logl`, `log10l` and `log2l` differed on 869,197, 2,000,696 and 306,649 at 64 bits. That binary's `logl`, `log10l` and `log2l` call `_LLog` with 0, 1 and -1; here they still use the host. Other SDK versions are not compared - [Long double math in MathExact.cpp](../../../core/libs/prx/libc/src/MathExact.cpp) (libc) was compared with the `libc.prx` bundled with PPSA08427 only for canonical 80-bit encodings; unnormals, pseudo-denormals and pseudo-infinities passed to arithmetic functions (not the classifiers) follow the host x87 instead of the console - [atanf](../../../core/libs/prx/libc/src/Math.cpp) (libc) is FreeBSD msun's [`s_atanf.c`](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/lib/msun/src/s_atanf.c), with `atanlo[3]` read at run time as msun's `volatile` does. Tiny arguments return `x` without raising `FE_INEXACT`. It gives the same bits as the `atanf` of the `libc.prx` bundled with PPSA07923, PPSA05916 and PPSA13934 for all 2^32 arguments, run on a Windows host, and none of those sets `errno`. Whether other titles' builds differ is unverified. - [atan2f](../../../core/libs/prx/libc/src/Math.cpp) (libc) is FreeBSD msun's [`e_atan2f.c`](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/lib/msun/src/e_atan2f.c) over this `atanf`, with `tiny` and `pi_lo` read at run time as msun's `volatile` reads do. With two NaN arguments it returns `y`'s, as the titles' compiled `x + y` does. On 200,001,024 argument pairs (random, near-equal exponents, x near ±1, zero y, and every pair of 32 special values), run on a Windows host, it gives the same bits as the `atan2f` of the `libc.prx` bundled with PPSA07923, PPSA05916 and PPSA13934, and none of those sets `errno`. The other pairs are unverified. @@ -177,6 +188,7 @@ - [RemoveTree](../../../core/libs/prx/libc/include/RemoveTree.hpp) (libc) removes a host tree itself on Windows instead of calling `std::filesystem::remove_all`: MinGW libstdc++ up to GCC 16 does not treat a reparse point as a link, so `remove_all` recurses through it and never terminates, and any tree that holds a symlink hangs. It builds the entry list from `GetFileAttributesW`, removes a reparse point as the link it is rather than its target, clears the read-only attribute and retries as `remove_all` does, and reports the first native error. The libstdc++ fix is in GCC 17 (commit 88856ad855ae); other hosts call `remove_all`. - The [`_Unwind_Context`](../../../core/libs/prx/libc/include/exceptions/Unwind.hpp) that `_Unwind_Backtrace` passes to its callback starts with a table laid out like LLVM libunwind's `AbstractUnwindCursor` virtual table, because homebrew built with the ps5-payload-dev SDK links libunwind statically and reads the frames with its own `_Unwind_GetIP` (`__unw_get_reg`), which calls through that table. Only register reads and writes (`validReg`, `getReg`, `setReg`, with `UNW_REG_IP` and `UNW_REG_SP`), `validFloatReg` (always false) and `isSignalFrame` are answered; the other slots throw. The layout follows libunwind's `UnwindCursor.hpp`, not the console's own `libSceLibcInternal`, which is not checked - The Windows libc [exception unwinder](../../../core/libs/prx/libc/src/exception/Unwind.cpp) cannot run arbitrary Windows exception or termination handlers. It accepts GCC C and C++ handlers identified by a project's `.sehgcc` section and interprets their LSDA with the guest personalities. A handler in an unmarked module, such as a C++ cleanup through `__gxx_personality_seh0` in `libstdc++-6.dll` or a system DLL function like `qsort` in `ucrtbase.dll` (Windows 10 22H2), still stops unwinding and the exception is reported as unhandled. SjLj exceptions are unsupported; Scoop GCC 15.2.0 selects them when SEH is disabled and lacks the System V ABI SEH compiler fix carried by MSYS2. +- A guest frame built with `-fno-asynchronous-unwind-tables`, and libsystem_pthread `thread_start`, still fail to unwind on macOS. Compact unwind records them as encoding 0, and the [unwinder](../../../core/libs/prx/libc/src/exception/Unwind.cpp) rejects that encoding instead of inventing a CFA. A DWARF-mode entry whose `__eh_frame` FDE is missing or rejected fails the same way, with no fallback frame. libc itself is built with `-femit-dwarf-unwind=always` and `-Wl,-no_compact_unwind` (#8311), so its own frames stay in DWARF. The unwinder walks `__TEXT,__unwind_info` when `__eh_frame` misses the frame. A personality index in that section is a signed 32-bit delta from the Mach-O image base. - The libc [SSE4a trap emulation](../../../core/libs/prx/libc/src/specifics/windows/Sse4aEmulation.hpp) on Windows is superseded by `--to-intel` and remains only until the relinked title has been verified without it. - [getifaddrs](../../../core/libs/prx/libc/src/Interfaces.cpp) (libc) lists host interfaces and IPv4/IPv6 addresses in FreeBSD's layouts. Windows omits per-interface AF_LINK entries and interfaces without an address; its flags are only `IFF_UP`, `IFF_RUNNING`, `IFF_LOOPBACK`, `IFF_BROADCAST` and `IFF_MULTICAST` (PPP/tunnel adapters omit broadcast and point-to-point, and an unspecified prefix length gets a host mask). On Linux and macOS, `AF_LINK` maps non-Ethernet/loopback/PPP types to `IFT_OTHER` (1); Linux's `if_data` leaves `ifi_omcasts`, `ifi_noproto`, `ifi_hwassist`, `ifi_metric`, `ifi_epoch`, `ifi_lastchange`, unknown baud rates and address-entry `ifa_data` as 0/null, and macOS's 32-bit host counters wrap and `ifi_oqdrops`, `ifi_hwassist`, `ifi_epoch` and `ifi_lastchange` are 0; a point-to-point address without a peer loses `IFF_POINTOPOINT`, and an omitted IPv4 broadcast is derived from the netmask. Interface names are the host's (`if` on Windows above 15 bytes). - [gethostname](../../../core/libs/prx/libc/src/Hostname.cpp) (libc) reports an empty name without querying the host machine name, as a payload process read on a PS5 (firmware 13.60): 0 with only the terminator for a 256-byte and a 1-byte buffer. Buffer copying, null queries and `ENAMETOOLONG` follow [FreeBSD gethostname](https://github.com/freebsd/freebsd-src/blob/main/lib/libc/gen/gethostname.c); whether a title process or a console with a configured name reads another name, and the integration with `sysctl` and name resolution, are unverified and not implemented. @@ -195,6 +207,7 @@ - [std::clog, std::wclog and the facet ids](../../../core/libs/prx/libc/src/LocaleSupport.cpp) (libc): `std::clog` and `std::wclog` are 0x400-byte zeroed objects like the rest of the `NSTDSTR` stream set (the console's `libc.prx` sizes `std::clog` at 96 bytes, measured from its dynsym `st_size`), and the `numpunct::id` and `time_put::id` objects are 8-byte zeros like the other facet ids. - [std::__throw_bad_variant_access](../../../core/libs/prx/libc/src/exception/StandardExceptions.cpp) (libc) throws `std::bad_variant_access` with the `what()` string `bad_variant_access`, the one [LLVM libc++](https://github.com/llvm/llvm-project/blob/main/libcxx/src/variant.cpp) returns, since the export carries libc++'s `__throw_bad_variant_access` name; the console's string is unverified. Onimusha: Way of the Sword (PPSA27836 01.000.001) imports it from `libc`, and its bundled `libc.prx` does not export it. - [std::bad_optional_access and std::_Throw_bad_optional_access](../../../core/libs/prx/libc/src/exception/StandardExceptions.cpp) (libc) provide the exception type, constructor, destructor, and `what()` exports alongside `_Throw_bad_optional_access`, returning the `what()` string `bad_optional_access` matching Dinkumware and libc++ conventions; the console libc.prx string is unverified. PPSA26578 (issue #7624) and PPSA34015 import `_ZSt26_Throw_bad_optional_accessv` (`KwzEip7m6TM`) from `libc`. +- [std::_Throw(const std::bad_array_new_length&)](../../../core/libs/prx/libc/src/exception/StandardExceptions.cpp) (libc, NID `1cKlQv7Kvmg`) is a 52-byte function at `0xcb2d0` in the `libc.prx` bundled with PPSA02530: it ignores its argument, allocates the 8-byte exception object with the static `_ZTVSt20bad_array_new_length`, and throws it. PPSA28416 imports it from `libc`. - [The scanf family](../../../core/libs/prx/libc/src/Formatting.cpp) (libc), the `_s` forms included, decodes the input of the 16-bit wide conversions (`%ls`, `%lc`, `%l[`, `%S`, `%C`) on Linux as UTF-8, mirroring the narrow printf family, where FreeBSD uses the locale's `mbrtowc` (one byte per character in the C locale); the console's locale encoding is unverified. Input that is not UTF-8, a character outside the BMP, a scanset member outside ASCII, positional arguments next to a wide conversion and wide conversions in `fscanf` throw. Each character is stored as one 16-bit unit, widths and `_s` sizes count characters, and a `%lc` field cut short by the end of the input keeps what it read, as FreeBSD's `convert_wchar` does. Windows hands `%ls`, `%lc` and `%l[` to the host, whose `wchar_t` is 16 bits - [The scanf family](../../../core/libs/prx/libc/include/WindowsScanning.hpp) (libc) on Windows returns 0, as C17 and FreeBSD do, when input fails after only suppressed conversions have completed (`sscanf("12", "%*d%d", &value)`). Linux hands the format to glibc, which returns `EOF` there. On Windows the host stops a `%x`, `%X`, `%i` or `%p` after the `x` of a `0x` that no hex digit follows (or that the width cuts off), and a float conversion (`%e`, `%f`, `%g`, `%a`) after the `e` of an exponent with no digits (`1e`), where C17 and FreeBSD stop before the `x` or the `e` - [The scanf family](../../../core/libs/prx/libc/src/Formatting.cpp) (libc) - a `q` length is not measured on a console for `vsscanf`, `fscanf`, `vfscanf`, `scanf`, `vscanf` or the `_s` forms. On Linux and macOS the first four read it as `ll`, as the host libc and FreeBSD 11.4's source do; on Windows they end the scan at it. The `_s` forms take `q` as the conversion and pass `%q` to the host libc. `sscanf` ends the scan at the `q` directive with nothing stored on every host, as it does on a PS5 (firmware 12.70) for `%qd`, `%qS` and `%qC`, and `vsscanf` follows it, as it already did on Windows. @@ -208,13 +221,14 @@ - [syslog](../../../core/libs/prx/libc/src/Syslog.cpp) (libc) writes each message to `stderr` as `[syslog:] `, with a newline added when missing, instead of sending it to the console's system log. Priority and facility handling follow FreeBSD's `vsyslog`: `%m` expands to the guest errno's message, unknown bits are reported (as priority 0x23, since FreeBSD passes `LOG_ERR|LOG_CONS|LOG_PERROR|LOG_PID` as the priority) and masked, a missing facility becomes `LOG_USER` or the facility set by `openlog`, and errno is preserved. `openlog` applies its identity and `LOG_PID`; a null identity retains the previous one, and a valid nonzero facility replaces the default. `closelog` clears the identity but retains the options and facility, as in FreeBSD 11; when no identity is set, FreeBSD falls back to the program name, which this backend does not emit. `LOG_PERROR` has no extra effect because stderr is the emulated log sink; `LOG_NDELAY`/`LOG_ODELAY`, `LOG_NOWAIT` and `LOG_CONS` have no daemon, child or console backend to control. `setlogmask` follows [FreeBSD 11](https://github.com/freebsd/freebsd-src/blob/8d2708de5d6112a492744d367cfdfb8fd219227a/lib/libc/gen/syslog.c): the process-wide mask defaults to 0xff, zero queries it, and nonzero values replace it; masked messages are skipped before formatting, including the unknown-priority diagnostic. The console's mask behaviour is unverified - [fwscanf, vfwscanf, wscanf, vwscanf and their `_s` forms](../../../core/libs/prx/libc/src/ScanningWide.cpp) (libc) run the `swscanf` scanner on characters read with `fgetwc`, so everything listed for `swscanf` in this file applies to them. As in the console's `libc.prx`, a field takes characters while they can still begin a valid item, so a failed field such as `0x` for `%x` stays consumed, and only the character that ended the scan goes back to the stream. That character is pushed back as its UTF-8 bytes with `ungetc`, because `ungetwc` takes single bytes only; the Windows C runtime guarantees one byte of push-back, so a non-ASCII lookahead can be lost there. A null stream or format returns `EOF`; the console checks them only in the `_s` forms. - [daemon](../../../core/libs/prx/libc/src/Process.cpp) (libc) throws: forking into the background is not supported. PPSA85300 imports it and fails to load without it. VLC 3.0 calls it only when its `daemon` option is set ([libvlc.c](https://github.com/videolan/vlc/blob/6de05adcbaf2e8b85fe86aad4169393098628119/src/libvlc.c#L190-L197)), and the title starts libVLC with `--ignore-config` and without `--daemon` ([player.cc](https://github.com/ZiZc3/VLC/blob/f3253020a64368153233ede29183014c0b6c8979/src/player.cc#L960-L981)) -- [_WStoul](../../../core/libs/prx/libc/src/Strings.cpp), [_Iswctype](../../../core/libs/prx/libc/src/RuneLocale.cpp), [swscanf_s and swscanf](../../../core/libs/prx/libc/src/ScanningWide.cpp) (libc) - `_WStoul` is `wcstoul` and throws for a base other than 0 or 2 to 36. `_Iswctype` takes the class numbers of Dinkumware's [xwcc.h](https://github.com/superna9999/ti-cgt6x/blob/cgt6x_7_3_4/include/xwcc.h) (1 `alnum` to 11 `xdigit`, 12 `blank`) and throws for any other value, including the FreeBSD masks `wctype` returns; the numbering is not confirmed on the console's `libc.prx`. `swscanf_s` follows C11 7.29.2.2 and K.3.9.1.5, but reads the size argument as `unsigned int` like `sscanf_s` where K.3.9.1.5 specifies `rsize_t`; the console's width is unverified. A runtime-constraint violation (null buffer, format or receiving pointer) only returns `EOF`, and a too small array gets a null first element as in `sscanf_s`. A literal at end of input returns the number of assignments, including zero, rather than `EOF` as FreeBSD does, as reported from the console scanner in #8479; `%%` at end of input still returns `EOF`. A literal mismatch is a matching failure, where FreeBSD's `vfwscanf` reports an input failure. An incomplete floating exponent such as `1e+` converts its mantissa, as reported from the console scanner in #8479; other incomplete exponent forms are not separately verified. A short `%c` field is currently a matching failure without storing its available prefix, while #9321 reports that the console stores a short `%3lc` field; its return count, partial-output extent and precedence are unverified. An integer field that is only a prefix, such as `0x`, does not convert; FreeBSD's `vfwscanf` pushes back the `x` and converts the `0`. Integers out of range are truncated from `strtoll`/`strtoull`. `%p` follows FreeBSD 11's [vfwscanf.c](https://github.com/freebsd/freebsd-src/blob/4ab2e064d7950be84256d671a7ae93f87cc6aa36/lib/libc/stdio/vfwscanf.c#L610-L615): a hexadecimal integer with an optional `0x`, converted as unsigned and stored as a pointer; a length modifier on it throws, where FreeBSD ignores it. `%S` and `%C`, with any length modifier or `*`, end the scan as a matching failure, as the console's Dinkumware scanner in PPSA21564's `libc.prx` treats them as invalid conversions; this was read from the module, not run on a console, and whether input ending before them is an input failure instead is unverified. It throws for unknown length modifiers, scanset ranges, `%n` with suppression or width, and narrow `%s`, `%c` or `%[` input that the C-locale `wcrtomb` cannot convert. `swscanf` runs the same scanner without the size arguments of `%s`, `%c` and `%[`, as FreeBSD's [swscanf.c](https://github.com/freebsd/freebsd-src/blob/d106002967eff712894ab8b5337bbbff106ce5e0/lib/libc/stdio/swscanf.c) passes its arguments to `vswscanf`, so everything above except the sizes applies to it; it also keeps the null buffer, format and receiving pointer checks returning `EOF`, where C leaves those undefined. Neither variant is confirmed on a PS5 title +- [_WStoul](../../../core/libs/prx/libc/src/Strings.cpp), [_Iswctype](../../../core/libs/prx/libc/src/RuneLocale.cpp), [swscanf_s and swscanf](../../../core/libs/prx/libc/src/ScanningWide.cpp) (libc) - `_WStoul` is `wcstoul` and throws for a base other than 0 or 2 to 36. `_Iswctype` takes the class numbers of Dinkumware's [xwcc.h](https://github.com/superna9999/ti-cgt6x/blob/cgt6x_7_3_4/include/xwcc.h) (1 `alnum` to 11 `xdigit`, 12 `blank`) and throws for any other value, including the FreeBSD masks `wctype` returns; the numbering is not confirmed on the console's `libc.prx`. `swscanf_s` follows C11 7.29.2.2 and K.3.9.1.5, but reads the size argument as `unsigned int` like `sscanf_s` where K.3.9.1.5 specifies `rsize_t`; the console's width is unverified. A runtime-constraint violation (null buffer, format or receiving pointer) only returns `EOF`, and a too small array gets a null first element as in `sscanf_s`. A literal at end of input returns the number of assignments, including zero, rather than `EOF` as FreeBSD does, as reported from the console scanner in #8479; `%%` at end of input still returns `EOF`. A literal mismatch is a matching failure, where FreeBSD's `vfwscanf` reports an input failure. An incomplete floating exponent such as `1e+` converts its mantissa, as reported from the console scanner in #8479; other incomplete exponent forms are not separately verified. A short `%c` field is currently a matching failure without storing its available prefix, while #9321 reports that the console stores a short `%3lc` field; its return count, partial-output extent and precedence are unverified. An integer field that is only a prefix, such as `0x`, does not convert; FreeBSD's `vfwscanf` pushes back the `x` and converts the `0`. Integers out of range are truncated from `strtoll`/`strtoull`. `%p` follows FreeBSD 11's [vfwscanf.c](https://github.com/freebsd/freebsd-src/blob/4ab2e064d7950be84256d671a7ae93f87cc6aa36/lib/libc/stdio/vfwscanf.c#L610-L615): a hexadecimal integer with an optional `0x`, converted as unsigned and stored as a pointer; a length modifier on it is ignored, as in FreeBSD and the console's scanner. `%S` and `%C`, with any length modifier or `*`, end the scan as a matching failure, as the console's Dinkumware scanner in PPSA21564's `libc.prx` treats them as invalid conversions; this was read from the module, not run on a console, and whether input ending before them is an input failure instead is unverified. Scanset ranges, `%s`, `%c` and `%[` with a length other than `l` (read as narrow), `L` on an integer conversion (an `int`), any length on `%p`, and unknown conversions and unterminated sets (a matching failure) follow the `libc.prx` of PPSA07923 and PPSA05916. Unknown conversions at end of input, such as `%y` on empty input, are unmeasured; their matching-failure result is unverified. It throws for other unknown integer and floating length modifiers, `%n` with suppression or width, and narrow `%s`, `%c` or `%[` input that the C-locale `wcrtomb` cannot convert. `swscanf` runs the same scanner without the size arguments of `%s`, `%c` and `%[`, as FreeBSD's [swscanf.c](https://github.com/freebsd/freebsd-src/blob/d106002967eff712894ab8b5337bbbff106ce5e0/lib/libc/stdio/swscanf.c) passes its arguments to `vswscanf`, so everything above except the sizes applies to it; it also keeps the null buffer, format and receiving pointer checks returning `EOF`, where C leaves those undefined. Neither variant is confirmed on a PS5 title - [floating scan errno](../../../core/libs/prx/libc/src/ScanningWide.cpp) (libc) leaves narrow `sscanf` inheriting host `ERANGE` for out-of-range `%f`, `%e` and `%lf`; wide `%Lf` retains host `strtold` errno, so glibc's `ERANGE` for the representable `1e-4950` differs from the bundled library. Wide float and double conversions restore the previous `errno` after `strtof`/`strtod`, as observed in the bundled `libc.prx`; converted values and long-double range handling are retained. -- [flock](../../../core/libs/prx/libc/src/FileLock.cpp) (libkernel) on Windows shares one lock state between duplicated descriptors, following FreeBSD 11.4's [flock(2)](https://github.com/freebsd/freebsd-src/blob/releng/11.4/lib/libc/sys/flock.2). Independent opens have separate states; closing a descriptor or reopening a stream drops only its reference. Lock transitions on one open file description are serialized. The lock is a host [LockFileEx](https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-lockfileex) lock on one byte at offset 2^63 - 2, which no file reaches, so it excludes other `flock` calls and leaves reads, writes and mapped views alone, like FreeBSD's advisory locks. Console behavior, signal interruption and concurrent closure of a descriptor while its lock call is pending are unverified. +- [flock](../../../core/libs/prx/libc/src/FileLock.cpp) (libkernel) on Windows shares one lock state between duplicated descriptors, following FreeBSD 11.4's [flock(2)](https://github.com/freebsd/freebsd-src/blob/releng/11.4/lib/libc/sys/flock.2). Independent opens have separate states; closing a descriptor or reopening a stream drops only its reference. Lock transitions on one open file description are serialized. On a file the lock is a host [LockFileEx](https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-lockfileex) lock on one byte at offset 2^63 - 2, which no file reaches, so it excludes other `flock` calls and leaves reads, writes and mapped views alone, like FreeBSD's advisory locks; on a directory it is held only within this process. Console behavior, signal interruption and concurrent closure of a descriptor while its lock call is pending are unverified. - [std::error_category, std::future_category and std::future_error](../../../core/libs/prx/libc/src/exception/StandardExceptions.cpp) (libc) - measured from PPSA02530's `libc.prx`, except that the future category's deleting destructor throws instead of freeing it, the string destructor frees the block instead of the console header path, and a `_Doraise` copy of a heap message and header size are unverified. `error_code` keeps the value in the second dword, so `default_error_condition` shifts it into the high half and `equivalent` compares that dword and the category. `_Future_error_category` derives from `_Generic_error_category`, is `future` and maps 1..4 to `broken promise`, `future already retrieved`, `promise already satisfied` and `no state`; other values use the generic map, but `future_error::what()` returns null outside 1..4. `future_error` is 0x40 bytes (vtable, `GuestLocale::String` at 0x8, `error_code` at 0x30). `_Rethrow_future_exception` delegates to `rethrow_exception`. - [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 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. @@ -239,5 +253,11 @@ - [fprintf_s, vfprintf_s, vprintf_s, fwprintf_s, wprintf_s, vfwprintf_s and vwprintf_s](../../../core/libs/prx/libc/src/Formatting.cpp) (libc) follow C11 K.3.5.3.1, K.3.5.3.10 and K.3.9.1.1 with the constraints of `snprintf_s` and `swprintf_s`: a null stream, format or argument list, any `%n`, and a null `%s`, `%ls` or `%S` argument return -1 and write nothing, because the output is formatted completely before it is written. A violation only returns: the constraint handler is not invoked, `errno` is untouched, and the value is the one the narrow `snprintf_s` returns on this branch, not a result measured for a stream function on a PS5. A closed stream sets `EBADF` (9) as `fprintf` does. `vprintf_s` and `vwprintf_s` write to the guest standard output stream, and the wide forms count characters while the narrow ones count bytes, as their unchecked siblings do - [scanf_s, fscanf_s, vscanf_s and vfscanf_s](../../../core/libs/prx/libc/src/Formatting.cpp) (libc) run the scanner of `sscanf_s` over the stream, taking the size of `%s`, `%c` and `%[` as `unsigned int` after the pointer, so everything listed for `sscanf_s` applies, including the count of items converted before an undersized destination, whose first element is set to zero. Each directive is read from the stream with the host `fscanf`, with one character of look-ahead pushed back, so the stream stops after the last character a conversion used. A null stream, null format or null destination returns `EOF`, a closed stream also sets `EBADF`, and the constraint handler is not invoked. The 16-bit wide conversions (`%ls`, `%lc`, `%l[`, `%S`, `%C`) throw on Linux, as in `fscanf`. None of the stream forms were measured on a PS5, and the size type follows `sscanf_s` rather than `rsize_t` - [freopen_s](../../../core/libs/prx/libc/src/FileAndHeap.cpp) (libc) follows C11 K.3.5.2.2 through `freopen`: a null result, mode or stream returns `EINVAL` (22) with `*result` set to null when it exists, and a null name is passed to `freopen`, which reports mode-only reopening as unsupported (`ENOTSUP`, 45) with `*result` null, and the constraint handler is not invoked, as in `fopen_s`. A successful reopen stores the stream in `*result` and returns 0, and a failed one stores null and returns the errno `freopen` left, closing the stream as `freopen` does. The console's return values are unverified +- [_Fltrounds](../../../core/libs/prx/libc/src/Math.cpp) (libc) console execution and unmasked pending exception behavior remain unverified. The x87 rounding query matches PPSA03766 and PPSA07923 bundled libc.prx run on a Linux host. The shared SonyFltrounds helper used by libSceAmpr still follows the host CRT and is not covered by these measurements. - [cbrt](../../../core/libs/prx/libc/src/Math.cpp) (libc) does not compare floating-point exceptions, and its double inputs are checked by sampling, not exhaustively. It is FreeBSD msun's [`s_cbrt.c`](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/lib/msun/src/s_cbrt.c), which sets no `errno`, as the titles' `libc.prx` does not. It gives the same bits as the `cbrt` bundled with PPSA07923 and PPSA05916 on 320 million random and 10,305 structured arguments on a Windows host; the FMA-contracted build bundled with PPSA13934 differs on 32 of the random ones. - [logb and logbf](../../../core/libs/prx/libc/src/Math.cpp) (libc) do not compare floating-point exceptions, and their double inputs are checked by sampling, not exhaustively. They are FreeBSD msun's [`s_logb.c`](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/lib/msun/src/s_logb.c) and [`s_logbf.c`](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/lib/msun/src/s_logbf.c): ±0 returns `-inf` without `errno`, and a signalling NaN is returned quieted. The `libc.prx` bundled with eleven titles (PPSA04158 to PPSA35169) gives the same bits and no `errno` on 4,032,768 inputs per function on a Windows host. +- [ANYPS5_LOG_FILE](../../../core/libs/prx/libc/src/LogFilePlatform.cpp) (libc) on Windows diverts the standard handles with `CreatePipe`, `_dup2` and `SetStdHandle`, reads the pipes by polling `PeekNamedPipe` every 2 ms and writes the crash report through `log_file::CrashWrite`. This was written from the documented behaviour of those calls and compiled for MinGW, but never run on Windows: console, redirected-file, pipe and absent standard handles, the 2 ms polling latency and the handles `LoadExec` hands to the replacement are unmeasured. Closes when: `log_file_tests` is ported to a Windows host and passes. +- [ANYPS5_LOG_FILE](../../../core/libs/prx/libc/src/LogFile.cpp) (libc) copies standard output and standard error through two pipes read by two threads, so the file keeps the bytes of each stream in the order its pipe delivered them but can place lines of one stream a few lines away from lines of the other written at nearly the same time, and what a process wrote in its last milliseconds before a kill the runtime cannot intercept (`SIGKILL`, `TerminateProcess`) is lost. Closes when: a single ordered channel for both streams replaces the two pipes. +- [ANYPS5_LOG_FILE](../../../core/libs/prx/libc/src/LogFile.cpp) (libc) puts no limit on the size of the file and does not rotate it, and a child process the title starts with the standard streams inherited keeps writing into the copy pipes, so after the title exits its writes fail (`SIGPIPE` on Linux and macOS). The pipes also hold up to 1 MiB (64 KiB when the host refuses the larger size), after which a writer waits for the copy threads. Closes when: a size cap and a handover of the streams to children are designed. +- [ANYPS5_LOG_FILE](../../../core/libs/prx/libc/src/LogFile.cpp) (libc) starts from the static initialization of libc, which on Windows runs inside `DllMain` under the loader lock: it opens the file, creates the pipes and two threads there, and none of this has run on Windows. A thread started under the loader lock waits for the lock to be released, which `DllMain` does not wait for, so no deadlock is expected, but no Windows run has confirmed it. Closes when: measured on a Windows host. +- [ANYPS5_LOG_FILE](../../../core/libs/prx/libc/src/LogFile.cpp) (libc) writes a line that one `write` call produced to the file whole, but two threads that write lines longer than `PIPE_BUF` (512 bytes on macOS, 4096 on Linux) to the same stream can still interleave inside that stream's pipe before the copy reads it, as a terminal shows too. Closes when: the standard streams are serialised per line before they reach the pipe. diff --git a/docs/dev/debt/libfreetype.md b/docs/dev/debt/libfreetype.md new file mode 100644 index 000000000000..e3723db9bfe2 --- /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 6d896ff998f4..48786a7e827f 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) @@ -35,6 +36,7 @@ - [kern.ostype, kern.osrelease, kern.version, kern.hostname, hw.machine, hw.model](../../../core/libs/prx/libkernel/System/src/SystemConfiguration.cpp) (libkernel) - `sysctl` (1.1, 1.2, 1.4, 1.10, 6.1, 6.2), `sysctlbyname` and `sysctlnametomib` serve read-only strings. A payload process on a PS5 (firmware 13.60) read "FreeBSD", "0.0-prototype", an empty host name, "amd64" and, for `hw.model`, "100-000001020" padded with spaces to 47 characters, which are returned here. Its `kern.version` was "r229358/releases/13.60 Jul 17 2026 02:16:29", which names the firmware, so the FreeBSD 11.4 text "FreeBSD 11.4-RELEASE\n" stays here. Whether another PS5 model reports another `hw.model` is not known. A short buffer gets as many bytes as fit and `ENOMEM`, as on the console, and a write `EPERM` - [kern.osreldate, kern.osrevision, kern.argmax, kern.ngroups](../../../core/libs/prx/libkernel/System/src/SystemConfiguration.cpp) (libkernel) - `sysctl` (1.24, 1.3, 1.8, 1.18) and `sysctlbyname` report 900000, 199506, 262144 and 1023, the 4-byte values a payload process on a PS5 (firmware 13.60) read; a short buffer returns `ENOMEM` and a write `EPERM` - [kern.boottime](../../../core/libs/prx/libkernel/System/src/SystemConfiguration.cpp) (libkernel) - `sysctl` {`CTL_KERN`, `KERN_BOOTTIME`} and `sysctlbyname` report a read-only 16-byte `struct timeval`, as FreeBSD 11.4's [`sysctl_kern_boottime`](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/sys/kern/kern_tc.c#L144-L163) does: the guest's `CLOCK_REALTIME` minus its `CLOCK_UPTIME`, taken at the first read and kept, so a later step of the host clock does not move it as FreeBSD's `tc_setclock` would. A payload process on PS5 firmware 13.60 gets the same value, `CLOCK_REALTIME` minus `CLOCK_UPTIME`, unchanged 2 s later, and an 8-byte buffer gets the first 8 bytes and `ENOMEM`; what a title process gets has not been measured. +- [vm.loadavg](../../../core/libs/prx/libkernel/System/src/SystemConfiguration.cpp) (libkernel) - `sysctl` {`CTL_VM`, `VM_LOADAVG`}, `sysctlbyname` and `sysctlnametomib` serve FreeBSD 11.4's 24-byte read-only [`struct loadavg`](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/sys/sys/resource.h#L161-L164), as its [`sysctl_vm_loadavg`](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/sys/vm/vm_meter.c#L71-L90) does: three 32-bit fixed-point averages over an `fscale` of 2048 (`FSHIFT` 11). The averages are the host's 1, 5 and 15 minute loads from `getloadavg`. They are 0 on Windows, which has none, and when `getloadavg` returns fewer than 3 averages; the call still succeeds then. What the console reports, and whether it answers an application at all, was not measured. A write returns `EPERM` and a short buffer `ENOMEM`. ProsperoCraft (PPSA99874) reads it at start-up through its Java 25 runtime's own `getloadavg`, which returns -1 when the call fails. - [sceKernelGetProsperoSystemSwVersion](../../../core/libs/prx/libkernel/System/src/SoftwareVersion.cpp) (libkernel) reports system software version `0x01000000` ("01.000.000"); the console's firmware version is not modeled. The 0x28-byte block (a 64-bit size at 0, the version string at 8 and the packed version at 0x24) follows [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/main/src/SharpProspero/Interop/Kernel/KernelSystem.cs), which Prospero Multi Tools (PPSA99110) and Prospero Explorer (PPSA99109) are built with and which sets the size to 40, and the same fields in [etaHEN](https://github.com/etaHEN/etaHEN/blob/main/Source%20Code/daemon/include/ipc.hpp) and [shsrv](https://github.com/ps5-payload-dev/shsrv/blob/master/sh.c). Measured on PS5 firmware 13.60: every size (0, 0x27, 0x28, 0x29, 0x30, 0x100 and 2^64-1) returns 0 and is preserved, bytes 8 to 0x27 are written and nothing from 0x28 onward, and a null pointer returns 0 without a fault or an `errno` change - [sceKernelGetAllowedSdkVersionOnSystem](../../../core/libs/prx/libkernel/System/src/SoftwareVersion.cpp) (libkernel) reports `0x01000fff` (the system software version with the 12 patch bits set), where a payload process on a PS5 (firmware 12.70) got 0 and wrote `0x12700fff` in 4 bytes: which matches the kernel firmware version 12.70 (`0x12700001`, as the payload SDK's `kernel_get_fw_version` reported it) with the 12 patch bits set, rather than the `13.090.001` that `sceKernelGetSystemSwVersion` reported in the same process. The `0x01000fff` pattern follows [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/98fd0689/src/core/libraries/kernel/kernel.cpp) on the PS4 and [SharpProspero](https://github.com/SvenGDK/SharpProspero/blob/main/src/SharpProspero/Interop/Kernel/KernelSystem.cs), which Prospero Explorer (PPSA99109) reads it through. A null pointer returns `SCE_KERNEL_ERROR_EINVAL` (`0x80020016`) here and in that process. Other firmware and a title process are unmeasured - [sceKernelConvertUtcToLocaltime, sceKernelConvertLocaltimeToUtc](../../../core/libs/prx/libkernel/Time/Time.cpp) (libkernel) convert with the host time zone at the given instant, as libc `localtime` does, instead of the console's time zone setting. `west_sec` holds the standard-time offset in seconds east of UTC, despite its name, and `dst_sec` the daylight saving seconds in effect. This follows PPSA99203 ([PS5SX2](https://github.com/Swordpdf/PS5SX2/blob/b4cf55e87c34e8a2a1cd9302df4373e5a94d28f4/ps5/frontend/fe_ps5.cpp#L54-L63)), whose author saw a console write 7200 and 3600 into the 16-byte block; which zone that console was set to is not recorded, so whether `west_sec` includes daylight saving is not settled. [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/23c41333/src/core/libraries/kernel/time.cpp) also stores seconds east. PPSA99203 declares the last argument of `sceKernelConvertUtcToLocaltime` as `uint64_t*`; 32 bits are written. On Windows the standard offset and the daylight saving amount are the C runtime's current `_get_timezone` and `_get_dstbias` for every instant, as libc `localtime_s` uses them, so instants under a zone's earlier rules get today's offsets; a `TZ` variable does not set `_dstbias`, which keeps the value an earlier `_tzset` read from the system (0 when the system zone has no daylight saving), and summer time then adds nothing. In a repeated or skipped local hour, `sceKernelConvertLocaltimeToUtc` takes the offset in effect one standard offset earlier. Its last argument receives the zone's daylight saving amount whether or not it is in effect, found by sampling the host zone over the year around the result, while `dst_sec` is the amount in effect: the libc `mktime` that PPSA99109 bundles (text 0x70ebb-0x70ee5) subtracts that amount when `tm_isdst` is set outside summer time. That `mktime` passes `tm_isdst` as the second argument, which is ignored, so it does not choose the offset in a repeated hour. The `gettimeofday` time zone still reports no offset and no daylight saving. A host time the C runtime cannot convert throws @@ -45,6 +47,7 @@ - [sceKernelGetAppInfo](../../../core/libs/prx/libkernel/System/src/Process.cpp) (libkernel) - a pid other than the caller's and 0 throws, because AnyPS5 cannot know which other processes exist: a payload process on a PS5 (kernel firmware 12.70, system software reported as 13.09) got 0 and a record for pid 1 and 0x80020003 (`ESRCH`, errno 3) for its own pid + 1, so which other pids return a record cannot be modelled. `app_id` (offset 0) is 1, the running title's id in libSceSystemService, which is a guess (0 there and at 0x10). Byte 0x1e was 5 there and is unknown in a game, so it is written as 0, as is every other field except 0xffffffff at 0x50. The 0x58-byte extent was measured only in that payload process (SDK v0.44); a title with a smaller structure could be overrun if it depends on the SDK version. Pid 0 gets the zeroed record without a title ID, as that process read it; whose record that is was not identified and a game's pid 0 record was not measured - [AMPR object layout and compact gathers](../../../core/libs/prx/libkernel/Apr/include/AprCommandBuffer.hpp) - the 24-byte object and offsets (type 0, cursor 4, count 8, capacity 12, pointer 16) follow [ampr_emu assertions](https://github.com/drakmor/ampr_emu/blob/cfa85df379f6eeeb165d7badf9b648e266fe77b7/include/ampr_emu_command_buffer_types.h#L138-L143) and its [C declaration](https://github.com/drakmor/ampr_emu/blob/cfa85df379f6eeeb165d7badf9b648e266fe77b7/include/ampr.h#L41-L47). AnyPS5 represents the 32-bit type word as low 16-bit type and high 16-bit recording flags. Command encoding is AnyPS5 internal: opcode 29 and three 32-bit words encode the high offset byte, length minus one and low offset word. The 12-byte size reduces HFW's 1 MiB buffer pressure; it is not a claim about console opcode encoding. Existing 40-bit offsets and lengths 1 through 2^32 are retained; console behavior outside those limits is unverified. - [APR resolve ForEach result](../../../core/libs/prx/libkernel/Apr/src/Apr.cpp) (libkernel) - `sceKernelAprResolveFilepathsToIdsAndFileSizesForEach` returns the number of paths that resolved, with the per-path status in `results` and the failed ids/sizes set to the invalid id and 0. The [ampr_emu](https://github.com/drakmor/ampr_emu) bridge passes the count of its resolver through and does not show what is counted; counting successes is not confirmed on a title. The guest errno of the failing non-`ForEach` resolves is set through `__error_nid_postfix` +- [APR resolve argument checks and prefix join](../../../core/libs/prx/libkernel/Apr/src/Apr.cpp) (libkernel) - the batched `sceKernelAprResolveFilepathsToIds` forms reject a null `prefix`, `paths` or `ids` with `EINVAL`, accept a count of 0 as a success that writes nothing, take a null path element as a missing file at its own index, write the invalid id into the failing slot, and leave `error_index` untouched on success; the prefixed forms join prefix and path by plain concatenation. None of these failure and validation details is measured on a title, and all of them differ from the [ampr_emu](https://github.com/drakmor/ampr_emu) bridge, which answers `EFAULT` for null arguments and rejects a count of 0, validates every path element before resolving any, leaves the failing slot unwritten, sets `error_index` to 0 on success, and inserts a `/` between prefix and path unless the prefix already ends in a separator - [APR reads past the end of a file](../../../core/libs/prx/libkernel/Apr/src/Apr.cpp) (libkernel) - a read that reaches the current end of the file on disk copies the bytes the file has and fills the rest of the destination with zeros; a read that comes back short before that end still throws. PPSA18605 resolves its settings file once, rewrites it one byte shorter and reads it again with the size that resolve returned. The console's behaviour for a read past the end of a file is unverified: it may zero-fill, leave the destination untouched or fail the command - [AMPR counter access](../../../core/libs/prx/libkernel/Apr/src/Apr.cpp) (libSceAmpr) - signatures and checks of `WaitOnCounter_04_00`, `WriteCounter_04_00`, `ConstructNop` and `ConstructMarker` taken from the [ampr_emu](https://github.com/drakmor/ampr_emu) reimplementation, which hands counter commands to the console and does not show their effect. The counters are taken as 32 bits each: the 8-byte access of counter n spans n (low) and n + 1 (high), the 2- and 1-byte accesses select a half or a byte of the counter by its offset, waits compare at the access width (signed and wrapped compares included), the AND mask applies to both sides and the atomic writes wrap within the access. The `ConstructNop` type is not recorded - [APR gather and scatter reads](../../../core/libs/prx/libkernel/Apr/src/Apr.cpp) (libSceAmpr) - signatures, argument checks and the read cursor taken from the [ampr_emu](https://github.com/drakmor/ampr_emu) reimplementation, not confirmed on a title: each read leaves the file, the next file offset and the next destination; a gather reads that file at a new offset into the next destination, a scatter continues in the file into a new destination, a gather-scatter takes both. Recording one needs a read file since the last `ResetGatherScatterState`; like ampr_emu, `sceAmprCommandBufferReset` keeps that state, and a gather or scatter with no read before it in the submitted buffer throws instead of returning `SCE_AMPR_ERROR_APR_INVALIDGATHERSCATTERSTATE` @@ -52,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 @@ -64,15 +68,19 @@ - [sceKernelGetModuleInfo](../../../core/libs/prx/libkernel/Module/src/ModuleInfo.cpp) (libkernel) - the 0x160-byte layout (`st_size`, `name[256]`, 4 segments, `segment_count`, `fingerprint[20]`) follows [fpPS4](https://github.com/red-prig/fpPS4/blob/04cefd43e6fddd1ab033e7980cd356d14c964905/sys/sys_types.pas#L319-L337) and [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/0fe263a4760dfbfa973366890061749b4af0de97/src/core/module.h#L15-L31). Only that `st_size` is accepted, as in shadPS4; other sizes return `EINVAL`, a null pointer `EFAULT` and a handle `sceKernelGetModuleList` does not list `ESRCH`. Name and segments are the ones `sceKernelGetModuleInfoFromAddr` reports, on Windows from the same PE sections, so `prot` uses the read/write/execute bits 1/2/4, while fpPS4 and shadPS4 store the ELF `p_flags`. The fingerprint is left zero, as the host image does not carry it - [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 @@ -128,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 @@ -138,12 +146,14 @@ ### Functional +- [sceKernelGetModuleInfoForUnwind](../../../core/libs/prx/libkernel/Module/src/Module.cpp) (WebAssembly) throws because guest module unwind metadata is not implemented for linear memory; it does not query the host's process mappings - [scePthreadYield](../../../core/libs/prx/libkernel/Pthread/src/Thread.cpp) (libkernel) on Windows calls Sleep(1) after 512 consecutive yields that find no other thread ready on the current processor and arrive less than ~10,000 TSC ticks apart (so the span varies with host CPU TSC rate); FreeBSD sched_yield never sleeps. - [__tls_get_addr](../../../core/libs/prx/libkernel/Module/src/Tls.cpp) (libkernel, NID `vNe1w4diLCs`) throws on macOS, where the relinker binds guest modules to `Aps5GuestTlsGetAddr_nid_no_patch` ([GuestTlsMacOs.cpp](../../../core/libs/prx/libkernel/Pthread/src/GuestTlsMacOs.cpp)) instead; it also throws for a null index, module 0 and a Windows thread without a block for the module. It reads the module word as the relinker writes it for `R_X86_64_DTPMOD64`: on Windows the address of the module's PE `_tls_index`, resolved through the thread's `ThreadLocalStoragePointer` as in [WindowsGuestStartup.cpp](../../../core/relinker/elfpatcher/src/windows/WindowsGuestStartup.cpp); on Linux the glibc module ID, passed to glibc's `__tls_get_addr`. Guest modules' imports are bound to the host resolver, so this export is reached only through a lookup by NID. - [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`. `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. @@ -163,10 +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. @@ -175,7 +187,7 @@ - [/dev/random and /dev/urandom](../../../core/libs/prx/libkernel/File/src/RandomDevice.cpp) (libkernel) opened for reading return a descriptor backed by the host null device whose reads are filled with host OS entropy (`getentropy`, `rand_s` on Windows); both paths behave the same, never block, and positioned reads ignore the offset (FreeBSD `random(4)`). Only the exact paths are recognised, `fstat`, `lseek` and `mmap` see the null device, and opening them for writing throws - [pthread_attr_getinheritsched, pthread_attr_setinheritsched, pthread_attr_getscope, pthread_attr_setscope, pthread_attr_getstackaddr](../../../core/libs/prx/libkernel/Pthread/Posix/Attr.cpp) (libkernel) - every guest thread is a host thread at system scope, so `PTHREAD_SCOPE_PROCESS` is stored and reported (`pthread_attr_get_np`, `scePthreadAttrGet`) but changes nothing. Measured in a payload process on a PS5 (firmware 13.60), as FreeBSD 11 libthr ([thr_attr.c](https://github.com/freebsd/freebsd-src/blob/5ed7eb0d97ba4436218e810f61bd059acba984c2/lib/libthr/thread/thr_attr.c)) does: the scope defaults to 2, only 0 and 2 are accepted (`EINVAL` otherwise), an inherit value other than 4 or 0 returns `ENOTSUP`, `pthread_attr_getstackaddr` returns the configured pointer (null by default), and a null output, a null, uninitialized or destroyed attribute return `EINVAL`. A thread keeps the scope it was created with, taken from its creator under `PTHREAD_INHERIT_SCHED` - [Shared memory](../../../core/libs/prx/libkernel/File/src/SharedMemory.cpp) (libkernel) on Linux implements anonymous and named objects, bounded descriptor writes and seeks, and `shm_unlink` with effective read/write permission checks from FreeBSD 11. Named paths up to 1023 bytes use `/anyps5-shm-` plus SHA-1; collisions are not detected, and the namespace is shared across processes in the host mount namespace. Named creation applies the guest umask without changing the host mask. Linux procfs and `/dev/shm` are required. Operations use an advisory directory lock; external host operations bypass it, unrelated objects serialize, and descriptor operations require two spare host descriptors and compare device/inode with the initial descriptor identity on both the pinned-object and ordinary-file fallback paths. [Guest mappings](../../../core/libs/prx/libkernel/DirectMemory/PosixMemory.cpp) support shared and private mappings of these descriptors through the allocation tracker and pin a duplicate descriptor during validation and mapping; mapping requires one spare host descriptor; file-backed mappings use the write-watch scan fallback because aliases and descriptor writes bypass per-mapping tracking. On Windows, anonymous objects are delete-on-close temporary files and `mmap` maps them as [regular files](../../../core/libs/prx/libkernel/DirectMemory/PosixMemory.cpp); named objects are described in the next entry. Invalid non-null name pointers, console behaviour and title compatibility remain unverified. -- [shm_open, shm_unlink](../../../core/libs/prx/libkernel/File/src/SharedMemory.cpp) (libkernel, Windows) - named objects are regular files in the current user's temporary directory under `AnyPS5/shm`, identified by SHA-1 of the exact guest name. The namespace is per host user and shared by every AnyPS5 process using that temporary root, so two titles using the same name share the object. Namespace operations use a cross-session named mutex, while file-size changes and writes use a mutex keyed by the host file identity; unlink renames the visible object to a unique internal name so already-open handles remain usable while the guest name can be recreated. Orphaned files are reaped when the last tracked guest descriptor closes or opportunistically during a later open. Closing through host stdio wrappers does not update this bookkeeping or reap immediately. The namespace directory has a protected ACL for the owner, SYSTEM and Administrators; newly created objects map the guest owner read/write bits after applying the guest creation mask. `fchmod` updates those owner permissions on the descriptor's file object. Guest group/other permission classes are not represented independently on Windows. The owner's read permission also grants execute, so a read-only descriptor can be mapped `PROT_EXEC` as FreeBSD 11.4's `shm_mmap` allows; objects created by earlier builds lack it until `fchmod`. No behavior here has been measured on PS5. Lifecycle, cross-process resize/write, and mode behavior are exercised by Windows tests. See Microsoft's [file sharing modes](https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea), [DeleteFile](https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-deletefilew) and [mutex objects](https://learn.microsoft.com/en-us/windows/win32/sync/mutex-objects). +- [shm_open, shm_unlink](../../../core/libs/prx/libkernel/File/src/SharedMemory.cpp) (libkernel, Windows) - named objects are regular files in the current user's temporary directory under `AnyPS5/shm`, identified by SHA-1 of the exact guest name. The namespace is per host user and shared by every AnyPS5 process using that temporary root, so two titles using the same name share the object. Namespace operations use a cross-session named mutex, while file-size changes and writes use a mutex keyed by the host file identity; unlink renames the visible object to a unique internal name so already-open handles remain usable while the guest name can be recreated. Orphaned files are reaped when the last tracked guest descriptor closes or opportunistically during a later open. Closing through host stdio wrappers does not update this bookkeeping or reap immediately. The namespace directory has a protected ACL for the owner, SYSTEM and Administrators; newly created objects map the guest owner read/write bits after applying the guest creation mask. `fchmod` updates those owner permissions on the descriptor's file object. Guest group/other permission classes are not represented independently on Windows. The owner's read permission also grants execute, so a read-only descriptor can be mapped `PROT_EXEC` as FreeBSD 11.4's `shm_mmap` allows; objects created by earlier builds lack it until `fchmod`. Mappings take a regular file's checks and paths (`guest_named_shm_windows_mapping`). No behavior here has been measured on PS5. Lifecycle, cross-process resize/write, and mode behavior are exercised by Windows tests. See Microsoft's [file sharing modes](https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea), [DeleteFile](https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-deletefilew) and [mutex objects](https://learn.microsoft.com/en-us/windows/win32/sync/mutex-objects). - [sceKernelAddReadEvent and sceKernelAddWriteEvent](../../../core/libs/prx/libkernel/Equeue/Equeue.cpp) (libkernel): a read event on a listening socket, here and in `kevent`, reports the number of completed connections waiting to be accepted in `data`, as FreeBSD 11.4's [`filt_solisten`](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/sys/kern/uipc_socket.c#L3384-L3392) reports `so_qlen`: on Linux a TCP listener's accept queue from `TCP_INFO` (`tcpi_unacked`, which Linux fills with the accept backlog for a listening socket), and elsewhere, or for a listener that is not TCP, 1 while a connection is waiting, as no host call reports that count. A write event reports the free space of the socket's send buffer in `data`, as FreeBSD 11.4's [`filt_sowrite`](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/sys/kern/uipc_socket.c#L3358-L3382) reports `sbspace`: on Linux the host's `SO_SNDBUF` less the bytes `SIOCOUTQ` counts as queued, which include the host's per-packet overhead, so the space shrinks by somewhat more than the bytes sent. Windows has no query for that space and macOS is not wired up, so both report the whole `SO_SNDBUF`, which does not shrink as data is queued. Only guest sockets are supported; other descriptors and a low watermark above 1 throw - [sceKernelAddReadEvent on pipes](../../../core/libs/prx/libkernel/Equeue/Equeue.cpp) (libkernel) is an exception to the sockets-only rule above: it also takes the read end of a pipe, as `kevent` does through FreeBSD's `filt_piperead`, and ignores the size argument there. Host streams, other descriptors and a write event on a pipe throw - [sceKernelAddReadEvent and sceKernelAddWriteEvent on regular files](../../../core/libs/prx/libkernel/Equeue/Equeue.cpp) (libkernel) are the other exception: a size argument above 1, directories and other vnode types throw, and whether the console's file systems answer as `vfs_kqfilter` does was not measured. A wait holding one of these events polls it every millisecond, as no host call reports every file change, so a write through another descriptor shows up to 1 ms late. Unlike FreeBSD, a seek can make a read event fire again: FreeBSD 11.4's [`kqueue_scan`](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/sys/kern/kern_event.c) deactivates a level-triggered read knote once `filt_vfsread` reports `data` 0, and only a vnode `KNOTE` (a write, an extend or a truncate) activates it again; `lseek` posts none, so after a file read to its end is seeked back, the 1 ms poll here reports the new `data` (10 for a 10-byte file seeked to 0) where FreeBSD keeps waiting until the file changes. Otherwise they follow FreeBSD 11.4's [`filt_vfsread` and `filt_vfswrite`](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/sys/kern/vfs_subr.c#L5122-L5168): a read event reports the size less the descriptor's offset in `data` and fires while that is not 0; a write event always fires with `data` 0 @@ -185,12 +197,16 @@ - [sceKernelAioSubmitReadCommands, sceKernelAioSubmitWriteCommands and their Multiple variants](../../../core/libs/prx/libkernel/Aio/src/Aio.cpp) (libkernel) on Windows transfer through the same positioned path as `sceKernelPread`/`sceKernelPwrite` and restore the descriptor's file pointer afterwards; positioned transfers, plain transfers and seeks of one descriptor are serialized per descriptor (shared across duplicated descriptors), so a concurrent transfer observes a stable file pointer - [sceKernelAioSetParam](../../../core/libs/prx/libkernel/Aio/src/Aio.cpp) (libkernel) - the limits and `sceKernelAioInitializeParam`'s defaults (three 20-byte scheduling structs, the last without split) are measured on a PS5 (firmware 13.60), where a null struct crashes both calls; here both throw. The scheduling settings are not used: `sceKernelAioInitializeImpl` ignores the struct and requests run synchronously on submit - [AIO request ownership](../../../core/libs/prx/libkernel/Aio/src/Aio.cpp) - pending cancel and delete throw: their console behavior and native cancellation guarantees are unverified. The host registry holds at most 511 undeleted submissions, reserves a Multiple batch together and uses positive identities without reuse; capacity or identity exhaustion throws instead of returning an unverified console error. A thrown transfer releases its unpublished reservations without undoing earlier transfers or result stores. Console capacity, identity allocation and exhaustion behavior are unmeasured. Background execution requires atomic retention of the native file and archive/shared-memory metadata across descriptor close and replacement; the existing duplication path does not provide that boundary -- [sceKernelGetFsSandboxRandomWord](../../../core/libs/prx/libkernel/System/src/Sandbox.cpp) (libkernel) returns a fixed directory name, `gkbHtXc3Wq`. On the console the name is the process's randomized path (syscall 602, `randomized_path`), and the sandbox exposes system files under it, such as `common/lib` and `common/cert`. Nothing is mounted under the name here, so `/gkbHtXc3Wq/common/...` resolves under the guest root like any other path and does not exist, except `/gkbHtXc3Wq/common/cert/CA_LIST.cer`, which [SandboxCertificates.cpp](../../../core/libs/prx/libkernel/File/src/SandboxCertificates.cpp) serves from the host trust store +- [sceKernelGetFsSandboxRandomWord](../../../core/libs/prx/libkernel/System/src/Sandbox.cpp) (libkernel) returns a fixed directory name, `gkbHtXc3Wq`. On the console the name is the process's randomized path (syscall 602, `randomized_path`), and the sandbox exposes system files under it, such as `common/lib` and `common/cert`. Nothing is mounted under the name here, so `/gkbHtXc3Wq/common/...` resolves under the guest root like any other path and does not exist, except `/gkbHtXc3Wq/common/cert/CA_LIST.cer`, which [SandboxCertificates.cpp](../../../core/libs/prx/libkernel/File/src/SandboxCertificates.cpp) serves from the host trust store. The same file also serves `/system/common/cert/CA_LIST.cer` and `/common/cert/CA_LIST.cer`, which do not use the sandbox word (see the sandbox CA list entry) - [ktimer_create, ktimer_settime, ktimer_gettime, ktimer_getoverrun, ktimer_delete](../../../core/libs/prx/libkernel/Time/Ktimer.cpp) (libkernel) - a `SIGEV_SIGNAL` or `SIGEV_THREAD_ID` timer, and one created with a null `sigevent` (FreeBSD defaults it to `SIGEV_SIGNAL`), throws, because delivering a guest signal from a timer is not modelled. A non-zero value under one tick rounds up to 1 ms, as FreeBSD 11 does at hz 1000; the console's hz is not measured (`kern.clockrate` is unanswered). `SIGEV_NONE` timers on `CLOCK_REALTIME` and `CLOCK_MONOTONIC` follow `kern_time.c`: ids 3 to 31 (`EAGAIN` when full), `EINVAL` for another clock, a bad notify type or signal, an id that is not live or a bad `itimerspec` field, and `TIMER_ABSTIME` (1). Expiry is worked out from the guest clock when the timer is read, and `ktimer_getoverrun` returns 0, as FreeBSD only updates it when a signal is accepted -- [The sandbox CA list](../../../core/libs/prx/libkernel/File/src/SandboxCertificates.cpp) (libkernel), `//common/cert/CA_LIST.cer`, is a PEM bundle of the host's trust anchors, written once per process to `cert_cache/CA_LIST.cer` in the run directory with the owner write bit cleared: on Windows the current user's `ROOT` store, filtered through Disallowed and the combined EKU extension/property for TLS server authentication (Windows fetches missing roots on demand, so a root that was never fetched is absent), elsewhere `SSL_CERT_FILE` or the first of `/etc/ssl/certs/ca-certificates.crt`, `/etc/pki/tls/certs/ca-bundle.crt`, `/etc/ssl/ca-bundle.pem` and `/etc/ssl/cert.pem` that exists. On macOS, `/etc/ssl/cert.pem` is a static snapshot and does not reflect roots added to or distrusted in the Keychain. Existing guest files, explicit aliases and blocked mounts take precedence over the provider. The PEM snapshot does not carry Windows CTL restrictions beyond EKU, native revocation policy or later trust-store changes. Without any certificate the path does not exist. The console file's format is unverified: only that bundled OpenSSL accepts a PEM bundle there is shown (ProsperoRadio PPSA99001 and SwanStation PPSA98510, #5001). The other entries of the console's `common/cert` directory, the directory itself (it does not exist here) and the error a write open gets (`EACCES` from the host here) are unverified +- [The sandbox CA list](../../../core/libs/prx/libkernel/File/src/SandboxCertificates.cpp) (libkernel), `//common/cert/CA_LIST.cer`, `/system/common/cert/CA_LIST.cer` and `/common/cert/CA_LIST.cer`, is a PEM bundle of the host's trust anchors, written once per process to `cert_cache/CA_LIST.cer` in the run directory with the owner write bit cleared: on Windows the current user's `ROOT` store, filtered through Disallowed and the combined EKU extension/property for TLS server authentication (Windows fetches missing roots on demand, so a root that was never fetched is absent), elsewhere `SSL_CERT_FILE` or the first of `/etc/ssl/certs/ca-certificates.crt`, `/etc/pki/tls/certs/ca-bundle.crt`, `/etc/ssl/ca-bundle.pem` and `/etc/ssl/cert.pem` that exists. On macOS, `/etc/ssl/cert.pem` is a static snapshot and does not reflect roots added to or distrusted in the Keychain. Existing guest files, explicit aliases and blocked mounts take precedence over the provider. The PEM snapshot does not carry Windows CTL restrictions beyond EKU, native revocation policy or later trust-store changes. Without any certificate the path does not exist. Whether the console serves a file at `/system/common/cert/CA_LIST.cer` or `/common/cert/CA_LIST.cer` is unverified: the only evidence for the two is that PPSA99058 opens them for its certificate store and networking works once they resolve, which shows a call site and not a console listing, so a title that tries several locations may take a branch here that it never takes on the console (`/system/common/` is at least a prefix `sceKernelLoadStartModule` already maps, for `/system/common/lib/`; nothing shows that a sandboxed process can open `/common/cert/` at the sandbox root). The console file's format is unverified: only that bundled OpenSSL accepts a PEM bundle there is shown (ProsperoRadio PPSA99001 and SwanStation PPSA98510, #5001). The other entries of the console's `common/cert` directory, the directory itself (it does not exist here) and the error a write open gets (`EACCES` from the host here) are unverified - [pselect](../../../core/libs/prx/libkernel/Socket/src/Pselect.cpp) (libkernel) sets the signal mask, calls `select` and restores the mask, as FreeBSD 11 `kern_pselect` does. A pending signal that the new mask unblocks has its handler run during the swap, and `pselect` then returns `EINTR` unless a descriptor is already ready, the timeout is zero or an argument is invalid, as FreeBSD's `kern_select` decides before it sleeps. A signal raised during the wait, including one sent by another thread, does not interrupt it, because `select` has no `EINTR` path; and the mask is the process-wide one, so it applies to every thread for the duration of the call - [getcontext and setcontext](../../../core/libs/prx/libkernel/System/src/UserContext.cpp) (libkernel) and [makecontext](../../../core/libs/prx/libSceLibcInternal/UserContext.cpp) (libSceLibcInternal) use FreeBSD 11's amd64 `ucontext_t` (`mcontext` at 0x10, `mc_len` 800, `uc_link` at 0x330, `uc_stack` at 0x338, 0x370 bytes), the layout homebrew built against FreeBSD's headers passes: PPSA99039's OpenSSL `ASYNC` (`crypto/async/arch/async_posix.c`) captures into a 0x370-byte stack buffer. `getcontext` writes the 0x330 bytes before `uc_link`, as FreeBSD's `UC_COPY_SIZE`. The console's own layout for these functions is not verified; the exception handler's context is a different one (see `sceKernelRaiseException`) - [ksem_init, ksem_post, ksem_wait, ksem_trywait, ksem_timedwait, ksem_getvalue and ksem_destroy](../../../core/libs/prx/libkernel/Semaphore/src/Ksem.cpp) (libkernel) - `dup` of a ksem id, or `dup2` from one, throws, where FreeBSD shares the semaphore, and a guest signal does not interrupt a wait with `EINTR`. Otherwise they follow FreeBSD 11 `uipc_sem.c`: each semaphore is kept in a table keyed by a descriptor reserved on the host null device, as a ksem id is a descriptor there; a guest `close`, or `dup2` over the id, drops it through libkernel's close notification; `ksem_init` fails with `ENOSPC` when no descriptor is left or 30 semaphores (`SEM_MAX`) exist +- [getcontext, setcontext and swapcontext](../../../core/libs/prx/libkernel/System/src/UserContext.cpp) (WebAssembly) throw because switching guest x86-64 register contexts on a WebAssembly host is not implemented +- [Guest memory mappings](../../../core/libs/prx/libkernel/DirectMemory/DirectMemory.cpp) (WebAssembly) throw for file-backed or shared mappings and for mapping one direct-memory range at two addresses; WebAssembly linear memory has no host mapping primitive for these aliases +- [Direct memory unmap](../../../core/libs/prx/libkernel/DirectMemory/DirectMemory.cpp) (WebAssembly) loses the contents of a direct-memory range when it is unmapped and mapped again: the pages come back zero-filled, where FreeBSD keeps them +- [EVFILT_VNODE](../../../core/libs/prx/libkernel/Equeue/src/FileEvent.cpp) (WebAssembly) throws because host file-change notification is not implemented - [getcontext and setcontext](../../../core/libs/prx/libkernel/System/src/UserContext.cpp) (libkernel) keep the 512-byte FXSAVE image in `mc_fpstate` (x87, MXCSR, XMM0-15), so the upper halves of YMM0-15 are neither saved nor restored, and `getcontext` leaves `mc_xfpustate` and `mc_xfpustate_len` 0. `getcontext` sets `mc_fpformat` and `mc_ownedfp` to FreeBSD's `_MC_FPFMT_XMM` and `_MC_FPOWNED_FPU`, `mc_cs` and `mc_ss` to the host selectors, and `mc_flags`, `mc_fsbase` and `mc_gsbase` to 0. `setcontext` loads `mc_fpstate` whatever `mc_fpformat` and `mc_ownedfp` say, and restores neither the segment selectors, `mc_fsbase` and `mc_gsbase` nor the extended state, which FreeBSD restores when `mc_flags` asks for them - [setcontext](../../../core/libs/prx/libkernel/System/src/UserContext.cpp) (libkernel) and [longjmp](../../../core/libs/prx/libc/src/JumpBuffer.cpp) (libc) on Windows set the thread's stack bounds in the TEB to the stack they switch to: a `makecontext` stack, or else the committed region around the target stack pointer. A switch to any other guest stack, such as a context built by hand, gets the bounds of that region only - [scePthreadAttrGet](../../../core/libs/prx/libkernel/Pthread/src/Attr.cpp) and [pthread_attr_get_np](../../../core/libs/prx/libkernel/Pthread/Posix/Attr.cpp) (libkernel) - the answer for a thread that has ended is not measured on the console; the implementation follows FreeBSD 11.4's [`_pthread_attr_get_np`](https://github.com/freebsd/freebsd-src/blob/releng/11.4/lib/libthr/thread/thr_attr.c#L139-L172) through `_thr_find_thread`. On Windows a host thread adopted by `scePthreadSelf` that ends without `scePthreadExit` keeps answering 0. Monster Hunter Wilds (PPSA24191) reuses a slot of its thread table only when `scePthreadAttrGet` returns `0x80020003` @@ -204,8 +220,8 @@ - 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 throws for a target thread that was created suspended and is not resumed yet. 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 +- [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 - [scePthreadJoin, scePthreadCreate](../../../core/libs/prx/libkernel/Pthread/src/Thread.cpp) (libkernel) - a joined thread is kept until `scePthreadCreate` publishes over the same handle storage, so one host object and its handle are retained per distinct guest storage location for the life of the process; a guest that joins into a fresh location every time keeps every one. A handle copied to a second storage and joined there retains the object under the original storage key, so a later `scePthreadCreate` over the original storage releases an object the copy still points at, and the copy reads freed memory. A detached thread is released when it ends, so joining it after it ended reads freed memory. A null entry crashed the payload and throws. Joining the calling thread returns `EDEADLK` and a zeroed attribute creates a default thread, as on the console. PPSA34015 once stopped with `Joining guest thread: Access is denied` before the join and detach checks followed the console @@ -221,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. @@ -267,17 +284,19 @@ - [SO_NOSIGPIPE](../../../core/libs/prx/libkernel/Socket/src/SocketOptions.cpp) (libkernel) - kept per socket and read back as its bit. On Linux a `send`, `sendto`, `sendmsg` or `write` on that socket passes `MSG_NOSIGNAL` to the host, as [`kern_sendit`](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/sys/kern/uipc_syscalls.c#L890-L895) and [`soo_write`](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/sys/kern/sys_socket.c#L147-L151) leave out the signal, and an accepted socket takes it from its listener, as [`sonewconn`](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/sys/kern/uipc_socket.c#L603) copies the options and as measured on PS5 firmware 13.60. Whether a write on it raises `SIGPIPE` there was not measured - [SO_SNDTIMEO, SO_RCVTIMEO](../../../core/libs/prx/libkernel/Socket/src/SocketOptions.cpp) (libkernel) - the value checks and the 32.32 fixed-point read-back follow [`sosetopt`](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/sys/kern/uipc_socket.c#L2657-L2689), as a payload process on a PS5 (firmware 13.60) answered them. A receive or send on a blocking socket waits that long for the host to report the socket readable or writable and fails with `EWOULDBLOCK`, but only before the first transfer: once writable the host send has no limit, where FreeBSD returns the bytes sent so far, and a receive whose data another thread takes after the wait blocks again. `sendfile` ignores the send timeout, the host wait has millisecond steps, and an accepted socket takes both from its listener - [IPV6_V6ONLY](../../../core/libs/prx/libkernel/Socket/src/SocketOptions.cpp) (libkernel) - the `IPPROTO_IPV6` option 27 is set on the host socket and reads back as 0 or 1, after FreeBSD's [`ip6_ctloutput`](https://github.com/freebsd/freebsd-src/blob/8c639945a44588f6cfdddfb057bb5aad88735da0/sys/netinet6/ip6_output.c#L1716-L1732): a value that is not exactly an `int` fails with `EINVAL`, as does setting it on a bound socket, which the host refuses too. `socket` turns it on for every `AF_INET6` socket, as a payload process on a PS5 (firmware 13.60) reported, and Java turns it off on the sockets it opens: Java 25 Advanced Network (PPSA99871) stops at `java.net.SocketException: Protocol not available` without it. The value checks and the bound-socket answer were not measured -- [connect to AF_UNSPEC](../../../core/libs/prx/libkernel/Socket/src/Udp.cpp) (libkernel) dissolves a datagram association as FreeBSD 11.4's `udp_disconnect()` does, which resets the local address to the wildcard address and keeps the port. On Linux and on Windows a socket bound to an explicit port keeps its local address as well (`127.0.0.1:` stays `127.0.0.1:`), because a bound socket cannot be bound again, and `getsockname` reports that host address. On Windows a `sendto` to a non-loopback address from such a socket then fails with `ENETUNREACH` (Winsock 10051, measured on Windows 10), where FreeBSD sends it from the wildcard address. One bound to port 0 is bound again to the wildcard address with the port it had +- [connect to AF_UNSPEC](../../../core/libs/prx/libkernel/Socket/src/Udp.cpp) (libkernel) - on Linux and Windows the native socket can retain its explicit local address after disconnection. On Windows a `sendto` to a non-loopback address from such a socket then fails with `ENETUNREACH` (Winsock 10051, measured on Windows 10), where FreeBSD 11.4 sends it from the wildcard address. Reporting the wildcard address through `getsockname` does not change that native binding - [connect](../../../core/libs/prx/libkernel/Socket/src/Udp.cpp) (libkernel) - `connect` to port 0 on an `AF_INET` or `AF_INET6` stream or datagram socket fails with `EADDRNOTAVAIL` (49), and on a connected datagram socket it disconnects first, as on a PS5 (firmware 13.60) and in FreeBSD 11.4's `soconnect()`. A connected stream socket keeps its host `EISCONN` answer. Known gap: `sendto` and `sendmsg` to port 0 on an `AF_INET` datagram socket fail with 49 (measured for an unbound socket) unless the socket is bound to a specific address and port and the destination is neither `INADDR_ANY` nor `INADDR_BROADCAST`, which is the path where `udp_output()` skips `in_pcbconnect_setup()` and FreeBSD sends to port 0. There the call returns the length without the host, as Linux's `udp_sendmsg` refuses port 0 with `EINVAL`; an `AF_INET6` socket still goes to the host. [sceNetConnect](../../../core/libs/prx/libSceNet/Export.cpp) is not changed - [msync](../../../core/libs/prx/libkernel/DirectMemory/PosixMemory.cpp) (libkernel) follows FreeBSD 11's `kern_msync` and `vm_map_sync`: the address is rounded down to the page, a range that wraps is `EINVAL`, as is `MS_ASYNC` with `MS_INVALIDATE`, and a range whose start or any page is not mapped (as `sceKernelVirtualQuery` reports it, reservations included) is `ENOMEM`; a page unmapped from inside a larger mapping still counts as mapped there, since `sceKernelVirtualQuery` keeps reporting the whole mapping. The guest has no file mappings, so a successful call writes nothing back. `MS_INVALIDATE` on a mapped range fails with `EBUSY`, as it did in a payload process on a PS5 (firmware 13.60) for anonymous memory, locked or not, also with a hole unmapped inside it; a title process, reservations, direct memory and flexible memory were not measured - Guest memory protection on macOS ([mprotect](../../../core/libs/prx/libkernel/DirectMemory/DirectMemory.cpp), [sceKernelVirtualQuery](../../../core/libs/prx/libkernel/DirectMemory/Export.cpp)): a rounded edge smaller than a guest page at the start of a request that lies in the gap between two segments of an image, where no host page exists, is skipped instead of protected, and for memory outside the guest allocation registry `sceKernelVirtualQuery` reports the host's extent instead of the guest's: the region `mach_vm_region` returns, cut to the write watch run that holds the address. The guest rounds a range to its 16 KiB pages, counted from where the ELF address 0 of the image holding it was loaded, which is a multiple of the host page size only (4 KiB under Rosetta). `sceKernelVirtualQuery` takes a watched page's write permission from the write watch. - Locked memory on macOS ([mlock, munlock, munlockall](../../../core/libs/prx/libkernel/DirectMemory/Export.cpp)): a wire that other host code makes on a page of a range libkernel recorded counts as libkernel's, so a later guest `mlock` adds none there and a guest `munlock` removes it. libkernel holds at most one wire per page, and since macOS's `munlockall` fails with `ENOSYS`, `sceKernelMunlockall` unlocks each recorded range with one `munlock`. -- [madvise](../../../core/libs/prx/libkernel/DirectMemory/PosixMemory.cpp) (libkernel) accepts `MADV_PROTECT` (10) as a no-op hint without modifying process protection. FreeBSD 11's `kern_madvise` (`sys/vm/vm_mmap.c`) handles it before the address check, ignores the address and length, and calls `kern_procctl(..., PROC_SPROTECT, PPROT_SET)`, which requires `PRIV_VM_MADV_PROTECT` and fails with `EPERM` without it. Returning 0 unconditionally assumes the calling process is privileged. Console behaviour is unverified +- [madvise and posix_madvise](../../../core/libs/prx/libkernel/DirectMemory/PosixMemory.cpp) (libkernel) accept `MADV_PROTECT` (10) as a no-op hint without modifying process protection. FreeBSD 11's `kern_madvise` (`sys/vm/vm_mmap.c`) handles it before the address check, ignores the address and length, and calls `kern_procctl(..., PROC_SPROTECT, PPROT_SET)`, which requires `PRIV_VM_MADV_PROTECT` and fails with `EPERM` without it. Returning 0 unconditionally assumes the calling process is privileged. `posix_madvise` returns error numbers directly without altering `errno`, validating against `PS5_PAGE_SIZE` user-map minimum. Console behaviour is unverified - [mincore](../../../core/libs/prx/libkernel/DirectMemory/PosixMemory.cpp) (libkernel) follows FreeBSD 11's `sys_mincore` (`sys/vm/vm_mmap.c`), not measured on the console: the address is rounded down to the page, length 0 returns 0, a null vector over a mapped range returns `EFAULT`, an overflowing range or any unmapped page in the range (as reported by `sceKernelVirtualQuery`) returns `ENOMEM`. For valid ranges, a page reports `MINCORE_INCORE` (0x1) when `sceKernelVirtualQuery` reports it committed and 0 when it is only reserved; actual residency, referenced and modified bits are not modelled. Length 0 returns 0 when the start page is mapped and `ENOMEM` otherwise, and the range and mapping checks come before the null vector `EFAULT`, as in `kern_mincore` Java 25 LAN / DNS (PPSA99869) imports it - [mlockall, munlockall](../../../core/libs/prx/libkernel/DirectMemory/PosixMemory.cpp) (libkernel) - `mlockall` returns `EINVAL` for zero or unknown flags. Valid `MCL_CURRENT` throws because it would lock host stacks, heaps, modules and driver mappings along with guest memory; `MCL_FUTURE` throws because later mappings are not tracked for locking. FreeBSD 11.4's `sys_munlockall` (`sys/vm/vm_mmap.c`:1133-1165) checks `priv_check(td, PRIV_VM_MUNLOCK)` first (returning `EPERM` without it) and unwires the user map (`vm_map_unwire` over `vm_map_min`...`vm_map_max` with `VM_MAP_WIRE_HOLESOK`). Returning 0 unconditionally assumes the calling process is privileged. `munlockall` unlocks memory locked by `mlock` (`VirtualUnlock` on Windows, tolerating `ERROR_NOT_LOCKED` for pages never locked, and `munlockall` on Linux; macOS is under Locked memory on macOS). XPSemu (PPSA97358) imports `mlockall` and `munlockall`; their calls in QEMU `os-posix.c` execute only when `-overcommit mem-lock=on` is enabled. The call has not been observed in a run with this implementation. - [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). @@ -292,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` @@ -307,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 @@ -319,9 +338,16 @@ - [sceKernelVirtualQuery](../../../core/libs/prx/libkernel/DirectMemory/Export.cpp) returns [VirtualQueryInfo](../../../core/libs/SceTypes.hpp) with a one-byte flag allocation unit so Windows and SysV hosts return the same 72-byte representation, with the name at byte 33 and GPU mask at byte 65. This preserves the existing SysV representation; the console offsets beyond the address, protection and size fields observed in Astro Bot's AGC calls are not hardware-measured. Size and offset assertions plus a raw-byte named-mapping regression guard the host ABI. Title code agrees with this layout: of 34 calls in PPSA01494, PPSA03984, PPSA18194, PPSA21564, PPSA30839, PPSA31162 and PPSA34502, 31 pass an info size of 0x48; in the 30 instructions after the call, the 27 with the result on the stack read 64-bit values at 0x0, 0x8 and 0x10, 32-bit values at 0x18 and 0x1c and the flag byte at 0x20 (testing 0x2, 0x10 or 0x50, or masking 0x1f); one in PPSA21564 checks the name's first byte at 0x21. - [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` and `USER_DEFINED_PARAM_1` to `_4`, 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. +- [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` 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) returns 0 on Windows without taking a lock, as FreeBSD 11.4's `sys_flock` accepts any vnode descriptor and so succeeds on a directory; Windows `LockFileEx` rejects a directory handle, which used to abort the process. Two descriptors of the same directory therefore never conflict: a second `LOCK_EX | LOCK_NB` succeeds where FreeBSD fails with `EWOULDBLOCK`. Linux and macOS use the host `flock`. Not measured on a console +- [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 - [sysctlnametomib](../../../core/libs/prx/libkernel/System/src/SystemConfiguration.cpp) (libkernel) still reads its `name` with `strnlen` and `strcmp` and its `size` pointer directly, so an unmapped pointer faults the host. FreeBSD 11.4's libc `sysctlnametomib` (which `sysctlbyname` calls) runs `strlen` on the name and reads and writes `*size` in user space before the syscall, so an unmapped name or size crashes a console process too; only the `mib` copy-out gives `EFAULT`, and that is not modelled here. `sysctlbyname` copies its name safely and returns `EFAULT` instead of crashing, and `sysctl` checks its pointers +- [APS5_GAME_MODE](../../../core/libs/prx/libkernel/System/src/HostPerformanceProcess.cpp) (libkernel) is `off` when unset and `auto` is not the default, because no distribution or desktop was measured to say what `gamemoded` or an activity changes for a title (CPU governor, priority, frame pacing, power draw), and a default that changes scheduling for everyone must be measured first. Whether `on` helps or hurts a title is unmeasured. +- [Host game mode on Linux](../../../core/libs/prx/libkernel/System/src/GameModeClient.cpp) (libkernel) - the request ends from the libc shutdown callbacks, which every exit path runs except an immediate `_Exit` and a crash, so those leave it to `gamemoded`. The daemon has a reaper thread for clients that disappear (FeralInteractive/gamemode at `a74b8106a2236d1f2696aa44c93bc4c8ef13b42e`, `daemon/gamemode-context.c`), but how soon it drops a client that never ended its request is unmeasured. +- [Host game mode on Linux](../../../core/libs/prx/libkernel/System/src/GameModeClient.cpp) (libkernel) - the library names (`libgamemode.so.0`, then `libgamemode.so`) and the `real_gamemode_request_start`, `real_gamemode_request_end` and `real_gamemode_error_string` symbols are those of the client header in FeralInteractive/gamemode at `a74b8106a2236d1f2696aa44c93bc4c8ef13b42e` (`lib/gamemode_client.h`); a later ABI change was not checked, and no real `gamemoded` was run against the backend, only fixture libraries exporting those symbols. +- [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 23029063fd8c..9db22c73ac2f 100644 --- a/docs/dev/debt/libkernel_sys.md +++ b/docs/dev/debt/libkernel_sys.md @@ -3,15 +3,349 @@ - [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) - 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 | +| --- | --- | +| `__cfi_slowpath` | `Bq2a8HmmUoY` | +| `__cfi_slowpath_diag` | `-cbfK7bCKQU` | +| `__freeze` | `nSSPVGJLMjE` | +| `__sceKernelGetGPI` | `3JYhkiIHkJc` | +| `__sys_debug_init` | `zdaF5N-Xe2M` | +| `__sys_dl_get_info` | `YbAunrti+54` | +| `__sys_dl_get_info_2` | `lCp17SqY3Nc` | +| `__sys_dl_get_list` | `XujojypwYYc` | +| `__sys_dl_get_metadata` | `7OpNDDNMJyo` | +| `__sys_dynlib_get_info2` | `nTc+tFajGqQ` | +| `__sys_dynlib_get_info_for_libdbg` | `K7xiuldOPKw` | +| `__sys_dynlib_get_list2` | `P0jjY6bxakI` | +| `__sys_dynlib_get_list_for_libdbg` | `vpo3SbGFuEk` | +| `__sys_dynlib_load_prx` | `nZHk+lpqwVQ` | +| `__sys_dynlib_unload_prx` | `GQli4UAXTfQ` | +| `__sys_get_proc_type_info` | `nG-FYqFutUo` | +| `__sys_is_development_mode` | `O-hEvSnv2o4` | +| `__sys_kqueueex` | `2M+dFM8Wmq4` | +| `__sys_namedobj_create` | `3CNY4Z0Luc8` | +| `__sys_namedobj_delete` | `E7CmfLfeSuQ` | +| `__sys_nanosleep` | `msfSXXy-8H8` | +| `__sys_netabort` | `UTR6wAkajxk` | +| `__sys_netcontrol` | `zsTvhCDrOjQ` | +| `__sys_netgetiflist` | `X86Q0qQJ1m0` | +| `__sys_netgetsockinfo` | `Wx2+2t1mX1E` | +| `__sys_opmc_disable` | `iZFJYJJoZS8` | +| `__sys_opmc_enable` | `MGrj20+EK+U` | +| `__sys_opmc_get_ctr` | `h+4DJpAXs4I` | +| `__sys_opmc_get_hw` | `IglowNcOePQ` | +| `__sys_opmc_set_ctl` | `vS-RnoD1BSY` | +| `__sys_opmc_set_ctr` | `ztNqqNCl1Tw` | +| `__sys_opmc_set_hw` | `PIt9WYaoBqU` | +| `__sys_osem_close` | `raO+bB7q2cY` | +| `__sys_osem_open` | `kPGXeSQeoWc` | +| `__sys_randomized_path` | `n0ErFZ2hmKs` | +| `__sys_rdup` | `9Iem9Wk07xU` | +| `__sys_regmgr_call` | `7NwggrWJ5cA` | +| `__sys_resume_internal_hdd` | `NTNdYQluihk` | +| `__sys_resume_process` | `6wXisPohifE` | +| `__sys_set_uevt` | `ByogDrS-Xw8` | +| `__sys_socketclose` | `t+rTx5NW+qU` | +| `__sys_suspend_process` | `-rXkJO1hOk0` | +| `__sys_test_debug_rwmem` | `EeVthQocE3Y` | +| `__sys_workaround8849` | `jTPE1AS7uak` | +| `__ubsan_handle_cfi_check_fail` | `K4M0IhFb88Q` | +| `__ubsan_handle_cfi_check_fail_abort` | `sPU6b2LaPqg` | +| `_dup2` | `W8f1adVl+48` | +| `_execve` | `-3nj+K1elI0` | +| `_execvpe` | `ScfDTOqLOMw` | +| `_wait4` | `RFlsu7nfopM` | +| `adjtime` | `2t3V7tfWY5s` | +| `mmap2` | `tGtH2GTWbyE` | +| `pthread_setschedother_np` | `ymCrwbFD4fk` | +| `sceKernelAddDynlibEvent` | `dGFwUPT+BK8` | +| `sceKernelAddFGCInfo` | `M+vuTJQ3F8Y` | +| `sceKernelCreateUuidV1` | `8PS6UDzj-xY` | +| `sceKernelCreateUuidV7` | `Nr+3bRBygw0` | +| `sceKernelDeleteDynlibEvent` | `0GquoxOD3Aw` | +| `sceKernelDeleteFGCInfo` | `ZGfk6FwQozw` | +| `sceKernelEnableDmemAliasing3` | `RbhD-epf6c0` | +| `sceKernelExtendMaximumModuleNumber` | `ClMdHuu+R1A` | +| `sceKernelGetAioDebugRequestInfo` | `iWe19fLnD0Y` | +| `sceKernelGetAioDebugSubmitInfo` | `uepHNAxXJ6s` | +| `sceKernelGetAmprCounter` | `6bX1434czj4` | +| `sceKernelGetAppCategoryTypeByAppId` | `fh-Bb3wl0Vs` | +| `sceKernelGetAppInfo2` | `d7xu4QDJw8Q` | +| `sceKernelGetAppInfoListForMinisyscore` | `OeLAM9FL10U` | +| `sceKernelGetCpuCoreClock` | `8Ejov5Yq8ck` | +| `sceKernelGetGenuineProsperoSystemSwVersion` | `IrjEm08+qoY` | +| `sceKernelGetNandInfo` | `W+BEVqLrDXo` | +| `sceKernelGetPackageInfo` | `4kJiTvD4tsA` | +| `sceKernelGetProsperoCompiledSdkVersionByPid` | `3vD7TSeebMs` | +| `sceKernelGetProsperoCompiledSdkVersion` | `GGeRJk1XdWc` | +| `sceKernelGetPs4CompiledSdkVersionByPid` | `Ha-dfYigiss` | +| `sceKernelGetPs4CompiledSdkVersion` | `sp+h-CJV1Ns` | +| `sceKernelGetResidentFmemCount2` | `zx9n-9bt7IA` | +| `sceKernelGetToolMemoryRange` | `dkBx0YqFQ+Y` | +| `sceKernelGetUpdatemode` | `NMf5gHfsrYs` | +| `sceKernelHasTrinityMode` | `yu17wG8L5FI` | +| `sceKernelIccClearEmcCrashReport` | `qq-gRlUwTPk` | +| `sceKernelIccDisableExtBDDriveOperation` | `pv+JNjlZJgI` | +| `sceKernelIccGetBDDriveChuckingState` | `-uPq82VbRMI` | +| `sceKernelIccGetBuzzerDimSetting` | `8uGeBlkKoDE` | +| `sceKernelIccGetBuzzerOffSetting` | `qbx9P0mc2Bk` | +| `sceKernelIccGetDynamicLedDimSetting` | `LdcAla8x5QI` | +| `sceKernelIccGetEmcBtDownload` | `hhzesncETPw` | +| `sceKernelIccGetEmcCrashNumOfBlocks` | `G0KaQ+fpNWY` | +| `sceKernelIccGetEmcCrashReport` | `4NEVlgkAjNk` | +| `sceKernelIccGetFloydVersion` | `N8YJA7a+T2U` | +| `sceKernelIccGetWlanBtGpio` | `Ck1ezcV7c-Y` | +| `sceKernelIccIsExtBDDriveAttached` | `1ns3nDImmno` | +| `sceKernelIccIsThermalAlert` | `Mrc6Jc4kC1A` | +| `sceKernelIccSetBootTimestamp` | `Ht23vmmuP0Q` | +| `sceKernelIccSetBuzzerDimSetting` | `UhDIvuRtbHc` | +| `sceKernelIccSetBuzzerOffSetting` | `3Fj1v0puUz4` | +| `sceKernelIccSetDynamicLedDimSetting` | `SOWF3EWyJlo` | +| `sceKernelIccSetEmcBtDownload` | `AJjZOx0GwYU` | +| `sceKernelIccSetPriorityBuzzerEx` | `PGdGn+-opZg` | +| `sceKernelIccSetPriorityBuzzer` | `eV6oaavMeI0` | +| `sceKernelIccSetWlanBtGpio` | `9D07JRs47Fg` | +| `sceKernelIccSetWlanBtManuTestMode` | `7Ud-rED9ooU` | +| `sceKernelIsAuthenticTrinity` | `X0HkB92+NRE` | +| `sceKernelIsCloudDevkit` | `XyW5rUlKP1w` | +| `sceKernelIsCloudkit` | `rm1EC-NwS6A` | +| `sceKernelIsCronos` | `nQ5AHlyJghQ` | +| `sceKernelIsEcoChargeAvailable` | `a9683+DNj84` | +| `sceKernelIsSpmemAvailable` | `QEvYMQNJGMU` | +| `sceKernelKernelHeapGetCount` | `rd23OgUSfZQ` | +| `sceKernelKernelHeapUsage2` | `pQiLz-exzR4` | +| `sceKernelMapFlexibleMemoryInternal2` | `dYK287SsmDs` | +| `sceKernelMapFlexibleMemoryInternal` | `z68xkNPqNRk` | +| `sceKernelMapNamedFlexibleMemoryInternal2` | `n7I71nQgO3M` | +| `sceKernelMapNamedSystemFlexibleMemory2` | `QS0AbROQuJM` | +| `sceKernelMapperGetIndirectBufferInfo` | `kz6S+-e2e74` | +| `sceKernelMapperGetUsageStatsData` | `CEbYeyYuiPQ` | +| `sceKernelMapperSetPageTablePoolOccupancyNotificationThreshold` | `V-DUYmkNleQ` | +| `sceKernelPltTrap` | `cMs2CQrqAN0` | +| `sceKernelSetAcKeyRegResult` | `mpTUqam2SgY` | +| `sceKernelSetAppInfoByAppId` | `fIyST5BItRg` | +| `sceKernelSetUpdatemodeDirect` | `MsmPuiJdZ1Q` | +| `sceKernelTitleWorkaroundIsEnabled2` | `TUZlvaB9rlg` | +| `sceKernelTraceAutoCaptureCreate` | `A3MDcIJe1tg` | +| `sceKernelTraceAutoCaptureDelete` | `4uDeONzVc04` | +| `sceKernelTraceAutoCaptureMap` | `0t79VtA5FwY` | +| `sceKernelTraceAutoCaptureStart` | `SoN+jQ6T788` | +| `sceKernelTraceAutoCaptureStop` | `TqLPe9eIbng` | +| `sceKernelTraceAutoCaptureStore` | `51iRQnpGof0` | +| `sceKernelTraceAutoCaptureUnmap` | `stvymc0mgcY` | +| `sceKernelUseCronosKura` | `7lZJYy0+evk` | +| `sceKernelUseCronosStreaming` | `ind6aqzel+Y` | +| `scePthreadRegisterThreadDeathHook` | `DlCg0QhcgYQ` | +| `Unknown` | `+1mj9RYU1rs` | +| `Unknown` | `+MZfwzH65JQ` | +| `sceKernelGetAmprSysInfo` | `+ooJjRJ+xR4` | +| `Unknown` | `-PNB3tfnD8c` | +| `sceKernelGetAppLibcData` | `-QipytgE4x0` | +| `Unknown` | `-sYN8ucoAWw` | +| `Unknown` | `0CV40L3tznI` | +| `Unknown` | `1WXQlxMpnNA` | +| `Unknown` | `1v23w7Rnkic` | +| `Unknown` | `1v6DjTPunjs` | +| `Unknown` | `2+KZ4mZKp6E` | +| `sceKernelInternalCreateMapperSharedMemory` | `2ICp74QsULo` | +| `Unknown` | `2XwZJG3Dkss` | +| `Unknown` | `2YWCKF9-3gM` | +| `Unknown` | `2fPLezHAV2E` | +| `Unknown` | `2wKjID0iGVM` | +| `Unknown` | `2xg4JXvaJ6k` | +| `Unknown` | `3BwLcdWeZLs` | +| `Unknown` | `3YkQPLocySc` | +| `Unknown` | `3jw-vq4gYLs` | +| `Unknown` | `4AMTAyz32fk` | +| `sceKernelIsCloudkitForDecid` | `5EThc7n+PpM` | +| `Unknown` | `5KHFhRhBR78` | +| `sceKernelIccGetButtonStatus` | `5uP89EdDbB0` | +| `sceKernelAbortWithContext` | `6nv1h9JH1Lk` | +| `sceKernelGetCanvasHandleByPid` | `6yzl0ibATw0` | +| `Unknown` | `7BUHmsuhcq4` | +| `Unknown` | `7FNl8FfSGNw` | +| `Unknown` | `7Sd1vnnqEqU` | +| `sceKernelIccReadWlanArea` | `8B-r5ubQLZs` | +| `Unknown` | `8U0nlN0TpDU` | +| `Unknown` | `8YkbXeSRxnM` | +| `Unknown` | `940JfV9yJto` | +| `sceKernelGetAppMemoryInfo` | `9KpeTiVh5Hk` | +| `Unknown` | `9ncS0kCRRSA` | +| `Unknown` | `A+S5E4RCh7Y` | +| `Unknown` | `AGHqSV1gdIY` | +| `Unknown` | `AhBZlHQYeA8` | +| `Unknown` | `ApbTseKUKCI` | +| `Unknown` | `B70jHzr4Jj4` | +| `Unknown` | `BJvWKKfmj4w` | +| `Unknown` | `BjmZn9pYSuk` | +| `Unknown` | `C3ToW2CA+hM` | +| `Unknown` | `C3xgqN95IoE` | +| `Unknown` | `C49jelxiaVE` | +| `sceKernelSwitchToTrinityMode` | `Cz48pcLnLCY` | +| `sceKernelIsGenuineCronosCex` | `DB0muDALi4Y` | +| `Unknown` | `DWWduhQYA3I` | +| `Unknown` | `Dv8In6FvzuM` | +| `Unknown` | `E58GHGcQT7I` | +| `Unknown` | `EIz+fSlYCn8` | +| `sceKernelTraceMarkerBookmark` | `EKMWpdzszVo` | +| `Unknown` | `EaepepH-LmI` | +| `Unknown` | `FIUPjhnoI+o` | +| `Unknown` | `FR0odl35yQY` | +| `sceKernelIccGetExtBDDriveStatus` | `GADbvgNm4tY` | +| `Unknown` | `GTyjVeZcdRM` | +| `Unknown` | `Gtncco+mxio` | +| `Unknown` | `HRrfx1wytn0` | +| `Unknown` | `HnWsxkpJya0` | +| `Unknown` | `HruYl9uBnNo` | +| `Unknown` | `IJQeoUQ3pb4` | +| `sceKernelInternalUnlockMapperMemory` | `IJnZ6pAGPcA` | +| `Unknown` | `Ipau2b5eaHM` | +| `Unknown` | `Ishr1Sdu024` | +| `sceKernelIdTableGetStats` | `J2dqh+RUwEY` | +| `Unknown` | `JFpAREOJnag` | +| `Unknown` | `JN1D3WtbDPs` | +| `sceKernelIccNotifyPowerState` | `JcG0kUg4TrE` | +| `Unknown` | `KoDy4Jazz40` | +| `Unknown` | `KoSCciXA1N0` | +| `Unknown` | `L4GARHYRW0U` | +| `Unknown` | `LPXIR37gw3c` | +| `Unknown` | `LVRydXoXt7U` | +| `Unknown` | `LwGBaXgvFaY` | +| `Unknown` | `MJ-err8l-XY` | +| `Unknown` | `MKlp-bW1bz8` | +| `Unknown` | `N94a0T4F4+U` | +| `Unknown` | `NhFlyw-77cY` | +| `Unknown` | `OZBJnWxt7d4` | +| `Unknown` | `PBq-OUg5A5s` | +| `Unknown` | `PTDuAbCYfm0` | +| `Unknown` | `QTGIeqEjeFc` | +| `Unknown` | `Qk38ESxhDEQ` | +| `Unknown` | `R3QLLyp9MEU` | +| `Unknown` | `RA5mXLPd5V4` | +| `Unknown` | `RDjusrvQ-44` | +| `Unknown` | `RfzgytiWey0` | +| `Unknown` | `SEKlG1AMRGQ` | +| `sceKernelGetContentVersion` | `SP37+6t8PUw` | +| `Unknown` | `Sesgl6Zl8YI` | +| `sceKernelTraceMarkerPop` | `SgxG1rkVqu8` | +| `sceKernelInternalLockMapperMemory` | `TC+IFjP+pJc` | +| `Unknown` | `TVB77yVa+RU` | +| `Unknown` | `Tca8tetUZCw` | +| `sceKernelAddExternalTriggerEvent` | `U-zqHonxxm4` | +| `Unknown` | `U9B58Hc5C+8` | +| `Unknown` | `V4f3CEBQyuM` | +| `Unknown` | `VU1YkdCmYto` | +| `Unknown` | `W1Cg5WPD4IQ` | +| `Unknown` | `W7Vpt62Xtf4` | +| `Unknown` | `WLC94v0XY+0` | +| `Unknown` | `WtA8Aq-0cyY` | +| `Unknown` | `WyZULCQhjdY` | +| `Unknown` | `X4R-jzzFYac` | +| `Unknown` | `Xj9nET9tctI` | +| `Unknown` | `XvONqaRmAPE` | +| `Unknown` | `YP7qj+uSJwo` | +| `Unknown` | `Z+8fq02NpM0` | +| `Unknown` | `ZFhVeS+BQJs` | +| `Unknown` | `aH3bEULQH54` | +| `Unknown` | `aJK9UjBtwi4` | +| `Unknown` | `aL9DwvoSDzs` | +| `Unknown` | `aekYw+lydSg` | +| `Unknown` | `aj7wRdAWFeM` | +| `Unknown` | `ak6t3JzhOtg` | +| `sceKernelGetSandboxConfig` | `b3Q5U48bJLI` | +| `Unknown` | `bQ+8uJVyxII` | +| `sceKernelIccResetBootTimestamp` | `c1xs7KJ+uf0` | +| `Unknown` | `cH6vM6sF5YA` | +| `Unknown` | `cReByBlM5XE` | +| `Unknown` | `cafDxa64sO4` | +| `Unknown` | `ciYlptMdvhc` | +| `sceKernelIccWriteWlanArea` | `cp8qj9i8zMM` | +| `Unknown` | `culoiinnxDA` | +| `sceKernelCheckProsperoSdkVersion` | `cvFtKaAYbHE` | +| `Unknown` | `dnzOA7Vx1AE` | +| `Unknown` | `drv94FQk-Qw` | +| `Unknown` | `e7oZmNPlBbU` | +| `Unknown` | `eSgYzXvTPQI` | +| `sceKernelTraceMarkerPlot` | `eu1IgkLPYh8` | +| `Unknown` | `ftHBlCfIEQo` | +| `Unknown` | `g7MGwZ5UxBE` | +| `Unknown` | `gBiaAGKEvHM` | +| `Unknown` | `gJ5gpW45mU0` | +| `Unknown` | `gSIiye3ERqo` | +| `Unknown` | `gpgi-GwE2Is` | +| `Unknown` | `guq+otVpgj0` | +| `Unknown` | `gvq6XRoDogE` | +| `Unknown` | `h26nEKnW8VI` | +| `Unknown` | `h35fpAz5tf4` | +| `sceKernelTraceMarkerPush` | `hYEEJrcB3wU` | +| `Unknown` | `hmqw8GlN+tI` | +| `sceKernelGetCanvasHandle` | `i9ghW7uPndU` | +| `sceKernelSetSandboxId` | `iZEvDaPnNL4` | +| `Unknown` | `ilQLkGlAjWA` | +| `Unknown` | `j6bGtwZkxOQ` | +| `Unknown` | `jESbu+uFJYU` | +| `Unknown` | `jMuNoBRCPUg` | +| `Unknown` | `jkLbtOA587w` | +| `Unknown` | `k+J3KBjfkNk` | +| `Unknown` | `km8Fr2Jn4Gg` | +| `Unknown` | `l-QGmU3VU+Q` | +| `Unknown` | `l67TRPy55-U` | +| `sceKernelDeleteExternalTriggerEvent` | `lRD35KDvDzE` | +| `Unknown` | `mIkJUpP5vKo` | +| `Unknown` | `ncrollDo5u4` | +| `Unknown` | `nsq826qQ2EI` | +| `Unknown` | `o141x2VDeVc` | +| `sceKernelGetMainSocSubId` | `oSQQA8I595Y` | +| `sceKernelInternalUnmapMapperSharedMemory` | `pAI+17im1o0` | +| `Unknown` | `pCbBddNl66Y` | +| `Unknown` | `pOClGbxrx94` | +| `sceKernelSetAppLibcData` | `pn68p6w2eK0` | +| `Unknown` | `pp+G+UZhiqY` | +| `Unknown` | `q-2Uxlg-faU` | +| `Unknown` | `qGzuTSD9cPQ` | +| `Unknown` | `qHVs+dxCumg` | +| `Unknown` | `qSleeVC6lwI` | +| `Unknown` | `qe5JmcCj4zg` | +| `Unknown` | `qtHOLtFWq7Y` | +| `Unknown` | `r6qUkFmQFr0` | +| `Unknown` | `rC7zr-oAHCo` | +| `Unknown` | `rD4PS3f+jKw` | +| `Unknown` | `rLBfsmdAuvo` | +| `sceKernelIccDisableButton` | `rqiBT75A1po` | +| `Unknown` | `sFW+Ilmw+58` | +| `Unknown` | `tkZiGUoRJok` | +| `Unknown` | `u9lxqerTKeA` | +| `Unknown` | `uV+YilcHqAs` | +| `Unknown` | `ulVjluL9TzM` | +| `Unknown` | `v+qTlNjF6kE` | +| `Unknown` | `vfYaxkxnJXQ` | +| `Unknown` | `vq2+HyP5U5I` | +| `sceKernelSetCanvasHandle` | `wXnNof3LrrU` | +| `Unknown` | `wn0XzOue4EM` | +| `Unknown` | `wwWv+0MzhGM` | +| `sceKernelDebugPauseWithDebugContext` | `x0DQK0TXDk0` | +| `Unknown` | `xpB6yv8NhhE` | +| `Unknown` | `yWOJkfd-DhA` | +| `Unknown` | `yn0b42DApAI` | +| `Unknown` | `yzvrk3YrPlE` | +| `Unknown` | `z+e0vV-tnH4` | +| `Unknown` | `z0qKN5kkVj0` | +| `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 @@ -25,6 +359,7 @@ - [readlinkat](../../../core/libs/prx/libkernel_sys/Export.cpp) (libkernel_sys) passes `AT_FDCWD` (-100) and absolute paths to `readlink`. 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. Console behaviour is unverified - [link](../../../core/libs/prx/libkernel_sys/Export.cpp) (libkernel_sys) on Windows resolves a symbolic link source through the host, which follows longer chains than FreeBSD: a chain of 40 links is linked, where FreeBSD 11.4 returns `ELOOP` after 32 (`MAXSYMLINKS`). A loop returns `ELOOP` as on FreeBSD - [pthread_attr_setcreatesuspend_np, pthread_resume_np, pthread_resume_all_np, pthread_multi_np, scePthreadAttrSetcreatesuspend, scePthreadResume, scePthreadResumeAll and scePthreadMulti](../../../core/libs/prx/libkernel_sys/Export.Discovery.cpp) (libkernel_sys) - when a thread created suspended stops relative to its signal mask is unmeasured on a console. Return values and errors follow FreeBSD 11.4 libthr ([`thr_attr.c`](https://github.com/freebsd/freebsd-src/blob/8c639945/lib/libthr/thread/thr_attr.c#L369-L381), [`thr_resume_np.c`](https://github.com/freebsd/freebsd-src/blob/8c639945/lib/libthr/thread/thr_resume_np.c#L47-L97), [`thr_multi_np.c`](https://github.com/freebsd/freebsd-src/blob/8c639945/lib/libthr/thread/thr_multi_np.c#L40-L51)) and the code of firmware 13.42's `libkernel_sys.sprx` ([#9573](https://github.com/boykopovar/AnyPS5/pull/9573#issuecomment-6393877843)), where the sce forms add `0x80020000` to a non-zero errno +- [pthread_attr_setstackaddr and pthread_attr_getsolosched_np](../../../core/libs/prx/libkernel_sys/Export.Discovery.cpp) (libkernel_sys) - firmware 13.60 `libkernel_sys.sprx` (SHA-256 `60921322b155ba649cfa29ea5e6d358ca0229424b4f73fd5c30ae7f7ce7c304c`) places `pthread_attr_setstackaddr` (NID `suCrEbr0xIQ`) at function address `0x4ed0`: it returns `EINVAL` for a null attribute pointer, null attribute handle or null stack address, and stores a valid address at attribute offset `0x18`. `pthread_attr_getsolosched_np` (NID `ApMLfJ527Ag`) is at `0x51b0`: it returns `EINVAL` for a null attribute pointer, null handle or null output, otherwise writes the attribute field at `+0x10` masked with `0x10`. These details are from local firmware disassembly; console runtime behavior is not independently tested - [sceKernelGetCpumodeGame and sceKernelSetCpumodeGame](../../../core/libs/prx/libkernel_sys/Export.cpp) (libkernel_sys) - the setter takes the mode as its only argument and the getter writes it through an `int*`, as [ProsperoEden (PPSA99008) declares and calls them](https://github.com/mihawk-99/PS5_ProsperoEden/blob/a0b65fe50dd48d4064e2f58fa9c8d44665478878/headless/performance.cpp#L1030-L1062); its getter faulted when called without one, which throws here. The mode starts at 1, 0 and 1 are accepted, and 2 to 7 return `EINVAL` (0x80020016), as it [measured](https://github.com/mihawk-99/PS5_ProsperoEden/blob/a0b65fe50dd48d4064e2f58fa9c8d44665478878/docs/PERFORMANCE_FINDINGS.md#L113-L114) on a PS5; other modes were not tried and throw. That the getter reports the last accepted mode is inferred from the probe. The mode changes nothing else here: on the console 0 gave system CPU mode 1 and 1 mode 5, while `sceKernelGetCpumode` still returns 0. - [fstatat](../../../core/libs/prx/libkernel_sys/Export.cpp) (libkernel_sys) passes `AT_FDCWD` (-100) and absolute paths to `stat`, or to `lstat` with `AT_SYMLINK_NOFOLLOW` (0x200). 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, and flags other than `AT_SYMLINK_NOFOLLOW` return `EINVAL`. PPSA74126 imports it. Console behaviour is unverified - [uuidgen](../../../core/libs/prx/libkernel_sys/Uuid.cpp) (libkernel_sys) - the node is 48 random bits with the multicast bit set, chosen once per process, where the console's kernel uses the address of its first Ethernet interface; that the PS5 kernel registers one is assumed, not measured. Otherwise it follows FreeBSD 11's [`kern_uuidgen` and `sys_uuidgen`](https://github.com/freebsd/freebsd-src/blob/53c4471833e8e5e57b4d1b501b1a52b343bb0451/sys/kern/kern_uuid.c#L129-L198): version 1 UUIDs with consecutive timestamps from the guest `CLOCK_REALTIME`, a random 14-bit clock sequence that is incremented when the clock has not passed the last batch, and `EINVAL` for a count outside 1 to 2048. A null store returns `EFAULT` after the state advances, as `copyout` fails there; other invalid addresses are not detected @@ -34,15 +369,19 @@ - [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 capability bits remain unverified on PS5; they follow [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/396c2a09a38d22eaa02aab32c1967263dceab95f/src/core/libraries/kernel/kernel.cpp), leaving the authority ID and other capability, attribute and credential words zero. The host models a retail unit (`IsCEX` 1, `IsGenuineCEX` 1, `IsDevKit` 0, `IsGenuineDevKit` 0, `IsTestKit` 0, `IsGenuineTestKit` 0) and reports Prospero architecture (`IsProspero` 1, `IsKratos` 0). The system OpenPSID reuses the ordinary ID; firmware 13.42 reads a separate `machdep.openpsid_for_sys`, whose value is unknown. Null returns positive 22 per the [module report](https://github.com/boykopovar/AnyPS5/pull/10524#issuecomment-6393566914). +- [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). - [kldfind, kldfirstmod, kldnext and kldunload](../../../core/libs/prx/libkernel_sys/Export.cpp) (libkernel_sys) follow FreeBSD 11.4's linker calls ([sys/kern/kern_linker.c](https://github.com/freebsd/freebsd-src/blob/release/11.4.0/sys/kern/kern_linker.c)): kldfind validates the module name with CopyPath (EFAULT on null or unreadable pointers, ENAMETOOLONG for paths of 1024 bytes or more) and returns ENOENT for any module name; on FreeBSD the kernel itself is linker file 1, and AnyPS5 models an empty file list, so kldnext(0) returns 0 and kldfind("kernel") fails; kldnext returns ENOENT for negative or positive fileids; kldfirstmod returns ENOENT for any fileid; and kldunload returns EPERM as sandboxed/jailed titles lack PRIV_KLD_UNLOAD. Dynamic kernel linker module lookup and management remain unverified on hardware - [kldstat](../../../core/libs/prx/libkernel_sys/Export.cpp) (libkernel_sys) never succeeds: no linker file is listed here, as for `kldnext`, so the kernel's own file (id 1 on FreeBSD) and the modules a console preloads are missing, every file id gets `ENOENT` and the structure is never written. The checks before the lookup follow FreeBSD 11.4's [`sys_kldstat`](https://github.com/freebsd/freebsd-src/blob/releng/11.4/sys/kern/kern_linker.c#L1228-L1250): only the `version` field is read (`EFAULT` when it cannot be), and a version other than the size of `struct kld_file_stat_1` (1056 bytes on amd64) or `struct kld_file_stat` (2080) gets `EINVAL`. Console behaviour is unverified - [fchown](../../../core/libs/prx/libkernel_sys/Export.cpp) (libkernel_sys) - ownership is not modelled: the guest's own owner and group (0) and the unchanged value (-1) are accepted, a descriptor that is not open fails with `EBADF`, and any other owner or group throws, naming it. The check reads the descriptor with `fstat`, ignoring the CRT's invalid-parameter handler on Windows as `DescriptorControl` does. The console's ownership rules are unverified. Morrowind (`mshivam019/morrowind-ps5`) imports it - [chown, lchown and fchownat](../../../core/libs/prx/libkernel_sys/Export.cpp) (libkernel_sys) - ownership is not modelled, as for `fchown`: owner and group 0 and the unchanged value (-1) are accepted, and any other owner or group throws, naming it. The path is looked up first, as in FreeBSD 11's `kern_fchownat`, with `stat`, with `lstat` for `lchown`, and with `fstatat` for `fchownat`, so a lookup error is returned before the owner is checked and nothing is changed on the host. `fchownat` flags other than `AT_SYMLINK_NOFOLLOW` (0x200) return `EINVAL`, as in FreeBSD 11. The console's ownership rules are unverified -- [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. A symbolic link as the source without `AT_SYMLINK_FOLLOW` throws on Windows, where FreeBSD links the symbolic link itself; on Linux and macOS the host's `linkat` with flag 0 links it. Console behaviour is unverified +- [sceKernelIsNeoMode](../../../core/libs/prx/libkernel_sys/Export.Discovery.cpp) (libkernel_sys) - not measured on a console, and the PS5 module's body is not read. A title with `param.json` throws: what a PS5 application gets is unknown. For a title with `param.sfo` it returns bit 23 (0x00800000) of `ATTRIBUTE`, the title's Neo-mode support, and 0 without the key, as [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/3eecea94ddaca360b19f4b800523b609a8b2ffcc/src/core/libraries/kernel/process.cpp#L29-L35) answers on a Neo console ([bit 23](https://github.com/shadps4-emu/shadPS4/blob/3eecea94ddaca360b19f4b800523b609a8b2ffcc/src/common/elf_info.h#L50-L51)), which `sceKernelHasNeoMode` and `sceKernelIsAuthenticNeo` already report. A base PS4 (firmware 10.71) answers 0 ([discussions/7941](https://github.com/boykopovar/AnyPS5/discussions/7941)) +- [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 -- [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 +- [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) - 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 @@ -53,5 +392,28 @@ - [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 + +#### Inventory identity evidence + +The NID set is from the inspected `libkernel_sys` ELF function-export table (defined `STT_FUNC` entries), not the older 3.20 inventory. The module-parameter words at `0x10` and `0x14` are `0x13590001` and `0x13600007`; the earlier 13.60 label refers to SDK-formatted metadata, not independently authenticated retail firmware or an introduction date. The [reproducible static audit](https://github.com/boykopovar/AnyPS5/pull/12367#issuecomment-6470603298) finds 1551 unique function NIDs with set digest `5f1668cc9c69e2950722a83151f31cf7aa94fb1552ab883e5067f43c94d63b16` and confirms all 328 proposed entries. The digest hashes sorted unique ASCII NIDs, each followed by LF. Named declarations are candidate spellings whose repository-computed NID exactly matches an observed function NID; the hashed table establishes neither plaintext spelling nor C ABI. + +The 35 formerly literal aliases are named by the [repository-pinned aerolib table](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv). There are now 168 named declarations and 160 unresolved NID aliases; every one of the 328 entries remains a throwing placeholder. + +The following eight candidate spellings are absent from that aerolib revision. Their name/NID pairs occur in the [public ps5rs identity database at commit `2304be5131221bae0dac24b9767cabffda33f747`](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv) and independently recompute to the function NIDs in the inspected table. This database supports candidate spelling only; it does not establish firmware membership, introduction version or ABI. + +| Candidate spelling | NID | +| --- | --- | +| `__sys_dynlib_unload_prx` | `GQli4UAXTfQ` | +| `mmap2` | `tGtH2GTWbyE` | +| `pthread_setschedother_np` | `ymCrwbFD4fk` | +| `sceKernelEnableDmemAliasing3` | `RbhD-epf6c0` | +| `sceKernelGetResidentFmemCount2` | `zx9n-9bt7IA` | +| `sceKernelIsCloudDevkit` | `XyW5rUlKP1w` | +| `sceKernelKernelHeapUsage2` | `pQiLz-exzR4` | +| `sceKernelSetAppInfoByAppId` | `fIyST5BItRg` | diff --git a/docs/dev/debt/libkernel_web.md b/docs/dev/debt/libkernel_web.md new file mode 100644 index 000000000000..238fe0a3d486 --- /dev/null +++ b/docs/dev/debt/libkernel_web.md @@ -0,0 +1,5 @@ +# libkernel_web technical debt + +### Unknown function info + +- 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 ce0b899a1dce..21d70919f9b0 100644 --- a/docs/dev/debt/libmdbg_syscore.md +++ b/docs/dev/debt/libmdbg_syscore.md @@ -6,4 +6,44 @@ ### Unknown function info +- [Additional platform-debug exports](../../../core/libs/prx/libmdbg_syscore/Export.cpp) - the five name/NID pairs below are defined exports in the [13.60 inventory](https://github.com/xdCloudy/PS5-13.60-Function-Stub-Library/blob/bfec40deb4c47a17d7603ee2bc79aa6862c0c56b/data/firmware-13.60/libmdbg_syscore-53c596f5b7.jsonl). Their signatures and behavior are unverified. Parameterless `int` declarations are import placeholders, not verified ABI prototypes; every call throws through `NotImplemented_nid_no_patch`. No debug-counter, shell event or result-delivery behavior is implemented. + +| Name | NID | +| --- | --- | +| `sceDebugGetAmprCounterInfo` | `ObMAmE6qMSw` | +| `sceMdbgFinalizeForShellCore` | `txc1CarzXK8` | +| `sceMdbgInitForShellCore` | `DFWZL-CN90E` | +| `sceMdbgReceiveEvent` | `zgg+ApEodYA` | +| `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 1e07f7ef14db..1d7941bb252b 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 000000000000..868ffaca0a3c --- /dev/null +++ b/docs/dev/debt/libwebrtc.md @@ -0,0 +1,13 @@ +# libwebrtc technical debt + +### Unknown function info + +- [408 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. diff --git a/docs/dev/debt/libwvoec.md b/docs/dev/debt/libwvoec.md new file mode 100644 index 000000000000..b4fca8a9ab5a --- /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/relinker.md b/docs/dev/debt/relinker.md index aaa1ce6892e9..74b03184fc18 100644 --- a/docs/dev/debt/relinker.md +++ b/docs/dev/debt/relinker.md @@ -24,12 +24,13 @@ - An RSP operand that `--frame-red-zone` cannot move in place, an 8-bit displacement the shift takes past 0x7f or one without a displacement, moves to a stub with the instructions after it up to five bytes and is re-encoded there with the moved displacement ([framer](../../../core/relinker/codegen/src/x86/RedZoneFramer.cpp)). The leaf is skipped when that site would take in a branch target, a branch, ret or RIP-relative instruction, or another site, and when the operand is EVEX, whose 8-bit displacement is scaled. A game patch over a framed site or a moved displacement is refused. - In `--frame-red-zone`, function bounds come from the executable's `.eh_frame` FDEs: each function is decoded from its FDE start to its FDE end, or to int3 padding before it, and the relinker stops with an error when the executable has none. Code outside every FDE, such as a function without unwind information, is not framed ([framer](../../../core/relinker/codegen/src/x86/RedZoneFramer.cpp)). - `--to-intel` lowers MCOMMIT to STC plus NOP padding and RDPRU through a runtime-checked stub in the [matcher](../../../core/relinker/codegen/src/x86/Amd64OnlyInstructionMatcher.cpp): AMD APM Vol. 3 defines RDPRU ECX 0 as MPERF and ECX 1 as APERF, neither readable on Intel hosts, so both selectors return the host TSC as a disclosed monotonic-counter approximation (their ratio always reads 1.0) while other selectors yield zero EDX:EAX. STC asserts CF=1 because under x86-TSO prior stores are already ordered and guest memory is host-DRAM-backed, leaving the commit-success case as the only observable one. Non-zero RDPRU selectors, the TSC-for-MPERF/APERF substitution, and any console path reporting MCOMMIT CF=0 are unverified. -- [Unscoped imports on Windows](../../../core/relinker/elfpatcher/src/windows/WindowsEntryStubBuilder.cpp) - an import without a module that no searched library exports under its name is searched again under the NID of that name, because homebrew built with the [ps5-payload-dev SDK](https://github.com/ps5-payload-dev/sdk) imports by symbol name (Quake, from the websrv homebrew launcher; Mari0, #6239) while the libraries in `libs/` export NIDs. A dependency named with `.sprx`, `.suprx` or `.debug_prx` loads the `.prx` library of the same stem from `libs/`, and `libkernel_web` also loads `libkernel.prx`, as `libSceLibcInternal` already loads `libc.prx`: AnyPS5's `libkernel_web.prx` exports only two functions, where the console's `libkernel_web.sprx` is a libkernel variant. A name that matches a library's export as written still binds to that export first. macOS resolves these imports through the host loader by name and is unchanged. +- [Unscoped imports on Windows](../../../core/relinker/elfpatcher/src/windows/WindowsEntryStubBuilder.cpp) - an import without a module that no searched library exports under its name is searched again under the NID of that name, because homebrew built with the [ps5-payload-dev SDK](https://github.com/ps5-payload-dev/sdk) imports by symbol name (Quake, from the websrv homebrew launcher; Mari0, #6239) while the libraries in `libs/` export NIDs. A dependency named with `.sprx`, `.suprx` or `.debug_prx` loads the `.prx` library of the same stem from `libs/`, and a kernel-family import searches the other members and `libc.prx`, undeclared variants optional, as `libSceLibcInternal` already loads `libc.prx`: AnyPS5's `libkernel_web.prx` exports only two functions, where the console's `libkernel_web.sprx` is a libkernel variant. A name that matches a library's export as written still binds to that export first. macOS resolves these imports through the host loader by name and is unchanged. - [Unscoped imports on Linux](../../../core/relinker/elfpatcher/src/linux/LinuxElfPatcher.cpp) - in an executable or bundled module that names a dependency with `.sprx`, `.suprx` or `.debug_prx`, as homebrew built with the [ps5-payload-dev SDK](https://github.com/ps5-payload-dev/sdk) does, an import without a module that is named by symbol is bound to the NID of that name only. Unlike Windows, the name as written is not tried first, because the host loader also searches the host C library, which exports `malloc` or `pthread_create` under their names. A name that a bundled module exports still binds to that module, as does a bundled module's import of a name the executable exports, and such a dependency loads the `.prx` library of the same stem. Unqualified imports of other executables and bundled modules are still bound by name. - An `R_X86_64_GLOB_DAT` or `R_X86_64_JUMP_SLOT` relocation with a nonzero addend fails the conversion in the Linux output ([ELF patcher](../../../core/relinker/elfpatcher/src/linux/LinuxElfPatcher.cpp)), in the Windows and macOS outputs ([relocation builder](../../../core/relinker/elfpatcher/src/windows/WindowsRelocationBuilder.cpp)) and in guest modules ([guest image reader](../../../core/relinker/relinker/src/guest/GuestImageReader.cpp)). What the console's loader does with such an addend is not measured. The x86-64 psABI computes both as S, but loaders differ: FreeBSD rtld uses S for GLOB_DAT and lazy JUMP_SLOT and S+A for eager JUMP_SLOT, and glibc used S+A for eager binding before [f8587a61892c](https://github.com/bminor/glibc/commit/f8587a61892cbafd98ce599131bf4f103466f084) (2.36) and S since. - The length-changing path of the [instruction rewriter](../../../core/relinker/codegen/src/x86/X64InstructionRewriter.cpp) is not used by the [converter](../../../core/relinker/codegen/src/Amd64OnlyConverter.cpp): it does not adjust data-to-code references (relocations, FDEs, jump tables) or segment sizes, so every substitution keeps the instruction length. The rewriter conservatively rejects length-changing edits when a surviving truncated relative branch would move relative to its target (only one of the two lies after the cut) or when its section-relative target falls outside the 16-bit range, because the runtime address base needed to resolve a wrapped destination is unavailable; truncated branches that keep their distance and stay in range are accepted. - The [converter](../../../core/relinker/codegen/src/Amd64OnlyConverter.cpp) takes the branch targets that keep an instruction in place from a linear scan of the code segment, so data in that segment decodes as branches too: OpenSSL's x86-64 assembly keeps strings such as "SHA1 block transform for x86_64, CRYPTOGAMS by " in its code, and in SuperTuxKart (PPSA69421) and Mortalfin (PPSA99141) the `jae` read from "sf" points into the VEX prefix of a 256-bit store. A direct branch target inside a scanned instruction counts only where every byte before it is a legacy prefix or REX, which a real branch can skip (a `lock` prefix, for example); a target in a VEX prefix, opcode or operand is ignored, as a jump-table entry that starts no instruction already is. A real branch to such a target, overlapping instructions as hand-written code can, is not seen, and the instruction it enters can be moved. - A `PT_SCE_RELRO` segment that no `PT_LOAD` covers, the PS4 layout, is [loaded](../../../core/relinker/relinker/src/parsing/ElfReader.cpp) as a read-write `PT_LOAD` and stays writable after relocation; FreeBSD rtld makes `PT_GNU_RELRO` read-only once relocation is done, and what the console does with `PT_SCE_RELRO` is not checked. +- The protection the console gives a range mapped by two byte-identical overlapping `PT_LOAD`s is not checked. The relinker gives it the later segment's protection by trimming the earlier segment to the later one's start ([Linux](../../../core/relinker/elfpatcher/src/linux/LinuxElfPatcher.cpp), [Windows](../../../core/relinker/elfpatcher/src/windows/WindowsLoadImage.cpp)): an earlier executable segment loses execute on the overlapped bytes, and an earlier read-only one becomes writable outside `PT_GNU_RELRO` on Linux and everywhere on Windows, which has no RELRO step. This accepts the layout of PPSA99770 #12183, PPSA99573 and PPSA92013, a read-only segment over the `PT_GNU_RELRO` start of a following read-write one. Differing bytes (#10564), an overlap past the later segment, a shared start address, and an executable-and-writable flag combination at a boundary that is not page-aligned (which would share a read-write-execute page in the Windows image) are still refused. - In Windows output, a guest instruction that addresses memory through GS becomes `UD2` and NOP padding of its own length ([TLS builder](../../../core/relinker/elfpatcher/src/windows/WindowsTlsBuilder.cpp)): the host owns GS, and the guest GS base that FreeBSD's `sysarch(AMD64_SET_GSBASE)` would set is not emulated. A converted module runs until such an instruction is reached, which then faults. Prospero Win (PPSA99995) has six in its Wine `ntdll`. - In executables with a `PT_SCE_DYNLIBDATA` segment, the PS4 layout, the executable segment also holds read-only data after the code (CUSA00900: 37 MiB after its last function). The [relinker pipeline](../../../core/relinker/relinker/src/pipeline/RelinkerPipeline.cpp) therefore scans for syscalls and import call sites only up to the end of the PLT that follows the last function of the unwind table; code after the PLT without an unwind entry is not scanned. `--to-intel` and the `unused-filter=1` and `unused-filter=2` analyses are not limited this way. - The [syscall scan of `sce_module` modules](../../../core/relinker/relinker/src/guest/GuestModuleBuilder.cpp) with a `PT_SCE_DYNLIBDATA` segment stops at the same end, or, when the PLT comes before the code, at the end of the last function of the unwind table; code after it is not scanned. @@ -54,3 +55,5 @@ - [ANDN lowering](../../../core/relinker/codegen/src/x86/AndnLowering.cpp) uses scalar NOT and AND for 32- and 64-bit register and memory operands under `--to-rosetta`, following the ANDN entry in [Intel SDM volume 2A](https://cdrdv2-public.intel.com/812383/253666-sdm-vol-2a.pdf). SF and ZF follow the result, CF and OF clear, and AF and PF are undefined. The scratch register is saved below the 128-byte red zone. A 64-bit stack-relative displacement that exceeds signed disp32 after reserving the spill frame throws; other BMI instructions are not lowered. The M1 test covers register overlap, RSP operands, memory addressing, RIP relocation, flags and red-zone preservation; precise fault delivery inside a spill sequence has not been verified. - Relative pointer-width unwind pointer decoding in the [exception frame reader](../../../core/relinker/relinker/src/analysis/UnusedNidFilter/EhFrameReader.cpp) (`DW_EH_PE_absptr` and `DW_EH_PE_udata8`) wraps modulo 2^64 to accommodate backward offsets, as standard DWARF unwinders add them. Console unwind table validation for out-of-range displacements is unmeasured. Unsigned offsets narrower than pointer width (`DW_EH_PE_udata2` and `DW_EH_PE_udata4`) cannot express negative displacements and throw when address addition overflows. + +- [SysV and GNU dynamic symbol hash table bounds](../../../core/relinker/relinker/src/analysis/CodeInstructionCollector.cpp) - whether retail console dynamic linkers tolerate malformed bucket counts, out-of-range chain indices, or unterminated GNU hash chains remains unmeasured against console loader diagnostics. Dynamic symbol count resolution validates SysV and GNU hash headers against arithmetic overflow and segment bounds, throwing RelinkerException when bucket counts are zero, bucket indices exceed chain length, or chain traversal exceeds the mapped ELF image. diff --git a/docs/dev/debt/shader.md b/docs/dev/debt/shader.md index 8c95d53a2a4a..b55a3fc88f62 100644 --- a/docs/dev/debt/shader.md +++ b/docs/dev/debt/shader.md @@ -8,6 +8,8 @@ - The bundled [SPIRV-Tools build](../../../core/shader/recompiler/PatchSpirvTools.cmake) replaces the redundancy-elimination source with a build-directory copy. A depth-first traversal keeps one value map and removes each subtree's added values on return, avoiding growing map copies and preventing sibling values from leaking into one another. This extends the processed-map release fix in [SPIRV-Tools #6962](https://github.com/KhronosGroup/SPIRV-Tools/pull/6962). Remove the patch when the pinned dependency has equivalent copy-free traversal; #6962 alone still copies maps for sibling branches. System-dependency builds need an equivalent fix in their installed package. Optimization passes and validation remain unchanged; wider shader and game performance measurement is needed. +- System-dependency builds do not receive the [bundled parser initialization fix](../../../core/shader/recompiler/PatchSpirvTools.cmake) for standalone literal-float operands. Their installed SPIRV-Tools package needs [upstream #6834](https://github.com/KhronosGroup/SPIRV-Tools/pull/6834), which initializes the floating-point encoding before operand-specific parsing. Remove the build-directory `binary.cpp` replacement when the pinned source includes that initialization. No title use of `FPMaxErrorDecorationINTEL` is established. + ### Unknown function info - [VCC-backed MIMG samplers](../../../core/shader/recompiler/RdnaDecoder/src/RdnaImageOpDecoder.cpp) - the PS5's gfx1013 is not measured. The sampler at field 26 is s104, s105, vcc_lo and vcc_hi. Measured on RDNA2 (gfx1036, AMD Windows driver 32.0.21030.31) through the [hardware oracle](../HW_ORACLE.md) with raw `image_sample_lz` encodings in wave32 and wave64 on a two-level texture, it samples as the same S# in s[16:19] does, and a border clamp in s104, a `MIN_LOD` of 1.0 in s105, point filtering in vcc_lo and a transparent black border in vcc_hi each change the result. Recompiled reads are checked by [bilinear and white-border cases](../../../core/libs/prx/libSceAgcDriver/tests/execution/ImageSampleVccSampler.cpp). @@ -35,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. @@ -57,6 +61,7 @@ - An [image table](../../../core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp) T# of an MSAA or FMASK image, or of a color format under a depth compare, faults when selected: tables have no multisampled descriptors and no emulated color compare. - Direct [FMASK image loads](../../../core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp) of 16 samples, CMASK compression (bar the 8-fragment native owner path), packed accesses and other layouts throw. Uncompressed FMASK of up to 8 samples reads a single-mip 2D or 2D-array 8-, 16- or 32-bit `UINT` snapshot with `Z_64KB_X` addressing; selectors may name X, zero or one. `Fmask32_S8_F8` returns the stored word; others expand to 4 bits per sample, an index at or past the fragment count reading 8 (unknown), samples past the count 0. Layouts follow PAL's [expanded values](https://github.com/GPUOpen-Drivers/pal/blob/c5e800072a32f68b6ccc4422936d96167c6e0728/src/core/hw/gfxip/gfx9/gfx9MaskRam.cpp#L5005) and [FMASK surfaces](https://github.com/GPUOpen-Drivers/pal/blob/c5e800072a32f68b6ccc4422936d96167c6e0728/src/core/imported/addrlib/src/core/addrlib2.cpp#L877). Console results, unused nibbles included, are unmeasured; compressed color sampling is unsupported. - A [DIM 2D read of a 2D MSAA T#](../../../core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp) returns sample 0, which is not measured on the console's gfx1013, at an implicit LOD above 0, at an explicit one for texels over 16 bits except formats 22 and 56 in SW_64KB_R_X, or for other formats and swizzle modes; 64- and 128-bit SW_64KB_Z_X texels are not covered: gfx1031 does not address their samples. Such a read is an `image_load` without a mip, `image_sample`, `image_sample_lz` or `image_sample_l` of a direct sampled image; other accesses (gathers, bias, gradients, offsets, LOD clamps, depth compares, `image_load_mip`, `image_get_resinfo`, `image_get_lod`, PCK, BY2/BY4) throw, as does a depth-bits T# (16_UINT, 32_UINT or 32_SINT in a Z swizzle mode). On gfx1031 (RX 6700 XT, HIP), such reads return sample 0 at 2x, 4x and 8x for 8- to 128-bit texels in SW_64KB_R_X and 8- to 32-bit ones in SW_64KB_Z_X (formats 1, 5, 7, 11, 13, 14, 18, 22, 29, 56, 60, 64, 71, 77, 133). +- An [`image_sample_a` of a 2D MSAA T#](../../../core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp) is served like the `image_sample` reads above, as sample 0: the `_a` form changes only how dword 3 of its S# is read, not its address. This is unmeasured: the gfx1031 runs have no `_a` read. - `image_store_mip`, `image_store_pck`, PCK2/PCK4 and MIMG BY2/BY4 through an [image table](../../../core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp) T# fault (`unsupported operation`) when an active lane executes them; the store is dropped and the load reads zeros. 32-bit and 64-bit image atomics through a table lower to `OpAtomic*` on the table `AtomicView`/`Atomic64View` (`Device` scope, relaxed, `AcquireRelease`/`UniformMemory` barrier as the direct path) instead of faulting; the host needs `VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT` for the view format. Packed formats and BY element counts still fault. - An [image table](../../../core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp) S# with a min or max reduction or FORCE_UNNORMALIZED faults when selected, as does an integer, converted or depth-bits table T# paired with a direct min or max S# that filters between texels. - Uint and Sint [image table](../../../core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvDescriptors.cpp) entries and direct T#s under a table S# sample through a point-filtered copy of the S#: Vulkan leaves linear filtering of integer formats undefined; the console is assumed to point-sample. @@ -108,6 +113,7 @@ - [`v_readlane_b32`](../../../core/shader/recompiler/SpirvBackend/src/SpirvAlu/SpirvAluEmitterMath.cpp) and fetch-inactive `v_permlane16_b32`/`v_permlanex16_b32` read undefined data from a lane that the host subgroup does not hold or whose host invocation is inactive; the console reads the lane's VGPR. - Without fetch-inactive, [`v_permlane16_b32` and `v_permlanex16_b32`](../../../core/shader/recompiler/SpirvBackend/src/SpirvAlu/SpirvAluEmitterMath.cpp) take a source lane that the host subgroup does not hold as inactive and keep the old value (0 with bound_ctrl); the console reads that lane's VGPR. - On a host subgroup narrower than the wave, [`v_readlane_b32`](../../../core/shader/recompiler/SpirvBackend/src/SpirvAlu/SpirvAluEmitterMath.cpp) of a constant lane outside it builds only as lane 63 of a half-wave scan (DPP row_shr 1/2/4/8, `v_permlanex16_b32`, EXEC -1) or, in a program whose entry EXEC is every lane (vertex, local and tessellation stages), as 0 when the value is 0 in lanes 32-63; other such reads throw. A value is 0 there when it is built from 0 through selects under a lane index (lane id or `v_mbcnt` of -1) below at most 32, `v_cmp_ne_u32` against 0, OR, DPP and permlanes; the counts in `s3` give such a bound on a 32-lane host. On a 32-lane host a half-wave scan may also run under `s_mov_b64 exec, -1`, use bound_ctrl:1 steps for an OR, add or unsigned max, and take keys that are 0 in lanes 32-63; its lane 31 is then the subgroup reduction of the host's invocations (a shuffle of the scan on a device without subgroup arithmetic): idle invocations add the identity, where the console would add the keys of the lanes `s3` claims. +- On a one-lane wave (vertex and local programs without vertex subgroups, merged hull programs), a wave64 [f32 max half-wave scan](../../../core/shader/recompiler/SpirvBackend/src/SpirvAlu/SpirvAluEmitterMath.cpp) whose lane 31 and 63 reads only elect, through `v_cmpx_eq_f32` against each lane's own key, the lanes that `buffer_atomic_umax` or `smax` that maximum at a wave-uniform address (result unused) takes each invocation's own key instead. Every active lane then writes its key, one atomic per lane instead of per wave, and memory ends with the wave's maximum because the keys are proven non-negative and not NaN (`FPSaturate`, constants, phis, f32 maxima with such an operand, selects whose condition the scan's lane mask implies within one loop iteration), where bit order matches float order. A vector register the elected lanes write may only feed that atomic. Other cross-lane reads of such a scan throw. - [NGG mesh entry](../../../core/shader/recompiler/Translation/src/InstructionTranslator.cpp) uses the guest wave size (32 or 64) for wave indices, per-wave vertex and primitive counts, and the workgroup wave count in `s3`. The four-bit wave fields follow Mesa's [get_wave_id_in_tg, get_tgsize and get_thread_id_in_tg](https://chromium.googlesource.com/chromiumos/third_party/mesa/+/refs/heads/stabilize-13982.70.B-chromeos-amd/src/gallium/drivers/radeonsi/gfx10_shader_ngg.c); partial waves and groups exceeding 15 waves throw. Indexed and non-indexed wave32 mesh rendering with 32, 64 and 128 threads was checked by pixel readback on Windows with an NVIDIA RTX 4070 Laptop GPU. The guest register values have not been compared with console hardware. - [Mesh shader grid size](../../../core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp) (shader recompiler) - every mesh shader loads `NumWorkgroups.x` and declares no vertices when it is 0, which no dispatch produces. The read is a workaround for RADV (Mesa 26.2.4, seen on an RX 9070 XT, GFX12): binding a mesh pipeline whose shader reads neither `NumWorkgroups` nor `DrawIndex` keeps the user SGPR count and draw-id flag of the vertex pipeline bound before it in the same command buffer (`radv_bind_pre_rast_shader` updates them only when the shader has the `AC_UD_VS_BASE_VERTEX_START_INSTANCE` slot), so `radv_emit_userdata_mesh` opens a 3-register `SET_SH_REG` and writes one value, the CP takes the following `DISPATCH_MESH_DIRECT` as register data and the GPU hangs (gfx ring timeout, MODE1 reset). Kena: Bridge of Spirits (PPSA01802) hits it on its layered volume draws. Reading `NumWorkgroups` gives every mesh shader the grid-size slot, so the count and the values match; drop the read once a fixed Mesa is the minimum - [Mesh layer output](../../../core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp) (shader recompiler) - a mesh shader writes each primitive's layer through a one-member `Block` struct array whose member is decorated `BuiltIn Layer` and `PerPrimitiveEXT`, as glslang declares `gl_Layer` inside `gl_MeshPerPrimitiveEXT`, not through a standalone `PerPrimitiveEXT` `Layer` array. Both forms pass `spirv-val`, but AMD's Windows driver (32.0.21045.5002, RX 6700 XT) crashes in `amdvlk64.dll` creating a pipeline whose mesh shader writes the standalone form, whether the layer is signed or unsigned and whatever the target, while the block form draws, also with a pixel shader that reads the layer. @@ -118,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. @@ -132,7 +139,7 @@ - [v_div_fixup_f16](../../../core/shader/recompiler/Translation/src/FloatInstructions.cpp) flushes its src1 and src2 to a zero of the same sign when bit 0 of the `FLOAT_MODE` f16 denormal field is clear (0 and 2) and keeps a denormal src0 and result in every mode, as `v_div_fixup_f32` does with the f32 field. Measured on RDNA2 (gfx1031, Radeon RX 6700 XT, AMD Windows driver 32.0.21045.5002 through HIP) over 6859 triples of 19 halves (zeros, denormals, minimum normals, ±0.5, ±1, the largest finite value, infinities and quiet and signaling NaNs) at IEEE=0 and IEEE=1 with denorm16 0..3 and FP16_OVFL 0 and 1, also with neg and abs source modifiers and with op_sel high halves. Shaders without a known float mode keep the previous lowering. The PS5's gfx1013 is not measured. - [Packed f16 NaN results](../../../core/shader/recompiler/Translation/src/FloatInstructions.cpp) (`v_pk_add/mul/fma/min/max_f16`) follow the hardware measured on RDNA2 (gfx1035) at IEEE=0 and IEEE=1 with f16 round-to-nearest-even and f16 denormals kept: with IEEE=1 a signaling NaN input is quieted and min/max return the other operand only for a quiet NaN; with IEEE=0 NaN inputs pass through unquieted and min/max ignore signaling. In `v_pk_fma_f16` an invalid product (inf * 0) gives the default NaN even when src2 is a NaN. A shader without a known float mode is translated as IEEE=0, the mode titles use; a mode with another f16 rounding throws. In the f16 denormal modes that flush, each denormal input lane is flushed to a zero of its sign when bit 0 of the field is clear (0 and 2), so `inf * 0x0001` is an invalid product there, and when bit 1 is clear (0 and 1) a `v_pk_add_f16` result below 2^-14, or a `v_pk_mul_f16`, `v_pk_fma_f16` or `v_pk_fmac_f16` result whose exact value rounded to 11 significant bits with an unbounded exponent is below 2^-14, is flushed to a zero of its sign; `v_pk_min/max_f16` flush only their inputs. The native f16x2 add and multiply is not used while results are flushed. 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 19,192 to 162,204 lanes per instruction with op_sel, op_sel_hi, neg_lo, neg_hi and clamp variants and products and sums at the 2^-14 boundary. - [f32 denormals](../../../core/shader/recompiler/Translation/src/TranslationContext/OperandAccess.cpp) follow the shader's `FLOAT_MODE` f32 denormal field (bits 5:4) when it flushes them (0, and shaders without a known float mode, as in the 0xc0 most titles use), measured on RDNA2 (gfx1035) over 1444 rows per instruction at IEEE=0 and IEEE=1. `v_add/sub/subrev/mul/mul_legacy/mullit/fma/fmac/fmamk/fmaak/min/max/min3/max3/med3/fract/floor/ceil/frexp_mant/sin/cos_f32` flush their f32 inputs and their result to a zero of the same sign (`v_mullit_f32` measured on RDNA2 (gfx1036) over 6907 rows per mode at IEEE=0 and IEEE=1, so a positive denormal src2 counts as zero); the f32 compares, `v_cvt_i32/u32/rpi_i32/flr_i32_f32`, `v_frexp_exp_i32_f32`, `v_cvt_f64_f32`, `v_cvt_f16_f32`, `v_cvt_pkrtz_f16_f32`, `v_cvt_pknorm_i16/u16_f32` and `v_cvt_pk_u8_f32` flush their f32 inputs. `v_div_scale_f32` flushes all three inputs to signed zeros, measured on RDNA2 (gfx1036) over 2744 operand triples per mode at IEEE=0 and IEEE=1 with f32 denormals flushed and kept; its scale-down behaviour and host denormal preservation remain incomplete. `v_div_fixup_f32` flushes its src1 and src2 and keeps a denormal src0 and result, measured on RDNA2 (gfx1036) over 6859 rows per mode at IEEE=0 and IEEE=1. Tininess is detected after rounding, measured on RDNA2 (gfx1036) for `v_mul_f32` and `v_mullit_f32` at IEEE=0 and IEEE=1: a product is flushed when its value rounded to 24 bits with an unbounded exponent is below 2^-126, so `0x3f7ffffe * 0x00800001` (2^-126 * (1 - 2^-46)) gives `0x00800000` and `0x3f7fffff * 0x00800000` (2^-126 * (1 - 2^-24)) gives zero. The check rounds in the f32 round mode of `FLOAT_MODE` (bits 1:0), measured in all four modes, while the products themselves are still rounded to nearest even. This applies to `v_mul_f32`, `v_mul_legacy_f32`, `v_mullit_f32`, and to `v_fma_f32`, `v_fmac_f32`, `v_fmamk_f32`, `v_fmaak_f32` and `v_fma_mix_f32` when the addend is zero; with a nonzero addend the fused result is kept, so an exact result just below 2^-126 that rounds to it is not flushed. In the three directed modes the check is computed exactly from the significands. To nearest even (0, the mode of shaders without a known float mode) one factor is multiplied by 2^64, which is exact below 2^64, and the product with the other factor is compared with 2^-62. That multiply is a plain `OpFMul` like the product, and no f32 rounding mode is requested in the SPIR-V, so the check relies on the driver rounding f32 to nearest even by default, as the products do, and a product that rounds up to 2^-126 is the emitted product. `v_fma_mix_f32` follows this rule with mixed f16/f32 sources too, measured on RDNA2 (gfx1036) with f16 in either multiplicand slot, low and high half selection, and an f32 or f16 zero addend: f32 `0x00801002` times f16 `0x3bff` gives `0x00800000` to nearest at IEEE=0 and IEEE=1, while the neighbours `0x00801001` and `0x00801003` give zero and `0x00800001`. The tiny-product boundary was also measured for both signs in all four f32 round modes at IEEE=0; Its f16 sources are flushed to a zero of their sign when bit 0 of the f16/f64 denormal field is clear (0 and 2), whatever the f32 field, measured on RDNA2 (gfx1031, Radeon RX 6700 XT, AMD Windows driver 32.0.21045.5002 through HIP) at IEEE=0 and IEEE=1 with f32 denormal modes 0 and 3 and f16 denormal modes 0 to 3, over 2744 triples of 14 halves with all three sources f16 and 1960 rows with an f32 multiplicand. `v_fma_mixlo_f16` and `v_fma_mixhi_f16` flush their f32 sources too and keep a product below 2^-126, measured on RDNA2 (gfx1036). `v_mad_legacy_f32` and `v_mac_legacy_f32` flush their inputs, their product and their result in every mode, see its entry; their product is still checked for tininess on its exact value, so one below 2^-126 gives zero even when it rounds to 2^-126, as the console's separately rounded encoding is not measured at this boundary. Denormal modes 1 and 2 throw for the other instructions except the f32 compares and the f32 conversions in their entries. Not covered, and not measurable on RDNA2 (no such opcodes) or not measured: `v_mac_f32`, `v_mad_f32`, `v_madak_f32` and `v_madmk_f32` (rounded separately), `v_dot2_f32_f16` and `v_div_fmas_f32` (on hardware `v_div_fmas_f32` flushes only its result), f32 interpolation and `ds_add_f32` keep the previous lowering; `ds_min/max/cmpst_f32` and the image, buffer, global and flat `fmin/fmax/fcmpswap` flush both operands by the field, see the float atomics entries. With f32 denormals kept (3) the results depend on the driver's default denormal behaviour, as no `DenormPreserve` execution mode is requested; `v_ldexp_f32` and the f32 compares are the exceptions. `v_cmp_X_f32` and `v_cmpx_X_f32` compare the operands as sign-magnitude integers with the NaN cases handled apart, so a denormal is not read as zero, measured on RDNA2 (gfx1036) over 256 operand pairs per opcode at IEEE=0 and IEEE=1 with f32 denormals kept and flushed. `v_ldexp_f32` preserves subnormal inputs and rounds a subnormal result in the f32 round mode of `FLOAT_MODE`, measured on RDNA2 (gfx1036) over 2163 rows in each of the four round modes at IEEE=0 and IEEE=1. An overflow rounds like any other result (infinity, or the largest finite value when the mode rounds that sign toward zero). With f32 denormals flushed it flushes a subnormal input and result, measured over the same rows in each round mode at IEEE=0 only. A device whose driver splits `Fma` into a multiply and an add flushes a product below 2^-126 before adding a non-zero addend in `v_fma_f32` and `v_fmac_f32`: `0x1fffffff * 0x1fffffff + 0x00800000` gives `0x00800000` instead of the fused `0x00ffffff` on RADV RENOIR (Mesa 26.2.4), whose compiled shader has `v_mad_f32` and no `v_fma_f32`. [F32DenormalFlush](../../../core/libs/prx/libSceAgcDriver/tests/execution/F32DenormalFlush.cpp) accepts that sum on such a device. -- [v_rcp, v_rsq, v_sqrt, v_log, v_exp, v_sin and v_cos](../../../core/shader/recompiler/Translation/src/FloatInstructions.cpp) (f32 and f16) use the driver's approximation for finite results, not the console's: the low bits can differ. Only NaN, invalid, zero and infinite results and the exact sin/cos zeros are chosen on the bits. Measured on RDNA2 (gfx1036) over every f16 input and 32,832 f32 inputs: RADV returns the hardware's bits for every input of rcp, rsq, sqrt and log and all but one of exp (f16 0x11c5, 1 ULP); NVIDIA (615.71.09) stays within 2 ULP except `v_log_f32` near 1.0 (next entry). [v_sin and v_cos](../../../core/shader/recompiler/SpirvBackend/src/SpirvAlu/SpirvAluEmitterMath.cpp) take the driver's sine or cosine of the radians of the exact cycle, except within 2^-12 of a turn from a zero of the function, where the result is the linear term of the exact distance to the zero: the hardware's constant 6.2831826 (0x40c90fd5) at the integers, which the hardware applies exactly to inputs below 2^-12 of a turn, and the f32 2π at the half and quarter turns, where the hardware is within 7 ULP of it. Outside those bands, a driver result more than 4 ULP from a Taylor series in turns of the exact cycle is replaced by the series, which is within 2 ULP of the true sine and cosine; the hardware is up to 9 ULP from them (gfx1035, 243,092 f32 inputs), so results stay within 13 ULP of the hardware on any driver. RADV returns the hardware's bits for every f16 input and for 32,422 sine and 32,486 cosine results of the 32,832 f32 inputs; the rest are 1 ULP off, except up to 14 ULP on either side of non-zero integers and up to 15 ULP beyond ±256 cycles, where the hardware's own reduction differs from the exact fraction, and up to 6 ULP inside the half- and quarter-turn bands. NVIDIA's own sine is within 1 ULP on 93% of the f32 inputs and up to 1,166 ULP off just outside the bands, its cosine within 163 ULP; the series replaces those results. A denormal f32 input with f32 denormals kept gives the hardware the input times 6.2831826; both hosts flush it. +- [v_rcp, v_rsq, v_sqrt, v_log, v_exp, v_sin and v_cos](../../../core/shader/recompiler/Translation/src/FloatInstructions.cpp) (f32 and f16) use the driver's approximation for finite results, not the console's: the low bits can differ. Only NaN, invalid, zero and infinite results and the exact sin/cos zeros are chosen on the bits. Measured on RDNA2 (gfx1036) over every f16 input and 32,832 f32 inputs: RADV returns the hardware's bits for every input of rcp, rsq, sqrt and log and all but one of exp (f16 0x11c5, 1 ULP); NVIDIA (615.71.09) stays within 2 ULP except `v_log_f32` near 1.0 (next entry). [v_sin and v_cos](../../../core/shader/recompiler/SpirvBackend/src/SpirvAlu/SpirvAluEmitterMath.cpp) take the driver's sine or cosine of the radians of the exact cycle, except within 2^-12 of a turn from a zero of the function, where the result is the linear term of the exact distance to the zero: the hardware's constant 6.2831826 (0x40c90fd5) at the integers, which the hardware applies exactly to inputs below 2^-12 of a turn, and the f32 2π at the half and quarter turns, where the hardware is within 7 ULP of it. Outside those bands, a driver result more than 4 ULP from a Taylor series in turns of the exact cycle is replaced by the series, which is within 2 ULP of the true sine and cosine; the hardware is up to 9 ULP from them (gfx1035, 243,092 f32 inputs), so results stay within 13 ULP of the hardware on any driver. RADV returns the hardware's bits for every f16 input and for 32,422 sine and 32,486 cosine results of the 32,832 f32 inputs; the rest are 1 ULP off, except up to 14 ULP on either side of non-zero integers and up to 15 ULP beyond ±256 cycles, where the hardware's own reduction differs from the exact fraction, and up to 6 ULP inside the half- and quarter-turn bands. NVIDIA's own sine is within 1 ULP on 93% of the f32 inputs and up to 1,166 ULP off just outside the bands, its cosine within 163 ULP; the series replaces those results. A denormal f32 input with f32 denormals kept gives the hardware the input times 6.2831826; both hosts flush it. In PS4 guest shaders the integer band of `v_sin_f32` reaches 1.5 × 2^-12 of a turn (0x39c00000): a PS4 Pro (GCN, firmware 10.71) returns the input times 6.2831826 below it and not at or above it (90,112 inputs). Its half- and quarter-turn bands keep 2^-12, where the PS4 is within 6 ULP of the f32 2π term, not linear. - [v_rcp_f32 and v_rcp_iflag_f32 with `APS5_EXACT_RCP`](../../../core/shader/recompiler/SpirvBackend/src/SpirvAlu/SpirvAluEmitterReciprocal.cpp) return the hardware reciprocal for normal inputs with normal results: a cubic over 32 mantissa segments, the linear term rounded to nearest even, plus 2,761 one-ULP corrections. It matches all 2^23 mantissas of an RDNA2 (gfx1031) sweep; inputs or results that are not normal keep the driver's 1/x. It is off by default because the coefficient and correction tables add about 13k SPIR-V words to each shader that uses it. The switch also reaches v_rcp_f16 (rounded from the f32 reciprocal) and the pixel shader's position W input. - [v_ldexp_f32 in denormal modes 1 and 2](../../../core/shader/recompiler/Translation/src/FloatInstructions.cpp) follows the `FLOAT_MODE` f32 denormal field: mode 1 keeps a subnormal input and flushes a result below 2^-126 to a zero of its sign in every f32 round mode, also one that rounds to 2^-126 at subnormal precision (`0x3fffffff` scaled by 2^-127); mode 2 flushes a subnormal input to a zero of its sign and rounds a subnormal result in the f32 round mode of `FLOAT_MODE`, as mode 3 does. Measured on RDNA2 (gfx1030, Radeon RX 6800, AMD Windows driver 32.0.21045.5002 through HIP) over 10,260 rows (54 inputs of both signs: zeros, subnormals, normals near 2^-126 and 1.0, the largest finite value, infinities and NaNs, each scaled by 190 exponents from -2^31 to 2^31-1) at IEEE=0 and IEEE=1 with each f32 denormal mode 0 to 3 and f32 round mode 0 to 3, DX10_CLAMP=1, f16 denormals kept, f16 round to nearest even and FP16_OVFL=0; with the `clamp` modifier the result is clamped as in the other modes. The PS5's gfx1013 is not measured. - [v_fma_f32, v_fmac_f32, v_fmamk_f32 and v_fmaak_f32 in denormal modes 1 and 2](../../../core/shader/recompiler/Translation/src/VectorInstructions.cpp) throw in mode 1, with a directed f32 round mode, and in mode 2 when the module cannot declare `DenormPreserve 32`; the PS5's gfx1013 is not measured. Mode 2 flushes denormal inputs to zeros of their sign and rounds the fused result once with gradual underflow, the host's `Fma` under `DenormPreserve 32`. Mode 1 keeps the inputs and flushes a result that is tiny after rounding to 24 bits with an unbounded exponent, even with a nonzero addend (`0x807fffff * 0x3f7fffff + 0x80000001` gives `0x80000000`, the fused result is `0x80800000`); that check is not implemented. Measured on RDNA2 (gfx1036, AMD Windows driver 32.0.21030.31 through HIP) over 5,596 triples (16^3 of 16 boundary values, and 1,500 random ones with products near 2^-126) at IEEE 0 and 1 in every f32 denormal mode at round to nearest even. @@ -166,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. @@ -195,6 +203,7 @@ - [Static scalar calls](../../../core/shader/recompiler/ControlFlow/src/GraphBuilder.cpp) (`s_call_b64` and `s_swappc_b64`) require an ordinary even-aligned SGPR link pair (s0:s1 through s104:s105) and a later `s_setpc_b64` return reading that exact pair. Outside every region of its calls the pair is free to use wherever no return address can reach: a dataflow over the decoded instructions follows each dword of the pair from the calls that write it until a scalar load, SALU or VALU result is known to overwrite it, and an instruction there that may read a dword still holding a return address throws; SOPC compares are exempt, as they only set SCC. A VALU mask covers one SGPR in wave32 and a pair in wave64. When the graph is built without the wave size, the dataflow runs for both: a program that escapes under both throws there, and one that escapes under only one throws when it is translated at that size. - [Static scalar call link pairs](../../../core/shader/recompiler/ControlFlow/src/GraphBuilder.cpp) each serve one call, or several calls whose regions are disjoint, each call closed by the first return reading the pair after its target. Regions must nest or be disjoint; recursion, other shared links, escaping link values (including overlapping tuples and resource descriptors), invalid targets, interleaved regions, cross-region branches or fall-through, relative SGPR reads and dynamic `s_setpc_b64` in a program with calls throw. The analysis checks all decoded instructions, including unreachable code. Arbitrary indirect calls and general call frames are not implemented. - [Relative vector addressing](../../../core/shader/recompiler/Translation/src/ControlFlowInstructions.cpp) (`v_movrels_b32`, `v_movreld_b32`, `v_movrelsd_b32`, `v_movrelsd_2_b32`, `v_swaprel_b32`) keeps every vector register from the lowest base register the program addresses relatively up to the last register the program names in zero-initialised function-scope storage per invocation (`LoadVectorWindow`/`StoreVectorWindow`, one element per register), so an indexed access is one load or store instead of a compare-and-select chain over the window. [`IndexedWindowSlots`](../../../core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp) bounds each relative index through the IR (bit-field extracts, masks, shifts, adds, selects, phis, `ReadFirstLane` and the window stores that reach a load); the storage is an array of the slots below the largest bound that is under half the window, and one function variable per slot after it. A constant index uses the array element or the slot's variable; a relative access whose index has no such bound, or lands past the array at run time, indexes the array below its size and otherwise branches through an `OpSwitch` over the slot variables, so the bound only decides speed. When no index has a bound under half the window, the whole window is the array, as with `APS5_NO_WINDOW_NARROWING=1` (a recompiler switch in the shader cache key). Measured on an NVIDIA GeForce RTX 3060 (driver 615.78.08, Linux) with a compute program whose 167-register window an ALU loop reads and writes in full and whose relative accesses take `m0 = s8 & 3`: a 2048-group dispatch took 70.2 ms in wave32 and 123.3 ms in wave64 with the whole window in the array (as before narrowing) and 1.9-2.1 ms and 7.8 ms narrowed; with a second relative access whose index has no bound and lands past the array at run time (index 50 or 166), 113 ms and 5.8-6.0 ms in wave32. In the PPSA08427 (Killing Floor 3) hub it made no measurable difference to presents or to the GPU time of the eight most expensive programs. Whether the host compiler keeps the array and the slot variables in registers or spills them to scratch is not measured. A register in the window the program never wrote reads 0, as an unwritten SSA register does; the console's value is undefined. M0 is unsigned: an index at or past the window reads `v0` and drops its write, and `v_swaprel_b32` writes neither side when either is out of range, as measured on RDNA2 (gfx1035, `agc_driver_relative_indexing`). The window ends at the last register the program names rather than at the shader's VGPR allocation, which the recompiler does not receive, so a relative write past the named registers but inside the allocation is dropped where the hardware keeps it for a later relative read. Killzone: Liberation's PSP vertex program (PPSA11142, 3176 ISA words, 104 relative accesses over 154 registers) went from 649,515 to 392,333 SPIR-V words with this. Pixel programs whose relative span contains the packed ancillary input instead keep that span in SSA and implement indexed operations with compare/select chains. This keeps ancillary definitions visible to field lowering and masked-write proofs; storing the unmodelled whole word in a private array would require composing unknown bits. A fold after masked-select elimination lowers fields whose consumers become visible only after redundant copies are removed. A whole-word use that the masked-select pass keeps gets the composed word described under the packed pixel ancillary word. Both representations include implicit entry inputs in the inferred register limit and retain unsigned M0, inactive-write and DPP update rules; wave32/wave64 native Vulkan readbacks cover relative reads, writes, split-offset swaps, inactive writes, DPP masks and out-of-range accesses, but console comparison and the performance cost of selecting over this span are unverified. +- [Mesh vector windows on NVIDIA](../../../core/shader/recompiler/SpirvBackend/src/SpirvAlu/SpirvAluEmitterRegisters.cpp) (shader recompiler) - on NVIDIA's proprietary driver, function arrays in local memory that are read under a data-dependent branch return wrong values in subgroups 1–3 of a mesh workgroup (RTX 3060 Ti, Windows, driver 621.01; [`agc_driver_mesh_vector_window_waves`](../../../core/libs/prx/libSceAgcDriver/tests/execution/MeshVectorWindowWaves.cpp) fails there with `APS5_NO_MESH_WINDOW_BUFFER=1`), which broke the title's clipping geometry program (PPSA07550). So on that driver a mesh program's window lives in a 64 MiB storage buffer of 256 workgroup slots claimed through a lock: direct accesses stay in variables, relative accesses use the buffer, and a store writes the buffer only where a buffer read can see it. A cold driver compile of the title's program took 59 s instead of 23 s. Other GPUs and drivers are not measured. - [Lane spills read back with `v_readlane_b32`](../../../core/shader/recompiler/Optimization/src/ReadLaneEliminator.cpp) (shader recompiler) - not verified for the guest compiler: a relative write (`v_movreld_b32`, `v_movrelsd_b32`, `v_movrelsd_2_b32`, `v_swaprel_b32`) with a computed index is taken to miss a register between a `v_writelane_b32` of a lane and a later `v_readlane_b32` of it, so the read becomes the spilled scalar. That holds when the compiler keeps spill registers out of its relatively indexed arrays. Each such write that a replaced read depends on is checked at run time: one that changes that lane of that register records a fault, and the dispatch or draw fails with `which holds a scalar spilled with v_writelane_b32`, where the console would read the new value ([m0 = 1 counterexample](https://github.com/boykopovar/AnyPS5/pull/6277#issuecomment-6215244790)). An inactive or out-of-range lane writes nothing. A constant-index write of the register still ends the spill. - [s_call_b64](../../../core/shader/recompiler/Translation/src/ScalarInstructions.cpp) saves `PC + 4` over `GetShaderBase` and branches to `PC + 4 + signext(SIMM16) * 4`, following [AMD RDNA2 ISA](https://gpuopen.com/download/rdna2-shader-instruction-set-architecture.pdf) sections 3.6.3, 12.2 and 12.3. Forward callees after `s_endpgm` are decoded. Measured on RDNA2 (gfx1036) in wave32 and wave64 with SIMM16 = 3: the link pair receives `PC + 4`, the branch goes to `PC + 4 + signext(SIMM16) * 4`, and `s_setpc_b64` of the link returns to the instruction after the call. Execution on the PS5 (gfx1013) and title compatibility for these bounded scalar calls remain unverified; `s_rfe_b64` still throws in translation. - [BDA anchor halfword reads](../../../core/shader/recompiler/SpirvBackend/src/SpirvBdaRead.cpp) retain volatile byte loads even for noncoherent memory. On RX 6650 XT / RADV Mesa 26.2.4, the valid SPIR-V for two adjacent nonvolatile byte loads returned `0x80a0` for bytes `0xa0, 0xa1`, where lookup-based reads returned `0xa1a0`. Adding the volatile operand makes the same GPU exactness fixture pass, including mixed direct/fallback lanes. The driver transformation responsible has not been isolated; removing this restriction needs equivalent readback coverage on the affected driver. Single-byte reads keep their original access mask. diff --git a/docs/dev/debt/ulobjmgr.md b/docs/dev/debt/ulobjmgr.md index 9bf26b6ea499..de6ccab3075e 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/user/INPUT_MAPPING.md b/docs/user/INPUT_MAPPING.md index 69236383aade..d22dcfb9aae9 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,9 +14,15 @@ 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)), and `Screenshot` (F12, saves the next displayed frame as described in [screenshots](USAGE.md#screenshots)). `ToggleFullscreen`, `TogglePerformanceOverlay` and `Screenshot` accept only keyboard keys. +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 @@ -44,6 +50,10 @@ Without an `anyps5-input.ini`, or for actions the file does not mention, these b | `ToggleFullscreen` | F11 | | `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: @@ -65,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` | @@ -97,6 +108,10 @@ Events start relative to when the application first observes the new command. Bu The runtime evaluates scheduled events at each controller read, including their automatic releases. A new pulse or timeline replaces the remaining sequence. Physical controller buttons still add to injected buttons. Existing commands at the application's first controller read are ignored. This schedules wall-time input: events can be missed while the application is not reading its controller, and it does not reproduce frame timing or game state. Use gaps and holds long enough for the title's input loop. +## Controller vibration strength + +Vibration is not part of the input mapping file. The host-side strength of a controller's vibration is set with `ANYPS5_RUMBLE`, described in [Controller vibration strength](USAGE.md#controller-vibration-strength); `0` turns it off for every connected controller. + ## Analog keyboard input `StickModifier` has no built-in binding. While a key or mouse button bound to it is held, the keyboard stick bindings tilt the stick by `StickModifierScale` of its range instead of fully, for walking or fine aim. Controller sticks and the mouse stick are not affected, and opposite keys still cancel each other. @@ -114,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 5b193f4335fa..65c45e787be7 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 1a71c0e861fe..be61515e0302 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 a146b11c505a..ea1feee4f2d1 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 d0db964c922f..c5f3f3c67d04 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 1db0f7f7ff93..ac07cd4e80c0 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,10 +307,45 @@ 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. + +```sh +ANYPS5_RUMBLE=50 ./app.elf +ANYPS5_RUMBLE=0 ./app.elf +``` + +The setting covers the rumble motors, the impulse-trigger rumble of controllers that have it, and the vibration a game plays as audio, both when it is played on a DualSense's own sound card and when it is turned into motor rumble. It does not change DualSense adaptive trigger effects (resistance and trigger vibration profiles), which still reach the controller as the game sends them. A value that is empty, signed, fractional or above 100 stops the game at start with an error naming `ANYPS5_RUMBLE`. + +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. +### Controller-speaker fallback audio + +Set `APS5_PAD_SPEAKER_FALLBACK_DB` before launching the application to change the gain for AudioOut2 controller-speaker ports that are folded into the main stereo output when no controller speaker is present. The value is read once when a title creates its AudioOut2 context. The default is `0` dB, which leaves the mix unchanged. It accepts a number from `-60` to `0`, or `mute`, `off` or `-inf` for silence, with surrounding whitespace ignored. Any other value, including an empty one, an out-of-range number, a non-finite number or trailing text, stops the title with an error naming the variable and the value. It does not affect main-mix ports or a real controller speaker, and it does not apply to the legacy AudioOut controller-speaker port. + +A title that plays a sound on both a main port and a controller-speaker port keeps the main-port copy when the fallback is muted. That copy follows the title's own volume settings, while the controller-speaker copy may not. + ### System fonts Games that open the console's system font sets (`sceFontOpenFontSet`) need font files in an `anyps5-fonts/` directory beside the output executable; set `ANYPS5_SYSTEM_FONTS` to use another directory. Files dumped from the console are used under their own names (`SST-Roman.otf`, `SST-Bold.otf`, `SSTJpPro-Regular.otf`, ...). Without them, these openly licensed substitutes are used when present: `NotoSans-{Light,Regular,Medium,Bold}.ttf` and `NotoSans-{LightItalic,Italic,MediumItalic,BoldItalic}.ttf` (Latin and Vietnamese), `NotoSansMono-{Light,Regular,Medium,Bold}.ttf` (typewriter), `NotoSansThai-{Light,Regular,Medium,Bold}.ttf` (Thai), `NotoSansArabic-{Light,Regular,Medium,Bold}.ttf` (Arabic) and `NotoSansCJK-{Light,Regular,Medium,Bold}.ttc` (Japanese, Chinese and Korean). A set that covers several scripts also opens the files of its other scripts (`SSTThai-*.otf`, `SSTArabic-*.otf`, `SSTJpPro-*.otf`, `DFHEI5-SONY.ttf`, `SCEPS4Yoongd-*.otf` or their substitutes) for the characters its main file lacks; a missing one leaves those characters without a glyph. Without either, opening a system font set fails (the log shows `sceFontOpenFontSet` with `file=(none)`), and what happens next depends on the game: some show no text in those fonts, and others stop at start-up because they assert that the open succeeded. The substitutes come from the [Noto project](https://github.com/notofonts/notofonts.github.io) under the SIL Open Font License (the Noto Sans files are in `fonts/NotoSans/full/ttf`, the Arabic ones in `fonts/NotoSansArabic/full/ttf`); copy the files named above into `anyps5-fonts/`. @@ -315,6 +354,18 @@ 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. + +On Linux the request goes to [Feral GameMode](https://github.com/FeralInteractive/gamemode): AnyPS5 loads `libgamemode.so.0` (then `libgamemode.so`) with `dlopen` when it starts, asks `gamemoded` to start game mode, and ends the request when the title exits. What `gamemoded` then changes (CPU governor, process priority, GPU settings) comes from its own configuration, `gamemode.ini`, not from AnyPS5. On macOS it holds a user-initiated, latency-critical `NSProcessInfo` activity, which keeps App Nap and timer coalescing away from the process. Windows has no request to make: AnyPS5 already asks it not to throttle the process timers when it loads. + +`APS5_GAME_MODE=auto` makes the same request but says nothing when the host cannot take it (no GameMode library, no Foundation). With `on`, a missing library is logged once as `[host-performance]`. In both modes a request the daemon refuses, for example because `gamemoded` is not running, is logged once, and the title keeps running either way. Any other value stops the title at start with an error that names `APS5_GAME_MODE`. + ### Trophies A game unlocks a trophy by posting a `_UnlockTrophy` event with an int32 `_trophy_id` property to `libSceNpUniversalDataSystem`, or through the statistics rules described below. The unlock is stored in `_trophy/_.txt` in the directory the game runs in (the one that holds `app0/`), one ` ` line per trophy; the time is an RTC tick, microseconds since 0001-01-01 UTC. Delete the file before starting the game to lock its trophies again. Each new unlock prints one line, such as `[trophy] PPSA01556 unlocked trophy 12 for user 268435456`; unlocking a trophy again prints nothing. `sceNpTrophy2GetTrophyInfo`, `sceNpTrophy2GetTrophyInfoArray` and `sceNpTrophy2GetGameInfo` report the stored unlocks and their times to the game. When the game's trophy data is loaded (see below), a posted unlock of a trophy that the data does not have, of the platinum, or of a progressive trophy is not stored and prints the reason, such as `[trophy] ignored the posted unlock of trophy 0 for user 268435456: it is the platinum, which unlocks with the last trophy that names it`; the platinum unlocks with the last trophy that names it, and a progressive trophy through its statistic. Without trophy data every posted id of 0 or more is stored, and the platinum is not unlocked when the other trophies are. @@ -342,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. @@ -359,6 +422,16 @@ Do not disable Dozen if it is the only Vulkan driver available; the application On Windows, NVIDIA driver 610.47 can crash in its shader compiler while pipelines are created: the log ends in `FATAL: unhandled exception 0xc0000005` with `nvgpucomp64.dll` in `rip`, on a driver thread. PPSA25344 on an RTX 3060 stopped this way in 3 of 3 New Game loads, also with `APS5_NO_PIPELINE_LTO=1`; with driver 617.42 the same build and scene ran for 40 minutes. Update the driver when the crash is in `nvgpucomp64.dll`. +### Host report + +Set `ANYPS5_HOST_REPORT=1` to print what a bug report needs to stderr once, when the game's Vulkan device has been chosen. Attach the whole block to the issue; it replaces typing the OS, GPU and driver by hand. `0`, an empty value or no variable prints nothing, and any other value stops the start with an error that names the variable. + +The report has fixed sections in a fixed order, so two runs on one machine print the same text: `[system]` (commit, OS (kernel release and machine type on Linux and macOS, version and build on Windows), CPU model, hardware threads, physical memory in MiB, and the CPU check), `[sdl]` (the SDL version linked at run time and the one built against), `[gpu]` (device name and type, PCI vendor and device ids, Vulkan version, driver name and info from `VK_KHR_driver_properties`, the raw driver version, subgroup size, the largest device-local heap, every Vulkan device found, the surface's present modes and the one `ANYPS5_PRESENT_MODE` asked for), `[vulkan]` (each extension and feature the game needs and the optional extensions it uses, marked `present` or `missing`), `[shader_cache]` (`disabled`, `absent` or `present` with its size in MiB) and `[environment]` (the `APS5_`, `ANYPS5_`, `VK_` and `SDL_` variables that are set). A fact that could not be read prints `unavailable` and is explained in a final `[unavailable]` section. The `cpu_gate` line says `passed` whenever the report appears, because a host CPU that lacks a required extension stops the game before the Vulkan device is chosen (see the CPU requirement under Input and conversion); it says `unavailable` where that check does not run, such as macOS. The shader cache size counts at most 200000 files. + +The report holds no user names, host names, serial numbers or MAC addresses. Any word that looks like a path (starting with `/` or `~`, containing a backslash or starting with a drive letter) prints as `<path>`, URLs print as `<url>`, MAC addresses as `<redacted>`, and the account name, host name and home directory name are replaced wherever they appear as a whole word. Check the text before posting it anyway, since the values of the variables it lists are printed as set. + +When the chosen GPU lacks an extension or a feature the game requires (`VK_KHR_8bit_storage`, `VK_KHR_buffer_device_address`, `VK_KHR_shader_float_controls`, `storageBuffer8BitAccess`, `bufferDeviceAddress`, `shaderInt64`, `shaderSignedZeroInfNanPreserveFloat32`, `vertexPipelineStoresAndAtomics`, `fragmentStoresAndAtomics`, `samplerAnisotropy`, `textureCompressionBC`, and `VK_KHR_swapchain` for a window), the start fails with one message that names the GPU, its driver and Vulkan version, lists every missing item, and points to the other Vulkan devices that `ANYPS5_GPU` can select. With `ANYPS5_HOST_REPORT=1` the report is printed first, so a failed start still has it. + ### HDR output HDR output is available on Windows only. Titles see it when the monitor showing the window runs in HDR mode (Settings > Display > Use HDR), the window's Vulkan surface offers an HDR10 (`VK_COLOR_SPACE_HDR10_ST2084_EXT`) swapchain in a 10-bit format, the instance has `VK_EXT_swapchain_colorspace` and the device `VK_EXT_hdr_metadata`. The monitor's luminance comes from DXGI; a monitor that reports no peak luminance is taken as 1000 nits peak and full-frame, 0 nits black. On Linux and other hosts the output is always SDR, because the surface's formats do not show whether the display is in HDR. A title's BT.2100 PQ display buffers then reach the display unchanged; without HDR output they are converted to SDR. @@ -377,7 +450,7 @@ Besides the recompiled shaders, the shader cache directory holds `pipelines.jour ### Texture cache budget -Image and buffer memory allocations retry after releasing unused pooled buffers and reclaimable texture cache entries. Recovery preserves storage images with pending GPU results and resources retained by recorded work. `[bufferpool]` recovery and failure lines report the requested allocation, memory released and retry count. An allocation still fails if recovery cannot free enough memory. +Image and buffer memory allocations retry after releasing unused pooled buffers and reclaimable texture cache entries. Recovery preserves storage images with pending GPU results and resources retained by recorded work. `[bufferpool]` recovery and failure lines report the requested allocation, memory released and retry count. An allocation still fails if recovery cannot free enough memory. When the `VK_EXT_memory_budget` budget of the device-local heap has no room for an image, device buffer or resident heap mirror slab, the texture caches first release reclaimable entries for the allocation and what the heap is over its budget; the allocation goes to host memory only if they release less than that and the budget read again still has no room. Sampled textures and storage images stay in device memory in two caches that evict their least recently used entries when they grow past their budgets. The storage image budget is what the `VK_EXT_memory_budget` budget of the largest device-local heap leaves after the heap's use other than the cached storage images themselves and an eighth of the budget; it is capped at half of that budget or half of the heap's size, whichever is smaller, and never below 512 MiB. The sampled texture budget is what the reported budget leaves after the heap's use other than cached textures, a quarter of the heap's size (at least 2 GiB) and an eighth of the budget, and never below 2 GiB. As the heap's other use grows the sampled budget falls first, to that floor, then the storage budget; the storage budget also gives back what the sampled textures alive take as they grow. Each cache trims at its next insert. Both budgets are read again every second; `[gpu] sampled texture cache budget` lines report them at start-up and when either moves by more than a tenth, at most every 10 s. `APS5_TEXTURE_CACHE_MIB=<n>` fixes both budgets at `n` MiB, and the lines are then not printed. @@ -458,6 +531,41 @@ Page 2 is wider, 46 characters, and has no graph. It reads its sources once a se The busy shares, the phases, the queue 0 waits and the render passes come from the totals the trace keeps per thread. Showing page 2 turns those totals on, without the event buffers of an `APS5_TRACE_FRAMES` trace: while page 2 is shown, each timed scope on the driver's threads reads the clock twice and adds its time to its thread's totals, and each render pass begun is counted there. Leaving page 2 turns the totals off again. A run with an `APS5_TRACE_*` variable keeps its trace as configured; page 2 then shows those lines only while that trace records. While the overlay is hidden or on page 1, page 2 adds a check per render pass begun (the same check each timed scope already makes), a per-thread count of the bytes each address-based build copies, a count of unimplemented-function calls and the display buffer's address per present; its sources are read only while it is shown. +### Saving the log to a file + +Set `ANYPS5_LOG_FILE=<path>` in the environment of a converted executable to keep its log in a file you can attach to a bug report. The executable still prints everything on the terminal; the file receives a copy of what it writes to standard output and standard error: the runtime's log lines, the `[tag]` messages, what the title itself prints there, and the crash and abort reports. `APS5_LOG_TIMESTAMPS` stamps the lines in the file as it does on the terminal. The relinker, the trace files of the `APS5_TRACE_*` variables and the output of programs that do not write to those two streams are not part of it. + +``` +ANYPS5_LOG_FILE=run.log ./app.elf +``` + +- The file is opened when the executable loads, and created if it does not exist. A relative path is resolved against the working directory. +- The file is appended to, never truncated, so a title that starts another converted executable keeps writing to the same file and a second run continues below the first. Each start writes one line `[log] ANYPS5_LOG_FILE: appending to this file, process <id>` to the file only. Delete the file first to begin a fresh log. There is no `{pid}` or date expansion in the path. +- An empty value is the same as an unset variable. A path that cannot be opened (a missing directory, a directory, no permission) stops the executable before it runs, with status 1 and a message that names `ANYPS5_LOG_FILE`, the path and the operating system error. +- A line produced by one `write` call is written to the file whole: a line of standard output never lands inside a line of standard error. Two threads writing lines longer than the pipe's atomic size (512 bytes on macOS, 4096 on Linux) to the same stream can still interleave, as they do on a terminal. The two streams are copied by two threads, so lines of one stream can come out a few lines before or after lines of the other that were written at nearly the same time. A last line without a newline gets one in the file when the process ends. +- A crash or abort report, and the lines written before it, are written to the file before the process ends. A process ended from outside, by `SIGKILL` or `TerminateProcess` for example, loses what it had written in the last milliseconds. +- The file has no size limit and grows for as long as the title logs. +- If the file can no longer be written, for example because the disk is full, the executable prints one line saying so and goes on with the terminal output only. +- While the variable is set the executable runs two extra threads and holds the standard streams in two pipes. A child process the title starts keeps its output in the same pipes, so output it writes after the title exits is lost, and on Linux and macOS the `SIGPIPE` of that write ends it unless it ignores the signal. When the title replaces itself with another executable through `sceSystemServiceLoadExec`, the real streams are handed over first. +- With no console, for example a Windows executable started without one, only the file receives the log. +- On Windows the redirection of the standard handles and the crash report path were written from the code and compiled for MinGW, but not run: an unexpected behaviour there is worth a bug report that says so. + +### Controller status panel + +A small panel over the presented image lists the controllers of the four player slots, one line for each slot that has had a controller since the game started (with `ANYPS5_PAD_STATUS` unset or 0, since the first F9 press, because controllers are not tracked before that): `P1 DUALSENSE WIRED`, `P2 XBOX BATTERY MEDIUM`, `P3 DISCONNECTED`. It is never shown permanently: it disappears 4 seconds after the last thing that showed it. With no controller seen yet it reads `NO CONTROLLER`. + +F9 shows it, in the game window; pressing F9 while it is shown starts the 4 seconds again. The key is `ShowPadStatus` in the [input mapping](INPUT_MAPPING.md) and accepts only keyboard keys. With `ANYPS5_PAD_STATUS=1` it also appears by itself when a controller connects (including a controller already connected when the game starts), disconnects, is replaced by another one in its slot, or its battery enters a lower class (full, medium, low, empty); each new event starts the 4 seconds again. `ANYPS5_PAD_STATUS=0` is the same as unset: only F9 shows it. For this variable an empty value is the same as an unset one, and any other value stops the game when video output starts, with an error that names the variable. + +A line is the player number (the controller's slot: a controller that reconnects takes the lowest free slot, which can be another player), the controller type and its power. The type is `DUALSENSE`, `DUALSHOCK 4`, `DUALSHOCK 3`, `XBOX` or `SWITCH`; for any other controller it is the name SDL reports, reduced to the characters of the overlay font and cut to 12 characters with a final dot, or `PAD` when SDL gives no name. The power is `WIRED` or one of SDL's battery classes, `BATTERY EMPTY` (up to 5%), `BATTERY LOW` (up to 20%), `BATTERY MEDIUM` (up to 70%) and `BATTERY FULL`; a controller whose driver or connection reports no level reads `BATTERY UNKNOWN`. What is reported depends on SDL, the operating system and the controller. + +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/ab_split.py b/tools/ab_split.py index 04ab7a509195..971449d7893b 100644 --- a/tools/ab_split.py +++ b/tools/ab_split.py @@ -80,12 +80,16 @@ def read_log(lines): for line in lines: text = line.rstrip("\r\n") if text.startswith("[ab] in-run A/B:"): + if config is not None or phases: + raise ValueError("multiple A/B runs in one log; split the captures before comparing phases") config = text continue match = PHASE.match(text) if match: kind, index, event, present, seconds = match.group(1), int(match.group(2)), match.group(3), int(match.group(4)), finite(float(match.group(5))) if event == "begins": + if phases and index <= phases[-1]["index"]: + raise ValueError("phase index restarts in one log (multiple A/B runs); split the captures before comparing phases") if current is not None: current["end"] = (present, seconds) current = {"kind": kind, "index": index, "begin": (present, seconds), "settled": None, "end": None, diff --git a/tools/agc_test_split.py b/tools/agc_test_split.py new file mode 100644 index 000000000000..b6f0ec37cd27 --- /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 7074dc359317..7a75328bbb9b 100644 --- a/tools/annotate_module.py +++ b/tools/annotate_module.py @@ -25,6 +25,7 @@ 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 @@ 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]+)") @@ -51,12 +52,16 @@ def __init__(self, data): self.dynamic = None self.read_headers() self.tags = self.read_tags() + self.strsz = self.require_tag(DT_STRSZ, "DT_STRSZ") self.strtab = self.address(self.require_tag(DT_STRTAB, "DT_STRTAB")) self.symtab = self.address(self.require_tag(DT_SYMTAB, "DT_SYMTAB")) - self.strsz = self.require_tag(DT_STRSZ, "DT_STRSZ") 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() def unpack(self, form, offset): @@ -98,41 +103,53 @@ def require_tag(self, tag, name): raise ModuleError("the dynamic section has no %s" % name) return self.tags[tag] - def address(self, vaddr): + def address(self, vaddr, length=1): for start, offset, size, _ in self.loads: - if start <= vaddr < start + size: - return offset + vaddr - start - raise ModuleError("address %#x is outside every PT_LOAD segment" % vaddr) + if start <= vaddr <= start + size: + position = offset + vaddr - start + if position + length > len(self.data): + continue + covered = vaddr + for next_start, next_offset, next_size, _ in sorted(self.loads): + if next_offset - next_start == position - vaddr and next_start <= covered: + covered = max(covered, next_start + next_size) + if covered >= vaddr + length: + return position + raise ModuleError("range %#x+%#x is outside file-backed PT_LOAD data" % (vaddr, length)) def count_symbols(self): if DT_HASH in self.tags: - return self.unpack("<I", self.address(self.tags[DT_HASH]) + 4)[0] + table = self.tags[DT_HASH] + buckets, count = self.unpack("<II", self.address(table, 8)) + self.address(table, (2 + buckets + count) * 4) + return count if DT_GNU_HASH in self.tags: - return self.count_gnu_symbols(self.address(self.tags[DT_GNU_HASH])) + return self.count_gnu_symbols(self.tags[DT_GNU_HASH]) raise ModuleError("the dynamic section has neither DT_HASH nor DT_GNU_HASH, so the symbol count is unknown") def count_gnu_symbols(self, table): - buckets, symoffset, bloom_size, _ = self.unpack("<IIII", table) + buckets, symoffset, bloom_size, _ = self.unpack("<IIII", self.address(table, 16)) buckets_at = table + 16 + bloom_size * 8 chains_at = buckets_at + buckets * 4 - last = max((self.unpack("<I", buckets_at + 4 * index)[0] for index in range(buckets)), default=0) + self.address(table, chains_at - table) + last = max((self.unpack("<I", self.address(buckets_at + 4 * index, 4))[0] for index in range(buckets)), default=0) if last < symoffset: return symoffset - while not self.unpack("<I", chains_at + 4 * (last - symoffset))[0] & 1: + while not self.unpack("<I", self.address(chains_at + 4 * (last - symoffset), 4))[0] & 1: last += 1 return last + 1 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: @@ -157,7 +174,9 @@ def imports(self): for table, size in self.relocation_tables(): if size % RELA_SIZE: raise ModuleError("relocation table at %#x has %d bytes, not a multiple of %d" % (table, size, RELA_SIZE)) - start = self.address(table) + if size == 0: + continue + start = self.address(table, size) for position in range(start, start + size, RELA_SIZE): offset, info, _ = self.unpack("<QQq", position) if (info & 0xFFFFFFFF) == R_X86_64_NONE: @@ -170,21 +189,21 @@ def exports(self): 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, name) + (thread_local if kind == STT_TLS else found).setdefault(value, []).append(name) return found, thread_local 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 @@ -219,7 +238,7 @@ def disassemble(code, vaddr): with tempfile.TemporaryDirectory() as directory: blob = Path(directory) / "text.bin" blob.write_bytes(code) - command = [objdump, "-D", "-b", "binary", "-m", "i386:x86-64", "--no-show-raw-insn", + command = [objdump, "-D", "--disassemble-zeroes", "-b", "binary", "-m", "i386:x86-64", "--no-show-raw-insn", "--adjust-vma=%d" % vaddr, str(blob)] result = subprocess.run(command, capture_output=True, text=True, encoding="utf-8", errors="replace") if result.returncode != 0: @@ -227,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 @@ -241,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 @@ -253,7 +283,7 @@ def annotate_listing(listing, slots, exports, stubs, namer): head = LINE_ADDRESS.match(line) if head and int(head.group(1), 16) in exports: out.append("") - out.append("; ===== export " + namer.resolve(exports[int(head.group(1), 16)])) + out.extend("; ===== export " + namer.resolve(name) for name in exports[int(head.group(1), 16)]) out.append(line + line_note(line, slots, stubs, namer)) return out @@ -265,8 +295,8 @@ def write_lines(path, lines): def export_lines(exports, thread_local, namer): - lines = ["%#x %s %s" % (address, exports[address], namer.resolve(exports[address])) for address in sorted(exports)] - lines += ["tls+%#x %s %s" % (offset, thread_local[offset], namer.resolve(thread_local[offset])) for offset in sorted(thread_local)] + lines = ["%#x %s %s" % (address, name, namer.resolve(name)) for address in sorted(exports) for name in exports[address]] + lines += ["tls+%#x %s %s" % (offset, name, namer.resolve(name)) for offset in sorted(thread_local) for name in thread_local[offset]] return lines @@ -287,7 +317,9 @@ def annotate(module_path, prefix, namer): write_lines(prefix + ".imports.txt", ["%#x %s %s" % (slot, slots[slot], namer.resolve(slots[slot])) for slot in sorted(slots)]) write_lines(prefix + ".exports.txt", export_lines(exports, thread_local, namer)) write_lines(prefix + ".asm", annotate_listing(listing, slots, exports, stubs, namer)) - return "%s: %d imports, %d exports, %d tls, %d stubs, %d lines" % (prefix, len(slots), len(exports), len(thread_local), len(stubs), len(listing)) + export_count = sum(len(names) for names in exports.values()) + tls_count = sum(len(names) for names in thread_local.values()) + return "%s: %d imports, %d exports, %d tls, %d stubs, %d lines" % (prefix, len(slots), export_count, tls_count, len(stubs), len(listing)) def parse_arguments(argv): diff --git a/tools/audit_dump.py b/tools/audit_dump.py index 696e62df691a..c734c5465056 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,13 +165,21 @@ 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: print(f"FAIL: unwrapping {dump}: {error}", file=sys.stderr) return 2 - result = convert(relinker, source, output / ("app.exe" if args.windows else "app.elf"), extra, args.windows) + try: + result = convert(relinker, source, output / ("app.exe" if args.windows else "app.elf"), extra, args.windows) + except OSError as error: + print(f"FAIL: cannot run relinker {relinker}: {error}", file=sys.stderr) + return 2 if result.returncode != 0: print(f"FAIL: relinker exited with {result.returncode}", file=sys.stderr) print((result.stderr or result.stdout).strip(), file=sys.stderr) diff --git a/tools/audit_nid_names.py b/tools/audit_nid_names.py new file mode 100644 index 000000000000..885395433a65 --- /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 new file mode 100644 index 000000000000..451cefa1138a --- /dev/null +++ b/tools/build_changed_guest_tests.py @@ -0,0 +1,160 @@ +import argparse +import json +from pathlib import Path +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", + ".github/workflows/build.yml", + "tools/build_mingw_host_only_tests.py", + "tools/build_changed_guest_tests.py", +} + + +def reaches_libs(changed): + return any( + path == "CMakeLists.txt" or path.startswith(("core/libs/", ".github/workflows/build.yml", "tools/")) + for path in changed + ) + + +def guest_test_targets(source_root, targets, changed_paths=None): + selected = [] + for target in targets.values(): + if target.get("type") != "EXECUTABLE": + continue + target_source_dir = (source_root / target["paths"]["source"]).resolve() + try: + target_source_dir.relative_to(source_root / "core" / "libs") + except ValueError: + continue + sources = [source_root / source["path"] for source in target.get("sources", []) if not source.get("isGenerated")] + if not any("tests" in source.parts and source.is_relative_to(source_root / "core" / "libs") for source in sources): + continue + if not host_only.links_guest_libc(target): + continue + selected.append(target["name"]) + selected = sorted(set(selected), key=str.casefold) + if changed_paths is None: + return selected + changed = {Path(path).as_posix() for path in changed_paths if path} + broad_change = any(path in BROAD_CHANGES or path.startswith("core/libs/") and ( + path.endswith((".h", ".hpp", ".hh", ".inl")) or Path(path).name == "CMakeLists.txt" + ) for path in changed) + if broad_change: + return selected + changed_source = { + relative + for target in targets.values() + if target.get("name") in selected + for item in target.get("sources", []) if not item.get("isGenerated") + for relative in [host_only.source_relative_path(source_root, source_root / item["path"])] + if relative is not None + } + matched_sources = changed & changed_source + if matched_sources: + return [ + target["name"] for target in targets.values() + if target.get("name") in selected + and any( + host_only.source_relative_path(source_root, source_root / item["path"]) in matched_sources + for item in target.get("sources", []) if not item.get("isGenerated") + ) + ] + return [] + + +def target_artifact_names(target): + names = set() + for artifact in target.get("artifacts", []): + name = Path(artifact.get("path", "")).name + if name: + if name.casefold().endswith(".exe"): + name = name[:-4] + names.add(name) + names.add(target.get("name", "")) + names.discard("") + return {name.casefold(): target["name"] for name in names} + + +def test_owner(command, targets_by_name): + candidates = [command[0]] if command else [] + candidates += [part for part in command[1:] if Path(part).suffix.casefold() == ".exe"] + for part in candidates: + stem = Path(part).stem.casefold() + if stem in targets_by_name: + return targets_by_name[stem] + return None + + +def ctest_resolutions(build_dir, targets_by_name): + result = subprocess.run( + ["ctest", "--test-dir", str(build_dir), "--show-only=json-v1"], + capture_output=True, text=True, check=True) + document = json.loads(result.stdout) + resolutions = {} + 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, 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: + 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(set(selected) - {owner for owner, _ in resolutions.values()}) + if missing: + raise ValueError("no ctest registration resolved for: " + ", ".join(missing)) + 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") + + +def main(argv=None): + parser = argparse.ArgumentParser(description="build and run changed core/libs tests that link guest libc") + parser.add_argument("build_dir", type=Path) + parser.add_argument("changed_paths", nargs="?", type=Path) + args = parser.parse_args(argv) + try: + if args.changed_paths is not None: + listed = {Path(path).as_posix() for path in args.changed_paths.read_text(encoding="utf-8").splitlines() if path} + if not reaches_libs(listed): + print("No changed guest core/libs tests require a run") + return 0 + source_root, targets = host_only.read_reply(args.build_dir.resolve()) + changed_paths = args.changed_paths.read_text(encoding="utf-8").splitlines() if args.changed_paths else None + selected = guest_test_targets(source_root, targets, changed_paths) + if not selected: + print("No guest core/libs test sources changed") + else: + print("Guest core/libs tests:") + print("\n".join(selected)) + by_name = {target.get("name"): target for target in targets.values()} + targets_by_name = {} + for name in selected: + targets_by_name.update(target_artifact_names(by_name[name])) + targets_by_name[name.casefold()] = name + run(args.build_dir, selected, targets_by_name) + except (OSError, KeyError, TypeError, ValueError, json.JSONDecodeError, subprocess.CalledProcessError) as error: + print(f"{parser.prog}: {error}", file=sys.stderr) + return 1 + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tools/build_mingw_host_only_tests.py b/tools/build_mingw_host_only_tests.py index 4f530ed8e2f8..292d62593bb8 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/build_web.py b/tools/build_web.py index 3cd131ae0441..c3390d12103c 100644 --- a/tools/build_web.py +++ b/tools/build_web.py @@ -1,4 +1,5 @@ import argparse +import ast import hashlib import io import json @@ -7,6 +8,7 @@ import sys import re import shutil +import subprocess import tempfile import urllib.request import zipfile @@ -14,10 +16,48 @@ from package_release import WEB_FILES ROOT = Path(__file__).resolve().parent.parent -REQUIRED_WEB_FILES = ("index.html", "app.mjs", "worker.mjs", "native/relinker_wasm.mjs", "native/relinker_wasm.wasm") MAX_EXPANDED_BYTES = 512 * 1024 * 1024 +def release_web_files(revision): + try: + result = subprocess.run( + ["git", "-C", str(ROOT), "show", f"{revision}:tools/package_release.py"], + capture_output=True, + text=True, + encoding="utf-8", + errors="replace", + ) + except OSError as error: + raise ValueError(f"Cannot resolve release revision: {revision}") from error + if result.returncode != 0: + raise ValueError(f"Cannot resolve release revision: {revision}") + try: + tree = ast.parse(result.stdout) + for node in tree.body: + value = None + if isinstance(node, ast.Assign): + for target in node.targets: + if isinstance(target, ast.Name) and target.id == "WEB_FILES": + value = ast.literal_eval(node.value) + break + elif isinstance(node, ast.AnnAssign): + if isinstance(node.target, ast.Name) and node.target.id == "WEB_FILES" and node.value is not None: + value = ast.literal_eval(node.value) + if value is not None: + if (isinstance(value, (tuple, list)) and value + and all(isinstance(item, str) and item and "\\" not in item + and not item.startswith("/") + and not any(part in ("..", ".", "") for part in item.split("/")) + for item in value) + and len(value) == len(set(value))): + return set(value) + raise ValueError(f"Invalid web release definition in revision: {revision}") + except (ValueError, SyntaxError, TypeError) as error: + raise ValueError(f"Invalid web release definition in revision: {revision}") from error + raise ValueError(f"Invalid web release definition in revision: {revision}") + + def copy_sources(output): source = ROOT / "demo/web" for file in source.iterdir(): @@ -69,10 +109,17 @@ def library_assets(release): return assets +def load_release(response): + try: + return json.load(response) + except RecursionError as error: + raise ValueError(f"Invalid release metadata: {error}") from error + + def publish_libraries(output, release=None): if release is None: with request("https://api.github.com/repos/boykopovar/AnyPS5/releases/latest") as response: - release = json.load(response) + release = load_release(response) release = release_metadata(release) tag = release["tag_name"] if not re.fullmatch(r"v[0-9A-Za-z][0-9A-Za-z._-]*", tag): @@ -141,7 +188,7 @@ def publish_libraries(output, release=None): def publish_release(output): with request("https://api.github.com/repos/boykopovar/AnyPS5/releases/latest") as response: - release = json.load(response) + release = load_release(response) release = release_metadata(release) tag = release["tag_name"] if not re.fullmatch(r"v[0-9A-Za-z][0-9A-Za-z._-]*", tag) or tag.endswith("."): @@ -170,20 +217,25 @@ def publish_release(output): staging.mkdir() with zipfile.ZipFile(io.BytesIO(data)) as archive: files = archive.infolist() - names = [file.filename for file in files] - allowed = {*WEB_FILES, "web-release.json"} - if len(set(names)) != len(names) or not allowed.issuperset(names) \ - or not {*REQUIRED_WEB_FILES, "web-release.json"}.issubset(names): - raise ValueError("Invalid web release archive layout") if any(file.flag_bits & 1 for file in files): raise ValueError(f"Encrypted release archive {asset['name']} is not supported") if any(file.file_size == 0 for file in files) or sum(file.file_size for file in files) > 128 * 1024 * 1024: raise ValueError("Invalid expanded web release archive size") - metadata = json.loads(archive.read("web-release.json")) + filenames = {file.filename for file in files} + if len(files) != len(filenames) or "web-release.json" not in filenames: + raise ValueError("Invalid web release archive layout") + try: + metadata = load_release(archive.open("web-release.json")) + except (json.JSONDecodeError, UnicodeDecodeError) as error: + raise ValueError("Invalid web release metadata") from error if (not isinstance(metadata, dict) or metadata.get("tag") != tag or not isinstance(metadata.get("revision"), str) or not re.fullmatch(r"[0-9a-f]{40}", metadata["revision"])): raise ValueError("Web converter does not match the selected release") + expected_files = release_web_files(metadata["revision"]) + expected = {*expected_files, "web-release.json"} + if len(files) != len(expected) or filenames != expected: + raise ValueError("Invalid web release archive layout") for file in files: target = staging / file.filename target.parent.mkdir(parents=True, exist_ok=True) diff --git a/tools/check_compile.py b/tools/check_compile.py index e6d79936c522..ab8c5f92e530 100644 --- a/tools/check_compile.py +++ b/tools/check_compile.py @@ -8,7 +8,7 @@ import sys from concurrent.futures import ThreadPoolExecutor from contextlib import nullcontext -from pathlib import Path +from pathlib import Path, PureWindowsPath CPP = (".cpp", ".cc", ".cxx", ".c") DROP = ("-c", "-MD", "-MMD", "-MP", "-fsyntax-only", "-fno-syntax-only", "-save-temps", "--save-temps", @@ -248,14 +248,43 @@ def preprocessor_arguments(argument): return "-Wp," + ",".join(kept) if kept else None +def launcher_prefix(arguments): + if len(arguments) < 3 or PureWindowsPath(arguments[0]).stem.lower() != "cmake" or arguments[1:3] != ["-E", "env"]: + return [] + index = 3 + while index < len(arguments): + argument = arguments[index] + if argument == "--": + index += 1 + break + if argument == "--modify": + if index + 1 == len(arguments): + raise ValueError("missing operand for cmake -E env --modify") + index += 2 + continue + if argument.startswith("--unset="): + index += 1 + continue + if argument.startswith("-"): + raise ValueError(f"unsupported cmake -E env option {argument}") + if "=" not in argument: + break + index += 1 + if index == len(arguments): + raise ValueError("cmake -E env launcher has no command") + return arguments[:index] + + def syntax_arguments(arguments, directory, source): validate_arguments(arguments) + if prefix := launcher_prefix(arguments): + return [*prefix, *syntax_arguments(arguments[len(prefix):], directory, source)] if any(argument.startswith("@") for argument in arguments[1:]): compiler = Path(arguments[0]).stem.lower() 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 000000000000..c2175732d6d4 --- /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_conventions.py b/tools/check_conventions.py index 9f1e32ac8435..5bfc477171c6 100644 --- a/tools/check_conventions.py +++ b/tools/check_conventions.py @@ -178,6 +178,7 @@ def code(self): for path, lines in self.files(lambda p: p.suffix in CPP): core = path.startswith("core/") and "tests" not in PurePosixPath(path).parts source = self.show(path).split("\n") + expanded = expand_abi_aliases(cpp_text("\n".join(source))).split("\n") masked = cpp_text("\n".join(source), preserve_comments=True).split("\n") assembly = asm_exports("\n".join(source)) if core and path.startswith("core/libs/prx/") else {} constants, starts = None, None @@ -196,6 +197,7 @@ def code(self): self.report("alignment", path, number, alignment) if core and TITLE.search(text): self.report("title-specific", path, number, TITLE.search(text).group(0)) + bare = expanded[number - 1] if core and path.startswith("core/libs/prx/"): unknowns.extend((nid, name, path, number) for nid, name in source_aliases(text) if "unknown" in name.lower()) symbols.extend((symbol, path, number) for symbol in nid_symbols(text)) @@ -232,7 +234,7 @@ def duplicates(self, exports): text = self.show(path) if "APS5_VABI" not in text and "ASM_FUNCTION" not in text: continue - source = cpp_text(text).split("\n") + source = expand_abi_aliases(cpp_text(text)).split("\n") assembly = asm_exports(text) for number, line in enumerate(source): names = [match.group(1) for match in EXPORT.finditer(line) @@ -644,14 +646,50 @@ def cmake_comments(text): return lines -def cpp_text(text, preserve_comments=False): - def mask(match): - if match.group("code") is not None or preserve_comments and match.group("comment") is not None: - return match.group() - blank = re.sub(r"[^\n]", " ", match.group()) - return blank if match.group("comment") is not None else '""' + blank[2:] +def cpp_mask(match, preserve_comments=False): + if match.group("code") is not None or preserve_comments and match.group("comment") is not None: + return match.group() + blank = re.sub(r"[^\n]", " ", match.group()) + return blank if match.group("comment") is not None else '""' + blank[2:] + - return CPP_TOKEN.sub(mask, text) +def cpp_text(text, preserve_comments=False): + return CPP_TOKEN.sub(lambda match: cpp_mask(match, preserve_comments), text) + + +def cpp_pieces(text): + end = 0 + for match in CPP_TOKEN.finditer(text): + yield text[end:match.start()] + yield cpp_mask(match) + end = match.end() + yield text[end:] + + +def expand_abi_aliases(text): + aliases = {} + + def expand(match): + name = match.group() + seen = set() + while name in aliases and name not in seen and name != "APS5_VABI": + seen.add(name) + name = aliases[name] + return "APS5_VABI" if name == "APS5_VABI" else match.group() + + lines = [] + for line in text.split("\n"): + directive = re.match(r"^[\s\ufeff]*#\s*(define|undef)\s+([A-Za-z_]\w*)(.*)$", line) + if directive: + action, name, value = directive.groups() + aliases.pop(name, None) + replacement = re.fullmatch(r"\s+([A-Za-z_]\w*)\s*", value) + if action == "define" and replacement: + aliases[name] = replacement.group(1) + lines.append(line) + else: + lines.append(IDENTIFIER.sub(expand, line) if aliases else line) + return "\n".join(lines) def integer_literal(text): @@ -717,15 +755,19 @@ def over_aligned(text, constants=((), ()), offset=0): def function_body(lines, start): - text = cpp_text("\n".join(lines[start:start + 400])) - brace, semicolon = text.find("{"), text.find(";") - if brace < 0 or 0 <= semicolon < brace: - return None - depth = 0 - for index in range(brace, len(text)): - depth += {"{": 1, "}": -1}.get(text[index], 0) - if depth == 0: - return re.sub(r"\s+", " ", text[brace + 1:index]).replace(" ", "") + body, depth = None, 0 + for piece in cpp_pieces("\n".join(lines[start:start + 400])): + for character in piece: + if body is None: + if character == ";": + return None + if character == "{": + body, depth = [], 1 + continue + depth += {"{": 1, "}": -1}.get(character, 0) + if depth == 0: + return re.sub(r"\s+", " ", "".join(body)).replace(" ", "") + body.append(character) return None diff --git a/tools/check_main_sync.py b/tools/check_main_sync.py index 767b9222cfa5..2f9198c10319 100644 --- a/tools/check_main_sync.py +++ b/tools/check_main_sync.py @@ -1,4 +1,5 @@ import argparse +import json import re import subprocess import sys @@ -109,6 +110,7 @@ def main(argv=None): parser.add_argument("--repo", type=Path, default=Path("."), help="the repository to check (default: the current directory)") parser.add_argument("--fetch", action="store_true", help="fetch the base's remote first") parser.add_argument("--strict", action="store_true", help="also fail when the branch is behind the base") + parser.add_argument("--json", action="store_true", help="write the report as JSON instead of text") args = parser.parse_args(argv) try: def fetch(ref): @@ -131,7 +133,7 @@ def fetch(ref): data = report(args.repo, base, args.head) except (RuntimeError, OSError) as error: parser.error(str(error)) - print(render(data)) + print(json.dumps(data, ensure_ascii=True) if args.json else render(data)) if data["conflicts"] or (args.strict and data["behind"]): return 1 return 0 diff --git a/tools/check_skips.py b/tools/check_skips.py index 01ae7088ab56..026484a0e979 100644 --- a/tools/check_skips.py +++ b/tools/check_skips.py @@ -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 + 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 {case.get('name')!r} is {case.get('status')} and was not run") + raise ValueError(f"{path}: testcase {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") 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 2e692f0ea2df..60042563e176 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 000000000000..97286f709771 --- /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 000000000000..ac16b2f80203 --- /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/configure_seed.py b/tools/configure_seed.py index 4f3d58a053c5..96c95b7d5f48 100644 --- a/tools/configure_seed.py +++ b/tools/configure_seed.py @@ -9,6 +9,8 @@ CHECK = re.compile(r"^//(Have (include|includes|function|symbol|library) |Test |Result of (TRY_COMPILE|TRY_RUN|TEST_BIG_ENDIAN|check_)|CHECK_TYPE_SIZE: )") ENTRY = re.compile(r"^([^#/:][^:]*):([A-Z]+)=(.*)$") +QUOTED_ENTRY = re.compile(r'^"(.*)":([A-Z]+)=(.*)$') +QUOTED_DELIMITER = re.compile(r'":[A-Z]+=') def checks(cache): @@ -17,7 +19,10 @@ def checks(cache): if line.startswith("//"): doc.append(line) continue - match = ENTRY.match(line) + if QUOTED_ENTRY.match(line) and len(QUOTED_DELIMITER.findall(line)) > 1: + match = None + else: + match = QUOTED_ENTRY.match(line) or ENTRY.match(line) if match and match.group(2) == "INTERNAL" and doc and CHECK.match(doc[0]): help_text = "".join("\n" + line[4:] if line.startswith("//\\n") else line[2:] for line in doc) found[match.group(1)] = (match.group(3), help_text) diff --git a/tools/env_reference.py b/tools/env_reference.py index b9a0a8775fbd..a27c2bdb2444 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 @@ 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 9171bfe5d577..5626fb1f755f 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 437b8945ee5e..264f9ee8eddd 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 b14e8b4619af..5de745c30232 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 03c1816db547..23847f97a2c8 100644 --- a/tools/hw-oracle/test_compare_results.py +++ b/tools/hw-oracle/test_compare_results.py @@ -242,6 +242,23 @@ def test_diagnostic_limit_does_not_limit_comparison_or_hide_failure(self): 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 56269a9ae858..4c8b1e238512 100644 --- a/tools/hw-oracle/test_hw_oracle.py +++ b/tools/hw-oracle/test_hw_oracle.py @@ -108,6 +108,20 @@ def test_cli_reports_invalid_input_before_tool_lookup(self): 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 @@ def test_cli_rejects_noninteger_dispatch_sizes_before_oracle_work(self): 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 1c8d50578736..e13045db0a34 100644 --- a/tools/import_audit.py +++ b/tools/import_audit.py @@ -20,6 +20,7 @@ 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} @@ -602,7 +639,7 @@ def conditional_stubs(library): for source in library.rglob("*.cpp"): if "tests" in source.relative_to(library).parts: continue - text = progress.code(source.read_text(errors="ignore")) + text = progress.code(source.read_text(encoding="utf-8", errors="ignore")) calls = always_stub_calls(text) for match in progress.DEFINITION.finditer(text): body = text[match.end() - 1:progress.body_end(text, match.end() - 1) + 1] @@ -797,8 +834,10 @@ def available(name): 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 05bbce0c3629..90663d03ff4c 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 63a962e2ea18..eb94510a32e0 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 4748a064e2ff..94308a283095 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 fe476f10f5b2..42e574ce5d38 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']} + {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'] + 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'].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 e1749a61e805..cfb03da00844 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 000000000000..475a318ce1ca --- /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 8c34cceb70ee..b72a270e2315 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'].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); @@ -83,20 +83,35 @@ test('wheel directions only map to pad buttons', () => { }); test('new utility actions import and round trip without accepting unsupported sources', () => { - const source = 'StickModifier = MOUSE:X2\nShake = MOUSE:Left\nTogglePerformanceOverlay = KEY:F9\nScreenshot = KEY:F8\n'; + const source = 'StickModifier = MOUSE:X2\nShake = MOUSE:Left\nTogglePerformanceOverlay = KEY:F9\nScreenshot = KEY:F8\nShowPadStatus = KEY:F4\n'; const imported = parseIni(source); assert.deepEqual(imported.errors, []); assert.equal(serialize(imported.entries), source); - for (const action of ['StickModifier', 'Shake', 'TogglePerformanceOverlay', 'Screenshot']) { + for (const action of ['StickModifier', 'Shake', 'TogglePerformanceOverlay', 'Screenshot', 'ShowPadStatus']) { assert.ok(validate([binding(action, 'WHEEL', 'Up')]).errors.length); } - for (const action of ['TogglePerformanceOverlay', 'Screenshot']) { + for (const action of ['TogglePerformanceOverlay', 'Screenshot', 'ShowPadStatus']) { assert.deepEqual(parseIni(`${action} = MOUSE:Left`).errors.map(error => error.line), [1]); } }); +test('ShowPadStatus is a keyboard-only action with an F9 default that conflicts like any built-in', () => { + assert.deepEqual(defaults.ShowPadStatus, ['KEY:F9']); + assert.deepEqual(typesForAction('ShowPadStatus'), ['KEY']); + assert.equal(serialize([binding('ShowPadStatus', 'KEY', 'F4')]), 'ShowPadStatus = KEY:F4\n'); + assert.equal(serialize([binding(' showpadstatus ', 'key', 'f9')]), 'ShowPadStatus = KEY:F9\n'); + for (const [type, value] of [['MOUSE', 'Left'], ['MOUSE', 'X2'], ['WHEEL', 'Up'], ['WHEEL', 'Down']]) { + assert.ok(validate([binding('ShowPadStatus', type, value)]).errors.length, `${type}:${value}`); + } + assert.equal(validate([binding('ShowPadStatus', 'KEY', 'F4')]).warnings.length, 0); + const shared = validate([binding('TogglePerformanceOverlay', 'KEY', 'F9')]); + assert.ok(shared.warnings.some(warning => warning.message.includes('TogglePerformanceOverlay and ShowPadStatus (built-in)'))); + assert.equal(validate([binding('TogglePerformanceOverlay', 'KEY', 'F9'), binding('ShowPadStatus', 'KEY', 'F4')]).warnings.length, 0); + assert.ok(Object.values(defaults).flat().filter(source => source === 'KEY:F9').length === 1); +}); + test('updated built-in inputs warn until their owning action is overridden', () => { - for (const [action, type, value] of [['L2', 'KEY', 'R'], ['L2', 'MOUSE', 'X1'], ['ToggleMouse', 'KEY', 'F7'], ['Shake', 'KEY', 'X'], ['Screenshot', 'KEY', 'F12'], ['TogglePerformanceOverlay', 'KEY', 'F10']]) { + for (const [action, type, value] of [['L2', 'KEY', 'R'], ['L2', 'MOUSE', 'X1'], ['ToggleMouse', 'KEY', 'F7'], ['Shake', 'KEY', 'X'], ['Screenshot', 'KEY', 'F12'], ['TogglePerformanceOverlay', 'KEY', 'F10'], ['ShowPadStatus', 'KEY', 'F9']]) { const input = binding('Cross', type, value); assert.ok(validate([input]).warnings.some(warning => warning.message.includes(`${action} (built-in)`))); assert.equal(validate([input, binding(action, 'KEY', 'J')]).warnings.length, 0); @@ -147,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 3c3639f7a94f..e1c5dce28a42 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 000000000000..667040951d1b --- /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 658b223f8fce..a6d7feff1290 100644 --- a/tools/nid_names.py +++ b/tools/nid_names.py @@ -7,6 +7,7 @@ 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 @@ "/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 @@ 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 new file mode 100644 index 000000000000..b22e6fa937f4 --- /dev/null +++ b/tools/package_headers.py @@ -0,0 +1,107 @@ +import os +from pathlib import Path, PurePosixPath +import re +import stat +import tarfile +import tempfile +import zipfile + +from nid_names import CPP_TOKEN + + +SYSTEM_HEADERS = frozenset("""algorithm any array atomic barrier bit bitset cassert ccomplex cctype cerrno cfenv cfloat charconv chrono +cinttypes ciso646 climits clocale cmath codecvt compare complex concepts condition_variable coroutine +csetjmp csignal cstdalign cstdarg cstdbool cstddef cstdint cstdio cstdlib cstring ctgmath ctime cuchar cwchar cwctype +deque exception execution filesystem format forward_list fstream functional future initializer_list iomanip +ios iosfwd iostream istream iterator latch limits list locale map memory memory_resource mutex new numbers +numeric optional ostream queue random ranges ratio regex scoped_allocator semaphore set shared_mutex source_location +span sstream stack stdexcept stop_token streambuf string string_view strstream syncstream system_error thread tuple +type_traits typeindex typeinfo unordered_map unordered_set utility valarray variant vector version +assert.h complex.h ctype.h errno.h fenv.h float.h inttypes.h iso646.h limits.h locale.h math.h setjmp.h signal.h +stdalign.h stdarg.h stdatomic.h stdbool.h stddef.h stdint.h stdio.h stdlib.h stdnoreturn.h string.h tgmath.h +threads.h time.h uchar.h wchar.h wctype.h +cxxabi.h dispatch/dispatch.h io.h link.h semaphore.h stdio_ext.h sys/uio.h unistd.h xmmintrin.h +""".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 = 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 = 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: + continue + if not header.is_file(): + raise RuntimeError(f"Missing public header: {header}") + visited.add(header) + text = header.read_text(encoding="utf-8").replace("\\\n", "").replace("\\\r\n", "") + text = CPP_TOKEN.sub(lambda match: re.sub(r"[^\n]", " ", match.group()) if match.group("comment") or match.group("raw") else match.group(), text) + for line in re.findall(r"^[ \t]*#[ \t]*include\b([^\n]*)", text, re.M): + match = re.fullmatch(r'\s*(?:"([^"\n]+)"|<([^>\n]+)>)\s*', line) + if not match: + raise RuntimeError(f"Non-literal public include in {header}: {line.strip()}") + quoted, angled = match.groups() + 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}") + 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: + pending.append(candidates.pop()) + elif quoted or name not in SYSTEM_HEADERS: + raise RuntimeError(f"Missing project or unsupported external include in {header}: {name}") + return sorted(visited) + + +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 = 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: + raise RuntimeError("Missing project license") + entries = [(path, "include/anyps5/" + path.relative_to(libs).as_posix()) for path in headers] + entries.append((license_file, "LICENSE")) + names = [f"prx-headers-{version}.zip", f"prx-headers-{version}.tar.gz"] + for name in names: + path = output / name + if path.exists() and not path.is_file(): + raise RuntimeError(f"Release destination is not a file: {path}") + if os.name == "nt" and os.path.lexists(path): + attributes = path.lstat().st_file_attributes + if attributes & (stat.FILE_ATTRIBUTE_DIRECTORY | stat.FILE_ATTRIBUTE_READONLY): + raise RuntimeError(f"Release destination is a directory or read-only: {path}") + output.mkdir(parents=True, exist_ok=True) + with tempfile.TemporaryDirectory(prefix=".headers-", dir=output) as temporary: + staging = Path(temporary) + with zipfile.ZipFile(staging / names[0], "w", compression=zipfile.ZIP_DEFLATED, compresslevel=9, strict_timestamps=False) as archive: + for source, destination in entries: + archive.write(source, destination) + with tarfile.open(staging / names[1], "w:gz", dereference=True) as archive: + for source, destination in entries: + archive.add(source, destination) + for name in names: + (staging / name).replace(output / name) + print(f"Packaged {len(headers)} public headers and recursive dependencies") diff --git a/tools/package_release.py b/tools/package_release.py index bb261f549ca3..4a39a4b7c7fb 100644 --- a/tools/package_release.py +++ b/tools/package_release.py @@ -10,11 +10,28 @@ import zipfile from pathlib import Path +import package_headers + ROOT = Path(__file__).resolve().parent.parent WEB_FILES = ("index.html", "app.css", "app.mjs", "archive.mjs", "batch.mjs", "failure-report.mjs", "output-directory.mjs", "worker.mjs", "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(): @@ -66,12 +83,33 @@ def package(platform, build, output, version): files.extend(runtime / name for name in ("libgcc_s_seh-1.dll", "libstdc++-6.dll", "libwinpthread-1.dll")) files.extend(build / "core/libs/libs" / name for name in ("mimalloc.dll", "mimalloc-redirect.dll")) files.extend(tracy_runtime(platform, build)) + unpatched = [(build / "core/libs/libs/unpatched" / name, "libs/" + name) for name in sorted(expected)] + unpatched.extend((file, "libs/" + file.name) for file in files if file.suffix != ".prx") + if platform == "windows": + manifest = build / "core/libs/release-implibs.txt" + imports = {} + directory = (build / "core/libs/libs/implib").resolve() + for line in manifest.read_text(encoding="utf-8").splitlines(): + name, separator, value = line.partition("=") + if not separator or not value or name in imports: + raise RuntimeError(f"Invalid import library manifest: {manifest}") + path = Path(value) + if not path.is_absolute() or path.resolve().parent != directory or path.suffix != ".a": + raise RuntimeError(f"Invalid import library path: {value}") + imports[name] = path + if set(imports) != {Path(name).stem for name in expected} or len({path.name for path in imports.values()}) != len(imports): + raise RuntimeError("Import library manifest does not match release libraries") + unpatched.extend((imports[name], "libs/implib/" + imports[name].name) for name in sorted(imports)) binary = build / "core/relinker" / executable - for file in [*files, binary, *(source for source, _ in licenses)]: + for file in [*files, binary, *(source for source, _ in licenses), *(source for source, _ in unpatched)]: if not file.is_file() or file.stat().st_size == 0: raise RuntimeError(f"Missing or empty release file: {file}") asset = f"relinker-{version}.exe" if platform == "windows" else f"relinker-{version}" - names = (f"prx-{platform}-{version}.zip", f"prx-{platform}-{version}.tar.gz", asset) + archives = { + f"prx-{platform}-{version}": [(file, "libs/" + file.name) for file in files], + f"prx-{platform}-unpatched-{version}": unpatched, + } + names = [stem + suffix for stem in archives for suffix in (".zip", ".tar.gz")] + [asset] for name in names: destination = output / name if destination.exists() and not destination.is_file(): @@ -85,16 +123,13 @@ def package(platform, build, output, version): output.mkdir(parents=True, exist_ok=True) with tempfile.TemporaryDirectory(prefix=".release-", dir=output) as temporary: staging = Path(temporary) - with zipfile.ZipFile(staging / f"prx-{platform}-{version}.zip", "w", compression=zipfile.ZIP_DEFLATED, compresslevel=9, strict_timestamps=False) as archive: - for file in files: - archive.write(file, arcname=f"libs/{file.name}") - for source, destination in licenses: - archive.write(source, arcname=destination) - with tarfile.open(staging / f"prx-{platform}-{version}.tar.gz", "w:gz", compresslevel=9, dereference=True) as archive: - for file in files: - archive.add(file, arcname=f"libs/{file.name}") - for source, destination in licenses: - archive.add(source, arcname=destination) + for stem, entries in archives.items(): + with zipfile.ZipFile(staging / (stem + ".zip"), "w", compression=zipfile.ZIP_DEFLATED, compresslevel=9, strict_timestamps=False) as archive: + for source, destination in entries + licenses: + archive.write(source, arcname=destination) + with tarfile.open(staging / (stem + ".tar.gz"), "w:gz", compresslevel=9, dereference=True) as archive: + for source, destination in entries + licenses: + archive.add(source, arcname=destination) shutil.copy2(binary, staging / asset) for file in sorted(staging.iterdir()): file.replace(output / file.name) @@ -150,7 +185,7 @@ def main(argv=None): if hasattr(sys.stderr, "reconfigure"): sys.stderr.reconfigure(encoding="utf-8", errors="backslashreplace") parser = argparse.ArgumentParser() - parser.add_argument("--platform", choices=("linux", "windows", "web")) + parser.add_argument("--platform", choices=("linux", "windows", "web", "headers")) parser.add_argument("--build", type=Path) parser.add_argument("--version") parser.add_argument("--revision") @@ -158,21 +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, 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/pad_timeline.py b/tools/pad_timeline.py index 8dc998b110b9..97197fd67cac 100644 --- a/tools/pad_timeline.py +++ b/tools/pad_timeline.py @@ -95,7 +95,7 @@ def main(): document = json.loads(args.timeline.read_text(encoding="utf-8")) text = compile_timeline(document, next_sequence(args.path), args.repeat, args.gap_ms) queue_timeline(args.path, text) - except (OSError, ValueError) as error: + except (OSError, ValueError, RecursionError) as error: parser.exit(2, f"pad_timeline: {error}\n") print(f"Queued {len(text.splitlines()) - 1} timed events in {args.path}") diff --git a/tools/pe_symbol_inventory.py b/tools/pe_symbol_inventory.py new file mode 100644 index 000000000000..f7c78d47b974 --- /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 99a92b64f575..f35b31246e0f 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 ef4016296ec9..3e079a5827f5 100644 --- a/tools/performance_csv.py +++ b/tools/performance_csv.py @@ -7,6 +7,14 @@ 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_labels.py b/tools/pr_labels.py index fe70f0d77c74..380f3948e7b9 100644 --- a/tools/pr_labels.py +++ b/tools/pr_labels.py @@ -96,6 +96,17 @@ def decode_pages(out): def pull(data): + if not isinstance(data, dict): + raise ValueError("pull request must be an object") + if type(data.get("number")) is not int or data["number"] <= 0: + raise ValueError("pull request number must be a positive integer") + if not isinstance(data.get("title"), str) or data.get("state") not in ("open", "closed"): + raise ValueError("pull request needs a string title and an open or closed state") + if "body" not in data or (data["body"] is not None and not isinstance(data["body"], str)): + raise ValueError("pull request body must be a string or null") + labels = data.get("labels") + if not isinstance(labels, list) or any(not isinstance(label, dict) or not isinstance(label.get("name"), str) for label in labels): + raise ValueError("pull request labels must be objects with string names") return {"number": data["number"], "title": data["title"], "body": data["body"] or "", "labels": [label["name"] for label in data["labels"]], "state": data["state"]} diff --git a/tools/pr_overlap.py b/tools/pr_overlap.py index e6771c883119..e7c624df1da2 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 f835789d3bda..a1b4ab6a8cc1 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(): @@ -473,6 +474,12 @@ def library_progress(group): return f'{group["done"]}/{total} ({percent:.2f}%)', percent +def percent_change(old_percent, new_percent): + if old_percent is None or new_percent is None: + return "n/a" + return f'{round(new_percent - old_percent, 2) or 0:+.2f}%' + + def library_report(base, head): before, after = ({group["name"]: group for group in data["groups"]} for data in (base, head)) fields = ("done", "todo", "done_names", "todo_names", "shared_sources") @@ -483,14 +490,12 @@ def library_report(base, head): continue old_text, old_percent = library_progress(old) new_text, new_percent = library_progress(new) - delta = "n/a" - if old_percent is not None and new_percent is not None: - change = round(new_percent - old_percent, 2) - delta = f'{change or 0:+.2f} pp' + delta = percent_change(old_percent, new_percent) + if delta == "+0.00%": exact = exact_delta({"done": old["done"], "total": old["done"] + old["todo"]}, - {"done": new["done"], "total": new["done"] + new["todo"]}) if change == 0 else None + {"done": new["done"], "total": new["done"] + new["todo"]}) if exact: - delta = f"{small_delta(exact)} pp" + delta = f"{small_delta(exact)}%" rows.append(f"| {name} | {old_text} | {new_text} | {delta} |") if not rows: return [] @@ -589,7 +594,7 @@ def main(argv=None): for path in args.compare: try: snapshots.append(json.loads(path.read_text(encoding="utf-8-sig"))) - except (OSError, ValueError) as error: + except (OSError, ValueError, RecursionError) as error: parser.error(f"{path}: {error}") for path, snapshot in zip(args.compare, snapshots): try: diff --git a/tools/public_headers_manifest.py b/tools/public_headers_manifest.py new file mode 100644 index 000000000000..c81070c2ae34 --- /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/run_job_manager_reference.py b/tools/run_job_manager_reference.py index 594b5f6a3d82..f41e5470c273 100644 --- a/tools/run_job_manager_reference.py +++ b/tools/run_job_manager_reference.py @@ -20,6 +20,28 @@ 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: @@ -77,7 +99,7 @@ def run(args, directory): output.chmod(output.stat().st_mode | 0o111) dependencies = set(read_host_imports(helper)) | {"libc.prx"} for registry in directory.glob("*.registry.json"): - dependencies.update(entry["library"] for entry in json.loads(registry.read_text()) + dependencies.update(entry["library"] for entry in json.loads(registry.read_text(encoding="utf-8")) if entry.get("library") not in ("jobref.prx", "libSceJobManager.prx")) if args.host: dependencies.add("libSceJobManager.prx") @@ -107,7 +129,7 @@ def run(args, directory): summary = {"provider": "host" if args.host else "guest", "module_sha256": module_hash, "selection": getattr(args, "suite", None) or "custom", "excluded_cases": [case for case in CASES if case not in args.cases], "cases": results} - (directory / "results.json").write_text(json.dumps(summary, indent=2) + "\n") + (directory / "results.json").write_text(json.dumps(summary, indent=2) + "\n", encoding="utf-8") return 0 if all(result["status"] == "passed" for result in results) else 1 @@ -138,13 +160,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/sanitizer_report.py b/tools/sanitizer_report.py index 745e639803cb..05499a247c2d 100644 --- a/tools/sanitizer_report.py +++ b/tools/sanitizer_report.py @@ -133,7 +133,7 @@ def main(argv=None): if args.summary: with args.summary.open("a", encoding="utf-8") as summary: summary.write(text) - except (OSError, ET.ParseError, ValueError) as error: + except (OSError, ET.ParseError, ValueError, RuntimeError) as error: print(f"sanitizer_report: {error}", file=sys.stderr) return 2 sys.stdout.write(text) diff --git a/tools/select_tests.py b/tools/select_tests.py index 55db68db2cff..e9dcde1b50c0 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 8558fa9c1360..2bcd5b3d8333 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 @@ 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 811d77d5e533..73534b8c810d 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 @@ 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). @@ -75,11 +77,18 @@ def offset(self, rva): def coff_symbols(self, data, table, count): strings = table + count * 18 + if strings > len(data) - 4: + raise ValueError("COFF string table header is outside the file") + size = struct.unpack_from("<I", data, strings)[0] + if size < 4 or size > len(data) - strings: + raise ValueError("COFF string table size is outside the file") result = [] index = 0 while index < count: entry = table + index * 18 name, value, section, kind, storage, aux = struct.unpack_from("<8sIhHBB", data, entry) + if aux > count - index - 1: + raise ValueError("COFF auxiliary records exceed the symbol count") index += 1 + aux if storage not in (IMAGE_SYM_CLASS_EXTERNAL, IMAGE_SYM_CLASS_STATIC) or not 1 <= section <= len(self.sections): continue @@ -89,8 +98,13 @@ def coff_symbols(self, data, table, count): if storage == IMAGE_SYM_CLASS_STATIC and (kind >> 4) != 2 and value == 0: continue if name[:4] == b"\0\0\0\0": - at = strings + struct.unpack_from("<I", name, 4)[0] - end = data.index(b"\0", at) + offset = struct.unpack_from("<I", name, 4)[0] + if not 4 <= offset < size: + raise ValueError("COFF string table name offset is out of range") + at = strings + offset + end = data.find(b"\0", at, strings + size) + if end < 0: + raise ValueError("COFF string table name is unterminated") text = data[at:end] else: text = name.rstrip(b"\0") @@ -99,7 +113,7 @@ def coff_symbols(self, data, table, count): 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: @@ -107,6 +121,8 @@ def export_symbols(self, data, rva, size): 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 @@ -129,7 +145,7 @@ def __init__(self, libs, headers, demangle=False, warn=print, unverified=False): 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 = {} @@ -140,7 +156,7 @@ def candidate_path(self, name): 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 @@ -165,17 +181,21 @@ def module(self, name): 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 @@ -212,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 @@ -296,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)") @@ -318,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: @@ -334,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 73b2b35e5b26..5c7b1553b32d 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_ab_split.py b/tools/tests/test_ab_split.py index 576c2ca92fae..c29d28e35044 100644 --- a/tools/tests/test_ab_split.py +++ b/tools/tests/test_ab_split.py @@ -62,6 +62,40 @@ def log(): class AbSplitTests(unittest.TestCase): + def test_concatenated_runs_cannot_mix_phase_statistics(self): + lines = log() + log() + with self.assertRaisesRegex(ValueError, "multiple A/B runs"): + ab_split.split(lines) + with tempfile.TemporaryDirectory() as directory: + path = Path(directory) / "mixed.log" + path.write_text("".join(lines), encoding="utf-8") + result = subprocess.run([sys.executable, str(Path(ab_split.__file__)), str(path), "--json"], + capture_output=True, text=True, timeout=5) + self.assertEqual(result.returncode, 2) + self.assertEqual(result.stdout, "") + self.assertIn("multiple A/B runs", result.stderr) + self.assertNotIn("Traceback", result.stderr) + + def test_concatenated_runs_without_a_second_header_are_refused(self): + lines = log() + [line for line in log() if not line.startswith("[ab] in-run A/B:")] + with self.assertRaisesRegex(ValueError, "phase index restarts"): + ab_split.split(lines) + with tempfile.TemporaryDirectory() as directory: + path = Path(directory) / "headerless.log" + path.write_text("".join(lines), encoding="utf-8") + result = subprocess.run([sys.executable, str(Path(ab_split.__file__)), str(path), "--json"], + capture_output=True, text=True, timeout=5) + self.assertEqual(result.returncode, 2) + self.assertEqual(result.stdout, "") + self.assertIn("phase index restarts", result.stderr) + self.assertNotIn("Traceback", result.stderr) + + def test_partial_capture_starting_at_a_later_phase_is_accepted(self): + lines = [line for line in log() if not line.startswith("[ab] in-run A/B:")] + start = next(i for i, line in enumerate(lines) if line.startswith("[ab] phase B 1 begins")) + result = ab_split.split(lines[start:]) + self.assertEqual([phase["index"] for phase in result["phases"]], [1, 2, 3]) + def test_settled_phase_requires_matching_kind_and_index(self): lines = [ "[ab] phase A 0 begins at present 100 (t 10.000 s)\n", diff --git a/tools/tests/test_agc_test_split.py b/tools/tests/test_agc_test_split.py new file mode 100644 index 000000000000..2ca20691ce00 --- /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 98354f6179db..ff5dad96539f 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,42 @@ 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): + data = build_module(values={tag: DATA_ADDRESS + 0x800}) + with self.assertRaisesRegex(annotate_module.ModuleError, "PT_LOAD"): + module = annotate_module.Module(data) + module.imports() + + def test_an_exact_load_boundary_is_readable(self): + data = build_module(values={23: DATA_ADDRESS + 0x7F8}) + data = with_relocation(data, 0x27F8, 0, SLOT, 1, 7) + module = annotate_module.Module(data) + self.assertEqual(module.imports(), {SLOT: symbol_name(IMPORT_NAME)}) + + def test_contiguous_load_segments_can_cover_one_table_without_a_gap(self): + for gap in (0, 1): + with self.subTest(gap=gap): + data = bytearray(build_module()) + struct.pack_into("<H", data, 0x38, 4) + struct.pack_into("<QQ", data, 64 + 56 + 32, 0x110, 0x110) + struct.pack_into("<IIQQQQQQ", data, 64 + 3 * 56, 1, 6, 0x2110 + gap, + DATA_ADDRESS + 0x110 + gap, 0, 0x700 - gap, 0x700 - gap, 1) + if gap: + with self.assertRaisesRegex(annotate_module.ModuleError, "PT_LOAD"): + annotate_module.Module(bytes(data)) + else: + self.assertEqual(annotate_module.Module(bytes(data)).imports(), {SLOT: symbol_name(IMPORT_NAME)}) + def test_none_relocations_do_not_read_the_symbol_or_add_a_slot(self): for table in (0x2200, 0x2280): for symbol_index in (0, 1, 0xFFFFFFFF): @@ -233,6 +269,45 @@ def test_prefixed_stub_is_recognised(self): 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) @@ -260,17 +335,143 @@ def test_tls_symbol_is_listed_but_not_an_address(self): 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)) self.assertEqual("0x0 %s %s\n" % (symbol_name(EXPORT_NAME), EXPORT_NAME), self.read(".exports.txt")) + def test_export_aliases_are_named_and_counted(self): + symbols = DEFAULT_SYMBOLS + [(SECOND_IMPORT_NAME, 1, 0x12, EXPORT_ADDRESS)] + for kind in ("sysv", "gnu"): + with self.subTest(kind=kind): + tags = DEFAULT_TAGS if kind == "sysv" else (GNU_HASH,) + DEFAULT_TAGS[1:] + summary = self.annotate(build_module(symbols=symbols, tags=tags, kind=kind)) + self.assertIn("1 imports, 2 exports, 0 tls, 1 stubs", summary) + expected = ["%#x %s %s" % (EXPORT_ADDRESS, symbol_name(name), name) + for name in (EXPORT_NAME, SECOND_IMPORT_NAME)] + self.assertEqual(self.read(".exports.txt").splitlines(), expected) + listing = self.read(".asm").splitlines() + header = listing.index("; ===== export " + EXPORT_NAME) + self.assertEqual(listing[header + 1], "; ===== export " + SECOND_IMPORT_NAME) + self.assertEqual(listing[header + 2], instruction(listing, "ret")) + + def test_export_aliases_without_names_keep_each_nid(self): + symbols = DEFAULT_SYMBOLS + [(SECOND_IMPORT_NAME, 1, 0x12, EXPORT_ADDRESS)] + self.run_tool(build_module(symbols=symbols), "--no-names") + for name in (EXPORT_NAME, SECOND_IMPORT_NAME): + self.assertIn("%#x %s %s\n" % (EXPORT_ADDRESS, symbol_name(name), nid(name)), self.read(".exports.txt")) + self.assertIn("; ===== export " + nid(name), self.read(".asm")) + + def test_tls_aliases_share_an_offset_without_becoming_code_labels(self): + symbols = DEFAULT_SYMBOLS + [(TLS_NAME, 1, 0x16, EXPORT_ADDRESS), (SECOND_IMPORT_NAME, 1, 0x16, EXPORT_ADDRESS)] + summary = self.annotate(build_module(symbols=symbols)) + self.assertIn("1 exports, 2 tls", summary) + expected = ["%#x %s %s" % (EXPORT_ADDRESS, symbol_name(EXPORT_NAME), EXPORT_NAME)] + expected += ["tls+%#x %s %s" % (EXPORT_ADDRESS, symbol_name(name), name) + for name in (TLS_NAME, SECOND_IMPORT_NAME)] + self.assertEqual(self.read(".exports.txt").splitlines(), expected) + for name in (TLS_NAME, SECOND_IMPORT_NAME): + self.assertNotIn("export " + name, self.read(".asm")) + + def test_export_aliases_at_zero_are_sorted_before_other_addresses(self): + symbols = DEFAULT_SYMBOLS + [(SECOND_IMPORT_NAME, 1, 0x12, 0), (TLS_NAME, 1, 0x12, 0)] + summary = self.annotate(build_module(symbols=symbols)) + self.assertIn("1 imports, 3 exports, 0 tls", summary) + expected = ["0x0 %s %s" % (symbol_name(name), name) for name in (SECOND_IMPORT_NAME, TLS_NAME)] + expected.append("%#x %s %s" % (EXPORT_ADDRESS, symbol_name(EXPORT_NAME), EXPORT_NAME)) + self.assertEqual(self.read(".exports.txt").splitlines(), expected) + def test_every_executable_segment_is_disassembled(self): self.annotate(build_module(extra_code=b"\xc3")) 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" + address = CODE_ADDRESS + 9 + symbols = [(EXPORT_NAME, 1, 0x12, address)] + self.annotate(build_module(code=code, symbols=symbols, relocations=())) + listing = self.read(".asm").splitlines() + addresses = [int(match.group(1), 16) for line in listing + if (match := annotate_module.LINE_ADDRESS.match(line))] + self.assertEqual(addresses, [CODE_ADDRESS] + list(range(CODE_ADDRESS + 1, CODE_ADDRESS + 17, 2)) + [CODE_ADDRESS + 17]) + header = listing.index("; ===== export " + EXPORT_NAME) + self.assertRegex(listing[header + 1], r"^\s*1009:\s+add\s") + self.assertIn("%#x %s %s\n" % (address, symbol_name(EXPORT_NAME), EXPORT_NAME), self.read(".exports.txt")) + + def test_all_zero_executable_segment_is_disassembled(self): + symbols = [(EXPORT_NAME, 1, 0x12, 0x3008)] + self.annotate(build_module(code=b"\xc3", extra_code=bytes(16), symbols=symbols, relocations=())) + listing = self.read(".asm").splitlines() + addresses = [int(match.group(1), 16) for line in listing + if (match := annotate_module.LINE_ADDRESS.match(line))] + self.assertEqual(addresses, [CODE_ADDRESS] + list(range(0x3000, 0x3010, 2))) + header = listing.index("; ===== export " + EXPORT_NAME) + self.assertRegex(listing[header + 1], r"^\s*3008:\s+add\s") def test_missing_hash_fails(self): self.assert_fails(build_module(tags=(5, 6, 10, 11, 23, 2, 20)), "neither DT_HASH nor DT_GNU_HASH") diff --git a/tools/tests/test_audit_dump.py b/tools/tests/test_audit_dump.py index 0756aeca7fa2..948ec9a10d85 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 @@ def run_main(self, *arguments): 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 @@ def test_a_reused_work_directory_does_not_audit_registries_left_by_an_earlier_ru (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 @@ def rmtree(path, ignore_errors=False, **kwargs): 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 @@ def test_a_generated_directory_that_survives_removal_stops_before_conversion(sel 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 @@ def test_symbolic_link_loops_are_usage_errors_before_input_is_removed(self): 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() @@ -400,6 +505,31 @@ def test_a_relinker_failure_returns_2_with_its_message(self): self.assertIn("bad input", errors) audit.assert_not_called() + def test_relinker_launch_errors_return_2_without_auditing(self): + for error in (PermissionError(13, "Permission denied", str(self.relinker)), + FileNotFoundError(2, "No such file or directory", str(self.relinker))): + with self.subTest(error=type(error).__name__): + with mock.patch.object(subprocess, "run", side_effect=error), 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("cannot run relinker", errors) + self.assertIn(str(self.relinker.resolve()), errors) + self.assertIn(error.strerror, errors) + audit.assert_not_called() + self.assertEqual((self.dump / "eboot.bin").read_bytes(), SELF) + + def test_an_invalid_relinker_executable_is_reported_without_a_traceback(self): + (self.dump / "eboot.bin").write_bytes(ELF) + result = subprocess.run([sys.executable, audit_dump.__file__, str(self.dump), + "--relinker", str(self.relinker), "--libs", str(self.root / "missing-libs")], + capture_output=True, text=True, encoding="utf-8", + env=dict(os.environ, PYTHONIOENCODING="utf-8")) + self.assertEqual(result.returncode, 2, result.stdout + result.stderr) + self.assertIn("cannot run relinker", result.stderr) + self.assertIn(str(self.relinker.resolve()), result.stderr) + self.assertNotIn("Traceback", result.stderr) + self.assertEqual((self.dump / "eboot.bin").read_bytes(), ELF) + def test_a_dump_without_eboot_or_a_missing_relinker_is_an_argument_error(self): (self.dump / "eboot.bin").unlink() with self.assertRaises(SystemExit): diff --git a/tools/tests/test_audit_nid_names.py b/tools/tests/test_audit_nid_names.py new file mode 100644 index 000000000000..27a4ddb8155d --- /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 new file mode 100644 index 000000000000..980644bef046 --- /dev/null +++ b/tools/tests/test_build_changed_guest_tests.py @@ -0,0 +1,291 @@ +import contextlib +import io +import json +from pathlib import Path +import subprocess +import sys +import tempfile +import unittest +from unittest import mock + +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) +import build_changed_guest_tests + + +def run_result(stdout=""): + return mock.Mock(returncode=0, stdout=stdout, stderr="") + + +class GuestTestTargets(unittest.TestCase): + def target(self, name, target_type="EXECUTABLE", source="core/libs/tests/Guest.cpp", fragment=""): + return { + "artifacts": [{"path": f"tests/{name}.exe"}], + "id": name, + "link": {"commandFragments": [{"fragment": fragment}] if fragment else []}, + "name": name, + "paths": {"build": "core/libs", "source": "core/libs"}, + "sources": [{"path": source}], + "type": target_type, + } + + def fixture(self, targets): + directory = Path(self.temporary.name) + reply = directory / "build" / ".cmake" / "api" / "v1" / "reply" + reply.mkdir(parents=True) + entries = [] + for target in targets: + filename = f"target-{target['name']}.json" + (reply / filename).write_text(json.dumps(target), encoding="utf-8") + entries.append({"id": target["id"], "jsonFile": filename, "name": target["name"]}) + model = {"configurations": [{"targets": entries}], "paths": {"source": str(directory)}} + (reply / "codemodel.json").write_text(json.dumps(model), encoding="utf-8") + index = {"reply": {"codemodel-v2": {"jsonFile": "codemodel.json"}}} + (reply / "index-0001.json").write_text(json.dumps(index), encoding="utf-8") + return directory / "build" + + def setUp(self): + self.temporary = tempfile.TemporaryDirectory() + + def tearDown(self): + self.temporary.cleanup() + + def selections(self, build, changed): + source_root, targets = build_changed_guest_tests.host_only.read_reply(build.resolve()) + return build_changed_guest_tests.guest_test_targets(source_root, targets, changed) + + def test_selects_core_libs_test_executables_with_guest_libc(self): + guest = self.target("guest_pad_tests", fragment="libc.prx") + host = self.target("host_tests") + 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") + self.assertEqual(self.selections(self.fixture([guest_a, guest_b]), ["core/libs/tests/GuestB.cpp"]), ["guest_b_tests"]) + + def test_a_production_source_change_selects_no_test_but_reaches_the_run(self): + guest = self.target("guest_pad_tests", source="core/libs/tests/Guest.cpp", fragment="libc.prx") + self.assertEqual(self.selections(self.fixture([guest]), ["core/libs/prx/libc/src/FloatBuiltins.cpp"]), []) + + def test_a_header_change_selects_every_guest_test(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") + self.assertEqual(self.selections(self.fixture([guest_a, guest_b]), ["core/libs/prx/libScePad/include/Pad.hpp"]), ["guest_a_tests", "guest_b_tests"]) + + def test_an_unrelated_change_selects_nothing(self): + guest = self.target("guest_pad_tests", source="core/libs/tests/Guest.cpp", fragment="libc.prx") + self.assertEqual(self.selections(self.fixture([guest]), ["core/relinker/codegen/src/Amd64OnlyConverter.cpp"]), []) + + +class OwnerResolution(unittest.TestCase): + def test_resolves_the_executable_not_a_test_argument(self): + owner = build_changed_guest_tests.test_owner( + ["C:/b/tests/guest_np_common_tests.exe", "build"], {"guest_np_common_tests": "guest_np_common_tests"}) + self.assertEqual(owner, "guest_np_common_tests") + + def test_argumentless_registration_resolves(self): + owner = build_changed_guest_tests.test_owner( + ["C:/b/tests/guest_pad_tests.exe"], {"guest_pad_tests": "guest_pad_tests"}) + self.assertEqual(owner, "guest_pad_tests") + + def test_an_argument_that_merely_looks_like_a_target_does_not_own_the_test(self): + owner = build_changed_guest_tests.test_owner( + ["C:/b/tests/other_tests.exe", "guest_pad_tests"], {"guest_pad_tests": "guest_pad_tests"}) + self.assertIsNone(owner) + + +class Main(unittest.TestCase): + def target(self, name, target_type="EXECUTABLE", source="core/libs/tests/Guest.cpp", fragment=""): + return { + "artifacts": [{"path": f"tests/{name}.exe"}], + "id": name, + "link": {"commandFragments": [{"fragment": fragment}] if fragment else []}, + "name": name, + "paths": {"build": "core/libs", "source": "core/libs"}, + "sources": [{"path": source}], + "type": target_type, + } + + def listing(self): + return json.dumps({"tests": [ + {"name": "guest_np_common_build", "command": ["C:/b/tests/guest_np_common_tests.exe", "build"]}, + {"name": "guest_np_common_fetch", "command": ["C:/b/tests/guest_np_common_tests.exe", "fetch"]}, + {"name": "guest_pad", "command": ["C:/b/tests/guest_pad_tests.exe"]}, + ]}) + + def fixture(self, targets): + directory = Path(self.temporary.name) + reply = directory / "build" / ".cmake" / "api" / "v1" / "reply" + reply.mkdir(parents=True) + entries = [] + for target in targets: + filename = f"target-{target['name']}.json" + (reply / filename).write_text(json.dumps(target), encoding="utf-8") + entries.append({"id": target["id"], "jsonFile": filename, "name": target["name"]}) + model = {"configurations": [{"targets": entries}], "paths": {"source": str(directory)}} + (reply / "codemodel.json").write_text(json.dumps(model), encoding="utf-8") + index = {"reply": {"codemodel-v2": {"jsonFile": "codemodel.json"}}} + (reply / "index-0001.json").write_text(json.dumps(index), encoding="utf-8") + return directory / "build" + + def setUp(self): + self.temporary = tempfile.TemporaryDirectory() + + def tearDown(self): + self.temporary.cleanup() + + def main(self, build, changed_lines): + changed = Path(self.temporary.name) / "changed.txt" + changed.write_text("\n".join(changed_lines), encoding="utf-8") + return build_changed_guest_tests.main([str(build), str(changed)]) + + def test_mixed_argument_bearing_and_argumentless_tests_all_run(self): + build = self.fixture([ + self.target("guest_np_common_tests", source="core/libs/tests/GuestNp.cpp", fragment="libc.prx"), + self.target("guest_pad_tests", source="core/libs/tests/Guest.cpp", fragment="libc.prx"), + ]) + 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(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] + 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 = [] + with mock.patch.object(build_changed_guest_tests.subprocess, "run", side_effect=lambda cmd, **_: calls.append(cmd) or run_result()): + code = self.main(build, ["core/libs/prx/libc/src/FloatBuiltins.cpp"]) + self.assertEqual(code, 0) + 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 = [] + with mock.patch.object(build_changed_guest_tests.subprocess, "run", side_effect=lambda cmd, **_: calls.append(cmd) or run_result()): + code = self.main(build, ["core/relinker/codegen/src/Amd64OnlyConverter.cpp"]) + self.assertEqual(code, 0) + self.assertEqual(calls, []) + + def test_partial_target_to_test_coverage_is_rejected(self): + build = self.fixture([ + self.target("guest_pad_tests", source="core/libs/tests/Guest.cpp", fragment="libc.prx"), + self.target("guest_unregistered_tests", source="core/libs/tests/GuestUnregistered.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 "--show-only=json-v1" in cmd else "")): + code = self.main(build, ["core/libs/tests/Guest.cpp", "core/libs/tests/GuestUnregistered.cpp"]) + self.assertEqual(code, 1) + self.assertFalse([cmd for cmd in calls if cmd[0] == "ctest" and not any("--show-only" in part for part in cmd)]) + + def test_a_ctest_failure_propagates(self): + build = self.fixture([self.target("guest_pad_tests", source="core/libs/tests/Guest.cpp", fragment="libc.prx")]) + def fail(cmd, **_): + if cmd[0] == "ctest" and "--show-only=json-v1" not in cmd: + raise subprocess.CalledProcessError(2, cmd) + 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=fail): + code = self.main(build, ["core/libs/tests/Guest.cpp"]) + self.assertEqual(code, 1) + + def test_a_libs_build_failure_propagates(self): + build = self.fixture([self.target("guest_pad_tests", source="core/libs/tests/Guest.cpp", fragment="libc.prx")]) + with mock.patch.object(build_changed_guest_tests.subprocess, "run", side_effect=subprocess.CalledProcessError(2, "cmake")): + code = self.main(build, ["core/libs/prx/libc/src/FloatBuiltins.cpp"]) + self.assertEqual(code, 1) + + +if __name__ == "__main__": + with contextlib.redirect_stdout(io.StringIO()): + unittest.main() diff --git a/tools/tests/test_build_web.py b/tools/tests/test_build_web.py index d44dff44726b..33e497a3fdb3 100644 --- a/tools/tests/test_build_web.py +++ b/tools/tests/test_build_web.py @@ -304,6 +304,61 @@ def asset(platform): self.assertEqual(existing.read_bytes(), b"previous manifest") self.assertEqual(list(root.iterdir()), [existing]) + def test_deeply_nested_api_responses_are_cli_errors_without_site_changes(self): + deep_json = b"[" * 200000 + b"]" * 200000 + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + web = root / "web" + web.mkdir() + preserved = web / "keep.txt" + preserved.write_bytes(b"previous site") + errors, output = io.StringIO(), io.StringIO() + with patch.object(build_web, "request", return_value=io.BytesIO(deep_json)), \ + contextlib.redirect_stderr(errors), contextlib.redirect_stdout(output): + with self.assertRaises(SystemExit) as raised: + build_web.main(["--build", str(root), "--release"]) + self.assertEqual(raised.exception.code, 2) + self.assertNotIn("Traceback", errors.getvalue()) + self.assertIn("release", errors.getvalue().lower()) + self.assertEqual(output.getvalue(), "") + self.assertEqual(preserved.read_bytes(), b"previous site") + self.assertEqual(list(root.iterdir()), [web]) + self.assertEqual(list(web.iterdir()), [preserved]) + + def test_deeply_nested_release_metadata_in_libraries_raises_value_error(self): + deep_json = b"[" * 200000 + b"]" * 200000 + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + with patch.object(build_web, "request", return_value=io.BytesIO(deep_json)): + with self.assertRaisesRegex(ValueError, "release metadata"): + build_web.publish_libraries(root) + + def test_deeply_nested_web_release_metadata_is_cli_error_without_site_changes(self): + deep_json = b"[" * 200000 + b"]" * 200000 + entries = [(name, b"x") for name in build_web.WEB_FILES] + [("web-release.json", deep_json)] + data = library_zip(entries) + release = {"tag_name": "v1", "html_url": "https://example.invalid/v1", "assets": [ + {"name": "web-v1.zip", "size": len(data), "browser_download_url": "https://example.invalid/web", + "digest": "sha256:" + hashlib.sha256(data).hexdigest()}, + *({"name": f"prx-{platform}-v1.zip", "size": 10, "browser_download_url": "https://example.invalid/prx", "digest": None} + for platform in ("windows", "linux"))]} + responses = [io.BytesIO(json.dumps(release).encode()), io.BytesIO(data)] + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + web = root / "web" + web.mkdir() + preserved = web / "keep.txt" + preserved.write_bytes(b"previous site") + errors = io.StringIO() + with patch.object(build_web, "request", side_effect=responses), \ + contextlib.redirect_stderr(errors), contextlib.redirect_stdout(io.StringIO()): + with self.assertRaises(SystemExit) as raised: + build_web.main(["--build", str(root), "--release"]) + self.assertEqual(raised.exception.code, 2) + self.assertNotIn("Traceback", errors.getvalue()) + self.assertIn("release metadata", errors.getvalue()) + self.assertEqual(preserved.read_bytes(), b"previous site") + self.assertEqual(list(root.iterdir()), [web]) class WebReleaseLayoutTests(unittest.TestCase): @@ -318,7 +373,7 @@ def release(self, names, extra=(), metadata=None): archive.writestr("web-release.json", json.dumps(metadata or {"tag": self.TAG, "revision": self.REVISION})) return buffer.getvalue() - def publish(self, data): + def publish(self, data, expected=None): url = "https://example.invalid/web.zip" release = {"tag_name": self.TAG, "html_url": "https://example.invalid/v1", "assets": [{"name": f"web-{self.TAG}.zip", "size": len(data), "browser_download_url": url, @@ -327,10 +382,12 @@ def publish(self, data): def libraries(staging, _release): (staging / "release.json").write_text(json.dumps({"tag": self.TAG}), encoding="utf-8") + expected_files = expected if expected is not None else set(build_web.WEB_FILES) with tempfile.TemporaryDirectory() as directory: output = Path(directory) / "web" with patch.object(build_web, "request", side_effect=lambda address: io.BytesIO(responses[address])), \ patch.object(build_web, "library_assets"), patch.object(build_web, "publish_libraries", side_effect=libraries), \ + patch.object(build_web, "release_web_files", return_value=expected_files), \ contextlib.redirect_stdout(io.StringIO()): try: build_web.publish_release(output) @@ -343,7 +400,7 @@ def test_current_release_with_every_web_file_is_published(self): def test_release_lacking_a_newer_web_file_is_published_as_shipped(self): older = [name for name in build_web.WEB_FILES if name != "failure-report.mjs"] - self.publish(self.release(older)) + self.publish(self.release(older), expected=set(older)) self.assertNotIn("failure-report.mjs", self.published) self.assertIn("app.mjs", self.published) self.assertIn("release.json", self.published) @@ -414,5 +471,189 @@ def test_empty_or_missing_native_input_does_not_copy_sources(self): self.assertTrue((build / "web/.nojekyll").exists()) +class WebReleaseValidationTests(unittest.TestCase): + HISTORICAL_FILES = ( + "index.html", "app.css", "app.mjs", "archive.mjs", "batch.mjs", + "output-directory.mjs", "worker.mjs", "native/relinker_wasm.mjs", "native/relinker_wasm.wasm", + ) + HISTORICAL_REVISION = "3fd1cc393b8512c2e989860053f30dee5a8cd1aa" + + def setUp(self): + self.temporary = tempfile.TemporaryDirectory() + self.addCleanup(self.temporary.cleanup) + self.root = Path(self.temporary.name) + self.build = self.root / "build" + self.output = self.build / "web" + self.output.mkdir(parents=True) + self.prx = library_zip([("libs/libc.prx", b"libc")]) + + def publish(self, web_archive, tag="v0.1.3"): + responses = { + f"https://example.invalid/web-{tag}.zip": web_archive, + f"https://example.invalid/windows-{tag}.zip": self.prx, + f"https://example.invalid/linux-{tag}.zip": self.prx, + } + release = { + "tag_name": tag, + "html_url": f"https://example.invalid/{tag}", + "assets": [ + {"name": f"web-{tag}.zip", "size": len(web_archive), + "digest": "sha256:" + hashlib.sha256(web_archive).hexdigest(), + "browser_download_url": f"https://example.invalid/web-{tag}.zip"}, + {"name": f"prx-windows-{tag}.zip", "size": len(self.prx), + "digest": "sha256:" + hashlib.sha256(self.prx).hexdigest(), + "browser_download_url": f"https://example.invalid/windows-{tag}.zip"}, + {"name": f"prx-linux-{tag}.zip", "size": len(self.prx), + "digest": "sha256:" + hashlib.sha256(self.prx).hexdigest(), + "browser_download_url": f"https://example.invalid/linux-{tag}.zip"}, + ], + } + responses["https://api.github.com/repos/boykopovar/AnyPS5/releases/latest"] = json.dumps(release).encode() + with patch.object(build_web, "request", side_effect=lambda url: io.BytesIO(responses[url])), \ + contextlib.redirect_stdout(io.StringIO()): + build_web.publish_release(self.output) + + def test_historical_release_missing_later_files_is_accepted(self): + entries = [(name, f"content of {name}".encode()) for name in self.HISTORICAL_FILES] + entries.append(("web-release.json", json.dumps({"tag": "v0.1.3", "revision": self.HISTORICAL_REVISION}).encode())) + archive = library_zip(entries) + with patch.object(build_web, "release_web_files", return_value=set(self.HISTORICAL_FILES)): + self.publish(archive, tag="v0.1.3") + self.assertTrue((self.output / "index.html").is_file()) + self.assertFalse((self.output / "failure-report.mjs").exists()) + manifest = json.loads((self.output / "release.json").read_text(encoding="utf-8")) + self.assertEqual(manifest["revision"], self.HISTORICAL_REVISION) + + def test_current_release_with_expected_files_is_accepted(self): + revision = subprocess.run(["git", "-C", str(build_web.ROOT), "rev-parse", "HEAD"], + capture_output=True, text=True, check=True).stdout.strip() + entries = [(name, f"content of {name}".encode()) for name in build_web.WEB_FILES] + entries.append(("web-release.json", json.dumps({"tag": "v1.0.0", "revision": revision}).encode())) + archive = library_zip(entries) + self.publish(archive, tag="v1.0.0") + for name in build_web.WEB_FILES: + self.assertTrue((self.output / name).is_file()) + + def test_invalid_archive_entries_are_rejected(self): + valid = [(name, b"valid") for name in self.HISTORICAL_FILES] + metadata = json.dumps({"tag": "v0.1.3", "revision": self.HISTORICAL_REVISION}).encode() + unexpected = library_zip([*valid, ("unexpected.txt", b"extra"), ("web-release.json", metadata)]) + missing = library_zip([*valid[1:], ("web-release.json", metadata)]) + duplicate = library_zip([*valid, valid[0], ("web-release.json", metadata)]) + for name, archive in (("unexpected", unexpected), ("missing", missing), ("duplicate", duplicate)): + with self.subTest(case=name): + with patch.object(build_web, "release_web_files", return_value=set(self.HISTORICAL_FILES)), \ + self.assertRaisesRegex(ValueError, "Invalid web release archive layout"): + self.publish(archive, tag="v0.1.3") + + def test_unavailable_historical_revision_fails_cleanly_without_traceback_or_site_mutation(self): + marker = self.output / "previous.txt" + marker.write_bytes(b"preserved site") + entries = [(name, b"content") for name in self.HISTORICAL_FILES] + entries.append(("web-release.json", json.dumps({"tag": "v0.1.3", "revision": "0" * 40}).encode())) + archive = library_zip(entries) + responses = { + "https://example.invalid/web-v0.1.3.zip": archive, + "https://example.invalid/windows-v0.1.3.zip": self.prx, + "https://example.invalid/linux-v0.1.3.zip": self.prx, + } + release = { + "tag_name": "v0.1.3", + "html_url": "https://example.invalid/v0.1.3", + "assets": [ + {"name": "web-v0.1.3.zip", "size": len(archive), + "digest": "sha256:" + hashlib.sha256(archive).hexdigest(), + "browser_download_url": "https://example.invalid/web-v0.1.3.zip"}, + {"name": "prx-windows-v0.1.3.zip", "size": len(self.prx), + "digest": "sha256:" + hashlib.sha256(self.prx).hexdigest(), + "browser_download_url": "https://example.invalid/windows-v0.1.3.zip"}, + {"name": "prx-linux-v0.1.3.zip", "size": len(self.prx), + "digest": "sha256:" + hashlib.sha256(self.prx).hexdigest(), + "browser_download_url": "https://example.invalid/linux-v0.1.3.zip"}, + ], + } + responses["https://api.github.com/repos/boykopovar/AnyPS5/releases/latest"] = json.dumps(release).encode() + stdout, stderr = io.StringIO(), io.StringIO() + with patch.object(build_web, "request", side_effect=lambda url: io.BytesIO(responses[url])), \ + contextlib.redirect_stdout(stdout), contextlib.redirect_stderr(stderr), \ + self.assertRaises(SystemExit) as exit_error: + build_web.main(["--build", str(self.build), "--release"]) + self.assertEqual(exit_error.exception.code, 2) + self.assertIn("error: Cannot resolve release revision: 0000000000000000000000000000000000000000", stderr.getvalue()) + self.assertNotIn("Traceback", stderr.getvalue()) + self.assertEqual(marker.read_bytes(), b"preserved site") + + def test_invalid_web_files_definition_fails_cleanly_without_traceback_or_site_mutation(self): + marker = self.output / "previous.txt" + marker.write_bytes(b"preserved site") + entries = [(name, b"content") for name in self.HISTORICAL_FILES] + entries.append(("web-release.json", json.dumps({"tag": "v0.1.3", "revision": "1" * 40}).encode())) + archive = library_zip(entries) + responses = { + "https://example.invalid/web-v0.1.3.zip": archive, + "https://example.invalid/windows-v0.1.3.zip": self.prx, + "https://example.invalid/linux-v0.1.3.zip": self.prx, + } + release = { + "tag_name": "v0.1.3", + "html_url": "https://example.invalid/v0.1.3", + "assets": [ + {"name": "web-v0.1.3.zip", "size": len(archive), + "digest": "sha256:" + hashlib.sha256(archive).hexdigest(), + "browser_download_url": "https://example.invalid/web-v0.1.3.zip"}, + {"name": "prx-windows-v0.1.3.zip", "size": len(self.prx), + "digest": "sha256:" + hashlib.sha256(self.prx).hexdigest(), + "browser_download_url": "https://example.invalid/windows-v0.1.3.zip"}, + {"name": "prx-linux-v0.1.3.zip", "size": len(self.prx), + "digest": "sha256:" + hashlib.sha256(self.prx).hexdigest(), + "browser_download_url": "https://example.invalid/linux-v0.1.3.zip"}, + ], + } + responses["https://api.github.com/repos/boykopovar/AnyPS5/releases/latest"] = json.dumps(release).encode() + stdout, stderr = io.StringIO(), io.StringIO() + with patch.object(subprocess, "run", return_value=subprocess.CompletedProcess([], 0, "WEB_FILES = None", "")), \ + patch.object(build_web, "request", side_effect=lambda url: io.BytesIO(responses[url])), \ + contextlib.redirect_stdout(stdout), contextlib.redirect_stderr(stderr), \ + self.assertRaises(SystemExit) as exit_error: + build_web.main(["--build", str(self.build), "--release"]) + self.assertEqual(exit_error.exception.code, 2) + self.assertIn("error: Invalid web release definition in revision: 1111111111111111111111111111111111111111", stderr.getvalue()) + self.assertNotIn("Traceback", stderr.getvalue()) + self.assertEqual(marker.read_bytes(), b"preserved site") + + def test_invalid_metadata_fails_cleanly(self): + valid = [(name, b"valid") for name in self.HISTORICAL_FILES] + bad_json = library_zip([*valid, ("web-release.json", b"{invalid json")]) + bad_tag = library_zip([*valid, ("web-release.json", json.dumps({"tag": "v9.9.9", "revision": self.HISTORICAL_REVISION}).encode())]) + for name, archive, err in (("bad_json", bad_json, "Invalid web release metadata"), + ("bad_tag", bad_tag, "Web converter does not match the selected release")): + with self.subTest(case=name): + with self.assertRaisesRegex(ValueError, err): + self.publish(archive, tag="v0.1.3") + + def test_historical_web_files_parser_rejects_invalid_or_duplicate_entries(self): + definitions = ( + 'WEB_FILES = ("index.html", "index.html")', + 'WEB_FILES = ("../escape",)', + 'WEB_FILES = ("",)', + 'WEB_FILES = ("/absolute",)', + r'WEB_FILES = ("nested\\backslash",)', + 'WEB_FILES = ("nested/./current",)', + 'WEB_FILES = [1, 2]', + 'WEB_FILES = ([1],)', + 'WEB_FILES = None', + ) + for code in definitions: + with self.subTest(code=code): + with patch.object(subprocess, "run", return_value=subprocess.CompletedProcess([], 0, code, "")): + with self.assertRaisesRegex(ValueError, "Invalid web release definition in revision"): + build_web.release_web_files("0" * 40) + + def test_historical_web_files_parser_rejects_missing_revision(self): + with patch.object(subprocess, "run", return_value=subprocess.CompletedProcess([], 128, "", "fatal: bad object")): + with self.assertRaisesRegex(ValueError, "Cannot resolve release revision: 0000000000000000000000000000000000000000"): + build_web.release_web_files("0" * 40) + + if __name__ == "__main__": unittest.main() diff --git a/tools/tests/test_check_compile.py b/tools/tests/test_check_compile.py index 58f0a9f05370..9e94ca0a3864 100644 --- a/tools/tests/test_check_compile.py +++ b/tools/tests/test_check_compile.py @@ -317,6 +317,16 @@ def test_symbolic_link_loops_are_reported_without_a_traceback(self): 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) @@ -413,6 +423,24 @@ def test_argument_arrays_preserve_tokens_and_take_precedence_over_command(self): self.assertEqual(json.loads(seen.read_text(encoding="utf-8")), ["-fsyntax-only", *flags, str(source)]) + def test_a_cmake_env_launcher_keeps_its_environment_and_the_compiler_command_is_rewritten(self): + cmake = shutil.which("cmake") + if cmake is None: + self.skipTest("cmake is not on PATH") + source = self.source("unit.cpp") + script = self.compiler( + "import json\nimport os\nimport sys\nfrom pathlib import Path\n" + "Path(sys.argv[1]).write_text(json.dumps([sys.argv[2:], os.environ.get('CHECK_COMPILE_SET'), " + "os.environ.get('CHECK_COMPILE_UNSET')]))\n") + seen = self.root / "arguments.json" + self.manifest([self.entry("unit.cpp", f'"{cmake}" -E env CHECK_COMPILE_SET=pch_defines,time_macros ' + f'--unset=CHECK_COMPILE_UNSET "{sys.executable}" "{script}" "{seen}" ' + f'-include unit.hpp -c -o unit.o "{source}"')]) + result = self.tool("unit.cpp", env={"CHECK_COMPILE_UNSET": "1"}) + self.assertEqual(result.returncode, 0, result.stderr) + self.assertEqual(json.loads(seen.read_text(encoding="utf-8")), + [["-fsyntax-only", "-include", "unit.hpp", str(source)], "pch_defines,time_macros", None]) + def test_parallel_checks_overlap_but_diagnostics_keep_source_order(self): barrier = self.root / "barrier" barrier.mkdir() @@ -466,25 +494,41 @@ def test_invalid_compilation_databases_are_rejected_without_a_traceback(self): self.assertIn("compile_commands.json: expected an array of command objects", result.stderr) self.assertNotIn("Traceback", result.stderr) - def test_invalid_entries_are_rejected_before_any_compiler_runs(self): + def test_non_object_entries_are_rejected_before_any_compiler_runs(self): + self.check_invalid_entries(lambda valid: [(value, "expected a command object") + for value in (None, [], 42, "command")]) + + def test_invalid_directories_are_rejected_before_any_compiler_runs(self): + self.check_invalid_locations("directory") + + def test_invalid_files_are_rejected_before_any_compiler_runs(self): + self.check_invalid_locations("file") + + def test_invalid_commands_are_rejected_before_any_compiler_runs(self): + def cases(valid): + return [({key: value for key, value in valid.items() if key != "command"}, + "expected arguments or command"), + *(({**valid, "command": value}, "command must be a nonempty string") + for value in (None, [], 42, "", " \t")), + ({**valid, "arguments": []}, + "arguments must be a nonempty list of strings with an executable")] + self.check_invalid_entries(cases) + + def check_invalid_locations(self, field): + def cases(valid): + missing = dict(valid) + del missing[field] + return [(missing, f"missing {field}"), + *(({**valid, field: value}, f"{field} must be a nonempty string") + for value in (None, [], 42, ""))] + self.check_invalid_entries(cases) + + def check_invalid_entries(self, cases): source = self.source("unit.cpp") invoked = self.root / "invoked" script = self.compiler("import sys\nfrom pathlib import Path\nPath(sys.argv[1]).touch()\n") valid = self.entry("unit.cpp", f'"{sys.executable}" "{script}" "{invoked}" "{source}"') - cases = [(value, "expected a command object") for value in (None, [], 42, "command")] - for field in ("directory", "file"): - missing = dict(valid) - del missing[field] - cases.append((missing, f"missing {field}")) - cases.extend(({**valid, field: value}, f"{field} must be a nonempty string") - for value in (None, [], 42, "")) - cases.append(({key: value for key, value in valid.items() if key != "command"}, - "expected arguments or command")) - cases.extend(({**valid, "command": value}, "command must be a nonempty string") - for value in (None, [], 42, "", " \t")) - cases.append(({**valid, "arguments": []}, - "arguments must be a nonempty list of strings with an executable")) - for invalid, message in cases: + for invalid, message in cases(valid): with self.subTest(invalid=invalid): self.manifest([valid, invalid]) result = self.tool("--jobs", "2", "unit.cpp") @@ -980,5 +1024,41 @@ def test_unexpanded_response_files_cannot_rewrite_build_outputs(self): +class CheckCompileLauncherTests(unittest.TestCase): + def test_a_cmake_env_prefix_is_kept_and_only_the_command_after_it_is_rewritten(self): + source = Path.cwd() / "unit.cpp" + for prefix in (["cmake", "-E", "env", "CCACHE_SLOPPINESS=pch_defines,time_macros"], + ["/usr/bin/cmake", "-E", "env", "--unset=CCACHE_DIR", "--modify", "PATH=path_list_prepend:/x", "--"], + ["C:\\Program Files\\CMake\\bin\\cmake.exe", "-E", "env", "A=1", "B="]): + with self.subTest(prefix=prefix): + self.assertEqual(check_compile.syntax_arguments( + [*prefix, "ccache", "g++", "-DNAME=1", "-include", "pch.hxx", "-c", "-o", "unit.o", str(source)], + Path.cwd(), source), + [*prefix, "ccache", "g++", "-fsyntax-only", "-DNAME=1", "-include", "pch.hxx", str(source)]) + + def test_env_delimiter_preserves_a_command_path_containing_equals(self): + source = Path.cwd() / "unit.cpp" + prefix = ["cmake", "-E", "env", "--"] + command = "compiler=tools/g++" + self.assertEqual(check_compile.syntax_arguments([*prefix, command, "-c", str(source)], Path.cwd(), source), + [*prefix, command, "-fsyntax-only", str(source)]) + + def test_only_cmake_starts_an_env_prefix(self): + source = Path.cwd() / "unit.cpp" + self.assertEqual(check_compile.syntax_arguments(["g++", "-E", "env", "-c", str(source)], Path.cwd(), source), + ["g++", "-fsyntax-only", "env", str(source)]) + + def test_an_env_prefix_without_a_command_or_with_an_unmodeled_option_is_rejected(self): + source = Path.cwd() / "unit.cpp" + for arguments, message in ((["cmake", "-E", "env", "A=1"], "no command"), + (["cmake", "-E", "env", "A=1", "--"], "no command"), + (["cmake", "-E", "env", "--modify"], "--modify"), + (["cmake", "-E", "env", "-", "cc", "-c", str(source)], "unsupported"), + (["cmake", "-E", "env", "--chdir=x", "cc", "-c", str(source)], "unsupported")): + with self.subTest(arguments=arguments): + with self.assertRaisesRegex(ValueError, message): + check_compile.syntax_arguments(arguments, Path.cwd(), source) + + if __name__ == "__main__": unittest.main() diff --git a/tools/tests/test_check_compile_modes.py b/tools/tests/test_check_compile_modes.py index 74f4594ed8d4..a4d6133ecdb1 100644 --- a/tools/tests/test_check_compile_modes.py +++ b/tools/tests/test_check_compile_modes.py @@ -162,25 +162,45 @@ def check_modes(self, variants, dependency=False, configure=None, invalid=None, else: self.assertIn("1 translation units compile", result.stdout) - def test_preprocessing_modes_reach_syntax_errors(self): - self.check_modes((("-E",), ("--preprocess",))) + def test_short_preprocessing_mode_reaches_syntax_errors(self): + self.check_modes((("-E",),)) - def test_dependency_modes_reach_syntax_errors(self): - self.check_modes((("-M",), ("--dependencies",)), dependency=True) + def test_long_preprocessing_mode_reaches_syntax_errors(self): + self.check_modes((("--preprocess",),)) - def test_user_dependency_modes_reach_syntax_errors(self): - self.check_modes((("-MM",), ("--user-dependencies",)), dependency=True) + def test_short_dependency_mode_reaches_syntax_errors(self): + self.check_modes((("-M",),), dependency=True) - def test_generated_header_mode_does_not_hide_missing_headers(self): - self.check_modes((("-M", "-MG"), ("--dependencies", "--print-missing-file-dependencies")), - dependency=True, invalid='#include "missing_generated_header.h"\n', + def test_long_dependency_mode_reaches_syntax_errors(self): + self.check_modes((("--dependencies",),), dependency=True) + + def test_short_user_dependency_mode_reaches_syntax_errors(self): + self.check_modes((("-MM",),), dependency=True) + + def test_long_user_dependency_mode_reaches_syntax_errors(self): + self.check_modes((("--user-dependencies",),), dependency=True) + + def check_generated_header_mode(self, flags): + self.check_modes((flags,), dependency=True, invalid='#include "missing_generated_header.h"\n', marker="missing_generated_header.h") - def test_preprocessor_output_companions_do_not_block_syntax_checks(self): - self.check_modes((("-Werror", "-E", "-P"), ("-Werror", "--preprocess", "--no-line-commands"))) + def test_short_generated_header_mode_does_not_hide_missing_headers(self): + self.check_generated_header_mode(("-M", "-MG")) + + def test_long_generated_header_mode_does_not_hide_missing_headers(self): + self.check_generated_header_mode(("--dependencies", "--print-missing-file-dependencies")) - def test_macro_dump_modes_still_check_syntax(self): - self.check_modes((("-Werror", "-E", "-dM"), ("-Werror", "-E", "-dD"))) + def test_short_preprocessor_output_companions_do_not_block_syntax_checks(self): + self.check_modes((("-Werror", "-E", "-P"),)) + + def test_long_preprocessor_output_companions_do_not_block_syntax_checks(self): + self.check_modes((("-Werror", "--preprocess", "--no-line-commands"),)) + + def test_macro_only_dump_mode_still_checks_syntax(self): + self.check_modes((("-Werror", "-E", "-dM"),)) + + def test_macro_and_output_dump_mode_still_checks_syntax(self): + self.check_modes((("-Werror", "-E", "-dD"),)) def test_include_dump_mode_still_checks_syntax(self): self.check_modes((("-Werror", "-E", "-dI"),)) @@ -191,8 +211,11 @@ def test_real_compiler_wrapper_keeps_one_syntax_mode(self): def test_trailing_preprocessing_mode_still_checks_syntax(self): self.check_modes((("-E",),), trailing=True) - def test_comment_output_modes_still_check_syntax(self): - self.check_modes((("-Werror", "-E", "-C"), ("-Werror", "-E", "-CC"))) + def test_comment_output_mode_still_checks_syntax(self): + self.check_modes((("-Werror", "-E", "-C"),)) + + def test_macro_comment_output_mode_still_checks_syntax(self): + self.check_modes((("-Werror", "-E", "-CC"),)) def test_joined_definitions_before_preprocessing_modes_are_preserved(self): self.check_modes((("-DANOTHER_MACRO", "-E"),)) diff --git a/tools/tests/test_check_configure_seed.py b/tools/tests/test_check_configure_seed.py new file mode 100644 index 000000000000..84a4a8744951 --- /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_conventions_alignment.py b/tools/tests/test_check_conventions_alignment.py index d1456cc770c4..02d6723ff38b 100644 --- a/tools/tests/test_check_conventions_alignment.py +++ b/tools/tests/test_check_conventions_alignment.py @@ -127,6 +127,11 @@ def git(*args): os.chdir(original) return check.findings + def test_abi_alias_expansion_does_not_hide_excessive_alignment(self): + source = "#define A APS5_VABI\n" + "\n".join(f"int A Decl{i}();" for i in range(8)) + source += "\nconstexpr int BufferSize = 16384;\nalignas(BufferSize) unsigned char storage[1];\n" + self.assertEqual(self.findings(source), [("alignment", SOURCE, 12, "alignas(BufferSize)")]) + def test_only_added_code_is_reported(self): self.assertEqual(self.findings("alignas(256) char small[16];\n" "const char* text = \"alignas(65536)\";\n" diff --git a/tools/tests/test_check_conventions_wrapped_declarations.py b/tools/tests/test_check_conventions_wrapped_declarations.py index 62c6f9642c03..4c02868f6091 100644 --- a/tools/tests/test_check_conventions_wrapped_declarations.py +++ b/tools/tests/test_check_conventions_wrapped_declarations.py @@ -6,6 +6,9 @@ from pathlib import Path CHECKER = Path(__file__).resolve().parents[1] / "check_conventions.py" +sys.path.insert(0, str(CHECKER.parent)) +import check_conventions + DEFINITION = "int APS5_VABI sceFooBar(int a, int b) { return a + b; }\n" @@ -63,6 +66,57 @@ def test_wrapped_definition_is_a_duplicate(self): self.assertEqual(result.returncode, 1, result.stdout + result.stderr) self.assertIn("[duplicate-export]", result.stdout) + def test_local_abi_alias_cannot_hide_duplicates_in_either_library(self): + aliased = "#define NATIVE_SYSV APS5_VABI\n" + DEFINITION.replace("APS5_VABI", "NATIVE_SYSV") + for first, second in ((aliased, DEFINITION), (DEFINITION, aliased), (aliased, aliased)): + with self.subTest(first=first, second=second): + result = self.check("Export.cpp", first, second) + self.assertEqual(result.returncode, 1, result.stdout + result.stderr) + self.assertIn("[duplicate-export]", result.stdout) + self.assertIn("sceFooBar is also in libSceA", result.stdout) + + def test_chained_alias_uses_the_current_macro_definition(self): + source = "#define ENTRY ABI\n#define ABI APS5_VABI\n" + DEFINITION.replace("APS5_VABI", "ENTRY") + for prefix in ("", "\ufeff"): + with self.subTest(prefix=prefix): + result = self.check("Export.cpp", prefix + source) + self.assertEqual(result.returncode, 1, result.stdout + result.stderr) + self.assertIn("[duplicate-export]", result.stdout) + + def test_alias_undefinition_redefinition_and_cycles_do_not_create_exports(self): + cases = ("#define ABI APS5_VABI\n#undef ABI\n", + "#define ABI APS5_VABI\n#define ABI unrelated\n", + "#define ABI APS5_VABI\n#define ABI() APS5_VABI\n", + "#define ABI OTHER\n#define OTHER ABI\n", + "/*\n#define ABI APS5_VABI\n*/\n", + 'const char* example = R"(\n#define ABI APS5_VABI\n)";\n') + for prefix in cases: + with self.subTest(prefix=prefix): + source = check_conventions.expand_abi_aliases(check_conventions.cpp_text(prefix + DEFINITION.replace("APS5_VABI", "ABI"))) + self.assertNotRegex(source, r"\bAPS5_VABI\s+sceFooBar\s*\(") + + def test_cpp_text_does_not_expand_abi_aliases(self): + source = "#define ABI APS5_VABI\nint ABI sceFooBar() { return 1; }\n" + self.assertIn("int ABI sceFooBar", check_conventions.cpp_text(source)) + + def test_aliased_import_declaration_is_not_a_duplicate(self): + source = "#define ABI APS5_VABI\nint ABI sceFooBar(int a, int b);\n" + result = self.check("Export.h", source) + self.assertEqual(result.returncode, 0, result.stdout + result.stderr) + + def test_local_abi_alias_cannot_hide_an_undocumented_silent_stub(self): + source = "#define ABI APS5_VABI\nint ABI sceUndocumented() { return 0; }\n" + result = self.check("Export.cpp", DEFINITION, source) + self.assertEqual(result.returncode, 1, result.stdout + result.stderr) + self.assertIn("[silent-stub]", result.stdout) + + def test_unique_aliased_definition_and_unpatched_helpers_remain_valid(self): + for name in ("sceDistinct", "Support_nid_no_patch", "Support_nid_no_patch_cut"): + with self.subTest(name=name): + source = "#define ABI APS5_VABI\nint ABI " + name + "() { return 3; }\n" + result = self.check("Export.cpp", source, source if name.startswith("Support") else DEFINITION) + self.assertEqual(result.returncode, 0, result.stdout + result.stderr) + def test_multiline_raw_literal_is_not_a_duplicate(self): source = 'const char* example = R"example(\n' + DEFINITION + ')example";\n' result = self.check("Export.cpp", source) diff --git a/tools/tests/test_check_main_sync.py b/tools/tests/test_check_main_sync.py index a3a0060cfbaa..72f00958cffc 100644 --- a/tools/tests/test_check_main_sync.py +++ b/tools/tests/test_check_main_sync.py @@ -363,6 +363,28 @@ def missing_run(*args, **kwargs): self.assertNotIn("Traceback", stderr.getvalue()) +class CheckMainSyncJsonTests(CheckMainSyncFixture): + def test_json_reports_real_git_state_and_preserves_exit_status(self): + import json + self.branch("feature") + self.repo.write("shared.txt", "feature\n") + self.repo.commit("feature edit") + self.repo.git("checkout", "-q", "main") + clean = run_tool(self.repo.path, "--head", "feature", "--json") + self.assertEqual(clean.returncode, 0, clean.stderr) + data = json.loads(clean.stdout) + self.assertEqual((data["ahead"], data["behind"], data["conflicts"], data["shared"], data["pulls"]), (1, 0, [], [], {})) + self.repo.write("shared.txt", "main\n") + self.repo.commit("main edit (#70003)") + conflict = run_tool(self.repo.path, "--head", "feature", "--json") + self.assertEqual(conflict.returncode, 1, conflict.stderr) + data = json.loads(conflict.stdout) + self.assertEqual((data["ahead"], data["behind"], data["conflicts"], data["shared"]), (1, 1, ["shared.txt"], ["shared.txt"])) + self.assertEqual(set(data["pulls"]), {"70003"}) + strict = run_tool(self.repo.path, "--head", data["mergebase"], "--json", "--strict") + self.assertEqual(strict.returncode, 1, strict.stderr) + self.assertEqual(json.loads(strict.stdout)["conflicts"], []) + if __name__ == "__main__": diff --git a/tools/tests/test_check_skips.py b/tools/tests/test_check_skips.py index 86709946125e..50a18aedb234 100644 --- a/tools/tests/test_check_skips.py +++ b/tools/tests/test_check_skips.py @@ -386,6 +386,30 @@ def skipped(self, content): 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 000000000000..2f82528a1a1a --- /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 000000000000..6cf699cd9f43 --- /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 b762e4725b72..dba19da35033 100644 --- a/tools/tests/test_configure_seed.py +++ b/tools/tests/test_configure_seed.py @@ -47,7 +47,7 @@ def test_failed_write_preserves_existing_seed_and_allows_retry(self): "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 @@ def test_existing_modes_and_new_file_umask_are_preserved(self): 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 @@ def setUp(self): 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 @@ def assert_rejected(self, seed, *options): 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) @@ -283,6 +283,24 @@ def test_check_names_with_spaces_round_trip_through_cmake(self): self.assertEqual(configure_seed.checks(seeded)["HAVE FEATURE"][0], "1") self.assertNotIn("HAVE:INTERNAL=", seeded.read_text(encoding="utf-8")) + def test_check_names_with_colons_round_trip_through_cmake(self): + source = self.root / "colon-check-source" + source.mkdir(exist_ok=True) + (source / "CMakeLists.txt").write_text( + 'cmake_minimum_required(VERSION 3.20)\nproject(colon_check C)\ninclude(CheckCSourceCompiles)\n' + 'check_c_source_compiles("int main(void) { return 0; }" "MINI_COLON:CHECK")\n', encoding="utf-8") + fresh = subprocess.run(["cmake", "-S", str(source), "-B", str(self.root / "colon-fresh"), "-G", "Ninja", + f"-DCMAKE_C_COMPILER={self.compiler}"], check=True, capture_output=True, text=True).stdout + self.assertIn("Performing Test MINI_COLON:CHECK", fresh) + cache = self.root / "colon-fresh" / "CMakeCache.txt" + self.assertIn('"MINI_COLON:CHECK":INTERNAL=1', cache.read_text(encoding="utf-8")) + seeded = subprocess.run(["cmake", "-C", str(self.seed(cache, "colon.cmake")), "-S", str(source), + "-B", str(self.root / "colon-seeded"), "-G", "Ninja", + f"-DCMAKE_C_COMPILER={self.compiler}"], check=True, capture_output=True, text=True).stdout + self.assertNotIn("Performing Test MINI_COLON:CHECK", seeded) + self.assertEqual(configure_seed.checks(self.root / "colon-seeded" / "CMakeCache.txt"), + configure_seed.checks(cache)) + def test_seeded_configure_runs_no_check_and_gets_the_same_results(self): self.assertRegex(self.fresh, r"Looking for|Performing Test|Check size of") output = self.configure("seeded", "-C", str(self.seed(self.root / "fresh" / "CMakeCache.txt", "seed.cmake"))) @@ -355,7 +373,7 @@ def test_filters_cannot_seed_architecture_dependent_compile_guards(self): ("--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) @@ -412,6 +430,19 @@ def test_multiline_help_from_real_cmake_survives_seed_round_trip(self): self.assertEqual((second / f"{name}.help").read_text(encoding="utf-8"), help_text) self.assertEqual((second / f"{name}.value").read_text(encoding="utf-8"), value) + def test_quoted_check_names_are_parsed(self): + with tempfile.TemporaryDirectory() as directory: + cache = Path(directory) / "CMakeCache.txt" + cache.write_text('//Test MINI_COLON\n"MINI_COLON:CHECK":INTERNAL=1\n' + '//Test MINI_COLON_QUOTE\n"MINI_"X":COLON":INTERNAL=0\n' + '//An ordinary entry\n"ORDINARY:COLON":INTERNAL=1\n' + '"MALFORMED:COLON":INTERNAL=1\n' + '//Test AMBIGUOUS\n"A:B":INTERNAL=abc":INTERNAL=1\n', encoding="utf-8") + self.assertEqual(configure_seed.checks(cache), { + "MINI_COLON:CHECK": ("1", "Test MINI_COLON"), + 'MINI_"X":COLON': ("0", "Test MINI_COLON_QUOTE"), + }) + def test_checks_reads_cache_with_utf8_bom(self): with tempfile.TemporaryDirectory() as directory: cache = Path(directory) / "CMakeCache.txt" diff --git a/tools/tests/test_env_reference.py b/tools/tests/test_env_reference.py index f2cfc9885f8c..68f8dcccd676 100644 --- a/tools/tests/test_env_reference.py +++ b/tools/tests/test_env_reference.py @@ -253,6 +253,35 @@ def test_multiline_reads_keep_line_numbers_and_do_not_duplicate(self): 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 @@ def test_check_reports_a_row_the_code_no_longer_reads(self): 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 f960029b0067..b43140f0689b 100644 --- a/tools/tests/test_import_audit.py +++ b/tools/tests/test_import_audit.py @@ -733,6 +733,44 @@ def test_module_import_bindings_survive_the_audit(self): 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 @@ def test_transitive_shared_library_preserves_stubs(self): 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 @@ def test_many_host_branches_only_fail_when_every_combination_must_be_read(self): 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"} @@ -2561,6 +2686,23 @@ def test_strict_stubs_fails_only_for_referenced_throwing_providers(self): + STUB_SOURCE.format(name="sceUnreferencedPending")) self.assertEqual(self.work.run(registry, "--strict-stubs")[0], 0) + def test_conditional_stubs_reads_utf8_source_with_explicit_encoding(self): + original_read_text = Path.read_text + recorded_calls = [] + + def recording_read_text(path_self, *args, **kwargs): + recorded_calls.append((path_self, kwargs)) + return original_read_text(path_self, *args, **kwargs) + + with tempfile.TemporaryDirectory() as directory: + lib_dir = Path(directory) + cpp_file = lib_dir / "Export.cpp" + cpp_file.write_bytes(f"// Non-ASCII \u2014 em-dash\n{DONE_SOURCE.format(name='sceCustomStub')}".encode("utf-8")) + with patch.object(Path, "read_text", side_effect=recording_read_text, autospec=True): + stubs = import_audit.conditional_stubs(lib_dir) + self.assertEqual(stubs, {"sceCustomStub"}) + self.assertTrue(recorded_calls) + self.assertEqual(recorded_calls[0][1].get("encoding"), "utf-8") class StrictProviderTests(unittest.TestCase): diff --git a/tools/tests/test_inspect_self.py b/tools/tests/test_inspect_self.py new file mode 100644 index 000000000000..e0ae9eb66ec1 --- /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 d72ae8abb073..f28622ae4216 100644 --- a/tools/tests/test_job_reference_errors.py +++ b/tools/tests/test_job_reference_errors.py @@ -12,6 +12,19 @@ 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: diff --git a/tools/tests/test_mingw_host_only_test_targets.py b/tools/tests/test_mingw_host_only_test_targets.py index 0b104711e757..673308d9d16b 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 @@ def test_selects_core_libs_test_executables_without_guest_libc(self): 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 @@ def test_wrong_shaped_target_members_are_reported_cleanly(self): 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 4823be7801d6..96b20ed35f14 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 @@ def test_symbol_files_and_stdin_compute_nids_without_a_database(self): +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 @@ def test_where_requires_input_and_checks_nids(self): 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 8283c6862000..60086a337b67 100644 --- a/tools/tests/test_package_release.py +++ b/tools/tests/test_package_release.py @@ -16,6 +16,7 @@ sys.path.insert(0, str(Path(__file__).resolve().parents[1])) import package_release +import package_headers import prepare_release_notes @@ -29,6 +30,91 @@ def working_directory(path): os.chdir(previous) +class PublicHeaderPackageTests(unittest.TestCase): + def setUp(self): + directory = tempfile.TemporaryDirectory() + self.addCleanup(directory.cleanup) + self.root = Path(directory.name) + self.source = self.root / "source" + self.libs = self.source / "core/libs" + self.output = self.root / "output" + self.umbrella = self.libs / "prx/libExample/libExample.hpp" + self.umbrella.parent.mkdir(parents=True) + (self.source / "LICENSE").write_text("project license", encoding="utf-8") + self.umbrella.write_text('#include "Api.hpp"\n#include <Common.hpp>\n', encoding="utf-8") + self.api = self.umbrella.with_name("Api.hpp") + self.api.write_text('#include "libExample.hpp"\n#include <vector>\n#if defined(_WIN32)\n#include "Windows.hpp"\n#endif\n', encoding="utf-8") + self.umbrella.with_name("Windows.hpp").write_text('#include <io.h>\n', encoding="utf-8") + (self.libs / "Common.hpp").write_text('struct Common {};\n', encoding="utf-8") + self.umbrella.with_name("Private.hpp").write_text('#include <vendor.h>\n', encoding="utf-8") + + def test_recursive_headers_keep_paths_and_bytes_without_private_files(self): + expected = {"include/anyps5/" + path.relative_to(self.libs).as_posix(): path.read_bytes() for path in (self.umbrella, self.api, self.umbrella.with_name("Windows.hpp"), self.libs / "Common.hpp")} + expected["LICENSE"] = (self.source / "LICENSE").read_bytes() + package_headers.package(self.source, self.output, "v1") + with zipfile.ZipFile(self.output / "prx-headers-v1.zip") as archive: + self.assertEqual({name: archive.read(name) for name in archive.namelist()}, expected) + self.assertEqual(len(archive.namelist()), len(expected)) + with tarfile.open(self.output / "prx-headers-v1.tar.gz") as archive: + self.assertEqual({name: archive.extractfile(name).read() for name in archive.getnames()}, expected) + + def test_forbidden_or_missing_dependencies_preserve_existing_archives(self): + self.output.mkdir() + previous = self.output / "prx-headers-v1.zip" + previous.write_bytes(b"previous") + for directive in ('#include "Missing.hpp"', '#include <vendor.h>', '#include "../../../3rdparty/vendor.hpp"', '#include MACRO_HEADER'): + with self.subTest(directive=directive): + self.api.write_text(directive + "\n", encoding="utf-8") + with self.assertRaises(RuntimeError): + package_headers.package(self.source, self.output, "v1") + self.assertEqual(list(self.output.iterdir()), [previous]) + self.assertEqual(previous.read_bytes(), b"previous") + + def test_ambiguous_quoted_include_is_rejected(self): + (self.libs / "Api.hpp").write_text("", encoding="utf-8") + with self.assertRaisesRegex(RuntimeError, "Ambiguous"): + package_headers.package(self.source, self.output, "v1") + self.assertFalse(self.output.exists()) + + def test_missing_umbrella_is_rejected(self): + self.umbrella.unlink() + with self.assertRaisesRegex(RuntimeError, "Missing public header"): + package_headers.package(self.source, self.output, "v1") + self.assertFalse(self.output.exists()) + + def test_comments_and_raw_strings_do_not_add_dependencies(self): + self.api.write_text('/*\n#include "Missing.hpp"\n*/\nconst char* text = R"test(\n#include "AlsoMissing.hpp"\n)test";\n', encoding="utf-8") + self.assertEqual(len(package_headers.public_headers(self.source)), 3) + + def test_external_symlink_is_rejected(self): + external = self.root / "external.hpp" + external.write_text("", encoding="utf-8") + link = self.umbrella.with_name("Linked.hpp") + try: + link.symlink_to(external) + except OSError as error: + self.skipTest(str(error)) + self.api.write_text('#include "Linked.hpp"\n', encoding="utf-8") + 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) + self.assertTrue((self.output / "prx-headers-v1.zip").is_file()) + + class ReleasePackageTests(unittest.TestCase): def setUp(self): self.directory = tempfile.TemporaryDirectory() @@ -43,14 +129,77 @@ def setUp(self): libraries.mkdir(parents=True) self.library = libraries / "libc.prx" self.library.write_bytes(b"library bytes") + (libraries / "unpatched").mkdir() + self.unpatched = libraries / "unpatched/libc.prx" + self.unpatched.write_bytes(b"original exports") + (libraries / "implib").mkdir() + self.implib = libraries / "implib/libc.dll.a" + self.implib.write_bytes(b"import archive") + self.manifest = self.build / "core/libs/release-implibs.txt" + self.manifest.write_text("libc=" + self.implib.as_posix() + "\n", encoding="utf-8") binary = self.build / "core/relinker/relinker" binary.parent.mkdir(parents=True) binary.write_bytes(b"relinker bytes") self.addCleanup(patch.stopall) patch.object(package_release, "ROOT", self.source, create=True).start() + def test_unpatched_archives_preserve_originals_and_exclude_stale_files(self): + (self.unpatched.parent / "libRemoved.prx").write_bytes(b"obsolete") + before = {path: (path.read_bytes(), path.stat().st_mtime_ns) for path in (self.library, self.unpatched, self.implib)} + package_release.package("linux", self.build, self.output, "v1") + with zipfile.ZipFile(self.output / "prx-linux-unpatched-v1.zip") as archive: + self.assertEqual(archive.namelist(), ["libs/libc.prx"]) + self.assertEqual(archive.read("libs/libc.prx"), b"original exports") + with tarfile.open(self.output / "prx-linux-unpatched-v1.tar.gz") as archive: + self.assertEqual(archive.getnames(), ["libs/libc.prx"]) + self.assertEqual(archive.extractfile("libs/libc.prx").read(), b"original exports") + for path, (content, timestamp) in before.items(): + self.assertEqual(path.read_bytes(), content) + self.assertEqual(path.stat().st_mtime_ns, timestamp) + + def test_invalid_windows_import_inputs_preserve_existing_output(self): + runtime = self.root / "runtime" + runtime.mkdir() + for name in ("libgcc_s_seh-1.dll", "libstdc++-6.dll", "libwinpthread-1.dll"): + (runtime / name).write_bytes(b"runtime") + for name in ("mimalloc.dll", "mimalloc-redirect.dll"): + (self.library.parent / name).write_bytes(b"allocator") + (self.build / "core/relinker/relinker.exe").write_bytes(b"executable") + self.output.mkdir() + previous = self.output / "prx-windows-v1.zip" + previous.write_bytes(b"existing archive") + valid = self.manifest.read_text(encoding="utf-8") + for manifest in ("", valid + valid, "libc=" + (self.root / "outside.a").as_posix() + "\n", "invalid"): + with self.subTest(manifest=manifest), patch.object(package_release, "windows_runtime", return_value=runtime): + self.manifest.write_text(manifest, encoding="utf-8") + with self.assertRaisesRegex(RuntimeError, "[Ii]mport library"): + package_release.package("windows", self.build, self.output, "v1") + self.assertEqual(list(self.output.iterdir()), [previous]) + self.assertEqual(previous.read_bytes(), b"existing archive") + self.manifest.write_text(valid, encoding="utf-8") + self.implib.unlink() + with patch.object(package_release, "windows_runtime", return_value=runtime), self.assertRaisesRegex(RuntimeError, "Missing or empty release file"): + package_release.package("windows", self.build, self.output, "v1") + self.assertEqual(previous.read_bytes(), b"existing archive") + + def test_missing_unpatched_input_preserves_existing_outputs(self): + for content in (None, b""): + with self.subTest(content=content): + if content is None: + self.unpatched.unlink() + else: + self.unpatched.write_bytes(content) + self.output.mkdir(exist_ok=True) + previous = self.output / "prx-linux-v1.zip" + previous.write_bytes(b"previous release") + with self.assertRaisesRegex(RuntimeError, "Missing or empty release file"): + package_release.package("linux", self.build, self.output, "v1") + self.assertEqual(list(self.output.iterdir()), [previous]) + self.assertEqual(previous.read_bytes(), b"previous release") + def test_ajm_vibration_decoder_license_in_archives(self): (self.source / "core/libs/prx/libSceAjm.native").mkdir() + (self.unpatched.parent / "libSceAjm.native.prx").write_bytes(b"unpatched library") (self.build / "core/libs/libs/libSceAjm.native.prx").write_bytes(b"ajm") license_file = self.source / "3rdparty/vgmstream/COPYING" license_file.parent.mkdir(parents=True) @@ -63,6 +212,7 @@ def test_ajm_vibration_decoder_license_in_archives(self): def test_vorbis_decoder_licenses_in_archives(self): (self.source / "core/libs/prx/libSceVorbisDec").mkdir() + (self.unpatched.parent / "libSceVorbisDec.prx").write_bytes(b"unpatched library") (self.build / "core/libs/libs/libSceVorbisDec.prx").write_bytes(b"vorbis") for name in ("ogg", "vorbis"): license_file = self.source / f"3rdparty/{name}/COPYING" @@ -97,9 +247,17 @@ def test_windows_runtime_follows_the_configured_compiler_directory(self): for name in names + allocator: self.assertEqual(archive.extractfile("libs/" + name).read(), name.encode()) self.assertEqual((self.output / "relinker-v1.exe").read_bytes(), b"Windows executable") + with zipfile.ZipFile(self.output / "prx-windows-unpatched-v1.zip") as archive: + self.assertEqual(archive.read("libs/libc.prx"), b"original exports") + self.assertEqual(archive.read("libs/implib/libc.dll.a"), b"import archive") + self.assertEqual(set(archive.namelist()), {"libs/libc.prx", "libs/implib/libc.dll.a", *("libs/" + name for name in names + allocator)}) + with tarfile.open(self.output / "prx-windows-unpatched-v1.tar.gz") as archive: + self.assertEqual(archive.extractfile("libs/libc.prx").read(), b"original exports") + self.assertEqual(archive.extractfile("libs/implib/libc.dll.a").read(), b"import archive") def test_opus_library_archives_include_the_bundled_license(self): (self.source / "core/libs/prx/libSceOpusDec").mkdir() + (self.unpatched.parent / "libSceOpusDec.prx").write_bytes(b"unpatched library") (self.library.parent / "libSceOpusDec.prx").write_bytes(b"Opus library bytes") license_file = self.source / "3rdparty/opus/COPYING" license_file.parent.mkdir(parents=True) @@ -112,6 +270,7 @@ def test_opus_library_archives_include_the_bundled_license(self): def test_opus_release_without_its_license_is_rejected(self): (self.source / "core/libs/prx/libSceOpusCeltDec").mkdir() + (self.unpatched.parent / "libSceOpusCeltDec.prx").write_bytes(b"unpatched library") (self.library.parent / "libSceOpusCeltDec.prx").write_bytes(b"CELT library bytes") with self.assertRaisesRegex(RuntimeError, "COPYING"): package_release.package("linux", self.build, self.output, "v1") @@ -240,7 +399,7 @@ def test_missing_real_library_still_fails(self): package_release.package("linux", self.build, self.output, "v1.0") def test_directory_destination_preserves_every_existing_asset(self): - names = ["prx-linux-v1.zip", "prx-linux-v1.tar.gz", "relinker-v1"] + names = ["prx-linux-v1.zip", "prx-linux-v1.tar.gz", "prx-linux-unpatched-v1.zip", "prx-linux-unpatched-v1.tar.gz", "relinker-v1"] for blocked in names: with self.subTest(blocked=blocked), tempfile.TemporaryDirectory() as tmp: output = Path(tmp) @@ -265,7 +424,7 @@ def test_directory_destination_preserves_every_existing_asset(self): @unittest.skipUnless(os.name == "nt", "Windows read-only replacement semantics") def test_readonly_destinations_preserve_all_existing_assets(self): - names = ["prx-linux-v1.zip", "prx-linux-v1.tar.gz", "relinker-v1"] + names = ["prx-linux-v1.zip", "prx-linux-v1.tar.gz", "prx-linux-unpatched-v1.zip", "prx-linux-unpatched-v1.tar.gz", "relinker-v1"] for index, blocked in enumerate(names): with self.subTest(blocked=blocked): output = self.output / str(index) @@ -300,7 +459,7 @@ def test_posix_readonly_destination_can_be_replaced(self): @unittest.skipUnless(os.name == "nt", "Windows directory junction replacement semantics") def test_dangling_directory_junction_preserves_all_existing_assets(self): - names = ["prx-linux-v1.zip", "prx-linux-v1.tar.gz", "relinker-v1"] + names = ["prx-linux-v1.zip", "prx-linux-v1.tar.gz", "prx-linux-unpatched-v1.zip", "prx-linux-unpatched-v1.tar.gz", "relinker-v1"] for index, blocked in enumerate(names): with self.subTest(blocked=blocked): output = self.output / str(index) @@ -544,11 +703,13 @@ def test_failed_tar_creation_preserves_existing_release_assets(self): build = root / "build" (build / "core/libs/libs").mkdir(parents=True) (build / "core/libs/libs/libc.prx").write_bytes(b"new library") + (build / "core/libs/libs/unpatched").mkdir() + (build / "core/libs/libs/unpatched/libc.prx").write_bytes(b"original library") (build / "core/relinker").mkdir(parents=True) (build / "core/relinker/relinker").write_bytes(b"new executable") output = root / "assets" output.mkdir() - names = ["prx-linux-v1.zip", "prx-linux-v1.tar.gz", "relinker-v1"] + names = ["prx-linux-v1.zip", "prx-linux-v1.tar.gz", "prx-linux-unpatched-v1.zip", "prx-linux-unpatched-v1.tar.gz", "relinker-v1"] for name in names: (output / name).write_bytes(b"old " + name.encode()) with working_directory(source), patch.object(package_release, "ROOT", source), \ @@ -926,6 +1087,25 @@ def test_main_reports_packaging_error_via_parser_error(self): 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_pad_timeline.py b/tools/tests/test_pad_timeline.py index baad322048f1..66682cf5ce72 100644 --- a/tools/tests/test_pad_timeline.py +++ b/tools/tests/test_pad_timeline.py @@ -191,6 +191,27 @@ def test_symbolic_link_loops_are_usage_errors(self): self.assertTrue(loop.is_symlink()) self.assertFalse((root / "command").exists()) + def test_excessively_nested_timelines_are_usage_errors(self): + depth = sys.getrecursionlimit() + 64 + for _ in range(8): + try: + json.loads("[" * depth + "]" * depth) + except RecursionError: + break + depth *= 2 + else: + self.fail("JSON decoder accepted every bounded nesting probe") + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + timeline, output = root / "sequence.json", root / "command" + timeline.write_text("[" * (depth + 128) + "]" * (depth + 128), encoding="utf-8") + result = self.run_cli(timeline, output) + self.assertEqual(result.returncode, 2) + self.assertTrue(result.stderr.startswith("pad_timeline: "), result.stderr) + self.assertNotIn("Traceback", result.stderr) + self.assertNotIn("must contain version and events", result.stderr) + self.assertFalse(output.exists()) + def test_output_directory_validation(self): with tempfile.TemporaryDirectory() as directory: root = Path(directory) diff --git a/tools/tests/test_patch_lib_atrac9.py b/tools/tests/test_patch_lib_atrac9.py new file mode 100644 index 000000000000..cedd3e718c2d --- /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 000000000000..bdbf2b14e26b --- /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 c5e6fcae05d6..4e9d3ccbae1e 100644 --- a/tools/tests/test_performance_compare.py +++ b/tools/tests/test_performance_compare.py @@ -56,6 +56,17 @@ def write(self, path, *records): 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 @@ def test_invalid_metric_and_metadata_shapes_are_rejected_with_location(self): 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 @@ def test_bad_json_and_missing_file_produce_only_a_cli_error(self): 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 @@ def test_excessive_json_nesting_produces_only_a_cli_error(self): 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 @@ def test_utf8_paths_and_metadata_work_with_a_non_utf8_output_default(self): 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 b15a8c25af82..abbe2ef58df5 100644 --- a/tools/tests/test_performance_csv.py +++ b/tools/tests/test_performance_csv.py @@ -86,6 +86,28 @@ def test_context_differences_and_notes_are_preserved_or_explicitly_rejected(self 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 @@ def test_invalid_input_does_not_emit_a_partial_csv(self): 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_labels.py b/tools/tests/test_pr_labels.py index 0fd66f628efb..ed133fa8883c 100644 --- a/tools/tests/test_pr_labels.py +++ b/tools/tests/test_pr_labels.py @@ -34,6 +34,26 @@ def pr(title="fix: x", body="", labels=()): class TitleIdTests(unittest.TestCase): + def test_malformed_pr_records_are_rejected_before_any_writes(self): + valid = {"number": 7, "title": "perf: x", "body": "", "labels": [], "state": "open"} + invalid = [None, [], {}, {**valid, "number": True}, {**valid, "number": 0}, + {**valid, "title": []}, {**valid, "body": 1}, {**valid, "state": []}, + {**valid, "labels": None}, {**valid, "labels": ["perf"]}, + {**valid, "labels": [{}]}, {**valid, "labels": [{"name": []}]}] + for record in invalid: + for arguments, response in ((["--pr", "7"], json.dumps(record)), + (["--all"], json.dumps([valid]) + "\n" + json.dumps([record]))): + with self.subTest(record=record, arguments=arguments), \ + patch.object(pr_labels, "gh", return_value=response) as api, \ + patch.dict(pr_labels.os.environ, {"GITHUB_REPOSITORY": "fixture/repo"}), \ + contextlib.redirect_stdout(io.StringIO()), contextlib.redirect_stderr(io.StringIO()) as errors: + with self.assertRaises(SystemExit) as raised: + pr_labels.main(arguments) + self.assertEqual(raised.exception.code, 2) + self.assertIn("cannot read pull requests", errors.getvalue()) + self.assertNotIn("Traceback", errors.getvalue()) + api.assert_called_once() + def test_forms(self): cases = [ (TEMPLATE, set()), diff --git a/tools/tests/test_pr_overlap_errors.py b/tools/tests/test_pr_overlap_errors.py index 17c7513a4956..bedb02812b0f 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 @@ def old_git(command, **kwargs): 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 c66efe523246..6ddcdc536594 100644 --- a/tools/tests/test_pr_overlap_export_cache.py +++ b/tools/tests/test_pr_overlap_export_cache.py @@ -13,7 +13,7 @@ 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 000000000000..c8e3fb69d8f0 --- /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 5dd6d64ed19d..572e39635b0e 100644 --- a/tools/tests/test_progress.py +++ b/tools/tests/test_progress.py @@ -11,6 +11,17 @@ import progress +def excessive_nesting(): + depth = sys.getrecursionlimit() + 64 + for _ in range(8): + try: + json.loads("[" * depth + "]" * depth) + except RecursionError: + return "[" * (depth + 128) + "]" * (depth + 128) + depth *= 2 + raise AssertionError("JSON decoder accepted every bounded nesting probe") + + class ProgressSnapshotTests(unittest.TestCase): def test_library_counters_reject_invalid_types_and_negative_values(self): for field in ("done", "todo"): @@ -60,6 +71,23 @@ def assert_rejected(self, snapshot, message): self.assertIn(message, stderr.getvalue()) self.assertNotIn("Traceback", stderr.getvalue()) + def test_deeply_nested_snapshots_are_usage_errors(self): + for position in (0, 1): + with self.subTest(position=position), tempfile.TemporaryDirectory() as directory: + paths = [Path(directory) / "base snapshot.json", Path(directory) / "head snapshot.json"] + for path in paths: + path.write_text(json.dumps(self.snapshot()), encoding="utf-8") + paths[position].write_text(excessive_nesting(), encoding="utf-8") + stdout, stderr = io.StringIO(), io.StringIO() + with patch("sys.stdout", stdout), patch("sys.stderr", stderr): + with self.assertRaises(SystemExit) as raised: + progress.main(["--compare", *map(str, paths)]) + self.assertEqual(raised.exception.code, 2) + self.assertEqual(stdout.getvalue(), "") + self.assertIn(str(paths[position]), stderr.getvalue()) + self.assertNotIn("must be an object", stderr.getvalue()) + self.assertNotIn("Traceback", stderr.getvalue()) + def test_non_object_snapshots_are_usage_errors(self): for snapshot in (None, [], "progress", 7, True): with self.subTest(snapshot=snapshot): @@ -166,8 +194,8 @@ def test_report_shows_each_changed_library_and_keeps_global_details(self): report = progress.report(base, head) self.assertIn("**System libraries**", report) self.assertIn("| Library | Name |", report) - self.assertIn("| libScePad | 1/2 (50.00%) | 2/2 (100.00%) | +50.00 pp |", report) - self.assertIn("| libSceVideoOut | 3/4 (75.00%) | 2/4 (50.00%) | -25.00 pp |", report) + self.assertIn("| libScePad | 1/2 (50.00%) | 2/2 (100.00%) | +50.00% |", report) + self.assertIn("| libSceVideoOut | 3/4 (75.00%) | 2/4 (50.00%) | -25.00% |", report) table = report.split("#### Changed libraries (implemented exports)")[1] self.assertNotIn("libSceUnused", table) self.assertLess(table.index("libScePad"), table.index("libSceVideoOut")) @@ -175,7 +203,7 @@ def test_report_shows_each_changed_library_and_keeps_global_details(self): def test_report_includes_changed_function_names_when_counts_stay_equal(self): base = self.report_snapshot(self.report_library("libScePad", ["Old"], ["Pending"])) head = self.report_snapshot(self.report_library("libScePad", ["New"], ["Pending"])) - self.assertIn("| libScePad | 1/2 (50.00%) | 1/2 (50.00%) | +0.00 pp |", progress.report(base, head)) + self.assertIn("| libScePad | 1/2 (50.00%) | 1/2 (50.00%) | +0.00% |", progress.report(base, head)) def test_report_marks_new_removed_and_empty_libraries_without_percentages(self): base = self.report_snapshot(self.report_library("libSceRemoved", ["Ready"]), @@ -257,32 +285,65 @@ def test_report_marks_a_headline_change_below_four_decimals(self): self.report_snapshot(after)["libraries"])[0] self.assertIn("(+<0.0001%, +1 implemented functions)", headline) - def test_report_rounds_percentage_point_change_without_negative_zero(self): + def test_percent_change_is_n_a_when_a_percentage_is_missing(self): + self.assertEqual(progress.percent_change(None, 50), "n/a") + self.assertEqual(progress.percent_change(50, None), "n/a") + self.assertEqual(progress.percent_change(None, None), "n/a") + + def test_percent_change_keeps_the_sign_and_two_decimals(self): + self.assertEqual(progress.percent_change(50, 100), "+50.00%") + self.assertEqual(progress.percent_change(75, 50), "-25.00%") + self.assertEqual(progress.percent_change(0, 100), "+100.00%") + self.assertEqual(progress.percent_change(100, 0), "-100.00%") + self.assertEqual(progress.percent_change(33.33, 66.67), "+33.34%") + + def test_percent_change_never_prints_a_negative_zero(self): + self.assertEqual(progress.percent_change(50, 50), "+0.00%") + self.assertEqual(progress.percent_change(50, 49.996), "+0.00%") + self.assertEqual(progress.percent_change(49.996, 50), "+0.00%") + + def test_report_headline_writes_its_change_in_percent_for_gains_and_losses(self): + gain = progress.report(self.report_snapshot(self.report_library("libScePad", ["R"], ["A", "B"])), + self.report_snapshot(self.report_library("libScePad", ["R", "A"], ["B"]))) + loss = progress.report(self.report_snapshot(self.report_library("libScePad", ["R", "A"], ["B"])), + self.report_snapshot(self.report_library("libScePad", ["R"], ["A", "B"]))) + self.assertRegex(gain.splitlines()[0], r"\*\*: [0-9.]+% \(\+[0-9.]+%[,)]") + self.assertRegex(loss.splitlines()[0], r"\*\*: [0-9.]+% \(-[0-9.]+%[,)]") + + def test_report_table_writes_its_change_in_percent_and_never_in_pp(self): + base = self.report_snapshot(self.report_library("libScePad", ["Ready"], ["A", "B"])) + head = self.report_snapshot(self.report_library("libScePad", ["Ready", "A"], ["B"])) + report = progress.report(base, head) + row = next(line for line in report.splitlines() if line.startswith("| libScePad | 1/3")) + self.assertTrue(row.endswith("| +33.33% |"), row) + self.assertNotIn(" pp", report) + + def test_report_rounds_percentage_change_without_negative_zero(self): base = self.report_snapshot(self.report_library("libScePad", ["Ready"], ["A", "B"])) head = self.report_snapshot(self.report_library("libScePad", ["Ready", "A"], ["B"])) - self.assertIn("| libScePad | 1/3 (33.33%) | 2/3 (66.67%) | +33.33 pp |", progress.report(base, head)) + self.assertIn("| libScePad | 1/3 (33.33%) | 2/3 (66.67%) | +33.33% |", progress.report(base, head)) before = dict(self.report_library("libSceLarge", ["Ready"]), todo=100000) after = dict(before, todo=100001) - self.assertIn("| -<0.0001 pp |", progress.report(self.report_snapshot(before), self.report_snapshot(after))) - self.assertNotIn("-0.00 pp", progress.report(self.report_snapshot(before), self.report_snapshot(after))) + self.assertIn("| -<0.0001% |", progress.report(self.report_snapshot(before), self.report_snapshot(after))) + self.assertNotIn("-0.00%", progress.report(self.report_snapshot(before), self.report_snapshot(after))) def test_report_shows_a_library_change_that_two_decimals_would_hide(self): before = dict(self.report_library("libc", ["A"], ["T"]), done=1340, todo=11) after = dict(self.report_library("libc", ["A", "B"], ["T"]), done=1341, todo=11) - self.assertIn("| libc | 1340/1351 (99.19%) | 1341/1352 (99.19%) | +0.0006 pp |", + self.assertIn("| libc | 1340/1351 (99.19%) | 1341/1352 (99.19%) | +0.0006% |", progress.report(self.report_snapshot(before), self.report_snapshot(after))) same = dict(self.report_library("libc", ["B"], ["T"]), done=1340, todo=11) - self.assertIn("| +0.00 pp |", progress.report(self.report_snapshot(before), self.report_snapshot(same))) + self.assertIn("| +0.00% |", progress.report(self.report_snapshot(before), self.report_snapshot(same))) def test_report_compares_libraries_whose_counts_are_floats(self): before = dict(self.report_library("libc", ["A"], ["T"]), done=1.0, todo=2.0) after = dict(self.report_library("libc", ["A", "B"], ["T"]), done=2.0, todo=3.0) report = progress.report(self.report_snapshot(before), self.report_snapshot(after)) - self.assertIn("| libc | 1.0/3.0 (33.33%) | 2.0/5.0 (40.00%) | +6.67 pp |", report) + self.assertIn("| libc | 1.0/3.0 (33.33%) | 2.0/5.0 (40.00%) | +6.67% |", report) tiny_before = dict(before, done=1340.0, todo=11.0) tiny_after = dict(after, done=1341.0, todo=11.0) report = progress.report(self.report_snapshot(tiny_before), self.report_snapshot(tiny_after)) - self.assertIn("| +0.00 pp |", report) + self.assertIn("| +0.00% |", report) def test_report_limits_library_rows(self): head = self.report_snapshot(*(self.report_library(f"libSce{i:03}", ["Ready"]) for i in range(103))) @@ -291,6 +352,18 @@ def test_report_limits_library_rows(self): 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 000000000000..afcde2ac059a --- /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_sanitizer_report.py b/tools/tests/test_sanitizer_report.py index f696858c4d75..474df62f22e7 100644 --- a/tools/tests/test_sanitizer_report.py +++ b/tools/tests/test_sanitizer_report.py @@ -6,6 +6,7 @@ import sys import tempfile import unittest +import unittest.mock sys.path.insert(0, str(Path(__file__).resolve().parents[1])) import sanitizer_report @@ -134,6 +135,27 @@ def test_summary_write_failure_is_reported_without_a_successful_report(self): self.assertTrue(stderr.startswith("sanitizer_report: ")) self.assertNotIn("Traceback", stderr) + def test_summary_symlink_loop_resolution_failure_exits_with_2(self): + junit = self.write(suite(case("passes")), "report.xml") + summary = Path(self.directory.name) / "summary_mock.md" + with unittest.mock.patch.object(Path, "resolve", side_effect=RuntimeError("Symlink loop from 'summary_mock.md'")): + code, stdout, stderr = self.run_main(junit, "--summary", summary) + self.assertEqual(code, 2) + self.assertEqual(stdout, "") + self.assertTrue(stderr.startswith("sanitizer_report: ")) + + loop_a = Path(self.directory.name) / "loop_a.md" + loop_b = Path(self.directory.name) / "loop_b.md" + try: + loop_a.symlink_to(loop_b) + loop_b.symlink_to(loop_a) + except OSError: + return + code, stdout, stderr = self.run_main(junit, "--summary", loop_a) + self.assertEqual(code, 2) + self.assertEqual(stdout, "") + self.assertTrue(stderr.startswith("sanitizer_report: ")) + def write_known(self, *lines): return self.write("\n".join(lines) + "\n", "known.txt") @@ -313,5 +335,6 @@ def test_separate_summary_still_appends(self): self.assertEqual(source.read_text(), suite(case("unit"))) + if __name__ == "__main__": unittest.main() diff --git a/tools/tests/test_select_tests.py b/tools/tests/test_select_tests.py index 7ee14f51caeb..b74e88720ac1 100644 --- a/tools/tests/test_select_tests.py +++ b/tools/tests/test_select_tests.py @@ -383,6 +383,38 @@ def test_header_under_a_non_ascii_directory_is_an_input_of_its_tests(self): 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 435ae833f5ed..8c00a9d4d564 100644 --- a/tools/tests/test_stubgen.py +++ b/tools/tests/test_stubgen.py @@ -400,5 +400,38 @@ def test_case_variant_outputs_stay_distinct_on_case_sensitive_directories(self): 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 3d75957d759b..07af2d78f9bc 100644 --- a/tools/tests/test_symbolize_samples.py +++ b/tools/tests/test_symbolize_samples.py @@ -288,12 +288,48 @@ def test_coff_symbols_name_code_addresses(self): self.assertNotIn("data_obj", module.names) self.assertNotIn(".text", module.names) + def test_coff_long_names_stay_inside_the_declared_string_table(self): + path = self.libs / "libSceAgcDriver.prx" + original = path.read_bytes() + table, count = struct.unpack_from("<II", original, 0x4C) + strings = table + count * 18 + for length, offset in ((4, 4), (8, 4), (3, 4), (0x1000, 4), (32, 0), (32, 32)): + with self.subTest(length=length, offset=offset): + data = bytearray(original) + struct.pack_into("<I", data, strings, length) + struct.pack_into("<I", data, table + 3 * 18 + 4, offset) + path.write_bytes(data) + with self.assertRaisesRegex(ValueError, "COFF string table"): + symbolize_samples.PeModule(path) + + def test_coff_auxiliary_records_cannot_exceed_the_symbol_count(self): + path = self.libs / "libSceAgcDriver.prx" + data = bytearray(path.read_bytes()) + table, count = struct.unpack_from("<II", data, 0x4C) + data[table + (count - 1) * 18 + 17] = 1 + path.write_bytes(data) + with self.assertRaisesRegex(ValueError, "COFF auxiliary"): + symbolize_samples.PeModule(path) + def test_export_table_names_a_module_without_symbols(self): module = symbolize_samples.PeModule(self.libs / "libwinpthread-1.dll") self.assertTrue(module.exported) 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") @@ -365,6 +401,29 @@ def test_a_module_without_a_record_stays_unsymbolized_unless_unverified(self): 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" @@ -453,6 +512,30 @@ def test_unusable_inputs_are_usage_errors(self): 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 ee5c61f6dc05..4ba320e93b93 100644 --- a/tools/tests/test_test_registration.py +++ b/tools/tests/test_test_registration.py @@ -15,6 +15,17 @@ 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 ccd7dde1c4b5..8593ae8e974a 100644 --- a/tools/tests/test_trace_digest.py +++ b/tools/tests/test_trace_digest.py @@ -237,6 +237,8 @@ def test_cli_rejects_invalid_event_fields_without_partial_output(self): (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 @@ def test_thread_filter_keeps_frame_bounds_and_capture_summary(self): 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 @@ def test_invalid_percentile_values_are_rejected(self): 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 c49e0f5f0c82..5184bf189468 100644 --- a/tools/tests/test_unwrap_self.py +++ b/tools/tests/test_unwrap_self.py @@ -16,6 +16,7 @@ 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 @@ def test_output_aliases_cannot_replace_the_input_container(self): 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 @@ def test_symbolic_link_loops_are_reported_without_a_traceback(self): 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 @@ def test_segment_stale_offset_before_the_recorded_shift_is_refused(self): 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 @@ def test_tls_layouts_the_relinker_rejects_are_refused(self): 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 @@ def test_huge_stale_offset_is_refused_instead_of_exhausting_memory(self): 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 @@ def test_many_load_segments_over_one_range_are_refused_instead_of_exhausting_mem 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 @@ def test_temporary_name_collision_preserves_all_existing_files(self): 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 @@ def test_new_output_permissions_follow_the_process_umask(self): 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 @@ def convert(self, container, name="input.self"): 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 @@ def test_the_verbose_report_names_every_program_header(self): 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 @@ def test_invalid_load_metadata_is_refused_before_replacing_output(self): 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 b32683f06ca7..68fd9348acdb 100644 --- a/tools/tests/test_web_release.py +++ b/tools/tests/test_web_release.py @@ -76,6 +76,10 @@ def test_cli_reports_unsupported_zip_without_traceback_or_site_changes(self): def setUp(self): self.directory = tempfile.TemporaryDirectory() self.addCleanup(self.directory.cleanup) + patcher = patch.object(build_web, "release_web_files", + side_effect=lambda rev: set(FILES) if rev == REVISION else None) + patcher.start() + self.addCleanup(patcher.stop) self.root = Path(self.directory.name) self.build = self.root / "build" self.output = self.build / "web" @@ -465,6 +469,27 @@ def test_main_rejects_missing_archive_file_without_traceback(self): 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 7b057e95e37e..f0ccfc24ea72 100644 --- a/tools/trace_digest.py +++ b/tools/trace_digest.py @@ -86,6 +86,8 @@ def __init__(self, document): 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 9f554a8b9209..00d8b6ac721c 100644 --- a/tools/unwrap_self.py +++ b/tools/unwrap_self.py @@ -51,6 +51,7 @@ 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)