aboutsummaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorPavelBARABANOV <pavelbarabanov94@gmail.com>2026-10-15 08:45:15 +0200
committercrueter <crueter@eden-emu.dev>2026-10-15 08:45:15 +0200
commite255c20db4111485d228c10478bda63aabcfdde5 (patch)
tree1f8c88981b60e9a4db4ed306742196b1c4b68116 /src/core
parent14da4482a4668928bad43bb67ef12f96b9c9d972 (diff)
Revert "[hle] constexpr handler dispatch maps, introduce version gating (#4480)" (#4532)
This reverts commit 218c6705d950635bc18f8458d738a1996fb592b6. - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md). - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4532 Reviewed-by: lizzie <lizzie@eden-emu.dev> Reviewed-by: CamilleLaVey <camillelavey99@gmail.com> Reviewed-by: Maufeat <sahyno1996@gmail.com>
Diffstat (limited to 'src/core')
-rw-r--r--src/core/CMakeLists.txt70
-rw-r--r--src/core/hle/service/acc/acc.cpp1931
-rw-r--r--src/core/hle/service/acc/acc.h64
-rw-r--r--src/core/hle/service/acc/async_context.cpp11
-rw-r--r--src/core/hle/service/acc/async_context.h10
-rw-r--r--src/core/hle/service/acc/errors.h3
-rw-r--r--src/core/hle/service/am/am.cpp1338
-rw-r--r--src/core/hle/service/am/am.h3
-rw-r--r--src/core/hle/service/am/applet_manager.h2
-rw-r--r--src/core/hle/service/am/frontend/applet_cabinet.h3
-rw-r--r--src/core/hle/service/am/frontend/applet_controller.h2
-rw-r--r--src/core/hle/service/am/frontend/applet_error.h3
-rw-r--r--src/core/hle/service/am/frontend/applet_general.h3
-rw-r--r--src/core/hle/service/am/frontend/applet_mii_edit.h3
-rw-r--r--src/core/hle/service/am/frontend/applet_mii_edit_types.h3
-rw-r--r--src/core/hle/service/am/frontend/applet_net_connect.h2
-rw-r--r--src/core/hle/service/am/frontend/applet_profile_select.cpp3
-rw-r--r--src/core/hle/service/am/frontend/applet_profile_select.h3
-rw-r--r--src/core/hle/service/am/frontend/applet_software_keyboard_types.h3
-rw-r--r--src/core/hle/service/am/frontend/applet_web_browser.h2
-rw-r--r--src/core/hle/service/am/frontend/applets.h2
-rw-r--r--src/core/hle/service/am/process_holder.cpp3
-rw-r--r--src/core/hle/service/am/process_holder.h3
-rw-r--r--src/core/hle/service/am/service/all_system_applet_proxies_service.cpp135
-rw-r--r--src/core/hle/service/am/service/all_system_applet_proxies_service.h56
-rw-r--r--src/core/hle/service/am/service/applet_common_functions.cpp98
-rw-r--r--src/core/hle/service/am/service/applet_common_functions.h33
-rw-r--r--src/core/hle/service/am/service/application_accessor.cpp64
-rw-r--r--src/core/hle/service/am/service/application_accessor.h1
-rw-r--r--src/core/hle/service/am/service/application_creator.cpp20
-rw-r--r--src/core/hle/service/am/service/application_creator.h1
-rw-r--r--src/core/hle/service/am/service/application_functions.cpp153
-rw-r--r--src/core/hle/service/am/service/application_functions.h1
-rw-r--r--src/core/hle/service/am/service/application_proxy.cpp109
-rw-r--r--src/core/hle/service/am/service/application_proxy.h52
-rw-r--r--src/core/hle/service/am/service/application_proxy_service.cpp47
-rw-r--r--src/core/hle/service/am/service/application_proxy_service.h36
-rw-r--r--src/core/hle/service/am/service/audio_controller.cpp24
-rw-r--r--src/core/hle/service/am/service/audio_controller.h1
-rw-r--r--src/core/hle/service/am/service/common_state_getter.cpp209
-rw-r--r--src/core/hle/service/am/service/common_state_getter.h1
-rw-r--r--src/core/hle/service/am/service/cradle_firmware_updater.cpp25
-rw-r--r--src/core/hle/service/am/service/cradle_firmware_updater.h1
-rw-r--r--src/core/hle/service/am/service/debug_functions.cpp46
-rw-r--r--src/core/hle/service/am/service/debug_functions.h19
-rw-r--r--src/core/hle/service/am/service/display_controller.cpp68
-rw-r--r--src/core/hle/service/am/service/display_controller.h1
-rw-r--r--src/core/hle/service/am/service/global_state_controller.cpp38
-rw-r--r--src/core/hle/service/am/service/global_state_controller.h4
-rw-r--r--src/core/hle/service/am/service/home_menu_functions.cpp42
-rw-r--r--src/core/hle/service/am/service/home_menu_functions.h1
-rw-r--r--src/core/hle/service/am/service/library_applet_accessor.cpp64
-rw-r--r--src/core/hle/service/am/service/library_applet_accessor.h22
-rw-r--r--src/core/hle/service/am/service/library_applet_creator.cpp287
-rw-r--r--src/core/hle/service/am/service/library_applet_creator.h44
-rw-r--r--src/core/hle/service/am/service/library_applet_proxy.cpp137
-rw-r--r--src/core/hle/service/am/service/library_applet_proxy.h59
-rw-r--r--src/core/hle/service/am/service/library_applet_self_accessor.cpp332
-rw-r--r--src/core/hle/service/am/service/library_applet_self_accessor.h87
-rw-r--r--src/core/hle/service/am/service/lock_accessor.cpp78
-rw-r--r--src/core/hle/service/am/service/lock_accessor.h35
-rw-r--r--src/core/hle/service/am/service/overlay_applet_proxy.cpp120
-rw-r--r--src/core/hle/service/am/service/overlay_applet_proxy.h55
-rw-r--r--src/core/hle/service/am/service/overlay_functions.cpp52
-rw-r--r--src/core/hle/service/am/service/overlay_functions.h35
-rw-r--r--src/core/hle/service/am/service/process_winding_controller.cpp28
-rw-r--r--src/core/hle/service/am/service/process_winding_controller.h1
-rw-r--r--src/core/hle/service/am/service/self_controller.cpp113
-rw-r--r--src/core/hle/service/am/service/self_controller.h1
-rw-r--r--src/core/hle/service/am/service/storage.cpp78
-rw-r--r--src/core/hle/service/am/service/storage.h1
-rw-r--r--src/core/hle/service/am/service/storage_accessor.cpp71
-rw-r--r--src/core/hle/service/am/service/storage_accessor.h41
-rw-r--r--src/core/hle/service/am/service/system_applet_proxy.cpp136
-rw-r--r--src/core/hle/service/am/service/system_applet_proxy.h58
-rw-r--r--src/core/hle/service/am/service/window_controller.cpp28
-rw-r--r--src/core/hle/service/am/service/window_controller.h1
-rw-r--r--src/core/hle/service/aoc/addon_content_manager.cpp57
-rw-r--r--src/core/hle/service/aoc/addon_content_manager.h2
-rw-r--r--src/core/hle/service/aoc/purchase_event_manager.cpp27
-rw-r--r--src/core/hle/service/aoc/purchase_event_manager.h2
-rw-r--r--src/core/hle/service/apm/apm.h3
-rw-r--r--src/core/hle/service/apm/apm_controller.h3
-rw-r--r--src/core/hle/service/apm/apm_interface.cpp38
-rw-r--r--src/core/hle/service/apm/apm_interface.h21
-rw-r--r--src/core/hle/service/audio/audio.cpp208
-rw-r--r--src/core/hle/service/audio/audio.h3
-rw-r--r--src/core/hle/service/audio/audio_controller.cpp139
-rw-r--r--src/core/hle/service/audio/audio_controller.h2
-rw-r--r--src/core/hle/service/audio/audio_device.cpp52
-rw-r--r--src/core/hle/service/audio/audio_device.h1
-rw-r--r--src/core/hle/service/audio/audio_in.cpp50
-rw-r--r--src/core/hle/service/audio/audio_in.h1
-rw-r--r--src/core/hle/service/audio/audio_in_manager.cpp30
-rw-r--r--src/core/hle/service/audio/audio_in_manager.h1
-rw-r--r--src/core/hle/service/audio/audio_out.cpp40
-rw-r--r--src/core/hle/service/audio/audio_out.h2
-rw-r--r--src/core/hle/service/audio/audio_out_manager.cpp20
-rw-r--r--src/core/hle/service/audio/audio_out_manager.h1
-rw-r--r--src/core/hle/service/audio/audio_renderer.cpp51
-rw-r--r--src/core/hle/service/audio/audio_renderer.h1
-rw-r--r--src/core/hle/service/audio/audio_renderer_manager.cpp22
-rw-r--r--src/core/hle/service/audio/audio_renderer_manager.h1
-rw-r--r--src/core/hle/service/audio/final_output_recorder_manager.cpp41
-rw-r--r--src/core/hle/service/audio/final_output_recorder_manager.h7
-rw-r--r--src/core/hle/service/audio/final_output_recorder_manager_for_applet.cpp8
-rw-r--r--src/core/hle/service/audio/final_output_recorder_manager_for_applet.h8
-rw-r--r--src/core/hle/service/audio/hardware_opus_decoder.cpp32
-rw-r--r--src/core/hle/service/audio/hardware_opus_decoder.h1
-rw-r--r--src/core/hle/service/audio/hardware_opus_decoder_manager.cpp31
-rw-r--r--src/core/hle/service/audio/hardware_opus_decoder_manager.h1
-rw-r--r--src/core/hle/service/bcat/bcat.h3
-rw-r--r--src/core/hle/service/bcat/bcat_result.h3
-rw-r--r--src/core/hle/service/bcat/bcat_service.cpp75
-rw-r--r--src/core/hle/service/bcat/bcat_service.h1
-rw-r--r--src/core/hle/service/bcat/delivery_cache_directory_service.cpp18
-rw-r--r--src/core/hle/service/bcat/delivery_cache_directory_service.h1
-rw-r--r--src/core/hle/service/bcat/delivery_cache_file_service.cpp20
-rw-r--r--src/core/hle/service/bcat/delivery_cache_file_service.h1
-rw-r--r--src/core/hle/service/bcat/delivery_cache_progress_service.cpp16
-rw-r--r--src/core/hle/service/bcat/delivery_cache_progress_service.h1
-rw-r--r--src/core/hle/service/bcat/delivery_cache_storage_service.cpp18
-rw-r--r--src/core/hle/service/bcat/delivery_cache_storage_service.h1
-rw-r--r--src/core/hle/service/bcat/news/builtin_news.h2
-rw-r--r--src/core/hle/service/bcat/news/msgpack.cpp2
-rw-r--r--src/core/hle/service/bcat/news/msgpack.h2
-rw-r--r--src/core/hle/service/bcat/news/newly_arrived_event_holder.cpp19
-rw-r--r--src/core/hle/service/bcat/news/newly_arrived_event_holder.h1
-rw-r--r--src/core/hle/service/bcat/news/news_data_service.cpp19
-rw-r--r--src/core/hle/service/bcat/news/news_data_service.h1
-rw-r--r--src/core/hle/service/bcat/news/news_database_service.cpp23
-rw-r--r--src/core/hle/service/bcat/news/news_database_service.h2
-rw-r--r--src/core/hle/service/bcat/news/news_service.cpp50
-rw-r--r--src/core/hle/service/bcat/news/news_service.h9
-rw-r--r--src/core/hle/service/bcat/news/news_storage.cpp2
-rw-r--r--src/core/hle/service/bcat/news/overwrite_event_holder.cpp18
-rw-r--r--src/core/hle/service/bcat/news/overwrite_event_holder.h1
-rw-r--r--src/core/hle/service/bcat/news/service_creator.cpp22
-rw-r--r--src/core/hle/service/bcat/news/service_creator.h1
-rw-r--r--src/core/hle/service/bcat/service_creator.cpp26
-rw-r--r--src/core/hle/service/bcat/service_creator.h1
-rw-r--r--src/core/hle/service/bpc/bpc.cpp142
-rw-r--r--src/core/hle/service/bpc/bpc.h3
-rw-r--r--src/core/hle/service/btdrv/btdrv.cpp312
-rw-r--r--src/core/hle/service/btdrv/btdrv.h3
-rw-r--r--src/core/hle/service/btm/btm.cpp497
-rw-r--r--src/core/hle/service/btm/btm.h3
-rw-r--r--src/core/hle/service/btm/btm_debug.cpp40
-rw-r--r--src/core/hle/service/btm/btm_debug.h24
-rw-r--r--src/core/hle/service/btm/btm_system.cpp34
-rw-r--r--src/core/hle/service/btm/btm_system.h28
-rw-r--r--src/core/hle/service/btm/btm_system_core.cpp135
-rw-r--r--src/core/hle/service/btm/btm_system_core.h62
-rw-r--r--src/core/hle/service/btm/btm_user.cpp33
-rw-r--r--src/core/hle/service/btm/btm_user.h28
-rw-r--r--src/core/hle/service/btm/btm_user_core.cpp106
-rw-r--r--src/core/hle/service/btm/btm_user_core.h50
-rw-r--r--src/core/hle/service/caps/caps.cpp218
-rw-r--r--src/core/hle/service/caps/caps.h3
-rw-r--r--src/core/hle/service/caps/caps_a.cpp211
-rw-r--r--src/core/hle/service/caps/caps_a.h63
-rw-r--r--src/core/hle/service/caps/caps_c.cpp50
-rw-r--r--src/core/hle/service/caps/caps_c.h9
-rw-r--r--src/core/hle/service/caps/caps_result.h3
-rw-r--r--src/core/hle/service/caps/caps_sc.cpp26
-rw-r--r--src/core/hle/service/caps/caps_sc.h26
-rw-r--r--src/core/hle/service/caps/caps_ss.cpp26
-rw-r--r--src/core/hle/service/caps/caps_ss.h1
-rw-r--r--src/core/hle/service/caps/caps_su.cpp22
-rw-r--r--src/core/hle/service/caps/caps_su.h2
-rw-r--r--src/core/hle/service/caps/caps_u.cpp40
-rw-r--r--src/core/hle/service/caps/caps_u.h1
-rw-r--r--src/core/hle/service/cmif_types.h3
-rw-r--r--src/core/hle/service/erpt/erpt.cpp68
-rw-r--r--src/core/hle/service/erpt/erpt.h3
-rw-r--r--src/core/hle/service/es/es.cpp342
-rw-r--r--src/core/hle/service/es/es.h3
-rw-r--r--src/core/hle/service/eupld/eupld.cpp48
-rw-r--r--src/core/hle/service/eupld/eupld.h3
-rw-r--r--src/core/hle/service/fatal/fatal.cpp31
-rw-r--r--src/core/hle/service/fatal/fatal.h3
-rw-r--r--src/core/hle/service/fatal/fatal_p.cpp22
-rw-r--r--src/core/hle/service/fatal/fatal_p.h19
-rw-r--r--src/core/hle/service/fatal/fatal_u.cpp23
-rw-r--r--src/core/hle/service/fatal/fatal_u.h19
-rw-r--r--src/core/hle/service/fgm/fgm.cpp58
-rw-r--r--src/core/hle/service/fgm/fgm.h3
-rw-r--r--src/core/hle/service/filesystem/fsp/fs_i_directory.cpp13
-rw-r--r--src/core/hle/service/filesystem/fsp/fs_i_directory.h2
-rw-r--r--src/core/hle/service/filesystem/fsp/fs_i_file.cpp12
-rw-r--r--src/core/hle/service/filesystem/fsp/fs_i_file.h13
-rw-r--r--src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp43
-rw-r--r--src/core/hle/service/filesystem/fsp/fs_i_filesystem.h1
-rw-r--r--src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.cpp5
-rw-r--r--src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.h7
-rw-r--r--src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.cpp5
-rw-r--r--src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.h6
-rw-r--r--src/core/hle/service/filesystem/fsp/fs_i_storage.cpp9
-rw-r--r--src/core/hle/service/filesystem/fsp/fs_i_storage.h15
-rw-r--r--src/core/hle/service/filesystem/fsp/fsp_ldr.cpp9
-rw-r--r--src/core/hle/service/filesystem/fsp/fsp_ldr.h9
-rw-r--r--src/core/hle/service/filesystem/fsp/fsp_pr.cpp10
-rw-r--r--src/core/hle/service/filesystem/fsp/fsp_pr.h10
-rw-r--r--src/core/hle/service/filesystem/fsp/fsp_srv.cpp271
-rw-r--r--src/core/hle/service/filesystem/fsp/fsp_srv.h1
-rw-r--r--src/core/hle/service/filesystem/fsp/fsp_types.h3
-rw-r--r--src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.cpp3
-rw-r--r--src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.h3
-rw-r--r--src/core/hle/service/filesystem/romfs_controller.cpp3
-rw-r--r--src/core/hle/service/filesystem/romfs_controller.h3
-rw-r--r--src/core/hle/service/filesystem/save_data_controller.cpp2
-rw-r--r--src/core/hle/service/filesystem/save_data_controller.h3
-rw-r--r--src/core/hle/service/friend/friend.cpp378
-rw-r--r--src/core/hle/service/friend/friend.h3
-rw-r--r--src/core/hle/service/friend/friend_interface.cpp23
-rw-r--r--src/core/hle/service/friend/friend_interface.h19
-rw-r--r--src/core/hle/service/glue/arp.cpp44
-rw-r--r--src/core/hle/service/glue/arp.h23
-rw-r--r--src/core/hle/service/glue/bgtc.cpp43
-rw-r--r--src/core/hle/service/glue/bgtc.h39
-rw-r--r--src/core/hle/service/glue/ectx.cpp38
-rw-r--r--src/core/hle/service/glue/ectx.h26
-rw-r--r--src/core/hle/service/glue/errors.h3
-rw-r--r--src/core/hle/service/glue/glue.h3
-rw-r--r--src/core/hle/service/glue/glue_manager.cpp3
-rw-r--r--src/core/hle/service/glue/glue_manager.h3
-rw-r--r--src/core/hle/service/glue/notif.cpp98
-rw-r--r--src/core/hle/service/glue/notif.h2
-rw-r--r--src/core/hle/service/glue/time/alarm_worker.h3
-rw-r--r--src/core/hle/service/glue/time/file_timestamp_worker.cpp3
-rw-r--r--src/core/hle/service/glue/time/file_timestamp_worker.h3
-rw-r--r--src/core/hle/service/glue/time/manager.cpp2
-rw-r--r--src/core/hle/service/glue/time/manager.h3
-rw-r--r--src/core/hle/service/glue/time/pm_state_change_handler.cpp3
-rw-r--r--src/core/hle/service/glue/time/pm_state_change_handler.h3
-rw-r--r--src/core/hle/service/glue/time/standard_steady_clock_resource.cpp3
-rw-r--r--src/core/hle/service/glue/time/standard_steady_clock_resource.h3
-rw-r--r--src/core/hle/service/glue/time/static.cpp56
-rw-r--r--src/core/hle/service/glue/time/static.h3
-rw-r--r--src/core/hle/service/glue/time/time_zone.cpp40
-rw-r--r--src/core/hle/service/glue/time/time_zone.h1
-rw-r--r--src/core/hle/service/glue/time/time_zone_binary.cpp3
-rw-r--r--src/core/hle/service/glue/time/time_zone_binary.h3
-rw-r--r--src/core/hle/service/glue/time/worker.h3
-rw-r--r--src/core/hle/service/gpio/gpio.cpp16
-rw-r--r--src/core/hle/service/grc/grc.cpp41
-rw-r--r--src/core/hle/service/grc/grc.h3
-rw-r--r--src/core/hle/service/hid/active_vibration_device_list.cpp14
-rw-r--r--src/core/hle/service/hid/active_vibration_device_list.h2
-rw-r--r--src/core/hle/service/hid/applet_resource.cpp11
-rw-r--r--src/core/hle/service/hid/applet_resource.h1
-rw-r--r--src/core/hle/service/hid/hid.cpp365
-rw-r--r--src/core/hle/service/hid/hid.h3
-rw-r--r--src/core/hle/service/hid/hid_debug_server.cpp294
-rw-r--r--src/core/hle/service/hid/hid_debug_server.h26
-rw-r--r--src/core/hle/service/hid/hid_server.cpp396
-rw-r--r--src/core/hle/service/hid/hid_server.h2
-rw-r--r--src/core/hle/service/hid/hid_system_server.cpp246
-rw-r--r--src/core/hle/service/hid/hid_system_server.h246
-rw-r--r--src/core/hle/service/hid/hidbus.cpp42
-rw-r--r--src/core/hle/service/hid/hidbus.h2
-rw-r--r--src/core/hle/service/hid/irs.cpp58
-rw-r--r--src/core/hle/service/hid/irs.h12
-rw-r--r--src/core/hle/service/hid/xcd.cpp27
-rw-r--r--src/core/hle/service/hid/xcd.h27
-rw-r--r--src/core/hle/service/i2c/i2c.cpp54
-rw-r--r--src/core/hle/service/jit/jit.cpp37
-rw-r--r--src/core/hle/service/jit/jit.h3
-rw-r--r--src/core/hle/service/jit/jit_context.h3
-rw-r--r--src/core/hle/service/lbl/lbl.cpp73
-rw-r--r--src/core/hle/service/lbl/lbl.h3
-rw-r--r--src/core/hle/service/ldn/lan_discovery.cpp3
-rw-r--r--src/core/hle/service/ldn/lan_discovery.h3
-rw-r--r--src/core/hle/service/ldn/ldn.cpp138
-rw-r--r--src/core/hle/service/ldn/ldn.h3
-rw-r--r--src/core/hle/service/ldn/ldn_results.h3
-rw-r--r--src/core/hle/service/ldn/monitor_service.cpp28
-rw-r--r--src/core/hle/service/ldn/monitor_service.h1
-rw-r--r--src/core/hle/service/ldn/sf_monitor_service.cpp18
-rw-r--r--src/core/hle/service/ldn/sf_monitor_service.h1
-rw-r--r--src/core/hle/service/ldn/sf_service.cpp40
-rw-r--r--src/core/hle/service/ldn/sf_service.h24
-rw-r--r--src/core/hle/service/ldn/sf_service_monitor.cpp38
-rw-r--r--src/core/hle/service/ldn/sf_service_monitor.h4
-rw-r--r--src/core/hle/service/ldn/system_local_communication_service.cpp72
-rw-r--r--src/core/hle/service/ldn/system_local_communication_service.h1
-rw-r--r--src/core/hle/service/ldn/user_local_communication_service.cpp73
-rw-r--r--src/core/hle/service/ldn/user_local_communication_service.h5
-rw-r--r--src/core/hle/service/ldr/ldr.cpp53
-rw-r--r--src/core/hle/service/ldr/ldr.h3
-rw-r--r--src/core/hle/service/lm/lm.cpp55
-rw-r--r--src/core/hle/service/lm/lm.h3
-rw-r--r--src/core/hle/service/mig/mig.cpp84
-rw-r--r--src/core/hle/service/mig/mig.h3
-rw-r--r--src/core/hle/service/mii/mii.cpp136
-rw-r--r--src/core/hle/service/mii/mii.h1
-rw-r--r--src/core/hle/service/mii/mii_database.cpp2
-rw-r--r--src/core/hle/service/mii/mii_database.h3
-rw-r--r--src/core/hle/service/mii/mii_database_manager.h3
-rw-r--r--src/core/hle/service/mii/mii_manager.h3
-rw-r--r--src/core/hle/service/mii/mii_result.h3
-rw-r--r--src/core/hle/service/mii/mii_types.h3
-rw-r--r--src/core/hle/service/mii/types/char_info.cpp3
-rw-r--r--src/core/hle/service/mii/types/char_info.h3
-rw-r--r--src/core/hle/service/mii/types/core_data.cpp3
-rw-r--r--src/core/hle/service/mii/types/core_data.h3
-rw-r--r--src/core/hle/service/mii/types/raw_data.h3
-rw-r--r--src/core/hle/service/mii/types/store_data.cpp3
-rw-r--r--src/core/hle/service/mii/types/store_data.h3
-rw-r--r--src/core/hle/service/mii/types/ver3_store_data.cpp3
-rw-r--r--src/core/hle/service/mii/types/ver3_store_data.h3
-rw-r--r--src/core/hle/service/mm/mm_u.cpp29
-rw-r--r--src/core/hle/service/mm/mm_u.h3
-rw-r--r--src/core/hle/service/mnpp/mnpp.cpp64
-rw-r--r--src/core/hle/service/ncm/ncm.cpp228
-rw-r--r--src/core/hle/service/ncm/ncm.h3
-rw-r--r--src/core/hle/service/nfc/common/device.h3
-rw-r--r--src/core/hle/service/nfc/common/device_manager.h3
-rw-r--r--src/core/hle/service/nfc/mifare_result.h3
-rw-r--r--src/core/hle/service/nfc/mifare_types.h3
-rw-r--r--src/core/hle/service/nfc/nfc.cpp246
-rw-r--r--src/core/hle/service/nfc/nfc.h3
-rw-r--r--src/core/hle/service/nfc/nfc_interface.h3
-rw-r--r--src/core/hle/service/nfc/nfc_result.h3
-rw-r--r--src/core/hle/service/nfc/nfc_types.h2
-rw-r--r--src/core/hle/service/nfp/nfp.cpp276
-rw-r--r--src/core/hle/service/nfp/nfp.h3
-rw-r--r--src/core/hle/service/nfp/nfp_interface.h3
-rw-r--r--src/core/hle/service/nfp/nfp_result.h3
-rw-r--r--src/core/hle/service/nfp/nfp_types.h2
-rw-r--r--src/core/hle/service/ngc/ngc.cpp160
-rw-r--r--src/core/hle/service/ngc/ngc.h3
-rw-r--r--src/core/hle/service/nifm/nifm.cpp227
-rw-r--r--src/core/hle/service/nifm/nifm.h1
-rw-r--r--src/core/hle/service/nim/nim.cpp685
-rw-r--r--src/core/hle/service/nim/nim.h3
-rw-r--r--src/core/hle/service/npns/npns.cpp200
-rw-r--r--src/core/hle/service/npns/npns.h3
-rw-r--r--src/core/hle/service/ns/account_proxy_interface.cpp7
-rw-r--r--src/core/hle/service/ns/account_proxy_interface.h7
-rw-r--r--src/core/hle/service/ns/application_manager_interface.cpp904
-rw-r--r--src/core/hle/service/ns/application_manager_interface.h1
-rw-r--r--src/core/hle/service/ns/application_version_interface.cpp19
-rw-r--r--src/core/hle/service/ns/application_version_interface.h19
-rw-r--r--src/core/hle/service/ns/async_result.cpp18
-rw-r--r--src/core/hle/service/ns/async_result.h1
-rw-r--r--src/core/hle/service/ns/content_management_interface.cpp16
-rw-r--r--src/core/hle/service/ns/content_management_interface.h16
-rw-r--r--src/core/hle/service/ns/develop_interface.cpp25
-rw-r--r--src/core/hle/service/ns/develop_interface.h25
-rw-r--r--src/core/hle/service/ns/document_interface.cpp9
-rw-r--r--src/core/hle/service/ns/document_interface.h9
-rw-r--r--src/core/hle/service/ns/download_task_interface.cpp15
-rw-r--r--src/core/hle/service/ns/download_task_interface.h15
-rw-r--r--src/core/hle/service/ns/dynamic_rights_interface.cpp70
-rw-r--r--src/core/hle/service/ns/dynamic_rights_interface.h2
-rw-r--r--src/core/hle/service/ns/ecommerce_interface.cpp13
-rw-r--r--src/core/hle/service/ns/ecommerce_interface.h13
-rw-r--r--src/core/hle/service/ns/factory_reset_interface.cpp26
-rw-r--r--src/core/hle/service/ns/factory_reset_interface.h1
-rw-r--r--src/core/hle/service/ns/ns.cpp63
-rw-r--r--src/core/hle/service/ns/ns.h3
-rw-r--r--src/core/hle/service/ns/ns_results.h3
-rw-r--r--src/core/hle/service/ns/platform_service_manager.cpp44
-rw-r--r--src/core/hle/service/ns/platform_service_manager.h9
-rw-r--r--src/core/hle/service/ns/query_service.cpp64
-rw-r--r--src/core/hle/service/ns/query_service.h1
-rw-r--r--src/core/hle/service/ns/read_only_application_control_data_interface.cpp48
-rw-r--r--src/core/hle/service/ns/read_only_application_control_data_interface.h2
-rw-r--r--src/core/hle/service/ns/read_only_application_record_interface.cpp19
-rw-r--r--src/core/hle/service/ns/read_only_application_record_interface.h2
-rw-r--r--src/core/hle/service/ns/service_getter_interface.cpp34
-rw-r--r--src/core/hle/service/ns/service_getter_interface.h2
-rw-r--r--src/core/hle/service/ns/system_update_control.cpp29
-rw-r--r--src/core/hle/service/ns/system_update_control.h29
-rw-r--r--src/core/hle/service/ns/system_update_interface.cpp46
-rw-r--r--src/core/hle/service/ns/system_update_interface.h2
-rw-r--r--src/core/hle/service/nvdrv/devices/ioctl_serialization.h2
-rw-r--r--src/core/hle/service/nvdrv/devices/nvdevice.h3
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp2
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_nvdec.h3
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_nvjpg.h3
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_vic.h3
-rw-r--r--src/core/hle/service/nvdrv/nvdrv.cpp74
-rw-r--r--src/core/hle/service/nvdrv/nvdrv_interface.cpp18
-rw-r--r--src/core/hle/service/nvdrv/nvdrv_interface.h21
-rw-r--r--src/core/hle/service/nvdrv/nvmemp.cpp5
-rw-r--r--src/core/hle/service/nvdrv/nvmemp.h8
-rw-r--r--src/core/hle/service/nvnflinger/binder.h3
-rw-r--r--src/core/hle/service/nvnflinger/buffer_item.h3
-rw-r--r--src/core/hle/service/nvnflinger/buffer_item_consumer.h3
-rw-r--r--src/core/hle/service/nvnflinger/buffer_queue_consumer.h3
-rw-r--r--src/core/hle/service/nvnflinger/buffer_queue_defs.h3
-rw-r--r--src/core/hle/service/nvnflinger/buffer_transform_flags.h3
-rw-r--r--src/core/hle/service/nvnflinger/consumer_base.h3
-rw-r--r--src/core/hle/service/nvnflinger/consumer_listener.h3
-rw-r--r--src/core/hle/service/nvnflinger/graphic_buffer_producer.cpp3
-rw-r--r--src/core/hle/service/nvnflinger/graphic_buffer_producer.h3
-rw-r--r--src/core/hle/service/nvnflinger/hos_binder_driver.cpp17
-rw-r--r--src/core/hle/service/nvnflinger/hos_binder_driver.h1
-rw-r--r--src/core/hle/service/nvnflinger/nvnflinger.cpp3
-rw-r--r--src/core/hle/service/nvnflinger/nvnflinger.h3
-rw-r--r--src/core/hle/service/nvnflinger/parcel.h2
-rw-r--r--src/core/hle/service/nvnflinger/pixel_format.h3
-rw-r--r--src/core/hle/service/nvnflinger/producer_listener.h3
-rw-r--r--src/core/hle/service/nvnflinger/status.h3
-rw-r--r--src/core/hle/service/nvnflinger/ui/graphic_buffer.cpp3
-rw-r--r--src/core/hle/service/nvnflinger/ui/graphic_buffer.h3
-rw-r--r--src/core/hle/service/nvnflinger/window.h3
-rw-r--r--src/core/hle/service/olsc/daemon_controller.cpp36
-rw-r--r--src/core/hle/service/olsc/daemon_controller.h2
-rw-r--r--src/core/hle/service/olsc/native_handle_holder.cpp14
-rw-r--r--src/core/hle/service/olsc/native_handle_holder.h1
-rw-r--r--src/core/hle/service/olsc/olsc.cpp173
-rw-r--r--src/core/hle/service/olsc/olsc.h3
-rw-r--r--src/core/hle/service/olsc/olsc_service_for_application.cpp56
-rw-r--r--src/core/hle/service/olsc/olsc_service_for_application.h2
-rw-r--r--src/core/hle/service/olsc/olsc_service_for_system_service.cpp144
-rw-r--r--src/core/hle/service/olsc/olsc_service_for_system_service.h53
-rw-r--r--src/core/hle/service/olsc/remote_storage_controller.cpp72
-rw-r--r--src/core/hle/service/olsc/remote_storage_controller.h2
-rw-r--r--src/core/hle/service/olsc/transfer_task_list_controller.cpp74
-rw-r--r--src/core/hle/service/olsc/transfer_task_list_controller.h2
-rw-r--r--src/core/hle/service/omm/omm.cpp3
-rw-r--r--src/core/hle/service/omm/omm.h3
-rw-r--r--src/core/hle/service/omm/operation_mode_manager.cpp35
-rw-r--r--src/core/hle/service/omm/operation_mode_manager.h35
-rw-r--r--src/core/hle/service/omm/policy_manager_system.cpp12
-rw-r--r--src/core/hle/service/omm/policy_manager_system.h12
-rw-r--r--src/core/hle/service/omm/power_state_interface.cpp18
-rw-r--r--src/core/hle/service/omm/power_state_interface.h18
-rw-r--r--src/core/hle/service/os/multi_wait.cpp3
-rw-r--r--src/core/hle/service/os/multi_wait.h3
-rw-r--r--src/core/hle/service/os/multi_wait_holder.cpp3
-rw-r--r--src/core/hle/service/os/multi_wait_holder.h3
-rw-r--r--src/core/hle/service/os/multi_wait_utils.h3
-rw-r--r--src/core/hle/service/os/mutex.h3
-rw-r--r--src/core/hle/service/pcie/pcie.cpp90
-rw-r--r--src/core/hle/service/pcie/pcie.h3
-rw-r--r--src/core/hle/service/pctl/parental_control_service.cpp498
-rw-r--r--src/core/hle/service/pctl/parental_control_service.h99
-rw-r--r--src/core/hle/service/pctl/parental_control_service_factory.cpp44
-rw-r--r--src/core/hle/service/pctl/parental_control_service_factory.h34
-rw-r--r--src/core/hle/service/pctl/pctl.cpp633
-rw-r--r--src/core/hle/service/pctl/pctl.h3
-rw-r--r--src/core/hle/service/pctl/pctl_results.h18
-rw-r--r--src/core/hle/service/pctl/pctl_types.h73
-rw-r--r--src/core/hle/service/pcv/pcv.cpp178
-rw-r--r--src/core/hle/service/pcv/pcv.h3
-rw-r--r--src/core/hle/service/pm/pm.cpp100
-rw-r--r--src/core/hle/service/pm/pm.h3
-rw-r--r--src/core/hle/service/prepo/prepo.cpp93
-rw-r--r--src/core/hle/service/prepo/prepo.h3
-rw-r--r--src/core/hle/service/psc/ovln/ovln_types.h2
-rw-r--r--src/core/hle/service/psc/ovln/receiver.cpp118
-rw-r--r--src/core/hle/service/psc/ovln/receiver.h46
-rw-r--r--src/core/hle/service/psc/ovln/receiver_service.cpp123
-rw-r--r--src/core/hle/service/psc/ovln/receiver_service.h2
-rw-r--r--src/core/hle/service/psc/ovln/sender.cpp35
-rw-r--r--src/core/hle/service/psc/ovln/sender.h24
-rw-r--r--src/core/hle/service/psc/ovln/sender_service.cpp40
-rw-r--r--src/core/hle/service/psc/ovln/sender_service.h5
-rw-r--r--src/core/hle/service/psc/pm_control.cpp31
-rw-r--r--src/core/hle/service/psc/pm_control.h19
-rw-r--r--src/core/hle/service/psc/pm_module.cpp27
-rw-r--r--src/core/hle/service/psc/pm_module.h19
-rw-r--r--src/core/hle/service/psc/pm_service.cpp31
-rw-r--r--src/core/hle/service/psc/pm_service.h25
-rw-r--r--src/core/hle/service/psc/psc.cpp181
-rw-r--r--src/core/hle/service/psc/psc.h3
-rw-r--r--src/core/hle/service/psc/time/alarms.cpp24
-rw-r--r--src/core/hle/service/psc/time/alarms.h21
-rw-r--r--src/core/hle/service/psc/time/clocks/ephemeral_network_system_clock_core.h3
-rw-r--r--src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.cpp3
-rw-r--r--src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.h3
-rw-r--r--src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.cpp3
-rw-r--r--src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.h3
-rw-r--r--src/core/hle/service/psc/time/clocks/standard_steady_clock_core.cpp3
-rw-r--r--src/core/hle/service/psc/time/clocks/standard_steady_clock_core.h3
-rw-r--r--src/core/hle/service/psc/time/clocks/standard_user_system_clock_core.h3
-rw-r--r--src/core/hle/service/psc/time/clocks/steady_clock_core.h3
-rw-r--r--src/core/hle/service/psc/time/clocks/system_clock_core.cpp3
-rw-r--r--src/core/hle/service/psc/time/clocks/system_clock_core.h3
-rw-r--r--src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.cpp3
-rw-r--r--src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.h3
-rw-r--r--src/core/hle/service/psc/time/common.cpp3
-rw-r--r--src/core/hle/service/psc/time/manager.h28
-rw-r--r--src/core/hle/service/psc/time/power_state_request_manager.h3
-rw-r--r--src/core/hle/service/psc/time/power_state_service.cpp19
-rw-r--r--src/core/hle/service/psc/time/power_state_service.h1
-rw-r--r--src/core/hle/service/psc/time/service_manager.cpp48
-rw-r--r--src/core/hle/service/psc/time/service_manager.h2
-rw-r--r--src/core/hle/service/psc/time/shared_memory.cpp3
-rw-r--r--src/core/hle/service/psc/time/static.cpp50
-rw-r--r--src/core/hle/service/psc/time/static.h2
-rw-r--r--src/core/hle/service/psc/time/steady_clock.cpp28
-rw-r--r--src/core/hle/service/psc/time/steady_clock.h2
-rw-r--r--src/core/hle/service/psc/time/system_clock.cpp24
-rw-r--r--src/core/hle/service/psc/time/system_clock.h1
-rw-r--r--src/core/hle/service/psc/time/time_zone.cpp3
-rw-r--r--src/core/hle/service/psc/time/time_zone.h3
-rw-r--r--src/core/hle/service/psc/time/time_zone_service.cpp42
-rw-r--r--src/core/hle/service/psc/time/time_zone_service.h1
-rw-r--r--src/core/hle/service/ptm/psm.cpp53
-rw-r--r--src/core/hle/service/ptm/psm.h25
-rw-r--r--src/core/hle/service/ptm/ptm.cpp32
-rw-r--r--src/core/hle/service/ptm/ptm.h3
-rw-r--r--src/core/hle/service/ptm/ts.cpp31
-rw-r--r--src/core/hle/service/ptm/ts.h11
-rw-r--r--src/core/hle/service/ro/ro.cpp371
-rw-r--r--src/core/hle/service/ro/ro.h3
-rw-r--r--src/core/hle/service/ro/ro_nro_utils.cpp188
-rw-r--r--src/core/hle/service/ro/ro_nro_utils.h29
-rw-r--r--src/core/hle/service/ro/ro_results.h29
-rw-r--r--src/core/hle/service/ro/ro_types.h142
-rw-r--r--src/core/hle/service/server_manager.h3
-rw-r--r--src/core/hle/service/service.cpp69
-rw-r--r--src/core/hle/service/service.h133
-rw-r--r--src/core/hle/service/services.h2
-rw-r--r--src/core/hle/service/set/factory_settings_server.cpp49
-rw-r--r--src/core/hle/service/set/factory_settings_server.h49
-rw-r--r--src/core/hle/service/set/firmware_debug_settings_server.cpp17
-rw-r--r--src/core/hle/service/set/firmware_debug_settings_server.h17
-rw-r--r--src/core/hle/service/set/key_code_map.h3
-rw-r--r--src/core/hle/service/set/setting_formats/appln_settings.cpp3
-rw-r--r--src/core/hle/service/set/setting_formats/appln_settings.h3
-rw-r--r--src/core/hle/service/set/setting_formats/device_settings.cpp3
-rw-r--r--src/core/hle/service/set/setting_formats/private_settings.cpp3
-rw-r--r--src/core/hle/service/set/setting_formats/private_settings.h3
-rw-r--r--src/core/hle/service/set/setting_formats/system_settings.cpp2
-rw-r--r--src/core/hle/service/set/settings.h3
-rw-r--r--src/core/hle/service/set/settings_server.cpp38
-rw-r--r--src/core/hle/service/set/settings_server.h22
-rw-r--r--src/core/hle/service/set/system_settings_server.cpp465
-rw-r--r--src/core/hle/service/set/system_settings_server.h2
-rw-r--r--src/core/hle/service/sm/sm.cpp205
-rw-r--r--src/core/hle/service/sm/sm.h24
-rw-r--r--src/core/hle/service/sm/sm_controller.cpp128
-rw-r--r--src/core/hle/service/sm/sm_controller.h30
-rw-r--r--src/core/hle/service/sockets/bsd.cpp81
-rw-r--r--src/core/hle/service/sockets/bsd.h82
-rw-r--r--src/core/hle/service/sockets/nsd.cpp32
-rw-r--r--src/core/hle/service/sockets/nsd.h32
-rw-r--r--src/core/hle/service/sockets/sfdnsres.cpp27
-rw-r--r--src/core/hle/service/sockets/sfdnsres.h31
-rw-r--r--src/core/hle/service/sockets/sockets.cpp62
-rw-r--r--src/core/hle/service/sockets/sockets_translate.h3
-rw-r--r--src/core/hle/service/spl/spl.cpp171
-rw-r--r--src/core/hle/service/spl/spl.h141
-rw-r--r--src/core/hle/service/spl/spl_module.cpp15
-rw-r--r--src/core/hle/service/spl/spl_results.h3
-rw-r--r--src/core/hle/service/spl/spl_types.h3
-rw-r--r--src/core/hle/service/ssl/cert_store.cpp3
-rw-r--r--src/core/hle/service/ssl/cert_store.h3
-rw-r--r--src/core/hle/service/ssl/ssl.cpp369
-rw-r--r--src/core/hle/service/ssl/ssl.h3
-rw-r--r--src/core/hle/service/ssl/ssl_types.h3
-rw-r--r--src/core/hle/service/tma/tma.cpp12
-rw-r--r--src/core/hle/service/usb/usb.cpp310
-rw-r--r--src/core/hle/service/usb/usb.h3
-rw-r--r--src/core/hle/service/vi/application_display_service.cpp56
-rw-r--r--src/core/hle/service/vi/application_display_service.h2
-rw-r--r--src/core/hle/service/vi/application_root_service.cpp13
-rw-r--r--src/core/hle/service/vi/application_root_service.h1
-rw-r--r--src/core/hle/service/vi/display.h3
-rw-r--r--src/core/hle/service/vi/display_list.h3
-rw-r--r--src/core/hle/service/vi/layer.h3
-rw-r--r--src/core/hle/service/vi/layer_list.h3
-rw-r--r--src/core/hle/service/vi/manager_display_service.cpp174
-rw-r--r--src/core/hle/service/vi/manager_display_service.h1
-rw-r--r--src/core/hle/service/vi/manager_root_service.cpp21
-rw-r--r--src/core/hle/service/vi/manager_root_service.h1
-rw-r--r--src/core/hle/service/vi/service_creator.cpp3
-rw-r--r--src/core/hle/service/vi/service_creator.h3
-rw-r--r--src/core/hle/service/vi/shared_buffer_manager.h4
-rw-r--r--src/core/hle/service/vi/system_display_service.cpp110
-rw-r--r--src/core/hle/service/vi/system_display_service.h1
-rw-r--r--src/core/hle/service/vi/system_root_service.cpp17
-rw-r--r--src/core/hle/service/vi/system_root_service.h1
-rw-r--r--src/core/hle/service/vi/vi.cpp3
-rw-r--r--src/core/hle/service/vi/vi.h3
-rw-r--r--src/core/hle/service/vi/vi_results.h3
-rw-r--r--src/core/hle/service/vi/vi_types.h3
-rw-r--r--src/core/hle/service/wlan/wlan.cpp368
584 files changed, 14699 insertions, 12459 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index f1d4bdae42..31f9931d3a 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -444,18 +444,28 @@ add_library(core STATIC
hle/service/am/process_creation.h
hle/service/am/process_holder.cpp
hle/service/am/process_holder.h
+ hle/service/am/service/all_system_applet_proxies_service.cpp
+ hle/service/am/service/all_system_applet_proxies_service.h
+ hle/service/am/service/applet_common_functions.cpp
+ hle/service/am/service/applet_common_functions.h
hle/service/am/service/application_accessor.cpp
hle/service/am/service/application_accessor.h
hle/service/am/service/application_creator.cpp
hle/service/am/service/application_creator.h
hle/service/am/service/application_functions.cpp
hle/service/am/service/application_functions.h
+ hle/service/am/service/application_proxy.cpp
+ hle/service/am/service/application_proxy.h
+ hle/service/am/service/application_proxy_service.cpp
+ hle/service/am/service/application_proxy_service.h
hle/service/am/service/audio_controller.cpp
hle/service/am/service/audio_controller.h
hle/service/am/service/common_state_getter.cpp
hle/service/am/service/common_state_getter.h
hle/service/am/service/cradle_firmware_updater.cpp
hle/service/am/service/cradle_firmware_updater.h
+ hle/service/am/service/debug_functions.cpp
+ hle/service/am/service/debug_functions.h
hle/service/am/service/display_controller.cpp
hle/service/am/service/display_controller.h
hle/service/am/service/global_state_controller.cpp
@@ -464,14 +474,28 @@ add_library(core STATIC
hle/service/am/service/home_menu_functions.h
hle/service/am/service/library_applet_accessor.cpp
hle/service/am/service/library_applet_accessor.h
+ hle/service/am/service/library_applet_creator.cpp
+ hle/service/am/service/library_applet_creator.h
+ hle/service/am/service/library_applet_proxy.cpp
+ hle/service/am/service/library_applet_proxy.h
+ hle/service/am/service/library_applet_self_accessor.cpp
+ hle/service/am/service/library_applet_self_accessor.h
+ hle/service/am/service/lock_accessor.cpp
+ hle/service/am/service/lock_accessor.h
hle/service/am/service/overlay_functions.cpp
hle/service/am/service/overlay_functions.h
+ hle/service/am/service/overlay_applet_proxy.cpp
+ hle/service/am/service/overlay_applet_proxy.h
hle/service/am/service/process_winding_controller.cpp
hle/service/am/service/process_winding_controller.h
hle/service/am/service/self_controller.cpp
hle/service/am/service/self_controller.h
hle/service/am/service/storage.cpp
hle/service/am/service/storage.h
+ hle/service/am/service/storage_accessor.cpp
+ hle/service/am/service/storage_accessor.h
+ hle/service/am/service/system_applet_proxy.cpp
+ hle/service/am/service/system_applet_proxy.h
hle/service/am/service/window_controller.cpp
hle/service/am/service/window_controller.h
hle/service/am/window_system.cpp
@@ -556,8 +580,20 @@ add_library(core STATIC
hle/service/btdrv/btdrv.h
hle/service/btm/btm.cpp
hle/service/btm/btm.h
+ hle/service/btm/btm_debug.cpp
+ hle/service/btm/btm_debug.h
+ hle/service/btm/btm_system.cpp
+ hle/service/btm/btm_system.h
+ hle/service/btm/btm_system_core.cpp
+ hle/service/btm/btm_system_core.h
+ hle/service/btm/btm_user.cpp
+ hle/service/btm/btm_user.h
+ hle/service/btm/btm_user_core.cpp
+ hle/service/btm/btm_user_core.h
hle/service/caps/caps.cpp
hle/service/caps/caps.h
+ hle/service/caps/caps_a.cpp
+ hle/service/caps/caps_a.h
hle/service/caps/caps_c.cpp
hle/service/caps/caps_c.h
hle/service/caps/caps_manager.cpp
@@ -582,6 +618,10 @@ add_library(core STATIC
hle/service/eupld/eupld.h
hle/service/fatal/fatal.cpp
hle/service/fatal/fatal.h
+ hle/service/fatal/fatal_p.cpp
+ hle/service/fatal/fatal_p.h
+ hle/service/fatal/fatal_u.cpp
+ hle/service/fatal/fatal_u.h
hle/service/fgm/fgm.cpp
hle/service/fgm/fgm.h
hle/service/filesystem/filesystem.cpp
@@ -613,6 +653,8 @@ add_library(core STATIC
hle/service/filesystem/save_data_controller.h
hle/service/friend/friend.cpp
hle/service/friend/friend.h
+ hle/service/friend/friend_interface.cpp
+ hle/service/friend/friend_interface.h
hle/service/glue/arp.cpp
hle/service/glue/arp.h
hle/service/glue/bgtc.cpp
@@ -681,6 +723,8 @@ add_library(core STATIC
hle/service/ldn/monitor_service.h
hle/service/ldn/sf_monitor_service.cpp
hle/service/ldn/sf_monitor_service.h
+ hle/service/ldn/sf_service.cpp
+ hle/service/ldn/sf_service.h
hle/service/ldn/sf_service_monitor.cpp
hle/service/ldn/sf_service_monitor.h
hle/service/ldn/system_local_communication_service.cpp
@@ -869,6 +913,8 @@ add_library(core STATIC
hle/service/olsc/native_handle_holder.h
hle/service/olsc/olsc_service_for_application.cpp
hle/service/olsc/olsc_service_for_application.h
+ hle/service/olsc/olsc_service_for_system_service.cpp
+ hle/service/olsc/olsc_service_for_system_service.h
hle/service/olsc/olsc.cpp
hle/service/olsc/olsc.h
hle/service/olsc/remote_storage_controller.cpp
@@ -898,8 +944,14 @@ add_library(core STATIC
hle/service/os/process.h
hle/service/pcie/pcie.cpp
hle/service/pcie/pcie.h
+ hle/service/pctl/parental_control_service_factory.cpp
+ hle/service/pctl/parental_control_service_factory.h
+ hle/service/pctl/parental_control_service.cpp
+ hle/service/pctl/parental_control_service.h
hle/service/pctl/pctl.cpp
hle/service/pctl/pctl.h
+ hle/service/pctl/pctl_results.h
+ hle/service/pctl/pctl_types.h
hle/service/pcv/pcv.cpp
hle/service/pcv/pcv.h
hle/service/pm/pm.cpp
@@ -909,8 +961,18 @@ add_library(core STATIC
hle/service/psc/ovln/ovln_types.h
hle/service/psc/ovln/receiver_service.cpp
hle/service/psc/ovln/receiver_service.h
+ hle/service/psc/ovln/receiver.cpp
+ hle/service/psc/ovln/receiver.h
hle/service/psc/ovln/sender_service.cpp
hle/service/psc/ovln/sender_service.h
+ hle/service/psc/ovln/sender.cpp
+ hle/service/psc/ovln/sender.h
+ hle/service/psc/pm_control.cpp
+ hle/service/psc/pm_control.h
+ hle/service/psc/pm_module.cpp
+ hle/service/psc/pm_module.h
+ hle/service/psc/pm_service.cpp
+ hle/service/psc/pm_service.h
hle/service/psc/psc.cpp
hle/service/psc/psc.h
hle/service/psc/time/alarms.cpp
@@ -961,6 +1023,10 @@ add_library(core STATIC
hle/service/ptm/ts.h
hle/service/ro/ro.cpp
hle/service/ro/ro.h
+ hle/service/ro/ro_nro_utils.cpp
+ hle/service/ro/ro_nro_utils.h
+ hle/service/ro/ro_results.h
+ hle/service/ro/ro_types.h
hle/service/server_manager.cpp
hle/service/server_manager.h
hle/service/service.cpp
@@ -989,6 +1055,8 @@ add_library(core STATIC
hle/service/set/system_settings_server.h
hle/service/sm/sm.cpp
hle/service/sm/sm.h
+ hle/service/sm/sm_controller.cpp
+ hle/service/sm/sm_controller.h
hle/service/sockets/bsd.cpp
hle/service/sockets/bsd.h
hle/service/sockets/nsd.cpp
@@ -1154,7 +1222,7 @@ target_link_libraries(core PRIVATE
RenderDoc::API
ZLIB::ZLIB)
-target_link_libraries(core PUBLIC httplib::httplib zstd::zstd frozen::frozen-headers)
+target_link_libraries(core PUBLIC httplib::httplib zstd::zstd)
if (ENABLE_WEB_SERVICE)
target_compile_definitions(core PUBLIC ENABLE_WEB_SERVICE)
diff --git a/src/core/hle/service/acc/acc.cpp b/src/core/hle/service/acc/acc.cpp
index 9b29a7773c..d68b6bde0d 100644
--- a/src/core/hle/service/acc/acc.cpp
+++ b/src/core/hle/service/acc/acc.cpp
@@ -75,6 +75,41 @@ class IManagerForSystemService final : public ServiceFramework<IManagerForSystem
public:
explicit IManagerForSystemService(Core::System& system_, Common::UUID uuid)
: ServiceFramework{system_, "IManagerForSystemService"}, account_id{uuid} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IManagerForSystemService::CheckAvailability>, "CheckAvailability"},
+ {1, D<&IManagerForSystemService::GetAccountId>, "GetAccountId"},
+ {2, nullptr, "EnsureIdTokenCacheAsync"},
+ {3, D<&IManagerForSystemService::LoadIdTokenCacheDeprecated>, "LoadIdTokenCacheDeprecated"}, // 19.0.0+
+ {4, D<&IManagerForSystemService::LoadIdTokenCache>, "LoadIdTokenCache"}, // 19.0.0+
+ {100, nullptr, "SetSystemProgramIdentification"},
+ {101, nullptr, "RefreshNotificationTokenAsync"}, // 7.0.0+
+ {110, nullptr, "GetServiceEntryRequirementCache"}, // 4.0.0+
+ {111, nullptr, "InvalidateServiceEntryRequirementCache"}, // 4.0.0+
+ {112, nullptr, "InvalidateTokenCache"}, // 4.0.0 - 6.2.0
+ {113, nullptr, "GetServiceEntryRequirementCacheForOnlinePlay"}, // 6.1.0+
+ {120, nullptr, "GetNintendoAccountId"},
+ {121, nullptr, "CalculateNintendoAccountAuthenticationFingerprint"}, // 9.0.0+
+ {130, nullptr, "GetNintendoAccountUserResourceCache"},
+ {131, nullptr, "RefreshNintendoAccountUserResourceCacheAsync"},
+ {132, nullptr, "RefreshNintendoAccountUserResourceCacheAsyncIfSecondsElapsed"},
+ {133, nullptr, "GetNintendoAccountVerificationUrlCache"}, // 9.0.0+
+ {134, nullptr, "RefreshNintendoAccountVerificationUrlCache"}, // 9.0.0+
+ {135, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsyncIfSecondsElapsed"}, // 9.0.0+
+ {136, nullptr, "GetNintendoAccountUserResourceCache"}, // 19.0.0+
+ {140, nullptr, "GetNetworkServiceLicenseCache"}, // 5.0.0+
+ {141, nullptr, "RefreshNetworkServiceLicenseCacheAsync"}, // 5.0.0+
+ {142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed"}, // 5.0.0+
+ {143, D<&IManagerForSystemService::GetNetworkServiceLicenseCacheEx>, "GetNetworkServiceLicenseCacheEx"}, // 15.0.0+
+ {150, nullptr, "CreateAuthorizationRequest"},
+ {160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"},
+ {161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"},
+ {170, nullptr, "CreateDeviceHistoryRequest"}, // 17.0.0+
+ {180, nullptr, "GetRequestForNintendoAccountReauthentication"} // 18.0.0+
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
private:
@@ -108,40 +143,6 @@ private:
R_SUCCEED();
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IManagerForSystemService::CheckAvailability>, "CheckAvailability"},
- FunctionInfo{1, D<&IManagerForSystemService::GetAccountId>, "GetAccountId"},
- FunctionInfo{2, nullptr, "EnsureIdTokenCacheAsync"},
- FunctionInfo{3, D<&IManagerForSystemService::LoadIdTokenCacheDeprecated>, "LoadIdTokenCacheDeprecated", MakeVersionGate({19,0,0})},
- FunctionInfo{4, D<&IManagerForSystemService::LoadIdTokenCache>, "LoadIdTokenCache", MakeVersionGate({19,0,0})},
- FunctionInfo{100, nullptr, "SetSystemProgramIdentification"},
- FunctionInfo{101, nullptr, "RefreshNotificationTokenAsync", MakeVersionGate({7,0,0})},
- FunctionInfo{110, nullptr, "GetServiceEntryRequirementCache", MakeVersionGate({4,0,0})},
- FunctionInfo{111, nullptr, "InvalidateServiceEntryRequirementCache", MakeVersionGate({4,0,0})},
- FunctionInfo{112, nullptr, "InvalidateTokenCache", MakeVersionGate({4,0,0}, {6,2,0})},
- FunctionInfo{113, nullptr, "GetServiceEntryRequirementCacheForOnlinePlay", MakeVersionGate({6,1,0})},
- FunctionInfo{120, nullptr, "GetNintendoAccountId"},
- FunctionInfo{121, nullptr, "CalculateNintendoAccountAuthenticationFingerprint", MakeVersionGate({9,0,0})},
- FunctionInfo{130, nullptr, "GetNintendoAccountUserResourceCache"},
- FunctionInfo{131, nullptr, "RefreshNintendoAccountUserResourceCacheAsync"},
- FunctionInfo{132, nullptr, "RefreshNintendoAccountUserResourceCacheAsyncIfSecondsElapsed"},
- FunctionInfo{133, nullptr, "GetNintendoAccountVerificationUrlCache", MakeVersionGate({9,0,0})},
- FunctionInfo{134, nullptr, "RefreshNintendoAccountVerificationUrlCache", MakeVersionGate({9,0,0})},
- FunctionInfo{135, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsyncIfSecondsElapsed", MakeVersionGate({9,0,0})},
- FunctionInfo{136, nullptr, "GetNintendoAccountUserResourceCache", MakeVersionGate({19,0,0})},
- FunctionInfo{140, nullptr, "GetNetworkServiceLicenseCache", MakeVersionGate({5,0,0})},
- FunctionInfo{141, nullptr, "RefreshNetworkServiceLicenseCacheAsync", MakeVersionGate({5,0,0})},
- FunctionInfo{142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed", MakeVersionGate({5,0,0})},
- FunctionInfo{143, D<&IManagerForSystemService::GetNetworkServiceLicenseCacheEx>, "GetNetworkServiceLicenseCacheEx", MakeVersionGate({15,0,0})},
- FunctionInfo{150, nullptr, "CreateAuthorizationRequest"},
- FunctionInfo{160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"},
- FunctionInfo{161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"},
- FunctionInfo{170, nullptr, "CreateDeviceHistoryRequest", MakeVersionGate({17,0,0})},
- FunctionInfo{180, nullptr, "GetRequestForNintendoAccountReauthentication", MakeVersionGate({18,0,0})}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
Common::UUID account_id;
};
@@ -150,25 +151,25 @@ class IFloatingRegistrationRequest final : public ServiceFramework<IFloatingRegi
public:
explicit IFloatingRegistrationRequest(Core::System& system_, Common::UUID)
: ServiceFramework{system_, "IFloatingRegistrationRequest"} {
- }
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetSessionId"},
+ {12, nullptr, "GetAccountId"},
+ {13, nullptr, "GetLinkedNintendoAccountId"},
+ {14, nullptr, "GetNickname"},
+ {15, nullptr, "GetProfileImage"},
+ {16, nullptr, "GetProfileLargeImage"}, // 18.0.0+
+ {21, nullptr, "LoadIdTokenCache"},
+ {100, nullptr, "RegisterUser"}, // [1.0.0-3.0.2] RegisterAsync
+ {101, nullptr, "RegisterUserWithUid"}, // [1.0.0-3.0.2] RegisterWithUidAsync
+ {102, nullptr, "RegisterNetworkServiceAccountAsync"}, // 4.0.0+
+ {103, nullptr, "RegisterNetworkServiceAccountWithUidAsync"}, // 4.0.0+
+ {110, nullptr, "SetSystemProgramIdentification"},
+ {111, nullptr, "EnsureIdTokenCacheAsync"},
+ };
+ // clang-format on
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetSessionId"},
- FunctionInfo{12, nullptr, "GetAccountId"},
- FunctionInfo{13, nullptr, "GetLinkedNintendoAccountId"},
- FunctionInfo{14, nullptr, "GetNickname"},
- FunctionInfo{15, nullptr, "GetProfileImage"},
- FunctionInfo{16, nullptr, "GetProfileLargeImage", MakeVersionGate({18,0,0})},
- FunctionInfo{21, nullptr, "LoadIdTokenCache"},
- FunctionInfo{100, nullptr, "RegisterUser"}, // [1.0.0-3.0.2] RegisterAsync
- FunctionInfo{101, nullptr, "RegisterUserWithUid"}, // [1.0.0-3.0.2] RegisterWithUidAsync
- FunctionInfo{102, nullptr, "RegisterNetworkServiceAccountAsync", MakeVersionGate({4,0,0})},
- FunctionInfo{103, nullptr, "RegisterNetworkServiceAccountWithUidAsync", MakeVersionGate({4,0,0})},
- FunctionInfo{110, nullptr, "SetSystemProgramIdentification"},
- FunctionInfo{111, nullptr, "EnsureIdTokenCacheAsync"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
};
@@ -176,6 +177,62 @@ class IAdministrator final : public ServiceFramework<IAdministrator> {
public:
explicit IAdministrator(Core::System& system_, Common::UUID)
: ServiceFramework{system_, "IAdministrator"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "CheckAvailability"},
+ {1, nullptr, "GetAccountId"},
+ {2, nullptr, "EnsureIdTokenCacheAsync"},
+ {3, nullptr, "LoadIdTokenCache"},
+ {100, nullptr, "SetSystemProgramIdentification"},
+ {101, nullptr, "RefreshNotificationTokenAsync"}, // 7.0.0+
+ {110, nullptr, "GetServiceEntryRequirementCache"}, // 4.0.0+
+ {111, nullptr, "InvalidateServiceEntryRequirementCache"}, // 4.0.0+
+ {112, nullptr, "InvalidateTokenCache"}, // 4.0.0 - 6.2.0
+ {113, nullptr, "GetServiceEntryRequirementCacheForOnlinePlay"}, // 6.1.0+
+ {120, nullptr, "GetNintendoAccountId"},
+ {121, nullptr, "CalculateNintendoAccountAuthenticationFingerprint"}, // 9.0.0+
+ {130, nullptr, "GetNintendoAccountUserResourceCache"},
+ {131, nullptr, "RefreshNintendoAccountUserResourceCacheAsync"},
+ {132, nullptr, "RefreshNintendoAccountUserResourceCacheAsyncIfSecondsElapsed"},
+ {133, nullptr, "GetNintendoAccountVerificationUrlCache"}, // 9.0.0+
+ {134, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsync"}, // 9.0.0+
+ {135, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsyncIfSecondsElapsed"}, // 9.0.0+
+ {140, nullptr, "GetNetworkServiceLicenseCache"}, // 5.0.0+
+ {141, nullptr, "RefreshNetworkServiceLicenseCacheAsync"}, // 5.0.0+
+ {142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed"}, // 5.0.0+
+ {143, nullptr, "GetNetworkServiceLicenseCacheEx"},
+ {150, nullptr, "CreateAuthorizationRequest"},
+ {160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"},
+ {161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"},
+ {170, nullptr, "CreateDeviceHistoryRequest"}, // 17.0.0+
+ {180, nullptr, "GetRequestForNintendoAccountReauthentication"}, // 18.0.0+
+ {200, nullptr, "IsRegistered"},
+ {201, nullptr, "RegisterAsync"},
+ {202, nullptr, "UnregisterAsync"},
+ {203, nullptr, "DeleteRegistrationInfoLocally"},
+ {220, nullptr, "SynchronizeProfileAsync"},
+ {221, nullptr, "UploadProfileAsync"},
+ {222, nullptr, "SynchronizaProfileAsyncIfSecondsElapsed"},
+ {250, &IAdministrator::IsLinkedWithNintendoAccount, "IsLinkedWithNintendoAccount"},
+ {251, nullptr, "CreateProcedureToLinkWithNintendoAccount"},
+ {252, nullptr, "ResumeProcedureToLinkWithNintendoAccount"},
+ {255, nullptr, "CreateProcedureToUpdateLinkageStateOfNintendoAccount"},
+ {256, nullptr, "ResumeProcedureToUpdateLinkageStateOfNintendoAccount"},
+ {260, nullptr, "CreateProcedureToLinkNnidWithNintendoAccount"}, // 3.0.0+
+ {261, nullptr, "ResumeProcedureToLinkNnidWithNintendoAccount"}, // 3.0.0+
+ {280, nullptr, "ProxyProcedureToAcquireApplicationAuthorizationForNintendoAccount"},
+ {290, nullptr, "GetRequestForNintendoAccountUserResourceView"}, // 8.0.0+
+ {300, nullptr, "TryRecoverNintendoAccountUserStateAsync"}, // 6.0.0+
+ {400, nullptr, "IsServiceEntryRequirementCacheRefreshRequiredForOnlinePlay"}, // 6.1.0+
+ {401, nullptr, "RefreshServiceEntryRequirementCacheForOnlinePlayAsync"}, // 6.1.0+
+ {900, nullptr, "GetAuthenticationInfoForWin"}, // 9.0.0+
+ {901, nullptr, "ImportAsyncForWin"}, // 9.0.0+
+ {997, nullptr, "DebugUnlinkNintendoAccountAsync"},
+ {998, nullptr, "DebugSetAvailabilityErrorDetail"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
private:
@@ -184,97 +241,42 @@ private:
rb.Push(ResultSuccess);
rb.Push(false);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "CheckAvailability"},
- FunctionInfo{1, nullptr, "GetAccountId"},
- FunctionInfo{2, nullptr, "EnsureIdTokenCacheAsync"},
- FunctionInfo{3, nullptr, "LoadIdTokenCache"},
- FunctionInfo{100, nullptr, "SetSystemProgramIdentification"},
- FunctionInfo{101, nullptr, "RefreshNotificationTokenAsync", MakeVersionGate({7,0,0})},
- FunctionInfo{110, nullptr, "GetServiceEntryRequirementCache", MakeVersionGate({4,0,0})},
- FunctionInfo{111, nullptr, "InvalidateServiceEntryRequirementCache", MakeVersionGate({4,0,0})},
- FunctionInfo{112, nullptr, "InvalidateTokenCache", MakeVersionGate({4,0,0}, {6,2,0})},
- FunctionInfo{113, nullptr, "GetServiceEntryRequirementCacheForOnlinePlay", MakeVersionGate({6,1,0})},
- FunctionInfo{120, nullptr, "GetNintendoAccountId"},
- FunctionInfo{121, nullptr, "CalculateNintendoAccountAuthenticationFingerprint", MakeVersionGate({9,0,0})},
- FunctionInfo{130, nullptr, "GetNintendoAccountUserResourceCache"},
- FunctionInfo{131, nullptr, "RefreshNintendoAccountUserResourceCacheAsync"},
- FunctionInfo{132, nullptr, "RefreshNintendoAccountUserResourceCacheAsyncIfSecondsElapsed"},
- FunctionInfo{133, nullptr, "GetNintendoAccountVerificationUrlCache", MakeVersionGate({9,0,0})},
- FunctionInfo{134, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsync", MakeVersionGate({9,0,0})},
- FunctionInfo{135, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsyncIfSecondsElapsed", MakeVersionGate({9,0,0})},
- FunctionInfo{140, nullptr, "GetNetworkServiceLicenseCache", MakeVersionGate({5,0,0})},
- FunctionInfo{141, nullptr, "RefreshNetworkServiceLicenseCacheAsync", MakeVersionGate({5,0,0})},
- FunctionInfo{142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed", MakeVersionGate({5,0,0})},
- FunctionInfo{143, nullptr, "GetNetworkServiceLicenseCacheEx"},
- FunctionInfo{150, nullptr, "CreateAuthorizationRequest"},
- FunctionInfo{160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"},
- FunctionInfo{161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"},
- FunctionInfo{170, nullptr, "CreateDeviceHistoryRequest", MakeVersionGate({17,0,0})},
- FunctionInfo{180, nullptr, "GetRequestForNintendoAccountReauthentication", MakeVersionGate({18,0,0})},
- FunctionInfo{200, nullptr, "IsRegistered"},
- FunctionInfo{201, nullptr, "RegisterAsync"},
- FunctionInfo{202, nullptr, "UnregisterAsync"},
- FunctionInfo{203, nullptr, "DeleteRegistrationInfoLocally"},
- FunctionInfo{220, nullptr, "SynchronizeProfileAsync"},
- FunctionInfo{221, nullptr, "UploadProfileAsync"},
- FunctionInfo{222, nullptr, "SynchronizaProfileAsyncIfSecondsElapsed"},
- FunctionInfo{250, &IAdministrator::IsLinkedWithNintendoAccount, "IsLinkedWithNintendoAccount"},
- FunctionInfo{251, nullptr, "CreateProcedureToLinkWithNintendoAccount"},
- FunctionInfo{252, nullptr, "ResumeProcedureToLinkWithNintendoAccount"},
- FunctionInfo{255, nullptr, "CreateProcedureToUpdateLinkageStateOfNintendoAccount"},
- FunctionInfo{256, nullptr, "ResumeProcedureToUpdateLinkageStateOfNintendoAccount"},
- FunctionInfo{260, nullptr, "CreateProcedureToLinkNnidWithNintendoAccount", MakeVersionGate({3,0,0})},
- FunctionInfo{261, nullptr, "ResumeProcedureToLinkNnidWithNintendoAccount", MakeVersionGate({3,0,0})},
- FunctionInfo{280, nullptr, "ProxyProcedureToAcquireApplicationAuthorizationForNintendoAccount"},
- FunctionInfo{290, nullptr, "GetRequestForNintendoAccountUserResourceView", MakeVersionGate({8,0,0})},
- FunctionInfo{300, nullptr, "TryRecoverNintendoAccountUserStateAsync", MakeVersionGate({6,0,0})},
- FunctionInfo{400, nullptr, "IsServiceEntryRequirementCacheRefreshRequiredForOnlinePlay", MakeVersionGate({6,1,0})},
- FunctionInfo{401, nullptr, "RefreshServiceEntryRequirementCacheForOnlinePlayAsync", MakeVersionGate({6,1,0})},
- FunctionInfo{900, nullptr, "GetAuthenticationInfoForWin", MakeVersionGate({9,0,0})},
- FunctionInfo{901, nullptr, "ImportAsyncForWin", MakeVersionGate({9,0,0})},
- FunctionInfo{997, nullptr, "DebugUnlinkNintendoAccountAsync"},
- FunctionInfo{998, nullptr, "DebugSetAvailabilityErrorDetail"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
};
class IAuthorizationRequest final : public ServiceFramework<IAuthorizationRequest> {
public:
explicit IAuthorizationRequest(Core::System& system_, Common::UUID)
: ServiceFramework{system_, "IAuthorizationRequest"} {
- }
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetSessionId"},
+ {10, nullptr, "InvokeWithoutInteractionAsync"},
+ {19, nullptr, "IsAuthorized"},
+ {20, nullptr, "GetAuthorizationCode"},
+ {21, nullptr, "GetIdToken"},
+ {22, nullptr, "GetState"},
+ };
+ // clang-format on
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetSessionId"},
- FunctionInfo{10, nullptr, "InvokeWithoutInteractionAsync"},
- FunctionInfo{19, nullptr, "IsAuthorized"},
- FunctionInfo{20, nullptr, "GetAuthorizationCode"},
- FunctionInfo{21, nullptr, "GetIdToken"},
- FunctionInfo{22, nullptr, "GetState"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
};
class IOAuthProcedure final : public ServiceFramework<IOAuthProcedure> {
public:
explicit IOAuthProcedure(Core::System& system_, Common::UUID)
- : ServiceFramework{system_, "IOAuthProcedure"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "PrepareAsync"},
- FunctionInfo{1, nullptr, "GetRequest"},
- FunctionInfo{2, nullptr, "ApplyResponse"},
- FunctionInfo{3, nullptr, "ApplyResponseAsync"},
- FunctionInfo{10, nullptr, "Suspend"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "IOAuthProcedure"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "PrepareAsync"},
+ {1, nullptr, "GetRequest"},
+ {2, nullptr, "ApplyResponse"},
+ {3, nullptr, "ApplyResponseAsync"},
+ {10, nullptr, "Suspend"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
@@ -282,69 +284,96 @@ public:
class IOAuthProcedureForExternalNsa final : public ServiceFramework<IOAuthProcedureForExternalNsa> {
public:
explicit IOAuthProcedureForExternalNsa(Core::System& system_, Common::UUID)
- : ServiceFramework{system_, "IOAuthProcedureForExternalNsa"}
- {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "PrepareAsync"},
- FunctionInfo{1, nullptr, "GetRequest"},
- FunctionInfo{2, nullptr, "ApplyResponse"},
- FunctionInfo{3, nullptr, "ApplyResponseAsync"},
- FunctionInfo{10, nullptr, "Suspend"},
- FunctionInfo{100, nullptr, "GetAccountId"},
- FunctionInfo{101, nullptr, "GetLinkedNintendoAccountId"},
- FunctionInfo{102, nullptr, "GetNickname"},
- FunctionInfo{103, nullptr, "GetProfileImage"},
- FunctionInfo{104, nullptr, "GetProfileLargeImage", MakeVersionGate({18,0,0})}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "IOAuthProcedureForExternalNsa"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "PrepareAsync"},
+ {1, nullptr, "GetRequest"},
+ {2, nullptr, "ApplyResponse"},
+ {3, nullptr, "ApplyResponseAsync"},
+ {10, nullptr, "Suspend"},
+ {100, nullptr, "GetAccountId"},
+ {101, nullptr, "GetLinkedNintendoAccountId"},
+ {102, nullptr, "GetNickname"},
+ {103, nullptr, "GetProfileImage"},
+ {104, nullptr, "GetProfileLargeImage"} // 18.0.0+
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
-class IOAuthProcedureForNintendoAccountLinkage final : public ServiceFramework<IOAuthProcedureForNintendoAccountLinkage> {
+class IOAuthProcedureForNintendoAccountLinkage final
+ : public ServiceFramework<IOAuthProcedureForNintendoAccountLinkage> {
public:
explicit IOAuthProcedureForNintendoAccountLinkage(Core::System& system_, Common::UUID)
- : ServiceFramework{system_, "IOAuthProcedureForNintendoAccountLinkage"}
- {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "PrepareAsync"},
- FunctionInfo{1, nullptr, "GetRequest"},
- FunctionInfo{2, nullptr, "ApplyResponse"},
- FunctionInfo{3, nullptr, "ApplyResponseAsync"},
- FunctionInfo{10, nullptr, "Suspend"},
- FunctionInfo{100, nullptr, "GetRequestWithTheme"},
- FunctionInfo{101, nullptr, "IsNetworkServiceAccountReplaced"},
- FunctionInfo{199, nullptr, "GetUrlForIntroductionOfExtraMembership", MakeVersionGate({2,0,0}, {5,1,0})},
- FunctionInfo{200, nullptr, "ApplyAsyncWithAuthorizedToken"},
- FunctionInfo{210, nullptr, "IsProfileAvailable", MakeVersionGate({17,0,0})},
- FunctionInfo{220, nullptr, "RegisterUserAsyncWithoutProfile", MakeVersionGate({17,0,0})},
- FunctionInfo{221, nullptr, "RegisterUserWithProfileAsync", MakeVersionGate({17,0,0})},
- FunctionInfo{230, nullptr, "RegisterUserWithLargeImageProfileAsync", MakeVersionGate({18,0,0})}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "IOAuthProcedureForNintendoAccountLinkage"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "PrepareAsync"},
+ {1, nullptr, "GetRequest"},
+ {2, nullptr, "ApplyResponse"},
+ {3, nullptr, "ApplyResponseAsync"},
+ {10, nullptr, "Suspend"},
+ {100, nullptr, "GetRequestWithTheme"},
+ {101, nullptr, "IsNetworkServiceAccountReplaced"},
+ {199, nullptr, "GetUrlForIntroductionOfExtraMembership"}, // 2.0.0 - 5.1.0
+ {200, nullptr, "ApplyAsyncWithAuthorizedToken"},
+ {210, nullptr, "IsProfileAvailable"}, // 17.0.0+
+ {220, nullptr, "RegisterUserAsyncWithoutProfile"}, // 17.0.0+
+ {221, nullptr, "RegisterUserWithProfileAsync"}, // 17.0.0+
+ {230, nullptr, "RegisterUserWithLargeImageProfileAsync"}, // 18.0.0+
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
class INotifier final : public ServiceFramework<INotifier> {
public:
explicit INotifier(Core::System& system_, Common::UUID)
- : ServiceFramework{system_, "INotifier"} {}
+ : ServiceFramework{system_, "INotifier"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetSystemEvent"},
+ };
+ // clang-format on
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetSystemEvent"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
};
class IProfileCommon : public ServiceFramework<IProfileCommon> {
public:
- explicit IProfileCommon(Core::System& system_, const char* name, bool editor_commands, Common::UUID user_id_, ProfileManager& profile_manager_)
+ explicit IProfileCommon(Core::System& system_, const char* name, bool editor_commands,
+ Common::UUID user_id_, ProfileManager& profile_manager_)
: ServiceFramework{system_, name}, profile_manager{profile_manager_}, user_id{user_id_} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &IProfileCommon::Get, "Get"},
+ {1, &IProfileCommon::GetBase, "GetBase"},
+ {10, &IProfileCommon::GetImageSize, "GetImageSize"},
+ {11, &IProfileCommon::LoadImage, "LoadImage"},
+ {20, &IProfileCommon::Unknown20, "Unknown20"},
+ {21, &IProfileCommon::Unknown21, "Unknown21"},
+ {30, &IProfileCommon::Unknown30, "Unknown30"}
+ };
+ // clang-format on
+ RegisterHandlers(functions);
+
+ if (editor_commands) {
+ // clang-format off
+ static const FunctionInfo editor_functions[] = {
+ {100, &IProfileCommon::Store, "Store"},
+ {101, &IProfileCommon::StoreWithImage, "StoreWithImage"},
+ {110, &IProfileCommon::Unknown110, "Unknown110"}
+ };
+ // clang-format on
+
+ RegisterHandlers(editor_functions);
+ }
}
protected:
@@ -571,22 +600,6 @@ protected:
rb.Push(ResultSuccess);
}
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &IProfileCommon::Get, "Get"},
- FunctionInfo{1, &IProfileCommon::GetBase, "GetBase"},
- FunctionInfo{10, &IProfileCommon::GetImageSize, "GetImageSize"},
- FunctionInfo{11, &IProfileCommon::LoadImage, "LoadImage"},
- FunctionInfo{20, &IProfileCommon::Unknown20, "Unknown20"},
- FunctionInfo{21, &IProfileCommon::Unknown21, "Unknown21"},
- FunctionInfo{30, &IProfileCommon::Unknown30, "Unknown30"},
- // Editor commands
- FunctionInfo{100, &IProfileCommon::Store, "Store"},
- FunctionInfo{101, &IProfileCommon::StoreWithImage, "StoreWithImage"},
- FunctionInfo{110, &IProfileCommon::Unknown110, "Unknown110"}
- );
ProfileManager& profile_manager;
Common::UUID user_id{}; ///< The user id this profile refers to.
};
@@ -608,33 +621,35 @@ public:
class ISessionObject final : public ServiceFramework<ISessionObject> {
public:
explicit ISessionObject(Core::System& system_, Common::UUID)
- : ServiceFramework{system_, "ISessionObject"} {}
+ : ServiceFramework{system_, "ISessionObject"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {999, nullptr, "Dummy"},
+ };
+ // clang-format on
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{999, nullptr, "Dummy"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
};
class IGuestLoginRequest final : public ServiceFramework<IGuestLoginRequest> {
public:
explicit IGuestLoginRequest(Core::System& system_, Common::UUID)
- : ServiceFramework{system_, "IGuestLoginRequest"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetSessionId"},
- FunctionInfo{11, nullptr, "Unknown", MakeVersionGate({1,0,0}, {2,3,0})}, // the name is blank on Switchbrew
- FunctionInfo{12, nullptr, "GetAccountId"},
- FunctionInfo{13, nullptr, "GetLinkedNintendoAccountId"},
- FunctionInfo{14, nullptr, "GetNickname"},
- FunctionInfo{15, nullptr, "GetProfileImage"},
- FunctionInfo{16, nullptr, "GetProfileLargeImage", MakeVersionGate({18,0,0})},
- FunctionInfo{21, nullptr, "LoadIdTokenCache", MakeVersionGate({3,0,0})}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "IGuestLoginRequest"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetSessionId"},
+ {11, nullptr, "Unknown"}, // 1.0.0 - 2.3.0 (the name is blank on Switchbrew)
+ {12, nullptr, "GetAccountId"},
+ {13, nullptr, "GetLinkedNintendoAccountId"},
+ {14, nullptr, "GetNickname"},
+ {15, nullptr, "GetProfileImage"},
+ {16, nullptr, "GetProfileLargeImage"}, // 18.0.0+
+ {21, nullptr, "LoadIdTokenCache"}, // 3.0.0+
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
@@ -671,10 +686,23 @@ public:
const std::shared_ptr<ProfileManager>& profile_manager_)
: ServiceFramework{system_, "IManagerForApplication"},
ensure_token_id{std::make_shared<EnsureTokenIdCacheAsyncInterface>(system)},
- profile_manager{profile_manager_} {}
+ profile_manager{profile_manager_} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &IManagerForApplication::CheckAvailability, "CheckAvailability"},
+ {1, &IManagerForApplication::GetAccountId, "GetAccountId"},
+ {2, &IManagerForApplication::EnsureIdTokenCacheAsync, "EnsureIdTokenCacheAsync"},
+ {3, &IManagerForApplication::LoadIdTokenCacheDeprecated, "LoadIdTokenCacheDeprecated"},
+ {4, &IManagerForApplication::LoadIdTokenCache, "LoadIdTokenCache"},
+ {130, &IManagerForApplication::GetNintendoAccountUserResourceCacheForApplication, "GetNintendoAccountUserResourceCacheForApplication"},
+ {136, &IManagerForApplication::GetNintendoAccountUserResourceCacheForApplication, "GetNintendoAccountUserResourceCache"}, // 19.0.0+
+ {150, nullptr, "CreateAuthorizationRequest"},
+ {160, &IManagerForApplication::StoreOpenContext, "StoreOpenContext"},
+ {170, nullptr, "LoadNetworkServiceLicenseKindAsync"},
+ };
+ // clang-format on
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
private:
@@ -744,18 +772,6 @@ private:
rb.Push(ResultSuccess);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &IManagerForApplication::CheckAvailability, "CheckAvailability"},
- FunctionInfo{1, &IManagerForApplication::GetAccountId, "GetAccountId"},
- FunctionInfo{2, &IManagerForApplication::EnsureIdTokenCacheAsync, "EnsureIdTokenCacheAsync"},
- FunctionInfo{3, &IManagerForApplication::LoadIdTokenCacheDeprecated, "LoadIdTokenCacheDeprecated"},
- FunctionInfo{4, &IManagerForApplication::LoadIdTokenCache, "LoadIdTokenCache"},
- FunctionInfo{130, &IManagerForApplication::GetNintendoAccountUserResourceCacheForApplication, "GetNintendoAccountUserResourceCacheForApplication"},
- FunctionInfo{136, &IManagerForApplication::GetNintendoAccountUserResourceCacheForApplication, "GetNintendoAccountUserResourceCache", MakeVersionGate({19,0,0})},
- FunctionInfo{150, nullptr, "CreateAuthorizationRequest"},
- FunctionInfo{160, &IManagerForApplication::StoreOpenContext, "StoreOpenContext"},
- FunctionInfo{170, nullptr, "LoadNetworkServiceLicenseKindAsync"}
- );
std::shared_ptr<EnsureTokenIdCacheAsyncInterface> ensure_token_id{};
std::shared_ptr<ProfileManager> profile_manager;
};
@@ -765,17 +781,18 @@ class IAsyncNetworkServiceLicenseKindContext final
: public ServiceFramework<IAsyncNetworkServiceLicenseKindContext> {
public:
explicit IAsyncNetworkServiceLicenseKindContext(Core::System& system_, Common::UUID)
- : ServiceFramework{system_, "IAsyncNetworkServiceLicenseKindContext"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetSystemEvent"},
- FunctionInfo{1, nullptr, "Cancel"},
- FunctionInfo{2, nullptr, "HasDone"},
- FunctionInfo{3, nullptr, "GetResult"},
- FunctionInfo{4, nullptr, "GetNetworkServiceLicenseKind"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "IAsyncNetworkServiceLicenseKindContext"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetSystemEvent"},
+ {1, nullptr, "Cancel"},
+ {2, nullptr, "HasDone"},
+ {3, nullptr, "GetResult"},
+ {4, nullptr, "GetNetworkServiceLicenseKind"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
@@ -784,54 +801,56 @@ class IOAuthProcedureForUserRegistration final
: public ServiceFramework<IOAuthProcedureForUserRegistration> {
public:
explicit IOAuthProcedureForUserRegistration(Core::System& system_, Common::UUID)
- : ServiceFramework{system_, "IOAuthProcedureForUserRegistration"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "PrepareAsync"},
- FunctionInfo{1, nullptr, "GetRequest"},
- FunctionInfo{2, nullptr, "ApplyResponse"},
- FunctionInfo{3, nullptr, "ApplyResponseAsync"},
- FunctionInfo{10, nullptr, "Suspend"},
- FunctionInfo{100, nullptr, "GetAccountId"},
- FunctionInfo{101, nullptr, "GetLinkedNintendoAccountId"},
- FunctionInfo{102, nullptr, "GetNickname"},
- FunctionInfo{103, nullptr, "GetProfileImage"},
- FunctionInfo{104, nullptr, "GetProfileLargeImage", MakeVersionGate({18,0,0})},
- FunctionInfo{110, nullptr, "RegisterUserAsync"},
- FunctionInfo{111, nullptr, "GetUid"},
- FunctionInfo{200, nullptr, "ApplyResponseForUserCreationAsync", MakeVersionGate({17,0,0})},
- FunctionInfo{205, nullptr, "SuspendAfterApplyResponse", MakeVersionGate({17,0,0})},
- FunctionInfo{210, nullptr, "IsProfileAvailable", MakeVersionGate({17,0,0})},
- FunctionInfo{220, nullptr, "RegisterUserAsyncWithoutProfile", MakeVersionGate({17,0,0})},
- FunctionInfo{221, nullptr, "RegisterUserWithProfileAsync", MakeVersionGate({17,0,0})},
- FunctionInfo{230, nullptr, "RegisterUserWithLargeImageProfileAsync", MakeVersionGate({18,0,0})}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "IOAuthProcedureForUserRegistration"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "PrepareAsync"},
+ {1, nullptr, "GetRequest"},
+ {2, nullptr, "ApplyResponse"},
+ {3, nullptr, "ApplyResponseAsync"},
+ {10, nullptr, "Suspend"},
+ {100, nullptr, "GetAccountId"},
+ {101, nullptr, "GetLinkedNintendoAccountId"},
+ {102, nullptr, "GetNickname"},
+ {103, nullptr, "GetProfileImage"},
+ {104, nullptr, "GetProfileLargeImage"}, // 18.0.0+
+ {110, nullptr, "RegisterUserAsync"},
+ {111, nullptr, "GetUid"},
+ {200, nullptr, "ApplyResponseForUserCreationAsync"}, // 17.0.0+
+ {205, nullptr, "SuspendAfterApplyResponse"}, // 17.0.0+
+ {210, nullptr, "IsProfileAvailable"}, // 17.0.0+
+ {220, nullptr, "RegisterUserAsyncWithoutProfile"}, // 17.0.0+
+ {221, nullptr, "RegisterUserWithProfileAsync"}, // 17.0.0+
+ {230, nullptr, "RegisterUserWithLargeImageProfileAsync"} // 18.0.0+
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
class DAUTH_O final : public ServiceFramework<DAUTH_O> {
public:
- explicit DAUTH_O(Core::System& system_, Common::UUID) : ServiceFramework{system_, "dauth:o"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "EnsureAuthenticationTokenCacheAsync"},
- FunctionInfo{1, nullptr, "LoadAuthenticationTokenCache"},
- FunctionInfo{2, nullptr, "InvalidateAuthenticationTokenCache"},
- FunctionInfo{3, nullptr, "IsDeviceAuthenticationTokenCacheAvailable"},
- FunctionInfo{10, nullptr, "EnsureEdgeTokenCacheAsync"},
- FunctionInfo{11, nullptr, "LoadEdgeTokenCache"},
- FunctionInfo{12, nullptr, "InvalidateEdgeTokenCache"},
- FunctionInfo{13, nullptr, "IsEdgeTokenCacheAvailable"},
- FunctionInfo{20, nullptr, "EnsureApplicationAuthenticationCacheAsync"},
- FunctionInfo{21, nullptr, "LoadApplicationAuthenticationTokenCache"},
- FunctionInfo{22, nullptr, "LoadApplicationNetworkServiceClientConfigCache"},
- FunctionInfo{23, nullptr, "IsApplicationAuthenticationCacheAvailable"},
- FunctionInfo{24, nullptr, "InvalidateApplicationAuthenticationCache"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit DAUTH_O(Core::System& system_, Common::UUID) : ServiceFramework{system_, "dauth:o"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "EnsureAuthenticationTokenCacheAsync"},
+ {1, nullptr, "LoadAuthenticationTokenCache"},
+ {2, nullptr, "InvalidateAuthenticationTokenCache"},
+ {3, nullptr, "IsDeviceAuthenticationTokenCacheAvailable"},
+ {10, nullptr, "EnsureEdgeTokenCacheAsync"},
+ {11, nullptr, "LoadEdgeTokenCache"},
+ {12, nullptr, "InvalidateEdgeTokenCache"},
+ {13, nullptr, "IsEdgeTokenCacheAvailable"},
+ {20, nullptr, "EnsureApplicationAuthenticationCacheAsync"},
+ {21, nullptr, "LoadApplicationAuthenticationTokenCache"},
+ {22, nullptr, "LoadApplicationNetworkServiceClientConfigCache"},
+ {23, nullptr, "IsApplicationAuthenticationCacheAvailable"},
+ {24, nullptr, "InvalidateApplicationAuthenticationCache"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
@@ -839,809 +858,781 @@ public:
class IAsyncResult final : public ServiceFramework<IAsyncResult> {
public:
explicit IAsyncResult(Core::System& system_, Common::UUID)
- : ServiceFramework{system_, "IAsyncResult"} {}
+ : ServiceFramework{system_, "IAsyncResult"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetResult"},
+ {1, nullptr, "Cancel"},
+ {2, nullptr, "IsAvailable"},
+ {3, nullptr, "GetSystemEvent"},
+ };
+ // clang-format on
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetResult"},
- FunctionInfo{1, nullptr, "Cancel"},
- FunctionInfo{2, nullptr, "IsAvailable"},
- FunctionInfo{3, nullptr, "GetSystemEvent"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
};
-class Module final {
-public:
- class Interface : public ServiceFramework<Interface> {
- public:
- explicit Interface(std::shared_ptr<Module> module_, std::shared_ptr<ProfileManager> profile_manager_, Core::System& system_, const char* name)
- : ServiceFramework{system_, name}
- , module{std::move(module_)}
- , profile_manager{std::move(profile_manager_)}
- {}
- ~Interface() override = default;
-
- void GetUserCount(HLERequestContext& ctx) {
- LOG_DEBUG(Service_ACC, "called");
- IPC::ResponseBuilder rb{ctx, 3};
- rb.Push(ResultSuccess);
- rb.Push<u32>(static_cast<u32>(profile_manager->GetUserCount()));
- }
+void Module::Interface::GetUserCount(HLERequestContext& ctx) {
+ LOG_DEBUG(Service_ACC, "called");
+ IPC::ResponseBuilder rb{ctx, 3};
+ rb.Push(ResultSuccess);
+ rb.Push<u32>(static_cast<u32>(profile_manager->GetUserCount()));
+}
- void GetUserExistence(HLERequestContext& ctx) {
- IPC::RequestParser rp{ctx};
- Common::UUID user_id = rp.PopRaw<Common::UUID>();
- LOG_DEBUG(Service_ACC, "called user_id=0x{}", user_id.RawString());
+void Module::Interface::GetUserExistence(HLERequestContext& ctx) {
+ IPC::RequestParser rp{ctx};
+ Common::UUID user_id = rp.PopRaw<Common::UUID>();
+ LOG_DEBUG(Service_ACC, "called user_id=0x{}", user_id.RawString());
- IPC::ResponseBuilder rb{ctx, 3};
- rb.Push(ResultSuccess);
- rb.Push(profile_manager->UserExists(user_id));
- }
+ IPC::ResponseBuilder rb{ctx, 3};
+ rb.Push(ResultSuccess);
+ rb.Push(profile_manager->UserExists(user_id));
+}
- void ListAllUsers(HLERequestContext& ctx) {
- LOG_DEBUG(Service_ACC, "called");
- ctx.WriteBuffer(profile_manager->GetAllUsers());
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(ResultSuccess);
- }
+void Module::Interface::ListAllUsers(HLERequestContext& ctx) {
+ LOG_DEBUG(Service_ACC, "called");
+ ctx.WriteBuffer(profile_manager->GetAllUsers());
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+}
- void ListOpenUsers(HLERequestContext& ctx) {
- LOG_DEBUG(Service_ACC, "called");
- ctx.WriteBuffer(profile_manager->GetOpenUsers());
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(ResultSuccess);
- }
+void Module::Interface::ListOpenUsers(HLERequestContext& ctx) {
+ LOG_DEBUG(Service_ACC, "called");
+ ctx.WriteBuffer(profile_manager->GetOpenUsers());
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+}
- void GetLastOpenedUser(HLERequestContext& ctx) {
- LOG_DEBUG(Service_ACC, "called");
- IPC::ResponseBuilder rb{ctx, 6};
- rb.Push(ResultSuccess);
- rb.PushRaw<Common::UUID>(profile_manager->GetLastOpenedUser());
- }
+void Module::Interface::GetLastOpenedUser(HLERequestContext& ctx) {
+ LOG_DEBUG(Service_ACC, "called");
+ IPC::ResponseBuilder rb{ctx, 6};
+ rb.Push(ResultSuccess);
+ rb.PushRaw<Common::UUID>(profile_manager->GetLastOpenedUser());
+}
- void GetProfile(HLERequestContext& ctx) {
- IPC::RequestParser rp{ctx};
- Common::UUID user_id = rp.PopRaw<Common::UUID>();
- LOG_DEBUG(Service_ACC, "called user_id=0x{}", user_id.RawString());
+void Module::Interface::GetProfile(HLERequestContext& ctx) {
+ IPC::RequestParser rp{ctx};
+ Common::UUID user_id = rp.PopRaw<Common::UUID>();
+ LOG_DEBUG(Service_ACC, "called user_id=0x{}", user_id.RawString());
- IPC::ResponseBuilder rb{ctx, 2, 0, 1};
- rb.Push(ResultSuccess);
- rb.PushIpcInterface<Service::Account::IProfile>(ctx, system, user_id, *profile_manager);
- }
+ IPC::ResponseBuilder rb{ctx, 2, 0, 1};
+ rb.Push(ResultSuccess);
+ rb.PushIpcInterface<IProfile>(ctx, system, user_id, *profile_manager);
+}
- void IsUserRegistrationRequestPermitted(HLERequestContext& ctx) {
- LOG_WARNING(Service_ACC, "(STUBBED) called");
- IPC::ResponseBuilder rb{ctx, 3};
- rb.Push(ResultSuccess);
- rb.Push(profile_manager->CanSystemRegisterUser());
- }
+void Module::Interface::IsUserRegistrationRequestPermitted(HLERequestContext& ctx) {
+ LOG_WARNING(Service_ACC, "(STUBBED) called");
+ IPC::ResponseBuilder rb{ctx, 3};
+ rb.Push(ResultSuccess);
+ rb.Push(profile_manager->CanSystemRegisterUser());
+}
- void InitializeApplicationInfo(HLERequestContext& ctx) {
- LOG_DEBUG(Service_ACC, "called");
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(InitializeApplicationInfoBase());
- }
+void Module::Interface::InitializeApplicationInfo(HLERequestContext& ctx) {
+ LOG_DEBUG(Service_ACC, "called");
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(InitializeApplicationInfoBase());
+}
- void InitializeApplicationInfoRestricted(HLERequestContext& ctx) {
- LOG_WARNING(Service_ACC, "(Partial implementation) called");
+void Module::Interface::InitializeApplicationInfoRestricted(HLERequestContext& ctx) {
+ LOG_WARNING(Service_ACC, "(Partial implementation) called");
- // TODO(ogniK): We require checking if the user actually owns the title and what not. As of
- // currently, we assume the user owns the title. InitializeApplicationInfoBase SHOULD be called
- // first then we do extra checks if the game is a digital copy.
+ // TODO(ogniK): We require checking if the user actually owns the title and what not. As of
+ // currently, we assume the user owns the title. InitializeApplicationInfoBase SHOULD be called
+ // first then we do extra checks if the game is a digital copy.
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(InitializeApplicationInfoBase());
- }
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(InitializeApplicationInfoBase());
+}
- void GetBaasAccountManagerForApplication(HLERequestContext& ctx) {
- LOG_DEBUG(Service_ACC, "called");
- IPC::ResponseBuilder rb{ctx, 2, 0, 1};
- rb.Push(ResultSuccess);
- rb.PushIpcInterface<IManagerForApplication>(ctx, system, profile_manager);
- }
+Result Module::Interface::InitializeApplicationInfoBase() {
+ if (application_info) {
+ LOG_ERROR(Service_ACC, "Application already initialized");
+ return Account::ResultApplicationInfoAlreadyInitialized;
+ }
- void IsUserAccountSwitchLocked(HLERequestContext& ctx) {
- LOG_DEBUG(Service_ACC, "called");
- FileSys::NACP nacp;
- const auto res = system.GetAppLoader().ReadControlData(nacp);
-
- bool is_locked = false;
-
- if (res != Loader::ResultStatus::Success) {
- const FileSys::PatchManager pm{system.GetApplicationProcessProgramID(),
- system.GetFileSystemController(),
- system.GetContentProvider()};
- const auto nacp_unique = pm.GetControlMetadata().first;
-
- if (nacp_unique != nullptr) {
- is_locked = nacp_unique->GetUserAccountSwitchLock();
- } else {
- LOG_ERROR(Service_ACC, "nacp_unique is null!");
- }
- } else {
- is_locked = nacp.GetUserAccountSwitchLock();
- }
-
- IPC::ResponseBuilder rb{ctx, 3};
- rb.Push(ResultSuccess);
- rb.Push(is_locked);
- }
+ // TODO(ogniK): This should be changed to reflect the target process for when we have multiple
+ // processes emulated. As we don't actually have pid support we should assume we're just using
+ // our own process
+ Glue::ApplicationLaunchProperty launch_property{};
+ const auto result = system.GetARPManager().GetLaunchProperty(
+ &launch_property, system.GetApplicationProcessProgramID());
- void InitializeApplicationInfoV2(HLERequestContext& ctx) {
- LOG_WARNING(Service_ACC, "(STUBBED) called");
+ if (result != ResultSuccess) {
+ LOG_ERROR(Service_ACC, "Failed to get launch property");
+ return Account::ResultInvalidApplication;
+ }
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(ResultSuccess);
- }
+ switch (launch_property.base_game_storage_id) {
+ case FileSys::StorageId::GameCard:
+ application_info.application_type = ApplicationType::GameCard;
+ break;
+ case FileSys::StorageId::Host:
+ case FileSys::StorageId::NandSystem:
+ case FileSys::StorageId::NandUser:
+ case FileSys::StorageId::SdCard:
+ case FileSys::StorageId::None: // Yuzu specific, differs from hardware
+ application_info.application_type = ApplicationType::Digital;
+ break;
+ default:
+ LOG_ERROR(Service_ACC, "Invalid game storage ID! storage_id={}",
+ launch_property.base_game_storage_id);
+ return Account::ResultInvalidApplication;
+ }
- void BeginUserRegistration(HLERequestContext& ctx) {
- const auto user_id = Common::UUID::MakeRandom();
- profile_manager->CreateNewUser(user_id, "Eden");
+ LOG_WARNING(Service_ACC, "ApplicationInfo init required");
+ // TODO(ogniK): Actual initialization here
- LOG_INFO(Service_ACC, "called, uuid={}", user_id.FormattedString());
+ return ResultSuccess;
+}
- IPC::ResponseBuilder rb{ctx, 6};
- rb.Push(ResultSuccess);
- rb.PushRaw(user_id);
- }
+void Module::Interface::GetBaasAccountManagerForApplication(HLERequestContext& ctx) {
+ LOG_DEBUG(Service_ACC, "called");
+ IPC::ResponseBuilder rb{ctx, 2, 0, 1};
+ rb.Push(ResultSuccess);
+ rb.PushIpcInterface<IManagerForApplication>(ctx, system, profile_manager);
+}
- void CompleteUserRegistration(HLERequestContext& ctx) {
- IPC::RequestParser rp{ctx};
- Common::UUID user_id = rp.PopRaw<Common::UUID>();
+void Module::Interface::IsUserAccountSwitchLocked(HLERequestContext& ctx) {
+ LOG_DEBUG(Service_ACC, "called");
+ FileSys::NACP nacp;
+ const auto res = system.GetAppLoader().ReadControlData(nacp);
- LOG_INFO(Service_ACC, "called, uuid={}", user_id.FormattedString());
+ bool is_locked = false;
- profile_manager->WriteUserSaveFile();
+ if (res != Loader::ResultStatus::Success) {
+ const FileSys::PatchManager pm{system.GetApplicationProcessProgramID(),
+ system.GetFileSystemController(),
+ system.GetContentProvider()};
+ const auto nacp_unique = pm.GetControlMetadata().first;
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(ResultSuccess);
+ if (nacp_unique != nullptr) {
+ is_locked = nacp_unique->GetUserAccountSwitchLock();
+ } else {
+ LOG_ERROR(Service_ACC, "nacp_unique is null!");
}
+ } else {
+ is_locked = nacp.GetUserAccountSwitchLock();
+ }
- void DeleteUser(HLERequestContext& ctx) {
- IPC::RequestParser rp{ctx};
- Common::UUID user_id = rp.PopRaw<Common::UUID>();
- LOG_INFO(Service_ACC, "called, uuid={}", user_id.FormattedString());
- if (!profile_manager->RemoveUser(user_id)) {
- LOG_ERROR(Service_ACC, "Failed to delete user with uuid={}", user_id.RawString());
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(1U);
- return;
- }
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(ResultSuccess);
- }
+ IPC::ResponseBuilder rb{ctx, 3};
+ rb.Push(ResultSuccess);
+ rb.Push(is_locked);
+}
+
+void Module::Interface::InitializeApplicationInfoV2(HLERequestContext& ctx) {
+ LOG_WARNING(Service_ACC, "(STUBBED) called");
- void SetUserPosition(HLERequestContext& ctx) {
- IPC::RequestParser rp{ctx};
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+}
- u64 position = rp.Pop<u64>();
- Common::UUID user_id = rp.PopRaw<Common::UUID>();
+void Module::Interface::BeginUserRegistration(HLERequestContext& ctx) {
+ const auto user_id = Common::UUID::MakeRandom();
+ profile_manager->CreateNewUser(user_id, "Eden");
- LOG_DEBUG(Service_ACC, "called, position={} user_id={}", position, user_id.FormattedString());
+ LOG_INFO(Service_ACC, "called, uuid={}", user_id.FormattedString());
- profile_manager->SetUserPosition(position, user_id);
+ IPC::ResponseBuilder rb{ctx, 6};
+ rb.Push(ResultSuccess);
+ rb.PushRaw(user_id);
+}
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(ResultSuccess);
- }
+void Module::Interface::CompleteUserRegistration(HLERequestContext& ctx) {
+ IPC::RequestParser rp{ctx};
+ Common::UUID user_id = rp.PopRaw<Common::UUID>();
- void GetProfileEditor(HLERequestContext& ctx) {
- IPC::RequestParser rp{ctx};
- Common::UUID user_id = rp.PopRaw<Common::UUID>();
+ LOG_INFO(Service_ACC, "called, uuid={}", user_id.FormattedString());
- LOG_DEBUG(Service_ACC, "called, user_id=0x{}", user_id.RawString());
+ profile_manager->WriteUserSaveFile();
- IPC::ResponseBuilder rb{ctx, 2, 0, 1};
- rb.Push(ResultSuccess);
- rb.PushIpcInterface<IProfileEditor>(ctx, system, user_id, *profile_manager);
- }
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+}
- void GetBaasAccountAdministrator(HLERequestContext &ctx) {
- IPC::RequestParser rp{ctx};
- const auto uuid = rp.PopRaw<Common::UUID>();
+void Module::Interface::DeleteUser(HLERequestContext& ctx) {
+ IPC::RequestParser rp{ctx};
+ Common::UUID user_id = rp.PopRaw<Common::UUID>();
+ LOG_INFO(Service_ACC, "called, uuid={}", user_id.FormattedString());
+ if (!profile_manager->RemoveUser(user_id)) {
+ LOG_ERROR(Service_ACC, "Failed to delete user with uuid={}", user_id.RawString());
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(1U);
+ return;
+ }
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+}
- LOG_INFO(Service_ACC, "called, uuid=0x{}", uuid.RawString());
+void Module::Interface::SetUserPosition(HLERequestContext& ctx) {
+ IPC::RequestParser rp{ctx};
- IPC::ResponseBuilder rb{ctx, 2, 0, 1};
- rb.Push(ResultSuccess);
- rb.PushIpcInterface<IAdministrator>(ctx, system, uuid);
- }
+ u64 position = rp.Pop<u64>();
+ Common::UUID user_id = rp.PopRaw<Common::UUID>();
- void ListQualifiedUsers(HLERequestContext& ctx) {
- LOG_DEBUG(Service_ACC, "called");
+ LOG_DEBUG(Service_ACC, "called, position={} user_id={}", position, user_id.FormattedString());
- // All users should be qualified. We don't actually have parental control or anything to do with
- // nintendo online currently. We're just going to assume the user running the game has access to
- // the game regardless of parental control settings.
- ctx.WriteBuffer(profile_manager->GetAllUsers());
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(ResultSuccess);
- }
+ profile_manager->SetUserPosition(position, user_id);
- void ListOpenContextStoredUsers(HLERequestContext& ctx) {
- LOG_DEBUG(Service_ACC, "called");
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+}
- ctx.WriteBuffer(profile_manager->GetStoredOpenedUsers());
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(ResultSuccess);
- }
+void Module::Interface::GetProfileEditor(HLERequestContext& ctx) {
+ IPC::RequestParser rp{ctx};
+ Common::UUID user_id = rp.PopRaw<Common::UUID>();
+
+ LOG_DEBUG(Service_ACC, "called, user_id=0x{}", user_id.RawString());
- void StoreSaveDataThumbnailApplication(HLERequestContext& ctx) {
- IPC::RequestParser rp{ctx};
- const auto uuid = rp.PopRaw<Common::UUID>();
+ IPC::ResponseBuilder rb{ctx, 2, 0, 1};
+ rb.Push(ResultSuccess);
+ rb.PushIpcInterface<IProfileEditor>(ctx, system, user_id, *profile_manager);
+}
- LOG_WARNING(Service_ACC, "(STUBBED) called, uuid=0x{}", uuid.RawString());
+void Module::Interface::GetBaasAccountAdministrator(HLERequestContext &ctx) {
+ IPC::RequestParser rp{ctx};
+ const auto uuid = rp.PopRaw<Common::UUID>();
- // TODO(ogniK): Check if application ID is zero on acc initialize. As we don't have a reliable
- // way of confirming things like the TID, we're going to assume a non zero value for the time
- // being.
- constexpr u64 tid{1};
- StoreSaveDataThumbnail(ctx, uuid, tid);
- }
+ LOG_INFO(Service_ACC, "called, uuid=0x{}", uuid.RawString());
- void GetBaasAccountManagerForSystemService(HLERequestContext& ctx) {
- IPC::RequestParser rp{ctx};
- const auto uuid = rp.PopRaw<Common::UUID>();
+ IPC::ResponseBuilder rb{ctx, 2, 0, 1};
+ rb.Push(ResultSuccess);
+ rb.PushIpcInterface<IAdministrator>(ctx, system, uuid);
+}
- LOG_INFO(Service_ACC, "called, uuid=0x{}", uuid.RawString());
+void Module::Interface::ListQualifiedUsers(HLERequestContext& ctx) {
+ LOG_DEBUG(Service_ACC, "called");
- IPC::ResponseBuilder rb{ctx, 2, 0, 1};
- rb.Push(ResultSuccess);
- rb.PushIpcInterface<IManagerForSystemService>(ctx, system, uuid);
- }
+ // All users should be qualified. We don't actually have parental control or anything to do with
+ // nintendo online currently. We're just going to assume the user running the game has access to
+ // the game regardless of parental control settings.
+ ctx.WriteBuffer(profile_manager->GetAllUsers());
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+}
- void StoreSaveDataThumbnailSystem(HLERequestContext& ctx) {
- IPC::RequestParser rp{ctx};
- const auto uuid = rp.PopRaw<Common::UUID>();
- const auto tid = rp.Pop<u64_le>();
+void Module::Interface::ListOpenContextStoredUsers(HLERequestContext& ctx) {
+ LOG_DEBUG(Service_ACC, "called");
- LOG_WARNING(Service_ACC, "(STUBBED) called, uuid=0x{}, tid={:016X}", uuid.RawString(), tid);
- StoreSaveDataThumbnail(ctx, uuid, tid);
- }
+ ctx.WriteBuffer(profile_manager->GetStoredOpenedUsers());
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+}
- void GetPinCodeLength(HLERequestContext& ctx) {
- LOG_WARNING(Service_ACC, "(STUBBED) called");
+void Module::Interface::StoreSaveDataThumbnailApplication(HLERequestContext& ctx) {
+ IPC::RequestParser rp{ctx};
+ const auto uuid = rp.PopRaw<Common::UUID>();
- IPC::ResponseBuilder rb{ctx, 3};
- rb.Push(ResultSuccess);
- rb.Push<u32>(0);
- }
+ LOG_WARNING(Service_ACC, "(STUBBED) called, uuid=0x{}", uuid.RawString());
- void TrySelectUserWithoutInteractionDeprecated(HLERequestContext& ctx) {
- LOG_DEBUG(Service_ACC, "called");
- // A u8 is passed into this function which we can safely ignore. It's to determine if we have
- // access to use the network or not by the looks of it
- IPC::ResponseBuilder rb{ctx, 6};
- if (profile_manager->GetUserCount() != 1) {
- rb.Push(ResultSuccess);
- rb.PushRaw(Common::InvalidUUID);
- return;
- }
-
- const auto user_list = profile_manager->GetAllUsers();
- if (std::ranges::all_of(user_list, [](const auto& user) { return user.IsInvalid(); })) {
- rb.Push(ResultUnknown); // TODO(ogniK): Find the correct error code
- rb.PushRaw(Common::InvalidUUID);
- return;
- }
-
- // Select the first user we have
- rb.Push(ResultSuccess);
- rb.PushRaw(profile_manager->GetUser(0)->uuid);
- }
+ // TODO(ogniK): Check if application ID is zero on acc initialize. As we don't have a reliable
+ // way of confirming things like the TID, we're going to assume a non zero value for the time
+ // being.
+ constexpr u64 tid{1};
+ StoreSaveDataThumbnail(ctx, uuid, tid);
+}
- void TrySelectUserWithoutInteraction(HLERequestContext& ctx) {
- LOG_DEBUG(Service_ACC, "called");
- // A u8 is passed into this function which we can safely ignore. It's to determine if we have
- // access to use the network or not by the looks of it
- IPC::ResponseBuilder rb{ctx, 6};
- if (profile_manager->GetUserCount() != 1) {
- rb.Push(ResultSuccess);
- rb.PushRaw(Common::InvalidUUID);
- return;
- }
-
- const auto user_list = profile_manager->GetAllUsers();
- if (std::ranges::all_of(user_list, [](const auto& user) { return user.IsInvalid(); })) {
- rb.Push(ResultUnknown); // TODO(ogniK): Find the correct error code
- rb.PushRaw(Common::InvalidUUID);
- return;
- }
-
- // Select the first user we have
- rb.Push(ResultSuccess);
- rb.PushRaw(profile_manager->GetUser(0)->uuid);
- }
+void Module::Interface::GetBaasAccountManagerForSystemService(HLERequestContext& ctx) {
+ IPC::RequestParser rp{ctx};
+ const auto uuid = rp.PopRaw<Common::UUID>();
- private:
- Result InitializeApplicationInfoBase() {
- if (application_info) {
- LOG_ERROR(Service_ACC, "Application already initialized");
- return Account::ResultApplicationInfoAlreadyInitialized;
- }
-
- // TODO(ogniK): This should be changed to reflect the target process for when we have multiple
- // processes emulated. As we don't actually have pid support we should assume we're just using
- // our own process
- Glue::ApplicationLaunchProperty launch_property{};
- const auto result = system.GetARPManager().GetLaunchProperty(
- &launch_property, system.GetApplicationProcessProgramID());
-
- if (result != ResultSuccess) {
- LOG_ERROR(Service_ACC, "Failed to get launch property");
- return Account::ResultInvalidApplication;
- }
-
- switch (launch_property.base_game_storage_id) {
- case FileSys::StorageId::GameCard:
- application_info.application_type = ApplicationType::GameCard;
- break;
- case FileSys::StorageId::Host:
- case FileSys::StorageId::NandSystem:
- case FileSys::StorageId::NandUser:
- case FileSys::StorageId::SdCard:
- case FileSys::StorageId::None: // Yuzu specific, differs from hardware
- application_info.application_type = ApplicationType::Digital;
- break;
- default:
- LOG_ERROR(Service_ACC, "Invalid game storage ID! storage_id={}",
- launch_property.base_game_storage_id);
- return Account::ResultInvalidApplication;
- }
-
- LOG_WARNING(Service_ACC, "ApplicationInfo init required");
- // TODO(ogniK): Actual initialization here
-
- return ResultSuccess;
- }
+ LOG_INFO(Service_ACC, "called, uuid=0x{}", uuid.RawString());
- void StoreSaveDataThumbnail(HLERequestContext& ctx, const Common::UUID& uuid,
- const u64 tid) {
- IPC::ResponseBuilder rb{ctx, 2};
+ IPC::ResponseBuilder rb{ctx, 2, 0, 1};
+ rb.Push(ResultSuccess);
+ rb.PushIpcInterface<IManagerForSystemService>(ctx, system, uuid);
+}
- if (tid == 0) {
- LOG_ERROR(Service_ACC, "TitleID is not valid!");
- rb.Push(Account::ResultInvalidApplication);
- return;
- }
-
- if (uuid.IsInvalid()) {
- LOG_ERROR(Service_ACC, "User ID is not valid!");
- rb.Push(Account::ResultInvalidUserId);
- return;
- }
- const auto thumbnail_size = ctx.GetReadBufferSize();
- if (thumbnail_size != THUMBNAIL_SIZE) {
- LOG_ERROR(Service_ACC, "Buffer size is empty! size={:X} expecting {:X}", thumbnail_size,
- THUMBNAIL_SIZE);
- rb.Push(Account::ResultInvalidArrayLength);
- return;
- }
-
- // TODO(ogniK): Construct save data thumbnail
- rb.Push(ResultSuccess);
- }
+void Module::Interface::StoreSaveDataThumbnailSystem(HLERequestContext& ctx) {
+ IPC::RequestParser rp{ctx};
+ const auto uuid = rp.PopRaw<Common::UUID>();
+ const auto tid = rp.Pop<u64_le>();
- enum class ApplicationType : u32_le {
- GameCard = 0,
- Digital = 1,
- Unknown = 3,
- };
+ LOG_WARNING(Service_ACC, "(STUBBED) called, uuid=0x{}, tid={:016X}", uuid.RawString(), tid);
+ StoreSaveDataThumbnail(ctx, uuid, tid);
+}
- struct ApplicationInfo {
- Service::Glue::ApplicationLaunchProperty launch_property;
- ApplicationType application_type;
+void Module::Interface::GetPinCodeLength(HLERequestContext& ctx) {
+ LOG_WARNING(Service_ACC, "(STUBBED) called");
- constexpr explicit operator bool() const {
- return launch_property.title_id != 0x0;
- }
- };
+ IPC::ResponseBuilder rb{ctx, 3};
+ rb.Push(ResultSuccess);
+ rb.Push<u32>(0);
+}
- ApplicationInfo application_info{};
- protected:
- std::shared_ptr<Module> module;
- std::shared_ptr<ProfileManager> profile_manager;
- };
-};
+void Module::Interface::StoreSaveDataThumbnail(HLERequestContext& ctx, const Common::UUID& uuid,
+ const u64 tid) {
+ IPC::ResponseBuilder rb{ctx, 2};
+
+ if (tid == 0) {
+ LOG_ERROR(Service_ACC, "TitleID is not valid!");
+ rb.Push(Account::ResultInvalidApplication);
+ return;
+ }
+
+ if (uuid.IsInvalid()) {
+ LOG_ERROR(Service_ACC, "User ID is not valid!");
+ rb.Push(Account::ResultInvalidUserId);
+ return;
+ }
+ const auto thumbnail_size = ctx.GetReadBufferSize();
+ if (thumbnail_size != THUMBNAIL_SIZE) {
+ LOG_ERROR(Service_ACC, "Buffer size is empty! size={:X} expecting {:X}", thumbnail_size,
+ THUMBNAIL_SIZE);
+ rb.Push(Account::ResultInvalidArrayLength);
+ return;
+ }
+
+ // TODO(ogniK): Construct save data thumbnail
+ rb.Push(ResultSuccess);
+}
+
+void Module::Interface::TrySelectUserWithoutInteractionDeprecated(HLERequestContext& ctx) {
+ LOG_DEBUG(Service_ACC, "called");
+ // A u8 is passed into this function which we can safely ignore. It's to determine if we have
+ // access to use the network or not by the looks of it
+ IPC::ResponseBuilder rb{ctx, 6};
+ if (profile_manager->GetUserCount() != 1) {
+ rb.Push(ResultSuccess);
+ rb.PushRaw(Common::InvalidUUID);
+ return;
+ }
+
+ const auto user_list = profile_manager->GetAllUsers();
+ if (std::ranges::all_of(user_list, [](const auto& user) { return user.IsInvalid(); })) {
+ rb.Push(ResultUnknown); // TODO(ogniK): Find the correct error code
+ rb.PushRaw(Common::InvalidUUID);
+ return;
+ }
+
+ // Select the first user we have
+ rb.Push(ResultSuccess);
+ rb.PushRaw(profile_manager->GetUser(0)->uuid);
+}
+
+void Module::Interface::TrySelectUserWithoutInteraction(HLERequestContext& ctx) {
+ LOG_DEBUG(Service_ACC, "called");
+ // A u8 is passed into this function which we can safely ignore. It's to determine if we have
+ // access to use the network or not by the looks of it
+ IPC::ResponseBuilder rb{ctx, 6};
+ if (profile_manager->GetUserCount() != 1) {
+ rb.Push(ResultSuccess);
+ rb.PushRaw(Common::InvalidUUID);
+ return;
+ }
+
+ const auto user_list = profile_manager->GetAllUsers();
+ if (std::ranges::all_of(user_list, [](const auto& user) { return user.IsInvalid(); })) {
+ rb.Push(ResultUnknown); // TODO(ogniK): Find the correct error code
+ rb.PushRaw(Common::InvalidUUID);
+ return;
+ }
+
+ // Select the first user we have
+ rb.Push(ResultSuccess);
+ rb.PushRaw(profile_manager->GetUser(0)->uuid);
+}
+
+Module::Interface::Interface(std::shared_ptr<Module> module_,
+ std::shared_ptr<ProfileManager> profile_manager_,
+ Core::System& system_, const char* name)
+ : ServiceFramework{system_, name}, module{std::move(module_)},
+ profile_manager{std::move(profile_manager_)} {}
+
+Module::Interface::~Interface() = default;
class ACC_AA final : public Module::Interface {
public:
explicit ACC_AA(std::shared_ptr<Module> module_, std::shared_ptr<ProfileManager> profile_manager_, Core::System& system_)
- : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:aa") {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:aa") {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "EnsureCacheAsync"},
+ {1, nullptr, "LoadCache"},
+ {2, nullptr, "GetDeviceAccountId"},
+ {50, nullptr, "RegisterNotificationTokenAsync"}, // 1.0.0 - 6.2.0
+ {51, nullptr, "UnregisterNotificationTokenAsync"}, // 1.0.0 - 6.2.0
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
~ACC_AA() override = default;
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "EnsureCacheAsync"},
- FunctionInfo{1, nullptr, "LoadCache"},
- FunctionInfo{2, nullptr, "GetDeviceAccountId"},
- FunctionInfo{50, nullptr, "RegisterNotificationTokenAsync", MakeVersionGate({1,0,0}, {6,2,0})},
- FunctionInfo{51, nullptr, "UnregisterNotificationTokenAsync", MakeVersionGate({1,0,0}, {6,2,0})}
- );
};
class ACC_SU final : public Module::Interface {
public:
explicit ACC_SU(std::shared_ptr<Module> module_, std::shared_ptr<ProfileManager> profile_manager_, Core::System& system_)
- : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:su") {}
+ : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:su") {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &ACC_SU::GetUserCount, "GetUserCount"},
+ {1, &ACC_SU::GetUserExistence, "GetUserExistence"},
+ {2, &ACC_SU::ListAllUsers, "ListAllUsers"},
+ {3, &ACC_SU::ListOpenUsers, "ListOpenUsers"},
+ {4, &ACC_SU::GetLastOpenedUser, "GetLastOpenedUser"},
+ {5, &ACC_SU::GetProfile, "GetProfile"},
+ {6, nullptr, "GetProfileDigest"},
+ {50, &ACC_SU::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"},
+ {51, &ACC_SU::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"},
+ {52, &ACC_SU::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, // 19.0.0+
+ {60, &ACC_SU::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"},
+ {99, nullptr, "DebugActivateOpenContextRetention"},
+ {100, nullptr, "GetUserRegistrationNotifier"},
+ {101, nullptr, "GetUserStateChangeNotifier"},
+ {102, &ACC_SU::GetBaasAccountManagerForSystemService, "GetBaasAccountManagerForSystemService"},
+ {103, nullptr, "GetBaasUserAvailabilityChangeNotifier"},
+ {104, nullptr, "GetProfileUpdateNotifier"},
+ {105, nullptr, "CheckNetworkServiceAvailabilityAsync"},
+ {106, nullptr, "GetProfileSyncNotifier"},
+ {110, &ACC_SU::StoreSaveDataThumbnailSystem, "StoreSaveDataThumbnail"},
+ {111, nullptr, "ClearSaveDataThumbnail"},
+ {112, nullptr, "LoadSaveDataThumbnail"},
+ {113, nullptr, "GetSaveDataThumbnailExistence"},
+ {120, nullptr, "ListOpenUsersInApplication"},
+ {130, nullptr, "ActivateOpenContextRetention"},
+ {140, &ACC_SU::ListQualifiedUsers, "ListQualifiedUsers"},
+ {150, nullptr, "AuthenticateApplicationAsync"},
+ {151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"},
+ {152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"},
+ {190, nullptr, "GetUserLastOpenedApplication"},
+ {191, nullptr, "ActivateOpenContextHolder"},
+ {200, &ACC_SU::BeginUserRegistration, "BeginUserRegistration"},
+ {201, &ACC_SU::CompleteUserRegistration, "CompleteUserRegistration"},
+ {202, nullptr, "CancelUserRegistration"},
+ {203, &ACC_SU::DeleteUser, "DeleteUser"},
+ {204, &ACC_SU::SetUserPosition, "SetUserPosition"},
+ {205, &ACC_SU::GetProfileEditor, "GetProfileEditor"},
+ {206, nullptr, "CompleteUserRegistrationForcibly"},
+ {210, nullptr, "CreateFloatingRegistrationRequest"},
+ {211, nullptr, "CreateProcedureToRegisterUserWithNintendoAccount"},
+ {212, nullptr, "ResumeProcedureToRegisterUserWithNintendoAccount"},
+ {230, nullptr, "AuthenticateServiceAsync"},
+ {250, &ACC_SU::GetBaasAccountAdministrator, "GetBaasAccountAdministrator"},
+ {290, nullptr, "ProxyProcedureForGuestLoginWithNintendoAccount"},
+ {291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"},
+ {299, nullptr, "SuspendBackgroundDaemon"},
+ {400, nullptr, "SetPinCode"}, // 18.0.0+
+ {401, &ACC_SU::GetPinCodeLength, "GetPinCodeLength"}, // 18.0.0+
+ {402, nullptr, "GetPinCode"}, // 18.0.0+
+ {403, nullptr, "GetPinCodeParity"},
+ {404, nullptr, "VerifyPinCode"},
+ {405, nullptr, "IsPinCodeVerificationForbidden"},
+ {410, nullptr, "GetPinCodeErrorCount"}, // 18.0.0+
+ {411, nullptr, "ResetPinCodeErrorCount"}, // 18.0.0+
+ {412, nullptr, "IncrementPinCodeErrorCount"}, // 18.0.0+
+ {900, nullptr, "SetUserUnqualifiedForDebug"},
+ {901, nullptr, "UnsetUserUnqualifiedForDebug"},
+ {902, nullptr, "ListUsersUnqualifiedForDebug"},
+ {910, nullptr, "RefreshFirmwareSettingsForDebug"},
+ {997, nullptr, "DebugInvalidateTokenCacheForUser"},
+ {998, nullptr, "DebugSetUserStateClose"},
+ {999, nullptr, "DebugSetUserStateOpen"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
+ }
~ACC_SU() override = default;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &ACC_SU::GetUserCount, "GetUserCount"},
- FunctionInfo{1, &ACC_SU::GetUserExistence, "GetUserExistence"},
- FunctionInfo{2, &ACC_SU::ListAllUsers, "ListAllUsers"},
- FunctionInfo{3, &ACC_SU::ListOpenUsers, "ListOpenUsers"},
- FunctionInfo{4, &ACC_SU::GetLastOpenedUser, "GetLastOpenedUser"},
- FunctionInfo{5, &ACC_SU::GetProfile, "GetProfile"},
- FunctionInfo{6, nullptr, "GetProfileDigest"},
- FunctionInfo{50, &ACC_SU::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"},
- FunctionInfo{51, &ACC_SU::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"},
- FunctionInfo{52, &ACC_SU::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction", MakeVersionGate({19,0,0})},
- FunctionInfo{60, &ACC_SU::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"},
- FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention"},
- FunctionInfo{100, nullptr, "GetUserRegistrationNotifier"},
- FunctionInfo{101, nullptr, "GetUserStateChangeNotifier"},
- FunctionInfo{102, &ACC_SU::GetBaasAccountManagerForSystemService, "GetBaasAccountManagerForSystemService"},
- FunctionInfo{103, nullptr, "GetBaasUserAvailabilityChangeNotifier"},
- FunctionInfo{104, nullptr, "GetProfileUpdateNotifier"},
- FunctionInfo{105, nullptr, "CheckNetworkServiceAvailabilityAsync"},
- FunctionInfo{106, nullptr, "GetProfileSyncNotifier"},
- FunctionInfo{110, &ACC_SU::StoreSaveDataThumbnailSystem, "StoreSaveDataThumbnail"},
- FunctionInfo{111, nullptr, "ClearSaveDataThumbnail"},
- FunctionInfo{112, nullptr, "LoadSaveDataThumbnail"},
- FunctionInfo{113, nullptr, "GetSaveDataThumbnailExistence"},
- FunctionInfo{120, nullptr, "ListOpenUsersInApplication"},
- FunctionInfo{130, nullptr, "ActivateOpenContextRetention"},
- FunctionInfo{140, &ACC_SU::ListQualifiedUsers, "ListQualifiedUsers"},
- FunctionInfo{150, nullptr, "AuthenticateApplicationAsync"},
- FunctionInfo{151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"},
- FunctionInfo{152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"},
- FunctionInfo{190, nullptr, "GetUserLastOpenedApplication"},
- FunctionInfo{191, nullptr, "ActivateOpenContextHolder"},
- FunctionInfo{200, &ACC_SU::BeginUserRegistration, "BeginUserRegistration"},
- FunctionInfo{201, &ACC_SU::CompleteUserRegistration, "CompleteUserRegistration"},
- FunctionInfo{202, nullptr, "CancelUserRegistration"},
- FunctionInfo{203, &ACC_SU::DeleteUser, "DeleteUser"},
- FunctionInfo{204, &ACC_SU::SetUserPosition, "SetUserPosition"},
- FunctionInfo{205, &ACC_SU::GetProfileEditor, "GetProfileEditor"},
- FunctionInfo{206, nullptr, "CompleteUserRegistrationForcibly"},
- FunctionInfo{210, nullptr, "CreateFloatingRegistrationRequest"},
- FunctionInfo{211, nullptr, "CreateProcedureToRegisterUserWithNintendoAccount"},
- FunctionInfo{212, nullptr, "ResumeProcedureToRegisterUserWithNintendoAccount"},
- FunctionInfo{230, nullptr, "AuthenticateServiceAsync"},
- FunctionInfo{250, &ACC_SU::GetBaasAccountAdministrator, "GetBaasAccountAdministrator"},
- FunctionInfo{290, nullptr, "ProxyProcedureForGuestLoginWithNintendoAccount"},
- FunctionInfo{291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"},
- FunctionInfo{299, nullptr, "SuspendBackgroundDaemon"},
- FunctionInfo{400, nullptr, "SetPinCode", MakeVersionGate({18,0,0})},
- FunctionInfo{401, &ACC_SU::GetPinCodeLength, "GetPinCodeLength", MakeVersionGate({18,0,0})},
- FunctionInfo{402, nullptr, "GetPinCode", MakeVersionGate({18,0,0})},
- FunctionInfo{403, nullptr, "GetPinCodeParity"},
- FunctionInfo{404, nullptr, "VerifyPinCode"},
- FunctionInfo{405, nullptr, "IsPinCodeVerificationForbidden"},
- FunctionInfo{410, nullptr, "GetPinCodeErrorCount", MakeVersionGate({18,0,0})},
- FunctionInfo{411, nullptr, "ResetPinCodeErrorCount", MakeVersionGate({18,0,0})},
- FunctionInfo{412, nullptr, "IncrementPinCodeErrorCount", MakeVersionGate({18,0,0})},
- FunctionInfo{900, nullptr, "SetUserUnqualifiedForDebug"},
- FunctionInfo{901, nullptr, "UnsetUserUnqualifiedForDebug"},
- FunctionInfo{902, nullptr, "ListUsersUnqualifiedForDebug"},
- FunctionInfo{910, nullptr, "RefreshFirmwareSettingsForDebug"},
- FunctionInfo{997, nullptr, "DebugInvalidateTokenCacheForUser"},
- FunctionInfo{998, nullptr, "DebugSetUserStateClose"},
- FunctionInfo{999, nullptr, "DebugSetUserStateOpen"}
- );
};
class ACC_U0 final : public Module::Interface {
public:
ACC_U0(std::shared_ptr<Module> module_, std::shared_ptr<ProfileManager> profile_manager_, Core::System& system_)
- : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:u0") {}
+ : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:u0") {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &ACC_U0::GetUserCount, "GetUserCount"},
+ {1, &ACC_U0::GetUserExistence, "GetUserExistence"},
+ {2, &ACC_U0::ListAllUsers, "ListAllUsers"},
+ {3, &ACC_U0::ListOpenUsers, "ListOpenUsers"},
+ {4, &ACC_U0::GetLastOpenedUser, "GetLastOpenedUser"},
+ {5, &ACC_U0::GetProfile, "GetProfile"},
+ {6, nullptr, "GetProfileDigest"}, // 3.0.0+
+ {50, &ACC_U0::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"},
+ {51, &ACC_U0::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"},
+ {52, &ACC_U0::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"},
+ {60, &ACC_U0::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, // 5.0.0 - 5.1.0
+ {99, nullptr, "DebugActivateOpenContextRetention"}, // 6.0.0+
+ {100, &ACC_U0::InitializeApplicationInfo, "InitializeApplicationInfo"},
+ {101, &ACC_U0::GetBaasAccountManagerForApplication, "GetBaasAccountManagerForApplication"},
+ {102, nullptr, "AuthenticateApplicationAsync"},
+ {103, nullptr, "CheckNetworkServiceAvailabilityAsync"}, // 4.0.0+
+ {110, &ACC_U0::StoreSaveDataThumbnailApplication, "StoreSaveDataThumbnail"},
+ {111, nullptr, "ClearSaveDataThumbnail"},
+ {120, nullptr, "CreateGuestLoginRequest"},
+ {130, nullptr, "LoadOpenContext"}, // 5.0.0+
+ {131, &ACC_U0::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, // 6.0.0+
+ {140, &ACC_U0::InitializeApplicationInfoRestricted, "InitializeApplicationInfoRestricted"}, // 6.0.0+
+ {141, &ACC_U0::ListQualifiedUsers, "ListQualifiedUsers"}, // 6.0.0+
+ {150, &ACC_U0::IsUserAccountSwitchLocked, "IsUserAccountSwitchLocked"}, // 6.0.0+
+ {160, &ACC_U0::InitializeApplicationInfoV2, "InitializeApplicationInfoV2"},
+ };
+ // clang-format on
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
~ACC_U0() override = default;
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &ACC_U0::GetUserCount, "GetUserCount"},
- FunctionInfo{1, &ACC_U0::GetUserExistence, "GetUserExistence"},
- FunctionInfo{2, &ACC_U0::ListAllUsers, "ListAllUsers"},
- FunctionInfo{3, &ACC_U0::ListOpenUsers, "ListOpenUsers"},
- FunctionInfo{4, &ACC_U0::GetLastOpenedUser, "GetLastOpenedUser"},
- FunctionInfo{5, &ACC_U0::GetProfile, "GetProfile"},
- FunctionInfo{6, nullptr, "GetProfileDigest", MakeVersionGate({3,0,0})},
- FunctionInfo{50, &ACC_U0::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"},
- FunctionInfo{51, &ACC_U0::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"},
- FunctionInfo{52, &ACC_U0::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"},
- FunctionInfo{60, &ACC_U0::ListOpenContextStoredUsers, "ListOpenContextStoredUsers", MakeVersionGate({5,0,0}, {5,1,0})},
- FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention", MakeVersionGate({6,0,0})},
- FunctionInfo{100, &ACC_U0::InitializeApplicationInfo, "InitializeApplicationInfo"},
- FunctionInfo{101, &ACC_U0::GetBaasAccountManagerForApplication, "GetBaasAccountManagerForApplication"},
- FunctionInfo{102, nullptr, "AuthenticateApplicationAsync"},
- FunctionInfo{103, nullptr, "CheckNetworkServiceAvailabilityAsync", MakeVersionGate({4,0,0})},
- FunctionInfo{110, &ACC_U0::StoreSaveDataThumbnailApplication, "StoreSaveDataThumbnail"},
- FunctionInfo{111, nullptr, "ClearSaveDataThumbnail"},
- FunctionInfo{120, nullptr, "CreateGuestLoginRequest"},
- FunctionInfo{130, nullptr, "LoadOpenContext", MakeVersionGate({5,0,0})},
- FunctionInfo{131, &ACC_U0::ListOpenContextStoredUsers, "ListOpenContextStoredUsers", MakeVersionGate({6,0,0})},
- FunctionInfo{140, &ACC_U0::InitializeApplicationInfoRestricted, "InitializeApplicationInfoRestricted", MakeVersionGate({6,0,0})},
- FunctionInfo{141, &ACC_U0::ListQualifiedUsers, "ListQualifiedUsers", MakeVersionGate({6,0,0})},
- FunctionInfo{150, &ACC_U0::IsUserAccountSwitchLocked, "IsUserAccountSwitchLocked", MakeVersionGate({6,0,0})},
- FunctionInfo{160, &ACC_U0::InitializeApplicationInfoV2, "InitializeApplicationInfoV2"}
- );
};
class ACC_U1 final : public Module::Interface {
public:
ACC_U1(std::shared_ptr<Module> module_, std::shared_ptr<ProfileManager> profile_manager_, Core::System& system_)
- : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:u1") {}
+ : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:u1") {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &ACC_U1::GetUserCount, "GetUserCount"},
+ {1, &ACC_U1::GetUserExistence, "GetUserExistence"},
+ {2, &ACC_U1::ListAllUsers, "ListAllUsers"},
+ {3, &ACC_U1::ListOpenUsers, "ListOpenUsers"},
+ {4, &ACC_U1::GetLastOpenedUser, "GetLastOpenedUser"},
+ {5, &ACC_U1::GetProfile, "GetProfile"},
+ {6, nullptr, "GetProfileDigest"},
+ {50, &ACC_U1::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"},
+ {51, &ACC_U1::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"},
+ {52, &ACC_U1::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"},
+ {60, &ACC_U1::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"},
+ {99, nullptr, "DebugActivateOpenContextRetention"},
+ {100, nullptr, "GetUserRegistrationNotifier"},
+ {101, nullptr, "GetUserStateChangeNotifier"},
+ {102, &ACC_U1::GetBaasAccountManagerForSystemService, "GetBaasAccountManagerForSystemService"},
+ {103, nullptr, "GetBaasUserAvailabilityChangeNotifier"},
+ {104, nullptr, "GetProfileUpdateNotifier"},
+ {105, nullptr, "CheckNetworkServiceAvailabilityAsync"},
+ {106, nullptr, "GetProfileSyncNotifier"},
+ {110, &ACC_U1::StoreSaveDataThumbnailApplication, "StoreSaveDataThumbnail"},
+ {111, nullptr, "ClearSaveDataThumbnail"},
+ {112, nullptr, "LoadSaveDataThumbnail"},
+ {113, nullptr, "GetSaveDataThumbnailExistence"},
+ {120, nullptr, "ListOpenUsersInApplication"},
+ {130, nullptr, "ActivateOpenContextRetention"},
+ {140, &ACC_U1::ListQualifiedUsers, "ListQualifiedUsers"},
+ {150, nullptr, "AuthenticateApplicationAsync"},
+ {151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"},
+ {152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"},
+ {190, nullptr, "GetUserLastOpenedApplication"},
+ {191, nullptr, "ActivateOpenContextHolder"},
+ {401, &ACC_U1::GetPinCodeLength, "GetPinCodeLength"}, // 18.0.0+
+ {402, nullptr, "GetPinCode"}, // 18.0.0+
+ {997, nullptr, "DebugInvalidateTokenCacheForUser"},
+ {998, nullptr, "DebugSetUserStateClose"},
+ {999, nullptr, "DebugSetUserStateOpen"},
+ };
+ // clang-format on
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
~ACC_U1() override = default;
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &ACC_U1::GetUserCount, "GetUserCount"},
- FunctionInfo{1, &ACC_U1::GetUserExistence, "GetUserExistence"},
- FunctionInfo{2, &ACC_U1::ListAllUsers, "ListAllUsers"},
- FunctionInfo{3, &ACC_U1::ListOpenUsers, "ListOpenUsers"},
- FunctionInfo{4, &ACC_U1::GetLastOpenedUser, "GetLastOpenedUser"},
- FunctionInfo{5, &ACC_U1::GetProfile, "GetProfile"},
- FunctionInfo{6, nullptr, "GetProfileDigest"},
- FunctionInfo{50, &ACC_U1::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"},
- FunctionInfo{51, &ACC_U1::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"},
- FunctionInfo{52, &ACC_U1::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"},
- FunctionInfo{60, &ACC_U1::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"},
- FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention"},
- FunctionInfo{100, nullptr, "GetUserRegistrationNotifier"},
- FunctionInfo{101, nullptr, "GetUserStateChangeNotifier"},
- FunctionInfo{102, &ACC_U1::GetBaasAccountManagerForSystemService, "GetBaasAccountManagerForSystemService"},
- FunctionInfo{103, nullptr, "GetBaasUserAvailabilityChangeNotifier"},
- FunctionInfo{104, nullptr, "GetProfileUpdateNotifier"},
- FunctionInfo{105, nullptr, "CheckNetworkServiceAvailabilityAsync"},
- FunctionInfo{106, nullptr, "GetProfileSyncNotifier"},
- FunctionInfo{110, &ACC_U1::StoreSaveDataThumbnailApplication, "StoreSaveDataThumbnail"},
- FunctionInfo{111, nullptr, "ClearSaveDataThumbnail"},
- FunctionInfo{112, nullptr, "LoadSaveDataThumbnail"},
- FunctionInfo{113, nullptr, "GetSaveDataThumbnailExistence"},
- FunctionInfo{120, nullptr, "ListOpenUsersInApplication"},
- FunctionInfo{130, nullptr, "ActivateOpenContextRetention"},
- FunctionInfo{140, &ACC_U1::ListQualifiedUsers, "ListQualifiedUsers"},
- FunctionInfo{150, nullptr, "AuthenticateApplicationAsync"},
- FunctionInfo{151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"},
- FunctionInfo{152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"},
- FunctionInfo{190, nullptr, "GetUserLastOpenedApplication"},
- FunctionInfo{191, nullptr, "ActivateOpenContextHolder"},
- FunctionInfo{401, &ACC_U1::GetPinCodeLength, "GetPinCodeLength", MakeVersionGate({18,0,0})},
- FunctionInfo{402, nullptr, "GetPinCode", MakeVersionGate({18,0,0})},
- FunctionInfo{997, nullptr, "DebugInvalidateTokenCacheForUser"},
- FunctionInfo{998, nullptr, "DebugSetUserStateClose"},
- FunctionInfo{999, nullptr, "DebugSetUserStateOpen"}
- );
};
class DAUTH_0 final : public ServiceFramework<DAUTH_0> {
public:
- explicit DAUTH_0(Core::System& system_) : ServiceFramework{system_, "dauth:0"} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "EnsureAuthenticationTokenCacheAsync"},
- FunctionInfo{1, nullptr, "LoadAuthenticationTokenCache"},
- FunctionInfo{2, nullptr, "InvalidateAuthenticationTokenCache"},
- FunctionInfo{3, nullptr, "IsDeviceAuthenticationTokenCacheAvailable"},
- FunctionInfo{10, nullptr, "EnsureEdgeTokenCacheAsync"},
- FunctionInfo{11, nullptr, "LoadEdgeTokenCache"},
- FunctionInfo{12, nullptr, "InvalidateEdgeTokenCache"},
- FunctionInfo{13, nullptr, "IsEdgeTokenCacheAvailable"},
- FunctionInfo{20, nullptr, "EnsureApplicationAuthenticationCacheAsync"},
- FunctionInfo{21, nullptr, "LoadApplicationAuthenticationTokenCache"},
- FunctionInfo{22, nullptr, "LoadApplicationNetworkServiceClientConfigCache"},
- FunctionInfo{23, nullptr, "IsApplicationAuthenticationCacheAvailable"},
- FunctionInfo{24, nullptr, "InvalidateApplicationAuthenticationCache"},
- FunctionInfo{30, nullptr, "EnsureGameCardAuthenticationCacheAsync"},
- FunctionInfo{31, nullptr, "LoadGameCardAuthenticationTokenCache"},
- FunctionInfo{32, nullptr, "IsGameCardAuthenticationCacheAvailable"},
- FunctionInfo{33, nullptr, "InvalidateGameCardAuthenticationCache"},
- FunctionInfo{1000, nullptr, "GetInactiveElicenseUsedEvent"},
- FunctionInfo{9000, nullptr, "ImportVirtualClientCertificate"},
- FunctionInfo{9010, nullptr, "DeleteVirtualClientCertificate"}
- );
+ explicit DAUTH_0(Core::System& system_) : ServiceFramework{system_, "dauth:0"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "EnsureAuthenticationTokenCacheAsync"},
+ {1, nullptr, "LoadAuthenticationTokenCache"},
+ {2, nullptr, "InvalidateAuthenticationTokenCache"},
+ {3, nullptr, "IsDeviceAuthenticationTokenCacheAvailable"},
+ {10, nullptr, "EnsureEdgeTokenCacheAsync"},
+ {11, nullptr, "LoadEdgeTokenCache"},
+ {12, nullptr, "InvalidateEdgeTokenCache"},
+ {13, nullptr, "IsEdgeTokenCacheAvailable"},
+ {20, nullptr, "EnsureApplicationAuthenticationCacheAsync"},
+ {21, nullptr, "LoadApplicationAuthenticationTokenCache"},
+ {22, nullptr, "LoadApplicationNetworkServiceClientConfigCache"},
+ {23, nullptr, "IsApplicationAuthenticationCacheAvailable"},
+ {24, nullptr, "InvalidateApplicationAuthenticationCache"},
+ {30, nullptr, "EnsureGameCardAuthenticationCacheAsync"},
+ {31, nullptr, "LoadGameCardAuthenticationTokenCache"},
+ {32, nullptr, "IsGameCardAuthenticationCacheAvailable"},
+ {33, nullptr, "InvalidateGameCardAuthenticationCache"},
+ {1000, nullptr, "GetInactiveElicenseUsedEvent"},
+ {9000, nullptr, "ImportVirtualClientCertificate"},
+ {9010, nullptr, "DeleteVirtualClientCertificate"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
+ }
};
class ACC_E final : public Module::Interface {
public:
explicit ACC_E(std::shared_ptr<Module> module_, std::shared_ptr<ProfileManager> profile_manager_, Core::System& system_)
- : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:e") {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetUserCount"},
- FunctionInfo{1, nullptr, "GetUserExistence"},
- FunctionInfo{2, nullptr, "ListAllUsers"},
- FunctionInfo{3, nullptr, "ListOpenUsers"},
- FunctionInfo{4, nullptr, "GetLastOpenedUser"},
- FunctionInfo{5, nullptr, "GetProfile"},
- FunctionInfo{6, nullptr, "GetProfileDigest"},
- FunctionInfo{50, nullptr, "IsUserRegistrationRequestPermitted"},
- FunctionInfo{51, nullptr, "TrySelectUserWithoutInteractionDeprecated"},
- FunctionInfo{52, nullptr, "TrySelectUserWithoutInteraction"},
- FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention"},
- FunctionInfo{100, nullptr, "GetUserRegistrationNotifier"},
- FunctionInfo{101, nullptr, "GetUserStateChangeNotifier"},
- FunctionInfo{102, nullptr, "GetBaasAccountManagerForSystemService"},
- FunctionInfo{103, nullptr, "GetBaasUserAvailabilityChangeNotifier"},
- FunctionInfo{104, nullptr, "GetProfileUpdateNotifier"},
- FunctionInfo{105, nullptr, "CheckNetworkServiceAvailabilityAsync"},
- FunctionInfo{106, nullptr, "GetProfileSyncNotifier"},
- FunctionInfo{110, nullptr, "StoreSaveDataThumbnail"},
- FunctionInfo{111, nullptr, "ClearSaveDataThumbnail"},
- FunctionInfo{112, nullptr, "LoadSaveDataThumbnail"},
- FunctionInfo{113, nullptr, "GetSaveDataThumbnailExistence"},
- FunctionInfo{120, nullptr, "ListOpenUsersInApplication"},
- FunctionInfo{130, nullptr, "ActivateOpenContextRetention"},
- FunctionInfo{140, nullptr, "ListQualifiedUsers"},
- FunctionInfo{151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"},
- FunctionInfo{152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"},
- FunctionInfo{170, nullptr, "GetNasOp2MembershipStateChangeNotifier"},
- FunctionInfo{191, nullptr, "UpdateNotificationReceiverInfo"},
- FunctionInfo{200, nullptr, "BeginUserRegistration"},
- FunctionInfo{201, nullptr, "CompleteUserRegistration"},
- FunctionInfo{202, nullptr, "CancelUserRegistration"},
- FunctionInfo{203, nullptr, "DeleteUser"},
- FunctionInfo{204, nullptr, "SetUserPosition"},
- FunctionInfo{205, nullptr, "GetProfileEditor"},
- FunctionInfo{206, nullptr, "CompleteUserRegistrationForcibly"},
- FunctionInfo{210, nullptr, "CreateFloatingRegistrationRequest"},
- FunctionInfo{211, nullptr, "CreateProcedureToRegisterUserWithNintendoAccount"},
- FunctionInfo{212, nullptr, "ResumeProcedureToRegisterUserWithNintendoAccount"},
- FunctionInfo{213, nullptr, "CreateProcedureToCreateUserWithNintendoAccount"},
- FunctionInfo{214, nullptr, "ResumeProcedureToCreateUserWithNintendoAccount"},
- FunctionInfo{215, nullptr, "ResumeProcedureToCreateUserWithNintendoAccountAfterApplyResponse"},
- FunctionInfo{230, nullptr, "AuthenticateServiceAsync"},
- FunctionInfo{250, nullptr, "GetBaasAccountAdministrator"},
- FunctionInfo{251, nullptr, "SynchronizeNetworkServiceAccountsSnapshotAsync"},
- FunctionInfo{290, nullptr, "ProxyProcedureForGuestLoginWithNintendoAccount"},
- FunctionInfo{291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"},
- FunctionInfo{292, nullptr, "ProxyProcedureForDeviceMigrationAuthenticatingOperatingUser"},
- FunctionInfo{293, nullptr, "ProxyProcedureForDeviceMigrationDownload"},
- FunctionInfo{299, nullptr, "SuspendBackgroundDaemon"},
- FunctionInfo{350, nullptr, "CreateDeviceMigrationUserExportRequest"},
- FunctionInfo{351, nullptr, "UploadNasCredential"},
- FunctionInfo{352, nullptr, "CreateDeviceMigrationUserImportRequest"},
- FunctionInfo{353, nullptr, "DeleteUserMigrationSaveData"},
- FunctionInfo{400, nullptr, "SetPinCode"},
- FunctionInfo{401, nullptr, "GetPinCodeLength"},
- FunctionInfo{402, nullptr, "GetPinCode"},
- FunctionInfo{403, nullptr, "GetPinCodeParity"},
- FunctionInfo{404, nullptr, "VerifyPinCode"},
- FunctionInfo{405, nullptr, "IsPinCodeVerificationForbidden"},
- FunctionInfo{410, nullptr, "GetPinCodeErrorCount"},
- FunctionInfo{411, nullptr, "ResetPinCodeErrorCount"},
- FunctionInfo{412, nullptr, "IncrementPinCodeErrorCount"},
- FunctionInfo{413, nullptr, "SetPinCodeErrorCount"},
- FunctionInfo{420, nullptr, "SetStartPenaltyTime"},
- FunctionInfo{421, nullptr, "GetStartPenaltyTime"},
- FunctionInfo{900, nullptr, "SetUserUnqualifiedForDebug"},
- FunctionInfo{901, nullptr, "UnsetUserUnqualifiedForDebug"},
- FunctionInfo{902, nullptr, "ListUsersUnqualifiedForDebug"},
- FunctionInfo{910, nullptr, "RefreshFirmwareSettingsForDebug"},
- FunctionInfo{997, nullptr, "DebugInvalidateTokenCacheForUser"},
- FunctionInfo{998, nullptr, "DebugSetUserStateClose"},
- FunctionInfo{999, nullptr, "DebugSetUserStateOpen"},
- FunctionInfo{1000, nullptr, "CreateIAccountEntityServiceForApplication"},
- FunctionInfo{1100, nullptr, "CreateIUserStateManager"},
- FunctionInfo{10050, nullptr, "IsUserRegistrationRequestPermittedForAccountPolicy"},
- FunctionInfo{10105, nullptr, "CheckNetworkServiceAvailabilityAsyncForAccountPolicy"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:e") {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ { 0, nullptr, "GetUserCount"},
+ { 1, nullptr, "GetUserExistence"},
+ { 2, nullptr, "ListAllUsers"},
+ { 3, nullptr, "ListOpenUsers"},
+ { 4, nullptr, "GetLastOpenedUser"},
+ { 5, nullptr, "GetProfile"},
+ { 6, nullptr, "GetProfileDigest"},
+ { 50, nullptr, "IsUserRegistrationRequestPermitted"},
+ { 51, nullptr, "TrySelectUserWithoutInteractionDeprecated"},
+ { 52, nullptr, "TrySelectUserWithoutInteraction"},
+ { 99, nullptr, "DebugActivateOpenContextRetention"},
+ { 100, nullptr, "GetUserRegistrationNotifier"},
+ { 101, nullptr, "GetUserStateChangeNotifier"},
+ { 102, nullptr, "GetBaasAccountManagerForSystemService"},
+ { 103, nullptr, "GetBaasUserAvailabilityChangeNotifier"},
+ { 104, nullptr, "GetProfileUpdateNotifier"},
+ { 105, nullptr, "CheckNetworkServiceAvailabilityAsync"},
+ { 106, nullptr, "GetProfileSyncNotifier"},
+ { 110, nullptr, "StoreSaveDataThumbnail"},
+ { 111, nullptr, "ClearSaveDataThumbnail"},
+ { 112, nullptr, "LoadSaveDataThumbnail"},
+ { 113, nullptr, "GetSaveDataThumbnailExistence"},
+ { 120, nullptr, "ListOpenUsersInApplication"},
+ { 130, nullptr, "ActivateOpenContextRetention"},
+ { 140, nullptr, "ListQualifiedUsers"},
+ { 151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"},
+ { 152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"},
+ { 170, nullptr, "GetNasOp2MembershipStateChangeNotifier"},
+ { 191, nullptr, "UpdateNotificationReceiverInfo"},
+ { 200, nullptr, "BeginUserRegistration"},
+ { 201, nullptr, "CompleteUserRegistration"},
+ { 202, nullptr, "CancelUserRegistration"},
+ { 203, nullptr, "DeleteUser"},
+ { 204, nullptr, "SetUserPosition"},
+ { 205, nullptr, "GetProfileEditor"},
+ { 206, nullptr, "CompleteUserRegistrationForcibly"},
+ { 210, nullptr, "CreateFloatingRegistrationRequest"},
+ { 211, nullptr, "CreateProcedureToRegisterUserWithNintendoAccount"},
+ { 212, nullptr, "ResumeProcedureToRegisterUserWithNintendoAccount"},
+ { 213, nullptr, "CreateProcedureToCreateUserWithNintendoAccount"},
+ { 214, nullptr, "ResumeProcedureToCreateUserWithNintendoAccount"},
+ { 215, nullptr, "ResumeProcedureToCreateUserWithNintendoAccountAfterApplyResponse"},
+ { 230, nullptr, "AuthenticateServiceAsync"},
+ { 250, nullptr, "GetBaasAccountAdministrator"},
+ { 251, nullptr, "SynchronizeNetworkServiceAccountsSnapshotAsync"},
+ { 290, nullptr, "ProxyProcedureForGuestLoginWithNintendoAccount"},
+ { 291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"},
+ { 292, nullptr, "ProxyProcedureForDeviceMigrationAuthenticatingOperatingUser"},
+ { 293, nullptr, "ProxyProcedureForDeviceMigrationDownload"},
+ { 299, nullptr, "SuspendBackgroundDaemon"},
+ { 350, nullptr, "CreateDeviceMigrationUserExportRequest"},
+ { 351, nullptr, "UploadNasCredential"},
+ { 352, nullptr, "CreateDeviceMigrationUserImportRequest"},
+ { 353, nullptr, "DeleteUserMigrationSaveData"},
+ { 400, nullptr, "SetPinCode"},
+ { 401, nullptr, "GetPinCodeLength"},
+ { 402, nullptr, "GetPinCode"},
+ { 403, nullptr, "GetPinCodeParity"},
+ { 404, nullptr, "VerifyPinCode"},
+ { 405, nullptr, "IsPinCodeVerificationForbidden"},
+ { 410, nullptr, "GetPinCodeErrorCount"},
+ { 411, nullptr, "ResetPinCodeErrorCount"},
+ { 412, nullptr, "IncrementPinCodeErrorCount"},
+ { 413, nullptr, "SetPinCodeErrorCount"},
+ { 420, nullptr, "SetStartPenaltyTime"},
+ { 421, nullptr, "GetStartPenaltyTime"},
+ { 900, nullptr, "SetUserUnqualifiedForDebug"},
+ { 901, nullptr, "UnsetUserUnqualifiedForDebug"},
+ { 902, nullptr, "ListUsersUnqualifiedForDebug"},
+ { 910, nullptr, "RefreshFirmwareSettingsForDebug"},
+ { 997, nullptr, "DebugInvalidateTokenCacheForUser"},
+ { 998, nullptr, "DebugSetUserStateClose"},
+ { 999, nullptr, "DebugSetUserStateOpen"},
+ { 1000, nullptr, "CreateIAccountEntityServiceForApplication"},
+ { 1100, nullptr, "CreateIUserStateManager"},
+ { 10050, nullptr, "IsUserRegistrationRequestPermittedForAccountPolicy"},
+ { 10105, nullptr, "CheckNetworkServiceAvailabilityAsyncForAccountPolicy"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class ACC_E_U1 final : public Module::Interface {
public:
explicit ACC_E_U1(std::shared_ptr<Module> module_, std::shared_ptr<ProfileManager> profile_manager_, Core::System& system_)
- : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:e:u1") {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetUserCount"},
- FunctionInfo{1, nullptr, "GetUserExistence"},
- FunctionInfo{2, nullptr, "ListAllUsers"},
- FunctionInfo{3, nullptr, "ListOpenUsers"},
- FunctionInfo{4, nullptr, "GetLastOpenedUser"},
- FunctionInfo{5, nullptr, "GetProfile"},
- FunctionInfo{6, nullptr, "GetProfileDigest"},
- FunctionInfo{50, nullptr, "IsUserRegistrationRequestPermitted"},
- FunctionInfo{51, nullptr, "TrySelectUserWithoutInteractionDeprecated"},
- FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention"},
- FunctionInfo{100, nullptr, "GetUserRegistrationNotifier"},
- FunctionInfo{101, nullptr, "GetUserStateChangeNotifier"},
- FunctionInfo{102, nullptr, "GetBaasAccountManagerForSystemService"},
- FunctionInfo{103, nullptr, "GetBaasUserAvailabilityChangeNotifier"},
- FunctionInfo{104, nullptr, "GetProfileUpdateNotifier"},
- FunctionInfo{105, nullptr, "CheckNetworkServiceAvailabilityAsync"},
- FunctionInfo{106, nullptr, "GetProfileSyncNotifier"},
- FunctionInfo{110, nullptr, "StoreSaveDataThumbnail"},
- FunctionInfo{111, nullptr, "ClearSaveDataThumbnail"},
- FunctionInfo{112, nullptr, "LoadSaveDataThumbnail"},
- FunctionInfo{113, nullptr, "GetSaveDataThumbnailExistence"},
- FunctionInfo{120, nullptr, "ListOpenUsersInApplication"},
- FunctionInfo{130, nullptr, "ActivateOpenContextRetention"},
- FunctionInfo{140, nullptr, "ListQualifiedUsers"},
- FunctionInfo{151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"},
- FunctionInfo{152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"},
- FunctionInfo{170, nullptr, "GetNasOp2MembershipStateChangeNotifier"},
- FunctionInfo{191, nullptr, "UpdateNotificationReceiverInfo"},
- FunctionInfo{997, nullptr, "DebugInvalidateTokenCacheForUser"},
- FunctionInfo{998, nullptr, "DebugSetUserStateClose"},
- FunctionInfo{999, nullptr, "DebugSetUserStateOpen"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:e:u1") {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetUserCount"},
+ {1, nullptr, "GetUserExistence"},
+ {2, nullptr, "ListAllUsers"},
+ {3, nullptr, "ListOpenUsers"},
+ {4, nullptr, "GetLastOpenedUser"},
+ {5, nullptr, "GetProfile"},
+ {6, nullptr, "GetProfileDigest"},
+ {50, nullptr, "IsUserRegistrationRequestPermitted"},
+ {51, nullptr, "TrySelectUserWithoutInteractionDeprecated"},
+ {99, nullptr, "DebugActivateOpenContextRetention"},
+ {100, nullptr, "GetUserRegistrationNotifier"},
+ {101, nullptr, "GetUserStateChangeNotifier"},
+ {102, nullptr, "GetBaasAccountManagerForSystemService"},
+ {103, nullptr, "GetBaasUserAvailabilityChangeNotifier"},
+ {104, nullptr, "GetProfileUpdateNotifier"},
+ {105, nullptr, "CheckNetworkServiceAvailabilityAsync"},
+ {106, nullptr, "GetProfileSyncNotifier"},
+ {110, nullptr, "StoreSaveDataThumbnail"},
+ {111, nullptr, "ClearSaveDataThumbnail"},
+ {112, nullptr, "LoadSaveDataThumbnail"},
+ {113, nullptr, "GetSaveDataThumbnailExistence"},
+ {120, nullptr, "ListOpenUsersInApplication"},
+ {130, nullptr, "ActivateOpenContextRetention"},
+ {140, nullptr, "ListQualifiedUsers"},
+ {151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"},
+ {152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"},
+ {170, nullptr, "GetNasOp2MembershipStateChangeNotifier"},
+ {191, nullptr, "UpdateNotificationReceiverInfo"},
+ {997, nullptr, "DebugInvalidateTokenCacheForUser"},
+ {998, nullptr, "DebugSetUserStateClose"},
+ {999, nullptr, "DebugSetUserStateOpen"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class ACC_E_U2 final : public Module::Interface {
public:
explicit ACC_E_U2(std::shared_ptr<Module> module_, std::shared_ptr<ProfileManager> profile_manager_, Core::System& system_)
- : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:e:u2") {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetUserCount"},
- FunctionInfo{1, nullptr, "GetUserExistence"},
- FunctionInfo{2, nullptr, "ListAllUsers"},
- FunctionInfo{3, nullptr, "ListOpenUsers"},
- FunctionInfo{4, nullptr, "GetLastOpenedUser"},
- FunctionInfo{5, nullptr, "GetProfile"},
- FunctionInfo{6, nullptr, "GetProfileDigest"},
- FunctionInfo{50, nullptr, "IsUserRegistrationRequestPermitted"},
- FunctionInfo{51, nullptr, "TrySelectUserWithoutInteractionDeprecated"},
- FunctionInfo{52, nullptr, "TrySelectUserWithoutInteraction"},
- FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention"},
- FunctionInfo{100, nullptr, "GetUserRegistrationNotifier"},
- FunctionInfo{101, nullptr, "GetUserStateChangeNotifier"},
- FunctionInfo{102, nullptr, "GetBaasAccountManagerForSystemService"},
- FunctionInfo{103, nullptr, "GetBaasUserAvailabilityChangeNotifier"},
- FunctionInfo{104, nullptr, "GetProfileUpdateNotifier"},
- FunctionInfo{105, nullptr, "CheckNetworkServiceAvailabilityAsync"},
- FunctionInfo{106, nullptr, "GetProfileSyncNotifier"},
- FunctionInfo{110, nullptr, "StoreSaveDataThumbnail"},
- FunctionInfo{111, nullptr, "ClearSaveDataThumbnail"},
- FunctionInfo{112, nullptr, "LoadSaveDataThumbnail"},
- FunctionInfo{113, nullptr, "GetSaveDataThumbnailExistence"},
- FunctionInfo{120, nullptr, "ListOpenUsersInApplication"},
- FunctionInfo{130, nullptr, "ActivateOpenContextRetention"},
- FunctionInfo{140, nullptr, "ListQualifiedUsers"},
- FunctionInfo{151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"},
- FunctionInfo{152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"},
- FunctionInfo{170, nullptr, "GetNasOp2MembershipStateChangeNotifier"},
- FunctionInfo{191, nullptr, "UpdateNotificationReceiverInfo"},
- FunctionInfo{205, nullptr, "GetProfileEditor"},
- FunctionInfo{401, nullptr, "GetPinCodeLength"},
- FunctionInfo{402, nullptr, "GetPinCode"},
- FunctionInfo{403, nullptr, "GetPinCodeParity"},
- FunctionInfo{404, nullptr, "VerifyPinCode"},
- FunctionInfo{405, nullptr, "IsPinCodeVerificationForbidden"},
- FunctionInfo{997, nullptr, "DebugInvalidateTokenCacheForUser"},
- FunctionInfo{998, nullptr, "DebugSetUserStateClose"},
- FunctionInfo{999, nullptr, "DebugSetUserStateOpen"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:e:u2") {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetUserCount"},
+ {1, nullptr, "GetUserExistence"},
+ {2, nullptr, "ListAllUsers"},
+ {3, nullptr, "ListOpenUsers"},
+ {4, nullptr, "GetLastOpenedUser"},
+ {5, nullptr, "GetProfile"},
+ {6, nullptr, "GetProfileDigest"},
+ {50, nullptr, "#IsUserRegistrationRequestPermitted"},
+ {51, nullptr, "TrySelectUserWithoutInteractionDeprecated"},
+ {52, nullptr, "TrySelectUserWithoutInteraction"},
+ {99, nullptr, "DebugActivateOpenContextRetention"},
+ {100, nullptr, "GetUserRegistrationNotifier"},
+ {101, nullptr, "GetUserStateChangeNotifier"},
+ {102, nullptr, "GetBaasAccountManagerForSystemService"},
+ {103, nullptr, "GetBaasUserAvailabilityChangeNotifier"},
+ {104, nullptr, "GetProfileUpdateNotifier"},
+ {105, nullptr, "CheckNetworkServiceAvailabilityAsync"},
+ {106, nullptr, "GetProfileSyncNotifier"},
+ {110, nullptr, "StoreSaveDataThumbnail"},
+ {111, nullptr, "ClearSaveDataThumbnail"},
+ {112, nullptr, "LoadSaveDataThumbnail"},
+ {113, nullptr, "GetSaveDataThumbnailExistence"},
+ {120, nullptr, "ListOpenUsersInApplication"},
+ {130, nullptr, "ActivateOpenContextRetention"},
+ {140, nullptr, "ListQualifiedUsers"},
+ {151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"},
+ {152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"},
+ {170, nullptr, "GetNasOp2MembershipStateChangeNotifier"},
+ {191, nullptr, "UpdateNotificationReceiverInfo"},
+ {205, nullptr, "GetProfileEditor"},
+ {401, nullptr, "GetPinCodeLength"},
+ {402, nullptr, "GetPinCode"},
+ {403, nullptr, "GetPinCodeParity"},
+ {404, nullptr, "VerifyPinCode"},
+ {405, nullptr, "IsPinCodeVerificationForbidden"},
+ {997, nullptr, "DebugInvalidateTokenCacheForUser"},
+ {998, nullptr, "DebugSetUserStateClose"},
+ {999, nullptr, "DebugSetUserStateOpen"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
diff --git a/src/core/hle/service/acc/acc.h b/src/core/hle/service/acc/acc.h
index 9c2c96acdb..19af7c74c9 100644
--- a/src/core/hle/service/acc/acc.h
+++ b/src/core/hle/service/acc/acc.h
@@ -14,6 +14,70 @@ namespace Service::Account {
class ProfileManager;
+class Module final {
+public:
+ class Interface : public ServiceFramework<Interface> {
+ public:
+ explicit Interface(std::shared_ptr<Module> module_,
+ std::shared_ptr<ProfileManager> profile_manager_, Core::System& system_,
+ const char* name);
+ ~Interface() override;
+
+ void GetUserCount(HLERequestContext& ctx);
+ void GetUserExistence(HLERequestContext& ctx);
+ void ListAllUsers(HLERequestContext& ctx);
+ void ListOpenUsers(HLERequestContext& ctx);
+ void GetLastOpenedUser(HLERequestContext& ctx);
+ void GetProfile(HLERequestContext& ctx);
+ void InitializeApplicationInfo(HLERequestContext& ctx);
+ void InitializeApplicationInfoRestricted(HLERequestContext& ctx);
+ void GetBaasAccountManagerForApplication(HLERequestContext& ctx);
+ void IsUserRegistrationRequestPermitted(HLERequestContext& ctx);
+ void TrySelectUserWithoutInteractionDeprecated(HLERequestContext& ctx);
+ void TrySelectUserWithoutInteraction(HLERequestContext& ctx);
+ void IsUserAccountSwitchLocked(HLERequestContext& ctx);
+ void InitializeApplicationInfoV2(HLERequestContext& ctx);
+ void BeginUserRegistration(HLERequestContext& ctx);
+ void CompleteUserRegistration(HLERequestContext& ctx);
+ void DeleteUser(HLERequestContext& ctx);
+ void SetUserPosition(HLERequestContext& ctx);
+ void GetProfileEditor(HLERequestContext& ctx);
+ void GetBaasAccountAdministrator(HLERequestContext &ctx);
+ void ListQualifiedUsers(HLERequestContext& ctx);
+ void ListOpenContextStoredUsers(HLERequestContext& ctx);
+ void StoreSaveDataThumbnailApplication(HLERequestContext& ctx);
+ void GetBaasAccountManagerForSystemService(HLERequestContext& ctx);
+ void StoreSaveDataThumbnailSystem(HLERequestContext& ctx);
+ void GetPinCodeLength(HLERequestContext& ctx);
+
+ private:
+ Result InitializeApplicationInfoBase();
+ void StoreSaveDataThumbnail(HLERequestContext& ctx, const Common::UUID& uuid,
+ const u64 tid);
+
+ enum class ApplicationType : u32_le {
+ GameCard = 0,
+ Digital = 1,
+ Unknown = 3,
+ };
+
+ struct ApplicationInfo {
+ Service::Glue::ApplicationLaunchProperty launch_property;
+ ApplicationType application_type;
+
+ constexpr explicit operator bool() const {
+ return launch_property.title_id != 0x0;
+ }
+ };
+
+ ApplicationInfo application_info{};
+
+ protected:
+ std::shared_ptr<Module> module;
+ std::shared_ptr<ProfileManager> profile_manager;
+ };
+};
+
void LoopProcess(Core::System& system);
} // namespace Service::Account
diff --git a/src/core/hle/service/acc/async_context.cpp b/src/core/hle/service/acc/async_context.cpp
index a7f751d756..8dec886ad7 100644
--- a/src/core/hle/service/acc/async_context.cpp
+++ b/src/core/hle/service/acc/async_context.cpp
@@ -12,6 +12,17 @@
namespace Service::Account {
IAsyncContext::IAsyncContext(Core::System& system_)
: ServiceFramework{system_, "IAsyncContext"}, service_context{system_, "IAsyncContext"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &IAsyncContext::GetSystemEvent, "GetSystemEvent"},
+ {1, &IAsyncContext::Cancel, "Cancel"},
+ {2, &IAsyncContext::HasDone, "HasDone"},
+ {3, &IAsyncContext::GetResult, "GetResult"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+
completion_event = service_context.CreateEvent("IAsyncContext:CompletionEvent");
}
diff --git a/src/core/hle/service/acc/async_context.h b/src/core/hle/service/acc/async_context.h
index 0137567d11..c50537d4ae 100644
--- a/src/core/hle/service/acc/async_context.h
+++ b/src/core/hle/service/acc/async_context.h
@@ -33,16 +33,6 @@ protected:
void MarkComplete();
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &IAsyncContext::GetSystemEvent, "GetSystemEvent"},
- FunctionInfo{1, &IAsyncContext::Cancel, "Cancel"},
- FunctionInfo{2, &IAsyncContext::HasDone, "HasDone"},
- FunctionInfo{3, &IAsyncContext::GetResult, "GetResult"}
- );
-
KernelHelpers::ServiceContext service_context;
std::atomic<bool> is_complete{false};
diff --git a/src/core/hle/service/acc/errors.h b/src/core/hle/service/acc/errors.h
index 433ebfe9d6..b7cf8b5f93 100644
--- a/src/core/hle/service/acc/errors.h
+++ b/src/core/hle/service/acc/errors.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp
index 472be8f0f0..86d9d52e34 100644
--- a/src/core/hle/service/am/am.cpp
+++ b/src/core/hle/service/am/am.cpp
@@ -4,1340 +4,16 @@
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
-#include "common/settings.h"
-#include "core/core.h"
-#include "core/file_sys/common_funcs.h"
-#include "core/file_sys/patch_manager.h"
-#include "core/file_sys/romfs_factory.h"
-#include "core/file_sys/control_metadata.h"
-#include "core/hle/api_version.h"
-#include "core/hle/kernel/k_transfer_memory.h"
-#include "core/hle/service/server_manager.h"
-#include "core/hle/service/am/applet_manager.h"
-#include "core/hle/service/am/window_system.h"
#include "core/hle/service/am/am.h"
#include "core/hle/service/am/button_poller.h"
#include "core/hle/service/am/event_observer.h"
-#include "core/hle/service/am/service/application_creator.h"
-#include "core/hle/service/am/service/audio_controller.h"
-#include "core/hle/service/am/service/common_state_getter.h"
-#include "core/hle/service/am/service/display_controller.h"
-#include "core/hle/service/am/service/global_state_controller.h"
-#include "core/hle/service/am/service/home_menu_functions.h"
-#include "core/hle/service/am/service/process_winding_controller.h"
-#include "core/hle/service/am/service/self_controller.h"
-#include "core/hle/service/am/service/window_controller.h"
-#include "core/hle/service/am/service/application_functions.h"
-#include "core/hle/service/am/applet_data_broker.h"
-#include "core/hle/service/am/frontend/applets.h"
-#include "core/hle/service/am/library_applet_storage.h"
-#include "core/hle/service/am/process_creation.h"
-#include "core/hle/service/am/service/library_applet_accessor.h"
-#include "core/hle/service/am/service/overlay_functions.h"
-#include "core/hle/service/am/service/storage.h"
-#include "core/hle/service/ns/language.h"
-#include "core/hle/service/ns/application_manager_interface.h"
-#include "core/hle/service/ns/service_getter_interface.h"
-#include "core/hle/service/glue/glue_manager.h"
-#include "core/hle/service/sm/sm.h"
-#include "core/hle/service/acc/profile_manager.h"
-#include "core/hle/service/am/frontend/applet_profile_select.h"
-#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/am/service/all_system_applet_proxies_service.h"
+#include "core/hle/service/am/service/application_proxy_service.h"
+#include "core/hle/service/am/window_system.h"
+#include "core/hle/service/server_manager.h"
namespace Service::AM {
-struct Applet;
-class IAppletCommonFunctions;
-class IApplicationCreator;
-class IAudioController;
-class ICommonStateGetter;
-class IDebugFunctions;
-class IDisplayController;
-class IHomeMenuFunctions;
-class IGlobalStateController;
-class ILibraryAppletCreator;
-class IProcessWindingController;
-class ISelfController;
-class IWindowController;
-class WindowSystem;
-
-class IDebugFunctions final : public ServiceFramework<IDebugFunctions> {
-public:
- explicit IDebugFunctions(Core::System& system_) : ServiceFramework{system_, "IDebugFunctions"} {}
- ~IDebugFunctions() override = default;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "NotifyMessageToHomeMenuForDebug"},
- FunctionInfo{1, nullptr, "OpenMainApplication"},
- FunctionInfo{10, nullptr, "PerformSystemButtonPressing"},
- FunctionInfo{20, nullptr, "InvalidateTransitionLayer"},
- FunctionInfo{30, nullptr, "RequestLaunchApplicationWithUserAndArgumentForDebug"},
- FunctionInfo{31, nullptr, "RequestLaunchApplicationByApplicationLaunchInfoForDebug"},
- FunctionInfo{40, nullptr, "GetAppletResourceUsageInfo"},
- FunctionInfo{50, nullptr, "AddSystemProgramIdAndAppletIdForDebug"},
- FunctionInfo{51, nullptr, "AddOperationConfirmedLibraryAppletIdForDebug"},
- FunctionInfo{100, nullptr, "SetCpuBoostModeForApplet"},
- FunctionInfo{101, nullptr, "CancelCpuBoostModeForApplet"},
- FunctionInfo{110, nullptr, "PushToAppletBoundChannelForDebug"},
- FunctionInfo{111, nullptr, "TryPopFromAppletBoundChannelForDebug"},
- FunctionInfo{120, nullptr, "AlarmSettingNotificationEnableAppEventReserve"},
- FunctionInfo{121, nullptr, "AlarmSettingNotificationDisableAppEventReserve"},
- FunctionInfo{122, nullptr, "AlarmSettingNotificationPushAppEventNotify"},
- FunctionInfo{130, nullptr, "FriendInvitationSetApplicationParameter"},
- FunctionInfo{131, nullptr, "FriendInvitationClearApplicationParameter"},
- FunctionInfo{132, nullptr, "FriendInvitationPushApplicationParameter"},
- FunctionInfo{140, nullptr, "RestrictPowerOperationForSecureLaunchModeForDebug"},
- FunctionInfo{200, nullptr, "CreateFloatingLibraryAppletAccepterForDebug"},
- FunctionInfo{300, nullptr, "TerminateAllRunningApplicationsForDebug"},
- FunctionInfo{900, nullptr, "GetGrcProcessLaunchedSystemEvent"}
- );
-};
-
-class IApplicationProxy final : public ServiceFramework<IApplicationProxy> {
-public:
- explicit IApplicationProxy(Core::System& system_, std::shared_ptr<Applet> applet,
- Kernel::KProcess* process, WindowSystem& window_system)
- : ServiceFramework{system_, "IApplicationProxy"},
- m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} {
- }
-
- ~IApplicationProxy() override = default;
-
- Result GetAudioController(
- Out<SharedPointer<IAudioController>> out_audio_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_audio_controller = std::make_shared<IAudioController>(system);
- R_SUCCEED();
- }
-
- Result GetDisplayController(
- Out<SharedPointer<IDisplayController>> out_display_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_display_controller = std::make_shared<IDisplayController>(system, m_applet);
- R_SUCCEED();
- }
-
- Result GetProcessWindingController(
- Out<SharedPointer<IProcessWindingController>> out_process_winding_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_process_winding_controller = std::make_shared<IProcessWindingController>(system, m_applet);
- R_SUCCEED();
- }
-
- Result GetDebugFunctions(
- Out<SharedPointer<IDebugFunctions>> out_debug_functions) {
- LOG_DEBUG(Service_AM, "called");
- *out_debug_functions = std::make_shared<IDebugFunctions>(system);
- R_SUCCEED();
- }
-
- Result GetWindowController(
- Out<SharedPointer<IWindowController>> out_window_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_window_controller = std::make_shared<IWindowController>(system, m_applet, m_window_system);
- R_SUCCEED();
- }
-
- Result GetSelfController(
- Out<SharedPointer<ISelfController>> out_self_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_self_controller = std::make_shared<ISelfController>(system, m_applet, m_process);
- R_SUCCEED();
- }
-
- Result GetCommonStateGetter(
- Out<SharedPointer<ICommonStateGetter>> out_common_state_getter) {
- LOG_DEBUG(Service_AM, "called");
- *out_common_state_getter = std::make_shared<ICommonStateGetter>(system, m_applet);
- R_SUCCEED();
- }
-
- Result GetLibraryAppletCreator(
- Out<SharedPointer<ILibraryAppletCreator>> out_library_applet_creator) {
- LOG_DEBUG(Service_AM, "called");
- *out_library_applet_creator =
- std::make_shared<ILibraryAppletCreator>(system, m_applet, m_window_system);
- R_SUCCEED();
- }
-
- Result GetApplicationFunctions(
- Out<SharedPointer<IApplicationFunctions>> out_application_functions) {
- LOG_DEBUG(Service_AM, "called");
- *out_application_functions = std::make_shared<IApplicationFunctions>(system, m_applet);
- R_SUCCEED();
- }
-
-private:
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IApplicationProxy::GetCommonStateGetter>, "GetCommonStateGetter"},
- FunctionInfo{1, D<&IApplicationProxy::GetSelfController>, "GetSelfController"},
- FunctionInfo{2, D<&IApplicationProxy::GetWindowController>, "GetWindowController"},
- FunctionInfo{3, D<&IApplicationProxy::GetAudioController>, "GetAudioController"},
- FunctionInfo{4, D<&IApplicationProxy::GetDisplayController>, "GetDisplayController"},
- FunctionInfo{10, D<&IApplicationProxy::GetProcessWindingController>, "GetProcessWindingController"},
- FunctionInfo{11, D<&IApplicationProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"},
- FunctionInfo{20, D<&IApplicationProxy::GetApplicationFunctions>, "GetApplicationFunctions"},
- FunctionInfo{1000, D<&IApplicationProxy::GetDebugFunctions>, "GetDebugFunctions"}
- );
- WindowSystem& m_window_system;
- Kernel::KProcess* const m_process;
- const std::shared_ptr<Applet> m_applet;
-};
-
-class IApplicationProxyService final : public ServiceFramework<IApplicationProxyService> {
-public:
- explicit IApplicationProxyService(Core::System& system_,
- WindowSystem& window_system)
- : ServiceFramework{system_, "appletOE"}, m_window_system{window_system} {
- }
-
- ~IApplicationProxyService() override = default;
-
- Result OpenApplicationProxy(
- Out<SharedPointer<IApplicationProxy>> out_application_proxy, ClientProcessId pid,
- InCopyHandle<Kernel::KProcess> process_handle) {
- LOG_DEBUG(Service_AM, "called");
-
- if (const auto applet = this->GetAppletFromProcessId(pid)) {
- *out_application_proxy = std::make_shared<IApplicationProxy>(
- system, applet, process_handle.Get(), m_window_system);
- R_SUCCEED();
- } else {
- UNIMPLEMENTED();
- R_THROW(ResultUnknown);
- }
- }
-
- std::shared_ptr<Applet> GetAppletFromProcessId(ProcessId process_id) {
- return m_window_system.GetByAppletResourceUserId(process_id.pid);
- }
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IApplicationProxyService::OpenApplicationProxy>, "OpenApplicationProxy"}
- );
- WindowSystem& m_window_system;
-};
-
-class IAppletCommonFunctions final : public ServiceFramework<IAppletCommonFunctions> {
-public:
- explicit IAppletCommonFunctions(Core::System& system_, std::shared_ptr<Applet> applet_) : ServiceFramework{system_, "IAppletCommonFunctions"}, applet{std::move(applet_)} {}
- ~IAppletCommonFunctions() override = default;
-
- Result SetHomeButtonDoubleClickEnabled(
- bool home_button_double_click_enabled) {
- LOG_WARNING(Service_AM, "(STUBBED) called, home_button_double_click_enabled={}", home_button_double_click_enabled);
- R_SUCCEED();
- }
-
- Result GetHomeButtonDoubleClickEnabled(
- Out<bool> out_home_button_double_click_enabled) {
- LOG_WARNING(Service_AM, "(STUBBED) called");
- *out_home_button_double_click_enabled = false;
- R_SUCCEED();
- }
-
- Result SetDisplayMagnification(f32 x, f32 y, f32 width, f32 height) {
- LOG_DEBUG(Service_AM, "(STUBBED) called, x={}, y={}, width={}, height={}", x, y, width, height);
- std::scoped_lock lk{applet->lock};
- applet->display_magnification = Common::Rectangle<f32>{x, y, x + width, y + height};
- R_SUCCEED();
- }
-
- Result SetCpuBoostRequestPriority(s32 priority) {
- LOG_WARNING(Service_AM, "(STUBBED) called");
- std::scoped_lock lk{applet->lock};
- applet->cpu_boost_request_priority = priority;
- R_SUCCEED();
- }
-
- Result GetCurrentApplicationId(Out<u64> out_application_id) {
- LOG_WARNING(Service_AM, "(STUBBED) called");
- *out_application_id = FileSys::GetBaseTitleID(system.GetApplicationProcessProgramID());
- R_SUCCEED();
- }
-
- Result SetGpuTimeSliceBoost(s64 time_span) {
- LOG_WARNING(Service_AM, "(STUBBED) called, time_span={}", time_span);
- R_SUCCEED();
- }
-
- Result Unknown350(Out<u16> out_unknown) {
- LOG_WARNING(Service_AM, "(STUBBED) called");
- *out_unknown = 0;
- R_SUCCEED();
- }
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "SetTerminateResult"},
- FunctionInfo{10, nullptr, "ReadThemeStorage"},
- FunctionInfo{11, nullptr, "WriteThemeStorage"},
- FunctionInfo{20, nullptr, "PushToAppletBoundChannel"},
- FunctionInfo{21, nullptr, "TryPopFromAppletBoundChannel"},
- FunctionInfo{40, nullptr, "GetDisplayLogicalResolution"},
- FunctionInfo{42, D<&IAppletCommonFunctions::SetDisplayMagnification>, "SetDisplayMagnification"},
- FunctionInfo{50, D<&IAppletCommonFunctions::SetHomeButtonDoubleClickEnabled>, "SetHomeButtonDoubleClickEnabled"},
- FunctionInfo{51, D<&IAppletCommonFunctions::GetHomeButtonDoubleClickEnabled>, "GetHomeButtonDoubleClickEnabled"},
- FunctionInfo{52, nullptr, "IsHomeButtonShortPressedBlocked"},
- FunctionInfo{60, nullptr, "IsVrModeCurtainRequired"},
- FunctionInfo{61, nullptr, "IsSleepRequiredByHighTemperature"},
- FunctionInfo{62, nullptr, "IsSleepRequiredByLowBattery"},
- FunctionInfo{70, D<&IAppletCommonFunctions::SetCpuBoostRequestPriority>, "SetCpuBoostRequestPriority"},
- FunctionInfo{80, nullptr, "SetHandlingCaptureButtonShortPressedMessageEnabledForApplet"},
- FunctionInfo{81, nullptr, "SetHandlingCaptureButtonLongPressedMessageEnabledForApplet"},
- FunctionInfo{90, nullptr, "OpenNamedChannelAsParent"},
- FunctionInfo{91, nullptr, "OpenNamedChannelAsChild"},
- FunctionInfo{100, nullptr, "SetApplicationCoreUsageMode"},
- FunctionInfo{300, D<&IAppletCommonFunctions::GetCurrentApplicationId>, "GetCurrentApplicationId"},
- FunctionInfo{310, nullptr, "IsSystemAppletHomeMenu", MakeVersionGate({19,0,0})},
- FunctionInfo{320, D<&IAppletCommonFunctions::SetGpuTimeSliceBoost>, "SetGpuTimeSliceBoost", MakeVersionGate({19,0,0})},
- FunctionInfo{321, nullptr, "SetGpuTimeSliceBoostDueToApplication", MakeVersionGate({19,0,0})},
- FunctionInfo{350, D<&IAppletCommonFunctions::Unknown350>, "Unknown350", MakeVersionGate({20,0,0})}
- );
- const std::shared_ptr<Applet> applet;
-};
-
-class ISystemAppletProxy final : public ServiceFramework<ISystemAppletProxy> {
-public:
- explicit ISystemAppletProxy(Core::System& system_, std::shared_ptr<Applet> applet, Kernel::KProcess* process, WindowSystem& window_system)
- : ServiceFramework{system_, "ISystemAppletProxy"},
- m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} {
- }
-
- ~ISystemAppletProxy() override = default;
-
- Result GetAudioController(
- Out<SharedPointer<IAudioController>> out_audio_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_audio_controller = std::make_shared<IAudioController>(system);
- R_SUCCEED();
- }
-
- Result GetDisplayController(
- Out<SharedPointer<IDisplayController>> out_display_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_display_controller = std::make_shared<IDisplayController>(system, m_applet);
- R_SUCCEED();
- }
-
- Result GetProcessWindingController(
- Out<SharedPointer<IProcessWindingController>> out_process_winding_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_process_winding_controller = std::make_shared<IProcessWindingController>(system, m_applet);
- R_SUCCEED();
- }
-
- Result GetDebugFunctions(
- Out<SharedPointer<IDebugFunctions>> out_debug_functions) {
- LOG_DEBUG(Service_AM, "called");
- *out_debug_functions = std::make_shared<IDebugFunctions>(system);
- R_SUCCEED();
- }
-
- Result GetWindowController(
- Out<SharedPointer<IWindowController>> out_window_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_window_controller = std::make_shared<IWindowController>(system, m_applet, m_window_system);
- R_SUCCEED();
- }
-
- Result GetSelfController(
- Out<SharedPointer<ISelfController>> out_self_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_self_controller = std::make_shared<ISelfController>(system, m_applet, m_process);
- R_SUCCEED();
- }
-
- Result GetCommonStateGetter(
- Out<SharedPointer<ICommonStateGetter>> out_common_state_getter) {
- LOG_DEBUG(Service_AM, "called");
- *out_common_state_getter = std::make_shared<ICommonStateGetter>(system, m_applet);
- R_SUCCEED();
- }
-
- Result GetLibraryAppletCreator(
- Out<SharedPointer<ILibraryAppletCreator>> out_library_applet_creator) {
- LOG_DEBUG(Service_AM, "called");
- *out_library_applet_creator =
- std::make_shared<ILibraryAppletCreator>(system, m_applet, m_window_system);
- R_SUCCEED();
- }
-
- Result GetApplicationCreator(
- Out<SharedPointer<IApplicationCreator>> out_application_creator) {
- LOG_DEBUG(Service_AM, "called");
- *out_application_creator = std::make_shared<IApplicationCreator>(system, m_window_system);
- R_SUCCEED();
- }
-
- Result GetAppletCommonFunctions(
- Out<SharedPointer<IAppletCommonFunctions>> out_applet_common_functions) {
- LOG_DEBUG(Service_AM, "called");
- *out_applet_common_functions = std::make_shared<IAppletCommonFunctions>(system, m_applet);
- R_SUCCEED();
- }
-
- Result GetHomeMenuFunctions(
- Out<SharedPointer<IHomeMenuFunctions>> out_home_menu_functions) {
- LOG_DEBUG(Service_AM, "called");
- *out_home_menu_functions =
- std::make_shared<IHomeMenuFunctions>(system, m_applet, m_window_system);
- R_SUCCEED();
- }
-
- Result GetGlobalStateController(
- Out<SharedPointer<IGlobalStateController>> out_global_state_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_global_state_controller = std::make_shared<IGlobalStateController>(system);
- R_SUCCEED();
- }
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&ISystemAppletProxy::GetCommonStateGetter>, "GetCommonStateGetter"},
- FunctionInfo{1, D<&ISystemAppletProxy::GetSelfController>, "GetSelfController"},
- FunctionInfo{2, D<&ISystemAppletProxy::GetWindowController>, "GetWindowController"},
- FunctionInfo{3, D<&ISystemAppletProxy::GetAudioController>, "GetAudioController"},
- FunctionInfo{4, D<&ISystemAppletProxy::GetDisplayController>, "GetDisplayController"},
- FunctionInfo{10, D<&ISystemAppletProxy::GetProcessWindingController>, "GetProcessWindingController"},
- FunctionInfo{11, D<&ISystemAppletProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"},
- FunctionInfo{20, D<&ISystemAppletProxy::GetHomeMenuFunctions>, "GetHomeMenuFunctions"},
- FunctionInfo{21, D<&ISystemAppletProxy::GetGlobalStateController>, "GetGlobalStateController"},
- FunctionInfo{22, D<&ISystemAppletProxy::GetApplicationCreator>, "GetApplicationCreator"},
- FunctionInfo{23, D<&ISystemAppletProxy::GetAppletCommonFunctions>, "GetAppletCommonFunctions"},
- FunctionInfo{1000, D<&ISystemAppletProxy::GetDebugFunctions>, "GetDebugFunctions"}
- );
- WindowSystem& m_window_system;
- Kernel::KProcess* const m_process;
- const std::shared_ptr<Applet> m_applet;
-};
-
-static AppletIdentityInfo GetCallerIdentity(Applet& applet) {
- if (const auto caller_applet = applet.caller_applet.lock(); caller_applet) {
- // TODO: is this actually the application ID?
- return {
- .applet_id = caller_applet->applet_id,
- .application_id = caller_applet->program_id,
- };
- } else {
- return {
- .applet_id = AppletId::QLaunch,
- .application_id = 0x0100000000001000ull,
- };
- }
-}
-
-class ILibraryAppletSelfAccessor final : public ServiceFramework<ILibraryAppletSelfAccessor> {
-public:
- ILibraryAppletSelfAccessor(Core::System& system_,
- std::shared_ptr<Applet> applet)
- : ServiceFramework{system_, "ILibraryAppletSelfAccessor"}, m_applet{std::move(applet)},
- m_broker{m_applet->caller_applet_broker} {
- }
-
- ~ILibraryAppletSelfAccessor() = default;
-
- Result PopInData(Out<SharedPointer<IStorage>> out_storage) {
- LOG_INFO(Service_AM, "called");
- R_RETURN(m_broker->GetInData().Pop(system.Kernel(), out_storage));
- }
-
- Result PushOutData(SharedPointer<IStorage> storage) {
- LOG_INFO(Service_AM, "called");
- m_broker->GetOutData().Push(system.Kernel(), storage);
- R_SUCCEED();
- }
-
- Result PopInteractiveInData(Out<SharedPointer<IStorage>> out_storage) {
- LOG_INFO(Service_AM, "called");
- R_RETURN(m_broker->GetInteractiveInData().Pop(system.Kernel(), out_storage));
- }
-
- Result PushInteractiveOutData(SharedPointer<IStorage> storage) {
- LOG_INFO(Service_AM, "called");
- m_broker->GetInteractiveOutData().Push(system.Kernel(), storage);
- R_SUCCEED();
- }
-
- Result GetPopInDataEvent(
- OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_INFO(Service_AM, "called");
- *out_event = m_broker->GetInData().GetEvent();
- R_SUCCEED();
- }
-
- Result GetPopInteractiveInDataEvent(
- OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_INFO(Service_AM, "called");
- *out_event = m_broker->GetInteractiveInData().GetEvent();
- R_SUCCEED();
- }
-
- Result GetLibraryAppletInfo(
- Out<LibraryAppletInfo> out_library_applet_info) {
- LOG_INFO(Service_AM, "called");
- *out_library_applet_info = {
- .applet_id = m_applet->applet_id,
- .library_applet_mode = m_applet->library_applet_mode,
- };
- R_SUCCEED();
- }
-
- Result GetMainAppletIdentityInfo(
- Out<AppletIdentityInfo> out_identity_info) {
- LOG_WARNING(Service_AM, "(STUBBED) called");
- *out_identity_info = {
- .applet_id = AppletId::QLaunch,
- .application_id = 0x0100000000001000ull,
- };
- R_SUCCEED();
- }
-
- Result CanUseApplicationCore(Out<bool> out_can_use_application_core) {
- // TODO: This appears to read the NPDM from state and check the core mask of the applet.
- LOG_WARNING(Service_AM, "(STUBBED) called");
- *out_can_use_application_core = false;
- R_SUCCEED();
- }
-
- Result GetMainAppletApplicationControlProperty(
- OutLargeData<std::array<u8, 0x4000>, BufferAttr_HipcMapAlias> out_nacp) {
- LOG_WARNING(Service_AM, "(STUBBED) called");
-
- // TODO: this should be the main applet, not the caller applet
- const auto application = GetCallerIdentity(*m_applet);
- std::vector<u8> nacp;
- const auto result =
- system.GetARPManager().GetControlProperty(&nacp, application.application_id);
-
- if (R_SUCCEEDED(result)) {
- std::memcpy(out_nacp->data(), nacp.data(), (std::min)(nacp.size(), out_nacp->size()));
- }
-
- R_RETURN(result);
- }
-
- Result GetMainAppletStorageId(Out<FileSys::StorageId> out_storage_id) {
- LOG_INFO(Service_AM, "(STUBBED) called");
- *out_storage_id = FileSys::StorageId::NandUser;
- R_SUCCEED();
- }
-
- Result ExitProcessAndReturn() {
- LOG_INFO(Service_AM, "called");
-
- if (const auto caller_applet = m_applet->caller_applet.lock(); caller_applet) {
- m_applet->process->Terminate();
- } else {
- system.GetUserChannel() = m_applet->user_channel_launch_parameter;
- system.ExecuteProgram(0);
- }
-
- R_SUCCEED();
- }
-
- Result GetCallerAppletIdentityInfo(
- Out<AppletIdentityInfo> out_identity_info) {
- LOG_INFO(Service_AM, "called");
- *out_identity_info = GetCallerIdentity(*m_applet);
- R_SUCCEED();
- }
-
- Result GetCallerAppletIdentityInfoStack(
- Out<s32> out_count, OutArray<AppletIdentityInfo, BufferAttr_HipcMapAlias> out_identity_info) {
- LOG_INFO(Service_AM, "called");
-
- std::shared_ptr<Applet> applet = m_applet;
- *out_count = 0;
-
- do {
- if (*out_count >= static_cast<s32>(out_identity_info.size())) {
- break;
- }
- out_identity_info[(*out_count)++] = GetCallerIdentity(*applet);
- } while ((applet = applet->caller_applet.lock()));
-
- R_SUCCEED();
- }
-
- Result GetDesirableKeyboardLayout(Out<u32> out_desirable_layout) {
- LOG_WARNING(Service_AM, "(STUBBED) called");
- *out_desirable_layout = 0;
- R_SUCCEED();
- }
-
- Result ReportVisibleError(ErrorCode error_code) {
- LOG_WARNING(Service_AM, "(STUBBED) called, error {}-{}", error_code.category,
- error_code.number);
- R_SUCCEED();
- }
-
- Result ReportVisibleErrorWithErrorContext(
- ErrorCode error_code, InLargeData<ErrorContext, BufferAttr_HipcMapAlias> error_context) {
- LOG_WARNING(Service_AM, "(STUBBED) called, error {}-{}", error_code.category,
- error_code.number);
- R_SUCCEED();
- }
-
- Result UnpopInData(SharedPointer<IStorage> storage) {
- LOG_INFO(Service_AM, "called");
- m_broker->GetInData().Unpop(system.Kernel(), storage);
- R_SUCCEED();
- }
-
- Result GetMainAppletApplicationDesiredLanguage(
- Out<u64> out_desired_language) {
- // FIXME: this is copied from IApplicationFunctions::GetDesiredLanguage
- // FIXME: all of this stuff belongs to ns
- auto identity = GetCallerIdentity(*m_applet);
-
- // TODO(bunnei): This should be configurable
- LOG_DEBUG(Service_AM, "called");
-
- // Get supported languages from NACP, if possible
- // Default to 0 (all languages supported)
- u32 supported_languages = 0;
-
- const auto res = FileSys::PatchManager::GetMetadataFromBaseOrUpdate(system, identity.application_id);
-
- if (res.first != nullptr) {
- supported_languages = res.first->GetSupportedLanguages();
- }
-
- // Call IApplicationManagerInterface implementation.
- auto& service_manager = system.ServiceManager();
- auto ns_am2 = service_manager.GetService<NS::IServiceGetterInterface>("ns:am2");
-
- std::shared_ptr<NS::IApplicationManagerInterface> app_man;
- R_TRY(ns_am2->GetApplicationManagerInterface(&app_man));
-
- // Get desired application language
- NS::ApplicationLanguage desired_language{};
- R_TRY(app_man->GetApplicationDesiredLanguage(&desired_language, supported_languages));
-
- // Convert to settings language code.
- u64 language_code{};
- R_TRY(app_man->ConvertApplicationLanguageToLanguageCode(&language_code, desired_language));
-
- LOG_DEBUG(Service_AM, "got desired_language={:016X}", language_code);
-
- *out_desired_language = language_code;
- R_SUCCEED();
- }
-
- Result GetCurrentApplicationId(Out<u64> out_application_id) {
- LOG_WARNING(Service_AM, "(STUBBED) called");
-
- // TODO: this should be the main applet, not the caller applet
- const auto main_applet = GetCallerIdentity(*m_applet);
- *out_application_id = main_applet.application_id;
-
- R_SUCCEED();
- }
-
- Result GetMainAppletAvailableUsers(
- Out<bool> out_can_select_any_user, Out<s32> out_users_count,
- OutArray<Common::UUID, BufferAttr_HipcMapAlias> out_users) {
- const Service::Account::ProfileManager manager{};
-
- *out_can_select_any_user = false;
- *out_users_count = -1;
-
- LOG_INFO(Service_AM, "called");
-
- if (manager.GetUserCount() > 0) {
- *out_can_select_any_user = true;
- *out_users_count = static_cast<s32>(manager.GetUserCount());
-
- const auto users = manager.GetAllUsers();
- for (size_t i = 0; i < users.size() && i < out_users.size(); i++) {
- out_users[i] = users[i];
- }
- }
-
- R_SUCCEED();
- }
-
- Result ShouldSetGpuTimeSliceManually(
- Out<bool> out_should_set_gpu_time_slice_manually) {
- LOG_INFO(Service_AM, "(STUBBED) called");
- *out_should_set_gpu_time_slice_manually = false;
- R_SUCCEED();
- }
-
- Result GetLibraryAppletInfoEx(
- Out<LibraryAppletInfo> out_library_applet_info) {
- LOG_INFO(Service_AM, "called");
- *out_library_applet_info = {
- .applet_id = m_applet->applet_id,
- .library_applet_mode = m_applet->library_applet_mode,
- };
- R_SUCCEED();
- }
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&ILibraryAppletSelfAccessor::PopInData>, "PopInData"},
- FunctionInfo{1, D<&ILibraryAppletSelfAccessor::PushOutData>, "PushOutData"},
- FunctionInfo{2, D<&ILibraryAppletSelfAccessor::PopInteractiveInData>, "PopInteractiveInData"},
- FunctionInfo{3, D<&ILibraryAppletSelfAccessor::PushInteractiveOutData>, "PushInteractiveOutData"},
- FunctionInfo{5, D<&ILibraryAppletSelfAccessor::GetPopInDataEvent>, "GetPopInDataEvent"},
- FunctionInfo{6, D<&ILibraryAppletSelfAccessor::GetPopInteractiveInDataEvent>, "GetPopInteractiveInDataEvent"},
- FunctionInfo{10, D<&ILibraryAppletSelfAccessor::ExitProcessAndReturn>, "ExitProcessAndReturn"},
- FunctionInfo{11, D<&ILibraryAppletSelfAccessor::GetLibraryAppletInfo>, "GetLibraryAppletInfo"},
- FunctionInfo{12, D<&ILibraryAppletSelfAccessor::GetMainAppletIdentityInfo>, "GetMainAppletIdentityInfo"},
- FunctionInfo{13, D<&ILibraryAppletSelfAccessor::CanUseApplicationCore>, "CanUseApplicationCore"},
- FunctionInfo{14, D<&ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfo>, "GetCallerAppletIdentityInfo"},
- FunctionInfo{15, D<&ILibraryAppletSelfAccessor::GetMainAppletApplicationControlProperty>, "GetMainAppletApplicationControlProperty"},
- FunctionInfo{16, D<&ILibraryAppletSelfAccessor::GetMainAppletStorageId>, "GetMainAppletStorageId"},
- FunctionInfo{17, D<&ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfoStack>, "GetCallerAppletIdentityInfoStack"},
- FunctionInfo{18, nullptr, "GetNextReturnDestinationAppletIdentityInfo"},
- FunctionInfo{19, D<&ILibraryAppletSelfAccessor::GetDesirableKeyboardLayout>, "GetDesirableKeyboardLayout"},
- FunctionInfo{20, nullptr, "PopExtraStorage"},
- FunctionInfo{25, nullptr, "GetPopExtraStorageEvent"},
- FunctionInfo{30, D<&ILibraryAppletSelfAccessor::UnpopInData>, "UnpopInData"},
- FunctionInfo{31, nullptr, "UnpopExtraStorage"},
- FunctionInfo{40, nullptr, "GetIndirectLayerProducerHandle"},
- FunctionInfo{50, D<&ILibraryAppletSelfAccessor::ReportVisibleError>, "ReportVisibleError"},
- FunctionInfo{51, D<&ILibraryAppletSelfAccessor::ReportVisibleErrorWithErrorContext>, "ReportVisibleErrorWithErrorContext"},
- FunctionInfo{60, D<&ILibraryAppletSelfAccessor::GetMainAppletApplicationDesiredLanguage>, "GetMainAppletApplicationDesiredLanguage"},
- FunctionInfo{70, D<&ILibraryAppletSelfAccessor::GetCurrentApplicationId>, "GetCurrentApplicationId"},
- FunctionInfo{80, nullptr, "RequestExitToSelf"},
- FunctionInfo{90, nullptr, "CreateApplicationAndPushAndRequestToLaunch"},
- FunctionInfo{100, nullptr, "CreateGameMovieTrimmer"},
- FunctionInfo{101, nullptr, "ReserveResourceForMovieOperation"},
- FunctionInfo{102, nullptr, "UnreserveResourceForMovieOperation"},
- FunctionInfo{110, D<&ILibraryAppletSelfAccessor::GetMainAppletAvailableUsers>, "GetMainAppletAvailableUsers"},
- FunctionInfo{120, nullptr, "GetLaunchStorageInfoForDebug"},
- FunctionInfo{130, nullptr, "GetGpuErrorDetectedSystemEvent"},
- FunctionInfo{140, nullptr, "SetApplicationMemoryReservation"},
- FunctionInfo{150, D<&ILibraryAppletSelfAccessor::ShouldSetGpuTimeSliceManually>, "ShouldSetGpuTimeSliceManually"},
- FunctionInfo{160, D<&ILibraryAppletSelfAccessor::GetLibraryAppletInfoEx>, "GetLibraryAppletInfoEx"}
- );
- const std::shared_ptr<Applet> m_applet;
- const std::shared_ptr<AppletDataBroker> m_broker;
-};
-
-class ILibraryAppletProxy final : public ServiceFramework<ILibraryAppletProxy> {
-public:
- explicit ILibraryAppletProxy(Core::System& system_, std::shared_ptr<Applet> applet,
- Kernel::KProcess* process, WindowSystem& window_system)
- : ServiceFramework{system_, "ILibraryAppletProxy"},
- m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} {
- }
- ~ILibraryAppletProxy() override = default;
-
- Result GetAudioController(
- Out<SharedPointer<IAudioController>> out_audio_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_audio_controller = std::make_shared<IAudioController>(system);
- R_SUCCEED();
- }
-
- Result GetDisplayController(
- Out<SharedPointer<IDisplayController>> out_display_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_display_controller = std::make_shared<IDisplayController>(system, m_applet);
- R_SUCCEED();
- }
-
- Result GetProcessWindingController(
- Out<SharedPointer<IProcessWindingController>> out_process_winding_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_process_winding_controller = std::make_shared<IProcessWindingController>(system, m_applet);
- R_SUCCEED();
- }
-
- Result GetDebugFunctions(
- Out<SharedPointer<IDebugFunctions>> out_debug_functions) {
- LOG_DEBUG(Service_AM, "called");
- *out_debug_functions = std::make_shared<IDebugFunctions>(system);
- R_SUCCEED();
- }
-
- Result GetWindowController(
- Out<SharedPointer<IWindowController>> out_window_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_window_controller = std::make_shared<IWindowController>(system, m_applet, m_window_system);
- R_SUCCEED();
- }
-
- Result GetSelfController(
- Out<SharedPointer<ISelfController>> out_self_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_self_controller = std::make_shared<ISelfController>(system, m_applet, m_process);
- R_SUCCEED();
- }
-
- Result GetCommonStateGetter(
- Out<SharedPointer<ICommonStateGetter>> out_common_state_getter) {
- LOG_DEBUG(Service_AM, "called");
- *out_common_state_getter = std::make_shared<ICommonStateGetter>(system, m_applet);
- R_SUCCEED();
- }
-
- Result GetLibraryAppletCreator(
- Out<SharedPointer<ILibraryAppletCreator>> out_library_applet_creator) {
- LOG_DEBUG(Service_AM, "called");
- *out_library_applet_creator =
- std::make_shared<ILibraryAppletCreator>(system, m_applet, m_window_system);
- R_SUCCEED();
- }
-
- Result OpenLibraryAppletSelfAccessor(
- Out<SharedPointer<ILibraryAppletSelfAccessor>> out_library_applet_self_accessor) {
- LOG_DEBUG(Service_AM, "called");
- *out_library_applet_self_accessor =
- std::make_shared<ILibraryAppletSelfAccessor>(system, m_applet);
- R_SUCCEED();
- }
-
- Result GetAppletCommonFunctions(
- Out<SharedPointer<IAppletCommonFunctions>> out_applet_common_functions) {
- LOG_DEBUG(Service_AM, "called");
- *out_applet_common_functions = std::make_shared<IAppletCommonFunctions>(system, m_applet);
- R_SUCCEED();
- }
-
- Result GetHomeMenuFunctions(
- Out<SharedPointer<IHomeMenuFunctions>> out_home_menu_functions) {
- LOG_DEBUG(Service_AM, "called");
- *out_home_menu_functions =
- std::make_shared<IHomeMenuFunctions>(system, m_applet, m_window_system);
- R_SUCCEED();
- }
-
- Result GetGlobalStateController(
- Out<SharedPointer<IGlobalStateController>> out_global_state_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_global_state_controller = std::make_shared<IGlobalStateController>(system);
- R_SUCCEED();
- }
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&ILibraryAppletProxy::GetCommonStateGetter>, "GetCommonStateGetter"},
- FunctionInfo{1, D<&ILibraryAppletProxy::GetSelfController>, "GetSelfController"},
- FunctionInfo{2, D<&ILibraryAppletProxy::GetWindowController>, "GetWindowController"},
- FunctionInfo{3, D<&ILibraryAppletProxy::GetAudioController>, "GetAudioController"},
- FunctionInfo{4, D<&ILibraryAppletProxy::GetDisplayController>, "GetDisplayController"},
- FunctionInfo{10, D<&ILibraryAppletProxy::GetProcessWindingController>, "GetProcessWindingController"},
- FunctionInfo{11, D<&ILibraryAppletProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"},
- FunctionInfo{20, D<&ILibraryAppletProxy::OpenLibraryAppletSelfAccessor>, "OpenLibraryAppletSelfAccessor"},
- FunctionInfo{21, D<&ILibraryAppletProxy::GetAppletCommonFunctions>, "GetAppletCommonFunctions"},
- FunctionInfo{22, D<&ILibraryAppletProxy::GetHomeMenuFunctions>, "GetHomeMenuFunctions"},
- FunctionInfo{23, D<&ILibraryAppletProxy::GetGlobalStateController>, "GetGlobalStateController"},
- FunctionInfo{1000, D<&ILibraryAppletProxy::GetDebugFunctions>, "GetDebugFunctions"}
- );
- WindowSystem& m_window_system;
- Kernel::KProcess* const m_process;
- const std::shared_ptr<Applet> m_applet;
-};
-
-class IOverlayAppletProxy final : public ServiceFramework<IOverlayAppletProxy> {
-public:
- explicit IOverlayAppletProxy(Core::System &system_, std::shared_ptr<Applet> applet,
- Kernel::KProcess *process, WindowSystem &window_system)
- : ServiceFramework{system_, "IOverlayAppletProxy"},
- m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} {
- }
-
- ~IOverlayAppletProxy() override = default;
-
- Result GetCommonStateGetter(
- Out<SharedPointer<ICommonStateGetter> > out_common_state_getter) {
- LOG_DEBUG(Service_AM, "called");
- *out_common_state_getter = std::make_shared<ICommonStateGetter>(system, m_applet);
- R_SUCCEED();
- }
-
- Result GetSelfController(
- Out<SharedPointer<ISelfController> > out_self_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_self_controller = std::make_shared<ISelfController>(system, m_applet, m_process);
- R_SUCCEED();
- }
-
- Result GetWindowController(
- Out<SharedPointer<IWindowController> > out_window_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_window_controller = std::make_shared<IWindowController>(system, m_applet, m_window_system);
- R_SUCCEED();
- }
-
- Result GetAudioController(
- Out<SharedPointer<IAudioController> > out_audio_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_audio_controller = std::make_shared<IAudioController>(system);
- R_SUCCEED();
- }
-
- Result GetDisplayController(
- Out<SharedPointer<IDisplayController> > out_display_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_display_controller = std::make_shared<IDisplayController>(system, m_applet);
- R_SUCCEED();
- }
-
- Result GetProcessWindingController(
- Out<SharedPointer<IProcessWindingController> > out_process_winding_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_process_winding_controller = std::make_shared<IProcessWindingController>(system, m_applet);
- R_SUCCEED();
- }
-
- Result GetLibraryAppletCreator(
- Out<SharedPointer<ILibraryAppletCreator> > out_library_applet_creator) {
- LOG_DEBUG(Service_AM, "called");
- *out_library_applet_creator =
- std::make_shared<ILibraryAppletCreator>(system, m_applet, m_window_system);
- R_SUCCEED();
- }
-
- Result GetOverlayFunctions(
- Out<SharedPointer<IOverlayFunctions> > out_overlay_functions) {
- LOG_DEBUG(Service_AM, "called");
- *out_overlay_functions = std::make_shared<IOverlayFunctions>(system, m_applet);
- R_SUCCEED();
- }
-
- Result GetAppletCommonFunctions(
- Out<SharedPointer<IAppletCommonFunctions> > out_applet_common_functions) {
- LOG_DEBUG(Service_AM, "called");
- *out_applet_common_functions = std::make_shared<IAppletCommonFunctions>(system, m_applet);
- R_SUCCEED();
- }
-
- Result GetGlobalStateController(
- Out<SharedPointer<IGlobalStateController> > out_global_state_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_global_state_controller = std::make_shared<IGlobalStateController>(system);
- R_SUCCEED();
- }
-
- Result GetDebugFunctions(
- Out<SharedPointer<IDebugFunctions> > out_debug_functions) {
- LOG_DEBUG(Service_AM, "called");
- *out_debug_functions = std::make_shared<IDebugFunctions>(system);
- R_SUCCEED();
- }
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IOverlayAppletProxy::GetCommonStateGetter>, "GetCommonStateGetter"},
- FunctionInfo{1, D<&IOverlayAppletProxy::GetSelfController>, "GetSelfController"},
- FunctionInfo{2, D<&IOverlayAppletProxy::GetWindowController>, "GetWindowController"},
- FunctionInfo{3, D<&IOverlayAppletProxy::GetAudioController>, "GetAudioController"},
- FunctionInfo{4, D<&IOverlayAppletProxy::GetDisplayController>, "GetDisplayController"},
- FunctionInfo{10, D<&IOverlayAppletProxy::GetProcessWindingController>, "GetProcessWindingController"},
- FunctionInfo{11, D<&IOverlayAppletProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"},
- FunctionInfo{20, D<&IOverlayAppletProxy::GetOverlayFunctions>, "GetOverlayFunctions"},
- FunctionInfo{21, D<&IOverlayAppletProxy::GetAppletCommonFunctions>, "GetAppletCommonFunctions"},
- FunctionInfo{23, D<&IOverlayAppletProxy::GetGlobalStateController>, "GetGlobalStateController"},
- FunctionInfo{1000, D<&IOverlayAppletProxy::GetDebugFunctions>, "GetDebugFunctions"}
- );
- WindowSystem& m_window_system;
- Kernel::KProcess* const m_process;
- const std::shared_ptr<Applet> m_applet;
-};
-
-static bool ShouldCreateGuestApplet(AppletId applet_id) {
-#define X(Name, name) \
- if (applet_id == AppletId::Name && \
- Settings::values.name##_applet_mode.GetValue() != Settings::AppletMode::LLE) { \
- return false; \
- }
-
- X(Cabinet, cabinet)
- X(Controller, controller)
- X(DataErase, data_erase)
- X(Error, error)
- X(NetConnect, net_connect)
- X(ProfileSelect, player_select)
- X(SoftwareKeyboard, swkbd)
- X(MiiEdit, mii_edit)
- X(Web, web)
- X(Shop, shop)
- X(PhotoViewer, photo_viewer)
- X(OfflineWeb, offline_web)
- X(LoginShare, login_share)
- X(WebAuth, wifi_web_auth)
- X(MyPage, my_page)
-
-#undef X
-
- return true;
-}
-
-static AppletProgramId AppletIdToProgramId(AppletId applet_id) {
- switch (applet_id) {
- case AppletId::OverlayDisplay:
- return AppletProgramId::OverlayDisplay;
- case AppletId::QLaunch:
- return AppletProgramId::QLaunch;
- case AppletId::Starter:
- return AppletProgramId::Starter;
- case AppletId::Auth:
- return AppletProgramId::Auth;
- case AppletId::Cabinet:
- return AppletProgramId::Cabinet;
- case AppletId::Controller:
- return AppletProgramId::Controller;
- case AppletId::DataErase:
- return AppletProgramId::DataErase;
- case AppletId::Error:
- return AppletProgramId::Error;
- case AppletId::NetConnect:
- return AppletProgramId::NetConnect;
- case AppletId::ProfileSelect:
- return AppletProgramId::ProfileSelect;
- case AppletId::SoftwareKeyboard:
- return AppletProgramId::SoftwareKeyboard;
- case AppletId::MiiEdit:
- return AppletProgramId::MiiEdit;
- case AppletId::Web:
- return AppletProgramId::Web;
- case AppletId::Shop:
- return AppletProgramId::Shop;
- case AppletId::PhotoViewer:
- return AppletProgramId::PhotoViewer;
- case AppletId::Settings:
- return AppletProgramId::Settings;
- case AppletId::OfflineWeb:
- return AppletProgramId::OfflineWeb;
- case AppletId::LoginShare:
- return AppletProgramId::LoginShare;
- case AppletId::WebAuth:
- return AppletProgramId::WebAuth;
- case AppletId::MyPage:
- return AppletProgramId::MyPage;
- default:
- return static_cast<AppletProgramId>(0);
- }
-}
-
-static std::shared_ptr<ILibraryAppletAccessor> CreateGuestApplet(Core::System& system,
- WindowSystem& window_system,
- std::shared_ptr<Applet> caller_applet,
- AppletId applet_id,
- LibraryAppletMode mode) {
- const auto program_id = static_cast<u64>(AppletIdToProgramId(applet_id));
- if (program_id == 0) {
- // Unknown applet
- return {};
- }
-
- auto process = CreateProcess(system, program_id, 1, HLE::ApiVersion::HOS_VERSION_MAJOR);
- if (process) {
- const auto applet = std::make_shared<Applet>(system, std::move(process), false);
- applet->program_id = program_id;
- applet->applet_id = applet_id;
- applet->type = AppletType::LibraryApplet;
- applet->library_applet_mode = mode;
- applet->window_visible = mode != LibraryAppletMode::AllForegroundInitiallyHidden;
-
- auto broker = std::make_shared<AppletDataBroker>(system);
- applet->caller_applet = caller_applet;
- applet->caller_applet_broker = broker;
- {
- std::scoped_lock lk{caller_applet->lock};
- caller_applet->child_applets.push_back(applet);
- }
- window_system.TrackApplet(applet, false);
- return std::make_shared<ILibraryAppletAccessor>(system, broker, applet);
- }
- // Couldn't initialize the guest process
- return {};
-}
-
-static std::shared_ptr<ILibraryAppletAccessor> CreateFrontendApplet(Core::System& system,
- WindowSystem& window_system,
- std::shared_ptr<Applet> caller_applet,
- AppletId applet_id,
- LibraryAppletMode mode) {
- const auto program_id = static_cast<u64>(AppletIdToProgramId(applet_id));
-
- auto process = std::make_unique<Process>(system);
- auto applet = std::make_shared<Applet>(system, std::move(process), false);
- applet->program_id = program_id;
- applet->applet_id = applet_id;
- applet->type = AppletType::LibraryApplet;
- applet->library_applet_mode = mode;
-
- auto storage = std::make_shared<AppletDataBroker>(system);
- applet->caller_applet = caller_applet;
- applet->caller_applet_broker = storage;
- applet->frontend = system.GetFrontendAppletHolder().GetApplet(applet, applet_id, mode);
- {
- std::scoped_lock lk{caller_applet->lock};
- caller_applet->child_applets.push_back(applet);
- }
- return std::make_shared<ILibraryAppletAccessor>(system, storage, applet);
-}
-
-class ILibraryAppletCreator final : public ServiceFramework<ILibraryAppletCreator> {
-public:
- explicit ILibraryAppletCreator(Core::System& system_, std::shared_ptr<Applet> applet, WindowSystem& window_system)
- : ServiceFramework{system_, "ILibraryAppletCreator"}
- , m_window_system{window_system}, m_applet{std::move(applet)} {
- }
- ~ILibraryAppletCreator() override = default;
-
- Result CreateLibraryApplet(
- Out<SharedPointer<ILibraryAppletAccessor>> out_library_applet_accessor, AppletId applet_id,
- LibraryAppletMode library_applet_mode) {
- LOG_DEBUG(Service_AM, "called with applet_id={} applet_mode={}", applet_id,
- library_applet_mode);
-
- std::shared_ptr<ILibraryAppletAccessor> library_applet;
- if (ShouldCreateGuestApplet(applet_id)) {
- library_applet =
- CreateGuestApplet(system, m_window_system, m_applet, applet_id, library_applet_mode);
- }
- if (!library_applet) {
- library_applet =
- CreateFrontendApplet(system, m_window_system, m_applet, applet_id, library_applet_mode);
- }
- if (!library_applet) {
- LOG_ERROR(Service_AM, "Applet doesn't exist! applet_id={}", applet_id);
- R_THROW(ResultUnknown);
- }
-
- // Applet is created, can now be launched.
- m_applet->library_applet_launchable_event.Signal(system.Kernel());
- *out_library_applet_accessor = library_applet;
- R_SUCCEED();
- }
-
- Result CreateLibraryAppletEx(
- Out<SharedPointer<ILibraryAppletAccessor>> out_library_applet_accessor, AppletId applet_id,
- LibraryAppletMode library_applet_mode, u64 thread_id) {
- LOG_DEBUG(Service_AM, "called with applet_id={} applet_mode={} thread_id={}", applet_id,
- library_applet_mode, thread_id);
-
- std::shared_ptr<ILibraryAppletAccessor> library_applet;
- if (ShouldCreateGuestApplet(applet_id)) {
- library_applet =
- CreateGuestApplet(system, m_window_system, m_applet, applet_id, library_applet_mode);
- }
- if (!library_applet) {
- library_applet =
- CreateFrontendApplet(system, m_window_system, m_applet, applet_id, library_applet_mode);
- }
- if (!library_applet) {
- LOG_ERROR(Service_AM, "Applet doesn't exist! applet_id={}", applet_id);
- R_THROW(ResultUnknown);
- }
-
- // Applet is created, can now be launched.
- m_applet->library_applet_launchable_event.Signal(system.Kernel());
- *out_library_applet_accessor = library_applet;
- R_SUCCEED();
- }
-
- Result CreateStorage(Out<SharedPointer<IStorage>> out_storage, s64 size) {
- LOG_DEBUG(Service_AM, "called, size={}", size);
-
- if (size <= 0) {
- LOG_ERROR(Service_AM, "size is less than or equal to 0");
- R_THROW(ResultUnknown);
- }
-
- *out_storage = std::make_shared<IStorage>(system, AM::CreateStorage(std::vector<u8>(size)));
- R_SUCCEED();
- }
-
- Result CreateTransferMemoryStorage(
- Out<SharedPointer<IStorage>> out_storage, bool is_writable, s64 size,
- InCopyHandle<Kernel::KTransferMemory> transfer_memory_handle) {
- LOG_DEBUG(Service_AM, "called, is_writable={} size={}", is_writable, size);
-
- if (size <= 0) {
- LOG_ERROR(Service_AM, "size is less than or equal to 0");
- R_THROW(ResultUnknown);
- }
-
- if (!transfer_memory_handle) {
- LOG_ERROR(Service_AM, "transfer_memory_handle is null");
- R_THROW(ResultUnknown);
- }
-
- *out_storage = std::make_shared<IStorage>(
- system, AM::CreateTransferMemoryStorage(system.Kernel(), transfer_memory_handle->GetOwner()->GetMemory(),
- transfer_memory_handle.Get(), is_writable, size));
- R_SUCCEED();
- }
-
- Result CreateHandleStorage(
- Out<SharedPointer<IStorage>> out_storage, s64 size,
- InCopyHandle<Kernel::KTransferMemory> transfer_memory_handle) {
- LOG_DEBUG(Service_AM, "called, size={}", size);
-
- if (size <= 0) {
- LOG_ERROR(Service_AM, "size is less than or equal to 0");
- R_THROW(ResultUnknown);
- }
-
- if (!transfer_memory_handle) {
- LOG_ERROR(Service_AM, "transfer_memory_handle is null");
- R_THROW(ResultUnknown);
- }
-
- *out_storage = std::make_shared<IStorage>(
- system, AM::CreateHandleStorage(system.Kernel(), transfer_memory_handle->GetOwner()->GetMemory(),
- transfer_memory_handle.Get(), size));
- R_SUCCEED();
- }
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&ILibraryAppletCreator::CreateLibraryApplet>, "CreateLibraryApplet"},
- FunctionInfo{1, nullptr, "TerminateAllLibraryApplets"},
- FunctionInfo{2, nullptr, "AreAnyLibraryAppletsLeft"},
- FunctionInfo{3, D<&ILibraryAppletCreator::CreateLibraryAppletEx>, "CreateLibraryAppletEx"},
- FunctionInfo{10, D<&ILibraryAppletCreator::CreateStorage>, "CreateStorage"},
- FunctionInfo{11, D<&ILibraryAppletCreator::CreateTransferMemoryStorage>, "CreateTransferMemoryStorage"},
- FunctionInfo{12, D<&ILibraryAppletCreator::CreateHandleStorage>, "CreateHandleStorage"}
- );
- WindowSystem& m_window_system;
- const std::shared_ptr<Applet> m_applet;
-};
-
-class IAllSystemAppletProxiesService final
- : public ServiceFramework<IAllSystemAppletProxiesService> {
-public:
- explicit IAllSystemAppletProxiesService(Core::System& system_, WindowSystem& window_system)
- : ServiceFramework{system_, "appletAE"}, m_window_system{window_system} {
- }
-
- ~IAllSystemAppletProxiesService() override = default;
-
- Result OpenSystemAppletProxy(
- Out<SharedPointer<ISystemAppletProxy>> out_system_applet_proxy, ClientProcessId pid,
- InCopyHandle<Kernel::KProcess> process_handle) {
- LOG_DEBUG(Service_AM, "called");
-
- if (const auto applet = this->GetAppletFromProcessId(pid); applet) {
- *out_system_applet_proxy = std::make_shared<ISystemAppletProxy>(
- system, applet, process_handle.Get(), m_window_system);
- R_SUCCEED();
- } else {
- UNIMPLEMENTED();
- R_THROW(ResultUnknown);
- }
- }
-
- Result OpenLibraryAppletProxy(
- Out<SharedPointer<ILibraryAppletProxy>> out_library_applet_proxy, ClientProcessId pid,
- InCopyHandle<Kernel::KProcess> process_handle,
- InLargeData<AppletAttribute, BufferAttr_HipcMapAlias> attribute) {
- LOG_DEBUG(Service_AM, "called");
-
- if (const auto applet = this->GetAppletFromProcessId(pid); applet) {
- *out_library_applet_proxy = std::make_shared<ILibraryAppletProxy>(
- system, applet, process_handle.Get(), m_window_system);
- R_SUCCEED();
- } else {
- UNIMPLEMENTED();
- R_THROW(ResultUnknown);
- }
- }
-
- Result OpenOverlayAppletProxy(
- Out<SharedPointer<IOverlayAppletProxy>> out_overlay_applet_proxy, ClientProcessId pid,
- InCopyHandle<Kernel::KProcess> process_handle) {
- LOG_WARNING(Service_AM, "called");
-
- if (const auto applet = this->GetAppletFromProcessId(pid); applet) {
- *out_overlay_applet_proxy = std::make_shared<IOverlayAppletProxy>(
- system, applet, process_handle.Get(), m_window_system);
- R_SUCCEED();
- } else {
- UNIMPLEMENTED();
- R_THROW(ResultUnknown);
- }
- }
-
- Result OpenSystemApplicationProxy(
- Out<SharedPointer<IApplicationProxy>> out_system_application_proxy, ClientProcessId pid,
- InCopyHandle<Kernel::KProcess> process_handle) {
- LOG_DEBUG(Service_AM, "called");
-
- if (const auto applet = this->GetAppletFromProcessId(pid); applet) {
- *out_system_application_proxy = std::make_shared<IApplicationProxy>(
- system, applet, process_handle.Get(), m_window_system);
- R_SUCCEED();
- } else {
- UNIMPLEMENTED();
- R_THROW(ResultUnknown);
- }
- }
-
- Result OpenLibraryAppletProxyOld(
- Out<SharedPointer<ILibraryAppletProxy>> out_library_applet_proxy, ClientProcessId pid,
- InCopyHandle<Kernel::KProcess> process_handle) {
- LOG_DEBUG(Service_AM, "called");
-
- AppletAttribute attribute{};
- R_RETURN(this->OpenLibraryAppletProxy(out_library_applet_proxy, pid, process_handle, attribute));
- }
-
- Result GetSystemProcessCommonFunctions() {
- LOG_DEBUG(Service_AM, "(STUBBED) called.");
- // TODO (jarrodnorwell)
- R_SUCCEED();
- }
-
- Result GetAppletAlternativeFunctions() {
- LOG_DEBUG(Service_AM, "(STUBBED) called.");
- // TODO (maufeat)
- R_SUCCEED();
- }
-
- std::shared_ptr<Applet> GetAppletFromProcessId(ProcessId process_id) {
- return m_window_system.GetByAppletResourceUserId(process_id.pid);
- }
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{100, D<&IAllSystemAppletProxiesService::OpenSystemAppletProxy>, "OpenSystemAppletProxy"},
- FunctionInfo{110, D<&IAllSystemAppletProxiesService::OpenSystemAppletProxy>, "OpenSystemAppletProxyEx"},
- FunctionInfo{200, D<&IAllSystemAppletProxiesService::OpenLibraryAppletProxyOld>, "OpenLibraryAppletProxyOld"},
- FunctionInfo{201, D<&IAllSystemAppletProxiesService::OpenLibraryAppletProxy>, "OpenLibraryAppletProxy"},
- FunctionInfo{300, D<&IAllSystemAppletProxiesService::OpenOverlayAppletProxy>, "OpenOverlayAppletProxy"},
- FunctionInfo{350, D<&IAllSystemAppletProxiesService::OpenSystemApplicationProxy>, "OpenSystemApplicationProxy"},
- FunctionInfo{400, nullptr, "CreateSelfLibraryAppletCreatorForDevelop"},
- FunctionInfo{410, nullptr, "GetSystemAppletControllerForDebug"},
- FunctionInfo{450, D<&IAllSystemAppletProxiesService::GetSystemProcessCommonFunctions>, "GetSystemProcessCommonFunctions", MakeVersionGate({19,0,0})},
- FunctionInfo{460, D<&IAllSystemAppletProxiesService::GetAppletAlternativeFunctions>, "GetAppletAlternativeFunctions", MakeVersionGate({20,0,0})},
- FunctionInfo{1000, nullptr, "GetDebugFunctions"}
- );
- WindowSystem& m_window_system;
-};
-
void LoopProcess(Core::System& system) {
WindowSystem window_system(system);
ButtonPoller button_poller(system, window_system);
@@ -1345,8 +21,10 @@ void LoopProcess(Core::System& system) {
auto server_manager = std::make_unique<ServerManager>(system);
- server_manager->RegisterNamedService("appletAE", std::make_shared<IAllSystemAppletProxiesService>(system, window_system));
- server_manager->RegisterNamedService("appletOE", std::make_shared<IApplicationProxyService>(system, window_system));
+ server_manager->RegisterNamedService(
+ "appletAE", std::make_shared<IAllSystemAppletProxiesService>(system, window_system));
+ server_manager->RegisterNamedService(
+ "appletOE", std::make_shared<IApplicationProxyService>(system, window_system));
ServerManager::RunServer(std::move(server_manager));
}
diff --git a/src/core/hle/service/am/am.h b/src/core/hle/service/am/am.h
index 1afe253aed..0bf5880f30 100644
--- a/src/core/hle/service/am/am.h
+++ b/src/core/hle/service/am/am.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/am/applet_manager.h b/src/core/hle/service/am/applet_manager.h
index 2b0714adf7..cd3035de31 100644
--- a/src/core/hle/service/am/applet_manager.h
+++ b/src/core/hle/service/am/applet_manager.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
diff --git a/src/core/hle/service/am/frontend/applet_cabinet.h b/src/core/hle/service/am/frontend/applet_cabinet.h
index 3a211ed372..a74f233569 100644
--- a/src/core/hle/service/am/frontend/applet_cabinet.h
+++ b/src/core/hle/service/am/frontend/applet_cabinet.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/am/frontend/applet_controller.h b/src/core/hle/service/am/frontend/applet_controller.h
index 341ebed234..3877a7b02e 100644
--- a/src/core/hle/service/am/frontend/applet_controller.h
+++ b/src/core/hle/service/am/frontend/applet_controller.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
diff --git a/src/core/hle/service/am/frontend/applet_error.h b/src/core/hle/service/am/frontend/applet_error.h
index 678bf33fac..af3e2134a5 100644
--- a/src/core/hle/service/am/frontend/applet_error.h
+++ b/src/core/hle/service/am/frontend/applet_error.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/am/frontend/applet_general.h b/src/core/hle/service/am/frontend/applet_general.h
index eaa7ae25fe..ceb0537119 100644
--- a/src/core/hle/service/am/frontend/applet_general.h
+++ b/src/core/hle/service/am/frontend/applet_general.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/am/frontend/applet_mii_edit.h b/src/core/hle/service/am/frontend/applet_mii_edit.h
index 5db792f7d2..8654426431 100644
--- a/src/core/hle/service/am/frontend/applet_mii_edit.h
+++ b/src/core/hle/service/am/frontend/applet_mii_edit.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/am/frontend/applet_mii_edit_types.h b/src/core/hle/service/am/frontend/applet_mii_edit_types.h
index 23d9d7a69b..9c354bd947 100644
--- a/src/core/hle/service/am/frontend/applet_mii_edit_types.h
+++ b/src/core/hle/service/am/frontend/applet_mii_edit_types.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/am/frontend/applet_net_connect.h b/src/core/hle/service/am/frontend/applet_net_connect.h
index d5d503ed41..0986b63c60 100644
--- a/src/core/hle/service/am/frontend/applet_net_connect.h
+++ b/src/core/hle/service/am/frontend/applet_net_connect.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
diff --git a/src/core/hle/service/am/frontend/applet_profile_select.cpp b/src/core/hle/service/am/frontend/applet_profile_select.cpp
index 89b5a1eabe..0f46ee6232 100644
--- a/src/core/hle/service/am/frontend/applet_profile_select.cpp
+++ b/src/core/hle/service/am/frontend/applet_profile_select.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/am/frontend/applet_profile_select.h b/src/core/hle/service/am/frontend/applet_profile_select.h
index 674e7afe17..4feba73a37 100644
--- a/src/core/hle/service/am/frontend/applet_profile_select.h
+++ b/src/core/hle/service/am/frontend/applet_profile_select.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/am/frontend/applet_software_keyboard_types.h b/src/core/hle/service/am/frontend/applet_software_keyboard_types.h
index a25ff2a6d2..6bb8f437d3 100644
--- a/src/core/hle/service/am/frontend/applet_software_keyboard_types.h
+++ b/src/core/hle/service/am/frontend/applet_software_keyboard_types.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/am/frontend/applet_web_browser.h b/src/core/hle/service/am/frontend/applet_web_browser.h
index ae62389f13..41461a93d0 100644
--- a/src/core/hle/service/am/frontend/applet_web_browser.h
+++ b/src/core/hle/service/am/frontend/applet_web_browser.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
diff --git a/src/core/hle/service/am/frontend/applets.h b/src/core/hle/service/am/frontend/applets.h
index 8eb08ea77b..6259a5668a 100644
--- a/src/core/hle/service/am/frontend/applets.h
+++ b/src/core/hle/service/am/frontend/applets.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
diff --git a/src/core/hle/service/am/process_holder.cpp b/src/core/hle/service/am/process_holder.cpp
index 21ef5bf838..8ad6599fd6 100644
--- a/src/core/hle/service/am/process_holder.cpp
+++ b/src/core/hle/service/am/process_holder.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/am/process_holder.h b/src/core/hle/service/am/process_holder.h
index 3a9b81dfb4..dbf04668dc 100644
--- a/src/core/hle/service/am/process_holder.h
+++ b/src/core/hle/service/am/process_holder.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/am/service/all_system_applet_proxies_service.cpp b/src/core/hle/service/am/service/all_system_applet_proxies_service.cpp
new file mode 100644
index 0000000000..437032c2f4
--- /dev/null
+++ b/src/core/hle/service/am/service/all_system_applet_proxies_service.cpp
@@ -0,0 +1,135 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/core.h"
+#include "core/hle/service/am/applet_manager.h"
+#include "core/hle/service/am/service/all_system_applet_proxies_service.h"
+#include "core/hle/service/am/service/application_proxy.h"
+#include "core/hle/service/am/service/library_applet_proxy.h"
+#include "core/hle/service/am/service/system_applet_proxy.h"
+#include "core/hle/service/am/service/overlay_applet_proxy.h"
+#include "core/hle/service/am/window_system.h"
+#include "core/hle/service/cmif_serialization.h"
+
+namespace Service::AM {
+
+IAllSystemAppletProxiesService::IAllSystemAppletProxiesService(Core::System& system_,
+ WindowSystem& window_system)
+ : ServiceFramework{system_, "appletAE"}, m_window_system{window_system} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {100, D<&IAllSystemAppletProxiesService::OpenSystemAppletProxy>, "OpenSystemAppletProxy"},
+ {110, D<&IAllSystemAppletProxiesService::OpenSystemAppletProxy>, "OpenSystemAppletProxyEx"},
+ {200, D<&IAllSystemAppletProxiesService::OpenLibraryAppletProxyOld>, "OpenLibraryAppletProxyOld"},
+ {201, D<&IAllSystemAppletProxiesService::OpenLibraryAppletProxy>, "OpenLibraryAppletProxy"},
+ {300, D<&IAllSystemAppletProxiesService::OpenOverlayAppletProxy>, "OpenOverlayAppletProxy"},
+ {350, D<&IAllSystemAppletProxiesService::OpenSystemApplicationProxy>, "OpenSystemApplicationProxy"},
+ {400, nullptr, "CreateSelfLibraryAppletCreatorForDevelop"},
+ {410, nullptr, "GetSystemAppletControllerForDebug"},
+ {450, D<&IAllSystemAppletProxiesService::GetSystemProcessCommonFunctions>, "GetSystemProcessCommonFunctions"}, // 19.0.0+
+ {460, D<&IAllSystemAppletProxiesService::GetAppletAlternativeFunctions>, "GetAppletAlternativeFunctions"}, // 20.0.0+
+ {1000, nullptr, "GetDebugFunctions"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
+IAllSystemAppletProxiesService::~IAllSystemAppletProxiesService() = default;
+
+Result IAllSystemAppletProxiesService::OpenSystemAppletProxy(
+ Out<SharedPointer<ISystemAppletProxy>> out_system_applet_proxy, ClientProcessId pid,
+ InCopyHandle<Kernel::KProcess> process_handle) {
+ LOG_DEBUG(Service_AM, "called");
+
+ if (const auto applet = this->GetAppletFromProcessId(pid); applet) {
+ *out_system_applet_proxy = std::make_shared<ISystemAppletProxy>(
+ system, applet, process_handle.Get(), m_window_system);
+ R_SUCCEED();
+ } else {
+ UNIMPLEMENTED();
+ R_THROW(ResultUnknown);
+ }
+}
+
+Result IAllSystemAppletProxiesService::OpenLibraryAppletProxy(
+ Out<SharedPointer<ILibraryAppletProxy>> out_library_applet_proxy, ClientProcessId pid,
+ InCopyHandle<Kernel::KProcess> process_handle,
+ InLargeData<AppletAttribute, BufferAttr_HipcMapAlias> attribute) {
+ LOG_DEBUG(Service_AM, "called");
+
+ if (const auto applet = this->GetAppletFromProcessId(pid); applet) {
+ *out_library_applet_proxy = std::make_shared<ILibraryAppletProxy>(
+ system, applet, process_handle.Get(), m_window_system);
+ R_SUCCEED();
+ } else {
+ UNIMPLEMENTED();
+ R_THROW(ResultUnknown);
+ }
+}
+
+Result IAllSystemAppletProxiesService::OpenOverlayAppletProxy(
+ Out<SharedPointer<IOverlayAppletProxy>> out_overlay_applet_proxy, ClientProcessId pid,
+ InCopyHandle<Kernel::KProcess> process_handle) {
+ LOG_WARNING(Service_AM, "called");
+
+ if (const auto applet = this->GetAppletFromProcessId(pid); applet) {
+ *out_overlay_applet_proxy = std::make_shared<IOverlayAppletProxy>(
+ system, applet, process_handle.Get(), m_window_system);
+ R_SUCCEED();
+ } else {
+ UNIMPLEMENTED();
+ R_THROW(ResultUnknown);
+ }
+}
+
+Result IAllSystemAppletProxiesService::OpenSystemApplicationProxy(
+ Out<SharedPointer<IApplicationProxy>> out_system_application_proxy, ClientProcessId pid,
+ InCopyHandle<Kernel::KProcess> process_handle) {
+ LOG_DEBUG(Service_AM, "called");
+
+ if (const auto applet = this->GetAppletFromProcessId(pid); applet) {
+ *out_system_application_proxy = std::make_shared<IApplicationProxy>(
+ system, applet, process_handle.Get(), m_window_system);
+ R_SUCCEED();
+ } else {
+ UNIMPLEMENTED();
+ R_THROW(ResultUnknown);
+ }
+}
+
+Result IAllSystemAppletProxiesService::OpenLibraryAppletProxyOld(
+ Out<SharedPointer<ILibraryAppletProxy>> out_library_applet_proxy, ClientProcessId pid,
+ InCopyHandle<Kernel::KProcess> process_handle) {
+ LOG_DEBUG(Service_AM, "called");
+
+ AppletAttribute attribute{};
+ R_RETURN(
+ this->OpenLibraryAppletProxy(out_library_applet_proxy, pid, process_handle, attribute));
+}
+
+Result IAllSystemAppletProxiesService::GetSystemProcessCommonFunctions() {
+ LOG_DEBUG(Service_AM, "(STUBBED) called.");
+
+ // TODO (jarrodnorwell)
+
+ R_SUCCEED();
+}
+
+Result IAllSystemAppletProxiesService::GetAppletAlternativeFunctions() {
+ LOG_DEBUG(Service_AM, "(STUBBED) called.");
+
+ // TODO (maufeat)
+
+ R_SUCCEED();
+}
+
+std::shared_ptr<Applet> IAllSystemAppletProxiesService::GetAppletFromProcessId(
+ ProcessId process_id) {
+ return m_window_system.GetByAppletResourceUserId(process_id.pid);
+}
+
+} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/all_system_applet_proxies_service.h b/src/core/hle/service/am/service/all_system_applet_proxies_service.h
new file mode 100644
index 0000000000..73cb8a09ac
--- /dev/null
+++ b/src/core/hle/service/am/service/all_system_applet_proxies_service.h
@@ -0,0 +1,56 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/service.h"
+#include "core/hle/service/am/service/overlay_applet_proxy.h"
+
+namespace Service {
+
+namespace AM {
+
+struct Applet;
+struct AppletAttribute;
+class IApplicationProxy;
+class ILibraryAppletProxy;
+class ISystemAppletProxy;
+class WindowSystem;
+
+class IAllSystemAppletProxiesService final
+ : public ServiceFramework<IAllSystemAppletProxiesService> {
+public:
+ explicit IAllSystemAppletProxiesService(Core::System& system_, WindowSystem& window_system);
+ ~IAllSystemAppletProxiesService() override;
+
+private:
+ Result OpenSystemAppletProxy(Out<SharedPointer<ISystemAppletProxy>> out_system_applet_proxy,
+ ClientProcessId pid,
+ InCopyHandle<Kernel::KProcess> process_handle);
+ Result OpenLibraryAppletProxy(Out<SharedPointer<ILibraryAppletProxy>> out_library_applet_proxy,
+ ClientProcessId pid,
+ InCopyHandle<Kernel::KProcess> process_handle,
+ InLargeData<AppletAttribute, BufferAttr_HipcMapAlias> attribute);
+ Result OpenOverlayAppletProxy(Out<SharedPointer<IOverlayAppletProxy>> out_overlay_applet_proxy,
+ ClientProcessId pid, InCopyHandle<Kernel::KProcess> process_handle);
+ Result OpenLibraryAppletProxyOld(
+ Out<SharedPointer<ILibraryAppletProxy>> out_library_applet_proxy, ClientProcessId pid,
+ InCopyHandle<Kernel::KProcess> process_handle);
+ Result OpenSystemApplicationProxy(
+ Out<SharedPointer<IApplicationProxy>> out_system_application_proxy, ClientProcessId pid,
+ InCopyHandle<Kernel::KProcess> process_handle);
+ Result GetSystemProcessCommonFunctions();
+ Result GetAppletAlternativeFunctions();
+
+private:
+ std::shared_ptr<Applet> GetAppletFromProcessId(ProcessId pid);
+
+ WindowSystem& m_window_system;
+};
+
+} // namespace AM
+} // namespace Service
diff --git a/src/core/hle/service/am/service/applet_common_functions.cpp b/src/core/hle/service/am/service/applet_common_functions.cpp
new file mode 100644
index 0000000000..5ffec23b3e
--- /dev/null
+++ b/src/core/hle/service/am/service/applet_common_functions.cpp
@@ -0,0 +1,98 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/core.h"
+#include "core/file_sys/common_funcs.h"
+#include "core/hle/service/am/applet.h"
+#include "core/hle/service/am/service/applet_common_functions.h"
+#include "core/hle/service/cmif_serialization.h"
+
+namespace Service::AM {
+
+IAppletCommonFunctions::IAppletCommonFunctions(Core::System& system_,
+ std::shared_ptr<Applet> applet_)
+ : ServiceFramework{system_, "IAppletCommonFunctions"}, applet{std::move(applet_)} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "SetTerminateResult"},
+ {10, nullptr, "ReadThemeStorage"},
+ {11, nullptr, "WriteThemeStorage"},
+ {20, nullptr, "PushToAppletBoundChannel"},
+ {21, nullptr, "TryPopFromAppletBoundChannel"},
+ {40, nullptr, "GetDisplayLogicalResolution"},
+ {42, D<&IAppletCommonFunctions::SetDisplayMagnification>, "SetDisplayMagnification"},
+ {50, D<&IAppletCommonFunctions::SetHomeButtonDoubleClickEnabled>, "SetHomeButtonDoubleClickEnabled"},
+ {51, D<&IAppletCommonFunctions::GetHomeButtonDoubleClickEnabled>, "GetHomeButtonDoubleClickEnabled"},
+ {52, nullptr, "IsHomeButtonShortPressedBlocked"},
+ {60, nullptr, "IsVrModeCurtainRequired"},
+ {61, nullptr, "IsSleepRequiredByHighTemperature"},
+ {62, nullptr, "IsSleepRequiredByLowBattery"},
+ {70, D<&IAppletCommonFunctions::SetCpuBoostRequestPriority>, "SetCpuBoostRequestPriority"},
+ {80, nullptr, "SetHandlingCaptureButtonShortPressedMessageEnabledForApplet"},
+ {81, nullptr, "SetHandlingCaptureButtonLongPressedMessageEnabledForApplet"},
+ {90, nullptr, "OpenNamedChannelAsParent"},
+ {91, nullptr, "OpenNamedChannelAsChild"},
+ {100, nullptr, "SetApplicationCoreUsageMode"},
+ {300, D<&IAppletCommonFunctions::GetCurrentApplicationId>, "GetCurrentApplicationId"},
+ {310, nullptr, "IsSystemAppletHomeMenu"}, //19.0.0+
+ {320, D<&IAppletCommonFunctions::SetGpuTimeSliceBoost>, "SetGpuTimeSliceBoost"}, //19.0.0+
+ {321, nullptr, "SetGpuTimeSliceBoostDueToApplication"}, //19.0.0+
+ {350, D<&IAppletCommonFunctions::Unknown350>, "Unknown350"} //20.0.0+
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
+IAppletCommonFunctions::~IAppletCommonFunctions() = default;
+
+Result IAppletCommonFunctions::SetHomeButtonDoubleClickEnabled(
+ bool home_button_double_click_enabled) {
+ LOG_WARNING(Service_AM, "(STUBBED) called, home_button_double_click_enabled={}",
+ home_button_double_click_enabled);
+ R_SUCCEED();
+}
+
+Result IAppletCommonFunctions::GetHomeButtonDoubleClickEnabled(
+ Out<bool> out_home_button_double_click_enabled) {
+ LOG_WARNING(Service_AM, "(STUBBED) called");
+ *out_home_button_double_click_enabled = false;
+ R_SUCCEED();
+}
+
+Result IAppletCommonFunctions::SetDisplayMagnification(f32 x, f32 y, f32 width, f32 height) {
+ LOG_DEBUG(Service_AM, "(STUBBED) called, x={}, y={}, width={}, height={}", x, y, width,
+ height);
+ std::scoped_lock lk{applet->lock};
+ applet->display_magnification = Common::Rectangle<f32>{x, y, x + width, y + height};
+ R_SUCCEED();
+}
+
+Result IAppletCommonFunctions::SetCpuBoostRequestPriority(s32 priority) {
+ LOG_WARNING(Service_AM, "(STUBBED) called");
+ std::scoped_lock lk{applet->lock};
+ applet->cpu_boost_request_priority = priority;
+ R_SUCCEED();
+}
+
+Result IAppletCommonFunctions::GetCurrentApplicationId(Out<u64> out_application_id) {
+ LOG_WARNING(Service_AM, "(STUBBED) called");
+ *out_application_id = FileSys::GetBaseTitleID(system.GetApplicationProcessProgramID());
+ R_SUCCEED();
+}
+
+Result IAppletCommonFunctions::SetGpuTimeSliceBoost(s64 time_span) {
+ LOG_WARNING(Service_AM, "(STUBBED) called, time_span={}", time_span);
+ R_SUCCEED();
+}
+
+Result IAppletCommonFunctions::Unknown350(Out<u16> out_unknown) {
+ LOG_WARNING(Service_AM, "(STUBBED) called");
+ *out_unknown = 0;
+ R_SUCCEED();
+}
+
+} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/applet_common_functions.h b/src/core/hle/service/am/service/applet_common_functions.h
new file mode 100644
index 0000000000..696fcd5bd1
--- /dev/null
+++ b/src/core/hle/service/am/service/applet_common_functions.h
@@ -0,0 +1,33 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/service.h"
+
+namespace Service::AM {
+
+struct Applet;
+
+class IAppletCommonFunctions final : public ServiceFramework<IAppletCommonFunctions> {
+public:
+ explicit IAppletCommonFunctions(Core::System& system_, std::shared_ptr<Applet> applet_);
+ ~IAppletCommonFunctions() override;
+
+private:
+ Result SetHomeButtonDoubleClickEnabled(bool home_button_double_click_enabled);
+ Result GetHomeButtonDoubleClickEnabled(Out<bool> out_home_button_double_click_enabled);
+ Result SetDisplayMagnification(f32 x, f32 y, f32 width, f32 height);
+ Result SetCpuBoostRequestPriority(s32 priority);
+ Result GetCurrentApplicationId(Out<u64> out_application_id);
+ Result SetGpuTimeSliceBoost(s64 time_span);
+ Result Unknown350(Out<u16> out_unknown);
+
+ const std::shared_ptr<Applet> applet;
+};
+
+} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/application_accessor.cpp b/src/core/hle/service/am/service/application_accessor.cpp
index d24c2616dc..f357871706 100644
--- a/src/core/hle/service/am/service/application_accessor.cpp
+++ b/src/core/hle/service/am/service/application_accessor.cpp
@@ -18,42 +18,42 @@
namespace Service::AM {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IApplicationAccessor::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IApplicationAccessor::GetAppletStateChangedEvent>, "GetAppletStateChangedEvent"},
- FunctionInfo{1, nullptr, "IsCompleted"},
- FunctionInfo{10, D<&IApplicationAccessor::Start>, "Start"},
- FunctionInfo{20, D<&IApplicationAccessor::RequestExit>, "RequestExit"},
- FunctionInfo{25, D<&IApplicationAccessor::Terminate>, "Terminate"},
- FunctionInfo{30, D<&IApplicationAccessor::GetResult>, "GetResult"},
- FunctionInfo{101, D<&IApplicationAccessor::RequestForApplicationToGetForeground>, "RequestForApplicationToGetForeground"},
- FunctionInfo{110, nullptr, "TerminateAllLibraryApplets"},
- FunctionInfo{111, nullptr, "AreAnyLibraryAppletsLeft"},
- FunctionInfo{112, D<&IApplicationAccessor::GetCurrentLibraryApplet>, "GetCurrentLibraryApplet"},
- FunctionInfo{120, nullptr, "GetApplicationId"},
- FunctionInfo{121, D<&IApplicationAccessor::PushLaunchParameter>, "PushLaunchParameter"},
- FunctionInfo{122, D<&IApplicationAccessor::GetApplicationControlProperty>, "GetApplicationControlProperty"},
- FunctionInfo{123, nullptr, "GetApplicationLaunchProperty"},
- FunctionInfo{124, nullptr, "GetApplicationLaunchRequestInfo"},
- FunctionInfo{130, D<&IApplicationAccessor::SetUsers>, "SetUsers"},
- FunctionInfo{131, D<&IApplicationAccessor::CheckRightsEnvironmentAvailable>, "CheckRightsEnvironmentAvailable"},
- FunctionInfo{132, D<&IApplicationAccessor::GetNsRightsEnvironmentHandle>, "GetNsRightsEnvironmentHandle"},
- FunctionInfo{140, nullptr, "GetDesirableUids"},
- FunctionInfo{150, D<&IApplicationAccessor::ReportApplicationExitTimeout>, "ReportApplicationExitTimeout"},
- FunctionInfo{160, nullptr, "SetApplicationAttribute"},
- FunctionInfo{170, nullptr, "HasSaveDataAccessPermission"},
- FunctionInfo{180, nullptr, "PushToFriendInvitationStorageChannel"},
- FunctionInfo{190, nullptr, "PushToNotificationStorageChannel"},
- FunctionInfo{200, nullptr, "RequestApplicationSoftReset"},
- FunctionInfo{201, nullptr, "RestartApplicationTimer"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IApplicationAccessor::IApplicationAccessor(Core::System& system_, std::shared_ptr<Applet> applet,
WindowSystem& window_system)
: ServiceFramework{system_, "IApplicationAccessor"}, m_window_system(window_system),
m_applet(std::move(applet)) {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IApplicationAccessor::GetAppletStateChangedEvent>, "GetAppletStateChangedEvent"},
+ {1, nullptr, "IsCompleted"},
+ {10, D<&IApplicationAccessor::Start>, "Start"},
+ {20, D<&IApplicationAccessor::RequestExit>, "RequestExit"},
+ {25, D<&IApplicationAccessor::Terminate>, "Terminate"},
+ {30, D<&IApplicationAccessor::GetResult>, "GetResult"},
+ {101, D<&IApplicationAccessor::RequestForApplicationToGetForeground>, "RequestForApplicationToGetForeground"},
+ {110, nullptr, "TerminateAllLibraryApplets"},
+ {111, nullptr, "AreAnyLibraryAppletsLeft"},
+ {112, D<&IApplicationAccessor::GetCurrentLibraryApplet>, "GetCurrentLibraryApplet"},
+ {120, nullptr, "GetApplicationId"},
+ {121, D<&IApplicationAccessor::PushLaunchParameter>, "PushLaunchParameter"},
+ {122, D<&IApplicationAccessor::GetApplicationControlProperty>, "GetApplicationControlProperty"},
+ {123, nullptr, "GetApplicationLaunchProperty"},
+ {124, nullptr, "GetApplicationLaunchRequestInfo"},
+ {130, D<&IApplicationAccessor::SetUsers>, "SetUsers"},
+ {131, D<&IApplicationAccessor::CheckRightsEnvironmentAvailable>, "CheckRightsEnvironmentAvailable"},
+ {132, D<&IApplicationAccessor::GetNsRightsEnvironmentHandle>, "GetNsRightsEnvironmentHandle"},
+ {140, nullptr, "GetDesirableUids"},
+ {150, D<&IApplicationAccessor::ReportApplicationExitTimeout>, "ReportApplicationExitTimeout"},
+ {160, nullptr, "SetApplicationAttribute"},
+ {170, nullptr, "HasSaveDataAccessPermission"},
+ {180, nullptr, "PushToFriendInvitationStorageChannel"},
+ {190, nullptr, "PushToNotificationStorageChannel"},
+ {200, nullptr, "RequestApplicationSoftReset"},
+ {201, nullptr, "RestartApplicationTimer"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IApplicationAccessor::~IApplicationAccessor() = default;
diff --git a/src/core/hle/service/am/service/application_accessor.h b/src/core/hle/service/am/service/application_accessor.h
index 57b222fc19..7908099916 100644
--- a/src/core/hle/service/am/service/application_accessor.h
+++ b/src/core/hle/service/am/service/application_accessor.h
@@ -39,7 +39,6 @@ private:
Result GetNsRightsEnvironmentHandle(Out<u64> out_handle);
Result ReportApplicationExitTimeout();
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
WindowSystem& m_window_system;
const std::shared_ptr<Applet> m_applet;
};
diff --git a/src/core/hle/service/am/service/application_creator.cpp b/src/core/hle/service/am/service/application_creator.cpp
index 8d57f917fb..4eb2f29e22 100644
--- a/src/core/hle/service/am/service/application_creator.cpp
+++ b/src/core/hle/service/am/service/application_creator.cpp
@@ -20,16 +20,6 @@
namespace Service::AM {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IApplicationCreator::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IApplicationCreator::CreateApplication>, "CreateApplication"},
- FunctionInfo{1, nullptr, "PopLaunchRequestedApplication"},
- FunctionInfo{10, D<&IApplicationCreator::CreateSystemApplication>, "CreateSystemApplication"},
- FunctionInfo{100, nullptr, "PopFloatingApplicationForDevelopment"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
namespace {
Result CreateGuestApplication(SharedPointer<IApplicationAccessor>* out_application_accessor, Core::System& system, WindowSystem& window_system, u64 program_id) {
@@ -64,6 +54,16 @@ Result CreateGuestApplication(SharedPointer<IApplicationAccessor>* out_applicati
IApplicationCreator::IApplicationCreator(Core::System& system_, WindowSystem& window_system)
: ServiceFramework{system_, "IApplicationCreator"}, m_window_system{window_system} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IApplicationCreator::CreateApplication>, "CreateApplication"},
+ {1, nullptr, "PopLaunchRequestedApplication"},
+ {10, D<&IApplicationCreator::CreateSystemApplication>, "CreateSystemApplication"},
+ {100, nullptr, "PopFloatingApplicationForDevelopment"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IApplicationCreator::~IApplicationCreator() = default;
diff --git a/src/core/hle/service/am/service/application_creator.h b/src/core/hle/service/am/service/application_creator.h
index 64434af542..59ae924131 100644
--- a/src/core/hle/service/am/service/application_creator.h
+++ b/src/core/hle/service/am/service/application_creator.h
@@ -24,7 +24,6 @@ private:
Result CreateApplication(Out<SharedPointer<IApplicationAccessor>>, u64 application_id);
Result CreateSystemApplication(Out<SharedPointer<IApplicationAccessor>>, u64 application_id);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
WindowSystem& m_window_system;
};
diff --git a/src/core/hle/service/am/service/application_functions.cpp b/src/core/hle/service/am/service/application_functions.cpp
index 4fda5eedd6..90d292c4a2 100644
--- a/src/core/hle/service/am/service/application_functions.cpp
+++ b/src/core/hle/service/am/service/application_functions.cpp
@@ -51,84 +51,83 @@ FileSys::PatchManager::Metadata GetApplicationMetadata(Core::System& system, u64
} // Anonymous namespace
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IApplicationFunctions::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{1, D<&IApplicationFunctions::PopLaunchParameter>, "PopLaunchParameter"},
- FunctionInfo{10, nullptr, "CreateApplicationAndPushAndRequestToStart"},
- FunctionInfo{11, nullptr, "CreateApplicationAndPushAndRequestToStartForQuest"},
- FunctionInfo{12, D<&IApplicationFunctions::CreateApplicationAndRequestToStart>, "CreateApplicationAndRequestToStart"},
- FunctionInfo{13, nullptr, "CreateApplicationAndRequestToStartForQuest"},
- FunctionInfo{14, nullptr, "CreateApplicationWithAttributeAndPushAndRequestToStartForQuest"},
- FunctionInfo{15, nullptr, "CreateApplicationWithAttributeAndRequestToStartForQuest"},
- FunctionInfo{20, D<&IApplicationFunctions::EnsureSaveData>, "EnsureSaveData"},
- FunctionInfo{21, D<&IApplicationFunctions::GetDesiredLanguage>, "GetDesiredLanguage"},
- FunctionInfo{22, D<&IApplicationFunctions::SetTerminateResult>, "SetTerminateResult"},
- FunctionInfo{23, D<&IApplicationFunctions::GetDisplayVersion>, "GetDisplayVersion"},
- FunctionInfo{24, nullptr, "GetLaunchStorageInfoForDebug"},
- FunctionInfo{25, D<&IApplicationFunctions::ExtendSaveData>, "ExtendSaveData"},
- FunctionInfo{26, D<&IApplicationFunctions::GetSaveDataSize>, "GetSaveDataSize"},
- FunctionInfo{27, D<&IApplicationFunctions::CreateCacheStorage>, "CreateCacheStorage"},
- FunctionInfo{28, D<&IApplicationFunctions::GetSaveDataSizeMax>, "GetSaveDataSizeMax"},
- FunctionInfo{29, D<&IApplicationFunctions::GetCacheStorageMax>, "GetCacheStorageMax"},
- FunctionInfo{30, D<&IApplicationFunctions::BeginBlockingHomeButtonShortAndLongPressed>, "BeginBlockingHomeButtonShortAndLongPressed"},
- FunctionInfo{31, D<&IApplicationFunctions::EndBlockingHomeButtonShortAndLongPressed>, "EndBlockingHomeButtonShortAndLongPressed"},
- FunctionInfo{32, D<&IApplicationFunctions::BeginBlockingHomeButton>, "BeginBlockingHomeButton"},
- FunctionInfo{33, D<&IApplicationFunctions::EndBlockingHomeButton>, "EndBlockingHomeButton"},
- FunctionInfo{34, nullptr, "SelectApplicationLicense"},
- FunctionInfo{35, nullptr, "GetDeviceSaveDataSizeMax"},
- FunctionInfo{36, nullptr, "GetLimitedApplicationLicense"},
- FunctionInfo{37, nullptr, "GetLimitedApplicationLicenseUpgradableEvent"},
- FunctionInfo{40, D<&IApplicationFunctions::NotifyRunning>, "NotifyRunning"},
- FunctionInfo{50, D<&IApplicationFunctions::GetPseudoDeviceId>, "GetPseudoDeviceId"},
- FunctionInfo{60, D<&IApplicationFunctions::SetMediaPlaybackStateForApplication>, "SetMediaPlaybackStateForApplication"},
- FunctionInfo{65, D<&IApplicationFunctions::IsGamePlayRecordingSupported>, "IsGamePlayRecordingSupported"},
- FunctionInfo{66, D<&IApplicationFunctions::InitializeGamePlayRecording>, "InitializeGamePlayRecording"},
- FunctionInfo{67, D<&IApplicationFunctions::SetGamePlayRecordingState>, "SetGamePlayRecordingState"},
- FunctionInfo{68, nullptr, "RequestFlushGamePlayingMovieForDebug"},
- FunctionInfo{70, nullptr, "RequestToShutdown"},
- FunctionInfo{71, nullptr, "RequestToReboot"},
- FunctionInfo{72, nullptr, "RequestToSleep"},
- FunctionInfo{80, nullptr, "ExitAndRequestToShowThanksMessage"},
- FunctionInfo{90, D<&IApplicationFunctions::EnableApplicationCrashReport>, "EnableApplicationCrashReport"},
- FunctionInfo{100, D<&IApplicationFunctions::InitializeApplicationCopyrightFrameBuffer>, "InitializeApplicationCopyrightFrameBuffer"},
- FunctionInfo{101, D<&IApplicationFunctions::SetApplicationCopyrightImage>, "SetApplicationCopyrightImage"},
- FunctionInfo{102, D<&IApplicationFunctions::SetApplicationCopyrightVisibility>, "SetApplicationCopyrightVisibility"},
- FunctionInfo{110, D<&IApplicationFunctions::QueryApplicationPlayStatistics>, "QueryApplicationPlayStatistics"},
- FunctionInfo{111, D<&IApplicationFunctions::QueryApplicationPlayStatisticsByUid>, "QueryApplicationPlayStatisticsByUid"},
- FunctionInfo{120, D<&IApplicationFunctions::ExecuteProgram>, "ExecuteProgram"},
- FunctionInfo{121, D<&IApplicationFunctions::ClearUserChannel>, "ClearUserChannel"},
- FunctionInfo{122, D<&IApplicationFunctions::UnpopToUserChannel>, "UnpopToUserChannel"},
- FunctionInfo{123, D<&IApplicationFunctions::GetPreviousProgramIndex>, "GetPreviousProgramIndex"},
- FunctionInfo{124, nullptr, "EnableApplicationAllThreadDumpOnCrash"},
- FunctionInfo{130, D<&IApplicationFunctions::GetGpuErrorDetectedSystemEvent>, "GetGpuErrorDetectedSystemEvent"},
- FunctionInfo{131, nullptr, "SetDelayTimeToAbortOnGpuError"},
- FunctionInfo{140, D<&IApplicationFunctions::GetFriendInvitationStorageChannelEvent>, "GetFriendInvitationStorageChannelEvent"},
- FunctionInfo{141, D<&IApplicationFunctions::TryPopFromFriendInvitationStorageChannel>, "TryPopFromFriendInvitationStorageChannel"},
- FunctionInfo{150, D<&IApplicationFunctions::GetNotificationStorageChannelEvent>, "GetNotificationStorageChannelEvent"},
- FunctionInfo{151, nullptr, "TryPopFromNotificationStorageChannel"},
- FunctionInfo{160, D<&IApplicationFunctions::GetHealthWarningDisappearedSystemEvent>, "GetHealthWarningDisappearedSystemEvent"},
- FunctionInfo{170, nullptr, "SetHdcpAuthenticationActivated"},
- FunctionInfo{180, nullptr, "GetLaunchRequiredVersion"},
- FunctionInfo{181, nullptr, "UpgradeLaunchRequiredVersion"},
- FunctionInfo{190, nullptr, "SendServerMaintenanceOverlayNotification"},
- FunctionInfo{200, nullptr, "GetLastApplicationExitReason"},
- FunctionInfo{210, D<&IApplicationFunctions::GetUnknownEvent210>, "Unknown210"},
- FunctionInfo{220, nullptr, "Unknown220"}, // [20.0.0+]
- FunctionInfo{300, nullptr, "CreateMovieWriter"}, // [19.0.0+]
- FunctionInfo{310, nullptr, "Unknown310"}, // [20.0.0+]
- FunctionInfo{320, nullptr, "Unknown320"}, // [20.0.0+]
- FunctionInfo{330, D<&IApplicationFunctions::Unknown330>, "Unknown330"}, // [20.0.0+]
- FunctionInfo{500, nullptr, "StartContinuousRecordingFlushForDebug"},
- FunctionInfo{1000, nullptr, "CreateMovieMaker"},
- FunctionInfo{1001, D<&IApplicationFunctions::PrepareForJit>, "PrepareForJit"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IApplicationFunctions::IApplicationFunctions(Core::System& system_, std::shared_ptr<Applet> applet)
- : ServiceFramework{system_, "IApplicationFunctions"}
- , m_applet{std::move(applet)}
-{}
+ : ServiceFramework{system_, "IApplicationFunctions"}, m_applet{std::move(applet)} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {1, D<&IApplicationFunctions::PopLaunchParameter>, "PopLaunchParameter"},
+ {10, nullptr, "CreateApplicationAndPushAndRequestToStart"},
+ {11, nullptr, "CreateApplicationAndPushAndRequestToStartForQuest"},
+ {12, D<&IApplicationFunctions::CreateApplicationAndRequestToStart>, "CreateApplicationAndRequestToStart"},
+ {13, nullptr, "CreateApplicationAndRequestToStartForQuest"},
+ {14, nullptr, "CreateApplicationWithAttributeAndPushAndRequestToStartForQuest"},
+ {15, nullptr, "CreateApplicationWithAttributeAndRequestToStartForQuest"},
+ {20, D<&IApplicationFunctions::EnsureSaveData>, "EnsureSaveData"},
+ {21, D<&IApplicationFunctions::GetDesiredLanguage>, "GetDesiredLanguage"},
+ {22, D<&IApplicationFunctions::SetTerminateResult>, "SetTerminateResult"},
+ {23, D<&IApplicationFunctions::GetDisplayVersion>, "GetDisplayVersion"},
+ {24, nullptr, "GetLaunchStorageInfoForDebug"},
+ {25, D<&IApplicationFunctions::ExtendSaveData>, "ExtendSaveData"},
+ {26, D<&IApplicationFunctions::GetSaveDataSize>, "GetSaveDataSize"},
+ {27, D<&IApplicationFunctions::CreateCacheStorage>, "CreateCacheStorage"},
+ {28, D<&IApplicationFunctions::GetSaveDataSizeMax>, "GetSaveDataSizeMax"},
+ {29, D<&IApplicationFunctions::GetCacheStorageMax>, "GetCacheStorageMax"},
+ {30, D<&IApplicationFunctions::BeginBlockingHomeButtonShortAndLongPressed>, "BeginBlockingHomeButtonShortAndLongPressed"},
+ {31, D<&IApplicationFunctions::EndBlockingHomeButtonShortAndLongPressed>, "EndBlockingHomeButtonShortAndLongPressed"},
+ {32, D<&IApplicationFunctions::BeginBlockingHomeButton>, "BeginBlockingHomeButton"},
+ {33, D<&IApplicationFunctions::EndBlockingHomeButton>, "EndBlockingHomeButton"},
+ {34, nullptr, "SelectApplicationLicense"},
+ {35, nullptr, "GetDeviceSaveDataSizeMax"},
+ {36, nullptr, "GetLimitedApplicationLicense"},
+ {37, nullptr, "GetLimitedApplicationLicenseUpgradableEvent"},
+ {40, D<&IApplicationFunctions::NotifyRunning>, "NotifyRunning"},
+ {50, D<&IApplicationFunctions::GetPseudoDeviceId>, "GetPseudoDeviceId"},
+ {60, D<&IApplicationFunctions::SetMediaPlaybackStateForApplication>, "SetMediaPlaybackStateForApplication"},
+ {65, D<&IApplicationFunctions::IsGamePlayRecordingSupported>, "IsGamePlayRecordingSupported"},
+ {66, D<&IApplicationFunctions::InitializeGamePlayRecording>, "InitializeGamePlayRecording"},
+ {67, D<&IApplicationFunctions::SetGamePlayRecordingState>, "SetGamePlayRecordingState"},
+ {68, nullptr, "RequestFlushGamePlayingMovieForDebug"},
+ {70, nullptr, "RequestToShutdown"},
+ {71, nullptr, "RequestToReboot"},
+ {72, nullptr, "RequestToSleep"},
+ {80, nullptr, "ExitAndRequestToShowThanksMessage"},
+ {90, D<&IApplicationFunctions::EnableApplicationCrashReport>, "EnableApplicationCrashReport"},
+ {100, D<&IApplicationFunctions::InitializeApplicationCopyrightFrameBuffer>, "InitializeApplicationCopyrightFrameBuffer"},
+ {101, D<&IApplicationFunctions::SetApplicationCopyrightImage>, "SetApplicationCopyrightImage"},
+ {102, D<&IApplicationFunctions::SetApplicationCopyrightVisibility>, "SetApplicationCopyrightVisibility"},
+ {110, D<&IApplicationFunctions::QueryApplicationPlayStatistics>, "QueryApplicationPlayStatistics"},
+ {111, D<&IApplicationFunctions::QueryApplicationPlayStatisticsByUid>, "QueryApplicationPlayStatisticsByUid"},
+ {120, D<&IApplicationFunctions::ExecuteProgram>, "ExecuteProgram"},
+ {121, D<&IApplicationFunctions::ClearUserChannel>, "ClearUserChannel"},
+ {122, D<&IApplicationFunctions::UnpopToUserChannel>, "UnpopToUserChannel"},
+ {123, D<&IApplicationFunctions::GetPreviousProgramIndex>, "GetPreviousProgramIndex"},
+ {124, nullptr, "EnableApplicationAllThreadDumpOnCrash"},
+ {130, D<&IApplicationFunctions::GetGpuErrorDetectedSystemEvent>, "GetGpuErrorDetectedSystemEvent"},
+ {131, nullptr, "SetDelayTimeToAbortOnGpuError"},
+ {140, D<&IApplicationFunctions::GetFriendInvitationStorageChannelEvent>, "GetFriendInvitationStorageChannelEvent"},
+ {141, D<&IApplicationFunctions::TryPopFromFriendInvitationStorageChannel>, "TryPopFromFriendInvitationStorageChannel"},
+ {150, D<&IApplicationFunctions::GetNotificationStorageChannelEvent>, "GetNotificationStorageChannelEvent"},
+ {151, nullptr, "TryPopFromNotificationStorageChannel"},
+ {160, D<&IApplicationFunctions::GetHealthWarningDisappearedSystemEvent>, "GetHealthWarningDisappearedSystemEvent"},
+ {170, nullptr, "SetHdcpAuthenticationActivated"},
+ {180, nullptr, "GetLaunchRequiredVersion"},
+ {181, nullptr, "UpgradeLaunchRequiredVersion"},
+ {190, nullptr, "SendServerMaintenanceOverlayNotification"},
+ {200, nullptr, "GetLastApplicationExitReason"},
+ {210, D<&IApplicationFunctions::GetUnknownEvent210>, "Unknown210"},
+ {220, nullptr, "Unknown220"}, // [20.0.0+]
+ {300, nullptr, "CreateMovieWriter"}, // [19.0.0+]
+ {310, nullptr, "Unknown310"}, // [20.0.0+]
+ {320, nullptr, "Unknown320"}, // [20.0.0+]
+ {330, D<&IApplicationFunctions::Unknown330>, "Unknown330"}, // [20.0.0+]
+ {500, nullptr, "StartContinuousRecordingFlushForDebug"},
+ {1000, nullptr, "CreateMovieMaker"},
+ {1001, D<&IApplicationFunctions::PrepareForJit>, "PrepareForJit"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
IApplicationFunctions::~IApplicationFunctions() = default;
diff --git a/src/core/hle/service/am/service/application_functions.h b/src/core/hle/service/am/service/application_functions.h
index 7093d13f82..b97ed7e25e 100644
--- a/src/core/hle/service/am/service/application_functions.h
+++ b/src/core/hle/service/am/service/application_functions.h
@@ -84,7 +84,6 @@ private:
Result GetUnknownEvent210(OutCopyHandle<Kernel::KReadableEvent> out_event);
Result Unknown330(Out<u8> out);
Result PrepareForJit();
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
const std::shared_ptr<Applet> m_applet;
};
diff --git a/src/core/hle/service/am/service/application_proxy.cpp b/src/core/hle/service/am/service/application_proxy.cpp
new file mode 100644
index 0000000000..df438e1e17
--- /dev/null
+++ b/src/core/hle/service/am/service/application_proxy.cpp
@@ -0,0 +1,109 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/am/service/applet_common_functions.h"
+#include "core/hle/service/am/service/application_functions.h"
+#include "core/hle/service/am/service/application_proxy.h"
+#include "core/hle/service/am/service/audio_controller.h"
+#include "core/hle/service/am/service/common_state_getter.h"
+#include "core/hle/service/am/service/debug_functions.h"
+#include "core/hle/service/am/service/display_controller.h"
+#include "core/hle/service/am/service/library_applet_creator.h"
+#include "core/hle/service/am/service/process_winding_controller.h"
+#include "core/hle/service/am/service/self_controller.h"
+#include "core/hle/service/am/service/window_controller.h"
+#include "core/hle/service/cmif_serialization.h"
+
+namespace Service::AM {
+
+IApplicationProxy::IApplicationProxy(Core::System& system_, std::shared_ptr<Applet> applet,
+ Kernel::KProcess* process, WindowSystem& window_system)
+ : ServiceFramework{system_, "IApplicationProxy"},
+ m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IApplicationProxy::GetCommonStateGetter>, "GetCommonStateGetter"},
+ {1, D<&IApplicationProxy::GetSelfController>, "GetSelfController"},
+ {2, D<&IApplicationProxy::GetWindowController>, "GetWindowController"},
+ {3, D<&IApplicationProxy::GetAudioController>, "GetAudioController"},
+ {4, D<&IApplicationProxy::GetDisplayController>, "GetDisplayController"},
+ {10, D<&IApplicationProxy::GetProcessWindingController>, "GetProcessWindingController"},
+ {11, D<&IApplicationProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"},
+ {20, D<&IApplicationProxy::GetApplicationFunctions>, "GetApplicationFunctions"},
+ {1000, D<&IApplicationProxy::GetDebugFunctions>, "GetDebugFunctions"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
+IApplicationProxy::~IApplicationProxy() = default;
+
+Result IApplicationProxy::GetAudioController(
+ Out<SharedPointer<IAudioController>> out_audio_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_audio_controller = std::make_shared<IAudioController>(system);
+ R_SUCCEED();
+}
+
+Result IApplicationProxy::GetDisplayController(
+ Out<SharedPointer<IDisplayController>> out_display_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_display_controller = std::make_shared<IDisplayController>(system, m_applet);
+ R_SUCCEED();
+}
+
+Result IApplicationProxy::GetProcessWindingController(
+ Out<SharedPointer<IProcessWindingController>> out_process_winding_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_process_winding_controller = std::make_shared<IProcessWindingController>(system, m_applet);
+ R_SUCCEED();
+}
+
+Result IApplicationProxy::GetDebugFunctions(
+ Out<SharedPointer<IDebugFunctions>> out_debug_functions) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_debug_functions = std::make_shared<IDebugFunctions>(system);
+ R_SUCCEED();
+}
+
+Result IApplicationProxy::GetWindowController(
+ Out<SharedPointer<IWindowController>> out_window_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_window_controller = std::make_shared<IWindowController>(system, m_applet, m_window_system);
+ R_SUCCEED();
+}
+
+Result IApplicationProxy::GetSelfController(
+ Out<SharedPointer<ISelfController>> out_self_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_self_controller = std::make_shared<ISelfController>(system, m_applet, m_process);
+ R_SUCCEED();
+}
+
+Result IApplicationProxy::GetCommonStateGetter(
+ Out<SharedPointer<ICommonStateGetter>> out_common_state_getter) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_common_state_getter = std::make_shared<ICommonStateGetter>(system, m_applet);
+ R_SUCCEED();
+}
+
+Result IApplicationProxy::GetLibraryAppletCreator(
+ Out<SharedPointer<ILibraryAppletCreator>> out_library_applet_creator) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_library_applet_creator =
+ std::make_shared<ILibraryAppletCreator>(system, m_applet, m_window_system);
+ R_SUCCEED();
+}
+
+Result IApplicationProxy::GetApplicationFunctions(
+ Out<SharedPointer<IApplicationFunctions>> out_application_functions) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_application_functions = std::make_shared<IApplicationFunctions>(system, m_applet);
+ R_SUCCEED();
+}
+
+} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/application_proxy.h b/src/core/hle/service/am/service/application_proxy.h
new file mode 100644
index 0000000000..b56f597605
--- /dev/null
+++ b/src/core/hle/service/am/service/application_proxy.h
@@ -0,0 +1,52 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/service.h"
+
+namespace Service::AM {
+
+struct Applet;
+class IAudioController;
+class IApplicationFunctions;
+class ICommonStateGetter;
+class IDebugFunctions;
+class IDisplayController;
+class ILibraryAppletCreator;
+class IProcessWindingController;
+class ISelfController;
+class IWindowController;
+class WindowSystem;
+
+class IApplicationProxy final : public ServiceFramework<IApplicationProxy> {
+public:
+ explicit IApplicationProxy(Core::System& system_, std::shared_ptr<Applet> applet,
+ Kernel::KProcess* process, WindowSystem& window_system);
+ ~IApplicationProxy();
+
+private:
+ Result GetAudioController(Out<SharedPointer<IAudioController>> out_audio_controller);
+ Result GetDisplayController(Out<SharedPointer<IDisplayController>> out_display_controller);
+ Result GetProcessWindingController(
+ Out<SharedPointer<IProcessWindingController>> out_process_winding_controller);
+ Result GetDebugFunctions(Out<SharedPointer<IDebugFunctions>> out_debug_functions);
+ Result GetWindowController(Out<SharedPointer<IWindowController>> out_window_controller);
+ Result GetSelfController(Out<SharedPointer<ISelfController>> out_self_controller);
+ Result GetCommonStateGetter(Out<SharedPointer<ICommonStateGetter>> out_common_state_getter);
+ Result GetLibraryAppletCreator(
+ Out<SharedPointer<ILibraryAppletCreator>> out_library_applet_creator);
+ Result GetApplicationFunctions(
+ Out<SharedPointer<IApplicationFunctions>> out_application_functions);
+
+private:
+ WindowSystem& m_window_system;
+ Kernel::KProcess* const m_process;
+ const std::shared_ptr<Applet> m_applet;
+};
+
+} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/application_proxy_service.cpp b/src/core/hle/service/am/service/application_proxy_service.cpp
new file mode 100644
index 0000000000..7727951d8c
--- /dev/null
+++ b/src/core/hle/service/am/service/application_proxy_service.cpp
@@ -0,0 +1,47 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/core.h"
+#include "core/hle/service/am/am.h"
+#include "core/hle/service/am/applet_manager.h"
+#include "core/hle/service/am/service/application_proxy.h"
+#include "core/hle/service/am/service/application_proxy_service.h"
+#include "core/hle/service/am/window_system.h"
+#include "core/hle/service/cmif_serialization.h"
+
+namespace Service::AM {
+
+IApplicationProxyService::IApplicationProxyService(Core::System& system_,
+ WindowSystem& window_system)
+ : ServiceFramework{system_, "appletOE"}, m_window_system{window_system} {
+ static const FunctionInfo functions[] = {
+ {0, D<&IApplicationProxyService::OpenApplicationProxy>, "OpenApplicationProxy"},
+ };
+ RegisterHandlers(functions);
+}
+
+IApplicationProxyService::~IApplicationProxyService() = default;
+
+Result IApplicationProxyService::OpenApplicationProxy(
+ Out<SharedPointer<IApplicationProxy>> out_application_proxy, ClientProcessId pid,
+ InCopyHandle<Kernel::KProcess> process_handle) {
+ LOG_DEBUG(Service_AM, "called");
+
+ if (const auto applet = this->GetAppletFromProcessId(pid)) {
+ *out_application_proxy = std::make_shared<IApplicationProxy>(
+ system, applet, process_handle.Get(), m_window_system);
+ R_SUCCEED();
+ } else {
+ UNIMPLEMENTED();
+ R_THROW(ResultUnknown);
+ }
+}
+
+std::shared_ptr<Applet> IApplicationProxyService::GetAppletFromProcessId(ProcessId process_id) {
+ return m_window_system.GetByAppletResourceUserId(process_id.pid);
+}
+
+} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/application_proxy_service.h b/src/core/hle/service/am/service/application_proxy_service.h
new file mode 100644
index 0000000000..fce860a7c1
--- /dev/null
+++ b/src/core/hle/service/am/service/application_proxy_service.h
@@ -0,0 +1,36 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/service.h"
+
+namespace Service {
+
+namespace AM {
+
+struct Applet;
+class IApplicationProxy;
+class WindowSystem;
+
+class IApplicationProxyService final : public ServiceFramework<IApplicationProxyService> {
+public:
+ explicit IApplicationProxyService(Core::System& system_, WindowSystem& window_system);
+ ~IApplicationProxyService() override;
+
+private:
+ Result OpenApplicationProxy(Out<SharedPointer<IApplicationProxy>> out_application_proxy,
+ ClientProcessId pid, InCopyHandle<Kernel::KProcess> process_handle);
+
+private:
+ std::shared_ptr<Applet> GetAppletFromProcessId(ProcessId pid);
+
+ WindowSystem& m_window_system;
+};
+
+} // namespace AM
+} // namespace Service
diff --git a/src/core/hle/service/am/service/audio_controller.cpp b/src/core/hle/service/am/service/audio_controller.cpp
index 2c8494e056..4e9af756f2 100644
--- a/src/core/hle/service/am/service/audio_controller.cpp
+++ b/src/core/hle/service/am/service/audio_controller.cpp
@@ -9,20 +9,20 @@
namespace Service::AM {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IAudioController::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IAudioController::SetExpectedMasterVolume>, "SetExpectedMasterVolume"},
- FunctionInfo{1, D<&IAudioController::GetMainAppletExpectedMasterVolume>, "GetMainAppletExpectedMasterVolume"},
- FunctionInfo{2, D<&IAudioController::GetLibraryAppletExpectedMasterVolume>, "GetLibraryAppletExpectedMasterVolume"},
- FunctionInfo{3, D<&IAudioController::ChangeMainAppletMasterVolume>, "ChangeMainAppletMasterVolume"},
- FunctionInfo{4, D<&IAudioController::SetTransparentVolumeRate>, "SetTransparentVolumeRate"},
- FunctionInfo{5, nullptr, "Unknown5", MakeVersionGate({20,0,0})}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IAudioController::IAudioController(Core::System& system_)
: ServiceFramework{system_, "IAudioController"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IAudioController::SetExpectedMasterVolume>, "SetExpectedMasterVolume"},
+ {1, D<&IAudioController::GetMainAppletExpectedMasterVolume>, "GetMainAppletExpectedMasterVolume"},
+ {2, D<&IAudioController::GetLibraryAppletExpectedMasterVolume>, "GetLibraryAppletExpectedMasterVolume"},
+ {3, D<&IAudioController::ChangeMainAppletMasterVolume>, "ChangeMainAppletMasterVolume"},
+ {4, D<&IAudioController::SetTransparentVolumeRate>, "SetTransparentVolumeRate"},
+ {5, nullptr, "Unknown5"}, //20.0.0+
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IAudioController::~IAudioController() = default;
diff --git a/src/core/hle/service/am/service/audio_controller.h b/src/core/hle/service/am/service/audio_controller.h
index 9cdb33820d..a13f3b199b 100644
--- a/src/core/hle/service/am/service/audio_controller.h
+++ b/src/core/hle/service/am/service/audio_controller.h
@@ -23,7 +23,6 @@ private:
Result ChangeMainAppletMasterVolume(f32 volume, s64 fade_time_ns);
Result SetTransparentVolumeRate(f32 transparent_volume_rate);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
static constexpr float MinAllowedVolume = 0.0f;
static constexpr float MaxAllowedVolume = 1.0f;
diff --git a/src/core/hle/service/am/service/common_state_getter.cpp b/src/core/hle/service/am/service/common_state_getter.cpp
index 6a6a51f42e..044929e434 100644
--- a/src/core/hle/service/am/service/common_state_getter.cpp
+++ b/src/core/hle/service/am/service/common_state_getter.cpp
@@ -8,6 +8,7 @@
#include "core/hle/service/am/am_results.h"
#include "core/hle/service/am/applet.h"
#include "core/hle/service/am/service/common_state_getter.h"
+#include "core/hle/service/am/service/lock_accessor.h"
#include "core/hle/service/am/service/storage.h"
#include "core/hle/service/apm/apm_interface.h"
#include "core/hle/service/cmif_serialization.h"
@@ -17,147 +18,77 @@
namespace Service::AM {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> ICommonStateGetter::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&ICommonStateGetter::GetEventHandle>, "GetEventHandle"},
- FunctionInfo{1, D<&ICommonStateGetter::ReceiveMessage>, "ReceiveMessage"},
- FunctionInfo{2, nullptr, "GetThisAppletKind"},
- FunctionInfo{3, nullptr, "AllowToEnterSleep"},
- FunctionInfo{4, nullptr, "DisallowToEnterSleep"},
- FunctionInfo{5, D<&ICommonStateGetter::GetOperationMode>, "GetOperationMode"},
- FunctionInfo{6, D<&ICommonStateGetter::GetPerformanceMode>, "GetPerformanceMode"},
- FunctionInfo{7, nullptr, "GetCradleStatus"},
- FunctionInfo{8, D<&ICommonStateGetter::GetBootMode>, "GetBootMode"},
- FunctionInfo{9, D<&ICommonStateGetter::GetCurrentFocusState>, "GetCurrentFocusState"},
- FunctionInfo{10, D<&ICommonStateGetter::RequestToAcquireSleepLock>, "RequestToAcquireSleepLock"},
- FunctionInfo{11, D<&ICommonStateGetter::ReleaseSleepLock>, "ReleaseSleepLock"},
- FunctionInfo{12, D<&ICommonStateGetter::ReleaseSleepLockTransiently>, "ReleaseSleepLockTransiently"},
- FunctionInfo{13, D<&ICommonStateGetter::GetAcquiredSleepLockEvent>, "GetAcquiredSleepLockEvent"},
- FunctionInfo{14, nullptr, "GetWakeupCount", MakeVersionGate({11,0,0})},
- FunctionInfo{15, nullptr, "Unknown15", MakeVersionGate({19,0,0})},
- FunctionInfo{20, D<&ICommonStateGetter::PushToGeneralChannel>, "PushToGeneralChannel"},
- FunctionInfo{30, D<&ICommonStateGetter::GetHomeButtonReaderLockAccessor>, "GetHomeButtonReaderLockAccessor"},
- FunctionInfo{31, D<&ICommonStateGetter::GetReaderLockAccessorEx>, "GetReaderLockAccessorEx", MakeVersionGate({2,0,0})},
- FunctionInfo{32, D<&ICommonStateGetter::GetWriterLockAccessorEx>, "GetWriterLockAccessorEx", MakeVersionGate({7,0,0})},
- FunctionInfo{40, nullptr, "GetCradleFwVersion", MakeVersionGate({2,0,0})},
- FunctionInfo{50, D<&ICommonStateGetter::IsVrModeEnabled>, "IsVrModeEnabled", MakeVersionGate({3,0,0})},
- FunctionInfo{51, D<&ICommonStateGetter::SetVrModeEnabled>, "SetVrModeEnabled", MakeVersionGate({3,0,0})},
- FunctionInfo{52, D<&ICommonStateGetter::SetLcdBacklighOffEnabled>, "SetLcdBacklighOffEnabled", MakeVersionGate({4,0,0})},
- FunctionInfo{53, D<&ICommonStateGetter::BeginVrModeEx>, "BeginVrModeEx", MakeVersionGate({7,0,0})},
- FunctionInfo{54, D<&ICommonStateGetter::EndVrModeEx>, "EndVrModeEx", MakeVersionGate({7,0,0})},
- FunctionInfo{55, D<&ICommonStateGetter::IsInControllerFirmwareUpdateSection>, "IsInControllerFirmwareUpdateSection", MakeVersionGate({3,0,0})},
- FunctionInfo{59, nullptr, "SetVrPositionForDebug", MakeVersionGate({1,0,0})},
- FunctionInfo{60, D<&ICommonStateGetter::GetDefaultDisplayResolution>, "GetDefaultDisplayResolution"},
- FunctionInfo{61, D<&ICommonStateGetter::GetDefaultDisplayResolutionChangeEvent>, "GetDefaultDisplayResolutionChangeEvent"},
- FunctionInfo{62, D<&ICommonStateGetter::GetHdcpAuthenticationState>, "GetHdcpAuthenticationState"},
- FunctionInfo{63, D<&ICommonStateGetter::GetHdcpAuthenticationStateChangeEvent>, "GetHdcpAuthenticationStateChangeEvent"},
- FunctionInfo{64, nullptr, "SetTvPowerStateMatchingMode"},
- FunctionInfo{65, nullptr, "GetApplicationIdByContentActionName"},
- FunctionInfo{66, &ICommonStateGetter::SetCpuBoostMode, "SetCpuBoostMode"},
- FunctionInfo{67, nullptr, "CancelCpuBoostMode"},
- FunctionInfo{68, D<&ICommonStateGetter::GetBuiltInDisplayType>, "GetBuiltInDisplayType"},
- FunctionInfo{80, D<&ICommonStateGetter::PerformSystemButtonPressingIfInFocus>, "PerformSystemButtonPressingIfInFocus"},
- FunctionInfo{90, nullptr, "SetPerformanceConfigurationChangedNotification"},
- FunctionInfo{91, nullptr, "GetCurrentPerformanceConfiguration"},
- FunctionInfo{100, D<&ICommonStateGetter::SetHandlingHomeButtonShortPressedEnabled>, "SetHandlingHomeButtonShortPressedEnabled"},
- FunctionInfo{110, nullptr, "OpenMyGpuErrorHandler"},
- FunctionInfo{120, D<&ICommonStateGetter::GetAppletLaunchedHistory>, "GetAppletLaunchedHistory", MakeVersionGate({13,0,0})},
- FunctionInfo{130, D<&ICommonStateGetter::EnableStartupLogoDisappearedMessage>, "EnableStartupLogoDisappearedMessage", MakeVersionGate({21,0,0})},
- FunctionInfo{200, D<&ICommonStateGetter::GetOperationModeSystemInfo>, "GetOperationModeSystemInfo"},
- FunctionInfo{300, D<&ICommonStateGetter::GetSettingsPlatformRegion>, "GetSettingsPlatformRegion"},
- FunctionInfo{400, nullptr, "ActivateMigrationService"},
- FunctionInfo{401, nullptr, "DeactivateMigrationService"},
- FunctionInfo{500, nullptr, "DisableSleepTillShutdown"},
- FunctionInfo{501, nullptr, "SuppressDisablingSleepTemporarily"},
- FunctionInfo{502, nullptr, "IsSleepEnabled"},
- FunctionInfo{503, nullptr, "IsDisablingSleepSuppressed"},
- FunctionInfo{600, nullptr, "SetHidInputMagnificationForApplication", MakeVersionGate({20,0,0})},
- FunctionInfo{610, D<&ICommonStateGetter::Unknown610>, "Unknown610", MakeVersionGate({21,0,0})},
- FunctionInfo{611, D<&ICommonStateGetter::Unknown611>, "Unknown611", MakeVersionGate({22,0,0})},
- FunctionInfo{900, D<&ICommonStateGetter::SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled>, "SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled", MakeVersionGate({11,0,0})},
- FunctionInfo{910, nullptr, "GetLaunchRequiredTick", MakeVersionGate({17,0,0})},
- FunctionInfo{1000, D<&ICommonStateGetter::BeginVrMode3d>, "BeginVrMode3d", MakeVersionGate({19,0,0})},
- FunctionInfo{1001, D<&ICommonStateGetter::EndVrMode3d>, "EndVrMode3d", MakeVersionGate({19,0,0})},
- FunctionInfo{1002, D<&ICommonStateGetter::IsVrModeEnabled3d>, "IsVrModeEnabled3d", MakeVersionGate({19,0,0})},
- FunctionInfo{1003, D<&ICommonStateGetter::GetVrLaboGoggleViewport>, "GetVrLaboGoggleViewport", MakeVersionGate({21,0,0})},
- FunctionInfo{1004, D<&ICommonStateGetter::GetPanelPhysicalSizeForSpecificTitle>, "GetPanelPhysicalSizeForSpecificTitle", MakeVersionGate({21,0,0})},
- FunctionInfo{1005, D<&ICommonStateGetter::GetPanelResolutionForSpecificTitle>, "GetPanelResolutionForSpecificTitle", MakeVersionGate({21,0,0})}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
-class ILockAccessor final : public ServiceFramework<ILockAccessor> {
-public:
- explicit ILockAccessor(Core::System& system_)
- : ServiceFramework{system_, "ILockAccessor"}, m_context{system_, "ILockAccessor"},
- m_event{m_context} {
- m_event.Signal(system.Kernel());
- }
- ~ILockAccessor() override = default;
-
- Result TryLock(Out<bool> out_is_locked, OutCopyHandle<Kernel::KReadableEvent> out_handle, bool return_handle) {
- LOG_INFO(Service_AM, "called, return_handle={}", return_handle);
-
- {
- std::scoped_lock lk{m_mutex};
- if (m_is_locked) {
- *out_is_locked = false;
- } else {
- m_is_locked = true;
- *out_is_locked = true;
- }
- }
-
- if (return_handle) {
- *out_handle = m_event.GetHandle();
- }
-
- R_SUCCEED();
- }
-
- Result Unlock() {
- LOG_INFO(Service_AM, "called");
-
- {
- std::scoped_lock lk{m_mutex};
- m_is_locked = false;
- }
-
- m_event.Signal(system.Kernel());
- R_SUCCEED();
- }
-
- Result GetEvent(OutCopyHandle<Kernel::KReadableEvent> out_handle) {
- LOG_INFO(Service_AM, "called");
- *out_handle = m_event.GetHandle();
- R_SUCCEED();
- }
-
- Result IsLocked(Out<bool> out_is_locked) {
- LOG_INFO(Service_AM, "called");
- std::scoped_lock lk{m_mutex};
- *out_is_locked = m_is_locked;
- R_SUCCEED();
- }
-
-private:
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{1, D<&ILockAccessor::TryLock>, "TryLock"},
- FunctionInfo{2, D<&ILockAccessor::Unlock>, "Unlock"},
- FunctionInfo{3, D<&ILockAccessor::GetEvent>, "GetEvent"},
- FunctionInfo{4, D<&ILockAccessor::IsLocked>, "IsLocked"}
- );
- KernelHelpers::ServiceContext m_context;
- Event m_event;
- std::mutex m_mutex{};
- bool m_is_locked{};
-};
-
ICommonStateGetter::ICommonStateGetter(Core::System& system_, std::shared_ptr<Applet> applet)
: ServiceFramework{system_, "ICommonStateGetter"}, m_applet{std::move(applet)} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&ICommonStateGetter::GetEventHandle>, "GetEventHandle"},
+ {1, D<&ICommonStateGetter::ReceiveMessage>, "ReceiveMessage"},
+ {2, nullptr, "GetThisAppletKind"},
+ {3, nullptr, "AllowToEnterSleep"},
+ {4, nullptr, "DisallowToEnterSleep"},
+ {5, D<&ICommonStateGetter::GetOperationMode>, "GetOperationMode"},
+ {6, D<&ICommonStateGetter::GetPerformanceMode>, "GetPerformanceMode"},
+ {7, nullptr, "GetCradleStatus"},
+ {8, D<&ICommonStateGetter::GetBootMode>, "GetBootMode"},
+ {9, D<&ICommonStateGetter::GetCurrentFocusState>, "GetCurrentFocusState"},
+ {10, D<&ICommonStateGetter::RequestToAcquireSleepLock>, "RequestToAcquireSleepLock"},
+ {11, D<&ICommonStateGetter::ReleaseSleepLock>, "ReleaseSleepLock"},
+ {12, D<&ICommonStateGetter::ReleaseSleepLockTransiently>, "ReleaseSleepLockTransiently"},
+ {13, D<&ICommonStateGetter::GetAcquiredSleepLockEvent>, "GetAcquiredSleepLockEvent"},
+ {14, nullptr, "GetWakeupCount"}, //11.0.0+
+ {15, nullptr, "Unknown15"}, //19.0.0+
+ {20, D<&ICommonStateGetter::PushToGeneralChannel>, "PushToGeneralChannel"},
+ {30, D<&ICommonStateGetter::GetHomeButtonReaderLockAccessor>, "GetHomeButtonReaderLockAccessor"},
+ {31, D<&ICommonStateGetter::GetReaderLockAccessorEx>, "GetReaderLockAccessorEx"}, //2.0.0+
+ {32, D<&ICommonStateGetter::GetWriterLockAccessorEx>, "GetWriterLockAccessorEx"}, //7.0.0+
+ {40, nullptr, "GetCradleFwVersion"}, //2.0.0+
+ {50, D<&ICommonStateGetter::IsVrModeEnabled>, "IsVrModeEnabled"}, //3.0.0+
+ {51, D<&ICommonStateGetter::SetVrModeEnabled>, "SetVrModeEnabled"}, //3.0.0+
+ {52, D<&ICommonStateGetter::SetLcdBacklighOffEnabled>, "SetLcdBacklighOffEnabled"}, //4.0.0+
+ {53, D<&ICommonStateGetter::BeginVrModeEx>, "BeginVrModeEx"}, //7.0.0+
+ {54, D<&ICommonStateGetter::EndVrModeEx>, "EndVrModeEx"}, //7.0.0+
+ {55, D<&ICommonStateGetter::IsInControllerFirmwareUpdateSection>, "IsInControllerFirmwareUpdateSection"}, //3.0.0+
+ {59, nullptr, "SetVrPositionForDebug"}, //1.0.0+
+ {60, D<&ICommonStateGetter::GetDefaultDisplayResolution>, "GetDefaultDisplayResolution"},
+ {61, D<&ICommonStateGetter::GetDefaultDisplayResolutionChangeEvent>, "GetDefaultDisplayResolutionChangeEvent"},
+ {62, D<&ICommonStateGetter::GetHdcpAuthenticationState>, "GetHdcpAuthenticationState"},
+ {63, D<&ICommonStateGetter::GetHdcpAuthenticationStateChangeEvent>, "GetHdcpAuthenticationStateChangeEvent"},
+ {64, nullptr, "SetTvPowerStateMatchingMode"},
+ {65, nullptr, "GetApplicationIdByContentActionName"},
+ {66, &ICommonStateGetter::SetCpuBoostMode, "SetCpuBoostMode"},
+ {67, nullptr, "CancelCpuBoostMode"},
+ {68, D<&ICommonStateGetter::GetBuiltInDisplayType>, "GetBuiltInDisplayType"},
+ {80, D<&ICommonStateGetter::PerformSystemButtonPressingIfInFocus>, "PerformSystemButtonPressingIfInFocus"},
+ {90, nullptr, "SetPerformanceConfigurationChangedNotification"},
+ {91, nullptr, "GetCurrentPerformanceConfiguration"},
+ {100, D<&ICommonStateGetter::SetHandlingHomeButtonShortPressedEnabled>, "SetHandlingHomeButtonShortPressedEnabled"},
+ {110, nullptr, "OpenMyGpuErrorHandler"},
+ {120, D<&ICommonStateGetter::GetAppletLaunchedHistory>, "GetAppletLaunchedHistory"}, //13.0.0+
+ {130, D<&ICommonStateGetter::EnableStartupLogoDisappearedMessage>, "EnableStartupLogoDisappearedMessage"}, //21.0.0+
+ {200, D<&ICommonStateGetter::GetOperationModeSystemInfo>, "GetOperationModeSystemInfo"},
+ {300, D<&ICommonStateGetter::GetSettingsPlatformRegion>, "GetSettingsPlatformRegion"},
+ {400, nullptr, "ActivateMigrationService"},
+ {401, nullptr, "DeactivateMigrationService"},
+ {500, nullptr, "DisableSleepTillShutdown"},
+ {501, nullptr, "SuppressDisablingSleepTemporarily"},
+ {502, nullptr, "IsSleepEnabled"},
+ {503, nullptr, "IsDisablingSleepSuppressed"},
+ {600, nullptr, "SetHidInputMagnificationForApplication"}, //20.0.0+
+ {610, D<&ICommonStateGetter::Unknown610>, "Unknown610"}, //21.0.0+
+ {611, D<&ICommonStateGetter::Unknown611>, "Unknown611"}, //22.0.0+
+ {900, D<&ICommonStateGetter::SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled>, "SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled"}, //11.0.0+
+ {910, nullptr, "GetLaunchRequiredTick"}, //17.0.0+
+ {1000, D<&ICommonStateGetter::BeginVrMode3d>, "BeginVrMode3d"}, //19.0.0+
+ {1001, D<&ICommonStateGetter::EndVrMode3d>, "EndVrMode3d"}, //19.0.0+
+ {1002, D<&ICommonStateGetter::IsVrModeEnabled3d>, "IsVrModeEnabled3d"}, //19.0.0+
+ {1003, D<&ICommonStateGetter::GetVrLaboGoggleViewport>, "GetVrLaboGoggleViewport"}, //21.0.0+
+ {1004, D<&ICommonStateGetter::GetPanelPhysicalSizeForSpecificTitle>, "GetPanelPhysicalSizeForSpecificTitle"}, //21.0.0+
+ {1005, D<&ICommonStateGetter::GetPanelResolutionForSpecificTitle>, "GetPanelResolutionForSpecificTitle"}, //21.0.0+
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
ICommonStateGetter::~ICommonStateGetter() = default;
diff --git a/src/core/hle/service/am/service/common_state_getter.h b/src/core/hle/service/am/service/common_state_getter.h
index ad782ca48e..da86b5d079 100644
--- a/src/core/hle/service/am/service/common_state_getter.h
+++ b/src/core/hle/service/am/service/common_state_getter.h
@@ -76,7 +76,6 @@ private:
void SetCpuBoostMode(HLERequestContext& ctx);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
const std::shared_ptr<Applet> m_applet;
};
diff --git a/src/core/hle/service/am/service/cradle_firmware_updater.cpp b/src/core/hle/service/am/service/cradle_firmware_updater.cpp
index a8097ea209..b9f19e59d2 100644
--- a/src/core/hle/service/am/service/cradle_firmware_updater.cpp
+++ b/src/core/hle/service/am/service/cradle_firmware_updater.cpp
@@ -9,21 +9,22 @@
namespace Service::AM {
- std::optional<ServiceFrameworkBase::FunctionInfoBase> ICradleFirmwareUpdater::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&ICradleFirmwareUpdater::StartUpdate>, "StartUpdate"},
- FunctionInfo{1, D<&ICradleFirmwareUpdater::FinishUpdate>, "FinishUpdate"},
- FunctionInfo{2, D<&ICradleFirmwareUpdater::GetCradleDeviceInfo>, "GetCradleDeviceInfo"},
- FunctionInfo{3, D<&ICradleFirmwareUpdater::GetCradleDeviceInfoChangeEvent>, "GetCradleDeviceInfoChangeEvent"},
- FunctionInfo{4, nullptr, "GetUpdateProgressInfo"},
- FunctionInfo{5, nullptr, "GetLastInternalResult"}
- );
- return HandlerTableGenerateWithFind(key, functions);
- }
-
ICradleFirmwareUpdater::ICradleFirmwareUpdater(Core::System& system_)
: ServiceFramework{system_, "ICradleFirmwareUpdater"},
m_context{system, "ICradleFirmwareUpdater"}, m_cradle_device_info_event{m_context} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&ICradleFirmwareUpdater::StartUpdate>, "StartUpdate"},
+ {1, D<&ICradleFirmwareUpdater::FinishUpdate>, "FinishUpdate"},
+ {2, D<&ICradleFirmwareUpdater::GetCradleDeviceInfo>, "GetCradleDeviceInfo"},
+ {3, D<&ICradleFirmwareUpdater::GetCradleDeviceInfoChangeEvent>, "GetCradleDeviceInfoChangeEvent"},
+ {4, nullptr, "GetUpdateProgressInfo"},
+ {5, nullptr, "GetLastInternalResult"},
+
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
ICradleFirmwareUpdater::~ICradleFirmwareUpdater() = default;
diff --git a/src/core/hle/service/am/service/cradle_firmware_updater.h b/src/core/hle/service/am/service/cradle_firmware_updater.h
index f8e4b93b27..c895a34c22 100644
--- a/src/core/hle/service/am/service/cradle_firmware_updater.h
+++ b/src/core/hle/service/am/service/cradle_firmware_updater.h
@@ -33,7 +33,6 @@ private:
Result GetCradleDeviceInfoChangeEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
private:
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
KernelHelpers::ServiceContext m_context;
Event m_cradle_device_info_event;
};
diff --git a/src/core/hle/service/am/service/debug_functions.cpp b/src/core/hle/service/am/service/debug_functions.cpp
new file mode 100644
index 0000000000..4128366270
--- /dev/null
+++ b/src/core/hle/service/am/service/debug_functions.cpp
@@ -0,0 +1,46 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/am/service/debug_functions.h"
+
+namespace Service::AM {
+
+IDebugFunctions::IDebugFunctions(Core::System& system_)
+ : ServiceFramework{system_, "IDebugFunctions"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "NotifyMessageToHomeMenuForDebug"},
+ {1, nullptr, "OpenMainApplication"},
+ {10, nullptr, "PerformSystemButtonPressing"},
+ {20, nullptr, "InvalidateTransitionLayer"},
+ {30, nullptr, "RequestLaunchApplicationWithUserAndArgumentForDebug"},
+ {31, nullptr, "RequestLaunchApplicationByApplicationLaunchInfoForDebug"},
+ {40, nullptr, "GetAppletResourceUsageInfo"},
+ {50, nullptr, "AddSystemProgramIdAndAppletIdForDebug"},
+ {51, nullptr, "AddOperationConfirmedLibraryAppletIdForDebug"},
+ {100, nullptr, "SetCpuBoostModeForApplet"},
+ {101, nullptr, "CancelCpuBoostModeForApplet"},
+ {110, nullptr, "PushToAppletBoundChannelForDebug"},
+ {111, nullptr, "TryPopFromAppletBoundChannelForDebug"},
+ {120, nullptr, "AlarmSettingNotificationEnableAppEventReserve"},
+ {121, nullptr, "AlarmSettingNotificationDisableAppEventReserve"},
+ {122, nullptr, "AlarmSettingNotificationPushAppEventNotify"},
+ {130, nullptr, "FriendInvitationSetApplicationParameter"},
+ {131, nullptr, "FriendInvitationClearApplicationParameter"},
+ {132, nullptr, "FriendInvitationPushApplicationParameter"},
+ {140, nullptr, "RestrictPowerOperationForSecureLaunchModeForDebug"},
+ {200, nullptr, "CreateFloatingLibraryAppletAccepterForDebug"},
+ {300, nullptr, "TerminateAllRunningApplicationsForDebug"},
+ {900, nullptr, "GetGrcProcessLaunchedSystemEvent"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
+IDebugFunctions::~IDebugFunctions() = default;
+
+} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/debug_functions.h b/src/core/hle/service/am/service/debug_functions.h
new file mode 100644
index 0000000000..381499e93d
--- /dev/null
+++ b/src/core/hle/service/am/service/debug_functions.h
@@ -0,0 +1,19 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/service.h"
+
+namespace Service::AM {
+
+class IDebugFunctions final : public ServiceFramework<IDebugFunctions> {
+public:
+ explicit IDebugFunctions(Core::System& system_);
+ ~IDebugFunctions() override;
+};
+
+} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/display_controller.cpp b/src/core/hle/service/am/service/display_controller.cpp
index eb95dd1b86..8f87327b17 100644
--- a/src/core/hle/service/am/service/display_controller.cpp
+++ b/src/core/hle/service/am/service/display_controller.cpp
@@ -12,42 +12,42 @@
namespace Service::AM {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IDisplayController::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetLastForegroundCaptureImage"},
- FunctionInfo{1, nullptr, "UpdateLastForegroundCaptureImage"},
- FunctionInfo{2, nullptr, "GetLastApplicationCaptureImage"},
- FunctionInfo{3, nullptr, "GetCallerAppletCaptureImage"},
- FunctionInfo{4, nullptr, "UpdateCallerAppletCaptureImage"},
- FunctionInfo{5, D<&IDisplayController::GetLastForegroundCaptureImageEx>, "GetLastForegroundCaptureImageEx"},
- FunctionInfo{6, nullptr, "GetLastApplicationCaptureImageEx"},
- FunctionInfo{7, D<&IDisplayController::GetCallerAppletCaptureImageEx>, "GetCallerAppletCaptureImageEx"},
- FunctionInfo{8, D<&IDisplayController::TakeScreenShotOfOwnLayer>, "TakeScreenShotOfOwnLayer"},
- FunctionInfo{9, nullptr, "CopyBetweenCaptureBuffers"},
- FunctionInfo{10, nullptr, "AcquireLastApplicationCaptureBuffer"},
- FunctionInfo{11, nullptr, "ReleaseLastApplicationCaptureBuffer"},
- FunctionInfo{12, nullptr, "AcquireLastForegroundCaptureBuffer"},
- FunctionInfo{13, nullptr, "ReleaseLastForegroundCaptureBuffer"},
- FunctionInfo{14, nullptr, "AcquireCallerAppletCaptureBuffer"},
- FunctionInfo{15, nullptr, "ReleaseCallerAppletCaptureBuffer"},
- FunctionInfo{16, nullptr, "AcquireLastApplicationCaptureBufferEx"},
- FunctionInfo{17, nullptr, "AcquireLastForegroundCaptureBufferEx"},
- FunctionInfo{18, nullptr, "AcquireCallerAppletCaptureBufferEx"},
- FunctionInfo{20, D<&IDisplayController::ClearCaptureBuffer>, "ClearCaptureBuffer"},
- FunctionInfo{21, nullptr, "ClearAppletTransitionBuffer"},
- FunctionInfo{22, D<&IDisplayController::AcquireLastApplicationCaptureSharedBuffer>, "AcquireLastApplicationCaptureSharedBuffer"},
- FunctionInfo{23, D<&IDisplayController::ReleaseLastApplicationCaptureSharedBuffer>, "ReleaseLastApplicationCaptureSharedBuffer"},
- FunctionInfo{24, D<&IDisplayController::AcquireLastForegroundCaptureSharedBuffer>, "AcquireLastForegroundCaptureSharedBuffer"},
- FunctionInfo{25, D<&IDisplayController::ReleaseLastForegroundCaptureSharedBuffer>, "ReleaseLastForegroundCaptureSharedBuffer"},
- FunctionInfo{26, D<&IDisplayController::AcquireCallerAppletCaptureSharedBuffer>, "AcquireCallerAppletCaptureSharedBuffer"},
- FunctionInfo{27, D<&IDisplayController::ReleaseCallerAppletCaptureSharedBuffer>, "ReleaseCallerAppletCaptureSharedBuffer"},
- FunctionInfo{28, nullptr, "TakeScreenShotOfOwnLayerEx"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IDisplayController::IDisplayController(Core::System& system_, std::shared_ptr<Applet> applet_)
: ServiceFramework{system_, "IDisplayController"}, applet(std::move(applet_)) {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetLastForegroundCaptureImage"},
+ {1, nullptr, "UpdateLastForegroundCaptureImage"},
+ {2, nullptr, "GetLastApplicationCaptureImage"},
+ {3, nullptr, "GetCallerAppletCaptureImage"},
+ {4, nullptr, "UpdateCallerAppletCaptureImage"},
+ {5, D<&IDisplayController::GetLastForegroundCaptureImageEx>, "GetLastForegroundCaptureImageEx"},
+ {6, nullptr, "GetLastApplicationCaptureImageEx"},
+ {7, D<&IDisplayController::GetCallerAppletCaptureImageEx>, "GetCallerAppletCaptureImageEx"},
+ {8, D<&IDisplayController::TakeScreenShotOfOwnLayer>, "TakeScreenShotOfOwnLayer"},
+ {9, nullptr, "CopyBetweenCaptureBuffers"},
+ {10, nullptr, "AcquireLastApplicationCaptureBuffer"},
+ {11, nullptr, "ReleaseLastApplicationCaptureBuffer"},
+ {12, nullptr, "AcquireLastForegroundCaptureBuffer"},
+ {13, nullptr, "ReleaseLastForegroundCaptureBuffer"},
+ {14, nullptr, "AcquireCallerAppletCaptureBuffer"},
+ {15, nullptr, "ReleaseCallerAppletCaptureBuffer"},
+ {16, nullptr, "AcquireLastApplicationCaptureBufferEx"},
+ {17, nullptr, "AcquireLastForegroundCaptureBufferEx"},
+ {18, nullptr, "AcquireCallerAppletCaptureBufferEx"},
+ {20, D<&IDisplayController::ClearCaptureBuffer>, "ClearCaptureBuffer"},
+ {21, nullptr, "ClearAppletTransitionBuffer"},
+ {22, D<&IDisplayController::AcquireLastApplicationCaptureSharedBuffer>, "AcquireLastApplicationCaptureSharedBuffer"},
+ {23, D<&IDisplayController::ReleaseLastApplicationCaptureSharedBuffer>, "ReleaseLastApplicationCaptureSharedBuffer"},
+ {24, D<&IDisplayController::AcquireLastForegroundCaptureSharedBuffer>, "AcquireLastForegroundCaptureSharedBuffer"},
+ {25, D<&IDisplayController::ReleaseLastForegroundCaptureSharedBuffer>, "ReleaseLastForegroundCaptureSharedBuffer"},
+ {26, D<&IDisplayController::AcquireCallerAppletCaptureSharedBuffer>, "AcquireCallerAppletCaptureSharedBuffer"},
+ {27, D<&IDisplayController::ReleaseCallerAppletCaptureSharedBuffer>, "ReleaseCallerAppletCaptureSharedBuffer"},
+ {28, nullptr, "TakeScreenShotOfOwnLayerEx"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IDisplayController::~IDisplayController() = default;
diff --git a/src/core/hle/service/am/service/display_controller.h b/src/core/hle/service/am/service/display_controller.h
index 03d29f93c5..35e98b9ad3 100644
--- a/src/core/hle/service/am/service/display_controller.h
+++ b/src/core/hle/service/am/service/display_controller.h
@@ -35,7 +35,6 @@ private:
Out<s32> out_fbshare_layer_index);
Result ReleaseLastApplicationCaptureSharedBuffer();
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
const std::shared_ptr<Applet> applet;
};
diff --git a/src/core/hle/service/am/service/global_state_controller.cpp b/src/core/hle/service/am/service/global_state_controller.cpp
index be080ffcb3..e7cd60927c 100644
--- a/src/core/hle/service/am/service/global_state_controller.cpp
+++ b/src/core/hle/service/am/service/global_state_controller.cpp
@@ -10,28 +10,28 @@
namespace Service::AM {
- std::optional<ServiceFrameworkBase::FunctionInfoBase> IGlobalStateController::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "RequestToEnterSleep"},
- FunctionInfo{1, nullptr, "EnterSleep"},
- FunctionInfo{2, nullptr, "StartSleepSequence"},
- FunctionInfo{3, D<&IGlobalStateController::StartShutdownSequence>, "StartShutdownSequence"},
- FunctionInfo{4, D<&IGlobalStateController::StartRebootSequence>, "StartRebootSequence"},
- FunctionInfo{9, nullptr, "IsAutoPowerDownRequested"},
- FunctionInfo{10, D<&IGlobalStateController::LoadAndApplyIdlePolicySettings>, "LoadAndApplyIdlePolicySettings"},
- FunctionInfo{11, nullptr, "NotifyCecSettingsChanged"},
- FunctionInfo{12, nullptr, "SetDefaultHomeButtonLongPressTime"},
- FunctionInfo{13, nullptr, "UpdateDefaultDisplayResolution"},
- FunctionInfo{14, D<&IGlobalStateController::ShouldSleepOnBoot>, "ShouldSleepOnBoot"},
- FunctionInfo{15, D<&IGlobalStateController::GetHdcpAuthenticationFailedEvent>, "GetHdcpAuthenticationFailedEvent"},
- FunctionInfo{30, D<&IGlobalStateController::OpenCradleFirmwareUpdater>, "OpenCradleFirmwareUpdater"}
- );
- return HandlerTableGenerateWithFind(key, functions);
- }
-
IGlobalStateController::IGlobalStateController(Core::System& system_)
: ServiceFramework{system_, "IGlobalStateController"},
m_context{system_, "IGlobalStateController"}, m_hdcp_authentication_failed_event{m_context} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "RequestToEnterSleep"},
+ {1, nullptr, "EnterSleep"},
+ {2, nullptr, "StartSleepSequence"},
+ {3, D<&IGlobalStateController::StartShutdownSequence>, "StartShutdownSequence"},
+ {4, D<&IGlobalStateController::StartRebootSequence>, "StartRebootSequence"},
+ {9, nullptr, "IsAutoPowerDownRequested"},
+ {10, D<&IGlobalStateController::LoadAndApplyIdlePolicySettings>, "LoadAndApplyIdlePolicySettings"},
+ {11, nullptr, "NotifyCecSettingsChanged"},
+ {12, nullptr, "SetDefaultHomeButtonLongPressTime"},
+ {13, nullptr, "UpdateDefaultDisplayResolution"},
+ {14, D<&IGlobalStateController::ShouldSleepOnBoot>, "ShouldSleepOnBoot"},
+ {15, D<&IGlobalStateController::GetHdcpAuthenticationFailedEvent>, "GetHdcpAuthenticationFailedEvent"},
+ {30, D<&IGlobalStateController::OpenCradleFirmwareUpdater>, "OpenCradleFirmwareUpdater"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
Result IGlobalStateController::StartShutdownSequence() {
diff --git a/src/core/hle/service/am/service/global_state_controller.h b/src/core/hle/service/am/service/global_state_controller.h
index 0de1415295..012692ecd8 100644
--- a/src/core/hle/service/am/service/global_state_controller.h
+++ b/src/core/hle/service/am/service/global_state_controller.h
@@ -26,9 +26,9 @@ private:
Result LoadAndApplyIdlePolicySettings();
Result ShouldSleepOnBoot(Out<bool> out_should_sleep_on_boot);
Result GetHdcpAuthenticationFailedEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
- Result OpenCradleFirmwareUpdater(Out<SharedPointer<ICradleFirmwareUpdater>> out_cradle_firmware_updater);
+ Result OpenCradleFirmwareUpdater(
+ Out<SharedPointer<ICradleFirmwareUpdater>> out_cradle_firmware_updater);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
KernelHelpers::ServiceContext m_context;
Event m_hdcp_authentication_failed_event;
};
diff --git a/src/core/hle/service/am/service/home_menu_functions.cpp b/src/core/hle/service/am/service/home_menu_functions.cpp
index 5f61c842a2..f9d402ca99 100644
--- a/src/core/hle/service/am/service/home_menu_functions.cpp
+++ b/src/core/hle/service/am/service/home_menu_functions.cpp
@@ -14,31 +14,31 @@
namespace Service::AM {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IHomeMenuFunctions::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{10, D<&IHomeMenuFunctions::RequestToGetForeground>, "RequestToGetForeground"},
- FunctionInfo{11, D<&IHomeMenuFunctions::LockForeground>, "LockForeground"},
- FunctionInfo{12, D<&IHomeMenuFunctions::UnlockForeground>, "UnlockForeground"},
- FunctionInfo{20, D<&IHomeMenuFunctions::PopFromGeneralChannel>, "PopFromGeneralChannel"},
- FunctionInfo{21, D<&IHomeMenuFunctions::GetPopFromGeneralChannelEvent>, "GetPopFromGeneralChannelEvent"},
- FunctionInfo{30, nullptr, "GetHomeButtonWriterLockAccessor"},
- FunctionInfo{31, nullptr, "GetWriterLockAccessorEx"},
- FunctionInfo{40, D<&IHomeMenuFunctions::IsSleepEnabled>, "IsSleepEnabled"},
- FunctionInfo{41, D<&IHomeMenuFunctions::IsRebootEnabled>, "IsRebootEnabled"},
- FunctionInfo{50, nullptr, "LaunchSystemApplet"},
- FunctionInfo{51, nullptr, "LaunchStarter"},
- FunctionInfo{100, nullptr, "PopRequestLaunchApplicationForDebug"},
- FunctionInfo{110, D<&IHomeMenuFunctions::IsForceTerminateApplicationDisabledForDebug>, "IsForceTerminateApplicationDisabledForDebug"},
- FunctionInfo{200, nullptr, "LaunchDevMenu"},
- FunctionInfo{1000, nullptr, "SetLastApplicationExitReason"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IHomeMenuFunctions::IHomeMenuFunctions(Core::System& system_, std::shared_ptr<Applet> applet,
WindowSystem& window_system)
: ServiceFramework{system_, "IHomeMenuFunctions"}, m_window_system{window_system},
m_applet{std::move(applet)}, m_context{system, "IHomeMenuFunctions"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {10, D<&IHomeMenuFunctions::RequestToGetForeground>, "RequestToGetForeground"},
+ {11, D<&IHomeMenuFunctions::LockForeground>, "LockForeground"},
+ {12, D<&IHomeMenuFunctions::UnlockForeground>, "UnlockForeground"},
+ {20, D<&IHomeMenuFunctions::PopFromGeneralChannel>, "PopFromGeneralChannel"},
+ {21, D<&IHomeMenuFunctions::GetPopFromGeneralChannelEvent>, "GetPopFromGeneralChannelEvent"},
+ {30, nullptr, "GetHomeButtonWriterLockAccessor"},
+ {31, nullptr, "GetWriterLockAccessorEx"},
+ {40, D<&IHomeMenuFunctions::IsSleepEnabled>, "IsSleepEnabled"},
+ {41, D<&IHomeMenuFunctions::IsRebootEnabled>, "IsRebootEnabled"},
+ {50, nullptr, "LaunchSystemApplet"},
+ {51, nullptr, "LaunchStarter"},
+ {100, nullptr, "PopRequestLaunchApplicationForDebug"},
+ {110, D<&IHomeMenuFunctions::IsForceTerminateApplicationDisabledForDebug>, "IsForceTerminateApplicationDisabledForDebug"},
+ {200, nullptr, "LaunchDevMenu"},
+ {1000, nullptr, "SetLastApplicationExitReason"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IHomeMenuFunctions::~IHomeMenuFunctions() = default;
diff --git a/src/core/hle/service/am/service/home_menu_functions.h b/src/core/hle/service/am/service/home_menu_functions.h
index 25eb9db45e..2c3ef54375 100644
--- a/src/core/hle/service/am/service/home_menu_functions.h
+++ b/src/core/hle/service/am/service/home_menu_functions.h
@@ -34,7 +34,6 @@ private:
Result IsForceTerminateApplicationDisabledForDebug(
Out<bool> out_is_force_terminate_application_disabled_for_debug);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
WindowSystem& m_window_system;
const std::shared_ptr<Applet> m_applet;
KernelHelpers::ServiceContext m_context;
diff --git a/src/core/hle/service/am/service/library_applet_accessor.cpp b/src/core/hle/service/am/service/library_applet_accessor.cpp
index c5386fb1a1..849e5794cf 100644
--- a/src/core/hle/service/am/service/library_applet_accessor.cpp
+++ b/src/core/hle/service/am/service/library_applet_accessor.cpp
@@ -17,7 +17,9 @@
namespace Service::AM {
-static void EnableSingleUserPlay(const std::shared_ptr<LibraryAppletStorage>& impl) {
+namespace {
+
+void EnableSingleUserPlay(const std::shared_ptr<LibraryAppletStorage>& impl) {
constexpr s64 DisplayOptionsOffset = 0x90;
constexpr s64 IsSkipEnabledOffset = 1;
constexpr s64 ShowSkipButtonOffset = 4;
@@ -27,7 +29,7 @@ static void EnableSingleUserPlay(const std::shared_ptr<LibraryAppletStorage>& im
impl->Write(DisplayOptionsOffset + ShowSkipButtonOffset, &enabled, sizeof(enabled));
}
-static void ReplaceEmptyUuidWithCurrentUser(const std::shared_ptr<LibraryAppletStorage>& impl) {
+void ReplaceEmptyUuidWithCurrentUser(const std::shared_ptr<LibraryAppletStorage>& impl) {
Frontend::UiReturnArg return_arg{};
impl->Read(0, &return_arg, sizeof(return_arg));
@@ -45,40 +47,42 @@ static void ReplaceEmptyUuidWithCurrentUser(const std::shared_ptr<LibraryAppletS
}
}
- std::optional<ServiceFrameworkBase::FunctionInfoBase> ILibraryAppletAccessor::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&ILibraryAppletAccessor::GetAppletStateChangedEvent>, "GetAppletStateChangedEvent"},
- FunctionInfo{1, D<&ILibraryAppletAccessor::IsCompleted>, "IsCompleted"},
- FunctionInfo{10, D<&ILibraryAppletAccessor::Start>, "Start"},
- FunctionInfo{20, D<&ILibraryAppletAccessor::RequestExit>, "RequestExit"},
- FunctionInfo{25, D<&ILibraryAppletAccessor::Terminate>, "Terminate"},
- FunctionInfo{30, D<&ILibraryAppletAccessor::GetResult>, "GetResult"},
- FunctionInfo{50, nullptr, "SetOutOfFocusApplicationSuspendingEnabled"},
- FunctionInfo{60, D<&ILibraryAppletAccessor::PresetLibraryAppletGpuTimeSliceZero>, "PresetLibraryAppletGpuTimeSliceZero", MakeVersionGate({10,0,0})},
- FunctionInfo{80, nullptr, "RequestForLibraryAppletToGetForeground", MakeVersionGate({19,0,0})},
- FunctionInfo{81, nullptr, "GetCurrentChildLibraryApplet", MakeVersionGate({19,0,0})},
- FunctionInfo{90, D<&ILibraryAppletAccessor::Unknown90>, "Unknown90", MakeVersionGate({20,0,0})},
- FunctionInfo{100, D<&ILibraryAppletAccessor::PushInData>, "PushInData"},
- FunctionInfo{101, D<&ILibraryAppletAccessor::PopOutData>, "PopOutData"},
- FunctionInfo{102, nullptr, "PushExtraStorage"},
- FunctionInfo{103, D<&ILibraryAppletAccessor::PushInteractiveInData>, "PushInteractiveInData"},
- FunctionInfo{104, D<&ILibraryAppletAccessor::PopInteractiveOutData>, "PopInteractiveOutData"},
- FunctionInfo{105, D<&ILibraryAppletAccessor::GetPopOutDataEvent>, "GetPopOutDataEvent"},
- FunctionInfo{106, D<&ILibraryAppletAccessor::GetPopInteractiveOutDataEvent>, "GetPopInteractiveOutDataEvent"},
- FunctionInfo{110, nullptr, "NeedsToExitProcess"},
- FunctionInfo{120, D<&ILibraryAppletAccessor::GetLibraryAppletInfo>, "GetLibraryAppletInfo"},
- FunctionInfo{150, nullptr, "RequestForAppletToGetForeground"},
- FunctionInfo{160, D<&ILibraryAppletAccessor::GetIndirectLayerConsumerHandle>, "GetIndirectLayerConsumerHandle", MakeVersionGate({2,0,0})},
- FunctionInfo{170, D<&ILibraryAppletAccessor::Unknown170>, "Unknown170", MakeVersionGate({22,0,0})}
- );
- return HandlerTableGenerateWithFind(key, functions);
- }
+} // namespace
ILibraryAppletAccessor::ILibraryAppletAccessor(Core::System& system_,
std::shared_ptr<AppletDataBroker> broker,
std::shared_ptr<Applet> applet)
: ServiceFramework{system_, "ILibraryAppletAccessor"}, m_broker{std::move(broker)},
m_applet{std::move(applet)} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&ILibraryAppletAccessor::GetAppletStateChangedEvent>, "GetAppletStateChangedEvent"},
+ {1, D<&ILibraryAppletAccessor::IsCompleted>, "IsCompleted"},
+ {10, D<&ILibraryAppletAccessor::Start>, "Start"},
+ {20, D<&ILibraryAppletAccessor::RequestExit>, "RequestExit"},
+ {25, D<&ILibraryAppletAccessor::Terminate>, "Terminate"},
+ {30, D<&ILibraryAppletAccessor::GetResult>, "GetResult"},
+ {50, nullptr, "SetOutOfFocusApplicationSuspendingEnabled"},
+ {60, D<&ILibraryAppletAccessor::PresetLibraryAppletGpuTimeSliceZero>, "PresetLibraryAppletGpuTimeSliceZero"}, //10.0.0+
+ {80, nullptr, "RequestForLibraryAppletToGetForeground"}, //19.0.0+
+ {81, nullptr, "GetCurrentChildLibraryApplet"}, //19.0.0+
+ {90, D<&ILibraryAppletAccessor::Unknown90>, "Unknown90"}, //20.0.0+
+ {100, D<&ILibraryAppletAccessor::PushInData>, "PushInData"},
+ {101, D<&ILibraryAppletAccessor::PopOutData>, "PopOutData"},
+ {102, nullptr, "PushExtraStorage"},
+ {103, D<&ILibraryAppletAccessor::PushInteractiveInData>, "PushInteractiveInData"},
+ {104, D<&ILibraryAppletAccessor::PopInteractiveOutData>, "PopInteractiveOutData"},
+ {105, D<&ILibraryAppletAccessor::GetPopOutDataEvent>, "GetPopOutDataEvent"},
+ {106, D<&ILibraryAppletAccessor::GetPopInteractiveOutDataEvent>, "GetPopInteractiveOutDataEvent"},
+ {110, nullptr, "NeedsToExitProcess"},
+ {120, D<&ILibraryAppletAccessor::GetLibraryAppletInfo>, "GetLibraryAppletInfo"},
+ {150, nullptr, "RequestForAppletToGetForeground"},
+ {160, D<&ILibraryAppletAccessor::GetIndirectLayerConsumerHandle>, "GetIndirectLayerConsumerHandle"}, //2.0.0+
+ {170, D<&ILibraryAppletAccessor::Unknown170>, "Unknown170"}, //22.0.0+
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
ILibraryAppletAccessor::~ILibraryAppletAccessor() = default;
diff --git a/src/core/hle/service/am/service/library_applet_accessor.h b/src/core/hle/service/am/service/library_applet_accessor.h
index e14ddb3bde..ad40bc76c7 100644
--- a/src/core/hle/service/am/service/library_applet_accessor.h
+++ b/src/core/hle/service/am/service/library_applet_accessor.h
@@ -6,6 +6,7 @@
#pragma once
+#include "core/hle/service/am/service/library_applet_self_accessor.h"
#include "core/hle/service/cmif_types.h"
#include "core/hle/service/service.h"
@@ -15,26 +16,6 @@ class AppletDataBroker;
struct Applet;
class IStorage;
-struct LibraryAppletInfo {
- AppletId applet_id;
- LibraryAppletMode library_applet_mode;
-};
-static_assert(sizeof(LibraryAppletInfo) == 0x8, "LibraryAppletInfo has incorrect size.");
-
-struct ErrorCode {
- u32 category;
- u32 number;
-};
-static_assert(sizeof(ErrorCode) == 0x8, "ErrorCode has incorrect size.");
-
-struct ErrorContext {
- u8 type;
- INSERT_PADDING_BYTES_NOINIT(0x7);
- std::array<u8, 0x1f4> data;
- Result result;
-};
-static_assert(sizeof(ErrorContext) == 0x200, "ErrorContext has incorrect size.");
-
class ILibraryAppletAccessor final : public ServiceFramework<ILibraryAppletAccessor> {
public:
explicit ILibraryAppletAccessor(Core::System& system_, std::shared_ptr<AppletDataBroker> broker,
@@ -68,7 +49,6 @@ private:
void FrontendExecuteInteractive();
void FrontendRequestExit();
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
const std::shared_ptr<AppletDataBroker> m_broker;
const std::shared_ptr<Applet> m_applet;
};
diff --git a/src/core/hle/service/am/service/library_applet_creator.cpp b/src/core/hle/service/am/service/library_applet_creator.cpp
new file mode 100644
index 0000000000..4ee92908b5
--- /dev/null
+++ b/src/core/hle/service/am/service/library_applet_creator.cpp
@@ -0,0 +1,287 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "common/settings.h"
+#include "core/hle/kernel/k_transfer_memory.h"
+#include "core/hle/service/am/applet_data_broker.h"
+#include "core/hle/service/am/applet_manager.h"
+#include "core/hle/service/am/frontend/applets.h"
+#include "core/hle/service/am/library_applet_storage.h"
+#include "core/hle/service/am/process_creation.h"
+#include "core/hle/service/am/service/library_applet_accessor.h"
+#include "core/hle/service/am/service/library_applet_creator.h"
+
+#include "core/hle/api_version.h"
+#include "core/hle/service/am/service/storage.h"
+#include "core/hle/service/am/window_system.h"
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/sm/sm.h"
+
+namespace Service::AM {
+
+namespace {
+
+bool ShouldCreateGuestApplet(AppletId applet_id) {
+#define X(Name, name) \
+ if (applet_id == AppletId::Name && \
+ Settings::values.name##_applet_mode.GetValue() != Settings::AppletMode::LLE) { \
+ return false; \
+ }
+
+ X(Cabinet, cabinet)
+ X(Controller, controller)
+ X(DataErase, data_erase)
+ X(Error, error)
+ X(NetConnect, net_connect)
+ X(ProfileSelect, player_select)
+ X(SoftwareKeyboard, swkbd)
+ X(MiiEdit, mii_edit)
+ X(Web, web)
+ X(Shop, shop)
+ X(PhotoViewer, photo_viewer)
+ X(OfflineWeb, offline_web)
+ X(LoginShare, login_share)
+ X(WebAuth, wifi_web_auth)
+ X(MyPage, my_page)
+
+#undef X
+
+ return true;
+}
+
+AppletProgramId AppletIdToProgramId(AppletId applet_id) {
+ switch (applet_id) {
+ case AppletId::OverlayDisplay:
+ return AppletProgramId::OverlayDisplay;
+ case AppletId::QLaunch:
+ return AppletProgramId::QLaunch;
+ case AppletId::Starter:
+ return AppletProgramId::Starter;
+ case AppletId::Auth:
+ return AppletProgramId::Auth;
+ case AppletId::Cabinet:
+ return AppletProgramId::Cabinet;
+ case AppletId::Controller:
+ return AppletProgramId::Controller;
+ case AppletId::DataErase:
+ return AppletProgramId::DataErase;
+ case AppletId::Error:
+ return AppletProgramId::Error;
+ case AppletId::NetConnect:
+ return AppletProgramId::NetConnect;
+ case AppletId::ProfileSelect:
+ return AppletProgramId::ProfileSelect;
+ case AppletId::SoftwareKeyboard:
+ return AppletProgramId::SoftwareKeyboard;
+ case AppletId::MiiEdit:
+ return AppletProgramId::MiiEdit;
+ case AppletId::Web:
+ return AppletProgramId::Web;
+ case AppletId::Shop:
+ return AppletProgramId::Shop;
+ case AppletId::PhotoViewer:
+ return AppletProgramId::PhotoViewer;
+ case AppletId::Settings:
+ return AppletProgramId::Settings;
+ case AppletId::OfflineWeb:
+ return AppletProgramId::OfflineWeb;
+ case AppletId::LoginShare:
+ return AppletProgramId::LoginShare;
+ case AppletId::WebAuth:
+ return AppletProgramId::WebAuth;
+ case AppletId::MyPage:
+ return AppletProgramId::MyPage;
+ default:
+ return static_cast<AppletProgramId>(0);
+ }
+}
+
+std::shared_ptr<ILibraryAppletAccessor> CreateGuestApplet(Core::System& system,
+ WindowSystem& window_system,
+ std::shared_ptr<Applet> caller_applet,
+ AppletId applet_id,
+ LibraryAppletMode mode) {
+ const auto program_id = static_cast<u64>(AppletIdToProgramId(applet_id));
+ if (program_id == 0) {
+ // Unknown applet
+ return {};
+ }
+
+ auto process = CreateProcess(system, program_id, 1, HLE::ApiVersion::HOS_VERSION_MAJOR);
+ if (process) {
+ const auto applet = std::make_shared<Applet>(system, std::move(process), false);
+ applet->program_id = program_id;
+ applet->applet_id = applet_id;
+ applet->type = AppletType::LibraryApplet;
+ applet->library_applet_mode = mode;
+ applet->window_visible = mode != LibraryAppletMode::AllForegroundInitiallyHidden;
+
+ auto broker = std::make_shared<AppletDataBroker>(system);
+ applet->caller_applet = caller_applet;
+ applet->caller_applet_broker = broker;
+ {
+ std::scoped_lock lk{caller_applet->lock};
+ caller_applet->child_applets.push_back(applet);
+ }
+ window_system.TrackApplet(applet, false);
+ return std::make_shared<ILibraryAppletAccessor>(system, broker, applet);
+ }
+ // Couldn't initialize the guest process
+ return {};
+}
+
+std::shared_ptr<ILibraryAppletAccessor> CreateFrontendApplet(Core::System& system,
+ WindowSystem& window_system,
+ std::shared_ptr<Applet> caller_applet,
+ AppletId applet_id,
+ LibraryAppletMode mode) {
+ const auto program_id = static_cast<u64>(AppletIdToProgramId(applet_id));
+
+ auto process = std::make_unique<Process>(system);
+ auto applet = std::make_shared<Applet>(system, std::move(process), false);
+ applet->program_id = program_id;
+ applet->applet_id = applet_id;
+ applet->type = AppletType::LibraryApplet;
+ applet->library_applet_mode = mode;
+
+ auto storage = std::make_shared<AppletDataBroker>(system);
+ applet->caller_applet = caller_applet;
+ applet->caller_applet_broker = storage;
+ applet->frontend = system.GetFrontendAppletHolder().GetApplet(applet, applet_id, mode);
+ {
+ std::scoped_lock lk{caller_applet->lock};
+ caller_applet->child_applets.push_back(applet);
+ }
+ return std::make_shared<ILibraryAppletAccessor>(system, storage, applet);
+}
+
+} // namespace
+
+ILibraryAppletCreator::ILibraryAppletCreator(Core::System& system_, std::shared_ptr<Applet> applet,
+ WindowSystem& window_system)
+ : ServiceFramework{system_, "ILibraryAppletCreator"},
+ m_window_system{window_system}, m_applet{std::move(applet)} {
+ static const FunctionInfo functions[] = {
+ {0, D<&ILibraryAppletCreator::CreateLibraryApplet>, "CreateLibraryApplet"},
+ {1, nullptr, "TerminateAllLibraryApplets"},
+ {2, nullptr, "AreAnyLibraryAppletsLeft"},
+ {3, D<&ILibraryAppletCreator::CreateLibraryAppletEx>, "CreateLibraryAppletEx"},
+ {10, D<&ILibraryAppletCreator::CreateStorage>, "CreateStorage"},
+ {11, D<&ILibraryAppletCreator::CreateTransferMemoryStorage>, "CreateTransferMemoryStorage"},
+ {12, D<&ILibraryAppletCreator::CreateHandleStorage>, "CreateHandleStorage"},
+ };
+ RegisterHandlers(functions);
+}
+
+ILibraryAppletCreator::~ILibraryAppletCreator() = default;
+
+Result ILibraryAppletCreator::CreateLibraryApplet(
+ Out<SharedPointer<ILibraryAppletAccessor>> out_library_applet_accessor, AppletId applet_id,
+ LibraryAppletMode library_applet_mode) {
+ LOG_DEBUG(Service_AM, "called with applet_id={} applet_mode={}", applet_id,
+ library_applet_mode);
+
+ std::shared_ptr<ILibraryAppletAccessor> library_applet;
+ if (ShouldCreateGuestApplet(applet_id)) {
+ library_applet =
+ CreateGuestApplet(system, m_window_system, m_applet, applet_id, library_applet_mode);
+ }
+ if (!library_applet) {
+ library_applet =
+ CreateFrontendApplet(system, m_window_system, m_applet, applet_id, library_applet_mode);
+ }
+ if (!library_applet) {
+ LOG_ERROR(Service_AM, "Applet doesn't exist! applet_id={}", applet_id);
+ R_THROW(ResultUnknown);
+ }
+
+ // Applet is created, can now be launched.
+ m_applet->library_applet_launchable_event.Signal(system.Kernel());
+ *out_library_applet_accessor = library_applet;
+ R_SUCCEED();
+}
+
+Result ILibraryAppletCreator::CreateLibraryAppletEx(
+ Out<SharedPointer<ILibraryAppletAccessor>> out_library_applet_accessor, AppletId applet_id,
+ LibraryAppletMode library_applet_mode, u64 thread_id) {
+ LOG_DEBUG(Service_AM, "called with applet_id={} applet_mode={} thread_id={}", applet_id,
+ library_applet_mode, thread_id);
+
+ std::shared_ptr<ILibraryAppletAccessor> library_applet;
+ if (ShouldCreateGuestApplet(applet_id)) {
+ library_applet =
+ CreateGuestApplet(system, m_window_system, m_applet, applet_id, library_applet_mode);
+ }
+ if (!library_applet) {
+ library_applet =
+ CreateFrontendApplet(system, m_window_system, m_applet, applet_id, library_applet_mode);
+ }
+ if (!library_applet) {
+ LOG_ERROR(Service_AM, "Applet doesn't exist! applet_id={}", applet_id);
+ R_THROW(ResultUnknown);
+ }
+
+ // Applet is created, can now be launched.
+ m_applet->library_applet_launchable_event.Signal(system.Kernel());
+ *out_library_applet_accessor = library_applet;
+ R_SUCCEED();
+}
+
+Result ILibraryAppletCreator::CreateStorage(Out<SharedPointer<IStorage>> out_storage, s64 size) {
+ LOG_DEBUG(Service_AM, "called, size={}", size);
+
+ if (size <= 0) {
+ LOG_ERROR(Service_AM, "size is less than or equal to 0");
+ R_THROW(ResultUnknown);
+ }
+
+ *out_storage = std::make_shared<IStorage>(system, AM::CreateStorage(std::vector<u8>(size)));
+ R_SUCCEED();
+}
+
+Result ILibraryAppletCreator::CreateTransferMemoryStorage(
+ Out<SharedPointer<IStorage>> out_storage, bool is_writable, s64 size,
+ InCopyHandle<Kernel::KTransferMemory> transfer_memory_handle) {
+ LOG_DEBUG(Service_AM, "called, is_writable={} size={}", is_writable, size);
+
+ if (size <= 0) {
+ LOG_ERROR(Service_AM, "size is less than or equal to 0");
+ R_THROW(ResultUnknown);
+ }
+
+ if (!transfer_memory_handle) {
+ LOG_ERROR(Service_AM, "transfer_memory_handle is null");
+ R_THROW(ResultUnknown);
+ }
+
+ *out_storage = std::make_shared<IStorage>(
+ system, AM::CreateTransferMemoryStorage(system.Kernel(), transfer_memory_handle->GetOwner()->GetMemory(),
+ transfer_memory_handle.Get(), is_writable, size));
+ R_SUCCEED();
+}
+
+Result ILibraryAppletCreator::CreateHandleStorage(
+ Out<SharedPointer<IStorage>> out_storage, s64 size,
+ InCopyHandle<Kernel::KTransferMemory> transfer_memory_handle) {
+ LOG_DEBUG(Service_AM, "called, size={}", size);
+
+ if (size <= 0) {
+ LOG_ERROR(Service_AM, "size is less than or equal to 0");
+ R_THROW(ResultUnknown);
+ }
+
+ if (!transfer_memory_handle) {
+ LOG_ERROR(Service_AM, "transfer_memory_handle is null");
+ R_THROW(ResultUnknown);
+ }
+
+ *out_storage = std::make_shared<IStorage>(
+ system, AM::CreateHandleStorage(system.Kernel(), transfer_memory_handle->GetOwner()->GetMemory(),
+ transfer_memory_handle.Get(), size));
+ R_SUCCEED();
+}
+
+} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/library_applet_creator.h b/src/core/hle/service/am/service/library_applet_creator.h
new file mode 100644
index 0000000000..1c7f930055
--- /dev/null
+++ b/src/core/hle/service/am/service/library_applet_creator.h
@@ -0,0 +1,44 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/am/am_types.h"
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/service.h"
+
+namespace Service::AM {
+
+struct Applet;
+class ILibraryAppletAccessor;
+class IStorage;
+class WindowSystem;
+
+class ILibraryAppletCreator final : public ServiceFramework<ILibraryAppletCreator> {
+public:
+ explicit ILibraryAppletCreator(Core::System& system_, std::shared_ptr<Applet> applet,
+ WindowSystem& window_system);
+ ~ILibraryAppletCreator() override;
+
+private:
+ Result CreateLibraryApplet(
+ Out<SharedPointer<ILibraryAppletAccessor>> out_library_applet_accessor, AppletId applet_id,
+ LibraryAppletMode library_applet_mode);
+ Result CreateLibraryAppletEx(
+ Out<SharedPointer<ILibraryAppletAccessor>> out_library_applet_accessor, AppletId applet_id,
+ LibraryAppletMode library_applet_mode, u64 thread_id);
+ Result CreateStorage(Out<SharedPointer<IStorage>> out_storage, s64 size);
+ Result CreateTransferMemoryStorage(
+ Out<SharedPointer<IStorage>> out_storage, bool is_writable, s64 size,
+ InCopyHandle<Kernel::KTransferMemory> transfer_memory_handle);
+ Result CreateHandleStorage(Out<SharedPointer<IStorage>> out_storage, s64 size,
+ InCopyHandle<Kernel::KTransferMemory> transfer_memory_handle);
+
+ WindowSystem& m_window_system;
+ const std::shared_ptr<Applet> m_applet;
+};
+
+} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/library_applet_proxy.cpp b/src/core/hle/service/am/service/library_applet_proxy.cpp
new file mode 100644
index 0000000000..567ff75797
--- /dev/null
+++ b/src/core/hle/service/am/service/library_applet_proxy.cpp
@@ -0,0 +1,137 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/am/service/applet_common_functions.h"
+#include "core/hle/service/am/service/audio_controller.h"
+#include "core/hle/service/am/service/common_state_getter.h"
+#include "core/hle/service/am/service/debug_functions.h"
+#include "core/hle/service/am/service/display_controller.h"
+#include "core/hle/service/am/service/global_state_controller.h"
+#include "core/hle/service/am/service/home_menu_functions.h"
+#include "core/hle/service/am/service/library_applet_creator.h"
+#include "core/hle/service/am/service/library_applet_proxy.h"
+#include "core/hle/service/am/service/library_applet_self_accessor.h"
+#include "core/hle/service/am/service/process_winding_controller.h"
+#include "core/hle/service/am/service/self_controller.h"
+#include "core/hle/service/am/service/window_controller.h"
+#include "core/hle/service/cmif_serialization.h"
+
+namespace Service::AM {
+
+ILibraryAppletProxy::ILibraryAppletProxy(Core::System& system_, std::shared_ptr<Applet> applet,
+ Kernel::KProcess* process, WindowSystem& window_system)
+ : ServiceFramework{system_, "ILibraryAppletProxy"},
+ m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&ILibraryAppletProxy::GetCommonStateGetter>, "GetCommonStateGetter"},
+ {1, D<&ILibraryAppletProxy::GetSelfController>, "GetSelfController"},
+ {2, D<&ILibraryAppletProxy::GetWindowController>, "GetWindowController"},
+ {3, D<&ILibraryAppletProxy::GetAudioController>, "GetAudioController"},
+ {4, D<&ILibraryAppletProxy::GetDisplayController>, "GetDisplayController"},
+ {10, D<&ILibraryAppletProxy::GetProcessWindingController>, "GetProcessWindingController"},
+ {11, D<&ILibraryAppletProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"},
+ {20, D<&ILibraryAppletProxy::OpenLibraryAppletSelfAccessor>, "OpenLibraryAppletSelfAccessor"},
+ {21, D<&ILibraryAppletProxy::GetAppletCommonFunctions>, "GetAppletCommonFunctions"},
+ {22, D<&ILibraryAppletProxy::GetHomeMenuFunctions>, "GetHomeMenuFunctions"},
+ {23, D<&ILibraryAppletProxy::GetGlobalStateController>, "GetGlobalStateController"},
+ {1000, D<&ILibraryAppletProxy::GetDebugFunctions>, "GetDebugFunctions"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
+ILibraryAppletProxy::~ILibraryAppletProxy() = default;
+
+Result ILibraryAppletProxy::GetAudioController(
+ Out<SharedPointer<IAudioController>> out_audio_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_audio_controller = std::make_shared<IAudioController>(system);
+ R_SUCCEED();
+}
+
+Result ILibraryAppletProxy::GetDisplayController(
+ Out<SharedPointer<IDisplayController>> out_display_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_display_controller = std::make_shared<IDisplayController>(system, m_applet);
+ R_SUCCEED();
+}
+
+Result ILibraryAppletProxy::GetProcessWindingController(
+ Out<SharedPointer<IProcessWindingController>> out_process_winding_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_process_winding_controller = std::make_shared<IProcessWindingController>(system, m_applet);
+ R_SUCCEED();
+}
+
+Result ILibraryAppletProxy::GetDebugFunctions(
+ Out<SharedPointer<IDebugFunctions>> out_debug_functions) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_debug_functions = std::make_shared<IDebugFunctions>(system);
+ R_SUCCEED();
+}
+
+Result ILibraryAppletProxy::GetWindowController(
+ Out<SharedPointer<IWindowController>> out_window_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_window_controller = std::make_shared<IWindowController>(system, m_applet, m_window_system);
+ R_SUCCEED();
+}
+
+Result ILibraryAppletProxy::GetSelfController(
+ Out<SharedPointer<ISelfController>> out_self_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_self_controller = std::make_shared<ISelfController>(system, m_applet, m_process);
+ R_SUCCEED();
+}
+
+Result ILibraryAppletProxy::GetCommonStateGetter(
+ Out<SharedPointer<ICommonStateGetter>> out_common_state_getter) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_common_state_getter = std::make_shared<ICommonStateGetter>(system, m_applet);
+ R_SUCCEED();
+}
+
+Result ILibraryAppletProxy::GetLibraryAppletCreator(
+ Out<SharedPointer<ILibraryAppletCreator>> out_library_applet_creator) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_library_applet_creator =
+ std::make_shared<ILibraryAppletCreator>(system, m_applet, m_window_system);
+ R_SUCCEED();
+}
+
+Result ILibraryAppletProxy::OpenLibraryAppletSelfAccessor(
+ Out<SharedPointer<ILibraryAppletSelfAccessor>> out_library_applet_self_accessor) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_library_applet_self_accessor =
+ std::make_shared<ILibraryAppletSelfAccessor>(system, m_applet);
+ R_SUCCEED();
+}
+
+Result ILibraryAppletProxy::GetAppletCommonFunctions(
+ Out<SharedPointer<IAppletCommonFunctions>> out_applet_common_functions) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_applet_common_functions = std::make_shared<IAppletCommonFunctions>(system, m_applet);
+ R_SUCCEED();
+}
+
+Result ILibraryAppletProxy::GetHomeMenuFunctions(
+ Out<SharedPointer<IHomeMenuFunctions>> out_home_menu_functions) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_home_menu_functions =
+ std::make_shared<IHomeMenuFunctions>(system, m_applet, m_window_system);
+ R_SUCCEED();
+}
+
+Result ILibraryAppletProxy::GetGlobalStateController(
+ Out<SharedPointer<IGlobalStateController>> out_global_state_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_global_state_controller = std::make_shared<IGlobalStateController>(system);
+ R_SUCCEED();
+}
+
+} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/library_applet_proxy.h b/src/core/hle/service/am/service/library_applet_proxy.h
new file mode 100644
index 0000000000..c659dbe187
--- /dev/null
+++ b/src/core/hle/service/am/service/library_applet_proxy.h
@@ -0,0 +1,59 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/service.h"
+
+namespace Service::AM {
+
+struct Applet;
+class IAppletCommonFunctions;
+class IAudioController;
+class ICommonStateGetter;
+class IDebugFunctions;
+class IDisplayController;
+class IHomeMenuFunctions;
+class IGlobalStateController;
+class ILibraryAppletCreator;
+class ILibraryAppletSelfAccessor;
+class IProcessWindingController;
+class ISelfController;
+class IWindowController;
+class WindowSystem;
+
+class ILibraryAppletProxy final : public ServiceFramework<ILibraryAppletProxy> {
+public:
+ explicit ILibraryAppletProxy(Core::System& system_, std::shared_ptr<Applet> applet,
+ Kernel::KProcess* process, WindowSystem& window_system);
+ ~ILibraryAppletProxy();
+
+private:
+ Result GetAudioController(Out<SharedPointer<IAudioController>> out_audio_controller);
+ Result GetDisplayController(Out<SharedPointer<IDisplayController>> out_display_controller);
+ Result GetProcessWindingController(
+ Out<SharedPointer<IProcessWindingController>> out_process_winding_controller);
+ Result GetDebugFunctions(Out<SharedPointer<IDebugFunctions>> out_debug_functions);
+ Result GetWindowController(Out<SharedPointer<IWindowController>> out_window_controller);
+ Result GetSelfController(Out<SharedPointer<ISelfController>> out_self_controller);
+ Result GetCommonStateGetter(Out<SharedPointer<ICommonStateGetter>> out_common_state_getter);
+ Result GetLibraryAppletCreator(
+ Out<SharedPointer<ILibraryAppletCreator>> out_library_applet_creator);
+ Result OpenLibraryAppletSelfAccessor(
+ Out<SharedPointer<ILibraryAppletSelfAccessor>> out_library_applet_self_accessor);
+ Result GetAppletCommonFunctions(
+ Out<SharedPointer<IAppletCommonFunctions>> out_applet_common_functions);
+ Result GetHomeMenuFunctions(Out<SharedPointer<IHomeMenuFunctions>> out_home_menu_functions);
+ Result GetGlobalStateController(
+ Out<SharedPointer<IGlobalStateController>> out_global_state_controller);
+
+ WindowSystem& m_window_system;
+ Kernel::KProcess* const m_process;
+ const std::shared_ptr<Applet> m_applet;
+};
+
+} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/library_applet_self_accessor.cpp b/src/core/hle/service/am/service/library_applet_self_accessor.cpp
new file mode 100644
index 0000000000..907be49204
--- /dev/null
+++ b/src/core/hle/service/am/service/library_applet_self_accessor.cpp
@@ -0,0 +1,332 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/core_timing.h"
+#include "core/file_sys/control_metadata.h"
+#include "core/file_sys/patch_manager.h"
+#include "core/file_sys/registered_cache.h"
+#include "core/hle/service/acc/profile_manager.h"
+#include "core/hle/service/am/applet_data_broker.h"
+#include "core/hle/service/am/applet_manager.h"
+#include "core/hle/service/am/frontend/applets.h"
+#include "core/hle/service/am/service/library_applet_self_accessor.h"
+#include "core/hle/service/am/service/storage.h"
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/filesystem/filesystem.h"
+#include "core/hle/service/glue/glue_manager.h"
+#include "core/hle/service/ns/application_manager_interface.h"
+#include "core/hle/service/ns/service_getter_interface.h"
+#include "core/hle/service/sm/sm.h"
+
+namespace Service::AM {
+
+namespace {
+
+AppletIdentityInfo GetCallerIdentity(Applet& applet) {
+ if (const auto caller_applet = applet.caller_applet.lock(); caller_applet) {
+ // TODO: is this actually the application ID?
+ return {
+ .applet_id = caller_applet->applet_id,
+ .application_id = caller_applet->program_id,
+ };
+ } else {
+ return {
+ .applet_id = AppletId::QLaunch,
+ .application_id = 0x0100000000001000ull,
+ };
+ }
+}
+
+} // namespace
+
+ILibraryAppletSelfAccessor::ILibraryAppletSelfAccessor(Core::System& system_,
+ std::shared_ptr<Applet> applet)
+ : ServiceFramework{system_, "ILibraryAppletSelfAccessor"}, m_applet{std::move(applet)},
+ m_broker{m_applet->caller_applet_broker} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&ILibraryAppletSelfAccessor::PopInData>, "PopInData"},
+ {1, D<&ILibraryAppletSelfAccessor::PushOutData>, "PushOutData"},
+ {2, D<&ILibraryAppletSelfAccessor::PopInteractiveInData>, "PopInteractiveInData"},
+ {3, D<&ILibraryAppletSelfAccessor::PushInteractiveOutData>, "PushInteractiveOutData"},
+ {5, D<&ILibraryAppletSelfAccessor::GetPopInDataEvent>, "GetPopInDataEvent"},
+ {6, D<&ILibraryAppletSelfAccessor::GetPopInteractiveInDataEvent>, "GetPopInteractiveInDataEvent"},
+ {10, D<&ILibraryAppletSelfAccessor::ExitProcessAndReturn>, "ExitProcessAndReturn"},
+ {11, D<&ILibraryAppletSelfAccessor::GetLibraryAppletInfo>, "GetLibraryAppletInfo"},
+ {12, D<&ILibraryAppletSelfAccessor::GetMainAppletIdentityInfo>, "GetMainAppletIdentityInfo"},
+ {13, D<&ILibraryAppletSelfAccessor::CanUseApplicationCore>, "CanUseApplicationCore"},
+ {14, D<&ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfo>, "GetCallerAppletIdentityInfo"},
+ {15, D<&ILibraryAppletSelfAccessor::GetMainAppletApplicationControlProperty>, "GetMainAppletApplicationControlProperty"},
+ {16, D<&ILibraryAppletSelfAccessor::GetMainAppletStorageId>, "GetMainAppletStorageId"},
+ {17, D<&ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfoStack>, "GetCallerAppletIdentityInfoStack"},
+ {18, nullptr, "GetNextReturnDestinationAppletIdentityInfo"},
+ {19, D<&ILibraryAppletSelfAccessor::GetDesirableKeyboardLayout>, "GetDesirableKeyboardLayout"},
+ {20, nullptr, "PopExtraStorage"},
+ {25, nullptr, "GetPopExtraStorageEvent"},
+ {30, D<&ILibraryAppletSelfAccessor::UnpopInData>, "UnpopInData"},
+ {31, nullptr, "UnpopExtraStorage"},
+ {40, nullptr, "GetIndirectLayerProducerHandle"},
+ {50, D<&ILibraryAppletSelfAccessor::ReportVisibleError>, "ReportVisibleError"},
+ {51, D<&ILibraryAppletSelfAccessor::ReportVisibleErrorWithErrorContext>, "ReportVisibleErrorWithErrorContext"},
+ {60, D<&ILibraryAppletSelfAccessor::GetMainAppletApplicationDesiredLanguage>, "GetMainAppletApplicationDesiredLanguage"},
+ {70, D<&ILibraryAppletSelfAccessor::GetCurrentApplicationId>, "GetCurrentApplicationId"},
+ {80, nullptr, "RequestExitToSelf"},
+ {90, nullptr, "CreateApplicationAndPushAndRequestToLaunch"},
+ {100, nullptr, "CreateGameMovieTrimmer"},
+ {101, nullptr, "ReserveResourceForMovieOperation"},
+ {102, nullptr, "UnreserveResourceForMovieOperation"},
+ {110, D<&ILibraryAppletSelfAccessor::GetMainAppletAvailableUsers>, "GetMainAppletAvailableUsers"},
+ {120, nullptr, "GetLaunchStorageInfoForDebug"},
+ {130, nullptr, "GetGpuErrorDetectedSystemEvent"},
+ {140, nullptr, "SetApplicationMemoryReservation"},
+ {150, D<&ILibraryAppletSelfAccessor::ShouldSetGpuTimeSliceManually>, "ShouldSetGpuTimeSliceManually"},
+ {160, D<&ILibraryAppletSelfAccessor::GetLibraryAppletInfoEx>, "GetLibraryAppletInfoEx"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
+}
+
+ILibraryAppletSelfAccessor::~ILibraryAppletSelfAccessor() = default;
+
+Result ILibraryAppletSelfAccessor::PopInData(Out<SharedPointer<IStorage>> out_storage) {
+ LOG_INFO(Service_AM, "called");
+ R_RETURN(m_broker->GetInData().Pop(system.Kernel(), out_storage));
+}
+
+Result ILibraryAppletSelfAccessor::PushOutData(SharedPointer<IStorage> storage) {
+ LOG_INFO(Service_AM, "called");
+ m_broker->GetOutData().Push(system.Kernel(), storage);
+ R_SUCCEED();
+}
+
+Result ILibraryAppletSelfAccessor::PopInteractiveInData(Out<SharedPointer<IStorage>> out_storage) {
+ LOG_INFO(Service_AM, "called");
+ R_RETURN(m_broker->GetInteractiveInData().Pop(system.Kernel(), out_storage));
+}
+
+Result ILibraryAppletSelfAccessor::PushInteractiveOutData(SharedPointer<IStorage> storage) {
+ LOG_INFO(Service_AM, "called");
+ m_broker->GetInteractiveOutData().Push(system.Kernel(), storage);
+ R_SUCCEED();
+}
+
+Result ILibraryAppletSelfAccessor::GetPopInDataEvent(
+ OutCopyHandle<Kernel::KReadableEvent> out_event) {
+ LOG_INFO(Service_AM, "called");
+ *out_event = m_broker->GetInData().GetEvent();
+ R_SUCCEED();
+}
+
+Result ILibraryAppletSelfAccessor::GetPopInteractiveInDataEvent(
+ OutCopyHandle<Kernel::KReadableEvent> out_event) {
+ LOG_INFO(Service_AM, "called");
+ *out_event = m_broker->GetInteractiveInData().GetEvent();
+ R_SUCCEED();
+}
+
+Result ILibraryAppletSelfAccessor::GetLibraryAppletInfo(
+ Out<LibraryAppletInfo> out_library_applet_info) {
+ LOG_INFO(Service_AM, "called");
+ *out_library_applet_info = {
+ .applet_id = m_applet->applet_id,
+ .library_applet_mode = m_applet->library_applet_mode,
+ };
+ R_SUCCEED();
+}
+
+Result ILibraryAppletSelfAccessor::GetMainAppletIdentityInfo(
+ Out<AppletIdentityInfo> out_identity_info) {
+ LOG_WARNING(Service_AM, "(STUBBED) called");
+ *out_identity_info = {
+ .applet_id = AppletId::QLaunch,
+ .application_id = 0x0100000000001000ull,
+ };
+ R_SUCCEED();
+}
+
+Result ILibraryAppletSelfAccessor::CanUseApplicationCore(Out<bool> out_can_use_application_core) {
+ // TODO: This appears to read the NPDM from state and check the core mask of the applet.
+ LOG_WARNING(Service_AM, "(STUBBED) called");
+ *out_can_use_application_core = false;
+ R_SUCCEED();
+}
+
+Result ILibraryAppletSelfAccessor::GetMainAppletApplicationControlProperty(
+ OutLargeData<std::array<u8, 0x4000>, BufferAttr_HipcMapAlias> out_nacp) {
+ LOG_WARNING(Service_AM, "(STUBBED) called");
+
+ // TODO: this should be the main applet, not the caller applet
+ const auto application = GetCallerIdentity(*m_applet);
+ std::vector<u8> nacp;
+ const auto result =
+ system.GetARPManager().GetControlProperty(&nacp, application.application_id);
+
+ if (R_SUCCEEDED(result)) {
+ std::memcpy(out_nacp->data(), nacp.data(), (std::min)(nacp.size(), out_nacp->size()));
+ }
+
+ R_RETURN(result);
+}
+
+Result ILibraryAppletSelfAccessor::GetMainAppletStorageId(Out<FileSys::StorageId> out_storage_id) {
+ LOG_INFO(Service_AM, "(STUBBED) called");
+ *out_storage_id = FileSys::StorageId::NandUser;
+ R_SUCCEED();
+}
+
+Result ILibraryAppletSelfAccessor::ExitProcessAndReturn() {
+ LOG_INFO(Service_AM, "called");
+
+ if (const auto caller_applet = m_applet->caller_applet.lock(); caller_applet) {
+ m_applet->process->Terminate();
+ } else {
+ system.GetUserChannel() = m_applet->user_channel_launch_parameter;
+ system.ExecuteProgram(0);
+ }
+
+ R_SUCCEED();
+}
+
+Result ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfo(
+ Out<AppletIdentityInfo> out_identity_info) {
+ LOG_INFO(Service_AM, "called");
+ *out_identity_info = GetCallerIdentity(*m_applet);
+ R_SUCCEED();
+}
+
+Result ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfoStack(
+ Out<s32> out_count, OutArray<AppletIdentityInfo, BufferAttr_HipcMapAlias> out_identity_info) {
+ LOG_INFO(Service_AM, "called");
+
+ std::shared_ptr<Applet> applet = m_applet;
+ *out_count = 0;
+
+ do {
+ if (*out_count >= static_cast<s32>(out_identity_info.size())) {
+ break;
+ }
+ out_identity_info[(*out_count)++] = GetCallerIdentity(*applet);
+ } while ((applet = applet->caller_applet.lock()));
+
+ R_SUCCEED();
+}
+
+Result ILibraryAppletSelfAccessor::GetDesirableKeyboardLayout(Out<u32> out_desirable_layout) {
+ LOG_WARNING(Service_AM, "(STUBBED) called");
+ *out_desirable_layout = 0;
+ R_SUCCEED();
+}
+
+Result ILibraryAppletSelfAccessor::ReportVisibleError(ErrorCode error_code) {
+ LOG_WARNING(Service_AM, "(STUBBED) called, error {}-{}", error_code.category,
+ error_code.number);
+ R_SUCCEED();
+}
+
+Result ILibraryAppletSelfAccessor::ReportVisibleErrorWithErrorContext(
+ ErrorCode error_code, InLargeData<ErrorContext, BufferAttr_HipcMapAlias> error_context) {
+ LOG_WARNING(Service_AM, "(STUBBED) called, error {}-{}", error_code.category,
+ error_code.number);
+ R_SUCCEED();
+}
+
+Result ILibraryAppletSelfAccessor::UnpopInData(SharedPointer<IStorage> storage) {
+ LOG_INFO(Service_AM, "called");
+ m_broker->GetInData().Unpop(system.Kernel(), storage);
+ R_SUCCEED();
+}
+
+Result ILibraryAppletSelfAccessor::GetMainAppletApplicationDesiredLanguage(
+ Out<u64> out_desired_language) {
+ // FIXME: this is copied from IApplicationFunctions::GetDesiredLanguage
+ // FIXME: all of this stuff belongs to ns
+ auto identity = GetCallerIdentity(*m_applet);
+
+ // TODO(bunnei): This should be configurable
+ LOG_DEBUG(Service_AM, "called");
+
+ // Get supported languages from NACP, if possible
+ // Default to 0 (all languages supported)
+ u32 supported_languages = 0;
+
+ const auto res = FileSys::PatchManager::GetMetadataFromBaseOrUpdate(system, identity.application_id);
+
+ if (res.first != nullptr) {
+ supported_languages = res.first->GetSupportedLanguages();
+ }
+
+ // Call IApplicationManagerInterface implementation.
+ auto& service_manager = system.ServiceManager();
+ auto ns_am2 = service_manager.GetService<NS::IServiceGetterInterface>("ns:am2");
+
+ std::shared_ptr<NS::IApplicationManagerInterface> app_man;
+ R_TRY(ns_am2->GetApplicationManagerInterface(&app_man));
+
+ // Get desired application language
+ NS::ApplicationLanguage desired_language{};
+ R_TRY(app_man->GetApplicationDesiredLanguage(&desired_language, supported_languages));
+
+ // Convert to settings language code.
+ u64 language_code{};
+ R_TRY(app_man->ConvertApplicationLanguageToLanguageCode(&language_code, desired_language));
+
+ LOG_DEBUG(Service_AM, "got desired_language={:016X}", language_code);
+
+ *out_desired_language = language_code;
+ R_SUCCEED();
+}
+
+Result ILibraryAppletSelfAccessor::GetCurrentApplicationId(Out<u64> out_application_id) {
+ LOG_WARNING(Service_AM, "(STUBBED) called");
+
+ // TODO: this should be the main applet, not the caller applet
+ const auto main_applet = GetCallerIdentity(*m_applet);
+ *out_application_id = main_applet.application_id;
+
+ R_SUCCEED();
+}
+
+Result ILibraryAppletSelfAccessor::GetMainAppletAvailableUsers(
+ Out<bool> out_can_select_any_user, Out<s32> out_users_count,
+ OutArray<Common::UUID, BufferAttr_HipcMapAlias> out_users) {
+ const Service::Account::ProfileManager manager{};
+
+ *out_can_select_any_user = false;
+ *out_users_count = -1;
+
+ LOG_INFO(Service_AM, "called");
+
+ if (manager.GetUserCount() > 0) {
+ *out_can_select_any_user = true;
+ *out_users_count = static_cast<s32>(manager.GetUserCount());
+
+ const auto users = manager.GetAllUsers();
+ for (size_t i = 0; i < users.size() && i < out_users.size(); i++) {
+ out_users[i] = users[i];
+ }
+ }
+
+ R_SUCCEED();
+}
+
+Result ILibraryAppletSelfAccessor::ShouldSetGpuTimeSliceManually(
+ Out<bool> out_should_set_gpu_time_slice_manually) {
+ LOG_INFO(Service_AM, "(STUBBED) called");
+ *out_should_set_gpu_time_slice_manually = false;
+ R_SUCCEED();
+}
+
+Result ILibraryAppletSelfAccessor::GetLibraryAppletInfoEx(
+ Out<LibraryAppletInfo> out_library_applet_info) {
+ LOG_INFO(Service_AM, "called");
+ *out_library_applet_info = {
+ .applet_id = m_applet->applet_id,
+ .library_applet_mode = m_applet->library_applet_mode,
+ };
+ R_SUCCEED();
+}
+
+} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/library_applet_self_accessor.h b/src/core/hle/service/am/service/library_applet_self_accessor.h
new file mode 100644
index 0000000000..d287f6b403
--- /dev/null
+++ b/src/core/hle/service/am/service/library_applet_self_accessor.h
@@ -0,0 +1,87 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "common/uuid.h"
+#include "core/hle/service/am/am_types.h"
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/service.h"
+
+namespace FileSys {
+enum class StorageId : u8;
+}
+
+namespace Kernel {
+class KReadableEvent;
+}
+
+namespace Service::AM {
+
+class AppletDataBroker;
+struct Applet;
+class IStorage;
+
+struct LibraryAppletInfo {
+ AppletId applet_id;
+ LibraryAppletMode library_applet_mode;
+};
+static_assert(sizeof(LibraryAppletInfo) == 0x8, "LibraryAppletInfo has incorrect size.");
+
+struct ErrorCode {
+ u32 category;
+ u32 number;
+};
+static_assert(sizeof(ErrorCode) == 0x8, "ErrorCode has incorrect size.");
+
+struct ErrorContext {
+ u8 type;
+ INSERT_PADDING_BYTES_NOINIT(0x7);
+ std::array<u8, 0x1f4> data;
+ Result result;
+};
+static_assert(sizeof(ErrorContext) == 0x200, "ErrorContext has incorrect size.");
+
+class ILibraryAppletSelfAccessor final : public ServiceFramework<ILibraryAppletSelfAccessor> {
+public:
+ explicit ILibraryAppletSelfAccessor(Core::System& system_, std::shared_ptr<Applet> applet);
+ ~ILibraryAppletSelfAccessor() override;
+
+private:
+ Result PopInData(Out<SharedPointer<IStorage>> out_storage);
+ Result PushOutData(SharedPointer<IStorage> storage);
+ Result PopInteractiveInData(Out<SharedPointer<IStorage>> out_storage);
+ Result PushInteractiveOutData(SharedPointer<IStorage> storage);
+ Result GetPopInDataEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
+ Result GetPopInteractiveInDataEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
+ Result GetLibraryAppletInfo(Out<LibraryAppletInfo> out_library_applet_info);
+ Result GetMainAppletIdentityInfo(Out<AppletIdentityInfo> out_identity_info);
+ Result CanUseApplicationCore(Out<bool> out_can_use_application_core);
+ Result GetMainAppletApplicationControlProperty(
+ OutLargeData<std::array<u8, 0x4000>, BufferAttr_HipcMapAlias> out_nacp);
+ Result GetMainAppletStorageId(Out<FileSys::StorageId> out_storage_id);
+ Result ExitProcessAndReturn();
+ Result GetCallerAppletIdentityInfo(Out<AppletIdentityInfo> out_identity_info);
+ Result GetCallerAppletIdentityInfoStack(
+ Out<s32> out_count,
+ OutArray<AppletIdentityInfo, BufferAttr_HipcMapAlias> out_identity_info);
+ Result GetDesirableKeyboardLayout(Out<u32> out_desirable_layout);
+ Result ReportVisibleError(ErrorCode error_code);
+ Result ReportVisibleErrorWithErrorContext(
+ ErrorCode error_code, InLargeData<ErrorContext, BufferAttr_HipcMapAlias> error_context);
+ Result UnpopInData(SharedPointer<IStorage> storage);
+ Result GetMainAppletApplicationDesiredLanguage(Out<u64> out_desired_language);
+ Result GetCurrentApplicationId(Out<u64> out_application_id);
+ Result GetMainAppletAvailableUsers(Out<bool> out_can_select_any_user, Out<s32> out_users_count,
+ OutArray<Common::UUID, BufferAttr_HipcMapAlias> out_users);
+ Result ShouldSetGpuTimeSliceManually(Out<bool> out_should_set_gpu_time_slice_manually);
+ Result GetLibraryAppletInfoEx(Out<LibraryAppletInfo> out_library_applet_info);
+
+ const std::shared_ptr<Applet> m_applet;
+ const std::shared_ptr<AppletDataBroker> m_broker;
+};
+
+} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/lock_accessor.cpp b/src/core/hle/service/am/service/lock_accessor.cpp
new file mode 100644
index 0000000000..0341254449
--- /dev/null
+++ b/src/core/hle/service/am/service/lock_accessor.cpp
@@ -0,0 +1,78 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/am/service/lock_accessor.h"
+#include "core/hle/service/cmif_serialization.h"
+
+namespace Service::AM {
+
+ILockAccessor::ILockAccessor(Core::System& system_)
+ : ServiceFramework{system_, "ILockAccessor"}, m_context{system_, "ILockAccessor"},
+ m_event{m_context} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {1, D<&ILockAccessor::TryLock>, "TryLock"},
+ {2, D<&ILockAccessor::Unlock>, "Unlock"},
+ {3, D<&ILockAccessor::GetEvent>, "GetEvent"},
+ {4, D<&ILockAccessor::IsLocked>, "IsLocked"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+
+ m_event.Signal(system.Kernel());
+}
+
+ILockAccessor::~ILockAccessor() = default;
+
+Result ILockAccessor::TryLock(Out<bool> out_is_locked,
+ OutCopyHandle<Kernel::KReadableEvent> out_handle,
+ bool return_handle) {
+ LOG_INFO(Service_AM, "called, return_handle={}", return_handle);
+
+ {
+ std::scoped_lock lk{m_mutex};
+ if (m_is_locked) {
+ *out_is_locked = false;
+ } else {
+ m_is_locked = true;
+ *out_is_locked = true;
+ }
+ }
+
+ if (return_handle) {
+ *out_handle = m_event.GetHandle();
+ }
+
+ R_SUCCEED();
+}
+
+Result ILockAccessor::Unlock() {
+ LOG_INFO(Service_AM, "called");
+
+ {
+ std::scoped_lock lk{m_mutex};
+ m_is_locked = false;
+ }
+
+ m_event.Signal(system.Kernel());
+ R_SUCCEED();
+}
+
+Result ILockAccessor::GetEvent(OutCopyHandle<Kernel::KReadableEvent> out_handle) {
+ LOG_INFO(Service_AM, "called");
+ *out_handle = m_event.GetHandle();
+ R_SUCCEED();
+}
+
+Result ILockAccessor::IsLocked(Out<bool> out_is_locked) {
+ LOG_INFO(Service_AM, "called");
+ std::scoped_lock lk{m_mutex};
+ *out_is_locked = m_is_locked;
+ R_SUCCEED();
+}
+
+} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/lock_accessor.h b/src/core/hle/service/am/service/lock_accessor.h
new file mode 100644
index 0000000000..fe3f11dcf0
--- /dev/null
+++ b/src/core/hle/service/am/service/lock_accessor.h
@@ -0,0 +1,35 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/kernel_helpers.h"
+#include "core/hle/service/os/event.h"
+#include "core/hle/service/service.h"
+
+namespace Service::AM {
+
+class ILockAccessor final : public ServiceFramework<ILockAccessor> {
+public:
+ explicit ILockAccessor(Core::System& system_);
+ ~ILockAccessor() override;
+
+private:
+ Result TryLock(Out<bool> out_is_locked, OutCopyHandle<Kernel::KReadableEvent> out_handle,
+ bool return_handle);
+ Result Unlock();
+ Result GetEvent(OutCopyHandle<Kernel::KReadableEvent> out_handle);
+ Result IsLocked(Out<bool> out_is_locked);
+
+private:
+ KernelHelpers::ServiceContext m_context;
+ Event m_event;
+ std::mutex m_mutex{};
+ bool m_is_locked{};
+};
+
+} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/overlay_applet_proxy.cpp b/src/core/hle/service/am/service/overlay_applet_proxy.cpp
new file mode 100644
index 0000000000..735ba9d307
--- /dev/null
+++ b/src/core/hle/service/am/service/overlay_applet_proxy.cpp
@@ -0,0 +1,120 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "core/hle/service/am/service/common_state_getter.h"
+#include "core/hle/service/am/service/display_controller.h"
+#include "core/hle/service/am/service/global_state_controller.h"
+#include "core/hle/service/am/service/audio_controller.h"
+#include "core/hle/service/am/service/applet_common_functions.h"
+#include "core/hle/service/am/service/overlay_applet_proxy.h"
+#include "core/hle/service/am/service/library_applet_creator.h"
+#include "core/hle/service/am/service/process_winding_controller.h"
+#include "core/hle/service/am/service/self_controller.h"
+#include "core/hle/service/am/service/window_controller.h"
+#include "core/hle/service/am/service/debug_functions.h"
+#include "core/hle/service/cmif_serialization.h"
+
+namespace Service::AM {
+ IOverlayAppletProxy::IOverlayAppletProxy(Core::System &system_, std::shared_ptr<Applet> applet,
+ Kernel::KProcess *process, WindowSystem &window_system)
+ : ServiceFramework{system_, "IOverlayAppletProxy"},
+ m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IOverlayAppletProxy::GetCommonStateGetter>, "GetCommonStateGetter"},
+ {1, D<&IOverlayAppletProxy::GetSelfController>, "GetSelfController"},
+ {2, D<&IOverlayAppletProxy::GetWindowController>, "GetWindowController"},
+ {3, D<&IOverlayAppletProxy::GetAudioController>, "GetAudioController"},
+ {4, D<&IOverlayAppletProxy::GetDisplayController>, "GetDisplayController"},
+ {10, D<&IOverlayAppletProxy::GetProcessWindingController>, "GetProcessWindingController"},
+ {11, D<&IOverlayAppletProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"},
+ {20, D<&IOverlayAppletProxy::GetOverlayFunctions>, "GetOverlayFunctions"},
+ {21, D<&IOverlayAppletProxy::GetAppletCommonFunctions>, "GetAppletCommonFunctions"},
+ {23, D<&IOverlayAppletProxy::GetGlobalStateController>, "GetGlobalStateController"},
+ {1000, D<&IOverlayAppletProxy::GetDebugFunctions>, "GetDebugFunctions"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+ }
+
+ IOverlayAppletProxy::~IOverlayAppletProxy() = default;
+
+ Result IOverlayAppletProxy::GetCommonStateGetter(
+ Out<SharedPointer<ICommonStateGetter> > out_common_state_getter) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_common_state_getter = std::make_shared<ICommonStateGetter>(system, m_applet);
+ R_SUCCEED();
+ }
+
+ Result IOverlayAppletProxy::GetSelfController(
+ Out<SharedPointer<ISelfController> > out_self_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_self_controller = std::make_shared<ISelfController>(system, m_applet, m_process);
+ R_SUCCEED();
+ }
+
+ Result IOverlayAppletProxy::GetWindowController(
+ Out<SharedPointer<IWindowController> > out_window_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_window_controller = std::make_shared<IWindowController>(system, m_applet, m_window_system);
+ R_SUCCEED();
+ }
+
+ Result IOverlayAppletProxy::GetAudioController(
+ Out<SharedPointer<IAudioController> > out_audio_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_audio_controller = std::make_shared<IAudioController>(system);
+ R_SUCCEED();
+ }
+
+ Result IOverlayAppletProxy::GetDisplayController(
+ Out<SharedPointer<IDisplayController> > out_display_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_display_controller = std::make_shared<IDisplayController>(system, m_applet);
+ R_SUCCEED();
+ }
+
+ Result IOverlayAppletProxy::GetProcessWindingController(
+ Out<SharedPointer<IProcessWindingController> > out_process_winding_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_process_winding_controller = std::make_shared<IProcessWindingController>(system, m_applet);
+ R_SUCCEED();
+ }
+
+ Result IOverlayAppletProxy::GetLibraryAppletCreator(
+ Out<SharedPointer<ILibraryAppletCreator> > out_library_applet_creator) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_library_applet_creator =
+ std::make_shared<ILibraryAppletCreator>(system, m_applet, m_window_system);
+ R_SUCCEED();
+ }
+
+ Result IOverlayAppletProxy::GetOverlayFunctions(
+ Out<SharedPointer<IOverlayFunctions> > out_overlay_functions) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_overlay_functions = std::make_shared<IOverlayFunctions>(system, m_applet);
+ R_SUCCEED();
+ }
+
+ Result IOverlayAppletProxy::GetAppletCommonFunctions(
+ Out<SharedPointer<IAppletCommonFunctions> > out_applet_common_functions) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_applet_common_functions = std::make_shared<IAppletCommonFunctions>(system, m_applet);
+ R_SUCCEED();
+ }
+
+ Result IOverlayAppletProxy::GetGlobalStateController(
+ Out<SharedPointer<IGlobalStateController> > out_global_state_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_global_state_controller = std::make_shared<IGlobalStateController>(system);
+ R_SUCCEED();
+ }
+
+ Result IOverlayAppletProxy::GetDebugFunctions(
+ Out<SharedPointer<IDebugFunctions> > out_debug_functions) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_debug_functions = std::make_shared<IDebugFunctions>(system);
+ R_SUCCEED();
+ }
+} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/overlay_applet_proxy.h b/src/core/hle/service/am/service/overlay_applet_proxy.h
new file mode 100644
index 0000000000..6c02166a2d
--- /dev/null
+++ b/src/core/hle/service/am/service/overlay_applet_proxy.h
@@ -0,0 +1,55 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/service.h"
+#include "core/hle/service/am/service/overlay_functions.h"
+
+namespace Service::AM {
+
+struct Applet;
+class IAppletCommonFunctions;
+class IAudioController;
+class ICommonStateGetter;
+class IDebugFunctions;
+class IDisplayController;
+class IHomeMenuFunctions;
+class IGlobalStateController;
+class ILibraryAppletCreator;
+class ILibraryAppletSelfAccessor;
+class IProcessWindingController;
+class ISelfController;
+class IWindowController;
+class WindowSystem;
+
+class IOverlayAppletProxy final : public ServiceFramework<IOverlayAppletProxy> {
+public:
+ explicit IOverlayAppletProxy(Core::System& system_, std::shared_ptr<Applet> applet,
+ Kernel::KProcess* process, WindowSystem& window_system);
+ ~IOverlayAppletProxy();
+
+private:
+ Result GetCommonStateGetter(Out<SharedPointer<ICommonStateGetter>> out_common_state_getter);
+ Result GetSelfController(Out<SharedPointer<ISelfController>> out_self_controller);
+ Result GetWindowController(Out<SharedPointer<IWindowController>> out_window_controller);
+ Result GetAudioController(Out<SharedPointer<IAudioController>> out_audio_controller);
+ Result GetDisplayController(Out<SharedPointer<IDisplayController>> out_display_controller);
+ Result GetProcessWindingController(
+ Out<SharedPointer<IProcessWindingController>> out_process_winding_controller);
+ Result GetLibraryAppletCreator(
+ Out<SharedPointer<ILibraryAppletCreator>> out_library_applet_creator);
+ Result GetOverlayFunctions(Out<SharedPointer<IOverlayFunctions>> out_overlay_functions);
+ Result GetAppletCommonFunctions(
+ Out<SharedPointer<IAppletCommonFunctions>> out_applet_common_functions);
+ Result GetGlobalStateController(
+ Out<SharedPointer<IGlobalStateController>> out_global_state_controller);
+ Result GetDebugFunctions(Out<SharedPointer<IDebugFunctions>> out_debug_functions);
+
+ WindowSystem& m_window_system;
+ Kernel::KProcess* const m_process;
+ const std::shared_ptr<Applet> m_applet;
+};
+
+} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/overlay_functions.cpp b/src/core/hle/service/am/service/overlay_functions.cpp
index 006610bd47..8150b5dd07 100644
--- a/src/core/hle/service/am/service/overlay_functions.cpp
+++ b/src/core/hle/service/am/service/overlay_functions.cpp
@@ -8,34 +8,34 @@
#include "core/hle/service/am/window_system.h"
namespace Service::AM {
- std::optional<ServiceFrameworkBase::FunctionInfoBase> IOverlayFunctions::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IOverlayFunctions::BeginToWatchShortHomeButtonMessage>, "BeginToWatchShortHomeButtonMessage"},
- FunctionInfo{1, D<&IOverlayFunctions::EndToWatchShortHomeButtonMessage>, "EndToWatchShortHomeButtonMessage"},
- FunctionInfo{2, D<&IOverlayFunctions::GetApplicationIdForLogo>, "GetApplicationIdForLogo"},
- FunctionInfo{3, nullptr, "SetGpuTimeSliceBoost"},
- FunctionInfo{4, D<&IOverlayFunctions::SetAutoSleepTimeAndDimmingTimeEnabled>, "SetAutoSleepTimeAndDimmingTimeEnabled"},
- FunctionInfo{5, nullptr, "TerminateApplicationAndSetReason"},
- FunctionInfo{6, nullptr, "SetScreenShotPermissionGlobally"},
- FunctionInfo{10, nullptr, "StartShutdownSequenceForOverlay"},
- FunctionInfo{11, nullptr, "StartRebootSequenceForOverlay"},
- FunctionInfo{20, D<&IOverlayFunctions::SetHandlingHomeButtonShortPressedEnabled>, "SetHandlingHomeButtonShortPressedEnabled"},
- FunctionInfo{21, D<&IOverlayFunctions::SetHandlingTouchScreenInputEnabled>, "SetHandlingTouchScreenInputEnabled"},
- FunctionInfo{30, nullptr, "SetHealthWarningShowingState"},
- FunctionInfo{31, D<&IOverlayFunctions::IsHealthWarningRequired>, "IsHealthWarningRequired"},
- FunctionInfo{40, nullptr, "GetApplicationNintendoLogo"},
- FunctionInfo{41, nullptr, "GetApplicationStartupMovie"},
- FunctionInfo{50, nullptr, "SetGpuTimeSliceBoostForApplication"},
- FunctionInfo{60, nullptr, "Unknown60"},
- FunctionInfo{70, D<&IOverlayFunctions::Unknown70>, "Unknown70"},
- FunctionInfo{90, nullptr, "SetRequiresGpuResourceUse"},
- FunctionInfo{101, nullptr, "BeginToObserveHidInputForDevelop"}
- );
- return HandlerTableGenerateWithFind(key, functions);
- }
-
IOverlayFunctions::IOverlayFunctions(Core::System &system_, std::shared_ptr<Applet> applet)
: ServiceFramework{system_, "IOverlayFunctions"}, m_applet{std::move(applet)} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IOverlayFunctions::BeginToWatchShortHomeButtonMessage>, "BeginToWatchShortHomeButtonMessage"},
+ {1, D<&IOverlayFunctions::EndToWatchShortHomeButtonMessage>, "EndToWatchShortHomeButtonMessage"},
+ {2, D<&IOverlayFunctions::GetApplicationIdForLogo>, "GetApplicationIdForLogo"},
+ {3, nullptr, "SetGpuTimeSliceBoost"},
+ {4, D<&IOverlayFunctions::SetAutoSleepTimeAndDimmingTimeEnabled>, "SetAutoSleepTimeAndDimmingTimeEnabled"},
+ {5, nullptr, "TerminateApplicationAndSetReason"},
+ {6, nullptr, "SetScreenShotPermissionGlobally"},
+ {10, nullptr, "StartShutdownSequenceForOverlay"},
+ {11, nullptr, "StartRebootSequenceForOverlay"},
+ {20, D<&IOverlayFunctions::SetHandlingHomeButtonShortPressedEnabled>, "SetHandlingHomeButtonShortPressedEnabled"},
+ {21, D<&IOverlayFunctions::SetHandlingTouchScreenInputEnabled>, "SetHandlingTouchScreenInputEnabled"},
+ {30, nullptr, "SetHealthWarningShowingState"},
+ {31, D<&IOverlayFunctions::IsHealthWarningRequired>, "IsHealthWarningRequired"},
+ {40, nullptr, "GetApplicationNintendoLogo"},
+ {41, nullptr, "GetApplicationStartupMovie"},
+ {50, nullptr, "SetGpuTimeSliceBoostForApplication"},
+ {60, nullptr, "Unknown60"},
+ {70, D<&IOverlayFunctions::Unknown70>, "Unknown70"},
+ {90, nullptr, "SetRequiresGpuResourceUse"},
+ {101, nullptr, "BeginToObserveHidInputForDevelop"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IOverlayFunctions::~IOverlayFunctions() = default;
diff --git a/src/core/hle/service/am/service/overlay_functions.h b/src/core/hle/service/am/service/overlay_functions.h
index b94f0cc0d5..eefd8d862b 100644
--- a/src/core/hle/service/am/service/overlay_functions.h
+++ b/src/core/hle/service/am/service/overlay_functions.h
@@ -6,25 +6,24 @@
#include "core/hle/service/service.h"
namespace Service::AM {
-struct Applet;
+ struct Applet;
-class IOverlayFunctions final : public ServiceFramework<IOverlayFunctions> {
-public:
- explicit IOverlayFunctions(Core::System &system_, std::shared_ptr<Applet> applet);
- ~IOverlayFunctions() override;
+ class IOverlayFunctions final : public ServiceFramework<IOverlayFunctions> {
+ public:
+ explicit IOverlayFunctions(Core::System &system_, std::shared_ptr<Applet> applet);
+ ~IOverlayFunctions() override;
-private:
- Result BeginToWatchShortHomeButtonMessage();
- Result EndToWatchShortHomeButtonMessage();
- Result GetApplicationIdForLogo(Out<u64> out_application_id);
- Result SetAutoSleepTimeAndDimmingTimeEnabled(bool enabled);
- Result IsHealthWarningRequired(Out<bool> is_required);
- Result SetHandlingHomeButtonShortPressedEnabled(bool enabled);
- Result SetHandlingTouchScreenInputEnabled(bool enabled);
- Result Unknown70();
+ private:
+ Result BeginToWatchShortHomeButtonMessage();
+ Result EndToWatchShortHomeButtonMessage();
+ Result GetApplicationIdForLogo(Out<u64> out_application_id);
+ Result SetAutoSleepTimeAndDimmingTimeEnabled(bool enabled);
+ Result IsHealthWarningRequired(Out<bool> is_required);
+ Result SetHandlingHomeButtonShortPressedEnabled(bool enabled);
+ Result SetHandlingTouchScreenInputEnabled(bool enabled);
+ Result Unknown70();
-private:
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
- const std::shared_ptr<Applet> m_applet;
-};
+ private:
+ const std::shared_ptr<Applet> m_applet;
+ };
} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/process_winding_controller.cpp b/src/core/hle/service/am/service/process_winding_controller.cpp
index 159f4dfd5c..e284aa2d89 100644
--- a/src/core/hle/service/am/service/process_winding_controller.cpp
+++ b/src/core/hle/service/am/service/process_winding_controller.cpp
@@ -13,23 +13,23 @@
namespace Service::AM {
- std::optional<ServiceFrameworkBase::FunctionInfoBase> IProcessWindingController::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IProcessWindingController::GetLaunchReason>, "GetLaunchReason"},
- FunctionInfo{11, D<&IProcessWindingController::OpenCallingLibraryApplet>, "OpenCallingLibraryApplet"},
- FunctionInfo{21, D<&IProcessWindingController::PushContext>, "PushContext"},
- FunctionInfo{22, D<&IProcessWindingController::PopContext>, "PopContext"},
- FunctionInfo{23, D<&IProcessWindingController::CancelWindingReservation>, "CancelWindingReservation"},
- FunctionInfo{30, D<&IProcessWindingController::WindAndDoReserved>, "WindAndDoReserved"},
- FunctionInfo{40, D<&IProcessWindingController::ReserveToStartAndWaitAndUnwindThis>, "ReserveToStartAndWaitAndUnwindThis"},
- FunctionInfo{41, D<&IProcessWindingController::ReserveToStartAndWait>, "ReserveToStartAndWait"}
- );
- return HandlerTableGenerateWithFind(key, functions);
- }
-
IProcessWindingController::IProcessWindingController(Core::System& system_,
std::shared_ptr<Applet> applet)
: ServiceFramework{system_, "IProcessWindingController"}, m_applet{std::move(applet)} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IProcessWindingController::GetLaunchReason>, "GetLaunchReason"},
+ {11, D<&IProcessWindingController::OpenCallingLibraryApplet>, "OpenCallingLibraryApplet"},
+ {21, D<&IProcessWindingController::PushContext>, "PushContext"},
+ {22, D<&IProcessWindingController::PopContext>, "PopContext"},
+ {23, D<&IProcessWindingController::CancelWindingReservation>, "CancelWindingReservation"},
+ {30, D<&IProcessWindingController::WindAndDoReserved>, "WindAndDoReserved"},
+ {40, D<&IProcessWindingController::ReserveToStartAndWaitAndUnwindThis>, "ReserveToStartAndWaitAndUnwindThis"},
+ {41, D<&IProcessWindingController::ReserveToStartAndWait>, "ReserveToStartAndWait"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IProcessWindingController::~IProcessWindingController() = default;
diff --git a/src/core/hle/service/am/service/process_winding_controller.h b/src/core/hle/service/am/service/process_winding_controller.h
index 91b29ac04b..f3417bcd97 100644
--- a/src/core/hle/service/am/service/process_winding_controller.h
+++ b/src/core/hle/service/am/service/process_winding_controller.h
@@ -33,7 +33,6 @@ private:
SharedPointer<ILibraryAppletAccessor> reserved_applet_accessor);
Result ReserveToStartAndWait(SharedPointer<ILibraryAppletAccessor> reserved_applet_accessor);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
const std::shared_ptr<Applet> m_applet;
};
diff --git a/src/core/hle/service/am/service/self_controller.cpp b/src/core/hle/service/am/service/self_controller.cpp
index ce8a308d6a..3a654b9daa 100644
--- a/src/core/hle/service/am/service/self_controller.cpp
+++ b/src/core/hle/service/am/service/self_controller.cpp
@@ -17,66 +17,67 @@
namespace Service::AM {
- std::optional<ServiceFrameworkBase::FunctionInfoBase> ISelfController::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&ISelfController::Exit>, "Exit"},
- FunctionInfo{1, D<&ISelfController::LockExit>, "LockExit"},
- FunctionInfo{2, D<&ISelfController::UnlockExit>, "UnlockExit"},
- FunctionInfo{3, D<&ISelfController::EnterFatalSection>, "EnterFatalSection"},
- FunctionInfo{4, D<&ISelfController::LeaveFatalSection>, "LeaveFatalSection"},
- FunctionInfo{9, D<&ISelfController::GetLibraryAppletLaunchableEvent>, "GetLibraryAppletLaunchableEvent"},
- FunctionInfo{10, D<&ISelfController::SetScreenShotPermission>, "SetScreenShotPermission"},
- FunctionInfo{11, D<&ISelfController::SetOperationModeChangedNotification>, "SetOperationModeChangedNotification"},
- FunctionInfo{12, D<&ISelfController::SetPerformanceModeChangedNotification>, "SetPerformanceModeChangedNotification"},
- FunctionInfo{13, D<&ISelfController::SetFocusHandlingMode>, "SetFocusHandlingMode"},
- FunctionInfo{14, D<&ISelfController::SetRestartMessageEnabled>, "SetRestartMessageEnabled"},
- FunctionInfo{15, D<&ISelfController::SetScreenShotAppletIdentityInfo>, "SetScreenShotAppletIdentityInfo"},
- FunctionInfo{16, D<&ISelfController::SetOutOfFocusSuspendingEnabled>, "SetOutOfFocusSuspendingEnabled"},
- FunctionInfo{17, nullptr, "SetControllerFirmwareUpdateSection"},
- FunctionInfo{18, nullptr, "SetRequiresCaptureButtonShortPressedMessage"},
- FunctionInfo{19, D<&ISelfController::SetAlbumImageOrientation>, "SetAlbumImageOrientation"},
- FunctionInfo{20, nullptr, "SetDesirableKeyboardLayout"},
- FunctionInfo{21, nullptr, "GetScreenShotProgramId"},
- FunctionInfo{40, D<&ISelfController::CreateManagedDisplayLayer>, "CreateManagedDisplayLayer"},
- FunctionInfo{41, D<&ISelfController::IsSystemBufferSharingEnabled>, "IsSystemBufferSharingEnabled"},
- FunctionInfo{42, D<&ISelfController::GetSystemSharedLayerHandle>, "GetSystemSharedLayerHandle"},
- FunctionInfo{43, D<&ISelfController::GetSystemSharedBufferHandle>, "GetSystemSharedBufferHandle"},
- FunctionInfo{44, D<&ISelfController::CreateManagedDisplaySeparableLayer>, "CreateManagedDisplaySeparableLayer"},
- FunctionInfo{45, nullptr, "SetManagedDisplayLayerSeparationMode"},
- FunctionInfo{46, nullptr, "SetRecordingLayerCompositionEnabled"},
- FunctionInfo{50, D<&ISelfController::SetHandlesRequestToDisplay>, "SetHandlesRequestToDisplay"},
- FunctionInfo{51, D<&ISelfController::ApproveToDisplay>, "ApproveToDisplay"},
- FunctionInfo{60, D<&ISelfController::OverrideAutoSleepTimeAndDimmingTime>, "OverrideAutoSleepTimeAndDimmingTime"},
- FunctionInfo{61, D<&ISelfController::SetMediaPlaybackState>, "SetMediaPlaybackState"},
- FunctionInfo{62, D<&ISelfController::SetIdleTimeDetectionExtension>, "SetIdleTimeDetectionExtension"},
- FunctionInfo{63, D<&ISelfController::GetIdleTimeDetectionExtension>, "GetIdleTimeDetectionExtension"},
- FunctionInfo{64, nullptr, "SetInputDetectionSourceSet"},
- FunctionInfo{65, D<&ISelfController::ReportUserIsActive>, "ReportUserIsActive"},
- FunctionInfo{66, nullptr, "GetCurrentIlluminance"},
- FunctionInfo{67, D<&ISelfController::IsIlluminanceAvailable>, "IsIlluminanceAvailable"},
- FunctionInfo{68, D<&ISelfController::SetAutoSleepDisabled>, "SetAutoSleepDisabled"},
- FunctionInfo{69, D<&ISelfController::IsAutoSleepDisabled>, "IsAutoSleepDisabled"},
- FunctionInfo{70, nullptr, "ReportMultimediaError"},
- FunctionInfo{71, nullptr, "GetCurrentIlluminanceEx"},
- FunctionInfo{72, D<&ISelfController::SetInputDetectionPolicy>, "SetInputDetectionPolicy"},
- FunctionInfo{80, nullptr, "SetWirelessPriorityMode"},
- FunctionInfo{90, D<&ISelfController::GetAccumulatedSuspendedTickValue>, "GetAccumulatedSuspendedTickValue"},
- FunctionInfo{91, D<&ISelfController::GetAccumulatedSuspendedTickChangedEvent>, "GetAccumulatedSuspendedTickChangedEvent"},
- FunctionInfo{100, D<&ISelfController::SetAlbumImageTakenNotificationEnabled>, "SetAlbumImageTakenNotificationEnabled"},
- FunctionInfo{110, nullptr, "SetApplicationAlbumUserData"},
- FunctionInfo{120, D<&ISelfController::SaveCurrentScreenshot>, "SaveCurrentScreenshot"},
- FunctionInfo{130, D<&ISelfController::SetRecordVolumeMuted>, "SetRecordVolumeMuted"},
- FunctionInfo{230, D<&ISelfController::Unknown230>, "Unknown230"},
- FunctionInfo{240, D<&ISelfController::Unknown240>, "Unknown240"},
- FunctionInfo{1000, nullptr, "GetDebugStorageChannel"}
- );
- return HandlerTableGenerateWithFind(key, functions);
- }
-
ISelfController::ISelfController(Core::System& system_, std::shared_ptr<Applet> applet,
Kernel::KProcess* process)
: ServiceFramework{system_, "ISelfController"}, m_process{process}, m_applet{
std::move(applet)} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&ISelfController::Exit>, "Exit"},
+ {1, D<&ISelfController::LockExit>, "LockExit"},
+ {2, D<&ISelfController::UnlockExit>, "UnlockExit"},
+ {3, D<&ISelfController::EnterFatalSection>, "EnterFatalSection"},
+ {4, D<&ISelfController::LeaveFatalSection>, "LeaveFatalSection"},
+ {9, D<&ISelfController::GetLibraryAppletLaunchableEvent>, "GetLibraryAppletLaunchableEvent"},
+ {10, D<&ISelfController::SetScreenShotPermission>, "SetScreenShotPermission"},
+ {11, D<&ISelfController::SetOperationModeChangedNotification>, "SetOperationModeChangedNotification"},
+ {12, D<&ISelfController::SetPerformanceModeChangedNotification>, "SetPerformanceModeChangedNotification"},
+ {13, D<&ISelfController::SetFocusHandlingMode>, "SetFocusHandlingMode"},
+ {14, D<&ISelfController::SetRestartMessageEnabled>, "SetRestartMessageEnabled"},
+ {15, D<&ISelfController::SetScreenShotAppletIdentityInfo>, "SetScreenShotAppletIdentityInfo"},
+ {16, D<&ISelfController::SetOutOfFocusSuspendingEnabled>, "SetOutOfFocusSuspendingEnabled"},
+ {17, nullptr, "SetControllerFirmwareUpdateSection"},
+ {18, nullptr, "SetRequiresCaptureButtonShortPressedMessage"},
+ {19, D<&ISelfController::SetAlbumImageOrientation>, "SetAlbumImageOrientation"},
+ {20, nullptr, "SetDesirableKeyboardLayout"},
+ {21, nullptr, "GetScreenShotProgramId"},
+ {40, D<&ISelfController::CreateManagedDisplayLayer>, "CreateManagedDisplayLayer"},
+ {41, D<&ISelfController::IsSystemBufferSharingEnabled>, "IsSystemBufferSharingEnabled"},
+ {42, D<&ISelfController::GetSystemSharedLayerHandle>, "GetSystemSharedLayerHandle"},
+ {43, D<&ISelfController::GetSystemSharedBufferHandle>, "GetSystemSharedBufferHandle"},
+ {44, D<&ISelfController::CreateManagedDisplaySeparableLayer>, "CreateManagedDisplaySeparableLayer"},
+ {45, nullptr, "SetManagedDisplayLayerSeparationMode"},
+ {46, nullptr, "SetRecordingLayerCompositionEnabled"},
+ {50, D<&ISelfController::SetHandlesRequestToDisplay>, "SetHandlesRequestToDisplay"},
+ {51, D<&ISelfController::ApproveToDisplay>, "ApproveToDisplay"},
+ {60, D<&ISelfController::OverrideAutoSleepTimeAndDimmingTime>, "OverrideAutoSleepTimeAndDimmingTime"},
+ {61, D<&ISelfController::SetMediaPlaybackState>, "SetMediaPlaybackState"},
+ {62, D<&ISelfController::SetIdleTimeDetectionExtension>, "SetIdleTimeDetectionExtension"},
+ {63, D<&ISelfController::GetIdleTimeDetectionExtension>, "GetIdleTimeDetectionExtension"},
+ {64, nullptr, "SetInputDetectionSourceSet"},
+ {65, D<&ISelfController::ReportUserIsActive>, "ReportUserIsActive"},
+ {66, nullptr, "GetCurrentIlluminance"},
+ {67, D<&ISelfController::IsIlluminanceAvailable>, "IsIlluminanceAvailable"},
+ {68, D<&ISelfController::SetAutoSleepDisabled>, "SetAutoSleepDisabled"},
+ {69, D<&ISelfController::IsAutoSleepDisabled>, "IsAutoSleepDisabled"},
+ {70, nullptr, "ReportMultimediaError"},
+ {71, nullptr, "GetCurrentIlluminanceEx"},
+ {72, D<&ISelfController::SetInputDetectionPolicy>, "SetInputDetectionPolicy"},
+ {80, nullptr, "SetWirelessPriorityMode"},
+ {90, D<&ISelfController::GetAccumulatedSuspendedTickValue>, "GetAccumulatedSuspendedTickValue"},
+ {91, D<&ISelfController::GetAccumulatedSuspendedTickChangedEvent>, "GetAccumulatedSuspendedTickChangedEvent"},
+ {100, D<&ISelfController::SetAlbumImageTakenNotificationEnabled>, "SetAlbumImageTakenNotificationEnabled"},
+ {110, nullptr, "SetApplicationAlbumUserData"},
+ {120, D<&ISelfController::SaveCurrentScreenshot>, "SaveCurrentScreenshot"},
+ {130, D<&ISelfController::SetRecordVolumeMuted>, "SetRecordVolumeMuted"},
+ {230, D<&ISelfController::Unknown230>, "Unknown230"},
+ {240, D<&ISelfController::Unknown240>, "Unknown240"},
+ {1000, nullptr, "GetDebugStorageChannel"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+
std::scoped_lock lk{m_applet->lock};
m_applet->display_layer_manager.Initialize(system, m_process, m_applet->applet_id,
m_applet->library_applet_mode);
diff --git a/src/core/hle/service/am/service/self_controller.h b/src/core/hle/service/am/service/self_controller.h
index ce77769da2..c9f480f575 100644
--- a/src/core/hle/service/am/service/self_controller.h
+++ b/src/core/hle/service/am/service/self_controller.h
@@ -70,7 +70,6 @@ private:
Result Unknown230(u32 in_val, Out<u16> out_val);
Result Unknown240(u32 in_val);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
Kernel::KProcess* const m_process;
const std::shared_ptr<Applet> m_applet;
};
diff --git a/src/core/hle/service/am/service/storage.cpp b/src/core/hle/service/am/service/storage.cpp
index 110a9f5a42..5fe191bf2f 100644
--- a/src/core/hle/service/am/service/storage.cpp
+++ b/src/core/hle/service/am/service/storage.cpp
@@ -4,86 +4,22 @@
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
-#include "core/hle/kernel/k_transfer_memory.h"
#include "core/hle/service/am/am_results.h"
#include "core/hle/service/am/library_applet_storage.h"
#include "core/hle/service/am/service/storage.h"
+#include "core/hle/service/am/service/storage_accessor.h"
#include "core/hle/service/cmif_serialization.h"
namespace Service::AM {
-class IStorageAccessor final : public ServiceFramework<IStorageAccessor> {
-public:
- explicit IStorageAccessor(Core::System& system_, std::shared_ptr<LibraryAppletStorage> impl) : ServiceFramework{system_, "IStorageAccessor"}, m_impl{std::move(impl)} {}
- ~IStorageAccessor() override = default;
-
- Result GetSize(Out<s64> out_size) {
- LOG_DEBUG(Service_AM, "called");
- *out_size = m_impl->GetSize();
- R_SUCCEED();
- }
-
- Result Write(InBuffer<BufferAttr_HipcAutoSelect> buffer, s64 offset) {
- LOG_DEBUG(Service_AM, "called, offset={} size={}", offset, buffer.size());
- R_RETURN(m_impl->Write(offset, buffer.data(), buffer.size()));
- }
-
- Result Read(OutBuffer<BufferAttr_HipcAutoSelect> out_buffer, s64 offset) {
- LOG_DEBUG(Service_AM, "called, offset={} size={}", offset, out_buffer.size());
- R_RETURN(m_impl->Read(offset, out_buffer.data(), out_buffer.size()));
- }
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IStorageAccessor::GetSize>, "GetSize"},
- FunctionInfo{10, D<&IStorageAccessor::Write>, "Write"},
- FunctionInfo{11, D<&IStorageAccessor::Read>, "Read"}
- );
-
- const std::shared_ptr<LibraryAppletStorage> m_impl;
-};
-
-class ITransferStorageAccessor final : public ServiceFramework<ITransferStorageAccessor> {
-public:
- explicit ITransferStorageAccessor(Core::System& system_, std::shared_ptr<LibraryAppletStorage> impl) : ServiceFramework{system_, "ITransferStorageAccessor"}, m_impl{std::move(impl)} {}
- ~ITransferStorageAccessor() override = default;
-
- Result GetSize(Out<s64> out_size) {
- LOG_DEBUG(Service_AM, "called");
- *out_size = m_impl->GetSize();
- R_SUCCEED();
- }
-
- Result GetHandle(Out<s64> out_size, OutCopyHandle<Kernel::KTransferMemory> out_handle) {
- LOG_INFO(Service_AM, "called");
- *out_size = m_impl->GetSize();
- *out_handle = m_impl->GetHandle();
- R_SUCCEED();
- }
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&ITransferStorageAccessor::GetSize>, "GetSize"},
- FunctionInfo{1, D<&ITransferStorageAccessor::GetHandle>, "GetHandle"}
- );
-
- const std::shared_ptr<LibraryAppletStorage> m_impl;
-};
-
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IStorage::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IStorage::Open>, "Open"},
- FunctionInfo{1, D<&IStorage::OpenTransferStorage>, "OpenTransferStorage"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IStorage::IStorage(Core::System& system_, std::shared_ptr<LibraryAppletStorage> impl)
: ServiceFramework{system_, "IStorage"}, m_impl{std::move(impl)} {
+ static const FunctionInfo functions[] = {
+ {0, D<&IStorage::Open>, "Open"},
+ {1, D<&IStorage::OpenTransferStorage>, "OpenTransferStorage"},
+ };
+
+ RegisterHandlers(functions);
}
IStorage::IStorage(Core::System& system_, std::vector<u8>&& data)
diff --git a/src/core/hle/service/am/service/storage.h b/src/core/hle/service/am/service/storage.h
index 63b7a0ad4c..462c823206 100644
--- a/src/core/hle/service/am/service/storage.h
+++ b/src/core/hle/service/am/service/storage.h
@@ -32,7 +32,6 @@ private:
Result OpenTransferStorage(
Out<SharedPointer<ITransferStorageAccessor>> out_transfer_storage_accessor);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
const std::shared_ptr<LibraryAppletStorage> m_impl;
};
diff --git a/src/core/hle/service/am/service/storage_accessor.cpp b/src/core/hle/service/am/service/storage_accessor.cpp
new file mode 100644
index 0000000000..2fe379a74d
--- /dev/null
+++ b/src/core/hle/service/am/service/storage_accessor.cpp
@@ -0,0 +1,71 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/kernel/k_transfer_memory.h"
+#include "core/hle/service/am/library_applet_storage.h"
+#include "core/hle/service/am/service/storage_accessor.h"
+#include "core/hle/service/cmif_serialization.h"
+
+namespace Service::AM {
+
+IStorageAccessor::IStorageAccessor(Core::System& system_,
+ std::shared_ptr<LibraryAppletStorage> impl)
+ : ServiceFramework{system_, "IStorageAccessor"}, m_impl{std::move(impl)} {
+ static const FunctionInfo functions[] = {
+ {0, D<&IStorageAccessor::GetSize>, "GetSize"},
+ {10, D<&IStorageAccessor::Write>, "Write"},
+ {11, D<&IStorageAccessor::Read>, "Read"},
+ };
+
+ RegisterHandlers(functions);
+}
+
+IStorageAccessor::~IStorageAccessor() = default;
+
+Result IStorageAccessor::GetSize(Out<s64> out_size) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_size = m_impl->GetSize();
+ R_SUCCEED();
+}
+
+Result IStorageAccessor::Write(InBuffer<BufferAttr_HipcAutoSelect> buffer, s64 offset) {
+ LOG_DEBUG(Service_AM, "called, offset={} size={}", offset, buffer.size());
+ R_RETURN(m_impl->Write(offset, buffer.data(), buffer.size()));
+}
+
+Result IStorageAccessor::Read(OutBuffer<BufferAttr_HipcAutoSelect> out_buffer, s64 offset) {
+ LOG_DEBUG(Service_AM, "called, offset={} size={}", offset, out_buffer.size());
+ R_RETURN(m_impl->Read(offset, out_buffer.data(), out_buffer.size()));
+}
+
+ITransferStorageAccessor::ITransferStorageAccessor(Core::System& system_,
+ std::shared_ptr<LibraryAppletStorage> impl)
+ : ServiceFramework{system_, "ITransferStorageAccessor"}, m_impl{std::move(impl)} {
+ static const FunctionInfo functions[] = {
+ {0, D<&ITransferStorageAccessor::GetSize>, "GetSize"},
+ {1, D<&ITransferStorageAccessor::GetHandle>, "GetHandle"},
+ };
+
+ RegisterHandlers(functions);
+}
+
+ITransferStorageAccessor::~ITransferStorageAccessor() = default;
+
+Result ITransferStorageAccessor::GetSize(Out<s64> out_size) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_size = m_impl->GetSize();
+ R_SUCCEED();
+}
+
+Result ITransferStorageAccessor::GetHandle(Out<s64> out_size,
+ OutCopyHandle<Kernel::KTransferMemory> out_handle) {
+ LOG_INFO(Service_AM, "called");
+ *out_size = m_impl->GetSize();
+ *out_handle = m_impl->GetHandle();
+ R_SUCCEED();
+}
+
+} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/storage_accessor.h b/src/core/hle/service/am/service/storage_accessor.h
new file mode 100644
index 0000000000..76af3de363
--- /dev/null
+++ b/src/core/hle/service/am/service/storage_accessor.h
@@ -0,0 +1,41 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/am/library_applet_storage.h"
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/service.h"
+
+namespace Service::AM {
+
+class IStorageAccessor final : public ServiceFramework<IStorageAccessor> {
+public:
+ explicit IStorageAccessor(Core::System& system_, std::shared_ptr<LibraryAppletStorage> impl);
+ ~IStorageAccessor() override;
+
+private:
+ Result GetSize(Out<s64> out_size);
+ Result Write(InBuffer<BufferAttr_HipcAutoSelect> buffer, s64 offset);
+ Result Read(OutBuffer<BufferAttr_HipcAutoSelect> out_buffer, s64 offset);
+
+ const std::shared_ptr<LibraryAppletStorage> m_impl;
+};
+
+class ITransferStorageAccessor final : public ServiceFramework<ITransferStorageAccessor> {
+public:
+ explicit ITransferStorageAccessor(Core::System& system_,
+ std::shared_ptr<LibraryAppletStorage> impl);
+ ~ITransferStorageAccessor() override;
+
+private:
+ Result GetSize(Out<s64> out_size);
+ Result GetHandle(Out<s64> out_size, OutCopyHandle<Kernel::KTransferMemory> out_handle);
+
+ const std::shared_ptr<LibraryAppletStorage> m_impl;
+};
+
+} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/system_applet_proxy.cpp b/src/core/hle/service/am/service/system_applet_proxy.cpp
new file mode 100644
index 0000000000..bb56750d09
--- /dev/null
+++ b/src/core/hle/service/am/service/system_applet_proxy.cpp
@@ -0,0 +1,136 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/am/service/applet_common_functions.h"
+#include "core/hle/service/am/service/application_creator.h"
+#include "core/hle/service/am/service/audio_controller.h"
+#include "core/hle/service/am/service/common_state_getter.h"
+#include "core/hle/service/am/service/debug_functions.h"
+#include "core/hle/service/am/service/display_controller.h"
+#include "core/hle/service/am/service/global_state_controller.h"
+#include "core/hle/service/am/service/home_menu_functions.h"
+#include "core/hle/service/am/service/library_applet_creator.h"
+#include "core/hle/service/am/service/process_winding_controller.h"
+#include "core/hle/service/am/service/self_controller.h"
+#include "core/hle/service/am/service/system_applet_proxy.h"
+#include "core/hle/service/am/service/window_controller.h"
+#include "core/hle/service/cmif_serialization.h"
+
+namespace Service::AM {
+
+ISystemAppletProxy::ISystemAppletProxy(Core::System& system_, std::shared_ptr<Applet> applet,
+ Kernel::KProcess* process, WindowSystem& window_system)
+ : ServiceFramework{system_, "ISystemAppletProxy"},
+ m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&ISystemAppletProxy::GetCommonStateGetter>, "GetCommonStateGetter"},
+ {1, D<&ISystemAppletProxy::GetSelfController>, "GetSelfController"},
+ {2, D<&ISystemAppletProxy::GetWindowController>, "GetWindowController"},
+ {3, D<&ISystemAppletProxy::GetAudioController>, "GetAudioController"},
+ {4, D<&ISystemAppletProxy::GetDisplayController>, "GetDisplayController"},
+ {10, D<&ISystemAppletProxy::GetProcessWindingController>, "GetProcessWindingController"},
+ {11, D<&ISystemAppletProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"},
+ {20, D<&ISystemAppletProxy::GetHomeMenuFunctions>, "GetHomeMenuFunctions"},
+ {21, D<&ISystemAppletProxy::GetGlobalStateController>, "GetGlobalStateController"},
+ {22, D<&ISystemAppletProxy::GetApplicationCreator>, "GetApplicationCreator"},
+ {23, D<&ISystemAppletProxy::GetAppletCommonFunctions>, "GetAppletCommonFunctions"},
+ {1000, D<&ISystemAppletProxy::GetDebugFunctions>, "GetDebugFunctions"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
+ISystemAppletProxy::~ISystemAppletProxy() = default;
+
+Result ISystemAppletProxy::GetAudioController(
+ Out<SharedPointer<IAudioController>> out_audio_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_audio_controller = std::make_shared<IAudioController>(system);
+ R_SUCCEED();
+}
+
+Result ISystemAppletProxy::GetDisplayController(
+ Out<SharedPointer<IDisplayController>> out_display_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_display_controller = std::make_shared<IDisplayController>(system, m_applet);
+ R_SUCCEED();
+}
+
+Result ISystemAppletProxy::GetProcessWindingController(
+ Out<SharedPointer<IProcessWindingController>> out_process_winding_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_process_winding_controller = std::make_shared<IProcessWindingController>(system, m_applet);
+ R_SUCCEED();
+}
+
+Result ISystemAppletProxy::GetDebugFunctions(
+ Out<SharedPointer<IDebugFunctions>> out_debug_functions) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_debug_functions = std::make_shared<IDebugFunctions>(system);
+ R_SUCCEED();
+}
+
+Result ISystemAppletProxy::GetWindowController(
+ Out<SharedPointer<IWindowController>> out_window_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_window_controller = std::make_shared<IWindowController>(system, m_applet, m_window_system);
+ R_SUCCEED();
+}
+
+Result ISystemAppletProxy::GetSelfController(
+ Out<SharedPointer<ISelfController>> out_self_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_self_controller = std::make_shared<ISelfController>(system, m_applet, m_process);
+ R_SUCCEED();
+}
+
+Result ISystemAppletProxy::GetCommonStateGetter(
+ Out<SharedPointer<ICommonStateGetter>> out_common_state_getter) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_common_state_getter = std::make_shared<ICommonStateGetter>(system, m_applet);
+ R_SUCCEED();
+}
+
+Result ISystemAppletProxy::GetLibraryAppletCreator(
+ Out<SharedPointer<ILibraryAppletCreator>> out_library_applet_creator) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_library_applet_creator =
+ std::make_shared<ILibraryAppletCreator>(system, m_applet, m_window_system);
+ R_SUCCEED();
+}
+
+Result ISystemAppletProxy::GetApplicationCreator(
+ Out<SharedPointer<IApplicationCreator>> out_application_creator) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_application_creator = std::make_shared<IApplicationCreator>(system, m_window_system);
+ R_SUCCEED();
+}
+
+Result ISystemAppletProxy::GetAppletCommonFunctions(
+ Out<SharedPointer<IAppletCommonFunctions>> out_applet_common_functions) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_applet_common_functions = std::make_shared<IAppletCommonFunctions>(system, m_applet);
+ R_SUCCEED();
+}
+
+Result ISystemAppletProxy::GetHomeMenuFunctions(
+ Out<SharedPointer<IHomeMenuFunctions>> out_home_menu_functions) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_home_menu_functions =
+ std::make_shared<IHomeMenuFunctions>(system, m_applet, m_window_system);
+ R_SUCCEED();
+}
+
+Result ISystemAppletProxy::GetGlobalStateController(
+ Out<SharedPointer<IGlobalStateController>> out_global_state_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_global_state_controller = std::make_shared<IGlobalStateController>(system);
+ R_SUCCEED();
+}
+
+} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/system_applet_proxy.h b/src/core/hle/service/am/service/system_applet_proxy.h
new file mode 100644
index 0000000000..76cef507a5
--- /dev/null
+++ b/src/core/hle/service/am/service/system_applet_proxy.h
@@ -0,0 +1,58 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/service.h"
+
+namespace Service::AM {
+
+struct Applet;
+class IAppletCommonFunctions;
+class IApplicationCreator;
+class IAudioController;
+class ICommonStateGetter;
+class IDebugFunctions;
+class IDisplayController;
+class IHomeMenuFunctions;
+class IGlobalStateController;
+class ILibraryAppletCreator;
+class IProcessWindingController;
+class ISelfController;
+class IWindowController;
+class WindowSystem;
+
+class ISystemAppletProxy final : public ServiceFramework<ISystemAppletProxy> {
+public:
+ explicit ISystemAppletProxy(Core::System& system, std::shared_ptr<Applet> applet,
+ Kernel::KProcess* process, WindowSystem& window_system);
+ ~ISystemAppletProxy();
+
+private:
+ Result GetCommonStateGetter(Out<SharedPointer<ICommonStateGetter>> out_common_state_getter);
+ Result GetSelfController(Out<SharedPointer<ISelfController>> out_self_controller);
+ Result GetWindowController(Out<SharedPointer<IWindowController>> out_window_controller);
+ Result GetAudioController(Out<SharedPointer<IAudioController>> out_audio_controller);
+ Result GetDisplayController(Out<SharedPointer<IDisplayController>> out_display_controller);
+ Result GetProcessWindingController(
+ Out<SharedPointer<IProcessWindingController>> out_process_winding_controller);
+ Result GetDebugFunctions(Out<SharedPointer<IDebugFunctions>> out_debug_functions);
+ Result GetLibraryAppletCreator(
+ Out<SharedPointer<ILibraryAppletCreator>> out_library_applet_creator);
+ Result GetApplicationCreator(Out<SharedPointer<IApplicationCreator>> out_application_creator);
+ Result GetAppletCommonFunctions(
+ Out<SharedPointer<IAppletCommonFunctions>> out_applet_common_functions);
+ Result GetHomeMenuFunctions(Out<SharedPointer<IHomeMenuFunctions>> out_home_menu_functions);
+ Result GetGlobalStateController(
+ Out<SharedPointer<IGlobalStateController>> out_global_state_controller);
+
+ WindowSystem& m_window_system;
+ Kernel::KProcess* const m_process;
+ const std::shared_ptr<Applet> m_applet;
+};
+
+} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/window_controller.cpp b/src/core/hle/service/am/service/window_controller.cpp
index d07aba0c79..f2b9dccb27 100644
--- a/src/core/hle/service/am/service/window_controller.cpp
+++ b/src/core/hle/service/am/service/window_controller.cpp
@@ -12,24 +12,24 @@
namespace Service::AM {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IWindowController::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "CreateWindow"},
- FunctionInfo{1, D<&IWindowController::GetAppletResourceUserId>, "GetAppletResourceUserId"},
- FunctionInfo{2, D<&IWindowController::GetAppletResourceUserIdOfCallerApplet>, "GetAppletResourceUserIdOfCallerApplet"},
- FunctionInfo{10, D<&IWindowController::AcquireForegroundRights>, "AcquireForegroundRights"},
- FunctionInfo{11, D<&IWindowController::ReleaseForegroundRights>, "ReleaseForegroundRights"},
- FunctionInfo{12, D<&IWindowController::RejectToChangeIntoBackground>, "RejectToChangeIntoBackground"},
- FunctionInfo{20, D<&IWindowController::SetAppletWindowVisibility>, "SetAppletWindowVisibility"},
- FunctionInfo{21, D<&IWindowController::SetAppletGpuTimeSlice>, "SetAppletGpuTimeSlice"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IWindowController::IWindowController(Core::System& system_, std::shared_ptr<Applet> applet,
WindowSystem& window_system)
: ServiceFramework{system_, "IWindowController"},
m_window_system{window_system}, m_applet{std::move(applet)} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "CreateWindow"},
+ {1, D<&IWindowController::GetAppletResourceUserId>, "GetAppletResourceUserId"},
+ {2, D<&IWindowController::GetAppletResourceUserIdOfCallerApplet>, "GetAppletResourceUserIdOfCallerApplet"},
+ {10, D<&IWindowController::AcquireForegroundRights>, "AcquireForegroundRights"},
+ {11, D<&IWindowController::ReleaseForegroundRights>, "ReleaseForegroundRights"},
+ {12, D<&IWindowController::RejectToChangeIntoBackground>, "RejectToChangeIntoBackground"},
+ {20, D<&IWindowController::SetAppletWindowVisibility>, "SetAppletWindowVisibility"},
+ {21, D<&IWindowController::SetAppletGpuTimeSlice>, "SetAppletGpuTimeSlice"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IWindowController::~IWindowController() = default;
diff --git a/src/core/hle/service/am/service/window_controller.h b/src/core/hle/service/am/service/window_controller.h
index 29fd723421..51a67f3039 100644
--- a/src/core/hle/service/am/service/window_controller.h
+++ b/src/core/hle/service/am/service/window_controller.h
@@ -29,7 +29,6 @@ private:
Result SetAppletWindowVisibility(bool visible);
Result SetAppletGpuTimeSlice(s64 time_slice);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
WindowSystem& m_window_system;
const std::shared_ptr<Applet> m_applet;
};
diff --git a/src/core/hle/service/aoc/addon_content_manager.cpp b/src/core/hle/service/aoc/addon_content_manager.cpp
index 0222d9c52b..be2aa34baa 100644
--- a/src/core/hle/service/aoc/addon_content_manager.cpp
+++ b/src/core/hle/service/aoc/addon_content_manager.cpp
@@ -28,34 +28,6 @@
namespace Service::AOC {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IAddOnContentManager::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "CountAddOnContentByApplicationId"},
- FunctionInfo{1, nullptr, "ListAddOnContentByApplicationId"},
- FunctionInfo{2, D<&IAddOnContentManager::CountAddOnContent>, "CountAddOnContent"},
- FunctionInfo{3, D<&IAddOnContentManager::ListAddOnContent>, "ListAddOnContent"},
- FunctionInfo{4, nullptr, "GetAddOnContentBaseIdByApplicationId"},
- FunctionInfo{5, D<&IAddOnContentManager::GetAddOnContentBaseId>, "GetAddOnContentBaseId"},
- FunctionInfo{6, nullptr, "PrepareAddOnContentByApplicationId"},
- FunctionInfo{7, D<&IAddOnContentManager::PrepareAddOnContent>, "PrepareAddOnContent"},
- FunctionInfo{8, D<&IAddOnContentManager::GetAddOnContentListChangedEvent>, "GetAddOnContentListChangedEvent"},
- FunctionInfo{9, nullptr, "GetAddOnContentLostErrorCode"},
- FunctionInfo{10, D<&IAddOnContentManager::GetAddOnContentListChangedEventWithProcessId>, "GetAddOnContentListChangedEventWithProcessId"},
- FunctionInfo{11, D<&IAddOnContentManager::NotifyMountAddOnContent>, "NotifyMountAddOnContent"},
- FunctionInfo{12, D<&IAddOnContentManager::NotifyUnmountAddOnContent>, "NotifyUnmountAddOnContent"},
- FunctionInfo{13, nullptr, "IsAddOnContentMountedForDebug"},
- FunctionInfo{50, D<&IAddOnContentManager::CheckAddOnContentMountStatus>, "CheckAddOnContentMountStatus"},
- FunctionInfo{100, D<&IAddOnContentManager::CreateEcPurchasedEventManager>, "CreateEcPurchasedEventManager"},
- FunctionInfo{101, D<&IAddOnContentManager::CreatePermanentEcPurchasedEventManager>, "CreatePermanentEcPurchasedEventManager"},
- FunctionInfo{110, nullptr, "CreateContentsServiceManager"},
- FunctionInfo{200, nullptr, "SetRequiredAddOnContentsOnContentsAvailabilityTransition"},
- FunctionInfo{300, nullptr, "SetupHostAddOnContent"},
- FunctionInfo{301, nullptr, "GetRegisteredAddOnContentPath"},
- FunctionInfo{302, nullptr, "UpdateCachedList"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
static bool CheckAOCTitleIDMatchesBase(u64 title_id, u64 base) {
return FileSys::GetBaseTitleID(title_id) == base;
}
@@ -85,6 +57,35 @@ static std::vector<u64> AccumulateAOCTitleIDs(Core::System& system) {
IAddOnContentManager::IAddOnContentManager(Core::System& system_)
: ServiceFramework{system_, "aoc:u"}, add_on_content{AccumulateAOCTitleIDs(system)},
service_context{system_, "aoc:u"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "CountAddOnContentByApplicationId"},
+ {1, nullptr, "ListAddOnContentByApplicationId"},
+ {2, D<&IAddOnContentManager::CountAddOnContent>, "CountAddOnContent"},
+ {3, D<&IAddOnContentManager::ListAddOnContent>, "ListAddOnContent"},
+ {4, nullptr, "GetAddOnContentBaseIdByApplicationId"},
+ {5, D<&IAddOnContentManager::GetAddOnContentBaseId>, "GetAddOnContentBaseId"},
+ {6, nullptr, "PrepareAddOnContentByApplicationId"},
+ {7, D<&IAddOnContentManager::PrepareAddOnContent>, "PrepareAddOnContent"},
+ {8, D<&IAddOnContentManager::GetAddOnContentListChangedEvent>, "GetAddOnContentListChangedEvent"},
+ {9, nullptr, "GetAddOnContentLostErrorCode"},
+ {10, D<&IAddOnContentManager::GetAddOnContentListChangedEventWithProcessId>, "GetAddOnContentListChangedEventWithProcessId"},
+ {11, D<&IAddOnContentManager::NotifyMountAddOnContent>, "NotifyMountAddOnContent"},
+ {12, D<&IAddOnContentManager::NotifyUnmountAddOnContent>, "NotifyUnmountAddOnContent"},
+ {13, nullptr, "IsAddOnContentMountedForDebug"},
+ {50, D<&IAddOnContentManager::CheckAddOnContentMountStatus>, "CheckAddOnContentMountStatus"},
+ {100, D<&IAddOnContentManager::CreateEcPurchasedEventManager>, "CreateEcPurchasedEventManager"},
+ {101, D<&IAddOnContentManager::CreatePermanentEcPurchasedEventManager>, "CreatePermanentEcPurchasedEventManager"},
+ {110, nullptr, "CreateContentsServiceManager"},
+ {200, nullptr, "SetRequiredAddOnContentsOnContentsAvailabilityTransition"},
+ {300, nullptr, "SetupHostAddOnContent"},
+ {301, nullptr, "GetRegisteredAddOnContentPath"},
+ {302, nullptr, "UpdateCachedList"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+
aoc_change_event = service_context.CreateEvent("GetAddOnContentListChanged:Event");
}
diff --git a/src/core/hle/service/aoc/addon_content_manager.h b/src/core/hle/service/aoc/addon_content_manager.h
index 8ddb86cf19..b505525590 100644
--- a/src/core/hle/service/aoc/addon_content_manager.h
+++ b/src/core/hle/service/aoc/addon_content_manager.h
@@ -43,9 +43,9 @@ public:
OutInterface<IPurchaseEventManager> out_interface);
private:
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::vector<u64> add_on_content;
KernelHelpers::ServiceContext service_context;
+
Kernel::KEvent* aoc_change_event;
};
diff --git a/src/core/hle/service/aoc/purchase_event_manager.cpp b/src/core/hle/service/aoc/purchase_event_manager.cpp
index eded803b25..64e1244967 100644
--- a/src/core/hle/service/aoc/purchase_event_manager.cpp
+++ b/src/core/hle/service/aoc/purchase_event_manager.cpp
@@ -11,20 +11,21 @@ namespace Service::AOC {
constexpr Result ResultNoPurchasedProductInfoAvailable{ErrorModule::NIMShop, 400};
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IPurchaseEventManager::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IPurchaseEventManager::SetDefaultDeliveryTarget>, "SetDefaultDeliveryTarget"},
- FunctionInfo{1, D<&IPurchaseEventManager::SetDeliveryTarget>, "SetDeliveryTarget"},
- FunctionInfo{2, D<&IPurchaseEventManager::GetPurchasedEvent>, "GetPurchasedEvent"},
- FunctionInfo{3, D<&IPurchaseEventManager::PopPurchasedProductInfo>, "PopPurchasedProductInfo"},
- FunctionInfo{4, D<&IPurchaseEventManager::PopPurchasedProductInfoWithUid>, "PopPurchasedProductInfoWithUid"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IPurchaseEventManager::IPurchaseEventManager(Core::System& system_)
- : ServiceFramework{system_, "IPurchaseEventManager"}
- , service_context{system, "IPurchaseEventManager"} {
+ : ServiceFramework{system_, "IPurchaseEventManager"}, service_context{system,
+ "IPurchaseEventManager"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IPurchaseEventManager::SetDefaultDeliveryTarget>, "SetDefaultDeliveryTarget"},
+ {1, D<&IPurchaseEventManager::SetDeliveryTarget>, "SetDeliveryTarget"},
+ {2, D<&IPurchaseEventManager::GetPurchasedEvent>, "GetPurchasedEvent"},
+ {3, D<&IPurchaseEventManager::PopPurchasedProductInfo>, "PopPurchasedProductInfo"},
+ {4, D<&IPurchaseEventManager::PopPurchasedProductInfoWithUid>, "PopPurchasedProductInfoWithUid"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+
purchased_event = service_context.CreateEvent("IPurchaseEventManager:PurchasedEvent");
}
diff --git a/src/core/hle/service/aoc/purchase_event_manager.h b/src/core/hle/service/aoc/purchase_event_manager.h
index d11089e567..c0bdfaf242 100644
--- a/src/core/hle/service/aoc/purchase_event_manager.h
+++ b/src/core/hle/service/aoc/purchase_event_manager.h
@@ -25,8 +25,6 @@ public:
Result PopPurchasedProductInfo();
Result PopPurchasedProductInfoWithUid();
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
-
private:
KernelHelpers::ServiceContext service_context;
Kernel::KEvent* purchased_event;
diff --git a/src/core/hle/service/apm/apm.h b/src/core/hle/service/apm/apm.h
index e188b4e446..265e581697 100644
--- a/src/core/hle/service/apm/apm.h
+++ b/src/core/hle/service/apm/apm.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/apm/apm_controller.h b/src/core/hle/service/apm/apm_controller.h
index 3357b7762a..c2f65a2f0e 100644
--- a/src/core/hle/service/apm/apm_controller.h
+++ b/src/core/hle/service/apm/apm_controller.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/apm/apm_interface.cpp b/src/core/hle/service/apm/apm_interface.cpp
index 2b4768478e..51c01e2f25 100644
--- a/src/core/hle/service/apm/apm_interface.cpp
+++ b/src/core/hle/service/apm/apm_interface.cpp
@@ -14,7 +14,15 @@ namespace Service::APM {
class ISession final : public ServiceFramework<ISession> {
public:
- explicit ISession(Core::System& system_, Controller& controller_) : ServiceFramework{system_, "ISession"}, controller{controller_} {}
+ explicit ISession(Core::System& system_, Controller& controller_)
+ : ServiceFramework{system_, "ISession"}, controller{controller_} {
+ static const FunctionInfo functions[] = {
+ {0, &ISession::SetPerformanceConfiguration, "SetPerformanceConfiguration"},
+ {1, &ISession::GetPerformanceConfiguration, "GetPerformanceConfiguration"},
+ {2, &ISession::SetCpuOverclockEnabled, "SetCpuOverclockEnabled"},
+ };
+ RegisterHandlers(functions);
+ }
private:
void SetPerformanceConfiguration(HLERequestContext& ctx) {
@@ -53,20 +61,18 @@ private:
rb.Push(ResultSuccess);
}
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &ISession::SetPerformanceConfiguration, "SetPerformanceConfiguration"},
- FunctionInfo{1, &ISession::GetPerformanceConfiguration, "GetPerformanceConfiguration"},
- FunctionInfo{2, &ISession::SetCpuOverclockEnabled, "SetCpuOverclockEnabled"}
- );
Controller& controller;
};
APM::APM(Core::System& system_, std::shared_ptr<Module> apm_, Controller& controller_,
const char* name)
: ServiceFramework{system_, name}, apm(std::move(apm_)), controller{controller_} {
+ static const FunctionInfo functions[] = {
+ {0, &APM::OpenSession, "OpenSession"},
+ {1, &APM::GetPerformanceMode, "GetPerformanceMode"},
+ {6, &APM::IsCpuOverclockEnabled, "IsCpuOverclockEnabled"},
+ };
+ RegisterHandlers(functions);
}
APM::~APM() = default;
@@ -96,6 +102,20 @@ void APM::IsCpuOverclockEnabled(HLERequestContext& ctx) {
APM_Sys::APM_Sys(Core::System& system_, Controller& controller_)
: ServiceFramework{system_, "apm:sys"}, controller{controller_} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "RequestPerformanceMode"},
+ {1, &APM_Sys::GetPerformanceEvent, "GetPerformanceEvent"},
+ {2, nullptr, "GetThrottlingState"},
+ {3, nullptr, "GetLastThrottlingState"},
+ {4, nullptr, "ClearLastThrottlingState"},
+ {5, nullptr, "LoadAndApplySettings"},
+ {6, &APM_Sys::SetCpuBoostMode, "SetCpuBoostMode"},
+ {7, &APM_Sys::GetCurrentPerformanceConfiguration, "GetCurrentPerformanceConfiguration"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
APM_Sys::~APM_Sys() = default;
diff --git a/src/core/hle/service/apm/apm_interface.h b/src/core/hle/service/apm/apm_interface.h
index 0bbcd185a3..eeac3474b0 100644
--- a/src/core/hle/service/apm/apm_interface.h
+++ b/src/core/hle/service/apm/apm_interface.h
@@ -24,14 +24,6 @@ private:
void GetPerformanceMode(HLERequestContext& ctx);
void IsCpuOverclockEnabled(HLERequestContext& ctx);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &APM::OpenSession, "OpenSession"},
- FunctionInfo{1, &APM::GetPerformanceMode, "GetPerformanceMode"},
- FunctionInfo{6, &APM::IsCpuOverclockEnabled, "IsCpuOverclockEnabled"}
- );
std::shared_ptr<Module> apm;
Controller& controller;
};
@@ -47,19 +39,6 @@ private:
void GetPerformanceEvent(HLERequestContext& ctx);
void GetCurrentPerformanceConfiguration(HLERequestContext& ctx);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "RequestPerformanceMode"},
- FunctionInfo{1, &APM_Sys::GetPerformanceEvent, "GetPerformanceEvent"},
- FunctionInfo{2, nullptr, "GetThrottlingState"},
- FunctionInfo{3, nullptr, "GetLastThrottlingState"},
- FunctionInfo{4, nullptr, "ClearLastThrottlingState"},
- FunctionInfo{5, nullptr, "LoadAndApplySettings"},
- FunctionInfo{6, &APM_Sys::SetCpuBoostMode, "SetCpuBoostMode"},
- FunctionInfo{7, &APM_Sys::GetCurrentPerformanceConfiguration, "GetCurrentPerformanceConfiguration"}
- );
Controller& controller;
};
diff --git a/src/core/hle/service/audio/audio.cpp b/src/core/hle/service/audio/audio.cpp
index 6177efd46c..fde766a275 100644
--- a/src/core/hle/service/audio/audio.cpp
+++ b/src/core/hle/service/audio/audio.cpp
@@ -21,164 +21,164 @@ namespace Service::Audio {
class IAudioOutManagerForApplet final : public ServiceFramework<IAudioOutManagerForApplet> {
public:
explicit IAudioOutManagerForApplet(Core::System& system_)
- : ServiceFramework{system_, "audout:a"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "RequestSuspend"},
- FunctionInfo{1, nullptr, "RequestResume"},
- FunctionInfo{2, nullptr, "GetProcessMasterVolume"},
- FunctionInfo{3, nullptr, "SetProcessMasterVolume"},
- FunctionInfo{4, nullptr, "GetProcessRecordVolume"},
- FunctionInfo{5, nullptr, "SetProcessRecordVolume"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "audout:a"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "RequestSuspend"},
+ {1, nullptr, "RequestResume"},
+ {2, nullptr, "GetProcessMasterVolume"},
+ {3, nullptr, "SetProcessMasterVolume"},
+ {4, nullptr, "GetProcessRecordVolume"},
+ {5, nullptr, "SetProcessRecordVolume"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class IAudioSnoopManager final : public ServiceFramework<IAudioSnoopManager> {
public:
explicit IAudioSnoopManager(Core::System& system_)
- : ServiceFramework{system_, "auddev"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetDspStatistics"},
- FunctionInfo{1, nullptr, "GetAppletStateSummaries"},
- FunctionInfo{2, nullptr, "SetDspStatisticsParameter"},
- FunctionInfo{3, nullptr, "GetDspStatisticsParameter"},
- FunctionInfo{6, nullptr, "GetDspUsage"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "auddev"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetDspStatistics"},
+ {1, nullptr, "GetAppletStateSummaries"},
+ {2, nullptr, "SetDspStatisticsParameter"},
+ {3, nullptr, "GetDspStatisticsParameter"},
+ {6, nullptr, "GetDspUsage"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class IAudioInManagerForApplet final : public ServiceFramework<IAudioInManagerForApplet> {
public:
explicit IAudioInManagerForApplet(Core::System& system_)
- : ServiceFramework{system_, "audin:a"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "RequestSuspend"},
- FunctionInfo{1, nullptr, "RequestResume"},
- FunctionInfo{2, nullptr, "GetProcessMasterVolume"},
- FunctionInfo{3, nullptr, "SetProcessMasterVolume"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "audin:a"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "RequestSuspend"},
+ {1, nullptr, "RequestResume"},
+ {2, nullptr, "GetProcessMasterVolume"},
+ {3, nullptr, "SetProcessMasterVolume"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class IAudioRendererManagerForApplet final : public ServiceFramework<IAudioRendererManagerForApplet> {
public:
explicit IAudioRendererManagerForApplet(Core::System& system_)
- : ServiceFramework{system_, "audren:a"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "RequestSuspend"},
- FunctionInfo{1, nullptr, "RequestResume"},
- FunctionInfo{2, nullptr, "GetProcessMasterVolume"},
- FunctionInfo{3, nullptr, "SetProcessMasterVolume"},
- FunctionInfo{4, nullptr, "RegisterAppletResourceUserId"},
- FunctionInfo{5, nullptr, "UnregisterAppletResourceUserId"},
- FunctionInfo{6, nullptr, "GetProcessRecordVolume"},
- FunctionInfo{7, nullptr, "SetProcessRecordVolume"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "audren:a"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "RequestSuspend"},
+ {1, nullptr, "RequestResume"},
+ {2, nullptr, "GetProcessMasterVolume"},
+ {3, nullptr, "SetProcessMasterVolume"},
+ {4, nullptr, "RegisterAppletResourceUserId"},
+ {5, nullptr, "UnregisterAppletResourceUserId"},
+ {6, nullptr, "GetProcessRecordVolume"},
+ {7, nullptr, "SetProcessRecordVolume"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class IAudioOutManagerForDebugger final : public ServiceFramework<IAudioOutManagerForDebugger> {
public:
explicit IAudioOutManagerForDebugger(Core::System& system_)
- : ServiceFramework{system_, "audout:d"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "RequestSuspend"},
- FunctionInfo{1, nullptr, "RequestResume"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "audout:d"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "RequestSuspend"},
+ {1, nullptr, "RequestResume"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class IAudioInManagerForDebugger final : public ServiceFramework<IAudioInManagerForDebugger> {
public:
explicit IAudioInManagerForDebugger(Core::System& system_)
- : ServiceFramework{system_, "audin:d"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "RequestSuspend"},
- FunctionInfo{1, nullptr, "RequestResume"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "audin:d"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "RequestSuspend"},
+ {1, nullptr, "RequestResume"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class IFinalOutputRecorderManagerForDebugger final : public ServiceFramework<IFinalOutputRecorderManagerForDebugger> {
public:
explicit IFinalOutputRecorderManagerForDebugger(Core::System& system_)
- : ServiceFramework{system_, "audrec:d"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "RequestSuspend"},
- FunctionInfo{1, nullptr, "RequestResume"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "audrec:d"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "RequestSuspend"},
+ {1, nullptr, "RequestResume"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class IAudioRendererManagerForDebugger final : public ServiceFramework<IAudioRendererManagerForDebugger> {
public:
explicit IAudioRendererManagerForDebugger(Core::System& system_)
- : ServiceFramework{system_, "audren:d"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "RequestSuspend"},
- FunctionInfo{1, nullptr, "RequestResume"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "audren:d"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "RequestSuspend"},
+ {1, nullptr, "RequestResume"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class IAudioSystemManagerForApplet final : public ServiceFramework<IAudioSystemManagerForApplet> {
public:
explicit IAudioSystemManagerForApplet(Core::System& system_)
- : ServiceFramework{system_, "aud:a"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "RegisterAppletResourceUserId"},
- FunctionInfo{1, nullptr, "UnregisterAppletResourceUserId"},
- FunctionInfo{2, nullptr, "RequestSuspendAudio"},
- FunctionInfo{3, nullptr, "RequestResumeAudio"},
- FunctionInfo{4, nullptr, "GetAudioOutputProcessMasterVolume"},
- FunctionInfo{5, nullptr, "SetAudioOutputProcessMasterVolume"},
- FunctionInfo{6, nullptr, "GetAudioInputProcessMasterVolume"},
- FunctionInfo{7, nullptr, "SetAudioInputProcessMasterVolume"},
- FunctionInfo{8, nullptr, "GetAudioOutputProcessRecordVolume"},
- FunctionInfo{9, nullptr, "SetAudioOutputProcessRecordVolume"},
- FunctionInfo{10, nullptr, "GetAppletStateSummaries"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "aud:a"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "RegisterAppletResourceUserId"},
+ {1, nullptr, "UnregisterAppletResourceUserId"},
+ {2, nullptr, "RequestSuspendAudio"},
+ {3, nullptr, "RequestResumeAudio"},
+ {4, nullptr, "GetAudioOutputProcessMasterVolume"},
+ {5, nullptr, "SetAudioOutputProcessMasterVolume"},
+ {6, nullptr, "GetAudioInputProcessMasterVolume"},
+ {7, nullptr, "SetAudioInputProcessMasterVolume"},
+ {8, nullptr, "GetAudioOutputProcessRecordVolume"},
+ {9, nullptr, "SetAudioOutputProcessRecordVolume"},
+ {10, nullptr, "GetAppletStateSummaries"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class IAudioSystemManagerForDebugger final : public ServiceFramework<IAudioSystemManagerForDebugger> {
public:
explicit IAudioSystemManagerForDebugger(Core::System& system_)
- : ServiceFramework{system_, "aud:d"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "RequestSuspendAudioForDebug"},
- FunctionInfo{1, nullptr, "RequestResumeAudioForDebug"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "aud:d"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "RequestSuspendAudioForDebug"},
+ {1, nullptr, "RequestResumeAudioForDebug"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
diff --git a/src/core/hle/service/audio/audio.h b/src/core/hle/service/audio/audio.h
index d70f022c73..eb8f482690 100644
--- a/src/core/hle/service/audio/audio.h
+++ b/src/core/hle/service/audio/audio.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/audio/audio_controller.cpp b/src/core/hle/service/audio/audio_controller.cpp
index d912a5e86a..9e2db4a84c 100644
--- a/src/core/hle/service/audio/audio_controller.cpp
+++ b/src/core/hle/service/audio/audio_controller.cpp
@@ -1,9 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -20,75 +17,77 @@
namespace Service::Audio {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IAudioController::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IAudioController::GetTargetVolume>, "GetTargetVolume"},
- FunctionInfo{1, D<&IAudioController::SetTargetVolume>, "SetTargetVolume"},
- FunctionInfo{2, D<&IAudioController::GetTargetVolumeMin>, "GetTargetVolumeMin"},
- FunctionInfo{3, D<&IAudioController::GetTargetVolumeMax>, "GetTargetVolumeMax"},
- FunctionInfo{4, D<&IAudioController::IsTargetMute>, "IsTargetMute"},
- FunctionInfo{5, D<&IAudioController::SetTargetMute>, "SetTargetMute"},
- FunctionInfo{6, nullptr, "IsTargetConnected", MakeVersionGate({20,0,0})},
- FunctionInfo{7, nullptr, "SetDefaultTarget"},
- FunctionInfo{8, nullptr, "GetDefaultTarget"},
- FunctionInfo{9, D<&IAudioController::GetAudioOutputMode>, "GetAudioOutputMode"},
- FunctionInfo{10, D<&IAudioController::SetAudioOutputMode>, "SetAudioOutputMode"},
- FunctionInfo{11, nullptr, "SetForceMutePolicy"},
- FunctionInfo{12, D<&IAudioController::GetForceMutePolicy>, "GetForceMutePolicy"},
- FunctionInfo{13, D<&IAudioController::GetOutputModeSetting>, "GetOutputModeSetting"},
- FunctionInfo{14, D<&IAudioController::SetOutputModeSetting>, "SetOutputModeSetting"},
- FunctionInfo{15, nullptr, "SetOutputTarget"},
- FunctionInfo{16, nullptr, "SetInputTargetForceEnabled"},
- FunctionInfo{17, D<&IAudioController::SetHeadphoneOutputLevelMode>, "SetHeadphoneOutputLevelMode"},
- FunctionInfo{18, D<&IAudioController::GetHeadphoneOutputLevelMode>, "GetHeadphoneOutputLevelMode"},
- FunctionInfo{19, nullptr, "AcquireAudioVolumeUpdateEventForPlayReport"},
- FunctionInfo{20, nullptr, "AcquireAudioOutputDeviceUpdateEventForPlayReport"},
- FunctionInfo{21, nullptr, "GetAudioOutputTargetForPlayReport"},
- FunctionInfo{22, D<&IAudioController::NotifyHeadphoneVolumeWarningDisplayedEvent>, "NotifyHeadphoneVolumeWarningDisplayedEvent"},
- FunctionInfo{23, nullptr, "SetSystemOutputMasterVolume"},
- FunctionInfo{24, nullptr, "GetSystemOutputMasterVolume"},
- FunctionInfo{25, nullptr, "GetAudioVolumeDataForPlayReport"},
- FunctionInfo{26, nullptr, "UpdateHeadphoneSettings"},
- FunctionInfo{27, nullptr, "SetVolumeMappingTableForDev"},
- FunctionInfo{28, nullptr, "GetAudioOutputChannelCountForPlayReport"},
- FunctionInfo{29, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport"},
- FunctionInfo{30, D<&IAudioController::SetSpeakerAutoMuteEnabled>, "SetSpeakerAutoMuteEnabled"},
- FunctionInfo{31, D<&IAudioController::IsSpeakerAutoMuteEnabled>, "IsSpeakerAutoMuteEnabled"},
- FunctionInfo{32, D<&IAudioController::GetActiveOutputTarget>, "GetActiveOutputTarget"},
- FunctionInfo{33, nullptr, "GetTargetDeviceInfo"},
- FunctionInfo{34, D<&IAudioController::AcquireTargetNotification>, "AcquireTargetNotification"},
- FunctionInfo{35, nullptr, "SetHearingProtectionSafeguardTimerRemainingTimeForDebug"},
- FunctionInfo{36, nullptr, "GetHearingProtectionSafeguardTimerRemainingTimeForDebug"},
- FunctionInfo{37, nullptr, "SetHearingProtectionSafeguardEnabled"},
- FunctionInfo{38, nullptr, "IsHearingProtectionSafeguardEnabled"},
- FunctionInfo{39, nullptr, "IsHearingProtectionSafeguardMonitoringOutputForDebug"},
- FunctionInfo{40, nullptr, "GetSystemInformationForDebug"},
- FunctionInfo{41, nullptr, "SetVolumeButtonLongPressTime"},
- FunctionInfo{42, nullptr, "SetNativeVolumeForDebug"},
- FunctionInfo{43, nullptr, "Unknown43", MakeVersionGate({21,0,0})},
- FunctionInfo{5000, D<&IAudioController::Unknown5000>, "Unknown5000", MakeVersionGate({19,0,0})},
- FunctionInfo{10000, nullptr, "NotifyAudioOutputTargetForPlayReport"},
- FunctionInfo{10001, nullptr, "NotifyAudioOutputChannelCountForPlayReport"},
- FunctionInfo{10002, nullptr, "NotifyUnsupportedUsbOutputDeviceAttachedForPlayReport"},
- FunctionInfo{10100, nullptr, "GetAudioVolumeDataForPlayReport"},
- FunctionInfo{10101, nullptr, "BindAudioVolumeUpdateEventForPlayReport"},
- FunctionInfo{10102, nullptr, "BindAudioOutputTargetUpdateEventForPlayReport"},
- FunctionInfo{10103, nullptr, "GetAudioOutputTargetForPlayReport"},
- FunctionInfo{10104, nullptr, "GetAudioOutputChannelCountForPlayReport"},
- FunctionInfo{10105, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport", MakeVersionGate({14,0,0}, {19,0,1})},
- FunctionInfo{10106, nullptr, "GetDefaultAudioOutputTargetForPlayReport", MakeVersionGate({14,0,0}, {19,0,1})},
- FunctionInfo{10200, nullptr, "Unknown10200", MakeVersionGate({20,0,0})},
- FunctionInfo{50000, nullptr, "SetAnalogInputBoostGainForPrototyping", MakeVersionGate({15,0,0}, {18,1,0})},
- FunctionInfo{50001, nullptr, "OverrideDefaultTargetForDebug", MakeVersionGate({19,0,0}, {19,0,1})},
- FunctionInfo{50003, nullptr, "SetForceOverrideExternalDeviceNameForDebug", MakeVersionGate({19,0,0})},
- FunctionInfo{50004, nullptr, "ClearForceOverrideExternalDeviceNameForDebug", MakeVersionGate({19,0,0})}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IAudioController::IAudioController(Core::System& system_)
: ServiceFramework{system_, "audctl"}, service_context{system, "audctl"} {
- m_set_sys = system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true);
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IAudioController::GetTargetVolume>, "GetTargetVolume"},
+ {1, D<&IAudioController::SetTargetVolume>, "SetTargetVolume"},
+ {2, D<&IAudioController::GetTargetVolumeMin>, "GetTargetVolumeMin"},
+ {3, D<&IAudioController::GetTargetVolumeMax>, "GetTargetVolumeMax"},
+ {4, D<&IAudioController::IsTargetMute>, "IsTargetMute"},
+ {5, D<&IAudioController::SetTargetMute>, "SetTargetMute"},
+ {6, nullptr, "IsTargetConnected"}, //20.0.0+
+ {7, nullptr, "SetDefaultTarget"},
+ {8, nullptr, "GetDefaultTarget"},
+ {9, D<&IAudioController::GetAudioOutputMode>, "GetAudioOutputMode"},
+ {10, D<&IAudioController::SetAudioOutputMode>, "SetAudioOutputMode"},
+ {11, nullptr, "SetForceMutePolicy"},
+ {12, D<&IAudioController::GetForceMutePolicy>, "GetForceMutePolicy"},
+ {13, D<&IAudioController::GetOutputModeSetting>, "GetOutputModeSetting"},
+ {14, D<&IAudioController::SetOutputModeSetting>, "SetOutputModeSetting"},
+ {15, nullptr, "SetOutputTarget"},
+ {16, nullptr, "SetInputTargetForceEnabled"},
+ {17, D<&IAudioController::SetHeadphoneOutputLevelMode>, "SetHeadphoneOutputLevelMode"},
+ {18, D<&IAudioController::GetHeadphoneOutputLevelMode>, "GetHeadphoneOutputLevelMode"},
+ {19, nullptr, "AcquireAudioVolumeUpdateEventForPlayReport"},
+ {20, nullptr, "AcquireAudioOutputDeviceUpdateEventForPlayReport"},
+ {21, nullptr, "GetAudioOutputTargetForPlayReport"},
+ {22, D<&IAudioController::NotifyHeadphoneVolumeWarningDisplayedEvent>, "NotifyHeadphoneVolumeWarningDisplayedEvent"},
+ {23, nullptr, "SetSystemOutputMasterVolume"},
+ {24, nullptr, "GetSystemOutputMasterVolume"},
+ {25, nullptr, "GetAudioVolumeDataForPlayReport"},
+ {26, nullptr, "UpdateHeadphoneSettings"},
+ {27, nullptr, "SetVolumeMappingTableForDev"},
+ {28, nullptr, "GetAudioOutputChannelCountForPlayReport"},
+ {29, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport"},
+ {30, D<&IAudioController::SetSpeakerAutoMuteEnabled>, "SetSpeakerAutoMuteEnabled"},
+ {31, D<&IAudioController::IsSpeakerAutoMuteEnabled>, "IsSpeakerAutoMuteEnabled"},
+ {32, D<&IAudioController::GetActiveOutputTarget>, "GetActiveOutputTarget"},
+ {33, nullptr, "GetTargetDeviceInfo"},
+ {34, D<&IAudioController::AcquireTargetNotification>, "AcquireTargetNotification"},
+ {35, nullptr, "SetHearingProtectionSafeguardTimerRemainingTimeForDebug"},
+ {36, nullptr, "GetHearingProtectionSafeguardTimerRemainingTimeForDebug"},
+ {37, nullptr, "SetHearingProtectionSafeguardEnabled"},
+ {38, nullptr, "IsHearingProtectionSafeguardEnabled"},
+ {39, nullptr, "IsHearingProtectionSafeguardMonitoringOutputForDebug"},
+ {40, nullptr, "GetSystemInformationForDebug"},
+ {41, nullptr, "SetVolumeButtonLongPressTime"},
+ {42, nullptr, "SetNativeVolumeForDebug"},
+ {43, nullptr, "Unknown43"}, //21.0.0+
+ {5000, D<&IAudioController::Unknown5000>, "Unknown5000"}, //19.0.0+
+ {10000, nullptr, "NotifyAudioOutputTargetForPlayReport"},
+ {10001, nullptr, "NotifyAudioOutputChannelCountForPlayReport"},
+ {10002, nullptr, "NotifyUnsupportedUsbOutputDeviceAttachedForPlayReport"},
+ {10100, nullptr, "GetAudioVolumeDataForPlayReport"},
+ {10101, nullptr, "BindAudioVolumeUpdateEventForPlayReport"},
+ {10102, nullptr, "BindAudioOutputTargetUpdateEventForPlayReport"},
+ {10103, nullptr, "GetAudioOutputTargetForPlayReport"},
+ {10104, nullptr, "GetAudioOutputChannelCountForPlayReport"},
+ {10105, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport"}, //14.0.0-19.0.1
+ {10106, nullptr, "GetDefaultAudioOutputTargetForPlayReport"}, //14.0.0-19.0.1
+ {10200, nullptr, "Unknown10200"}, //20.0.0+
+ {50000, nullptr, "SetAnalogInputBoostGainForPrototyping"}, //15.0.0-18.1.0
+ {50001, nullptr, "OverrideDefaultTargetForDebug"}, //19.0.0-19.0.1
+ {50003, nullptr, "SetForceOverrideExternalDeviceNameForDebug"}, //19.0.0+
+ {50004, nullptr, "ClearForceOverrideExternalDeviceNameForDebug"} //19.0.0+
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+
+ m_set_sys =
+ system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true);
notification_event = service_context.CreateEvent("IAudioController:NotificationEvent");
// Probably shouldn't do this in constructor?
diff --git a/src/core/hle/service/audio/audio_controller.h b/src/core/hle/service/audio/audio_controller.h
index e5c615fa21..a30b572ac7 100644
--- a/src/core/hle/service/audio/audio_controller.h
+++ b/src/core/hle/service/audio/audio_controller.h
@@ -59,8 +59,8 @@ private:
Result AcquireTargetNotification(OutCopyHandle<Kernel::KReadableEvent> out_notification_event);
Result Unknown5000(Out<SharedPointer<IAudioController>> out_audio_controller);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
KernelHelpers::ServiceContext service_context;
+
Kernel::KEvent* notification_event;
std::shared_ptr<Service::Set::ISystemSettingsServer> m_set_sys;
std::array<s32, 6> m_target_volumes{{15, 15, 15, 15, 15, 15}};
diff --git a/src/core/hle/service/audio/audio_device.cpp b/src/core/hle/service/audio/audio_device.cpp
index fc24bf3ccd..e9f7e074a1 100644
--- a/src/core/hle/service/audio/audio_device.cpp
+++ b/src/core/hle/service/audio/audio_device.cpp
@@ -12,38 +12,36 @@
namespace Service::Audio {
using namespace AudioCore::Renderer;
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IAudioDevice::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IAudioDevice::ListAudioDeviceName>, "ListAudioDeviceName"},
- FunctionInfo{1, D<&IAudioDevice::SetAudioDeviceOutputVolume>, "SetAudioDeviceOutputVolume"},
- FunctionInfo{2, D<&IAudioDevice::GetAudioDeviceOutputVolume>, "GetAudioDeviceOutputVolume"},
- FunctionInfo{3, D<&IAudioDevice::GetActiveAudioDeviceName>, "GetActiveAudioDeviceName"},
- FunctionInfo{4, D<&IAudioDevice::QueryAudioDeviceSystemEvent>, "QueryAudioDeviceSystemEvent"},
- FunctionInfo{5, D<&IAudioDevice::GetActiveChannelCount>, "GetActiveChannelCount"},
- FunctionInfo{6, D<&IAudioDevice::ListAudioDeviceNameAuto>, "ListAudioDeviceNameAuto"},
- FunctionInfo{7, D<&IAudioDevice::SetAudioDeviceOutputVolumeAuto>, "SetAudioDeviceOutputVolumeAuto"},
- FunctionInfo{8, D<&IAudioDevice::GetAudioDeviceOutputVolumeAuto>, "GetAudioDeviceOutputVolumeAuto"},
- FunctionInfo{10, D<&IAudioDevice::GetActiveAudioDeviceNameAuto>, "GetActiveAudioDeviceNameAuto"},
- FunctionInfo{11, D<&IAudioDevice::QueryAudioDeviceInputEvent>, "QueryAudioDeviceInputEvent"},
- FunctionInfo{12, D<&IAudioDevice::QueryAudioDeviceOutputEvent>, "QueryAudioDeviceOutputEvent"},
- FunctionInfo{13, D<&IAudioDevice::GetActiveAudioDeviceName>, "GetActiveAudioOutputDeviceName"},
- FunctionInfo{14, D<&IAudioDevice::ListAudioOutputDeviceName>, "ListAudioOutputDeviceName"},
- FunctionInfo{15, nullptr, "AcquireAudioInputDeviceNotification", MakeVersionGate({17,0,0})},
- FunctionInfo{16, nullptr, "ReleaseAudioInputDeviceNotification", MakeVersionGate({17,0,0})},
- FunctionInfo{17, nullptr, "AcquireAudioOutputDeviceNotification", MakeVersionGate({17,0,0})},
- FunctionInfo{18, nullptr, "ReleaseAudioOutputDeviceNotification", MakeVersionGate({17,0,0})},
- FunctionInfo{19, D<&IAudioDevice::SetAudioDeviceOutputVolumeAutoTuneEnabled>, "SetAudioDeviceOutputVolumeAutoTuneEnabled", MakeVersionGate({18,0,0})},
- FunctionInfo{20, D<&IAudioDevice::IsAudioDeviceOutputVolumeAutoTuneEnabled>, "IsAudioDeviceOutputVolumeAutoTuneEnabled", MakeVersionGate({18,0,0})},
- FunctionInfo{21, nullptr, "IsActiveOutputDeviceEstimatedLowLatency", MakeVersionGate({21,0,0})}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IAudioDevice::IAudioDevice(Core::System& system_, u64 applet_resource_user_id, u32 revision,
u32 device_num)
: ServiceFramework{system_, "IAudioDevice"}, service_context{system_, "IAudioDevice"},
impl{std::make_unique<AudioDevice>(system_, applet_resource_user_id, revision)},
event{service_context.CreateEvent(fmt::format("IAudioDeviceEvent-{}", device_num))} {
+ static const FunctionInfo functions[] = {
+ {0, D<&IAudioDevice::ListAudioDeviceName>, "ListAudioDeviceName"},
+ {1, D<&IAudioDevice::SetAudioDeviceOutputVolume>, "SetAudioDeviceOutputVolume"},
+ {2, D<&IAudioDevice::GetAudioDeviceOutputVolume>, "GetAudioDeviceOutputVolume"},
+ {3, D<&IAudioDevice::GetActiveAudioDeviceName>, "GetActiveAudioDeviceName"},
+ {4, D<&IAudioDevice::QueryAudioDeviceSystemEvent>, "QueryAudioDeviceSystemEvent"},
+ {5, D<&IAudioDevice::GetActiveChannelCount>, "GetActiveChannelCount"},
+ {6, D<&IAudioDevice::ListAudioDeviceNameAuto>, "ListAudioDeviceNameAuto"},
+ {7, D<&IAudioDevice::SetAudioDeviceOutputVolumeAuto>, "SetAudioDeviceOutputVolumeAuto"},
+ {8, D<&IAudioDevice::GetAudioDeviceOutputVolumeAuto>, "GetAudioDeviceOutputVolumeAuto"},
+ {10, D<&IAudioDevice::GetActiveAudioDeviceNameAuto>, "GetActiveAudioDeviceNameAuto"},
+ {11, D<&IAudioDevice::QueryAudioDeviceInputEvent>, "QueryAudioDeviceInputEvent"},
+ {12, D<&IAudioDevice::QueryAudioDeviceOutputEvent>, "QueryAudioDeviceOutputEvent"},
+ {13, D<&IAudioDevice::GetActiveAudioDeviceName>, "GetActiveAudioOutputDeviceName"},
+ {14, D<&IAudioDevice::ListAudioOutputDeviceName>, "ListAudioOutputDeviceName"},
+ {15, nullptr, "AcquireAudioInputDeviceNotification"}, //17.0.0+
+ {16, nullptr, "ReleaseAudioInputDeviceNotification"}, //17.0.0+
+ {17, nullptr, "AcquireAudioOutputDeviceNotification"}, //17.0.0+
+ {18, nullptr, "ReleaseAudioOutputDeviceNotification"}, //17.0.0+
+ {19, D<&IAudioDevice::SetAudioDeviceOutputVolumeAutoTuneEnabled>, "SetAudioDeviceOutputVolumeAutoTuneEnabled"}, //18.0.0+
+ {20, D<&IAudioDevice::IsAudioDeviceOutputVolumeAutoTuneEnabled>, "IsAudioDeviceOutputVolumeAutoTuneEnabled"}, //18.0.0+
+ {21, nullptr, "IsActiveOutputDeviceEstimatedLowLatency"} //21.0.0+
+ };
+ RegisterHandlers(functions);
+
event->Signal(system.Kernel());
}
diff --git a/src/core/hle/service/audio/audio_device.h b/src/core/hle/service/audio/audio_device.h
index bd0aaa5f7c..f6c12fbfeb 100644
--- a/src/core/hle/service/audio/audio_device.h
+++ b/src/core/hle/service/audio/audio_device.h
@@ -55,7 +55,6 @@ private:
Result SetAudioDeviceOutputVolumeAutoTuneEnabled(bool enabled);
Result IsAudioDeviceOutputVolumeAutoTuneEnabled(Out<bool> out_enabled);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
KernelHelpers::ServiceContext service_context;
std::unique_ptr<AudioCore::Renderer::AudioDevice> impl;
Kernel::KEvent* event;
diff --git a/src/core/hle/service/audio/audio_in.cpp b/src/core/hle/service/audio/audio_in.cpp
index 068574dbd2..6208c2d104 100644
--- a/src/core/hle/service/audio/audio_in.cpp
+++ b/src/core/hle/service/audio/audio_in.cpp
@@ -11,33 +11,35 @@
namespace Service::Audio {
using namespace AudioCore::AudioIn;
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IAudioIn::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IAudioIn::GetAudioInState>, "GetAudioInState"},
- FunctionInfo{1, D<&IAudioIn::Start>, "Start"},
- FunctionInfo{2, D<&IAudioIn::Stop>, "Stop"},
- FunctionInfo{3, D<&IAudioIn::AppendAudioInBuffer>, "AppendAudioInBuffer"},
- FunctionInfo{4, D<&IAudioIn::RegisterBufferEvent>, "RegisterBufferEvent"},
- FunctionInfo{5, D<&IAudioIn::GetReleasedAudioInBuffers>, "GetReleasedAudioInBuffers"},
- FunctionInfo{6, D<&IAudioIn::ContainsAudioInBuffer>, "ContainsAudioInBuffer"},
- FunctionInfo{7, D<&IAudioIn::AppendAudioInBuffer>, "AppendUacInBuffer"},
- FunctionInfo{8, D<&IAudioIn::AppendAudioInBufferAuto>, "AppendAudioInBufferAuto"},
- FunctionInfo{9, D<&IAudioIn::GetReleasedAudioInBuffersAuto>, "GetReleasedAudioInBuffersAuto"},
- FunctionInfo{10, D<&IAudioIn::AppendAudioInBufferAuto>, "AppendUacInBufferAuto"},
- FunctionInfo{11, D<&IAudioIn::GetAudioInBufferCount>, "GetAudioInBufferCount"},
- FunctionInfo{12, D<&IAudioIn::SetDeviceGain>, "SetDeviceGain"},
- FunctionInfo{13, D<&IAudioIn::GetDeviceGain>, "GetDeviceGain"},
- FunctionInfo{14, D<&IAudioIn::FlushAudioInBuffers>, "FlushAudioInBuffers"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IAudioIn::IAudioIn(Core::System& system_, Manager& manager, size_t session_id,
const std::string& device_name, const AudioInParameter& in_params,
Kernel::KProcess* handle, u64 applet_resource_user_id)
- : ServiceFramework{system_, "IAudioIn"}, process{handle}, service_context{system_, "IAudioIn"}
- , event{service_context.CreateEvent("AudioInEvent")}, impl{std::make_shared<In>(system_, manager, event, session_id)}
-{
+ : ServiceFramework{system_, "IAudioIn"}, process{handle}, service_context{system_, "IAudioIn"},
+ event{service_context.CreateEvent("AudioInEvent")}, impl{std::make_shared<In>(system_,
+ manager, event,
+ session_id)} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IAudioIn::GetAudioInState>, "GetAudioInState"},
+ {1, D<&IAudioIn::Start>, "Start"},
+ {2, D<&IAudioIn::Stop>, "Stop"},
+ {3, D<&IAudioIn::AppendAudioInBuffer>, "AppendAudioInBuffer"},
+ {4, D<&IAudioIn::RegisterBufferEvent>, "RegisterBufferEvent"},
+ {5, D<&IAudioIn::GetReleasedAudioInBuffers>, "GetReleasedAudioInBuffers"},
+ {6, D<&IAudioIn::ContainsAudioInBuffer>, "ContainsAudioInBuffer"},
+ {7, D<&IAudioIn::AppendAudioInBuffer>, "AppendUacInBuffer"},
+ {8, D<&IAudioIn::AppendAudioInBufferAuto>, "AppendAudioInBufferAuto"},
+ {9, D<&IAudioIn::GetReleasedAudioInBuffersAuto>, "GetReleasedAudioInBuffersAuto"},
+ {10, D<&IAudioIn::AppendAudioInBufferAuto>, "AppendUacInBufferAuto"},
+ {11, D<&IAudioIn::GetAudioInBufferCount>, "GetAudioInBufferCount"},
+ {12, D<&IAudioIn::SetDeviceGain>, "SetDeviceGain"},
+ {13, D<&IAudioIn::GetDeviceGain>, "GetDeviceGain"},
+ {14, D<&IAudioIn::FlushAudioInBuffers>, "FlushAudioInBuffers"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+
process->Open(system.Kernel());
if (impl->GetSystem()
diff --git a/src/core/hle/service/audio/audio_in.h b/src/core/hle/service/audio/audio_in.h
index dd7a41f300..793d2b3ad4 100644
--- a/src/core/hle/service/audio/audio_in.h
+++ b/src/core/hle/service/audio/audio_in.h
@@ -46,7 +46,6 @@ public:
Result FlushAudioInBuffers(Out<bool> out_flushed);
private:
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
Kernel::KProcess* process;
KernelHelpers::ServiceContext service_context;
Kernel::KEvent* event;
diff --git a/src/core/hle/service/audio/audio_in_manager.cpp b/src/core/hle/service/audio/audio_in_manager.cpp
index 422e72148b..fccfe38b3b 100644
--- a/src/core/hle/service/audio/audio_in_manager.cpp
+++ b/src/core/hle/service/audio/audio_in_manager.cpp
@@ -12,22 +12,22 @@
namespace Service::Audio {
using namespace AudioCore::AudioIn;
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IAudioInManager::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IAudioInManager::ListAudioIns>, "ListAudioIns"},
- FunctionInfo{1, D<&IAudioInManager::OpenAudioIn>, "OpenAudioIn"},
- FunctionInfo{2, D<&IAudioInManager::ListAudioIns>, "ListAudioInsAuto"},
- FunctionInfo{3, D<&IAudioInManager::OpenAudioIn>, "OpenAudioInAuto"},
- FunctionInfo{4, D<&IAudioInManager::ListAudioInsAutoFiltered>, "ListAudioInsAutoFiltered"},
- FunctionInfo{5, D<&IAudioInManager::OpenAudioInProtocolSpecified>, "OpenAudioInProtocolSpecified"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IAudioInManager::IAudioInManager(Core::System& system_)
- : ServiceFramework{system_, "audin:u"}
- , impl{std::make_unique<AudioCore::AudioIn::Manager>(system_)}
-{}
+ : ServiceFramework{system_, "audin:u"}, impl{std::make_unique<AudioCore::AudioIn::Manager>(
+ system_)} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IAudioInManager::ListAudioIns>, "ListAudioIns"},
+ {1, D<&IAudioInManager::OpenAudioIn>, "OpenAudioIn"},
+ {2, D<&IAudioInManager::ListAudioIns>, "ListAudioInsAuto"},
+ {3, D<&IAudioInManager::OpenAudioIn>, "OpenAudioInAuto"},
+ {4, D<&IAudioInManager::ListAudioInsAutoFiltered>, "ListAudioInsAutoFiltered"},
+ {5, D<&IAudioInManager::OpenAudioInProtocolSpecified>, "OpenAudioInProtocolSpecified"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
IAudioInManager::~IAudioInManager() = default;
diff --git a/src/core/hle/service/audio/audio_in_manager.h b/src/core/hle/service/audio/audio_in_manager.h
index 0ee0badba7..d8f63972c3 100644
--- a/src/core/hle/service/audio/audio_in_manager.h
+++ b/src/core/hle/service/audio/audio_in_manager.h
@@ -54,7 +54,6 @@ private:
AudioCore::AudioIn::AudioInParameter parameter,
InCopyHandle<Kernel::KProcess> process_handle, ClientAppletResourceUserId aruid);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::unique_ptr<AudioCore::AudioIn::Manager> impl;
};
diff --git a/src/core/hle/service/audio/audio_out.cpp b/src/core/hle/service/audio/audio_out.cpp
index a5f06faab8..996eeede58 100644
--- a/src/core/hle/service/audio/audio_out.cpp
+++ b/src/core/hle/service/audio/audio_out.cpp
@@ -15,26 +15,6 @@
namespace Service::Audio {
using namespace AudioCore::AudioOut;
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IAudioOut::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IAudioOut::GetAudioOutState>, "GetAudioOutState"},
- FunctionInfo{1, D<&IAudioOut::Start>, "Start"},
- FunctionInfo{2, D<&IAudioOut::Stop>, "Stop"},
- FunctionInfo{3, D<&IAudioOut::AppendAudioOutBuffer>, "AppendAudioOutBuffer"},
- FunctionInfo{4, D<&IAudioOut::RegisterBufferEvent>, "RegisterBufferEvent"},
- FunctionInfo{5, D<&IAudioOut::GetReleasedAudioOutBuffers>, "GetReleasedAudioOutBuffers"},
- FunctionInfo{6, D<&IAudioOut::ContainsAudioOutBuffer>, "ContainsAudioOutBuffer"},
- FunctionInfo{7, D<&IAudioOut::AppendAudioOutBufferAuto>, "AppendAudioOutBufferAuto"},
- FunctionInfo{8, D<&IAudioOut::GetReleasedAudioOutBuffersAuto>, "GetReleasedAudioOutBuffersAuto"},
- FunctionInfo{9, D<&IAudioOut::GetAudioOutBufferCount>, "GetAudioOutBufferCount"},
- FunctionInfo{10, D<&IAudioOut::GetAudioOutPlayedSampleCount>, "GetAudioOutPlayedSampleCount"},
- FunctionInfo{11, D<&IAudioOut::FlushAudioOutBuffers>, "FlushAudioOutBuffers"},
- FunctionInfo{12, D<&IAudioOut::SetAudioOutVolume>, "SetAudioOutVolume"},
- FunctionInfo{13, D<&IAudioOut::GetAudioOutVolume>, "GetAudioOutVolume"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IAudioOut::IAudioOut(Core::System& system_, Manager& manager, size_t session_id,
const std::string& device_name, const AudioOutParameter& in_params,
Kernel::KProcess* handle, u64 applet_resource_user_id)
@@ -42,6 +22,26 @@ IAudioOut::IAudioOut(Core::System& system_, Manager& manager, size_t session_id,
event{service_context.CreateEvent("AudioOutEvent")}, process{handle},
impl{std::make_shared<AudioCore::AudioOut::Out>(system_, manager, event, session_id)} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IAudioOut::GetAudioOutState>, "GetAudioOutState"},
+ {1, D<&IAudioOut::Start>, "Start"},
+ {2, D<&IAudioOut::Stop>, "Stop"},
+ {3, D<&IAudioOut::AppendAudioOutBuffer>, "AppendAudioOutBuffer"},
+ {4, D<&IAudioOut::RegisterBufferEvent>, "RegisterBufferEvent"},
+ {5, D<&IAudioOut::GetReleasedAudioOutBuffers>, "GetReleasedAudioOutBuffers"},
+ {6, D<&IAudioOut::ContainsAudioOutBuffer>, "ContainsAudioOutBuffer"},
+ {7, D<&IAudioOut::AppendAudioOutBufferAuto>, "AppendAudioOutBufferAuto"},
+ {8, D<&IAudioOut::GetReleasedAudioOutBuffersAuto>, "GetReleasedAudioOutBuffersAuto"},
+ {9, D<&IAudioOut::GetAudioOutBufferCount>, "GetAudioOutBufferCount"},
+ {10, D<&IAudioOut::GetAudioOutPlayedSampleCount>, "GetAudioOutPlayedSampleCount"},
+ {11, D<&IAudioOut::FlushAudioOutBuffers>, "FlushAudioOutBuffers"},
+ {12, D<&IAudioOut::SetAudioOutVolume>, "SetAudioOutVolume"},
+ {13, D<&IAudioOut::GetAudioOutVolume>, "GetAudioOutVolume"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
+
process->Open(system.Kernel());
}
diff --git a/src/core/hle/service/audio/audio_out.h b/src/core/hle/service/audio/audio_out.h
index 311eb84afe..178ee57df6 100644
--- a/src/core/hle/service/audio/audio_out.h
+++ b/src/core/hle/service/audio/audio_out.h
@@ -52,8 +52,6 @@ public:
Result GetAudioOutVolume(Out<f32> out_volume);
private:
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
-
KernelHelpers::ServiceContext service_context;
Kernel::KEvent* event;
Kernel::KProcess* process;
diff --git a/src/core/hle/service/audio/audio_out_manager.cpp b/src/core/hle/service/audio/audio_out_manager.cpp
index 9f24bc3513..3b2087932c 100644
--- a/src/core/hle/service/audio/audio_out_manager.cpp
+++ b/src/core/hle/service/audio/audio_out_manager.cpp
@@ -13,20 +13,20 @@
namespace Service::Audio {
using namespace AudioCore::AudioOut;
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IAudioOutManager::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IAudioOutManager::ListAudioOuts>, "ListAudioOuts"},
- FunctionInfo{1, D<&IAudioOutManager::OpenAudioOut>, "OpenAudioOut"},
- FunctionInfo{2, D<&IAudioOutManager::ListAudioOutsAuto>, "ListAudioOutsAuto"},
- FunctionInfo{3, D<&IAudioOutManager::OpenAudioOutAuto>, "OpenAudioOutAuto"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IAudioOutManager::IAudioOutManager(Core::System& system_)
: ServiceFramework{system_, "audout:u"}
, impl(system_)
{
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IAudioOutManager::ListAudioOuts>, "ListAudioOuts"},
+ {1, D<&IAudioOutManager::OpenAudioOut>, "OpenAudioOut"},
+ {2, D<&IAudioOutManager::ListAudioOutsAuto>, "ListAudioOutsAuto"},
+ {3, D<&IAudioOutManager::OpenAudioOutAuto>, "OpenAudioOutAuto"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IAudioOutManager::~IAudioOutManager() = default;
diff --git a/src/core/hle/service/audio/audio_out_manager.h b/src/core/hle/service/audio/audio_out_manager.h
index 4c71c12cdf..ec974aaba4 100644
--- a/src/core/hle/service/audio/audio_out_manager.h
+++ b/src/core/hle/service/audio/audio_out_manager.h
@@ -43,7 +43,6 @@ private:
AudioCore::AudioOut::AudioOutParameter parameter,
InCopyHandle<Kernel::KProcess> process_handle, ClientAppletResourceUserId aruid);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::optional<AudioCore::AudioOut::Manager> impl;
};
diff --git a/src/core/hle/service/audio/audio_renderer.cpp b/src/core/hle/service/audio/audio_renderer.cpp
index bcb2adaf61..dd76544094 100644
--- a/src/core/hle/service/audio/audio_renderer.cpp
+++ b/src/core/hle/service/audio/audio_renderer.cpp
@@ -10,37 +10,38 @@
namespace Service::Audio {
using namespace AudioCore::Renderer;
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IAudioRenderer::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IAudioRenderer::GetSampleRate>, "GetSampleRate"},
- FunctionInfo{1, D<&IAudioRenderer::GetSampleCount>, "GetSampleCount"},
- FunctionInfo{2, D<&IAudioRenderer::GetMixBufferCount>, "GetMixBufferCount"},
- FunctionInfo{3, D<&IAudioRenderer::GetState>, "GetState"},
- FunctionInfo{4, D<&IAudioRenderer::RequestUpdate>, "RequestUpdate"},
- FunctionInfo{5, D<&IAudioRenderer::Start>, "Start"},
- FunctionInfo{6, D<&IAudioRenderer::Stop>, "Stop"},
- FunctionInfo{7, D<&IAudioRenderer::QuerySystemEvent>, "QuerySystemEvent"},
- FunctionInfo{8, D<&IAudioRenderer::SetRenderingTimeLimit>, "SetRenderingTimeLimit"},
- FunctionInfo{9, D<&IAudioRenderer::GetRenderingTimeLimit>, "GetRenderingTimeLimit"},
- FunctionInfo{10, D<&IAudioRenderer::RequestUpdateAuto>, "RequestUpdateAuto", MakeVersionGate({3,0,0})},
- FunctionInfo{11, nullptr, "ExecuteAudioRendererRendering", MakeVersionGate({3,0,0})},
- FunctionInfo{12, D<&IAudioRenderer::SetVoiceDropParameter>, "SetVoiceDropParameter", MakeVersionGate({15,0,0})},
- FunctionInfo{13, D<&IAudioRenderer::GetVoiceDropParameter>, "GetVoiceDropParameter", MakeVersionGate({15,0,0})}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IAudioRenderer::IAudioRenderer(Core::System& system_, Manager& manager_,
AudioCore::AudioRendererParameterInternal& params,
Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size,
Kernel::KProcess* process_handle_, u64 applet_resource_user_id,
s32 session_id)
- : ServiceFramework{system_, "IAudioRenderer"}, service_context{system_, "IAudioRenderer"}
- , rendered_event{service_context.CreateEvent("IAudioRendererEvent")}, manager{manager_}
- , impl{std::make_unique<Renderer>(system_, manager, rendered_event)}
- , process_handle{process_handle_} {
+ : ServiceFramework{system_, "IAudioRenderer"}, service_context{system_, "IAudioRenderer"},
+ rendered_event{service_context.CreateEvent("IAudioRendererEvent")}, manager{manager_},
+ impl{std::make_unique<Renderer>(system_, manager, rendered_event)}, process_handle{
+ process_handle_} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IAudioRenderer::GetSampleRate>, "GetSampleRate"},
+ {1, D<&IAudioRenderer::GetSampleCount>, "GetSampleCount"},
+ {2, D<&IAudioRenderer::GetMixBufferCount>, "GetMixBufferCount"},
+ {3, D<&IAudioRenderer::GetState>, "GetState"},
+ {4, D<&IAudioRenderer::RequestUpdate>, "RequestUpdate"},
+ {5, D<&IAudioRenderer::Start>, "Start"},
+ {6, D<&IAudioRenderer::Stop>, "Stop"},
+ {7, D<&IAudioRenderer::QuerySystemEvent>, "QuerySystemEvent"},
+ {8, D<&IAudioRenderer::SetRenderingTimeLimit>, "SetRenderingTimeLimit"},
+ {9, D<&IAudioRenderer::GetRenderingTimeLimit>, "GetRenderingTimeLimit"},
+ {10, D<&IAudioRenderer::RequestUpdateAuto>, "RequestUpdateAuto"}, //3.0.0+
+ {11, nullptr, "ExecuteAudioRendererRendering"}, //3.0.0+
+ {12, D<&IAudioRenderer::SetVoiceDropParameter>, "SetVoiceDropParameter"}, //15.0.0+
+ {13, D<&IAudioRenderer::GetVoiceDropParameter>, "GetVoiceDropParameter"}, //15.0.0+
+ };
+ // clang-format on
+ RegisterHandlers(functions);
+
process_handle->Open(system_.Kernel());
- impl->Initialize(params, transfer_memory, transfer_memory_size, process_handle, applet_resource_user_id, session_id);
+ impl->Initialize(params, transfer_memory, transfer_memory_size, process_handle,
+ applet_resource_user_id, session_id);
}
IAudioRenderer::~IAudioRenderer() {
diff --git a/src/core/hle/service/audio/audio_renderer.h b/src/core/hle/service/audio/audio_renderer.h
index e03fc6551d..7f4ea9a662 100644
--- a/src/core/hle/service/audio/audio_renderer.h
+++ b/src/core/hle/service/audio/audio_renderer.h
@@ -45,7 +45,6 @@ private:
Result SetVoiceDropParameter(f32 voice_drop_parameter);
Result GetVoiceDropParameter(Out<f32> out_voice_drop_parameter);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
KernelHelpers::ServiceContext service_context;
Kernel::KEvent* rendered_event;
AudioCore::Renderer::Manager& manager;
diff --git a/src/core/hle/service/audio/audio_renderer_manager.cpp b/src/core/hle/service/audio/audio_renderer_manager.cpp
index 98701c79c1..4756802eeb 100644
--- a/src/core/hle/service/audio/audio_renderer_manager.cpp
+++ b/src/core/hle/service/audio/audio_renderer_manager.cpp
@@ -18,21 +18,21 @@ namespace Service::Audio {
using namespace AudioCore::Renderer;
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IAudioRendererManager::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IAudioRendererManager::OpenAudioRenderer>, "OpenAudioRenderer"},
- FunctionInfo{1, D<&IAudioRendererManager::GetWorkBufferSize>, "GetWorkBufferSize"},
- FunctionInfo{2, D<&IAudioRendererManager::GetAudioDeviceService>, "GetAudioDeviceService"},
- FunctionInfo{3, nullptr, "OpenAudioRendererForManualExecution"},
- FunctionInfo{4, D<&IAudioRendererManager::GetAudioDeviceServiceWithRevisionInfo>, "GetAudioDeviceServiceWithRevisionInfo"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IAudioRendererManager::IAudioRendererManager(Core::System& system_)
: ServiceFramework{system_, "audren:u"}
, impl(system_)
{
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IAudioRendererManager::OpenAudioRenderer>, "OpenAudioRenderer"},
+ {1, D<&IAudioRendererManager::GetWorkBufferSize>, "GetWorkBufferSize"},
+ {2, D<&IAudioRendererManager::GetAudioDeviceService>, "GetAudioDeviceService"},
+ {3, nullptr, "OpenAudioRendererForManualExecution"},
+ {4, D<&IAudioRendererManager::GetAudioDeviceServiceWithRevisionInfo>, "GetAudioDeviceServiceWithRevisionInfo"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IAudioRendererManager::~IAudioRendererManager() = default;
diff --git a/src/core/hle/service/audio/audio_renderer_manager.h b/src/core/hle/service/audio/audio_renderer_manager.h
index bd3ea06326..fdce8b6ffa 100644
--- a/src/core/hle/service/audio/audio_renderer_manager.h
+++ b/src/core/hle/service/audio/audio_renderer_manager.h
@@ -33,7 +33,6 @@ private:
Result GetAudioDeviceServiceWithRevisionInfo(Out<SharedPointer<IAudioDevice>> out_audio_device,
u32 revision, ClientAppletResourceUserId aruid);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::optional<AudioCore::Renderer::Manager> impl;
u32 num_audio_devices{0};
};
diff --git a/src/core/hle/service/audio/final_output_recorder_manager.cpp b/src/core/hle/service/audio/final_output_recorder_manager.cpp
index 9c51613de6..2bc9d29e3e 100644
--- a/src/core/hle/service/audio/final_output_recorder_manager.cpp
+++ b/src/core/hle/service/audio/final_output_recorder_manager.cpp
@@ -11,29 +11,34 @@ namespace Service::Audio {
class IFinalOutputRecorder final : public ServiceFramework<IFinalOutputRecorder> {
public:
explicit IFinalOutputRecorder(Core::System& system_)
- : ServiceFramework{system_, "IFinalOutputRecorder"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetFinalOutputRecorderState"},
- FunctionInfo{1, nullptr, "Start"},
- FunctionInfo{2, nullptr, "Stop"},
- FunctionInfo{3, nullptr, "AppendFinalOutputRecorderBuffer"},
- FunctionInfo{4, nullptr, "RegisterBufferEvent"},
- FunctionInfo{5, nullptr, "GetReleasedFinalOutputRecorderBuffers"},
- FunctionInfo{6, nullptr, "ContainsFinalOutputRecorderBuffer"},
- FunctionInfo{7, nullptr, "GetFinalOutputRecorderBufferEndTime"},
- FunctionInfo{8, nullptr, "AppendFinalOutputRecorderBufferAuto"},
- FunctionInfo{9, nullptr, "GetReleasedFinalOutputRecorderBufferAuto"},
- FunctionInfo{10, nullptr, "FlushFinalOutputRecorderBuffers"},
- FunctionInfo{11, nullptr, "AttachWorkBuffer"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "IFinalOutputRecorder"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetFinalOutputRecorderState"},
+ {1, nullptr, "Start"},
+ {2, nullptr, "Stop"},
+ {3, nullptr, "AppendFinalOutputRecorderBuffer"},
+ {4, nullptr, "RegisterBufferEvent"},
+ {5, nullptr, "GetReleasedFinalOutputRecorderBuffers"},
+ {6, nullptr, "ContainsFinalOutputRecorderBuffer"},
+ {7, nullptr, "GetFinalOutputRecorderBufferEndTime"},
+ {8, nullptr, "AppendFinalOutputRecorderBufferAuto"},
+ {9, nullptr, "GetReleasedFinalOutputRecorderBufferAuto"},
+ {10, nullptr, "FlushFinalOutputRecorderBuffers"},
+ {11, nullptr, "AttachWorkBuffer"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
IFinalOutputRecorderManager::IFinalOutputRecorderManager(Core::System& system_)
: ServiceFramework{system_, "audrec:u"} {
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "OpenFinalOutputRecorder"},
+ };
+ RegisterHandlers(functions);
}
IFinalOutputRecorderManager::~IFinalOutputRecorderManager() = default;
diff --git a/src/core/hle/service/audio/final_output_recorder_manager.h b/src/core/hle/service/audio/final_output_recorder_manager.h
index ee392b2ada..833c621be7 100644
--- a/src/core/hle/service/audio/final_output_recorder_manager.h
+++ b/src/core/hle/service/audio/final_output_recorder_manager.h
@@ -18,13 +18,6 @@ class IFinalOutputRecorderManager final : public ServiceFramework<IFinalOutputRe
public:
explicit IFinalOutputRecorderManager(Core::System& system_);
~IFinalOutputRecorderManager() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "OpenFinalOutputRecorder"}
- );
};
} // namespace Service::Audio
diff --git a/src/core/hle/service/audio/final_output_recorder_manager_for_applet.cpp b/src/core/hle/service/audio/final_output_recorder_manager_for_applet.cpp
index 42c08d90ec..dc2ea63aa0 100644
--- a/src/core/hle/service/audio/final_output_recorder_manager_for_applet.cpp
+++ b/src/core/hle/service/audio/final_output_recorder_manager_for_applet.cpp
@@ -10,6 +10,14 @@ namespace Service::Audio {
IFinalOutputRecorderManagerForApplet::IFinalOutputRecorderManagerForApplet(Core::System& system_)
: ServiceFramework{system_, "audrec:a"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "RequestSuspend"},
+ {1, nullptr, "RequestResume"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IFinalOutputRecorderManagerForApplet::~IFinalOutputRecorderManagerForApplet() = default;
diff --git a/src/core/hle/service/audio/final_output_recorder_manager_for_applet.h b/src/core/hle/service/audio/final_output_recorder_manager_for_applet.h
index 7beaa888ff..32efb75b5e 100644
--- a/src/core/hle/service/audio/final_output_recorder_manager_for_applet.h
+++ b/src/core/hle/service/audio/final_output_recorder_manager_for_applet.h
@@ -19,14 +19,6 @@ class IFinalOutputRecorderManagerForApplet final
public:
explicit IFinalOutputRecorderManagerForApplet(Core::System& system_);
~IFinalOutputRecorderManagerForApplet() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "RequestSuspend"},
- FunctionInfo{1, nullptr, "RequestResume"}
- );
};
} // namespace Service::Audio
diff --git a/src/core/hle/service/audio/hardware_opus_decoder.cpp b/src/core/hle/service/audio/hardware_opus_decoder.cpp
index f0dde63e14..14888afa0d 100644
--- a/src/core/hle/service/audio/hardware_opus_decoder.cpp
+++ b/src/core/hle/service/audio/hardware_opus_decoder.cpp
@@ -11,25 +11,25 @@ namespace Service::Audio {
using namespace AudioCore::OpusDecoder;
- std::optional<ServiceFrameworkBase::FunctionInfoBase> IHardwareOpusDecoder::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IHardwareOpusDecoder::DecodeInterleavedOld>, "DecodeInterleavedOld"},
- FunctionInfo{1, D<&IHardwareOpusDecoder::SetContext>, "SetContext"},
- FunctionInfo{2, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStreamOld>, "DecodeInterleavedForMultiStreamOld"},
- FunctionInfo{3, D<&IHardwareOpusDecoder::SetContextForMultiStream>, "SetContextForMultiStream"},
- FunctionInfo{4, D<&IHardwareOpusDecoder::DecodeInterleavedWithPerfOld>, "DecodeInterleavedWithPerfOld"},
- FunctionInfo{5, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStreamWithPerfOld>, "DecodeInterleavedForMultiStreamWithPerfOld"},
- FunctionInfo{6, D<&IHardwareOpusDecoder::DecodeInterleavedWithPerfAndResetOld>, "DecodeInterleavedWithPerfAndResetOld"},
- FunctionInfo{7, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStreamWithPerfAndResetOld>, "DecodeInterleavedForMultiStreamWithPerfAndResetOld"},
- FunctionInfo{8, D<&IHardwareOpusDecoder::DecodeInterleaved>, "DecodeInterleaved"},
- FunctionInfo{9, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStream>, "DecodeInterleavedForMultiStream"}
- );
- return HandlerTableGenerateWithFind(key, functions);
- }
-
IHardwareOpusDecoder::IHardwareOpusDecoder(Core::System& system_, HardwareOpus& hardware_opus)
: ServiceFramework{system_, "IHardwareOpusDecoder"},
impl{std::make_unique<AudioCore::OpusDecoder::OpusDecoder>(system_, hardware_opus)} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IHardwareOpusDecoder::DecodeInterleavedOld>, "DecodeInterleavedOld"},
+ {1, D<&IHardwareOpusDecoder::SetContext>, "SetContext"},
+ {2, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStreamOld>, "DecodeInterleavedForMultiStreamOld"},
+ {3, D<&IHardwareOpusDecoder::SetContextForMultiStream>, "SetContextForMultiStream"},
+ {4, D<&IHardwareOpusDecoder::DecodeInterleavedWithPerfOld>, "DecodeInterleavedWithPerfOld"},
+ {5, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStreamWithPerfOld>, "DecodeInterleavedForMultiStreamWithPerfOld"},
+ {6, D<&IHardwareOpusDecoder::DecodeInterleavedWithPerfAndResetOld>, "DecodeInterleavedWithPerfAndResetOld"},
+ {7, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStreamWithPerfAndResetOld>, "DecodeInterleavedForMultiStreamWithPerfAndResetOld"},
+ {8, D<&IHardwareOpusDecoder::DecodeInterleaved>, "DecodeInterleaved"},
+ {9, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStream>, "DecodeInterleavedForMultiStream"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IHardwareOpusDecoder::~IHardwareOpusDecoder() = default;
diff --git a/src/core/hle/service/audio/hardware_opus_decoder.h b/src/core/hle/service/audio/hardware_opus_decoder.h
index 9f9b17bc81..5297572da8 100644
--- a/src/core/hle/service/audio/hardware_opus_decoder.h
+++ b/src/core/hle/service/audio/hardware_opus_decoder.h
@@ -58,7 +58,6 @@ private:
Out<u32> out_data_size, Out<u32> out_sample_count, Out<u64> out_time_taken,
InBuffer<BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> opus_data,
bool reset);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::unique_ptr<AudioCore::OpusDecoder::OpusDecoder> impl;
Common::ScratchBuffer<u8> output_data;
diff --git a/src/core/hle/service/audio/hardware_opus_decoder_manager.cpp b/src/core/hle/service/audio/hardware_opus_decoder_manager.cpp
index 3000ba8c60..b89e210012 100644
--- a/src/core/hle/service/audio/hardware_opus_decoder_manager.cpp
+++ b/src/core/hle/service/audio/hardware_opus_decoder_manager.cpp
@@ -12,24 +12,23 @@ namespace Service::Audio {
using namespace AudioCore::OpusDecoder;
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IHardwareOpusDecoderManager::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoder>, "OpenHardwareOpusDecoder"},
- FunctionInfo{1, D<&IHardwareOpusDecoderManager::GetWorkBufferSize>, "GetWorkBufferSize"},
- FunctionInfo{2, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStream>, "OpenOpusDecoderForMultiStream"},
- FunctionInfo{3, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStream>, "GetWorkBufferSizeForMultiStream"},
- FunctionInfo{4, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderEx>, "OpenHardwareOpusDecoderEx"},
- FunctionInfo{5, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeEx>, "GetWorkBufferSizeEx"},
- FunctionInfo{6, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStreamEx>, "OpenHardwareOpusDecoderForMultiStreamEx"},
- FunctionInfo{7, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamEx>, "GetWorkBufferSizeForMultiStreamEx"},
- FunctionInfo{8, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeExEx>, "GetWorkBufferSizeExEx"},
- FunctionInfo{9, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamExEx>, "GetWorkBufferSizeForMultiStreamExEx"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IHardwareOpusDecoderManager::IHardwareOpusDecoderManager(Core::System& system_)
: ServiceFramework{system_, "hwopus"}, system{system_}, impl{system} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoder>, "OpenHardwareOpusDecoder"},
+ {1, D<&IHardwareOpusDecoderManager::GetWorkBufferSize>, "GetWorkBufferSize"},
+ {2, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStream>, "OpenOpusDecoderForMultiStream"},
+ {3, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStream>, "GetWorkBufferSizeForMultiStream"},
+ {4, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderEx>, "OpenHardwareOpusDecoderEx"},
+ {5, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeEx>, "GetWorkBufferSizeEx"},
+ {6, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStreamEx>, "OpenHardwareOpusDecoderForMultiStreamEx"},
+ {7, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamEx>, "GetWorkBufferSizeForMultiStreamEx"},
+ {8, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeExEx>, "GetWorkBufferSizeExEx"},
+ {9, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamExEx>, "GetWorkBufferSizeForMultiStreamExEx"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
IHardwareOpusDecoderManager::~IHardwareOpusDecoderManager() = default;
diff --git a/src/core/hle/service/audio/hardware_opus_decoder_manager.h b/src/core/hle/service/audio/hardware_opus_decoder_manager.h
index 1dbac9addb..4dd211e232 100644
--- a/src/core/hle/service/audio/hardware_opus_decoder_manager.h
+++ b/src/core/hle/service/audio/hardware_opus_decoder_manager.h
@@ -49,7 +49,6 @@ private:
Result GetWorkBufferSizeForMultiStreamExEx(
Out<u32> out_size, InLargeData<OpusMultiStreamParametersEx, BufferAttr_HipcPointer> params);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
Core::System& system;
AudioCore::OpusDecoder::OpusDecoderManager impl;
};
diff --git a/src/core/hle/service/bcat/bcat.h b/src/core/hle/service/bcat/bcat.h
index 2aaffc693b..65961baffe 100644
--- a/src/core/hle/service/bcat/bcat.h
+++ b/src/core/hle/service/bcat/bcat.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/bcat/bcat_result.h b/src/core/hle/service/bcat/bcat_result.h
index edf8a65641..c6fa1b4e26 100644
--- a/src/core/hle/service/bcat/bcat_result.h
+++ b/src/core/hle/service/bcat/bcat_result.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/core/hle/service/bcat/bcat_service.cpp b/src/core/hle/service/bcat/bcat_service.cpp
index 85f262f6eb..bc2a3e3457 100644
--- a/src/core/hle/service/bcat/bcat_service.cpp
+++ b/src/core/hle/service/bcat/bcat_service.cpp
@@ -24,45 +24,44 @@ static u64 GetCurrentBuildID(const Core::System::CurrentBuildProcessID& id) {
return out;
}
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IBcatService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{10100, D<&IBcatService::RequestSyncDeliveryCache>, "RequestSyncDeliveryCache"},
- FunctionInfo{10101, D<&IBcatService::RequestSyncDeliveryCacheWithDirectoryName>, "RequestSyncDeliveryCacheWithDirectoryName"},
- FunctionInfo{10200, nullptr, "CancelSyncDeliveryCacheRequest"},
- FunctionInfo{20100, nullptr, "RequestSyncDeliveryCacheWithApplicationId"},
- FunctionInfo{20101, nullptr, "RequestSyncDeliveryCacheWithApplicationIdAndDirectoryName"},
- FunctionInfo{20300, nullptr, "GetDeliveryCacheStorageUpdateNotifier"},
- FunctionInfo{20301, nullptr, "RequestSuspendDeliveryTask"},
- FunctionInfo{20400, nullptr, "RegisterSystemApplicationDeliveryTask"},
- FunctionInfo{20401, nullptr, "UnregisterSystemApplicationDeliveryTask"},
- FunctionInfo{20410, nullptr, "SetSystemApplicationDeliveryTaskTimer"},
- FunctionInfo{30100, D<&IBcatService::SetPassphrase>, "SetPassphrase"},
- FunctionInfo{30101, nullptr, "Unknown30101", MakeVersionGate({2,0,0}, {2,3,0})},
- FunctionInfo{30102, nullptr, "Unknown30102", MakeVersionGate({2,0,0}, {2,3,0})},
- FunctionInfo{30200, nullptr, "RegisterBackgroundDeliveryTask"},
- FunctionInfo{30201, nullptr, "UnregisterBackgroundDeliveryTask"},
- FunctionInfo{30202, nullptr, "BlockDeliveryTask"},
- FunctionInfo{30203, nullptr, "UnblockDeliveryTask"},
- FunctionInfo{30210, nullptr, "SetDeliveryTaskTimer"},
- FunctionInfo{30300, D<&IBcatService::RegisterSystemApplicationDeliveryTasks>, "RegisterSystemApplicationDeliveryTasks"},
- FunctionInfo{90100, nullptr, "GetDeliveryTaskList"},
- FunctionInfo{90101, nullptr, "GetDeliveryTaskListForSystem", MakeVersionGate({11,0,0})},
- FunctionInfo{90200, nullptr, "GetDeliveryList"},
- FunctionInfo{90201, D<&IBcatService::ClearDeliveryCacheStorage>, "ClearDeliveryCacheStorage"},
- FunctionInfo{90202, nullptr, "ClearDeliveryTaskSubscriptionStatus"},
- FunctionInfo{90300, nullptr, "GetPushNotificationLog"},
- FunctionInfo{90301, nullptr, "GetDeliveryCacheStorageUsage", MakeVersionGate({11,0,0})}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IBcatService::IBcatService(Core::System& system_, BcatBackend& backend_, u64 program_id_)
- : ServiceFramework{system_, "IBcatService"}, backend{backend_}, program_id{program_id_}
- , progress{{
- ProgressServiceBackend{system_, "Normal"},
- ProgressServiceBackend{system_, "Directory"},
- }}
-{}
+ : ServiceFramework{system_, "IBcatService"}, backend{backend_}, program_id{program_id_},
+ progress{{
+ ProgressServiceBackend{system_, "Normal"},
+ ProgressServiceBackend{system_, "Directory"},
+ }} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {10100, D<&IBcatService::RequestSyncDeliveryCache>, "RequestSyncDeliveryCache"},
+ {10101, D<&IBcatService::RequestSyncDeliveryCacheWithDirectoryName>, "RequestSyncDeliveryCacheWithDirectoryName"},
+ {10200, nullptr, "CancelSyncDeliveryCacheRequest"},
+ {20100, nullptr, "RequestSyncDeliveryCacheWithApplicationId"},
+ {20101, nullptr, "RequestSyncDeliveryCacheWithApplicationIdAndDirectoryName"},
+ {20300, nullptr, "GetDeliveryCacheStorageUpdateNotifier"},
+ {20301, nullptr, "RequestSuspendDeliveryTask"},
+ {20400, nullptr, "RegisterSystemApplicationDeliveryTask"},
+ {20401, nullptr, "UnregisterSystemApplicationDeliveryTask"},
+ {20410, nullptr, "SetSystemApplicationDeliveryTaskTimer"},
+ {30100, D<&IBcatService::SetPassphrase>, "SetPassphrase"},
+ {30101, nullptr, "Unknown30101"}, //2.0.0-2.3.0
+ {30102, nullptr, "Unknown30102"}, //2.0.0-2.3.0
+ {30200, nullptr, "RegisterBackgroundDeliveryTask"},
+ {30201, nullptr, "UnregisterBackgroundDeliveryTask"},
+ {30202, nullptr, "BlockDeliveryTask"},
+ {30203, nullptr, "UnblockDeliveryTask"},
+ {30210, nullptr, "SetDeliveryTaskTimer"},
+ {30300, D<&IBcatService::RegisterSystemApplicationDeliveryTasks>, "RegisterSystemApplicationDeliveryTasks"},
+ {90100, nullptr, "GetDeliveryTaskList"},
+ {90101, nullptr, "GetDeliveryTaskListForSystem"}, //11.0.0+
+ {90200, nullptr, "GetDeliveryList"},
+ {90201, D<&IBcatService::ClearDeliveryCacheStorage>, "ClearDeliveryCacheStorage"},
+ {90202, nullptr, "ClearDeliveryTaskSubscriptionStatus"},
+ {90300, nullptr, "GetPushNotificationLog"},
+ {90301, nullptr, "GetDeliveryCacheStorageUsage"}, //11.0.0+
+ };
+ // clang-format on
+ RegisterHandlers(functions);
+}
IBcatService::~IBcatService() = default;
diff --git a/src/core/hle/service/bcat/bcat_service.h b/src/core/hle/service/bcat/bcat_service.h
index ed95f021d0..5e11059a78 100644
--- a/src/core/hle/service/bcat/bcat_service.h
+++ b/src/core/hle/service/bcat/bcat_service.h
@@ -41,7 +41,6 @@ private:
ProgressServiceBackend& GetProgressBackend(SyncType type);
const ProgressServiceBackend& GetProgressBackend(SyncType type) const;
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
BcatBackend& backend;
u64 program_id;
std::array<ProgressServiceBackend, static_cast<size_t>(SyncType::Count)> progress;
diff --git a/src/core/hle/service/bcat/delivery_cache_directory_service.cpp b/src/core/hle/service/bcat/delivery_cache_directory_service.cpp
index 0d464a2fdc..8ead0bae99 100644
--- a/src/core/hle/service/bcat/delivery_cache_directory_service.cpp
+++ b/src/core/hle/service/bcat/delivery_cache_directory_service.cpp
@@ -27,18 +27,18 @@ static BcatDigest DigestFile(const FileSys::VirtualFile& file) {
return out;
}
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IDeliveryCacheDirectoryService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IDeliveryCacheDirectoryService::Open>, "Open"},
- FunctionInfo{1, D<&IDeliveryCacheDirectoryService::Read>, "Read"},
- FunctionInfo{2, D<&IDeliveryCacheDirectoryService::GetCount>, "GetCount"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IDeliveryCacheDirectoryService::IDeliveryCacheDirectoryService(Core::System& system_,
FileSys::VirtualDir root_)
: ServiceFramework{system_, "IDeliveryCacheDirectoryService"}, root(std::move(root_)) {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IDeliveryCacheDirectoryService::Open>, "Open"},
+ {1, D<&IDeliveryCacheDirectoryService::Read>, "Read"},
+ {2, D<&IDeliveryCacheDirectoryService::GetCount>, "GetCount"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IDeliveryCacheDirectoryService::~IDeliveryCacheDirectoryService() = default;
diff --git a/src/core/hle/service/bcat/delivery_cache_directory_service.h b/src/core/hle/service/bcat/delivery_cache_directory_service.h
index af90680390..cea67b0d87 100644
--- a/src/core/hle/service/bcat/delivery_cache_directory_service.h
+++ b/src/core/hle/service/bcat/delivery_cache_directory_service.h
@@ -29,7 +29,6 @@ private:
OutArray<DeliveryCacheDirectoryEntry, BufferAttr_HipcMapAlias> out_buffer);
Result GetCount(Out<s32> out_count);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
FileSys::VirtualDir root;
FileSys::VirtualDir current_dir;
};
diff --git a/src/core/hle/service/bcat/delivery_cache_file_service.cpp b/src/core/hle/service/bcat/delivery_cache_file_service.cpp
index d9b6ff77ee..1d961e1655 100644
--- a/src/core/hle/service/bcat/delivery_cache_file_service.cpp
+++ b/src/core/hle/service/bcat/delivery_cache_file_service.cpp
@@ -12,19 +12,19 @@
namespace Service::BCAT {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IDeliveryCacheFileService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IDeliveryCacheFileService::Open>, "Open"},
- FunctionInfo{1, D<&IDeliveryCacheFileService::Read>, "Read"},
- FunctionInfo{2, D<&IDeliveryCacheFileService::GetSize>, "GetSize"},
- FunctionInfo{3, D<&IDeliveryCacheFileService::GetDigest>, "GetDigest"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IDeliveryCacheFileService::IDeliveryCacheFileService(Core::System& system_,
FileSys::VirtualDir root_)
: ServiceFramework{system_, "IDeliveryCacheFileService"}, root(std::move(root_)) {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IDeliveryCacheFileService::Open>, "Open"},
+ {1, D<&IDeliveryCacheFileService::Read>, "Read"},
+ {2, D<&IDeliveryCacheFileService::GetSize>, "GetSize"},
+ {3, D<&IDeliveryCacheFileService::GetDigest>, "GetDigest"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IDeliveryCacheFileService::~IDeliveryCacheFileService() = default;
diff --git a/src/core/hle/service/bcat/delivery_cache_file_service.h b/src/core/hle/service/bcat/delivery_cache_file_service.h
index 176c8eb3e5..911bda55b3 100644
--- a/src/core/hle/service/bcat/delivery_cache_file_service.h
+++ b/src/core/hle/service/bcat/delivery_cache_file_service.h
@@ -29,7 +29,6 @@ private:
Result GetSize(Out<u64> out_size);
Result GetDigest(Out<BcatDigest> out_digest);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
FileSys::VirtualDir root;
FileSys::VirtualFile current_file;
};
diff --git a/src/core/hle/service/bcat/delivery_cache_progress_service.cpp b/src/core/hle/service/bcat/delivery_cache_progress_service.cpp
index 4de42dd580..873977bf90 100644
--- a/src/core/hle/service/bcat/delivery_cache_progress_service.cpp
+++ b/src/core/hle/service/bcat/delivery_cache_progress_service.cpp
@@ -10,18 +10,18 @@
namespace Service::BCAT {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IDeliveryCacheProgressService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IDeliveryCacheProgressService::GetEvent>, "GetEvent"},
- FunctionInfo{1, D<&IDeliveryCacheProgressService::GetImpl>, "GetImpl"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IDeliveryCacheProgressService::IDeliveryCacheProgressService(Core::System& system_,
Kernel::KReadableEvent& event_,
const DeliveryCacheProgressImpl& impl_)
: ServiceFramework{system_, "IDeliveryCacheProgressService"}, event{event_}, impl{impl_} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IDeliveryCacheProgressService::GetEvent>, "Get"},
+ {1, D<&IDeliveryCacheProgressService::GetImpl>, "Get"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IDeliveryCacheProgressService::~IDeliveryCacheProgressService() = default;
diff --git a/src/core/hle/service/bcat/delivery_cache_progress_service.h b/src/core/hle/service/bcat/delivery_cache_progress_service.h
index 88f49cea85..83d4d35827 100644
--- a/src/core/hle/service/bcat/delivery_cache_progress_service.h
+++ b/src/core/hle/service/bcat/delivery_cache_progress_service.h
@@ -31,7 +31,6 @@ private:
Result GetEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
Result GetImpl(OutLargeData<DeliveryCacheProgressImpl, BufferAttr_HipcPointer> out_impl);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
Kernel::KReadableEvent& event;
const DeliveryCacheProgressImpl& impl;
};
diff --git a/src/core/hle/service/bcat/delivery_cache_storage_service.cpp b/src/core/hle/service/bcat/delivery_cache_storage_service.cpp
index 67dc857642..a363bcb2d1 100644
--- a/src/core/hle/service/bcat/delivery_cache_storage_service.cpp
+++ b/src/core/hle/service/bcat/delivery_cache_storage_service.cpp
@@ -12,18 +12,18 @@
namespace Service::BCAT {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IDeliveryCacheStorageService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IDeliveryCacheStorageService::CreateFileService>, "CreateFileService"},
- FunctionInfo{1, D<&IDeliveryCacheStorageService::CreateDirectoryService>, "CreateDirectoryService"},
- FunctionInfo{10, D<&IDeliveryCacheStorageService::EnumerateDeliveryCacheDirectory>, "EnumerateDeliveryCacheDirectory"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IDeliveryCacheStorageService::IDeliveryCacheStorageService(Core::System& system_,
FileSys::VirtualDir root_)
: ServiceFramework{system_, "IDeliveryCacheStorageService"}, root(std::move(root_)) {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IDeliveryCacheStorageService::CreateFileService>, "CreateFileService"},
+ {1, D<&IDeliveryCacheStorageService::CreateDirectoryService>, "CreateDirectoryService"},
+ {10, D<&IDeliveryCacheStorageService::EnumerateDeliveryCacheDirectory>, "EnumerateDeliveryCacheDirectory"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IDeliveryCacheStorageService::~IDeliveryCacheStorageService() = default;
diff --git a/src/core/hle/service/bcat/delivery_cache_storage_service.h b/src/core/hle/service/bcat/delivery_cache_storage_service.h
index b30f24fb47..4849e58047 100644
--- a/src/core/hle/service/bcat/delivery_cache_storage_service.h
+++ b/src/core/hle/service/bcat/delivery_cache_storage_service.h
@@ -31,7 +31,6 @@ private:
Out<s32> out_directory_count,
OutArray<DirectoryName, BufferAttr_HipcMapAlias> out_directories);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
FileSys::VirtualDir root;
std::vector<DirectoryName> entries;
std::size_t next_read_index = 0;
diff --git a/src/core/hle/service/bcat/news/builtin_news.h b/src/core/hle/service/bcat/news/builtin_news.h
index cb06b2d4e3..e47cc89588 100644
--- a/src/core/hle/service/bcat/news/builtin_news.h
+++ b/src/core/hle/service/bcat/news/builtin_news.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
diff --git a/src/core/hle/service/bcat/news/msgpack.cpp b/src/core/hle/service/bcat/news/msgpack.cpp
index b67b75ea9d..9cea2de522 100644
--- a/src/core/hle/service/bcat/news/msgpack.cpp
+++ b/src/core/hle/service/bcat/news/msgpack.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
#include "core/hle/service/bcat/news/msgpack.h"
diff --git a/src/core/hle/service/bcat/news/msgpack.h b/src/core/hle/service/bcat/news/msgpack.h
index a7a2aa40ba..3163689782 100644
--- a/src/core/hle/service/bcat/news/msgpack.h
+++ b/src/core/hle/service/bcat/news/msgpack.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
diff --git a/src/core/hle/service/bcat/news/newly_arrived_event_holder.cpp b/src/core/hle/service/bcat/news/newly_arrived_event_holder.cpp
index 57d71c49d8..b60de3b1f5 100644
--- a/src/core/hle/service/bcat/news/newly_arrived_event_holder.cpp
+++ b/src/core/hle/service/bcat/news/newly_arrived_event_holder.cpp
@@ -9,16 +9,17 @@
namespace Service::News {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> INewlyArrivedEventHolder::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&INewlyArrivedEventHolder::Get>, "Get"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
INewlyArrivedEventHolder::INewlyArrivedEventHolder(Core::System& system_)
- : ServiceFramework{system_, "INewlyArrivedEventHolder"}
- , service_context{system_, "INewlyArrivedEventHolder"} {
+ : ServiceFramework{system_, "INewlyArrivedEventHolder"}, service_context{
+ system_,
+ "INewlyArrivedEventHolder"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&INewlyArrivedEventHolder::Get>, "Get"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
arrived_event = service_context.CreateEvent("INewlyArrivedEventHolder::ArrivedEvent");
}
diff --git a/src/core/hle/service/bcat/news/newly_arrived_event_holder.h b/src/core/hle/service/bcat/news/newly_arrived_event_holder.h
index fccc8d6e55..5c2aeec182 100644
--- a/src/core/hle/service/bcat/news/newly_arrived_event_holder.h
+++ b/src/core/hle/service/bcat/news/newly_arrived_event_holder.h
@@ -29,7 +29,6 @@ public:
private:
Result Get(OutCopyHandle<Kernel::KReadableEvent> out_event);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
Kernel::KEvent* arrived_event;
KernelHelpers::ServiceContext service_context;
};
diff --git a/src/core/hle/service/bcat/news/news_data_service.cpp b/src/core/hle/service/bcat/news/news_data_service.cpp
index f5de93db49..200d00e785 100644
--- a/src/core/hle/service/bcat/news/news_data_service.cpp
+++ b/src/core/hle/service/bcat/news/news_data_service.cpp
@@ -24,19 +24,16 @@ std::string_view ToStringView(std::span<const char> buf) {
} // namespace
-std::optional<ServiceFrameworkBase::FunctionInfoBase> INewsDataService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&INewsDataService::Open>, "Open"},
- FunctionInfo{1, D<&INewsDataService::OpenWithNewsRecordV1>, "OpenWithNewsRecordV1"},
- FunctionInfo{2, D<&INewsDataService::Read>, "Read"},
- FunctionInfo{3, D<&INewsDataService::GetSize>, "GetSize"},
- FunctionInfo{1001, D<&INewsDataService::OpenWithNewsRecord>, "OpenWithNewsRecord"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
INewsDataService::INewsDataService(Core::System& system_)
: ServiceFramework{system_, "INewsDataService"} {
+ static const FunctionInfo functions[] = {
+ {0, D<&INewsDataService::Open>, "Open"},
+ {1, D<&INewsDataService::OpenWithNewsRecordV1>, "OpenWithNewsRecordV1"},
+ {2, D<&INewsDataService::Read>, "Read"},
+ {3, D<&INewsDataService::GetSize>, "GetSize"},
+ {1001, D<&INewsDataService::OpenWithNewsRecord>, "OpenWithNewsRecord"},
+ };
+ RegisterHandlers(functions);
}
INewsDataService::~INewsDataService() = default;
diff --git a/src/core/hle/service/bcat/news/news_data_service.h b/src/core/hle/service/bcat/news/news_data_service.h
index 8ce10c045d..45fe4bafcc 100644
--- a/src/core/hle/service/bcat/news/news_data_service.h
+++ b/src/core/hle/service/bcat/news/news_data_service.h
@@ -31,7 +31,6 @@ private:
Result Read(Out<u64> out_size, s64 offset, OutBuffer<BufferAttr_HipcMapAlias> out_buffer);
Result GetSize(Out<s64> out_size);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::vector<u8> opened_payload;
};
diff --git a/src/core/hle/service/bcat/news/news_database_service.cpp b/src/core/hle/service/bcat/news/news_database_service.cpp
index 08fdfcb58b..27ca1ad378 100644
--- a/src/core/hle/service/bcat/news/news_database_service.cpp
+++ b/src/core/hle/service/bcat/news/news_database_service.cpp
@@ -45,21 +45,18 @@ bool UpdateField(NewsRecord& rec, std::string_view column, s32 value, bool addit
} // namespace
-std::optional<ServiceFrameworkBase::FunctionInfoBase> INewsDatabaseService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&INewsDatabaseService::GetListV1>, "GetListV1"},
- FunctionInfo{1, D<&INewsDatabaseService::Count>, "Count"},
- FunctionInfo{2, D<&INewsDatabaseService::CountWithKey>, "CountWithKey"},
- FunctionInfo{3, D<&INewsDatabaseService::UpdateIntegerValue>, "UpdateIntegerValue"},
- FunctionInfo{4, D<&INewsDatabaseService::UpdateIntegerValueWithAddition>, "UpdateIntegerValueWithAddition"},
- FunctionInfo{5, D<&INewsDatabaseService::UpdateStringValue>, "UpdateStringValue"},
- FunctionInfo{1000, D<&INewsDatabaseService::GetList>, "GetList"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
INewsDatabaseService::INewsDatabaseService(Core::System& system_)
: ServiceFramework{system_, "INewsDatabaseService"} {
+ static const FunctionInfo functions[] = {
+ {0, D<&INewsDatabaseService::GetListV1>, "GetListV1"},
+ {1, D<&INewsDatabaseService::Count>, "Count"},
+ {2, D<&INewsDatabaseService::CountWithKey>, "CountWithKey"},
+ {3, D<&INewsDatabaseService::UpdateIntegerValue>, "UpdateIntegerValue"},
+ {4, D<&INewsDatabaseService::UpdateIntegerValueWithAddition>, "UpdateIntegerValueWithAddition"},
+ {5, D<&INewsDatabaseService::UpdateStringValue>, "UpdateStringValue"},
+ {1000, D<&INewsDatabaseService::GetList>, "GetList"},
+ };
+ RegisterHandlers(functions);
}
INewsDatabaseService::~INewsDatabaseService() = default;
diff --git a/src/core/hle/service/bcat/news/news_database_service.h b/src/core/hle/service/bcat/news/news_database_service.h
index 0a097b97bc..7552da23de 100644
--- a/src/core/hle/service/bcat/news/news_database_service.h
+++ b/src/core/hle/service/bcat/news/news_database_service.h
@@ -49,8 +49,6 @@ private:
InBuffer<BufferAttr_HipcPointer> where_phrase,
InBuffer<BufferAttr_HipcPointer> order_by_phrase,
s32 offset);
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::News
diff --git a/src/core/hle/service/bcat/news/news_service.cpp b/src/core/hle/service/bcat/news/news_service.cpp
index 7cb931896c..4dcaa14881 100644
--- a/src/core/hle/service/bcat/news/news_service.cpp
+++ b/src/core/hle/service/bcat/news/news_service.cpp
@@ -12,32 +12,32 @@
namespace Service::News {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> INewsService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{10100, D<&INewsService::PostLocalNews>, "PostLocalNews"},
- FunctionInfo{20100, D<&INewsService::SetPassphrase>, "SetPassphrase"},
- FunctionInfo{30100, D<&INewsService::GetSubscriptionStatus>, "GetSubscriptionStatus"},
- FunctionInfo{30101, D<&INewsService::GetTopicList>, "GetTopicList", MakeVersionGate({3,0,0})},
- FunctionInfo{30110, D<&INewsService::GetTopicList>, "Unknown30110", MakeVersionGate({6,0,0})}, // stub
- FunctionInfo{30200, D<&INewsService::IsSystemUpdateRequired>, "IsSystemUpdateRequired"},
- FunctionInfo{30201, D<&INewsService::IsSystemUpdateRequired>, "Unknown30201", MakeVersionGate({8,0,0})}, // stub
- FunctionInfo{30210, D<&INewsService::IsSystemUpdateRequired>, "Unknown30210", MakeVersionGate({10,0,0})}, // stub
- FunctionInfo{30300, nullptr, "RequestImmediateReception"},
- FunctionInfo{30400, nullptr, "DecodeArchiveFile", MakeVersionGate({3,0,0}, {18,1,0})}, // stub
- FunctionInfo{30500, nullptr, "Unknown30500", MakeVersionGate({8,0,0})}, // stub
- FunctionInfo{30900, nullptr, "Unknown30900", MakeVersionGate({1,0,0})}, // stub
- FunctionInfo{30901, nullptr, "Unknown30901", MakeVersionGate({1,0,0})}, // stub
- FunctionInfo{30902, nullptr, "Unknown30902", MakeVersionGate({1,0,0})}, // stub
- FunctionInfo{40100, nullptr, "SetSubscriptionStatus"},
- FunctionInfo{40101, D<&INewsService::RequestAutoSubscription>, "RequestAutoSubscription", MakeVersionGate({3,0,0})},
- FunctionInfo{40200, D<&INewsService::ClearStorage>, "ClearStorage"},
- FunctionInfo{40201, D<&INewsService::ClearSubscriptionStatusAll>, "ClearSubscriptionStatusAll"},
- FunctionInfo{90100, D<&INewsService::GetNewsDatabaseDump>, "GetNewsDatabaseDump"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
INewsService::INewsService(Core::System& system_) : ServiceFramework{system_, "INewsService"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {10100, D<&INewsService::PostLocalNews>, "PostLocalNews"},
+ {20100, D<&INewsService::SetPassphrase>, "SetPassphrase"},
+ {30100, D<&INewsService::GetSubscriptionStatus>, "GetSubscriptionStatus"},
+ {30101, D<&INewsService::GetTopicList>, "GetTopicList"}, //3.0.0+
+ {30110, D<&INewsService::GetTopicList>, "Unknown30110"}, //6.0.0+ (stub)
+ {30200, D<&INewsService::IsSystemUpdateRequired>, "IsSystemUpdateRequired"},
+ {30201, D<&INewsService::IsSystemUpdateRequired>, "Unknown30201"}, //8.0.0+ (stub)
+ {30210, D<&INewsService::IsSystemUpdateRequired>, "Unknown30210"}, //10.0.0+ (stub)
+ {30300, nullptr, "RequestImmediateReception"},
+ {30400, nullptr, "DecodeArchiveFile"}, //3.0.0-18.1.0 (stub)
+ {30500, nullptr, "Unknown30500"}, //8.0.0+ (stub)
+ {30900, nullptr, "Unknown30900"}, //1.0.0 (stub)
+ {30901, nullptr, "Unknown30901"}, //1.0.0 (stub)
+ {30902, nullptr, "Unknown30902"}, //1.0.0 (stub)
+ {40100, nullptr, "SetSubscriptionStatus"},
+ {40101, D<&INewsService::RequestAutoSubscription>, "RequestAutoSubscription"}, //3.0.0+
+ {40200, D<&INewsService::ClearStorage>, "ClearStorage"},
+ {40201, D<&INewsService::ClearSubscriptionStatusAll>, "ClearSubscriptionStatusAll"},
+ {90100, D<&INewsService::GetNewsDatabaseDump>, "GetNewsDatabaseDump"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
INewsService::~INewsService() = default;
diff --git a/src/core/hle/service/bcat/news/news_service.h b/src/core/hle/service/bcat/news/news_service.h
index 577147e604..5d6109243b 100644
--- a/src/core/hle/service/bcat/news/news_service.h
+++ b/src/core/hle/service/bcat/news/news_service.h
@@ -22,15 +22,22 @@ public:
private:
Result PostLocalNews(InBuffer<BufferAttr_HipcAutoSelect> buffer_data);
+
Result SetPassphrase(InBuffer<BufferAttr_HipcPointer> buffer_data);
+
Result GetSubscriptionStatus(Out<u32> out_status, InBuffer<BufferAttr_HipcPointer> buffer_data);
+
Result GetTopicList(Out<s32> out_count, OutBuffer<BufferAttr_HipcMapAlias> out_topics, s32 filter);
+
Result IsSystemUpdateRequired(Out<bool> out_is_system_update_required);
+
Result RequestAutoSubscription(u64 value);
+
Result ClearStorage();
+
Result ClearSubscriptionStatusAll();
+
Result GetNewsDatabaseDump();
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::News
diff --git a/src/core/hle/service/bcat/news/news_storage.cpp b/src/core/hle/service/bcat/news/news_storage.cpp
index 793c1fa94f..b65b680771 100644
--- a/src/core/hle/service/bcat/news/news_storage.cpp
+++ b/src/core/hle/service/bcat/news/news_storage.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
#include "core/hle/service/bcat/news/news_storage.h"
diff --git a/src/core/hle/service/bcat/news/overwrite_event_holder.cpp b/src/core/hle/service/bcat/news/overwrite_event_holder.cpp
index a6b3029e83..08449f1c4a 100644
--- a/src/core/hle/service/bcat/news/overwrite_event_holder.cpp
+++ b/src/core/hle/service/bcat/news/overwrite_event_holder.cpp
@@ -9,16 +9,16 @@
namespace Service::News {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IOverwriteEventHolder::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IOverwriteEventHolder::Get>, "Get"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IOverwriteEventHolder::IOverwriteEventHolder(Core::System& system_)
- : ServiceFramework{system_, "IOverwriteEventHolder"}
- , service_context{system_, "IOverwriteEventHolder"} {
+ : ServiceFramework{system_, "IOverwriteEventHolder"}, service_context{system_,
+ "IOverwriteEventHolder"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IOverwriteEventHolder::Get>, "Get"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
overwrite_event = service_context.CreateEvent("IOverwriteEventHolder::OverwriteEvent");
}
diff --git a/src/core/hle/service/bcat/news/overwrite_event_holder.h b/src/core/hle/service/bcat/news/overwrite_event_holder.h
index ba52a36527..507f6ab668 100644
--- a/src/core/hle/service/bcat/news/overwrite_event_holder.h
+++ b/src/core/hle/service/bcat/news/overwrite_event_holder.h
@@ -29,7 +29,6 @@ public:
private:
Result Get(OutCopyHandle<Kernel::KReadableEvent> out_event);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
Kernel::KEvent* overwrite_event;
KernelHelpers::ServiceContext service_context;
};
diff --git a/src/core/hle/service/bcat/news/service_creator.cpp b/src/core/hle/service/bcat/news/service_creator.cpp
index 66e3b1277e..f27e4e52e6 100644
--- a/src/core/hle/service/bcat/news/service_creator.cpp
+++ b/src/core/hle/service/bcat/news/service_creator.cpp
@@ -14,19 +14,19 @@
namespace Service::News {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IServiceCreator::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IServiceCreator::CreateNewsService>, "CreateNewsService"},
- FunctionInfo{1, D<&IServiceCreator::CreateNewlyArrivedEventHolder>, "CreateNewlyArrivedEventHolder"},
- FunctionInfo{2, D<&IServiceCreator::CreateNewsDataService>, "CreateNewsDataService"},
- FunctionInfo{3, D<&IServiceCreator::CreateNewsDatabaseService>, "CreateNewsDatabaseService"},
- FunctionInfo{4, D<&IServiceCreator::CreateOverwriteEventHolder>, "CreateOverwriteEventHolder"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IServiceCreator::IServiceCreator(Core::System& system_, u32 permissions_, const char* name_)
: ServiceFramework{system_, name_}, permissions{permissions_} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IServiceCreator::CreateNewsService>, "CreateNewsService"},
+ {1, D<&IServiceCreator::CreateNewlyArrivedEventHolder>, "CreateNewlyArrivedEventHolder"},
+ {2, D<&IServiceCreator::CreateNewsDataService>, "CreateNewsDataService"},
+ {3, D<&IServiceCreator::CreateNewsDatabaseService>, "CreateNewsDatabaseService"},
+ {4, D<&IServiceCreator::CreateOverwriteEventHolder>, "CreateOverwriteEventHolder"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IServiceCreator::~IServiceCreator() = default;
diff --git a/src/core/hle/service/bcat/news/service_creator.h b/src/core/hle/service/bcat/news/service_creator.h
index a87f30b67e..42fbccd2a0 100644
--- a/src/core/hle/service/bcat/news/service_creator.h
+++ b/src/core/hle/service/bcat/news/service_creator.h
@@ -32,7 +32,6 @@ private:
Result CreateNewsDatabaseService(OutInterface<INewsDatabaseService> out_interface);
Result CreateOverwriteEventHolder(OutInterface<IOverwriteEventHolder> out_interface);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
u32 permissions;
};
diff --git a/src/core/hle/service/bcat/service_creator.cpp b/src/core/hle/service/bcat/service_creator.cpp
index 83f97bb17a..15f59d3056 100644
--- a/src/core/hle/service/bcat/service_creator.cpp
+++ b/src/core/hle/service/bcat/service_creator.cpp
@@ -13,17 +13,6 @@
namespace Service::BCAT {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IServiceCreator::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IServiceCreator::CreateBcatService>, "CreateBcatService"},
- FunctionInfo{1, D<&IServiceCreator::CreateDeliveryCacheStorageService>, "CreateDeliveryCacheStorageService"},
- FunctionInfo{2, D<&IServiceCreator::CreateDeliveryCacheStorageServiceWithApplicationId>, "CreateDeliveryCacheStorageServiceWithApplicationId"},
- FunctionInfo{3, nullptr, "CreateDeliveryCacheProgressService"},
- FunctionInfo{4, nullptr, "CreateDeliveryCacheProgressServiceWithApplicationId"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
std::unique_ptr<BcatBackend> CreateBackendFromSettings([[maybe_unused]] Core::System& system,
DirectoryGetter getter) {
return std::make_unique<NullBcatBackend>(std::move(getter));
@@ -31,7 +20,20 @@ std::unique_ptr<BcatBackend> CreateBackendFromSettings([[maybe_unused]] Core::Sy
IServiceCreator::IServiceCreator(Core::System& system_, const char* name_)
: ServiceFramework{system_, name_}, fsc{system.GetFileSystemController()} {
- backend = CreateBackendFromSettings(system_, [this](u64 tid) { return fsc.GetBCATDirectory(tid); });
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IServiceCreator::CreateBcatService>, "CreateBcatService"},
+ {1, D<&IServiceCreator::CreateDeliveryCacheStorageService>, "CreateDeliveryCacheStorageService"},
+ {2, D<&IServiceCreator::CreateDeliveryCacheStorageServiceWithApplicationId>, "CreateDeliveryCacheStorageServiceWithApplicationId"},
+ {3, nullptr, "CreateDeliveryCacheProgressService"},
+ {4, nullptr, "CreateDeliveryCacheProgressServiceWithApplicationId"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+
+ backend =
+ CreateBackendFromSettings(system_, [this](u64 tid) { return fsc.GetBCATDirectory(tid); });
}
IServiceCreator::~IServiceCreator() = default;
diff --git a/src/core/hle/service/bcat/service_creator.h b/src/core/hle/service/bcat/service_creator.h
index 02527574dc..2245007d6c 100644
--- a/src/core/hle/service/bcat/service_creator.h
+++ b/src/core/hle/service/bcat/service_creator.h
@@ -36,7 +36,6 @@ private:
Result CreateDeliveryCacheStorageServiceWithApplicationId(
u64 application_id, OutInterface<IDeliveryCacheStorageService> out_interface);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::unique_ptr<BcatBackend> backend;
Service::FileSystem::FileSystemController& fsc;
};
diff --git a/src/core/hle/service/bpc/bpc.cpp b/src/core/hle/service/bpc/bpc.cpp
index 7c31cd190d..6f2e00b22b 100644
--- a/src/core/hle/service/bpc/bpc.cpp
+++ b/src/core/hle/service/bpc/bpc.cpp
@@ -14,101 +14,103 @@ namespace Service::BPC {
class BPC final : public ServiceFramework<BPC> {
public:
- explicit BPC(Core::System& system_) : ServiceFramework{system_, "bpc"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "ShutdownSystem"},
- FunctionInfo{1, nullptr, "RebootSystem"},
- FunctionInfo{2, nullptr, "GetWakeupReason"},
- FunctionInfo{3, nullptr, "GetShutdownReason"},
- FunctionInfo{4, nullptr, "GetAcOk"},
- FunctionInfo{5, nullptr, "GetBoardPowerControlEvent"},
- FunctionInfo{6, nullptr, "GetSleepButtonState"},
- FunctionInfo{7, nullptr, "GetPowerEvent"},
- FunctionInfo{8, nullptr, "CreateWakeupTimer"},
- FunctionInfo{9, nullptr, "CancelWakeupTimer"},
- FunctionInfo{10, nullptr, "EnableWakeupTimerOnDevice"},
- FunctionInfo{11, nullptr, "CreateWakeupTimerEx"},
- FunctionInfo{12, nullptr, "GetLastEnabledWakeupTimerType"},
- FunctionInfo{13, nullptr, "CleanAllWakeupTimers"},
- FunctionInfo{14, nullptr, "GetPowerButton"},
- FunctionInfo{15, nullptr, "SetEnableWakeupTimer"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit BPC(Core::System& system_) : ServiceFramework{system_, "bpc"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "ShutdownSystem"},
+ {1, nullptr, "RebootSystem"},
+ {2, nullptr, "GetWakeupReason"},
+ {3, nullptr, "GetShutdownReason"},
+ {4, nullptr, "GetAcOk"},
+ {5, nullptr, "GetBoardPowerControlEvent"},
+ {6, nullptr, "GetSleepButtonState"},
+ {7, nullptr, "GetPowerEvent"},
+ {8, nullptr, "CreateWakeupTimer"},
+ {9, nullptr, "CancelWakeupTimer"},
+ {10, nullptr, "EnableWakeupTimerOnDevice"},
+ {11, nullptr, "CreateWakeupTimerEx"},
+ {12, nullptr, "GetLastEnabledWakeupTimerType"},
+ {13, nullptr, "CleanAllWakeupTimers"},
+ {14, nullptr, "GetPowerButton"},
+ {15, nullptr, "SetEnableWakeupTimer"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
class BPC_R final : public ServiceFramework<BPC_R> {
public:
- explicit BPC_R(Core::System& system_) : ServiceFramework{system_, "bpc:r"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetRtcTime"},
- FunctionInfo{1, nullptr, "SetRtcTime"},
- FunctionInfo{2, nullptr, "GetRtcResetDetected"},
- FunctionInfo{3, nullptr, "ClearRtcResetDetected"},
- FunctionInfo{4, nullptr, "SetUpRtcResetOnShutdown"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit BPC_R(Core::System& system_) : ServiceFramework{system_, "bpc:r"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetRtcTime"},
+ {1, nullptr, "SetRtcTime"},
+ {2, nullptr, "GetRtcResetDetected"},
+ {3, nullptr, "ClearRtcResetDetected"},
+ {4, nullptr, "SetUpRtcResetOnShutdown"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
class BPC_C final : public ServiceFramework<BPC_C> {
public:
- explicit BPC_C(Core::System& system_) : ServiceFramework{system_, "bpc:c"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "ShutdownSystem"},
- FunctionInfo{1, nullptr, "RebootSystem"},
- FunctionInfo{2, nullptr, "GetWakeupReason"},
- FunctionInfo{3, nullptr, "GetShutdownReason"},
- FunctionInfo{4, nullptr, "GetAcOk"},
- FunctionInfo{5, nullptr, "GetPowerEvent"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit BPC_C(Core::System& system_) : ServiceFramework{system_, "bpc:c"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "ShutdownSystem"},
+ {1, nullptr, "RebootSystem"},
+ {2, nullptr, "GetWakeupReason"},
+ {3, nullptr, "GetShutdownReason"},
+ {4, nullptr, "GetAcOk"},
+ {5, nullptr, "GetPowerEvent"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class BPC_B final : public ServiceFramework<BPC_B> {
public:
- explicit BPC_B(Core::System& system_) : ServiceFramework{system_, "bpc:b"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetSleepButtonState"},
- FunctionInfo{1, nullptr, "GetPowerButtonEvent"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit BPC_B(Core::System& system_) : ServiceFramework{system_, "bpc:b"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetSleepButtonState"},
+ {1, nullptr, "GetPowerButtonEvent"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class BPC_W final : public ServiceFramework<BPC_W> {
public:
- explicit BPC_W(Core::System& system_) : ServiceFramework{system_, "bpc:w"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "CreateWakeupTimer"},
- FunctionInfo{1, nullptr, "CancelWakeupTimer"},
- FunctionInfo{2, nullptr, "EnableWakeupTimerOnDevice"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit BPC_W(Core::System& system_) : ServiceFramework{system_, "bpc:w"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "CreateWakeupTimer"},
+ {1, nullptr, "CancelWakeupTimer"},
+ {2, nullptr, "EnableWakeupTimerOnDevice"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class BPC_AMS final : public ServiceFramework<BPC_AMS> {
public:
- explicit BPC_AMS(Core::System& system_) : ServiceFramework{system_, "bpc:ams"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{65000, nullptr, "RebootToFatalError"},
- FunctionInfo{65001, nullptr, "SetRebootPayload"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit BPC_AMS(Core::System& system_) : ServiceFramework{system_, "bpc:ams"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {65000, nullptr, "RebootToFatalError"},
+ {65001, nullptr, "SetRebootPayload"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
diff --git a/src/core/hle/service/bpc/bpc.h b/src/core/hle/service/bpc/bpc.h
index 524391ddb5..bf13ce5bae 100644
--- a/src/core/hle/service/bpc/bpc.h
+++ b/src/core/hle/service/bpc/bpc.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/btdrv/btdrv.cpp b/src/core/hle/service/btdrv/btdrv.cpp
index 913c9475e9..256a722a84 100644
--- a/src/core/hle/service/btdrv/btdrv.cpp
+++ b/src/core/hle/service/btdrv/btdrv.cpp
@@ -20,13 +20,24 @@ namespace Service::BtDrv {
class IBluetoothUser final : public ServiceFramework<IBluetoothUser> {
public:
explicit IBluetoothUser(Core::System& system_)
- : ServiceFramework{system_, "bt"}
- , service_context{system_, "bt"} {
- register_event = service_context.CreateEvent("BT:RegisterEvent");
- }
+ : ServiceFramework{system_, "bt"}, service_context{system_, "bt"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "LeClientReadCharacteristic"},
+ {1, nullptr, "LeClientReadDescriptor"},
+ {2, nullptr, "LeClientWriteCharacteristic"},
+ {3, nullptr, "LeClientWriteDescriptor"},
+ {4, nullptr, "LeClientRegisterNotification"},
+ {5, nullptr, "LeClientDeregisterNotification"},
+ {6, nullptr, "SetLeResponse"},
+ {7, nullptr, "LeSendIndication"},
+ {8, nullptr, "GetLeEventInfo"},
+ {9, C<&IBluetoothUser::RegisterBleEvent>, "RegisterBleEvent"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ register_event = service_context.CreateEvent("BT:RegisterEvent");
}
~IBluetoothUser() override {
@@ -41,28 +52,151 @@ private:
R_SUCCEED();
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "LeClientReadCharacteristic"},
- FunctionInfo{1, nullptr, "LeClientReadDescriptor"},
- FunctionInfo{2, nullptr, "LeClientWriteCharacteristic"},
- FunctionInfo{3, nullptr, "LeClientWriteDescriptor"},
- FunctionInfo{4, nullptr, "LeClientRegisterNotification"},
- FunctionInfo{5, nullptr, "LeClientDeregisterNotification"},
- FunctionInfo{6, nullptr, "SetLeResponse"},
- FunctionInfo{7, nullptr, "LeSendIndication"},
- FunctionInfo{8, nullptr, "GetLeEventInfo"},
- FunctionInfo{9, C<&IBluetoothUser::RegisterBleEvent>, "RegisterBleEvent"}
- );
KernelHelpers::ServiceContext service_context;
+
Kernel::KEvent* register_event;
};
class IBluetoothDriver final : public ServiceFramework<IBluetoothDriver> {
public:
- explicit IBluetoothDriver(Core::System& system_) : ServiceFramework{system_, "btdrv"} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit IBluetoothDriver(Core::System& system_) : ServiceFramework{system_, "btdrv"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "InitializeBluetoothDriver"},
+ {1, nullptr, "InitializeBluetooth"},
+ {2, nullptr, "EnableBluetooth"},
+ {3, nullptr, "DisableBluetooth"},
+ {4, nullptr, "FinalizeBluetooth"},
+ {5, nullptr, "GetAdapterProperties"},
+ {6, nullptr, "GetAdapterProperty"},
+ {7, nullptr, "SetAdapterProperty"},
+ {8, nullptr, "StartInquiry"},
+ {9, nullptr, "StopInquiry"},
+ {10, nullptr, "CreateBond"},
+ {11, nullptr, "RemoveBond"},
+ {12, nullptr, "CancelBond"},
+ {13, nullptr, "RespondToPinRequest"},
+ {14, nullptr, "RespondToSspRequest"},
+ {15, nullptr, "GetEventInfo"},
+ {16, nullptr, "InitializeHid"},
+ {17, nullptr, "OpenHidConnection"},
+ {18, nullptr, "CloseHidConnection"},
+ {19, nullptr, "WriteHidData"},
+ {20, nullptr, "WriteHidData2"},
+ {21, nullptr, "SetHidReport"},
+ {22, nullptr, "GetHidReport"},
+ {23, nullptr, "TriggerConnection"},
+ {24, nullptr, "AddPairedDeviceInfo"},
+ {25, nullptr, "GetPairedDeviceInfo"},
+ {26, nullptr, "FinalizeHid"},
+ {27, nullptr, "GetHidEventInfo"},
+ {28, nullptr, "SetTsi"},
+ {29, nullptr, "EnableBurstMode"},
+ {30, nullptr, "SetZeroRetransmission"},
+ {31, nullptr, "EnableMcMode"},
+ {32, nullptr, "EnableLlrScan"},
+ {33, nullptr, "DisableLlrScan"},
+ {34, C<&IBluetoothDriver::EnableRadio>, "EnableRadio"},
+ {35, nullptr, "SetVisibility"},
+ {36, nullptr, "EnableTbfcScan"},
+ {37, nullptr, "RegisterHidReportEvent"},
+ {38, nullptr, "GetHidReportEventInfo"},
+ {39, nullptr, "GetLatestPlr"},
+ {40, nullptr, "GetPendingConnections"},
+ {41, nullptr, "GetChannelMap"},
+ {42, nullptr, "EnableTxPowerBoostSetting"},
+ {43, nullptr, "IsTxPowerBoostSettingEnabled"},
+ {44, nullptr, "EnableAfhSetting"},
+ {45, nullptr, "IsAfhSettingEnabled"},
+ {46, nullptr, "InitializeBle"},
+ {47, nullptr, "EnableBle"},
+ {48, nullptr, "DisableBle"},
+ {49, nullptr, "FinalizeBle"},
+ {50, nullptr, "SetBleVisibility"},
+ {51, nullptr, "SetBleConnectionParameter"},
+ {52, nullptr, "SetBleDefaultConnectionParameter"},
+ {53, nullptr, "SetBleAdvertiseData"},
+ {54, nullptr, "SetBleAdvertiseParameter"},
+ {55, nullptr, "StartBleScan"},
+ {56, nullptr, "StopBleScan"},
+ {57, nullptr, "AddBleScanFilterCondition"},
+ {58, nullptr, "DeleteBleScanFilterCondition"},
+ {59, nullptr, "DeleteBleScanFilter"},
+ {60, nullptr, "ClearBleScanFilters"},
+ {61, nullptr, "EnableBleScanFilter"},
+ {62, nullptr, "RegisterGattClient"},
+ {63, nullptr, "UnregisterGattClient"},
+ {64, nullptr, "UnregisterAllGattClients"},
+ {65, nullptr, "ConnectGattServer"},
+ {66, nullptr, "CancelConnectGattServer"},
+ {67, nullptr, "DisconnectGattServer"},
+ {68, nullptr, "GetGattAttribute"},
+ {69, nullptr, "GetGattService"},
+ {70, nullptr, "ConfigureAttMtu"},
+ {71, nullptr, "RegisterGattServer"},
+ {72, nullptr, "UnregisterGattServer"},
+ {73, nullptr, "ConnectGattClient"},
+ {74, nullptr, "DisconnectGattClient"},
+ {75, nullptr, "AddGattService"},
+ {76, nullptr, "EnableGattService"},
+ {77, nullptr, "AddGattCharacteristic"},
+ {78, nullptr, "AddGattDescriptor"},
+ {79, nullptr, "GetBleManagedEventInfo"},
+ {80, nullptr, "GetGattFirstCharacteristic"},
+ {81, nullptr, "GetGattNextCharacteristic"},
+ {82, nullptr, "GetGattFirstDescriptor"},
+ {83, nullptr, "GetGattNextDescriptor"},
+ {84, nullptr, "RegisterGattManagedDataPath"},
+ {85, nullptr, "UnregisterGattManagedDataPath"},
+ {86, nullptr, "RegisterGattHidDataPath"},
+ {87, nullptr, "UnregisterGattHidDataPath"},
+ {88, nullptr, "RegisterGattDataPath"},
+ {89, nullptr, "UnregisterGattDataPath"},
+ {90, nullptr, "ReadGattCharacteristic"},
+ {91, nullptr, "ReadGattDescriptor"},
+ {92, nullptr, "WriteGattCharacteristic"},
+ {93, nullptr, "WriteGattDescriptor"},
+ {94, nullptr, "RegisterGattNotification"},
+ {95, nullptr, "UnregisterGattNotification"},
+ {96, nullptr, "GetLeHidEventInfo"},
+ {97, nullptr, "RegisterBleHidEvent"},
+ {98, nullptr, "SetBleScanParameter"},
+ {99, nullptr, "MoveToSecondaryPiconet"},
+ {100, nullptr, "IsBluetoothEnabled"},
+ {128, nullptr, "AcquireAudioEvent"},
+ {129, nullptr, "GetAudioEventInfo"},
+ {130, nullptr, "OpenAudioConnection"},
+ {131, nullptr, "CloseAudioConnection"},
+ {132, nullptr, "OpenAudioOut"},
+ {133, nullptr, "CloseAudioOut"},
+ {134, nullptr, "AcquireAudioOutStateChangedEvent"},
+ {135, nullptr, "StartAudioOut"},
+ {136, nullptr, "StopAudioOut"},
+ {137, nullptr, "GetAudioOutState"},
+ {138, nullptr, "GetAudioOutFeedingCodec"},
+ {139, nullptr, "GetAudioOutFeedingParameter"},
+ {140, nullptr, "AcquireAudioOutBufferAvailableEvent"},
+ {141, nullptr, "SendAudioData"},
+ {142, nullptr, "AcquireAudioControlInputStateChangedEvent"},
+ {143, nullptr, "GetAudioControlInputState"},
+ {144, nullptr, "AcquireAudioConnectionStateChangedEvent"},
+ {145, nullptr, "GetConnectedAudioDevice"},
+ {146, nullptr, "CloseAudioControlInput"},
+ {147, nullptr, "RegisterAudioControlNotification"},
+ {148, nullptr, "SendAudioControlPassthroughCommand"},
+ {149, nullptr, "SendAudioControlSetAbsoluteVolumeCommand"},
+ {150, nullptr, "AcquireAudioSinkVolumeLocallyChangedEvent"},
+ {151, nullptr, "AcquireAudioSinkVolumeUpdateRequestCompletedEvent"},
+ {152, nullptr, "GetAudioSinkVolume"},
+ {153, nullptr, "RequestUpdateAudioSinkVolume"},
+ {154, nullptr, "IsAudioSinkVolumeSupported"},
+ {256, nullptr, "IsManufacturingMode"},
+ {257, nullptr, "EmulateBluetoothCrash"},
+ {258, nullptr, "GetBleChannelMap"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
private:
@@ -70,140 +204,6 @@ private:
LOG_WARNING(Service_BTDRV, "(STUBBED) called");
R_SUCCEED();
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "InitializeBluetoothDriver"},
- FunctionInfo{1, nullptr, "InitializeBluetooth"},
- FunctionInfo{2, nullptr, "EnableBluetooth"},
- FunctionInfo{3, nullptr, "DisableBluetooth"},
- FunctionInfo{4, nullptr, "FinalizeBluetooth"},
- FunctionInfo{5, nullptr, "GetAdapterProperties"},
- FunctionInfo{6, nullptr, "GetAdapterProperty"},
- FunctionInfo{7, nullptr, "SetAdapterProperty"},
- FunctionInfo{8, nullptr, "StartInquiry"},
- FunctionInfo{9, nullptr, "StopInquiry"},
- FunctionInfo{10, nullptr, "CreateBond"},
- FunctionInfo{11, nullptr, "RemoveBond"},
- FunctionInfo{12, nullptr, "CancelBond"},
- FunctionInfo{13, nullptr, "RespondToPinRequest"},
- FunctionInfo{14, nullptr, "RespondToSspRequest"},
- FunctionInfo{15, nullptr, "GetEventInfo"},
- FunctionInfo{16, nullptr, "InitializeHid"},
- FunctionInfo{17, nullptr, "OpenHidConnection"},
- FunctionInfo{18, nullptr, "CloseHidConnection"},
- FunctionInfo{19, nullptr, "WriteHidData"},
- FunctionInfo{20, nullptr, "WriteHidData2"},
- FunctionInfo{21, nullptr, "SetHidReport"},
- FunctionInfo{22, nullptr, "GetHidReport"},
- FunctionInfo{23, nullptr, "TriggerConnection"},
- FunctionInfo{24, nullptr, "AddPairedDeviceInfo"},
- FunctionInfo{25, nullptr, "GetPairedDeviceInfo"},
- FunctionInfo{26, nullptr, "FinalizeHid"},
- FunctionInfo{27, nullptr, "GetHidEventInfo"},
- FunctionInfo{28, nullptr, "SetTsi"},
- FunctionInfo{29, nullptr, "EnableBurstMode"},
- FunctionInfo{30, nullptr, "SetZeroRetransmission"},
- FunctionInfo{31, nullptr, "EnableMcMode"},
- FunctionInfo{32, nullptr, "EnableLlrScan"},
- FunctionInfo{33, nullptr, "DisableLlrScan"},
- FunctionInfo{34, C<&IBluetoothDriver::EnableRadio>, "EnableRadio"},
- FunctionInfo{35, nullptr, "SetVisibility"},
- FunctionInfo{36, nullptr, "EnableTbfcScan"},
- FunctionInfo{37, nullptr, "RegisterHidReportEvent"},
- FunctionInfo{38, nullptr, "GetHidReportEventInfo"},
- FunctionInfo{39, nullptr, "GetLatestPlr"},
- FunctionInfo{40, nullptr, "GetPendingConnections"},
- FunctionInfo{41, nullptr, "GetChannelMap"},
- FunctionInfo{42, nullptr, "EnableTxPowerBoostSetting"},
- FunctionInfo{43, nullptr, "IsTxPowerBoostSettingEnabled"},
- FunctionInfo{44, nullptr, "EnableAfhSetting"},
- FunctionInfo{45, nullptr, "IsAfhSettingEnabled"},
- FunctionInfo{46, nullptr, "InitializeBle"},
- FunctionInfo{47, nullptr, "EnableBle"},
- FunctionInfo{48, nullptr, "DisableBle"},
- FunctionInfo{49, nullptr, "FinalizeBle"},
- FunctionInfo{50, nullptr, "SetBleVisibility"},
- FunctionInfo{51, nullptr, "SetBleConnectionParameter"},
- FunctionInfo{52, nullptr, "SetBleDefaultConnectionParameter"},
- FunctionInfo{53, nullptr, "SetBleAdvertiseData"},
- FunctionInfo{54, nullptr, "SetBleAdvertiseParameter"},
- FunctionInfo{55, nullptr, "StartBleScan"},
- FunctionInfo{56, nullptr, "StopBleScan"},
- FunctionInfo{57, nullptr, "AddBleScanFilterCondition"},
- FunctionInfo{58, nullptr, "DeleteBleScanFilterCondition"},
- FunctionInfo{59, nullptr, "DeleteBleScanFilter"},
- FunctionInfo{60, nullptr, "ClearBleScanFilters"},
- FunctionInfo{61, nullptr, "EnableBleScanFilter"},
- FunctionInfo{62, nullptr, "RegisterGattClient"},
- FunctionInfo{63, nullptr, "UnregisterGattClient"},
- FunctionInfo{64, nullptr, "UnregisterAllGattClients"},
- FunctionInfo{65, nullptr, "ConnectGattServer"},
- FunctionInfo{66, nullptr, "CancelConnectGattServer"},
- FunctionInfo{67, nullptr, "DisconnectGattServer"},
- FunctionInfo{68, nullptr, "GetGattAttribute"},
- FunctionInfo{69, nullptr, "GetGattService"},
- FunctionInfo{70, nullptr, "ConfigureAttMtu"},
- FunctionInfo{71, nullptr, "RegisterGattServer"},
- FunctionInfo{72, nullptr, "UnregisterGattServer"},
- FunctionInfo{73, nullptr, "ConnectGattClient"},
- FunctionInfo{74, nullptr, "DisconnectGattClient"},
- FunctionInfo{75, nullptr, "AddGattService"},
- FunctionInfo{76, nullptr, "EnableGattService"},
- FunctionInfo{77, nullptr, "AddGattCharacteristic"},
- FunctionInfo{78, nullptr, "AddGattDescriptor"},
- FunctionInfo{79, nullptr, "GetBleManagedEventInfo"},
- FunctionInfo{80, nullptr, "GetGattFirstCharacteristic"},
- FunctionInfo{81, nullptr, "GetGattNextCharacteristic"},
- FunctionInfo{82, nullptr, "GetGattFirstDescriptor"},
- FunctionInfo{83, nullptr, "GetGattNextDescriptor"},
- FunctionInfo{84, nullptr, "RegisterGattManagedDataPath"},
- FunctionInfo{85, nullptr, "UnregisterGattManagedDataPath"},
- FunctionInfo{86, nullptr, "RegisterGattHidDataPath"},
- FunctionInfo{87, nullptr, "UnregisterGattHidDataPath"},
- FunctionInfo{88, nullptr, "RegisterGattDataPath"},
- FunctionInfo{89, nullptr, "UnregisterGattDataPath"},
- FunctionInfo{90, nullptr, "ReadGattCharacteristic"},
- FunctionInfo{91, nullptr, "ReadGattDescriptor"},
- FunctionInfo{92, nullptr, "WriteGattCharacteristic"},
- FunctionInfo{93, nullptr, "WriteGattDescriptor"},
- FunctionInfo{94, nullptr, "RegisterGattNotification"},
- FunctionInfo{95, nullptr, "UnregisterGattNotification"},
- FunctionInfo{96, nullptr, "GetLeHidEventInfo"},
- FunctionInfo{97, nullptr, "RegisterBleHidEvent"},
- FunctionInfo{98, nullptr, "SetBleScanParameter"},
- FunctionInfo{99, nullptr, "MoveToSecondaryPiconet"},
- FunctionInfo{100, nullptr, "IsBluetoothEnabled"},
- FunctionInfo{128, nullptr, "AcquireAudioEvent"},
- FunctionInfo{129, nullptr, "GetAudioEventInfo"},
- FunctionInfo{130, nullptr, "OpenAudioConnection"},
- FunctionInfo{131, nullptr, "CloseAudioConnection"},
- FunctionInfo{132, nullptr, "OpenAudioOut"},
- FunctionInfo{133, nullptr, "CloseAudioOut"},
- FunctionInfo{134, nullptr, "AcquireAudioOutStateChangedEvent"},
- FunctionInfo{135, nullptr, "StartAudioOut"},
- FunctionInfo{136, nullptr, "StopAudioOut"},
- FunctionInfo{137, nullptr, "GetAudioOutState"},
- FunctionInfo{138, nullptr, "GetAudioOutFeedingCodec"},
- FunctionInfo{139, nullptr, "GetAudioOutFeedingParameter"},
- FunctionInfo{140, nullptr, "AcquireAudioOutBufferAvailableEvent"},
- FunctionInfo{141, nullptr, "SendAudioData"},
- FunctionInfo{142, nullptr, "AcquireAudioControlInputStateChangedEvent"},
- FunctionInfo{143, nullptr, "GetAudioControlInputState"},
- FunctionInfo{144, nullptr, "AcquireAudioConnectionStateChangedEvent"},
- FunctionInfo{145, nullptr, "GetConnectedAudioDevice"},
- FunctionInfo{146, nullptr, "CloseAudioControlInput"},
- FunctionInfo{147, nullptr, "RegisterAudioControlNotification"},
- FunctionInfo{148, nullptr, "SendAudioControlPassthroughCommand"},
- FunctionInfo{149, nullptr, "SendAudioControlSetAbsoluteVolumeCommand"},
- FunctionInfo{150, nullptr, "AcquireAudioSinkVolumeLocallyChangedEvent"},
- FunctionInfo{151, nullptr, "AcquireAudioSinkVolumeUpdateRequestCompletedEvent"},
- FunctionInfo{152, nullptr, "GetAudioSinkVolume"},
- FunctionInfo{153, nullptr, "RequestUpdateAudioSinkVolume"},
- FunctionInfo{154, nullptr, "IsAudioSinkVolumeSupported"},
- FunctionInfo{256, nullptr, "IsManufacturingMode"},
- FunctionInfo{257, nullptr, "EmulateBluetoothCrash"},
- FunctionInfo{258, nullptr, "GetBleChannelMap"}
- );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/btdrv/btdrv.h b/src/core/hle/service/btdrv/btdrv.h
index 42713860e6..4e739a96e3 100644
--- a/src/core/hle/service/btdrv/btdrv.h
+++ b/src/core/hle/service/btdrv/btdrv.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/btm/btm.cpp b/src/core/hle/service/btm/btm.cpp
index e8fa29af7c..b358387ffe 100644
--- a/src/core/hle/service/btm/btm.cpp
+++ b/src/core/hle/service/btm/btm.cpp
@@ -6,414 +6,111 @@
#include <memory>
-#include "common/logging.h"
-#include "core/hle/service/cmif_serialization.h"
-#include "core/hle/service/set/system_settings_server.h"
-#include "core/hle/service/sm/sm.h"
#include "core/hle/service/btm/btm.h"
+#include "core/hle/service/btm/btm_debug.h"
+#include "core/hle/service/btm/btm_system.h"
+#include "core/hle/service/btm/btm_user.h"
#include "core/hle/service/server_manager.h"
#include "core/hle/service/service.h"
-namespace Kernel {
-class KEvent;
-class KReadableEvent;
-} // namespace Kernel
-
-namespace Core {
-class System;
-}
-
-namespace Service::Set {
-class ISystemSettingsServer;
-}
-
namespace Service::BTM {
-class IBtmSystemCore final : public ServiceFramework<IBtmSystemCore> {
-public:
- explicit IBtmSystemCore(Core::System& system_)
- : ServiceFramework{system_, "IBtmSystemCore"}, service_context{system_, "IBtmSystemCore"} {
- radio_event = service_context.CreateEvent("IBtmSystemCore:RadioEvent");
- audio_device_connection_event = service_context.CreateEvent("IBtmSystemCore:AudioDeviceConnectionEvent");
- m_set_sys = system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true);
- }
-
- ~IBtmSystemCore() override {
- service_context.CloseEvent(radio_event);
- service_context.CloseEvent(audio_device_connection_event);
- }
-
- Result StartGamepadPairing() {
- LOG_WARNING(Service_BTM, "(STUBBED) called");
- R_SUCCEED();
- }
-
- Result CancelGamepadPairing() {
- LOG_WARNING(Service_BTM, "(STUBBED) called");
- R_SUCCEED();
- }
-
- Result EnableRadio() {
- LOG_DEBUG(Service_BTM, "called");
-
- R_RETURN(m_set_sys->SetBluetoothEnableFlag(true));
- }
- Result DisableRadio() {
- LOG_DEBUG(Service_BTM, "called");
-
- R_RETURN(m_set_sys->SetBluetoothEnableFlag(false));
- }
-
- Result IsRadioEnabled(Out<bool> out_is_enabled) {
- LOG_DEBUG(Service_BTM, "called");
-
- R_RETURN(m_set_sys->GetBluetoothEnableFlag(out_is_enabled));
- }
-
- Result AcquireRadioEvent(Out<bool> out_is_valid,
- OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_WARNING(Service_BTM, "(STUBBED) called");
-
- *out_is_valid = true;
- *out_event = &radio_event->GetReadableEvent();
- R_SUCCEED();
- }
-
- Result GetDiscoveredAudioDevice(OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices, s32 count, Out<s32> out_total) {
- LOG_WARNING(Service_BTM, "(STUBBED) called");
- R_SUCCEED();
- }
-
- Result AcquireAudioDeviceConnectionEvent(
- OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_WARNING(Service_BTM, "(STUBBED) called");
-
- *out_event = &audio_device_connection_event->GetReadableEvent();
- R_SUCCEED();
- }
-
- Result GetConnectedAudioDevices(
- Out<s32> out_count, OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices) {
- LOG_WARNING(Service_BTM, "(STUBBED) called");
-
- *out_count = 0;
- R_SUCCEED();
- }
-
- Result GetPairedAudioDevices(
- Out<s32> out_count, OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices) {
- LOG_WARNING(Service_BTM, "(STUBBED) called");
-
- *out_count = 0;
- R_SUCCEED();
- }
-
- Result RequestAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid) {
- LOG_WARNING(Service_BTM, "(STUBBED) called, applet_resource_user_id={}", aruid.pid);
- R_SUCCEED();
- }
-
- Result CancelAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid) {
- LOG_WARNING(Service_BTM, "(STUBBED) called, applet_resource_user_id={}", aruid.pid);
- R_SUCCEED();
- }
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, C<&IBtmSystemCore::StartGamepadPairing>, "StartGamepadPairing"},
- FunctionInfo{1, C<&IBtmSystemCore::CancelGamepadPairing>, "CancelGamepadPairing"},
- FunctionInfo{2, nullptr, "ClearGamepadPairingDatabase"},
- FunctionInfo{3, nullptr, "GetPairedGamepadCount"},
- FunctionInfo{4, C<&IBtmSystemCore::EnableRadio>, "EnableRadio"},
- FunctionInfo{5, C<&IBtmSystemCore::DisableRadio>, "DisableRadio"},
- FunctionInfo{6, C<&IBtmSystemCore::IsRadioEnabled>, "IsRadioEnabled"},
- FunctionInfo{7, C<&IBtmSystemCore::AcquireRadioEvent>, "AcquireRadioEvent"},
- FunctionInfo{8, nullptr, "AcquireGamepadPairingEvent"},
- FunctionInfo{9, nullptr, "IsGamepadPairingStarted"},
- FunctionInfo{10, nullptr, "StartAudioDeviceDiscovery"},
- FunctionInfo{11, nullptr, "StopAudioDeviceDiscovery"},
- FunctionInfo{12, nullptr, "IsDiscoveryingAudioDevice"},
- FunctionInfo{13, C<&IBtmSystemCore::GetDiscoveredAudioDevice>, "GetDiscoveredAudioDevice"},
- FunctionInfo{14, C<&IBtmSystemCore::AcquireAudioDeviceConnectionEvent>, "AcquireAudioDeviceConnectionEvent"},
- FunctionInfo{15, nullptr, "ConnectAudioDevice"},
- FunctionInfo{16, nullptr, "IsConnectingAudioDevice"},
- FunctionInfo{17, C<&IBtmSystemCore::GetConnectedAudioDevices>, "GetConnectedAudioDevices"},
- FunctionInfo{18, nullptr, "DisconnectAudioDevice"},
- FunctionInfo{19, nullptr, "AcquirePairedAudioDeviceInfoChangedEvent"},
- FunctionInfo{20, C<&IBtmSystemCore::GetPairedAudioDevices>, "GetPairedAudioDevices"},
- FunctionInfo{21, nullptr, "RemoveAudioDevicePairing"},
- FunctionInfo{22, C<&IBtmSystemCore::RequestAudioDeviceConnectionRejection>, "RequestAudioDeviceConnectionRejection"},
- FunctionInfo{23, C<&IBtmSystemCore::CancelAudioDeviceConnectionRejection>, "CancelAudioDeviceConnectionRejection"}
- );
- KernelHelpers::ServiceContext service_context;
- Kernel::KEvent* radio_event;
- Kernel::KEvent* audio_device_connection_event;
- std::shared_ptr<Service::Set::ISystemSettingsServer> m_set_sys;
-};
-
-class IBtmSystem final : public ServiceFramework<IBtmSystem> {
-public:
- explicit IBtmSystem(Core::System& system_) : ServiceFramework{system_, "btm:sys"} {}
- ~IBtmSystem() override = default;
-
- Result GetCore(OutInterface<IBtmSystemCore> out_interface) {
- LOG_WARNING(Service_BTM, "called");
-
- *out_interface = std::make_shared<IBtmSystemCore>(system);
- R_SUCCEED();
- }
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, C<&IBtmSystem::GetCore>, "GetCore"}
- );
-};
-
-class IBtmUserCore final : public ServiceFramework<IBtmUserCore> {
-public:
- explicit IBtmUserCore(Core::System& system_)
- : ServiceFramework{system_, "IBtmUserCore"}, service_context{system_, "IBtmUserCore"} {
- scan_event = service_context.CreateEvent("IBtmUserCore:ScanEvent");
- connection_event = service_context.CreateEvent("IBtmUserCore:ConnectionEvent");
- service_discovery_event = service_context.CreateEvent("IBtmUserCore:DiscoveryEvent");
- config_event = service_context.CreateEvent("IBtmUserCore:ConfigEvent");
- }
-
- ~IBtmUserCore() override {
- service_context.CloseEvent(scan_event);
- service_context.CloseEvent(connection_event);
- service_context.CloseEvent(service_discovery_event);
- service_context.CloseEvent(config_event);
- }
-
- Result AcquireBleScanEvent(Out<bool> out_is_valid,
- OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_WARNING(Service_BTM, "(STUBBED) called");
-
- *out_is_valid = true;
- *out_event = &scan_event->GetReadableEvent();
- R_SUCCEED();
- }
-
- Result AcquireBleConnectionEvent(Out<bool> out_is_valid,
- OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_WARNING(Service_BTM, "(STUBBED) called");
-
- *out_is_valid = true;
- *out_event = &connection_event->GetReadableEvent();
- R_SUCCEED();
- }
-
- Result AcquireBleServiceDiscoveryEvent(
- Out<bool> out_is_valid, OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_WARNING(Service_BTM, "(STUBBED) called");
-
- *out_is_valid = true;
- *out_event = &service_discovery_event->GetReadableEvent();
- R_SUCCEED();
- }
-
- Result AcquireBleMtuConfigEvent(Out<bool> out_is_valid,
- OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_WARNING(Service_BTM, "(STUBBED) called");
-
- *out_is_valid = true;
- *out_event = &config_event->GetReadableEvent();
- R_SUCCEED();
- }
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, C<&IBtmUserCore::AcquireBleScanEvent>, "AcquireBleScanEvent"},
- FunctionInfo{1, nullptr, "GetBleScanFilterParameter"},
- FunctionInfo{2, nullptr, "GetBleScanFilterParameter2"},
- FunctionInfo{3, nullptr, "StartBleScanForGeneral"},
- FunctionInfo{4, nullptr, "StopBleScanForGeneral"},
- FunctionInfo{5, nullptr, "GetBleScanResultsForGeneral"},
- FunctionInfo{6, nullptr, "StartBleScanForPaired"},
- FunctionInfo{7, nullptr, "StopBleScanForPaired"},
- FunctionInfo{8, nullptr, "StartBleScanForSmartDevice"},
- FunctionInfo{9, nullptr, "StopBleScanForSmartDevice"},
- FunctionInfo{10, nullptr, "GetBleScanResultsForSmartDevice"},
- FunctionInfo{17, C<&IBtmUserCore::AcquireBleConnectionEvent>, "AcquireBleConnectionEvent"},
- FunctionInfo{18, nullptr, "BleConnect"},
- FunctionInfo{19, nullptr, "BleDisconnect"},
- FunctionInfo{20, nullptr, "BleGetConnectionState"},
- FunctionInfo{21, nullptr, "AcquireBlePairingEvent"},
- FunctionInfo{22, nullptr, "BlePairDevice"},
- FunctionInfo{23, nullptr, "BleUnPairDevice"},
- FunctionInfo{24, nullptr, "BleUnPairDevice2"},
- FunctionInfo{25, nullptr, "BleGetPairedDevices"},
- FunctionInfo{26, C<&IBtmUserCore::AcquireBleServiceDiscoveryEvent>, "AcquireBleServiceDiscoveryEvent"},
- FunctionInfo{27, nullptr, "GetGattServices"},
- FunctionInfo{28, nullptr, "GetGattService"},
- FunctionInfo{29, nullptr, "GetGattIncludedServices"},
- FunctionInfo{30, nullptr, "GetBelongingGattService"},
- FunctionInfo{31, nullptr, "GetGattCharacteristics"},
- FunctionInfo{32, nullptr, "GetGattDescriptors"},
- FunctionInfo{33, C<&IBtmUserCore::AcquireBleMtuConfigEvent>, "AcquireBleMtuConfigEvent"},
- FunctionInfo{34, nullptr, "ConfigureBleMtu"},
- FunctionInfo{35, nullptr, "GetBleMtu"},
- FunctionInfo{36, nullptr, "RegisterBleGattDataPath"},
- FunctionInfo{37, nullptr, "UnregisterBleGattDataPath"}
- );
- KernelHelpers::ServiceContext service_context;
- Kernel::KEvent* scan_event;
- Kernel::KEvent* connection_event;
- Kernel::KEvent* service_discovery_event;
- Kernel::KEvent* config_event;
-};
-
-class IBtmUser final : public ServiceFramework<IBtmUser> {
-public:
- explicit IBtmUser(Core::System& system_) : ServiceFramework{system_, "btm:u"} {}
- ~IBtmUser() override = default;
-
- Result GetCore(OutInterface<IBtmUserCore> out_interface) {
- LOG_WARNING(Service_BTM, "called");
-
- *out_interface = std::make_shared<IBtmUserCore>(system);
- R_SUCCEED();
- }
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, C<&IBtmUser::GetCore>, "GetCore"}
- );
-};
-
-class IBtmDebug final : public ServiceFramework<IBtmDebug> {
-public:
- explicit IBtmDebug(Core::System& system_) : ServiceFramework{system_, "btm:dbg"} {}
- ~IBtmDebug() override = default;
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "AcquireDiscoveryEvent"},
- FunctionInfo{1, nullptr, "StartDiscovery"},
- FunctionInfo{2, nullptr, "CancelDiscovery"},
- FunctionInfo{3, nullptr, "GetDeviceProperty"},
- FunctionInfo{4, nullptr, "CreateBond"},
- FunctionInfo{5, nullptr, "CancelBond"},
- FunctionInfo{6, nullptr, "SetTsiMode"},
- FunctionInfo{7, nullptr, "GeneralTest"},
- FunctionInfo{8, nullptr, "HidConnect"},
- FunctionInfo{9, nullptr, "GeneralGet", MakeVersionGate({5,0,0})},
- FunctionInfo{10, nullptr, "GetGattClientDisconnectionReason", MakeVersionGate({5,0,0})},
- FunctionInfo{11, nullptr, "GetBleConnectionParameter", MakeVersionGate({5,1,0})},
- FunctionInfo{12, nullptr, "GetBleConnectionParameterRequest", MakeVersionGate({5,1,0})},
- FunctionInfo{13, nullptr, "GetDiscoveredDevice", MakeVersionGate({12,0,0})},
- FunctionInfo{14, nullptr, "SleepAwakeLoopTest", MakeVersionGate({15,0,0})},
- FunctionInfo{15, nullptr, "SleepTest", MakeVersionGate({15,0,0})},
- FunctionInfo{16, nullptr, "MinimumAwakeTest", MakeVersionGate({15,0,0})},
- FunctionInfo{17, nullptr, "ForceEnableBtm", MakeVersionGate({15,0,0})}
- );
-};
-
class IBtm final : public ServiceFramework<IBtm> {
public:
- explicit IBtm(Core::System& system_) : ServiceFramework{system_, "btm"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetState"},
- FunctionInfo{1, nullptr, "GetHostDeviceProperty"},
- FunctionInfo{2, nullptr, "AcquireDeviceConditionEvent"},
- FunctionInfo{3, nullptr, "GetDeviceCondition"},
- FunctionInfo{4, nullptr, "SetBurstMode"},
- FunctionInfo{5, nullptr, "SetSlotMode"},
- FunctionInfo{6, nullptr, "SetBluetoothMode"},
- FunctionInfo{7, nullptr, "SetWlanMode"},
- FunctionInfo{8, nullptr, "AcquireDeviceInfoEvent"},
- FunctionInfo{9, nullptr, "GetDeviceInfo"},
- FunctionInfo{10, nullptr, "AddDeviceInfo"},
- FunctionInfo{11, nullptr, "RemoveDeviceInfo"},
- FunctionInfo{12, nullptr, "IncreaseDeviceInfoOrder"},
- FunctionInfo{13, nullptr, "LlrNotify"},
- FunctionInfo{14, nullptr, "EnableRadio"},
- FunctionInfo{15, nullptr, "DisableRadio"},
- FunctionInfo{16, nullptr, "HidDisconnect"},
- FunctionInfo{17, nullptr, "HidSetRetransmissionMode"},
- FunctionInfo{18, nullptr, "AcquireAwakeReqEvent"},
- FunctionInfo{19, nullptr, "AcquireLlrStateEvent"},
- FunctionInfo{20, nullptr, "IsLlrStarted"},
- FunctionInfo{21, nullptr, "EnableSlotSaving"},
- FunctionInfo{22, nullptr, "ProtectDeviceInfo"},
- FunctionInfo{23, nullptr, "AcquireBleScanEvent"},
- FunctionInfo{24, nullptr, "GetBleScanParameterGeneral"},
- FunctionInfo{25, nullptr, "GetBleScanParameterSmartDevice"},
- FunctionInfo{26, nullptr, "StartBleScanForGeneral"},
- FunctionInfo{27, nullptr, "StopBleScanForGeneral"},
- FunctionInfo{28, nullptr, "GetBleScanResultsForGeneral"},
- FunctionInfo{29, nullptr, "StartBleScanForPairedDevice"},
- FunctionInfo{30, nullptr, "StopBleScanForPairedDevice"},
- FunctionInfo{31, nullptr, "StartBleScanForSmartDevice"},
- FunctionInfo{32, nullptr, "StopBleScanForSmartDevice"},
- FunctionInfo{33, nullptr, "GetBleScanResultsForSmartDevice"},
- FunctionInfo{34, nullptr, "AcquireBleConnectionEvent"},
- FunctionInfo{35, nullptr, "BleConnect"},
- FunctionInfo{36, nullptr, "BleOverrideConnection"},
- FunctionInfo{37, nullptr, "BleDisconnect"},
- FunctionInfo{38, nullptr, "BleGetConnectionState"},
- FunctionInfo{39, nullptr, "BleGetGattClientConditionList"},
- FunctionInfo{40, nullptr, "AcquireBlePairingEvent"},
- FunctionInfo{41, nullptr, "BlePairDevice"},
- FunctionInfo{42, nullptr, "BleUnpairDeviceOnBoth"},
- FunctionInfo{43, nullptr, "BleUnpairDevice"},
- FunctionInfo{44, nullptr, "BleGetPairedAddresses"},
- FunctionInfo{45, nullptr, "AcquireBleServiceDiscoveryEvent"},
- FunctionInfo{46, nullptr, "GetGattServices"},
- FunctionInfo{47, nullptr, "GetGattService"},
- FunctionInfo{48, nullptr, "GetGattIncludedServices"},
- FunctionInfo{49, nullptr, "GetBelongingService"},
- FunctionInfo{50, nullptr, "GetGattCharacteristics"},
- FunctionInfo{51, nullptr, "GetGattDescriptors"},
- FunctionInfo{52, nullptr, "AcquireBleMtuConfigEvent"},
- FunctionInfo{53, nullptr, "ConfigureBleMtu"},
- FunctionInfo{54, nullptr, "GetBleMtu"},
- FunctionInfo{55, nullptr, "RegisterBleGattDataPath"},
- FunctionInfo{56, nullptr, "UnregisterBleGattDataPath"},
- FunctionInfo{57, nullptr, "RegisterAppletResourceUserId"},
- FunctionInfo{58, nullptr, "UnregisterAppletResourceUserId"},
- FunctionInfo{59, nullptr, "SetAppletResourceUserId"},
- FunctionInfo{60, nullptr, "AcquireBleConnectionParameterUpdateEvent", MakeVersionGate({8,0,0})},
- FunctionInfo{61, nullptr, "SetCeLength", MakeVersionGate({8,0,0})},
- FunctionInfo{62, nullptr, "EnsureSlotExpansion", MakeVersionGate({9,0,0})},
- FunctionInfo{63, nullptr, "IsSlotExpansionEnsured", MakeVersionGate({9,0,0})},
- FunctionInfo{64, nullptr, "CancelConnectionTrigger", MakeVersionGate({10,0,0})},
- FunctionInfo{65, nullptr, "GetConnectionCapacity", MakeVersionGate({13,0,0})},
- FunctionInfo{66, nullptr, "GetWlanMode", MakeVersionGate({13,0,0})},
- FunctionInfo{67, nullptr, "IsSlotSavingEnabled", MakeVersionGate({13,0,0})},
- FunctionInfo{68, nullptr, "IsSlotSavingForPairingEnabled", MakeVersionGate({13,0,0})},
- FunctionInfo{69, nullptr, "AcquireAudioDeviceConnectionEvent", MakeVersionGate({13,0,0})},
- FunctionInfo{70, nullptr, "GetConnectedAudioDevices", MakeVersionGate({13,0,0})},
- FunctionInfo{71, nullptr, "SetAudioSourceVolume", MakeVersionGate({13,0,0})},
- FunctionInfo{72, nullptr, "GetAudioSourceVolume", MakeVersionGate({13,0,0})},
- FunctionInfo{73, nullptr, "RequestAudioDeviceConnectionRejection", MakeVersionGate({13,0,0})},
- FunctionInfo{74, nullptr, "CancelAudioDeviceConnectionRejection", MakeVersionGate({13,0,0})},
- FunctionInfo{75, nullptr, "GetPairedAudioDevices", MakeVersionGate({13,0,0})},
- FunctionInfo{76, nullptr, "SetWlanModeWithOption", MakeVersionGate({13,1,0})},
- FunctionInfo{100, nullptr, "AcquireConnectionDisallowedEvent", MakeVersionGate({13,0,0})},
- FunctionInfo{101, nullptr, "GetUsecaseViolationFactor", MakeVersionGate({13,0,0})},
- FunctionInfo{110, nullptr, "GetShortenedDeviceInfo", MakeVersionGate({13,0,0})},
- FunctionInfo{111, nullptr, "AcquirePairingCountUpdateEvent"},//13.0.0+
- FunctionInfo{112, nullptr, "Unknown112", MakeVersionGate({14,0,0}, {14,1,2})},
- FunctionInfo{113, nullptr, "Unknown113", MakeVersionGate({14,0,0}, {14,1,2})},
- FunctionInfo{114, nullptr, "IsFirstAudioControlConnection", MakeVersionGate({14,0,0})},
- FunctionInfo{115, nullptr, "GetShortenedDeviceCondition", MakeVersionGate({14,0,0})},
- FunctionInfo{116, nullptr, "SetAudioSinkVolume", MakeVersionGate({15,0,0})},
- FunctionInfo{117, nullptr, "GetAudioSinkVolume", MakeVersionGate({15,0,0})}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit IBtm(Core::System& system_) : ServiceFramework{system_, "btm"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetState"},
+ {1, nullptr, "GetHostDeviceProperty"},
+ {2, nullptr, "AcquireDeviceConditionEvent"},
+ {3, nullptr, "GetDeviceCondition"},
+ {4, nullptr, "SetBurstMode"},
+ {5, nullptr, "SetSlotMode"},
+ {6, nullptr, "SetBluetoothMode"},
+ {7, nullptr, "SetWlanMode"},
+ {8, nullptr, "AcquireDeviceInfoEvent"},
+ {9, nullptr, "GetDeviceInfo"},
+ {10, nullptr, "AddDeviceInfo"},
+ {11, nullptr, "RemoveDeviceInfo"},
+ {12, nullptr, "IncreaseDeviceInfoOrder"},
+ {13, nullptr, "LlrNotify"},
+ {14, nullptr, "EnableRadio"},
+ {15, nullptr, "DisableRadio"},
+ {16, nullptr, "HidDisconnect"},
+ {17, nullptr, "HidSetRetransmissionMode"},
+ {18, nullptr, "AcquireAwakeReqEvent"},
+ {19, nullptr, "AcquireLlrStateEvent"},
+ {20, nullptr, "IsLlrStarted"},
+ {21, nullptr, "EnableSlotSaving"},
+ {22, nullptr, "ProtectDeviceInfo"},
+ {23, nullptr, "AcquireBleScanEvent"},
+ {24, nullptr, "GetBleScanParameterGeneral"},
+ {25, nullptr, "GetBleScanParameterSmartDevice"},
+ {26, nullptr, "StartBleScanForGeneral"},
+ {27, nullptr, "StopBleScanForGeneral"},
+ {28, nullptr, "GetBleScanResultsForGeneral"},
+ {29, nullptr, "StartBleScanForPairedDevice"},
+ {30, nullptr, "StopBleScanForPairedDevice"},
+ {31, nullptr, "StartBleScanForSmartDevice"},
+ {32, nullptr, "StopBleScanForSmartDevice"},
+ {33, nullptr, "GetBleScanResultsForSmartDevice"},
+ {34, nullptr, "AcquireBleConnectionEvent"},
+ {35, nullptr, "BleConnect"},
+ {36, nullptr, "BleOverrideConnection"},
+ {37, nullptr, "BleDisconnect"},
+ {38, nullptr, "BleGetConnectionState"},
+ {39, nullptr, "BleGetGattClientConditionList"},
+ {40, nullptr, "AcquireBlePairingEvent"},
+ {41, nullptr, "BlePairDevice"},
+ {42, nullptr, "BleUnpairDeviceOnBoth"},
+ {43, nullptr, "BleUnpairDevice"},
+ {44, nullptr, "BleGetPairedAddresses"},
+ {45, nullptr, "AcquireBleServiceDiscoveryEvent"},
+ {46, nullptr, "GetGattServices"},
+ {47, nullptr, "GetGattService"},
+ {48, nullptr, "GetGattIncludedServices"},
+ {49, nullptr, "GetBelongingService"},
+ {50, nullptr, "GetGattCharacteristics"},
+ {51, nullptr, "GetGattDescriptors"},
+ {52, nullptr, "AcquireBleMtuConfigEvent"},
+ {53, nullptr, "ConfigureBleMtu"},
+ {54, nullptr, "GetBleMtu"},
+ {55, nullptr, "RegisterBleGattDataPath"},
+ {56, nullptr, "UnregisterBleGattDataPath"},
+ {57, nullptr, "RegisterAppletResourceUserId"},
+ {58, nullptr, "UnregisterAppletResourceUserId"},
+ {59, nullptr, "SetAppletResourceUserId"},
+ {60, nullptr, "AcquireBleConnectionParameterUpdateEvent"}, //8.0.0+
+ {61, nullptr, "SetCeLength"}, //8.0.0+
+ {62, nullptr, "EnsureSlotExpansion"}, //9.0.0+
+ {63, nullptr, "IsSlotExpansionEnsured"}, //9.0.0+
+ {64, nullptr, "CancelConnectionTrigger"}, //10.0.0+
+ {65, nullptr, "GetConnectionCapacity"}, //13.0.0+
+ {66, nullptr, "GetWlanMode"}, //13.0.0+
+ {67, nullptr, "IsSlotSavingEnabled"}, //13.0.0+
+ {68, nullptr, "IsSlotSavingForPairingEnabled"}, //13.0.0+
+ {69, nullptr, "AcquireAudioDeviceConnectionEvent"}, //13.0.0+
+ {70, nullptr, "GetConnectedAudioDevices"}, //13.0.0+
+ {71, nullptr, "SetAudioSourceVolume"}, //13.0.0+
+ {72, nullptr, "GetAudioSourceVolume"}, //13.0.0+
+ {73, nullptr, "RequestAudioDeviceConnectionRejection"}, //13.0.0+
+ {74, nullptr, "CancelAudioDeviceConnectionRejection"}, //13.0.0+
+ {75, nullptr, "GetPairedAudioDevices"}, //13.0.0+
+ {76, nullptr, "SetWlanModeWithOption"}, //13.1.0+
+ {100, nullptr, "AcquireConnectionDisallowedEvent"}, //13.0.0+
+ {101, nullptr, "GetUsecaseViolationFactor"}, //13.0.0+
+ {110, nullptr, "GetShortenedDeviceInfo"}, //13.0.0+
+ {111, nullptr, "AcquirePairingCountUpdateEvent"},//13.0.0+
+ {112, nullptr, "Unknown112"}, //14.0.0-14.1.2
+ {113, nullptr, "Unknown113"}, //14.0.0-14.1.2
+ {114, nullptr, "IsFirstAudioControlConnection"}, //14.0.0+
+ {115, nullptr, "GetShortenedDeviceCondition"}, //14.0.0+
+ {116, nullptr, "SetAudioSinkVolume"}, //15.0.0+
+ {117, nullptr, "GetAudioSinkVolume"}, //15.0.0+
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
diff --git a/src/core/hle/service/btm/btm.h b/src/core/hle/service/btm/btm.h
index 0bf77d053e..902a61d8cc 100644
--- a/src/core/hle/service/btm/btm.h
+++ b/src/core/hle/service/btm/btm.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/btm/btm_debug.cpp b/src/core/hle/service/btm/btm_debug.cpp
new file mode 100644
index 0000000000..abbe7d4832
--- /dev/null
+++ b/src/core/hle/service/btm/btm_debug.cpp
@@ -0,0 +1,40 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "core/hle/service/btm/btm_debug.h"
+
+namespace Service::BTM {
+
+IBtmDebug::IBtmDebug(Core::System& system_) : ServiceFramework{system_, "btm:dbg"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "AcquireDiscoveryEvent"},
+ {1, nullptr, "StartDiscovery"},
+ {2, nullptr, "CancelDiscovery"},
+ {3, nullptr, "GetDeviceProperty"},
+ {4, nullptr, "CreateBond"},
+ {5, nullptr, "CancelBond"},
+ {6, nullptr, "SetTsiMode"},
+ {7, nullptr, "GeneralTest"},
+ {8, nullptr, "HidConnect"},
+ {9, nullptr, "GeneralGet"}, //5.0.0+
+ {10, nullptr, "GetGattClientDisconnectionReason"}, //5.0.0+
+ {11, nullptr, "GetBleConnectionParameter"}, //5.1.0+
+ {12, nullptr, "GetBleConnectionParameterRequest"}, //5.1.0+
+ {13, nullptr, "GetDiscoveredDevice"}, //12.0.0+
+ {14, nullptr, "SleepAwakeLoopTest"}, //15.0.0+
+ {15, nullptr, "SleepTest"}, //15.0.0+
+ {16, nullptr, "MinimumAwakeTest"}, //15.0.0+
+ {17, nullptr, "ForceEnableBtm"}, //15.0.0+
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
+IBtmDebug::~IBtmDebug() = default;
+
+} // namespace Service::BTM
diff --git a/src/core/hle/service/btm/btm_debug.h b/src/core/hle/service/btm/btm_debug.h
new file mode 100644
index 0000000000..fad760d674
--- /dev/null
+++ b/src/core/hle/service/btm/btm_debug.h
@@ -0,0 +1,24 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/service.h"
+
+namespace Core {
+class System;
+}
+
+namespace Service::BTM {
+
+class IBtmDebug final : public ServiceFramework<IBtmDebug> {
+public:
+ explicit IBtmDebug(Core::System& system_);
+ ~IBtmDebug() override;
+};
+
+} // namespace Service::BTM
diff --git a/src/core/hle/service/btm/btm_system.cpp b/src/core/hle/service/btm/btm_system.cpp
new file mode 100644
index 0000000000..1684b0193e
--- /dev/null
+++ b/src/core/hle/service/btm/btm_system.cpp
@@ -0,0 +1,34 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "common/logging.h"
+#include "core/hle/service/btm/btm_system.h"
+#include "core/hle/service/btm/btm_system_core.h"
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/service.h"
+
+namespace Service::BTM {
+
+IBtmSystem::IBtmSystem(Core::System& system_) : ServiceFramework{system_, "btm:sys"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, C<&IBtmSystem::GetCore>, "GetCore"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
+IBtmSystem::~IBtmSystem() = default;
+
+Result IBtmSystem::GetCore(OutInterface<IBtmSystemCore> out_interface) {
+ LOG_WARNING(Service_BTM, "called");
+
+ *out_interface = std::make_shared<IBtmSystemCore>(system);
+ R_SUCCEED();
+}
+
+} // namespace Service::BTM
diff --git a/src/core/hle/service/btm/btm_system.h b/src/core/hle/service/btm/btm_system.h
new file mode 100644
index 0000000000..9755540204
--- /dev/null
+++ b/src/core/hle/service/btm/btm_system.h
@@ -0,0 +1,28 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/service.h"
+
+namespace Core {
+class System;
+}
+
+namespace Service::BTM {
+class IBtmSystemCore;
+
+class IBtmSystem final : public ServiceFramework<IBtmSystem> {
+public:
+ explicit IBtmSystem(Core::System& system_);
+ ~IBtmSystem() override;
+
+private:
+ Result GetCore(OutInterface<IBtmSystemCore> out_interface);
+};
+
+} // namespace Service::BTM
diff --git a/src/core/hle/service/btm/btm_system_core.cpp b/src/core/hle/service/btm/btm_system_core.cpp
new file mode 100644
index 0000000000..318657fc32
--- /dev/null
+++ b/src/core/hle/service/btm/btm_system_core.cpp
@@ -0,0 +1,135 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "common/logging.h"
+#include "core/hle/service/btm/btm_system_core.h"
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/set/system_settings_server.h"
+#include "core/hle/service/sm/sm.h"
+
+namespace Service::BTM {
+
+IBtmSystemCore::IBtmSystemCore(Core::System& system_)
+ : ServiceFramework{system_, "IBtmSystemCore"}, service_context{system_, "IBtmSystemCore"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, C<&IBtmSystemCore::StartGamepadPairing>, "StartGamepadPairing"},
+ {1, C<&IBtmSystemCore::CancelGamepadPairing>, "CancelGamepadPairing"},
+ {2, nullptr, "ClearGamepadPairingDatabase"},
+ {3, nullptr, "GetPairedGamepadCount"},
+ {4, C<&IBtmSystemCore::EnableRadio>, "EnableRadio"},
+ {5, C<&IBtmSystemCore::DisableRadio>, "DisableRadio"},
+ {6, C<&IBtmSystemCore::IsRadioEnabled>, "IsRadioEnabled"},
+ {7, C<&IBtmSystemCore::AcquireRadioEvent>, "AcquireRadioEvent"},
+ {8, nullptr, "AcquireGamepadPairingEvent"},
+ {9, nullptr, "IsGamepadPairingStarted"},
+ {10, nullptr, "StartAudioDeviceDiscovery"},
+ {11, nullptr, "StopAudioDeviceDiscovery"},
+ {12, nullptr, "IsDiscoveryingAudioDevice"},
+ {13, C<&IBtmSystemCore::GetDiscoveredAudioDevice>, "GetDiscoveredAudioDevice"},
+ {14, C<&IBtmSystemCore::AcquireAudioDeviceConnectionEvent>, "AcquireAudioDeviceConnectionEvent"},
+ {15, nullptr, "ConnectAudioDevice"},
+ {16, nullptr, "IsConnectingAudioDevice"},
+ {17, C<&IBtmSystemCore::GetConnectedAudioDevices>, "GetConnectedAudioDevices"},
+ {18, nullptr, "DisconnectAudioDevice"},
+ {19, nullptr, "AcquirePairedAudioDeviceInfoChangedEvent"},
+ {20, C<&IBtmSystemCore::GetPairedAudioDevices>, "GetPairedAudioDevices"},
+ {21, nullptr, "RemoveAudioDevicePairing"},
+ {22, C<&IBtmSystemCore::RequestAudioDeviceConnectionRejection>, "RequestAudioDeviceConnectionRejection"},
+ {23, C<&IBtmSystemCore::CancelAudioDeviceConnectionRejection>, "CancelAudioDeviceConnectionRejection"}
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+ radio_event = service_context.CreateEvent("IBtmSystemCore::RadioEvent");
+ audio_device_connection_event =
+ service_context.CreateEvent("IBtmSystemCore::AudioDeviceConnectionEvent");
+
+ m_set_sys =
+ system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true);
+}
+
+IBtmSystemCore::~IBtmSystemCore() {
+ service_context.CloseEvent(radio_event);
+ service_context.CloseEvent(audio_device_connection_event);
+}
+
+Result IBtmSystemCore::StartGamepadPairing() {
+ LOG_WARNING(Service_BTM, "(STUBBED) called");
+ R_SUCCEED();
+}
+
+Result IBtmSystemCore::CancelGamepadPairing() {
+ LOG_WARNING(Service_BTM, "(STUBBED) called");
+ R_SUCCEED();
+}
+
+Result IBtmSystemCore::EnableRadio() {
+ LOG_DEBUG(Service_BTM, "called");
+
+ R_RETURN(m_set_sys->SetBluetoothEnableFlag(true));
+}
+Result IBtmSystemCore::DisableRadio() {
+ LOG_DEBUG(Service_BTM, "called");
+
+ R_RETURN(m_set_sys->SetBluetoothEnableFlag(false));
+}
+
+Result IBtmSystemCore::IsRadioEnabled(Out<bool> out_is_enabled) {
+ LOG_DEBUG(Service_BTM, "called");
+
+ R_RETURN(m_set_sys->GetBluetoothEnableFlag(out_is_enabled));
+}
+
+Result IBtmSystemCore::AcquireRadioEvent(Out<bool> out_is_valid,
+ OutCopyHandle<Kernel::KReadableEvent> out_event) {
+ LOG_WARNING(Service_BTM, "(STUBBED) called");
+
+ *out_is_valid = true;
+ *out_event = &radio_event->GetReadableEvent();
+ R_SUCCEED();
+}
+
+Result IBtmSystemCore::GetDiscoveredAudioDevice(OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices, s32 count, Out<s32> out_total) {
+ LOG_WARNING(Service_BTM, "(STUBBED) called");
+ R_SUCCEED();
+}
+
+Result IBtmSystemCore::AcquireAudioDeviceConnectionEvent(
+ OutCopyHandle<Kernel::KReadableEvent> out_event) {
+ LOG_WARNING(Service_BTM, "(STUBBED) called");
+
+ *out_event = &audio_device_connection_event->GetReadableEvent();
+ R_SUCCEED();
+}
+
+Result IBtmSystemCore::GetConnectedAudioDevices(
+ Out<s32> out_count, OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices) {
+ LOG_WARNING(Service_BTM, "(STUBBED) called");
+
+ *out_count = 0;
+ R_SUCCEED();
+}
+
+Result IBtmSystemCore::GetPairedAudioDevices(
+ Out<s32> out_count, OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices) {
+ LOG_WARNING(Service_BTM, "(STUBBED) called");
+
+ *out_count = 0;
+ R_SUCCEED();
+}
+
+Result IBtmSystemCore::RequestAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid) {
+ LOG_WARNING(Service_BTM, "(STUBBED) called, applet_resource_user_id={}", aruid.pid);
+ R_SUCCEED();
+}
+
+Result IBtmSystemCore::CancelAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid) {
+ LOG_WARNING(Service_BTM, "(STUBBED) called, applet_resource_user_id={}", aruid.pid);
+ R_SUCCEED();
+}
+
+} // namespace Service::BTM
diff --git a/src/core/hle/service/btm/btm_system_core.h b/src/core/hle/service/btm/btm_system_core.h
new file mode 100644
index 0000000000..3fc4c0d56c
--- /dev/null
+++ b/src/core/hle/service/btm/btm_system_core.h
@@ -0,0 +1,62 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/kernel_helpers.h"
+#include "core/hle/service/service.h"
+
+namespace Kernel {
+class KEvent;
+class KReadableEvent;
+} // namespace Kernel
+
+namespace Core {
+class System;
+}
+
+namespace Service::Set {
+class ISystemSettingsServer;
+}
+
+namespace Service::BTM {
+
+class IBtmSystemCore final : public ServiceFramework<IBtmSystemCore> {
+public:
+ explicit IBtmSystemCore(Core::System& system_);
+ ~IBtmSystemCore() override;
+
+private:
+ Result StartGamepadPairing();
+ Result CancelGamepadPairing();
+ Result EnableRadio();
+ Result DisableRadio();
+ Result IsRadioEnabled(Out<bool> out_is_enabled);
+
+ Result AcquireRadioEvent(Out<bool> out_is_valid, OutCopyHandle<Kernel::KReadableEvent> out_event);
+ Result GetDiscoveredAudioDevice(OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices, s32 count, Out<s32> out_total);
+ Result AcquireAudioDeviceConnectionEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
+
+ Result GetConnectedAudioDevices(
+ Out<s32> out_count,
+ OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices);
+
+ Result GetPairedAudioDevices(
+ Out<s32> out_count,
+ OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices);
+
+ Result RequestAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid);
+ Result CancelAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid);
+
+ KernelHelpers::ServiceContext service_context;
+
+ Kernel::KEvent* radio_event;
+ Kernel::KEvent* audio_device_connection_event;
+ std::shared_ptr<Service::Set::ISystemSettingsServer> m_set_sys;
+};
+
+} // namespace Service::BTM
diff --git a/src/core/hle/service/btm/btm_user.cpp b/src/core/hle/service/btm/btm_user.cpp
new file mode 100644
index 0000000000..c380c573fa
--- /dev/null
+++ b/src/core/hle/service/btm/btm_user.cpp
@@ -0,0 +1,33 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "common/logging.h"
+#include "core/hle/service/btm/btm_user.h"
+#include "core/hle/service/btm/btm_user_core.h"
+#include "core/hle/service/cmif_serialization.h"
+
+namespace Service::BTM {
+
+IBtmUser::IBtmUser(Core::System& system_) : ServiceFramework{system_, "btm:u"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, C<&IBtmUser::GetCore>, "GetCore"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
+IBtmUser::~IBtmUser() = default;
+
+Result IBtmUser::GetCore(OutInterface<IBtmUserCore> out_interface) {
+ LOG_WARNING(Service_BTM, "called");
+
+ *out_interface = std::make_shared<IBtmUserCore>(system);
+ R_SUCCEED();
+}
+
+} // namespace Service::BTM
diff --git a/src/core/hle/service/btm/btm_user.h b/src/core/hle/service/btm/btm_user.h
new file mode 100644
index 0000000000..d6cf330ed6
--- /dev/null
+++ b/src/core/hle/service/btm/btm_user.h
@@ -0,0 +1,28 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/service.h"
+
+namespace Core {
+class System;
+}
+
+namespace Service::BTM {
+class IBtmUserCore;
+
+class IBtmUser final : public ServiceFramework<IBtmUser> {
+public:
+ explicit IBtmUser(Core::System& system_);
+ ~IBtmUser() override;
+
+private:
+ Result GetCore(OutInterface<IBtmUserCore> out_interface);
+};
+
+} // namespace Service::BTM
diff --git a/src/core/hle/service/btm/btm_user_core.cpp b/src/core/hle/service/btm/btm_user_core.cpp
new file mode 100644
index 0000000000..b120df14c0
--- /dev/null
+++ b/src/core/hle/service/btm/btm_user_core.cpp
@@ -0,0 +1,106 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include <memory>
+
+#include "common/logging.h"
+#include "core/core.h"
+#include "core/hle/kernel/k_event.h"
+#include "core/hle/service/btm/btm_user_core.h"
+#include "core/hle/service/cmif_serialization.h"
+
+namespace Service::BTM {
+
+IBtmUserCore::IBtmUserCore(Core::System& system_)
+ : ServiceFramework{system_, "IBtmUserCore"}, service_context{system_, "IBtmUserCore"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, C<&IBtmUserCore::AcquireBleScanEvent>, "AcquireBleScanEvent"},
+ {1, nullptr, "GetBleScanFilterParameter"},
+ {2, nullptr, "GetBleScanFilterParameter2"},
+ {3, nullptr, "StartBleScanForGeneral"},
+ {4, nullptr, "StopBleScanForGeneral"},
+ {5, nullptr, "GetBleScanResultsForGeneral"},
+ {6, nullptr, "StartBleScanForPaired"},
+ {7, nullptr, "StopBleScanForPaired"},
+ {8, nullptr, "StartBleScanForSmartDevice"},
+ {9, nullptr, "StopBleScanForSmartDevice"},
+ {10, nullptr, "GetBleScanResultsForSmartDevice"},
+ {17, C<&IBtmUserCore::AcquireBleConnectionEvent>, "AcquireBleConnectionEvent"},
+ {18, nullptr, "BleConnect"},
+ {19, nullptr, "BleDisconnect"},
+ {20, nullptr, "BleGetConnectionState"},
+ {21, nullptr, "AcquireBlePairingEvent"},
+ {22, nullptr, "BlePairDevice"},
+ {23, nullptr, "BleUnPairDevice"},
+ {24, nullptr, "BleUnPairDevice2"},
+ {25, nullptr, "BleGetPairedDevices"},
+ {26, C<&IBtmUserCore::AcquireBleServiceDiscoveryEvent>, "AcquireBleServiceDiscoveryEvent"},
+ {27, nullptr, "GetGattServices"},
+ {28, nullptr, "GetGattService"},
+ {29, nullptr, "GetGattIncludedServices"},
+ {30, nullptr, "GetBelongingGattService"},
+ {31, nullptr, "GetGattCharacteristics"},
+ {32, nullptr, "GetGattDescriptors"},
+ {33, C<&IBtmUserCore::AcquireBleMtuConfigEvent>, "AcquireBleMtuConfigEvent"},
+ {34, nullptr, "ConfigureBleMtu"},
+ {35, nullptr, "GetBleMtu"},
+ {36, nullptr, "RegisterBleGattDataPath"},
+ {37, nullptr, "UnregisterBleGattDataPath"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
+
+ scan_event = service_context.CreateEvent("IBtmUserCore:ScanEvent");
+ connection_event = service_context.CreateEvent("IBtmUserCore:ConnectionEvent");
+ service_discovery_event = service_context.CreateEvent("IBtmUserCore:DiscoveryEvent");
+ config_event = service_context.CreateEvent("IBtmUserCore:ConfigEvent");
+}
+
+IBtmUserCore::~IBtmUserCore() {
+ service_context.CloseEvent(scan_event);
+ service_context.CloseEvent(connection_event);
+ service_context.CloseEvent(service_discovery_event);
+ service_context.CloseEvent(config_event);
+}
+
+Result IBtmUserCore::AcquireBleScanEvent(Out<bool> out_is_valid,
+ OutCopyHandle<Kernel::KReadableEvent> out_event) {
+ LOG_WARNING(Service_BTM, "(STUBBED) called");
+
+ *out_is_valid = true;
+ *out_event = &scan_event->GetReadableEvent();
+ R_SUCCEED();
+}
+
+Result IBtmUserCore::AcquireBleConnectionEvent(Out<bool> out_is_valid,
+ OutCopyHandle<Kernel::KReadableEvent> out_event) {
+ LOG_WARNING(Service_BTM, "(STUBBED) called");
+
+ *out_is_valid = true;
+ *out_event = &connection_event->GetReadableEvent();
+ R_SUCCEED();
+}
+
+Result IBtmUserCore::AcquireBleServiceDiscoveryEvent(
+ Out<bool> out_is_valid, OutCopyHandle<Kernel::KReadableEvent> out_event) {
+ LOG_WARNING(Service_BTM, "(STUBBED) called");
+
+ *out_is_valid = true;
+ *out_event = &service_discovery_event->GetReadableEvent();
+ R_SUCCEED();
+}
+
+Result IBtmUserCore::AcquireBleMtuConfigEvent(Out<bool> out_is_valid,
+ OutCopyHandle<Kernel::KReadableEvent> out_event) {
+ LOG_WARNING(Service_BTM, "(STUBBED) called");
+
+ *out_is_valid = true;
+ *out_event = &config_event->GetReadableEvent();
+ R_SUCCEED();
+}
+
+} // namespace Service::BTM
diff --git a/src/core/hle/service/btm/btm_user_core.h b/src/core/hle/service/btm/btm_user_core.h
new file mode 100644
index 0000000000..5a565a5897
--- /dev/null
+++ b/src/core/hle/service/btm/btm_user_core.h
@@ -0,0 +1,50 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/kernel_helpers.h"
+#include "core/hle/service/service.h"
+
+namespace Kernel {
+class KEvent;
+class KReadableEvent;
+} // namespace Kernel
+
+namespace Core {
+class System;
+}
+
+namespace Service::BTM {
+
+class IBtmUserCore final : public ServiceFramework<IBtmUserCore> {
+public:
+ explicit IBtmUserCore(Core::System& system_);
+ ~IBtmUserCore() override;
+
+private:
+ Result AcquireBleScanEvent(Out<bool> out_is_valid,
+ OutCopyHandle<Kernel::KReadableEvent> out_event);
+
+ Result AcquireBleConnectionEvent(Out<bool> out_is_valid,
+ OutCopyHandle<Kernel::KReadableEvent> out_event);
+
+ Result AcquireBleServiceDiscoveryEvent(Out<bool> out_is_valid,
+ OutCopyHandle<Kernel::KReadableEvent> out_event);
+
+ Result AcquireBleMtuConfigEvent(Out<bool> out_is_valid,
+ OutCopyHandle<Kernel::KReadableEvent> out_event);
+
+ KernelHelpers::ServiceContext service_context;
+
+ Kernel::KEvent* scan_event;
+ Kernel::KEvent* connection_event;
+ Kernel::KEvent* service_discovery_event;
+ Kernel::KEvent* config_event;
+};
+
+} // namespace Service::BTM
diff --git a/src/core/hle/service/caps/caps.cpp b/src/core/hle/service/caps/caps.cpp
index 6cc37999f3..f07fbd2185 100644
--- a/src/core/hle/service/caps/caps.cpp
+++ b/src/core/hle/service/caps/caps.cpp
@@ -5,6 +5,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#include "core/hle/service/caps/caps.h"
+#include "core/hle/service/caps/caps_a.h"
#include "core/hle/service/caps/caps_c.h"
#include "core/hle/service/caps/caps_manager.h"
#include "core/hle/service/caps/caps_sc.h"
@@ -13,221 +14,22 @@
#include "core/hle/service/caps/caps_u.h"
#include "core/hle/service/server_manager.h"
#include "core/hle/service/service.h"
-#include "common/logging.h"
#include "frontend_common/firmware_manager.h"
-#include "core/hle/service/caps/caps_result.h"
-#include "core/hle/service/cmif_serialization.h"
-#include "core/hle/service/ipc_helpers.h"
namespace Service::Capture {
class IDecoderControlService final : public ServiceFramework<IDecoderControlService> {
public:
- explicit IDecoderControlService(Core::System& system_) : ServiceFramework{system_, "grc:d"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{3001, nullptr, "DecodeJpeg"},
- FunctionInfo{4001, nullptr, "ShrinkJpeg"},
- FunctionInfo{4002, nullptr, "ShrinkJpegEx"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
-};
-
-class IAlbumAccessorService final : public ServiceFramework<IAlbumAccessorService> {
-public:
- explicit IAlbumAccessorService(Core::System& system_, std::shared_ptr<AlbumManager> album_manager) : ServiceFramework{system_, "caps:a"}, manager{album_manager} {}
- ~IAlbumAccessorService() override = default;
-
- Result GetAlbumFileList(
- Out<u64> out_count, AlbumStorage storage,
- OutArray<AlbumEntry, BufferAttr_HipcMapAlias> out_entries) {
- LOG_INFO(Service_Capture, "called, storage={}", storage);
-
- const Result result = manager->GetAlbumFileList(out_entries, *out_count, storage, 0);
- R_RETURN(TranslateResult(result));
- }
-
- Result DeleteAlbumFile(AlbumFileId file_id) {
- LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}",
- file_id.application_id, file_id.storage, file_id.type);
-
- const Result result = manager->DeleteAlbumFile(file_id);
- R_RETURN(TranslateResult(result));
+ explicit IDecoderControlService(Core::System& system_) : ServiceFramework{system_, "grc:d"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {3001, nullptr, "DecodeJpeg"},
+ {4001, nullptr, "ShrinkJpeg"},
+ {4002, nullptr, "ShrinkJpegEx"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
-
- Result IsAlbumMounted(Out<bool> out_is_mounted, AlbumStorage storage) {
- LOG_INFO(Service_Capture, "called, storage={}", storage);
-
- const Result result = manager->IsAlbumMounted(storage);
- *out_is_mounted = result.IsSuccess();
- R_RETURN(TranslateResult(result));
- }
-
- Result Unknown18(
- Out<u32> out_buffer_size,
- OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_buffer) {
- LOG_WARNING(Service_Capture, "(STUBBED) called");
- *out_buffer_size = 0;
- R_SUCCEED();
- }
-
- Result GetAlbumFileListEx0(
- Out<u64> out_entries_size, AlbumStorage storage, u8 flags,
- OutArray<AlbumEntry, BufferAttr_HipcMapAlias> out_entries) {
- LOG_INFO(Service_Capture, "called, storage={}, flags={}", storage, flags);
-
- const Result result = manager->GetAlbumFileList(out_entries, *out_entries_size, storage, flags);
- R_RETURN(TranslateResult(result));
- }
-
- Result GetAutoSavingStorage(Out<bool> out_is_autosaving) {
- LOG_WARNING(Service_Capture, "(STUBBED) called");
-
- const Result result = manager->GetAutoSavingStorage(*out_is_autosaving);
- R_RETURN(TranslateResult(result));
- }
-
- Result LoadAlbumScreenShotImageEx1(
- const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options,
- OutLargeData<LoadAlbumScreenShotImageOutput, BufferAttr_HipcMapAlias> out_image_output,
- OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_image,
- OutArray<u8, BufferAttr_HipcMapAlias> out_buffer) {
- LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}, flags={}",
- file_id.application_id, file_id.storage, file_id.type, decoder_options.flags);
-
- const Result result =
- manager->LoadAlbumScreenShotImage(*out_image_output, out_image, file_id, decoder_options);
- R_RETURN(TranslateResult(result));
- }
-
- Result LoadAlbumScreenShotThumbnailImageEx1(
- const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options,
- OutLargeData<LoadAlbumScreenShotImageOutput, BufferAttr_HipcMapAlias> out_image_output,
- OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_image,
- OutArray<u8, BufferAttr_HipcMapAlias> out_buffer) {
- LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}, flags={}",
- file_id.application_id, file_id.storage, file_id.type, decoder_options.flags);
-
- const Result result = manager->LoadAlbumScreenShotThumbnail(*out_image_output, out_image,
- file_id, decoder_options);
- R_RETURN(TranslateResult(result));
- }
-
- Result TranslateResult(Result in_result) {
- if (in_result.IsSuccess()) {
- return in_result;
- }
-
- if ((in_result.raw & 0x3801ff) == ResultUnknown1024.raw) {
- if (in_result.GetDescription() - 0x514 < 100) {
- return ResultInvalidFileData;
- }
- if (in_result.GetDescription() - 0x5dc < 100) {
- return ResultInvalidFileData;
- }
-
- if (in_result.GetDescription() - 0x578 < 100) {
- if (in_result == ResultFileCountLimit) {
- return ResultUnknown22;
- }
- return ResultUnknown25;
- }
-
- if (in_result.raw < ResultUnknown1801.raw) {
- if (in_result == ResultUnknown1202) {
- return ResultUnknown810;
- }
- if (in_result == ResultUnknown1203) {
- return ResultUnknown810;
- }
- if (in_result == ResultUnknown1701) {
- return ResultUnknown5;
- }
- } else if (in_result.raw < ResultUnknown1803.raw) {
- if (in_result == ResultUnknown1801) {
- return ResultUnknown5;
- }
- if (in_result == ResultUnknown1802) {
- return ResultUnknown6;
- }
- } else {
- if (in_result == ResultUnknown1803) {
- return ResultUnknown7;
- }
- if (in_result == ResultUnknown1804) {
- return ResultOutOfRange;
- }
- }
- return ResultUnknown1024;
- }
-
- if (in_result.GetModule() == ErrorModule::FS) {
- if ((in_result.GetDescription() >> 0xc < 0x7d) ||
- (in_result.GetDescription() - 1000 < 2000) ||
- (((in_result.GetDescription() - 3000) >> 3) < 0x271)) {
- // TODO: Translate FS error
- return in_result;
- }
- }
-
- return in_result;
- }
-
- Result GetAlbumAccessResultForDebug(Out<Result> out_result) {
- LOG_WARNING(Service_Capture, "(STUBBED) called");
- *out_result = ResultSuccess;
- R_SUCCEED();
- }
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetAlbumFileCount"},
- FunctionInfo{1, C<&IAlbumAccessorService::GetAlbumFileList>, "GetAlbumFileList"},
- FunctionInfo{2, nullptr, "LoadAlbumFile"},
- FunctionInfo{3, C<&IAlbumAccessorService::DeleteAlbumFile>, "DeleteAlbumFile"},
- FunctionInfo{4, nullptr, "StorageCopyAlbumFile"},
- FunctionInfo{5, C<&IAlbumAccessorService::IsAlbumMounted>, "IsAlbumMounted"},
- FunctionInfo{6, nullptr, "GetAlbumUsage"},
- FunctionInfo{7, nullptr, "GetAlbumFileSize"},
- FunctionInfo{8, nullptr, "LoadAlbumFileThumbnail"},
- FunctionInfo{9, nullptr, "LoadAlbumScreenShotImage"},
- FunctionInfo{10, nullptr, "LoadAlbumScreenShotThumbnailImage"},
- FunctionInfo{11, nullptr, "GetAlbumEntryFromApplicationAlbumEntry"},
- FunctionInfo{12, nullptr, "LoadAlbumScreenShotImageEx"},
- FunctionInfo{13, nullptr, "LoadAlbumScreenShotThumbnailImageEx"},
- FunctionInfo{14, nullptr, "LoadAlbumScreenShotImageEx0"},
- FunctionInfo{15, nullptr, "GetAlbumUsage3"},
- FunctionInfo{16, nullptr, "GetAlbumMountResult"},
- FunctionInfo{17, nullptr, "GetAlbumUsage16"},
- FunctionInfo{18, C<&IAlbumAccessorService::Unknown18>, "Unknown18"},
- FunctionInfo{19, nullptr, "Unknown19"},
- FunctionInfo{100, nullptr, "GetAlbumFileCountEx0"},
- FunctionInfo{101, C<&IAlbumAccessorService::GetAlbumFileListEx0>, "GetAlbumFileListEx0"},
- FunctionInfo{202, nullptr, "SaveEditedScreenShot"},
- FunctionInfo{301, nullptr, "GetLastThumbnail"},
- FunctionInfo{302, nullptr, "GetLastOverlayMovieThumbnail"},
- FunctionInfo{401, C<&IAlbumAccessorService::GetAutoSavingStorage>, "GetAutoSavingStorage"},
- FunctionInfo{501, nullptr, "GetRequiredStorageSpaceSizeToCopyAll"},
- FunctionInfo{1001, nullptr, "LoadAlbumScreenShotThumbnailImageEx0"},
- FunctionInfo{1002, C<&IAlbumAccessorService::LoadAlbumScreenShotImageEx1>, "LoadAlbumScreenShotImageEx1"},
- FunctionInfo{1003, C<&IAlbumAccessorService::LoadAlbumScreenShotThumbnailImageEx1>, "LoadAlbumScreenShotThumbnailImageEx1"},
- FunctionInfo{8001, nullptr, "ForceAlbumUnmounted"},
- FunctionInfo{8002, nullptr, "ResetAlbumMountStatus"},
- FunctionInfo{8011, nullptr, "RefreshAlbumCache"},
- FunctionInfo{8012, nullptr, "GetAlbumCache"},
- FunctionInfo{8013, nullptr, "GetAlbumCacheEx"},
- FunctionInfo{8021, nullptr, "GetAlbumEntryFromApplicationAlbumEntryAruid"},
- FunctionInfo{10011, nullptr, "SetInternalErrorConversionEnabled"},
- FunctionInfo{50000, nullptr, "LoadMakerNoteInfoForDebug"},
- FunctionInfo{50011, C<&IAlbumAccessorService::GetAlbumAccessResultForDebug>, "GetAlbumAccessResultForDebug"},
- FunctionInfo{60002, nullptr, "OpenAccessorSession"}
- );
-
- std::shared_ptr<AlbumManager> manager = nullptr;
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/caps/caps.h b/src/core/hle/service/caps/caps.h
index 58e9725b85..670ee59cda 100644
--- a/src/core/hle/service/caps/caps.h
+++ b/src/core/hle/service/caps/caps.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/caps/caps_a.cpp b/src/core/hle/service/caps/caps_a.cpp
new file mode 100644
index 0000000000..8f561bfcdc
--- /dev/null
+++ b/src/core/hle/service/caps/caps_a.cpp
@@ -0,0 +1,211 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "common/logging.h"
+#include "core/hle/service/caps/caps_a.h"
+#include "core/hle/service/caps/caps_manager.h"
+#include "core/hle/service/caps/caps_result.h"
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/ipc_helpers.h"
+
+namespace Service::Capture {
+
+IAlbumAccessorService::IAlbumAccessorService(Core::System& system_,
+ std::shared_ptr<AlbumManager> album_manager)
+ : ServiceFramework{system_, "caps:a"}, manager{album_manager} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetAlbumFileCount"},
+ {1, C<&IAlbumAccessorService::GetAlbumFileList>, "GetAlbumFileList"},
+ {2, nullptr, "LoadAlbumFile"},
+ {3, C<&IAlbumAccessorService::DeleteAlbumFile>, "DeleteAlbumFile"},
+ {4, nullptr, "StorageCopyAlbumFile"},
+ {5, C<&IAlbumAccessorService::IsAlbumMounted>, "IsAlbumMounted"},
+ {6, nullptr, "GetAlbumUsage"},
+ {7, nullptr, "GetAlbumFileSize"},
+ {8, nullptr, "LoadAlbumFileThumbnail"},
+ {9, nullptr, "LoadAlbumScreenShotImage"},
+ {10, nullptr, "LoadAlbumScreenShotThumbnailImage"},
+ {11, nullptr, "GetAlbumEntryFromApplicationAlbumEntry"},
+ {12, nullptr, "LoadAlbumScreenShotImageEx"},
+ {13, nullptr, "LoadAlbumScreenShotThumbnailImageEx"},
+ {14, nullptr, "LoadAlbumScreenShotImageEx0"},
+ {15, nullptr, "GetAlbumUsage3"},
+ {16, nullptr, "GetAlbumMountResult"},
+ {17, nullptr, "GetAlbumUsage16"},
+ {18, C<&IAlbumAccessorService::Unknown18>, "Unknown18"},
+ {19, nullptr, "Unknown19"},
+ {100, nullptr, "GetAlbumFileCountEx0"},
+ {101, C<&IAlbumAccessorService::GetAlbumFileListEx0>, "GetAlbumFileListEx0"},
+ {202, nullptr, "SaveEditedScreenShot"},
+ {301, nullptr, "GetLastThumbnail"},
+ {302, nullptr, "GetLastOverlayMovieThumbnail"},
+ {401, C<&IAlbumAccessorService::GetAutoSavingStorage>, "GetAutoSavingStorage"},
+ {501, nullptr, "GetRequiredStorageSpaceSizeToCopyAll"},
+ {1001, nullptr, "LoadAlbumScreenShotThumbnailImageEx0"},
+ {1002, C<&IAlbumAccessorService::LoadAlbumScreenShotImageEx1>, "LoadAlbumScreenShotImageEx1"},
+ {1003, C<&IAlbumAccessorService::LoadAlbumScreenShotThumbnailImageEx1>, "LoadAlbumScreenShotThumbnailImageEx1"},
+ {8001, nullptr, "ForceAlbumUnmounted"},
+ {8002, nullptr, "ResetAlbumMountStatus"},
+ {8011, nullptr, "RefreshAlbumCache"},
+ {8012, nullptr, "GetAlbumCache"},
+ {8013, nullptr, "GetAlbumCacheEx"},
+ {8021, nullptr, "GetAlbumEntryFromApplicationAlbumEntryAruid"},
+ {10011, nullptr, "SetInternalErrorConversionEnabled"},
+ {50000, nullptr, "LoadMakerNoteInfoForDebug"},
+ {50011, C<&IAlbumAccessorService::GetAlbumAccessResultForDebug>, "GetAlbumAccessResultForDebug"},
+ {60002, nullptr, "OpenAccessorSession"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
+IAlbumAccessorService::~IAlbumAccessorService() = default;
+
+Result IAlbumAccessorService::GetAlbumFileList(
+ Out<u64> out_count, AlbumStorage storage,
+ OutArray<AlbumEntry, BufferAttr_HipcMapAlias> out_entries) {
+ LOG_INFO(Service_Capture, "called, storage={}", storage);
+
+ const Result result = manager->GetAlbumFileList(out_entries, *out_count, storage, 0);
+ R_RETURN(TranslateResult(result));
+}
+
+Result IAlbumAccessorService::DeleteAlbumFile(AlbumFileId file_id) {
+ LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}",
+ file_id.application_id, file_id.storage, file_id.type);
+
+ const Result result = manager->DeleteAlbumFile(file_id);
+ R_RETURN(TranslateResult(result));
+}
+
+Result IAlbumAccessorService::IsAlbumMounted(Out<bool> out_is_mounted, AlbumStorage storage) {
+ LOG_INFO(Service_Capture, "called, storage={}", storage);
+
+ const Result result = manager->IsAlbumMounted(storage);
+ *out_is_mounted = result.IsSuccess();
+ R_RETURN(TranslateResult(result));
+}
+
+Result IAlbumAccessorService::Unknown18(
+ Out<u32> out_buffer_size,
+ OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_buffer) {
+ LOG_WARNING(Service_Capture, "(STUBBED) called");
+ *out_buffer_size = 0;
+ R_SUCCEED();
+}
+
+Result IAlbumAccessorService::GetAlbumFileListEx0(
+ Out<u64> out_entries_size, AlbumStorage storage, u8 flags,
+ OutArray<AlbumEntry, BufferAttr_HipcMapAlias> out_entries) {
+ LOG_INFO(Service_Capture, "called, storage={}, flags={}", storage, flags);
+
+ const Result result = manager->GetAlbumFileList(out_entries, *out_entries_size, storage, flags);
+ R_RETURN(TranslateResult(result));
+}
+
+Result IAlbumAccessorService::GetAutoSavingStorage(Out<bool> out_is_autosaving) {
+ LOG_WARNING(Service_Capture, "(STUBBED) called");
+
+ const Result result = manager->GetAutoSavingStorage(*out_is_autosaving);
+ R_RETURN(TranslateResult(result));
+}
+
+Result IAlbumAccessorService::LoadAlbumScreenShotImageEx1(
+ const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options,
+ OutLargeData<LoadAlbumScreenShotImageOutput, BufferAttr_HipcMapAlias> out_image_output,
+ OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_image,
+ OutArray<u8, BufferAttr_HipcMapAlias> out_buffer) {
+ LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}, flags={}",
+ file_id.application_id, file_id.storage, file_id.type, decoder_options.flags);
+
+ const Result result =
+ manager->LoadAlbumScreenShotImage(*out_image_output, out_image, file_id, decoder_options);
+ R_RETURN(TranslateResult(result));
+}
+
+Result IAlbumAccessorService::LoadAlbumScreenShotThumbnailImageEx1(
+ const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options,
+ OutLargeData<LoadAlbumScreenShotImageOutput, BufferAttr_HipcMapAlias> out_image_output,
+ OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_image,
+ OutArray<u8, BufferAttr_HipcMapAlias> out_buffer) {
+ LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}, flags={}",
+ file_id.application_id, file_id.storage, file_id.type, decoder_options.flags);
+
+ const Result result = manager->LoadAlbumScreenShotThumbnail(*out_image_output, out_image,
+ file_id, decoder_options);
+ R_RETURN(TranslateResult(result));
+}
+
+Result IAlbumAccessorService::TranslateResult(Result in_result) {
+ if (in_result.IsSuccess()) {
+ return in_result;
+ }
+
+ if ((in_result.raw & 0x3801ff) == ResultUnknown1024.raw) {
+ if (in_result.GetDescription() - 0x514 < 100) {
+ return ResultInvalidFileData;
+ }
+ if (in_result.GetDescription() - 0x5dc < 100) {
+ return ResultInvalidFileData;
+ }
+
+ if (in_result.GetDescription() - 0x578 < 100) {
+ if (in_result == ResultFileCountLimit) {
+ return ResultUnknown22;
+ }
+ return ResultUnknown25;
+ }
+
+ if (in_result.raw < ResultUnknown1801.raw) {
+ if (in_result == ResultUnknown1202) {
+ return ResultUnknown810;
+ }
+ if (in_result == ResultUnknown1203) {
+ return ResultUnknown810;
+ }
+ if (in_result == ResultUnknown1701) {
+ return ResultUnknown5;
+ }
+ } else if (in_result.raw < ResultUnknown1803.raw) {
+ if (in_result == ResultUnknown1801) {
+ return ResultUnknown5;
+ }
+ if (in_result == ResultUnknown1802) {
+ return ResultUnknown6;
+ }
+ } else {
+ if (in_result == ResultUnknown1803) {
+ return ResultUnknown7;
+ }
+ if (in_result == ResultUnknown1804) {
+ return ResultOutOfRange;
+ }
+ }
+ return ResultUnknown1024;
+ }
+
+ if (in_result.GetModule() == ErrorModule::FS) {
+ if ((in_result.GetDescription() >> 0xc < 0x7d) ||
+ (in_result.GetDescription() - 1000 < 2000) ||
+ (((in_result.GetDescription() - 3000) >> 3) < 0x271)) {
+ // TODO: Translate FS error
+ return in_result;
+ }
+ }
+
+ return in_result;
+}
+
+
+Result IAlbumAccessorService::GetAlbumAccessResultForDebug(Out<Result> out_result) {
+ LOG_WARNING(Service_Capture, "(STUBBED) called");
+ *out_result = ResultSuccess;
+ R_SUCCEED();
+}
+
+} // namespace Service::Capture
diff --git a/src/core/hle/service/caps/caps_a.h b/src/core/hle/service/caps/caps_a.h
new file mode 100644
index 0000000000..c6aa8f9210
--- /dev/null
+++ b/src/core/hle/service/caps/caps_a.h
@@ -0,0 +1,63 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/caps/caps_types.h"
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/service.h"
+
+namespace Core {
+class System;
+}
+
+namespace Service::Capture {
+class AlbumManager;
+
+class IAlbumAccessorService final : public ServiceFramework<IAlbumAccessorService> {
+public:
+ explicit IAlbumAccessorService(Core::System& system_,
+ std::shared_ptr<AlbumManager> album_manager);
+ ~IAlbumAccessorService() override;
+
+private:
+ Result GetAlbumFileList(Out<u64> out_count, AlbumStorage storage,
+ OutArray<AlbumEntry, BufferAttr_HipcMapAlias> out_entries);
+
+ Result DeleteAlbumFile(AlbumFileId file_id);
+
+ Result IsAlbumMounted(Out<bool> out_is_mounted, AlbumStorage storage);
+
+ Result Unknown18(
+ Out<u32> out_buffer_size,
+ OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure>
+ out_buffer);
+
+ Result GetAlbumFileListEx0(Out<u64> out_entries_size, AlbumStorage storage, u8 flags,
+ OutArray<AlbumEntry, BufferAttr_HipcMapAlias> out_entries);
+
+ Result GetAutoSavingStorage(Out<bool> out_is_autosaving);
+
+ Result LoadAlbumScreenShotImageEx1(
+ const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options,
+ OutLargeData<LoadAlbumScreenShotImageOutput, BufferAttr_HipcMapAlias> out_image_output,
+ OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_image,
+ OutArray<u8, BufferAttr_HipcMapAlias> out_buffer);
+
+ Result LoadAlbumScreenShotThumbnailImageEx1(
+ const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options,
+ OutLargeData<LoadAlbumScreenShotImageOutput, BufferAttr_HipcMapAlias> out_image_output,
+ OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_image,
+ OutArray<u8, BufferAttr_HipcMapAlias> out_buffer);
+
+ Result TranslateResult(Result in_result);
+
+ Result GetAlbumAccessResultForDebug(Out<Result> out_result);
+
+ std::shared_ptr<AlbumManager> manager = nullptr;
+};
+
+} // namespace Service::Capture
diff --git a/src/core/hle/service/caps/caps_c.cpp b/src/core/hle/service/caps/caps_c.cpp
index c62c3cd5d3..6c9f8e964d 100644
--- a/src/core/hle/service/caps/caps_c.cpp
+++ b/src/core/hle/service/caps/caps_c.cpp
@@ -14,34 +14,34 @@
namespace Service::Capture {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IAlbumControlService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{1, nullptr, "CaptureRawImage"},
- FunctionInfo{2, nullptr, "CaptureRawImageWithTimeout"},
- FunctionInfo{33, C<&IAlbumControlService::SetShimLibraryVersion>, "SetShimLibraryVersion"},
- FunctionInfo{1001, nullptr, "RequestTakingScreenShot"},
- FunctionInfo{1002, nullptr, "RequestTakingScreenShotWithTimeout"},
- FunctionInfo{1011, nullptr, "NotifyTakingScreenShotRefused"},
- FunctionInfo{2001, nullptr, "NotifyAlbumStorageIsAvailable"},
- FunctionInfo{2002, nullptr, "NotifyAlbumStorageIsUnavailable"},
- FunctionInfo{2011, nullptr, "RegisterAppletResourceUserId"},
- FunctionInfo{2012, nullptr, "UnregisterAppletResourceUserId"},
- FunctionInfo{2013, nullptr, "GetApplicationIdFromAruid"},
- FunctionInfo{2014, nullptr, "CheckApplicationIdRegistered"},
- FunctionInfo{2101, nullptr, "GenerateCurrentAlbumFileId"},
- FunctionInfo{2102, nullptr, "GenerateApplicationAlbumEntry"},
- FunctionInfo{2201, nullptr, "SaveAlbumScreenShotFile"},
- FunctionInfo{2202, nullptr, "SaveAlbumScreenShotFileEx"},
- FunctionInfo{2301, nullptr, "SetOverlayScreenShotThumbnailData"},
- FunctionInfo{2302, nullptr, "SetOverlayMovieThumbnailData"},
- FunctionInfo{60001, nullptr, "OpenControlSession"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IAlbumControlService::IAlbumControlService(Core::System& system_,
std::shared_ptr<AlbumManager> album_manager)
: ServiceFramework{system_, "caps:c"}, manager{album_manager} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {1, nullptr, "CaptureRawImage"},
+ {2, nullptr, "CaptureRawImageWithTimeout"},
+ {33, C<&IAlbumControlService::SetShimLibraryVersion>, "SetShimLibraryVersion"},
+ {1001, nullptr, "RequestTakingScreenShot"},
+ {1002, nullptr, "RequestTakingScreenShotWithTimeout"},
+ {1011, nullptr, "NotifyTakingScreenShotRefused"},
+ {2001, nullptr, "NotifyAlbumStorageIsAvailable"},
+ {2002, nullptr, "NotifyAlbumStorageIsUnavailable"},
+ {2011, nullptr, "RegisterAppletResourceUserId"},
+ {2012, nullptr, "UnregisterAppletResourceUserId"},
+ {2013, nullptr, "GetApplicationIdFromAruid"},
+ {2014, nullptr, "CheckApplicationIdRegistered"},
+ {2101, nullptr, "GenerateCurrentAlbumFileId"},
+ {2102, nullptr, "GenerateApplicationAlbumEntry"},
+ {2201, nullptr, "SaveAlbumScreenShotFile"},
+ {2202, nullptr, "SaveAlbumScreenShotFileEx"},
+ {2301, nullptr, "SetOverlayScreenShotThumbnailData"},
+ {2302, nullptr, "SetOverlayMovieThumbnailData"},
+ {60001, nullptr, "OpenControlSession"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IAlbumControlService::~IAlbumControlService() = default;
diff --git a/src/core/hle/service/caps/caps_c.h b/src/core/hle/service/caps/caps_c.h
index a1f19bbfc3..f50de0ee8c 100644
--- a/src/core/hle/service/caps/caps_c.h
+++ b/src/core/hle/service/caps/caps_c.h
@@ -19,11 +19,14 @@ enum class ShimLibraryVersion : u64;
class IAlbumControlService final : public ServiceFramework<IAlbumControlService> {
public:
- explicit IAlbumControlService(Core::System& system_, std::shared_ptr<AlbumManager> album_manager);
+ explicit IAlbumControlService(Core::System& system_,
+ std::shared_ptr<AlbumManager> album_manager);
~IAlbumControlService() override;
+
private:
- Result SetShimLibraryVersion(ShimLibraryVersion library_version, ClientAppletResourceUserId aruid);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
+ Result SetShimLibraryVersion(ShimLibraryVersion library_version,
+ ClientAppletResourceUserId aruid);
+
std::shared_ptr<AlbumManager> manager = nullptr;
};
diff --git a/src/core/hle/service/caps/caps_result.h b/src/core/hle/service/caps/caps_result.h
index 179ae48409..b7ba2a642d 100644
--- a/src/core/hle/service/caps/caps_result.h
+++ b/src/core/hle/service/caps/caps_result.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/caps/caps_sc.cpp b/src/core/hle/service/caps/caps_sc.cpp
index 59119d8ed7..92d53da9f5 100644
--- a/src/core/hle/service/caps/caps_sc.cpp
+++ b/src/core/hle/service/caps/caps_sc.cpp
@@ -10,6 +10,32 @@ namespace Service::Capture {
IScreenShotControlService::IScreenShotControlService(Core::System& system_)
: ServiceFramework{system_, "caps:sc"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {1, nullptr, "CaptureRawImage"},
+ {2, nullptr, "CaptureRawImageWithTimeout"},
+ {3, nullptr, "AttachSharedBuffer"},
+ {5, nullptr, "CaptureRawImageToAttachedSharedBuffer"},
+ {210, nullptr, "Unknown210"},
+ {1001, nullptr, "RequestTakingScreenShot"},
+ {1002, nullptr, "RequestTakingScreenShotWithTimeout"},
+ {1003, nullptr, "RequestTakingScreenShotEx"},
+ {1004, nullptr, "RequestTakingScreenShotEx1"},
+ {1009, nullptr, "CancelTakingScreenShot"},
+ {1010, nullptr, "SetTakingScreenShotCancelState"},
+ {1011, nullptr, "NotifyTakingScreenShotRefused"},
+ {1012, nullptr, "NotifyTakingScreenShotFailed"},
+ {1101, nullptr, "SetupOverlayMovieThumbnail"},
+ {1106, nullptr, "Unknown1106"},
+ {1107, nullptr, "Unknown1107"},
+ {1201, nullptr, "OpenRawScreenShotReadStream"},
+ {1202, nullptr, "CloseRawScreenShotReadStream"},
+ {1203, nullptr, "ReadRawScreenShotReadStream"},
+ {1204, nullptr, "Unknown1204"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IScreenShotControlService::~IScreenShotControlService() = default;
diff --git a/src/core/hle/service/caps/caps_sc.h b/src/core/hle/service/caps/caps_sc.h
index 422f062e59..72e947bf16 100644
--- a/src/core/hle/service/caps/caps_sc.h
+++ b/src/core/hle/service/caps/caps_sc.h
@@ -18,32 +18,6 @@ class IScreenShotControlService final : public ServiceFramework<IScreenShotContr
public:
explicit IScreenShotControlService(Core::System& system_);
~IScreenShotControlService() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{1, nullptr, "CaptureRawImage"},
- FunctionInfo{2, nullptr, "CaptureRawImageWithTimeout"},
- FunctionInfo{3, nullptr, "AttachSharedBuffer"},
- FunctionInfo{5, nullptr, "CaptureRawImageToAttachedSharedBuffer"},
- FunctionInfo{210, nullptr, "Unknown210"},
- FunctionInfo{1001, nullptr, "RequestTakingScreenShot"},
- FunctionInfo{1002, nullptr, "RequestTakingScreenShotWithTimeout"},
- FunctionInfo{1003, nullptr, "RequestTakingScreenShotEx"},
- FunctionInfo{1004, nullptr, "RequestTakingScreenShotEx1"},
- FunctionInfo{1009, nullptr, "CancelTakingScreenShot"},
- FunctionInfo{1010, nullptr, "SetTakingScreenShotCancelState"},
- FunctionInfo{1011, nullptr, "NotifyTakingScreenShotRefused"},
- FunctionInfo{1012, nullptr, "NotifyTakingScreenShotFailed"},
- FunctionInfo{1101, nullptr, "SetupOverlayMovieThumbnail"},
- FunctionInfo{1106, nullptr, "Unknown1106"},
- FunctionInfo{1107, nullptr, "Unknown1107"},
- FunctionInfo{1201, nullptr, "OpenRawScreenShotReadStream"},
- FunctionInfo{1202, nullptr, "CloseRawScreenShotReadStream"},
- FunctionInfo{1203, nullptr, "ReadRawScreenShotReadStream"},
- FunctionInfo{1204, nullptr, "Unknown1204"}
- );
};
} // namespace Service::Capture
diff --git a/src/core/hle/service/caps/caps_ss.cpp b/src/core/hle/service/caps/caps_ss.cpp
index 0c444116b7..0cd641f551 100644
--- a/src/core/hle/service/caps/caps_ss.cpp
+++ b/src/core/hle/service/caps/caps_ss.cpp
@@ -12,22 +12,22 @@
namespace Service::Capture {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IScreenShotService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{201, nullptr, "SaveScreenShot"},
- FunctionInfo{202, nullptr, "SaveEditedScreenShot"},
- FunctionInfo{203, C<&IScreenShotService::SaveScreenShotEx0>, "SaveScreenShotEx0"},
- FunctionInfo{204, nullptr, "SaveEditedScreenShotEx0"},
- FunctionInfo{206, C<&IScreenShotService::SaveEditedScreenShotEx1>, "SaveEditedScreenShotEx1"},
- FunctionInfo{208, nullptr, "SaveScreenShotOfMovieEx1"},
- FunctionInfo{1000, nullptr, "Unknown1000"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IScreenShotService::IScreenShotService(Core::System& system_,
std::shared_ptr<AlbumManager> album_manager)
: ServiceFramework{system_, "caps:ss"}, manager{album_manager} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {201, nullptr, "SaveScreenShot"},
+ {202, nullptr, "SaveEditedScreenShot"},
+ {203, C<&IScreenShotService::SaveScreenShotEx0>, "SaveScreenShotEx0"},
+ {204, nullptr, "SaveEditedScreenShotEx0"},
+ {206, C<&IScreenShotService::SaveEditedScreenShotEx1>, "SaveEditedScreenShotEx1"},
+ {208, nullptr, "SaveScreenShotOfMovieEx1"},
+ {1000, nullptr, "Unknown1000"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IScreenShotService::~IScreenShotService() = default;
diff --git a/src/core/hle/service/caps/caps_ss.h b/src/core/hle/service/caps/caps_ss.h
index 8817637fb8..78971bde0e 100644
--- a/src/core/hle/service/caps/caps_ss.h
+++ b/src/core/hle/service/caps/caps_ss.h
@@ -37,7 +37,6 @@ private:
const InBuffer<BufferAttr_HipcMapTransferAllowsNonSecure | BufferAttr_HipcMapAlias>
thumbnail_image_data_buffer);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::shared_ptr<AlbumManager> manager;
};
diff --git a/src/core/hle/service/caps/caps_su.cpp b/src/core/hle/service/caps/caps_su.cpp
index e708ddbb68..4ecfc840e4 100644
--- a/src/core/hle/service/caps/caps_su.cpp
+++ b/src/core/hle/service/caps/caps_su.cpp
@@ -15,20 +15,20 @@
namespace Service::Capture {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IScreenShotApplicationService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{32, C<&IScreenShotApplicationService::SetShimLibraryVersion>, "SetShimLibraryVersion"},
- FunctionInfo{201, nullptr, "SaveScreenShot"},
- FunctionInfo{203, C<&IScreenShotApplicationService::SaveScreenShotEx0>, "SaveScreenShotEx0"},
- FunctionInfo{205, C<&IScreenShotApplicationService::SaveScreenShotEx1>, "SaveScreenShotEx1"},
- FunctionInfo{210, nullptr, "SaveScreenShotEx2"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IScreenShotApplicationService::IScreenShotApplicationService(
Core::System& system_, std::shared_ptr<AlbumManager> album_manager)
: ServiceFramework{system_, "caps:su"}, manager{album_manager} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {32, C<&IScreenShotApplicationService::SetShimLibraryVersion>, "SetShimLibraryVersion"},
+ {201, nullptr, "SaveScreenShot"},
+ {203, C<&IScreenShotApplicationService::SaveScreenShotEx0>, "SaveScreenShotEx0"},
+ {205, C<&IScreenShotApplicationService::SaveScreenShotEx1>, "SaveScreenShotEx1"},
+ {210, nullptr, "SaveScreenShotEx2"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IScreenShotApplicationService::~IScreenShotApplicationService() = default;
diff --git a/src/core/hle/service/caps/caps_su.h b/src/core/hle/service/caps/caps_su.h
index 0fdc994a25..b7e53007ce 100644
--- a/src/core/hle/service/caps/caps_su.h
+++ b/src/core/hle/service/caps/caps_su.h
@@ -45,8 +45,8 @@ private:
const InBuffer<BufferAttr_HipcMapTransferAllowsNonSecure | BufferAttr_HipcMapAlias>
image_data_buffer);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::array<u8, screenshot_width * screenshot_height * bytes_per_pixel> image_data;
+
std::shared_ptr<AlbumManager> manager;
};
diff --git a/src/core/hle/service/caps/caps_u.cpp b/src/core/hle/service/caps/caps_u.cpp
index c1fa418e03..6472b2bac6 100644
--- a/src/core/hle/service/caps/caps_u.cpp
+++ b/src/core/hle/service/caps/caps_u.cpp
@@ -13,29 +13,29 @@
namespace Service::Capture {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IAlbumApplicationService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{32, C<&IAlbumApplicationService::SetShimLibraryVersion>, "SetShimLibraryVersion"},
- FunctionInfo{102, C<&IAlbumApplicationService::GetAlbumFileList0AafeAruidDeprecated>, "GetAlbumFileList0AafeAruidDeprecated"},
- FunctionInfo{103, nullptr, "DeleteAlbumFileByAruid"},
- FunctionInfo{104, nullptr, "GetAlbumFileSizeByAruid"},
- FunctionInfo{105, nullptr, "DeleteAlbumFileByAruidForDebug"},
- FunctionInfo{110, nullptr, "LoadAlbumScreenShotImageByAruid"},
- FunctionInfo{120, nullptr, "LoadAlbumScreenShotThumbnailImageByAruid"},
- FunctionInfo{130, nullptr, "PrecheckToCreateContentsByAruid"},
- FunctionInfo{140, nullptr, "GetAlbumFileList1AafeAruidDeprecated"},
- FunctionInfo{141, nullptr, "GetAlbumFileList2AafeUidAruidDeprecated"},
- FunctionInfo{142, C<&IAlbumApplicationService::GetAlbumFileList3AaeAruid>, "GetAlbumFileList3AaeAruid"},
- FunctionInfo{143, nullptr, "GetAlbumFileList4AaeUidAruid"},
- FunctionInfo{144, nullptr, "GetAllAlbumFileList3AaeAruid"},
- FunctionInfo{60002, nullptr, "OpenAccessorSessionForApplication"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IAlbumApplicationService::IAlbumApplicationService(Core::System& system_,
std::shared_ptr<AlbumManager> album_manager)
: ServiceFramework{system_, "caps:u"}, manager{album_manager} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {32, C<&IAlbumApplicationService::SetShimLibraryVersion>, "SetShimLibraryVersion"},
+ {102, C<&IAlbumApplicationService::GetAlbumFileList0AafeAruidDeprecated>, "GetAlbumFileList0AafeAruidDeprecated"},
+ {103, nullptr, "DeleteAlbumFileByAruid"},
+ {104, nullptr, "GetAlbumFileSizeByAruid"},
+ {105, nullptr, "DeleteAlbumFileByAruidForDebug"},
+ {110, nullptr, "LoadAlbumScreenShotImageByAruid"},
+ {120, nullptr, "LoadAlbumScreenShotThumbnailImageByAruid"},
+ {130, nullptr, "PrecheckToCreateContentsByAruid"},
+ {140, nullptr, "GetAlbumFileList1AafeAruidDeprecated"},
+ {141, nullptr, "GetAlbumFileList2AafeUidAruidDeprecated"},
+ {142, C<&IAlbumApplicationService::GetAlbumFileList3AaeAruid>, "GetAlbumFileList3AaeAruid"},
+ {143, nullptr, "GetAlbumFileList4AaeUidAruid"},
+ {144, nullptr, "GetAllAlbumFileList3AaeAruid"},
+ {60002, nullptr, "OpenAccessorSessionForApplication"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IAlbumApplicationService::~IAlbumApplicationService() = default;
diff --git a/src/core/hle/service/caps/caps_u.h b/src/core/hle/service/caps/caps_u.h
index 52e151bbe2..debae97a46 100644
--- a/src/core/hle/service/caps/caps_u.h
+++ b/src/core/hle/service/caps/caps_u.h
@@ -36,7 +36,6 @@ private:
AlbumFileDateTime end_date_time, ClientAppletResourceUserId aruid,
OutArray<ApplicationAlbumEntry, BufferAttr_HipcMapAlias> out_entries);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::shared_ptr<AlbumManager> manager = nullptr;
};
diff --git a/src/core/hle/service/cmif_types.h b/src/core/hle/service/cmif_types.h
index dad358b87c..783bce7781 100644
--- a/src/core/hle/service/cmif_types.h
+++ b/src/core/hle/service/cmif_types.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/erpt/erpt.cpp b/src/core/hle/service/erpt/erpt.cpp
index 7bed893bd7..014f1da62f 100644
--- a/src/core/hle/service/erpt/erpt.cpp
+++ b/src/core/hle/service/erpt/erpt.cpp
@@ -17,10 +17,30 @@ namespace Service::ERPT {
class ErrorReportContext final : public ServiceFramework<ErrorReportContext> {
public:
- explicit ErrorReportContext(Core::System& system_) : ServiceFramework{system_, "erpt:c"} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit ErrorReportContext(Core::System& system_) : ServiceFramework{system_, "erpt:c"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, C<&ErrorReportContext::SubmitContext>, "SubmitContext"},
+ {1, C<&ErrorReportContext::CreateReportV0>, "CreateReportV0"},
+ {2, nullptr, "SetInitialLaunchSettingsCompletionTime"},
+ {3, nullptr, "ClearInitialLaunchSettingsCompletionTime"},
+ {4, nullptr, "UpdatePowerOnTime"},
+ {5, D<&ErrorReportContext::UpdateAwakeTime>, "UpdateAwakeTime"},
+ {6, nullptr, "SubmitMultipleCategoryContext"},
+ {7, nullptr, "UpdateApplicationLaunchTime"},
+ {8, nullptr, "ClearApplicationLaunchTime"},
+ {9, nullptr, "SubmitAttachment"},
+ {10, nullptr, "CreateReportWithAttachments"},
+ {11, C<&ErrorReportContext::CreateReportV1>, "CreateReportV1"},
+ {12, C<&ErrorReportContext::CreateReport>, "CreateReport"},
+ {20, nullptr, "RegisterRunningApplet"},
+ {21, nullptr, "UnregisterRunningApplet"},
+ {22, nullptr, "UpdateAppletSuspendedDuration"},
+ {30, nullptr, "InvalidateForcedShutdownDetection"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
private:
@@ -65,41 +85,21 @@ private:
data_a.size(), data_b.size(), flag_a, flag_b);
R_SUCCEED();
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, C<&ErrorReportContext::SubmitContext>, "SubmitContext"},
- FunctionInfo{1, C<&ErrorReportContext::CreateReportV0>, "CreateReportV0"},
- FunctionInfo{2, nullptr, "SetInitialLaunchSettingsCompletionTime"},
- FunctionInfo{3, nullptr, "ClearInitialLaunchSettingsCompletionTime"},
- FunctionInfo{4, nullptr, "UpdatePowerOnTime"},
- FunctionInfo{5, D<&ErrorReportContext::UpdateAwakeTime>, "UpdateAwakeTime"},
- FunctionInfo{6, nullptr, "SubmitMultipleCategoryContext"},
- FunctionInfo{7, nullptr, "UpdateApplicationLaunchTime"},
- FunctionInfo{8, nullptr, "ClearApplicationLaunchTime"},
- FunctionInfo{9, nullptr, "SubmitAttachment"},
- FunctionInfo{10, nullptr, "CreateReportWithAttachments"},
- FunctionInfo{11, C<&ErrorReportContext::CreateReportV1>, "CreateReportV1"},
- FunctionInfo{12, C<&ErrorReportContext::CreateReport>, "CreateReport"},
- FunctionInfo{20, nullptr, "RegisterRunningApplet"},
- FunctionInfo{21, nullptr, "UnregisterRunningApplet"},
- FunctionInfo{22, nullptr, "UpdateAppletSuspendedDuration"},
- FunctionInfo{30, nullptr, "InvalidateForcedShutdownDetection"}
- );
};
class ErrorReportSession final : public ServiceFramework<ErrorReportSession> {
public:
- explicit ErrorReportSession(Core::System& system_) : ServiceFramework{system_, "erpt:r"} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit ErrorReportSession(Core::System& system_) : ServiceFramework{system_, "erpt:r"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "OpenReport"},
+ {1, nullptr, "OpenManager"},
+ {2, nullptr, "OpenAttachment"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "OpenReport"},
- FunctionInfo{1, nullptr, "OpenManager"},
- FunctionInfo{2, nullptr, "OpenAttachment"}
- );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/erpt/erpt.h b/src/core/hle/service/erpt/erpt.h
index 60094f556e..456e9af910 100644
--- a/src/core/hle/service/erpt/erpt.h
+++ b/src/core/hle/service/erpt/erpt.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/es/es.cpp b/src/core/hle/service/es/es.cpp
index 01d11183c9..432783f96e 100644
--- a/src/core/hle/service/es/es.cpp
+++ b/src/core/hle/service/es/es.cpp
@@ -19,14 +19,110 @@ constexpr Result ERROR_INVALID_RIGHTS_ID{ErrorModule::ETicket, 3};
class ETicket final : public ServiceFramework<ETicket> {
public:
explicit ETicket(Core::System& system_) : ServiceFramework{system_, "es"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {1, &ETicket::ImportTicket, "ImportTicket"},
+ {2, nullptr, "ImportTicketCertificateSet"},
+ {3, nullptr, "DeleteTicket"},
+ {4, nullptr, "DeletePersonalizedTicket"},
+ {5, nullptr, "DeleteAllCommonTicket"},
+ {6, nullptr, "DeleteAllPersonalizedTicket"},
+ {7, nullptr, "DeleteAllPersonalizedTicketEx"},
+ {8, &ETicket::GetTitleKey, "GetTitleKey"},
+ {9, &ETicket::CountCommonTicket, "CountCommonTicket"},
+ {10, &ETicket::CountPersonalizedTicket, "CountPersonalizedTicket"},
+ {11, &ETicket::ListCommonTicketRightsIds, "ListCommonTicketRightsIds"},
+ {12, &ETicket::ListPersonalizedTicketRightsIds, "ListPersonalizedTicketRightsIds"},
+ {13, nullptr, "ListMissingPersonalizedTicket"},
+ {14, &ETicket::GetCommonTicketSize, "GetCommonTicketSize"},
+ {15, &ETicket::GetPersonalizedTicketSize, "GetPersonalizedTicketSize"},
+ {16, &ETicket::GetCommonTicketData, "GetCommonTicketData"},
+ {17, &ETicket::GetPersonalizedTicketData, "GetPersonalizedTicketData"},
+ {18, nullptr, "OwnTicket"},
+ {19, nullptr, "GetTicketInfo"},
+ {20, nullptr, "ListLightTicketInfo"},
+ {21, nullptr, "SignData"},
+ {22, nullptr, "GetCommonTicketAndCertificateSize"},
+ {23, nullptr, "GetCommonTicketAndCertificateData"},
+ {24, nullptr, "ImportPrepurchaseRecord"},
+ {25, nullptr, "DeletePrepurchaseRecord"},
+ {26, nullptr, "DeleteAllPrepurchaseRecord"},
+ {27, nullptr, "CountPrepurchaseRecord"},
+ {28, nullptr, "ListPrepurchaseRecordRightsIds"},
+ {29, nullptr, "ListPrepurchaseRecordInfo"},
+ {30, nullptr, "CountTicket"},
+ {31, nullptr, "ListTicketRightsIds"},
+ {32, nullptr, "CountPrepurchaseRecordEx"},
+ {33, nullptr, "ListPrepurchaseRecordRightsIdsEx"},
+ {34, nullptr, "GetEncryptedTicketSize"},
+ {35, nullptr, "GetEncryptedTicketData"},
+ {36, nullptr, "DeleteAllInactiveELicenseRequiredPersonalizedTicket"},
+ {37, nullptr, "OwnTicket2"},
+ {38, nullptr, "OwnTicket3"},
+ {39, nullptr, "DeleteAllInactivePersonalizedTicket"},
+ {40, nullptr, "DeletePrepurchaseRecordByNintendoAccountId"},
+ {101, nullptr, "Unknown101"}, //18.0.0+
+ {102, nullptr, "Unknown102"}, //18.0.0+
+ {103, nullptr, "Unknown103"}, //18.0.0+
+ {104, nullptr, "Unknown104"}, //18.0.0+
+ {105, nullptr, "Unknown105"}, //20.0.0+
+ {201, nullptr, "Unknown201"}, //18.0.0+
+ {202, nullptr, "Unknown202"}, //18.0.0+
+ {203, nullptr, "Unknown203"}, //18.0.0+
+ {204, nullptr, "Unknown204"}, //18.0.0+
+ {205, nullptr, "Unknown205"}, //18.0.0+
+ {501, nullptr, "Unknown501"},
+ {502, nullptr, "Unknown502"},
+ {503, nullptr, "GetTitleKey"},
+ {504, nullptr, "Unknown504"},
+ {508, nullptr, "Unknown508"},
+ {509, nullptr, "Unknown509"},
+ {510, nullptr, "Unknown510"},
+ {511, nullptr, "Unknown511"},
+ {1001, nullptr, "Unknown1001"},
+ {1002, nullptr, "Unknown1001"},
+ {1003, nullptr, "Unknown1003"},
+ {1004, nullptr, "Unknown1004"},
+ {1005, nullptr, "Unknown1005"},
+ {1006, nullptr, "Unknown1006"},
+ {1007, nullptr, "Unknown1007"},
+ {1009, nullptr, "Unknown1009"},
+ {1010, nullptr, "Unknown1010"},
+ {1011, nullptr, "Unknown1011"},
+ {1012, nullptr, "Unknown1012"},
+ {1013, nullptr, "Unknown1013"},
+ {1014, nullptr, "Unknown1014"},
+ {1015, nullptr, "Unknown1015"},
+ {1016, nullptr, "Unknown1016"},
+ {1017, nullptr, "Unknown1017"},
+ {1018, nullptr, "Unknown1018"},
+ {1019, nullptr, "Unknown1019"},
+ {1020, nullptr, "Unknown1020"},
+ {1021, nullptr, "Unknown1021"},
+ {1501, nullptr, "Unknown1501"},
+ {1502, nullptr, "Unknown1502"},
+ {1503, nullptr, "Unknown1503"},
+ {1504, nullptr, "Unknown1504"},
+ {1505, nullptr, "Unknown1505"},
+ {1506, nullptr, "Unknown1506"},
+ {2000, nullptr, "Unknown2000"},
+ {2001, nullptr, "Unknown2001"},
+ {2002, nullptr, "Unknown2002"},
+ {2003, nullptr, "Unknown2003"},
+ {2100, nullptr, "Unknown2100"},
+ {2501, nullptr, "Unknown2501"},
+ {2502, nullptr, "Unknown2502"},
+ {2601, nullptr, "Unknown2601"},
+ {3001, nullptr, "Unknown3001"},
+ {3002, nullptr, "Unknown3002"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
+
keys.PopulateTickets();
keys.SynthesizeTickets();
}
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
-
private:
bool CheckRightsId(HLERequestContext& ctx, const u128& rights_id) {
if (rights_id == u128{}) {
@@ -221,185 +317,89 @@ private:
rb.Push<u64>(write_size);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{1, &ETicket::ImportTicket, "ImportTicket"},
- FunctionInfo{2, nullptr, "ImportTicketCertificateSet"},
- FunctionInfo{3, nullptr, "DeleteTicket"},
- FunctionInfo{4, nullptr, "DeletePersonalizedTicket"},
- FunctionInfo{5, nullptr, "DeleteAllCommonTicket"},
- FunctionInfo{6, nullptr, "DeleteAllPersonalizedTicket"},
- FunctionInfo{7, nullptr, "DeleteAllPersonalizedTicketEx"},
- FunctionInfo{8, &ETicket::GetTitleKey, "GetTitleKey"},
- FunctionInfo{9, &ETicket::CountCommonTicket, "CountCommonTicket"},
- FunctionInfo{10, &ETicket::CountPersonalizedTicket, "CountPersonalizedTicket"},
- FunctionInfo{11, &ETicket::ListCommonTicketRightsIds, "ListCommonTicketRightsIds"},
- FunctionInfo{12, &ETicket::ListPersonalizedTicketRightsIds, "ListPersonalizedTicketRightsIds"},
- FunctionInfo{13, nullptr, "ListMissingPersonalizedTicket"},
- FunctionInfo{14, &ETicket::GetCommonTicketSize, "GetCommonTicketSize"},
- FunctionInfo{15, &ETicket::GetPersonalizedTicketSize, "GetPersonalizedTicketSize"},
- FunctionInfo{16, &ETicket::GetCommonTicketData, "GetCommonTicketData"},
- FunctionInfo{17, &ETicket::GetPersonalizedTicketData, "GetPersonalizedTicketData"},
- FunctionInfo{18, nullptr, "OwnTicket"},
- FunctionInfo{19, nullptr, "GetTicketInfo"},
- FunctionInfo{20, nullptr, "ListLightTicketInfo"},
- FunctionInfo{21, nullptr, "SignData"},
- FunctionInfo{22, nullptr, "GetCommonTicketAndCertificateSize"},
- FunctionInfo{23, nullptr, "GetCommonTicketAndCertificateData"},
- FunctionInfo{24, nullptr, "ImportPrepurchaseRecord"},
- FunctionInfo{25, nullptr, "DeletePrepurchaseRecord"},
- FunctionInfo{26, nullptr, "DeleteAllPrepurchaseRecord"},
- FunctionInfo{27, nullptr, "CountPrepurchaseRecord"},
- FunctionInfo{28, nullptr, "ListPrepurchaseRecordRightsIds"},
- FunctionInfo{29, nullptr, "ListPrepurchaseRecordInfo"},
- FunctionInfo{30, nullptr, "CountTicket"},
- FunctionInfo{31, nullptr, "ListTicketRightsIds"},
- FunctionInfo{32, nullptr, "CountPrepurchaseRecordEx"},
- FunctionInfo{33, nullptr, "ListPrepurchaseRecordRightsIdsEx"},
- FunctionInfo{34, nullptr, "GetEncryptedTicketSize"},
- FunctionInfo{35, nullptr, "GetEncryptedTicketData"},
- FunctionInfo{36, nullptr, "DeleteAllInactiveELicenseRequiredPersonalizedTicket"},
- FunctionInfo{37, nullptr, "OwnTicket2"},
- FunctionInfo{38, nullptr, "OwnTicket3"},
- FunctionInfo{39, nullptr, "DeleteAllInactivePersonalizedTicket"},
- FunctionInfo{40, nullptr, "DeletePrepurchaseRecordByNintendoAccountId"},
- FunctionInfo{101, nullptr, "Unknown101", MakeVersionGate({18,0,0})},
- FunctionInfo{102, nullptr, "Unknown102", MakeVersionGate({18,0,0})},
- FunctionInfo{103, nullptr, "Unknown103", MakeVersionGate({18,0,0})},
- FunctionInfo{104, nullptr, "Unknown104", MakeVersionGate({18,0,0})},
- FunctionInfo{105, nullptr, "Unknown105", MakeVersionGate({20,0,0})},
- FunctionInfo{201, nullptr, "Unknown201", MakeVersionGate({18,0,0})},
- FunctionInfo{202, nullptr, "Unknown202", MakeVersionGate({18,0,0})},
- FunctionInfo{203, nullptr, "Unknown203", MakeVersionGate({18,0,0})},
- FunctionInfo{204, nullptr, "Unknown204", MakeVersionGate({18,0,0})},
- FunctionInfo{205, nullptr, "Unknown205", MakeVersionGate({18,0,0})},
- FunctionInfo{501, nullptr, "Unknown501"},
- FunctionInfo{502, nullptr, "Unknown502"},
- FunctionInfo{503, nullptr, "GetTitleKey"},
- FunctionInfo{504, nullptr, "Unknown504"},
- FunctionInfo{508, nullptr, "Unknown508"},
- FunctionInfo{509, nullptr, "Unknown509"},
- FunctionInfo{510, nullptr, "Unknown510"},
- FunctionInfo{511, nullptr, "Unknown511"},
- FunctionInfo{1001, nullptr, "Unknown1001"},
- FunctionInfo{1002, nullptr, "Unknown1001"},
- FunctionInfo{1003, nullptr, "Unknown1003"},
- FunctionInfo{1004, nullptr, "Unknown1004"},
- FunctionInfo{1005, nullptr, "Unknown1005"},
- FunctionInfo{1006, nullptr, "Unknown1006"},
- FunctionInfo{1007, nullptr, "Unknown1007"},
- FunctionInfo{1009, nullptr, "Unknown1009"},
- FunctionInfo{1010, nullptr, "Unknown1010"},
- FunctionInfo{1011, nullptr, "Unknown1011"},
- FunctionInfo{1012, nullptr, "Unknown1012"},
- FunctionInfo{1013, nullptr, "Unknown1013"},
- FunctionInfo{1014, nullptr, "Unknown1014"},
- FunctionInfo{1015, nullptr, "Unknown1015"},
- FunctionInfo{1016, nullptr, "Unknown1016"},
- FunctionInfo{1017, nullptr, "Unknown1017"},
- FunctionInfo{1018, nullptr, "Unknown1018"},
- FunctionInfo{1019, nullptr, "Unknown1019"},
- FunctionInfo{1020, nullptr, "Unknown1020"},
- FunctionInfo{1021, nullptr, "Unknown1021"},
- FunctionInfo{1501, nullptr, "Unknown1501"},
- FunctionInfo{1502, nullptr, "Unknown1502"},
- FunctionInfo{1503, nullptr, "Unknown1503"},
- FunctionInfo{1504, nullptr, "Unknown1504"},
- FunctionInfo{1505, nullptr, "Unknown1505"},
- FunctionInfo{1506, nullptr, "Unknown1506"},
- FunctionInfo{2000, nullptr, "Unknown2000"},
- FunctionInfo{2001, nullptr, "Unknown2001"},
- FunctionInfo{2002, nullptr, "Unknown2002"},
- FunctionInfo{2003, nullptr, "Unknown2003"},
- FunctionInfo{2100, nullptr, "Unknown2100"},
- FunctionInfo{2501, nullptr, "Unknown2501"},
- FunctionInfo{2502, nullptr, "Unknown2502"},
- FunctionInfo{2601, nullptr, "Unknown2601"},
- FunctionInfo{3001, nullptr, "Unknown3001"},
- FunctionInfo{3002, nullptr, "Unknown3002"}
- );
Core::Crypto::KeyManager& keys = Core::Crypto::KeyManager::Instance();
};
class NDRM_LU final : public ServiceFramework<NDRM_LU> {
public:
explicit NDRM_LU(Core::System& system_)
- : ServiceFramework{system_, "ndrm:lu"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{1, nullptr, "Cmd1"},
- FunctionInfo{2, nullptr, "Cmd2"},
- FunctionInfo{3, nullptr, "Cmd3"},
- FunctionInfo{1000, nullptr, "Cmd1000"},
- FunctionInfo{8000, nullptr, "Cmd8000"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "ndrm:lu"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {1, nullptr, "Cmd1"},
+ {2, nullptr, "Cmd2"},
+ {3, nullptr, "Cmd3"},
+ {1000, nullptr, "Cmd1000"},
+ {8000, nullptr, "Cmd8000"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class NDRM_LA final : public ServiceFramework<NDRM_LA> {
public:
explicit NDRM_LA(Core::System& system_)
- : ServiceFramework{system_, "ndrm:la"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{1, nullptr, "Cmd1"},
- FunctionInfo{2, nullptr, "Cmd2"},
- FunctionInfo{3, nullptr, "Cmd3"},
- FunctionInfo{4, nullptr, "Cmd4"},
- FunctionInfo{5, nullptr, "Cmd5"},
- FunctionInfo{6, nullptr, "Cmd6"},
- FunctionInfo{7, nullptr, "Cmd7"},
- FunctionInfo{8, nullptr, "Cmd8"},
- FunctionInfo{9, nullptr, "Cmd9"},
- FunctionInfo{10, nullptr, "Cmd10"},
- FunctionInfo{11, nullptr, "Cmd11"},
- FunctionInfo{12, nullptr, "Cmd12"},
- FunctionInfo{13, nullptr, "Cmd13"},
- FunctionInfo{14, nullptr, "Cmd14"},
- FunctionInfo{15, nullptr, "Cmd15"},
- FunctionInfo{16, nullptr, "Cmd16"},
- FunctionInfo{17, nullptr, "Cmd17"},
- FunctionInfo{18, nullptr, "Cmd18"},
- FunctionInfo{19, nullptr, "Cmd19"},
- FunctionInfo{20, nullptr, "Cmd20"},
- FunctionInfo{21, nullptr, "Cmd21"},
- FunctionInfo{22, nullptr, "Cmd22"},
- FunctionInfo{23, nullptr, "Cmd23"},
- FunctionInfo{24, nullptr, "Cmd24"},
- FunctionInfo{25, nullptr, "Cmd25"},
- FunctionInfo{26, nullptr, "Cmd26"},
- FunctionInfo{27, nullptr, "Cmd27"},
- FunctionInfo{28, nullptr, "Cmd28"},
- FunctionInfo{29, nullptr, "Cmd29"},
- FunctionInfo{30, nullptr, "Cmd30"},
- FunctionInfo{31, nullptr, "Cmd31"},
- FunctionInfo{32, nullptr, "Cmd32"},
- FunctionInfo{33, nullptr, "Cmd33"},
- FunctionInfo{34, nullptr, "Cmd34"},
- FunctionInfo{35, nullptr, "Cmd35"},
- FunctionInfo{36, nullptr, "Cmd36"},
- FunctionInfo{37, nullptr, "Cmd37"},
- FunctionInfo{38, nullptr, "Cmd38"},
- FunctionInfo{39, nullptr, "Cmd39"},
- FunctionInfo{40, nullptr, "Cmd40"},
- FunctionInfo{42, nullptr, "Cmd42"},
- FunctionInfo{43, nullptr, "Cmd43"},
- FunctionInfo{44, nullptr, "Cmd44"},
- FunctionInfo{45, nullptr, "Cmd45"},
- FunctionInfo{46, nullptr, "Cmd46"},
- FunctionInfo{47, nullptr, "Cmd47"},
- FunctionInfo{48, nullptr, "Cmd48"},
- FunctionInfo{49, nullptr, "Cmd49"},
- FunctionInfo{50, nullptr, "Cmd50"},
- FunctionInfo{51, nullptr, "Cmd51"},
- FunctionInfo{8000, nullptr, "Cmd8000"},
- FunctionInfo{8001, nullptr, "Cmd8001"},
- FunctionInfo{8002, nullptr, "Cmd8002"},
- FunctionInfo{8003, nullptr, "Cmd8003"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "ndrm:la"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {1, nullptr, "Cmd1"},
+ {2, nullptr, "Cmd2"},
+ {3, nullptr, "Cmd3"},
+ {4, nullptr, "Cmd4"},
+ {5, nullptr, "Cmd5"},
+ {6, nullptr, "Cmd6"},
+ {7, nullptr, "Cmd7"},
+ {8, nullptr, "Cmd8"},
+ {9, nullptr, "Cmd9"},
+ {10, nullptr, "Cmd10"},
+ {11, nullptr, "Cmd11"},
+ {12, nullptr, "Cmd12"},
+ {13, nullptr, "Cmd13"},
+ {14, nullptr, "Cmd14"},
+ {15, nullptr, "Cmd15"},
+ {16, nullptr, "Cmd16"},
+ {17, nullptr, "Cmd17"},
+ {18, nullptr, "Cmd18"},
+ {19, nullptr, "Cmd19"},
+ {20, nullptr, "Cmd20"},
+ {21, nullptr, "Cmd21"},
+ {22, nullptr, "Cmd22"},
+ {23, nullptr, "Cmd23"},
+ {24, nullptr, "Cmd24"},
+ {25, nullptr, "Cmd25"},
+ {26, nullptr, "Cmd26"},
+ {27, nullptr, "Cmd27"},
+ {28, nullptr, "Cmd28"},
+ {29, nullptr, "Cmd29"},
+ {30, nullptr, "Cmd30"},
+ {31, nullptr, "Cmd31"},
+ {32, nullptr, "Cmd32"},
+ {33, nullptr, "Cmd33"},
+ {34, nullptr, "Cmd34"},
+ {35, nullptr, "Cmd35"},
+ {36, nullptr, "Cmd36"},
+ {37, nullptr, "Cmd37"},
+ {38, nullptr, "Cmd38"},
+ {39, nullptr, "Cmd39"},
+ {40, nullptr, "Cmd40"},
+ {42, nullptr, "Cmd42"},
+ {43, nullptr, "Cmd43"},
+ {44, nullptr, "Cmd44"},
+ {45, nullptr, "Cmd45"},
+ {46, nullptr, "Cmd46"},
+ {47, nullptr, "Cmd47"},
+ {48, nullptr, "Cmd48"},
+ {49, nullptr, "Cmd49"},
+ {50, nullptr, "Cmd50"},
+ {51, nullptr, "Cmd51"},
+ {8000, nullptr, "Cmd8000"},
+ {8001, nullptr, "Cmd8001"},
+ {8002, nullptr, "Cmd8002"},
+ {8003, nullptr, "Cmd8003"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
diff --git a/src/core/hle/service/es/es.h b/src/core/hle/service/es/es.h
index 3176806252..215aadb98f 100644
--- a/src/core/hle/service/es/es.h
+++ b/src/core/hle/service/es/es.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/eupld/eupld.cpp b/src/core/hle/service/eupld/eupld.cpp
index ed1e1c19c5..9b26ae9c83 100644
--- a/src/core/hle/service/eupld/eupld.cpp
+++ b/src/core/hle/service/eupld/eupld.cpp
@@ -14,34 +14,36 @@ namespace Service::EUPLD {
class ErrorUploadContext final : public ServiceFramework<ErrorUploadContext> {
public:
- explicit ErrorUploadContext(Core::System& system_) : ServiceFramework{system_, "eupld:c"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "SetUrl"},
- FunctionInfo{1, nullptr, "ImportCrt"},
- FunctionInfo{2, nullptr, "ImportPki"},
- FunctionInfo{3, nullptr, "SetAutoUpload"},
- FunctionInfo{4, nullptr, "GetAutoUpload"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit ErrorUploadContext(Core::System& system_) : ServiceFramework{system_, "eupld:c"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "SetUrl"},
+ {1, nullptr, "ImportCrt"},
+ {2, nullptr, "ImportPki"},
+ {3, nullptr, "SetAutoUpload"},
+ {4, nullptr, "GetAutoUpload"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
class ErrorUploadRequest final : public ServiceFramework<ErrorUploadRequest> {
public:
- explicit ErrorUploadRequest(Core::System& system_) : ServiceFramework{system_, "eupld:r"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "Initialize"},
- FunctionInfo{1, nullptr, "UploadAll"},
- FunctionInfo{2, nullptr, "UploadSelected"},
- FunctionInfo{3, nullptr, "GetUploadStatus"},
- FunctionInfo{4, nullptr, "CancelUpload"},
- FunctionInfo{5, nullptr, "GetResult"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit ErrorUploadRequest(Core::System& system_) : ServiceFramework{system_, "eupld:r"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "Initialize"},
+ {1, nullptr, "UploadAll"},
+ {2, nullptr, "UploadSelected"},
+ {3, nullptr, "GetUploadStatus"},
+ {4, nullptr, "CancelUpload"},
+ {5, nullptr, "GetResult"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
diff --git a/src/core/hle/service/eupld/eupld.h b/src/core/hle/service/eupld/eupld.h
index 8eb0a5b4f2..851e286733 100644
--- a/src/core/hle/service/eupld/eupld.h
+++ b/src/core/hle/service/eupld/eupld.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/fatal/fatal.cpp b/src/core/hle/service/fatal/fatal.cpp
index 4c9eca5d5b..db48526614 100644
--- a/src/core/hle/service/fatal/fatal.cpp
+++ b/src/core/hle/service/fatal/fatal.cpp
@@ -13,6 +13,8 @@
#include "common/swap.h"
#include "core/core.h"
#include "core/hle/service/fatal/fatal.h"
+#include "core/hle/service/fatal/fatal_p.h"
+#include "core/hle/service/fatal/fatal_u.h"
#include "core/hle/service/ipc_helpers.h"
#include "core/hle/service/server_manager.h"
#include "core/reporter.h"
@@ -165,35 +167,6 @@ void Module::Interface::ThrowFatalWithCpuContext(HLERequestContext& ctx) {
rb.Push(ResultSuccess);
}
-class Fatal_P final : public Module::Interface {
-public:
- explicit Fatal_P(std::shared_ptr<Module> module_, Core::System& system_) : Interface(std::move(module_), system_, "fatal:p") {}
- ~Fatal_P() override = default;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetFatalEvent"},
- FunctionInfo{10, nullptr, "GetFatalContext"}
- );
-};
-
-class Fatal_U final : public Module::Interface {
-public:
- explicit Fatal_U(std::shared_ptr<Module> module_, Core::System& system_) : Interface(std::move(module_), system_, "fatal:u") {}
- ~Fatal_U() override = default;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &Fatal_U::ThrowFatal, "ThrowFatal"},
- FunctionInfo{1, &Fatal_U::ThrowFatalWithPolicy, "ThrowFatalWithPolicy"},
- FunctionInfo{2, &Fatal_U::ThrowFatalWithCpuContext, "ThrowFatalWithCpuContext"}
- );
-};
-
void LoopProcess(Core::System& system) {
auto server_manager = std::make_unique<ServerManager>(system);
auto module = std::make_shared<Module>();
diff --git a/src/core/hle/service/fatal/fatal.h b/src/core/hle/service/fatal/fatal.h
index f1c1104060..176ad8d0d9 100644
--- a/src/core/hle/service/fatal/fatal.h
+++ b/src/core/hle/service/fatal/fatal.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/fatal/fatal_p.cpp b/src/core/hle/service/fatal/fatal_p.cpp
new file mode 100644
index 0000000000..345743d6bc
--- /dev/null
+++ b/src/core/hle/service/fatal/fatal_p.cpp
@@ -0,0 +1,22 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/fatal/fatal_p.h"
+
+namespace Service::Fatal {
+
+Fatal_P::Fatal_P(std::shared_ptr<Module> module_, Core::System& system_)
+ : Interface(std::move(module_), system_, "fatal:p") {
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetFatalEvent"},
+ {10, nullptr, "GetFatalContext"},
+ };
+ RegisterHandlers(functions);
+}
+
+Fatal_P::~Fatal_P() = default;
+
+} // namespace Service::Fatal
diff --git a/src/core/hle/service/fatal/fatal_p.h b/src/core/hle/service/fatal/fatal_p.h
new file mode 100644
index 0000000000..ea2183c125
--- /dev/null
+++ b/src/core/hle/service/fatal/fatal_p.h
@@ -0,0 +1,19 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/fatal/fatal.h"
+
+namespace Service::Fatal {
+
+class Fatal_P final : public Module::Interface {
+public:
+ explicit Fatal_P(std::shared_ptr<Module> module_, Core::System& system_);
+ ~Fatal_P() override;
+};
+
+} // namespace Service::Fatal
diff --git a/src/core/hle/service/fatal/fatal_u.cpp b/src/core/hle/service/fatal/fatal_u.cpp
new file mode 100644
index 0000000000..b2850c3e62
--- /dev/null
+++ b/src/core/hle/service/fatal/fatal_u.cpp
@@ -0,0 +1,23 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/fatal/fatal_u.h"
+
+namespace Service::Fatal {
+
+Fatal_U::Fatal_U(std::shared_ptr<Module> module_, Core::System& system_)
+ : Interface(std::move(module_), system_, "fatal:u") {
+ static const FunctionInfo functions[] = {
+ {0, &Fatal_U::ThrowFatal, "ThrowFatal"},
+ {1, &Fatal_U::ThrowFatalWithPolicy, "ThrowFatalWithPolicy"},
+ {2, &Fatal_U::ThrowFatalWithCpuContext, "ThrowFatalWithCpuContext"},
+ };
+ RegisterHandlers(functions);
+}
+
+Fatal_U::~Fatal_U() = default;
+
+} // namespace Service::Fatal
diff --git a/src/core/hle/service/fatal/fatal_u.h b/src/core/hle/service/fatal/fatal_u.h
new file mode 100644
index 0000000000..4d193857d0
--- /dev/null
+++ b/src/core/hle/service/fatal/fatal_u.h
@@ -0,0 +1,19 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/fatal/fatal.h"
+
+namespace Service::Fatal {
+
+class Fatal_U final : public Module::Interface {
+public:
+ explicit Fatal_U(std::shared_ptr<Module> module_, Core::System& system_);
+ ~Fatal_U() override;
+};
+
+} // namespace Service::Fatal
diff --git a/src/core/hle/service/fgm/fgm.cpp b/src/core/hle/service/fgm/fgm.cpp
index 96ea3478ea..cac03ae24c 100644
--- a/src/core/hle/service/fgm/fgm.cpp
+++ b/src/core/hle/service/fgm/fgm.cpp
@@ -16,26 +16,30 @@ namespace Service::FGM {
class IRequest final : public ServiceFramework<IRequest> {
public:
- explicit IRequest(Core::System& system_) : ServiceFramework{system_, "IRequest"} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit IRequest(Core::System& system_) : ServiceFramework{system_, "IRequest"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "Initialize"},
+ {1, nullptr, "Set"},
+ {2, nullptr, "Get"},
+ {3, nullptr, "Cancel"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "Initialize"},
- FunctionInfo{1, nullptr, "Set"},
- FunctionInfo{2, nullptr, "Get"},
- FunctionInfo{3, nullptr, "Cancel"}
- );
};
class FGM final : public ServiceFramework<FGM> {
public:
- explicit FGM(Core::System& system_, const char* name) : ServiceFramework{system_, name} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit FGM(Core::System& system_, const char* name) : ServiceFramework{system_, name} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &FGM::Initialize, "Initialize"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
private:
@@ -46,25 +50,21 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<IRequest>(ctx, system);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &FGM::Initialize, "Initialize"}
- );
};
class FGM_DBG final : public ServiceFramework<FGM_DBG> {
public:
- explicit FGM_DBG(Core::System& system_) : ServiceFramework{system_, "fgm:dbg"} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit FGM_DBG(Core::System& system_) : ServiceFramework{system_, "fgm:dbg"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "Initialize"},
+ {1, nullptr, "Read"},
+ {2, nullptr, "Cancel"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "Initialize"},
- FunctionInfo{1, nullptr, "Read"},
- FunctionInfo{2, nullptr, "Cancel"}
- );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/fgm/fgm.h b/src/core/hle/service/fgm/fgm.h
index 9d2465c0fb..89ef7096bb 100644
--- a/src/core/hle/service/fgm/fgm.h
+++ b/src/core/hle/service/fgm/fgm.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/filesystem/fsp/fs_i_directory.cpp b/src/core/hle/service/filesystem/fsp/fs_i_directory.cpp
index 793b86cc51..c4e3c81f22 100644
--- a/src/core/hle/service/filesystem/fsp/fs_i_directory.cpp
+++ b/src/core/hle/service/filesystem/fsp/fs_i_directory.cpp
@@ -11,18 +11,15 @@
namespace Service::FileSystem {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IDirectory::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IDirectory::Read>, "Read"},
- FunctionInfo{1, D<&IDirectory::GetEntryCount>, "GetEntryCount"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IDirectory::IDirectory(Core::System& system_, FileSys::VirtualDir directory_,
FileSys::OpenDirectoryMode mode)
: ServiceFramework{system_, "IDirectory"},
backend(std::make_unique<FileSys::Fsa::IDirectory>(directory_, mode)) {
+ static const FunctionInfo functions[] = {
+ {0, D<&IDirectory::Read>, "Read"},
+ {1, D<&IDirectory::GetEntryCount>, "GetEntryCount"},
+ };
+ RegisterHandlers(functions);
}
Result IDirectory::Read(
diff --git a/src/core/hle/service/filesystem/fsp/fs_i_directory.h b/src/core/hle/service/filesystem/fsp/fs_i_directory.h
index f2a57260e1..79256604f3 100644
--- a/src/core/hle/service/filesystem/fsp/fs_i_directory.h
+++ b/src/core/hle/service/filesystem/fsp/fs_i_directory.h
@@ -29,8 +29,6 @@ private:
Result Read(Out<s64> out_count,
const OutArray<FileSys::DirectoryEntry, BufferAttr_HipcMapAlias> out_entries);
Result GetEntryCount(Out<s64> out_count);
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::FileSystem
diff --git a/src/core/hle/service/filesystem/fsp/fs_i_file.cpp b/src/core/hle/service/filesystem/fsp/fs_i_file.cpp
index 78ca90a4af..22cbe2be2c 100644
--- a/src/core/hle/service/filesystem/fsp/fs_i_file.cpp
+++ b/src/core/hle/service/filesystem/fsp/fs_i_file.cpp
@@ -12,6 +12,18 @@ namespace Service::FileSystem {
IFile::IFile(Core::System& system_, FileSys::VirtualFile file_)
: ServiceFramework{system_, "IFile"}, backend{std::make_unique<FileSys::Fsa::IFile>(file_)} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IFile::Read>, "Read"},
+ {1, D<&IFile::Write>, "Write"},
+ {2, D<&IFile::Flush>, "Flush"},
+ {3, D<&IFile::SetSize>, "SetSize"},
+ {4, D<&IFile::GetSize>, "GetSize"},
+ {5, nullptr, "OperateRange"},
+ {6, nullptr, "OperateRangeWithBuffer"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
Result IFile::Read(
diff --git a/src/core/hle/service/filesystem/fsp/fs_i_file.h b/src/core/hle/service/filesystem/fsp/fs_i_file.h
index 992330e149..14348f7fc6 100644
--- a/src/core/hle/service/filesystem/fsp/fs_i_file.h
+++ b/src/core/hle/service/filesystem/fsp/fs_i_file.h
@@ -30,19 +30,6 @@ private:
Result Flush();
Result SetSize(s64 size);
Result GetSize(Out<s64> out_size);
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IFile::Read>, "Read"},
- FunctionInfo{1, D<&IFile::Write>, "Write"},
- FunctionInfo{2, D<&IFile::Flush>, "Flush"},
- FunctionInfo{3, D<&IFile::SetSize>, "SetSize"},
- FunctionInfo{4, D<&IFile::GetSize>, "GetSize"},
- FunctionInfo{5, nullptr, "OperateRange"},
- FunctionInfo{6, nullptr, "OperateRangeWithBuffer"}
- );
};
} // namespace Service::FileSystem
diff --git a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp
index 6ab4916a36..edd381f57c 100644
--- a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp
+++ b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp
@@ -13,33 +13,30 @@
namespace Service::FileSystem {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IFileSystem::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IFileSystem::CreateFile>, "CreateFile"},
- FunctionInfo{1, D<&IFileSystem::DeleteFile>, "DeleteFile"},
- FunctionInfo{2, D<&IFileSystem::CreateDirectory>, "CreateDirectory"},
- FunctionInfo{3, D<&IFileSystem::DeleteDirectory>, "DeleteDirectory"},
- FunctionInfo{4, D<&IFileSystem::DeleteDirectoryRecursively>, "DeleteDirectoryRecursively"},
- FunctionInfo{5, D<&IFileSystem::RenameFile>, "RenameFile"},
- FunctionInfo{6, D<&IFileSystem::RenameDirectory>, "RenameDirectory"},
- FunctionInfo{7, D<&IFileSystem::GetEntryType>, "GetEntryType"},
- FunctionInfo{8, D<&IFileSystem::OpenFile>, "OpenFile"},
- FunctionInfo{9, D<&IFileSystem::OpenDirectory>, "OpenDirectory"},
- FunctionInfo{10, D<&IFileSystem::Commit>, "Commit"},
- FunctionInfo{11, D<&IFileSystem::GetFreeSpaceSize>, "GetFreeSpaceSize"},
- FunctionInfo{12, D<&IFileSystem::GetTotalSpaceSize>, "GetTotalSpaceSize"},
- FunctionInfo{13, D<&IFileSystem::CleanDirectoryRecursively>, "CleanDirectoryRecursively"},
- FunctionInfo{14, D<&IFileSystem::GetFileTimeStampRaw>, "GetFileTimeStampRaw"},
- FunctionInfo{15, nullptr, "QueryEntry"},
- FunctionInfo{16, D<&IFileSystem::GetFileSystemAttribute>, "GetFileSystemAttribute"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IFileSystem::IFileSystem(Core::System& system_, FileSys::VirtualDir dir_, SizeGetter size_getter_)
: ServiceFramework{system_, "IFileSystem"}, backend{std::make_unique<FileSys::Fsa::IFileSystem>(
dir_)},
size_getter{std::move(size_getter_)} {
+ static const FunctionInfo functions[] = {
+ {0, D<&IFileSystem::CreateFile>, "CreateFile"},
+ {1, D<&IFileSystem::DeleteFile>, "DeleteFile"},
+ {2, D<&IFileSystem::CreateDirectory>, "CreateDirectory"},
+ {3, D<&IFileSystem::DeleteDirectory>, "DeleteDirectory"},
+ {4, D<&IFileSystem::DeleteDirectoryRecursively>, "DeleteDirectoryRecursively"},
+ {5, D<&IFileSystem::RenameFile>, "RenameFile"},
+ {6, D<&IFileSystem::RenameDirectory>, "RenameDirectory"},
+ {7, D<&IFileSystem::GetEntryType>, "GetEntryType"},
+ {8, D<&IFileSystem::OpenFile>, "OpenFile"},
+ {9, D<&IFileSystem::OpenDirectory>, "OpenDirectory"},
+ {10, D<&IFileSystem::Commit>, "Commit"},
+ {11, D<&IFileSystem::GetFreeSpaceSize>, "GetFreeSpaceSize"},
+ {12, D<&IFileSystem::GetTotalSpaceSize>, "GetTotalSpaceSize"},
+ {13, D<&IFileSystem::CleanDirectoryRecursively>, "CleanDirectoryRecursively"},
+ {14, D<&IFileSystem::GetFileTimeStampRaw>, "GetFileTimeStampRaw"},
+ {15, nullptr, "QueryEntry"},
+ {16, D<&IFileSystem::GetFileSystemAttribute>, "GetFileSystemAttribute"},
+ };
+ RegisterHandlers(functions);
}
Result IFileSystem::CreateFile(const InLargeData<FileSys::Sf::Path, BufferAttr_HipcPointer> path,
diff --git a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.h b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.h
index 11d3c7fb31..ed03c3ef83 100644
--- a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.h
+++ b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.h
@@ -58,7 +58,6 @@ public:
Result GetFileSystemAttribute(Out<FileSys::FileSystemAttribute> out_attribute);
private:
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::unique_ptr<FileSys::Fsa::IFileSystem> backend;
SizeGetter size_getter;
};
diff --git a/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.cpp b/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.cpp
index f6eac6ca10..4af0a4ea2d 100644
--- a/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.cpp
+++ b/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.cpp
@@ -12,6 +12,11 @@ namespace Service::FileSystem {
IMultiCommitManager::IMultiCommitManager(Core::System& system_)
: ServiceFramework{system_, "IMultiCommitManager"} {
+ static const FunctionInfo functions[] = {
+ {1, D<&IMultiCommitManager::Add>, "Add"},
+ {2, D<&IMultiCommitManager::Commit>, "Commit"},
+ };
+ RegisterHandlers(functions);
}
IMultiCommitManager::~IMultiCommitManager() = default;
diff --git a/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.h b/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.h
index 31182e9159..3ebeb2cb0a 100644
--- a/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.h
+++ b/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.h
@@ -20,13 +20,6 @@ private:
Result Add(std::shared_ptr<IFileSystem> filesystem);
Result Commit();
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{1, D<&IMultiCommitManager::Add>, "Add"},
- FunctionInfo{2, D<&IMultiCommitManager::Commit>, "Commit"}
- );
FileSys::VirtualFile backend;
};
diff --git a/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.cpp b/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.cpp
index 8353b72c24..0cac094caf 100644
--- a/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.cpp
+++ b/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.cpp
@@ -17,6 +17,11 @@ ISaveDataInfoReader::ISaveDataInfoReader(Core::System& system_,
FileSys::SaveDataSpaceId space)
: ServiceFramework{system_, "ISaveDataInfoReader"}, save_data_controller{
save_data_controller_} {
+ static const FunctionInfo functions[] = {
+ {0, D<&ISaveDataInfoReader::ReadSaveDataInfo>, "ReadSaveDataInfo"},
+ };
+ RegisterHandlers(functions);
+
FindAllSaves(space);
}
diff --git a/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.h b/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.h
index 7faa4291c0..d2b8eb97cf 100644
--- a/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.h
+++ b/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.h
@@ -45,12 +45,6 @@ private:
void FindNormalSaves(FileSys::SaveDataSpaceId space, const FileSys::VirtualDir& type);
void FindTemporaryStorageSaves(FileSys::SaveDataSpaceId space, const FileSys::VirtualDir& type);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&ISaveDataInfoReader::ReadSaveDataInfo>, "ReadSaveDataInfo"}
- );
std::shared_ptr<SaveDataController> save_data_controller;
std::vector<SaveDataInfo> info;
u64 next_entry_index = 0;
diff --git a/src/core/hle/service/filesystem/fsp/fs_i_storage.cpp b/src/core/hle/service/filesystem/fsp/fs_i_storage.cpp
index ac884b3b28..50b7d1e765 100644
--- a/src/core/hle/service/filesystem/fsp/fs_i_storage.cpp
+++ b/src/core/hle/service/filesystem/fsp/fs_i_storage.cpp
@@ -12,6 +12,15 @@ namespace Service::FileSystem {
IStorage::IStorage(Core::System& system_, FileSys::VirtualFile backend_)
: ServiceFramework{system_, "IStorage"}, backend(std::move(backend_)) {
+ static const FunctionInfo functions[] = {
+ {0, D<&IStorage::Read>, "Read"},
+ {1, nullptr, "Write"},
+ {2, nullptr, "Flush"},
+ {3, nullptr, "SetSize"},
+ {4, D<&IStorage::GetSize>, "GetSize"},
+ {5, nullptr, "OperateRange"},
+ };
+ RegisterHandlers(functions);
}
Result IStorage::Read(
diff --git a/src/core/hle/service/filesystem/fsp/fs_i_storage.h b/src/core/hle/service/filesystem/fsp/fs_i_storage.h
index 44d5a6c8bb..e676c52220 100644
--- a/src/core/hle/service/filesystem/fsp/fs_i_storage.h
+++ b/src/core/hle/service/filesystem/fsp/fs_i_storage.h
@@ -18,23 +18,12 @@ public:
explicit IStorage(Core::System& system_, FileSys::VirtualFile backend_);
private:
+ FileSys::VirtualFile backend;
+
Result Read(
OutBuffer<BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_bytes,
s64 offset, s64 length);
Result GetSize(Out<u64> out_size);
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IStorage::Read>, "Read"},
- FunctionInfo{1, nullptr, "Write"},
- FunctionInfo{2, nullptr, "Flush"},
- FunctionInfo{3, nullptr, "SetSize"},
- FunctionInfo{4, D<&IStorage::GetSize>, "GetSize"},
- FunctionInfo{5, nullptr, "OperateRange"}
- );
- FileSys::VirtualFile backend;
};
} // namespace Service::FileSystem
diff --git a/src/core/hle/service/filesystem/fsp/fsp_ldr.cpp b/src/core/hle/service/filesystem/fsp/fsp_ldr.cpp
index 1f83d6509b..1dcacb0231 100644
--- a/src/core/hle/service/filesystem/fsp/fsp_ldr.cpp
+++ b/src/core/hle/service/filesystem/fsp/fsp_ldr.cpp
@@ -9,6 +9,15 @@
namespace Service::FileSystem {
FSP_LDR::FSP_LDR(Core::System& system_) : ServiceFramework{system_, "fsp:ldr"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "OpenCodeFileSystem"},
+ {1, nullptr, "IsArchivedProgram"},
+ {2, nullptr, "SetCurrentProcess"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
FSP_LDR::~FSP_LDR() = default;
diff --git a/src/core/hle/service/filesystem/fsp/fsp_ldr.h b/src/core/hle/service/filesystem/fsp/fsp_ldr.h
index fe3abeff1d..b642efe7ad 100644
--- a/src/core/hle/service/filesystem/fsp/fsp_ldr.h
+++ b/src/core/hle/service/filesystem/fsp/fsp_ldr.h
@@ -18,15 +18,6 @@ class FSP_LDR final : public ServiceFramework<FSP_LDR> {
public:
explicit FSP_LDR(Core::System& system_);
~FSP_LDR() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "OpenCodeFileSystem"},
- FunctionInfo{1, nullptr, "IsArchivedProgram"},
- FunctionInfo{2, nullptr, "SetCurrentProcess"}
- );
};
} // namespace Service::FileSystem
diff --git a/src/core/hle/service/filesystem/fsp/fsp_pr.cpp b/src/core/hle/service/filesystem/fsp/fsp_pr.cpp
index 9378e6e0c6..e7941ef9c9 100644
--- a/src/core/hle/service/filesystem/fsp/fsp_pr.cpp
+++ b/src/core/hle/service/filesystem/fsp/fsp_pr.cpp
@@ -9,6 +9,16 @@
namespace Service::FileSystem {
FSP_PR::FSP_PR(Core::System& system_) : ServiceFramework{system_, "fsp:pr"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "RegisterProgram"},
+ {1, nullptr, "UnregisterProgram"},
+ {2, nullptr, "SetCurrentProcess"},
+ {256, nullptr, "SetEnabledProgramVerification"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
FSP_PR::~FSP_PR() = default;
diff --git a/src/core/hle/service/filesystem/fsp/fsp_pr.h b/src/core/hle/service/filesystem/fsp/fsp_pr.h
index bc692151a5..175a3c7a23 100644
--- a/src/core/hle/service/filesystem/fsp/fsp_pr.h
+++ b/src/core/hle/service/filesystem/fsp/fsp_pr.h
@@ -18,16 +18,6 @@ class FSP_PR final : public ServiceFramework<FSP_PR> {
public:
explicit FSP_PR(Core::System& system_);
~FSP_PR() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "RegisterProgram"},
- FunctionInfo{1, nullptr, "UnregisterProgram"},
- FunctionInfo{2, nullptr, "SetCurrentProcess"},
- FunctionInfo{256, nullptr, "SetEnabledProgramVerification"}
- );
};
} // namespace Service::FileSystem
diff --git a/src/core/hle/service/filesystem/fsp/fsp_srv.cpp b/src/core/hle/service/filesystem/fsp/fsp_srv.cpp
index cb349636d5..58303a0bd6 100644
--- a/src/core/hle/service/filesystem/fsp/fsp_srv.cpp
+++ b/src/core/hle/service/filesystem/fsp/fsp_srv.cpp
@@ -47,142 +47,143 @@
namespace Service::FileSystem {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> FSP_SRV::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "OpenFileSystem"},
- FunctionInfo{1, D<&FSP_SRV::SetCurrentProcess>, "SetCurrentProcess"},
- FunctionInfo{2, D<&FSP_SRV::OpenDataFileSystemByCurrentProcess>, "OpenDataFileSystemByCurrentProcess"},
- FunctionInfo{7, D<&FSP_SRV::OpenFileSystemWithPatch>, "OpenFileSystemWithPatch"},
- FunctionInfo{8, nullptr, "OpenFileSystemWithId"},
- FunctionInfo{9, nullptr, "OpenDataFileSystemByApplicationId"},
- FunctionInfo{11, nullptr, "OpenBisFileSystem"},
- FunctionInfo{12, nullptr, "OpenBisStorage"},
- FunctionInfo{13, nullptr, "InvalidateBisCache"},
- FunctionInfo{17, nullptr, "OpenHostFileSystem"},
- FunctionInfo{18, D<&FSP_SRV::OpenSdCardFileSystem>, "OpenSdCardFileSystem"},
- FunctionInfo{19, nullptr, "FormatSdCardFileSystem"},
- FunctionInfo{21, nullptr, "DeleteSaveDataFileSystem"},
- FunctionInfo{22, D<&FSP_SRV::CreateSaveDataFileSystem>, "CreateSaveDataFileSystem"},
- FunctionInfo{23, D<&FSP_SRV::CreateSaveDataFileSystemBySystemSaveDataId>, "CreateSaveDataFileSystemBySystemSaveDataId"},
- FunctionInfo{24, nullptr, "RegisterSaveDataFileSystemAtomicDeletion"},
- FunctionInfo{25, nullptr, "DeleteSaveDataFileSystemBySaveDataSpaceId"},
- FunctionInfo{26, nullptr, "FormatSdCardDryRun"},
- FunctionInfo{27, D<&FSP_SRV::IsExFatSupported>, "IsExFatSupported"},
- FunctionInfo{28, nullptr, "DeleteSaveDataFileSystemBySaveDataAttribute"},
- FunctionInfo{30, nullptr, "OpenGameCardStorage"},
- FunctionInfo{31, nullptr, "OpenGameCardFileSystem"},
- FunctionInfo{32, D<&FSP_SRV::ExtendSaveDataFileSystem>, "ExtendSaveDataFileSystem"},
- FunctionInfo{33, nullptr, "DeleteCacheStorage"},
- FunctionInfo{34, D<&FSP_SRV::GetCacheStorageSize>, "GetCacheStorageSize"},
- FunctionInfo{35, nullptr, "CreateSaveDataFileSystemByHashSalt"},
- FunctionInfo{36, nullptr, "OpenHostFileSystemWithOption"},
- FunctionInfo{37, D<&FSP_SRV::CreateSaveDataFileSystemWithCreationInfo2>, "CreateSaveDataFileSystemWithCreationInfo2"},
- FunctionInfo{51, D<&FSP_SRV::OpenSaveDataFileSystem>, "OpenSaveDataFileSystem"},
- FunctionInfo{52, D<&FSP_SRV::OpenSaveDataFileSystemBySystemSaveDataId>, "OpenSaveDataFileSystemBySystemSaveDataId"},
- FunctionInfo{53, D<&FSP_SRV::OpenReadOnlySaveDataFileSystem>, "OpenReadOnlySaveDataFileSystem"},
- FunctionInfo{57, D<&FSP_SRV::ReadSaveDataFileSystemExtraDataBySaveDataSpaceId>, "ReadSaveDataFileSystemExtraDataBySaveDataSpaceId"},
- FunctionInfo{58, D<&FSP_SRV::ReadSaveDataFileSystemExtraData>, "ReadSaveDataFileSystemExtraData"},
- FunctionInfo{59, D<&FSP_SRV::WriteSaveDataFileSystemExtraData>, "WriteSaveDataFileSystemExtraData"},
- FunctionInfo{60, nullptr, "OpenSaveDataInfoReader"},
- FunctionInfo{61, D<&FSP_SRV::OpenSaveDataInfoReaderBySaveDataSpaceId>, "OpenSaveDataInfoReaderBySaveDataSpaceId"},
- FunctionInfo{62, D<&FSP_SRV::OpenSaveDataInfoReaderOnlyCacheStorage>, "OpenSaveDataInfoReaderOnlyCacheStorage"},
- FunctionInfo{64, nullptr, "OpenSaveDataInternalStorageFileSystem"},
- FunctionInfo{65, nullptr, "UpdateSaveDataMacForDebug"},
- FunctionInfo{66, nullptr, "WriteSaveDataFileSystemExtraData2"},
- FunctionInfo{67, D<&FSP_SRV::FindSaveDataWithFilter>, "FindSaveDataWithFilter"},
- FunctionInfo{68, nullptr, "OpenSaveDataInfoReaderBySaveDataFilter"},
- FunctionInfo{69, D<&FSP_SRV::ReadSaveDataFileSystemExtraDataBySaveDataAttribute>, "ReadSaveDataFileSystemExtraDataBySaveDataAttribute"},
- FunctionInfo{70, D<&FSP_SRV::WriteSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute>, "WriteSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute"},
- FunctionInfo{71, D<&FSP_SRV::ReadSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute>, "ReadSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute"},
- FunctionInfo{80, nullptr, "OpenSaveDataMetaFile"},
- FunctionInfo{81, nullptr, "OpenSaveDataTransferManager"},
- FunctionInfo{82, nullptr, "OpenSaveDataTransferManagerVersion2"},
- FunctionInfo{83, D<&FSP_SRV::OpenSaveDataTransferProhibiter>, "OpenSaveDataTransferProhibiter"},
- FunctionInfo{84, nullptr, "ListApplicationAccessibleSaveDataOwnerId"},
- FunctionInfo{85, nullptr, "OpenSaveDataTransferManagerForSaveDataRepair"},
- FunctionInfo{86, nullptr, "OpenSaveDataMover"},
- FunctionInfo{87, nullptr, "OpenSaveDataTransferManagerForRepair"},
- FunctionInfo{100, nullptr, "OpenImageDirectoryFileSystem"},
- FunctionInfo{101, nullptr, "OpenBaseFileSystem"},
- FunctionInfo{102, nullptr, "FormatBaseFileSystem"},
- FunctionInfo{110, nullptr, "OpenContentStorageFileSystem"},
- FunctionInfo{120, nullptr, "OpenCloudBackupWorkStorageFileSystem"},
- FunctionInfo{130, nullptr, "OpenCustomStorageFileSystem"},
- FunctionInfo{200, D<&FSP_SRV::OpenDataStorageByCurrentProcess>, "OpenDataStorageByCurrentProcess"},
- FunctionInfo{201, nullptr, "OpenDataStorageByProgramId"},
- FunctionInfo{202, D<&FSP_SRV::OpenDataStorageByDataId>, "OpenDataStorageByDataId"},
- FunctionInfo{203, D<&FSP_SRV::OpenPatchDataStorageByCurrentProcess>, "OpenPatchDataStorageByCurrentProcess"},
- FunctionInfo{204, nullptr, "OpenDataFileSystemByProgramIndex"},
- FunctionInfo{205, D<&FSP_SRV::OpenDataStorageWithProgramIndex>, "OpenDataStorageWithProgramIndex"},
- FunctionInfo{206, nullptr, "OpenDataStorageByPath"},
- FunctionInfo{210, D<&FSP_SRV::SetCurrentProcess>, "SetCurrentProcess"},
- FunctionInfo{400, nullptr, "OpenDeviceOperator"},
- FunctionInfo{500, nullptr, "OpenSdCardDetectionEventNotifier"},
- FunctionInfo{501, nullptr, "OpenGameCardDetectionEventNotifier"},
- FunctionInfo{510, nullptr, "OpenSystemDataUpdateEventNotifier"},
- FunctionInfo{511, nullptr, "NotifySystemDataUpdateEvent"},
- FunctionInfo{520, nullptr, "SimulateGameCardDetectionEvent"},
- FunctionInfo{600, nullptr, "SetCurrentPosixTime"},
- FunctionInfo{601, nullptr, "QuerySaveDataTotalSize"},
- FunctionInfo{602, nullptr, "VerifySaveDataFileSystem"},
- FunctionInfo{603, nullptr, "CorruptSaveDataFileSystem"},
- FunctionInfo{604, nullptr, "CreatePaddingFile"},
- FunctionInfo{605, nullptr, "DeleteAllPaddingFiles"},
- FunctionInfo{606, nullptr, "GetRightsId"},
- FunctionInfo{607, nullptr, "RegisterExternalKey"},
- FunctionInfo{608, nullptr, "UnregisterAllExternalKey"},
- FunctionInfo{609, nullptr, "GetRightsIdByPath"},
- FunctionInfo{610, nullptr, "GetRightsIdAndKeyGenerationByPath"},
- FunctionInfo{611, nullptr, "SetCurrentPosixTimeWithTimeDifference"},
- FunctionInfo{612, nullptr, "GetFreeSpaceSizeForSaveData"},
- FunctionInfo{613, nullptr, "VerifySaveDataFileSystemBySaveDataSpaceId"},
- FunctionInfo{614, nullptr, "CorruptSaveDataFileSystemBySaveDataSpaceId"},
- FunctionInfo{615, nullptr, "QuerySaveDataInternalStorageTotalSize"},
- FunctionInfo{616, nullptr, "GetSaveDataCommitId"},
- FunctionInfo{617, nullptr, "UnregisterExternalKey"},
- FunctionInfo{620, nullptr, "SetSdCardEncryptionSeed"},
- FunctionInfo{630, nullptr, "SetSdCardAccessibility"},
- FunctionInfo{631, D<&FSP_SRV::IsSdCardAccessible>, "IsSdCardAccessible"},
- FunctionInfo{640, nullptr, "IsSignedSystemPartitionOnSdCardValid"},
- FunctionInfo{700, nullptr, "OpenAccessFailureResolver"},
- FunctionInfo{701, nullptr, "GetAccessFailureDetectionEvent"},
- FunctionInfo{702, nullptr, "IsAccessFailureDetected"},
- FunctionInfo{710, nullptr, "ResolveAccessFailure"},
- FunctionInfo{720, nullptr, "AbandonAccessFailure"},
- FunctionInfo{800, nullptr, "GetAndClearFileSystemProxyErrorInfo"},
- FunctionInfo{810, nullptr, "RegisterProgramIndexMapInfo"},
- FunctionInfo{820, nullptr, "GetContentStorageInfoIndex"},
- FunctionInfo{830, nullptr, "EncryptStreamPlaySaveData"},
- FunctionInfo{831, nullptr, "DecryptStreamPlaySaveData"},
- FunctionInfo{1000, nullptr, "SetBisRootForHost"},
- FunctionInfo{1001, nullptr, "SetSaveDataSize"},
- FunctionInfo{1002, nullptr, "SetSaveDataRootPath"},
- FunctionInfo{1003, D<&FSP_SRV::DisableAutoSaveDataCreation>, "DisableAutoSaveDataCreation"},
- FunctionInfo{1004, D<&FSP_SRV::SetGlobalAccessLogMode>, "SetGlobalAccessLogMode"},
- FunctionInfo{1005, D<&FSP_SRV::GetGlobalAccessLogMode>, "GetGlobalAccessLogMode"},
- FunctionInfo{1006, D<&FSP_SRV::OutputAccessLogToSdCard>, "OutputAccessLogToSdCard"},
- FunctionInfo{1007, nullptr, "RegisterUpdatePartition"},
- FunctionInfo{1008, nullptr, "OpenRegisteredUpdatePartition"},
- FunctionInfo{1009, nullptr, "GetAndClearMemoryReportInfo"},
- FunctionInfo{1010, nullptr, "SetDataStorageRedirectTarget"},
- FunctionInfo{1011, D<&FSP_SRV::GetProgramIndexForAccessLog>, "GetProgramIndexForAccessLog"},
- FunctionInfo{1012, nullptr, "GetFsStackUsage"},
- FunctionInfo{1013, nullptr, "UnsetSaveDataRootPath"},
- FunctionInfo{1014, nullptr, "OutputMultiProgramTagAccessLog"},
- FunctionInfo{1016, D<&FSP_SRV::FlushAccessLogOnSdCard>, "FlushAccessLogOnSdCard"},
- FunctionInfo{1017, nullptr, "OutputApplicationInfoAccessLog"},
- FunctionInfo{1018, nullptr, "SetDebugOption"},
- FunctionInfo{1019, nullptr, "UnsetDebugOption"},
- FunctionInfo{1100, nullptr, "OverrideSaveDataTransferTokenSignVerificationKey"},
- FunctionInfo{1110, nullptr, "CorruptSaveDataFileSystemBySaveDataSpaceId2"},
- FunctionInfo{1200, D<&FSP_SRV::OpenMultiCommitManager>, "OpenMultiCommitManager"},
- FunctionInfo{1300, nullptr, "OpenBisWiper"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
FSP_SRV::FSP_SRV(Core::System& system_)
- : ServiceFramework{system_, "fsp-srv"}, fsc{system.GetFileSystemController()}, content_provider{system.GetContentProvider()}, reporter{system.GetReporter()} {
+ : ServiceFramework{system_, "fsp-srv"}, fsc{system.GetFileSystemController()},
+ content_provider{system.GetContentProvider()}, reporter{system.GetReporter()} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "OpenFileSystem"},
+ {1, D<&FSP_SRV::SetCurrentProcess>, "SetCurrentProcess"},
+ {2, D<&FSP_SRV::OpenDataFileSystemByCurrentProcess>, "OpenDataFileSystemByCurrentProcess"},
+ {7, D<&FSP_SRV::OpenFileSystemWithPatch>, "OpenFileSystemWithPatch"},
+ {8, nullptr, "OpenFileSystemWithId"},
+ {9, nullptr, "OpenDataFileSystemByApplicationId"},
+ {11, nullptr, "OpenBisFileSystem"},
+ {12, nullptr, "OpenBisStorage"},
+ {13, nullptr, "InvalidateBisCache"},
+ {17, nullptr, "OpenHostFileSystem"},
+ {18, D<&FSP_SRV::OpenSdCardFileSystem>, "OpenSdCardFileSystem"},
+ {19, nullptr, "FormatSdCardFileSystem"},
+ {21, nullptr, "DeleteSaveDataFileSystem"},
+ {22, D<&FSP_SRV::CreateSaveDataFileSystem>, "CreateSaveDataFileSystem"},
+ {23, D<&FSP_SRV::CreateSaveDataFileSystemBySystemSaveDataId>, "CreateSaveDataFileSystemBySystemSaveDataId"},
+ {24, nullptr, "RegisterSaveDataFileSystemAtomicDeletion"},
+ {25, nullptr, "DeleteSaveDataFileSystemBySaveDataSpaceId"},
+ {26, nullptr, "FormatSdCardDryRun"},
+ {27, D<&FSP_SRV::IsExFatSupported>, "IsExFatSupported"},
+ {28, nullptr, "DeleteSaveDataFileSystemBySaveDataAttribute"},
+ {30, nullptr, "OpenGameCardStorage"},
+ {31, nullptr, "OpenGameCardFileSystem"},
+ {32, D<&FSP_SRV::ExtendSaveDataFileSystem>, "ExtendSaveDataFileSystem"},
+ {33, nullptr, "DeleteCacheStorage"},
+ {34, D<&FSP_SRV::GetCacheStorageSize>, "GetCacheStorageSize"},
+ {35, nullptr, "CreateSaveDataFileSystemByHashSalt"},
+ {36, nullptr, "OpenHostFileSystemWithOption"},
+ {37, D<&FSP_SRV::CreateSaveDataFileSystemWithCreationInfo2>, "CreateSaveDataFileSystemWithCreationInfo2"},
+ {51, D<&FSP_SRV::OpenSaveDataFileSystem>, "OpenSaveDataFileSystem"},
+ {52, D<&FSP_SRV::OpenSaveDataFileSystemBySystemSaveDataId>, "OpenSaveDataFileSystemBySystemSaveDataId"},
+ {53, D<&FSP_SRV::OpenReadOnlySaveDataFileSystem>, "OpenReadOnlySaveDataFileSystem"},
+ {57, D<&FSP_SRV::ReadSaveDataFileSystemExtraDataBySaveDataSpaceId>, "ReadSaveDataFileSystemExtraDataBySaveDataSpaceId"},
+ {58, D<&FSP_SRV::ReadSaveDataFileSystemExtraData>, "ReadSaveDataFileSystemExtraData"},
+ {59, D<&FSP_SRV::WriteSaveDataFileSystemExtraData>, "WriteSaveDataFileSystemExtraData"},
+ {60, nullptr, "OpenSaveDataInfoReader"},
+ {61, D<&FSP_SRV::OpenSaveDataInfoReaderBySaveDataSpaceId>, "OpenSaveDataInfoReaderBySaveDataSpaceId"},
+ {62, D<&FSP_SRV::OpenSaveDataInfoReaderOnlyCacheStorage>, "OpenSaveDataInfoReaderOnlyCacheStorage"},
+ {64, nullptr, "OpenSaveDataInternalStorageFileSystem"},
+ {65, nullptr, "UpdateSaveDataMacForDebug"},
+ {66, nullptr, "WriteSaveDataFileSystemExtraData2"},
+ {67, D<&FSP_SRV::FindSaveDataWithFilter>, "FindSaveDataWithFilter"},
+ {68, nullptr, "OpenSaveDataInfoReaderBySaveDataFilter"},
+ {69, D<&FSP_SRV::ReadSaveDataFileSystemExtraDataBySaveDataAttribute>, "ReadSaveDataFileSystemExtraDataBySaveDataAttribute"},
+ {70, D<&FSP_SRV::WriteSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute>, "WriteSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute"},
+ {71, D<&FSP_SRV::ReadSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute>, "ReadSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute"},
+ {80, nullptr, "OpenSaveDataMetaFile"},
+ {81, nullptr, "OpenSaveDataTransferManager"},
+ {82, nullptr, "OpenSaveDataTransferManagerVersion2"},
+ {83, D<&FSP_SRV::OpenSaveDataTransferProhibiter>, "OpenSaveDataTransferProhibiter"},
+ {84, nullptr, "ListApplicationAccessibleSaveDataOwnerId"},
+ {85, nullptr, "OpenSaveDataTransferManagerForSaveDataRepair"},
+ {86, nullptr, "OpenSaveDataMover"},
+ {87, nullptr, "OpenSaveDataTransferManagerForRepair"},
+ {100, nullptr, "OpenImageDirectoryFileSystem"},
+ {101, nullptr, "OpenBaseFileSystem"},
+ {102, nullptr, "FormatBaseFileSystem"},
+ {110, nullptr, "OpenContentStorageFileSystem"},
+ {120, nullptr, "OpenCloudBackupWorkStorageFileSystem"},
+ {130, nullptr, "OpenCustomStorageFileSystem"},
+ {200, D<&FSP_SRV::OpenDataStorageByCurrentProcess>, "OpenDataStorageByCurrentProcess"},
+ {201, nullptr, "OpenDataStorageByProgramId"},
+ {202, D<&FSP_SRV::OpenDataStorageByDataId>, "OpenDataStorageByDataId"},
+ {203, D<&FSP_SRV::OpenPatchDataStorageByCurrentProcess>, "OpenPatchDataStorageByCurrentProcess"},
+ {204, nullptr, "OpenDataFileSystemByProgramIndex"},
+ {205, D<&FSP_SRV::OpenDataStorageWithProgramIndex>, "OpenDataStorageWithProgramIndex"},
+ {206, nullptr, "OpenDataStorageByPath"},
+ {210, D<&FSP_SRV::SetCurrentProcess>, "SetCurrentProcess"},
+ {400, nullptr, "OpenDeviceOperator"},
+ {500, nullptr, "OpenSdCardDetectionEventNotifier"},
+ {501, nullptr, "OpenGameCardDetectionEventNotifier"},
+ {510, nullptr, "OpenSystemDataUpdateEventNotifier"},
+ {511, nullptr, "NotifySystemDataUpdateEvent"},
+ {520, nullptr, "SimulateGameCardDetectionEvent"},
+ {600, nullptr, "SetCurrentPosixTime"},
+ {601, nullptr, "QuerySaveDataTotalSize"},
+ {602, nullptr, "VerifySaveDataFileSystem"},
+ {603, nullptr, "CorruptSaveDataFileSystem"},
+ {604, nullptr, "CreatePaddingFile"},
+ {605, nullptr, "DeleteAllPaddingFiles"},
+ {606, nullptr, "GetRightsId"},
+ {607, nullptr, "RegisterExternalKey"},
+ {608, nullptr, "UnregisterAllExternalKey"},
+ {609, nullptr, "GetRightsIdByPath"},
+ {610, nullptr, "GetRightsIdAndKeyGenerationByPath"},
+ {611, nullptr, "SetCurrentPosixTimeWithTimeDifference"},
+ {612, nullptr, "GetFreeSpaceSizeForSaveData"},
+ {613, nullptr, "VerifySaveDataFileSystemBySaveDataSpaceId"},
+ {614, nullptr, "CorruptSaveDataFileSystemBySaveDataSpaceId"},
+ {615, nullptr, "QuerySaveDataInternalStorageTotalSize"},
+ {616, nullptr, "GetSaveDataCommitId"},
+ {617, nullptr, "UnregisterExternalKey"},
+ {620, nullptr, "SetSdCardEncryptionSeed"},
+ {630, nullptr, "SetSdCardAccessibility"},
+ {631, D<&FSP_SRV::IsSdCardAccessible>, "IsSdCardAccessible"},
+ {640, nullptr, "IsSignedSystemPartitionOnSdCardValid"},
+ {700, nullptr, "OpenAccessFailureResolver"},
+ {701, nullptr, "GetAccessFailureDetectionEvent"},
+ {702, nullptr, "IsAccessFailureDetected"},
+ {710, nullptr, "ResolveAccessFailure"},
+ {720, nullptr, "AbandonAccessFailure"},
+ {800, nullptr, "GetAndClearFileSystemProxyErrorInfo"},
+ {810, nullptr, "RegisterProgramIndexMapInfo"},
+ {820, nullptr, "GetContentStorageInfoIndex"},
+ {830, nullptr, "EncryptStreamPlaySaveData"},
+ {831, nullptr, "DecryptStreamPlaySaveData"},
+ {1000, nullptr, "SetBisRootForHost"},
+ {1001, nullptr, "SetSaveDataSize"},
+ {1002, nullptr, "SetSaveDataRootPath"},
+ {1003, D<&FSP_SRV::DisableAutoSaveDataCreation>, "DisableAutoSaveDataCreation"},
+ {1004, D<&FSP_SRV::SetGlobalAccessLogMode>, "SetGlobalAccessLogMode"},
+ {1005, D<&FSP_SRV::GetGlobalAccessLogMode>, "GetGlobalAccessLogMode"},
+ {1006, D<&FSP_SRV::OutputAccessLogToSdCard>, "OutputAccessLogToSdCard"},
+ {1007, nullptr, "RegisterUpdatePartition"},
+ {1008, nullptr, "OpenRegisteredUpdatePartition"},
+ {1009, nullptr, "GetAndClearMemoryReportInfo"},
+ {1010, nullptr, "SetDataStorageRedirectTarget"},
+ {1011, D<&FSP_SRV::GetProgramIndexForAccessLog>, "GetProgramIndexForAccessLog"},
+ {1012, nullptr, "GetFsStackUsage"},
+ {1013, nullptr, "UnsetSaveDataRootPath"},
+ {1014, nullptr, "OutputMultiProgramTagAccessLog"},
+ {1016, D<&FSP_SRV::FlushAccessLogOnSdCard>, "FlushAccessLogOnSdCard"},
+ {1017, nullptr, "OutputApplicationInfoAccessLog"},
+ {1018, nullptr, "SetDebugOption"},
+ {1019, nullptr, "UnsetDebugOption"},
+ {1100, nullptr, "OverrideSaveDataTransferTokenSignVerificationKey"},
+ {1110, nullptr, "CorruptSaveDataFileSystemBySaveDataSpaceId2"},
+ {1200, D<&FSP_SRV::OpenMultiCommitManager>, "OpenMultiCommitManager"},
+ {1300, nullptr, "OpenBisWiper"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
+
if (Settings::values.enable_fs_access_log) {
access_log_mode = AccessLogMode::SdCard;
}
diff --git a/src/core/hle/service/filesystem/fsp/fsp_srv.h b/src/core/hle/service/filesystem/fsp/fsp_srv.h
index ebda008bcc..156cf4e571 100644
--- a/src/core/hle/service/filesystem/fsp/fsp_srv.h
+++ b/src/core/hle/service/filesystem/fsp/fsp_srv.h
@@ -115,7 +115,6 @@ private:
s64 available_size, s64 journal_size);
Result GetCacheStorageSize(s32 index, Out<s64> out_data_size, Out<s64> out_journal_size);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
FileSystemController& fsc;
const FileSys::ContentProvider& content_provider;
const Core::Reporter& reporter;
diff --git a/src/core/hle/service/filesystem/fsp/fsp_types.h b/src/core/hle/service/filesystem/fsp/fsp_types.h
index 294da6a2de..c704203ad1 100644
--- a/src/core/hle/service/filesystem/fsp/fsp_types.h
+++ b/src/core/hle/service/filesystem/fsp/fsp_types.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.cpp b/src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.cpp
index d8d6289fe1..f4c218db8d 100644
--- a/src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.cpp
+++ b/src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.h b/src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.h
index d206e1dea4..6141bae18c 100644
--- a/src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.h
+++ b/src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/filesystem/romfs_controller.cpp b/src/core/hle/service/filesystem/romfs_controller.cpp
index 19c9cec722..9725d02f4b 100644
--- a/src/core/hle/service/filesystem/romfs_controller.cpp
+++ b/src/core/hle/service/filesystem/romfs_controller.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/filesystem/romfs_controller.h b/src/core/hle/service/filesystem/romfs_controller.h
index 3c3ead344c..5471e136c3 100644
--- a/src/core/hle/service/filesystem/romfs_controller.h
+++ b/src/core/hle/service/filesystem/romfs_controller.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/filesystem/save_data_controller.cpp b/src/core/hle/service/filesystem/save_data_controller.cpp
index 8720681d17..d3e22b1552 100644
--- a/src/core/hle/service/filesystem/save_data_controller.cpp
+++ b/src/core/hle/service/filesystem/save_data_controller.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
diff --git a/src/core/hle/service/filesystem/save_data_controller.h b/src/core/hle/service/filesystem/save_data_controller.h
index dc9d713dfb..afb95cb949 100644
--- a/src/core/hle/service/filesystem/save_data_controller.h
+++ b/src/core/hle/service/filesystem/save_data_controller.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/friend/friend.cpp b/src/core/hle/service/friend/friend.cpp
index 5480d22b83..f8690dbb8b 100644
--- a/src/core/hle/service/friend/friend.cpp
+++ b/src/core/hle/service/friend/friend.cpp
@@ -11,36 +11,137 @@
#include "core/hle/kernel/k_event.h"
#include "core/hle/service/acc/errors.h"
#include "core/hle/service/friend/friend.h"
+#include "core/hle/service/friend/friend_interface.h"
#include "core/hle/service/ipc_helpers.h"
#include "core/hle/service/kernel_helpers.h"
#include "core/hle/service/server_manager.h"
namespace Service::Friend {
-class Friend final : public Module::Interface {
-public:
- explicit Friend(std::shared_ptr<Module> module_, Core::System& system_, const char* name) : Interface(std::move(module_), system_, name) {}
- ~Friend() override = default;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &Friend::CreateFriendService, "CreateFriendService"},
- FunctionInfo{1, &Friend::CreateNotificationService, "CreateNotificationService"},
- FunctionInfo{2, nullptr, "CreateDaemonSuspendSessionService"}
- );
-};
-
class IFriendService final : public ServiceFramework<IFriendService> {
public:
explicit IFriendService(Core::System& system_)
: ServiceFramework{system_, "IFriendService"}, service_context{system, "IFriendService"} {
- completion_event = service_context.CreateEvent("IFriendService:CompletionEvent");
- }
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &IFriendService::GetCompletionEvent, "GetCompletionEvent"},
+ {1, &IFriendService::Cancel, "Cancel"},
+ {10100, nullptr, "GetFriendListIds"},
+ {10101, &IFriendService::GetFriendList, "GetFriendList"},
+ {10102, nullptr, "UpdateFriendInfo"},
+ {10110, nullptr, "GetFriendProfileImage"},
+ {10111, nullptr, "GetFriendProfileImageWithImageSize"}, // 18.0.0+
+ {10120, &IFriendService::CheckFriendListAvailability, "CheckFriendListAvailability"},
+ {10121, nullptr, "EnsureFriendListAvailable"},
+ {10200, nullptr, "SendFriendRequestForApplication"},
+ {10211, nullptr, "AddFacedFriendRequestForApplication"},
+ {10400, &IFriendService::GetBlockedUserListIds, "GetBlockedUserListIds"},
+ {10420, &IFriendService::CheckBlockedUserListAvailability, "CheckBlockedUserListAvailability"},
+ {10421, nullptr, "EnsureBlockedUserListAvailable"},
+ {10500, nullptr, "GetProfileList"},
+ {10501, nullptr, "GetProfileListV2"}, // 18.0.0+
+ {10600, nullptr, "DeclareOpenOnlinePlaySession"},
+ {10601, &IFriendService::DeclareCloseOnlinePlaySession, "DeclareCloseOnlinePlaySession"},
+ {10610, &IFriendService::UpdateUserPresence, "UpdateUserPresence"},
+ {10700, &IFriendService::GetPlayHistoryRegistrationKey, "GetPlayHistoryRegistrationKey"},
+ {10701, nullptr, "GetPlayHistoryRegistrationKeyWithNetworkServiceAccountId"},
+ {10702, nullptr, "AddPlayHistory"},
+ {11000, nullptr, "GetProfileImageUrl"},
+ {11001, nullptr, "GetProfileImageUrlV2"}, // 18.0.0+
+ {20100, &IFriendService::GetFriendCount, "GetFriendCount"},
+ {20101, &IFriendService::GetNewlyFriendCount, "GetNewlyFriendCount"},
+ {20102, nullptr, "GetFriendDetailedInfo"},
+ {20103, nullptr, "SyncFriendList"},
+ {20104, &IFriendService::RequestSyncFriendList, "RequestSyncFriendList"},
+ {20105, &IFriendService::GetFriendListForViewer, "GetFriendListForViewerV1"},
+ {20106, nullptr, "UpdateFriendInfoForViewerV1"},
+ {20107, nullptr, "GetFriendDetailedInfoV2"}, // 20.0.0+
+ {20108, &IFriendService::GetFriendListForViewer, "GetFriendListForViewerV2"}, // 22.0.0+
+ {20109, nullptr, "UpdateFriendInfoForViewerV2"}, // 22.0.0+
+ {20110, nullptr, "LoadFriendSettingV1"},
+ {20111, nullptr, "LoadFriendSettingV2"}, // 22.0.0+
+ {20200, &IFriendService::GetReceivedFriendRequestCount, "GetReceivedFriendRequestCount"},
+ {20201, nullptr, "GetFriendRequestListV1"},
+ {20202, nullptr, "GetFriendRequestListV2"}, // 20.0.0+
+ {20203, nullptr, "GetFriendRequestReceivedNotificationCount"}, // 22.0.0+
+ {20300, nullptr, "GetFriendCandidateList"},
+ {20301, nullptr, "GetNintendoNetworkIdInfo"},
+ {20302, nullptr, "GetSnsAccountLinkage"}, // 5.0.0-19.0.1
+ {20303, nullptr, "GetSnsAccountProfile"}, // 5.0.0-19.0.1
+ {20304, nullptr, "GetSnsAccountFriendList"}, // 5.0.0-19.0.1
+ {20400, nullptr, "GetBlockedUserListV1"},
+ {20401, nullptr, "SyncBlockedUserList"},
+ {20402, nullptr, "GetBlockedUserListV2"}, // 20.0.0+
+ {20500, nullptr, "GetProfileExtraListV1"},
+ {20501, nullptr, "GetRelationship"},
+ {20502, nullptr, "GetProfileExtraListV2"}, // 19.0.0+
+ {20600, &IFriendService::GetUserPresenceView, "GetUserPresenceViewV1"},
+ {20601, &IFriendService::GetUserPresenceView, "GetUserPresenceViewV2"}, // 19.0.0+
+ {20700, nullptr, "GetPlayHistoryListV1"},
+ {20701, &IFriendService::GetPlayHistoryStatistics, "GetPlayHistoryStatistics"},
+ {20702, nullptr, "GetPlayHistoryListV2"}, // 19.0.0+
+ {20800, &IFriendService::LoadUserSetting, "LoadUserSettingV1"},
+ {20801, nullptr, "SyncUserSetting"},
+ {20802, &IFriendService::LoadUserSetting, "LoadUserSettingV2"}, // 19.0.0+
+ {20900, &IFriendService::RequestListSummaryOverlayNotification, "RequestListSummaryOverlayNotification"},
+ {21000, nullptr, "GetExternalApplicationCatalog"},
+ {22000, nullptr, "GetReceivedFriendInvitationListV1"},
+ {22001, nullptr, "GetReceivedFriendInvitationDetailedInfoV1"},
+ {22002, nullptr, "GetReceivedFriendInvitationListV2"}, // 19.0.0+
+ {22003, nullptr, "GetReceivedFriendInvitationDetailedInfoV2"}, // 19.0.0+
+ {22010, &IFriendService::GetReceivedFriendInvitationCountCache, "GetReceivedFriendInvitationCountCache"},
+ {30100, nullptr, "DropFriendNewlyFlags"},
+ {30101, nullptr, "DeleteFriend"},
+ {30110, nullptr, "DropFriendNewlyFlag"},
+ {30120, nullptr, "ChangeFriendFavoriteFlag"},
+ {30121, nullptr, "ChangeFriendOnlineNotificationFlag"},
+ {30130, nullptr, "SetFriendNote"}, // 22.0.0+
+ {30131, nullptr, "RequestUploadPendingNote"}, // 22.0.0+
+ {30190, nullptr, "RequestSyncLocalUpdates"}, // 22.0.0+
+ {30200, nullptr, "SendFriendRequest"},
+ {30201, nullptr, "SendFriendRequestWithApplicationInfoV1"},
+ {30202, nullptr, "CancelFriendRequest"},
+ {30203, nullptr, "AcceptFriendRequest"},
+ {30204, nullptr, "RejectFriendRequest"},
+ {30205, nullptr, "ReadFriendRequest"},
+ {30210, nullptr, "GetFacedFriendRequestRegistrationKey"},
+ {30211, nullptr, "AddFacedFriendRequest"},
+ {30212, nullptr, "CancelFacedFriendRequest"},
+ {30213, nullptr, "GetFacedFriendRequestProfileImage"},
+ {30214, nullptr, "GetFacedFriendRequestProfileImageFromPath"},
+ {30215, nullptr, "SendFriendRequestWithExternalApplicationCatalogId"},
+ {30216, nullptr, "ResendFacedFriendRequest"},
+ {30217, nullptr, "SendFriendRequestWithNintendoNetworkIdInfo"},
+ {30218, nullptr, "SendFriendRequestWithApplicationInfoV2"}, // 20.0.0+
+ {30300, nullptr, "GetSnsAccountLinkPageUrl"}, // 5.0.0-19.0.1
+ {30301, nullptr, "UnlinkSnsAccount"}, // 5.0.0-19.0.1
+ {30400, nullptr, "BlockUser"},
+ {30401, nullptr, "BlockUserWithApplicationInfoV1"},
+ {30402, nullptr, "UnblockUser"},
+ {30403, nullptr, "BlockUserWithApplicationInfoV2"}, // 20.0.0+
+ {30500, nullptr, "GetProfileExtraFromFriendCodeV1"},
+ {30501, nullptr, "GetProfileExtraFromFriendCodeV2"}, // 19.0.0+
+ {30700, nullptr, "DeletePlayHistory"},
+ {30701, nullptr, "AddPlayHistoryWithApplication"}, // 19.0.0+
+ {30810, nullptr, "ChangePresencePermission"},
+ {30811, nullptr, "ChangeFriendRequestReception"},
+ {30812, nullptr, "ChangePlayLogPermission"},
+ {30820, nullptr, "IssueFriendCode"},
+ {30830, nullptr, "ClearPlayLog"},
+ {30900, nullptr, "SendFriendInvitationV1"},
+ {30901, nullptr, "SendFriendInvitationV2"}, // 19.0.0+
+ {30910, nullptr, "ReadFriendInvitation"},
+ {30911, nullptr, "ReadAllFriendInvitations"},
+ {31000, nullptr, "OpenUser"}, // 19.0.0+
+ {40100, nullptr, "DeleteFriendListCache"},
+ {40400, nullptr, "DeleteBlockedUserListCache"},
+ {49900, nullptr, "DeleteNetworkServiceAccountCache"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ completion_event = service_context.CreateEvent("IFriendService:CompletionEvent");
}
~IFriendService() override {
@@ -266,134 +367,27 @@ private:
rb.Push(0);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &IFriendService::GetCompletionEvent, "GetCompletionEvent"},
- FunctionInfo{1, &IFriendService::Cancel, "Cancel"},
- FunctionInfo{10100, nullptr, "GetFriendListIds"},
- FunctionInfo{10101, &IFriendService::GetFriendList, "GetFriendList"},
- FunctionInfo{10102, nullptr, "UpdateFriendInfo"},
- FunctionInfo{10110, nullptr, "GetFriendProfileImage"},
- FunctionInfo{10111, nullptr, "GetFriendProfileImageWithImageSize", MakeVersionGate({18,0,0})},
- FunctionInfo{10120, &IFriendService::CheckFriendListAvailability, "CheckFriendListAvailability"},
- FunctionInfo{10121, nullptr, "EnsureFriendListAvailable"},
- FunctionInfo{10200, nullptr, "SendFriendRequestForApplication"},
- FunctionInfo{10211, nullptr, "AddFacedFriendRequestForApplication"},
- FunctionInfo{10400, &IFriendService::GetBlockedUserListIds, "GetBlockedUserListIds"},
- FunctionInfo{10420, &IFriendService::CheckBlockedUserListAvailability, "CheckBlockedUserListAvailability"},
- FunctionInfo{10421, nullptr, "EnsureBlockedUserListAvailable"},
- FunctionInfo{10500, nullptr, "GetProfileList"},
- FunctionInfo{10501, nullptr, "GetProfileListV2", MakeVersionGate({18,0,0})},
- FunctionInfo{10600, nullptr, "DeclareOpenOnlinePlaySession"},
- FunctionInfo{10601, &IFriendService::DeclareCloseOnlinePlaySession, "DeclareCloseOnlinePlaySession"},
- FunctionInfo{10610, &IFriendService::UpdateUserPresence, "UpdateUserPresence"},
- FunctionInfo{10700, &IFriendService::GetPlayHistoryRegistrationKey, "GetPlayHistoryRegistrationKey"},
- FunctionInfo{10701, nullptr, "GetPlayHistoryRegistrationKeyWithNetworkServiceAccountId"},
- FunctionInfo{10702, nullptr, "AddPlayHistory"},
- FunctionInfo{11000, nullptr, "GetProfileImageUrl"},
- FunctionInfo{11001, nullptr, "GetProfileImageUrlV2", MakeVersionGate({18,0,0})},
- FunctionInfo{20100, &IFriendService::GetFriendCount, "GetFriendCount"},
- FunctionInfo{20101, &IFriendService::GetNewlyFriendCount, "GetNewlyFriendCount"},
- FunctionInfo{20102, nullptr, "GetFriendDetailedInfo"},
- FunctionInfo{20103, nullptr, "SyncFriendList"},
- FunctionInfo{20104, &IFriendService::RequestSyncFriendList, "RequestSyncFriendList"},
- FunctionInfo{20105, &IFriendService::GetFriendListForViewer, "GetFriendListForViewerV1"},
- FunctionInfo{20106, nullptr, "UpdateFriendInfoForViewerV1"},
- FunctionInfo{20107, nullptr, "GetFriendDetailedInfoV2", MakeVersionGate({20,0,0})},
- FunctionInfo{20108, &IFriendService::GetFriendListForViewer, "GetFriendListForViewerV2", MakeVersionGate({22,0,0})},
- FunctionInfo{20109, nullptr, "UpdateFriendInfoForViewerV2", MakeVersionGate({22,0,0})},
- FunctionInfo{20110, nullptr, "LoadFriendSettingV1"},
- FunctionInfo{20111, nullptr, "LoadFriendSettingV2", MakeVersionGate({22,0,0})},
- FunctionInfo{20200, &IFriendService::GetReceivedFriendRequestCount, "GetReceivedFriendRequestCount"},
- FunctionInfo{20201, nullptr, "GetFriendRequestListV1"},
- FunctionInfo{20202, nullptr, "GetFriendRequestListV2", MakeVersionGate({20,0,0})},
- FunctionInfo{20203, nullptr, "GetFriendRequestReceivedNotificationCount", MakeVersionGate({22,0,0})},
- FunctionInfo{20300, nullptr, "GetFriendCandidateList"},
- FunctionInfo{20301, nullptr, "GetNintendoNetworkIdInfo"},
- FunctionInfo{20302, nullptr, "GetSnsAccountLinkage", MakeVersionGate({5,0,0}, {19,0,1})},
- FunctionInfo{20303, nullptr, "GetSnsAccountProfile", MakeVersionGate({5,0,0}, {19,0,1})},
- FunctionInfo{20304, nullptr, "GetSnsAccountFriendList", MakeVersionGate({5,0,0}, {19,0,1})},
- FunctionInfo{20400, nullptr, "GetBlockedUserListV1"},
- FunctionInfo{20401, nullptr, "SyncBlockedUserList"},
- FunctionInfo{20402, nullptr, "GetBlockedUserListV2", MakeVersionGate({20,0,0})},
- FunctionInfo{20500, nullptr, "GetProfileExtraListV1"},
- FunctionInfo{20501, nullptr, "GetRelationship"},
- FunctionInfo{20502, nullptr, "GetProfileExtraListV2", MakeVersionGate({19,0,0})},
- FunctionInfo{20600, &IFriendService::GetUserPresenceView, "GetUserPresenceViewV1"},
- FunctionInfo{20601, &IFriendService::GetUserPresenceView, "GetUserPresenceViewV2", MakeVersionGate({19,0,0})},
- FunctionInfo{20700, nullptr, "GetPlayHistoryListV1"},
- FunctionInfo{20701, &IFriendService::GetPlayHistoryStatistics, "GetPlayHistoryStatistics"},
- FunctionInfo{20702, nullptr, "GetPlayHistoryListV2", MakeVersionGate({19,0,0})},
- FunctionInfo{20800, &IFriendService::LoadUserSetting, "LoadUserSettingV1"},
- FunctionInfo{20801, nullptr, "SyncUserSetting"},
- FunctionInfo{20802, &IFriendService::LoadUserSetting, "LoadUserSettingV2", MakeVersionGate({19,0,0})},
- FunctionInfo{20900, &IFriendService::RequestListSummaryOverlayNotification, "RequestListSummaryOverlayNotification"},
- FunctionInfo{21000, nullptr, "GetExternalApplicationCatalog"},
- FunctionInfo{22000, nullptr, "GetReceivedFriendInvitationListV1"},
- FunctionInfo{22001, nullptr, "GetReceivedFriendInvitationDetailedInfoV1"},
- FunctionInfo{22002, nullptr, "GetReceivedFriendInvitationListV2", MakeVersionGate({19,0,0})},
- FunctionInfo{22003, nullptr, "GetReceivedFriendInvitationDetailedInfoV2", MakeVersionGate({19,0,0})},
- FunctionInfo{22010, &IFriendService::GetReceivedFriendInvitationCountCache, "GetReceivedFriendInvitationCountCache"},
- FunctionInfo{30100, nullptr, "DropFriendNewlyFlags"},
- FunctionInfo{30101, nullptr, "DeleteFriend"},
- FunctionInfo{30110, nullptr, "DropFriendNewlyFlag"},
- FunctionInfo{30120, nullptr, "ChangeFriendFavoriteFlag"},
- FunctionInfo{30121, nullptr, "ChangeFriendOnlineNotificationFlag"},
- FunctionInfo{30130, nullptr, "SetFriendNote", MakeVersionGate({22,0,0})},
- FunctionInfo{30131, nullptr, "RequestUploadPendingNote", MakeVersionGate({22,0,0})},
- FunctionInfo{30190, nullptr, "RequestSyncLocalUpdates", MakeVersionGate({22,0,0})},
- FunctionInfo{30200, nullptr, "SendFriendRequest"},
- FunctionInfo{30201, nullptr, "SendFriendRequestWithApplicationInfoV1"},
- FunctionInfo{30202, nullptr, "CancelFriendRequest"},
- FunctionInfo{30203, nullptr, "AcceptFriendRequest"},
- FunctionInfo{30204, nullptr, "RejectFriendRequest"},
- FunctionInfo{30205, nullptr, "ReadFriendRequest"},
- FunctionInfo{30210, nullptr, "GetFacedFriendRequestRegistrationKey"},
- FunctionInfo{30211, nullptr, "AddFacedFriendRequest"},
- FunctionInfo{30212, nullptr, "CancelFacedFriendRequest"},
- FunctionInfo{30213, nullptr, "GetFacedFriendRequestProfileImage"},
- FunctionInfo{30214, nullptr, "GetFacedFriendRequestProfileImageFromPath"},
- FunctionInfo{30215, nullptr, "SendFriendRequestWithExternalApplicationCatalogId"},
- FunctionInfo{30216, nullptr, "ResendFacedFriendRequest"},
- FunctionInfo{30217, nullptr, "SendFriendRequestWithNintendoNetworkIdInfo"},
- FunctionInfo{30218, nullptr, "SendFriendRequestWithApplicationInfoV2", MakeVersionGate({20,0,0})},
- FunctionInfo{30300, nullptr, "GetSnsAccountLinkPageUrl", MakeVersionGate({5,0,0}, {19,0,1})},
- FunctionInfo{30301, nullptr, "UnlinkSnsAccount", MakeVersionGate({5,0,0}, {19,0,1})},
- FunctionInfo{30400, nullptr, "BlockUser"},
- FunctionInfo{30401, nullptr, "BlockUserWithApplicationInfoV1"},
- FunctionInfo{30402, nullptr, "UnblockUser"},
- FunctionInfo{30403, nullptr, "BlockUserWithApplicationInfoV2", MakeVersionGate({20,0,0})},
- FunctionInfo{30500, nullptr, "GetProfileExtraFromFriendCodeV1"},
- FunctionInfo{30501, nullptr, "GetProfileExtraFromFriendCodeV2", MakeVersionGate({19,0,0})},
- FunctionInfo{30700, nullptr, "DeletePlayHistory"},
- FunctionInfo{30701, nullptr, "AddPlayHistoryWithApplication", MakeVersionGate({19,0,0})},
- FunctionInfo{30810, nullptr, "ChangePresencePermission"},
- FunctionInfo{30811, nullptr, "ChangeFriendRequestReception"},
- FunctionInfo{30812, nullptr, "ChangePlayLogPermission"},
- FunctionInfo{30820, nullptr, "IssueFriendCode"},
- FunctionInfo{30830, nullptr, "ClearPlayLog"},
- FunctionInfo{30900, nullptr, "SendFriendInvitationV1"},
- FunctionInfo{30901, nullptr, "SendFriendInvitationV2", MakeVersionGate({19,0,0})},
- FunctionInfo{30910, nullptr, "ReadFriendInvitation"},
- FunctionInfo{30911, nullptr, "ReadAllFriendInvitations"},
- FunctionInfo{31000, nullptr, "OpenUser", MakeVersionGate({19,0,0})},
- FunctionInfo{40100, nullptr, "DeleteFriendListCache"},
- FunctionInfo{40400, nullptr, "DeleteBlockedUserListCache"},
- FunctionInfo{49900, nullptr, "DeleteNetworkServiceAccountCache"}
- );
KernelHelpers::ServiceContext service_context;
+
Kernel::KEvent* completion_event;
};
class INotificationService final : public ServiceFramework<INotificationService> {
public:
explicit INotificationService(Core::System& system_, Common::UUID uuid_)
- : ServiceFramework{system_, "INotificationService"}, uuid{uuid_}
- , service_context{system_, "INotificationService"} {
- notification_event = service_context.CreateEvent("INotificationService:NotifyEvent");
- }
+ : ServiceFramework{system_, "INotificationService"}, uuid{uuid_},
+ service_context{system_, "INotificationService"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &INotificationService::GetEvent, "GetEvent"},
+ {1, &INotificationService::Clear, "Clear"},
+ {2, &INotificationService::Pop, "Pop"}
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ notification_event = service_context.CreateEvent("INotificationService:NotifyEvent");
}
~INotificationService() override {
@@ -471,13 +465,9 @@ private:
bool has_received_friend_request;
};
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &INotificationService::GetEvent, "GetEvent"},
- FunctionInfo{1, &INotificationService::Clear, "Clear"},
- FunctionInfo{2, &INotificationService::Pop, "Pop"}
- );
Common::UUID uuid;
KernelHelpers::ServiceContext service_context;
+
Kernel::KEvent* notification_event;
std::queue<SizedNotificationInfo> notifications;
States states{};
@@ -511,67 +501,61 @@ class IServiceForApplication final : public ServiceFramework<IServiceForApplicat
public:
explicit IServiceForApplication(Core::System& system_)
: ServiceFramework{system_, "nd:app"}
- {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ {
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetReceivableNeighborInfoCountMax"},
+ {10, nullptr, "IsNeighborDetectionEnabled"},
+ };
+ RegisterHandlers(functions);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetReceivableNeighborInfoCountMax"},
- FunctionInfo{10, nullptr, "IsNeighborDetectionEnabled"}
- );
};
class IServiceForSystem final : public ServiceFramework<IServiceForSystem> {
public:
explicit IServiceForSystem(Core::System& system_)
: ServiceFramework{system_, "nd:sys"}
- {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ {
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetReceivableNeighborInfoCountMax"},
+ {10, nullptr, "IsNeighborDetectionEnabled"},
+ {200, nullptr, "SetSystemData"},
+ {201, nullptr, "ClearSystemData"},
+ {203, nullptr, "GetReceivableNeighborInfoCountForSystem"},
+ {204, nullptr, "ReceiveNeighborInfoForSystem"},
+ {205, nullptr, "SetSender"},
+ {206, nullptr, "GetSender"},
+ {207, nullptr, "CreateScannerForSystem"},
+ {208, nullptr, "CreateReceiveEventHolderForSystem"},
+ {223, nullptr, "EnableNeighborDetection"},
+ {224, nullptr, "DisableNeighborDetection"},
+ {226, nullptr, "EnablePowerSave"},
+ {227, nullptr, "DisablePowerSave"},
+ {228, nullptr, "IsPowerSaveEnabled"},
+ {232, nullptr, "ClearBlockedUsers"},
+ {233, nullptr, "GetBlockedUserCount"},
+ {234, nullptr, "BlockUserByLocalUserId"},
+ {235, nullptr, "BlockUserByNetworkUserId"},
+ {236, nullptr, "UnblockUserByLocalUserId"},
+ {237, nullptr, "UnblockUserByNetworkUserId"},
+ {240, nullptr, "DeleteApplication"},
+ {250, nullptr, "InitializeApplicationInfo"},
+ {260, nullptr, "CreateAccountSystemSaveDataAccessSuppressor"},
+ {300, nullptr, "AddReceivedNeighborInfoForSystemForDebug"},
+ {301, nullptr, "GetSendDataForDebug"},
+ {302, nullptr, "ClearReceiveCounterForDebug"},
+ {303, nullptr, "GetNextReceiveCounterForDebug"},
+ {304, nullptr, "ListBlockedUsersForDebug"},
+ {305, nullptr, "RefreshSendDataIdForDebug"},
+ {306, nullptr, "ReloadFwdbgSettingsForDebug"},
+ {307, nullptr, "EnableApplicationForDebug"},
+ {308, nullptr, "GetNextReceiveCountersForDebug"},
+ {309, nullptr, "ListApplicationInfoForDebug"},
+ {310, nullptr, "SetApplicationDataForDebug"},
+ {400, nullptr, "GetNetworkUserId"},
+ {401, nullptr, "DeleteNetworkUserId"},
+ };
+ RegisterHandlers(functions);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetReceivableNeighborInfoCountMax"},
- FunctionInfo{10, nullptr, "IsNeighborDetectionEnabled"},
- FunctionInfo{200, nullptr, "SetSystemData"},
- FunctionInfo{201, nullptr, "ClearSystemData"},
- FunctionInfo{203, nullptr, "GetReceivableNeighborInfoCountForSystem"},
- FunctionInfo{204, nullptr, "ReceiveNeighborInfoForSystem"},
- FunctionInfo{205, nullptr, "SetSender"},
- FunctionInfo{206, nullptr, "GetSender"},
- FunctionInfo{207, nullptr, "CreateScannerForSystem"},
- FunctionInfo{208, nullptr, "CreateReceiveEventHolderForSystem"},
- FunctionInfo{223, nullptr, "EnableNeighborDetection"},
- FunctionInfo{224, nullptr, "DisableNeighborDetection"},
- FunctionInfo{226, nullptr, "EnablePowerSave"},
- FunctionInfo{227, nullptr, "DisablePowerSave"},
- FunctionInfo{228, nullptr, "IsPowerSaveEnabled"},
- FunctionInfo{232, nullptr, "ClearBlockedUsers"},
- FunctionInfo{233, nullptr, "GetBlockedUserCount"},
- FunctionInfo{234, nullptr, "BlockUserByLocalUserId"},
- FunctionInfo{235, nullptr, "BlockUserByNetworkUserId"},
- FunctionInfo{236, nullptr, "UnblockUserByLocalUserId"},
- FunctionInfo{237, nullptr, "UnblockUserByNetworkUserId"},
- FunctionInfo{240, nullptr, "DeleteApplication"},
- FunctionInfo{250, nullptr, "InitializeApplicationInfo"},
- FunctionInfo{260, nullptr, "CreateAccountSystemSaveDataAccessSuppressor"},
- FunctionInfo{300, nullptr, "AddReceivedNeighborInfoForSystemForDebug"},
- FunctionInfo{301, nullptr, "GetSendDataForDebug"},
- FunctionInfo{302, nullptr, "ClearReceiveCounterForDebug"},
- FunctionInfo{303, nullptr, "GetNextReceiveCounterForDebug"},
- FunctionInfo{304, nullptr, "ListBlockedUsersForDebug"},
- FunctionInfo{305, nullptr, "RefreshSendDataIdForDebug"},
- FunctionInfo{306, nullptr, "ReloadFwdbgSettingsForDebug"},
- FunctionInfo{307, nullptr, "EnableApplicationForDebug"},
- FunctionInfo{308, nullptr, "GetNextReceiveCountersForDebug"},
- FunctionInfo{309, nullptr, "ListApplicationInfoForDebug"},
- FunctionInfo{310, nullptr, "SetApplicationDataForDebug"},
- FunctionInfo{400, nullptr, "GetNetworkUserId"},
- FunctionInfo{401, nullptr, "DeleteNetworkUserId"}
- );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/friend/friend.h b/src/core/hle/service/friend/friend.h
index 2824dc7866..61ac92fbb4 100644
--- a/src/core/hle/service/friend/friend.h
+++ b/src/core/hle/service/friend/friend.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/friend/friend_interface.cpp b/src/core/hle/service/friend/friend_interface.cpp
new file mode 100644
index 0000000000..b436d43303
--- /dev/null
+++ b/src/core/hle/service/friend/friend_interface.cpp
@@ -0,0 +1,23 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/friend/friend_interface.h"
+
+namespace Service::Friend {
+
+Friend::Friend(std::shared_ptr<Module> module_, Core::System& system_, const char* name)
+ : Interface(std::move(module_), system_, name) {
+ static const FunctionInfo functions[] = {
+ {0, &Friend::CreateFriendService, "CreateFriendService"},
+ {1, &Friend::CreateNotificationService, "CreateNotificationService"},
+ {2, nullptr, "CreateDaemonSuspendSessionService"},
+ };
+ RegisterHandlers(functions);
+}
+
+Friend::~Friend() = default;
+
+} // namespace Service::Friend
diff --git a/src/core/hle/service/friend/friend_interface.h b/src/core/hle/service/friend/friend_interface.h
new file mode 100644
index 0000000000..0315c62c39
--- /dev/null
+++ b/src/core/hle/service/friend/friend_interface.h
@@ -0,0 +1,19 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/friend/friend.h"
+
+namespace Service::Friend {
+
+class Friend final : public Module::Interface {
+public:
+ explicit Friend(std::shared_ptr<Module> module_, Core::System& system_, const char* name);
+ ~Friend() override;
+};
+
+} // namespace Service::Friend
diff --git a/src/core/hle/service/glue/arp.cpp b/src/core/hle/service/glue/arp.cpp
index 203adb7ca7..7eda57ddc3 100644
--- a/src/core/hle/service/glue/arp.cpp
+++ b/src/core/hle/service/glue/arp.cpp
@@ -35,6 +35,22 @@ std::optional<u64> GetTitleIDForProcessID(Core::System& system, u64 process_id)
ARP_R::ARP_R(Core::System& system_, const ARPManager& manager_)
: ServiceFramework{system_, "arp:r"}, manager{manager_} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &ARP_R::GetApplicationLaunchProperty, "GetApplicationLaunchProperty"},
+ {1, &ARP_R::GetApplicationLaunchPropertyWithApplicationId, "GetApplicationLaunchPropertyWithApplicationId"},
+ {2, &ARP_R::GetApplicationControlProperty, "GetApplicationControlProperty"},
+ {3, &ARP_R::GetApplicationControlPropertyWithApplicationId, "GetApplicationControlPropertyWithApplicationId"},
+ {4, nullptr, "GetApplicationInstanceUnregistrationNotifier"},
+ {5, nullptr, "ListApplicationInstanceId"},
+ {6, nullptr, "GetMicroApplicationInstanceId"},
+ {7, nullptr, "GetApplicationCertificate"},
+ {9998, nullptr, "GetPreomiaApplicationLaunchProperty"},
+ {9999, nullptr, "GetPreomiaApplicationControlProperty"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
ARP_R::~ARP_R() = default;
@@ -148,10 +164,16 @@ public:
using IssuerFn = std::function<Result(u64, ApplicationLaunchProperty, std::vector<u8>)>;
explicit IRegistrar(Core::System& system_, IssuerFn&& issuer)
- : ServiceFramework{system_, "IRegistrar"}, issue_process_id{std::move(issuer)} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "IRegistrar"}, issue_process_id{std::move(issuer)} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &IRegistrar::Issue, "Issue"},
+ {1, &IRegistrar::SetApplicationLaunchProperty, "SetApplicationLaunchProperty"},
+ {2, &IRegistrar::SetApplicationControlProperty, "SetApplicationControlProperty"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
private:
@@ -216,11 +238,6 @@ private:
rb.Push(ResultSuccess);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &IRegistrar::Issue, "Issue"},
- FunctionInfo{1, &IRegistrar::SetApplicationLaunchProperty, "SetApplicationLaunchProperty"},
- FunctionInfo{2, &IRegistrar::SetApplicationControlProperty, "SetApplicationControlProperty"}
- );
IssuerFn issue_process_id;
bool issued = false;
ApplicationLaunchProperty launch{};
@@ -229,6 +246,15 @@ private:
ARP_W::ARP_W(Core::System& system_, ARPManager& manager_)
: ServiceFramework{system_, "arp:w"}, manager{manager_} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &ARP_W::AcquireRegistrar, "AcquireRegistrar"},
+ {1, &ARP_W::UnregisterApplicationInstance , "UnregisterApplicationInstance "},
+ {2, nullptr, "AcquireUpdater"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
ARP_W::~ARP_W() = default;
diff --git a/src/core/hle/service/glue/arp.h b/src/core/hle/service/glue/arp.h
index de966475f9..ec3d809b5b 100644
--- a/src/core/hle/service/glue/arp.h
+++ b/src/core/hle/service/glue/arp.h
@@ -24,21 +24,6 @@ private:
void GetApplicationControlProperty(HLERequestContext& ctx);
void GetApplicationControlPropertyWithApplicationId(HLERequestContext& ctx);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &ARP_R::GetApplicationLaunchProperty, "GetApplicationLaunchProperty"},
- FunctionInfo{1, &ARP_R::GetApplicationLaunchPropertyWithApplicationId, "GetApplicationLaunchPropertyWithApplicationId"},
- FunctionInfo{2, &ARP_R::GetApplicationControlProperty, "GetApplicationControlProperty"},
- FunctionInfo{3, &ARP_R::GetApplicationControlPropertyWithApplicationId, "GetApplicationControlPropertyWithApplicationId"},
- FunctionInfo{4, nullptr, "GetApplicationInstanceUnregistrationNotifier"},
- FunctionInfo{5, nullptr, "ListApplicationInstanceId"},
- FunctionInfo{6, nullptr, "GetMicroApplicationInstanceId"},
- FunctionInfo{7, nullptr, "GetApplicationCertificate"},
- FunctionInfo{9998, nullptr, "GetPreomiaApplicationLaunchProperty"},
- FunctionInfo{9999, nullptr, "GetPreomiaApplicationControlProperty"}
- );
const ARPManager& manager;
};
@@ -51,14 +36,6 @@ private:
void AcquireRegistrar(HLERequestContext& ctx);
void UnregisterApplicationInstance(HLERequestContext& ctx);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &ARP_W::AcquireRegistrar, "AcquireRegistrar"},
- FunctionInfo{1, &ARP_W::UnregisterApplicationInstance , "UnregisterApplicationInstance "},
- FunctionInfo{2, nullptr, "AcquireUpdater"}
- );
ARPManager& manager;
std::shared_ptr<IRegistrar> registrar;
};
diff --git a/src/core/hle/service/glue/bgtc.cpp b/src/core/hle/service/glue/bgtc.cpp
index 7c7b5ea13c..360f16f0dd 100644
--- a/src/core/hle/service/glue/bgtc.cpp
+++ b/src/core/hle/service/glue/bgtc.cpp
@@ -11,7 +11,15 @@
namespace Service::Glue {
-BGTC_T::BGTC_T(Core::System& system_) : ServiceFramework{system_, "bgtc:t"} {}
+BGTC_T::BGTC_T(Core::System& system_) : ServiceFramework{system_, "bgtc:t"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {100, &BGTC_T::OpenTaskService, "OpenTaskService"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
BGTC_T::~BGTC_T() = default;
@@ -24,11 +32,44 @@ void BGTC_T::OpenTaskService(HLERequestContext& ctx) {
}
ITaskService::ITaskService(Core::System& system_) : ServiceFramework{system_, "ITaskService"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {1, nullptr, "NotifyTaskStarting"},
+ {2, nullptr, "NotifyTaskFinished"},
+ {3, nullptr, "GetTriggerEvent"},
+ {4, nullptr, "IsInHalfAwake"},
+ {5, nullptr, "NotifyClientName"},
+ {6, nullptr, "IsInFullAwake"},
+ {11, nullptr, "ScheduleTask"},
+ {12, nullptr, "GetScheduledTaskInterval"},
+ {13, nullptr, "UnscheduleTask"},
+ {14, nullptr, "GetScheduleEvent"},
+ {15, nullptr, "SchedulePeriodicTask"},
+ {16, nullptr, "Unknown16"},
+ {101, nullptr, "GetOperationMode"},
+ {102, nullptr, "WillDisconnectNetworkWhenEnteringSleep"},
+ {103, nullptr, "WillStayHalfAwakeInsteadSleep"},
+ {200, nullptr, "Unknown200"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
ITaskService::~ITaskService() = default;
BGTC_SC::BGTC_SC(Core::System& system_) : ServiceFramework{system_, "bgtc:sc"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {1, nullptr, "GetState"},
+ {2, nullptr, "GetStateChangedEvent"},
+ {3, nullptr, "NotifyEnteringHalfAwake"},
+ {4, nullptr, "NotifyLeavingHalfAwake"},
+ {5, nullptr, "SetIsUsingSleepUnsupportedDevices"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
BGTC_SC::~BGTC_SC() = default;
diff --git a/src/core/hle/service/glue/bgtc.h b/src/core/hle/service/glue/bgtc.h
index 0ef0ab902f..129193da1f 100644
--- a/src/core/hle/service/glue/bgtc.h
+++ b/src/core/hle/service/glue/bgtc.h
@@ -20,57 +20,18 @@ public:
~BGTC_T() override;
void OpenTaskService(HLERequestContext& ctx);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{100, &BGTC_T::OpenTaskService, "OpenTaskService"}
- );
};
class ITaskService final : public ServiceFramework<ITaskService> {
public:
explicit ITaskService(Core::System& system_);
~ITaskService() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{1, nullptr, "NotifyTaskStarting"},
- FunctionInfo{2, nullptr, "NotifyTaskFinished"},
- FunctionInfo{3, nullptr, "GetTriggerEvent"},
- FunctionInfo{4, nullptr, "IsInHalfAwake"},
- FunctionInfo{5, nullptr, "NotifyClientName"},
- FunctionInfo{6, nullptr, "IsInFullAwake"},
- FunctionInfo{11, nullptr, "ScheduleTask"},
- FunctionInfo{12, nullptr, "GetScheduledTaskInterval"},
- FunctionInfo{13, nullptr, "UnscheduleTask"},
- FunctionInfo{14, nullptr, "GetScheduleEvent"},
- FunctionInfo{15, nullptr, "SchedulePeriodicTask"},
- FunctionInfo{16, nullptr, "Unknown16"},
- FunctionInfo{101, nullptr, "GetOperationMode"},
- FunctionInfo{102, nullptr, "WillDisconnectNetworkWhenEnteringSleep"},
- FunctionInfo{103, nullptr, "WillStayHalfAwakeInsteadSleep"},
- FunctionInfo{200, nullptr, "Unknown200"}
- );
};
class BGTC_SC final : public ServiceFramework<BGTC_SC> {
public:
explicit BGTC_SC(Core::System& system_);
~BGTC_SC() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{1, nullptr, "GetState"},
- FunctionInfo{2, nullptr, "GetStateChangedEvent"},
- FunctionInfo{3, nullptr, "NotifyEnteringHalfAwake"},
- FunctionInfo{4, nullptr, "NotifyLeavingHalfAwake"},
- FunctionInfo{5, nullptr, "SetIsUsingSleepUnsupportedDevices"}
- );
};
} // namespace Service::Glue
diff --git a/src/core/hle/service/glue/ectx.cpp b/src/core/hle/service/glue/ectx.cpp
index 80d22a0ca7..322ae45254 100644
--- a/src/core/hle/service/glue/ectx.cpp
+++ b/src/core/hle/service/glue/ectx.cpp
@@ -12,10 +12,14 @@ namespace Service::Glue {
// This is nn::err::context::IContextRegistrar
class IContextRegistrar : public ServiceFramework<IContextRegistrar> {
public:
- IContextRegistrar(Core::System& system_) : ServiceFramework{system_, "IContextRegistrar"} {}
+ IContextRegistrar(Core::System& system_) : ServiceFramework{system_, "IContextRegistrar"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &IContextRegistrar::Complete, "Complete"},
+ };
+ // clang-format on
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
~IContextRegistrar() override = default;
@@ -37,21 +41,41 @@ private:
rb.Push(ResultSuccess);
rb.Push(0);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &IContextRegistrar::Complete, "Complete"}
- );
};
ECTX_W::ECTX_W(Core::System& system_) : ServiceFramework{system_, "ectx:w"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "CreateContextRegistrar"},
+ {1, nullptr, "CommitContext"},
+ {2, nullptr, "RemoveContext"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
ECTX_W::~ECTX_W() = default;
ECTX_R::ECTX_R(Core::System& system_) : ServiceFramework{system_, "ectx:r"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetContextInfo"},
+ {1, nullptr, "PullContext"},
+ {2, nullptr, "ListContextDescriptorWithResultForDebug"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
ECTX_R::~ECTX_R() = default;
ECTX_AW::ECTX_AW(Core::System& system_) : ServiceFramework{system_, "ectx:aw"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &ECTX_AW::CreateContextRegistrar, "CreateContextRegistrar"},
+ {1, nullptr, "CommitContext"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
ECTX_AW::~ECTX_AW() = default;
diff --git a/src/core/hle/service/glue/ectx.h b/src/core/hle/service/glue/ectx.h
index 01f109c609..ff48075eda 100644
--- a/src/core/hle/service/glue/ectx.h
+++ b/src/core/hle/service/glue/ectx.h
@@ -18,30 +18,12 @@ class ECTX_W final : public ServiceFramework<ECTX_W> {
public:
explicit ECTX_W(Core::System& system_);
~ECTX_W() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "CreateContextRegistrar"},
- FunctionInfo{1, nullptr, "CommitContext"},
- FunctionInfo{2, nullptr, "RemoveContext"}
- );
};
class ECTX_R final : public ServiceFramework<ECTX_R> {
public:
explicit ECTX_R(Core::System& system_);
~ECTX_R() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetContextInfo"},
- FunctionInfo{1, nullptr, "PullContext"},
- FunctionInfo{2, nullptr, "ListContextDescriptorWithResultForDebug"}
- );
};
class ECTX_AW final : public ServiceFramework<ECTX_AW> {
@@ -51,14 +33,6 @@ public:
private:
void CreateContextRegistrar(HLERequestContext& ctx);
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &ECTX_AW::CreateContextRegistrar, "CreateContextRegistrar"},
- FunctionInfo{1, nullptr, "CommitContext"}
- );
};
} // namespace Service::Glue
diff --git a/src/core/hle/service/glue/errors.h b/src/core/hle/service/glue/errors.h
index 30feaa5c03..9839271447 100644
--- a/src/core/hle/service/glue/errors.h
+++ b/src/core/hle/service/glue/errors.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/glue/glue.h b/src/core/hle/service/glue/glue.h
index 2a906f5ad6..64d45cfc14 100644
--- a/src/core/hle/service/glue/glue.h
+++ b/src/core/hle/service/glue/glue.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/glue/glue_manager.cpp b/src/core/hle/service/glue/glue_manager.cpp
index 22f0017044..78fc5ebac3 100644
--- a/src/core/hle/service/glue/glue_manager.cpp
+++ b/src/core/hle/service/glue/glue_manager.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/glue/glue_manager.h b/src/core/hle/service/glue/glue_manager.h
index 216aa34c19..6330828834 100644
--- a/src/core/hle/service/glue/glue_manager.h
+++ b/src/core/hle/service/glue/glue_manager.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/glue/notif.cpp b/src/core/hle/service/glue/notif.cpp
index a369b78ddd..716e4da32d 100644
--- a/src/core/hle/service/glue/notif.cpp
+++ b/src/core/hle/service/glue/notif.cpp
@@ -17,45 +17,9 @@
namespace Service::Glue {
namespace {
-constexpr inline std::size_t MaxAlarms = 8;
-}
-std::optional<ServiceFrameworkBase::FunctionInfoBase> INotificationServicesForApplication::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{500, D<&INotificationServicesForApplication::RegisterAlarmSetting>, "RegisterAlarmSetting"},
- FunctionInfo{510, D<&INotificationServicesForApplication::UpdateAlarmSetting>, "UpdateAlarmSetting"},
- FunctionInfo{520, D<&INotificationServicesForApplication::ListAlarmSettings>, "ListAlarmSettings"},
- FunctionInfo{530, D<&INotificationServicesForApplication::LoadApplicationParameter>, "LoadApplicationParameter"},
- FunctionInfo{540, D<&INotificationServicesForApplication::DeleteAlarmSetting>, "DeleteAlarmSetting"},
- FunctionInfo{1000, D<&INotificationServicesForApplication::Initialize>, "Initialize"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
+constexpr inline std::size_t MaxAlarms = 8;
-std::optional<ServiceFrameworkBase::FunctionInfoBase> INotificationServices::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{500, D<&INotificationServices::RegisterAlarmSetting>, "RegisterAlarmSetting"},
- FunctionInfo{510, D<&INotificationServices::UpdateAlarmSetting>, "UpdateAlarmSetting"},
- FunctionInfo{520, D<&INotificationServices::ListAlarmSettings>, "ListAlarmSettings"},
- FunctionInfo{530, D<&INotificationServices::LoadApplicationParameter>, "LoadApplicationParameter"},
- FunctionInfo{540, D<&INotificationServices::DeleteAlarmSetting>, "DeleteAlarmSetting"},
- FunctionInfo{1000, D<&INotificationServices::Initialize>, "Initialize"},
- FunctionInfo{1010, nullptr, "ListNotifications"},
- FunctionInfo{1020, nullptr, "DeleteNotification"},
- FunctionInfo{1030, nullptr, "ClearNotifications"},
- FunctionInfo{1040, D<&INotificationServices::OpenNotificationSystemEventAccessor>, "OpenNotificationSystemEventAccessor"},
- FunctionInfo{1500, nullptr, "SetNotificationPresentationSetting"},
- FunctionInfo{1510, D<&INotificationServices::GetNotificationPresentationSetting>, "GetNotificationPresentationSetting"},
- FunctionInfo{2000, nullptr, "GetAlarmSetting"},
- FunctionInfo{2001, nullptr, "GetAlarmSettingWithApplicationParameter"},
- FunctionInfo{2010, nullptr, "MuteAlarmSetting"},
- FunctionInfo{2020, nullptr, "IsAlarmSettingReady"},
- FunctionInfo{8000, nullptr, "RegisterAppletResourceUserId"},
- FunctionInfo{8010, nullptr, "UnregisterAppletResourceUserId"},
- FunctionInfo{8999, nullptr, "GetCurrentTime"},
- FunctionInfo{9000, nullptr, "GetAlarmSettingNextNotificationTime"}
- );
- return HandlerTableGenerateWithFind(key, functions);
}
Result NotificationServiceImpl::RegisterAlarmSetting(AlarmSettingId* out_alarm_setting_id,
@@ -160,6 +124,18 @@ std::vector<AlarmSetting>::iterator NotificationServiceImpl::GetAlarmFromId(Alar
INotificationServicesForApplication::INotificationServicesForApplication(Core::System& system_)
: ServiceFramework{system_, "notif:a"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {500, D<&INotificationServicesForApplication::RegisterAlarmSetting>, "RegisterAlarmSetting"},
+ {510, D<&INotificationServicesForApplication::UpdateAlarmSetting>, "UpdateAlarmSetting"},
+ {520, D<&INotificationServicesForApplication::ListAlarmSettings>, "ListAlarmSettings"},
+ {530, D<&INotificationServicesForApplication::LoadApplicationParameter>, "LoadApplicationParameter"},
+ {540, D<&INotificationServicesForApplication::DeleteAlarmSetting>, "DeleteAlarmSetting"},
+ {1000, D<&INotificationServicesForApplication::Initialize>, "Initialize"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
INotificationServicesForApplication::~INotificationServicesForApplication() = default;
@@ -202,13 +178,18 @@ class INotificationSystemEventAccessor final
: public ServiceFramework<INotificationSystemEventAccessor> {
public:
explicit INotificationSystemEventAccessor(Core::System& system_)
- : ServiceFramework{system_, "INotificationSystemEventAccessor"}
- , service_context{system_, "INotificationSystemEventAccessor"} {
- notification_event = service_context.CreateEvent("INotificationSystemEventAccessor:NotificationEvent");
- }
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "INotificationSystemEventAccessor"},
+ service_context{system_, "INotificationSystemEventAccessor"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&INotificationSystemEventAccessor::GetSystemEvent>, "GetSystemEvent"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+
+ notification_event =
+ service_context.CreateEvent("INotificationSystemEventAccessor:NotificationEvent");
}
~INotificationSystemEventAccessor() {
@@ -223,15 +204,38 @@ private:
R_SUCCEED();
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&INotificationSystemEventAccessor::GetSystemEvent>, "GetSystemEvent"}
- );
KernelHelpers::ServiceContext service_context;
Kernel::KEvent* notification_event;
};
INotificationServices::INotificationServices(Core::System& system_)
: ServiceFramework{system_, "notif:s"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {500, D<&INotificationServices::RegisterAlarmSetting>, "RegisterAlarmSetting"},
+ {510, D<&INotificationServices::UpdateAlarmSetting>, "UpdateAlarmSetting"},
+ {520, D<&INotificationServices::ListAlarmSettings>, "ListAlarmSettings"},
+ {530, D<&INotificationServices::LoadApplicationParameter>, "LoadApplicationParameter"},
+ {540, D<&INotificationServices::DeleteAlarmSetting>, "DeleteAlarmSetting"},
+ {1000, D<&INotificationServices::Initialize>, "Initialize"},
+ {1010, nullptr, "ListNotifications"},
+ {1020, nullptr, "DeleteNotification"},
+ {1030, nullptr, "ClearNotifications"},
+ {1040, D<&INotificationServices::OpenNotificationSystemEventAccessor>, "OpenNotificationSystemEventAccessor"},
+ {1500, nullptr, "SetNotificationPresentationSetting"},
+ {1510, D<&INotificationServices::GetNotificationPresentationSetting>, "GetNotificationPresentationSetting"},
+ {2000, nullptr, "GetAlarmSetting"},
+ {2001, nullptr, "GetAlarmSettingWithApplicationParameter"},
+ {2010, nullptr, "MuteAlarmSetting"},
+ {2020, nullptr, "IsAlarmSettingReady"},
+ {8000, nullptr, "RegisterAppletResourceUserId"},
+ {8010, nullptr, "UnregisterAppletResourceUserId"},
+ {8999, nullptr, "GetCurrentTime"},
+ {9000, nullptr, "GetAlarmSettingNextNotificationTime"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
INotificationServices::~INotificationServices() = default;
diff --git a/src/core/hle/service/glue/notif.h b/src/core/hle/service/glue/notif.h
index c5367e5da4..7ae20ba6f8 100644
--- a/src/core/hle/service/glue/notif.h
+++ b/src/core/hle/service/glue/notif.h
@@ -101,7 +101,6 @@ private:
Result DeleteAlarmSetting(AlarmSettingId alarm_setting_id);
Result Initialize(ClientAppletResourceUserId aruid);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
NotificationServiceImpl impl;
};
@@ -131,7 +130,6 @@ private:
Out<NotificationPresentationSetting> out_notification_presentation_setting,
NotificationChannel notification_channel);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
NotificationServiceImpl impl;
};
} // namespace Service::Glue
diff --git a/src/core/hle/service/glue/time/alarm_worker.h b/src/core/hle/service/glue/time/alarm_worker.h
index 131d012a6a..c8882fed88 100644
--- a/src/core/hle/service/glue/time/alarm_worker.h
+++ b/src/core/hle/service/glue/time/alarm_worker.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/glue/time/file_timestamp_worker.cpp b/src/core/hle/service/glue/time/file_timestamp_worker.cpp
index 048ff174c9..60bd688e72 100644
--- a/src/core/hle/service/glue/time/file_timestamp_worker.cpp
+++ b/src/core/hle/service/glue/time/file_timestamp_worker.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/glue/time/file_timestamp_worker.h b/src/core/hle/service/glue/time/file_timestamp_worker.h
index 5f8b9b0499..58f74e7d29 100644
--- a/src/core/hle/service/glue/time/file_timestamp_worker.h
+++ b/src/core/hle/service/glue/time/file_timestamp_worker.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/glue/time/manager.cpp b/src/core/hle/service/glue/time/manager.cpp
index 0da790e1c8..0b3312904e 100644
--- a/src/core/hle/service/glue/time/manager.cpp
+++ b/src/core/hle/service/glue/time/manager.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
diff --git a/src/core/hle/service/glue/time/manager.h b/src/core/hle/service/glue/time/manager.h
index 87e6a21fd5..5a86585754 100644
--- a/src/core/hle/service/glue/time/manager.h
+++ b/src/core/hle/service/glue/time/manager.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/glue/time/pm_state_change_handler.cpp b/src/core/hle/service/glue/time/pm_state_change_handler.cpp
index 7470fb2259..0bc37f75da 100644
--- a/src/core/hle/service/glue/time/pm_state_change_handler.cpp
+++ b/src/core/hle/service/glue/time/pm_state_change_handler.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/glue/time/pm_state_change_handler.h b/src/core/hle/service/glue/time/pm_state_change_handler.h
index 27d9f78726..bf99fa8a14 100644
--- a/src/core/hle/service/glue/time/pm_state_change_handler.h
+++ b/src/core/hle/service/glue/time/pm_state_change_handler.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/glue/time/standard_steady_clock_resource.cpp b/src/core/hle/service/glue/time/standard_steady_clock_resource.cpp
index 5ebaa33e00..e191405567 100644
--- a/src/core/hle/service/glue/time/standard_steady_clock_resource.cpp
+++ b/src/core/hle/service/glue/time/standard_steady_clock_resource.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/glue/time/standard_steady_clock_resource.h b/src/core/hle/service/glue/time/standard_steady_clock_resource.h
index 978d6b63b8..b5168cb837 100644
--- a/src/core/hle/service/glue/time/standard_steady_clock_resource.h
+++ b/src/core/hle/service/glue/time/standard_steady_clock_resource.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/glue/time/static.cpp b/src/core/hle/service/glue/time/static.cpp
index dc7651fd1f..beccf6ce43 100644
--- a/src/core/hle/service/glue/time/static.cpp
+++ b/src/core/hle/service/glue/time/static.cpp
@@ -24,42 +24,42 @@
namespace Service::Glue::Time {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> StaticService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&StaticService::GetStandardUserSystemClock>, "GetStandardUserSystemClock"},
- FunctionInfo{1, D<&StaticService::GetStandardNetworkSystemClock>, "GetStandardNetworkSystemClock"},
- FunctionInfo{2, D<&StaticService::GetStandardSteadyClock>, "GetStandardSteadyClock"},
- FunctionInfo{3, D<&StaticService::GetTimeZoneService>, "GetTimeZoneService"},
- FunctionInfo{4, D<&StaticService::GetStandardLocalSystemClock>, "GetStandardLocalSystemClock"},
- FunctionInfo{5, D<&StaticService::GetEphemeralNetworkSystemClock>, "GetEphemeralNetworkSystemClock"},
- FunctionInfo{20, D<&StaticService::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"},
- FunctionInfo{50, D<&StaticService::SetStandardSteadyClockInternalOffset>, "SetStandardSteadyClockInternalOffset"},
- FunctionInfo{51, D<&StaticService::GetStandardSteadyClockRtcValue>, "GetStandardSteadyClockRtcValue"},
- FunctionInfo{100, D<&StaticService::IsStandardUserSystemClockAutomaticCorrectionEnabled>, "IsStandardUserSystemClockAutomaticCorrectionEnabled"},
- FunctionInfo{101, D<&StaticService::SetStandardUserSystemClockAutomaticCorrectionEnabled>, "SetStandardUserSystemClockAutomaticCorrectionEnabled"},
- FunctionInfo{102, D<&StaticService::GetStandardUserSystemClockInitialYear>, "GetStandardUserSystemClockInitialYear"},
- FunctionInfo{200, D<&StaticService::IsStandardNetworkSystemClockAccuracySufficient>, "IsStandardNetworkSystemClockAccuracySufficient"},
- FunctionInfo{201, D<&StaticService::GetStandardUserSystemClockAutomaticCorrectionUpdatedTime>, "GetStandardUserSystemClockAutomaticCorrectionUpdatedTime"},
- FunctionInfo{300, D<&StaticService::CalculateMonotonicSystemClockBaseTimePoint>, "CalculateMonotonicSystemClockBaseTimePoint"},
- FunctionInfo{400, D<&StaticService::GetClockSnapshot>, "GetClockSnapshot"},
- FunctionInfo{401, D<&StaticService::GetClockSnapshotFromSystemClockContext>, "GetClockSnapshotFromSystemClockContext"},
- FunctionInfo{500, D<&StaticService::CalculateStandardUserSystemClockDifferenceByUser>, "CalculateStandardUserSystemClockDifferenceByUser"},
- FunctionInfo{501, D<&StaticService::CalculateSpanBetween>, "CalculateSpanBetween"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
StaticService::StaticService(Core::System& system_,
Service::PSC::Time::StaticServiceSetupInfo setup_info,
std::shared_ptr<TimeManager> time, const char* name)
- : ServiceFramework{system_, name}, m_time_m{time->m_time_m},
+ : ServiceFramework{system_, name}, m_system{system_}, m_time_m{time->m_time_m},
m_setup_info{setup_info}, m_time_sm{time->m_time_sm},
m_file_timestamp_worker{time->m_file_timestamp_worker},
m_standard_steady_clock_resource{time->m_steady_clock_resource},
m_time_zone_binary{time->m_time_zone_binary} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&StaticService::GetStandardUserSystemClock>, "GetStandardUserSystemClock"},
+ {1, D<&StaticService::GetStandardNetworkSystemClock>, "GetStandardNetworkSystemClock"},
+ {2, D<&StaticService::GetStandardSteadyClock>, "GetStandardSteadyClock"},
+ {3, D<&StaticService::GetTimeZoneService>, "GetTimeZoneService"},
+ {4, D<&StaticService::GetStandardLocalSystemClock>, "GetStandardLocalSystemClock"},
+ {5, D<&StaticService::GetEphemeralNetworkSystemClock>, "GetEphemeralNetworkSystemClock"},
+ {20, D<&StaticService::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"},
+ {50, D<&StaticService::SetStandardSteadyClockInternalOffset>, "SetStandardSteadyClockInternalOffset"},
+ {51, D<&StaticService::GetStandardSteadyClockRtcValue>, "GetStandardSteadyClockRtcValue"},
+ {100, D<&StaticService::IsStandardUserSystemClockAutomaticCorrectionEnabled>, "IsStandardUserSystemClockAutomaticCorrectionEnabled"},
+ {101, D<&StaticService::SetStandardUserSystemClockAutomaticCorrectionEnabled>, "SetStandardUserSystemClockAutomaticCorrectionEnabled"},
+ {102, D<&StaticService::GetStandardUserSystemClockInitialYear>, "GetStandardUserSystemClockInitialYear"},
+ {200, D<&StaticService::IsStandardNetworkSystemClockAccuracySufficient>, "IsStandardNetworkSystemClockAccuracySufficient"},
+ {201, D<&StaticService::GetStandardUserSystemClockAutomaticCorrectionUpdatedTime>, "GetStandardUserSystemClockAutomaticCorrectionUpdatedTime"},
+ {300, D<&StaticService::CalculateMonotonicSystemClockBaseTimePoint>, "CalculateMonotonicSystemClockBaseTimePoint"},
+ {400, D<&StaticService::GetClockSnapshot>, "GetClockSnapshot"},
+ {401, D<&StaticService::GetClockSnapshotFromSystemClockContext>, "GetClockSnapshotFromSystemClockContext"},
+ {500, D<&StaticService::CalculateStandardUserSystemClockDifferenceByUser>, "CalculateStandardUserSystemClockDifferenceByUser"},
+ {501, D<&StaticService::CalculateSpanBetween>, "CalculateSpanBetween"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
m_set_sys =
- system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true);
+ m_system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true);
if (m_setup_info.can_write_local_clock && m_setup_info.can_write_user_clock &&
!m_setup_info.can_write_network_clock && m_setup_info.can_write_timezone_device_location &&
@@ -109,7 +109,7 @@ Result StaticService::GetTimeZoneService(OutInterface<TimeZoneService> out_servi
LOG_DEBUG(Service_Time, "called.");
*out_service = std::make_shared<TimeZoneService>(
- system, m_file_timestamp_worker, m_setup_info.can_write_timezone_device_location,
+ m_system, m_file_timestamp_worker, m_setup_info.can_write_timezone_device_location,
m_time_zone_binary, m_time_zone);
R_SUCCEED();
}
diff --git a/src/core/hle/service/glue/time/static.h b/src/core/hle/service/glue/time/static.h
index 5856553461..a52b84bf31 100644
--- a/src/core/hle/service/glue/time/static.h
+++ b/src/core/hle/service/glue/time/static.h
@@ -72,11 +72,12 @@ public:
Result CalculateSpanBetween(Out<s64> out_time, InClockSnapshot a, InClockSnapshot b);
private:
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
+ Core::System& m_system;
std::shared_ptr<Service::Set::ISystemSettingsServer> m_set_sys;
std::shared_ptr<Service::PSC::Time::ServiceManager> m_time_m;
std::shared_ptr<Service::PSC::Time::StaticService> m_wrapped_service;
+
Service::PSC::Time::StaticServiceSetupInfo m_setup_info;
std::shared_ptr<Service::PSC::Time::StaticService> m_time_sm;
std::shared_ptr<Service::PSC::Time::TimeZoneService> m_time_zone;
diff --git a/src/core/hle/service/glue/time/time_zone.cpp b/src/core/hle/service/glue/time/time_zone.cpp
index 6e861b4060..52bd651f2b 100644
--- a/src/core/hle/service/glue/time/time_zone.cpp
+++ b/src/core/hle/service/glue/time/time_zone.cpp
@@ -19,26 +19,6 @@
namespace Service::Glue::Time {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> TimeZoneService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&TimeZoneService::GetDeviceLocationName>, "GetDeviceLocationName"},
- FunctionInfo{1, D<&TimeZoneService::SetDeviceLocationName>, "SetDeviceLocationName"},
- FunctionInfo{2, D<&TimeZoneService::GetTotalLocationNameCount>, "GetTotalLocationNameCount"},
- FunctionInfo{3, D<&TimeZoneService::LoadLocationNameList>, "LoadLocationNameList"},
- FunctionInfo{4, D<&TimeZoneService::LoadTimeZoneRule>, "LoadTimeZoneRule"},
- FunctionInfo{5, D<&TimeZoneService::GetTimeZoneRuleVersion>, "GetTimeZoneRuleVersion"},
- FunctionInfo{6, D<&TimeZoneService::GetDeviceLocationNameAndUpdatedTime>, "GetDeviceLocationNameAndUpdatedTime"},
- FunctionInfo{7, D<&TimeZoneService::SetDeviceLocationNameWithTimeZoneRule>, "SetDeviceLocationNameWithTimeZoneRule"},
- FunctionInfo{8, D<&TimeZoneService::ParseTimeZoneBinary>, "ParseTimeZoneBinary"},
- FunctionInfo{20, D<&TimeZoneService::GetDeviceLocationNameOperationEventReadableHandle>, "GetDeviceLocationNameOperationEventReadableHandle"},
- FunctionInfo{100, D<&TimeZoneService::ToCalendarTime>, "ToCalendarTime"},
- FunctionInfo{101, D<&TimeZoneService::ToCalendarTimeWithMyRule>, "ToCalendarTimeWithMyRule"},
- FunctionInfo{201, D<&TimeZoneService::ToPosixTime>, "ToPosixTime"},
- FunctionInfo{202, D<&TimeZoneService::ToPosixTimeWithMyRule>, "ToPosixTimeWithMyRule"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
TimeZoneService::TimeZoneService(
Core::System& system_, FileTimestampWorker& file_timestamp_worker,
bool can_write_timezone_device_location, TimeZoneBinary& time_zone_binary,
@@ -50,6 +30,26 @@ TimeZoneService::TimeZoneService(
, m_operation_event{system}
, m_time_zone_binary{time_zone_binary}
{
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&TimeZoneService::GetDeviceLocationName>, "GetDeviceLocationName"},
+ {1, D<&TimeZoneService::SetDeviceLocationName>, "SetDeviceLocationName"},
+ {2, D<&TimeZoneService::GetTotalLocationNameCount>, "GetTotalLocationNameCount"},
+ {3, D<&TimeZoneService::LoadLocationNameList>, "LoadLocationNameList"},
+ {4, D<&TimeZoneService::LoadTimeZoneRule>, "LoadTimeZoneRule"},
+ {5, D<&TimeZoneService::GetTimeZoneRuleVersion>, "GetTimeZoneRuleVersion"},
+ {6, D<&TimeZoneService::GetDeviceLocationNameAndUpdatedTime>, "GetDeviceLocationNameAndUpdatedTime"},
+ {7, D<&TimeZoneService::SetDeviceLocationNameWithTimeZoneRule>, "SetDeviceLocationNameWithTimeZoneRule"},
+ {8, D<&TimeZoneService::ParseTimeZoneBinary>, "ParseTimeZoneBinary"},
+ {20, D<&TimeZoneService::GetDeviceLocationNameOperationEventReadableHandle>, "GetDeviceLocationNameOperationEventReadableHandle"},
+ {100, D<&TimeZoneService::ToCalendarTime>, "ToCalendarTime"},
+ {101, D<&TimeZoneService::ToCalendarTimeWithMyRule>, "ToCalendarTimeWithMyRule"},
+ {201, D<&TimeZoneService::ToPosixTime>, "ToPosixTime"},
+ {202, D<&TimeZoneService::ToPosixTimeWithMyRule>, "ToPosixTimeWithMyRule"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
+
m_set_sys = system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true);
}
diff --git a/src/core/hle/service/glue/time/time_zone.h b/src/core/hle/service/glue/time/time_zone.h
index 839d823e67..635070263b 100644
--- a/src/core/hle/service/glue/time/time_zone.h
+++ b/src/core/hle/service/glue/time/time_zone.h
@@ -80,7 +80,6 @@ public:
const Service::PSC::Time::CalendarTime& calendar_time);
private:
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::shared_ptr<Service::Set::ISystemSettingsServer> m_set_sys;
bool m_can_write_timezone_device_location;
FileTimestampWorker& m_file_timestamp_worker;
diff --git a/src/core/hle/service/glue/time/time_zone_binary.cpp b/src/core/hle/service/glue/time/time_zone_binary.cpp
index 3cc1a62afd..eadad551e5 100644
--- a/src/core/hle/service/glue/time/time_zone_binary.cpp
+++ b/src/core/hle/service/glue/time/time_zone_binary.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/glue/time/time_zone_binary.h b/src/core/hle/service/glue/time/time_zone_binary.h
index 135da631f2..012b933573 100644
--- a/src/core/hle/service/glue/time/time_zone_binary.h
+++ b/src/core/hle/service/glue/time/time_zone_binary.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/glue/time/worker.h b/src/core/hle/service/glue/time/worker.h
index 69904e6748..f4be2ff367 100644
--- a/src/core/hle/service/glue/time/worker.h
+++ b/src/core/hle/service/glue/time/worker.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/gpio/gpio.cpp b/src/core/hle/service/gpio/gpio.cpp
index 5441149c65..8b4aa0f5ab 100644
--- a/src/core/hle/service/gpio/gpio.cpp
+++ b/src/core/hle/service/gpio/gpio.cpp
@@ -13,15 +13,15 @@ namespace Service::GPIO {
class GPIO final : public ServiceFramework<GPIO> {
public:
- explicit GPIO(Core::System& system_) : ServiceFramework{system_, "gpio"} {}
- ~GPIO() override = default;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit GPIO(Core::System& system_)
+ : ServiceFramework{system_, "gpio"}
+ {
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "Cmd0"},
+ };
+ RegisterHandlers(functions);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "Cmd0"}
- );
+ ~GPIO() override = default;
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/grc/grc.cpp b/src/core/hle/service/grc/grc.cpp
index 5f6c84e914..e8e901662d 100644
--- a/src/core/hle/service/grc/grc.cpp
+++ b/src/core/hle/service/grc/grc.cpp
@@ -14,31 +14,32 @@ namespace Service::GRC {
class GRC final : public ServiceFramework<GRC> {
public:
- explicit GRC(Core::System& system_) : ServiceFramework{system_, "grc:c"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{1, nullptr, "OpenContinuousRecorder"},
- FunctionInfo{2, nullptr, "OpenGameMovieTrimmer"},
- FunctionInfo{3, nullptr, "OpenOffscreenRecorder"},
- FunctionInfo{101, nullptr, "CreateMovieMaker"},
- FunctionInfo{9903, nullptr, "SetOffscreenRecordingMarker"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit GRC(Core::System& system_) : ServiceFramework{system_, "grc:c"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {1, nullptr, "OpenContinuousRecorder"},
+ {2, nullptr, "OpenGameMovieTrimmer"},
+ {3, nullptr, "OpenOffscreenRecorder"},
+ {101, nullptr, "CreateMovieMaker"},
+ {9903, nullptr, "SetOffscreenRecordingMarker"}
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
class GRC_D final : public ServiceFramework<GRC_D> {
public:
- explicit GRC_D(Core::System& system_) : ServiceFramework{system_, "grc:d"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{1, nullptr, "Initialize"},
- FunctionInfo{2, nullptr, "Transfer"},
- FunctionInfo{3, nullptr, "Cmd3"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit GRC_D(Core::System& system_) : ServiceFramework{system_, "grc:d"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {1, nullptr, "Initialize"},
+ {2, nullptr, "Transfer"},
+ {3, nullptr, "Cmd3"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
diff --git a/src/core/hle/service/grc/grc.h b/src/core/hle/service/grc/grc.h
index a3f8a5b90e..4c2b45057d 100644
--- a/src/core/hle/service/grc/grc.h
+++ b/src/core/hle/service/grc/grc.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/hid/active_vibration_device_list.cpp b/src/core/hle/service/hid/active_vibration_device_list.cpp
index 7a4f4cce2c..e0d6d3f2d9 100644
--- a/src/core/hle/service/hid/active_vibration_device_list.cpp
+++ b/src/core/hle/service/hid/active_vibration_device_list.cpp
@@ -14,16 +14,16 @@
namespace Service::HID {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IActiveVibrationDeviceList::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, C<&IActiveVibrationDeviceList::ActivateVibrationDevice>, "ActivateVibrationDevice"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IActiveVibrationDeviceList::IActiveVibrationDeviceList(Core::System& system_,
std::shared_ptr<ResourceManager> resource)
: ServiceFramework{system_, "IActiveVibrationDeviceList"}, resource_manager(resource) {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, C<&IActiveVibrationDeviceList::ActivateVibrationDevice>, "ActivateVibrationDevice"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IActiveVibrationDeviceList::~IActiveVibrationDeviceList() = default;
diff --git a/src/core/hle/service/hid/active_vibration_device_list.h b/src/core/hle/service/hid/active_vibration_device_list.h
index 57c31a8df1..f155eaf839 100644
--- a/src/core/hle/service/hid/active_vibration_device_list.h
+++ b/src/core/hle/service/hid/active_vibration_device_list.h
@@ -29,8 +29,8 @@ public:
private:
static constexpr std::size_t MaxVibrationDevicesHandles{0x100};
+
Result ActivateVibrationDevice(Core::HID::VibrationDeviceHandle vibration_device_handle);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
mutable std::mutex mutex;
std::size_t list_size{};
diff --git a/src/core/hle/service/hid/applet_resource.cpp b/src/core/hle/service/hid/applet_resource.cpp
index 6f658fa875..44ae767841 100644
--- a/src/core/hle/service/hid/applet_resource.cpp
+++ b/src/core/hle/service/hid/applet_resource.cpp
@@ -12,17 +12,14 @@
namespace Service::HID {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IAppletResource::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, C<&IAppletResource::GetSharedMemoryHandle>, "GetSharedMemoryHandle"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IAppletResource::IAppletResource(Core::System& system_, std::shared_ptr<ResourceManager> resource,
u64 applet_resource_user_id)
: ServiceFramework{system_, "IAppletResource"}, aruid{applet_resource_user_id},
resource_manager{resource} {
+ static const FunctionInfo functions[] = {
+ {0, C<&IAppletResource::GetSharedMemoryHandle>, "GetSharedMemoryHandle"},
+ };
+ RegisterHandlers(functions);
}
IAppletResource::~IAppletResource() {
diff --git a/src/core/hle/service/hid/applet_resource.h b/src/core/hle/service/hid/applet_resource.h
index 7b5d915218..40c3852baa 100644
--- a/src/core/hle/service/hid/applet_resource.h
+++ b/src/core/hle/service/hid/applet_resource.h
@@ -32,7 +32,6 @@ public:
private:
Result GetSharedMemoryHandle(OutCopyHandle<Kernel::KSharedMemory> out_shared_memory_handle);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
u64 aruid{};
std::shared_ptr<ResourceManager> resource_manager;
};
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp
index 0ea587312b..25096ff36f 100644
--- a/src/core/hle/service/hid/hid.cpp
+++ b/src/core/hle/service/hid/hid.cpp
@@ -16,24 +16,19 @@
#include "core/hle/service/server_manager.h"
#include "hid_core/resource_manager.h"
#include "hid_core/resources/hid_firmware_settings.h"
-#include "core/hle/service/ipc_helpers.h"
-#include "hid_core/hid_types.h"
-#include "hid_core/resources/touch_screen/gesture.h"
-#include "hid_core/resources/touch_screen/touch_screen.h"
-#include "core/hle/service/cmif_serialization.h"
namespace Service::HID {
class IHidTemporaryServer final : public ServiceFramework<IHidTemporaryServer> {
public:
explicit IHidTemporaryServer(Core::System& system_)
- : ServiceFramework{system_, "hid:tmp"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetConsoleSixAxisSensorCalibrationValues"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "hid:tmp"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetConsoleSixAxisSensorCalibrationValues"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
~IHidTemporaryServer() override = default;
};
@@ -41,17 +36,17 @@ public:
class AHID_CD final : public ServiceFramework<AHID_CD> {
public:
explicit AHID_CD(Core::System& system_)
- : ServiceFramework{system_, "ahid:cd"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "AcquireDevice"},
- FunctionInfo{1, nullptr, "ReleaseDevice"},
- FunctionInfo{2, nullptr, "GetCtrlSession"},
- FunctionInfo{3, nullptr, "GetReadSession"},
- FunctionInfo{4, nullptr, "GetWriteSession"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "ahid:cd"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "AcquireDevice"},
+ {1, nullptr, "ReleaseDevice"},
+ {2, nullptr, "GetCtrlSession"},
+ {3, nullptr, "GetReadSession"},
+ {4, nullptr, "GetWriteSession"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
~AHID_CD() override = default;
};
@@ -59,322 +54,22 @@ public:
class AHID_HDR final : public ServiceFramework<AHID_HDR> {
public:
explicit AHID_HDR(Core::System& system_)
- : ServiceFramework{system_, "ahid:hdr"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetDeviceEntries"},
- FunctionInfo{1, nullptr, "GetDeviceList"},
- FunctionInfo{2, nullptr, "GetDeviceParameters"},
- FunctionInfo{3, nullptr, "AttachDevice"},
- FunctionInfo{4, nullptr, "DetachDevice"},
- FunctionInfo{5, nullptr, "SetDeviceFilter"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "ahid:hdr"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetDeviceEntries"},
+ {1, nullptr, "GetDeviceList"},
+ {2, nullptr, "GetDeviceParameters"},
+ {3, nullptr, "AttachDevice"},
+ {4, nullptr, "DetachDevice"},
+ {5, nullptr, "SetDeviceFilter"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
~AHID_HDR() override = default;
};
-class IHidDebugServer final : public ServiceFramework<IHidDebugServer> {
-public:
- explicit IHidDebugServer(Core::System& system_, std::shared_ptr<ResourceManager> resource,
- std::shared_ptr<HidFirmwareSettings> settings)
- : ServiceFramework{system_, "hid:dbg"}
- , resource_manager{resource}
- , firmware_settings{settings}
- {}
-
- ~IHidDebugServer() override = default;
-
- Result DeactivateTouchScreen() {
- LOG_INFO(Service_HID, "called");
-
- if (!firmware_settings->IsDeviceManaged()) {
- R_RETURN(GetResourceManager()->GetTouchScreen()->Deactivate());
- }
-
- R_SUCCEED();
- }
-
- Result SetTouchScreenAutoPilotState(
- InArray<TouchState, BufferAttr_HipcMapAlias> auto_pilot_buffer) {
- AutoPilotState auto_pilot{};
-
- auto_pilot.count =
- static_cast<u64>((std::min)(auto_pilot_buffer.size(), auto_pilot.state.size()));
- memcpy(auto_pilot.state.data(), auto_pilot_buffer.data(),
- auto_pilot.count * sizeof(TouchState));
-
- LOG_INFO(Service_HID, "called, auto_pilot_count={}", auto_pilot.count);
-
- R_RETURN(GetResourceManager()->GetTouchScreen()->SetTouchScreenAutoPilotState(auto_pilot));
- }
-
- Result UnsetTouchScreenAutoPilotState() {
- LOG_INFO(Service_HID, "called");
- R_RETURN(GetResourceManager()->GetTouchScreen()->UnsetTouchScreenAutoPilotState());
- }
-
- Result GetTouchScreenConfiguration(
- Out<Core::HID::TouchScreenConfigurationForNx> out_touchscreen_config,
- ClientAppletResourceUserId aruid) {
- LOG_INFO(Service_HID, "called, applet_resource_user_id={}", aruid.pid);
-
- R_TRY(GetResourceManager()->GetTouchScreen()->GetTouchScreenConfiguration(
- *out_touchscreen_config, aruid.pid));
-
- if (out_touchscreen_config->mode != Core::HID::TouchScreenModeForNx::Heat2 &&
- out_touchscreen_config->mode != Core::HID::TouchScreenModeForNx::Finger) {
- out_touchscreen_config->mode = Core::HID::TouchScreenModeForNx::UseSystemSetting;
- }
-
- R_SUCCEED();
- }
-
- Result ProcessTouchScreenAutoTune() {
- LOG_INFO(Service_HID, "called");
- R_RETURN(GetResourceManager()->GetTouchScreen()->ProcessTouchScreenAutoTune());
- }
-
- Result ForceStopTouchScreenManagement() {
- LOG_INFO(Service_HID, "called");
-
- if (!firmware_settings->IsDeviceManaged()) {
- R_SUCCEED();
- }
-
- auto touch_screen = GetResourceManager()->GetTouchScreen();
- auto gesture = GetResourceManager()->GetGesture();
-
- if (firmware_settings->IsTouchI2cManaged()) {
- bool is_touch_active{};
- bool is_gesture_active{};
- R_TRY(touch_screen->IsActive(is_touch_active));
- R_TRY(gesture->IsActive(is_gesture_active));
-
- if (is_touch_active) {
- R_TRY(touch_screen->Deactivate());
- }
- if (is_gesture_active) {
- R_TRY(gesture->Deactivate());
- }
- }
-
- R_SUCCEED();
- }
-
- Result ForceRestartTouchScreenManagement(u32 basic_gesture_id,
- ClientAppletResourceUserId aruid) {
- LOG_INFO(Service_HID, "called, basic_gesture_id={}, applet_resource_user_id={}",
- basic_gesture_id, aruid.pid);
-
- auto touch_screen = GetResourceManager()->GetTouchScreen();
- auto gesture = GetResourceManager()->GetGesture();
-
- if (firmware_settings->IsDeviceManaged() && firmware_settings->IsTouchI2cManaged()) {
- R_TRY(gesture->Activate());
- R_TRY(gesture->Activate(aruid.pid, basic_gesture_id));
- R_TRY(touch_screen->Activate());
- R_TRY(touch_screen->Activate(aruid.pid));
- }
-
- R_SUCCEED();
- }
-
- Result IsTouchScreenManaged(Out<bool> out_is_managed) {
- LOG_INFO(Service_HID, "called");
-
- bool is_touch_active{};
- bool is_gesture_active{};
- R_TRY(GetResourceManager()->GetTouchScreen()->IsActive(is_touch_active));
- R_TRY(GetResourceManager()->GetGesture()->IsActive(is_gesture_active));
-
- *out_is_managed = is_touch_active || is_gesture_active;
- R_SUCCEED();
- }
-
- Result DeactivateGesture() {
- LOG_INFO(Service_HID, "called");
-
- if (!firmware_settings->IsDeviceManaged()) {
- R_RETURN(GetResourceManager()->GetGesture()->Deactivate());
- }
-
- R_SUCCEED();
- }
-
- std::shared_ptr<ResourceManager> GetResourceManager() {
- resource_manager->Initialize();
- return resource_manager;
- }
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "DeactivateDebugPad"},
- FunctionInfo{1, nullptr, "SetDebugPadAutoPilotState"},
- FunctionInfo{2, nullptr, "UnsetDebugPadAutoPilotState"},
- FunctionInfo{10, C<&IHidDebugServer::DeactivateTouchScreen>, "DeactivateTouchScreen"},
- FunctionInfo{11, C<&IHidDebugServer::SetTouchScreenAutoPilotState>, "SetTouchScreenAutoPilotState"},
- FunctionInfo{12, C<&IHidDebugServer::UnsetTouchScreenAutoPilotState>, "UnsetTouchScreenAutoPilotState"},
- FunctionInfo{13, C<&IHidDebugServer::GetTouchScreenConfiguration>, "GetTouchScreenConfiguration"},
- FunctionInfo{14, C<&IHidDebugServer::ProcessTouchScreenAutoTune>, "ProcessTouchScreenAutoTune"},
- FunctionInfo{15, C<&IHidDebugServer::ForceStopTouchScreenManagement>, "ForceStopTouchScreenManagement"},
- FunctionInfo{16, C<&IHidDebugServer::ForceRestartTouchScreenManagement>, "ForceRestartTouchScreenManagement"},
- FunctionInfo{17, C<&IHidDebugServer::IsTouchScreenManaged>, "IsTouchScreenManaged"},
- FunctionInfo{20, nullptr, "DeactivateMouse"},
- FunctionInfo{21, nullptr, "SetMouseAutoPilotState"},
- FunctionInfo{22, nullptr, "UnsetMouseAutoPilotState"},
- FunctionInfo{23, nullptr, "AddMouseSideWheelDelta"},
- FunctionInfo{25, nullptr, "SetDebugMouseAutoPilotState"},
- FunctionInfo{26, nullptr, "UnsetDebugMouseAutoPilotState"},
- FunctionInfo{30, nullptr, "DeactivateKeyboard"},
- FunctionInfo{31, nullptr, "SetKeyboardAutoPilotState"},
- FunctionInfo{32, nullptr, "UnsetKeyboardAutoPilotState"},
- FunctionInfo{50, nullptr, "DeactivateXpad"},
- FunctionInfo{51, nullptr, "SetXpadAutoPilotState"},
- FunctionInfo{52, nullptr, "UnsetXpadAutoPilotState"},
- FunctionInfo{53, nullptr, "DeactivateJoyXpad"},
- FunctionInfo{60, nullptr, "ClearNpadSystemCommonPolicy"},
- FunctionInfo{61, nullptr, "DeactivateNpad"},
- FunctionInfo{62, nullptr, "ForceDisconnectNpad"},
- FunctionInfo{91, C<&IHidDebugServer::DeactivateGesture>, "DeactivateGesture"},
- FunctionInfo{110, nullptr, "DeactivateHomeButton"},
- FunctionInfo{111, nullptr, "SetHomeButtonAutoPilotState"},
- FunctionInfo{112, nullptr, "UnsetHomeButtonAutoPilotState"},
- FunctionInfo{120, nullptr, "DeactivateSleepButton"},
- FunctionInfo{121, nullptr, "SetSleepButtonAutoPilotState"},
- FunctionInfo{122, nullptr, "UnsetSleepButtonAutoPilotState"},
- FunctionInfo{123, nullptr, "DeactivateInputDetector"},
- FunctionInfo{130, nullptr, "DeactivateCaptureButton"},
- FunctionInfo{131, nullptr, "SetCaptureButtonAutoPilotState"},
- FunctionInfo{132, nullptr, "UnsetCaptureButtonAutoPilotState"},
- FunctionInfo{133, nullptr, "SetShiftAccelerometerCalibrationValue"},
- FunctionInfo{134, nullptr, "GetShiftAccelerometerCalibrationValue"},
- FunctionInfo{135, nullptr, "SetShiftGyroscopeCalibrationValue"},
- FunctionInfo{136, nullptr, "GetShiftGyroscopeCalibrationValue"},
- FunctionInfo{140, nullptr, "DeactivateConsoleSixAxisSensor"},
- FunctionInfo{141, nullptr, "GetConsoleSixAxisSensorSamplingFrequency"},
- FunctionInfo{142, nullptr, "DeactivateSevenSixAxisSensor"},
- FunctionInfo{143, nullptr, "GetConsoleSixAxisSensorCountStates"},
- FunctionInfo{144, nullptr, "GetAccelerometerFsr"},
- FunctionInfo{145, nullptr, "SetAccelerometerFsr"},
- FunctionInfo{146, nullptr, "GetAccelerometerOdr"},
- FunctionInfo{147, nullptr, "SetAccelerometerOdr"},
- FunctionInfo{148, nullptr, "GetGyroscopeFsr"},
- FunctionInfo{149, nullptr, "SetGyroscopeFsr"},
- FunctionInfo{150, nullptr, "GetGyroscopeOdr"},
- FunctionInfo{151, nullptr, "SetGyroscopeOdr"},
- FunctionInfo{152, nullptr, "GetWhoAmI"},
- FunctionInfo{201, nullptr, "ActivateFirmwareUpdate"},
- FunctionInfo{202, nullptr, "DeactivateFirmwareUpdate"},
- FunctionInfo{203, nullptr, "StartFirmwareUpdate"},
- FunctionInfo{204, nullptr, "GetFirmwareUpdateStage"},
- FunctionInfo{205, nullptr, "GetFirmwareVersion"},
- FunctionInfo{206, nullptr, "GetDestinationFirmwareVersion"},
- FunctionInfo{207, nullptr, "DiscardFirmwareInfoCacheForRevert"},
- FunctionInfo{208, nullptr, "StartFirmwareUpdateForRevert"},
- FunctionInfo{209, nullptr, "GetAvailableFirmwareVersionForRevert"},
- FunctionInfo{210, nullptr, "IsFirmwareUpdatingDevice"},
- FunctionInfo{211, nullptr, "StartFirmwareUpdateIndividual"},
- FunctionInfo{212, nullptr, "GetDetailFirmwareVersion", MakeVersionGate({19,0,0})},
- FunctionInfo{215, nullptr, "SetUsbFirmwareForceUpdateEnabled"},
- FunctionInfo{216, nullptr, "SetAllKuinaDevicesToFirmwareUpdateMode"},
- FunctionInfo{221, nullptr, "UpdateControllerColor"},
- FunctionInfo{222, nullptr, "ConnectUsbPadsAsync"},
- FunctionInfo{223, nullptr, "DisconnectUsbPadsAsync"},
- FunctionInfo{224, nullptr, "UpdateDesignInfo"},
- FunctionInfo{225, nullptr, "GetUniquePadDriverState"},
- FunctionInfo{226, nullptr, "GetSixAxisSensorDriverStates"},
- FunctionInfo{227, nullptr, "GetRxPacketHistory"},
- FunctionInfo{228, nullptr, "AcquireOperationEventHandle"},
- FunctionInfo{229, nullptr, "ReadSerialFlash"},
- FunctionInfo{230, nullptr, "WriteSerialFlash"},
- FunctionInfo{231, nullptr, "GetOperationResult"},
- FunctionInfo{232, nullptr, "EnableShipmentMode"},
- FunctionInfo{233, nullptr, "ClearPairingInfo"},
- FunctionInfo{234, nullptr, "GetUniquePadDeviceTypeSetInternal"},
- FunctionInfo{235, nullptr, "EnableAnalogStickPower"},
- FunctionInfo{236, nullptr, "RequestKuinaUartClockCal"},
- FunctionInfo{237, nullptr, "GetKuinaUartClockCal"},
- FunctionInfo{238, nullptr, "SetKuinaUartClockTrim"},
- FunctionInfo{239, nullptr, "KuinaLoopbackTest"},
- FunctionInfo{240, nullptr, "RequestBatteryVoltage"},
- FunctionInfo{241, nullptr, "GetBatteryVoltage"},
- FunctionInfo{242, nullptr, "GetUniquePadPowerInfo"},
- FunctionInfo{243, nullptr, "RebootUniquePad"},
- FunctionInfo{244, nullptr, "RequestKuinaFirmwareVersion"},
- FunctionInfo{245, nullptr, "GetKuinaFirmwareVersion"},
- FunctionInfo{246, nullptr, "GetVidPid"},
- FunctionInfo{247, nullptr, "GetAnalogStickCalibrationValue"},
- FunctionInfo{248, nullptr, "GetUniquePadIdsFull"},
- FunctionInfo{249, nullptr, "ConnectUniquePad"},
- FunctionInfo{250, nullptr, "IsVirtual"},
- FunctionInfo{251, nullptr, "GetAnalogStickModuleParam"},
- FunctionInfo{253, nullptr, "ClearStorageForShipment", MakeVersionGate({19,0,0})},
- FunctionInfo{261, nullptr, "UpdateDesignInfo12", MakeVersionGate({21,0,0})},
- FunctionInfo{262, nullptr, "GetUniquePadButtonCount", MakeVersionGate({21,0,0})},
- FunctionInfo{267, nullptr, "SetAnalogStickCalibration", MakeVersionGate({21,0,0})},
- FunctionInfo{268, nullptr, "ResetAnalogStickCalibration", MakeVersionGate({21,0,0})},
- FunctionInfo{301, nullptr, "GetAbstractedPadHandles"},
- FunctionInfo{302, nullptr, "GetAbstractedPadState"},
- FunctionInfo{303, nullptr, "GetAbstractedPadsState"},
- FunctionInfo{321, nullptr, "SetAutoPilotVirtualPadState"},
- FunctionInfo{322, nullptr, "UnsetAutoPilotVirtualPadState"},
- FunctionInfo{323, nullptr, "UnsetAllAutoPilotVirtualPadState"},
- FunctionInfo{324, nullptr, "AttachHdlsWorkBuffer"},
- FunctionInfo{325, nullptr, "ReleaseHdlsWorkBuffer"},
- FunctionInfo{326, nullptr, "DumpHdlsNpadAssignmentState"},
- FunctionInfo{327, nullptr, "DumpHdlsStates"},
- FunctionInfo{328, nullptr, "ApplyHdlsNpadAssignmentState"},
- FunctionInfo{329, nullptr, "ApplyHdlsStateList"},
- FunctionInfo{330, nullptr, "AttachHdlsVirtualDevice"},
- FunctionInfo{331, nullptr, "DetachHdlsVirtualDevice"},
- FunctionInfo{332, nullptr, "SetHdlsState"},
- FunctionInfo{350, nullptr, "AddRegisteredDevice"},
- FunctionInfo{351, nullptr, "GetRegisteredDevicesCountDebug", MakeVersionGate({17,0,0}, {18,1,0})},
- FunctionInfo{352, nullptr, "DeleteRegisteredDevicesDebug", MakeVersionGate({17,0,0}, {18,1,0})},
- FunctionInfo{400, nullptr, "DisableExternalMcuOnNxDevice"},
- FunctionInfo{401, nullptr, "DisableRailDeviceFiltering"},
- FunctionInfo{402, nullptr, "EnableWiredPairing"},
- FunctionInfo{403, nullptr, "EnableShipmentModeAutoClear"},
- FunctionInfo{404, nullptr, "SetRailEnabled"},
- FunctionInfo{500, nullptr, "SetFactoryInt"},
- FunctionInfo{501, nullptr, "IsFactoryBootEnabled"},
- FunctionInfo{550, nullptr, "SetAnalogStickModelDataTemporarily"},
- FunctionInfo{551, nullptr, "GetAnalogStickModelData"},
- FunctionInfo{552, nullptr, "ResetAnalogStickModelData"},
- FunctionInfo{600, nullptr, "ConvertPadState"},
- FunctionInfo{601, nullptr, "IsButtonConfigSupported", MakeVersionGate({18,0,0})},
- FunctionInfo{602, nullptr, "IsButtonConfigEmbeddedSupported", MakeVersionGate({18,0,0})},
- FunctionInfo{603, nullptr, "DeleteButtonConfig", MakeVersionGate({18,0,0})},
- FunctionInfo{604, nullptr, "DeleteButtonConfigEmbedded", MakeVersionGate({18,0,0})},
- FunctionInfo{605, nullptr, "SetButtonConfigEnabled", MakeVersionGate({18,0,0})},
- FunctionInfo{606, nullptr, "SetButtonConfigEmbeddedEnabled", MakeVersionGate({18,0,0})},
- FunctionInfo{607, nullptr, "IsButtonConfigEnabled", MakeVersionGate({18,0,0})},
- FunctionInfo{608, nullptr, "IsButtonConfigEmbeddedEnabled", MakeVersionGate({18,0,0})},
- FunctionInfo{609, nullptr, "SetButtonConfigEmbedded", MakeVersionGate({18,0,0})},
- FunctionInfo{610, nullptr, "SetButtonConfigFull", MakeVersionGate({18,0,0})},
- FunctionInfo{611, nullptr, "SetButtonConfigLeft", MakeVersionGate({18,0,0})},
- FunctionInfo{612, nullptr, "SetButtonConfigRight", MakeVersionGate({18,0,0})},
- FunctionInfo{613, nullptr, "GetButtonConfigEmbedded", MakeVersionGate({18,0,0})},
- FunctionInfo{614, nullptr, "GetButtonConfigFull", MakeVersionGate({18,0,0})},
- FunctionInfo{615, nullptr, "GetButtonConfigLeft", MakeVersionGate({18,0,0})},
- FunctionInfo{616, nullptr, "GetButtonConfigRight", MakeVersionGate({18,0,0})},
- FunctionInfo{650, nullptr, "AddButtonPlayData"},
- FunctionInfo{651, nullptr, "StartButtonPlayData"},
- FunctionInfo{652, nullptr, "StopButtonPlayData"},
- FunctionInfo{700, nullptr, "GetRailAttachEventCount", MakeVersionGate({21,0,0})},
- FunctionInfo{2000, nullptr, "DeactivateDigitizer"},
- FunctionInfo{2001, nullptr, "SetDigitizerAutoPilotState"},
- FunctionInfo{2002, nullptr, "UnsetDigitizerAutoPilotState"},
- FunctionInfo{3000, nullptr, "ReloadFirmwareDebugSettings"}
- );
- std::shared_ptr<ResourceManager> resource_manager;
- std::shared_ptr<HidFirmwareSettings> firmware_settings;
-};
-
void LoopProcess(Core::System& system) {
auto server_manager = std::make_unique<ServerManager>(system);
auto firmware_settings = std::make_shared<HidFirmwareSettings>(system);
diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h
index ec5463f4e2..bf8cd44481 100644
--- a/src/core/hle/service/hid/hid.h
+++ b/src/core/hle/service/hid/hid.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/hid/hid_debug_server.cpp b/src/core/hle/service/hid/hid_debug_server.cpp
index 091d09dae5..42428a9ff9 100644
--- a/src/core/hle/service/hid/hid_debug_server.cpp
+++ b/src/core/hle/service/hid/hid_debug_server.cpp
@@ -18,4 +18,298 @@
namespace Service::HID {
+IHidDebugServer::IHidDebugServer(Core::System& system_, std::shared_ptr<ResourceManager> resource,
+ std::shared_ptr<HidFirmwareSettings> settings)
+ : ServiceFramework{system_, "hid:dbg"}, resource_manager{resource}, firmware_settings{
+ settings} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "DeactivateDebugPad"},
+ {1, nullptr, "SetDebugPadAutoPilotState"},
+ {2, nullptr, "UnsetDebugPadAutoPilotState"},
+ {10, C<&IHidDebugServer::DeactivateTouchScreen>, "DeactivateTouchScreen"},
+ {11, C<&IHidDebugServer::SetTouchScreenAutoPilotState>, "SetTouchScreenAutoPilotState"},
+ {12, C<&IHidDebugServer::UnsetTouchScreenAutoPilotState>, "UnsetTouchScreenAutoPilotState"},
+ {13, C<&IHidDebugServer::GetTouchScreenConfiguration>, "GetTouchScreenConfiguration"},
+ {14, C<&IHidDebugServer::ProcessTouchScreenAutoTune>, "ProcessTouchScreenAutoTune"},
+ {15, C<&IHidDebugServer::ForceStopTouchScreenManagement>, "ForceStopTouchScreenManagement"},
+ {16, C<&IHidDebugServer::ForceRestartTouchScreenManagement>, "ForceRestartTouchScreenManagement"},
+ {17, C<&IHidDebugServer::IsTouchScreenManaged>, "IsTouchScreenManaged"},
+ {20, nullptr, "DeactivateMouse"},
+ {21, nullptr, "SetMouseAutoPilotState"},
+ {22, nullptr, "UnsetMouseAutoPilotState"},
+ {23, nullptr, "AddMouseSideWheelDelta"},
+ {25, nullptr, "SetDebugMouseAutoPilotState"},
+ {26, nullptr, "UnsetDebugMouseAutoPilotState"},
+ {30, nullptr, "DeactivateKeyboard"},
+ {31, nullptr, "SetKeyboardAutoPilotState"},
+ {32, nullptr, "UnsetKeyboardAutoPilotState"},
+ {50, nullptr, "DeactivateXpad"},
+ {51, nullptr, "SetXpadAutoPilotState"},
+ {52, nullptr, "UnsetXpadAutoPilotState"},
+ {53, nullptr, "DeactivateJoyXpad"},
+ {60, nullptr, "ClearNpadSystemCommonPolicy"},
+ {61, nullptr, "DeactivateNpad"},
+ {62, nullptr, "ForceDisconnectNpad"},
+ {91, C<&IHidDebugServer::DeactivateGesture>, "DeactivateGesture"},
+ {110, nullptr, "DeactivateHomeButton"},
+ {111, nullptr, "SetHomeButtonAutoPilotState"},
+ {112, nullptr, "UnsetHomeButtonAutoPilotState"},
+ {120, nullptr, "DeactivateSleepButton"},
+ {121, nullptr, "SetSleepButtonAutoPilotState"},
+ {122, nullptr, "UnsetSleepButtonAutoPilotState"},
+ {123, nullptr, "DeactivateInputDetector"},
+ {130, nullptr, "DeactivateCaptureButton"},
+ {131, nullptr, "SetCaptureButtonAutoPilotState"},
+ {132, nullptr, "UnsetCaptureButtonAutoPilotState"},
+ {133, nullptr, "SetShiftAccelerometerCalibrationValue"},
+ {134, nullptr, "GetShiftAccelerometerCalibrationValue"},
+ {135, nullptr, "SetShiftGyroscopeCalibrationValue"},
+ {136, nullptr, "GetShiftGyroscopeCalibrationValue"},
+ {140, nullptr, "DeactivateConsoleSixAxisSensor"},
+ {141, nullptr, "GetConsoleSixAxisSensorSamplingFrequency"},
+ {142, nullptr, "DeactivateSevenSixAxisSensor"},
+ {143, nullptr, "GetConsoleSixAxisSensorCountStates"},
+ {144, nullptr, "GetAccelerometerFsr"},
+ {145, nullptr, "SetAccelerometerFsr"},
+ {146, nullptr, "GetAccelerometerOdr"},
+ {147, nullptr, "SetAccelerometerOdr"},
+ {148, nullptr, "GetGyroscopeFsr"},
+ {149, nullptr, "SetGyroscopeFsr"},
+ {150, nullptr, "GetGyroscopeOdr"},
+ {151, nullptr, "SetGyroscopeOdr"},
+ {152, nullptr, "GetWhoAmI"},
+ {201, nullptr, "ActivateFirmwareUpdate"},
+ {202, nullptr, "DeactivateFirmwareUpdate"},
+ {203, nullptr, "StartFirmwareUpdate"},
+ {204, nullptr, "GetFirmwareUpdateStage"},
+ {205, nullptr, "GetFirmwareVersion"},
+ {206, nullptr, "GetDestinationFirmwareVersion"},
+ {207, nullptr, "DiscardFirmwareInfoCacheForRevert"},
+ {208, nullptr, "StartFirmwareUpdateForRevert"},
+ {209, nullptr, "GetAvailableFirmwareVersionForRevert"},
+ {210, nullptr, "IsFirmwareUpdatingDevice"},
+ {211, nullptr, "StartFirmwareUpdateIndividual"},
+ {212, nullptr, "GetDetailFirmwareVersion"}, // 19.0.0+
+ {215, nullptr, "SetUsbFirmwareForceUpdateEnabled"},
+ {216, nullptr, "SetAllKuinaDevicesToFirmwareUpdateMode"},
+ {221, nullptr, "UpdateControllerColor"},
+ {222, nullptr, "ConnectUsbPadsAsync"},
+ {223, nullptr, "DisconnectUsbPadsAsync"},
+ {224, nullptr, "UpdateDesignInfo"},
+ {225, nullptr, "GetUniquePadDriverState"},
+ {226, nullptr, "GetSixAxisSensorDriverStates"},
+ {227, nullptr, "GetRxPacketHistory"},
+ {228, nullptr, "AcquireOperationEventHandle"},
+ {229, nullptr, "ReadSerialFlash"},
+ {230, nullptr, "WriteSerialFlash"},
+ {231, nullptr, "GetOperationResult"},
+ {232, nullptr, "EnableShipmentMode"},
+ {233, nullptr, "ClearPairingInfo"},
+ {234, nullptr, "GetUniquePadDeviceTypeSetInternal"},
+ {235, nullptr, "EnableAnalogStickPower"},
+ {236, nullptr, "RequestKuinaUartClockCal"},
+ {237, nullptr, "GetKuinaUartClockCal"},
+ {238, nullptr, "SetKuinaUartClockTrim"},
+ {239, nullptr, "KuinaLoopbackTest"},
+ {240, nullptr, "RequestBatteryVoltage"},
+ {241, nullptr, "GetBatteryVoltage"},
+ {242, nullptr, "GetUniquePadPowerInfo"},
+ {243, nullptr, "RebootUniquePad"},
+ {244, nullptr, "RequestKuinaFirmwareVersion"},
+ {245, nullptr, "GetKuinaFirmwareVersion"},
+ {246, nullptr, "GetVidPid"},
+ {247, nullptr, "GetAnalogStickCalibrationValue"},
+ {248, nullptr, "GetUniquePadIdsFull"},
+ {249, nullptr, "ConnectUniquePad"},
+ {250, nullptr, "IsVirtual"},
+ {251, nullptr, "GetAnalogStickModuleParam"},
+ {253, nullptr, "ClearStorageForShipment"}, //19.0.0+
+ {261, nullptr, "UpdateDesignInfo12"}, //21.0.0+
+ {262, nullptr, "GetUniquePadButtonCount"}, //21.0.0+
+ {267, nullptr, "SetAnalogStickCalibration"}, //21.0.0+
+ {268, nullptr, "ResetAnalogStickCalibration"}, //21.0.0+
+ {301, nullptr, "GetAbstractedPadHandles"},
+ {302, nullptr, "GetAbstractedPadState"},
+ {303, nullptr, "GetAbstractedPadsState"},
+ {321, nullptr, "SetAutoPilotVirtualPadState"},
+ {322, nullptr, "UnsetAutoPilotVirtualPadState"},
+ {323, nullptr, "UnsetAllAutoPilotVirtualPadState"},
+ {324, nullptr, "AttachHdlsWorkBuffer"},
+ {325, nullptr, "ReleaseHdlsWorkBuffer"},
+ {326, nullptr, "DumpHdlsNpadAssignmentState"},
+ {327, nullptr, "DumpHdlsStates"},
+ {328, nullptr, "ApplyHdlsNpadAssignmentState"},
+ {329, nullptr, "ApplyHdlsStateList"},
+ {330, nullptr, "AttachHdlsVirtualDevice"},
+ {331, nullptr, "DetachHdlsVirtualDevice"},
+ {332, nullptr, "SetHdlsState"},
+ {350, nullptr, "AddRegisteredDevice"},
+ {351, nullptr, "GetRegisteredDevicesCountDebug"}, //17.0.0-18.1.0
+ {352, nullptr, "DeleteRegisteredDevicesDebug"}, //17.0.0-18.1.0
+ {400, nullptr, "DisableExternalMcuOnNxDevice"},
+ {401, nullptr, "DisableRailDeviceFiltering"},
+ {402, nullptr, "EnableWiredPairing"},
+ {403, nullptr, "EnableShipmentModeAutoClear"},
+ {404, nullptr, "SetRailEnabled"},
+ {500, nullptr, "SetFactoryInt"},
+ {501, nullptr, "IsFactoryBootEnabled"},
+ {550, nullptr, "SetAnalogStickModelDataTemporarily"},
+ {551, nullptr, "GetAnalogStickModelData"},
+ {552, nullptr, "ResetAnalogStickModelData"},
+ {600, nullptr, "ConvertPadState"},
+ {601, nullptr, "IsButtonConfigSupported"}, //18.0.0+
+ {602, nullptr, "IsButtonConfigEmbeddedSupported"}, //18.0.0+
+ {603, nullptr, "DeleteButtonConfig"}, //18.0.0+
+ {604, nullptr, "DeleteButtonConfigEmbedded"}, //18.0.0+
+ {605, nullptr, "SetButtonConfigEnabled"}, //18.0.0+
+ {606, nullptr, "SetButtonConfigEmbeddedEnabled"}, //18.0.0+
+ {607, nullptr, "IsButtonConfigEnabled"}, //18.0.0+
+ {608, nullptr, "IsButtonConfigEmbeddedEnabled"}, //18.0.0+
+ {609, nullptr, "SetButtonConfigEmbedded"}, //18.0.0+
+ {610, nullptr, "SetButtonConfigFull"}, //18.0.0+
+ {611, nullptr, "SetButtonConfigLeft"}, //18.0.0+
+ {612, nullptr, "SetButtonConfigRight"}, //18.0.0+
+ {613, nullptr, "GetButtonConfigEmbedded"}, //18.0.0+
+ {614, nullptr, "GetButtonConfigFull"}, //18.0.0+
+ {615, nullptr, "GetButtonConfigLeft"}, //18.0.0+
+ {616, nullptr, "GetButtonConfigRight"}, //18.0.0+
+ {650, nullptr, "AddButtonPlayData"},
+ {651, nullptr, "StartButtonPlayData"},
+ {652, nullptr, "StopButtonPlayData"},
+ {700, nullptr, "GetRailAttachEventCount"}, //21.0.0+
+ {2000, nullptr, "DeactivateDigitizer"},
+ {2001, nullptr, "SetDigitizerAutoPilotState"},
+ {2002, nullptr, "UnsetDigitizerAutoPilotState"},
+ {3000, nullptr, "ReloadFirmwareDebugSettings"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
+IHidDebugServer::~IHidDebugServer() = default;
+
+Result IHidDebugServer::DeactivateTouchScreen() {
+ LOG_INFO(Service_HID, "called");
+
+ if (!firmware_settings->IsDeviceManaged()) {
+ R_RETURN(GetResourceManager()->GetTouchScreen()->Deactivate());
+ }
+
+ R_SUCCEED();
+}
+
+Result IHidDebugServer::SetTouchScreenAutoPilotState(
+ InArray<TouchState, BufferAttr_HipcMapAlias> auto_pilot_buffer) {
+ AutoPilotState auto_pilot{};
+
+ auto_pilot.count =
+ static_cast<u64>((std::min)(auto_pilot_buffer.size(), auto_pilot.state.size()));
+ memcpy(auto_pilot.state.data(), auto_pilot_buffer.data(),
+ auto_pilot.count * sizeof(TouchState));
+
+ LOG_INFO(Service_HID, "called, auto_pilot_count={}", auto_pilot.count);
+
+ R_RETURN(GetResourceManager()->GetTouchScreen()->SetTouchScreenAutoPilotState(auto_pilot));
+}
+
+Result IHidDebugServer::UnsetTouchScreenAutoPilotState() {
+ LOG_INFO(Service_HID, "called");
+ R_RETURN(GetResourceManager()->GetTouchScreen()->UnsetTouchScreenAutoPilotState());
+}
+
+Result IHidDebugServer::GetTouchScreenConfiguration(
+ Out<Core::HID::TouchScreenConfigurationForNx> out_touchscreen_config,
+ ClientAppletResourceUserId aruid) {
+ LOG_INFO(Service_HID, "called, applet_resource_user_id={}", aruid.pid);
+
+ R_TRY(GetResourceManager()->GetTouchScreen()->GetTouchScreenConfiguration(
+ *out_touchscreen_config, aruid.pid));
+
+ if (out_touchscreen_config->mode != Core::HID::TouchScreenModeForNx::Heat2 &&
+ out_touchscreen_config->mode != Core::HID::TouchScreenModeForNx::Finger) {
+ out_touchscreen_config->mode = Core::HID::TouchScreenModeForNx::UseSystemSetting;
+ }
+
+ R_SUCCEED();
+}
+
+Result IHidDebugServer::ProcessTouchScreenAutoTune() {
+ LOG_INFO(Service_HID, "called");
+ R_RETURN(GetResourceManager()->GetTouchScreen()->ProcessTouchScreenAutoTune());
+}
+
+Result IHidDebugServer::ForceStopTouchScreenManagement() {
+ LOG_INFO(Service_HID, "called");
+
+ if (!firmware_settings->IsDeviceManaged()) {
+ R_SUCCEED();
+ }
+
+ auto touch_screen = GetResourceManager()->GetTouchScreen();
+ auto gesture = GetResourceManager()->GetGesture();
+
+ if (firmware_settings->IsTouchI2cManaged()) {
+ bool is_touch_active{};
+ bool is_gesture_active{};
+ R_TRY(touch_screen->IsActive(is_touch_active));
+ R_TRY(gesture->IsActive(is_gesture_active));
+
+ if (is_touch_active) {
+ R_TRY(touch_screen->Deactivate());
+ }
+ if (is_gesture_active) {
+ R_TRY(gesture->Deactivate());
+ }
+ }
+
+ R_SUCCEED();
+}
+
+Result IHidDebugServer::ForceRestartTouchScreenManagement(u32 basic_gesture_id,
+ ClientAppletResourceUserId aruid) {
+ LOG_INFO(Service_HID, "called, basic_gesture_id={}, applet_resource_user_id={}",
+ basic_gesture_id, aruid.pid);
+
+ auto touch_screen = GetResourceManager()->GetTouchScreen();
+ auto gesture = GetResourceManager()->GetGesture();
+
+ if (firmware_settings->IsDeviceManaged() && firmware_settings->IsTouchI2cManaged()) {
+ R_TRY(gesture->Activate());
+ R_TRY(gesture->Activate(aruid.pid, basic_gesture_id));
+ R_TRY(touch_screen->Activate());
+ R_TRY(touch_screen->Activate(aruid.pid));
+ }
+
+ R_SUCCEED();
+}
+
+Result IHidDebugServer::IsTouchScreenManaged(Out<bool> out_is_managed) {
+ LOG_INFO(Service_HID, "called");
+
+ bool is_touch_active{};
+ bool is_gesture_active{};
+ R_TRY(GetResourceManager()->GetTouchScreen()->IsActive(is_touch_active));
+ R_TRY(GetResourceManager()->GetGesture()->IsActive(is_gesture_active));
+
+ *out_is_managed = is_touch_active || is_gesture_active;
+ R_SUCCEED();
+}
+
+Result IHidDebugServer::DeactivateGesture() {
+ LOG_INFO(Service_HID, "called");
+
+ if (!firmware_settings->IsDeviceManaged()) {
+ R_RETURN(GetResourceManager()->GetGesture()->Deactivate());
+ }
+
+ R_SUCCEED();
+}
+
+std::shared_ptr<ResourceManager> IHidDebugServer::GetResourceManager() {
+ resource_manager->Initialize();
+ return resource_manager;
+}
+
} // namespace Service::HID
diff --git a/src/core/hle/service/hid/hid_debug_server.h b/src/core/hle/service/hid/hid_debug_server.h
index 20cc1ed541..f48f0205ed 100644
--- a/src/core/hle/service/hid/hid_debug_server.h
+++ b/src/core/hle/service/hid/hid_debug_server.h
@@ -18,5 +18,31 @@ namespace Service::HID {
class ResourceManager;
class HidFirmwareSettings;
+class IHidDebugServer final : public ServiceFramework<IHidDebugServer> {
+public:
+ explicit IHidDebugServer(Core::System& system_, std::shared_ptr<ResourceManager> resource,
+ std::shared_ptr<HidFirmwareSettings> settings);
+ ~IHidDebugServer() override;
+
+private:
+ Result DeactivateTouchScreen();
+ Result SetTouchScreenAutoPilotState(
+ InArray<TouchState, BufferAttr_HipcMapAlias> auto_pilot_buffer);
+ Result UnsetTouchScreenAutoPilotState();
+ Result GetTouchScreenConfiguration(
+ Out<Core::HID::TouchScreenConfigurationForNx> out_touchscreen_config,
+ ClientAppletResourceUserId aruid);
+ Result ProcessTouchScreenAutoTune();
+ Result ForceStopTouchScreenManagement();
+ Result ForceRestartTouchScreenManagement(u32 basic_gesture_id,
+ ClientAppletResourceUserId aruid);
+ Result IsTouchScreenManaged(Out<bool> out_is_managed);
+ Result DeactivateGesture();
+
+ std::shared_ptr<ResourceManager> GetResourceManager();
+
+ std::shared_ptr<ResourceManager> resource_manager;
+ std::shared_ptr<HidFirmwareSettings> firmware_settings;
+};
} // namespace Service::HID
diff --git a/src/core/hle/service/hid/hid_server.cpp b/src/core/hle/service/hid/hid_server.cpp
index 18e57628d0..9689bce8dd 100644
--- a/src/core/hle/service/hid/hid_server.cpp
+++ b/src/core/hle/service/hid/hid_server.cpp
@@ -42,207 +42,207 @@
namespace Service::HID {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IHidServer::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, C<&IHidServer::CreateAppletResource>, "CreateAppletResource"},
- FunctionInfo{1, C<&IHidServer::ActivateDebugPad>, "ActivateDebugPad"},
- FunctionInfo{11, C<&IHidServer::ActivateTouchScreen>, "ActivateTouchScreen"},
- FunctionInfo{21, C<&IHidServer::ActivateMouse>, "ActivateMouse"},
- FunctionInfo{26, C<&IHidServer::ActivateDebugMouse>, "ActivateDebugMouse"},
- FunctionInfo{31, C<&IHidServer::ActivateKeyboard>, "ActivateKeyboard"},
- FunctionInfo{32, C<&IHidServer::SendKeyboardLockKeyEvent>, "SendKeyboardLockKeyEvent"},
- FunctionInfo{40, C<&IHidServer::AcquireXpadIdEventHandle>, "AcquireXpadIdEventHandle"},
- FunctionInfo{41, C<&IHidServer::ReleaseXpadIdEventHandle>, "ReleaseXpadIdEventHandle"},
- FunctionInfo{51, C<&IHidServer::ActivateXpad>, "ActivateXpad"},
- FunctionInfo{55, C<&IHidServer::GetXpadIds>, "GetXpadIds"},
- FunctionInfo{56, C<&IHidServer::ActivateJoyXpad>, "ActivateJoyXpad"},
- FunctionInfo{58, C<&IHidServer::GetJoyXpadLifoHandle>, "GetJoyXpadLifoHandle"},
- FunctionInfo{59, C<&IHidServer::GetJoyXpadIds>, "GetJoyXpadIds"},
- FunctionInfo{60, C<&IHidServer::ActivateSixAxisSensor>, "ActivateSixAxisSensor"},
- FunctionInfo{61, C<&IHidServer::DeactivateSixAxisSensor>, "DeactivateSixAxisSensor"},
- FunctionInfo{62, C<&IHidServer::GetSixAxisSensorLifoHandle>, "GetSixAxisSensorLifoHandle"},
- FunctionInfo{63, C<&IHidServer::ActivateJoySixAxisSensor>, "ActivateJoySixAxisSensor"},
- FunctionInfo{64, C<&IHidServer::DeactivateJoySixAxisSensor>, "DeactivateJoySixAxisSensor"},
- FunctionInfo{65, C<&IHidServer::GetJoySixAxisSensorLifoHandle>, "GetJoySixAxisSensorLifoHandle"},
- FunctionInfo{66, C<&IHidServer::StartSixAxisSensor>, "StartSixAxisSensor"},
- FunctionInfo{67, C<&IHidServer::StopSixAxisSensor>, "StopSixAxisSensor"},
- FunctionInfo{68, C<&IHidServer::IsSixAxisSensorFusionEnabled>, "IsSixAxisSensorFusionEnabled"},
- FunctionInfo{69, C<&IHidServer::EnableSixAxisSensorFusion>, "EnableSixAxisSensorFusion"},
- FunctionInfo{70, C<&IHidServer::SetSixAxisSensorFusionParameters>, "SetSixAxisSensorFusionParameters"},
- FunctionInfo{71, C<&IHidServer::GetSixAxisSensorFusionParameters>, "GetSixAxisSensorFusionParameters"},
- FunctionInfo{72, C<&IHidServer::ResetSixAxisSensorFusionParameters>, "ResetSixAxisSensorFusionParameters"},
- FunctionInfo{73, nullptr, "SetAccelerometerParameters"},
- FunctionInfo{74, nullptr, "GetAccelerometerParameters"},
- FunctionInfo{75, nullptr, "ResetAccelerometerParameters"},
- FunctionInfo{76, nullptr, "SetAccelerometerPlayMode"},
- FunctionInfo{77, nullptr, "GetAccelerometerPlayMode"},
- FunctionInfo{78, nullptr, "ResetAccelerometerPlayMode"},
- FunctionInfo{79, C<&IHidServer::SetGyroscopeZeroDriftMode>, "SetGyroscopeZeroDriftMode"},
- FunctionInfo{80, C<&IHidServer::GetGyroscopeZeroDriftMode>, "GetGyroscopeZeroDriftMode"},
- FunctionInfo{81, C<&IHidServer::ResetGyroscopeZeroDriftMode>, "ResetGyroscopeZeroDriftMode"},
- FunctionInfo{82, C<&IHidServer::IsSixAxisSensorAtRest>, "IsSixAxisSensorAtRest"},
- FunctionInfo{83, C<&IHidServer::IsFirmwareUpdateAvailableForSixAxisSensor>, "IsFirmwareUpdateAvailableForSixAxisSensor"},
- FunctionInfo{84, C<&IHidServer::EnableSixAxisSensorUnalteredPassthrough>, "EnableSixAxisSensorUnalteredPassthrough"},
- FunctionInfo{85, C<&IHidServer::IsSixAxisSensorUnalteredPassthroughEnabled>, "IsSixAxisSensorUnalteredPassthroughEnabled"},
- FunctionInfo{86, nullptr, "StoreSixAxisSensorCalibrationParameter"},
- FunctionInfo{87, C<&IHidServer::LoadSixAxisSensorCalibrationParameter>, "LoadSixAxisSensorCalibrationParameter"},
- FunctionInfo{88, C<&IHidServer::GetSixAxisSensorIcInformation>, "GetSixAxisSensorIcInformation"},
- FunctionInfo{89, C<&IHidServer::ResetIsSixAxisSensorDeviceNewlyAssigned>, "ResetIsSixAxisSensorDeviceNewlyAssigned"},
- FunctionInfo{91, C<&IHidServer::ActivateGesture>, "ActivateGesture"},
- FunctionInfo{92, C<&IHidServer::SetGestureOutputRanges>, "SetGestureOutputRanges"},
- FunctionInfo{100, C<&IHidServer::SetSupportedNpadStyleSet>, "SetSupportedNpadStyleSet"},
- FunctionInfo{101, C<&IHidServer::GetSupportedNpadStyleSet>, "GetSupportedNpadStyleSet"},
- FunctionInfo{102, C<&IHidServer::SetSupportedNpadIdType>, "SetSupportedNpadIdType"},
- FunctionInfo{103, C<&IHidServer::ActivateNpad>, "ActivateNpad"},
- FunctionInfo{104, C<&IHidServer::DeactivateNpad>, "DeactivateNpad"},
- FunctionInfo{106, C<&IHidServer::AcquireNpadStyleSetUpdateEventHandle>, "AcquireNpadStyleSetUpdateEventHandle"},
- FunctionInfo{107, C<&IHidServer::DisconnectNpad>, "DisconnectNpad"},
- FunctionInfo{108, C<&IHidServer::GetPlayerLedPattern>, "GetPlayerLedPattern"},
- FunctionInfo{109, C<&IHidServer::ActivateNpadWithRevision>, "ActivateNpadWithRevision"},
- FunctionInfo{120, C<&IHidServer::SetNpadJoyHoldType>, "SetNpadJoyHoldType"},
- FunctionInfo{121, C<&IHidServer::GetNpadJoyHoldType>, "GetNpadJoyHoldType"},
- FunctionInfo{122, C<&IHidServer::SetNpadJoyAssignmentModeSingleByDefault>, "SetNpadJoyAssignmentModeSingleByDefault"},
- FunctionInfo{123, C<&IHidServer::SetNpadJoyAssignmentModeSingle>, "SetNpadJoyAssignmentModeSingle"},
- FunctionInfo{124, C<&IHidServer::SetNpadJoyAssignmentModeDual>, "SetNpadJoyAssignmentModeDual"},
- FunctionInfo{125, C<&IHidServer::MergeSingleJoyAsDualJoy>, "MergeSingleJoyAsDualJoy"},
- FunctionInfo{126, C<&IHidServer::StartLrAssignmentMode>, "StartLrAssignmentMode"},
- FunctionInfo{127, C<&IHidServer::StopLrAssignmentMode>, "StopLrAssignmentMode"},
- FunctionInfo{128, C<&IHidServer::SetNpadHandheldActivationMode>, "SetNpadHandheldActivationMode"},
- FunctionInfo{129, C<&IHidServer::GetNpadHandheldActivationMode>, "GetNpadHandheldActivationMode"},
- FunctionInfo{130, C<&IHidServer::SwapNpadAssignment>, "SwapNpadAssignment"},
- FunctionInfo{131, C<&IHidServer::IsUnintendedHomeButtonInputProtectionEnabled>, "IsUnintendedHomeButtonInputProtectionEnabled"},
- FunctionInfo{132, C<&IHidServer::EnableUnintendedHomeButtonInputProtection>, "EnableUnintendedHomeButtonInputProtection"},
- FunctionInfo{133, C<&IHidServer::SetNpadJoyAssignmentModeSingleWithDestination>, "SetNpadJoyAssignmentModeSingleWithDestination"},
- FunctionInfo{134, C<&IHidServer::SetNpadAnalogStickUseCenterClamp>, "SetNpadAnalogStickUseCenterClamp"},
- FunctionInfo{135, C<&IHidServer::SetNpadCaptureButtonAssignment>, "SetNpadCaptureButtonAssignment"},
- FunctionInfo{136, C<&IHidServer::ClearNpadCaptureButtonAssignment>, "ClearNpadCaptureButtonAssignment"},
- FunctionInfo{200, C<&IHidServer::GetVibrationDeviceInfo>, "GetVibrationDeviceInfo"},
- FunctionInfo{201, C<&IHidServer::SendVibrationValue>, "SendVibrationValue"},
- FunctionInfo{202, C<&IHidServer::GetActualVibrationValue>, "GetActualVibrationValue"},
- FunctionInfo{203, C<&IHidServer::CreateActiveVibrationDeviceList>, "CreateActiveVibrationDeviceList"},
- FunctionInfo{204, C<&IHidServer::PermitVibration>, "PermitVibration"},
- FunctionInfo{205, C<&IHidServer::IsVibrationPermitted>, "IsVibrationPermitted"},
- FunctionInfo{206, C<&IHidServer::SendVibrationValues>, "SendVibrationValues"},
- FunctionInfo{207, C<&IHidServer::SendVibrationGcErmCommand>, "SendVibrationGcErmCommand"},
- FunctionInfo{208, C<&IHidServer::GetActualVibrationGcErmCommand>, "GetActualVibrationGcErmCommand"},
- FunctionInfo{209, C<&IHidServer::BeginPermitVibrationSession>, "BeginPermitVibrationSession"},
- FunctionInfo{210, C<&IHidServer::EndPermitVibrationSession>, "EndPermitVibrationSession"},
- FunctionInfo{211, C<&IHidServer::IsVibrationDeviceMounted>, "IsVibrationDeviceMounted"},
- FunctionInfo{212, C<&IHidServer::SendVibrationValueInBool>, "SendVibrationValueInBool"},
- FunctionInfo{300, C<&IHidServer::ActivateConsoleSixAxisSensor>, "ActivateConsoleSixAxisSensor"},
- FunctionInfo{301, C<&IHidServer::StartConsoleSixAxisSensor>, "StartConsoleSixAxisSensor"},
- FunctionInfo{302, C<&IHidServer::StopConsoleSixAxisSensor>, "StopConsoleSixAxisSensor"},
- FunctionInfo{303, C<&IHidServer::ActivateSevenSixAxisSensor>, "ActivateSevenSixAxisSensor"},
- FunctionInfo{304, C<&IHidServer::StartSevenSixAxisSensor>, "StartSevenSixAxisSensor"},
- FunctionInfo{305, C<&IHidServer::StopSevenSixAxisSensor>, "StopSevenSixAxisSensor"},
- FunctionInfo{306, C<&IHidServer::InitializeSevenSixAxisSensor>, "InitializeSevenSixAxisSensor"},
- FunctionInfo{307, C<&IHidServer::FinalizeSevenSixAxisSensor>, "FinalizeSevenSixAxisSensor"},
- FunctionInfo{308, nullptr, "SetSevenSixAxisSensorFusionStrength"},
- FunctionInfo{309, nullptr, "GetSevenSixAxisSensorFusionStrength"},
- FunctionInfo{310, C<&IHidServer::ResetSevenSixAxisSensorTimestamp>, "ResetSevenSixAxisSensorTimestamp"},
- FunctionInfo{320, nullptr, "EnableNpadImu", MakeVersionGate({21,0,0})},
- FunctionInfo{321, nullptr, "DisableNpadImu", MakeVersionGate({21,0,0})},
- FunctionInfo{400, C<&IHidServer::IsUsbFullKeyControllerEnabled>, "IsUsbFullKeyControllerEnabled"},
- FunctionInfo{401, nullptr, "EnableUsbFullKeyController"},
- FunctionInfo{402, nullptr, "IsUsbFullKeyControllerConnected"},
- FunctionInfo{403, nullptr, "HasBattery"},
- FunctionInfo{404, nullptr, "HasLeftRightBattery"},
- FunctionInfo{405, nullptr, "GetNpadInterfaceType"},
- FunctionInfo{406, nullptr, "GetNpadLeftRightInterfaceType"},
- FunctionInfo{407, nullptr, "GetNpadOfHighestBatteryLevel"},
- FunctionInfo{408, nullptr, "GetNpadOfHighestBatteryLevelForJoyRight"},
- FunctionInfo{500, C<&IHidServer::GetPalmaConnectionHandle>, "GetPalmaConnectionHandle"},
- FunctionInfo{501, C<&IHidServer::InitializePalma>, "InitializePalma"},
- FunctionInfo{502, C<&IHidServer::AcquirePalmaOperationCompleteEvent>, "AcquirePalmaOperationCompleteEvent"},
- FunctionInfo{503, C<&IHidServer::GetPalmaOperationInfo>, "GetPalmaOperationInfo"},
- FunctionInfo{504, C<&IHidServer::PlayPalmaActivity>, "PlayPalmaActivity"},
- FunctionInfo{505, C<&IHidServer::SetPalmaFrModeType>, "SetPalmaFrModeType"},
- FunctionInfo{506, C<&IHidServer::ReadPalmaStep>, "ReadPalmaStep"},
- FunctionInfo{507, C<&IHidServer::EnablePalmaStep>, "EnablePalmaStep"},
- FunctionInfo{508, C<&IHidServer::ResetPalmaStep>, "ResetPalmaStep"},
- FunctionInfo{509, C<&IHidServer::ReadPalmaApplicationSection>, "ReadPalmaApplicationSection"},
- FunctionInfo{510, C<&IHidServer::WritePalmaApplicationSection>, "WritePalmaApplicationSection"},
- FunctionInfo{511, C<&IHidServer::ReadPalmaUniqueCode>, "ReadPalmaUniqueCode"},
- FunctionInfo{512, C<&IHidServer::SetPalmaUniqueCodeInvalid>, "SetPalmaUniqueCodeInvalid"},
- FunctionInfo{513, C<&IHidServer::WritePalmaActivityEntry>, "WritePalmaActivityEntry"},
- FunctionInfo{514, C<&IHidServer::WritePalmaRgbLedPatternEntry>, "WritePalmaRgbLedPatternEntry"},
- FunctionInfo{515, C<&IHidServer::WritePalmaWaveEntry>, "WritePalmaWaveEntry"},
- FunctionInfo{516, C<&IHidServer::SetPalmaDataBaseIdentificationVersion>, "SetPalmaDataBaseIdentificationVersion"},
- FunctionInfo{517, C<&IHidServer::GetPalmaDataBaseIdentificationVersion>, "GetPalmaDataBaseIdentificationVersion"},
- FunctionInfo{518, C<&IHidServer::SuspendPalmaFeature>, "SuspendPalmaFeature"},
- FunctionInfo{519, C<&IHidServer::GetPalmaOperationResult>, "GetPalmaOperationResult"},
- FunctionInfo{520, C<&IHidServer::ReadPalmaPlayLog>, "ReadPalmaPlayLog"},
- FunctionInfo{521, C<&IHidServer::ResetPalmaPlayLog>, "ResetPalmaPlayLog"},
- FunctionInfo{522, C<&IHidServer::SetIsPalmaAllConnectable>, "SetIsPalmaAllConnectable"},
- FunctionInfo{523, C<&IHidServer::SetIsPalmaPairedConnectable>, "SetIsPalmaPairedConnectable"},
- FunctionInfo{524, C<&IHidServer::PairPalma>, "PairPalma"},
- FunctionInfo{525, C<&IHidServer::SetPalmaBoostMode>, "SetPalmaBoostMode"},
- FunctionInfo{526, C<&IHidServer::CancelWritePalmaWaveEntry>, "CancelWritePalmaWaveEntry"},
- FunctionInfo{527, C<&IHidServer::EnablePalmaBoostMode>, "EnablePalmaBoostMode"},
- FunctionInfo{528, C<&IHidServer::GetPalmaBluetoothAddress>, "GetPalmaBluetoothAddress"},
- FunctionInfo{529, C<&IHidServer::SetDisallowedPalmaConnection>, "SetDisallowedPalmaConnection"},
- FunctionInfo{1000, C<&IHidServer::SetNpadCommunicationMode>, "SetNpadCommunicationMode"},
- FunctionInfo{1001, C<&IHidServer::GetNpadCommunicationMode>, "GetNpadCommunicationMode"},
- FunctionInfo{1002, C<&IHidServer::SetTouchScreenConfiguration>, "SetTouchScreenConfiguration"},
- FunctionInfo{1003, C<&IHidServer::IsFirmwareUpdateNeededForNotification>, "IsFirmwareUpdateNeededForNotification"},
- FunctionInfo{1004, C<&IHidServer::SetTouchScreenResolution>, "SetTouchScreenResolution"},
- FunctionInfo{1270, nullptr, "DeleteButtonConfigStorageRight"},
- FunctionInfo{1271, nullptr, "IsUsingCustomButtonConfig"},
- FunctionInfo{1272, nullptr, "IsAnyCustomButtonConfigEnabled"},
- FunctionInfo{1273, nullptr, "SetAllCustomButtonConfigEnabled"},
- FunctionInfo{1274, nullptr, "SetDefaultButtonConfig"},
- FunctionInfo{1275, nullptr, "SetAllDefaultButtonConfig"},
- FunctionInfo{1276, nullptr, "SetHidButtonConfigEmbedded"},
- FunctionInfo{1277, nullptr, "SetHidButtonConfigFull"},
- FunctionInfo{1278, nullptr, "SetHidButtonConfigLeft"},
- FunctionInfo{1279, nullptr, "SetHidButtonConfigRight"},
- FunctionInfo{1280, nullptr, "GetHidButtonConfigEmbedded"},
- FunctionInfo{1281, nullptr, "GetHidButtonConfigFull"},
- FunctionInfo{1282, nullptr, "GetHidButtonConfigLeft"},
- FunctionInfo{1283, nullptr, "GetHidButtonConfigRight"},
- FunctionInfo{1284, nullptr, "GetButtonConfigStorageEmbedded"},
- FunctionInfo{1285, nullptr, "GetButtonConfigStorageFull"},
- FunctionInfo{1286, nullptr, "GetButtonConfigStorageLeft"},
- FunctionInfo{1287, nullptr, "GetButtonConfigStorageRight"},
- FunctionInfo{1288, nullptr, "SetButtonConfigStorageEmbedded"},
- FunctionInfo{1289, nullptr, "SetButtonConfigStorageFull"},
- FunctionInfo{1290, nullptr, "SetButtonConfigStorageLeft"},
- FunctionInfo{1291, nullptr, "SetButtonConfigStorageRight"},
- FunctionInfo{1308, nullptr, "SetButtonConfigVisible"},
- FunctionInfo{1309, nullptr, "IsButtonConfigVisible"},
- FunctionInfo{1320, nullptr, "WakeTouchScreenUp"},
- FunctionInfo{1321, nullptr, "PutTouchScreenToSleep"},
- FunctionInfo{1322, nullptr, "AcquireTouchScreenAsyncWakeCompletedEvent"},
- FunctionInfo{1323, nullptr, "StartTouchScreenAutoTuneForSystemSettings"},
- FunctionInfo{1324, nullptr, "AcquireTouchScreenAutoTuneCompletedEvent"},
- FunctionInfo{1325, nullptr, "IsTouchScreenAutoTuneRequiredForRepairProviderReplacement"},
- FunctionInfo{1420, nullptr, "GetAppletResourceProperty"},
- FunctionInfo{2000, nullptr, "ActivateDigitizer"},
- FunctionInfo{3000, nullptr, "GetDebugPadGenericPadMap"},
- FunctionInfo{3001, nullptr, "SetDebugPadGenericPadMap"},
- FunctionInfo{3002, nullptr, "ResetDebugPadGenericPadMap"},
- FunctionInfo{3003, nullptr, "GetDebugPadKeyboardMap"},
- FunctionInfo{3004, nullptr, "SetDebugPadKeyboardMap"},
- FunctionInfo{3005, nullptr, "ResetDebugPadKeyboardMap"},
- FunctionInfo{3006, nullptr, "GetFullKeyGenericPadMap"},
- FunctionInfo{3007, nullptr, "SetFullKeyGenericPadMap"},
- FunctionInfo{3008, nullptr, "ResetFullKeyGenericPadMap"},
- FunctionInfo{3009, nullptr, "GetFullKeyKeyboardMap"},
- FunctionInfo{3010, nullptr, "SetFullKeyKeyboardMap"},
- FunctionInfo{3011, nullptr, "ResetFullKeyKeyboardMap"},
- FunctionInfo{3012, nullptr, "GetDebugPadGenericPadMap", MakeVersionGate({21,0,0})},
- FunctionInfo{3013, nullptr, "SetDebugPadGenericPadMap", MakeVersionGate({21,0,0})},
- FunctionInfo{3014, nullptr, "GetDebugPadKeyboardMap", MakeVersionGate({21,0,0})},
- FunctionInfo{3015, nullptr, "SetDebugPadKeyboardMap", MakeVersionGate({21,0,0})},
- FunctionInfo{3150, C<&IHidServer::SetMouseLibraryVersion>, "SetMouseLibraryVersion", MakeVersionGate({21,0,0})}
- // What? -- {12010, nullptr, "SetButtonConfigLeft"},
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IHidServer::IHidServer(Core::System& system_, std::shared_ptr<ResourceManager> resource,
std::shared_ptr<HidFirmwareSettings> settings)
: ServiceFramework{system_, "hid"}, resource_manager{resource}, firmware_settings{settings} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, C<&IHidServer::CreateAppletResource>, "CreateAppletResource"},
+ {1, C<&IHidServer::ActivateDebugPad>, "ActivateDebugPad"},
+ {11, C<&IHidServer::ActivateTouchScreen>, "ActivateTouchScreen"},
+ {21, C<&IHidServer::ActivateMouse>, "ActivateMouse"},
+ {26, C<&IHidServer::ActivateDebugMouse>, "ActivateDebugMouse"},
+ {31, C<&IHidServer::ActivateKeyboard>, "ActivateKeyboard"},
+ {32, C<&IHidServer::SendKeyboardLockKeyEvent>, "SendKeyboardLockKeyEvent"},
+ {40, C<&IHidServer::AcquireXpadIdEventHandle>, "AcquireXpadIdEventHandle"},
+ {41, C<&IHidServer::ReleaseXpadIdEventHandle>, "ReleaseXpadIdEventHandle"},
+ {51, C<&IHidServer::ActivateXpad>, "ActivateXpad"},
+ {55, C<&IHidServer::GetXpadIds>, "GetXpadIds"},
+ {56, C<&IHidServer::ActivateJoyXpad>, "ActivateJoyXpad"},
+ {58, C<&IHidServer::GetJoyXpadLifoHandle>, "GetJoyXpadLifoHandle"},
+ {59, C<&IHidServer::GetJoyXpadIds>, "GetJoyXpadIds"},
+ {60, C<&IHidServer::ActivateSixAxisSensor>, "ActivateSixAxisSensor"},
+ {61, C<&IHidServer::DeactivateSixAxisSensor>, "DeactivateSixAxisSensor"},
+ {62, C<&IHidServer::GetSixAxisSensorLifoHandle>, "GetSixAxisSensorLifoHandle"},
+ {63, C<&IHidServer::ActivateJoySixAxisSensor>, "ActivateJoySixAxisSensor"},
+ {64, C<&IHidServer::DeactivateJoySixAxisSensor>, "DeactivateJoySixAxisSensor"},
+ {65, C<&IHidServer::GetJoySixAxisSensorLifoHandle>, "GetJoySixAxisSensorLifoHandle"},
+ {66, C<&IHidServer::StartSixAxisSensor>, "StartSixAxisSensor"},
+ {67, C<&IHidServer::StopSixAxisSensor>, "StopSixAxisSensor"},
+ {68, C<&IHidServer::IsSixAxisSensorFusionEnabled>, "IsSixAxisSensorFusionEnabled"},
+ {69, C<&IHidServer::EnableSixAxisSensorFusion>, "EnableSixAxisSensorFusion"},
+ {70, C<&IHidServer::SetSixAxisSensorFusionParameters>, "SetSixAxisSensorFusionParameters"},
+ {71, C<&IHidServer::GetSixAxisSensorFusionParameters>, "GetSixAxisSensorFusionParameters"},
+ {72, C<&IHidServer::ResetSixAxisSensorFusionParameters>, "ResetSixAxisSensorFusionParameters"},
+ {73, nullptr, "SetAccelerometerParameters"},
+ {74, nullptr, "GetAccelerometerParameters"},
+ {75, nullptr, "ResetAccelerometerParameters"},
+ {76, nullptr, "SetAccelerometerPlayMode"},
+ {77, nullptr, "GetAccelerometerPlayMode"},
+ {78, nullptr, "ResetAccelerometerPlayMode"},
+ {79, C<&IHidServer::SetGyroscopeZeroDriftMode>, "SetGyroscopeZeroDriftMode"},
+ {80, C<&IHidServer::GetGyroscopeZeroDriftMode>, "GetGyroscopeZeroDriftMode"},
+ {81, C<&IHidServer::ResetGyroscopeZeroDriftMode>, "ResetGyroscopeZeroDriftMode"},
+ {82, C<&IHidServer::IsSixAxisSensorAtRest>, "IsSixAxisSensorAtRest"},
+ {83, C<&IHidServer::IsFirmwareUpdateAvailableForSixAxisSensor>, "IsFirmwareUpdateAvailableForSixAxisSensor"},
+ {84, C<&IHidServer::EnableSixAxisSensorUnalteredPassthrough>, "EnableSixAxisSensorUnalteredPassthrough"},
+ {85, C<&IHidServer::IsSixAxisSensorUnalteredPassthroughEnabled>, "IsSixAxisSensorUnalteredPassthroughEnabled"},
+ {86, nullptr, "StoreSixAxisSensorCalibrationParameter"},
+ {87, C<&IHidServer::LoadSixAxisSensorCalibrationParameter>, "LoadSixAxisSensorCalibrationParameter"},
+ {88, C<&IHidServer::GetSixAxisSensorIcInformation>, "GetSixAxisSensorIcInformation"},
+ {89, C<&IHidServer::ResetIsSixAxisSensorDeviceNewlyAssigned>, "ResetIsSixAxisSensorDeviceNewlyAssigned"},
+ {91, C<&IHidServer::ActivateGesture>, "ActivateGesture"},
+ {92, C<&IHidServer::SetGestureOutputRanges>, "SetGestureOutputRanges"},
+ {100, C<&IHidServer::SetSupportedNpadStyleSet>, "SetSupportedNpadStyleSet"},
+ {101, C<&IHidServer::GetSupportedNpadStyleSet>, "GetSupportedNpadStyleSet"},
+ {102, C<&IHidServer::SetSupportedNpadIdType>, "SetSupportedNpadIdType"},
+ {103, C<&IHidServer::ActivateNpad>, "ActivateNpad"},
+ {104, C<&IHidServer::DeactivateNpad>, "DeactivateNpad"},
+ {106, C<&IHidServer::AcquireNpadStyleSetUpdateEventHandle>, "AcquireNpadStyleSetUpdateEventHandle"},
+ {107, C<&IHidServer::DisconnectNpad>, "DisconnectNpad"},
+ {108, C<&IHidServer::GetPlayerLedPattern>, "GetPlayerLedPattern"},
+ {109, C<&IHidServer::ActivateNpadWithRevision>, "ActivateNpadWithRevision"},
+ {120, C<&IHidServer::SetNpadJoyHoldType>, "SetNpadJoyHoldType"},
+ {121, C<&IHidServer::GetNpadJoyHoldType>, "GetNpadJoyHoldType"},
+ {122, C<&IHidServer::SetNpadJoyAssignmentModeSingleByDefault>, "SetNpadJoyAssignmentModeSingleByDefault"},
+ {123, C<&IHidServer::SetNpadJoyAssignmentModeSingle>, "SetNpadJoyAssignmentModeSingle"},
+ {124, C<&IHidServer::SetNpadJoyAssignmentModeDual>, "SetNpadJoyAssignmentModeDual"},
+ {125, C<&IHidServer::MergeSingleJoyAsDualJoy>, "MergeSingleJoyAsDualJoy"},
+ {126, C<&IHidServer::StartLrAssignmentMode>, "StartLrAssignmentMode"},
+ {127, C<&IHidServer::StopLrAssignmentMode>, "StopLrAssignmentMode"},
+ {128, C<&IHidServer::SetNpadHandheldActivationMode>, "SetNpadHandheldActivationMode"},
+ {129, C<&IHidServer::GetNpadHandheldActivationMode>, "GetNpadHandheldActivationMode"},
+ {130, C<&IHidServer::SwapNpadAssignment>, "SwapNpadAssignment"},
+ {131, C<&IHidServer::IsUnintendedHomeButtonInputProtectionEnabled>, "IsUnintendedHomeButtonInputProtectionEnabled"},
+ {132, C<&IHidServer::EnableUnintendedHomeButtonInputProtection>, "EnableUnintendedHomeButtonInputProtection"},
+ {133, C<&IHidServer::SetNpadJoyAssignmentModeSingleWithDestination>, "SetNpadJoyAssignmentModeSingleWithDestination"},
+ {134, C<&IHidServer::SetNpadAnalogStickUseCenterClamp>, "SetNpadAnalogStickUseCenterClamp"},
+ {135, C<&IHidServer::SetNpadCaptureButtonAssignment>, "SetNpadCaptureButtonAssignment"},
+ {136, C<&IHidServer::ClearNpadCaptureButtonAssignment>, "ClearNpadCaptureButtonAssignment"},
+ {200, C<&IHidServer::GetVibrationDeviceInfo>, "GetVibrationDeviceInfo"},
+ {201, C<&IHidServer::SendVibrationValue>, "SendVibrationValue"},
+ {202, C<&IHidServer::GetActualVibrationValue>, "GetActualVibrationValue"},
+ {203, C<&IHidServer::CreateActiveVibrationDeviceList>, "CreateActiveVibrationDeviceList"},
+ {204, C<&IHidServer::PermitVibration>, "PermitVibration"},
+ {205, C<&IHidServer::IsVibrationPermitted>, "IsVibrationPermitted"},
+ {206, C<&IHidServer::SendVibrationValues>, "SendVibrationValues"},
+ {207, C<&IHidServer::SendVibrationGcErmCommand>, "SendVibrationGcErmCommand"},
+ {208, C<&IHidServer::GetActualVibrationGcErmCommand>, "GetActualVibrationGcErmCommand"},
+ {209, C<&IHidServer::BeginPermitVibrationSession>, "BeginPermitVibrationSession"},
+ {210, C<&IHidServer::EndPermitVibrationSession>, "EndPermitVibrationSession"},
+ {211, C<&IHidServer::IsVibrationDeviceMounted>, "IsVibrationDeviceMounted"},
+ {212, C<&IHidServer::SendVibrationValueInBool>, "SendVibrationValueInBool"},
+ {300, C<&IHidServer::ActivateConsoleSixAxisSensor>, "ActivateConsoleSixAxisSensor"},
+ {301, C<&IHidServer::StartConsoleSixAxisSensor>, "StartConsoleSixAxisSensor"},
+ {302, C<&IHidServer::StopConsoleSixAxisSensor>, "StopConsoleSixAxisSensor"},
+ {303, C<&IHidServer::ActivateSevenSixAxisSensor>, "ActivateSevenSixAxisSensor"},
+ {304, C<&IHidServer::StartSevenSixAxisSensor>, "StartSevenSixAxisSensor"},
+ {305, C<&IHidServer::StopSevenSixAxisSensor>, "StopSevenSixAxisSensor"},
+ {306, C<&IHidServer::InitializeSevenSixAxisSensor>, "InitializeSevenSixAxisSensor"},
+ {307, C<&IHidServer::FinalizeSevenSixAxisSensor>, "FinalizeSevenSixAxisSensor"},
+ {308, nullptr, "SetSevenSixAxisSensorFusionStrength"},
+ {309, nullptr, "GetSevenSixAxisSensorFusionStrength"},
+ {310, C<&IHidServer::ResetSevenSixAxisSensorTimestamp>, "ResetSevenSixAxisSensorTimestamp"},
+ {320, nullptr, "EnableNpadImu"}, //21.0.0+
+ {321, nullptr, "DisableNpadImu"}, //21.0.0+
+ {400, C<&IHidServer::IsUsbFullKeyControllerEnabled>, "IsUsbFullKeyControllerEnabled"},
+ {401, nullptr, "EnableUsbFullKeyController"},
+ {402, nullptr, "IsUsbFullKeyControllerConnected"},
+ {403, nullptr, "HasBattery"},
+ {404, nullptr, "HasLeftRightBattery"},
+ {405, nullptr, "GetNpadInterfaceType"},
+ {406, nullptr, "GetNpadLeftRightInterfaceType"},
+ {407, nullptr, "GetNpadOfHighestBatteryLevel"},
+ {408, nullptr, "GetNpadOfHighestBatteryLevelForJoyRight"},
+ {500, C<&IHidServer::GetPalmaConnectionHandle>, "GetPalmaConnectionHandle"},
+ {501, C<&IHidServer::InitializePalma>, "InitializePalma"},
+ {502, C<&IHidServer::AcquirePalmaOperationCompleteEvent>, "AcquirePalmaOperationCompleteEvent"},
+ {503, C<&IHidServer::GetPalmaOperationInfo>, "GetPalmaOperationInfo"},
+ {504, C<&IHidServer::PlayPalmaActivity>, "PlayPalmaActivity"},
+ {505, C<&IHidServer::SetPalmaFrModeType>, "SetPalmaFrModeType"},
+ {506, C<&IHidServer::ReadPalmaStep>, "ReadPalmaStep"},
+ {507, C<&IHidServer::EnablePalmaStep>, "EnablePalmaStep"},
+ {508, C<&IHidServer::ResetPalmaStep>, "ResetPalmaStep"},
+ {509, C<&IHidServer::ReadPalmaApplicationSection>, "ReadPalmaApplicationSection"},
+ {510, C<&IHidServer::WritePalmaApplicationSection>, "WritePalmaApplicationSection"},
+ {511, C<&IHidServer::ReadPalmaUniqueCode>, "ReadPalmaUniqueCode"},
+ {512, C<&IHidServer::SetPalmaUniqueCodeInvalid>, "SetPalmaUniqueCodeInvalid"},
+ {513, C<&IHidServer::WritePalmaActivityEntry>, "WritePalmaActivityEntry"},
+ {514, C<&IHidServer::WritePalmaRgbLedPatternEntry>, "WritePalmaRgbLedPatternEntry"},
+ {515, C<&IHidServer::WritePalmaWaveEntry>, "WritePalmaWaveEntry"},
+ {516, C<&IHidServer::SetPalmaDataBaseIdentificationVersion>, "SetPalmaDataBaseIdentificationVersion"},
+ {517, C<&IHidServer::GetPalmaDataBaseIdentificationVersion>, "GetPalmaDataBaseIdentificationVersion"},
+ {518, C<&IHidServer::SuspendPalmaFeature>, "SuspendPalmaFeature"},
+ {519, C<&IHidServer::GetPalmaOperationResult>, "GetPalmaOperationResult"},
+ {520, C<&IHidServer::ReadPalmaPlayLog>, "ReadPalmaPlayLog"},
+ {521, C<&IHidServer::ResetPalmaPlayLog>, "ResetPalmaPlayLog"},
+ {522, C<&IHidServer::SetIsPalmaAllConnectable>, "SetIsPalmaAllConnectable"},
+ {523, C<&IHidServer::SetIsPalmaPairedConnectable>, "SetIsPalmaPairedConnectable"},
+ {524, C<&IHidServer::PairPalma>, "PairPalma"},
+ {525, C<&IHidServer::SetPalmaBoostMode>, "SetPalmaBoostMode"},
+ {526, C<&IHidServer::CancelWritePalmaWaveEntry>, "CancelWritePalmaWaveEntry"},
+ {527, C<&IHidServer::EnablePalmaBoostMode>, "EnablePalmaBoostMode"},
+ {528, C<&IHidServer::GetPalmaBluetoothAddress>, "GetPalmaBluetoothAddress"},
+ {529, C<&IHidServer::SetDisallowedPalmaConnection>, "SetDisallowedPalmaConnection"},
+ {1000, C<&IHidServer::SetNpadCommunicationMode>, "SetNpadCommunicationMode"},
+ {1001, C<&IHidServer::GetNpadCommunicationMode>, "GetNpadCommunicationMode"},
+ {1002, C<&IHidServer::SetTouchScreenConfiguration>, "SetTouchScreenConfiguration"},
+ {1003, C<&IHidServer::IsFirmwareUpdateNeededForNotification>, "IsFirmwareUpdateNeededForNotification"},
+ {1004, C<&IHidServer::SetTouchScreenResolution>, "SetTouchScreenResolution"},
+ {1270, nullptr, "DeleteButtonConfigStorageRight"},
+ {1271, nullptr, "IsUsingCustomButtonConfig"},
+ {1272, nullptr, "IsAnyCustomButtonConfigEnabled"},
+ {1273, nullptr, "SetAllCustomButtonConfigEnabled"},
+ {1274, nullptr, "SetDefaultButtonConfig"},
+ {1275, nullptr, "SetAllDefaultButtonConfig"},
+ {1276, nullptr, "SetHidButtonConfigEmbedded"},
+ {1277, nullptr, "SetHidButtonConfigFull"},
+ {1278, nullptr, "SetHidButtonConfigLeft"},
+ {1279, nullptr, "SetHidButtonConfigRight"},
+ {1280, nullptr, "GetHidButtonConfigEmbedded"},
+ {1281, nullptr, "GetHidButtonConfigFull"},
+ {1282, nullptr, "GetHidButtonConfigLeft"},
+ {1283, nullptr, "GetHidButtonConfigRight"},
+ {1284, nullptr, "GetButtonConfigStorageEmbedded"},
+ {1285, nullptr, "GetButtonConfigStorageFull"},
+ {1286, nullptr, "GetButtonConfigStorageLeft"},
+ {1287, nullptr, "GetButtonConfigStorageRight"},
+ {1288, nullptr, "SetButtonConfigStorageEmbedded"},
+ {1289, nullptr, "SetButtonConfigStorageFull"},
+ {1290, nullptr, "SetButtonConfigStorageLeft"},
+ {1291, nullptr, "SetButtonConfigStorageRight"},
+ {1308, nullptr, "SetButtonConfigVisible"},
+ {1309, nullptr, "IsButtonConfigVisible"},
+ {1320, nullptr, "WakeTouchScreenUp"},
+ {1321, nullptr, "PutTouchScreenToSleep"},
+ {1322, nullptr, "AcquireTouchScreenAsyncWakeCompletedEvent"},
+ {1323, nullptr, "StartTouchScreenAutoTuneForSystemSettings"},
+ {1324, nullptr, "AcquireTouchScreenAutoTuneCompletedEvent"},
+ {1325, nullptr, "IsTouchScreenAutoTuneRequiredForRepairProviderReplacement"},
+ {1420, nullptr, "GetAppletResourceProperty"},
+ {2000, nullptr, "ActivateDigitizer"},
+ {3000, nullptr, "GetDebugPadGenericPadMap"},
+ {3001, nullptr, "SetDebugPadGenericPadMap"},
+ {3002, nullptr, "ResetDebugPadGenericPadMap"},
+ {3003, nullptr, "GetDebugPadKeyboardMap"},
+ {3004, nullptr, "SetDebugPadKeyboardMap"},
+ {3005, nullptr, "ResetDebugPadKeyboardMap"},
+ {3006, nullptr, "GetFullKeyGenericPadMap"},
+ {3007, nullptr, "SetFullKeyGenericPadMap"},
+ {3008, nullptr, "ResetFullKeyGenericPadMap"},
+ {3009, nullptr, "GetFullKeyKeyboardMap"},
+ {3010, nullptr, "SetFullKeyKeyboardMap"},
+ {3011, nullptr, "ResetFullKeyKeyboardMap"},
+ {3012, nullptr, "GetDebugPadGenericPadMap"}, //21.0.0+
+ {3013, nullptr, "SetDebugPadGenericPadMap"}, //21.0.0+
+ {3014, nullptr, "GetDebugPadKeyboardMap"}, //21.0.0+
+ {3015, nullptr, "SetDebugPadKeyboardMap"}, //21.0.0+
+ {3150, C<&IHidServer::SetMouseLibraryVersion>, "SetMouseLibraryVersion"}, //21.0.0+
+ // What? -- {12010, nullptr, "SetButtonConfigLeft"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IHidServer::~IHidServer() = default;
diff --git a/src/core/hle/service/hid/hid_server.h b/src/core/hle/service/hid/hid_server.h
index f2c08e9df8..57a1a04b9c 100644
--- a/src/core/hle/service/hid/hid_server.h
+++ b/src/core/hle/service/hid/hid_server.h
@@ -265,8 +265,6 @@ private:
Result SetTouchScreenResolution(u32 width, u32 height, ClientAppletResourceUserId aruid);
Result SetMouseLibraryVersion(ClientAppletResourceUserId aruid);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
-
std::shared_ptr<ResourceManager> resource_manager;
std::shared_ptr<HidFirmwareSettings> firmware_settings;
};
diff --git a/src/core/hle/service/hid/hid_system_server.cpp b/src/core/hle/service/hid/hid_system_server.cpp
index 4df021f443..e544adf03c 100644
--- a/src/core/hle/service/hid/hid_system_server.cpp
+++ b/src/core/hle/service/hid/hid_system_server.cpp
@@ -22,6 +22,252 @@ IHidSystemServer::IHidSystemServer(Core::System& system_, std::shared_ptr<Resour
std::shared_ptr<HidFirmwareSettings> settings)
: ServiceFramework{system_, "hid:sys"}, service_context{system_, service_name},
resource_manager{resource}, firmware_settings{settings} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {31, nullptr, "SendKeyboardLockKeyEvent"},
+ {101, nullptr, "AcquireHomeButtonEventHandle"},
+ {111, nullptr, "ActivateHomeButton"},
+ {121, nullptr, "AcquireSleepButtonEventHandle"},
+ {131, nullptr, "ActivateSleepButton"},
+ {141, nullptr, "AcquireCaptureButtonEventHandle"},
+ {151, nullptr, "ActivateCaptureButton"},
+ {161, &IHidSystemServer::GetPlatformConfig, "GetPlatformConfig"},
+ {210, nullptr, "AcquireNfcDeviceUpdateEventHandle"},
+ {211, nullptr, "GetNpadsWithNfc"},
+ {212, nullptr, "AcquireNfcActivateEventHandle"},
+ {213, nullptr, "ActivateNfc"},
+ {214, nullptr, "GetXcdHandleForNpadWithNfc"},
+ {215, nullptr, "IsNfcActivated"},
+ {216, nullptr, "GetAbstractedPadIdForNpadWithNfc"},
+ {217, nullptr, "SetNfcEvent"},
+ {218, nullptr, "GetNfcInfo"},
+ {219, nullptr, "StartNfcDiscovery"},
+ {220, nullptr, "StopNfcDiscovery"},
+ {221, nullptr, "StartNtagRead"},
+ {222, nullptr, "StartNtagWrite"},
+ {223, nullptr, "SendNfcRawData"},
+ {224, nullptr, "RegisterMifareKey"},
+ {225, nullptr, "ClearMifareKey"},
+ {226, nullptr, "StartMifareRead"},
+ {227, nullptr, "StartMifareWrite"},
+ {230, nullptr, "AcquireIrSensorEventHndle" },
+ {231, nullptr, "ActivateIrSensor"},
+ {232, nullptr, "GetIrSensorState"},
+ {233, nullptr, "GetXcdHandleForNpadWihIrSensor" },
+ {234, nullptr, "GetNpadJoyHoldType"},
+ {241, nullptr, "GetDataFormat"},
+ {242, nullptr, "SetDataFormat"},
+ {243, nullptr, "GetMcuState"},
+ {244, nullptr, "SetMcuState"},
+ {245, nullptr, "GetMcuVersionForNfc"},
+ {246, nullptr, "CheckNfcDevicePower"},
+ {247, nullptr, "SetMcuStateImmediate"},
+ {301, nullptr, "ActivateNpadSystem"},
+ {303, &IHidSystemServer::ApplyNpadSystemCommonPolicy, "ApplyNpadSystemCommonPolicy"},
+ {304, &IHidSystemServer::EnableAssigningSingleOnSlSrPress, "EnableAssigningSingleOnSlSrPress"},
+ {305, &IHidSystemServer::DisableAssigningSingleOnSlSrPress, "DisableAssigningSingleOnSlSrPress"},
+ {306, &IHidSystemServer::GetLastActiveNpad, "GetLastActiveNpad"},
+ {307, nullptr, "GetNpadSystemExtStyle"},
+ {308, &IHidSystemServer::ApplyNpadSystemCommonPolicyFull, "ApplyNpadSystemCommonPolicyFull"},
+ {309, &IHidSystemServer::GetNpadFullKeyGripColor, "GetNpadFullKeyGripColor"},
+ {310, &IHidSystemServer::GetMaskedSupportedNpadStyleSet, "GetMaskedSupportedNpadStyleSet"},
+ {311, nullptr, "SetNpadPlayerLedBlinkingDevice"},
+ {312, &IHidSystemServer::SetSupportedNpadStyleSetAll, "SetSupportedNpadStyleSetAll"},
+ {313, &IHidSystemServer::GetNpadCaptureButtonAssignment, "GetNpadCaptureButtonAssignment"},
+ {314, nullptr, "GetAppletFooterUiType"},
+ {315, &IHidSystemServer::GetAppletDetailedUiType, "GetAppletDetailedUiType"},
+ {316, &IHidSystemServer::GetNpadInterfaceType, "GetNpadInterfaceType"},
+ {317, &IHidSystemServer::GetNpadLeftRightInterfaceType, "GetNpadLeftRightInterfaceType"},
+ {318, &IHidSystemServer::HasBattery, "HasBattery"},
+ {319, &IHidSystemServer::HasLeftRightBattery, "HasLeftRightBattery"},
+ {321, &IHidSystemServer::GetUniquePadsFromNpad, "GetUniquePadsFromNpad"},
+ {322, &IHidSystemServer::SetNpadSystemExtStateEnabled, "SetNpadSystemExtStateEnabled"},
+ {323, nullptr, "GetLastActiveUniquePad"},
+ {324, nullptr, "GetUniquePadButtonSet"},
+ {325, nullptr, "GetUniquePadColor"},
+ {326, nullptr, "GetUniquePadAppletDetailedUiType"},
+ {327, nullptr, "GetAbstractedPadIdDataFromNpad"},
+ {328, nullptr, "AttachAbstractedPadToNpad"},
+ {329, nullptr, "DetachAbstractedPadAll"},
+ {330, nullptr, "CheckAbstractedPadConnection"},
+ {332, nullptr, "ConvertAppletDetailedUiTypeFromPlayReportType"}, //19.0.0+
+ {333, nullptr, "SetNpadUserSpgApplet"}, //20.0.0+
+ {334, nullptr, "AcquireUniquePadButtonStateChangedEventHandle"}, //20.0.0+
+ {501, &IHidSystemServer::RegisterAppletResourceUserId, "RegisterAppletResourceUserId"},
+ {502, &IHidSystemServer::UnregisterAppletResourceUserId, "UnregisterAppletResourceUserId"},
+ {503, &IHidSystemServer::EnableAppletToGetInput, "EnableAppletToGetInput"},
+ {504, &IHidSystemServer::SetAruidValidForVibration, "SetAruidValidForVibration"},
+ {505, &IHidSystemServer::EnableAppletToGetSixAxisSensor, "EnableAppletToGetSixAxisSensor"},
+ {506, &IHidSystemServer::EnableAppletToGetPadInput, "EnableAppletToGetPadInput"},
+ {507, &IHidSystemServer::EnableAppletToGetTouchScreen, "EnableAppletToGetTouchScreen"},
+ {510, &IHidSystemServer::SetVibrationMasterVolume, "SetVibrationMasterVolume"},
+ {511, &IHidSystemServer::GetVibrationMasterVolume, "GetVibrationMasterVolume"},
+ {512, &IHidSystemServer::BeginPermitVibrationSession, "BeginPermitVibrationSession"},
+ {513, &IHidSystemServer::EndPermitVibrationSession, "EndPermitVibrationSession"},
+ {514, nullptr, "Unknown514"},
+ {520, nullptr, "EnableHandheldHids"},
+ {521, nullptr, "DisableHandheldHids"},
+ {522, nullptr, "SetJoyConRailEnabled"},
+ {523, &IHidSystemServer::IsJoyConRailEnabled, "IsJoyConRailEnabled"},
+ {524, nullptr, "IsHandheldHidsEnabled"},
+ {525, &IHidSystemServer::IsJoyConAttachedOnAllRail, "IsJoyConAttachedOnAllRail"},
+ {540, nullptr, "AcquirePlayReportControllerUsageUpdateEvent"},
+ {541, nullptr, "GetPlayReportControllerUsages"},
+ {542, nullptr, "AcquirePlayReportRegisteredDeviceUpdateEvent"},
+ {543, nullptr, "GetRegisteredDevicesOld"},
+ {544, &IHidSystemServer::AcquireConnectionTriggerTimeoutEvent, "AcquireConnectionTriggerTimeoutEvent"},
+ {545, nullptr, "SendConnectionTrigger"},
+ {546, &IHidSystemServer::AcquireDeviceRegisteredEventForControllerSupport, "AcquireDeviceRegisteredEventForControllerSupport"},
+ {547, nullptr, "GetAllowedBluetoothLinksCount"},
+ {548, &IHidSystemServer::GetRegisteredDevices, "GetRegisteredDevices"},
+ {549, nullptr, "GetConnectableRegisteredDevices"},
+ {551, &IHidSystemServer::GetRegisteredDevices, "GetRegisteredDevicesForControllerSupport"}, //20.0.0+ //mocked via 548 for Diablo 3 (at least)
+ {700, nullptr, "ActivateUniquePad"},
+ {702, &IHidSystemServer::AcquireUniquePadConnectionEventHandle, "AcquireUniquePadConnectionEventHandle"},
+ {703, &IHidSystemServer::GetUniquePadIds, "GetUniquePadIds"},
+ {711, nullptr, "AcquireUniquePadConnectionOnHandheldForNsEventHandle"}, //20.0.0+
+ {712, nullptr, "GetUniquePadColor12"}, //20.0.0+
+ {751, &IHidSystemServer::AcquireJoyDetachOnBluetoothOffEventHandle, "AcquireJoyDetachOnBluetoothOffEventHandle"},
+ {800, nullptr, "ListSixAxisSensorHandles"},
+ {801, nullptr, "IsSixAxisSensorUserCalibrationSupported"},
+ {802, nullptr, "ResetSixAxisSensorCalibrationValues"},
+ {803, nullptr, "StartSixAxisSensorUserCalibration"},
+ {804, nullptr, "CancelSixAxisSensorUserCalibration"},
+ {805, nullptr, "GetUniquePadBluetoothAddress"},
+ {806, nullptr, "DisconnectUniquePad"},
+ {807, nullptr, "GetUniquePadType"},
+ {808, nullptr, "GetUniquePadInterface"},
+ {809, nullptr, "GetUniquePadSerialNumber"},
+ {810, nullptr, "GetUniquePadControllerNumber"},
+ {811, nullptr, "GetSixAxisSensorUserCalibrationStage"},
+ {812, nullptr, "GetConsoleUniqueSixAxisSensorHandle"},
+ {813, nullptr, "GetDeviceType"},
+ {821, nullptr, "StartAnalogStickManualCalibration"},
+ {822, nullptr, "RetryCurrentAnalogStickManualCalibrationStage"},
+ {823, nullptr, "CancelAnalogStickManualCalibration"},
+ {824, nullptr, "ResetAnalogStickManualCalibration"},
+ {825, nullptr, "GetAnalogStickState"},
+ {826, nullptr, "GetAnalogStickManualCalibrationStage"},
+ {827, nullptr, "IsAnalogStickButtonPressed"},
+ {828, nullptr, "IsAnalogStickInReleasePosition"},
+ {829, nullptr, "IsAnalogStickInCircumference"},
+ {830, nullptr, "SetNotificationLedPattern"},
+ {831, nullptr, "SetNotificationLedPatternWithTimeout"},
+ {832, nullptr, "PrepareHidsForNotificationWake"},
+ {850, &IHidSystemServer::IsUsbFullKeyControllerEnabled, "IsUsbFullKeyControllerEnabled"},
+ {851, &IHidSystemServer::EnableUsbFullKeyController, "EnableUsbFullKeyController"},
+ {852, nullptr, "IsUsbConnected"},
+ {870, &IHidSystemServer::IsHandheldButtonPressedOnConsoleMode, "IsHandheldButtonPressedOnConsoleMode"},
+ {900, nullptr, "ActivateInputDetector"},
+ {901, nullptr, "NotifyInputDetector"},
+ {1000, &IHidSystemServer::InitializeFirmwareUpdate, "InitializeFirmwareUpdate"},
+ {1001, nullptr, "GetFirmwareVersion"},
+ {1002, nullptr, "GetAvailableFirmwareVersion"},
+ {1003, nullptr, "IsFirmwareUpdateAvailable"},
+ {1004, &IHidSystemServer::CheckFirmwareUpdateRequired, "CheckFirmwareUpdateRequired"},
+ {1005, nullptr, "StartFirmwareUpdate"},
+ {1006, nullptr, "AbortFirmwareUpdate"},
+ {1007, nullptr, "GetFirmwareUpdateState"},
+ {1008, nullptr, "ActivateAudioControl"},
+ {1009, nullptr, "AcquireAudioControlEventHandle"},
+ {1010, nullptr, "GetAudioControlStates"},
+ {1011, nullptr, "DeactivateAudioControl"},
+ {1012, nullptr, "GetFirmwareVersionStringForUserSupportPage"},
+ {1050, nullptr, "IsSixAxisSensorAccurateUserCalibrationSupported"},
+ {1051, nullptr, "StartSixAxisSensorAccurateUserCalibration"},
+ {1052, nullptr, "CancelSixAxisSensorAccurateUserCalibration"},
+ {1053, nullptr, "GetSixAxisSensorAccurateUserCalibrationState"},
+ {1100, nullptr, "GetHidbusSystemServiceObject"},
+ {1120, &IHidSystemServer::SetFirmwareHotfixUpdateSkipEnabled, "SetFirmwareHotfixUpdateSkipEnabled"},
+ {1130, &IHidSystemServer::InitializeUsbFirmwareUpdate, "InitializeUsbFirmwareUpdate"},
+ {1131, &IHidSystemServer::FinalizeUsbFirmwareUpdate, "FinalizeUsbFirmwareUpdate"},
+ {1132, &IHidSystemServer::CheckUsbFirmwareUpdateRequired, "CheckUsbFirmwareUpdateRequired"},
+ {1133, nullptr, "StartUsbFirmwareUpdate"},
+ {1134, nullptr, "GetUsbFirmwareUpdateState"},
+ {1135, &IHidSystemServer::InitializeUsbFirmwareUpdateWithoutMemory, "InitializeUsbFirmwareUpdateWithoutMemory"},
+ {1150, &IHidSystemServer::SetTouchScreenMagnification, "SetTouchScreenMagnification"},
+ {1151, &IHidSystemServer::GetTouchScreenFirmwareVersion, "GetTouchScreenFirmwareVersion"},
+ {1152, &IHidSystemServer::SetTouchScreenDefaultConfiguration, "SetTouchScreenDefaultConfiguration"},
+ {1153, &IHidSystemServer::GetTouchScreenDefaultConfiguration, "GetTouchScreenDefaultConfiguration"},
+ {1154, nullptr, "IsFirmwareAvailableForNotification"},
+ {1155, &IHidSystemServer::SetForceHandheldStyleVibration, "SetForceHandheldStyleVibration"},
+ {1156, nullptr, "SendConnectionTriggerWithoutTimeoutEvent"},
+ {1157, nullptr, "CancelConnectionTrigger"},
+ {1158, nullptr, "SetConnectionLimitForSplay"}, //20.1.0+
+ {1159, nullptr, "ClearConnectionLimitForSplay"}, //20.1.0+
+ {1200, nullptr, "IsButtonConfigSupported"},
+ {1201, nullptr, "IsButtonConfigEmbeddedSupported"},
+ {1202, nullptr, "DeleteButtonConfig"},
+ {1203, nullptr, "DeleteButtonConfigEmbedded"},
+ {1204, nullptr, "SetButtonConfigEnabled"},
+ {1205, nullptr, "SetButtonConfigEmbeddedEnabled"},
+ {1206, nullptr, "IsButtonConfigEnabled"},
+ {1207, nullptr, "IsButtonConfigEmbeddedEnabled"},
+ {1208, nullptr, "SetButtonConfigEmbedded"},
+ {1209, nullptr, "SetButtonConfigFull"},
+ {1210, nullptr, "SetButtonConfigLeft"},
+ {1211, nullptr, "SetButtonConfigRight"},
+ {1212, nullptr, "GetButtonConfigEmbedded"},
+ {1213, nullptr, "GetButtonConfigFull"},
+ {1214, nullptr, "GetButtonConfigLeft"},
+ {1215, nullptr, "GetButtonConfigRight"},
+ {1250, nullptr, "IsCustomButtonConfigSupported"},
+ {1251, nullptr, "IsDefaultButtonConfigEmbedded"},
+ {1252, nullptr, "IsDefaultButtonConfigFull"},
+ {1253, nullptr, "IsDefaultButtonConfigLeft"},
+ {1254, nullptr, "IsDefaultButtonConfigRight"},
+ {1255, nullptr, "IsButtonConfigStorageEmbeddedEmpty"},
+ {1256, nullptr, "IsButtonConfigStorageFullEmpty"},
+ {1257, nullptr, "IsButtonConfigStorageLeftEmpty"},
+ {1258, nullptr, "IsButtonConfigStorageRightEmpty"},
+ {1259, nullptr, "GetButtonConfigStorageEmbeddedDeprecated"},
+ {1260, nullptr, "GetButtonConfigStorageFullDeprecated"},
+ {1261, nullptr, "GetButtonConfigStorageLeftDeprecated"},
+ {1262, nullptr, "GetButtonConfigStorageRightDeprecated"},
+ {1263, nullptr, "SetButtonConfigStorageEmbeddedDeprecated"},
+ {1264, nullptr, "SetButtonConfigStorageFullDeprecated"},
+ {1265, nullptr, "SetButtonConfigStorageLeftDeprecated"},
+ {1266, nullptr, "SetButtonConfigStorageRightDeprecated"},
+ {1267, nullptr, "DeleteButtonConfigStorageEmbedded"},
+ {1268, nullptr, "DeleteButtonConfigStorageFull"},
+ {1269, nullptr, "DeleteButtonConfigStorageLeft"},
+ {1270, nullptr, "DeleteButtonConfigStorageRight"},
+ {1271, &IHidSystemServer::IsUsingCustomButtonConfig, "IsUsingCustomButtonConfig"},
+ {1272, &IHidSystemServer::IsAnyCustomButtonConfigEnabled, "IsAnyCustomButtonConfigEnabled"},
+ {1273, nullptr, "SetAllCustomButtonConfigEnabled"},
+ {1274, nullptr, "SetDefaultButtonConfig"},
+ {1275, nullptr, "SetAllDefaultButtonConfig"},
+ {1276, nullptr, "SetHidButtonConfigEmbedded"},
+ {1277, nullptr, "SetHidButtonConfigFull"},
+ {1278, nullptr, "SetHidButtonConfigLeft"},
+ {1279, nullptr, "SetHidButtonConfigRight"},
+ {1280, nullptr, "GetHidButtonConfigEmbedded"},
+ {1281, nullptr, "GetHidButtonConfigFull"},
+ {1282, nullptr, "GetHidButtonConfigLeft"},
+ {1283, nullptr, "GetHidButtonConfigRight"},
+ {1284, nullptr, "GetButtonConfigStorageEmbedded"},
+ {1285, nullptr, "GetButtonConfigStorageFull"},
+ {1286, nullptr, "GetButtonConfigStorageLeft"},
+ {1287, nullptr, "GetButtonConfigStorageRight"},
+ {1288, nullptr, "SetButtonConfigStorageEmbedded"},
+ {1289, nullptr, "SetButtonConfigStorageFull"},
+ {1290, nullptr, "DeleteButtonConfigStorageRight"},
+ {1291, nullptr, "DeleteButtonConfigStorageRight"},
+ {1308, nullptr, "SetButtonConfigVisible"}, //18.0.0+
+ {1309, nullptr, "IsButtonConfigVisible"}, //18.0.0+
+ {1320, nullptr, "WakeTouchScreenUp"}, //17.0.0+
+ {1321, nullptr, "PutTouchScreenToSleep"}, //17.0.0+
+ {1322, nullptr, "AcquireTouchScreenAsyncWakeCompletedEvent"}, //20.0.0+
+ {1323, nullptr, "StartTouchScreenAutoTuneForSystemSettings"}, //21.0.0+
+ {1324, nullptr, "AcquireTouchScreenAutoTuneCompletedEvent"}, //21.0.0+
+ {1325, nullptr, "IsTouchScreenAutoTuneRequiredForRepairProviderReplacement"}, //21.0.0+
+ {1326, nullptr, "SetTouchScreenOffset"}, //21.0.0+
+ {1420, nullptr, "GetAppletResourceProperty"}, //19.0.0+
+ {12010, nullptr, "SetButtonConfigLeft"} //11.0.0-17.0.1
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
joy_detach_event = service_context.CreateEvent("IHidSystemServer::JoyDetachEvent");
acquire_device_registered_event =
diff --git a/src/core/hle/service/hid/hid_system_server.h b/src/core/hle/service/hid/hid_system_server.h
index e5da7bbdac..150b697305 100644
--- a/src/core/hle/service/hid/hid_system_server.h
+++ b/src/core/hle/service/hid/hid_system_server.h
@@ -84,252 +84,6 @@ private:
std::shared_ptr<ResourceManager> GetResourceManager();
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{31, nullptr, "SendKeyboardLockKeyEvent"},
- FunctionInfo{101, nullptr, "AcquireHomeButtonEventHandle"},
- FunctionInfo{111, nullptr, "ActivateHomeButton"},
- FunctionInfo{121, nullptr, "AcquireSleepButtonEventHandle"},
- FunctionInfo{131, nullptr, "ActivateSleepButton"},
- FunctionInfo{141, nullptr, "AcquireCaptureButtonEventHandle"},
- FunctionInfo{151, nullptr, "ActivateCaptureButton"},
- FunctionInfo{161, &IHidSystemServer::GetPlatformConfig, "GetPlatformConfig"},
- FunctionInfo{210, nullptr, "AcquireNfcDeviceUpdateEventHandle"},
- FunctionInfo{211, nullptr, "GetNpadsWithNfc"},
- FunctionInfo{212, nullptr, "AcquireNfcActivateEventHandle"},
- FunctionInfo{213, nullptr, "ActivateNfc"},
- FunctionInfo{214, nullptr, "GetXcdHandleForNpadWithNfc"},
- FunctionInfo{215, nullptr, "IsNfcActivated"},
- FunctionInfo{216, nullptr, "GetAbstractedPadIdForNpadWithNfc"},
- FunctionInfo{217, nullptr, "SetNfcEvent"},
- FunctionInfo{218, nullptr, "GetNfcInfo"},
- FunctionInfo{219, nullptr, "StartNfcDiscovery"},
- FunctionInfo{220, nullptr, "StopNfcDiscovery"},
- FunctionInfo{221, nullptr, "StartNtagRead"},
- FunctionInfo{222, nullptr, "StartNtagWrite"},
- FunctionInfo{223, nullptr, "SendNfcRawData"},
- FunctionInfo{224, nullptr, "RegisterMifareKey"},
- FunctionInfo{225, nullptr, "ClearMifareKey"},
- FunctionInfo{226, nullptr, "StartMifareRead"},
- FunctionInfo{227, nullptr, "StartMifareWrite"},
- FunctionInfo{230, nullptr, "AcquireIrSensorEventHndle" },
- FunctionInfo{231, nullptr, "ActivateIrSensor"},
- FunctionInfo{232, nullptr, "GetIrSensorState"},
- FunctionInfo{233, nullptr, "GetXcdHandleForNpadWihIrSensor" },
- FunctionInfo{234, nullptr, "GetNpadJoyHoldType"},
- FunctionInfo{241, nullptr, "GetDataFormat"},
- FunctionInfo{242, nullptr, "SetDataFormat"},
- FunctionInfo{243, nullptr, "GetMcuState"},
- FunctionInfo{244, nullptr, "SetMcuState"},
- FunctionInfo{245, nullptr, "GetMcuVersionForNfc"},
- FunctionInfo{246, nullptr, "CheckNfcDevicePower"},
- FunctionInfo{247, nullptr, "SetMcuStateImmediate"},
- FunctionInfo{301, nullptr, "ActivateNpadSystem"},
- FunctionInfo{303, &IHidSystemServer::ApplyNpadSystemCommonPolicy, "ApplyNpadSystemCommonPolicy"},
- FunctionInfo{304, &IHidSystemServer::EnableAssigningSingleOnSlSrPress, "EnableAssigningSingleOnSlSrPress"},
- FunctionInfo{305, &IHidSystemServer::DisableAssigningSingleOnSlSrPress, "DisableAssigningSingleOnSlSrPress"},
- FunctionInfo{306, &IHidSystemServer::GetLastActiveNpad, "GetLastActiveNpad"},
- FunctionInfo{307, nullptr, "GetNpadSystemExtStyle"},
- FunctionInfo{308, &IHidSystemServer::ApplyNpadSystemCommonPolicyFull, "ApplyNpadSystemCommonPolicyFull"},
- FunctionInfo{309, &IHidSystemServer::GetNpadFullKeyGripColor, "GetNpadFullKeyGripColor"},
- FunctionInfo{310, &IHidSystemServer::GetMaskedSupportedNpadStyleSet, "GetMaskedSupportedNpadStyleSet"},
- FunctionInfo{311, nullptr, "SetNpadPlayerLedBlinkingDevice"},
- FunctionInfo{312, &IHidSystemServer::SetSupportedNpadStyleSetAll, "SetSupportedNpadStyleSetAll"},
- FunctionInfo{313, &IHidSystemServer::GetNpadCaptureButtonAssignment, "GetNpadCaptureButtonAssignment"},
- FunctionInfo{314, nullptr, "GetAppletFooterUiType"},
- FunctionInfo{315, &IHidSystemServer::GetAppletDetailedUiType, "GetAppletDetailedUiType"},
- FunctionInfo{316, &IHidSystemServer::GetNpadInterfaceType, "GetNpadInterfaceType"},
- FunctionInfo{317, &IHidSystemServer::GetNpadLeftRightInterfaceType, "GetNpadLeftRightInterfaceType"},
- FunctionInfo{318, &IHidSystemServer::HasBattery, "HasBattery"},
- FunctionInfo{319, &IHidSystemServer::HasLeftRightBattery, "HasLeftRightBattery"},
- FunctionInfo{321, &IHidSystemServer::GetUniquePadsFromNpad, "GetUniquePadsFromNpad"},
- FunctionInfo{322, &IHidSystemServer::SetNpadSystemExtStateEnabled, "SetNpadSystemExtStateEnabled"},
- FunctionInfo{323, nullptr, "GetLastActiveUniquePad"},
- FunctionInfo{324, nullptr, "GetUniquePadButtonSet"},
- FunctionInfo{325, nullptr, "GetUniquePadColor"},
- FunctionInfo{326, nullptr, "GetUniquePadAppletDetailedUiType"},
- FunctionInfo{327, nullptr, "GetAbstractedPadIdDataFromNpad"},
- FunctionInfo{328, nullptr, "AttachAbstractedPadToNpad"},
- FunctionInfo{329, nullptr, "DetachAbstractedPadAll"},
- FunctionInfo{330, nullptr, "CheckAbstractedPadConnection"},
- FunctionInfo{332, nullptr, "ConvertAppletDetailedUiTypeFromPlayReportType", MakeVersionGate({19,0,0})},
- FunctionInfo{333, nullptr, "SetNpadUserSpgApplet", MakeVersionGate({20,0,0})},
- FunctionInfo{334, nullptr, "AcquireUniquePadButtonStateChangedEventHandle", MakeVersionGate({20,0,0})},
- FunctionInfo{501, &IHidSystemServer::RegisterAppletResourceUserId, "RegisterAppletResourceUserId"},
- FunctionInfo{502, &IHidSystemServer::UnregisterAppletResourceUserId, "UnregisterAppletResourceUserId"},
- FunctionInfo{503, &IHidSystemServer::EnableAppletToGetInput, "EnableAppletToGetInput"},
- FunctionInfo{504, &IHidSystemServer::SetAruidValidForVibration, "SetAruidValidForVibration"},
- FunctionInfo{505, &IHidSystemServer::EnableAppletToGetSixAxisSensor, "EnableAppletToGetSixAxisSensor"},
- FunctionInfo{506, &IHidSystemServer::EnableAppletToGetPadInput, "EnableAppletToGetPadInput"},
- FunctionInfo{507, &IHidSystemServer::EnableAppletToGetTouchScreen, "EnableAppletToGetTouchScreen"},
- FunctionInfo{510, &IHidSystemServer::SetVibrationMasterVolume, "SetVibrationMasterVolume"},
- FunctionInfo{511, &IHidSystemServer::GetVibrationMasterVolume, "GetVibrationMasterVolume"},
- FunctionInfo{512, &IHidSystemServer::BeginPermitVibrationSession, "BeginPermitVibrationSession"},
- FunctionInfo{513, &IHidSystemServer::EndPermitVibrationSession, "EndPermitVibrationSession"},
- FunctionInfo{514, nullptr, "Unknown514"},
- FunctionInfo{520, nullptr, "EnableHandheldHids"},
- FunctionInfo{521, nullptr, "DisableHandheldHids"},
- FunctionInfo{522, nullptr, "SetJoyConRailEnabled"},
- FunctionInfo{523, &IHidSystemServer::IsJoyConRailEnabled, "IsJoyConRailEnabled"},
- FunctionInfo{524, nullptr, "IsHandheldHidsEnabled"},
- FunctionInfo{525, &IHidSystemServer::IsJoyConAttachedOnAllRail, "IsJoyConAttachedOnAllRail"},
- FunctionInfo{540, nullptr, "AcquirePlayReportControllerUsageUpdateEvent"},
- FunctionInfo{541, nullptr, "GetPlayReportControllerUsages"},
- FunctionInfo{542, nullptr, "AcquirePlayReportRegisteredDeviceUpdateEvent"},
- FunctionInfo{543, nullptr, "GetRegisteredDevicesOld"},
- FunctionInfo{544, &IHidSystemServer::AcquireConnectionTriggerTimeoutEvent, "AcquireConnectionTriggerTimeoutEvent"},
- FunctionInfo{545, nullptr, "SendConnectionTrigger"},
- FunctionInfo{546, &IHidSystemServer::AcquireDeviceRegisteredEventForControllerSupport, "AcquireDeviceRegisteredEventForControllerSupport"},
- FunctionInfo{547, nullptr, "GetAllowedBluetoothLinksCount"},
- FunctionInfo{548, &IHidSystemServer::GetRegisteredDevices, "GetRegisteredDevices"},
- FunctionInfo{549, nullptr, "GetConnectableRegisteredDevices"},
- FunctionInfo{551, &IHidSystemServer::GetRegisteredDevices, "GetRegisteredDevicesForControllerSupport", MakeVersionGate({20,0,0})}, //mocked via 548 for Diablo 3 (at least)
- FunctionInfo{700, nullptr, "ActivateUniquePad"},
- FunctionInfo{702, &IHidSystemServer::AcquireUniquePadConnectionEventHandle, "AcquireUniquePadConnectionEventHandle"},
- FunctionInfo{703, &IHidSystemServer::GetUniquePadIds, "GetUniquePadIds"},
- FunctionInfo{711, nullptr, "AcquireUniquePadConnectionOnHandheldForNsEventHandle", MakeVersionGate({20,0,0})},
- FunctionInfo{712, nullptr, "GetUniquePadColor12", MakeVersionGate({20,0,0})},
- FunctionInfo{751, &IHidSystemServer::AcquireJoyDetachOnBluetoothOffEventHandle, "AcquireJoyDetachOnBluetoothOffEventHandle"},
- FunctionInfo{800, nullptr, "ListSixAxisSensorHandles"},
- FunctionInfo{801, nullptr, "IsSixAxisSensorUserCalibrationSupported"},
- FunctionInfo{802, nullptr, "ResetSixAxisSensorCalibrationValues"},
- FunctionInfo{803, nullptr, "StartSixAxisSensorUserCalibration"},
- FunctionInfo{804, nullptr, "CancelSixAxisSensorUserCalibration"},
- FunctionInfo{805, nullptr, "GetUniquePadBluetoothAddress"},
- FunctionInfo{806, nullptr, "DisconnectUniquePad"},
- FunctionInfo{807, nullptr, "GetUniquePadType"},
- FunctionInfo{808, nullptr, "GetUniquePadInterface"},
- FunctionInfo{809, nullptr, "GetUniquePadSerialNumber"},
- FunctionInfo{810, nullptr, "GetUniquePadControllerNumber"},
- FunctionInfo{811, nullptr, "GetSixAxisSensorUserCalibrationStage"},
- FunctionInfo{812, nullptr, "GetConsoleUniqueSixAxisSensorHandle"},
- FunctionInfo{813, nullptr, "GetDeviceType"},
- FunctionInfo{821, nullptr, "StartAnalogStickManualCalibration"},
- FunctionInfo{822, nullptr, "RetryCurrentAnalogStickManualCalibrationStage"},
- FunctionInfo{823, nullptr, "CancelAnalogStickManualCalibration"},
- FunctionInfo{824, nullptr, "ResetAnalogStickManualCalibration"},
- FunctionInfo{825, nullptr, "GetAnalogStickState"},
- FunctionInfo{826, nullptr, "GetAnalogStickManualCalibrationStage"},
- FunctionInfo{827, nullptr, "IsAnalogStickButtonPressed"},
- FunctionInfo{828, nullptr, "IsAnalogStickInReleasePosition"},
- FunctionInfo{829, nullptr, "IsAnalogStickInCircumference"},
- FunctionInfo{830, nullptr, "SetNotificationLedPattern"},
- FunctionInfo{831, nullptr, "SetNotificationLedPatternWithTimeout"},
- FunctionInfo{832, nullptr, "PrepareHidsForNotificationWake"},
- FunctionInfo{850, &IHidSystemServer::IsUsbFullKeyControllerEnabled, "IsUsbFullKeyControllerEnabled"},
- FunctionInfo{851, &IHidSystemServer::EnableUsbFullKeyController, "EnableUsbFullKeyController"},
- FunctionInfo{852, nullptr, "IsUsbConnected"},
- FunctionInfo{870, &IHidSystemServer::IsHandheldButtonPressedOnConsoleMode, "IsHandheldButtonPressedOnConsoleMode"},
- FunctionInfo{900, nullptr, "ActivateInputDetector"},
- FunctionInfo{901, nullptr, "NotifyInputDetector"},
- FunctionInfo{1000, &IHidSystemServer::InitializeFirmwareUpdate, "InitializeFirmwareUpdate"},
- FunctionInfo{1001, nullptr, "GetFirmwareVersion"},
- FunctionInfo{1002, nullptr, "GetAvailableFirmwareVersion"},
- FunctionInfo{1003, nullptr, "IsFirmwareUpdateAvailable"},
- FunctionInfo{1004, &IHidSystemServer::CheckFirmwareUpdateRequired, "CheckFirmwareUpdateRequired"},
- FunctionInfo{1005, nullptr, "StartFirmwareUpdate"},
- FunctionInfo{1006, nullptr, "AbortFirmwareUpdate"},
- FunctionInfo{1007, nullptr, "GetFirmwareUpdateState"},
- FunctionInfo{1008, nullptr, "ActivateAudioControl"},
- FunctionInfo{1009, nullptr, "AcquireAudioControlEventHandle"},
- FunctionInfo{1010, nullptr, "GetAudioControlStates"},
- FunctionInfo{1011, nullptr, "DeactivateAudioControl"},
- FunctionInfo{1012, nullptr, "GetFirmwareVersionStringForUserSupportPage"},
- FunctionInfo{1050, nullptr, "IsSixAxisSensorAccurateUserCalibrationSupported"},
- FunctionInfo{1051, nullptr, "StartSixAxisSensorAccurateUserCalibration"},
- FunctionInfo{1052, nullptr, "CancelSixAxisSensorAccurateUserCalibration"},
- FunctionInfo{1053, nullptr, "GetSixAxisSensorAccurateUserCalibrationState"},
- FunctionInfo{1100, nullptr, "GetHidbusSystemServiceObject"},
- FunctionInfo{1120, &IHidSystemServer::SetFirmwareHotfixUpdateSkipEnabled, "SetFirmwareHotfixUpdateSkipEnabled"},
- FunctionInfo{1130, &IHidSystemServer::InitializeUsbFirmwareUpdate, "InitializeUsbFirmwareUpdate"},
- FunctionInfo{1131, &IHidSystemServer::FinalizeUsbFirmwareUpdate, "FinalizeUsbFirmwareUpdate"},
- FunctionInfo{1132, &IHidSystemServer::CheckUsbFirmwareUpdateRequired, "CheckUsbFirmwareUpdateRequired"},
- FunctionInfo{1133, nullptr, "StartUsbFirmwareUpdate"},
- FunctionInfo{1134, nullptr, "GetUsbFirmwareUpdateState"},
- FunctionInfo{1135, &IHidSystemServer::InitializeUsbFirmwareUpdateWithoutMemory, "InitializeUsbFirmwareUpdateWithoutMemory"},
- FunctionInfo{1150, &IHidSystemServer::SetTouchScreenMagnification, "SetTouchScreenMagnification"},
- FunctionInfo{1151, &IHidSystemServer::GetTouchScreenFirmwareVersion, "GetTouchScreenFirmwareVersion"},
- FunctionInfo{1152, &IHidSystemServer::SetTouchScreenDefaultConfiguration, "SetTouchScreenDefaultConfiguration"},
- FunctionInfo{1153, &IHidSystemServer::GetTouchScreenDefaultConfiguration, "GetTouchScreenDefaultConfiguration"},
- FunctionInfo{1154, nullptr, "IsFirmwareAvailableForNotification"},
- FunctionInfo{1155, &IHidSystemServer::SetForceHandheldStyleVibration, "SetForceHandheldStyleVibration"},
- FunctionInfo{1156, nullptr, "SendConnectionTriggerWithoutTimeoutEvent"},
- FunctionInfo{1157, nullptr, "CancelConnectionTrigger"},
- FunctionInfo{1158, nullptr, "SetConnectionLimitForSplay", MakeVersionGate({20,1,0})},
- FunctionInfo{1159, nullptr, "ClearConnectionLimitForSplay", MakeVersionGate({20,1,0})},
- FunctionInfo{1200, nullptr, "IsButtonConfigSupported"},
- FunctionInfo{1201, nullptr, "IsButtonConfigEmbeddedSupported"},
- FunctionInfo{1202, nullptr, "DeleteButtonConfig"},
- FunctionInfo{1203, nullptr, "DeleteButtonConfigEmbedded"},
- FunctionInfo{1204, nullptr, "SetButtonConfigEnabled"},
- FunctionInfo{1205, nullptr, "SetButtonConfigEmbeddedEnabled"},
- FunctionInfo{1206, nullptr, "IsButtonConfigEnabled"},
- FunctionInfo{1207, nullptr, "IsButtonConfigEmbeddedEnabled"},
- FunctionInfo{1208, nullptr, "SetButtonConfigEmbedded"},
- FunctionInfo{1209, nullptr, "SetButtonConfigFull"},
- FunctionInfo{1210, nullptr, "SetButtonConfigLeft"},
- FunctionInfo{1211, nullptr, "SetButtonConfigRight"},
- FunctionInfo{1212, nullptr, "GetButtonConfigEmbedded"},
- FunctionInfo{1213, nullptr, "GetButtonConfigFull"},
- FunctionInfo{1214, nullptr, "GetButtonConfigLeft"},
- FunctionInfo{1215, nullptr, "GetButtonConfigRight"},
- FunctionInfo{1250, nullptr, "IsCustomButtonConfigSupported"},
- FunctionInfo{1251, nullptr, "IsDefaultButtonConfigEmbedded"},
- FunctionInfo{1252, nullptr, "IsDefaultButtonConfigFull"},
- FunctionInfo{1253, nullptr, "IsDefaultButtonConfigLeft"},
- FunctionInfo{1254, nullptr, "IsDefaultButtonConfigRight"},
- FunctionInfo{1255, nullptr, "IsButtonConfigStorageEmbeddedEmpty"},
- FunctionInfo{1256, nullptr, "IsButtonConfigStorageFullEmpty"},
- FunctionInfo{1257, nullptr, "IsButtonConfigStorageLeftEmpty"},
- FunctionInfo{1258, nullptr, "IsButtonConfigStorageRightEmpty"},
- FunctionInfo{1259, nullptr, "GetButtonConfigStorageEmbeddedDeprecated"},
- FunctionInfo{1260, nullptr, "GetButtonConfigStorageFullDeprecated"},
- FunctionInfo{1261, nullptr, "GetButtonConfigStorageLeftDeprecated"},
- FunctionInfo{1262, nullptr, "GetButtonConfigStorageRightDeprecated"},
- FunctionInfo{1263, nullptr, "SetButtonConfigStorageEmbeddedDeprecated"},
- FunctionInfo{1264, nullptr, "SetButtonConfigStorageFullDeprecated"},
- FunctionInfo{1265, nullptr, "SetButtonConfigStorageLeftDeprecated"},
- FunctionInfo{1266, nullptr, "SetButtonConfigStorageRightDeprecated"},
- FunctionInfo{1267, nullptr, "DeleteButtonConfigStorageEmbedded"},
- FunctionInfo{1268, nullptr, "DeleteButtonConfigStorageFull"},
- FunctionInfo{1269, nullptr, "DeleteButtonConfigStorageLeft"},
- FunctionInfo{1270, nullptr, "DeleteButtonConfigStorageRight"},
- FunctionInfo{1271, &IHidSystemServer::IsUsingCustomButtonConfig, "IsUsingCustomButtonConfig"},
- FunctionInfo{1272, &IHidSystemServer::IsAnyCustomButtonConfigEnabled, "IsAnyCustomButtonConfigEnabled"},
- FunctionInfo{1273, nullptr, "SetAllCustomButtonConfigEnabled"},
- FunctionInfo{1274, nullptr, "SetDefaultButtonConfig"},
- FunctionInfo{1275, nullptr, "SetAllDefaultButtonConfig"},
- FunctionInfo{1276, nullptr, "SetHidButtonConfigEmbedded"},
- FunctionInfo{1277, nullptr, "SetHidButtonConfigFull"},
- FunctionInfo{1278, nullptr, "SetHidButtonConfigLeft"},
- FunctionInfo{1279, nullptr, "SetHidButtonConfigRight"},
- FunctionInfo{1280, nullptr, "GetHidButtonConfigEmbedded"},
- FunctionInfo{1281, nullptr, "GetHidButtonConfigFull"},
- FunctionInfo{1282, nullptr, "GetHidButtonConfigLeft"},
- FunctionInfo{1283, nullptr, "GetHidButtonConfigRight"},
- FunctionInfo{1284, nullptr, "GetButtonConfigStorageEmbedded"},
- FunctionInfo{1285, nullptr, "GetButtonConfigStorageFull"},
- FunctionInfo{1286, nullptr, "GetButtonConfigStorageLeft"},
- FunctionInfo{1287, nullptr, "GetButtonConfigStorageRight"},
- FunctionInfo{1288, nullptr, "SetButtonConfigStorageEmbedded"},
- FunctionInfo{1289, nullptr, "SetButtonConfigStorageFull"},
- FunctionInfo{1290, nullptr, "DeleteButtonConfigStorageRight"},
- FunctionInfo{1291, nullptr, "DeleteButtonConfigStorageRight"},
- FunctionInfo{1308, nullptr, "SetButtonConfigVisible", MakeVersionGate({18,0,0})},
- FunctionInfo{1309, nullptr, "IsButtonConfigVisible", MakeVersionGate({18,0,0})},
- FunctionInfo{1320, nullptr, "WakeTouchScreenUp", MakeVersionGate({17,0,0})},
- FunctionInfo{1321, nullptr, "PutTouchScreenToSleep", MakeVersionGate({17,0,0})},
- FunctionInfo{1322, nullptr, "AcquireTouchScreenAsyncWakeCompletedEvent", MakeVersionGate({20,0,0})},
- FunctionInfo{1323, nullptr, "StartTouchScreenAutoTuneForSystemSettings", MakeVersionGate({21,0,0})},
- FunctionInfo{1324, nullptr, "AcquireTouchScreenAutoTuneCompletedEvent", MakeVersionGate({21,0,0})},
- FunctionInfo{1325, nullptr, "IsTouchScreenAutoTuneRequiredForRepairProviderReplacement", MakeVersionGate({21,0,0})},
- FunctionInfo{1326, nullptr, "SetTouchScreenOffset", MakeVersionGate({21,0,0})},
- FunctionInfo{1420, nullptr, "GetAppletResourceProperty", MakeVersionGate({19,0,0})},
- FunctionInfo{12010, nullptr, "SetButtonConfigLeft", MakeVersionGate({11,0,0}, {17,0,1})}
- );
-
Kernel::KEvent* acquire_connection_trigger_timeout_event;
Kernel::KEvent* acquire_device_registered_event;
Kernel::KEvent* joy_detach_event;
diff --git a/src/core/hle/service/hid/hidbus.cpp b/src/core/hle/service/hid/hidbus.cpp
index 326cfbf74b..70bb5437e3 100644
--- a/src/core/hle/service/hid/hidbus.cpp
+++ b/src/core/hle/service/hid/hidbus.cpp
@@ -26,28 +26,30 @@ namespace Service::HID {
// (15ms, 66Hz)
constexpr auto hidbus_update_ns = std::chrono::nanoseconds{15 * 1000 * 1000};
-std::optional<ServiceFrameworkBase::FunctionInfoBase> Hidbus::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{1, C<&Hidbus::GetBusHandle>, "GetBusHandle"},
- FunctionInfo{2, C<&Hidbus::IsExternalDeviceConnected>, "IsExternalDeviceConnected"},
- FunctionInfo{3, C<&Hidbus::Initialize>, "Initialize"},
- FunctionInfo{4, C<&Hidbus::Finalize>, "Finalize"},
- FunctionInfo{5, C<&Hidbus::EnableExternalDevice>, "EnableExternalDevice"},
- FunctionInfo{6, C<&Hidbus::GetExternalDeviceId>, "GetExternalDeviceId"},
- FunctionInfo{7, C<&Hidbus::SendCommandAsync>, "SendCommandAsync"},
- FunctionInfo{8, C<&Hidbus::GetSendCommandAsynceResult>, "GetSendCommandAsynceResult"},
- FunctionInfo{9, C<&Hidbus::SetEventForSendCommandAsycResult>, "SetEventForSendCommandAsycResult"},
- FunctionInfo{10, C<&Hidbus::GetSharedMemoryHandle>, "GetSharedMemoryHandle"},
- FunctionInfo{11, C<&Hidbus::EnableJoyPollingReceiveMode>, "EnableJoyPollingReceiveMode"},
- FunctionInfo{12, C<&Hidbus::DisableJoyPollingReceiveMode>, "DisableJoyPollingReceiveMode"},
- FunctionInfo{13, nullptr, "GetPollingData"},
- FunctionInfo{14, C<&Hidbus::SetStatusManagerType>, "SetStatusManagerType"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
Hidbus::Hidbus(Core::System& system_)
: ServiceFramework{system_, "hidbus"}, service_context{system_, service_name} {
+
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {1, C<&Hidbus::GetBusHandle>, "GetBusHandle"},
+ {2, C<&Hidbus::IsExternalDeviceConnected>, "IsExternalDeviceConnected"},
+ {3, C<&Hidbus::Initialize>, "Initialize"},
+ {4, C<&Hidbus::Finalize>, "Finalize"},
+ {5, C<&Hidbus::EnableExternalDevice>, "EnableExternalDevice"},
+ {6, C<&Hidbus::GetExternalDeviceId>, "GetExternalDeviceId"},
+ {7, C<&Hidbus::SendCommandAsync>, "SendCommandAsync"},
+ {8, C<&Hidbus::GetSendCommandAsynceResult>, "GetSendCommandAsynceResult"},
+ {9, C<&Hidbus::SetEventForSendCommandAsycResult>, "SetEventForSendCommandAsycResult"},
+ {10, C<&Hidbus::GetSharedMemoryHandle>, "GetSharedMemoryHandle"},
+ {11, C<&Hidbus::EnableJoyPollingReceiveMode>, "EnableJoyPollingReceiveMode"},
+ {12, C<&Hidbus::DisableJoyPollingReceiveMode>, "DisableJoyPollingReceiveMode"},
+ {13, nullptr, "GetPollingData"},
+ {14, C<&Hidbus::SetStatusManagerType>, "SetStatusManagerType"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+
// Register update callbacks
hidbus_update_event = Core::Timing::CreateEvent(
"Hidbus::UpdateCallback",
diff --git a/src/core/hle/service/hid/hidbus.h b/src/core/hle/service/hid/hidbus.h
index 9ad097150e..19dd894ed3 100644
--- a/src/core/hle/service/hid/hidbus.h
+++ b/src/core/hle/service/hid/hidbus.h
@@ -147,8 +147,6 @@ private:
}
}
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
-
bool is_hidbus_enabled{false};
HidbusStatusManager hidbus_status{};
std::array<HidbusDevice, max_number_of_handles> devices{};
diff --git a/src/core/hle/service/hid/irs.cpp b/src/core/hle/service/hid/irs.cpp
index a17395b596..3d87e6788d 100644
--- a/src/core/hle/service/hid/irs.cpp
+++ b/src/core/hle/service/hid/irs.cpp
@@ -29,32 +29,32 @@
namespace Service::IRS {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IRS::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{302, C<&IRS::ActivateIrsensor>, "ActivateIrsensor"},
- FunctionInfo{303, C<&IRS::DeactivateIrsensor>, "DeactivateIrsensor"},
- FunctionInfo{304, C<&IRS::GetIrsensorSharedMemoryHandle>, "GetIrsensorSharedMemoryHandle"},
- FunctionInfo{305, C<&IRS::StopImageProcessor>, "StopImageProcessor"},
- FunctionInfo{306, C<&IRS::RunMomentProcessor>, "RunMomentProcessor"},
- FunctionInfo{307, C<&IRS::RunClusteringProcessor>, "RunClusteringProcessor"},
- FunctionInfo{308, C<&IRS::RunImageTransferProcessor>, "RunImageTransferProcessor"},
- FunctionInfo{309, C<&IRS::GetImageTransferProcessorState>, "GetImageTransferProcessorState"},
- FunctionInfo{310, C<&IRS::RunTeraPluginProcessor>, "RunTeraPluginProcessor"},
- FunctionInfo{311, C<&IRS::GetNpadIrCameraHandle>, "GetNpadIrCameraHandle"},
- FunctionInfo{312, C<&IRS::RunPointingProcessor>, "RunPointingProcessor"},
- FunctionInfo{313, C<&IRS::SuspendImageProcessor>, "SuspendImageProcessor"},
- FunctionInfo{314, C<&IRS::CheckFirmwareVersion>, "CheckFirmwareVersion"},
- FunctionInfo{315, C<&IRS::SetFunctionLevel>, "SetFunctionLevel"},
- FunctionInfo{316, C<&IRS::RunImageTransferExProcessor>, "RunImageTransferExProcessor"},
- FunctionInfo{317, C<&IRS::RunIrLedProcessor>, "RunIrLedProcessor"},
- FunctionInfo{318, C<&IRS::StopImageProcessorAsync>, "StopImageProcessorAsync"},
- FunctionInfo{319, C<&IRS::ActivateIrsensorWithFunctionLevel>, "ActivateIrsensorWithFunctionLevel"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IRS::IRS(Core::System& system_) : ServiceFramework{system_, "irs"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {302, C<&IRS::ActivateIrsensor>, "ActivateIrsensor"},
+ {303, C<&IRS::DeactivateIrsensor>, "DeactivateIrsensor"},
+ {304, C<&IRS::GetIrsensorSharedMemoryHandle>, "GetIrsensorSharedMemoryHandle"},
+ {305, C<&IRS::StopImageProcessor>, "StopImageProcessor"},
+ {306, C<&IRS::RunMomentProcessor>, "RunMomentProcessor"},
+ {307, C<&IRS::RunClusteringProcessor>, "RunClusteringProcessor"},
+ {308, C<&IRS::RunImageTransferProcessor>, "RunImageTransferProcessor"},
+ {309, C<&IRS::GetImageTransferProcessorState>, "GetImageTransferProcessorState"},
+ {310, C<&IRS::RunTeraPluginProcessor>, "RunTeraPluginProcessor"},
+ {311, C<&IRS::GetNpadIrCameraHandle>, "GetNpadIrCameraHandle"},
+ {312, C<&IRS::RunPointingProcessor>, "RunPointingProcessor"},
+ {313, C<&IRS::SuspendImageProcessor>, "SuspendImageProcessor"},
+ {314, C<&IRS::CheckFirmwareVersion>, "CheckFirmwareVersion"},
+ {315, C<&IRS::SetFunctionLevel>, "SetFunctionLevel"},
+ {316, C<&IRS::RunImageTransferExProcessor>, "RunImageTransferExProcessor"},
+ {317, C<&IRS::RunIrLedProcessor>, "RunIrLedProcessor"},
+ {318, C<&IRS::StopImageProcessorAsync>, "StopImageProcessorAsync"},
+ {319, C<&IRS::ActivateIrsensorWithFunctionLevel>, "ActivateIrsensorWithFunctionLevel"},
+ };
+ // clang-format on
+
u8* raw_shared_memory = system.Kernel().GetIrsSharedMem().GetPointer();
+ RegisterHandlers(functions);
shared_memory = std::construct_at(reinterpret_cast<StatusManager*>(raw_shared_memory));
npad_device = system.HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1);
@@ -369,6 +369,16 @@ Core::IrSensor::DeviceFormat& IRS::GetIrCameraSharedMemoryDeviceEntry(
}
IRS_SYS::IRS_SYS(Core::System& system_) : ServiceFramework{system_, "irs:sys"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {500, nullptr, "SetAppletResourceUserId"},
+ {501, nullptr, "RegisterAppletResourceUserId"},
+ {502, nullptr, "UnregisterAppletResourceUserId"},
+ {503, nullptr, "EnableAppletToGetInput"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IRS_SYS::~IRS_SYS() = default;
diff --git a/src/core/hle/service/hid/irs.h b/src/core/hle/service/hid/irs.h
index be81ea75a9..2ca34b9106 100644
--- a/src/core/hle/service/hid/irs.h
+++ b/src/core/hle/service/hid/irs.h
@@ -157,8 +157,6 @@ private:
return static_cast<T&>(*processors[index]);
}
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
-
Core::HID::EmulatedController* npad_device = nullptr;
StatusManager* shared_memory = nullptr;
std::array<std::unique_ptr<ProcessorBase>, 9> processors{};
@@ -168,16 +166,6 @@ class IRS_SYS final : public ServiceFramework<IRS_SYS> {
public:
explicit IRS_SYS(Core::System& system);
~IRS_SYS() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{500, nullptr, "SetAppletResourceUserId"},
- FunctionInfo{501, nullptr, "RegisterAppletResourceUserId"},
- FunctionInfo{502, nullptr, "UnregisterAppletResourceUserId"},
- FunctionInfo{503, nullptr, "EnableAppletToGetInput"}
- );
};
} // namespace Service::IRS
diff --git a/src/core/hle/service/hid/xcd.cpp b/src/core/hle/service/hid/xcd.cpp
index 6b8ae7048c..2e41cbd3da 100644
--- a/src/core/hle/service/hid/xcd.cpp
+++ b/src/core/hle/service/hid/xcd.cpp
@@ -9,6 +9,33 @@
namespace Service::HID {
XCD_SYS::XCD_SYS(Core::System& system_) : ServiceFramework{system_, "xcd:sys"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetDataFormat"},
+ {1, nullptr, "SetDataFormat"},
+ {2, nullptr, "GetMcuState"},
+ {3, nullptr, "SetMcuState"},
+ {4, nullptr, "GetMcuVersionForNfc"},
+ {5, nullptr, "CheckNfcDevicePower"},
+ {10, nullptr, "SetNfcEvent"},
+ {11, nullptr, "GetNfcInfo"},
+ {12, nullptr, "StartNfcDiscovery"},
+ {13, nullptr, "StopNfcDiscovery"},
+ {14, nullptr, "StartNtagRead"},
+ {15, nullptr, "StartNtagWrite"},
+ {16, nullptr, "SendNfcRawData"},
+ {17, nullptr, "RegisterMifareKey"},
+ {18, nullptr, "ClearMifareKey"},
+ {19, nullptr, "StartMifareRead"},
+ {20, nullptr, "StartMifareWrite"},
+ {101, nullptr, "GetAwakeTriggerReasonForLeftRail"},
+ {102, nullptr, "GetAwakeTriggerReasonForRightRail"},
+ {103, nullptr, "GetAwakeTriggerBatteryLevelTransitionForLeftRail"},
+ {104, nullptr, "GetAwakeTriggerBatteryLevelTransitionForRightRail"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
XCD_SYS::~XCD_SYS() = default;
diff --git a/src/core/hle/service/hid/xcd.h b/src/core/hle/service/hid/xcd.h
index af1dd88ef7..9000110a9a 100644
--- a/src/core/hle/service/hid/xcd.h
+++ b/src/core/hle/service/hid/xcd.h
@@ -18,33 +18,6 @@ class XCD_SYS final : public ServiceFramework<XCD_SYS> {
public:
explicit XCD_SYS(Core::System& system_);
~XCD_SYS() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetDataFormat"},
- FunctionInfo{1, nullptr, "SetDataFormat"},
- FunctionInfo{2, nullptr, "GetMcuState"},
- FunctionInfo{3, nullptr, "SetMcuState"},
- FunctionInfo{4, nullptr, "GetMcuVersionForNfc"},
- FunctionInfo{5, nullptr, "CheckNfcDevicePower"},
- FunctionInfo{10, nullptr, "SetNfcEvent"},
- FunctionInfo{11, nullptr, "GetNfcInfo"},
- FunctionInfo{12, nullptr, "StartNfcDiscovery"},
- FunctionInfo{13, nullptr, "StopNfcDiscovery"},
- FunctionInfo{14, nullptr, "StartNtagRead"},
- FunctionInfo{15, nullptr, "StartNtagWrite"},
- FunctionInfo{16, nullptr, "SendNfcRawData"},
- FunctionInfo{17, nullptr, "RegisterMifareKey"},
- FunctionInfo{18, nullptr, "ClearMifareKey"},
- FunctionInfo{19, nullptr, "StartMifareRead"},
- FunctionInfo{20, nullptr, "StartMifareWrite"},
- FunctionInfo{101, nullptr, "GetAwakeTriggerReasonForLeftRail"},
- FunctionInfo{102, nullptr, "GetAwakeTriggerReasonForRightRail"},
- FunctionInfo{103, nullptr, "GetAwakeTriggerBatteryLevelTransitionForLeftRail"},
- FunctionInfo{104, nullptr, "GetAwakeTriggerBatteryLevelTransitionForRightRail"}
- );
};
} // namespace Service::HID
diff --git a/src/core/hle/service/i2c/i2c.cpp b/src/core/hle/service/i2c/i2c.cpp
index d0a5e29f8c..0b242768c2 100644
--- a/src/core/hle/service/i2c/i2c.cpp
+++ b/src/core/hle/service/i2c/i2c.cpp
@@ -17,26 +17,25 @@ namespace Service::I2C {
class I2CSession final : public ServiceFramework<I2CSession> {
public:
- explicit I2CSession(Core::System& system_) : ServiceFramework{system_, "I2CSession"} {}
+ explicit I2CSession(Core::System& system_)
+ : ServiceFramework{system_, "I2CSession"}
+ {
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "SendOld"},
+ {1, nullptr, "ReceiveOld"},
+ {2, nullptr, "ExecuteCommandListOld"},
+ {10, C<&I2CSession::Send>, "Send"},
+ {11, nullptr, "Receive"},
+ {12, nullptr, "ExecuteCommandList"},
+ {13, nullptr, "SetRetryPolicy"},
+ };
+ RegisterHandlers(functions);
+ }
~I2CSession() override = default;
-
Result Send(InBuffer<BufferAttr_HipcMapAlias> in_data, u32 transaction_option) {
LOG_WARNING(Service, "(stubbed) topt={}", transaction_option);
R_THROW(ResultUnknown);
}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "SendOld"},
- FunctionInfo{1, nullptr, "ReceiveOld"},
- FunctionInfo{2, nullptr, "ExecuteCommandListOld"},
- FunctionInfo{10, C<&I2CSession::Send>, "Send"},
- FunctionInfo{11, nullptr, "Receive"},
- FunctionInfo{12, nullptr, "ExecuteCommandList"},
- FunctionInfo{13, nullptr, "SetRetryPolicy"}
- );
};
enum class I2CDevice : u32 {
@@ -46,9 +45,19 @@ enum class I2CDevice : u32 {
class I2C final : public ServiceFramework<I2C> {
public:
- explicit I2C(Core::System& system_) : ServiceFramework{system_, "i2c"} {}
+ explicit I2C(Core::System& system_)
+ : ServiceFramework{system_, "i2c"}
+ {
+ static const FunctionInfo functions[] = {
+ {0, C<&I2C::OpenSessionForDev>, "OpenSessionForDev"},
+ {1, C<&I2C::OpenSession>, "OpenSession"},
+ {2, C<&I2C::HasDevice>, "HasDevice"},
+ {3, C<&I2C::HasDeviceForDev>, "HasDeviceForDev"},
+ {4, C<&I2C::OpenSession2>, "OpenSession2"},
+ };
+ RegisterHandlers(functions);
+ }
~I2C() override = default;
-
Result OpenSessionForDev(OutInterface<I2CSession> out_session, s32 bus_idx, u32 slave_address, u32 addressing_mode, u32 speed_mode) {
LOG_DEBUG(Service, "(stubbed)");
*out_session = std::make_shared<I2CSession>(system);
@@ -74,17 +83,6 @@ public:
*out_session = std::make_shared<I2CSession>(system);
R_SUCCEED();
}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, C<&I2C::OpenSessionForDev>, "OpenSessionForDev"},
- FunctionInfo{1, C<&I2C::OpenSession>, "OpenSession"},
- FunctionInfo{2, C<&I2C::HasDevice>, "HasDevice"},
- FunctionInfo{3, C<&I2C::HasDeviceForDev>, "HasDeviceForDev"},
- FunctionInfo{4, C<&I2C::OpenSession2>, "OpenSession2"}
- );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/jit/jit.cpp b/src/core/hle/service/jit/jit.cpp
index 9059aaf518..ec3a3a8dcb 100644
--- a/src/core/hle/service/jit/jit.cpp
+++ b/src/core/hle/service/jit/jit.cpp
@@ -37,6 +37,18 @@ public:
, user_ro{std::move(user_ro_)}
, context{process_->GetMemory()}
{
+
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, C<&IJitEnvironment::GenerateCode>, "GenerateCode"},
+ {1, C<&IJitEnvironment::Control>, "Control"},
+ {1000, C<&IJitEnvironment::LoadPlugin>, "LoadPlugin"},
+ {1001, C<&IJitEnvironment::GetCodeAddress>, "GetCodeAddress"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+
// Identity map user code range into sysmodule context
configuration.user_rx_memory.size = user_rx.GetSize();
configuration.user_rx_memory.offset = user_rx.GetAddress();
@@ -47,10 +59,6 @@ public:
configuration.sys_ro_memory = configuration.user_ro_memory;
}
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
-
~IJitEnvironment() {
user_rx.Finalize(system.Kernel());
user_ro.Finalize(system.Kernel());
@@ -240,13 +248,6 @@ private:
return in;
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, C<&IJitEnvironment::GenerateCode>, "GenerateCode"},
- FunctionInfo{1, C<&IJitEnvironment::Control>, "Control"},
- FunctionInfo{1000, C<&IJitEnvironment::LoadPlugin>, "LoadPlugin"},
- FunctionInfo{1001, C<&IJitEnvironment::GetCodeAddress>, "GetCodeAddress"}
- );
-
Kernel::KScopedAutoObject<Kernel::KProcess> process;
CodeMemory user_rx;
CodeMemory user_ro;
@@ -257,10 +258,14 @@ private:
class JITU final : public ServiceFramework<JITU> {
public:
- explicit JITU(Core::System& system_) : ServiceFramework{system_, "jit:u"} {}
+ explicit JITU(Core::System& system_) : ServiceFramework{system_, "jit:u"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, C<&JITU::CreateJitEnvironment>, "CreateJitEnvironment"},
+ };
+ // clang-format on
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
private:
@@ -289,10 +294,6 @@ private:
}
private:
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, C<&JITU::CreateJitEnvironment>, "CreateJitEnvironment"}
- );
-
std::mt19937_64 generate_random{};
};
diff --git a/src/core/hle/service/jit/jit.h b/src/core/hle/service/jit/jit.h
index 19014c75a4..a9ebf146ec 100644
--- a/src/core/hle/service/jit/jit.h
+++ b/src/core/hle/service/jit/jit.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/jit/jit_context.h b/src/core/hle/service/jit/jit_context.h
index f17fc5e244..aa9a2d3589 100644
--- a/src/core/hle/service/jit/jit_context.h
+++ b/src/core/hle/service/jit/jit_context.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/lbl/lbl.cpp b/src/core/hle/service/lbl/lbl.cpp
index 9b245201ff..68a9bff2df 100644
--- a/src/core/hle/service/lbl/lbl.cpp
+++ b/src/core/hle/service/lbl/lbl.cpp
@@ -18,10 +18,43 @@ namespace Service::LBL {
class LBL final : public ServiceFramework<LBL> {
public:
- explicit LBL(Core::System& system_) : ServiceFramework{system_, "lbl"} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit LBL(Core::System& system_) : ServiceFramework{system_, "lbl"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &LBL::SaveCurrentSetting, "SaveCurrentSetting"},
+ {1, &LBL::LoadCurrentSetting, "LoadCurrentSetting"},
+ {2, &LBL::SetCurrentBrightnessSetting, "SetCurrentBrightnessSetting"},
+ {3, &LBL::GetCurrentBrightnessSetting, "GetCurrentBrightnessSetting"},
+ {4, nullptr, "ApplyCurrentBrightnessSettingToBacklight"},
+ {5, nullptr, "GetBrightnessSettingAppliedToBacklight"},
+ {6, &LBL::SwitchBacklightOn, "SwitchBacklightOn"},
+ {7, &LBL::SwitchBacklightOff, "SwitchBacklightOff"},
+ {8, &LBL::GetBacklightSwitchStatus, "GetBacklightSwitchStatus"},
+ {9, &LBL::EnableDimming, "EnableDimming"},
+ {10, &LBL::DisableDimming, "DisableDimming"},
+ {11, &LBL::IsDimmingEnabled, "IsDimmingEnabled"},
+ {12, &LBL::EnableAutoBrightnessControl, "EnableAutoBrightnessControl"},
+ {13, &LBL::DisableAutoBrightnessControl, "DisableAutoBrightnessControl"},
+ {14, &LBL::IsAutoBrightnessControlEnabled, "IsAutoBrightnessControlEnabled"},
+ {15, &LBL::SetAmbientLightSensorValue, "SetAmbientLightSensorValue"},
+ {16, &LBL::GetAmbientLightSensorValue, "GetAmbientLightSensorValue"},
+ {17, &LBL::SetBrightnessReflectionDelayLevel, "SetBrightnessReflectionDelayLevel"},
+ {18, &LBL::GetBrightnessReflectionDelayLevel, "GetBrightnessReflectionDelayLevel"},
+ {19, &LBL::SetCurrentBrightnessMapping, "SetCurrentBrightnessMapping"},
+ {20, &LBL::GetCurrentBrightnessMapping, "GetCurrentBrightnessMapping"},
+ {21, &LBL::SetCurrentAmbientLightSensorMapping, "SetCurrentAmbientLightSensorMapping"},
+ {22, &LBL::GetCurrentAmbientLightSensorMapping, "GetCurrentAmbientLightSensorMapping"},
+ {23, &LBL::IsAmbientLightSensorAvailable, "IsAmbientLightSensorAvailable"},
+ {24, &LBL::SetCurrentBrightnessSettingForVrMode, "SetCurrentBrightnessSettingForVrMode"},
+ {25, &LBL::GetCurrentBrightnessSettingForVrMode, "GetCurrentBrightnessSettingForVrMode"},
+ {26, &LBL::EnableVrMode, "EnableVrMode"},
+ {27, &LBL::DisableVrMode, "DisableVrMode"},
+ {28, &LBL::IsVrModeEnabled, "IsVrModeEnabled"},
+ {29, &LBL::IsAutoBrightnessControlSupported, "IsAutoBrightnessControlSupported"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
private:
@@ -302,38 +335,6 @@ private:
rb.Push<u8>(auto_brightness_supported);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &LBL::SaveCurrentSetting, "SaveCurrentSetting"},
- FunctionInfo{1, &LBL::LoadCurrentSetting, "LoadCurrentSetting"},
- FunctionInfo{2, &LBL::SetCurrentBrightnessSetting, "SetCurrentBrightnessSetting"},
- FunctionInfo{3, &LBL::GetCurrentBrightnessSetting, "GetCurrentBrightnessSetting"},
- FunctionInfo{4, nullptr, "ApplyCurrentBrightnessSettingToBacklight"},
- FunctionInfo{5, nullptr, "GetBrightnessSettingAppliedToBacklight"},
- FunctionInfo{6, &LBL::SwitchBacklightOn, "SwitchBacklightOn"},
- FunctionInfo{7, &LBL::SwitchBacklightOff, "SwitchBacklightOff"},
- FunctionInfo{8, &LBL::GetBacklightSwitchStatus, "GetBacklightSwitchStatus"},
- FunctionInfo{9, &LBL::EnableDimming, "EnableDimming"},
- FunctionInfo{10, &LBL::DisableDimming, "DisableDimming"},
- FunctionInfo{11, &LBL::IsDimmingEnabled, "IsDimmingEnabled"},
- FunctionInfo{12, &LBL::EnableAutoBrightnessControl, "EnableAutoBrightnessControl"},
- FunctionInfo{13, &LBL::DisableAutoBrightnessControl, "DisableAutoBrightnessControl"},
- FunctionInfo{14, &LBL::IsAutoBrightnessControlEnabled, "IsAutoBrightnessControlEnabled"},
- FunctionInfo{15, &LBL::SetAmbientLightSensorValue, "SetAmbientLightSensorValue"},
- FunctionInfo{16, &LBL::GetAmbientLightSensorValue, "GetAmbientLightSensorValue"},
- FunctionInfo{17, &LBL::SetBrightnessReflectionDelayLevel, "SetBrightnessReflectionDelayLevel"},
- FunctionInfo{18, &LBL::GetBrightnessReflectionDelayLevel, "GetBrightnessReflectionDelayLevel"},
- FunctionInfo{19, &LBL::SetCurrentBrightnessMapping, "SetCurrentBrightnessMapping"},
- FunctionInfo{20, &LBL::GetCurrentBrightnessMapping, "GetCurrentBrightnessMapping"},
- FunctionInfo{21, &LBL::SetCurrentAmbientLightSensorMapping, "SetCurrentAmbientLightSensorMapping"},
- FunctionInfo{22, &LBL::GetCurrentAmbientLightSensorMapping, "GetCurrentAmbientLightSensorMapping"},
- FunctionInfo{23, &LBL::IsAmbientLightSensorAvailable, "IsAmbientLightSensorAvailable"},
- FunctionInfo{24, &LBL::SetCurrentBrightnessSettingForVrMode, "SetCurrentBrightnessSettingForVrMode"},
- FunctionInfo{25, &LBL::GetCurrentBrightnessSettingForVrMode, "GetCurrentBrightnessSettingForVrMode"},
- FunctionInfo{26, &LBL::EnableVrMode, "EnableVrMode"},
- FunctionInfo{27, &LBL::DisableVrMode, "DisableVrMode"},
- FunctionInfo{28, &LBL::IsVrModeEnabled, "IsVrModeEnabled"},
- FunctionInfo{29, &LBL::IsAutoBrightnessControlSupported, "IsAutoBrightnessControlSupported"}
- );
bool vr_mode_enabled = false;
float current_brightness = 1.0f;
float ambient_light_value = 0.0f;
diff --git a/src/core/hle/service/lbl/lbl.h b/src/core/hle/service/lbl/lbl.h
index e47759c01c..e2cd1b3980 100644
--- a/src/core/hle/service/lbl/lbl.h
+++ b/src/core/hle/service/lbl/lbl.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/ldn/lan_discovery.cpp b/src/core/hle/service/ldn/lan_discovery.cpp
index f37dbe492f..90adcdcee4 100644
--- a/src/core/hle/service/ldn/lan_discovery.cpp
+++ b/src/core/hle/service/ldn/lan_discovery.cpp
@@ -1,5 +1,6 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/ldn/lan_discovery.h b/src/core/hle/service/ldn/lan_discovery.h
index 5d0642bd0f..f1f3c4bece 100644
--- a/src/core/hle/service/ldn/lan_discovery.h
+++ b/src/core/hle/service/ldn/lan_discovery.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/ldn/ldn.cpp b/src/core/hle/service/ldn/ldn.cpp
index 838fe85f79..1a0165fd2e 100644
--- a/src/core/hle/service/ldn/ldn.cpp
+++ b/src/core/hle/service/ldn/ldn.cpp
@@ -9,6 +9,7 @@
#include "core/hle/service/ldn/ldn.h"
#include "core/hle/service/ldn/monitor_service.h"
#include "core/hle/service/ldn/sf_monitor_service.h"
+#include "core/hle/service/ldn/sf_service.h"
#include "core/hle/service/ldn/sf_service_monitor.h"
#include "core/hle/service/ldn/system_local_communication_service.h"
#include "core/hle/service/ldn/user_local_communication_service.h"
@@ -18,10 +19,14 @@ namespace Service::LDN {
class IClientProcessMonitor final
: public ServiceFramework<IClientProcessMonitor> {
public:
- explicit IClientProcessMonitor(Core::System& system_) : ServiceFramework{system_, "IClientProcessMonitor"} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit IClientProcessMonitor(Core::System& system_)
+ : ServiceFramework{system_, "IClientProcessMonitor"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IClientProcessMonitor::RegisterClient>, "RegisterClient"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
~IClientProcessMonitor() override = default;
private:
@@ -29,19 +34,19 @@ private:
LOG_WARNING(Service_LDN, "(STUBBED) called");
R_SUCCEED();
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IClientProcessMonitor::RegisterClient>, "RegisterClient"}
- );
};
class IMonitorServiceCreator final : public ServiceFramework<IMonitorServiceCreator> {
public:
- explicit IMonitorServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:m"} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit IMonitorServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:m"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, C<&IMonitorServiceCreator::CreateMonitorService>, "CreateMonitorService"}
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
+
private:
Result CreateMonitorService(OutInterface<IMonitorService> out_interface) {
LOG_DEBUG(Service_LDN, "called");
@@ -49,19 +54,21 @@ private:
*out_interface = std::make_shared<IMonitorService>(system);
R_SUCCEED();
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, C<&IMonitorServiceCreator::CreateMonitorService>, "CreateMonitorService"}
- );
};
class ISystemServiceCreator final : public ServiceFramework<ISystemServiceCreator> {
public:
- explicit ISystemServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:s"} {}
+ explicit ISystemServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:s"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, C<&ISystemServiceCreator::CreateSystemLocalCommunicationService>, "CreateSystemLocalCommunicationService"},
+ {1, C<&ISystemServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor"} // 18.0.0+
+ };
+ // clang-format on
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
+
private:
Result CreateSystemLocalCommunicationService(
OutInterface<ISystemLocalCommunicationService> out_interface) {
@@ -78,20 +85,21 @@ private:
*out_interface = std::make_shared<IClientProcessMonitor>(system);
R_SUCCEED();
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, C<&ISystemServiceCreator::CreateSystemLocalCommunicationService>, "CreateSystemLocalCommunicationService"},
- FunctionInfo{1, C<&ISystemServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor", MakeVersionGate({18,0,0})}
- );
};
class IUserServiceCreator final : public ServiceFramework<IUserServiceCreator> {
public:
- explicit IUserServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:u"} {}
+ explicit IUserServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:u"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IUserServiceCreator::CreateUserLocalCommunicationService>, "CreateUserLocalCommunicationService"},
+ {1, D<&IUserServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor"} // 18.0.0+
+ };
+ // clang-format on
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
+
private:
Result CreateUserLocalCommunicationService(
OutInterface<IUserLocalCommunicationService> out_interface) {
@@ -108,50 +116,22 @@ private:
*out_interface = std::make_shared<IClientProcessMonitor>(system);
R_SUCCEED();
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IUserServiceCreator::CreateUserLocalCommunicationService>, "CreateUserLocalCommunicationService"},
- FunctionInfo{1, D<&IUserServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor", MakeVersionGate({18,0,0})}
- );
-};
-
-class ISfService final : public ServiceFramework<ISfService> {
-public:
- explicit ISfService(Core::System& system_) : ServiceFramework{system_, "ISfService"} {}
- ~ISfService() override = default;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "Initialize"},
- FunctionInfo{256, nullptr, "AttachNetworkInterfaceStateChangeEvent"},
- FunctionInfo{264, nullptr, "GetNetworkInterfaceLastError"},
- FunctionInfo{272, nullptr, "GetRole"},
- FunctionInfo{280, nullptr, "GetAdvertiseData"},
- FunctionInfo{288, nullptr, "GetGroupInfo"},
- FunctionInfo{296, nullptr, "GetGroupInfo2"},
- FunctionInfo{304, nullptr, "GetGroupOwner"},
- FunctionInfo{312, nullptr, "GetIpConfig"},
- FunctionInfo{320, nullptr, "GetLinkLevel"},
- FunctionInfo{512, nullptr, "Scan"},
- FunctionInfo{768, nullptr, "CreateGroup"},
- FunctionInfo{776, nullptr, "DestroyGroup"},
- FunctionInfo{784, nullptr, "SetAdvertiseData"},
- FunctionInfo{1536, nullptr, "SendToOtherGroup"},
- FunctionInfo{1544, nullptr, "RecvFromOtherGroup"},
- FunctionInfo{1552, nullptr, "AddAcceptableGroupId"},
- FunctionInfo{1560, nullptr, "ClearAcceptableGroupId"}
- );
};
class ISfServiceCreator final : public ServiceFramework<ISfServiceCreator> {
public:
- explicit ISfServiceCreator(Core::System& system_, bool is_system_, const char* name_) : ServiceFramework{system_, name_}, is_system{is_system_} {}
+ explicit ISfServiceCreator(Core::System& system_, bool is_system_, const char* name_)
+ : ServiceFramework{system_, name_}, is_system{is_system_} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, C<&ISfServiceCreator::CreateNetworkService>, "CreateNetworkService"},
+ {8, C<&ISfServiceCreator::CreateNetworkServiceMonitor>, "CreateNetworkServiceMonitor"},
+ };
+ // clang-format on
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
+
private:
Result CreateNetworkService(OutInterface<ISfService> out_interface, u32 input,
u64 reserved_input) {
@@ -170,20 +150,21 @@ private:
R_SUCCEED();
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, C<&ISfServiceCreator::CreateNetworkService>, "CreateNetworkService"},
- FunctionInfo{8, C<&ISfServiceCreator::CreateNetworkServiceMonitor>, "CreateNetworkServiceMonitor"}
- );
bool is_system{};
};
class ISfMonitorServiceCreator final : public ServiceFramework<ISfMonitorServiceCreator> {
public:
- explicit ISfMonitorServiceCreator(Core::System& system_) : ServiceFramework{system_, "lp2p:m"} {}
+ explicit ISfMonitorServiceCreator(Core::System& system_) : ServiceFramework{system_, "lp2p:m"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, C<&ISfMonitorServiceCreator::CreateMonitorService>, "CreateMonitorService"},
+ };
+ // clang-format on
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
+
private:
Result CreateMonitorService(OutInterface<ISfMonitorService> out_interface, u64 reserved_input) {
LOG_INFO(Service_LDN, "called, reserved_input={}", reserved_input);
@@ -191,10 +172,6 @@ private:
*out_interface = std::make_shared<ISfMonitorService>(system);
R_SUCCEED();
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, C<&ISfMonitorServiceCreator::CreateMonitorService>, "CreateMonitorService"}
- );
};
void LoopProcess(Core::System& system) {
@@ -204,9 +181,12 @@ void LoopProcess(Core::System& system) {
server_manager->RegisterNamedService("ldn:s", std::make_shared<ISystemServiceCreator>(system));
server_manager->RegisterNamedService("ldn:u", std::make_shared<IUserServiceCreator>(system));
- server_manager->RegisterNamedService("lp2p:app", std::make_shared<ISfServiceCreator>(system, false, "lp2p:app"));
- server_manager->RegisterNamedService("lp2p:sys", std::make_shared<ISfServiceCreator>(system, true, "lp2p:sys"));
- server_manager->RegisterNamedService("lp2p:m", std::make_shared<ISfMonitorServiceCreator>(system));
+ server_manager->RegisterNamedService(
+ "lp2p:app", std::make_shared<ISfServiceCreator>(system, false, "lp2p:app"));
+ server_manager->RegisterNamedService(
+ "lp2p:sys", std::make_shared<ISfServiceCreator>(system, true, "lp2p:sys"));
+ server_manager->RegisterNamedService("lp2p:m",
+ std::make_shared<ISfMonitorServiceCreator>(system));
ServerManager::RunServer(std::move(server_manager));
}
diff --git a/src/core/hle/service/ldn/ldn.h b/src/core/hle/service/ldn/ldn.h
index dae037fa8f..76c7f4f439 100644
--- a/src/core/hle/service/ldn/ldn.h
+++ b/src/core/hle/service/ldn/ldn.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/ldn/ldn_results.h b/src/core/hle/service/ldn/ldn_results.h
index f340bda422..cf6c22b54b 100644
--- a/src/core/hle/service/ldn/ldn_results.h
+++ b/src/core/hle/service/ldn/ldn_results.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/core/hle/service/ldn/monitor_service.cpp b/src/core/hle/service/ldn/monitor_service.cpp
index 6a60b0b3d8..6cb7180b15 100644
--- a/src/core/hle/service/ldn/monitor_service.cpp
+++ b/src/core/hle/service/ldn/monitor_service.cpp
@@ -10,22 +10,22 @@
namespace Service::LDN {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IMonitorService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, C<&IMonitorService::GetStateForMonitor>, "GetStateForMonitor"},
- FunctionInfo{1, nullptr, "GetNetworkInfoForMonitor"},
- FunctionInfo{2, nullptr, "GetIpv4AddressForMonitor"},
- FunctionInfo{3, nullptr, "GetDisconnectReasonForMonitor"},
- FunctionInfo{4, nullptr, "GetSecurityParameterForMonitor"},
- FunctionInfo{5, nullptr, "GetNetworkConfigForMonitor"},
- FunctionInfo{100, C<&IMonitorService::InitializeMonitor>, "InitializeMonitor"},
- FunctionInfo{101, C<&IMonitorService::FinalizeMonitor>, "FinalizeMonitor"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IMonitorService::IMonitorService(Core::System& system_)
: ServiceFramework{system_, "IMonitorService"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, C<&IMonitorService::GetStateForMonitor>, "GetStateForMonitor"},
+ {1, nullptr, "GetNetworkInfoForMonitor"},
+ {2, nullptr, "GetIpv4AddressForMonitor"},
+ {3, nullptr, "GetDisconnectReasonForMonitor"},
+ {4, nullptr, "GetSecurityParameterForMonitor"},
+ {5, nullptr, "GetNetworkConfigForMonitor"},
+ {100, C<&IMonitorService::InitializeMonitor>, "InitializeMonitor"},
+ {101, C<&IMonitorService::FinalizeMonitor>, "FinalizeMonitor"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IMonitorService::~IMonitorService() = default;
diff --git a/src/core/hle/service/ldn/monitor_service.h b/src/core/hle/service/ldn/monitor_service.h
index 9c1acd0a1e..2d4a69c311 100644
--- a/src/core/hle/service/ldn/monitor_service.h
+++ b/src/core/hle/service/ldn/monitor_service.h
@@ -26,7 +26,6 @@ private:
Result InitializeMonitor();
Result FinalizeMonitor();
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
State state{State::None};
};
diff --git a/src/core/hle/service/ldn/sf_monitor_service.cpp b/src/core/hle/service/ldn/sf_monitor_service.cpp
index ebe06b2059..5ac663b4c2 100644
--- a/src/core/hle/service/ldn/sf_monitor_service.cpp
+++ b/src/core/hle/service/ldn/sf_monitor_service.cpp
@@ -10,17 +10,17 @@
namespace Service::LDN {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> ISfMonitorService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, C<&ISfMonitorService::Initialize>, "Initialize"},
- FunctionInfo{288, C<&ISfMonitorService::GetGroupInfo>, "GetGroupInfo"},
- FunctionInfo{320, nullptr, "GetLinkLevel"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
ISfMonitorService::ISfMonitorService(Core::System& system_)
: ServiceFramework{system_, "ISfMonitorService"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, C<&ISfMonitorService::Initialize>, "Initialize"},
+ {288, C<&ISfMonitorService::GetGroupInfo>, "GetGroupInfo"},
+ {320, nullptr, "GetLinkLevel"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
ISfMonitorService::~ISfMonitorService() = default;
diff --git a/src/core/hle/service/ldn/sf_monitor_service.h b/src/core/hle/service/ldn/sf_monitor_service.h
index 09ca16727d..a596093f1b 100644
--- a/src/core/hle/service/ldn/sf_monitor_service.h
+++ b/src/core/hle/service/ldn/sf_monitor_service.h
@@ -24,7 +24,6 @@ public:
private:
Result Initialize(Out<u32> out_value);
Result GetGroupInfo(OutLargeData<GroupInfo, BufferAttr_HipcAutoSelect> out_group_info);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::LDN
diff --git a/src/core/hle/service/ldn/sf_service.cpp b/src/core/hle/service/ldn/sf_service.cpp
new file mode 100644
index 0000000000..b77672a1b6
--- /dev/null
+++ b/src/core/hle/service/ldn/sf_service.cpp
@@ -0,0 +1,40 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "core/hle/service/ldn/sf_service.h"
+
+namespace Service::LDN {
+
+ISfService::ISfService(Core::System& system_) : ServiceFramework{system_, "ISfService"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "Initialize"},
+ {256, nullptr, "AttachNetworkInterfaceStateChangeEvent"},
+ {264, nullptr, "GetNetworkInterfaceLastError"},
+ {272, nullptr, "GetRole"},
+ {280, nullptr, "GetAdvertiseData"},
+ {288, nullptr, "GetGroupInfo"},
+ {296, nullptr, "GetGroupInfo2"},
+ {304, nullptr, "GetGroupOwner"},
+ {312, nullptr, "GetIpConfig"},
+ {320, nullptr, "GetLinkLevel"},
+ {512, nullptr, "Scan"},
+ {768, nullptr, "CreateGroup"},
+ {776, nullptr, "DestroyGroup"},
+ {784, nullptr, "SetAdvertiseData"},
+ {1536, nullptr, "SendToOtherGroup"},
+ {1544, nullptr, "RecvFromOtherGroup"},
+ {1552, nullptr, "AddAcceptableGroupId"},
+ {1560, nullptr, "ClearAcceptableGroupId"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
+ISfService::~ISfService() = default;
+
+} // namespace Service::LDN
diff --git a/src/core/hle/service/ldn/sf_service.h b/src/core/hle/service/ldn/sf_service.h
new file mode 100644
index 0000000000..ca7a81cf29
--- /dev/null
+++ b/src/core/hle/service/ldn/sf_service.h
@@ -0,0 +1,24 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/service.h"
+
+namespace Core {
+class System;
+}
+
+namespace Service::LDN {
+
+class ISfService final : public ServiceFramework<ISfService> {
+public:
+ explicit ISfService(Core::System& system_);
+ ~ISfService() override;
+};
+
+} // namespace Service::LDN
diff --git a/src/core/hle/service/ldn/sf_service_monitor.cpp b/src/core/hle/service/ldn/sf_service_monitor.cpp
index 574ba82a0b..95a9bcaf71 100644
--- a/src/core/hle/service/ldn/sf_service_monitor.cpp
+++ b/src/core/hle/service/ldn/sf_service_monitor.cpp
@@ -10,27 +10,27 @@
namespace Service::LDN {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> ISfServiceMonitor::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, C<&ISfServiceMonitor::Initialize>, "Initialize"},
- FunctionInfo{256, nullptr, "AttachNetworkInterfaceStateChangeEvent"},
- FunctionInfo{264, nullptr, "GetNetworkInterfaceLastError"},
- FunctionInfo{272, nullptr, "GetRole"},
- FunctionInfo{280, nullptr, "GetAdvertiseData"},
- FunctionInfo{281, nullptr, "GetAdvertiseData2"},
- FunctionInfo{288, C<&ISfServiceMonitor::GetGroupInfo>, "GetGroupInfo"},
- FunctionInfo{296, nullptr, "GetGroupInfo2"},
- FunctionInfo{304, nullptr, "GetGroupOwner"},
- FunctionInfo{312, nullptr, "GetIpConfig"},
- FunctionInfo{320, nullptr, "GetLinkLevel"},
- FunctionInfo{328, nullptr, "AttachJoinEvent"},
- FunctionInfo{336, nullptr, "GetMembers"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
ISfServiceMonitor::ISfServiceMonitor(Core::System& system_)
: ServiceFramework{system_, "ISfServiceMonitor"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, C<&ISfServiceMonitor::Initialize>, "Initialize"},
+ {256, nullptr, "AttachNetworkInterfaceStateChangeEvent"},
+ {264, nullptr, "GetNetworkInterfaceLastError"},
+ {272, nullptr, "GetRole"},
+ {280, nullptr, "GetAdvertiseData"},
+ {281, nullptr, "GetAdvertiseData2"},
+ {288, C<&ISfServiceMonitor::GetGroupInfo>, "GetGroupInfo"},
+ {296, nullptr, "GetGroupInfo2"},
+ {304, nullptr, "GetGroupOwner"},
+ {312, nullptr, "GetIpConfig"},
+ {320, nullptr, "GetLinkLevel"},
+ {328, nullptr, "AttachJoinEvent"},
+ {336, nullptr, "GetMembers"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
ISfServiceMonitor::~ISfServiceMonitor() = default;
diff --git a/src/core/hle/service/ldn/sf_service_monitor.h b/src/core/hle/service/ldn/sf_service_monitor.h
index 5e5e64ae6c..87854b868d 100644
--- a/src/core/hle/service/ldn/sf_service_monitor.h
+++ b/src/core/hle/service/ldn/sf_service_monitor.h
@@ -23,8 +23,8 @@ public:
private:
Result Initialize(Out<u32> out_value);
- Result GetGroupInfo(OutLargeData<GroupInfo, BufferAttr_HipcAutoSelect> out_group_info, GroupInfo in_group_info);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
+ Result GetGroupInfo(OutLargeData<GroupInfo, BufferAttr_HipcAutoSelect> out_group_info,
+ GroupInfo in_group_info);
};
} // namespace Service::LDN
diff --git a/src/core/hle/service/ldn/system_local_communication_service.cpp b/src/core/hle/service/ldn/system_local_communication_service.cpp
index 9d3d49aac4..57a1c6a6c2 100644
--- a/src/core/hle/service/ldn/system_local_communication_service.cpp
+++ b/src/core/hle/service/ldn/system_local_communication_service.cpp
@@ -9,44 +9,44 @@
namespace Service::LDN {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> ISystemLocalCommunicationService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetState"},
- FunctionInfo{1, nullptr, "GetNetworkInfo"},
- FunctionInfo{2, nullptr, "GetIpv4Address"},
- FunctionInfo{3, nullptr, "GetDisconnectReason"},
- FunctionInfo{4, nullptr, "GetSecurityParameter"},
- FunctionInfo{5, nullptr, "GetNetworkConfig"},
- FunctionInfo{100, nullptr, "AttachStateChangeEvent"},
- FunctionInfo{101, nullptr, "GetNetworkInfoLatestUpdate"},
- FunctionInfo{102, nullptr, "Scan"},
- FunctionInfo{103, nullptr, "ScanPrivate"},
- FunctionInfo{104, nullptr, "SetWirelessControllerRestriction"},
- FunctionInfo{200, nullptr, "OpenAccessPoint"},
- FunctionInfo{201, nullptr, "CloseAccessPoint"},
- FunctionInfo{202, nullptr, "CreateNetwork"},
- FunctionInfo{203, nullptr, "CreateNetworkPrivate"},
- FunctionInfo{204, nullptr, "DestroyNetwork"},
- FunctionInfo{205, nullptr, "Reject"},
- FunctionInfo{206, nullptr, "SetAdvertiseData"},
- FunctionInfo{207, nullptr, "SetStationAcceptPolicy"},
- FunctionInfo{208, nullptr, "AddAcceptFilterEntry"},
- FunctionInfo{209, nullptr, "ClearAcceptFilter"},
- FunctionInfo{300, nullptr, "OpenStation"},
- FunctionInfo{301, nullptr, "CloseStation"},
- FunctionInfo{302, nullptr, "Connect"},
- FunctionInfo{303, nullptr, "ConnectPrivate"},
- FunctionInfo{304, nullptr, "Disconnect"},
- FunctionInfo{400, nullptr, "InitializeSystem"},
- FunctionInfo{401, nullptr, "FinalizeSystem"},
- FunctionInfo{402, nullptr, "SetOperationMode"},
- FunctionInfo{403, C<&ISystemLocalCommunicationService::InitializeSystem2>, "InitializeSystem2"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
ISystemLocalCommunicationService::ISystemLocalCommunicationService(Core::System& system_)
: ServiceFramework{system_, "ISystemLocalCommunicationService"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetState"},
+ {1, nullptr, "GetNetworkInfo"},
+ {2, nullptr, "GetIpv4Address"},
+ {3, nullptr, "GetDisconnectReason"},
+ {4, nullptr, "GetSecurityParameter"},
+ {5, nullptr, "GetNetworkConfig"},
+ {100, nullptr, "AttachStateChangeEvent"},
+ {101, nullptr, "GetNetworkInfoLatestUpdate"},
+ {102, nullptr, "Scan"},
+ {103, nullptr, "ScanPrivate"},
+ {104, nullptr, "SetWirelessControllerRestriction"},
+ {200, nullptr, "OpenAccessPoint"},
+ {201, nullptr, "CloseAccessPoint"},
+ {202, nullptr, "CreateNetwork"},
+ {203, nullptr, "CreateNetworkPrivate"},
+ {204, nullptr, "DestroyNetwork"},
+ {205, nullptr, "Reject"},
+ {206, nullptr, "SetAdvertiseData"},
+ {207, nullptr, "SetStationAcceptPolicy"},
+ {208, nullptr, "AddAcceptFilterEntry"},
+ {209, nullptr, "ClearAcceptFilter"},
+ {300, nullptr, "OpenStation"},
+ {301, nullptr, "CloseStation"},
+ {302, nullptr, "Connect"},
+ {303, nullptr, "ConnectPrivate"},
+ {304, nullptr, "Disconnect"},
+ {400, nullptr, "InitializeSystem"},
+ {401, nullptr, "FinalizeSystem"},
+ {402, nullptr, "SetOperationMode"},
+ {403, C<&ISystemLocalCommunicationService::InitializeSystem2>, "InitializeSystem2"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
ISystemLocalCommunicationService::~ISystemLocalCommunicationService() = default;
diff --git a/src/core/hle/service/ldn/system_local_communication_service.h b/src/core/hle/service/ldn/system_local_communication_service.h
index c7e937e3a2..fa0e45bde4 100644
--- a/src/core/hle/service/ldn/system_local_communication_service.h
+++ b/src/core/hle/service/ldn/system_local_communication_service.h
@@ -23,7 +23,6 @@ public:
private:
Result InitializeSystem2();
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::LDN
diff --git a/src/core/hle/service/ldn/user_local_communication_service.cpp b/src/core/hle/service/ldn/user_local_communication_service.cpp
index 26a742bf0b..7011bd52f2 100644
--- a/src/core/hle/service/ldn/user_local_communication_service.cpp
+++ b/src/core/hle/service/ldn/user_local_communication_service.cpp
@@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -21,46 +22,46 @@
namespace Service::LDN {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IUserLocalCommunicationService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IUserLocalCommunicationService::GetState>, "GetState"},
- FunctionInfo{1, D<&IUserLocalCommunicationService::GetNetworkInfo>, "GetNetworkInfo"},
- FunctionInfo{2, D<&IUserLocalCommunicationService::GetIpv4Address>, "GetIpv4Address"},
- FunctionInfo{3, D<&IUserLocalCommunicationService::GetDisconnectReason>, "GetDisconnectReason"},
- FunctionInfo{4, D<&IUserLocalCommunicationService::GetSecurityParameter>, "GetSecurityParameter"},
- FunctionInfo{5, D<&IUserLocalCommunicationService::GetNetworkConfig>, "GetNetworkConfig"},
- FunctionInfo{100, D<&IUserLocalCommunicationService::AttachStateChangeEvent>, "AttachStateChangeEvent"},
- FunctionInfo{101, D<&IUserLocalCommunicationService::GetNetworkInfoLatestUpdate>, "GetNetworkInfoLatestUpdate"},
- FunctionInfo{102, D<&IUserLocalCommunicationService::Scan>, "Scan"},
- FunctionInfo{103, D<&IUserLocalCommunicationService::ScanPrivate>, "ScanPrivate"},
- FunctionInfo{104, D<&IUserLocalCommunicationService::SetWirelessControllerRestriction>, "SetWirelessControllerRestriction"},
- FunctionInfo{106, D<&IUserLocalCommunicationService::SetProtocol>, "SetProtocol" },
- FunctionInfo{200, D<&IUserLocalCommunicationService::OpenAccessPoint>, "OpenAccessPoint"},
- FunctionInfo{201, D<&IUserLocalCommunicationService::CloseAccessPoint>, "CloseAccessPoint"},
- FunctionInfo{202, D<&IUserLocalCommunicationService::CreateNetwork>, "CreateNetwork"},
- FunctionInfo{203, D<&IUserLocalCommunicationService::CreateNetworkPrivate>, "CreateNetworkPrivate"},
- FunctionInfo{204, D<&IUserLocalCommunicationService::DestroyNetwork>, "DestroyNetwork"},
- FunctionInfo{205, nullptr, "Reject"},
- FunctionInfo{206, D<&IUserLocalCommunicationService::SetAdvertiseData>, "SetAdvertiseData"},
- FunctionInfo{207, D<&IUserLocalCommunicationService::SetStationAcceptPolicy>, "SetStationAcceptPolicy"},
- FunctionInfo{208, D<&IUserLocalCommunicationService::AddAcceptFilterEntry>, "AddAcceptFilterEntry"},
- FunctionInfo{209, nullptr, "ClearAcceptFilter"},
- FunctionInfo{300, D<&IUserLocalCommunicationService::OpenStation>, "OpenStation"},
- FunctionInfo{301, D<&IUserLocalCommunicationService::CloseStation>, "CloseStation"},
- FunctionInfo{302, D<&IUserLocalCommunicationService::Connect>, "Connect"},
- FunctionInfo{303, nullptr, "ConnectPrivate"},
- FunctionInfo{304, D<&IUserLocalCommunicationService::Disconnect>, "Disconnect"},
- FunctionInfo{400, D<&IUserLocalCommunicationService::Initialize>, "Initialize"},
- FunctionInfo{401, D<&IUserLocalCommunicationService::Finalize>, "Finalize"},
- FunctionInfo{402, D<&IUserLocalCommunicationService::Initialize2>, "Initialize2"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IUserLocalCommunicationService::IUserLocalCommunicationService(Core::System& system_)
: ServiceFramework{system_, "IUserLocalCommunicationService"},
service_context{system, "IUserLocalCommunicationService"},
lan_discovery{} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IUserLocalCommunicationService::GetState>, "GetState"},
+ {1, D<&IUserLocalCommunicationService::GetNetworkInfo>, "GetNetworkInfo"},
+ {2, D<&IUserLocalCommunicationService::GetIpv4Address>, "GetIpv4Address"},
+ {3, D<&IUserLocalCommunicationService::GetDisconnectReason>, "GetDisconnectReason"},
+ {4, D<&IUserLocalCommunicationService::GetSecurityParameter>, "GetSecurityParameter"},
+ {5, D<&IUserLocalCommunicationService::GetNetworkConfig>, "GetNetworkConfig"},
+ {100, D<&IUserLocalCommunicationService::AttachStateChangeEvent>, "AttachStateChangeEvent"},
+ {101, D<&IUserLocalCommunicationService::GetNetworkInfoLatestUpdate>, "GetNetworkInfoLatestUpdate"},
+ {102, D<&IUserLocalCommunicationService::Scan>, "Scan"},
+ {103, D<&IUserLocalCommunicationService::ScanPrivate>, "ScanPrivate"},
+ {104, D<&IUserLocalCommunicationService::SetWirelessControllerRestriction>, "SetWirelessControllerRestriction"},
+ { 106, D<&IUserLocalCommunicationService::SetProtocol>, "SetProtocol" },
+ {200, D<&IUserLocalCommunicationService::OpenAccessPoint>, "OpenAccessPoint"},
+ {201, D<&IUserLocalCommunicationService::CloseAccessPoint>, "CloseAccessPoint"},
+ {202, D<&IUserLocalCommunicationService::CreateNetwork>, "CreateNetwork"},
+ {203, D<&IUserLocalCommunicationService::CreateNetworkPrivate>, "CreateNetworkPrivate"},
+ {204, D<&IUserLocalCommunicationService::DestroyNetwork>, "DestroyNetwork"},
+ {205, nullptr, "Reject"},
+ {206, D<&IUserLocalCommunicationService::SetAdvertiseData>, "SetAdvertiseData"},
+ {207, D<&IUserLocalCommunicationService::SetStationAcceptPolicy>, "SetStationAcceptPolicy"},
+ {208, D<&IUserLocalCommunicationService::AddAcceptFilterEntry>, "AddAcceptFilterEntry"},
+ {209, nullptr, "ClearAcceptFilter"},
+ {300, D<&IUserLocalCommunicationService::OpenStation>, "OpenStation"},
+ {301, D<&IUserLocalCommunicationService::CloseStation>, "CloseStation"},
+ {302, D<&IUserLocalCommunicationService::Connect>, "Connect"},
+ {303, nullptr, "ConnectPrivate"},
+ {304, D<&IUserLocalCommunicationService::Disconnect>, "Disconnect"},
+ {400, D<&IUserLocalCommunicationService::Initialize>, "Initialize"},
+ {401, D<&IUserLocalCommunicationService::Finalize>, "Finalize"},
+ {402, D<&IUserLocalCommunicationService::Initialize2>, "Initialize2"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
state_change_event =
service_context.CreateEvent("IUserLocalCommunicationService:StateChangeEvent");
diff --git a/src/core/hle/service/ldn/user_local_communication_service.h b/src/core/hle/service/ldn/user_local_communication_service.h
index 6f832b7a23..720d5e9bf4 100644
--- a/src/core/hle/service/ldn/user_local_communication_service.h
+++ b/src/core/hle/service/ldn/user_local_communication_service.h
@@ -1,7 +1,7 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
@@ -89,7 +89,6 @@ private:
/// Callback to parse and handle a received LDN packet.
void OnLDNPacketReceived(const Network::LDNPacket& packet);
void OnEventFired();
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
KernelHelpers::ServiceContext service_context;
Kernel::KEvent* state_change_event;
diff --git a/src/core/hle/service/ldr/ldr.cpp b/src/core/hle/service/ldr/ldr.cpp
index 25ecc58fa4..db4d51b49d 100644
--- a/src/core/hle/service/ldr/ldr.cpp
+++ b/src/core/hle/service/ldr/ldr.cpp
@@ -12,44 +12,47 @@ namespace Service::LDR {
class DebugMonitor final : public ServiceFramework<DebugMonitor> {
public:
- explicit DebugMonitor(Core::System& system_) : ServiceFramework{system_, "ldr:dmnt"} {}
+ explicit DebugMonitor(Core::System& system_) : ServiceFramework{system_, "ldr:dmnt"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "SetProgramArgument"},
+ {1, nullptr, "FlushArguments"},
+ {2, nullptr, "GetProcessModuleInfo"},
+ };
+ // clang-format on
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "SetProgramArgument"},
- FunctionInfo{1, nullptr, "FlushArguments"},
- FunctionInfo{2, nullptr, "GetProcessModuleInfo"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
};
class ProcessManager final : public ServiceFramework<ProcessManager> {
public:
- explicit ProcessManager(Core::System& system_) : ServiceFramework{system_, "ldr:pm"} {}
+ explicit ProcessManager(Core::System& system_) : ServiceFramework{system_, "ldr:pm"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "CreateProcess"},
+ {1, nullptr, "GetProgramInfo"},
+ {2, nullptr, "PinProgram"},
+ {3, nullptr, "UnpinProgram"},
+ {4, nullptr, "SetEnabledProgramVerification"},
+ };
+ // clang-format on
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "CreateProcess"},
- FunctionInfo{1, nullptr, "GetProgramInfo"},
- FunctionInfo{2, nullptr, "PinProgram"},
- FunctionInfo{3, nullptr, "UnpinProgram"},
- FunctionInfo{4, nullptr, "SetEnabledProgramVerification"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
};
class Shell final : public ServiceFramework<Shell> {
public:
- explicit Shell(Core::System& system_) : ServiceFramework{system_, "ldr:shel"} {}
+ explicit Shell(Core::System& system_) : ServiceFramework{system_, "ldr:shel"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "SetProgramArgument"},
+ {1, nullptr, "FlushArguments"},
+ };
+ // clang-format on
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "SetProgramArgument"},
- FunctionInfo{1, nullptr, "FlushArguments"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
};
diff --git a/src/core/hle/service/ldr/ldr.h b/src/core/hle/service/ldr/ldr.h
index c9281dbfb2..12a6b1f507 100644
--- a/src/core/hle/service/ldr/ldr.h
+++ b/src/core/hle/service/ldr/ldr.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/lm/lm.cpp b/src/core/hle/service/lm/lm.cpp
index be8cdf9aa9..d631a6dd80 100644
--- a/src/core/hle/service/lm/lm.cpp
+++ b/src/core/hle/service/lm/lm.cpp
@@ -87,7 +87,16 @@ DECLARE_ENUM_FLAG_OPERATORS(LogPacketFlags);
class ILogger final : public ServiceFramework<ILogger> {
public:
- explicit ILogger(Core::System& system_) : ServiceFramework{system_, "ILogger"} {}
+ explicit ILogger(Core::System& system_) : ServiceFramework{system_, "ILogger"} {
+ static const FunctionInfo functions[] = {
+ {0, &ILogger::Log, "Log"},
+ {1, &ILogger::SetDestination, "SetDestination"},
+ {2, nullptr, "TransmitHashedLog"}, //20.0.0+
+ {3, nullptr, "DevNotify"}, //20.0.0+
+ };
+ RegisterHandlers(functions);
+ }
+
private:
void Log(HLERequestContext& ctx) {
std::size_t offset{};
@@ -322,25 +331,20 @@ private:
};
static_assert(sizeof(LogPacketHeader) == 0x18, "LogPacketHeader is an invalid size");
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &ILogger::Log, "Log"},
- FunctionInfo{1, &ILogger::SetDestination, "SetDestination"},
- FunctionInfo{2, nullptr, "TransmitHashedLog", MakeVersionGate({20,0,0})},
- FunctionInfo{3, nullptr, "DevNotify", MakeVersionGate({20,0,0})}
- );
::Common::unordered_map<LogPacketHeaderEntry, std::vector<u8>> entries{};
LogDestination destination{LogDestination::All};
};
class LM final : public ServiceFramework<LM> {
public:
- explicit LM(Core::System& system_) : ServiceFramework{system_, "lm"} {}
+ explicit LM(Core::System& system_) : ServiceFramework{system_, "lm"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &LM::OpenLogger, "OpenLogger"},
+ };
+ // clang-format on
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
private:
@@ -351,26 +355,21 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<ILogger>(ctx, system);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &LM::OpenLogger, "OpenLogger"}
- );
};
class LM_GET final : public ServiceFramework<LM_GET> {
public:
- explicit LM_GET(Core::System& system_) : ServiceFramework{system_, "lm:get"} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit LM_GET(Core::System& system_)
+ : ServiceFramework{system_, "lm:get"}
+ {
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "StartLogging"},
+ {1, nullptr, "StopLogging"},
+ {2, nullptr, "GetLog"},
+ {100, nullptr, "CreateDevNotificationReceiver"},
+ };
+ RegisterHandlers(functions);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "StartLogging"},
- FunctionInfo{1, nullptr, "StopLogging"},
- FunctionInfo{2, nullptr, "GetLog"},
- FunctionInfo{100, nullptr, "CreateDevNotificationReceiver"}
- );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/lm/lm.h b/src/core/hle/service/lm/lm.h
index 0d7c39cbc3..890344f44a 100644
--- a/src/core/hle/service/lm/lm.h
+++ b/src/core/hle/service/lm/lm.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/mig/mig.cpp b/src/core/hle/service/mig/mig.cpp
index 2560050622..7412674417 100644
--- a/src/core/hle/service/mig/mig.cpp
+++ b/src/core/hle/service/mig/mig.cpp
@@ -14,50 +14,50 @@ namespace Service::Migration {
class MIG_USR final : public ServiceFramework<MIG_USR> {
public:
- explicit MIG_USR(Core::System& system_) : ServiceFramework{system_, "mig:usr"} {}
+ explicit MIG_USR(Core::System& system_) : ServiceFramework{system_, "mig:usr"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "Unknown0"}, //19.0.0+
+ {1, nullptr, "Unknown1"}, //20.0.0+
+ {2, nullptr, "Unknown2"}, //20.0.0+
+ {10, nullptr, "TryGetLastMigrationInfo"},
+ {11, nullptr, "Unknown11"}, //20.0.0+
+ {100, nullptr, "CreateUserMigrationServer"}, //7.0.0+
+ {101, nullptr, "ResumeUserMigrationServer"}, //7.0.0+
+ {200, nullptr, "CreateUserMigrationClient"}, //7.0.0+
+ {201, nullptr, "ResumeUserMigrationClient"}, //7.0.0+
+ {1001, nullptr, "GetSaveDataMigrationPolicyInfoAsync"}, //8.0.0-20.5.0
+ {1010, nullptr, "TryGetLastSaveDataMigrationInfo"}, //7.0.0+
+ {1100, nullptr, "CreateSaveDataMigrationServer"}, //7.0.0-19.0.1
+ {1101, nullptr, "ResumeSaveDataMigrationServer"}, //7.0.0+
+ {1110, nullptr, "Unknown1101"}, //17.0.0+
+ {1200, nullptr, "CreateSaveDataMigrationClient"}, //7.0.0+
+ {1201, nullptr, "ResumeSaveDataMigrationClient"}, //7.0.0+
+ {2001, nullptr, "Unknown2001"}, //20.0.0+
+ {2010, nullptr, "Unknown2010"}, //20.0.0+
+ {2100, nullptr, "Unknown2100"}, //20.0.0+
+ {2110, nullptr, "Unknown2110"}, //20.0.0+
+ {2200, nullptr, "Unknown2200"}, //20.0.0+
+ {2210, nullptr, "Unknown2210"}, //20.0.0+
+ {2220, nullptr, "Unknown2220"}, //20.0.0+
+ {2230, nullptr, "Unknown2230"}, //20.0.0+
+ {2231, nullptr, "Unknown2231"}, //20.0.0+
+ {2232, nullptr, "Unknown2232"}, //20.0.0+
+ {2233, nullptr, "Unknown2233"}, //20.0.0+
+ {2234, nullptr, "Unknown2234"}, //20.0.0+
+ {2250, nullptr, "Unknown2250"}, //20.0.0+
+ {2260, nullptr, "Unknown2260"}, //20.0.0+
+ {2270, nullptr, "Unknown2270"}, //20.0.0+
+ {2280, nullptr, "Unknown2280"}, //20.0.0+
+ {2300, nullptr, "Unknown2300"}, //20.0.0+
+ {2310, nullptr, "Unknown2310"}, //20.0.0+
+ {2400, nullptr, "Unknown2400"}, //20.0.0+
+ {2420, nullptr, "Unknown2420"}, //20.0.0+
+ };
+ // clang-format on
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "Unknown0", MakeVersionGate({19,0,0})},
- FunctionInfo{1, nullptr, "Unknown1", MakeVersionGate({20,0,0})},
- FunctionInfo{2, nullptr, "Unknown2", MakeVersionGate({20,0,0})},
- FunctionInfo{10, nullptr, "TryGetLastMigrationInfo"},
- FunctionInfo{11, nullptr, "Unknown11", MakeVersionGate({20,0,0})},
- FunctionInfo{100, nullptr, "CreateUserMigrationServer", MakeVersionGate({7,0,0})},
- FunctionInfo{101, nullptr, "ResumeUserMigrationServer", MakeVersionGate({7,0,0})},
- FunctionInfo{200, nullptr, "CreateUserMigrationClient", MakeVersionGate({7,0,0})},
- FunctionInfo{201, nullptr, "ResumeUserMigrationClient", MakeVersionGate({7,0,0})},
- FunctionInfo{1001, nullptr, "GetSaveDataMigrationPolicyInfoAsync", MakeVersionGate({8,0,0}, {20,5,0})},
- FunctionInfo{1010, nullptr, "TryGetLastSaveDataMigrationInfo", MakeVersionGate({7,0,0})},
- FunctionInfo{1100, nullptr, "CreateSaveDataMigrationServer", MakeVersionGate({7,0,0}, {19,0,1})},
- FunctionInfo{1101, nullptr, "ResumeSaveDataMigrationServer", MakeVersionGate({7,0,0})},
- FunctionInfo{1110, nullptr, "Unknown1101", MakeVersionGate({17,0,0})},
- FunctionInfo{1200, nullptr, "CreateSaveDataMigrationClient", MakeVersionGate({7,0,0})},
- FunctionInfo{1201, nullptr, "ResumeSaveDataMigrationClient", MakeVersionGate({7,0,0})},
- FunctionInfo{2001, nullptr, "Unknown2001", MakeVersionGate({20,0,0})},
- FunctionInfo{2010, nullptr, "Unknown2010", MakeVersionGate({20,0,0})},
- FunctionInfo{2100, nullptr, "Unknown2100", MakeVersionGate({20,0,0})},
- FunctionInfo{2110, nullptr, "Unknown2110", MakeVersionGate({20,0,0})},
- FunctionInfo{2200, nullptr, "Unknown2200", MakeVersionGate({20,0,0})},
- FunctionInfo{2210, nullptr, "Unknown2210", MakeVersionGate({20,0,0})},
- FunctionInfo{2220, nullptr, "Unknown2220", MakeVersionGate({20,0,0})},
- FunctionInfo{2230, nullptr, "Unknown2230", MakeVersionGate({20,0,0})},
- FunctionInfo{2231, nullptr, "Unknown2231", MakeVersionGate({20,0,0})},
- FunctionInfo{2232, nullptr, "Unknown2232", MakeVersionGate({20,0,0})},
- FunctionInfo{2233, nullptr, "Unknown2233", MakeVersionGate({20,0,0})},
- FunctionInfo{2234, nullptr, "Unknown2234", MakeVersionGate({20,0,0})},
- FunctionInfo{2250, nullptr, "Unknown2250", MakeVersionGate({20,0,0})},
- FunctionInfo{2260, nullptr, "Unknown2260", MakeVersionGate({20,0,0})},
- FunctionInfo{2270, nullptr, "Unknown2270", MakeVersionGate({20,0,0})},
- FunctionInfo{2280, nullptr, "Unknown2280", MakeVersionGate({20,0,0})},
- FunctionInfo{2300, nullptr, "Unknown2300", MakeVersionGate({20,0,0})},
- FunctionInfo{2310, nullptr, "Unknown2310", MakeVersionGate({20,0,0})},
- FunctionInfo{2400, nullptr, "Unknown2400", MakeVersionGate({20,0,0})},
- FunctionInfo{2420, nullptr, "Unknown2420", MakeVersionGate({20,0,0})}
- );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/mig/mig.h b/src/core/hle/service/mig/mig.h
index c8ed732a5b..39e92a59eb 100644
--- a/src/core/hle/service/mig/mig.h
+++ b/src/core/hle/service/mig/mig.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/mii/mii.cpp b/src/core/hle/service/mii/mii.cpp
index 642a9e4907..513bb671f8 100644
--- a/src/core/hle/service/mii/mii.cpp
+++ b/src/core/hle/service/mii/mii.cpp
@@ -22,27 +22,51 @@
namespace Service::Mii {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IStaticService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IStaticService::GetDatabaseService>, "GetDatabaseService"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
class IDatabaseService final : public ServiceFramework<IDatabaseService> {
public:
- explicit IDatabaseService(Core::System& system_, std::shared_ptr<MiiManager> mii_manager, bool is_system_)
- : ServiceFramework{system_, "IDatabaseService"}
- , manager{mii_manager}
- , is_system{is_system_} {
- m_set_sys = system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true);
+ explicit IDatabaseService(Core::System& system_, std::shared_ptr<MiiManager> mii_manager,
+ bool is_system_)
+ : ServiceFramework{system_, "IDatabaseService"}, manager{mii_manager}, is_system{
+ is_system_} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IDatabaseService::IsUpdated>, "IsUpdated"},
+ {1, D<&IDatabaseService::IsFullDatabase>, "IsFullDatabase"},
+ {2, D<&IDatabaseService::GetCount>, "GetCount"},
+ {3, D<&IDatabaseService::Get>, "Get"},
+ {4, D<&IDatabaseService::Get1>, "Get1"},
+ {5, D<&IDatabaseService::UpdateLatest>, "UpdateLatest"},
+ {6, D<&IDatabaseService::BuildRandom>, "BuildRandom"},
+ {7, D<&IDatabaseService::BuildDefault>, "BuildDefault"},
+ {8, D<&IDatabaseService::Get2>, "Get2"},
+ {9, D<&IDatabaseService::Get3>, "Get3"},
+ {10, D<&IDatabaseService::UpdateLatest1>, "UpdateLatest1"},
+ {11, D<&IDatabaseService::FindIndex>, "FindIndex"},
+ {12, D<&IDatabaseService::Move>, "Move"},
+ {13, D<&IDatabaseService::AddOrReplace>, "AddOrReplace"},
+ {14, D<&IDatabaseService::Delete>, "Delete"},
+ {15, D<&IDatabaseService::DestroyFile>, "DestroyFile"},
+ {16, D<&IDatabaseService::DeleteFile>, "DeleteFile"},
+ {17, D<&IDatabaseService::Format>, "Format"},
+ {18, nullptr, "Import"},
+ {19, nullptr, "Export"},
+ {20, D<&IDatabaseService::IsBrokenDatabaseWithClearFlag>, "IsBrokenDatabaseWithClearFlag"},
+ {21, D<&IDatabaseService::GetIndex>, "GetIndex"},
+ {22, D<&IDatabaseService::SetInterfaceVersion>, "SetInterfaceVersion"},
+ {23, D<&IDatabaseService::Convert>, "Convert"},
+ {24, D<&IDatabaseService::ConvertCoreDataToCharInfo>, "ConvertCoreDataToCharInfo"},
+ {25, D<&IDatabaseService::ConvertCharInfoToCoreData>, "ConvertCharInfoToCoreData"},
+ {26, D<&IDatabaseService::Append>, "Append"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+
+ m_set_sys = system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>(
+ "set:sys", true);
manager->Initialize(metadata);
}
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
-
private:
Result IsUpdated(Out<bool> out_is_updated, SourceFlag source_flag) {
LOG_DEBUG(Service_Mii, "called with source_flag={}", source_flag);
@@ -264,45 +288,23 @@ private:
R_RETURN(manager->Append(metadata, char_info));
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IDatabaseService::IsUpdated>, "IsUpdated"},
- FunctionInfo{1, D<&IDatabaseService::IsFullDatabase>, "IsFullDatabase"},
- FunctionInfo{2, D<&IDatabaseService::GetCount>, "GetCount"},
- FunctionInfo{3, D<&IDatabaseService::Get>, "Get"},
- FunctionInfo{4, D<&IDatabaseService::Get1>, "Get1"},
- FunctionInfo{5, D<&IDatabaseService::UpdateLatest>, "UpdateLatest"},
- FunctionInfo{6, D<&IDatabaseService::BuildRandom>, "BuildRandom"},
- FunctionInfo{7, D<&IDatabaseService::BuildDefault>, "BuildDefault"},
- FunctionInfo{8, D<&IDatabaseService::Get2>, "Get2"},
- FunctionInfo{9, D<&IDatabaseService::Get3>, "Get3"},
- FunctionInfo{10, D<&IDatabaseService::UpdateLatest1>, "UpdateLatest1"},
- FunctionInfo{11, D<&IDatabaseService::FindIndex>, "FindIndex"},
- FunctionInfo{12, D<&IDatabaseService::Move>, "Move"},
- FunctionInfo{13, D<&IDatabaseService::AddOrReplace>, "AddOrReplace"},
- FunctionInfo{14, D<&IDatabaseService::Delete>, "Delete"},
- FunctionInfo{15, D<&IDatabaseService::DestroyFile>, "DestroyFile"},
- FunctionInfo{16, D<&IDatabaseService::DeleteFile>, "DeleteFile"},
- FunctionInfo{17, D<&IDatabaseService::Format>, "Format"},
- FunctionInfo{18, nullptr, "Import"},
- FunctionInfo{19, nullptr, "Export"},
- FunctionInfo{20, D<&IDatabaseService::IsBrokenDatabaseWithClearFlag>, "IsBrokenDatabaseWithClearFlag"},
- FunctionInfo{21, D<&IDatabaseService::GetIndex>, "GetIndex"},
- FunctionInfo{22, D<&IDatabaseService::SetInterfaceVersion>, "SetInterfaceVersion"},
- FunctionInfo{23, D<&IDatabaseService::Convert>, "Convert"},
- FunctionInfo{24, D<&IDatabaseService::ConvertCoreDataToCharInfo>, "ConvertCoreDataToCharInfo"},
- FunctionInfo{25, D<&IDatabaseService::ConvertCharInfoToCoreData>, "ConvertCharInfoToCoreData"},
- FunctionInfo{26, D<&IDatabaseService::Append>, "Append"}
- );
-
std::shared_ptr<MiiManager> manager = nullptr;
DatabaseSessionMetadata metadata{};
bool is_system{};
+
std::shared_ptr<Service::Set::ISystemSettingsServer> m_set_sys;
};
IStaticService::IStaticService(Core::System& system_, const char* name_,
std::shared_ptr<MiiManager> mii_manager, bool is_system_)
: ServiceFramework{system_, name_}, manager{mii_manager}, is_system{is_system_} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IStaticService::GetDatabaseService>, "GetDatabaseService"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IStaticService::~IStaticService() = default;
@@ -322,10 +324,27 @@ std::shared_ptr<MiiManager> IStaticService::GetMiiManager() {
class IImageDatabaseService final : public ServiceFramework<IImageDatabaseService> {
public:
- explicit IImageDatabaseService(Core::System& system_) : ServiceFramework{system_, "miiimg"} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit IImageDatabaseService(Core::System& system_) : ServiceFramework{system_, "miiimg"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IImageDatabaseService::Initialize>, "Initialize"},
+ {10, nullptr, "Reload"},
+ {11, D<&IImageDatabaseService::GetCount>, "GetCount"},
+ {12, nullptr, "IsEmpty"},
+ {13, nullptr, "IsFull"},
+ {14, nullptr, "GetAttribute"},
+ {15, nullptr, "LoadImage"},
+ {16, nullptr, "AddOrUpdateImage"},
+ {17, nullptr, "DeleteImages"},
+ {100, nullptr, "DeleteFile"},
+ {101, nullptr, "DestroyFile"},
+ {102, nullptr, "ImportFile"},
+ {103, nullptr, "ExportFile"},
+ {104, nullptr, "ForceInitialize"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
private:
@@ -342,23 +361,6 @@ private:
R_SUCCEED();
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IImageDatabaseService::Initialize>, "Initialize"},
- FunctionInfo{10, nullptr, "Reload"},
- FunctionInfo{11, D<&IImageDatabaseService::GetCount>, "GetCount"},
- FunctionInfo{12, nullptr, "IsEmpty"},
- FunctionInfo{13, nullptr, "IsFull"},
- FunctionInfo{14, nullptr, "GetAttribute"},
- FunctionInfo{15, nullptr, "LoadImage"},
- FunctionInfo{16, nullptr, "AddOrUpdateImage"},
- FunctionInfo{17, nullptr, "DeleteImages"},
- FunctionInfo{100, nullptr, "DeleteFile"},
- FunctionInfo{101, nullptr, "DestroyFile"},
- FunctionInfo{102, nullptr, "ImportFile"},
- FunctionInfo{103, nullptr, "ExportFile"},
- FunctionInfo{104, nullptr, "ForceInitialize"}
- );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/mii/mii.h b/src/core/hle/service/mii/mii.h
index ba20db40d7..9ec6f248e5 100644
--- a/src/core/hle/service/mii/mii.h
+++ b/src/core/hle/service/mii/mii.h
@@ -27,7 +27,6 @@ public:
private:
Result GetDatabaseService(Out<SharedPointer<IDatabaseService>> out_database_service);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::shared_ptr<MiiManager> manager{nullptr};
bool is_system{};
};
diff --git a/src/core/hle/service/mii/mii_database.cpp b/src/core/hle/service/mii/mii_database.cpp
index d1f4e1f198..6dd9773b2b 100644
--- a/src/core/hle/service/mii/mii_database.cpp
+++ b/src/core/hle/service/mii/mii_database.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
diff --git a/src/core/hle/service/mii/mii_database.h b/src/core/hle/service/mii/mii_database.h
index 3bd240f93b..6d28696206 100644
--- a/src/core/hle/service/mii/mii_database.h
+++ b/src/core/hle/service/mii/mii_database.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/mii/mii_database_manager.h b/src/core/hle/service/mii/mii_database_manager.h
index 52c32be82c..52ec3a91cc 100644
--- a/src/core/hle/service/mii/mii_database_manager.h
+++ b/src/core/hle/service/mii/mii_database_manager.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/mii/mii_manager.h b/src/core/hle/service/mii/mii_manager.h
index 48d8e8bb7d..9c546d2cbf 100644
--- a/src/core/hle/service/mii/mii_manager.h
+++ b/src/core/hle/service/mii/mii_manager.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/mii/mii_result.h b/src/core/hle/service/mii/mii_result.h
index e2c36e556d..f4964133e7 100644
--- a/src/core/hle/service/mii/mii_result.h
+++ b/src/core/hle/service/mii/mii_result.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/mii/mii_types.h b/src/core/hle/service/mii/mii_types.h
index 08c6029dff..6afa07ef43 100644
--- a/src/core/hle/service/mii/mii_types.h
+++ b/src/core/hle/service/mii/mii_types.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/mii/types/char_info.cpp b/src/core/hle/service/mii/types/char_info.cpp
index e90124af4c..b5f4492994 100644
--- a/src/core/hle/service/mii/types/char_info.cpp
+++ b/src/core/hle/service/mii/types/char_info.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/mii/types/char_info.h b/src/core/hle/service/mii/types/char_info.h
index d0c457fd56..e9c41435e1 100644
--- a/src/core/hle/service/mii/types/char_info.h
+++ b/src/core/hle/service/mii/types/char_info.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/mii/types/core_data.cpp b/src/core/hle/service/mii/types/core_data.cpp
index ba1da76bae..7f2acea3ef 100644
--- a/src/core/hle/service/mii/types/core_data.cpp
+++ b/src/core/hle/service/mii/types/core_data.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/mii/types/core_data.h b/src/core/hle/service/mii/types/core_data.h
index 8897e4f3b3..48a1ba5c73 100644
--- a/src/core/hle/service/mii/types/core_data.h
+++ b/src/core/hle/service/mii/types/core_data.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/mii/types/raw_data.h b/src/core/hle/service/mii/types/raw_data.h
index 9a4cfa738e..f8182847ec 100644
--- a/src/core/hle/service/mii/types/raw_data.h
+++ b/src/core/hle/service/mii/types/raw_data.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/mii/types/store_data.cpp b/src/core/hle/service/mii/types/store_data.cpp
index 127221fdb6..fcef3850f2 100644
--- a/src/core/hle/service/mii/types/store_data.cpp
+++ b/src/core/hle/service/mii/types/store_data.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/mii/types/store_data.h b/src/core/hle/service/mii/types/store_data.h
index ed5dfb9494..5d5269a15b 100644
--- a/src/core/hle/service/mii/types/store_data.h
+++ b/src/core/hle/service/mii/types/store_data.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/mii/types/ver3_store_data.cpp b/src/core/hle/service/mii/types/ver3_store_data.cpp
index c27646fcfd..840e0f35b3 100644
--- a/src/core/hle/service/mii/types/ver3_store_data.cpp
+++ b/src/core/hle/service/mii/types/ver3_store_data.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/mii/types/ver3_store_data.h b/src/core/hle/service/mii/types/ver3_store_data.h
index 47907bf7d7..f2cb395136 100644
--- a/src/core/hle/service/mii/types/ver3_store_data.h
+++ b/src/core/hle/service/mii/types/ver3_store_data.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/mm/mm_u.cpp b/src/core/hle/service/mm/mm_u.cpp
index 0b361ecdd2..e5353ee42c 100644
--- a/src/core/hle/service/mm/mm_u.cpp
+++ b/src/core/hle/service/mm/mm_u.cpp
@@ -49,10 +49,21 @@ public:
class MM_U final : public ServiceFramework<MM_U> {
public:
- explicit MM_U(Core::System& system_) : ServiceFramework{system_, "mm:u"} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit MM_U(Core::System& system_) : ServiceFramework{system_, "mm:u"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &MM_U::InitializeOld, "InitializeOld"},
+ {1, &MM_U::FinalizeOld, "FinalizeOld"},
+ {2, &MM_U::SetAndWaitOld, "SetAndWaitOld"},
+ {3, &MM_U::GetOld, "GetOld"},
+ {4, &MM_U::Initialize, "Initialize"},
+ {5, &MM_U::Finalize, "Finalize"},
+ {6, &MM_U::SetAndWait, "SetAndWait"},
+ {7, &MM_U::Get, "Get"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
private:
@@ -201,16 +212,6 @@ private:
rb.Push<u32>(0);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &MM_U::InitializeOld, "InitializeOld"},
- FunctionInfo{1, &MM_U::FinalizeOld, "FinalizeOld"},
- FunctionInfo{2, &MM_U::SetAndWaitOld, "SetAndWaitOld"},
- FunctionInfo{3, &MM_U::GetOld, "GetOld"},
- FunctionInfo{4, &MM_U::Initialize, "Initialize"},
- FunctionInfo{5, &MM_U::Finalize, "Finalize"},
- FunctionInfo{6, &MM_U::SetAndWait, "SetAndWait"},
- FunctionInfo{7, &MM_U::Get, "Get"}
- );
std::vector<Session> sessions;
u32 request_id{1};
};
diff --git a/src/core/hle/service/mm/mm_u.h b/src/core/hle/service/mm/mm_u.h
index 43117c9b1c..ab0e76f40a 100644
--- a/src/core/hle/service/mm/mm_u.h
+++ b/src/core/hle/service/mm/mm_u.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/mnpp/mnpp.cpp b/src/core/hle/service/mnpp/mnpp.cpp
index c5bc306302..11b6f3a386 100644
--- a/src/core/hle/service/mnpp/mnpp.cpp
+++ b/src/core/hle/service/mnpp/mnpp.cpp
@@ -14,10 +14,15 @@ namespace Service::MNPP {
class MNPP_APP final : public ServiceFramework<MNPP_APP> {
public:
- explicit MNPP_APP(Core::System& system_) : ServiceFramework{system_, "mnpp:app"} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit MNPP_APP(Core::System& system_) : ServiceFramework{system_, "mnpp:app"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &MNPP_APP::Cmd0, "Cmd0"},
+ {1, &MNPP_APP::Cmd1, "Cmd1"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
private:
@@ -34,43 +39,38 @@ private:
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &MNPP_APP::Cmd0, "Cmd0"},
- FunctionInfo{1, &MNPP_APP::Cmd1, "Cmd1"}
- );
};
class MNPP_SYS final : public ServiceFramework<MNPP_SYS> {
public:
- explicit MNPP_SYS(Core::System& system_) : ServiceFramework{system_, "mnpp:sys"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "Cmd0"},
- FunctionInfo{10, nullptr, "Cmd10"},
- FunctionInfo{100, nullptr, "Cmd100"},
- FunctionInfo{200, nullptr, "Cmd200"},
- FunctionInfo{300, nullptr, "Cmd300"},
- FunctionInfo{400, nullptr, "Cmd400"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit MNPP_SYS(Core::System& system_) : ServiceFramework{system_, "mnpp:sys"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "Cmd0"},
+ {10, nullptr, "Cmd10"},
+ {100, nullptr, "Cmd100"},
+ {200, nullptr, "Cmd200"},
+ {300, nullptr, "Cmd300"},
+ {400, nullptr, "Cmd400"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class MNPP_WEB final : public ServiceFramework<MNPP_WEB> {
public:
- explicit MNPP_WEB(Core::System& system_) : ServiceFramework{system_, "mnpp:web"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "Cmd0"},
- FunctionInfo{1, nullptr, "Cmd1"},
- FunctionInfo{10, nullptr, "Cmd10"},
- FunctionInfo{20, nullptr, "Cmd20"},
- FunctionInfo{100, nullptr, "Cmd100"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit MNPP_WEB(Core::System& system_) : ServiceFramework{system_, "mnpp:web"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "Cmd0"},
+ {1, nullptr, "Cmd1"},
+ {10, nullptr, "Cmd10"},
+ {20, nullptr, "Cmd20"},
+ {100, nullptr, "Cmd100"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
diff --git a/src/core/hle/service/ncm/ncm.cpp b/src/core/hle/service/ncm/ncm.cpp
index 4091eadcf9..6c754d5567 100644
--- a/src/core/hle/service/ncm/ncm.cpp
+++ b/src/core/hle/service/ncm/ncm.cpp
@@ -24,32 +24,33 @@ namespace Service::NCM {
class ILocationResolver final : public ServiceFramework<ILocationResolver> {
public:
explicit ILocationResolver(Core::System& system_, FileSys::StorageId id)
- : ServiceFramework{system_, "ILocationResolver"}, storage{id} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "ResolveProgramPath"},
- FunctionInfo{1, nullptr, "RedirectProgramPath"},
- FunctionInfo{2, nullptr, "ResolveApplicationControlPath"},
- FunctionInfo{3, nullptr, "ResolveApplicationHtmlDocumentPath"},
- FunctionInfo{4, nullptr, "ResolveDataPath"},
- FunctionInfo{5, nullptr, "RedirectApplicationControlPath"},
- FunctionInfo{6, nullptr, "RedirectApplicationHtmlDocumentPath"},
- FunctionInfo{7, nullptr, "ResolveApplicationLegalInformationPath"},
- FunctionInfo{8, nullptr, "RedirectApplicationLegalInformationPath"},
- FunctionInfo{9, nullptr, "Refresh"},
- FunctionInfo{10, nullptr, "RedirectApplicationProgramPath"},
- FunctionInfo{11, nullptr, "ClearApplicationRedirection"},
- FunctionInfo{12, nullptr, "EraseProgramRedirection"},
- FunctionInfo{13, nullptr, "EraseApplicationControlRedirection"},
- FunctionInfo{14, nullptr, "EraseApplicationHtmlDocumentRedirection"},
- FunctionInfo{15, nullptr, "EraseApplicationLegalInformationRedirection"},
- FunctionInfo{16, nullptr, "ResolveProgramPathForDebug"},
- FunctionInfo{17, nullptr, "RedirectProgramPathForDebug"},
- FunctionInfo{18, nullptr, "RedirectApplicationProgramPathForDebug"},
- FunctionInfo{19, nullptr, "EraseProgramRedirectionForDebug"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "ILocationResolver"}, storage{id} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "ResolveProgramPath"},
+ {1, nullptr, "RedirectProgramPath"},
+ {2, nullptr, "ResolveApplicationControlPath"},
+ {3, nullptr, "ResolveApplicationHtmlDocumentPath"},
+ {4, nullptr, "ResolveDataPath"},
+ {5, nullptr, "RedirectApplicationControlPath"},
+ {6, nullptr, "RedirectApplicationHtmlDocumentPath"},
+ {7, nullptr, "ResolveApplicationLegalInformationPath"},
+ {8, nullptr, "RedirectApplicationLegalInformationPath"},
+ {9, nullptr, "Refresh"},
+ {10, nullptr, "RedirectApplicationProgramPath"},
+ {11, nullptr, "ClearApplicationRedirection"},
+ {12, nullptr, "EraseProgramRedirection"},
+ {13, nullptr, "EraseApplicationControlRedirection"},
+ {14, nullptr, "EraseApplicationHtmlDocumentRedirection"},
+ {15, nullptr, "EraseApplicationLegalInformationRedirection"},
+ {16, nullptr, "ResolveProgramPathForDebug"},
+ {17, nullptr, "RedirectProgramPathForDebug"},
+ {18, nullptr, "RedirectApplicationProgramPathForDebug"},
+ {19, nullptr, "EraseProgramRedirectionForDebug"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
private:
@@ -59,49 +60,60 @@ private:
class IRegisteredLocationResolver final : public ServiceFramework<IRegisteredLocationResolver> {
public:
explicit IRegisteredLocationResolver(Core::System& system_)
- : ServiceFramework{system_, "IRegisteredLocationResolver"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "ResolveProgramPath"},
- FunctionInfo{1, nullptr, "RegisterProgramPath"},
- FunctionInfo{2, nullptr, "UnregisterProgramPath"},
- FunctionInfo{3, nullptr, "RedirectProgramPath"},
- FunctionInfo{4, nullptr, "ResolveHtmlDocumentPath"},
- FunctionInfo{5, nullptr, "RegisterHtmlDocumentPath"},
- FunctionInfo{6, nullptr, "UnregisterHtmlDocumentPath"},
- FunctionInfo{7, nullptr, "RedirectHtmlDocumentPath"},
- FunctionInfo{8, nullptr, "Refresh"},
- FunctionInfo{9, nullptr, "RefreshExcluding"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "IRegisteredLocationResolver"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "ResolveProgramPath"},
+ {1, nullptr, "RegisterProgramPath"},
+ {2, nullptr, "UnregisterProgramPath"},
+ {3, nullptr, "RedirectProgramPath"},
+ {4, nullptr, "ResolveHtmlDocumentPath"},
+ {5, nullptr, "RegisterHtmlDocumentPath"},
+ {6, nullptr, "UnregisterHtmlDocumentPath"},
+ {7, nullptr, "RedirectHtmlDocumentPath"},
+ {8, nullptr, "Refresh"},
+ {9, nullptr, "RefreshExcluding"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
class IAddOnContentLocationResolver final : public ServiceFramework<IAddOnContentLocationResolver> {
public:
explicit IAddOnContentLocationResolver(Core::System& system_)
- : ServiceFramework{system_, "IAddOnContentLocationResolver"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "ResolveAddOnContentPath"},
- FunctionInfo{1, nullptr, "RegisterAddOnContentStorage"},
- FunctionInfo{2, nullptr, "UnregisterAllAddOnContentPath"},
- FunctionInfo{3, nullptr, "RefreshApplicationAddOnContent"},
- FunctionInfo{4, nullptr, "UnregisterApplicationAddOnContent"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "IAddOnContentLocationResolver"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "ResolveAddOnContentPath"},
+ {1, nullptr, "RegisterAddOnContentStorage"},
+ {2, nullptr, "UnregisterAllAddOnContentPath"},
+ {3, nullptr, "RefreshApplicationAddOnContent"},
+ {4, nullptr, "UnregisterApplicationAddOnContent"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
class IContentStorage final : public ServiceFramework<IContentStorage> {
public:
explicit IContentStorage(Core::System& system_, FileSys::StorageId id)
- : ServiceFramework{system_, "IContentStorage"}, storage{id} {}
+ : ServiceFramework{system_, "IContentStorage"}, storage{id} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &IContentStorage::GeneratePlaceHolderId, "GeneratePlaceHolderId"},
+ {1, &IContentStorage::CreatePlaceHolder, "CreatePlaceHolder"},
+ {2, &IContentStorage::DeletePlaceHolder, "DeletePlaceHolder"},
+ {4, &IContentStorage::WritePlaceHolder, "WritePlaceHolder"},
+ {5, &IContentStorage::Register, "Register"},
+ {6, &IContentStorage::Delete, "Delete"},
+ };
+ // clang-format on
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
private:
@@ -240,24 +252,23 @@ private:
rb.Push(succeeded ? ResultSuccess : ResultUnknown);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &IContentStorage::GeneratePlaceHolderId, "GeneratePlaceHolderId"},
- FunctionInfo{1, &IContentStorage::CreatePlaceHolder, "CreatePlaceHolder"},
- FunctionInfo{2, &IContentStorage::DeletePlaceHolder, "DeletePlaceHolder"},
- FunctionInfo{4, &IContentStorage::WritePlaceHolder, "WritePlaceHolder"},
- FunctionInfo{5, &IContentStorage::Register, "Register"},
- FunctionInfo{6, &IContentStorage::Delete, "Delete"}
- );
FileSys::StorageId storage;
};
class IContentMetaDatabase final : public ServiceFramework<IContentMetaDatabase> {
public:
explicit IContentMetaDatabase(Core::System& system_, FileSys::StorageId id)
- : ServiceFramework{system_, "IContentMetaDatabase"}, storage{id} {}
+ : ServiceFramework{system_, "IContentMetaDatabase"}, storage{id} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &IContentMetaDatabase::Set, "Set"},
+ {2, &IContentMetaDatabase::Remove, "Remove"},
+ {8, &IContentMetaDatabase::Has, "Has"},
+ {15, &IContentMetaDatabase::Commit, "Commit"},
+ };
+ // clang-format on
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
private:
@@ -345,37 +356,51 @@ private:
rb.Push(ResultSuccess);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &IContentMetaDatabase::Set, "Set"},
- FunctionInfo{2, &IContentMetaDatabase::Remove, "Remove"},
- FunctionInfo{8, &IContentMetaDatabase::Has, "Has"},
- FunctionInfo{15, &IContentMetaDatabase::Commit, "Commit"}
- );
FileSys::StorageId storage;
std::vector<ContentMetaKey> entries;
};
class LR final : public ServiceFramework<LR> {
public:
- explicit LR(Core::System& system_) : ServiceFramework{system_, "lr"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "OpenLocationResolver"},
- FunctionInfo{1, nullptr, "OpenRegisteredLocationResolver"},
- FunctionInfo{2, nullptr, "RefreshLocationResolver"},
- FunctionInfo{3, nullptr, "OpenAddOnContentLocationResolver"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit LR(Core::System& system_) : ServiceFramework{system_, "lr"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "OpenLocationResolver"},
+ {1, nullptr, "OpenRegisteredLocationResolver"},
+ {2, nullptr, "RefreshLocationResolver"},
+ {3, nullptr, "OpenAddOnContentLocationResolver"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
class NCM final : public ServiceFramework<NCM> {
public:
- explicit NCM(Core::System& system_) : ServiceFramework{system_, "ncm"} {}
+ explicit NCM(Core::System& system_) : ServiceFramework{system_, "ncm"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "CreateContentStorage"},
+ {1, nullptr, "CreateContentMetaDatabase"},
+ {2, nullptr, "VerifyContentStorage"},
+ {3, nullptr, "VerifyContentMetaDatabase"},
+ {4, &NCM::OpenContentStorage, "OpenContentStorage"},
+ {5, &NCM::OpenContentMetaDatabase, "OpenContentMetaDatabase"},
+ {6, nullptr, "CloseContentStorageForcibly"},
+ {7, nullptr, "CloseContentMetaDatabaseForcibly"},
+ {8, nullptr, "CleanupContentMetaDatabase"},
+ {9, nullptr, "ActivateContentStorage"},
+ {10, nullptr, "InactivateContentStorage"},
+ {11, nullptr, "ActivateContentMetaDatabase"},
+ {12, nullptr, "InactivateContentMetaDatabase"},
+ {13, nullptr, "InvalidateRightsIdCache"},
+ {14, nullptr, "GetMemoryReport"},
+ {15, nullptr, "ActivateFsContentStorage"},
+ };
+ // clang-format on
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
private:
@@ -400,39 +425,18 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<IContentMetaDatabase>(ctx, system, storage_id);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "CreateContentStorage"},
- FunctionInfo{1, nullptr, "CreateContentMetaDatabase"},
- FunctionInfo{2, nullptr, "VerifyContentStorage"},
- FunctionInfo{3, nullptr, "VerifyContentMetaDatabase"},
- FunctionInfo{4, &NCM::OpenContentStorage, "OpenContentStorage"},
- FunctionInfo{5, &NCM::OpenContentMetaDatabase, "OpenContentMetaDatabase"},
- FunctionInfo{6, nullptr, "CloseContentStorageForcibly"},
- FunctionInfo{7, nullptr, "CloseContentMetaDatabaseForcibly"},
- FunctionInfo{8, nullptr, "CleanupContentMetaDatabase"},
- FunctionInfo{9, nullptr, "ActivateContentStorage"},
- FunctionInfo{10, nullptr, "InactivateContentStorage"},
- FunctionInfo{11, nullptr, "ActivateContentMetaDatabase"},
- FunctionInfo{12, nullptr, "InactivateContentMetaDatabase"},
- FunctionInfo{13, nullptr, "InvalidateRightsIdCache"},
- FunctionInfo{14, nullptr, "GetMemoryReport"},
- FunctionInfo{15, nullptr, "ActivateFsContentStorage"}
- );
};
class NCM_V final : public ServiceFramework<NCM_V> {
public:
explicit NCM_V(Core::System& system_)
: ServiceFramework{system_, "ncm:v"}
- {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ {
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetSystemVersion"},
+ };
+ RegisterHandlers(functions);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetSystemVersion"}
- );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/ncm/ncm.h b/src/core/hle/service/ncm/ncm.h
index b78efdcd79..1d8bc7a9ea 100644
--- a/src/core/hle/service/ncm/ncm.h
+++ b/src/core/hle/service/ncm/ncm.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/nfc/common/device.h b/src/core/hle/service/nfc/common/device.h
index d59202d18f..98063bbc29 100644
--- a/src/core/hle/service/nfc/common/device.h
+++ b/src/core/hle/service/nfc/common/device.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/nfc/common/device_manager.h b/src/core/hle/service/nfc/common/device_manager.h
index 6c0e6b255e..116ae8cb7e 100644
--- a/src/core/hle/service/nfc/common/device_manager.h
+++ b/src/core/hle/service/nfc/common/device_manager.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/core/hle/service/nfc/mifare_result.h b/src/core/hle/service/nfc/mifare_result.h
index 16a9171e60..399f01313e 100644
--- a/src/core/hle/service/nfc/mifare_result.h
+++ b/src/core/hle/service/nfc/mifare_result.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/core/hle/service/nfc/mifare_types.h b/src/core/hle/service/nfc/mifare_types.h
index 4679373994..237f60f0de 100644
--- a/src/core/hle/service/nfc/mifare_types.h
+++ b/src/core/hle/service/nfc/mifare_types.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/core/hle/service/nfc/nfc.cpp b/src/core/hle/service/nfc/nfc.cpp
index d3a986faea..f64445835e 100644
--- a/src/core/hle/service/nfc/nfc.cpp
+++ b/src/core/hle/service/nfc/nfc.cpp
@@ -18,71 +18,74 @@ namespace Service::NFC {
class IUser final : public NfcInterface {
public:
- explicit IUser(Core::System& system_) : NfcInterface(system_, "NFC::IUser", BackendType::Nfc) {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit IUser(Core::System& system_) : NfcInterface(system_, "NFC::IUser", BackendType::Nfc) {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &NfcInterface::Initialize, "InitializeOld"},
+ {1, &NfcInterface::Finalize, "FinalizeOld"},
+ {2, &NfcInterface::GetState, "GetStateOld"},
+ {3, &NfcInterface::IsNfcEnabled, "IsNfcEnabledOld"},
+ {400, &NfcInterface::Initialize, "Initialize"},
+ {401, &NfcInterface::Finalize, "Finalize"},
+ {402, &NfcInterface::GetState, "GetState"},
+ {403, &NfcInterface::IsNfcEnabled, "IsNfcEnabled"},
+ {404, &NfcInterface::ListDevices, "ListDevices"},
+ {405, &NfcInterface::GetDeviceState, "GetDeviceState"},
+ {406, &NfcInterface::GetNpadId, "GetNpadId"},
+ {407, &NfcInterface::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"},
+ {408, &NfcInterface::StartDetection, "StartDetection"},
+ {409, &NfcInterface::StopDetection, "StopDetection"},
+ {410, &NfcInterface::GetTagInfo, "GetTagInfo"},
+ {411, &NfcInterface::AttachActivateEvent, "AttachActivateEvent"},
+ {412, &NfcInterface::AttachDeactivateEvent, "AttachDeactivateEvent"},
+ {1000, &NfcInterface::ReadMifare, "ReadMifare"},
+ {1001, &NfcInterface::WriteMifare ,"WriteMifare"},
+ {1300, &NfcInterface::SendCommandByPassThrough, "SendCommandByPassThrough"},
+ {1301, nullptr, "KeepPassThroughSession"},
+ {1302, nullptr, "ReleasePassThroughSession"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
- static constexpr auto functions = CreateStaticMapWithClass<IUser>(
- FunctionInfoTyped<IUser>{0, &NfcInterface::Initialize, "InitializeOld"},
- FunctionInfoTyped<IUser>{1, &NfcInterface::Finalize, "FinalizeOld"},
- FunctionInfoTyped<IUser>{2, &NfcInterface::GetState, "GetStateOld"},
- FunctionInfoTyped<IUser>{3, &NfcInterface::IsNfcEnabled, "IsNfcEnabledOld"},
- FunctionInfoTyped<IUser>{400, &NfcInterface::Initialize, "Initialize"},
- FunctionInfoTyped<IUser>{401, &NfcInterface::Finalize, "Finalize"},
- FunctionInfoTyped<IUser>{402, &NfcInterface::GetState, "GetState"},
- FunctionInfoTyped<IUser>{403, &NfcInterface::IsNfcEnabled, "IsNfcEnabled"},
- FunctionInfoTyped<IUser>{404, &NfcInterface::ListDevices, "ListDevices"},
- FunctionInfoTyped<IUser>{405, &NfcInterface::GetDeviceState, "GetDeviceState"},
- FunctionInfoTyped<IUser>{406, &NfcInterface::GetNpadId, "GetNpadId"},
- FunctionInfoTyped<IUser>{407, &NfcInterface::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"},
- FunctionInfoTyped<IUser>{408, &NfcInterface::StartDetection, "StartDetection"},
- FunctionInfoTyped<IUser>{409, &NfcInterface::StopDetection, "StopDetection"},
- FunctionInfoTyped<IUser>{410, &NfcInterface::GetTagInfo, "GetTagInfo"},
- FunctionInfoTyped<IUser>{411, &NfcInterface::AttachActivateEvent, "AttachActivateEvent"},
- FunctionInfoTyped<IUser>{412, &NfcInterface::AttachDeactivateEvent, "AttachDeactivateEvent"},
- FunctionInfoTyped<IUser>{1000, &NfcInterface::ReadMifare, "ReadMifare"},
- FunctionInfoTyped<IUser>{1001, &NfcInterface::WriteMifare ,"WriteMifare"},
- FunctionInfoTyped<IUser>{1300, &NfcInterface::SendCommandByPassThrough, "SendCommandByPassThrough"},
- FunctionInfoTyped<IUser>{1301, nullptr, "KeepPassThroughSession"},
- FunctionInfoTyped<IUser>{1302, nullptr, "ReleasePassThroughSession"}
- );
};
class ISystem final : public NfcInterface {
public:
- explicit ISystem(Core::System& system_) : NfcInterface{system_, "NFC::ISystem", BackendType::Nfc} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit ISystem(Core::System& system_)
+ : NfcInterface{system_, "NFC::ISystem", BackendType::Nfc} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &NfcInterface::Initialize, "InitializeOld"},
+ {1, &NfcInterface::Finalize, "FinalizeOld"},
+ {2, &NfcInterface::GetState, "GetStateOld"},
+ {3, &NfcInterface::IsNfcEnabled, "IsNfcEnabledOld"},
+ {100, &NfcInterface::SetNfcEnabled, "SetNfcEnabledOld"},
+ {400, &NfcInterface::Initialize, "Initialize"},
+ {401, &NfcInterface::Finalize, "Finalize"},
+ {402, &NfcInterface::GetState, "GetState"},
+ {403, &NfcInterface::IsNfcEnabled, "IsNfcEnabled"},
+ {404, &NfcInterface::ListDevices, "ListDevices"},
+ {405, &NfcInterface::GetDeviceState, "GetDeviceState"},
+ {406, &NfcInterface::GetNpadId, "GetNpadId"},
+ {407, &NfcInterface::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"},
+ {408, &NfcInterface::StartDetection, "StartDetection"},
+ {409, &NfcInterface::StopDetection, "StopDetection"},
+ {410, &NfcInterface::GetTagInfo, "GetTagInfo"},
+ {411, &NfcInterface::AttachActivateEvent, "AttachActivateEvent"},
+ {412, &NfcInterface::AttachDeactivateEvent, "AttachDeactivateEvent"},
+ {500, &NfcInterface::SetNfcEnabled, "SetNfcEnabled"},
+ {510, nullptr, "OutputTestWave"},
+ {1000, &NfcInterface::ReadMifare, "ReadMifare"},
+ {1001, &NfcInterface::WriteMifare, "WriteMifare"},
+ {1300, &NfcInterface::SendCommandByPassThrough, "SendCommandByPassThrough"},
+ {1301, nullptr, "KeepPassThroughSession"},
+ {1302, nullptr, "ReleasePassThroughSession"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
- static constexpr auto functions = CreateStaticMapWithClass<ISystem>(
- FunctionInfoTyped<ISystem>{0, &NfcInterface::Initialize, "InitializeOld"},
- FunctionInfoTyped<ISystem>{1, &NfcInterface::Finalize, "FinalizeOld"},
- FunctionInfoTyped<ISystem>{2, &NfcInterface::GetState, "GetStateOld"},
- FunctionInfoTyped<ISystem>{3, &NfcInterface::IsNfcEnabled, "IsNfcEnabledOld"},
- FunctionInfoTyped<ISystem>{100, &NfcInterface::SetNfcEnabled, "SetNfcEnabledOld"},
- FunctionInfoTyped<ISystem>{400, &NfcInterface::Initialize, "Initialize"},
- FunctionInfoTyped<ISystem>{401, &NfcInterface::Finalize, "Finalize"},
- FunctionInfoTyped<ISystem>{402, &NfcInterface::GetState, "GetState"},
- FunctionInfoTyped<ISystem>{403, &NfcInterface::IsNfcEnabled, "IsNfcEnabled"},
- FunctionInfoTyped<ISystem>{404, &NfcInterface::ListDevices, "ListDevices"},
- FunctionInfoTyped<ISystem>{405, &NfcInterface::GetDeviceState, "GetDeviceState"},
- FunctionInfoTyped<ISystem>{406, &NfcInterface::GetNpadId, "GetNpadId"},
- FunctionInfoTyped<ISystem>{407, &NfcInterface::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"},
- FunctionInfoTyped<ISystem>{408, &NfcInterface::StartDetection, "StartDetection"},
- FunctionInfoTyped<ISystem>{409, &NfcInterface::StopDetection, "StopDetection"},
- FunctionInfoTyped<ISystem>{410, &NfcInterface::GetTagInfo, "GetTagInfo"},
- FunctionInfoTyped<ISystem>{411, &NfcInterface::AttachActivateEvent, "AttachActivateEvent"},
- FunctionInfoTyped<ISystem>{412, &NfcInterface::AttachDeactivateEvent, "AttachDeactivateEvent"},
- FunctionInfoTyped<ISystem>{500, &NfcInterface::SetNfcEnabled, "SetNfcEnabled"},
- FunctionInfoTyped<ISystem>{510, nullptr, "OutputTestWave"},
- FunctionInfoTyped<ISystem>{1000, &NfcInterface::ReadMifare, "ReadMifare"},
- FunctionInfoTyped<ISystem>{1001, &NfcInterface::WriteMifare, "WriteMifare"},
- FunctionInfoTyped<ISystem>{1300, &NfcInterface::SendCommandByPassThrough, "SendCommandByPassThrough"},
- FunctionInfoTyped<ISystem>{1301, nullptr, "KeepPassThroughSession"},
- FunctionInfoTyped<ISystem>{1302, nullptr, "ReleasePassThroughSession"}
- );
};
// MFInterface has an unique interface but it's identical to NfcInterface so we can keep the code
@@ -90,49 +93,56 @@ public:
using MFInterface = NfcInterface;
class MFIUser final : public MFInterface {
public:
- explicit MFIUser(Core::System& system_) : MFInterface{system_, "NFC::MFInterface", BackendType::Mifare} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit MFIUser(Core::System& system_)
+ : MFInterface{system_, "NFC::MFInterface", BackendType::Mifare} {
+ // clang-format off
+ static const FunctionInfoTyped<MFIUser> functions[] = {
+ {0, &MFIUser::Initialize, "Initialize"},
+ {1, &MFIUser::Finalize, "Finalize"},
+ {2, &MFIUser::ListDevices, "ListDevices"},
+ {3, &MFIUser::StartDetection, "StartDetection"},
+ {4, &MFIUser::StopDetection, "StopDetection"},
+ {5, &MFIUser::ReadMifare, "Read"},
+ {6, &MFIUser::WriteMifare, "Write"},
+ {7, &MFIUser::GetTagInfo, "GetTagInfo"},
+ {8, &MFIUser::AttachActivateEvent, "GetActivateEventHandle"},
+ {9, &MFIUser::AttachDeactivateEvent, "GetDeactivateEventHandle"},
+ {10, &MFIUser::GetState, "GetState"},
+ {11, &MFIUser::GetDeviceState, "GetDeviceState"},
+ {12, &MFIUser::GetNpadId, "GetNpadId"},
+ {13, &MFIUser::AttachAvailabilityChangeEvent, "GetAvailabilityChangeEventHandle"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
- static constexpr auto functions = CreateStaticMapWithClass<MFIUser>(
- FunctionInfoTyped<MFIUser>{0, &MFIUser::Initialize, "Initialize"},
- FunctionInfoTyped<MFIUser>{1, &MFIUser::Finalize, "Finalize"},
- FunctionInfoTyped<MFIUser>{2, &MFIUser::ListDevices, "ListDevices"},
- FunctionInfoTyped<MFIUser>{3, &MFIUser::StartDetection, "StartDetection"},
- FunctionInfoTyped<MFIUser>{4, &MFIUser::StopDetection, "StopDetection"},
- FunctionInfoTyped<MFIUser>{5, &MFIUser::ReadMifare, "Read"},
- FunctionInfoTyped<MFIUser>{6, &MFIUser::WriteMifare, "Write"},
- FunctionInfoTyped<MFIUser>{7, &MFIUser::GetTagInfo, "GetTagInfo"},
- FunctionInfoTyped<MFIUser>{8, &MFIUser::AttachActivateEvent, "GetActivateEventHandle"},
- FunctionInfoTyped<MFIUser>{9, &MFIUser::AttachDeactivateEvent, "GetDeactivateEventHandle"},
- FunctionInfoTyped<MFIUser>{10, &MFIUser::GetState, "GetState"},
- FunctionInfoTyped<MFIUser>{11, &MFIUser::GetDeviceState, "GetDeviceState"},
- FunctionInfoTyped<MFIUser>{12, &MFIUser::GetNpadId, "GetNpadId"},
- FunctionInfoTyped<MFIUser>{13, &MFIUser::AttachAvailabilityChangeEvent, "GetAvailabilityChangeEventHandle"}
- );
};
class IAm final : public ServiceFramework<IAm> {
public:
- explicit IAm(Core::System& system_) : ServiceFramework{system_, "NFC::IAm"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "Initialize"},
- FunctionInfo{1, nullptr, "Finalize"},
- FunctionInfo{2, nullptr, "NotifyForegroundApplet"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit IAm(Core::System& system_) : ServiceFramework{system_, "NFC::IAm"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "Initialize"},
+ {1, nullptr, "Finalize"},
+ {2, nullptr, "NotifyForegroundApplet"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
class NFC_AM final : public ServiceFramework<NFC_AM> {
public:
- explicit NFC_AM(Core::System& system_) : ServiceFramework{system_, "nfc:am"} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit NFC_AM(Core::System& system_) : ServiceFramework{system_, "nfc:am"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &NFC_AM::CreateAmNfcInterface, "CreateAmNfcInterface"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
private:
@@ -143,18 +153,18 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<IAm>(ctx, system);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &NFC_AM::CreateAmNfcInterface, "CreateAmNfcInterface"}
- );
};
class NFC_MF_U final : public ServiceFramework<NFC_MF_U> {
public:
- explicit NFC_MF_U(Core::System& system_) : ServiceFramework{system_, "nfc:mf:u"} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit NFC_MF_U(Core::System& system_) : ServiceFramework{system_, "nfc:mf:u"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &NFC_MF_U::CreateUserNfcInterface, "CreateUserNfcInterface"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
private:
@@ -165,18 +175,18 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<MFIUser>(ctx, system);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &NFC_MF_U::CreateUserNfcInterface, "CreateUserNfcInterface"}
- );
};
class NFC_U final : public ServiceFramework<NFC_U> {
public:
- explicit NFC_U(Core::System& system_) : ServiceFramework{system_, "nfc:user"} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit NFC_U(Core::System& system_) : ServiceFramework{system_, "nfc:user"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &NFC_U::CreateUserNfcInterface, "CreateUserNfcInterface"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
private:
@@ -187,18 +197,18 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<IUser>(ctx, system);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &NFC_U::CreateUserNfcInterface, "CreateUserNfcInterface"}
- );
};
class NFC_SYS final : public ServiceFramework<NFC_SYS> {
public:
- explicit NFC_SYS(Core::System& system_) : ServiceFramework{system_, "nfc:sys"} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit NFC_SYS(Core::System& system_) : ServiceFramework{system_, "nfc:sys"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &NFC_SYS::CreateSystemNfcInterface, "CreateSystemNfcInterface"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
private:
@@ -209,10 +219,6 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<ISystem>(ctx, system);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &NFC_SYS::CreateSystemNfcInterface, "CreateSystemNfcInterface"}
- );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/nfc/nfc.h b/src/core/hle/service/nfc/nfc.h
index d15955b755..bfda30d6f1 100644
--- a/src/core/hle/service/nfc/nfc.h
+++ b/src/core/hle/service/nfc/nfc.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/nfc/nfc_interface.h b/src/core/hle/service/nfc/nfc_interface.h
index 5cc0d8ec04..a1e0d8d9ca 100644
--- a/src/core/hle/service/nfc/nfc_interface.h
+++ b/src/core/hle/service/nfc/nfc_interface.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/nfc/nfc_result.h b/src/core/hle/service/nfc/nfc_result.h
index 464b5fd69a..aab83c326c 100644
--- a/src/core/hle/service/nfc/nfc_result.h
+++ b/src/core/hle/service/nfc/nfc_result.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/core/hle/service/nfc/nfc_types.h b/src/core/hle/service/nfc/nfc_types.h
index 6d44014ea1..6774a9b4d6 100644
--- a/src/core/hle/service/nfc/nfc_types.h
+++ b/src/core/hle/service/nfc/nfc_types.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
diff --git a/src/core/hle/service/nfp/nfp.cpp b/src/core/hle/service/nfp/nfp.cpp
index bfeb7d5553..e0c24679ab 100644
--- a/src/core/hle/service/nfp/nfp.cpp
+++ b/src/core/hle/service/nfp/nfp.cpp
@@ -14,134 +14,145 @@ namespace Service::NFP {
class IUser final : public Interface {
public:
- explicit IUser(Core::System& system_) : Interface(system_, "NFP:IUser") {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit IUser(Core::System& system_) : Interface(system_, "NFP:IUser") {
+ // clang-format off
+ static const FunctionInfoTyped<IUser> functions[] = {
+ {0, &IUser::Initialize, "Initialize"},
+ {1, &IUser::Finalize, "Finalize"},
+ {2, &IUser::ListDevices, "ListDevices"},
+ {3, &IUser::StartDetection, "StartDetection"},
+ {4, &IUser::StopDetection, "StopDetection"},
+ {5, &IUser::Mount, "Mount"},
+ {6, &IUser::Unmount, "Unmount"},
+ {7, &IUser::OpenApplicationArea, "OpenApplicationArea"},
+ {8, &IUser::GetApplicationArea, "GetApplicationArea"},
+ {9, &IUser::SetApplicationArea, "SetApplicationArea"},
+ {10, &IUser::Flush, "Flush"},
+ {11, &IUser::Restore, "Restore"},
+ {12, &IUser::CreateApplicationArea, "CreateApplicationArea"},
+ {13, &IUser::GetTagInfo, "GetTagInfo"},
+ {14, &IUser::GetRegisterInfo, "GetRegisterInfo"},
+ {15, &IUser::GetCommonInfo, "GetCommonInfo"},
+ {16, &IUser::GetModelInfo, "GetModelInfo"},
+ {17, &IUser::AttachActivateEvent, "AttachActivateEvent"},
+ {18, &IUser::AttachDeactivateEvent, "AttachDeactivateEvent"},
+ {19, &IUser::GetState, "GetState"},
+ {20, &IUser::GetDeviceState, "GetDeviceState"},
+ {21, &IUser::GetNpadId, "GetNpadId"},
+ {22, &IUser::GetApplicationAreaSize, "GetApplicationAreaSize"},
+ {23, &IUser::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"},
+ {24, &IUser::RecreateApplicationArea, "RecreateApplicationArea"},
+ {25, &IUser::StartDetection, "StartDetectionWithFilter"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
- static constexpr auto functions = CreateStaticMapWithClass<IUser>(
- FunctionInfoTyped<IUser>{0, &IUser::Initialize, "Initialize"},
- FunctionInfoTyped<IUser>{1, &IUser::Finalize, "Finalize"},
- FunctionInfoTyped<IUser>{2, &IUser::ListDevices, "ListDevices"},
- FunctionInfoTyped<IUser>{3, &IUser::StartDetection, "StartDetection"},
- FunctionInfoTyped<IUser>{4, &IUser::StopDetection, "StopDetection"},
- FunctionInfoTyped<IUser>{5, &IUser::Mount, "Mount"},
- FunctionInfoTyped<IUser>{6, &IUser::Unmount, "Unmount"},
- FunctionInfoTyped<IUser>{7, &IUser::OpenApplicationArea, "OpenApplicationArea"},
- FunctionInfoTyped<IUser>{8, &IUser::GetApplicationArea, "GetApplicationArea"},
- FunctionInfoTyped<IUser>{9, &IUser::SetApplicationArea, "SetApplicationArea"},
- FunctionInfoTyped<IUser>{10, &IUser::Flush, "Flush"},
- FunctionInfoTyped<IUser>{11, &IUser::Restore, "Restore"},
- FunctionInfoTyped<IUser>{12, &IUser::CreateApplicationArea, "CreateApplicationArea"},
- FunctionInfoTyped<IUser>{13, &IUser::GetTagInfo, "GetTagInfo"},
- FunctionInfoTyped<IUser>{14, &IUser::GetRegisterInfo, "GetRegisterInfo"},
- FunctionInfoTyped<IUser>{15, &IUser::GetCommonInfo, "GetCommonInfo"},
- FunctionInfoTyped<IUser>{16, &IUser::GetModelInfo, "GetModelInfo"},
- FunctionInfoTyped<IUser>{17, &IUser::AttachActivateEvent, "AttachActivateEvent"},
- FunctionInfoTyped<IUser>{18, &IUser::AttachDeactivateEvent, "AttachDeactivateEvent"},
- FunctionInfoTyped<IUser>{19, &IUser::GetState, "GetState"},
- FunctionInfoTyped<IUser>{20, &IUser::GetDeviceState, "GetDeviceState"},
- FunctionInfoTyped<IUser>{21, &IUser::GetNpadId, "GetNpadId"},
- FunctionInfoTyped<IUser>{22, &IUser::GetApplicationAreaSize, "GetApplicationAreaSize"},
- FunctionInfoTyped<IUser>{23, &IUser::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"},
- FunctionInfoTyped<IUser>{24, &IUser::RecreateApplicationArea, "RecreateApplicationArea"},
- FunctionInfoTyped<IUser>{25, &IUser::StartDetection, "StartDetectionWithFilter"}
- );
};
class ISystem final : public Interface {
public:
- explicit ISystem(Core::System& system_) : Interface(system_, "NFP:ISystem") {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit ISystem(Core::System& system_) : Interface(system_, "NFP:ISystem") {
+ // clang-format off
+ static const FunctionInfoTyped<ISystem> functions[] = {
+ {0, &ISystem::InitializeSystem, "InitializeSystem"},
+ {1, &ISystem::FinalizeSystem, "FinalizeSystem"},
+ {2, &ISystem::ListDevices, "ListDevices"},
+ {3, &ISystem::StartDetection, "StartDetection"},
+ {4, &ISystem::StopDetection, "StopDetection"},
+ {5, &ISystem::Mount, "Mount"},
+ {6, &ISystem::Unmount, "Unmount"},
+ {10, &ISystem::Flush, "Flush"},
+ {11, &ISystem::Restore, "Restore"},
+ {12, &ISystem::CreateApplicationArea, "CreateApplicationArea"},
+ {13, &ISystem::GetTagInfo, "GetTagInfo"},
+ {14, &ISystem::GetRegisterInfo, "GetRegisterInfo"},
+ {15, &ISystem::GetCommonInfo, "GetCommonInfo"},
+ {16, &ISystem::GetModelInfo, "GetModelInfo"},
+ {17, &ISystem::AttachActivateEvent, "AttachActivateEvent"},
+ {18, &ISystem::AttachDeactivateEvent, "AttachDeactivateEvent"},
+ {19, &ISystem::GetState, "GetState"},
+ {20, &ISystem::GetDeviceState, "GetDeviceState"},
+ {21, &ISystem::GetNpadId, "GetNpadId"},
+ {23, &ISystem::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"},
+ {25, &ISystem::StartDetection, "StartDetectionWithFilter"},
+ {100, &ISystem::Format, "Format"},
+ {101, &ISystem::GetAdminInfo, "GetAdminInfo"},
+ {102, &ISystem::GetRegisterInfoPrivate, "GetRegisterInfoPrivate"},
+ {103, &ISystem::SetRegisterInfoPrivate, "SetRegisterInfoPrivate"},
+ {104, &ISystem::DeleteRegisterInfo, "DeleteRegisterInfo"},
+ {105, &ISystem::DeleteApplicationArea, "DeleteApplicationArea"},
+ {106, &ISystem::ExistsApplicationArea, "ExistsApplicationArea"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
- static constexpr auto functions = CreateStaticMapWithClass<ISystem>(
- FunctionInfoTyped<ISystem>{0, &ISystem::InitializeSystem, "InitializeSystem"},
- FunctionInfoTyped<ISystem>{1, &ISystem::FinalizeSystem, "FinalizeSystem"},
- FunctionInfoTyped<ISystem>{2, &ISystem::ListDevices, "ListDevices"},
- FunctionInfoTyped<ISystem>{3, &ISystem::StartDetection, "StartDetection"},
- FunctionInfoTyped<ISystem>{4, &ISystem::StopDetection, "StopDetection"},
- FunctionInfoTyped<ISystem>{5, &ISystem::Mount, "Mount"},
- FunctionInfoTyped<ISystem>{6, &ISystem::Unmount, "Unmount"},
- FunctionInfoTyped<ISystem>{10, &ISystem::Flush, "Flush"},
- FunctionInfoTyped<ISystem>{11, &ISystem::Restore, "Restore"},
- FunctionInfoTyped<ISystem>{12, &ISystem::CreateApplicationArea, "CreateApplicationArea"},
- FunctionInfoTyped<ISystem>{13, &ISystem::GetTagInfo, "GetTagInfo"},
- FunctionInfoTyped<ISystem>{14, &ISystem::GetRegisterInfo, "GetRegisterInfo"},
- FunctionInfoTyped<ISystem>{15, &ISystem::GetCommonInfo, "GetCommonInfo"},
- FunctionInfoTyped<ISystem>{16, &ISystem::GetModelInfo, "GetModelInfo"},
- FunctionInfoTyped<ISystem>{17, &ISystem::AttachActivateEvent, "AttachActivateEvent"},
- FunctionInfoTyped<ISystem>{18, &ISystem::AttachDeactivateEvent, "AttachDeactivateEvent"},
- FunctionInfoTyped<ISystem>{19, &ISystem::GetState, "GetState"},
- FunctionInfoTyped<ISystem>{20, &ISystem::GetDeviceState, "GetDeviceState"},
- FunctionInfoTyped<ISystem>{21, &ISystem::GetNpadId, "GetNpadId"},
- FunctionInfoTyped<ISystem>{23, &ISystem::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"},
- FunctionInfoTyped<ISystem>{25, &ISystem::StartDetection, "StartDetectionWithFilter"},
- FunctionInfoTyped<ISystem>{100, &ISystem::Format, "Format"},
- FunctionInfoTyped<ISystem>{101, &ISystem::GetAdminInfo, "GetAdminInfo"},
- FunctionInfoTyped<ISystem>{102, &ISystem::GetRegisterInfoPrivate, "GetRegisterInfoPrivate"},
- FunctionInfoTyped<ISystem>{103, &ISystem::SetRegisterInfoPrivate, "SetRegisterInfoPrivate"},
- FunctionInfoTyped<ISystem>{104, &ISystem::DeleteRegisterInfo, "DeleteRegisterInfo"},
- FunctionInfoTyped<ISystem>{105, &ISystem::DeleteApplicationArea, "DeleteApplicationArea"},
- FunctionInfoTyped<ISystem>{106, &ISystem::ExistsApplicationArea, "ExistsApplicationArea"}
- );
};
class IDebug final : public Interface {
public:
- explicit IDebug(Core::System& system_) : Interface(system_, "NFP:IDebug") {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit IDebug(Core::System& system_) : Interface(system_, "NFP:IDebug") {
+ // clang-format off
+ static const FunctionInfoTyped<IDebug> functions[] = {
+ {0, &IDebug::InitializeDebug, "InitializeDebug"},
+ {1, &IDebug::FinalizeDebug, "FinalizeDebug"},
+ {2, &IDebug::ListDevices, "ListDevices"},
+ {3, &IDebug::StartDetection, "StartDetection"},
+ {4, &IDebug::StopDetection, "StopDetection"},
+ {5, &IDebug::Mount, "Mount"},
+ {6, &IDebug::Unmount, "Unmount"},
+ {7, &IDebug::OpenApplicationArea, "OpenApplicationArea"},
+ {8, &IDebug::GetApplicationArea, "GetApplicationArea"},
+ {9, &IDebug::SetApplicationArea, "SetApplicationArea"},
+ {10, &IDebug::Flush, "Flush"},
+ {11, &IDebug::Restore, "Restore"},
+ {12, &IDebug::CreateApplicationArea, "CreateApplicationArea"},
+ {13, &IDebug::GetTagInfo, "GetTagInfo"},
+ {14, &IDebug::GetRegisterInfo, "GetRegisterInfo"},
+ {15, &IDebug::GetCommonInfo, "GetCommonInfo"},
+ {16, &IDebug::GetModelInfo, "GetModelInfo"},
+ {17, &IDebug::AttachActivateEvent, "AttachActivateEvent"},
+ {18, &IDebug::AttachDeactivateEvent, "AttachDeactivateEvent"},
+ {19, &IDebug::GetState, "GetState"},
+ {20, &IDebug::GetDeviceState, "GetDeviceState"},
+ {21, &IDebug::GetNpadId, "GetNpadId"},
+ {22, &IDebug::GetApplicationAreaSize, "GetApplicationAreaSize"},
+ {23, &IDebug::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"},
+ {24, &IDebug::RecreateApplicationArea, "RecreateApplicationArea"},
+ {25, &IDebug::StartDetection, "StartDetectionWithFilter"},
+ {100, &IDebug::Format, "Format"},
+ {101, &IDebug::GetAdminInfo, "GetAdminInfo"},
+ {102, &IDebug::GetRegisterInfoPrivate, "GetRegisterInfoPrivate"},
+ {103, &IDebug::SetRegisterInfoPrivate, "SetRegisterInfoPrivate"},
+ {104, &IDebug::DeleteRegisterInfo, "DeleteRegisterInfo"},
+ {105, &IDebug::DeleteApplicationArea, "DeleteApplicationArea"},
+ {106, &IDebug::ExistsApplicationArea, "ExistsApplicationArea"},
+ {200, &IDebug::GetAll, "GetAll"},
+ {201, &IDebug::SetAll, "SetAll"},
+ {202, &IDebug::FlushDebug, "FlushDebug"},
+ {203, &IDebug::BreakTag, "BreakTag"},
+ {204, &IDebug::ReadBackupData, "ReadBackupData"},
+ {205, &IDebug::WriteBackupData, "WriteBackupData"},
+ {206, &IDebug::WriteNtf, "WriteNtf"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
- static constexpr auto functions = CreateStaticMapWithClass<IDebug>(
- FunctionInfoTyped<IDebug>{0, &IDebug::InitializeDebug, "InitializeDebug"},
- FunctionInfoTyped<IDebug>{1, &IDebug::FinalizeDebug, "FinalizeDebug"},
- FunctionInfoTyped<IDebug>{2, &IDebug::ListDevices, "ListDevices"},
- FunctionInfoTyped<IDebug>{3, &IDebug::StartDetection, "StartDetection"},
- FunctionInfoTyped<IDebug>{4, &IDebug::StopDetection, "StopDetection"},
- FunctionInfoTyped<IDebug>{5, &IDebug::Mount, "Mount"},
- FunctionInfoTyped<IDebug>{6, &IDebug::Unmount, "Unmount"},
- FunctionInfoTyped<IDebug>{7, &IDebug::OpenApplicationArea, "OpenApplicationArea"},
- FunctionInfoTyped<IDebug>{8, &IDebug::GetApplicationArea, "GetApplicationArea"},
- FunctionInfoTyped<IDebug>{9, &IDebug::SetApplicationArea, "SetApplicationArea"},
- FunctionInfoTyped<IDebug>{10, &IDebug::Flush, "Flush"},
- FunctionInfoTyped<IDebug>{11, &IDebug::Restore, "Restore"},
- FunctionInfoTyped<IDebug>{12, &IDebug::CreateApplicationArea, "CreateApplicationArea"},
- FunctionInfoTyped<IDebug>{13, &IDebug::GetTagInfo, "GetTagInfo"},
- FunctionInfoTyped<IDebug>{14, &IDebug::GetRegisterInfo, "GetRegisterInfo"},
- FunctionInfoTyped<IDebug>{15, &IDebug::GetCommonInfo, "GetCommonInfo"},
- FunctionInfoTyped<IDebug>{16, &IDebug::GetModelInfo, "GetModelInfo"},
- FunctionInfoTyped<IDebug>{17, &IDebug::AttachActivateEvent, "AttachActivateEvent"},
- FunctionInfoTyped<IDebug>{18, &IDebug::AttachDeactivateEvent, "AttachDeactivateEvent"},
- FunctionInfoTyped<IDebug>{19, &IDebug::GetState, "GetState"},
- FunctionInfoTyped<IDebug>{20, &IDebug::GetDeviceState, "GetDeviceState"},
- FunctionInfoTyped<IDebug>{21, &IDebug::GetNpadId, "GetNpadId"},
- FunctionInfoTyped<IDebug>{22, &IDebug::GetApplicationAreaSize, "GetApplicationAreaSize"},
- FunctionInfoTyped<IDebug>{23, &IDebug::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"},
- FunctionInfoTyped<IDebug>{24, &IDebug::RecreateApplicationArea, "RecreateApplicationArea"},
- FunctionInfoTyped<IDebug>{25, &IDebug::StartDetection, "StartDetectionWithFilter"},
- FunctionInfoTyped<IDebug>{100, &IDebug::Format, "Format"},
- FunctionInfoTyped<IDebug>{101, &IDebug::GetAdminInfo, "GetAdminInfo"},
- FunctionInfoTyped<IDebug>{102, &IDebug::GetRegisterInfoPrivate, "GetRegisterInfoPrivate"},
- FunctionInfoTyped<IDebug>{103, &IDebug::SetRegisterInfoPrivate, "SetRegisterInfoPrivate"},
- FunctionInfoTyped<IDebug>{104, &IDebug::DeleteRegisterInfo, "DeleteRegisterInfo"},
- FunctionInfoTyped<IDebug>{105, &IDebug::DeleteApplicationArea, "DeleteApplicationArea"},
- FunctionInfoTyped<IDebug>{106, &IDebug::ExistsApplicationArea, "ExistsApplicationArea"},
- FunctionInfoTyped<IDebug>{200, &IDebug::GetAll, "GetAll"},
- FunctionInfoTyped<IDebug>{201, &IDebug::SetAll, "SetAll"},
- FunctionInfoTyped<IDebug>{202, &IDebug::FlushDebug, "FlushDebug"},
- FunctionInfoTyped<IDebug>{203, &IDebug::BreakTag, "BreakTag"},
- FunctionInfoTyped<IDebug>{204, &IDebug::ReadBackupData, "ReadBackupData"},
- FunctionInfoTyped<IDebug>{205, &IDebug::WriteBackupData, "WriteBackupData"},
- FunctionInfoTyped<IDebug>{206, &IDebug::WriteNtf, "WriteNtf"}
- );
};
class IUserManager final : public ServiceFramework<IUserManager> {
public:
- explicit IUserManager(Core::System& system_) : ServiceFramework{system_, "nfp:user"} {}
+ explicit IUserManager(Core::System& system_) : ServiceFramework{system_, "nfp:user"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &IUserManager::CreateUserInterface, "CreateUserInterface"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+ }
private:
void CreateUserInterface(HLERequestContext& ctx) {
@@ -151,21 +162,18 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<IUser>(ctx, system);
}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &IUserManager::CreateUserInterface, "CreateUserInterface"}
- );
};
class ISystemManager final : public ServiceFramework<ISystemManager> {
public:
- explicit ISystemManager(Core::System& system_) : ServiceFramework{system_, "nfp:sys"} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit ISystemManager(Core::System& system_) : ServiceFramework{system_, "nfp:sys"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &ISystemManager::CreateSystemInterface, "CreateSystemInterface"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
private:
@@ -176,18 +184,18 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<ISystem>(ctx, system);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &ISystemManager::CreateSystemInterface, "CreateSystemInterface"}
- );
};
class IDebugManager final : public ServiceFramework<IDebugManager> {
public:
- explicit IDebugManager(Core::System& system_) : ServiceFramework{system_, "nfp:dbg"} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit IDebugManager(Core::System& system_) : ServiceFramework{system_, "nfp:dbg"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &IDebugManager::CreateDebugInterface, "CreateDebugInterface"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
private:
@@ -198,10 +206,6 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<IDebug>(ctx, system);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &IDebugManager::CreateDebugInterface, "CreateDebugInterface"}
- );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/nfp/nfp.h b/src/core/hle/service/nfp/nfp.h
index a5aac710b5..e7af7ae39d 100644
--- a/src/core/hle/service/nfp/nfp.h
+++ b/src/core/hle/service/nfp/nfp.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/nfp/nfp_interface.h b/src/core/hle/service/nfp/nfp_interface.h
index fa985b068e..531db84652 100644
--- a/src/core/hle/service/nfp/nfp_interface.h
+++ b/src/core/hle/service/nfp/nfp_interface.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/nfp/nfp_result.h b/src/core/hle/service/nfp/nfp_result.h
index 6185338438..528b5417fa 100644
--- a/src/core/hle/service/nfp/nfp_result.h
+++ b/src/core/hle/service/nfp/nfp_result.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/nfp/nfp_types.h b/src/core/hle/service/nfp/nfp_types.h
index 8330134d18..108548ea46 100644
--- a/src/core/hle/service/nfp/nfp_types.h
+++ b/src/core/hle/service/nfp/nfp_types.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
diff --git a/src/core/hle/service/ngc/ngc.cpp b/src/core/hle/service/ngc/ngc.cpp
index fb3ef39093..e79108a1eb 100644
--- a/src/core/hle/service/ngc/ngc.cpp
+++ b/src/core/hle/service/ngc/ngc.cpp
@@ -21,10 +21,15 @@ namespace Service::NGC {
class IService final : public ServiceFramework<IService> {
public:
- explicit IService(Core::System& system_) : ServiceFramework{system_, "ngct:u"} {}
+ explicit IService(Core::System& system_) : ServiceFramework{system_, "ngct:u"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &IService::Match, "Match"},
+ {1, &IService::Filter, "Filter"},
+ };
+ // clang-format on
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
private:
@@ -56,19 +61,23 @@ private:
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &IService::Match, "Match"},
- FunctionInfo{1, &IService::Filter, "Filter"}
- );
};
class NgcServiceImpl final : public ServiceFramework<NgcServiceImpl> {
public:
- explicit NgcServiceImpl(Core::System& system_) : ServiceFramework(system_, "ngc:u") {}
+ explicit NgcServiceImpl(Core::System& system_) : ServiceFramework(system_, "ngc:u") {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &NgcServiceImpl::GetContentVersion, "GetContentVersion"},
+ {1, &NgcServiceImpl::Check, "Check"},
+ {2, &NgcServiceImpl::Mask, "Mask"},
+ {3, &NgcServiceImpl::Reload, "Reload"},
+ {4, &NgcServiceImpl::Check, "Check2"},
+ {5, &NgcServiceImpl::Mask, "Mask2"},
+ };
+ // clang-format on
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
private:
@@ -141,34 +150,25 @@ private:
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &NgcServiceImpl::GetContentVersion, "GetContentVersion"},
- FunctionInfo{1, &NgcServiceImpl::Check, "Check"},
- FunctionInfo{2, &NgcServiceImpl::Mask, "Mask"},
- FunctionInfo{3, &NgcServiceImpl::Reload, "Reload"},
- FunctionInfo{4, &NgcServiceImpl::Check, "Check2"},
- FunctionInfo{5, &NgcServiceImpl::Mask, "Mask2"}
- );
};
class IServiceWithManagementApi final : public ServiceFramework<IServiceWithManagementApi> {
public:
- explicit IServiceWithManagementApi(Core::System& system_) : ServiceFramework(system_, "ngct:s") {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "Match"},
- FunctionInfo{1, nullptr, "Filter"},
- FunctionInfo{100, nullptr, "ConfigureAutoUpdateSetting"},
- FunctionInfo{101, nullptr, "RequestResourceUpdateCheck"},
- FunctionInfo{110, nullptr, "Reload"},
- FunctionInfo{111, nullptr, "IsReloadRequired"},
- FunctionInfo{112, nullptr, "TryAcquireReloadRequestNotifier"},
- FunctionInfo{120, nullptr, "CalculateContentFingerprint"},
- FunctionInfo{130, nullptr, "TryEnableTemporalPassThrough"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit IServiceWithManagementApi(Core::System& system_) : ServiceFramework(system_, "ngct:s") {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0 , nullptr, "Match"},
+ {1 , nullptr, "Filter"},
+ {100, nullptr, "ConfigureAutoUpdateSetting"},
+ {101, nullptr, "RequestResourceUpdateCheck"},
+ {110, nullptr, "Reload"},
+ {111, nullptr, "IsReloadRequired"},
+ {112, nullptr, "TryAcquireReloadRequestNotifier"},
+ {120, nullptr, "CalculateContentFingerprint"},
+ {130, nullptr, "TryEnableTemporalPassThrough"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
@@ -179,10 +179,20 @@ static_assert(sizeof(SaveDataHandle) == 0x08);
class IUserShimScopedObject final : public ServiceFramework<IUserShimScopedObject> {
public:
- explicit IUserShimScopedObject(Core::System& system_) : ServiceFramework(system_, "IUserShimScopedObject") {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit IUserShimScopedObject(Core::System& system_) : ServiceFramework(system_, "IUserShimScopedObject") {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {450, nullptr, "InitializeForSaveData"},
+ {451, nullptr, "FinalizeForSaveData"},
+ {452, D<&IUserShimScopedObject::OpenSaveData>, "OpenSaveData"},
+ {453, nullptr, "CloseSaveData"},
+ {454, D<&IUserShimScopedObject::ReadSaveSlot>, "ReadSaveSlot"},
+ {455, D<&IUserShimScopedObject::WriteSaveSlot>, "WriteSaveSlot"},
+ {456, nullptr, "FlushSaveSlot"},
+ {457, nullptr, "CommitSaveData"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
Result OpenSaveData(Account::Uid unk0, Out<SaveDataHandle> unk1) {
@@ -200,43 +210,42 @@ public:
// to implement
R_SUCCEED();
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{450, nullptr, "InitializeForSaveData"},
- FunctionInfo{451, nullptr, "FinalizeForSaveData"},
- FunctionInfo{452, D<&IUserShimScopedObject::OpenSaveData>, "OpenSaveData"},
- FunctionInfo{453, nullptr, "CloseSaveData"},
- FunctionInfo{454, D<&IUserShimScopedObject::ReadSaveSlot>, "ReadSaveSlot"},
- FunctionInfo{455, D<&IUserShimScopedObject::WriteSaveSlot>, "WriteSaveSlot"},
- FunctionInfo{456, nullptr, "FlushSaveSlot"},
- FunctionInfo{457, nullptr, "CommitSaveData"}
- );
};
class IUserService final : public ServiceFramework<IUserService> {
public:
- explicit IUserService(Core::System& system_) : ServiceFramework(system_, "stpl:u") {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit IUserService(Core::System& system_) : ServiceFramework(system_, "stpl:u") {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0 , D<&IUserService::Cmd0>, "Cmd0"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
Result Cmd0(u32 unk0, OutInterface<IUserShimScopedObject> out_interface) {
LOG_WARNING(Service_NGC, "stubbed");
*out_interface = std::make_shared<IUserShimScopedObject>(system);
R_SUCCEED();
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IUserService::Cmd0>, "Cmd0"}
- );
};
class ISystemShimScopedObject final : public ServiceFramework<ISystemShimScopedObject> {
public:
- explicit ISystemShimScopedObject(Core::System& system_) : ServiceFramework(system_, "ISystemShimScopedObject") {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit ISystemShimScopedObject(Core::System& system_) : ServiceFramework(system_, "ISystemShimScopedObject") {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {106, nullptr, "Cmd106"},
+ {107, nullptr, "Cmd107"},
+ {108, D<&ISystemShimScopedObject::Cmd108>, "Cmd108"},
+ {207, nullptr, "Cmd207"},
+ {208, D<&ISystemShimScopedObject::Cmd208>, "Cmd208"},
+ {209, nullptr, "Cmd209"},
+ {210, nullptr, "Cmd210"},
+ {211, nullptr, "Cmd211"},
+ {212, nullptr, "Cmd212"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
Result Cmd108() {
@@ -248,36 +257,23 @@ public:
LOG_WARNING(Service_NGC, "stubbed");
R_THROW(IPC::ResultNotSupported);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{106, nullptr, "Cmd106"},
- FunctionInfo{107, nullptr, "Cmd107"},
- FunctionInfo{108, D<&ISystemShimScopedObject::Cmd108>, "Cmd108"},
- FunctionInfo{207, nullptr, "Cmd207"},
- FunctionInfo{208, D<&ISystemShimScopedObject::Cmd208>, "Cmd208"},
- FunctionInfo{209, nullptr, "Cmd209"},
- FunctionInfo{210, nullptr, "Cmd210"},
- FunctionInfo{211, nullptr, "Cmd211"},
- FunctionInfo{212, nullptr, "Cmd212"}
- );
};
class ISystemService final : public ServiceFramework<ISystemService> {
public:
- explicit ISystemService(Core::System& system_) : ServiceFramework(system_, "stpl:sys") {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit ISystemService(Core::System& system_) : ServiceFramework(system_, "stpl:sys") {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0 , D<&ISystemService::Cmd0>, "Cmd0"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
Result Cmd0(OutInterface<ISystemShimScopedObject> out_interface) {
LOG_WARNING(Service_NGC, "stubbed");
*out_interface = std::make_shared<ISystemShimScopedObject>(system);
R_SUCCEED();
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&ISystemService::Cmd0>, "Cmd0"}
- );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/ngc/ngc.h b/src/core/hle/service/ngc/ngc.h
index 823b1aa819..7dc4a46577 100644
--- a/src/core/hle/service/ngc/ngc.h
+++ b/src/core/hle/service/ngc/ngc.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/nifm/nifm.cpp b/src/core/hle/service/nifm/nifm.cpp
index 5befe8e943..efada9b807 100644
--- a/src/core/hle/service/nifm/nifm.cpp
+++ b/src/core/hle/service/nifm/nifm.cpp
@@ -235,6 +235,15 @@ public:
explicit IScanRequest(Core::System& system_)
: ServiceFramework{system_, "IScanRequest"}, svc_ctx{system_, "IScanRequest"} {
+ static const FunctionInfo functions[] = {
+ {0, &IScanRequest::Submit, "Submit"},
+ {1, &IScanRequest::IsProcessing, "IsProcessing"},
+ {2, &IScanRequest::GetResult, "GetResult"},
+ {3, &IScanRequest::GetSystemEventReadableHandle, "GetSystemEventReadableHandle"},
+ {4, &IScanRequest::SetChannels, "SetChannels"},
+ };
+ RegisterHandlers(functions);
+
evt_scan_complete = CreateKEvent(svc_ctx, "IScanRequest:Complete");
evt_processing = CreateKEvent(svc_ctx, "IScanRequest:Processing");
}
@@ -248,6 +257,8 @@ public:
}
private:
+ std::vector<Network::ScanData> scan_results;
+
void Submit(HLERequestContext& ctx) {
if (state.load() == State::Finished) {
@@ -318,17 +329,6 @@ private:
evt_scan_complete->Signal(system.Kernel());
}
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &IScanRequest::Submit, "Submit"},
- FunctionInfo{1, &IScanRequest::IsProcessing, "IsProcessing"},
- FunctionInfo{2, &IScanRequest::GetResult, "GetResult"},
- FunctionInfo{3, &IScanRequest::GetSystemEventReadableHandle, "GetSystemEventReadableHandle"},
- FunctionInfo{4, &IScanRequest::SetChannels, "SetChannels"}
- );
- std::vector<Network::ScanData> scan_results;
KernelHelpers::ServiceContext svc_ctx;
Kernel::KEvent* evt_scan_complete{};
@@ -342,6 +342,36 @@ class IRequest final : public ServiceFramework<IRequest> {
public:
explicit IRequest(Core::System& system_)
: ServiceFramework{system_, "IRequest"}, service_context{system_, "IRequest"} {
+ static const FunctionInfo functions[] = {
+ {0, &IRequest::GetRequestState, "GetRequestState"},
+ {1, &IRequest::GetResult, "GetResult"},
+ {2, &IRequest::GetSystemEventReadableHandles, "GetSystemEventReadableHandles"},
+ {3, &IRequest::Cancel, "Cancel"},
+ {4, &IRequest::Submit, "Submit"},
+ {5, nullptr, "SetRequirement"},
+ {6, &IRequest::SetRequirementPreset, "SetRequirementPreset"},
+ {8, nullptr, "SetPriority"},
+ {9, &IRequest::SetNetworkProfileId, "SetNetworkProfileId"},
+ {10, nullptr, "SetRejectable"},
+ {11, &IRequest::SetConnectionConfirmationOption, "SetConnectionConfirmationOption"},
+ {12, nullptr, "SetPersistent"},
+ {13, nullptr, "SetInstant"},
+ {14, nullptr, "SetSustainable"},
+ {15, nullptr, "SetRawPriority"},
+ {16, nullptr, "SetGreedy"},
+ {17, nullptr, "SetSharable"},
+ {18, nullptr, "SetRequirementByRevision"},
+ {19, nullptr, "GetRequirement"},
+ {20, nullptr, "GetRevision"},
+ {21, &IRequest::GetAppletInfo, "GetAppletInfo"},
+ {22, nullptr, "GetAdditionalInfo"},
+ {23, nullptr, "SetKeptInSleep"},
+ {24, nullptr, "RegisterSocketDescriptor"},
+ {25, nullptr, "UnregisterSocketDescriptor"},
+ {26, nullptr, "GetNetworkAccessStatus"}, //21.0.0+
+ };
+ RegisterHandlers(functions);
+
event1 = CreateKEvent(service_context, "IRequest:Event1");
event2 = CreateKEvent(service_context, "IRequest:Event2");
state = RequestState::NotSubmitted;
@@ -464,37 +494,6 @@ private:
event1->Signal(system.Kernel());
}
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &IRequest::GetRequestState, "GetRequestState"},
- FunctionInfo{1, &IRequest::GetResult, "GetResult"},
- FunctionInfo{2, &IRequest::GetSystemEventReadableHandles, "GetSystemEventReadableHandles"},
- FunctionInfo{3, &IRequest::Cancel, "Cancel"},
- FunctionInfo{4, &IRequest::Submit, "Submit"},
- FunctionInfo{5, nullptr, "SetRequirement"},
- FunctionInfo{6, &IRequest::SetRequirementPreset, "SetRequirementPreset"},
- FunctionInfo{8, nullptr, "SetPriority"},
- FunctionInfo{9, &IRequest::SetNetworkProfileId, "SetNetworkProfileId"},
- FunctionInfo{10, nullptr, "SetRejectable"},
- FunctionInfo{11, &IRequest::SetConnectionConfirmationOption, "SetConnectionConfirmationOption"},
- FunctionInfo{12, nullptr, "SetPersistent"},
- FunctionInfo{13, nullptr, "SetInstant"},
- FunctionInfo{14, nullptr, "SetSustainable"},
- FunctionInfo{15, nullptr, "SetRawPriority"},
- FunctionInfo{16, nullptr, "SetGreedy"},
- FunctionInfo{17, nullptr, "SetSharable"},
- FunctionInfo{18, nullptr, "SetRequirementByRevision"},
- FunctionInfo{19, nullptr, "GetRequirement"},
- FunctionInfo{20, nullptr, "GetRevision"},
- FunctionInfo{21, &IRequest::GetAppletInfo, "GetAppletInfo"},
- FunctionInfo{22, nullptr, "GetAdditionalInfo"},
- FunctionInfo{23, nullptr, "SetKeptInSleep"},
- FunctionInfo{24, nullptr, "RegisterSocketDescriptor"},
- FunctionInfo{25, nullptr, "UnregisterSocketDescriptor"},
- FunctionInfo{26, nullptr, "GetNetworkAccessStatus", MakeVersionGate({21,0,0})}
- );
KernelHelpers::ServiceContext service_context;
RequestState state;
@@ -509,16 +508,14 @@ private:
class INetworkProfile final : public ServiceFramework<INetworkProfile> {
public:
- explicit INetworkProfile(Core::System& system_) : ServiceFramework{system_, "INetworkProfile"} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit INetworkProfile(Core::System& system_) : ServiceFramework{system_, "INetworkProfile"} {
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "Update"},
+ {1, nullptr, "PersistOld"},
+ {2, nullptr, "Persist"},
+ };
+ RegisterHandlers(functions);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "Update"},
- FunctionInfo{1, nullptr, "PersistOld"},
- FunctionInfo{2, nullptr, "Persist"}
- );
};
void IGeneralService::GetClientId(HLERequestContext& ctx) {
@@ -1053,70 +1050,78 @@ void IGeneralService::GetCurrentAccessPoint(HLERequestContext& ctx) {
rb.Push(ResultSuccess);
}
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IGeneralService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{1, &IGeneralService::GetClientId, "GetClientId"},
- FunctionInfo{2, &IGeneralService::CreateScanRequest, "CreateScanRequest"},
- FunctionInfo{4, &IGeneralService::CreateRequest, "CreateRequest"},
- FunctionInfo{5, &IGeneralService::GetCurrentNetworkProfile, "GetCurrentNetworkProfile"},
- FunctionInfo{6, &IGeneralService::EnumerateNetworkInterfaces, "EnumerateNetworkInterfaces"},
- FunctionInfo{7, &IGeneralService::EnumerateNetworkProfiles, "EnumerateNetworkProfiles"},
- FunctionInfo{8, &IGeneralService::GetNetworkProfile, "GetNetworkProfile"},
- FunctionInfo{9, &IGeneralService::SetNetworkProfile, "SetNetworkProfile"},
- FunctionInfo{10, &IGeneralService::RemoveNetworkProfile, "RemoveNetworkProfile"},
- FunctionInfo{11, &IGeneralService::GetScanData, "GetScanDataOld"},
- FunctionInfo{12, &IGeneralService::GetCurrentIpAddress, "GetCurrentIpAddress"},
- FunctionInfo{13, nullptr, "GetCurrentAccessPointOld"},
- FunctionInfo{14, &IGeneralService::CreateTemporaryNetworkProfile, "CreateTemporaryNetworkProfile"},
- FunctionInfo{15, &IGeneralService::GetCurrentIpConfigInfo, "GetCurrentIpConfigInfo"},
- FunctionInfo{16, &IGeneralService::SetWirelessCommunicationEnabled, "SetWirelessCommunicationEnabled"},
- FunctionInfo{17, &IGeneralService::IsWirelessCommunicationEnabled, "IsWirelessCommunicationEnabled"},
- FunctionInfo{18, &IGeneralService::GetInternetConnectionStatus, "GetInternetConnectionStatus"},
- FunctionInfo{19, &IGeneralService::SetEthernetCommunicationEnabled, "SetEthernetCommunicationEnabled"},
- FunctionInfo{20, &IGeneralService::IsEthernetCommunicationEnabled, "IsEthernetCommunicationEnabled"},
- FunctionInfo{21, &IGeneralService::IsAnyInternetRequestAccepted, "IsAnyInternetRequestAccepted"},
- FunctionInfo{22, &IGeneralService::IsAnyForegroundRequestAccepted, "IsAnyForegroundRequestAccepted"},
- FunctionInfo{23, nullptr, "PutToSleep"},
- FunctionInfo{24, nullptr, "WakeUp"},
- FunctionInfo{25, &IGeneralService::GetSsidListVersion, "GetSsidListVersion"},
- FunctionInfo{26, nullptr, "SetExclusiveClient"},
- FunctionInfo{27, nullptr, "GetDefaultIpSetting"},
- FunctionInfo{28, nullptr, "SetDefaultIpSetting"},
- FunctionInfo{29, nullptr, "SetWirelessCommunicationEnabledForTest"},
- FunctionInfo{30, nullptr, "SetEthernetCommunicationEnabledForTest"},
- FunctionInfo{31, nullptr, "GetTelemetorySystemEventReadableHandle"},
- FunctionInfo{32, nullptr, "GetTelemetryInfo"},
- FunctionInfo{33, &IGeneralService::ConfirmSystemAvailability, "ConfirmSystemAvailability", MakeVersionGate({2,0,0})},
- FunctionInfo{34, &IGeneralService::SetBackgroundRequestEnabled, "SetBackgroundRequestEnabled", MakeVersionGate({4,0,0})},
- FunctionInfo{35, &IGeneralService::GetScanDataV2, "GetScanData"},
- FunctionInfo{36, &IGeneralService::GetCurrentAccessPoint, "GetCurrentAccessPoint"},
- FunctionInfo{37, nullptr, "Shutdown"},
- FunctionInfo{38, nullptr, "GetAllowedChannels"},
- FunctionInfo{39, nullptr, "NotifyApplicationSuspended"},
- FunctionInfo{40, nullptr, "SetAcceptableNetworkTypeFlag"},
- FunctionInfo{41, nullptr, "GetAcceptableNetworkTypeFlag"},
- FunctionInfo{42, nullptr, "NotifyConnectionStateChanged"},
- FunctionInfo{43, nullptr, "SetWowlDelayedWakeTime"},
- FunctionInfo{44, nullptr, "IsWiredConnectionAvailable", MakeVersionGate({18,0,0})},
- FunctionInfo{45, nullptr, "IsNetworkEmulationFeatureEnabled", MakeVersionGate({18,0,0})},
- FunctionInfo{46, nullptr, "SelectActiveNetworkEmulationProfileIdForDebug", MakeVersionGate({18,0,0})},
- FunctionInfo{47, &IGeneralService::GetScanDataV3, "GetScanData", MakeVersionGate({19,0,0})},
- FunctionInfo{50, nullptr, "IsRewriteFeatureEnabled", MakeVersionGate({18,0,0})},
- FunctionInfo{51, nullptr, "CreateRewriteRule", MakeVersionGate({18,0,0})},
- FunctionInfo{52, nullptr, "DestroyRewriteRule", MakeVersionGate({18,0,0})}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IGeneralService::IGeneralService(Core::System& system_)
: ServiceFramework{system_, "IGeneralService"} {
+ // clang-format off
+
+ static const FunctionInfo functions[] = {
+ {1, &IGeneralService::GetClientId, "GetClientId"},
+ {2, &IGeneralService::CreateScanRequest, "CreateScanRequest"},
+ {4, &IGeneralService::CreateRequest, "CreateRequest"},
+ {5, &IGeneralService::GetCurrentNetworkProfile, "GetCurrentNetworkProfile"},
+ {6, &IGeneralService::EnumerateNetworkInterfaces, "EnumerateNetworkInterfaces"},
+ {7, &IGeneralService::EnumerateNetworkProfiles, "EnumerateNetworkProfiles"},
+ {8, &IGeneralService::GetNetworkProfile, "GetNetworkProfile"},
+ {9, &IGeneralService::SetNetworkProfile, "SetNetworkProfile"},
+ {10, &IGeneralService::RemoveNetworkProfile, "RemoveNetworkProfile"},
+ {11, &IGeneralService::GetScanData, "GetScanDataOld"},
+ {12, &IGeneralService::GetCurrentIpAddress, "GetCurrentIpAddress"},
+ {13, nullptr, "GetCurrentAccessPointOld"},
+ {14, &IGeneralService::CreateTemporaryNetworkProfile, "CreateTemporaryNetworkProfile"},
+ {15, &IGeneralService::GetCurrentIpConfigInfo, "GetCurrentIpConfigInfo"},
+ {16, &IGeneralService::SetWirelessCommunicationEnabled, "SetWirelessCommunicationEnabled"},
+ {17, &IGeneralService::IsWirelessCommunicationEnabled, "IsWirelessCommunicationEnabled"},
+ {18, &IGeneralService::GetInternetConnectionStatus, "GetInternetConnectionStatus"},
+ {19, &IGeneralService::SetEthernetCommunicationEnabled, "SetEthernetCommunicationEnabled"},
+ {20, &IGeneralService::IsEthernetCommunicationEnabled, "IsEthernetCommunicationEnabled"},
+ {21, &IGeneralService::IsAnyInternetRequestAccepted, "IsAnyInternetRequestAccepted"},
+ {22, &IGeneralService::IsAnyForegroundRequestAccepted, "IsAnyForegroundRequestAccepted"},
+ {23, nullptr, "PutToSleep"},
+ {24, nullptr, "WakeUp"},
+ {25, &IGeneralService::GetSsidListVersion, "GetSsidListVersion"},
+ {26, nullptr, "SetExclusiveClient"},
+ {27, nullptr, "GetDefaultIpSetting"},
+ {28, nullptr, "SetDefaultIpSetting"},
+ {29, nullptr, "SetWirelessCommunicationEnabledForTest"},
+ {30, nullptr, "SetEthernetCommunicationEnabledForTest"},
+ {31, nullptr, "GetTelemetorySystemEventReadableHandle"},
+ {32, nullptr, "GetTelemetryInfo"},
+ {33, &IGeneralService::ConfirmSystemAvailability, "ConfirmSystemAvailability"}, // 2.0.0+
+ {34, &IGeneralService::SetBackgroundRequestEnabled, "SetBackgroundRequestEnabled"}, // 4.0.0+
+ {35, &IGeneralService::GetScanDataV2, "GetScanData"},
+ {36, &IGeneralService::GetCurrentAccessPoint, "GetCurrentAccessPoint"},
+ {37, nullptr, "Shutdown"},
+ {38, nullptr, "GetAllowedChannels"},
+ {39, nullptr, "NotifyApplicationSuspended"},
+ {40, nullptr, "SetAcceptableNetworkTypeFlag"},
+ {41, nullptr, "GetAcceptableNetworkTypeFlag"},
+ {42, nullptr, "NotifyConnectionStateChanged"},
+ {43, nullptr, "SetWowlDelayedWakeTime"},
+ {44, nullptr, "IsWiredConnectionAvailable"}, // 18.0.0+
+ {45, nullptr, "IsNetworkEmulationFeatureEnabled"}, // 18.0.0+
+ {46, nullptr, "SelectActiveNetworkEmulationProfileIdForDebug"}, // 18.0.0+
+ {47, &IGeneralService::GetScanDataV3, "GetScanData"}, // 19.0.0+
+ {50, nullptr, "IsRewriteFeatureEnabled"}, // 18.0.0+
+ {51, nullptr, "CreateRewriteRule"}, // 18.0.0+
+ {52, nullptr, "DestroyRewriteRule"} // 18.0.0+
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IGeneralService::~IGeneralService() = default;
class NetworkInterface final : public ServiceFramework<NetworkInterface> {
public:
- explicit NetworkInterface(const char* name, Core::System& system_) : ServiceFramework{system_, name} {}
+ explicit NetworkInterface(const char* name, Core::System& system_)
+ : ServiceFramework{system_, name} {
+ static const FunctionInfo functions[] = {
+ {4, &NetworkInterface::CreateGeneralServiceOld, "CreateGeneralServiceOld"},
+ {5, &NetworkInterface::CreateGeneralService, "CreateGeneralService"},
+ };
+ RegisterHandlers(functions);
+ }
private:
void CreateGeneralServiceOld(HLERequestContext& ctx) {
@@ -1134,14 +1139,6 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<IGeneralService>(ctx, system);
}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{4, &NetworkInterface::CreateGeneralServiceOld, "CreateGeneralServiceOld"},
- FunctionInfo{5, &NetworkInterface::CreateGeneralService, "CreateGeneralService"}
- );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/nifm/nifm.h b/src/core/hle/service/nifm/nifm.h
index 3f3535fa93..44859e0c51 100644
--- a/src/core/hle/service/nifm/nifm.h
+++ b/src/core/hle/service/nifm/nifm.h
@@ -51,7 +51,6 @@ private:
void SetBackgroundRequestEnabled(HLERequestContext& ctx);
void GetCurrentAccessPoint(HLERequestContext& ctx);
void GetScanDataV3(HLERequestContext& ctx);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::NIFM
diff --git a/src/core/hle/service/nim/nim.cpp b/src/core/hle/service/nim/nim.cpp
index c48bf54646..e5f2d85dde 100644
--- a/src/core/hle/service/nim/nim.cpp
+++ b/src/core/hle/service/nim/nim.cpp
@@ -24,13 +24,22 @@ namespace Service::NIM {
class IShopServiceAsync final : public ServiceFramework<IShopServiceAsync> {
public:
explicit IShopServiceAsync(Core::System& system_)
- : ServiceFramework{system_, "IShopServiceAsync"}
- , service_context{system_, "IShopServiceAsync"} {
- completion_event = service_context.CreateEvent("IShopServiceAsync:Completion");
- }
+ : ServiceFramework{system_, "IShopServiceAsync"},
+ service_context{system_, "IShopServiceAsync"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IShopServiceAsync::Cancel>, "Cancel"},
+ {1, D<&IShopServiceAsync::GetSize>, "GetSize"},
+ {2, D<&IShopServiceAsync::Read>, "Read"},
+ {3, D<&IShopServiceAsync::GetErrorCode>, "GetErrorCode"},
+ {4, D<&IShopServiceAsync::Request>, "Request"},
+ {5, D<&IShopServiceAsync::Prepare>, "Prepare"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ completion_event = service_context.CreateEvent("IShopServiceAsync:Completion");
}
~IShopServiceAsync() override {
@@ -43,6 +52,15 @@ public:
}
private:
+ KernelHelpers::ServiceContext service_context;
+ Kernel::KEvent* completion_event;
+
+ std::jthread worker;
+ std::atomic<u32> error_code{0};
+
+ std::mutex data_mutex;
+ std::vector<u8> download_data;
+
void CancelImpl() {
worker.request_stop();
if (worker.joinable()) {
@@ -118,30 +136,19 @@ private:
}
R_SUCCEED();
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IShopServiceAsync::Cancel>, "Cancel"},
- FunctionInfo{1, D<&IShopServiceAsync::GetSize>, "GetSize"},
- FunctionInfo{2, D<&IShopServiceAsync::Read>, "Read"},
- FunctionInfo{3, D<&IShopServiceAsync::GetErrorCode>, "GetErrorCode"},
- FunctionInfo{4, D<&IShopServiceAsync::Request>, "Request"},
- FunctionInfo{5, D<&IShopServiceAsync::Prepare>, "Prepare"}
- );
- KernelHelpers::ServiceContext service_context;
- Kernel::KEvent* completion_event;
- std::jthread worker;
- std::atomic<u32> error_code{0};
- std::mutex data_mutex;
- std::vector<u8> download_data;
};
class IShopServiceAccessor final : public ServiceFramework<IShopServiceAccessor> {
public:
explicit IShopServiceAccessor(Core::System& system_)
- : ServiceFramework{system_, "IShopServiceAccessor"} {}
+ : ServiceFramework{system_, "IShopServiceAccessor"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &IShopServiceAccessor::CreateAsyncInterface, "CreateAsyncInterface"},
+ };
+ // clang-format on
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
private:
@@ -153,19 +160,19 @@ private:
rb.PushCopyObjects(ctx, async_interface->GetEvent());
rb.PushIpcInterface<IShopServiceAsync>(ctx, std::move(async_interface));
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &IShopServiceAccessor::CreateAsyncInterface, "CreateAsyncInterface"}
- );
};
class IShopServiceAccessServer final : public ServiceFramework<IShopServiceAccessServer> {
public:
explicit IShopServiceAccessServer(Core::System& system_)
- : ServiceFramework{system_, "IShopServiceAccessServer"} {}
+ : ServiceFramework{system_, "IShopServiceAccessServer"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &IShopServiceAccessServer::CreateAccessorInterface, "CreateAccessorInterface"},
+ };
+ // clang-format on
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
private:
@@ -175,252 +182,258 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<IShopServiceAccessor>(ctx, system);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &IShopServiceAccessServer::CreateAccessorInterface, "CreateAccessorInterface"}
- );
};
class NIM final : public ServiceFramework<NIM> {
public:
- explicit NIM(Core::System& system_) : ServiceFramework{system_, "nim"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "CreateSystemUpdateTask"},
- FunctionInfo{1, nullptr, "DestroySystemUpdateTask"},
- FunctionInfo{2, nullptr, "ListSystemUpdateTask"},
- FunctionInfo{3, nullptr, "RequestSystemUpdateTaskRun"},
- FunctionInfo{4, nullptr, "GetSystemUpdateTaskInfo"},
- FunctionInfo{5, nullptr, "CommitSystemUpdateTask"},
- FunctionInfo{6, nullptr, "CreateNetworkInstallTask"},
- FunctionInfo{7, nullptr, "DestroyNetworkInstallTask"},
- FunctionInfo{8, nullptr, "ListNetworkInstallTask"},
- FunctionInfo{9, nullptr, "RequestNetworkInstallTaskRun"},
- FunctionInfo{10, nullptr, "GetNetworkInstallTaskInfo"},
- FunctionInfo{11, nullptr, "CommitNetworkInstallTask"},
- FunctionInfo{12, nullptr, "RequestLatestSystemUpdateMeta"},
- FunctionInfo{14, nullptr, "ListApplicationNetworkInstallTask"},
- FunctionInfo{15, nullptr, "ListNetworkInstallTaskContentMeta"},
- FunctionInfo{16, nullptr, "RequestLatestVersion"},
- FunctionInfo{17, nullptr, "SetNetworkInstallTaskAttribute"},
- FunctionInfo{18, nullptr, "AddNetworkInstallTaskContentMeta"},
- FunctionInfo{19, nullptr, "GetDownloadedSystemDataPath"},
- FunctionInfo{20, nullptr, "CalculateNetworkInstallTaskRequiredSize"},
- FunctionInfo{21, nullptr, "IsExFatDriverIncluded"},
- FunctionInfo{22, nullptr, "GetBackgroundDownloadStressTaskInfo"},
- FunctionInfo{23, nullptr, "RequestDeviceAuthenticationToken"},
- FunctionInfo{24, nullptr, "RequestGameCardRegistrationStatus"},
- FunctionInfo{25, nullptr, "RequestRegisterGameCard"},
- FunctionInfo{26, nullptr, "RequestRegisterNotificationToken"},
- FunctionInfo{27, nullptr, "RequestDownloadTaskList"},
- FunctionInfo{28, nullptr, "RequestApplicationControl"},
- FunctionInfo{29, nullptr, "RequestLatestApplicationControl"},
- FunctionInfo{30, nullptr, "RequestVersionList"},
- FunctionInfo{31, nullptr, "CreateApplyDeltaTask"},
- FunctionInfo{32, nullptr, "DestroyApplyDeltaTask"},
- FunctionInfo{33, nullptr, "ListApplicationApplyDeltaTask"},
- FunctionInfo{34, nullptr, "RequestApplyDeltaTaskRun"},
- FunctionInfo{35, nullptr, "GetApplyDeltaTaskInfo"},
- FunctionInfo{36, nullptr, "ListApplyDeltaTask"},
- FunctionInfo{37, nullptr, "CommitApplyDeltaTask"},
- FunctionInfo{38, nullptr, "CalculateApplyDeltaTaskRequiredSize"},
- FunctionInfo{39, nullptr, "PrepareShutdown"},
- FunctionInfo{40, nullptr, "ListApplyDeltaTask"},
- FunctionInfo{41, nullptr, "ClearNotEnoughSpaceStateOfApplyDeltaTask"},
- FunctionInfo{42, nullptr, "CreateApplyDeltaTaskFromDownloadTask"},
- FunctionInfo{43, nullptr, "GetBackgroundApplyDeltaStressTaskInfo"},
- FunctionInfo{44, nullptr, "GetApplyDeltaTaskRequiredStorage"},
- FunctionInfo{45, nullptr, "CalculateNetworkInstallTaskContentsSize"},
- FunctionInfo{46, nullptr, "PrepareShutdownForSystemUpdate"},
- FunctionInfo{47, nullptr, "FindMaxRequiredApplicationVersionOfTask"},
- FunctionInfo{48, nullptr, "CommitNetworkInstallTaskPartially"},
- FunctionInfo{49, nullptr, "ListNetworkInstallTaskCommittedContentMeta"},
- FunctionInfo{50, nullptr, "ListNetworkInstallTaskNotCommittedContentMeta"},
- FunctionInfo{51, nullptr, "FindMaxRequiredSystemVersionOfTask"},
- FunctionInfo{52, nullptr, "GetNetworkInstallTaskErrorContext"},
- FunctionInfo{53, nullptr, "CreateLocalCommunicationReceiveApplicationTask"},
- FunctionInfo{54, nullptr, "DestroyLocalCommunicationReceiveApplicationTask"},
- FunctionInfo{55, nullptr, "ListLocalCommunicationReceiveApplicationTask"},
- FunctionInfo{56, nullptr, "RequestLocalCommunicationReceiveApplicationTaskRun"},
- FunctionInfo{57, nullptr, "GetLocalCommunicationReceiveApplicationTaskInfo"},
- FunctionInfo{58, nullptr, "CommitLocalCommunicationReceiveApplicationTask"},
- FunctionInfo{59, nullptr, "ListLocalCommunicationReceiveApplicationTaskContentMeta"},
- FunctionInfo{60, nullptr, "CreateLocalCommunicationSendApplicationTask"},
- FunctionInfo{61, nullptr, "RequestLocalCommunicationSendApplicationTaskRun"},
- FunctionInfo{62, nullptr, "GetLocalCommunicationReceiveApplicationTaskErrorContext"},
- FunctionInfo{63, nullptr, "GetLocalCommunicationSendApplicationTaskInfo"},
- FunctionInfo{64, nullptr, "DestroyLocalCommunicationSendApplicationTask"},
- FunctionInfo{65, nullptr, "GetLocalCommunicationSendApplicationTaskErrorContext"},
- FunctionInfo{66, nullptr, "CalculateLocalCommunicationReceiveApplicationTaskRequiredSize"},
- FunctionInfo{67, nullptr, "ListApplicationLocalCommunicationReceiveApplicationTask"},
- FunctionInfo{68, nullptr, "ListApplicationLocalCommunicationSendApplicationTask"},
- FunctionInfo{69, nullptr, "CreateLocalCommunicationReceiveSystemUpdateTask"},
- FunctionInfo{70, nullptr, "DestroyLocalCommunicationReceiveSystemUpdateTask"},
- FunctionInfo{71, nullptr, "ListLocalCommunicationReceiveSystemUpdateTask"},
- FunctionInfo{72, nullptr, "RequestLocalCommunicationReceiveSystemUpdateTaskRun"},
- FunctionInfo{73, nullptr, "GetLocalCommunicationReceiveSystemUpdateTaskInfo"},
- FunctionInfo{74, nullptr, "CommitLocalCommunicationReceiveSystemUpdateTask"},
- FunctionInfo{75, nullptr, "GetLocalCommunicationReceiveSystemUpdateTaskErrorContext"},
- FunctionInfo{76, nullptr, "CreateLocalCommunicationSendSystemUpdateTask"},
- FunctionInfo{77, nullptr, "RequestLocalCommunicationSendSystemUpdateTaskRun"},
- FunctionInfo{78, nullptr, "GetLocalCommunicationSendSystemUpdateTaskInfo"},
- FunctionInfo{79, nullptr, "DestroyLocalCommunicationSendSystemUpdateTask"},
- FunctionInfo{80, nullptr, "GetLocalCommunicationSendSystemUpdateTaskErrorContext"},
- FunctionInfo{81, nullptr, "ListLocalCommunicationSendSystemUpdateTask"},
- FunctionInfo{82, nullptr, "GetReceivedSystemDataPath"},
- FunctionInfo{83, nullptr, "CalculateApplyDeltaTaskOccupiedSize"},
- FunctionInfo{84, nullptr, "ReloadErrorSimulation"},
- FunctionInfo{85, nullptr, "ListNetworkInstallTaskContentMetaFromInstallMeta"},
- FunctionInfo{86, nullptr, "ListNetworkInstallTaskOccupiedSize"},
- FunctionInfo{87, nullptr, "RequestQueryAvailableELicenses"},
- FunctionInfo{88, nullptr, "RequestAssignELicenses"},
- FunctionInfo{89, nullptr, "RequestExtendELicenses"},
- FunctionInfo{90, nullptr, "RequestSyncELicenses"},
- FunctionInfo{91, nullptr, "Unknown91", MakeVersionGate({6,0,0}, {14,1,2})},
- FunctionInfo{92, nullptr, "Unknown92", MakeVersionGate({21,0,0})},
- FunctionInfo{93, nullptr, "RequestReportActiveELicenses"},
- FunctionInfo{94, nullptr, "RequestReportActiveELicensesPassively"},
- FunctionInfo{95, nullptr, "RequestRegisterDynamicRightsNotificationToken"},
- FunctionInfo{96, nullptr, "RequestAssignAllDeviceLinkedELicenses"},
- FunctionInfo{97, nullptr, "RequestRevokeAllELicenses"},
- FunctionInfo{98, nullptr, "RequestPrefetchForDynamicRights"},
- FunctionInfo{99, nullptr, "CreateNetworkInstallTask"},
- FunctionInfo{100, nullptr, "ListNetworkInstallTaskRightsIds"},
- FunctionInfo{101, nullptr, "RequestDownloadETickets"},
- FunctionInfo{102, nullptr, "RequestQueryDownloadableContents"},
- FunctionInfo{103, nullptr, "DeleteNetworkInstallTaskContentMeta"},
- FunctionInfo{104, nullptr, "RequestIssueEdgeTokenForDebug"},
- FunctionInfo{105, nullptr, "RequestQueryAvailableELicenses2"},
- FunctionInfo{106, nullptr, "RequestAssignELicenses2"},
- FunctionInfo{107, nullptr, "GetNetworkInstallTaskStateCounter"},
- FunctionInfo{108, nullptr, "InvalidateDynamicRightsNaIdTokenCacheForDebug"},
- FunctionInfo{109, nullptr, "ListNetworkInstallTaskPartialInstallContentMeta"},
- FunctionInfo{110, nullptr, "ListNetworkInstallTaskRightsIdsFromIndex"},
- FunctionInfo{111, nullptr, "AddNetworkInstallTaskContentMetaForUser"},
- FunctionInfo{112, nullptr, "RequestAssignELicensesAndDownloadETickets"},
- FunctionInfo{113, nullptr, "RequestQueryAvailableCommonELicenses"},
- FunctionInfo{114, nullptr, "SetNetworkInstallTaskExtendedAttribute"},
- FunctionInfo{115, nullptr, "GetNetworkInstallTaskExtendedAttribute"},
- FunctionInfo{116, nullptr, "GetAllocatorInfo"},
- FunctionInfo{117, nullptr, "RequestQueryDownloadableContentsByApplicationId"},
- FunctionInfo{118, nullptr, "MarkNoDownloadRightsErrorResolved"},
- FunctionInfo{119, nullptr, "GetApplyDeltaTaskAllAppliedContentMeta"},
- FunctionInfo{120, nullptr, "PrioritizeNetworkInstallTask"},
- FunctionInfo{121, nullptr, "RequestQueryAvailableCommonELicenses2"},
- FunctionInfo{122, nullptr, "RequestAssignCommonELicenses"},
- FunctionInfo{123, nullptr, "RequestAssignCommonELicenses2"},
- FunctionInfo{124, nullptr, "IsNetworkInstallTaskFrontOfQueue"},
- FunctionInfo{125, nullptr, "PrioritizeApplyDeltaTask"},
- FunctionInfo{126, nullptr, "RerouteDownloadingPatch"},
- FunctionInfo{127, nullptr, "UnmarkNoDownloadRightsErrorResolved"},
- FunctionInfo{128, nullptr, "RequestContentsSize"},
- FunctionInfo{129, nullptr, "RequestContentsAuthorizationToken"},
- FunctionInfo{130, nullptr, "RequestCdnVendorDiscovery"},
- FunctionInfo{131, nullptr, "RefreshDebugAvailability"},
- FunctionInfo{132, nullptr, "ClearResponseSimulationEntry"},
- FunctionInfo{133, nullptr, "RegisterResponseSimulationEntry"},
- FunctionInfo{134, nullptr, "GetProcessedCdnVendors"},
- FunctionInfo{135, nullptr, "RefreshRuntimeBehaviorsForDebug"},
- FunctionInfo{136, nullptr, "RequestOnlineSubscriptionFreeTrialAvailability"},
- FunctionInfo{137, nullptr, "GetNetworkInstallTaskContentMetaCount"},
- FunctionInfo{138, nullptr, "RequestRevokeELicenses"},
- FunctionInfo{139, nullptr, "EnableNetworkConnectionToUseApplicationCore"},
- FunctionInfo{140, nullptr, "DisableNetworkConnectionToUseApplicationCore"},
- FunctionInfo{141, nullptr, "IsNetworkConnectionEnabledToUseApplicationCore"},
- FunctionInfo{142, nullptr, "RequestCheckSafeSystemVersion"},
- FunctionInfo{143, nullptr, "RequestApplicationIcon"},
- FunctionInfo{144, nullptr, "RequestDownloadIdbeIconFile"},
- FunctionInfo{147, nullptr, "Unknown147", MakeVersionGate({18,0,0})},
- FunctionInfo{148, nullptr, "Unknown148", MakeVersionGate({18,0,0})},
- FunctionInfo{150, nullptr, "Unknown150", MakeVersionGate({19,0,0})},
- FunctionInfo{151, nullptr, "Unknown151", MakeVersionGate({20,0,0})},
- FunctionInfo{152, nullptr, "Unknown152", MakeVersionGate({20,0,0})},
- FunctionInfo{153, nullptr, "Unknown153", MakeVersionGate({20,0,0})},
- FunctionInfo{154, nullptr, "Unknown154", MakeVersionGate({20,0,0})},
- FunctionInfo{155, nullptr, "Unknown155", MakeVersionGate({20,0,0})},
- FunctionInfo{156, nullptr, "Unknown156", MakeVersionGate({20,0,0})},
- FunctionInfo{157, nullptr, "Unknown157", MakeVersionGate({20,0,0})},
- FunctionInfo{158, nullptr, "Unknown158", MakeVersionGate({20,0,0})},
- FunctionInfo{159, nullptr, "Unknown159", MakeVersionGate({20,0,0})},
- FunctionInfo{160, nullptr, "Unknown160", MakeVersionGate({20,0,0})},
- FunctionInfo{161, nullptr, "Unknown161", MakeVersionGate({20,0,0})},
- FunctionInfo{162, nullptr, "Unknown162", MakeVersionGate({20,0,0})},
- FunctionInfo{163, nullptr, "Unknown163", MakeVersionGate({20,0,0})},
- FunctionInfo{164, nullptr, "Unknown164", MakeVersionGate({20,0,0})},
- FunctionInfo{165, nullptr, "Unknown165", MakeVersionGate({20,0,0})},
- FunctionInfo{166, nullptr, "Unknown166", MakeVersionGate({20,0,0})},
- FunctionInfo{167, nullptr, "Unknown167", MakeVersionGate({20,0,0})},
- FunctionInfo{168, nullptr, "Unknown168", MakeVersionGate({20,0,0})},
- FunctionInfo{169, nullptr, "Unknown169", MakeVersionGate({20,0,0})},
- FunctionInfo{170, nullptr, "Unknown170", MakeVersionGate({20,0,0})},
- FunctionInfo{171, nullptr, "Unknown171", MakeVersionGate({20,0,0})},
- FunctionInfo{172, nullptr, "Unknown172", MakeVersionGate({20,0,0})},
- FunctionInfo{173, nullptr, "Unknown173", MakeVersionGate({20,0,0})},
- FunctionInfo{174, nullptr, "Unknown174", MakeVersionGate({20,0,0})},
- FunctionInfo{175, nullptr, "Unknown175", MakeVersionGate({20,0,0})},
- FunctionInfo{176, nullptr, "Unknown176", MakeVersionGate({20,0,0})},
- FunctionInfo{177, nullptr, "Unknown177", MakeVersionGate({20,0,0})},
- FunctionInfo{2000, nullptr, "Unknown2000", MakeVersionGate({20,0,0})},
- FunctionInfo{2001, nullptr, "Unknown2001", MakeVersionGate({20,0,0})},
- FunctionInfo{2002, nullptr, "Unknown2002", MakeVersionGate({20,0,0})},
- FunctionInfo{2003, nullptr, "Unknown2003", MakeVersionGate({20,0,0})},
- FunctionInfo{2004, nullptr, "Unknown2004", MakeVersionGate({20,0,0})},
- FunctionInfo{2007, nullptr, "Unknown2007", MakeVersionGate({20,0,0})},
- FunctionInfo{2011, nullptr, "Unknown2011", MakeVersionGate({20,0,0})},
- FunctionInfo{2012, nullptr, "Unknown2012", MakeVersionGate({20,0,0})},
- FunctionInfo{2013, nullptr, "Unknown2013", MakeVersionGate({20,0,0})},
- FunctionInfo{2014, nullptr, "Unknown2014", MakeVersionGate({20,0,0})},
- FunctionInfo{2015, nullptr, "Unknown2015", MakeVersionGate({20,0,0})},
- FunctionInfo{2016, nullptr, "Unknown2016", MakeVersionGate({20,0,0})},
- FunctionInfo{2017, nullptr, "Unknown2017", MakeVersionGate({20,0,0})},
- FunctionInfo{2018, nullptr, "Unknown2018", MakeVersionGate({20,0,0})},
- FunctionInfo{2019, nullptr, "Unknown2019", MakeVersionGate({20,0,0})},
- FunctionInfo{2020, nullptr, "Unknown2020", MakeVersionGate({20,0,0})},
- FunctionInfo{2021, nullptr, "Unknown2021", MakeVersionGate({20,0,0})},
- FunctionInfo{2022, nullptr, "Unknown2022", MakeVersionGate({20,0,0})},
- FunctionInfo{2023, nullptr, "Unknown2023", MakeVersionGate({20,0,0})},
- FunctionInfo{2024, nullptr, "Unknown2024", MakeVersionGate({20,0,0})},
- FunctionInfo{2025, nullptr, "Unknown2025", MakeVersionGate({20,0,0})},
- FunctionInfo{2026, nullptr, "Unknown2026", MakeVersionGate({20,0,0})},
- FunctionInfo{2027, nullptr, "Unknown2027", MakeVersionGate({20,0,0})},
- FunctionInfo{2028, nullptr, "Unknown2028", MakeVersionGate({20,0,0})},
- FunctionInfo{2029, nullptr, "Unknown2029", MakeVersionGate({20,0,0})},
- FunctionInfo{2030, nullptr, "Unknown2030", MakeVersionGate({20,0,0})},
- FunctionInfo{2031, nullptr, "Unknown2031", MakeVersionGate({20,0,0})},
- FunctionInfo{2032, nullptr, "Unknown2032", MakeVersionGate({20,0,0})},
- FunctionInfo{2033, nullptr, "Unknown2033", MakeVersionGate({20,0,0})},
- FunctionInfo{2034, nullptr, "Unknown2034", MakeVersionGate({20,0,0})},
- FunctionInfo{2035, nullptr, "Unknown2035", MakeVersionGate({20,0,0})},
- FunctionInfo{2036, nullptr, "Unknown2036", MakeVersionGate({20,0,0})},
- FunctionInfo{2037, nullptr, "Unknown2037", MakeVersionGate({20,0,0})},
- FunctionInfo{2038, nullptr, "Unknown2038", MakeVersionGate({20,0,0})},
- FunctionInfo{2039, nullptr, "Unknown2039", MakeVersionGate({20,0,0})},
- FunctionInfo{2040, nullptr, "Unknown2040", MakeVersionGate({20,0,0})},
- FunctionInfo{2041, nullptr, "Unknown2041", MakeVersionGate({20,0,0})},
- FunctionInfo{2042, nullptr, "Unknown2042", MakeVersionGate({20,0,0})},
- FunctionInfo{2043, nullptr, "Unknown2043", MakeVersionGate({20,0,0})},
- FunctionInfo{2044, nullptr, "Unknown2044", MakeVersionGate({20,0,0})},
- FunctionInfo{2045, nullptr, "Unknown2045", MakeVersionGate({20,0,0})},
- FunctionInfo{2046, nullptr, "Unknown2046", MakeVersionGate({20,0,0})},
- FunctionInfo{2047, nullptr, "Unknown2047", MakeVersionGate({20,0,0})},
- FunctionInfo{2048, nullptr, "Unknown2048", MakeVersionGate({20,0,0})},
- FunctionInfo{2049, nullptr, "Unknown2049", MakeVersionGate({20,0,0})},
- FunctionInfo{2050, nullptr, "Unknown2050", MakeVersionGate({20,0,0})},
- FunctionInfo{2051, nullptr, "Unknown2051", MakeVersionGate({20,0,0})},
- FunctionInfo{3000, nullptr, "RequestLatestApplicationIcon", MakeVersionGate({17,0,0})},
- FunctionInfo{3001, nullptr, "RequestDownloadIdbeLatestIconFile", MakeVersionGate({17,0,0})}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit NIM(Core::System& system_) : ServiceFramework{system_, "nim"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "CreateSystemUpdateTask"},
+ {1, nullptr, "DestroySystemUpdateTask"},
+ {2, nullptr, "ListSystemUpdateTask"},
+ {3, nullptr, "RequestSystemUpdateTaskRun"},
+ {4, nullptr, "GetSystemUpdateTaskInfo"},
+ {5, nullptr, "CommitSystemUpdateTask"},
+ {6, nullptr, "CreateNetworkInstallTask"},
+ {7, nullptr, "DestroyNetworkInstallTask"},
+ {8, nullptr, "ListNetworkInstallTask"},
+ {9, nullptr, "RequestNetworkInstallTaskRun"},
+ {10, nullptr, "GetNetworkInstallTaskInfo"},
+ {11, nullptr, "CommitNetworkInstallTask"},
+ {12, nullptr, "RequestLatestSystemUpdateMeta"},
+ {14, nullptr, "ListApplicationNetworkInstallTask"},
+ {15, nullptr, "ListNetworkInstallTaskContentMeta"},
+ {16, nullptr, "RequestLatestVersion"},
+ {17, nullptr, "SetNetworkInstallTaskAttribute"},
+ {18, nullptr, "AddNetworkInstallTaskContentMeta"},
+ {19, nullptr, "GetDownloadedSystemDataPath"},
+ {20, nullptr, "CalculateNetworkInstallTaskRequiredSize"},
+ {21, nullptr, "IsExFatDriverIncluded"},
+ {22, nullptr, "GetBackgroundDownloadStressTaskInfo"},
+ {23, nullptr, "RequestDeviceAuthenticationToken"},
+ {24, nullptr, "RequestGameCardRegistrationStatus"},
+ {25, nullptr, "RequestRegisterGameCard"},
+ {26, nullptr, "RequestRegisterNotificationToken"},
+ {27, nullptr, "RequestDownloadTaskList"},
+ {28, nullptr, "RequestApplicationControl"},
+ {29, nullptr, "RequestLatestApplicationControl"},
+ {30, nullptr, "RequestVersionList"},
+ {31, nullptr, "CreateApplyDeltaTask"},
+ {32, nullptr, "DestroyApplyDeltaTask"},
+ {33, nullptr, "ListApplicationApplyDeltaTask"},
+ {34, nullptr, "RequestApplyDeltaTaskRun"},
+ {35, nullptr, "GetApplyDeltaTaskInfo"},
+ {36, nullptr, "ListApplyDeltaTask"},
+ {37, nullptr, "CommitApplyDeltaTask"},
+ {38, nullptr, "CalculateApplyDeltaTaskRequiredSize"},
+ {39, nullptr, "PrepareShutdown"},
+ {40, nullptr, "ListApplyDeltaTask"},
+ {41, nullptr, "ClearNotEnoughSpaceStateOfApplyDeltaTask"},
+ {42, nullptr, "CreateApplyDeltaTaskFromDownloadTask"},
+ {43, nullptr, "GetBackgroundApplyDeltaStressTaskInfo"},
+ {44, nullptr, "GetApplyDeltaTaskRequiredStorage"},
+ {45, nullptr, "CalculateNetworkInstallTaskContentsSize"},
+ {46, nullptr, "PrepareShutdownForSystemUpdate"},
+ {47, nullptr, "FindMaxRequiredApplicationVersionOfTask"},
+ {48, nullptr, "CommitNetworkInstallTaskPartially"},
+ {49, nullptr, "ListNetworkInstallTaskCommittedContentMeta"},
+ {50, nullptr, "ListNetworkInstallTaskNotCommittedContentMeta"},
+ {51, nullptr, "FindMaxRequiredSystemVersionOfTask"},
+ {52, nullptr, "GetNetworkInstallTaskErrorContext"},
+ {53, nullptr, "CreateLocalCommunicationReceiveApplicationTask"},
+ {54, nullptr, "DestroyLocalCommunicationReceiveApplicationTask"},
+ {55, nullptr, "ListLocalCommunicationReceiveApplicationTask"},
+ {56, nullptr, "RequestLocalCommunicationReceiveApplicationTaskRun"},
+ {57, nullptr, "GetLocalCommunicationReceiveApplicationTaskInfo"},
+ {58, nullptr, "CommitLocalCommunicationReceiveApplicationTask"},
+ {59, nullptr, "ListLocalCommunicationReceiveApplicationTaskContentMeta"},
+ {60, nullptr, "CreateLocalCommunicationSendApplicationTask"},
+ {61, nullptr, "RequestLocalCommunicationSendApplicationTaskRun"},
+ {62, nullptr, "GetLocalCommunicationReceiveApplicationTaskErrorContext"},
+ {63, nullptr, "GetLocalCommunicationSendApplicationTaskInfo"},
+ {64, nullptr, "DestroyLocalCommunicationSendApplicationTask"},
+ {65, nullptr, "GetLocalCommunicationSendApplicationTaskErrorContext"},
+ {66, nullptr, "CalculateLocalCommunicationReceiveApplicationTaskRequiredSize"},
+ {67, nullptr, "ListApplicationLocalCommunicationReceiveApplicationTask"},
+ {68, nullptr, "ListApplicationLocalCommunicationSendApplicationTask"},
+ {69, nullptr, "CreateLocalCommunicationReceiveSystemUpdateTask"},
+ {70, nullptr, "DestroyLocalCommunicationReceiveSystemUpdateTask"},
+ {71, nullptr, "ListLocalCommunicationReceiveSystemUpdateTask"},
+ {72, nullptr, "RequestLocalCommunicationReceiveSystemUpdateTaskRun"},
+ {73, nullptr, "GetLocalCommunicationReceiveSystemUpdateTaskInfo"},
+ {74, nullptr, "CommitLocalCommunicationReceiveSystemUpdateTask"},
+ {75, nullptr, "GetLocalCommunicationReceiveSystemUpdateTaskErrorContext"},
+ {76, nullptr, "CreateLocalCommunicationSendSystemUpdateTask"},
+ {77, nullptr, "RequestLocalCommunicationSendSystemUpdateTaskRun"},
+ {78, nullptr, "GetLocalCommunicationSendSystemUpdateTaskInfo"},
+ {79, nullptr, "DestroyLocalCommunicationSendSystemUpdateTask"},
+ {80, nullptr, "GetLocalCommunicationSendSystemUpdateTaskErrorContext"},
+ {81, nullptr, "ListLocalCommunicationSendSystemUpdateTask"},
+ {82, nullptr, "GetReceivedSystemDataPath"},
+ {83, nullptr, "CalculateApplyDeltaTaskOccupiedSize"},
+ {84, nullptr, "ReloadErrorSimulation"},
+ {85, nullptr, "ListNetworkInstallTaskContentMetaFromInstallMeta"},
+ {86, nullptr, "ListNetworkInstallTaskOccupiedSize"},
+ {87, nullptr, "RequestQueryAvailableELicenses"},
+ {88, nullptr, "RequestAssignELicenses"},
+ {89, nullptr, "RequestExtendELicenses"},
+ {90, nullptr, "RequestSyncELicenses"},
+ {91, nullptr, "Unknown91"}, //6.0.0-14.1.2
+ {92, nullptr, "Unknown92"}, //21.0.0+
+ {93, nullptr, "RequestReportActiveELicenses"},
+ {94, nullptr, "RequestReportActiveELicensesPassively"},
+ {95, nullptr, "RequestRegisterDynamicRightsNotificationToken"},
+ {96, nullptr, "RequestAssignAllDeviceLinkedELicenses"},
+ {97, nullptr, "RequestRevokeAllELicenses"},
+ {98, nullptr, "RequestPrefetchForDynamicRights"},
+ {99, nullptr, "CreateNetworkInstallTask"},
+ {100, nullptr, "ListNetworkInstallTaskRightsIds"},
+ {101, nullptr, "RequestDownloadETickets"},
+ {102, nullptr, "RequestQueryDownloadableContents"},
+ {103, nullptr, "DeleteNetworkInstallTaskContentMeta"},
+ {104, nullptr, "RequestIssueEdgeTokenForDebug"},
+ {105, nullptr, "RequestQueryAvailableELicenses2"},
+ {106, nullptr, "RequestAssignELicenses2"},
+ {107, nullptr, "GetNetworkInstallTaskStateCounter"},
+ {108, nullptr, "InvalidateDynamicRightsNaIdTokenCacheForDebug"},
+ {109, nullptr, "ListNetworkInstallTaskPartialInstallContentMeta"},
+ {110, nullptr, "ListNetworkInstallTaskRightsIdsFromIndex"},
+ {111, nullptr, "AddNetworkInstallTaskContentMetaForUser"},
+ {112, nullptr, "RequestAssignELicensesAndDownloadETickets"},
+ {113, nullptr, "RequestQueryAvailableCommonELicenses"},
+ {114, nullptr, "SetNetworkInstallTaskExtendedAttribute"},
+ {115, nullptr, "GetNetworkInstallTaskExtendedAttribute"},
+ {116, nullptr, "GetAllocatorInfo"},
+ {117, nullptr, "RequestQueryDownloadableContentsByApplicationId"},
+ {118, nullptr, "MarkNoDownloadRightsErrorResolved"},
+ {119, nullptr, "GetApplyDeltaTaskAllAppliedContentMeta"},
+ {120, nullptr, "PrioritizeNetworkInstallTask"},
+ {121, nullptr, "RequestQueryAvailableCommonELicenses2"},
+ {122, nullptr, "RequestAssignCommonELicenses"},
+ {123, nullptr, "RequestAssignCommonELicenses2"},
+ {124, nullptr, "IsNetworkInstallTaskFrontOfQueue"},
+ {125, nullptr, "PrioritizeApplyDeltaTask"},
+ {126, nullptr, "RerouteDownloadingPatch"},
+ {127, nullptr, "UnmarkNoDownloadRightsErrorResolved"},
+ {128, nullptr, "RequestContentsSize"},
+ {129, nullptr, "RequestContentsAuthorizationToken"},
+ {130, nullptr, "RequestCdnVendorDiscovery"},
+ {131, nullptr, "RefreshDebugAvailability"},
+ {132, nullptr, "ClearResponseSimulationEntry"},
+ {133, nullptr, "RegisterResponseSimulationEntry"},
+ {134, nullptr, "GetProcessedCdnVendors"},
+ {135, nullptr, "RefreshRuntimeBehaviorsForDebug"},
+ {136, nullptr, "RequestOnlineSubscriptionFreeTrialAvailability"},
+ {137, nullptr, "GetNetworkInstallTaskContentMetaCount"},
+ {138, nullptr, "RequestRevokeELicenses"},
+ {139, nullptr, "EnableNetworkConnectionToUseApplicationCore"},
+ {140, nullptr, "DisableNetworkConnectionToUseApplicationCore"},
+ {141, nullptr, "IsNetworkConnectionEnabledToUseApplicationCore"},
+ {142, nullptr, "RequestCheckSafeSystemVersion"},
+ {143, nullptr, "RequestApplicationIcon"},
+ {144, nullptr, "RequestDownloadIdbeIconFile"},
+ {147, nullptr, "Unknown147"}, //18.0.0+
+ {148, nullptr, "Unknown148"}, //18.0.0+
+ {150, nullptr, "Unknown150"}, //19.0.0+
+ {151, nullptr, "Unknown151"}, //20.0.0+
+ {152, nullptr, "Unknown152"}, //20.0.0+
+ {153, nullptr, "Unknown153"}, //20.0.0+
+ {154, nullptr, "Unknown154"}, //20.0.0+
+ {155, nullptr, "Unknown155"}, //20.0.0+
+ {156, nullptr, "Unknown156"}, //20.0.0+
+ {157, nullptr, "Unknown157"}, //20.0.0+
+ {158, nullptr, "Unknown158"}, //20.0.0+
+ {159, nullptr, "Unknown159"}, //20.0.0+
+ {160, nullptr, "Unknown160"}, //20.0.0+
+ {161, nullptr, "Unknown161"}, //20.0.0+
+ {162, nullptr, "Unknown162"}, //20.0.0+
+ {163, nullptr, "Unknown163"}, //20.0.0+
+ {164, nullptr, "Unknown164"}, //20.0.0+
+ {165, nullptr, "Unknown165"}, //20.0.0+
+ {166, nullptr, "Unknown166"}, //20.0.0+
+ {167, nullptr, "Unknown167"}, //20.0.0+
+ {168, nullptr, "Unknown168"}, //20.0.0+
+ {169, nullptr, "Unknown169"}, //20.0.0+
+ {170, nullptr, "Unknown170"}, //20.0.0+
+ {171, nullptr, "Unknown171"}, //20.0.0+
+ {172, nullptr, "Unknown172"}, //20.0.0+
+ {173, nullptr, "Unknown173"}, //20.0.0+
+ {174, nullptr, "Unknown174"}, //20.0.0+
+ {175, nullptr, "Unknown175"}, //20.0.0+
+ {176, nullptr, "Unknown176"}, //20.0.0+
+ {177, nullptr, "Unknown177"}, //20.0.0+
+ {2000, nullptr, "Unknown2000"}, //20.0.0+
+ {2001, nullptr, "Unknown2001"}, //20.0.0+
+ {2002, nullptr, "Unknown2002"}, //20.0.0+
+ {2003, nullptr, "Unknown2003"}, //20.0.0+
+ {2004, nullptr, "Unknown2004"}, //20.0.0+
+ {2007, nullptr, "Unknown2007"}, //20.0.0+
+ {2011, nullptr, "Unknown2011"}, //20.0.0+
+ {2012, nullptr, "Unknown2012"}, //20.0.0+
+ {2013, nullptr, "Unknown2013"}, //20.0.0+
+ {2014, nullptr, "Unknown2014"}, //20.0.0+
+ {2015, nullptr, "Unknown2015"}, //20.0.0+
+ {2016, nullptr, "Unknown2016"}, //20.0.0+
+ {2017, nullptr, "Unknown2017"}, //20.0.0+
+ {2018, nullptr, "Unknown2018"}, //20.0.0+
+ {2019, nullptr, "Unknown2019"}, //20.0.0+
+ {2020, nullptr, "Unknown2020"}, //20.0.0+
+ {2021, nullptr, "Unknown2021"}, //20.0.0+
+ {2022, nullptr, "Unknown2022"}, //20.0.0+
+ {2023, nullptr, "Unknown2023"}, //20.0.0+
+ {2024, nullptr, "Unknown2024"}, //20.0.0+
+ {2025, nullptr, "Unknown2025"}, //20.0.0+
+ {2026, nullptr, "Unknown2026"}, //20.0.0+
+ {2027, nullptr, "Unknown2027"}, //20.0.0+
+ {2028, nullptr, "Unknown2028"}, //20.0.0+
+ {2029, nullptr, "Unknown2029"}, //20.0.0+
+ {2030, nullptr, "Unknown2030"}, //20.0.0+
+ {2031, nullptr, "Unknown2031"}, //20.0.0+
+ {2032, nullptr, "Unknown2032"}, //20.0.0+
+ {2033, nullptr, "Unknown2033"}, //20.0.0+
+ {2034, nullptr, "Unknown2034"}, //20.0.0+
+ {2035, nullptr, "Unknown2035"}, //20.0.0+
+ {2036, nullptr, "Unknown2036"}, //20.0.0+
+ {2037, nullptr, "Unknown2037"}, //20.0.0+
+ {2038, nullptr, "Unknown2038"}, //20.0.0+
+ {2039, nullptr, "Unknown2039"}, //20.0.0+
+ {2040, nullptr, "Unknown2040"}, //20.0.0+
+ {2041, nullptr, "Unknown2041"}, //20.0.0+
+ {2042, nullptr, "Unknown2042"}, //20.0.0+
+ {2043, nullptr, "Unknown2043"}, //20.0.0+
+ {2044, nullptr, "Unknown2044"}, //20.0.0+
+ {2045, nullptr, "Unknown2045"}, //20.0.0+
+ {2046, nullptr, "Unknown2046"}, //20.0.0+
+ {2047, nullptr, "Unknown2047"}, //20.0.0+
+ {2048, nullptr, "Unknown2048"}, //20.0.0+
+ {2049, nullptr, "Unknown2049"}, //20.0.0+
+ {2050, nullptr, "Unknown2050"}, //20.0.0+
+ {2051, nullptr, "Unknown2051"}, //20.0.0+
+ {3000, nullptr, "RequestLatestApplicationIcon"}, //17.0.0+
+ {3001, nullptr, "RequestDownloadIdbeLatestIconFile"}, //17.0.0+
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
class NIM_ECA final : public ServiceFramework<NIM_ECA> {
public:
- explicit NIM_ECA(Core::System& system_) : ServiceFramework{system_, "nim:eca"} {}
+ explicit NIM_ECA(Core::System& system_) : ServiceFramework{system_, "nim:eca"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &NIM_ECA::CreateServerInterface, "CreateServerInterface"},
+ {1, nullptr, "RefreshDebugAvailability"},
+ {2, nullptr, "ClearDebugResponse"},
+ {3, nullptr, "RegisterDebugResponse"},
+ {4, &NIM_ECA::IsLargeResourceAvailable, "IsLargeResourceAvailable"},
+ {5, &NIM_ECA::CreateServerInterface2, "CreateServerInterface2"} // 17.0.0+
+ };
+ // clang-format on
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
private:
@@ -450,53 +463,45 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<IShopServiceAccessServer>(ctx, system);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &NIM_ECA::CreateServerInterface, "CreateServerInterface"},
- FunctionInfo{1, nullptr, "RefreshDebugAvailability"},
- FunctionInfo{2, nullptr, "ClearDebugResponse"},
- FunctionInfo{3, nullptr, "RegisterDebugResponse"},
- FunctionInfo{4, &NIM_ECA::IsLargeResourceAvailable, "IsLargeResourceAvailable"},
- FunctionInfo{5, &NIM_ECA::CreateServerInterface2, "CreateServerInterface2", MakeVersionGate({17,0,0})}
- );
};
class NIM_SHP final : public ServiceFramework<NIM_SHP> {
public:
- explicit NIM_SHP(Core::System& system_) : ServiceFramework{system_, "nim:shp"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "RequestDeviceAuthenticationToken"},
- FunctionInfo{1, nullptr, "RequestCachedDeviceAuthenticationToken"},
- FunctionInfo{2, nullptr, "RequestEdgeToken"},
- FunctionInfo{3, nullptr, "RequestCachedEdgeToken"},
- FunctionInfo{100, nullptr, "RequestRegisterDeviceAccount"},
- FunctionInfo{101, nullptr, "RequestUnregisterDeviceAccount"},
- FunctionInfo{102, nullptr, "RequestDeviceAccountStatus"},
- FunctionInfo{103, nullptr, "GetDeviceAccountInfo"},
- FunctionInfo{104, nullptr, "RequestDeviceRegistrationInfo"},
- FunctionInfo{105, nullptr, "RequestTransferDeviceAccount"},
- FunctionInfo{106, nullptr, "RequestSyncRegistration"},
- FunctionInfo{107, nullptr, "IsOwnDeviceId"},
- FunctionInfo{200, nullptr, "RequestRegisterNotificationToken"},
- FunctionInfo{300, nullptr, "RequestUnlinkDevice"},
- FunctionInfo{301, nullptr, "RequestUnlinkDeviceIntegrated"},
- FunctionInfo{302, nullptr, "RequestLinkDevice"},
- FunctionInfo{303, nullptr, "HasDeviceLink"},
- FunctionInfo{304, nullptr, "RequestUnlinkDeviceAll"},
- FunctionInfo{305, nullptr, "RequestCreateVirtualAccount"},
- FunctionInfo{306, nullptr, "RequestDeviceLinkStatus"},
- FunctionInfo{400, nullptr, "GetAccountByVirtualAccount"},
- FunctionInfo{401, nullptr, "GetVirtualAccount"},
- FunctionInfo{500, nullptr, "RequestSyncTicketLegacy"},
- FunctionInfo{501, nullptr, "RequestDownloadTicket"},
- FunctionInfo{502, nullptr, "RequestDownloadTicketForPrepurchasedContents"},
- FunctionInfo{503, nullptr, "RequestSyncTicket"},
- FunctionInfo{504, nullptr, "RequestDownloadTicketForPrepurchasedContents2"},
- FunctionInfo{505, nullptr, "RequestDownloadTicketForPrepurchasedContentsForAccount"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit NIM_SHP(Core::System& system_) : ServiceFramework{system_, "nim:shp"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "RequestDeviceAuthenticationToken"},
+ {1, nullptr, "RequestCachedDeviceAuthenticationToken"},
+ {2, nullptr, "RequestEdgeToken"},
+ {3, nullptr, "RequestCachedEdgeToken"},
+ {100, nullptr, "RequestRegisterDeviceAccount"},
+ {101, nullptr, "RequestUnregisterDeviceAccount"},
+ {102, nullptr, "RequestDeviceAccountStatus"},
+ {103, nullptr, "GetDeviceAccountInfo"},
+ {104, nullptr, "RequestDeviceRegistrationInfo"},
+ {105, nullptr, "RequestTransferDeviceAccount"},
+ {106, nullptr, "RequestSyncRegistration"},
+ {107, nullptr, "IsOwnDeviceId"},
+ {200, nullptr, "RequestRegisterNotificationToken"},
+ {300, nullptr, "RequestUnlinkDevice"},
+ {301, nullptr, "RequestUnlinkDeviceIntegrated"},
+ {302, nullptr, "RequestLinkDevice"},
+ {303, nullptr, "HasDeviceLink"},
+ {304, nullptr, "RequestUnlinkDeviceAll"},
+ {305, nullptr, "RequestCreateVirtualAccount"},
+ {306, nullptr, "RequestDeviceLinkStatus"},
+ {400, nullptr, "GetAccountByVirtualAccount"},
+ {401, nullptr, "GetVirtualAccount"},
+ {500, nullptr, "RequestSyncTicketLegacy"},
+ {501, nullptr, "RequestDownloadTicket"},
+ {502, nullptr, "RequestDownloadTicketForPrepurchasedContents"},
+ {503, nullptr, "RequestSyncTicket"},
+ {504, nullptr, "RequestDownloadTicketForPrepurchasedContents2"},
+ {505, nullptr, "RequestDownloadTicketForPrepurchasedContentsForAccount"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
@@ -506,7 +511,19 @@ public:
explicit IEnsureNetworkClockAvailabilityService(Core::System& system_)
: ServiceFramework{system_, "IEnsureNetworkClockAvailabilityService"},
service_context{system_, "IEnsureNetworkClockAvailabilityService"} {
- finished_event = service_context.CreateEvent("IEnsureNetworkClockAvailabilityService:FinishEvent");
+ static const FunctionInfo functions[] = {
+ {0, &IEnsureNetworkClockAvailabilityService::StartTask, "StartTask"},
+ {1, &IEnsureNetworkClockAvailabilityService::GetFinishNotificationEvent,
+ "GetFinishNotificationEvent"},
+ {2, &IEnsureNetworkClockAvailabilityService::GetResult, "GetResult"},
+ {3, &IEnsureNetworkClockAvailabilityService::Cancel, "Cancel"},
+ {4, &IEnsureNetworkClockAvailabilityService::IsProcessing, "IsProcessing"},
+ {5, &IEnsureNetworkClockAvailabilityService::GetServerTime, "GetServerTime"},
+ };
+ RegisterHandlers(functions);
+
+ finished_event =
+ service_context.CreateEvent("IEnsureNetworkClockAvailabilityService:FinishEvent");
}
~IEnsureNetworkClockAvailabilityService() override {
@@ -563,27 +580,23 @@ private:
rb.PushRaw<s64>(server_time);
}
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &IEnsureNetworkClockAvailabilityService::StartTask, "StartTask"},
- FunctionInfo{1, &IEnsureNetworkClockAvailabilityService::GetFinishNotificationEvent, "GetFinishNotificationEvent"},
- FunctionInfo{2, &IEnsureNetworkClockAvailabilityService::GetResult, "GetResult"},
- FunctionInfo{3, &IEnsureNetworkClockAvailabilityService::Cancel, "Cancel"},
- FunctionInfo{4, &IEnsureNetworkClockAvailabilityService::IsProcessing, "IsProcessing"},
- FunctionInfo{5, &IEnsureNetworkClockAvailabilityService::GetServerTime, "GetServerTime"}
- );
KernelHelpers::ServiceContext service_context;
+
Kernel::KEvent* finished_event;
};
class NTC final : public ServiceFramework<NTC> {
public:
- explicit NTC(Core::System& system_) : ServiceFramework{system_, "ntc"} {}
+ explicit NTC(Core::System& system_) : ServiceFramework{system_, "ntc"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &NTC::OpenEnsureNetworkClockAvailabilityService, "OpenEnsureNetworkClockAvailabilityService"},
+ {100, &NTC::SuspendAutonomicTimeCorrection, "SuspendAutonomicTimeCorrection"},
+ {101, &NTC::ResumeAutonomicTimeCorrection, "ResumeAutonomicTimeCorrection"},
+ };
+ // clang-format on
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
private:
@@ -609,24 +622,18 @@ private:
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &NTC::OpenEnsureNetworkClockAvailabilityService, "OpenEnsureNetworkClockAvailabilityService"},
- FunctionInfo{100, &NTC::SuspendAutonomicTimeCorrection, "SuspendAutonomicTimeCorrection"},
- FunctionInfo{101, &NTC::ResumeAutonomicTimeCorrection, "ResumeAutonomicTimeCorrection"}
- );
};
class NIM_ECAS final : public ServiceFramework<NIM_ECAS> {
public:
- explicit NIM_ECAS(Core::System& system_) : ServiceFramework{system_, "nim:ecas"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "RegisterSpecialClient"},
- FunctionInfo{1, nullptr, "UnregisterSpecialClient"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit NIM_ECAS(Core::System& system_) : ServiceFramework{system_, "nim:ecas"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "RegisterSpecialClient"},
+ {1, nullptr, "UnregisterSpecialClient"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
diff --git a/src/core/hle/service/nim/nim.h b/src/core/hle/service/nim/nim.h
index e7d599908d..0fad2a71af 100644
--- a/src/core/hle/service/nim/nim.h
+++ b/src/core/hle/service/nim/nim.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/npns/npns.cpp b/src/core/hle/service/npns/npns.cpp
index 90bf633e8b..b0f74bef06 100644
--- a/src/core/hle/service/npns/npns.cpp
+++ b/src/core/hle/service/npns/npns.cpp
@@ -19,10 +19,79 @@ class INpnsSystem final : public ServiceFramework<INpnsSystem> {
public:
explicit INpnsSystem(Core::System& system_)
: ServiceFramework{system_, "npns:s"}, service_context{system, "npns:s"},
- get_receive_event{service_context}, get_request_change_state_cancel_event{service_context} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ get_receive_event{service_context}, get_request_change_state_cancel_event{service_context} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {1, nullptr, "ListenAll"},
+ {2, C<&INpnsSystem::ListenTo>, "ListenTo"},
+ {3, nullptr, "Receive"},
+ {4, nullptr, "ReceiveRaw"},
+ {5, C<&INpnsSystem::GetReceiveEvent>, "GetReceiveEvent"},
+ {6, nullptr, "ListenUndelivered"},
+ {7, nullptr, "GetStateChangeEvent"},
+ {8, C<&INpnsSystem::ListenToByName>, "ListenToByName"},
+ {11, nullptr, "SubscribeTopic"},
+ {12, nullptr, "UnsubscribeTopic"},
+ {13, nullptr, "QueryIsTopicExist"},
+ {14, nullptr, "SubscribeTopicByAccount"}, // 18.0.0+
+ {15, nullptr, "UnsubscribeTopicByAccount"}, // 18.0.0+
+ {16, nullptr, "DownloadSubscriptionList"}, // 18.0.0+
+ {21, nullptr, "CreateToken"},
+ {22, nullptr, "CreateTokenWithApplicationId"},
+ {23, nullptr, "DestroyToken"},
+ {24, nullptr, "DestroyTokenWithApplicationId"},
+ {25, nullptr, "QueryIsTokenValid"},
+ {26, nullptr, "ListenToMyApplicationId"},
+ {27, nullptr, "DestroyTokenAll"},
+ {28, nullptr, "CreateTokenWithName"}, // 18.0.0+
+ {29, nullptr, "DestroyTokenWithName"}, // 18.0.0+
+ {31, nullptr, "UploadTokenToBaaS"},
+ {32, nullptr, "DestroyTokenForBaaS"},
+ {33, nullptr, "CreateTokenForBaaS"},
+ {34, nullptr, "SetBaaSDeviceAccountIdList"},
+ {35, nullptr, "LinkNsaId"}, // 17.0.0+
+ {36, nullptr, "UnlinkNsaId"}, // 17.0.0+
+ {37, nullptr, "RelinkNsaId"}, // 18.0.0+
+ {40, nullptr, "GetNetworkServiceAccountIdTokenRequestEvent"}, // 17.0.0+
+ {41, nullptr, "TryPopNetworkServiceAccountIdTokenRequestUid"}, // 17.0.0+
+ {42, nullptr, "SetNetworkServiceAccountIdTokenSuccess"}, // 17.0.0+
+ {43, nullptr, "SetNetworkServiceAccountIdTokenFailure"}, // 17.0.0+
+ {44, nullptr, "SetUidList"}, // 17.0.0+
+ {45, nullptr, "PutDigitalTwinKeyValue"}, // 17.0.0+
+ {51, nullptr, "DeleteDigitalTwinKeyValue"}, // 18.0.0+
+ {101, nullptr, "Suspend"},
+ {102, nullptr, "Resume"},
+ {103, C<&INpnsSystem::GetState>, "GetState"},
+ {104, nullptr, "GetStatistics"},
+ {105, nullptr, "GetPlayReportRequestEvent"},
+ {106, C<&INpnsSystem::GetLastNotifiedTime>, "GetLastNotifiedTime"}, // 18.0.0+
+ {107, nullptr, "SetLastNotifiedTime"}, // 18.0.0+
+ {111, nullptr, "GetJid"},
+ {112, nullptr, "CreateJid"},
+ {113, nullptr, "DestroyJid"},
+ {114, nullptr, "AttachJid"},
+ {115, nullptr, "DetachJid"},
+ {120, nullptr, "CreateNotificationReceiver"},
+ {151, nullptr, "GetStateWithHandover"},
+ {152, nullptr, "GetStateChangeEventWithHandover"},
+ {153, nullptr, "GetDropEventWithHandover"},
+ {154, nullptr, "CreateTokenAsync"},
+ {155, nullptr, "CreateTokenAsyncWithApplicationId"},
+ {156, nullptr, "CreateTokenWithNameAsync"}, // 18.0.0+
+ {161, C<&INpnsSystem::GetRequestChangeStateCancelEvent>, "GetRequestChangeStateCancelEvent"}, // 10.0.0+
+ {162, nullptr, "RequestChangeStateForceTimedWithCancelEvent"},
+ {201, nullptr, "RequestChangeStateForceTimed"},
+ {202, nullptr, "RequestChangeStateForceAsync"},
+ {301, nullptr, "GetPassword"}, // 18.0.0+
+ {302, nullptr, "GetAllImmigration"}, // 18.0.0+
+ {303, nullptr, "GetNotificationHistories"}, // 18.0.0+
+ {304, nullptr, "GetPersistentConnectionSummary"}, // 18.0.0+
+ {305, nullptr, "GetDigitalTwinSummary"}, // 18.0.0+
+ {306, nullptr, "GetDigitalTwinValue"}, // 18.0.0+
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
~INpnsSystem() override = default;
@@ -71,74 +140,6 @@ private:
R_SUCCEED();
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{1, nullptr, "ListenAll"},
- FunctionInfo{2, C<&INpnsSystem::ListenTo>, "ListenTo"},
- FunctionInfo{3, nullptr, "Receive"},
- FunctionInfo{4, nullptr, "ReceiveRaw"},
- FunctionInfo{5, C<&INpnsSystem::GetReceiveEvent>, "GetReceiveEvent"},
- FunctionInfo{6, nullptr, "ListenUndelivered"},
- FunctionInfo{7, nullptr, "GetStateChangeEvent"},
- FunctionInfo{8, C<&INpnsSystem::ListenToByName>, "ListenToByName"},
- FunctionInfo{11, nullptr, "SubscribeTopic"},
- FunctionInfo{12, nullptr, "UnsubscribeTopic"},
- FunctionInfo{13, nullptr, "QueryIsTopicExist"},
- FunctionInfo{14, nullptr, "SubscribeTopicByAccount", MakeVersionGate({18,0,0})},
- FunctionInfo{15, nullptr, "UnsubscribeTopicByAccount", MakeVersionGate({18,0,0})},
- FunctionInfo{16, nullptr, "DownloadSubscriptionList", MakeVersionGate({18,0,0})},
- FunctionInfo{21, nullptr, "CreateToken"},
- FunctionInfo{22, nullptr, "CreateTokenWithApplicationId"},
- FunctionInfo{23, nullptr, "DestroyToken"},
- FunctionInfo{24, nullptr, "DestroyTokenWithApplicationId"},
- FunctionInfo{25, nullptr, "QueryIsTokenValid"},
- FunctionInfo{26, nullptr, "ListenToMyApplicationId"},
- FunctionInfo{27, nullptr, "DestroyTokenAll"},
- FunctionInfo{28, nullptr, "CreateTokenWithName", MakeVersionGate({18,0,0})},
- FunctionInfo{29, nullptr, "DestroyTokenWithName", MakeVersionGate({18,0,0})},
- FunctionInfo{31, nullptr, "UploadTokenToBaaS"},
- FunctionInfo{32, nullptr, "DestroyTokenForBaaS"},
- FunctionInfo{33, nullptr, "CreateTokenForBaaS"},
- FunctionInfo{34, nullptr, "SetBaaSDeviceAccountIdList"},
- FunctionInfo{35, nullptr, "LinkNsaId", MakeVersionGate({17,0,0})},
- FunctionInfo{36, nullptr, "UnlinkNsaId", MakeVersionGate({17,0,0})},
- FunctionInfo{37, nullptr, "RelinkNsaId", MakeVersionGate({18,0,0})},
- FunctionInfo{40, nullptr, "GetNetworkServiceAccountIdTokenRequestEvent", MakeVersionGate({17,0,0})},
- FunctionInfo{41, nullptr, "TryPopNetworkServiceAccountIdTokenRequestUid", MakeVersionGate({17,0,0})},
- FunctionInfo{42, nullptr, "SetNetworkServiceAccountIdTokenSuccess", MakeVersionGate({17,0,0})},
- FunctionInfo{43, nullptr, "SetNetworkServiceAccountIdTokenFailure", MakeVersionGate({17,0,0})},
- FunctionInfo{44, nullptr, "SetUidList", MakeVersionGate({17,0,0})},
- FunctionInfo{45, nullptr, "PutDigitalTwinKeyValue", MakeVersionGate({17,0,0})},
- FunctionInfo{51, nullptr, "DeleteDigitalTwinKeyValue", MakeVersionGate({18,0,0})},
- FunctionInfo{101, nullptr, "Suspend"},
- FunctionInfo{102, nullptr, "Resume"},
- FunctionInfo{103, C<&INpnsSystem::GetState>, "GetState"},
- FunctionInfo{104, nullptr, "GetStatistics"},
- FunctionInfo{105, nullptr, "GetPlayReportRequestEvent"},
- FunctionInfo{106, C<&INpnsSystem::GetLastNotifiedTime>, "GetLastNotifiedTime", MakeVersionGate({18,0,0})},
- FunctionInfo{107, nullptr, "SetLastNotifiedTime", MakeVersionGate({18,0,0})},
- FunctionInfo{111, nullptr, "GetJid"},
- FunctionInfo{112, nullptr, "CreateJid"},
- FunctionInfo{113, nullptr, "DestroyJid"},
- FunctionInfo{114, nullptr, "AttachJid"},
- FunctionInfo{115, nullptr, "DetachJid"},
- FunctionInfo{120, nullptr, "CreateNotificationReceiver"},
- FunctionInfo{151, nullptr, "GetStateWithHandover"},
- FunctionInfo{152, nullptr, "GetStateChangeEventWithHandover"},
- FunctionInfo{153, nullptr, "GetDropEventWithHandover"},
- FunctionInfo{154, nullptr, "CreateTokenAsync"},
- FunctionInfo{155, nullptr, "CreateTokenAsyncWithApplicationId"},
- FunctionInfo{156, nullptr, "CreateTokenWithNameAsync", MakeVersionGate({18,0,0})},
- FunctionInfo{161, C<&INpnsSystem::GetRequestChangeStateCancelEvent>, "GetRequestChangeStateCancelEvent", MakeVersionGate({10,0,0})},
- FunctionInfo{162, nullptr, "RequestChangeStateForceTimedWithCancelEvent"},
- FunctionInfo{201, nullptr, "RequestChangeStateForceTimed"},
- FunctionInfo{202, nullptr, "RequestChangeStateForceAsync"},
- FunctionInfo{301, nullptr, "GetPassword", MakeVersionGate({18,0,0})},
- FunctionInfo{302, nullptr, "GetAllImmigration", MakeVersionGate({18,0,0})},
- FunctionInfo{303, nullptr, "GetNotificationHistories", MakeVersionGate({18,0,0})},
- FunctionInfo{304, nullptr, "GetPersistentConnectionSummary", MakeVersionGate({18,0,0})},
- FunctionInfo{305, nullptr, "GetDigitalTwinSummary", MakeVersionGate({18,0,0})},
- FunctionInfo{306, nullptr, "GetDigitalTwinValue", MakeVersionGate({18,0,0})}
- );
KernelHelpers::ServiceContext service_context;
Event get_receive_event;
Event get_request_change_state_cancel_event;
@@ -147,10 +148,34 @@ private:
class INpnsUser final : public ServiceFramework<INpnsUser> {
public:
explicit INpnsUser(Core::System& system_)
- : ServiceFramework{system_, "npns:u"}, service_context{system, "npns:u"}, get_receive_event{service_context} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "npns:u"}, service_context{system, "npns:u"}, get_receive_event{service_context} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {1, nullptr, "ListenAll"},
+ {2, nullptr, "ListenTo"},
+ {3, nullptr, "Receive"},
+ {4, nullptr, "ReceiveRaw"},
+ {5, C<&INpnsUser::GetReceiveEvent>, "GetReceiveEvent"},
+ {7, nullptr, "GetStateChangeEvent"},
+ {8, C<&INpnsUser::ListenToByName>, "ListenToByName"}, // 18.0.0+
+ {21, nullptr, "CreateToken"},
+ {23, nullptr, "DestroyToken"},
+ {25, nullptr, "QueryIsTokenValid"},
+ {26, nullptr, "ListenToMyApplicationId"},
+ {101, nullptr, "Suspend"},
+ {102, nullptr, "Resume"},
+ {103, nullptr, "GetState"},
+ {104, nullptr, "GetStatistics"},
+ {111, nullptr, "GetJid"},
+ {120, nullptr, "CreateNotificationReceiver"},
+ {151, nullptr, "GetStateWithHandover"},
+ {152, nullptr, "GetStateChangeEventWithHandover"},
+ {153, nullptr, "GetDropEventWithHandover"},
+ {154, nullptr, "CreateTokenAsync"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
private:
@@ -170,29 +195,6 @@ private:
R_SUCCEED();
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{1, nullptr, "ListenAll"},
- FunctionInfo{2, nullptr, "ListenTo"},
- FunctionInfo{3, nullptr, "Receive"},
- FunctionInfo{4, nullptr, "ReceiveRaw"},
- FunctionInfo{5, C<&INpnsUser::GetReceiveEvent>, "GetReceiveEvent"},
- FunctionInfo{7, nullptr, "GetStateChangeEvent"},
- FunctionInfo{8, C<&INpnsUser::ListenToByName>, "ListenToByName", MakeVersionGate({18,0,0})},
- FunctionInfo{21, nullptr, "CreateToken"},
- FunctionInfo{23, nullptr, "DestroyToken"},
- FunctionInfo{25, nullptr, "QueryIsTokenValid"},
- FunctionInfo{26, nullptr, "ListenToMyApplicationId"},
- FunctionInfo{101, nullptr, "Suspend"},
- FunctionInfo{102, nullptr, "Resume"},
- FunctionInfo{103, nullptr, "GetState"},
- FunctionInfo{104, nullptr, "GetStatistics"},
- FunctionInfo{111, nullptr, "GetJid"},
- FunctionInfo{120, nullptr, "CreateNotificationReceiver"},
- FunctionInfo{151, nullptr, "GetStateWithHandover"},
- FunctionInfo{152, nullptr, "GetStateChangeEventWithHandover"},
- FunctionInfo{153, nullptr, "GetDropEventWithHandover"},
- FunctionInfo{154, nullptr, "CreateTokenAsync"}
- );
KernelHelpers::ServiceContext service_context;
Event get_receive_event;
};
diff --git a/src/core/hle/service/npns/npns.h b/src/core/hle/service/npns/npns.h
index 0019fca763..e54a91a213 100644
--- a/src/core/hle/service/npns/npns.h
+++ b/src/core/hle/service/npns/npns.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/ns/account_proxy_interface.cpp b/src/core/hle/service/ns/account_proxy_interface.cpp
index 0107e16b72..2e3dcf928d 100644
--- a/src/core/hle/service/ns/account_proxy_interface.cpp
+++ b/src/core/hle/service/ns/account_proxy_interface.cpp
@@ -10,6 +10,13 @@ namespace Service::NS {
IAccountProxyInterface::IAccountProxyInterface(Core::System& system_)
: ServiceFramework{system_, "IAccountProxyInterface"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "CreateUserAccount"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IAccountProxyInterface::~IAccountProxyInterface() = default;
diff --git a/src/core/hle/service/ns/account_proxy_interface.h b/src/core/hle/service/ns/account_proxy_interface.h
index 37248726a9..14cec4ddbc 100644
--- a/src/core/hle/service/ns/account_proxy_interface.h
+++ b/src/core/hle/service/ns/account_proxy_interface.h
@@ -14,13 +14,6 @@ class IAccountProxyInterface final : public ServiceFramework<IAccountProxyInterf
public:
explicit IAccountProxyInterface(Core::System& system_);
~IAccountProxyInterface() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "CreateUserAccount"}
- );
};
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/application_manager_interface.cpp b/src/core/hle/service/ns/application_manager_interface.cpp
index 7220c52dcb..348649917e 100644
--- a/src/core/hle/service/ns/application_manager_interface.cpp
+++ b/src/core/hle/service/ns/application_manager_interface.cpp
@@ -25,458 +25,6 @@
namespace Service::NS {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IApplicationManagerInterface::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IApplicationManagerInterface::ListApplicationRecord>, "ListApplicationRecord"},
- FunctionInfo{1, nullptr, "GenerateApplicationRecordCount"},
- FunctionInfo{2, D<&IApplicationManagerInterface::GetApplicationRecordUpdateSystemEvent>, "GetApplicationRecordUpdateSystemEvent"},
- FunctionInfo{3, nullptr, "GetApplicationViewDeprecated"},
- FunctionInfo{4, D<&IApplicationManagerInterface::DeleteApplicationEntity>, "DeleteApplicationEntity"},
- FunctionInfo{5, D<&IApplicationManagerInterface::DeleteApplicationCompletely>, "DeleteApplicationCompletely"},
- FunctionInfo{6, nullptr, "IsAnyApplicationEntityRedundant"},
- FunctionInfo{7, nullptr, "DeleteRedundantApplicationEntity"},
- FunctionInfo{8, nullptr, "IsApplicationEntityMovable"},
- FunctionInfo{9, nullptr, "MoveApplicationEntity"},
- FunctionInfo{11, nullptr, "CalculateApplicationOccupiedSize"},
- FunctionInfo{16, &IApplicationManagerInterface::PushApplicationRecord, "PushApplicationRecord"},
- FunctionInfo{17, nullptr, "ListApplicationRecordContentMeta"},
- FunctionInfo{19, nullptr, "LaunchApplicationOld"},
- FunctionInfo{21, nullptr, "GetApplicationContentPath"},
- FunctionInfo{22, nullptr, "TerminateApplication"},
- FunctionInfo{23, nullptr, "ResolveApplicationContentPath"},
- FunctionInfo{26, nullptr, "BeginInstallApplication"},
- FunctionInfo{27, nullptr, "DeleteApplicationRecord"},
- FunctionInfo{30, nullptr, "RequestApplicationUpdateInfo"},
- FunctionInfo{31, nullptr, "RequestUpdateApplication"},
- FunctionInfo{32, nullptr, "CancelApplicationDownload"},
- FunctionInfo{33, nullptr, "ResumeApplicationDownload"},
- FunctionInfo{35, nullptr, "UpdateVersionList"},
- FunctionInfo{36, nullptr, "PushLaunchVersion"},
- FunctionInfo{37, nullptr, "ListRequiredVersion"},
- FunctionInfo{38, D<&IApplicationManagerInterface::CheckApplicationLaunchVersion>, "CheckApplicationLaunchVersion"},
- FunctionInfo{39, nullptr, "CheckApplicationLaunchRights"},
- FunctionInfo{40, D<&IApplicationManagerInterface::GetApplicationLogoData>, "GetApplicationLogoData"},
- FunctionInfo{41, nullptr, "CalculateApplicationDownloadRequiredSize"},
- FunctionInfo{42, nullptr, "CleanupSdCard"},
- FunctionInfo{43, D<&IApplicationManagerInterface::CheckSdCardMountStatus>, "CheckSdCardMountStatus"},
- FunctionInfo{44, D<&IApplicationManagerInterface::GetSdCardMountStatusChangedEvent>, "GetSdCardMountStatusChangedEvent"},
- FunctionInfo{45, nullptr, "GetGameCardAttachmentEvent"},
- FunctionInfo{46, nullptr, "GetGameCardAttachmentInfo"},
- FunctionInfo{47, D<&IApplicationManagerInterface::GetTotalSpaceSize>, "GetTotalSpaceSize"},
- FunctionInfo{48, D<&IApplicationManagerInterface::GetFreeSpaceSize>, "GetFreeSpaceSize"},
- FunctionInfo{49, nullptr, "GetSdCardRemovedEvent"},
- FunctionInfo{52, D<&IApplicationManagerInterface::GetGameCardUpdateDetectionEvent>, "GetGameCardUpdateDetectionEvent"},
- FunctionInfo{53, nullptr, "DisableApplicationAutoDelete"},
- FunctionInfo{54, nullptr, "EnableApplicationAutoDelete"},
- FunctionInfo{55, D<&IApplicationManagerInterface::GetApplicationDesiredLanguage>, "GetApplicationDesiredLanguage"},
- FunctionInfo{56, nullptr, "SetApplicationTerminateResult"},
- FunctionInfo{57, nullptr, "ClearApplicationTerminateResult"},
- FunctionInfo{58, nullptr, "GetLastSdCardMountUnexpectedResult"},
- FunctionInfo{59, D<&IApplicationManagerInterface::ConvertApplicationLanguageToLanguageCode>, "ConvertApplicationLanguageToLanguageCode"},
- FunctionInfo{60, nullptr, "ConvertLanguageCodeToApplicationLanguage"},
- FunctionInfo{61, nullptr, "GetBackgroundDownloadStressTaskInfo"},
- FunctionInfo{62, nullptr, "GetGameCardStopper"},
- FunctionInfo{63, nullptr, "IsSystemProgramInstalled"},
- FunctionInfo{64, nullptr, "StartApplyDeltaTask"},
- FunctionInfo{65, nullptr, "GetRequestServerStopper"},
- FunctionInfo{66, nullptr, "GetBackgroundApplyDeltaStressTaskInfo"},
- FunctionInfo{67, nullptr, "CancelApplicationApplyDelta"},
- FunctionInfo{68, nullptr, "ResumeApplicationApplyDelta"},
- FunctionInfo{69, nullptr, "CalculateApplicationApplyDeltaRequiredSize"},
- FunctionInfo{70, D<&IApplicationManagerInterface::ResumeAll>, "ResumeAll"},
- FunctionInfo{71, D<&IApplicationManagerInterface::GetStorageSize>, "GetStorageSize"},
- FunctionInfo{80, nullptr, "RequestDownloadApplication"},
- FunctionInfo{81, nullptr, "RequestDownloadAddOnContent"},
- FunctionInfo{82, nullptr, "DownloadApplication"},
- FunctionInfo{83, nullptr, "CheckApplicationResumeRights"},
- FunctionInfo{84, nullptr, "GetDynamicCommitEvent"},
- FunctionInfo{85, nullptr, "RequestUpdateApplication2"},
- FunctionInfo{86, nullptr, "EnableApplicationCrashReport"},
- FunctionInfo{87, nullptr, "IsApplicationCrashReportEnabled"},
- FunctionInfo{90, nullptr, "BoostSystemMemoryResourceLimit"},
- FunctionInfo{91, nullptr, "DeprecatedLaunchApplication"},
- FunctionInfo{92, nullptr, "GetRunningApplicationProgramId"},
- FunctionInfo{93, nullptr, "GetMainApplicationProgramIndex"},
- FunctionInfo{94, nullptr, "LaunchApplication"},
- FunctionInfo{95, nullptr, "GetApplicationLaunchInfo"},
- FunctionInfo{96, nullptr, "AcquireApplicationLaunchInfo"},
- FunctionInfo{97, nullptr, "GetMainApplicationProgramIndexByApplicationLaunchInfo"},
- FunctionInfo{98, nullptr, "EnableApplicationAllThreadDumpOnCrash"},
- FunctionInfo{99, nullptr, "LaunchDevMenu"},
- FunctionInfo{100, nullptr, "ResetToFactorySettings"},
- FunctionInfo{101, nullptr, "ResetToFactorySettingsWithoutUserSaveData"},
- FunctionInfo{102, nullptr, "ResetToFactorySettingsForRefurbishment"},
- FunctionInfo{103, nullptr, "ResetToFactorySettingsWithPlatformRegion"},
- FunctionInfo{104, nullptr, "ResetToFactorySettingsWithPlatformRegionAuthentication"},
- FunctionInfo{105, nullptr, "RequestResetToFactorySettingsSecurely"},
- FunctionInfo{106, nullptr, "RequestResetToFactorySettingsWithPlatformRegionAuthenticationSecurely"},
- FunctionInfo{200, nullptr, "CalculateUserSaveDataStatistics"},
- FunctionInfo{201, nullptr, "DeleteUserSaveDataAll"},
- FunctionInfo{210, nullptr, "DeleteUserSystemSaveData"},
- FunctionInfo{211, nullptr, "DeleteSaveData"},
- FunctionInfo{220, nullptr, "UnregisterNetworkServiceAccount"},
- FunctionInfo{221, D<&IApplicationManagerInterface::UnregisterNetworkServiceAccountWithUserSaveDataDeletion>, "UnregisterNetworkServiceAccountWithUserSaveDataDeletion"},
- FunctionInfo{300, nullptr, "GetApplicationShellEvent"},
- FunctionInfo{301, nullptr, "PopApplicationShellEventInfo"},
- FunctionInfo{302, nullptr, "LaunchLibraryApplet"},
- FunctionInfo{303, nullptr, "TerminateLibraryApplet"},
- FunctionInfo{304, nullptr, "LaunchSystemApplet"},
- FunctionInfo{305, nullptr, "TerminateSystemApplet"},
- FunctionInfo{306, nullptr, "LaunchOverlayApplet"},
- FunctionInfo{307, nullptr, "TerminateOverlayApplet"},
- FunctionInfo{400, D<&IApplicationManagerInterface::GetApplicationControlData>, "GetApplicationControlData"},
- FunctionInfo{401, nullptr, "InvalidateAllApplicationControlCache"},
- FunctionInfo{402, nullptr, "RequestDownloadApplicationControlData"},
- FunctionInfo{403, nullptr, "GetMaxApplicationControlCacheCount"},
- FunctionInfo{404, nullptr, "InvalidateApplicationControlCache"},
- FunctionInfo{405, nullptr, "ListApplicationControlCacheEntryInfo"},
- FunctionInfo{406, nullptr, "GetApplicationControlProperty"},
- FunctionInfo{407, &IApplicationManagerInterface::ListApplicationTitle, "ListApplicationTitle"},
- FunctionInfo{408, &IApplicationManagerInterface::ListApplicationIcon, "ListApplicationIcon"},
- FunctionInfo{411, nullptr, "Unknown411", MakeVersionGate({19,0,0})},
- FunctionInfo{412, nullptr, "Unknown412", MakeVersionGate({19,0,0})},
- FunctionInfo{413, nullptr, "Unknown413", MakeVersionGate({19,0,0})},
- FunctionInfo{414, nullptr, "Unknown414", MakeVersionGate({19,0,0})},
- FunctionInfo{415, nullptr, "Unknown415", MakeVersionGate({19,0,0})},
- FunctionInfo{416, nullptr, "Unknown416", MakeVersionGate({19,0,0})},
- FunctionInfo{417, nullptr, "InvalidateAllApplicationControlCacheOfTheStage", MakeVersionGate({19,0,0})},
- FunctionInfo{418, nullptr, "InvalidateApplicationControlCacheOfTheStage", MakeVersionGate({19,0,0})},
- FunctionInfo{419, D<&IApplicationManagerInterface::RequestDownloadApplicationControlDataInBackground>, "RequestDownloadApplicationControlDataInBackground"},
- FunctionInfo{420, nullptr, "CloneApplicationControlDataCacheForDebug"},
- FunctionInfo{421, nullptr, "Unknown421", MakeVersionGate({20,0,0})},
- FunctionInfo{422, nullptr, "Unknown422", MakeVersionGate({20,0,0})},
- FunctionInfo{423, nullptr, "Unknown423", MakeVersionGate({20,0,0})},
- FunctionInfo{424, nullptr, "Unknown424", MakeVersionGate({20,0,0})},
- FunctionInfo{425, nullptr, "Unknown425", MakeVersionGate({20,0,0})},
- FunctionInfo{426, nullptr, "Unknown426", MakeVersionGate({20,0,0})},
- FunctionInfo{427, nullptr, "Unknown427", MakeVersionGate({20,0,0})},
- FunctionInfo{428, nullptr, "Unknown428", MakeVersionGate({21,0,0})},
- FunctionInfo{429, nullptr, "Unknown429", MakeVersionGate({21,0,0})},
- FunctionInfo{430, nullptr, "Unknown430", MakeVersionGate({21,0,0})},
- FunctionInfo{502, nullptr, "RequestCheckGameCardRegistration"},
- FunctionInfo{503, nullptr, "RequestGameCardRegistrationGoldPoint"},
- FunctionInfo{504, nullptr, "RequestRegisterGameCard"},
- FunctionInfo{505, D<&IApplicationManagerInterface::GetGameCardMountFailureEvent>, "GetGameCardMountFailureEvent"},
- FunctionInfo{506, nullptr, "IsGameCardInserted"},
- FunctionInfo{507, nullptr, "EnsureGameCardAccess"},
- FunctionInfo{508, nullptr, "GetLastGameCardMountFailureResult"},
- FunctionInfo{509, nullptr, "ListApplicationIdOnGameCard"},
- FunctionInfo{510, nullptr, "GetGameCardPlatformRegion"},
- FunctionInfo{511, D<&IApplicationManagerInterface::GetGameCardWakenReadyEvent>, "GetGameCardWakenReadyEvent"},
- FunctionInfo{512, D<&IApplicationManagerInterface::IsGameCardApplicationRunning>, "IsGameCardApplicationRunning"},
- FunctionInfo{513, nullptr, "Unknown513", MakeVersionGate({20,0,0})},
- FunctionInfo{514, nullptr, "Unknown514", MakeVersionGate({20,0,0})},
- FunctionInfo{515, nullptr, "Unknown515", MakeVersionGate({20,0,0})},
- FunctionInfo{516, nullptr, "Unknown516", MakeVersionGate({21,0,0})},
- FunctionInfo{517, nullptr, "Unknown517", MakeVersionGate({21,0,0})},
- FunctionInfo{518, nullptr, "Unknown518", MakeVersionGate({21,0,0})},
- FunctionInfo{519, nullptr, "Unknown519", MakeVersionGate({21,0,0})},
- FunctionInfo{600, nullptr, "CountApplicationContentMeta"},
- FunctionInfo{601, nullptr, "ListApplicationContentMetaStatus"},
- FunctionInfo{602, nullptr, "ListAvailableAddOnContent"},
- FunctionInfo{603, nullptr, "GetOwnedApplicationContentMetaStatus"},
- FunctionInfo{604, nullptr, "RegisterContentsExternalKey"},
- FunctionInfo{605, nullptr, "ListApplicationContentMetaStatusWithRightsCheck"},
- FunctionInfo{606, nullptr, "GetContentMetaStorage"},
- FunctionInfo{607, nullptr, "ListAvailableAddOnContent"},
- FunctionInfo{609, nullptr, "ListAvailabilityAssuredAddOnContent"},
- FunctionInfo{610, nullptr, "GetInstalledContentMetaStorage"},
- FunctionInfo{611, nullptr, "PrepareAddOnContent"},
- FunctionInfo{700, nullptr, "PushDownloadTaskList"},
- FunctionInfo{701, nullptr, "ClearTaskStatusList"},
- FunctionInfo{702, nullptr, "RequestDownloadTaskList"},
- FunctionInfo{703, nullptr, "RequestEnsureDownloadTask"},
- FunctionInfo{704, nullptr, "ListDownloadTaskStatus"},
- FunctionInfo{705, nullptr, "RequestDownloadTaskListData"},
- FunctionInfo{800, nullptr, "RequestVersionList"},
- FunctionInfo{801, nullptr, "ListVersionList"},
- FunctionInfo{802, nullptr, "RequestVersionListData"},
- FunctionInfo{900, nullptr, "GetApplicationRecord"},
- FunctionInfo{901, nullptr, "GetApplicationRecordProperty"},
- FunctionInfo{902, nullptr, "EnableApplicationAutoUpdate"},
- FunctionInfo{903, nullptr, "DisableApplicationAutoUpdate"},
- FunctionInfo{904, D<&IApplicationManagerInterface::TouchApplication>, "TouchApplication"},
- FunctionInfo{905, nullptr, "RequestApplicationUpdate"},
- FunctionInfo{906, D<&IApplicationManagerInterface::IsApplicationUpdateRequested>, "IsApplicationUpdateRequested"},
- FunctionInfo{907, nullptr, "WithdrawApplicationUpdateRequest"},
- FunctionInfo{908, nullptr, "ListApplicationRecordInstalledContentMeta"},
- FunctionInfo{909, nullptr, "WithdrawCleanupAddOnContentsWithNoRightsRecommendation"},
- FunctionInfo{910, nullptr, "HasApplicationRecord"},
- FunctionInfo{911, nullptr, "SetPreInstalledApplication"},
- FunctionInfo{912, nullptr, "ClearPreInstalledApplicationFlag"},
- FunctionInfo{913, nullptr, "ListAllApplicationRecord"},
- FunctionInfo{914, nullptr, "HideApplicationRecord"},
- FunctionInfo{915, nullptr, "ShowApplicationRecord"},
- FunctionInfo{916, nullptr, "IsApplicationAutoDeleteDisabled"},
- FunctionInfo{916, nullptr, "Unknown916", MakeVersionGate({20,0,0})},
- FunctionInfo{917, nullptr, "Unknown917", MakeVersionGate({20,0,0})},
- FunctionInfo{918, nullptr, "Unknown918", MakeVersionGate({20,0,0})},
- FunctionInfo{919, nullptr, "Unknown919", MakeVersionGate({20,0,0})},
- FunctionInfo{920, nullptr, "Unknown920", MakeVersionGate({20,0,0})},
- FunctionInfo{921, nullptr, "Unknown921", MakeVersionGate({20,0,0})},
- FunctionInfo{922, nullptr, "Unknown922", MakeVersionGate({20,0,0})},
- FunctionInfo{923, nullptr, "Unknown923", MakeVersionGate({20,0,0})},
- FunctionInfo{928, nullptr, "Unknown928", MakeVersionGate({20,0,0})},
- FunctionInfo{929, nullptr, "Unknown929", MakeVersionGate({20,0,0})},
- FunctionInfo{930, nullptr, "Unknown930", MakeVersionGate({20,0,0})},
- FunctionInfo{931, nullptr, "Unknown931", MakeVersionGate({20,0,0})},
- FunctionInfo{933, nullptr, "Unknown933", MakeVersionGate({20,0,0})},
- FunctionInfo{934, nullptr, "Unknown934", MakeVersionGate({21,0,0})},
- FunctionInfo{935, nullptr, "Unknown935", MakeVersionGate({21,0,0})},
- FunctionInfo{936, D<&IApplicationManagerInterface::Unknown936>, "Unknown936", MakeVersionGate({21,0,0})},
- FunctionInfo{1000, nullptr, "RequestVerifyApplicationDeprecated"},
- FunctionInfo{1001, nullptr, "CorruptApplicationForDebug"},
- FunctionInfo{1002, nullptr, "RequestVerifyAddOnContentsRights"},
- FunctionInfo{1003, nullptr, "RequestVerifyApplication"},
- FunctionInfo{1004, nullptr, "CorruptContentForDebug"},
- FunctionInfo{1200, nullptr, "NeedsUpdateVulnerability"},
- FunctionInfo{1300, D<&IApplicationManagerInterface::IsAnyApplicationEntityInstalled>, "IsAnyApplicationEntityInstalled"},
- FunctionInfo{1301, nullptr, "DeleteApplicationContentEntities"},
- FunctionInfo{1302, nullptr, "CleanupUnrecordedApplicationEntity"},
- FunctionInfo{1303, nullptr, "CleanupAddOnContentsWithNoRights"},
- FunctionInfo{1304, nullptr, "DeleteApplicationContentEntity"},
- FunctionInfo{1305, nullptr, "TryDeleteRunningApplicationEntity"},
- FunctionInfo{1306, nullptr, "TryDeleteRunningApplicationCompletely"},
- FunctionInfo{1307, nullptr, "TryDeleteRunningApplicationContentEntities"},
- FunctionInfo{1308, nullptr, "DeleteApplicationCompletelyForDebug"},
- FunctionInfo{1309, nullptr, "CleanupUnavailableAddOnContents"},
- FunctionInfo{1310, nullptr, "RequestMoveApplicationEntity"},
- FunctionInfo{1311, nullptr, "EstimateSizeToMove"},
- FunctionInfo{1312, nullptr, "HasMovableEntity"},
- FunctionInfo{1313, nullptr, "CleanupOrphanContents"},
- FunctionInfo{1314, nullptr, "CheckPreconditionSatisfiedToMove"},
- FunctionInfo{1400, nullptr, "PrepareShutdown"},
- FunctionInfo{1500, nullptr, "FormatSdCard"},
- FunctionInfo{1501, nullptr, "NeedsSystemUpdateToFormatSdCard"},
- FunctionInfo{1502, nullptr, "GetLastSdCardFormatUnexpectedResult"},
- FunctionInfo{1504, nullptr, "InsertSdCard"},
- FunctionInfo{1505, nullptr, "RemoveSdCard"},
- FunctionInfo{1506, nullptr, "GetSdCardStartupStatus"},
- FunctionInfo{1508, nullptr, "Unknown1508", MakeVersionGate({20,0,0})},
- FunctionInfo{1509, nullptr, "Unknown1509", MakeVersionGate({20,0,0})},
- FunctionInfo{1510, nullptr, "Unknown1510", MakeVersionGate({20,0,0})},
- FunctionInfo{1511, nullptr, "Unknown1511", MakeVersionGate({20,0,0})},
- FunctionInfo{1512, nullptr, "Unknown1512", MakeVersionGate({20,0,0})},
- FunctionInfo{1600, nullptr, "GetSystemSeedForPseudoDeviceId"},
- FunctionInfo{1601, nullptr, "ResetSystemSeedForPseudoDeviceId"},
- FunctionInfo{1700, nullptr, "ListApplicationDownloadingContentMeta"},
- FunctionInfo{1701, D<&IApplicationManagerInterface::GetApplicationViewDeprecated>, "GetApplicationViewDeprecated"},
- FunctionInfo{1702, nullptr, "GetApplicationDownloadTaskStatus"},
- FunctionInfo{1703, nullptr, "GetApplicationViewDownloadErrorContext"},
- FunctionInfo{1704, D<&IApplicationManagerInterface::GetApplicationViewWithPromotionInfo>, "GetApplicationViewWithPromotionInfo"},
- FunctionInfo{1705, nullptr, "IsPatchAutoDeletableApplication"},
- FunctionInfo{1706, D<&IApplicationManagerInterface::GetApplicationView>, "GetApplicationView"},
- FunctionInfo{1800, nullptr, "IsNotificationSetupCompleted"},
- FunctionInfo{1801, nullptr, "GetLastNotificationInfoCount"},
- FunctionInfo{1802, nullptr, "ListLastNotificationInfo"},
- FunctionInfo{1803, nullptr, "ListNotificationTask"},
- FunctionInfo{1900, nullptr, "IsActiveAccount"},
- FunctionInfo{1901, nullptr, "RequestDownloadApplicationPrepurchasedRights"},
- FunctionInfo{1902, nullptr, "GetApplicationTicketInfo"},
- FunctionInfo{1903, nullptr, "RequestDownloadApplicationPrepurchasedRightsForAccount"},
- FunctionInfo{2000, nullptr, "GetSystemDeliveryInfo"},
- FunctionInfo{2001, nullptr, "SelectLatestSystemDeliveryInfo"},
- FunctionInfo{2002, nullptr, "VerifyDeliveryProtocolVersion"},
- FunctionInfo{2003, nullptr, "GetApplicationDeliveryInfo"},
- FunctionInfo{2004, nullptr, "HasAllContentsToDeliver"},
- FunctionInfo{2005, nullptr, "CompareApplicationDeliveryInfo"},
- FunctionInfo{2006, nullptr, "CanDeliverApplication"},
- FunctionInfo{2007, nullptr, "ListContentMetaKeyToDeliverApplication"},
- FunctionInfo{2008, nullptr, "NeedsSystemUpdateToDeliverApplication"},
- FunctionInfo{2009, nullptr, "EstimateRequiredSize"},
- FunctionInfo{2010, nullptr, "RequestReceiveApplication"},
- FunctionInfo{2011, nullptr, "CommitReceiveApplication"},
- FunctionInfo{2012, nullptr, "GetReceiveApplicationProgress"},
- FunctionInfo{2013, nullptr, "RequestSendApplication"},
- FunctionInfo{2014, nullptr, "GetSendApplicationProgress"},
- FunctionInfo{2015, nullptr, "CompareSystemDeliveryInfo"},
- FunctionInfo{2016, nullptr, "ListNotCommittedContentMeta"},
- FunctionInfo{2017, nullptr, "CreateDownloadTask"},
- FunctionInfo{2018, nullptr, "GetApplicationDeliveryInfoHash"},
- FunctionInfo{2019, nullptr, "Unknown2019", MakeVersionGate({20,0,0})},
- FunctionInfo{2050, D<&IApplicationManagerInterface::GetApplicationRightsOnClient>, "GetApplicationRightsOnClient"},
- FunctionInfo{2051, nullptr, "InvalidateRightsIdCache"},
- FunctionInfo{2052, nullptr, "Unknown2052", MakeVersionGate({20,0,0})},
- FunctionInfo{2053, nullptr, "Unknown2053", MakeVersionGate({20,0,0})},
- FunctionInfo{2100, D<&IApplicationManagerInterface::GetApplicationTerminateResult>, "GetApplicationTerminateResult"},
- FunctionInfo{2101, nullptr, "GetRawApplicationTerminateResult"},
- FunctionInfo{2150, nullptr, "CreateRightsEnvironment"},
- FunctionInfo{2151, nullptr, "DestroyRightsEnvironment"},
- FunctionInfo{2152, nullptr, "ActivateRightsEnvironment"},
- FunctionInfo{2153, nullptr, "DeactivateRightsEnvironment"},
- FunctionInfo{2154, nullptr, "ForceActivateRightsContextForExit"},
- FunctionInfo{2155, nullptr, "UpdateRightsEnvironmentStatus"},
- FunctionInfo{2156, nullptr, "CreateRightsEnvironmentForMicroApplication"},
- FunctionInfo{2160, nullptr, "AddTargetApplicationToRightsEnvironment"},
- FunctionInfo{2161, nullptr, "SetUsersToRightsEnvironment"},
- FunctionInfo{2170, nullptr, "GetRightsEnvironmentStatus"},
- FunctionInfo{2171, nullptr, "GetRightsEnvironmentStatusChangedEvent"},
- FunctionInfo{2180, nullptr, "RequestExtendRightsInRightsEnvironment"},
- FunctionInfo{2181, nullptr, "GetResultOfExtendRightsInRightsEnvironment"},
- FunctionInfo{2182, nullptr, "SetActiveRightsContextUsingStateToRightsEnvironment"},
- FunctionInfo{2183, nullptr, "Unknown2183", MakeVersionGate({20,1,0})},
- FunctionInfo{2190, nullptr, "GetRightsEnvironmentHandleForApplication"},
- FunctionInfo{2199, nullptr, "GetRightsEnvironmentCountForDebug"},
- FunctionInfo{2200, nullptr, "GetGameCardApplicationCopyIdentifier"},
- FunctionInfo{2201, nullptr, "GetInstalledApplicationCopyIdentifier"},
- FunctionInfo{2250, nullptr, "RequestReportActiveELicence"},
- FunctionInfo{2300, nullptr, "ListEventLog"},
- FunctionInfo{2350, nullptr, "PerformAutoUpdateByApplicationId"},
- FunctionInfo{2351, nullptr, "RequestNoDownloadRightsErrorResolution"},
- FunctionInfo{2352, nullptr, "RequestResolveNoDownloadRightsError"},
- FunctionInfo{2353, nullptr, "GetApplicationDownloadTaskInfo"},
- FunctionInfo{2354, nullptr, "PrioritizeApplicationBackgroundTask"},
- FunctionInfo{2355, nullptr, "PreferStorageEfficientUpdate"},
- FunctionInfo{2356, nullptr, "RequestStorageEfficientUpdatePreferable"},
- FunctionInfo{2357, nullptr, "EnableMultiCoreDownload"},
- FunctionInfo{2358, nullptr, "DisableMultiCoreDownload"},
- FunctionInfo{2359, nullptr, "IsMultiCoreDownloadEnabled"},
- FunctionInfo{2360, nullptr, "GetApplicationDownloadTaskCount", MakeVersionGate({19,0,0})},
- FunctionInfo{2361, nullptr, "GetMaxApplicationDownloadTaskCount", MakeVersionGate({19,0,0})},
- FunctionInfo{2362, nullptr, "Unknown2362", MakeVersionGate({20,0,0})},
- FunctionInfo{2363, nullptr, "Unknown2363", MakeVersionGate({20,0,0})},
- FunctionInfo{2364, nullptr, "Unknown2364", MakeVersionGate({20,0,0})},
- FunctionInfo{2365, nullptr, "Unknown2365", MakeVersionGate({20,0,0})},
- FunctionInfo{2366, nullptr, "Unknown2366", MakeVersionGate({20,0,0})},
- FunctionInfo{2367, nullptr, "Unknown2367", MakeVersionGate({20,0,0})},
- FunctionInfo{2368, nullptr, "Unknown2368", MakeVersionGate({20,0,0})},
- FunctionInfo{2369, nullptr, "Unknown2369", MakeVersionGate({21,0,0})},
- FunctionInfo{2400, nullptr, "GetPromotionInfo"},
- FunctionInfo{2401, nullptr, "CountPromotionInfo"},
- FunctionInfo{2402, nullptr, "ListPromotionInfo"},
- FunctionInfo{2403, nullptr, "ImportPromotionJsonForDebug"},
- FunctionInfo{2404, nullptr, "ClearPromotionInfoForDebug"},
- FunctionInfo{2500, nullptr, "ConfirmAvailableTime"},
- FunctionInfo{2510, nullptr, "CreateApplicationResource"},
- FunctionInfo{2511, nullptr, "GetApplicationResource"},
- FunctionInfo{2513, nullptr, "LaunchMicroApplication"},
- FunctionInfo{2514, nullptr, "ClearTaskOfAsyncTaskManager"},
- FunctionInfo{2515, nullptr, "CleanupAllPlaceHolderAndFragmentsIfNoTask"},
- FunctionInfo{2516, nullptr, "EnsureApplicationCertificate"},
- FunctionInfo{2517, nullptr, "CreateApplicationInstance"},
- FunctionInfo{2518, nullptr, "UpdateQualificationForDebug"},
- FunctionInfo{2519, nullptr, "IsQualificationTransitionSupported"},
- FunctionInfo{2520, D<&IApplicationManagerInterface::IsQualificationTransitionSupportedByProcessId>, "IsQualificationTransitionSupportedByProcessId"},
- FunctionInfo{2521, nullptr, "GetRightsUserChangedEvent"},
- FunctionInfo{2522, nullptr, "IsRomRedirectionAvailable"},
- FunctionInfo{2523, nullptr, "GetProgramId", MakeVersionGate({17,0,0})},
- FunctionInfo{2524, nullptr, "Unknown2524", MakeVersionGate({19,0,0})},
- FunctionInfo{2525, nullptr, "Unknown2525", MakeVersionGate({20,0,0})},
- FunctionInfo{2800, nullptr, "GetApplicationIdOfPreomia"},
- FunctionInfo{3000, nullptr, "RegisterDeviceLockKey"},
- FunctionInfo{3001, nullptr, "UnregisterDeviceLockKey"},
- FunctionInfo{3002, nullptr, "VerifyDeviceLockKey"},
- FunctionInfo{3003, nullptr, "HideApplicationIcon"},
- FunctionInfo{3004, nullptr, "ShowApplicationIcon"},
- FunctionInfo{3005, nullptr, "HideApplicationTitle"},
- FunctionInfo{3006, nullptr, "ShowApplicationTitle"},
- FunctionInfo{3007, nullptr, "EnableGameCard"},
- FunctionInfo{3008, nullptr, "DisableGameCard"},
- FunctionInfo{3009, nullptr, "EnableLocalContentShare"},
- FunctionInfo{3010, nullptr, "DisableLocalContentShare"},
- FunctionInfo{3011, nullptr, "IsApplicationIconHidden"},
- FunctionInfo{3012, nullptr, "IsApplicationTitleHidden"},
- FunctionInfo{3013, nullptr, "IsGameCardEnabled"},
- FunctionInfo{3014, nullptr, "IsLocalContentShareEnabled"},
- FunctionInfo{3050, nullptr, "ListAssignELicenseTaskResult"},
- FunctionInfo{3104, nullptr, "GetApplicationNintendoLogo", MakeVersionGate({18,0,0})},
- FunctionInfo{3105, nullptr, "GetApplicationStartupMovie", MakeVersionGate({18,0,0})},
- FunctionInfo{4000, nullptr, "Unknown4000", MakeVersionGate({20,0,0})},
- FunctionInfo{4004, nullptr, "Unknown4004", MakeVersionGate({20,0,0})},
- FunctionInfo{4006, nullptr, "Unknown4006", MakeVersionGate({20,0,0})},
- FunctionInfo{4007, nullptr, "Unknown4007", MakeVersionGate({20,0,0})},
- FunctionInfo{4008, nullptr, "Unknown4008", MakeVersionGate({20,0,0})},
- FunctionInfo{4009, nullptr, "Unknown4009", MakeVersionGate({20,0,0})},
- FunctionInfo{4010, nullptr, "Unknown4010", MakeVersionGate({20,0,0})},
- FunctionInfo{4011, nullptr, "Unknown4011", MakeVersionGate({20,0,0})},
- FunctionInfo{4012, nullptr, "Unknown4012", MakeVersionGate({20,0,0})},
- FunctionInfo{4013, nullptr, "Unknown4013", MakeVersionGate({20,0,0})},
- FunctionInfo{4015, nullptr, "Unknown4015", MakeVersionGate({20,0,0})},
- FunctionInfo{4017, nullptr, "Unknown4017", MakeVersionGate({20,0,0})},
- FunctionInfo{4019, nullptr, "Unknown4019", MakeVersionGate({20,0,0})},
- FunctionInfo{4020, nullptr, "Unknown4020", MakeVersionGate({20,0,0})},
- FunctionInfo{4021, nullptr, "Unknown4021", MakeVersionGate({20,0,0})},
- FunctionInfo{4022, D<&IApplicationManagerInterface::Unknown4022>, "Unknown4022", MakeVersionGate({20,0,0})},
- FunctionInfo{4023, D<&IApplicationManagerInterface::Unknown4023>, "Unknown4023", MakeVersionGate({20,0,0})},
- FunctionInfo{4024, nullptr, "Unknown4024", MakeVersionGate({20,0,0})},
- FunctionInfo{4025, nullptr, "Unknown4025", MakeVersionGate({20,0,0})},
- FunctionInfo{4026, nullptr, "Unknown4026", MakeVersionGate({20,0,0})},
- FunctionInfo{4027, nullptr, "Unknown4027", MakeVersionGate({20,0,0})},
- FunctionInfo{4028, nullptr, "Unknown4028", MakeVersionGate({20,0,0})},
- FunctionInfo{4029, nullptr, "Unknown4029", MakeVersionGate({20,0,0})},
- FunctionInfo{4030, nullptr, "Unknown4030", MakeVersionGate({20,0,0})},
- FunctionInfo{4031, nullptr, "Unknown4031", MakeVersionGate({20,0,0})},
- FunctionInfo{4032, nullptr, "Unknown4032", MakeVersionGate({20,0,0})},
- FunctionInfo{4033, nullptr, "Unknown4033", MakeVersionGate({20,0,0})},
- FunctionInfo{4034, nullptr, "Unknown4034", MakeVersionGate({20,0,0})},
- FunctionInfo{4035, nullptr, "Unknown4035", MakeVersionGate({20,0,0})},
- FunctionInfo{4037, nullptr, "Unknown4037", MakeVersionGate({20,0,0})},
- FunctionInfo{4038, nullptr, "Unknown4038", MakeVersionGate({20,0,0})},
- FunctionInfo{4039, nullptr, "Unknown4039", MakeVersionGate({20,0,0})},
- FunctionInfo{4040, nullptr, "Unknown4040", MakeVersionGate({20,0,0})},
- FunctionInfo{4041, nullptr, "Unknown4041", MakeVersionGate({20,0,0})},
- FunctionInfo{4042, D<&IApplicationManagerInterface::Unknown4042>, "Unknown4042", MakeVersionGate({20,0,0})},
- FunctionInfo{4043, nullptr, "Unknown4043", MakeVersionGate({20,0,0})},
- FunctionInfo{4044, nullptr, "Unknown4044", MakeVersionGate({20,0,0})},
- FunctionInfo{4045, nullptr, "Unknown4045", MakeVersionGate({20,0,0})},
- FunctionInfo{4046, nullptr, "Unknown4046", MakeVersionGate({20,0,0})},
- FunctionInfo{4049, nullptr, "Unknown4049", MakeVersionGate({20,0,0})},
- FunctionInfo{4050, nullptr, "Unknown4050", MakeVersionGate({20,0,0})},
- FunctionInfo{4051, nullptr, "Unknown4051", MakeVersionGate({20,0,0})},
- FunctionInfo{4052, nullptr, "Unknown4052", MakeVersionGate({20,0,0})},
- FunctionInfo{4053, D<&IApplicationManagerInterface::Unknown4053>, "Unknown4053", MakeVersionGate({20,0,0})},
- FunctionInfo{4054, nullptr, "Unknown4054", MakeVersionGate({20,0,0})},
- FunctionInfo{4055, nullptr, "Unknown4055", MakeVersionGate({20,0,0})},
- FunctionInfo{4056, nullptr, "Unknown4056", MakeVersionGate({20,0,0})},
- FunctionInfo{4057, nullptr, "Unknown4057", MakeVersionGate({20,0,0})},
- FunctionInfo{4058, nullptr, "Unknown4058", MakeVersionGate({20,0,0})},
- FunctionInfo{4059, nullptr, "Unknown4059", MakeVersionGate({20,0,0})},
- FunctionInfo{4060, nullptr, "Unknown4060", MakeVersionGate({20,0,0})},
- FunctionInfo{4061, nullptr, "Unknown4061", MakeVersionGate({20,0,0})},
- FunctionInfo{4062, nullptr, "Unknown4062", MakeVersionGate({20,0,0})},
- FunctionInfo{4063, nullptr, "Unknown4063", MakeVersionGate({20,0,0})},
- FunctionInfo{4064, nullptr, "Unknown4064", MakeVersionGate({20,0,0})},
- FunctionInfo{4065, nullptr, "Unknown4065", MakeVersionGate({20,0,0})},
- FunctionInfo{4066, nullptr, "Unknown4066", MakeVersionGate({20,0,0})},
- FunctionInfo{4067, nullptr, "Unknown4067", MakeVersionGate({20,0,0})},
- FunctionInfo{4068, nullptr, "Unknown4068", MakeVersionGate({20,0,0})},
- FunctionInfo{4069, nullptr, "Unknown4069", MakeVersionGate({20,0,0})},
- FunctionInfo{4070, nullptr, "Unknown4070", MakeVersionGate({20,0,0})},
- FunctionInfo{4071, nullptr, "Unknown4071", MakeVersionGate({20,0,0})},
- FunctionInfo{4072, nullptr, "Unknown4072", MakeVersionGate({20,0,0})},
- FunctionInfo{4073, nullptr, "Unknown4073", MakeVersionGate({20,0,0})},
- FunctionInfo{4074, nullptr, "Unknown4074", MakeVersionGate({20,0,0})},
- FunctionInfo{4075, nullptr, "Unknown4075", MakeVersionGate({20,0,0})},
- FunctionInfo{4076, nullptr, "Unknown4076", MakeVersionGate({20,0,0})},
- FunctionInfo{4077, nullptr, "Unknown4077", MakeVersionGate({20,0,0})},
- FunctionInfo{4078, nullptr, "Unknown4078", MakeVersionGate({20,0,0})},
- FunctionInfo{4079, nullptr, "Unknown4079", MakeVersionGate({20,0,0})},
- FunctionInfo{4080, nullptr, "Unknown4080", MakeVersionGate({20,0,0})},
- FunctionInfo{4081, nullptr, "Unknown4081", MakeVersionGate({20,0,0})},
- FunctionInfo{4083, nullptr, "Unknown4083", MakeVersionGate({20,0,0})},
- FunctionInfo{4084, nullptr, "Unknown4084", MakeVersionGate({20,0,0})},
- FunctionInfo{4085, nullptr, "Unknown4085", MakeVersionGate({20,0,0})},
- FunctionInfo{4086, nullptr, "Unknown4086", MakeVersionGate({20,0,0})},
- FunctionInfo{4087, nullptr, "Unknown4087", MakeVersionGate({20,0,0})},
- FunctionInfo{4088, D<&IApplicationManagerInterface::Unknown4022>, "Unknown4088", MakeVersionGate({20,0,0})},
- FunctionInfo{4089, nullptr, "Unknown4089", MakeVersionGate({20,0,0})},
- FunctionInfo{4090, nullptr, "Unknown4090", MakeVersionGate({20,0,0})},
- FunctionInfo{4091, nullptr, "Unknown4091", MakeVersionGate({20,0,0})},
- FunctionInfo{4092, nullptr, "Unknown4092", MakeVersionGate({20,0,0})},
- FunctionInfo{4093, nullptr, "Unknown4093", MakeVersionGate({20,0,0})},
- FunctionInfo{4094, nullptr, "Unknown4094", MakeVersionGate({20,0,0})},
- FunctionInfo{4095, nullptr, "Unknown4095", MakeVersionGate({20,0,0})},
- FunctionInfo{4096, nullptr, "Unknown4096", MakeVersionGate({20,0,0})},
- FunctionInfo{4097, nullptr, "Unknown4097", MakeVersionGate({20,0,0})},
- FunctionInfo{4099, nullptr, "Unknown4099", MakeVersionGate({21,0,0})},
- FunctionInfo{4105, D<&IApplicationManagerInterface::Unknown4105>, "Unknown4105", MakeVersionGate({23,0,0})},
- FunctionInfo{5000, nullptr, "Unknown5000", MakeVersionGate({18,0,0})},
- FunctionInfo{5001, nullptr, "Unknown5001", MakeVersionGate({18,0,0})},
- FunctionInfo{9999, nullptr, "GetApplicationCertificate", MakeVersionGate({10,0,0}, {10,2,0})}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_)
: ServiceFramework{system_, "IApplicationManagerInterface"},
service_context{system, "IApplicationManagerInterface"},
@@ -484,6 +32,458 @@ IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_
gamecard_update_detection_event{service_context},
gamecard_mount_status_event{service_context}, gamecard_mount_failure_event{service_context},
gamecard_waken_ready_event{service_context}, unknown_event{service_context} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IApplicationManagerInterface::ListApplicationRecord>, "ListApplicationRecord"},
+ {1, nullptr, "GenerateApplicationRecordCount"},
+ {2, D<&IApplicationManagerInterface::GetApplicationRecordUpdateSystemEvent>, "GetApplicationRecordUpdateSystemEvent"},
+ {3, nullptr, "GetApplicationViewDeprecated"},
+ {4, D<&IApplicationManagerInterface::DeleteApplicationEntity>, "DeleteApplicationEntity"},
+ {5, D<&IApplicationManagerInterface::DeleteApplicationCompletely>, "DeleteApplicationCompletely"},
+ {6, nullptr, "IsAnyApplicationEntityRedundant"},
+ {7, nullptr, "DeleteRedundantApplicationEntity"},
+ {8, nullptr, "IsApplicationEntityMovable"},
+ {9, nullptr, "MoveApplicationEntity"},
+ {11, nullptr, "CalculateApplicationOccupiedSize"},
+ {16, &IApplicationManagerInterface::PushApplicationRecord, "PushApplicationRecord"},
+ {17, nullptr, "ListApplicationRecordContentMeta"},
+ {19, nullptr, "LaunchApplicationOld"},
+ {21, nullptr, "GetApplicationContentPath"},
+ {22, nullptr, "TerminateApplication"},
+ {23, nullptr, "ResolveApplicationContentPath"},
+ {26, nullptr, "BeginInstallApplication"},
+ {27, nullptr, "DeleteApplicationRecord"},
+ {30, nullptr, "RequestApplicationUpdateInfo"},
+ {31, nullptr, "RequestUpdateApplication"},
+ {32, nullptr, "CancelApplicationDownload"},
+ {33, nullptr, "ResumeApplicationDownload"},
+ {35, nullptr, "UpdateVersionList"},
+ {36, nullptr, "PushLaunchVersion"},
+ {37, nullptr, "ListRequiredVersion"},
+ {38, D<&IApplicationManagerInterface::CheckApplicationLaunchVersion>, "CheckApplicationLaunchVersion"},
+ {39, nullptr, "CheckApplicationLaunchRights"},
+ {40, D<&IApplicationManagerInterface::GetApplicationLogoData>, "GetApplicationLogoData"},
+ {41, nullptr, "CalculateApplicationDownloadRequiredSize"},
+ {42, nullptr, "CleanupSdCard"},
+ {43, D<&IApplicationManagerInterface::CheckSdCardMountStatus>, "CheckSdCardMountStatus"},
+ {44, D<&IApplicationManagerInterface::GetSdCardMountStatusChangedEvent>, "GetSdCardMountStatusChangedEvent"},
+ {45, nullptr, "GetGameCardAttachmentEvent"},
+ {46, nullptr, "GetGameCardAttachmentInfo"},
+ {47, D<&IApplicationManagerInterface::GetTotalSpaceSize>, "GetTotalSpaceSize"},
+ {48, D<&IApplicationManagerInterface::GetFreeSpaceSize>, "GetFreeSpaceSize"},
+ {49, nullptr, "GetSdCardRemovedEvent"},
+ {52, D<&IApplicationManagerInterface::GetGameCardUpdateDetectionEvent>, "GetGameCardUpdateDetectionEvent"},
+ {53, nullptr, "DisableApplicationAutoDelete"},
+ {54, nullptr, "EnableApplicationAutoDelete"},
+ {55, D<&IApplicationManagerInterface::GetApplicationDesiredLanguage>, "GetApplicationDesiredLanguage"},
+ {56, nullptr, "SetApplicationTerminateResult"},
+ {57, nullptr, "ClearApplicationTerminateResult"},
+ {58, nullptr, "GetLastSdCardMountUnexpectedResult"},
+ {59, D<&IApplicationManagerInterface::ConvertApplicationLanguageToLanguageCode>, "ConvertApplicationLanguageToLanguageCode"},
+ {60, nullptr, "ConvertLanguageCodeToApplicationLanguage"},
+ {61, nullptr, "GetBackgroundDownloadStressTaskInfo"},
+ {62, nullptr, "GetGameCardStopper"},
+ {63, nullptr, "IsSystemProgramInstalled"},
+ {64, nullptr, "StartApplyDeltaTask"},
+ {65, nullptr, "GetRequestServerStopper"},
+ {66, nullptr, "GetBackgroundApplyDeltaStressTaskInfo"},
+ {67, nullptr, "CancelApplicationApplyDelta"},
+ {68, nullptr, "ResumeApplicationApplyDelta"},
+ {69, nullptr, "CalculateApplicationApplyDeltaRequiredSize"},
+ {70, D<&IApplicationManagerInterface::ResumeAll>, "ResumeAll"},
+ {71, D<&IApplicationManagerInterface::GetStorageSize>, "GetStorageSize"},
+ {80, nullptr, "RequestDownloadApplication"},
+ {81, nullptr, "RequestDownloadAddOnContent"},
+ {82, nullptr, "DownloadApplication"},
+ {83, nullptr, "CheckApplicationResumeRights"},
+ {84, nullptr, "GetDynamicCommitEvent"},
+ {85, nullptr, "RequestUpdateApplication2"},
+ {86, nullptr, "EnableApplicationCrashReport"},
+ {87, nullptr, "IsApplicationCrashReportEnabled"},
+ {90, nullptr, "BoostSystemMemoryResourceLimit"},
+ {91, nullptr, "DeprecatedLaunchApplication"},
+ {92, nullptr, "GetRunningApplicationProgramId"},
+ {93, nullptr, "GetMainApplicationProgramIndex"},
+ {94, nullptr, "LaunchApplication"},
+ {95, nullptr, "GetApplicationLaunchInfo"},
+ {96, nullptr, "AcquireApplicationLaunchInfo"},
+ {97, nullptr, "GetMainApplicationProgramIndexByApplicationLaunchInfo"},
+ {98, nullptr, "EnableApplicationAllThreadDumpOnCrash"},
+ {99, nullptr, "LaunchDevMenu"},
+ {100, nullptr, "ResetToFactorySettings"},
+ {101, nullptr, "ResetToFactorySettingsWithoutUserSaveData"},
+ {102, nullptr, "ResetToFactorySettingsForRefurbishment"},
+ {103, nullptr, "ResetToFactorySettingsWithPlatformRegion"},
+ {104, nullptr, "ResetToFactorySettingsWithPlatformRegionAuthentication"},
+ {105, nullptr, "RequestResetToFactorySettingsSecurely"},
+ {106, nullptr, "RequestResetToFactorySettingsWithPlatformRegionAuthenticationSecurely"},
+ {200, nullptr, "CalculateUserSaveDataStatistics"},
+ {201, nullptr, "DeleteUserSaveDataAll"},
+ {210, nullptr, "DeleteUserSystemSaveData"},
+ {211, nullptr, "DeleteSaveData"},
+ {220, nullptr, "UnregisterNetworkServiceAccount"},
+ {221, D<&IApplicationManagerInterface::UnregisterNetworkServiceAccountWithUserSaveDataDeletion>, "UnregisterNetworkServiceAccountWithUserSaveDataDeletion"},
+ {300, nullptr, "GetApplicationShellEvent"},
+ {301, nullptr, "PopApplicationShellEventInfo"},
+ {302, nullptr, "LaunchLibraryApplet"},
+ {303, nullptr, "TerminateLibraryApplet"},
+ {304, nullptr, "LaunchSystemApplet"},
+ {305, nullptr, "TerminateSystemApplet"},
+ {306, nullptr, "LaunchOverlayApplet"},
+ {307, nullptr, "TerminateOverlayApplet"},
+ {400, D<&IApplicationManagerInterface::GetApplicationControlData>, "GetApplicationControlData"},
+ {401, nullptr, "InvalidateAllApplicationControlCache"},
+ {402, nullptr, "RequestDownloadApplicationControlData"},
+ {403, nullptr, "GetMaxApplicationControlCacheCount"},
+ {404, nullptr, "InvalidateApplicationControlCache"},
+ {405, nullptr, "ListApplicationControlCacheEntryInfo"},
+ {406, nullptr, "GetApplicationControlProperty"},
+ {407, &IApplicationManagerInterface::ListApplicationTitle, "ListApplicationTitle"},
+ {408, &IApplicationManagerInterface::ListApplicationIcon, "ListApplicationIcon"},
+ {411, nullptr, "Unknown411"}, //19.0.0+
+ {412, nullptr, "Unknown412"}, //19.0.0+
+ {413, nullptr, "Unknown413"}, //19.0.0+
+ {414, nullptr, "Unknown414"}, //19.0.0+
+ {415, nullptr, "Unknown415"}, //19.0.0+
+ {416, nullptr, "Unknown416"}, //19.0.0+
+ {417, nullptr, "InvalidateAllApplicationControlCacheOfTheStage"}, //19.0.0+
+ {418, nullptr, "InvalidateApplicationControlCacheOfTheStage"}, //19.0.0+
+ {419, D<&IApplicationManagerInterface::RequestDownloadApplicationControlDataInBackground>, "RequestDownloadApplicationControlDataInBackground"},
+ {420, nullptr, "CloneApplicationControlDataCacheForDebug"},
+ {421, nullptr, "Unknown421"}, //20.0.0+
+ {422, nullptr, "Unknown422"}, //20.0.0+
+ {423, nullptr, "Unknown423"}, //20.0.0+
+ {424, nullptr, "Unknown424"}, //20.0.0+
+ {425, nullptr, "Unknown425"}, //20.0.0+
+ {426, nullptr, "Unknown426"}, //20.0.0+
+ {427, nullptr, "Unknown427"}, //20.0.0+
+ {428, nullptr, "Unknown428"}, //21.0.0+
+ {429, nullptr, "Unknown429"}, //21.0.0+
+ {430, nullptr, "Unknown430"}, //21.0.0+
+ {502, nullptr, "RequestCheckGameCardRegistration"},
+ {503, nullptr, "RequestGameCardRegistrationGoldPoint"},
+ {504, nullptr, "RequestRegisterGameCard"},
+ {505, D<&IApplicationManagerInterface::GetGameCardMountFailureEvent>, "GetGameCardMountFailureEvent"},
+ {506, nullptr, "IsGameCardInserted"},
+ {507, nullptr, "EnsureGameCardAccess"},
+ {508, nullptr, "GetLastGameCardMountFailureResult"},
+ {509, nullptr, "ListApplicationIdOnGameCard"},
+ {510, nullptr, "GetGameCardPlatformRegion"},
+ {511, D<&IApplicationManagerInterface::GetGameCardWakenReadyEvent>, "GetGameCardWakenReadyEvent"},
+ {512, D<&IApplicationManagerInterface::IsGameCardApplicationRunning>, "IsGameCardApplicationRunning"},
+ {513, nullptr, "Unknown513"}, //20.0.0+
+ {514, nullptr, "Unknown514"}, //20.0.0+
+ {515, nullptr, "Unknown515"}, //20.0.0+
+ {516, nullptr, "Unknown516"}, //21.0.0+
+ {517, nullptr, "Unknown517"}, //21.0.0+
+ {518, nullptr, "Unknown518"}, //21.0.0+
+ {519, nullptr, "Unknown519"}, //21.0.0+
+ {600, nullptr, "CountApplicationContentMeta"},
+ {601, nullptr, "ListApplicationContentMetaStatus"},
+ {602, nullptr, "ListAvailableAddOnContent"},
+ {603, nullptr, "GetOwnedApplicationContentMetaStatus"},
+ {604, nullptr, "RegisterContentsExternalKey"},
+ {605, nullptr, "ListApplicationContentMetaStatusWithRightsCheck"},
+ {606, nullptr, "GetContentMetaStorage"},
+ {607, nullptr, "ListAvailableAddOnContent"},
+ {609, nullptr, "ListAvailabilityAssuredAddOnContent"},
+ {610, nullptr, "GetInstalledContentMetaStorage"},
+ {611, nullptr, "PrepareAddOnContent"},
+ {700, nullptr, "PushDownloadTaskList"},
+ {701, nullptr, "ClearTaskStatusList"},
+ {702, nullptr, "RequestDownloadTaskList"},
+ {703, nullptr, "RequestEnsureDownloadTask"},
+ {704, nullptr, "ListDownloadTaskStatus"},
+ {705, nullptr, "RequestDownloadTaskListData"},
+ {800, nullptr, "RequestVersionList"},
+ {801, nullptr, "ListVersionList"},
+ {802, nullptr, "RequestVersionListData"},
+ {900, nullptr, "GetApplicationRecord"},
+ {901, nullptr, "GetApplicationRecordProperty"},
+ {902, nullptr, "EnableApplicationAutoUpdate"},
+ {903, nullptr, "DisableApplicationAutoUpdate"},
+ {904, D<&IApplicationManagerInterface::TouchApplication>, "TouchApplication"},
+ {905, nullptr, "RequestApplicationUpdate"},
+ {906, D<&IApplicationManagerInterface::IsApplicationUpdateRequested>, "IsApplicationUpdateRequested"},
+ {907, nullptr, "WithdrawApplicationUpdateRequest"},
+ {908, nullptr, "ListApplicationRecordInstalledContentMeta"},
+ {909, nullptr, "WithdrawCleanupAddOnContentsWithNoRightsRecommendation"},
+ {910, nullptr, "HasApplicationRecord"},
+ {911, nullptr, "SetPreInstalledApplication"},
+ {912, nullptr, "ClearPreInstalledApplicationFlag"},
+ {913, nullptr, "ListAllApplicationRecord"},
+ {914, nullptr, "HideApplicationRecord"},
+ {915, nullptr, "ShowApplicationRecord"},
+ {916, nullptr, "IsApplicationAutoDeleteDisabled"},
+ {916, nullptr, "Unknown916"}, //20.0.0+
+ {917, nullptr, "Unknown917"}, //20.0.0+
+ {918, nullptr, "Unknown918"}, //20.0.0+
+ {919, nullptr, "Unknown919"}, //20.0.0+
+ {920, nullptr, "Unknown920"}, //20.0.0+
+ {921, nullptr, "Unknown921"}, //20.0.0+
+ {922, nullptr, "Unknown922"}, //20.0.0+
+ {923, nullptr, "Unknown923"}, //20.0.0+
+ {928, nullptr, "Unknown928"}, //20.0.0+
+ {929, nullptr, "Unknown929"}, //20.0.0+
+ {930, nullptr, "Unknown930"}, //20.0.0+
+ {931, nullptr, "Unknown931"}, //20.0.0+
+ {933, nullptr, "Unknown933"}, //20.0.0+
+ {934, nullptr, "Unknown934"}, //21.0.0+
+ {935, nullptr, "Unknown935"}, //21.0.0+
+ {936, D<&IApplicationManagerInterface::Unknown936>, "Unknown936"}, //21.0.0+
+ {1000, nullptr, "RequestVerifyApplicationDeprecated"},
+ {1001, nullptr, "CorruptApplicationForDebug"},
+ {1002, nullptr, "RequestVerifyAddOnContentsRights"},
+ {1003, nullptr, "RequestVerifyApplication"},
+ {1004, nullptr, "CorruptContentForDebug"},
+ {1200, nullptr, "NeedsUpdateVulnerability"},
+ {1300, D<&IApplicationManagerInterface::IsAnyApplicationEntityInstalled>, "IsAnyApplicationEntityInstalled"},
+ {1301, nullptr, "DeleteApplicationContentEntities"},
+ {1302, nullptr, "CleanupUnrecordedApplicationEntity"},
+ {1303, nullptr, "CleanupAddOnContentsWithNoRights"},
+ {1304, nullptr, "DeleteApplicationContentEntity"},
+ {1305, nullptr, "TryDeleteRunningApplicationEntity"},
+ {1306, nullptr, "TryDeleteRunningApplicationCompletely"},
+ {1307, nullptr, "TryDeleteRunningApplicationContentEntities"},
+ {1308, nullptr, "DeleteApplicationCompletelyForDebug"},
+ {1309, nullptr, "CleanupUnavailableAddOnContents"},
+ {1310, nullptr, "RequestMoveApplicationEntity"},
+ {1311, nullptr, "EstimateSizeToMove"},
+ {1312, nullptr, "HasMovableEntity"},
+ {1313, nullptr, "CleanupOrphanContents"},
+ {1314, nullptr, "CheckPreconditionSatisfiedToMove"},
+ {1400, nullptr, "PrepareShutdown"},
+ {1500, nullptr, "FormatSdCard"},
+ {1501, nullptr, "NeedsSystemUpdateToFormatSdCard"},
+ {1502, nullptr, "GetLastSdCardFormatUnexpectedResult"},
+ {1504, nullptr, "InsertSdCard"},
+ {1505, nullptr, "RemoveSdCard"},
+ {1506, nullptr, "GetSdCardStartupStatus"},
+ {1508, nullptr, "Unknown1508"}, //20.0.0+
+ {1509, nullptr, "Unknown1509"}, //20.0.0+
+ {1510, nullptr, "Unknown1510"}, //20.0.0+
+ {1511, nullptr, "Unknown1511"}, //20.0.0+
+ {1512, nullptr, "Unknown1512"}, //20.0.0+
+ {1600, nullptr, "GetSystemSeedForPseudoDeviceId"},
+ {1601, nullptr, "ResetSystemSeedForPseudoDeviceId"},
+ {1700, nullptr, "ListApplicationDownloadingContentMeta"},
+ {1701, D<&IApplicationManagerInterface::GetApplicationViewDeprecated>, "GetApplicationViewDeprecated"},
+ {1702, nullptr, "GetApplicationDownloadTaskStatus"},
+ {1703, nullptr, "GetApplicationViewDownloadErrorContext"},
+ {1704, D<&IApplicationManagerInterface::GetApplicationViewWithPromotionInfo>, "GetApplicationViewWithPromotionInfo"},
+ {1705, nullptr, "IsPatchAutoDeletableApplication"},
+ {1706, D<&IApplicationManagerInterface::GetApplicationView>, "GetApplicationView"},
+ {1800, nullptr, "IsNotificationSetupCompleted"},
+ {1801, nullptr, "GetLastNotificationInfoCount"},
+ {1802, nullptr, "ListLastNotificationInfo"},
+ {1803, nullptr, "ListNotificationTask"},
+ {1900, nullptr, "IsActiveAccount"},
+ {1901, nullptr, "RequestDownloadApplicationPrepurchasedRights"},
+ {1902, nullptr, "GetApplicationTicketInfo"},
+ {1903, nullptr, "RequestDownloadApplicationPrepurchasedRightsForAccount"},
+ {2000, nullptr, "GetSystemDeliveryInfo"},
+ {2001, nullptr, "SelectLatestSystemDeliveryInfo"},
+ {2002, nullptr, "VerifyDeliveryProtocolVersion"},
+ {2003, nullptr, "GetApplicationDeliveryInfo"},
+ {2004, nullptr, "HasAllContentsToDeliver"},
+ {2005, nullptr, "CompareApplicationDeliveryInfo"},
+ {2006, nullptr, "CanDeliverApplication"},
+ {2007, nullptr, "ListContentMetaKeyToDeliverApplication"},
+ {2008, nullptr, "NeedsSystemUpdateToDeliverApplication"},
+ {2009, nullptr, "EstimateRequiredSize"},
+ {2010, nullptr, "RequestReceiveApplication"},
+ {2011, nullptr, "CommitReceiveApplication"},
+ {2012, nullptr, "GetReceiveApplicationProgress"},
+ {2013, nullptr, "RequestSendApplication"},
+ {2014, nullptr, "GetSendApplicationProgress"},
+ {2015, nullptr, "CompareSystemDeliveryInfo"},
+ {2016, nullptr, "ListNotCommittedContentMeta"},
+ {2017, nullptr, "CreateDownloadTask"},
+ {2018, nullptr, "GetApplicationDeliveryInfoHash"},
+ {2019, nullptr, "Unknown2019"}, //20.0.0+
+ {2050, D<&IApplicationManagerInterface::GetApplicationRightsOnClient>, "GetApplicationRightsOnClient"},
+ {2051, nullptr, "InvalidateRightsIdCache"},
+ {2052, nullptr, "Unknown2052"}, //20.0.0+
+ {2053, nullptr, "Unknown2053"}, //20.0.0+
+ {2100, D<&IApplicationManagerInterface::GetApplicationTerminateResult>, "GetApplicationTerminateResult"},
+ {2101, nullptr, "GetRawApplicationTerminateResult"},
+ {2150, nullptr, "CreateRightsEnvironment"},
+ {2151, nullptr, "DestroyRightsEnvironment"},
+ {2152, nullptr, "ActivateRightsEnvironment"},
+ {2153, nullptr, "DeactivateRightsEnvironment"},
+ {2154, nullptr, "ForceActivateRightsContextForExit"},
+ {2155, nullptr, "UpdateRightsEnvironmentStatus"},
+ {2156, nullptr, "CreateRightsEnvironmentForMicroApplication"},
+ {2160, nullptr, "AddTargetApplicationToRightsEnvironment"},
+ {2161, nullptr, "SetUsersToRightsEnvironment"},
+ {2170, nullptr, "GetRightsEnvironmentStatus"},
+ {2171, nullptr, "GetRightsEnvironmentStatusChangedEvent"},
+ {2180, nullptr, "RequestExtendRightsInRightsEnvironment"},
+ {2181, nullptr, "GetResultOfExtendRightsInRightsEnvironment"},
+ {2182, nullptr, "SetActiveRightsContextUsingStateToRightsEnvironment"},
+ {2183, nullptr, "Unknown2183"}, //20.1.0+
+ {2190, nullptr, "GetRightsEnvironmentHandleForApplication"},
+ {2199, nullptr, "GetRightsEnvironmentCountForDebug"},
+ {2200, nullptr, "GetGameCardApplicationCopyIdentifier"},
+ {2201, nullptr, "GetInstalledApplicationCopyIdentifier"},
+ {2250, nullptr, "RequestReportActiveELicence"},
+ {2300, nullptr, "ListEventLog"},
+ {2350, nullptr, "PerformAutoUpdateByApplicationId"},
+ {2351, nullptr, "RequestNoDownloadRightsErrorResolution"},
+ {2352, nullptr, "RequestResolveNoDownloadRightsError"},
+ {2353, nullptr, "GetApplicationDownloadTaskInfo"},
+ {2354, nullptr, "PrioritizeApplicationBackgroundTask"},
+ {2355, nullptr, "PreferStorageEfficientUpdate"},
+ {2356, nullptr, "RequestStorageEfficientUpdatePreferable"},
+ {2357, nullptr, "EnableMultiCoreDownload"},
+ {2358, nullptr, "DisableMultiCoreDownload"},
+ {2359, nullptr, "IsMultiCoreDownloadEnabled"},
+ {2360, nullptr, "GetApplicationDownloadTaskCount"}, //19.0.0+
+ {2361, nullptr, "GetMaxApplicationDownloadTaskCount"}, //19.0.0+
+ {2362, nullptr, "Unknown2362"}, //20.0.0+
+ {2363, nullptr, "Unknown2363"}, //20.0.0+
+ {2364, nullptr, "Unknown2364"}, //20.0.0+
+ {2365, nullptr, "Unknown2365"}, //20.0.0+
+ {2366, nullptr, "Unknown2366"}, //20.0.0+
+ {2367, nullptr, "Unknown2367"}, //20.0.0+
+ {2368, nullptr, "Unknown2368"}, //20.0.0+
+ {2369, nullptr, "Unknown2369"}, //21.0.0+
+ {2400, nullptr, "GetPromotionInfo"},
+ {2401, nullptr, "CountPromotionInfo"},
+ {2402, nullptr, "ListPromotionInfo"},
+ {2403, nullptr, "ImportPromotionJsonForDebug"},
+ {2404, nullptr, "ClearPromotionInfoForDebug"},
+ {2500, nullptr, "ConfirmAvailableTime"},
+ {2510, nullptr, "CreateApplicationResource"},
+ {2511, nullptr, "GetApplicationResource"},
+ {2513, nullptr, "LaunchMicroApplication"},
+ {2514, nullptr, "ClearTaskOfAsyncTaskManager"},
+ {2515, nullptr, "CleanupAllPlaceHolderAndFragmentsIfNoTask"},
+ {2516, nullptr, "EnsureApplicationCertificate"},
+ {2517, nullptr, "CreateApplicationInstance"},
+ {2518, nullptr, "UpdateQualificationForDebug"},
+ {2519, nullptr, "IsQualificationTransitionSupported"},
+ {2520, D<&IApplicationManagerInterface::IsQualificationTransitionSupportedByProcessId>, "IsQualificationTransitionSupportedByProcessId"},
+ {2521, nullptr, "GetRightsUserChangedEvent"},
+ {2522, nullptr, "IsRomRedirectionAvailable"},
+ {2523, nullptr, "GetProgramId"}, //17.0.0+
+ {2524, nullptr, "Unknown2524"}, //19.0.0+
+ {2525, nullptr, "Unknown2525"}, //20.0.0+
+ {2800, nullptr, "GetApplicationIdOfPreomia"},
+ {3000, nullptr, "RegisterDeviceLockKey"},
+ {3001, nullptr, "UnregisterDeviceLockKey"},
+ {3002, nullptr, "VerifyDeviceLockKey"},
+ {3003, nullptr, "HideApplicationIcon"},
+ {3004, nullptr, "ShowApplicationIcon"},
+ {3005, nullptr, "HideApplicationTitle"},
+ {3006, nullptr, "ShowApplicationTitle"},
+ {3007, nullptr, "EnableGameCard"},
+ {3008, nullptr, "DisableGameCard"},
+ {3009, nullptr, "EnableLocalContentShare"},
+ {3010, nullptr, "DisableLocalContentShare"},
+ {3011, nullptr, "IsApplicationIconHidden"},
+ {3012, nullptr, "IsApplicationTitleHidden"},
+ {3013, nullptr, "IsGameCardEnabled"},
+ {3014, nullptr, "IsLocalContentShareEnabled"},
+ {3050, nullptr, "ListAssignELicenseTaskResult"},
+ {3104, nullptr, "GetApplicationNintendoLogo"}, //18.0.0+
+ {3105, nullptr, "GetApplicationStartupMovie"}, //18.0.0+
+ {4000, nullptr, "Unknown4000"}, //20.0.0+
+ {4004, nullptr, "Unknown4004"}, //20.0.0+
+ {4006, nullptr, "Unknown4006"}, //20.0.0+
+ {4007, nullptr, "Unknown4007"}, //20.0.0+
+ {4008, nullptr, "Unknown4008"}, //20.0.0+
+ {4009, nullptr, "Unknown4009"}, //20.0.0+
+ {4010, nullptr, "Unknown4010"}, //20.0.0+
+ {4011, nullptr, "Unknown4011"}, //20.0.0+
+ {4012, nullptr, "Unknown4012"}, //20.0.0+
+ {4013, nullptr, "Unknown4013"}, //20.0.0+
+ {4015, nullptr, "Unknown4015"}, //20.0.0+
+ {4017, nullptr, "Unknown4017"}, //20.0.0+
+ {4019, nullptr, "Unknown4019"}, //20.0.0+
+ {4020, nullptr, "Unknown4020"}, //20.0.0+
+ {4021, nullptr, "Unknown4021"}, //20.0.0+
+ {4022, D<&IApplicationManagerInterface::Unknown4022>, "Unknown4022"}, //20.0.0+
+ {4023, D<&IApplicationManagerInterface::Unknown4023>, "Unknown4023"}, //20.0.0+
+ {4024, nullptr, "Unknown4024"}, //20.0.0+
+ {4025, nullptr, "Unknown4025"}, //20.0.0+
+ {4026, nullptr, "Unknown4026"}, //20.0.0+
+ {4027, nullptr, "Unknown4027"}, //20.0.0+
+ {4028, nullptr, "Unknown4028"}, //20.0.0+
+ {4029, nullptr, "Unknown4029"}, //20.0.0+
+ {4030, nullptr, "Unknown4030"}, //20.0.0+
+ {4031, nullptr, "Unknown4031"}, //20.0.0+
+ {4032, nullptr, "Unknown4032"}, //20.0.0+
+ {4033, nullptr, "Unknown4033"}, //20.0.0+
+ {4034, nullptr, "Unknown4034"}, //20.0.0+
+ {4035, nullptr, "Unknown4035"}, //20.0.0+
+ {4037, nullptr, "Unknown4037"}, //20.0.0+
+ {4038, nullptr, "Unknown4038"}, //20.0.0+
+ {4039, nullptr, "Unknown4039"}, //20.0.0+
+ {4040, nullptr, "Unknown4040"}, //20.0.0+
+ {4041, nullptr, "Unknown4041"}, //20.0.0+
+ {4042, D<&IApplicationManagerInterface::Unknown4042>, "Unknown4042"}, //20.0.0+
+ {4043, nullptr, "Unknown4043"}, //20.0.0+
+ {4044, nullptr, "Unknown4044"}, //20.0.0+
+ {4045, nullptr, "Unknown4045"}, //20.0.0+
+ {4046, nullptr, "Unknown4046"}, //20.0.0+
+ {4049, nullptr, "Unknown4049"}, //20.0.0+
+ {4050, nullptr, "Unknown4050"}, //20.0.0+
+ {4051, nullptr, "Unknown4051"}, //20.0.0+
+ {4052, nullptr, "Unknown4052"}, //20.0.0+
+ {4053, D<&IApplicationManagerInterface::Unknown4053>, "Unknown4053"}, //20.0.0+
+ {4054, nullptr, "Unknown4054"}, //20.0.0+
+ {4055, nullptr, "Unknown4055"}, //20.0.0+
+ {4056, nullptr, "Unknown4056"}, //20.0.0+
+ {4057, nullptr, "Unknown4057"}, //20.0.0+
+ {4058, nullptr, "Unknown4058"}, //20.0.0+
+ {4059, nullptr, "Unknown4059"}, //20.0.0+
+ {4060, nullptr, "Unknown4060"}, //20.0.0+
+ {4061, nullptr, "Unknown4061"}, //20.0.0+
+ {4062, nullptr, "Unknown4062"}, //20.0.0+
+ {4063, nullptr, "Unknown4063"}, //20.0.0+
+ {4064, nullptr, "Unknown4064"}, //20.0.0+
+ {4065, nullptr, "Unknown4065"}, //20.0.0+
+ {4066, nullptr, "Unknown4066"}, //20.0.0+
+ {4067, nullptr, "Unknown4067"}, //20.0.0+
+ {4068, nullptr, "Unknown4068"}, //20.0.0+
+ {4069, nullptr, "Unknown4069"}, //20.0.0+
+ {4070, nullptr, "Unknown4070"}, //20.0.0+
+ {4071, nullptr, "Unknown4071"}, //20.0.0+
+ {4072, nullptr, "Unknown4072"}, //20.0.0+
+ {4073, nullptr, "Unknown4073"}, //20.0.0+
+ {4074, nullptr, "Unknown4074"}, //20.0.0+
+ {4075, nullptr, "Unknown4075"}, //20.0.0+
+ {4076, nullptr, "Unknown4076"}, //20.0.0+
+ {4077, nullptr, "Unknown4077"}, //20.0.0+
+ {4078, nullptr, "Unknown4078"}, //20.0.0+
+ {4079, nullptr, "Unknown4079"}, //20.0.0+
+ {4080, nullptr, "Unknown4080"}, //20.0.0+
+ {4081, nullptr, "Unknown4081"}, //20.0.0+
+ {4083, nullptr, "Unknown4083"}, //20.0.0+
+ {4084, nullptr, "Unknown4084"}, //20.0.0+
+ {4085, nullptr, "Unknown4085"}, //20.0.0+
+ {4086, nullptr, "Unknown4086"}, //20.0.0+
+ {4087, nullptr, "Unknown4087"}, //20.0.0+
+ {4088, D<&IApplicationManagerInterface::Unknown4022>, "Unknown4088"}, //20.0.0+
+ {4089, nullptr, "Unknown4089"}, //20.0.0+
+ {4090, nullptr, "Unknown4090"}, //20.0.0+
+ {4091, nullptr, "Unknown4091"}, //20.0.0+
+ {4092, nullptr, "Unknown4092"}, //20.0.0+
+ {4093, nullptr, "Unknown4093"}, //20.0.0+
+ {4094, nullptr, "Unknown4094"}, //20.0.0+
+ {4095, nullptr, "Unknown4095"}, //20.0.0+
+ {4096, nullptr, "Unknown4096"}, //20.0.0+
+ {4097, nullptr, "Unknown4097"}, //20.0.0+
+ {4099, nullptr, "Unknown4099"}, //21.0.0+
+ {4105, D<&IApplicationManagerInterface::Unknown4105>, "Unknown4105"}, //23.0.0+
+ {5000, nullptr, "Unknown5000"}, //18.0.0+
+ {5001, nullptr, "Unknown5001"}, //18.0.0+
+ {9999, nullptr, "GetApplicationCertificate"}, //10.0.0-10.2.0
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IApplicationManagerInterface::~IApplicationManagerInterface() = default;
diff --git a/src/core/hle/service/ns/application_manager_interface.h b/src/core/hle/service/ns/application_manager_interface.h
index 592068823c..c4ca66f319 100644
--- a/src/core/hle/service/ns/application_manager_interface.h
+++ b/src/core/hle/service/ns/application_manager_interface.h
@@ -85,7 +85,6 @@ public:
void PushApplicationRecord(HLERequestContext& ctx);
void ListApplicationTitle(HLERequestContext& ctx);
void ListApplicationIcon(HLERequestContext& ctx);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
private:
KernelHelpers::ServiceContext service_context;
diff --git a/src/core/hle/service/ns/application_version_interface.cpp b/src/core/hle/service/ns/application_version_interface.cpp
index e1e747f6d2..0ed9514c2c 100644
--- a/src/core/hle/service/ns/application_version_interface.cpp
+++ b/src/core/hle/service/ns/application_version_interface.cpp
@@ -10,6 +10,25 @@ namespace Service::NS {
IApplicationVersionInterface::IApplicationVersionInterface(Core::System& system_)
: ServiceFramework{system_, "IApplicationVersionInterface"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetLaunchRequiredVersion"},
+ {1, nullptr, "UpgradeLaunchRequiredVersion"},
+ {35, nullptr, "UpdateVersionList"},
+ {36, nullptr, "PushLaunchVersion"},
+ {37, nullptr, "ListRequiredVersion"},
+ {800, nullptr, "RequestVersionList"},
+ {801, nullptr, "ListVersionList"},
+ {802, nullptr, "RequestVersionListData"},
+ {900, nullptr, "ImportAutoUpdatePolicyJsonForDebug"},
+ {901, nullptr, "ListDefaultAutoUpdatePolicy"},
+ {902, nullptr, "ListAutoUpdatePolicyForSpecificApplication"},
+ {1000, nullptr, "PerformAutoUpdate"},
+ {1001, nullptr, "ListAutoUpdateSchedule"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IApplicationVersionInterface::~IApplicationVersionInterface() = default;
diff --git a/src/core/hle/service/ns/application_version_interface.h b/src/core/hle/service/ns/application_version_interface.h
index c1f7710a00..fcbb966a4d 100644
--- a/src/core/hle/service/ns/application_version_interface.h
+++ b/src/core/hle/service/ns/application_version_interface.h
@@ -14,25 +14,6 @@ class IApplicationVersionInterface final : public ServiceFramework<IApplicationV
public:
explicit IApplicationVersionInterface(Core::System& system_);
~IApplicationVersionInterface() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetLaunchRequiredVersion"},
- FunctionInfo{1, nullptr, "UpgradeLaunchRequiredVersion"},
- FunctionInfo{35, nullptr, "UpdateVersionList"},
- FunctionInfo{36, nullptr, "PushLaunchVersion"},
- FunctionInfo{37, nullptr, "ListRequiredVersion"},
- FunctionInfo{800, nullptr, "RequestVersionList"},
- FunctionInfo{801, nullptr, "ListVersionList"},
- FunctionInfo{802, nullptr, "RequestVersionListData"},
- FunctionInfo{900, nullptr, "ImportAutoUpdatePolicyJsonForDebug"},
- FunctionInfo{901, nullptr, "ListDefaultAutoUpdatePolicy"},
- FunctionInfo{902, nullptr, "ListAutoUpdatePolicyForSpecificApplication"},
- FunctionInfo{1000, nullptr, "PerformAutoUpdate"},
- FunctionInfo{1001, nullptr, "ListAutoUpdateSchedule"}
- );
};
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/async_result.cpp b/src/core/hle/service/ns/async_result.cpp
index d93c510141..8617280bef 100644
--- a/src/core/hle/service/ns/async_result.cpp
+++ b/src/core/hle/service/ns/async_result.cpp
@@ -8,17 +8,17 @@
namespace Service::NS {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IAsyncResult::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "Get"},
- FunctionInfo{1, D<&IAsyncResult::Cancel>, "Cancel"},
- FunctionInfo{2, nullptr, "GetErrorContext", MakeVersionGate({4,0,0})}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IAsyncResult::IAsyncResult(Core::System& system_, Service::Event* event_)
: ServiceFramework{system_, "nn::ns::detail::IAsyncResult"}, event{event_} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "Get"},
+ {1, D<&IAsyncResult::Cancel>, "Cancel"},
+ {2, nullptr, "GetErrorContext"}, // 4.0.0+
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IAsyncResult::~IAsyncResult() = default;
diff --git a/src/core/hle/service/ns/async_result.h b/src/core/hle/service/ns/async_result.h
index 1cad75bf47..914ea5a42c 100644
--- a/src/core/hle/service/ns/async_result.h
+++ b/src/core/hle/service/ns/async_result.h
@@ -13,7 +13,6 @@ public:
private:
Result Cancel();
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
Service::Event* event{};
};
diff --git a/src/core/hle/service/ns/content_management_interface.cpp b/src/core/hle/service/ns/content_management_interface.cpp
index 45922ffab3..39b9cb6f70 100644
--- a/src/core/hle/service/ns/content_management_interface.cpp
+++ b/src/core/hle/service/ns/content_management_interface.cpp
@@ -15,6 +15,22 @@ namespace Service::NS {
IContentManagementInterface::IContentManagementInterface(Core::System& system_)
: ServiceFramework{system_, "IContentManagementInterface"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {11, D<&IContentManagementInterface::CalculateApplicationOccupiedSize>, "CalculateApplicationOccupiedSize"},
+ {43, D<&IContentManagementInterface::CheckSdCardMountStatus>, "CheckSdCardMountStatus"},
+ {47, D<&IContentManagementInterface::GetTotalSpaceSize>, "GetTotalSpaceSize"},
+ {48, D<&IContentManagementInterface::GetFreeSpaceSize>, "GetFreeSpaceSize"},
+ {71, D<&IContentManagementInterface::GetUnknown71>, "Unknown71"},
+ {600, nullptr, "CountApplicationContentMeta"},
+ {601, nullptr, "ListApplicationContentMetaStatus"},
+ {605, nullptr, "ListApplicationContentMetaStatusWithRightsCheck"},
+ {607, nullptr, "IsAnyApplicationRunning"},
+ {608, nullptr, "Unknown608"}, //21.0.0+
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IContentManagementInterface::~IContentManagementInterface() = default;
diff --git a/src/core/hle/service/ns/content_management_interface.h b/src/core/hle/service/ns/content_management_interface.h
index bddd044b45..df0c51a184 100644
--- a/src/core/hle/service/ns/content_management_interface.h
+++ b/src/core/hle/service/ns/content_management_interface.h
@@ -24,22 +24,6 @@ public:
Result GetTotalSpaceSize(Out<s64> out_total_space_size, FileSys::StorageId storage_id);
Result GetFreeSpaceSize(Out<s64> out_free_space_size, FileSys::StorageId storage_id);
Result GetUnknown71(Out<u64> out_value_a, Out<u64> out_value_b, u8 flag);
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{11, D<&IContentManagementInterface::CalculateApplicationOccupiedSize>, "CalculateApplicationOccupiedSize"},
- FunctionInfo{43, D<&IContentManagementInterface::CheckSdCardMountStatus>, "CheckSdCardMountStatus"},
- FunctionInfo{47, D<&IContentManagementInterface::GetTotalSpaceSize>, "GetTotalSpaceSize"},
- FunctionInfo{48, D<&IContentManagementInterface::GetFreeSpaceSize>, "GetFreeSpaceSize"},
- FunctionInfo{71, D<&IContentManagementInterface::GetUnknown71>, "Unknown71"},
- FunctionInfo{600, nullptr, "CountApplicationContentMeta"},
- FunctionInfo{601, nullptr, "ListApplicationContentMetaStatus"},
- FunctionInfo{605, nullptr, "ListApplicationContentMetaStatusWithRightsCheck"},
- FunctionInfo{607, nullptr, "IsAnyApplicationRunning"},
- FunctionInfo{608, nullptr, "Unknown608", MakeVersionGate({21,0,0})}
- );
};
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/develop_interface.cpp b/src/core/hle/service/ns/develop_interface.cpp
index 2fc41cd7dd..5a44c61f1b 100644
--- a/src/core/hle/service/ns/develop_interface.cpp
+++ b/src/core/hle/service/ns/develop_interface.cpp
@@ -9,6 +9,31 @@
namespace Service::NS {
IDevelopInterface::IDevelopInterface(Core::System& system_) : ServiceFramework{system_, "ns:dev"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "LaunchProgram"},
+ {1, nullptr, "TerminateProcess"},
+ {2, nullptr, "TerminateProgram"},
+ {4, nullptr, "GetShellEvent"},
+ {5, nullptr, "GetShellEventInfo"},
+ {6, nullptr, "TerminateApplication"},
+ {7, nullptr, "PrepareLaunchProgramFromHost"},
+ {8, nullptr, "LaunchApplicationFromHost"},
+ {9, nullptr, "LaunchApplicationWithStorageIdForDevelop"},
+ {10, nullptr, "IsSystemMemoryResourceLimitBoosted"},
+ {11, nullptr, "GetRunningApplicationProcessIdForDevelop"},
+ {12, nullptr, "SetCurrentApplicationRightsEnvironmentCanBeActiveForDevelop"},
+ {13, nullptr, "CreateApplicationResourceForDevelop"},
+ {14, nullptr, "IsPreomiaForDevelop"},
+ {15, nullptr, "GetApplicationProgramIdFromHost"},
+ {16, nullptr, "RefreshCachedDebugValues"},
+ {17, nullptr, "PrepareLaunchApplicationFromHost"},
+ {18, nullptr, "GetLaunchEvent"},
+ {19, nullptr, "GetLaunchResult"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IDevelopInterface::~IDevelopInterface() = default;
diff --git a/src/core/hle/service/ns/develop_interface.h b/src/core/hle/service/ns/develop_interface.h
index 55e54fa38d..d7cb9e7a56 100644
--- a/src/core/hle/service/ns/develop_interface.h
+++ b/src/core/hle/service/ns/develop_interface.h
@@ -14,31 +14,6 @@ class IDevelopInterface final : public ServiceFramework<IDevelopInterface> {
public:
explicit IDevelopInterface(Core::System& system_);
~IDevelopInterface() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "LaunchProgram"},
- FunctionInfo{1, nullptr, "TerminateProcess"},
- FunctionInfo{2, nullptr, "TerminateProgram"},
- FunctionInfo{4, nullptr, "GetShellEvent"},
- FunctionInfo{5, nullptr, "GetShellEventInfo"},
- FunctionInfo{6, nullptr, "TerminateApplication"},
- FunctionInfo{7, nullptr, "PrepareLaunchProgramFromHost"},
- FunctionInfo{8, nullptr, "LaunchApplicationFromHost"},
- FunctionInfo{9, nullptr, "LaunchApplicationWithStorageIdForDevelop"},
- FunctionInfo{10, nullptr, "IsSystemMemoryResourceLimitBoosted"},
- FunctionInfo{11, nullptr, "GetRunningApplicationProcessIdForDevelop"},
- FunctionInfo{12, nullptr, "SetCurrentApplicationRightsEnvironmentCanBeActiveForDevelop"},
- FunctionInfo{13, nullptr, "CreateApplicationResourceForDevelop"},
- FunctionInfo{14, nullptr, "IsPreomiaForDevelop"},
- FunctionInfo{15, nullptr, "GetApplicationProgramIdFromHost"},
- FunctionInfo{16, nullptr, "RefreshCachedDebugValues"},
- FunctionInfo{17, nullptr, "PrepareLaunchApplicationFromHost"},
- FunctionInfo{18, nullptr, "GetLaunchEvent"},
- FunctionInfo{19, nullptr, "GetLaunchResult"}
- );
};
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/document_interface.cpp b/src/core/hle/service/ns/document_interface.cpp
index f9a1e2267a..00593d1edc 100644
--- a/src/core/hle/service/ns/document_interface.cpp
+++ b/src/core/hle/service/ns/document_interface.cpp
@@ -12,6 +12,15 @@ namespace Service::NS {
IDocumentInterface::IDocumentInterface(Core::System& system_)
: ServiceFramework{system_, "IDocumentInterface"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {21, nullptr, "GetApplicationContentPath"},
+ {23, D<&IDocumentInterface::ResolveApplicationContentPath>, "ResolveApplicationContentPath"},
+ {92, D<&IDocumentInterface::GetRunningApplicationProgramId>, "GetRunningApplicationProgramId"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IDocumentInterface::~IDocumentInterface() = default;
diff --git a/src/core/hle/service/ns/document_interface.h b/src/core/hle/service/ns/document_interface.h
index 43a194c3e6..4c8b15b54a 100644
--- a/src/core/hle/service/ns/document_interface.h
+++ b/src/core/hle/service/ns/document_interface.h
@@ -20,15 +20,6 @@ public:
private:
Result ResolveApplicationContentPath(ContentPath content_path);
Result GetRunningApplicationProgramId(Out<u64> out_program_id, u64 caller_program_id);
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{21, nullptr, "GetApplicationContentPath"},
- FunctionInfo{23, D<&IDocumentInterface::ResolveApplicationContentPath>, "ResolveApplicationContentPath"},
- FunctionInfo{92, D<&IDocumentInterface::GetRunningApplicationProgramId>, "GetRunningApplicationProgramId"}
- );
};
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/download_task_interface.cpp b/src/core/hle/service/ns/download_task_interface.cpp
index 9fe6ca512f..18db60e7b0 100644
--- a/src/core/hle/service/ns/download_task_interface.cpp
+++ b/src/core/hle/service/ns/download_task_interface.cpp
@@ -11,6 +11,21 @@ namespace Service::NS {
IDownloadTaskInterface::IDownloadTaskInterface(Core::System& system_)
: ServiceFramework{system_, "IDownloadTaskInterface"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {701, nullptr, "ClearTaskStatusList"},
+ {702, nullptr, "RequestDownloadTaskList"},
+ {703, nullptr, "RequestEnsureDownloadTask"},
+ {704, nullptr, "ListDownloadTaskStatus"},
+ {705, nullptr, "RequestDownloadTaskListData"},
+ {706, nullptr, "TryCommitCurrentApplicationDownloadTask"},
+ {707, D<&IDownloadTaskInterface::EnableAutoCommit>, "EnableAutoCommit"},
+ {708, D<&IDownloadTaskInterface::DisableAutoCommit>, "DisableAutoCommit"},
+ {709, nullptr, "TriggerDynamicCommitEvent"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IDownloadTaskInterface::~IDownloadTaskInterface() = default;
diff --git a/src/core/hle/service/ns/download_task_interface.h b/src/core/hle/service/ns/download_task_interface.h
index 0fd2bacd42..1c46339daa 100644
--- a/src/core/hle/service/ns/download_task_interface.h
+++ b/src/core/hle/service/ns/download_task_interface.h
@@ -18,21 +18,6 @@ public:
private:
Result EnableAutoCommit();
Result DisableAutoCommit();
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{701, nullptr, "ClearTaskStatusList"},
- FunctionInfo{702, nullptr, "RequestDownloadTaskList"},
- FunctionInfo{703, nullptr, "RequestEnsureDownloadTask"},
- FunctionInfo{704, nullptr, "ListDownloadTaskStatus"},
- FunctionInfo{705, nullptr, "RequestDownloadTaskListData"},
- FunctionInfo{706, nullptr, "TryCommitCurrentApplicationDownloadTask"},
- FunctionInfo{707, D<&IDownloadTaskInterface::EnableAutoCommit>, "EnableAutoCommit"},
- FunctionInfo{708, D<&IDownloadTaskInterface::DisableAutoCommit>, "DisableAutoCommit"},
- FunctionInfo{709, nullptr, "TriggerDynamicCommitEvent"}
- );
};
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/dynamic_rights_interface.cpp b/src/core/hle/service/ns/dynamic_rights_interface.cpp
index 951ef4c4b2..0301085670 100644
--- a/src/core/hle/service/ns/dynamic_rights_interface.cpp
+++ b/src/core/hle/service/ns/dynamic_rights_interface.cpp
@@ -9,43 +9,43 @@
namespace Service::NS {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IDynamicRightsInterface::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "RequestApplicationRightsOnServer"},
- FunctionInfo{1, nullptr, "RequestAssignRights"},
- FunctionInfo{4, nullptr, "DeprecatedRequestAssignRightsToResume"},
- FunctionInfo{5, D<&IDynamicRightsInterface::VerifyActivatedRightsOwners>, "VerifyActivatedRightsOwners"},
- FunctionInfo{6, nullptr, "DeprecatedGetApplicationRightsStatus"},
- FunctionInfo{7, nullptr, "RequestPrefetchForDynamicRights"},
- FunctionInfo{8, nullptr, "GetDynamicRightsState"},
- FunctionInfo{9, nullptr, "RequestApplicationRightsOnServerToResume"},
- FunctionInfo{10, nullptr, "RequestAssignRightsToResume"},
- FunctionInfo{11, nullptr, "GetActivatedRightsUsers"},
- FunctionInfo{12, nullptr, "GetApplicationRightsStatus"},
- FunctionInfo{13, D<&IDynamicRightsInterface::GetRunningApplicationStatus>, "GetRunningApplicationStatus"},
- FunctionInfo{14, nullptr, "SelectApplicationLicense"},
- FunctionInfo{15, nullptr, "RequestContentsAuthorizationToken"},
- FunctionInfo{16, nullptr, "QualifyUser"},
- FunctionInfo{17, nullptr, "QualifyUserWithProcessId"},
- FunctionInfo{18, D<&IDynamicRightsInterface::NotifyApplicationRightsCheckStart>, "NotifyApplicationRightsCheckStart"},
- FunctionInfo{19, nullptr, "UpdateUserList"},
- FunctionInfo{20, nullptr, "IsRightsLostUser"},
- FunctionInfo{21, nullptr, "SetRequiredAddOnContentsOnContentsAvailabilityTransition"},
- FunctionInfo{22, nullptr, "GetLimitedApplicationLicense"},
- FunctionInfo{23, nullptr, "GetLimitedApplicationLicenseUpgradableEvent"},
- FunctionInfo{24, nullptr, "NotifyLimitedApplicationLicenseUpgradableEventForDebug"},
- FunctionInfo{25, nullptr, "RequestProceedDynamicRightsState"},
- FunctionInfo{26, D<&IDynamicRightsInterface::HasAccountRestrictedRightsInRunningApplications>, "HasAccountRestrictedRightsInRunningApplications"},
- FunctionInfo{27, nullptr, "Unknown27", MakeVersionGate({20,0,0})},
- FunctionInfo{28, nullptr, "Unknown28", MakeVersionGate({20,0,0})},
- FunctionInfo{29, nullptr, "Unknown29", MakeVersionGate({21,0,0})},
- FunctionInfo{30, nullptr, "Unknown30", MakeVersionGate({21,0,0})}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IDynamicRightsInterface::IDynamicRightsInterface(Core::System& system_)
: ServiceFramework{system_, "DynamicRightsInterface"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "RequestApplicationRightsOnServer"},
+ {1, nullptr, "RequestAssignRights"},
+ {4, nullptr, "DeprecatedRequestAssignRightsToResume"},
+ {5, D<&IDynamicRightsInterface::VerifyActivatedRightsOwners>, "VerifyActivatedRightsOwners"},
+ {6, nullptr, "DeprecatedGetApplicationRightsStatus"},
+ {7, nullptr, "RequestPrefetchForDynamicRights"},
+ {8, nullptr, "GetDynamicRightsState"},
+ {9, nullptr, "RequestApplicationRightsOnServerToResume"},
+ {10, nullptr, "RequestAssignRightsToResume"},
+ {11, nullptr, "GetActivatedRightsUsers"},
+ {12, nullptr, "GetApplicationRightsStatus"},
+ {13, D<&IDynamicRightsInterface::GetRunningApplicationStatus>, "GetRunningApplicationStatus"},
+ {14, nullptr, "SelectApplicationLicense"},
+ {15, nullptr, "RequestContentsAuthorizationToken"},
+ {16, nullptr, "QualifyUser"},
+ {17, nullptr, "QualifyUserWithProcessId"},
+ {18, D<&IDynamicRightsInterface::NotifyApplicationRightsCheckStart>, "NotifyApplicationRightsCheckStart"},
+ {19, nullptr, "UpdateUserList"},
+ {20, nullptr, "IsRightsLostUser"},
+ {21, nullptr, "SetRequiredAddOnContentsOnContentsAvailabilityTransition"},
+ {22, nullptr, "GetLimitedApplicationLicense"},
+ {23, nullptr, "GetLimitedApplicationLicenseUpgradableEvent"},
+ {24, nullptr, "NotifyLimitedApplicationLicenseUpgradableEventForDebug"},
+ {25, nullptr, "RequestProceedDynamicRightsState"},
+ {26, D<&IDynamicRightsInterface::HasAccountRestrictedRightsInRunningApplications>, "HasAccountRestrictedRightsInRunningApplications"},
+ {27, nullptr, "Unknown27"}, //20.0.0+
+ {28, nullptr, "Unknown28"}, //20.0.0+
+ {29, nullptr, "Unknown29"}, //21.0.0+
+ {30, nullptr, "Unknown30"}, //21.0.0+
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IDynamicRightsInterface::~IDynamicRightsInterface() = default;
diff --git a/src/core/hle/service/ns/dynamic_rights_interface.h b/src/core/hle/service/ns/dynamic_rights_interface.h
index e8a1d81491..c3270aee05 100644
--- a/src/core/hle/service/ns/dynamic_rights_interface.h
+++ b/src/core/hle/service/ns/dynamic_rights_interface.h
@@ -21,8 +21,6 @@ private:
Result GetRunningApplicationStatus(Out<u32> out_status, u64 rights_handle);
Result VerifyActivatedRightsOwners(u64 rights_handle);
Result HasAccountRestrictedRightsInRunningApplications(Out<bool> out_is_restricted);
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/ecommerce_interface.cpp b/src/core/hle/service/ns/ecommerce_interface.cpp
index 5687d09a02..b8794bb5fb 100644
--- a/src/core/hle/service/ns/ecommerce_interface.cpp
+++ b/src/core/hle/service/ns/ecommerce_interface.cpp
@@ -10,6 +10,19 @@ namespace Service::NS {
IECommerceInterface::IECommerceInterface(Core::System& system_)
: ServiceFramework{system_, "IECommerceInterface"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "RequestLinkDevice"},
+ {1, nullptr, "RequestCleanupAllPreInstalledApplications"},
+ {2, nullptr, "RequestCleanupPreInstalledApplication"},
+ {3, nullptr, "RequestSyncRights"},
+ {4, nullptr, "RequestUnlinkDevice"},
+ {5, nullptr, "RequestRevokeAllELicense"},
+ {6, nullptr, "RequestSyncRightsBasedOnAssignedELicenses"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IECommerceInterface::~IECommerceInterface() = default;
diff --git a/src/core/hle/service/ns/ecommerce_interface.h b/src/core/hle/service/ns/ecommerce_interface.h
index d020ff5ef8..6ff9512123 100644
--- a/src/core/hle/service/ns/ecommerce_interface.h
+++ b/src/core/hle/service/ns/ecommerce_interface.h
@@ -14,19 +14,6 @@ class IECommerceInterface final : public ServiceFramework<IECommerceInterface> {
public:
explicit IECommerceInterface(Core::System& system_);
~IECommerceInterface() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "RequestLinkDevice"},
- FunctionInfo{1, nullptr, "RequestCleanupAllPreInstalledApplications"},
- FunctionInfo{2, nullptr, "RequestCleanupPreInstalledApplication"},
- FunctionInfo{3, nullptr, "RequestSyncRights"},
- FunctionInfo{4, nullptr, "RequestUnlinkDevice"},
- FunctionInfo{5, nullptr, "RequestRevokeAllELicense"},
- FunctionInfo{6, nullptr, "RequestSyncRightsBasedOnAssignedELicenses"}
- );
};
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/factory_reset_interface.cpp b/src/core/hle/service/ns/factory_reset_interface.cpp
index 1fc6edcc9b..11cdefb4be 100644
--- a/src/core/hle/service/ns/factory_reset_interface.cpp
+++ b/src/core/hle/service/ns/factory_reset_interface.cpp
@@ -8,21 +8,21 @@
namespace Service::NS {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IFactoryResetInterface::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{100, nullptr, "ResetToFactorySettings"},
- FunctionInfo{101, nullptr, "ResetToFactorySettingsWithoutUserSaveData"},
- FunctionInfo{102, nullptr, "ResetToFactorySettingsForRefurbishment"},
- FunctionInfo{103, nullptr, "ResetToFactorySettingsWithPlatformRegion"},
- FunctionInfo{104, nullptr, "ResetToFactorySettingsWithPlatformRegionAuthentication"},
- FunctionInfo{105, nullptr, "RequestResetToFactorySettingsSecurely"},
- FunctionInfo{106, nullptr, "RequestResetToFactorySettingsWithPlatformRegionAuthenticationSecurely"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IFactoryResetInterface::IFactoryResetInterface(Core::System& system_)
: ServiceFramework{system_, "IFactoryResetInterface"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {100, nullptr, "ResetToFactorySettings"},
+ {101, nullptr, "ResetToFactorySettingsWithoutUserSaveData"},
+ {102, nullptr, "ResetToFactorySettingsForRefurbishment"},
+ {103, nullptr, "ResetToFactorySettingsWithPlatformRegion"},
+ {104, nullptr, "ResetToFactorySettingsWithPlatformRegionAuthentication"},
+ {105, nullptr, "RequestResetToFactorySettingsSecurely"},
+ {106, nullptr, "RequestResetToFactorySettingsWithPlatformRegionAuthenticationSecurely"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IFactoryResetInterface::~IFactoryResetInterface() = default;
diff --git a/src/core/hle/service/ns/factory_reset_interface.h b/src/core/hle/service/ns/factory_reset_interface.h
index 3d5700fb71..8181d6b379 100644
--- a/src/core/hle/service/ns/factory_reset_interface.h
+++ b/src/core/hle/service/ns/factory_reset_interface.h
@@ -14,7 +14,6 @@ class IFactoryResetInterface final : public ServiceFramework<IFactoryResetInterf
public:
explicit IFactoryResetInterface(Core::System& system_);
~IFactoryResetInterface() override;
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/ns.cpp b/src/core/hle/service/ns/ns.cpp
index ff1654517b..fe057422ce 100644
--- a/src/core/hle/service/ns/ns.cpp
+++ b/src/core/hle/service/ns/ns.cpp
@@ -19,25 +19,25 @@ namespace Service::NS {
class INotifyService final : public ServiceFramework<INotifyService> {
public:
- explicit INotifyService(Core::System& system_) : ServiceFramework{system_, "pdm:ntfy"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "NotifyAppletEvent" },
- FunctionInfo{2, nullptr, "NotifyOperationModeChangeEvent" },
- FunctionInfo{3, nullptr, "NotifyPowerStateChangeEvent" },
- FunctionInfo{4, nullptr, "NotifyClearAllEvent" },
- FunctionInfo{5, nullptr, "NotifyEventForDebug" },
- FunctionInfo{6, nullptr, "SuspendUserAccountEventService" },
- FunctionInfo{7, nullptr, "ResumeUserAccountEventService" },
- FunctionInfo{8, nullptr, "NotifyLibraryAppletEvent" },
- FunctionInfo{9, nullptr, "Cmd9" },
- FunctionInfo{20, nullptr, "Cmd20" },
- FunctionInfo{30, nullptr, "Cmd30" },
- FunctionInfo{100, nullptr, "Cmd100" },
- FunctionInfo{101, nullptr, "Cmd101" }
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit INotifyService(Core::System& system_) : ServiceFramework{system_, "pdm:ntfy"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ { 0, nullptr, "NotifyAppletEvent" },
+ { 2, nullptr, "NotifyOperationModeChangeEvent" },
+ { 3, nullptr, "NotifyPowerStateChangeEvent" },
+ { 4, nullptr, "NotifyClearAllEvent" },
+ { 5, nullptr, "NotifyEventForDebug" },
+ { 6, nullptr, "SuspendUserAccountEventService" },
+ { 7, nullptr, "ResumeUserAccountEventService" },
+ { 8, nullptr, "NotifyLibraryAppletEvent" },
+ { 9, nullptr, "Cmd9" },
+ { 20, nullptr, "Cmd20" },
+ { 30, nullptr, "Cmd30" },
+ { 100, nullptr, "Cmd100" },
+ { 101, nullptr, "Cmd101" },
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
@@ -45,10 +45,18 @@ class IVulnerabilityManagerInterface final
: public ServiceFramework<IVulnerabilityManagerInterface> {
public:
explicit IVulnerabilityManagerInterface(Core::System& system_)
- : ServiceFramework{system_, "ns:vm"} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "ns:vm"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {1200, D<&IVulnerabilityManagerInterface::NeedsUpdateVulnerability>, "NeedsUpdateVulnerability"},
+ {1201, nullptr, "UpdateSafeSystemVersionForDebug"},
+ {1202, nullptr, "GetSafeSystemVersion"},
+ {3100, D<&IVulnerabilityManagerInterface::GetSafeSystemVersionCheckInfo>, "GetSafeSystemVersionCheckInfo"},
+ {3101, nullptr, "RequestUpdateSafeSystemVersionCheckInfo"},
+ {3102, D<&IVulnerabilityManagerInterface::ResetSafeSystemVersionCheckInfo>, "ResetSafeSystemVersionCheckInfo"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
~IVulnerabilityManagerInterface() override = default;
@@ -68,15 +76,6 @@ public:
LOG_WARNING(Service_NS, "(STUBBED)");
R_SUCCEED();
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{1200, D<&IVulnerabilityManagerInterface::NeedsUpdateVulnerability>, "NeedsUpdateVulnerability"},
- FunctionInfo{1201, nullptr, "UpdateSafeSystemVersionForDebug"},
- FunctionInfo{1202, nullptr, "GetSafeSystemVersion"},
- FunctionInfo{3100, D<&IVulnerabilityManagerInterface::GetSafeSystemVersionCheckInfo>, "GetSafeSystemVersionCheckInfo"},
- FunctionInfo{3101, nullptr, "RequestUpdateSafeSystemVersionCheckInfo"},
- FunctionInfo{3102, D<&IVulnerabilityManagerInterface::ResetSafeSystemVersionCheckInfo>, "ResetSafeSystemVersionCheckInfo"}
- );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/ns/ns.h b/src/core/hle/service/ns/ns.h
index f79b4ae3d6..2b14d115ca 100644
--- a/src/core/hle/service/ns/ns.h
+++ b/src/core/hle/service/ns/ns.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/ns/ns_results.h b/src/core/hle/service/ns/ns_results.h
index 16d2ea6f7b..52f4c0ea59 100644
--- a/src/core/hle/service/ns/ns_results.h
+++ b/src/core/hle/service/ns/ns_results.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/ns/platform_service_manager.cpp b/src/core/hle/service/ns/platform_service_manager.cpp
index dea6cb5c16..bf93a2edfa 100644
--- a/src/core/hle/service/ns/platform_service_manager.cpp
+++ b/src/core/hle/service/ns/platform_service_manager.cpp
@@ -27,28 +27,6 @@
namespace Service::NS {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IPlatformServiceManager::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IPlatformServiceManager::RequestLoad>, "RequestLoad"},
- FunctionInfo{1, D<&IPlatformServiceManager::GetLoadState>, "GetLoadState"},
- FunctionInfo{2, D<&IPlatformServiceManager::GetSize>, "GetSize"},
- FunctionInfo{3, D<&IPlatformServiceManager::GetSharedMemoryAddressOffset>, "GetSharedMemoryAddressOffset"},
- FunctionInfo{4, D<&IPlatformServiceManager::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"},
- FunctionInfo{5, D<&IPlatformServiceManager::GetSharedFontInOrderOfPriority>, "GetSharedFontInOrderOfPriority"},
- FunctionInfo{6, D<&IPlatformServiceManager::GetSharedFontInOrderOfPriority>, "GetSharedFontInOrderOfPriorityForSystem"},
- FunctionInfo{100, nullptr, "RequestApplicationFunctionAuthorization"},
- FunctionInfo{101, nullptr, "RequestApplicationFunctionAuthorizationByProcessId"},
- FunctionInfo{102, nullptr, "RequestApplicationFunctionAuthorizationByApplicationId"},
- FunctionInfo{103, nullptr, "RefreshApplicationFunctionBlackListDebugRecord"},
- FunctionInfo{104, nullptr, "RequestApplicationFunctionAuthorizationByProgramId"},
- FunctionInfo{105, nullptr, "GetFunctionBlackListSystemVersionToAuthorize"},
- FunctionInfo{106, nullptr, "GetFunctionBlackListVersion"},
- FunctionInfo{1000, nullptr, "LoadNgWordDataForPlatformRegionChina"},
- FunctionInfo{1001, nullptr, "GetNgWordDataSizeForPlatformRegionChina"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
struct FontRegion {
u32 offset;
u32 size;
@@ -111,6 +89,28 @@ struct IPlatformServiceManager::Impl {
IPlatformServiceManager::IPlatformServiceManager(Core::System& system_, const char* service_name_)
: ServiceFramework{system_, service_name_}, impl{std::make_unique<Impl>()} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IPlatformServiceManager::RequestLoad>, "RequestLoad"},
+ {1, D<&IPlatformServiceManager::GetLoadState>, "GetLoadState"},
+ {2, D<&IPlatformServiceManager::GetSize>, "GetSize"},
+ {3, D<&IPlatformServiceManager::GetSharedMemoryAddressOffset>, "GetSharedMemoryAddressOffset"},
+ {4, D<&IPlatformServiceManager::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"},
+ {5, D<&IPlatformServiceManager::GetSharedFontInOrderOfPriority>, "GetSharedFontInOrderOfPriority"},
+ {6, D<&IPlatformServiceManager::GetSharedFontInOrderOfPriority>, "GetSharedFontInOrderOfPriorityForSystem"},
+ {100, nullptr, "RequestApplicationFunctionAuthorization"},
+ {101, nullptr, "RequestApplicationFunctionAuthorizationByProcessId"},
+ {102, nullptr, "RequestApplicationFunctionAuthorizationByApplicationId"},
+ {103, nullptr, "RefreshApplicationFunctionBlackListDebugRecord"},
+ {104, nullptr, "RequestApplicationFunctionAuthorizationByProgramId"},
+ {105, nullptr, "GetFunctionBlackListSystemVersionToAuthorize"},
+ {106, nullptr, "GetFunctionBlackListVersion"},
+ {1000, nullptr, "LoadNgWordDataForPlatformRegionChina"},
+ {1001, nullptr, "GetNgWordDataSizeForPlatformRegionChina"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
+
auto& fsc = system.GetFileSystemController();
// Attempt to load shared font data from disk
diff --git a/src/core/hle/service/ns/platform_service_manager.h b/src/core/hle/service/ns/platform_service_manager.h
index fb99a441f5..73521abbc2 100644
--- a/src/core/hle/service/ns/platform_service_manager.h
+++ b/src/core/hle/service/ns/platform_service_manager.h
@@ -68,12 +68,11 @@ private:
Result GetSharedMemoryNativeHandle(
OutCopyHandle<Kernel::KSharedMemory> out_shared_memory_native_handle);
Result GetSharedFontInOrderOfPriority(OutArray<u32, BufferAttr_HipcMapAlias> out_font_codes,
- OutArray<u32, BufferAttr_HipcMapAlias> out_font_offsets,
- OutArray<u32, BufferAttr_HipcMapAlias> out_font_sizes,
- Out<bool> out_fonts_are_loaded, Out<u32> out_font_count,
- Set::LanguageCode language_code);
+ OutArray<u32, BufferAttr_HipcMapAlias> out_font_offsets,
+ OutArray<u32, BufferAttr_HipcMapAlias> out_font_sizes,
+ Out<bool> out_fonts_are_loaded, Out<u32> out_font_count,
+ Set::LanguageCode language_code);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
struct Impl;
std::unique_ptr<Impl> impl;
};
diff --git a/src/core/hle/service/ns/query_service.cpp b/src/core/hle/service/ns/query_service.cpp
index 13a1f33866..d22de1d169 100644
--- a/src/core/hle/service/ns/query_service.cpp
+++ b/src/core/hle/service/ns/query_service.cpp
@@ -14,40 +14,40 @@
namespace Service::NS {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IQueryService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "QueryAppletEvent"},
- FunctionInfo{1, nullptr, "QueryPlayStatistics"},
- FunctionInfo{2, nullptr, "QueryPlayStatisticsByUserAccountId"},
- FunctionInfo{3, nullptr, "QueryPlayStatisticsByNetworkServiceAccountId"},
- FunctionInfo{4, nullptr, "QueryPlayStatisticsByApplicationId"},
- FunctionInfo{5, D<&IQueryService::QueryPlayStatisticsByApplicationIdAndUserAccountId>, "QueryPlayStatisticsByApplicationIdAndUserAccountId"},
- FunctionInfo{6, nullptr, "QueryPlayStatisticsByApplicationIdAndNetworkServiceAccountId"},
- FunctionInfo{7, nullptr, "QueryLastPlayTimeV0"},
- FunctionInfo{8, nullptr, "QueryPlayEvent"},
- FunctionInfo{9, nullptr, "GetAvailablePlayEventRange"},
- FunctionInfo{10, nullptr, "QueryAccountEvent"},
- FunctionInfo{11, nullptr, "QueryAccountPlayEvent"},
- FunctionInfo{12, nullptr, "GetAvailableAccountPlayEventRange"},
- FunctionInfo{13, nullptr, "QueryApplicationPlayStatisticsForSystemV0"},
- FunctionInfo{14, nullptr, "QueryRecentlyPlayedApplication"},
- FunctionInfo{15, nullptr, "GetRecentlyPlayedApplicationUpdateEvent"},
- FunctionInfo{16, nullptr, "QueryApplicationPlayStatisticsByUserAccountIdForSystemV0"},
- FunctionInfo{17, D<&IQueryService::QueryLastPlayTime>, "QueryLastPlayTime"},
- FunctionInfo{18, D<&IQueryService::QueryApplicationPlayStatisticsForSystem>, "QueryApplicationPlayStatisticsForSystem"},
- FunctionInfo{19, D<&IQueryService::QueryApplicationPlayStatisticsByUserAccountIdForSystem>, "QueryApplicationPlayStatisticsByUserAccountIdForSystem"},
- FunctionInfo{30, nullptr, "Cmd30" },
- FunctionInfo{31, nullptr, "Cmd31" },
- FunctionInfo{100, nullptr, "Cmd100" },
- FunctionInfo{110, nullptr, "Cmd110" },
- FunctionInfo{118, nullptr, "Cmd118" },
- FunctionInfo{119, nullptr, "Cmd119" }
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IQueryService::IQueryService(Core::System& system_) : ServiceFramework{system_, "pdm:qry"},
play_time_manager{std::make_unique<PlayTime::PlayTimeManager>()} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "QueryAppletEvent"},
+ {1, nullptr, "QueryPlayStatistics"},
+ {2, nullptr, "QueryPlayStatisticsByUserAccountId"},
+ {3, nullptr, "QueryPlayStatisticsByNetworkServiceAccountId"},
+ {4, nullptr, "QueryPlayStatisticsByApplicationId"},
+ {5, D<&IQueryService::QueryPlayStatisticsByApplicationIdAndUserAccountId>, "QueryPlayStatisticsByApplicationIdAndUserAccountId"},
+ {6, nullptr, "QueryPlayStatisticsByApplicationIdAndNetworkServiceAccountId"},
+ {7, nullptr, "QueryLastPlayTimeV0"},
+ {8, nullptr, "QueryPlayEvent"},
+ {9, nullptr, "GetAvailablePlayEventRange"},
+ {10, nullptr, "QueryAccountEvent"},
+ {11, nullptr, "QueryAccountPlayEvent"},
+ {12, nullptr, "GetAvailableAccountPlayEventRange"},
+ {13, nullptr, "QueryApplicationPlayStatisticsForSystemV0"},
+ {14, nullptr, "QueryRecentlyPlayedApplication"},
+ {15, nullptr, "GetRecentlyPlayedApplicationUpdateEvent"},
+ {16, nullptr, "QueryApplicationPlayStatisticsByUserAccountIdForSystemV0"},
+ {17, D<&IQueryService::QueryLastPlayTime>, "QueryLastPlayTime"},
+ {18, D<&IQueryService::QueryApplicationPlayStatisticsForSystem>, "QueryApplicationPlayStatisticsForSystem"},
+ {19, D<&IQueryService::QueryApplicationPlayStatisticsByUserAccountIdForSystem>, "QueryApplicationPlayStatisticsByUserAccountIdForSystem"},
+ { 30, nullptr, "Cmd30" },
+ { 31, nullptr, "Cmd31" },
+ { 100, nullptr, "Cmd100" },
+ { 110, nullptr, "Cmd110" },
+ { 118, nullptr, "Cmd118" },
+ { 119, nullptr, "Cmd119" },
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IQueryService::~IQueryService() = default;
diff --git a/src/core/hle/service/ns/query_service.h b/src/core/hle/service/ns/query_service.h
index 08267d3165..f5c0ae1058 100644
--- a/src/core/hle/service/ns/query_service.h
+++ b/src/core/hle/service/ns/query_service.h
@@ -62,7 +62,6 @@ private:
OutArray<ApplicationPlayStatistics, BufferAttr_HipcMapAlias> out_stats,
InArray<u64, BufferAttr_HipcMapAlias> application_ids);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::unique_ptr<PlayTime::PlayTimeManager> play_time_manager;
};
diff --git a/src/core/hle/service/ns/read_only_application_control_data_interface.cpp b/src/core/hle/service/ns/read_only_application_control_data_interface.cpp
index c6cd822d24..1359cdbb95 100644
--- a/src/core/hle/service/ns/read_only_application_control_data_interface.cpp
+++ b/src/core/hle/service/ns/read_only_application_control_data_interface.cpp
@@ -73,21 +73,6 @@ void SanitizeJPEGImageSize(std::vector<u8>& image) {
} // namespace
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IReadOnlyApplicationControlDataInterface::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData>, "GetApplicationControlData"},
- FunctionInfo{1, D<&IReadOnlyApplicationControlDataInterface::GetApplicationDesiredLanguage>, "GetApplicationDesiredLanguage"},
- FunctionInfo{2, D<&IReadOnlyApplicationControlDataInterface::ConvertApplicationLanguageToLanguageCode>, "ConvertApplicationLanguageToLanguageCode"},
- FunctionInfo{3, nullptr, "ConvertLanguageCodeToApplicationLanguage"},
- FunctionInfo{4, nullptr, "SelectApplicationDesiredLanguage"},
- FunctionInfo{5, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData2>, "GetApplicationControlData"},
- FunctionInfo{10, &IReadOnlyApplicationControlDataInterface::ListApplicationIcon, "ListApplicationIcon"},
- FunctionInfo{13, &IReadOnlyApplicationControlDataInterface::ListApplicationTitle, "ListApplicationTitle"},
- FunctionInfo{19, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData"},
- FunctionInfo{23, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData", MakeVersionGate({23,0,0})}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
// IAsyncValue implementation for ListApplicationTitle
// https://switchbrew.org/wiki/NS_services#ListApplicationTitle
@@ -99,6 +84,13 @@ public:
, data_offset{offset}
, data_size{size}
{
+ static const FunctionInfo functions[] = {
+ {0, D<&IAsyncValue::GetSize>, "GetSize"},
+ {1, D<&IAsyncValue::Get>, "Get"},
+ {2, D<&IAsyncValue::Cancel>, "Cancel"},
+ {3, D<&IAsyncValue::GetErrorContext>, "GetErrorContext"},
+ };
+ RegisterHandlers(functions);
completion_event = service_context.CreateEvent("IAsyncValue:Completion");
completion_event->GetReadableEvent().Signal(system.Kernel());
}
@@ -130,16 +122,6 @@ private:
LOG_DEBUG(Service_NS, "called");
R_SUCCEED();
}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IAsyncValue::GetSize>, "GetSize"},
- FunctionInfo{1, D<&IAsyncValue::Get>, "Get"},
- FunctionInfo{2, D<&IAsyncValue::Cancel>, "Cancel"},
- FunctionInfo{3, D<&IAsyncValue::GetErrorContext>, "GetErrorContext"}
- );
KernelHelpers::ServiceContext service_context;
Kernel::KEvent* completion_event{};
s32 data_offset;
@@ -149,6 +131,22 @@ private:
IReadOnlyApplicationControlDataInterface::IReadOnlyApplicationControlDataInterface(
Core::System& system_)
: ServiceFramework{system_, "IReadOnlyApplicationControlDataInterface"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData>, "GetApplicationControlData"},
+ {1, D<&IReadOnlyApplicationControlDataInterface::GetApplicationDesiredLanguage>, "GetApplicationDesiredLanguage"},
+ {2, D<&IReadOnlyApplicationControlDataInterface::ConvertApplicationLanguageToLanguageCode>, "ConvertApplicationLanguageToLanguageCode"},
+ {3, nullptr, "ConvertLanguageCodeToApplicationLanguage"},
+ {4, nullptr, "SelectApplicationDesiredLanguage"},
+ {5, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData2>, "GetApplicationControlData"},
+ {10, &IReadOnlyApplicationControlDataInterface::ListApplicationIcon, "ListApplicationIcon"},
+ {13, &IReadOnlyApplicationControlDataInterface::ListApplicationTitle, "ListApplicationTitle"},
+ {19, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData"},
+ {23, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData"}, //23.0.0+
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IReadOnlyApplicationControlDataInterface::~IReadOnlyApplicationControlDataInterface() = default;
diff --git a/src/core/hle/service/ns/read_only_application_control_data_interface.h b/src/core/hle/service/ns/read_only_application_control_data_interface.h
index 3f68029583..a4a285151a 100644
--- a/src/core/hle/service/ns/read_only_application_control_data_interface.h
+++ b/src/core/hle/service/ns/read_only_application_control_data_interface.h
@@ -45,8 +45,6 @@ public:
u8 flag1,
u8 flag2,
u64 application_id);
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/read_only_application_record_interface.cpp b/src/core/hle/service/ns/read_only_application_record_interface.cpp
index 7a7cf9ec58..8ce7851ae2 100644
--- a/src/core/hle/service/ns/read_only_application_record_interface.cpp
+++ b/src/core/hle/service/ns/read_only_application_record_interface.cpp
@@ -11,18 +11,17 @@
namespace Service::NS {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IReadOnlyApplicationRecordInterface::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IReadOnlyApplicationRecordInterface::HasApplicationRecord>, "HasApplicationRecord"},
- FunctionInfo{1, nullptr, "NotifyApplicationFailure"},
- FunctionInfo{2, D<&IReadOnlyApplicationRecordInterface::IsDataCorruptedResult>, "IsDataCorruptedResult"},
- FunctionInfo{3, D<&IReadOnlyApplicationRecordInterface::ListApplicationRecord>, "ListApplicationRecord"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IReadOnlyApplicationRecordInterface::IReadOnlyApplicationRecordInterface(Core::System& system_)
: ServiceFramework{system_, "IReadOnlyApplicationRecordInterface"} {
+ static const FunctionInfo functions[] = {
+ {0, D<&IReadOnlyApplicationRecordInterface::HasApplicationRecord>, "HasApplicationRecord"},
+ {1, nullptr, "NotifyApplicationFailure"},
+ {2, D<&IReadOnlyApplicationRecordInterface::IsDataCorruptedResult>, "IsDataCorruptedResult"},
+ {3, D<&IReadOnlyApplicationRecordInterface::ListApplicationRecord>, "ListApplicationRecord"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IReadOnlyApplicationRecordInterface::~IReadOnlyApplicationRecordInterface() = default;
diff --git a/src/core/hle/service/ns/read_only_application_record_interface.h b/src/core/hle/service/ns/read_only_application_record_interface.h
index 308e753e7d..dd842070e8 100644
--- a/src/core/hle/service/ns/read_only_application_record_interface.h
+++ b/src/core/hle/service/ns/read_only_application_record_interface.h
@@ -24,8 +24,6 @@ private:
Result ListApplicationRecord(
OutArray<ApplicationRecord, BufferAttr_HipcMapAlias> out_records, Out<s32> out_count,
s32 entry_offset);
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/service_getter_interface.cpp b/src/core/hle/service/ns/service_getter_interface.cpp
index bbf30da3da..7b7f791650 100644
--- a/src/core/hle/service/ns/service_getter_interface.cpp
+++ b/src/core/hle/service/ns/service_getter_interface.cpp
@@ -20,25 +20,25 @@
namespace Service::NS {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IServiceGetterInterface::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{7988, D<&IServiceGetterInterface::GetDynamicRightsInterface>, "GetDynamicRightsInterface"},
- FunctionInfo{7989, D<&IServiceGetterInterface::GetReadOnlyApplicationControlDataInterface>, "GetReadOnlyApplicationControlDataInterface"},
- FunctionInfo{7991, D<&IServiceGetterInterface::GetReadOnlyApplicationRecordInterface>, "GetReadOnlyApplicationRecordInterface"},
- FunctionInfo{7992, D<&IServiceGetterInterface::GetECommerceInterface>, "GetECommerceInterface"},
- FunctionInfo{7993, D<&IServiceGetterInterface::GetApplicationVersionInterface>, "GetApplicationVersionInterface"},
- FunctionInfo{7994, D<&IServiceGetterInterface::GetFactoryResetInterface>, "GetFactoryResetInterface"},
- FunctionInfo{7995, D<&IServiceGetterInterface::GetAccountProxyInterface>, "GetAccountProxyInterface"},
- FunctionInfo{7996, D<&IServiceGetterInterface::GetApplicationManagerInterface>, "GetApplicationManagerInterface"},
- FunctionInfo{7997, D<&IServiceGetterInterface::GetDownloadTaskInterface>, "GetDownloadTaskInterface"},
- FunctionInfo{7998, D<&IServiceGetterInterface::GetContentManagementInterface>, "GetContentManagementInterface"},
- FunctionInfo{7999, D<&IServiceGetterInterface::GetDocumentInterface>, "GetDocumentInterface"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IServiceGetterInterface::IServiceGetterInterface(Core::System& system_, const char* name)
: ServiceFramework{system_, name} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {7988, D<&IServiceGetterInterface::GetDynamicRightsInterface>, "GetDynamicRightsInterface"},
+ {7989, D<&IServiceGetterInterface::GetReadOnlyApplicationControlDataInterface>, "GetReadOnlyApplicationControlDataInterface"},
+ {7991, D<&IServiceGetterInterface::GetReadOnlyApplicationRecordInterface>, "GetReadOnlyApplicationRecordInterface"},
+ {7992, D<&IServiceGetterInterface::GetECommerceInterface>, "GetECommerceInterface"},
+ {7993, D<&IServiceGetterInterface::GetApplicationVersionInterface>, "GetApplicationVersionInterface"},
+ {7994, D<&IServiceGetterInterface::GetFactoryResetInterface>, "GetFactoryResetInterface"},
+ {7995, D<&IServiceGetterInterface::GetAccountProxyInterface>, "GetAccountProxyInterface"},
+ {7996, D<&IServiceGetterInterface::GetApplicationManagerInterface>, "GetApplicationManagerInterface"},
+ {7997, D<&IServiceGetterInterface::GetDownloadTaskInterface>, "GetDownloadTaskInterface"},
+ {7998, D<&IServiceGetterInterface::GetContentManagementInterface>, "GetContentManagementInterface"},
+ {7999, D<&IServiceGetterInterface::GetDocumentInterface>, "GetDocumentInterface"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IServiceGetterInterface::~IServiceGetterInterface() = default;
diff --git a/src/core/hle/service/ns/service_getter_interface.h b/src/core/hle/service/ns/service_getter_interface.h
index 8c33aafc27..fc36b04325 100644
--- a/src/core/hle/service/ns/service_getter_interface.h
+++ b/src/core/hle/service/ns/service_getter_interface.h
@@ -45,8 +45,6 @@ public:
Result GetContentManagementInterface(
Out<SharedPointer<IContentManagementInterface>> out_interface);
Result GetDocumentInterface(Out<SharedPointer<IDocumentInterface>> out_interface);
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/system_update_control.cpp b/src/core/hle/service/ns/system_update_control.cpp
index 3d1911c852..2711db508c 100644
--- a/src/core/hle/service/ns/system_update_control.cpp
+++ b/src/core/hle/service/ns/system_update_control.cpp
@@ -11,6 +11,35 @@ namespace Service::NS {
ISystemUpdateControl::ISystemUpdateControl(Core::System& system_)
: ServiceFramework{system_, "ISystemUpdateControl"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "HasDownloaded"},
+ {1, nullptr, "RequestCheckLatestUpdate"},
+ {2, nullptr, "RequestDownloadLatestUpdate"},
+ {3, nullptr, "GetDownloadProgress"},
+ {4, nullptr, "ApplyDownloadedUpdate"},
+ {5, nullptr, "RequestPrepareCardUpdate"},
+ {6, nullptr, "GetPrepareCardUpdateProgress"},
+ {7, nullptr, "HasPreparedCardUpdate"},
+ {8, nullptr, "ApplyCardUpdate"},
+ {9, nullptr, "GetDownloadedEulaDataSize"},
+ {10, nullptr, "GetDownloadedEulaData"},
+ {11, nullptr, "SetupCardUpdate"},
+ {12, nullptr, "GetPreparedCardUpdateEulaDataSize"},
+ {13, nullptr, "GetPreparedCardUpdateEulaData"},
+ {14, nullptr, "SetupCardUpdateViaSystemUpdater"},
+ {15, nullptr, "HasReceived"},
+ {16, nullptr, "RequestReceiveSystemUpdate"},
+ {17, nullptr, "GetReceiveProgress"},
+ {18, nullptr, "ApplyReceivedUpdate"},
+ {19, nullptr, "GetReceivedEulaDataSize"},
+ {20, nullptr, "GetReceivedEulaData"},
+ {21, nullptr, "SetupToReceiveSystemUpdate"},
+ {22, nullptr, "RequestCheckLatestUpdateIncludesRebootlessUpdate"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
ISystemUpdateControl::~ISystemUpdateControl() = default;
diff --git a/src/core/hle/service/ns/system_update_control.h b/src/core/hle/service/ns/system_update_control.h
index acdf048e6c..70794f4abd 100644
--- a/src/core/hle/service/ns/system_update_control.h
+++ b/src/core/hle/service/ns/system_update_control.h
@@ -14,35 +14,6 @@ class ISystemUpdateControl final : public ServiceFramework<ISystemUpdateControl>
public:
explicit ISystemUpdateControl(Core::System& system_);
~ISystemUpdateControl() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "HasDownloaded"},
- FunctionInfo{1, nullptr, "RequestCheckLatestUpdate"},
- FunctionInfo{2, nullptr, "RequestDownloadLatestUpdate"},
- FunctionInfo{3, nullptr, "GetDownloadProgress"},
- FunctionInfo{4, nullptr, "ApplyDownloadedUpdate"},
- FunctionInfo{5, nullptr, "RequestPrepareCardUpdate"},
- FunctionInfo{6, nullptr, "GetPrepareCardUpdateProgress"},
- FunctionInfo{7, nullptr, "HasPreparedCardUpdate"},
- FunctionInfo{8, nullptr, "ApplyCardUpdate"},
- FunctionInfo{9, nullptr, "GetDownloadedEulaDataSize"},
- FunctionInfo{10, nullptr, "GetDownloadedEulaData"},
- FunctionInfo{11, nullptr, "SetupCardUpdate"},
- FunctionInfo{12, nullptr, "GetPreparedCardUpdateEulaDataSize"},
- FunctionInfo{13, nullptr, "GetPreparedCardUpdateEulaData"},
- FunctionInfo{14, nullptr, "SetupCardUpdateViaSystemUpdater"},
- FunctionInfo{15, nullptr, "HasReceived"},
- FunctionInfo{16, nullptr, "RequestReceiveSystemUpdate"},
- FunctionInfo{17, nullptr, "GetReceiveProgress"},
- FunctionInfo{18, nullptr, "ApplyReceivedUpdate"},
- FunctionInfo{19, nullptr, "GetReceivedEulaDataSize"},
- FunctionInfo{20, nullptr, "GetReceivedEulaData"},
- FunctionInfo{21, nullptr, "SetupToReceiveSystemUpdate"},
- FunctionInfo{22, nullptr, "RequestCheckLatestUpdateIncludesRebootlessUpdate"}
- );
};
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/system_update_interface.cpp b/src/core/hle/service/ns/system_update_interface.cpp
index 044d39835f..3f4d42fdb6 100644
--- a/src/core/hle/service/ns/system_update_interface.cpp
+++ b/src/core/hle/service/ns/system_update_interface.cpp
@@ -10,32 +10,32 @@
namespace Service::NS {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> ISystemUpdateInterface::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&ISystemUpdateInterface::GetBackgroundNetworkUpdateState>, "GetBackgroundNetworkUpdateState"},
- FunctionInfo{1, D<&ISystemUpdateInterface::OpenSystemUpdateControl>, "OpenSystemUpdateControl"},
- FunctionInfo{2, nullptr, "NotifyExFatDriverRequired"},
- FunctionInfo{3, nullptr, "ClearExFatDriverStatusForDebug"},
- FunctionInfo{4, nullptr, "RequestBackgroundNetworkUpdate"},
- FunctionInfo{5, nullptr, "NotifyBackgroundNetworkUpdate"},
- FunctionInfo{6, nullptr, "NotifyExFatDriverDownloadedForDebug"},
- FunctionInfo{9, D<&ISystemUpdateInterface::GetSystemUpdateNotificationEventForContentDelivery>, "GetSystemUpdateNotificationEventForContentDelivery"},
- FunctionInfo{10, nullptr, "NotifySystemUpdateForContentDelivery"},
- FunctionInfo{11, nullptr, "PrepareShutdown"},
- FunctionInfo{12, nullptr, "Unknown12"},
- FunctionInfo{13, nullptr, "Unknown13"},
- FunctionInfo{14, nullptr, "Unknown14"},
- FunctionInfo{15, nullptr, "Unknown15"},
- FunctionInfo{16, nullptr, "DestroySystemUpdateTask"},
- FunctionInfo{17, nullptr, "RequestSendSystemUpdate"},
- FunctionInfo{18, nullptr, "GetSendSystemUpdateProgress"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
ISystemUpdateInterface::ISystemUpdateInterface(Core::System& system_)
: ServiceFramework{system_, "ns:su"}, service_context{system_, "ns:su"},
update_notification_event{service_context} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&ISystemUpdateInterface::GetBackgroundNetworkUpdateState>, "GetBackgroundNetworkUpdateState"},
+ {1, D<&ISystemUpdateInterface::OpenSystemUpdateControl>, "OpenSystemUpdateControl"},
+ {2, nullptr, "NotifyExFatDriverRequired"},
+ {3, nullptr, "ClearExFatDriverStatusForDebug"},
+ {4, nullptr, "RequestBackgroundNetworkUpdate"},
+ {5, nullptr, "NotifyBackgroundNetworkUpdate"},
+ {6, nullptr, "NotifyExFatDriverDownloadedForDebug"},
+ {9, D<&ISystemUpdateInterface::GetSystemUpdateNotificationEventForContentDelivery>, "GetSystemUpdateNotificationEventForContentDelivery"},
+ {10, nullptr, "NotifySystemUpdateForContentDelivery"},
+ {11, nullptr, "PrepareShutdown"},
+ {12, nullptr, "Unknown12"},
+ {13, nullptr, "Unknown13"},
+ {14, nullptr, "Unknown14"},
+ {15, nullptr, "Unknown15"},
+ {16, nullptr, "DestroySystemUpdateTask"},
+ {17, nullptr, "RequestSendSystemUpdate"},
+ {18, nullptr, "GetSendSystemUpdateProgress"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
ISystemUpdateInterface::~ISystemUpdateInterface() = default;
diff --git a/src/core/hle/service/ns/system_update_interface.h b/src/core/hle/service/ns/system_update_interface.h
index 2ea14f4f5e..76f8959ed6 100644
--- a/src/core/hle/service/ns/system_update_interface.h
+++ b/src/core/hle/service/ns/system_update_interface.h
@@ -33,7 +33,7 @@ private:
Result GetSystemUpdateNotificationEventForContentDelivery(
OutCopyHandle<Kernel::KReadableEvent> out_event);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
+private:
KernelHelpers::ServiceContext service_context;
Event update_notification_event;
};
diff --git a/src/core/hle/service/nvdrv/devices/ioctl_serialization.h b/src/core/hle/service/nvdrv/devices/ioctl_serialization.h
index c3baa3a75b..37d04e3cf1 100644
--- a/src/core/hle/service/nvdrv/devices/ioctl_serialization.h
+++ b/src/core/hle/service/nvdrv/devices/ioctl_serialization.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
diff --git a/src/core/hle/service/nvdrv/devices/nvdevice.h b/src/core/hle/service/nvdrv/devices/nvdevice.h
index 8adaddc60b..d23ec63bae 100644
--- a/src/core/hle/service/nvdrv/devices/nvdevice.h
+++ b/src/core/hle/service/nvdrv/devices/nvdevice.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp
index 358679b831..1e571be4c9 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp
@@ -278,7 +278,7 @@ NvResult nvhost_gpu::AllocateObjectContext(IoctlAllocObjCtx& params) {
params.flags = allowed_mask;
}
- s32_le ctx_class_number_index =
+ s32_le ctx_class_number_index =
GetObjectContextClassNumberIndex(static_cast<CtxClasses>(params.class_num));
if (ctx_class_number_index < 0) {
LOG_ERROR(Service_NVDRV, "Invalid class number for object context: {:#x}",
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h
index 627686757b..1747881d48 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h
+++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.h b/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.h
index def9c254d1..e0735b7f01 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.h
+++ b/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_vic.h b/src/core/hle/service/nvdrv/devices/nvhost_vic.h
index 0cc04354a0..b1cbcb9ad7 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_vic.h
+++ b/src/core/hle/service/nvdrv/devices/nvhost_vic.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/nvdrv/nvdrv.cpp b/src/core/hle/service/nvdrv/nvdrv.cpp
index 81d8a3a63b..b252a2efa5 100644
--- a/src/core/hle/service/nvdrv/nvdrv.cpp
+++ b/src/core/hle/service/nvdrv/nvdrv.cpp
@@ -50,61 +50,55 @@ class NVGEM_C final : public ServiceFramework<NVGEM_C> {
public:
explicit NVGEM_C(Core::System& system_)
: ServiceFramework{system_, "nvgem:c"}
- {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ {
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "Initialize"},
+ {1, nullptr, "GetEventHandle"},
+ {2, nullptr, "ControlNotification"},
+ {3, nullptr, "SetNotificationPerm"},
+ {4, nullptr, "SetCoreDumpPerm"},
+ {5, nullptr, "GetAruid"},
+ {6, nullptr, "Reset"},
+ {7, nullptr, "GetAruid2"},
+ };
+ RegisterHandlers(functions);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "Initialize"},
- FunctionInfo{1, nullptr, "GetEventHandle"},
- FunctionInfo{2, nullptr, "ControlNotification"},
- FunctionInfo{3, nullptr, "SetNotificationPerm"},
- FunctionInfo{4, nullptr, "SetCoreDumpPerm"},
- FunctionInfo{5, nullptr, "GetAruid"},
- FunctionInfo{6, nullptr, "Reset"},
- FunctionInfo{7, nullptr, "GetAruid2"}
- );
};
class NVGEM_CD final : public ServiceFramework<NVGEM_CD> {
public:
explicit NVGEM_CD(Core::System& system_)
: ServiceFramework{system_, "nvgem:cd"}
- {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ {
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "Initialize"},
+ {1, nullptr, "GetAruid"},
+ {2, nullptr, "ReadNextBlock"},
+ {3, nullptr, "GetNextBlockSize"},
+ {4, nullptr, "ReadNextBlock2"},
+ };
+ RegisterHandlers(functions);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "Initialize"},
- FunctionInfo{1, nullptr, "GetAruid"},
- FunctionInfo{2, nullptr, "ReadNextBlock"},
- FunctionInfo{3, nullptr, "GetNextBlockSize"},
- FunctionInfo{4, nullptr, "ReadNextBlock2"}
- );
};
class NVDBG_D final : public ServiceFramework<NVDBG_D> {
public:
explicit NVDBG_D(Core::System& system_)
: ServiceFramework{system_, "nvdbg:d"}
- {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ {
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "Open"},
+ {1, nullptr, "Ioctl"},
+ {2, nullptr, "Close"},
+ {4, nullptr, "QueryEvent"},
+ {9, nullptr, "DumpStatus"},
+ {10, nullptr, "InitializeDevtools"},
+ {11, nullptr, "Ioctl2"},
+ {12, nullptr, "Ioctl3"},
+ {13, nullptr, "SetConfiguration"},
+ };
+ RegisterHandlers(functions);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "Open"},
- FunctionInfo{1, nullptr, "Ioctl"},
- FunctionInfo{2, nullptr, "Close"},
- FunctionInfo{4, nullptr, "QueryEvent"},
- FunctionInfo{9, nullptr, "DumpStatus"},
- FunctionInfo{10, nullptr, "InitializeDevtools"},
- FunctionInfo{11, nullptr, "Ioctl2"},
- FunctionInfo{12, nullptr, "Ioctl3"},
- FunctionInfo{13, nullptr, "SetConfiguration"}
- );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/nvdrv/nvdrv_interface.cpp b/src/core/hle/service/nvdrv/nvdrv_interface.cpp
index db3dbd9f8e..5fae68adbb 100644
--- a/src/core/hle/service/nvdrv/nvdrv_interface.cpp
+++ b/src/core/hle/service/nvdrv/nvdrv_interface.cpp
@@ -245,6 +245,24 @@ void NVDRV::DumpGraphicsMemoryInfo(HLERequestContext& ctx) {
NVDRV::NVDRV(Core::System& system_, std::shared_ptr<Module> nvdrv_, const char* name)
: ServiceFramework{system_, name}, nvdrv{std::move(nvdrv_)} {
+ static const FunctionInfo functions[] = {
+ {0, &NVDRV::Open, "Open"},
+ {1, &NVDRV::Ioctl1, "Ioctl"},
+ {2, &NVDRV::Close, "Close"},
+ {3, &NVDRV::Initialize, "Initialize"},
+ {4, &NVDRV::QueryEvent, "QueryEvent"},
+ {5, nullptr, "MapSharedMem"},
+ {6, &NVDRV::GetStatus, "GetStatus"},
+ {7, nullptr, "SetAruidForTest"},
+ {8, &NVDRV::SetAruid, "SetAruid"},
+ {9, &NVDRV::DumpGraphicsMemoryInfo, "DumpGraphicsMemoryInfo"},
+ {10, nullptr, "InitializeDevtools"},
+ {11, &NVDRV::Ioctl2, "Ioctl2"},
+ {12, &NVDRV::Ioctl3, "Ioctl3"},
+ {13, &NVDRV::SetGraphicsFirmwareMemoryMarginEnabled,
+ "SetGraphicsFirmwareMemoryMarginEnabled"},
+ };
+ RegisterHandlers(functions);
}
NVDRV::~NVDRV() {
diff --git a/src/core/hle/service/nvdrv/nvdrv_interface.h b/src/core/hle/service/nvdrv/nvdrv_interface.h
index b9b574398a..f628fca7df 100644
--- a/src/core/hle/service/nvdrv/nvdrv_interface.h
+++ b/src/core/hle/service/nvdrv/nvdrv_interface.h
@@ -38,27 +38,8 @@ private:
void ServiceError(HLERequestContext& ctx, NvResult result);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &NVDRV::Open, "Open"},
- FunctionInfo{1, &NVDRV::Ioctl1, "Ioctl"},
- FunctionInfo{2, &NVDRV::Close, "Close"},
- FunctionInfo{3, &NVDRV::Initialize, "Initialize"},
- FunctionInfo{4, &NVDRV::QueryEvent, "QueryEvent"},
- FunctionInfo{5, nullptr, "MapSharedMem"},
- FunctionInfo{6, &NVDRV::GetStatus, "GetStatus"},
- FunctionInfo{7, nullptr, "SetAruidForTest"},
- FunctionInfo{8, &NVDRV::SetAruid, "SetAruid"},
- FunctionInfo{9, &NVDRV::DumpGraphicsMemoryInfo, "DumpGraphicsMemoryInfo"},
- FunctionInfo{10, nullptr, "InitializeDevtools"},
- FunctionInfo{11, &NVDRV::Ioctl2, "Ioctl2"},
- FunctionInfo{12, &NVDRV::Ioctl3, "Ioctl3"},
- FunctionInfo{13, &NVDRV::SetGraphicsFirmwareMemoryMarginEnabled,
- "SetGraphicsFirmwareMemoryMarginEnabled"}
- );
std::shared_ptr<Module> nvdrv;
+
u64 pid{};
bool is_initialized{};
NvCore::SessionId session_id{};
diff --git a/src/core/hle/service/nvdrv/nvmemp.cpp b/src/core/hle/service/nvdrv/nvmemp.cpp
index 8e2e4dfacb..a5477faf1a 100644
--- a/src/core/hle/service/nvdrv/nvmemp.cpp
+++ b/src/core/hle/service/nvdrv/nvmemp.cpp
@@ -11,6 +11,11 @@
namespace Service::Nvidia {
NVMEMP::NVMEMP(Core::System& system_) : ServiceFramework{system_, "nvmemp"} {
+ static const FunctionInfo functions[] = {
+ {0, &NVMEMP::Open, "Open"},
+ {1, &NVMEMP::GetAruid, "GetAruid"},
+ };
+ RegisterHandlers(functions);
}
NVMEMP::~NVMEMP() = default;
diff --git a/src/core/hle/service/nvdrv/nvmemp.h b/src/core/hle/service/nvdrv/nvmemp.h
index e98b07c494..6ff59834fe 100644
--- a/src/core/hle/service/nvdrv/nvmemp.h
+++ b/src/core/hle/service/nvdrv/nvmemp.h
@@ -22,14 +22,6 @@ public:
private:
void Open(HLERequestContext& ctx);
void GetAruid(HLERequestContext& ctx);
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &NVMEMP::Open, "Open"},
- FunctionInfo{1, &NVMEMP::GetAruid, "GetAruid"}
- );
};
} // namespace Service::Nvidia
diff --git a/src/core/hle/service/nvnflinger/binder.h b/src/core/hle/service/nvnflinger/binder.h
index 124accb946..6c7ce0ed0f 100644
--- a/src/core/hle/service/nvnflinger/binder.h
+++ b/src/core/hle/service/nvnflinger/binder.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-FileCopyrightText: Copyright 2014 The Android Open Source Project
// SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/core/hle/service/nvnflinger/buffer_item.h b/src/core/hle/service/nvnflinger/buffer_item.h
index 7fd808f546..718188d849 100644
--- a/src/core/hle/service/nvnflinger/buffer_item.h
+++ b/src/core/hle/service/nvnflinger/buffer_item.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-FileCopyrightText: Copyright 2014 The Android Open Source Project
// SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/core/hle/service/nvnflinger/buffer_item_consumer.h b/src/core/hle/service/nvnflinger/buffer_item_consumer.h
index 9f95c92800..7857569c0f 100644
--- a/src/core/hle/service/nvnflinger/buffer_item_consumer.h
+++ b/src/core/hle/service/nvnflinger/buffer_item_consumer.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-FileCopyrightText: Copyright 2012 The Android Open Source Project
// SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/core/hle/service/nvnflinger/buffer_queue_consumer.h b/src/core/hle/service/nvnflinger/buffer_queue_consumer.h
index a9226f1c35..84f36285c0 100644
--- a/src/core/hle/service/nvnflinger/buffer_queue_consumer.h
+++ b/src/core/hle/service/nvnflinger/buffer_queue_consumer.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-FileCopyrightText: Copyright 2014 The Android Open Source Project
// SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/core/hle/service/nvnflinger/buffer_queue_defs.h b/src/core/hle/service/nvnflinger/buffer_queue_defs.h
index 6fd3156f4a..77ebd0a6a0 100644
--- a/src/core/hle/service/nvnflinger/buffer_queue_defs.h
+++ b/src/core/hle/service/nvnflinger/buffer_queue_defs.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-FileCopyrightText: Copyright 2014 The Android Open Source Project
// SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/core/hle/service/nvnflinger/buffer_transform_flags.h b/src/core/hle/service/nvnflinger/buffer_transform_flags.h
index ffe579718f..6fb40d0a72 100644
--- a/src/core/hle/service/nvnflinger/buffer_transform_flags.h
+++ b/src/core/hle/service/nvnflinger/buffer_transform_flags.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/core/hle/service/nvnflinger/consumer_base.h b/src/core/hle/service/nvnflinger/consumer_base.h
index b29c16f86b..e187b520ca 100644
--- a/src/core/hle/service/nvnflinger/consumer_base.h
+++ b/src/core/hle/service/nvnflinger/consumer_base.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-FileCopyrightText: Copyright 2010 The Android Open Source Project
// SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/core/hle/service/nvnflinger/consumer_listener.h b/src/core/hle/service/nvnflinger/consumer_listener.h
index 74a1939883..4b4d939551 100644
--- a/src/core/hle/service/nvnflinger/consumer_listener.h
+++ b/src/core/hle/service/nvnflinger/consumer_listener.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-FileCopyrightText: Copyright 2014 The Android Open Source Project
// SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/core/hle/service/nvnflinger/graphic_buffer_producer.cpp b/src/core/hle/service/nvnflinger/graphic_buffer_producer.cpp
index d72b49a8e7..5de604233d 100644
--- a/src/core/hle/service/nvnflinger/graphic_buffer_producer.cpp
+++ b/src/core/hle/service/nvnflinger/graphic_buffer_producer.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-FileCopyrightText: Copyright 2010 The Android Open Source Project
// SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/core/hle/service/nvnflinger/graphic_buffer_producer.h b/src/core/hle/service/nvnflinger/graphic_buffer_producer.h
index 5d7cff7d38..05980eb482 100644
--- a/src/core/hle/service/nvnflinger/graphic_buffer_producer.h
+++ b/src/core/hle/service/nvnflinger/graphic_buffer_producer.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-FileCopyrightText: Copyright 2010 The Android Open Source Project
// SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/core/hle/service/nvnflinger/hos_binder_driver.cpp b/src/core/hle/service/nvnflinger/hos_binder_driver.cpp
index c9023374c4..fa1becc34e 100644
--- a/src/core/hle/service/nvnflinger/hos_binder_driver.cpp
+++ b/src/core/hle/service/nvnflinger/hos_binder_driver.cpp
@@ -11,21 +11,18 @@
namespace Service::Nvnflinger {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IHOSBinderDriver::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, C<&IHOSBinderDriver::TransactParcel>, "TransactParcel"},
- FunctionInfo{1, C<&IHOSBinderDriver::AdjustRefcount>, "AdjustRefcount"},
- FunctionInfo{2, C<&IHOSBinderDriver::GetNativeHandle>, "GetNativeHandle"},
- FunctionInfo{3, C<&IHOSBinderDriver::TransactParcelAuto>, "TransactParcelAuto"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IHOSBinderDriver::IHOSBinderDriver(Core::System& system_,
std::shared_ptr<HosBinderDriverServer> server,
std::shared_ptr<SurfaceFlinger> surface_flinger)
: ServiceFramework{system_, "IHOSBinderDriver"}, m_server(server),
m_surface_flinger(surface_flinger) {
+ static const FunctionInfo functions[] = {
+ {0, C<&IHOSBinderDriver::TransactParcel>, "TransactParcel"},
+ {1, C<&IHOSBinderDriver::AdjustRefcount>, "AdjustRefcount"},
+ {2, C<&IHOSBinderDriver::GetNativeHandle>, "GetNativeHandle"},
+ {3, C<&IHOSBinderDriver::TransactParcelAuto>, "TransactParcelAuto"},
+ };
+ RegisterHandlers(functions);
}
IHOSBinderDriver::~IHOSBinderDriver() = default;
diff --git a/src/core/hle/service/nvnflinger/hos_binder_driver.h b/src/core/hle/service/nvnflinger/hos_binder_driver.h
index 7d44046115..6b551c91d2 100644
--- a/src/core/hle/service/nvnflinger/hos_binder_driver.h
+++ b/src/core/hle/service/nvnflinger/hos_binder_driver.h
@@ -44,7 +44,6 @@ private:
OutBuffer<BufferAttr_HipcAutoSelect> parcel_reply, u32 flags);
private:
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
const std::shared_ptr<HosBinderDriverServer> m_server;
const std::shared_ptr<SurfaceFlinger> m_surface_flinger;
};
diff --git a/src/core/hle/service/nvnflinger/nvnflinger.cpp b/src/core/hle/service/nvnflinger/nvnflinger.cpp
index 9e3b68b8a0..48862a747d 100644
--- a/src/core/hle/service/nvnflinger/nvnflinger.cpp
+++ b/src/core/hle/service/nvnflinger/nvnflinger.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/core/hle/service/nvnflinger/nvnflinger.h b/src/core/hle/service/nvnflinger/nvnflinger.h
index 5c41f3013c..2f5465e7ef 100644
--- a/src/core/hle/service/nvnflinger/nvnflinger.h
+++ b/src/core/hle/service/nvnflinger/nvnflinger.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/core/hle/service/nvnflinger/parcel.h b/src/core/hle/service/nvnflinger/parcel.h
index 4567942016..ed85512792 100644
--- a/src/core/hle/service/nvnflinger/parcel.h
+++ b/src/core/hle/service/nvnflinger/parcel.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
diff --git a/src/core/hle/service/nvnflinger/pixel_format.h b/src/core/hle/service/nvnflinger/pixel_format.h
index f77d0acfb3..b6e8b5f8a0 100644
--- a/src/core/hle/service/nvnflinger/pixel_format.h
+++ b/src/core/hle/service/nvnflinger/pixel_format.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/core/hle/service/nvnflinger/producer_listener.h b/src/core/hle/service/nvnflinger/producer_listener.h
index 6bf8aaf1ee..892f6d531d 100644
--- a/src/core/hle/service/nvnflinger/producer_listener.h
+++ b/src/core/hle/service/nvnflinger/producer_listener.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-FileCopyrightText: Copyright 2014 The Android Open Source Project
// SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/core/hle/service/nvnflinger/status.h b/src/core/hle/service/nvnflinger/status.h
index 3fa0fe15b9..7b188b42f5 100644
--- a/src/core/hle/service/nvnflinger/status.h
+++ b/src/core/hle/service/nvnflinger/status.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/core/hle/service/nvnflinger/ui/graphic_buffer.cpp b/src/core/hle/service/nvnflinger/ui/graphic_buffer.cpp
index ede2a11933..5ba7a31cc8 100644
--- a/src/core/hle/service/nvnflinger/ui/graphic_buffer.cpp
+++ b/src/core/hle/service/nvnflinger/ui/graphic_buffer.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/core/hle/service/nvnflinger/ui/graphic_buffer.h b/src/core/hle/service/nvnflinger/ui/graphic_buffer.h
index da430aa752..099429b3f0 100644
--- a/src/core/hle/service/nvnflinger/ui/graphic_buffer.h
+++ b/src/core/hle/service/nvnflinger/ui/graphic_buffer.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-FileCopyrightText: Copyright 2007 The Android Open Source Project
// SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/core/hle/service/nvnflinger/window.h b/src/core/hle/service/nvnflinger/window.h
index 36d6cde3db..78a99f57ae 100644
--- a/src/core/hle/service/nvnflinger/window.h
+++ b/src/core/hle/service/nvnflinger/window.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/core/hle/service/olsc/daemon_controller.cpp b/src/core/hle/service/olsc/daemon_controller.cpp
index f25888170c..c449c6ff31 100644
--- a/src/core/hle/service/olsc/daemon_controller.cpp
+++ b/src/core/hle/service/olsc/daemon_controller.cpp
@@ -9,25 +9,27 @@
namespace Service::OLSC {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IDaemonController::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IDaemonController::GetApplicationAutoTransferSetting>, "GetApplicationAutoTransferSetting"},
- FunctionInfo{1, D<&IDaemonController::SetApplicationAutoTransferSetting>, "SetApplicationAutoTransferSetting"},
- FunctionInfo{2, D<&IDaemonController::GetGlobalAutoUploadSetting>, "GetGlobalAutoUploadSetting"},
- FunctionInfo{3, D<&IDaemonController::SetGlobalAutoUploadSetting>, "SetGlobalAutoUploadSetting"},
- FunctionInfo{4, D<&IDaemonController::RunTransferTaskAutonomyRegistration>, "RunTransferTaskAutonomyRegistration"},
- FunctionInfo{5, D<&IDaemonController::GetGlobalAutoDownloadSetting>, "GetGlobalAutoDownloadSetting", MakeVersionGate({11,0,0})},
- FunctionInfo{6, D<&IDaemonController::SetGlobalAutoDownloadSetting>, "SetGlobalAutoDownloadSetting", MakeVersionGate({11,0,0})},
- FunctionInfo{10, nullptr, "CreateForbiddenSaveDataInidication"},
- FunctionInfo{11, D<&IDaemonController::StopAutonomyTaskExecution>, "StopAutonomyTaskExecution"},
- FunctionInfo{12, D<&IDaemonController::GetAutonomyTaskStatus>, "GetAutonomyTaskStatus"},
- FunctionInfo{13, nullptr, "Unknown13_20_0_0_Plus", MakeVersionGate({20,0,0})}
- );
- return HandlerTableGenerateWithFind(key, functions);
+IDaemonController::IDaemonController(Core::System& system_)
+ : ServiceFramework{system_, "IDaemonController"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IDaemonController::GetApplicationAutoTransferSetting>, "GetApplicationAutoTransferSetting"},
+ {1, D<&IDaemonController::SetApplicationAutoTransferSetting>, "SetApplicationAutoTransferSetting"},
+ {2, D<&IDaemonController::GetGlobalAutoUploadSetting>, "GetGlobalAutoUploadSetting"},
+ {3, D<&IDaemonController::SetGlobalAutoUploadSetting>, "SetGlobalAutoUploadSetting"},
+ {4, D<&IDaemonController::RunTransferTaskAutonomyRegistration>, "RunTransferTaskAutonomyRegistration"},
+ {5, D<&IDaemonController::GetGlobalAutoDownloadSetting>, "GetGlobalAutoDownloadSetting"}, // 11.0.0+
+ {6, D<&IDaemonController::SetGlobalAutoDownloadSetting>, "SetGlobalAutoDownloadSetting"}, // 11.0.0+
+ {10, nullptr, "CreateForbiddenSaveDataInidication"},
+ {11, D<&IDaemonController::StopAutonomyTaskExecution>, "StopAutonomyTaskExecution"},
+ {12, D<&IDaemonController::GetAutonomyTaskStatus>, "GetAutonomyTaskStatus"},
+ {13, nullptr, "Unknown13_20_0_0_Plus"}, // 20.0.0+
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
-IDaemonController::IDaemonController(Core::System& system_) : ServiceFramework{system_, "IDaemonController"} {}
-
IDaemonController::~IDaemonController() = default;
Result IDaemonController::GetApplicationAutoTransferSetting(Out<bool> out_is_enabled,
diff --git a/src/core/hle/service/olsc/daemon_controller.h b/src/core/hle/service/olsc/daemon_controller.h
index b90d3ee778..70f3d9e235 100644
--- a/src/core/hle/service/olsc/daemon_controller.h
+++ b/src/core/hle/service/olsc/daemon_controller.h
@@ -38,8 +38,6 @@ private:
Result GetAutonomyTaskStatus(Out<u8> out_status, Common::UUID user_id);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
-
// Internal in-memory state to back the above APIs
struct AppKey {
Common::UUID user_id;
diff --git a/src/core/hle/service/olsc/native_handle_holder.cpp b/src/core/hle/service/olsc/native_handle_holder.cpp
index 1f6f8419fc..1e50195539 100644
--- a/src/core/hle/service/olsc/native_handle_holder.cpp
+++ b/src/core/hle/service/olsc/native_handle_holder.cpp
@@ -12,16 +12,16 @@
namespace Service::OLSC {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> INativeHandleHolder::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&INativeHandleHolder::GetNativeHandle>, "GetNativeHandle"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
INativeHandleHolder::INativeHandleHolder(Core::System& system_)
: ServiceFramework{system_, "INativeHandleHolder"}, service_context{system_, "OLSC"} {
event = service_context.CreateEvent("OLSC::INativeHandleHolder");
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&INativeHandleHolder::GetNativeHandle>, "GetNativeHandle"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
INativeHandleHolder::~INativeHandleHolder() {
diff --git a/src/core/hle/service/olsc/native_handle_holder.h b/src/core/hle/service/olsc/native_handle_holder.h
index 0ab51c7ca0..e0eac50c28 100644
--- a/src/core/hle/service/olsc/native_handle_holder.h
+++ b/src/core/hle/service/olsc/native_handle_holder.h
@@ -25,7 +25,6 @@ public:
private:
Result GetNativeHandle(OutCopyHandle<Kernel::KReadableEvent> out_event);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
Service::KernelHelpers::ServiceContext service_context;
Kernel::KEvent* event{};
diff --git a/src/core/hle/service/olsc/olsc.cpp b/src/core/hle/service/olsc/olsc.cpp
index 03b8a696f5..a86c525f9a 100644
--- a/src/core/hle/service/olsc/olsc.cpp
+++ b/src/core/hle/service/olsc/olsc.cpp
@@ -6,179 +6,22 @@
#include "core/hle/service/olsc/olsc.h"
#include "core/hle/service/olsc/olsc_service_for_application.h"
-#include "core/hle/service/olsc/native_handle_holder.h"
-#include "core/hle/service/olsc/stopper_object.h"
-#include "core/hle/service/olsc/daemon_controller.h"
-#include "core/hle/service/olsc/transfer_task_list_controller.h"
-#include "core/hle/service/olsc/remote_storage_controller.h"
+#include "core/hle/service/olsc/olsc_service_for_system_service.h"
#include "core/hle/service/server_manager.h"
#include "core/hle/service/service.h"
-#include "core/hle/service/cmif_serialization.h"
namespace Service::OLSC {
class ISProfileBgAgentForSystemProcess final : public ServiceFramework<ISProfileBgAgentForSystemProcess> {
public:
- explicit ISProfileBgAgentForSystemProcess(Core::System& system_) : ServiceFramework{system_, "spbg:sp"} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{100, nullptr, "OpenBgAgentController" }
- );
-};
-
-class IDaemonController;
-class IRemoteStorageController;
-class ITransferTaskListController;
-
-struct DataTransferPolicy {
- u8 upload_policy;
- u8 download_policy;
-};
-
-struct TransferTaskErrorInfo {
- Common::UUID uid;
- u64 application_id;
- u8 unknown_0x18;
- std::array<u8, 7> reserved_0x19;
- u64 unknown_0x20;
- u32 error_code;
- u32 reserved_0x2C;
-};
-static_assert(sizeof(TransferTaskErrorInfo) == 0x30, "TransferTaskErrorInfo has incorrect size.");
-
-class IOlscServiceForSystemService final : public ServiceFramework<IOlscServiceForSystemService> {
-public:
- explicit IOlscServiceForSystemService(Core::System& system_)
- : ServiceFramework{system_, "olsc:s"} {
- }
-
- ~IOlscServiceForSystemService() override = default;
-
- Result GetTransferTaskListController(
- Out<SharedPointer<ITransferTaskListController>> out_interface) {
- LOG_INFO(Service_OLSC, "called");
- *out_interface = std::make_shared<ITransferTaskListController>(system);
- R_SUCCEED();
- }
-
- Result GetRemoteStorageController(
- Out<SharedPointer<IRemoteStorageController>> out_interface) {
- LOG_INFO(Service_OLSC, "called");
- *out_interface = std::make_shared<IRemoteStorageController>(system);
- R_SUCCEED();
- }
-
- Result GetDaemonController(
- Out<SharedPointer<IDaemonController>> out_interface) {
- LOG_INFO(Service_OLSC, "called");
- *out_interface = std::make_shared<IDaemonController>(system);
- R_SUCCEED();
- }
-
- Result GetDataTransferPolicy(
- Out<DataTransferPolicy> out_policy, u64 application_id) {
- LOG_WARNING(Service_OLSC, "(STUBBED) called");
- DataTransferPolicy policy{};
- policy.upload_policy = 0;
- policy.download_policy = 0;
- *out_policy = policy;
- R_SUCCEED();
- }
-
- Result GetTransferTaskErrorInfo(Out<TransferTaskErrorInfo> out_info,
- Common::UUID uuid, u64 application_id) {
- LOG_WARNING(Service_OLSC, "(STUBBED) called, uuid={} application_id={:016X}",
- uuid.FormattedString(), application_id);
-
- TransferTaskErrorInfo info{};
- info.uid = uuid;
- info.application_id = application_id;
- info.unknown_0x18 = 0;
- info.reserved_0x19.fill(0);
- info.unknown_0x20 = 0;
- info.error_code = 0;
- info.reserved_0x2C = 0;
-
- *out_info = info;
- R_SUCCEED();
- }
-
- Result GetOlscServiceForSystemService(
- Out<SharedPointer<IOlscServiceForSystemService>> out_interface) {
- LOG_INFO(Service_OLSC, "called");
- *out_interface = std::static_pointer_cast<IOlscServiceForSystemService>(shared_from_this());
- R_SUCCEED();
- }
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit ISProfileBgAgentForSystemProcess(Core::System& system_)
+ : ServiceFramework{system_, "spbg:sp"}
+ {
+ static const FunctionInfo functions[] = {
+ { 100, nullptr, "OpenBgAgentController" },
+ };
+ RegisterHandlers(functions);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IOlscServiceForSystemService::GetTransferTaskListController>, "GetTransferTaskListController"},
- FunctionInfo{1, D<&IOlscServiceForSystemService::GetRemoteStorageController>, "GetRemoteStorageController"},
- FunctionInfo{2, D<&IOlscServiceForSystemService::GetDaemonController>, "GetDaemonController"},
- FunctionInfo{10, nullptr, "PrepareDeleteUserProperty"},
- FunctionInfo{11, nullptr, "DeleteUserSaveDataProperty"},
- FunctionInfo{12, nullptr, "InvalidateMountCache"},
- FunctionInfo{13, nullptr, "DeleteDeviceSaveDataProperty"},
- FunctionInfo{100, nullptr, "ListLastTransferTaskErrorInfo"},
- FunctionInfo{101, nullptr, "GetLastErrorInfoCount"},
- FunctionInfo{102, nullptr, "RemoveLastErrorInfoOld"},
- FunctionInfo{103, nullptr, "GetLastErrorInfo"},
- FunctionInfo{104, nullptr, "GetLastErrorEventHolder"},
- FunctionInfo{105, D<&IOlscServiceForSystemService::GetTransferTaskErrorInfo>, "GetTransferTaskErrorInfo"},
- FunctionInfo{200, D<&IOlscServiceForSystemService::GetDataTransferPolicy>, "GetDataTransferPolicy"},
- FunctionInfo{201, nullptr, "DeleteDataTransferPolicyCache"},
- FunctionInfo{202, nullptr, "Unknown202"},
- FunctionInfo{203, nullptr, "RequestUpdateDataTransferPolicyCacheAsync"},
- FunctionInfo{204, nullptr, "ClearDataTransferPolicyCache"},
- FunctionInfo{205, nullptr, "RequestGetDataTransferPolicyAsync"},
- FunctionInfo{206, nullptr, "Unknown206", MakeVersionGate({21,0,0})},
- FunctionInfo{300, nullptr, "GetUserSaveDataProperty"},
- FunctionInfo{301, nullptr, "SetUserSaveDataProperty"},
- FunctionInfo{302, nullptr, "Unknown302", MakeVersionGate({21,0,0})},
- FunctionInfo{400, nullptr, "CleanupSaveDataBackupContextForSpecificApplications"},
- FunctionInfo{900, nullptr, "DeleteAllTransferTask"},
- FunctionInfo{902, nullptr, "DeleteAllSeriesInfo"},
- FunctionInfo{903, nullptr, "DeleteAllSdaInfoCache"},
- FunctionInfo{904, nullptr, "DeleteAllApplicationSetting"},
- FunctionInfo{905, nullptr, "DeleteAllTransferTaskErrorInfo"},
- FunctionInfo{906, nullptr, "RegisterTransferTaskErrorInfo"},
- FunctionInfo{907, nullptr, "AddSaveDataArchiveInfoCache"},
- FunctionInfo{908, nullptr, "DeleteSeriesInfo"},
- FunctionInfo{909, nullptr, "GetSeriesInfo"},
- FunctionInfo{910, nullptr, "RemoveTransferTaskErrorInfo"},
- FunctionInfo{911, nullptr, "DeleteAllSeriesInfoForSaveDataBackup"},
- FunctionInfo{912, nullptr, "DeleteSeriesInfoForSaveDataBackup"},
- FunctionInfo{913, nullptr, "GetSeriesInfoForSaveDataBackup"},
- FunctionInfo{914, nullptr, "Unknown914", MakeVersionGate({20,2,0})},
- FunctionInfo{1000, nullptr, "UpdateIssueOld"},
- FunctionInfo{1010, nullptr, "Unknown1010"},
- FunctionInfo{1011, nullptr, "Unknown1011"},
- FunctionInfo{1012, nullptr, "Unknown1012"},
- FunctionInfo{1013, nullptr, "Unkown1013"},
- FunctionInfo{1014, nullptr, "Unknown1014"},
- FunctionInfo{1020, nullptr, "Unknown1020"},
- FunctionInfo{1021, nullptr, "Unknown1021"},
- FunctionInfo{1022, nullptr, "Unknown1022"},
- FunctionInfo{1023, nullptr, "Unknown1023"},
- FunctionInfo{1024, nullptr, "Unknown1024"},
- FunctionInfo{1100, nullptr, "RepairUpdateIssueInfoCacheAync"},
- FunctionInfo{1110, nullptr, "RepairGetIssueInfo"},
- FunctionInfo{1111, nullptr, "RepairListIssueInfo"},
- FunctionInfo{1112, nullptr, "RepairListOperationPermissionInfo"},
- FunctionInfo{1113, nullptr, "RepairListDataInfoForRepairedSaveDataDownload"},
- FunctionInfo{1114, nullptr, "RepairListDataInfoForOriginalSaveDataDownload"},
- FunctionInfo{1120, nullptr, "RepairUploadSaveDataAsync"},
- FunctionInfo{1121, nullptr, "RepairUploadSaveDataAsync1"},
- FunctionInfo{1122, nullptr, "RepairDownloadRepairedSaveDataAsync"},
- FunctionInfo{1123, nullptr, "RepairDownloadOriginalSaveDataAsync"},
- FunctionInfo{1124, nullptr, "RepairGetOperationProgressInfo"},
- FunctionInfo{10000, D<&IOlscServiceForSystemService::GetOlscServiceForSystemService>, "GetOlscServiceForSystemService"}
- );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/olsc/olsc.h b/src/core/hle/service/olsc/olsc.h
index 620b634fae..62000529c5 100644
--- a/src/core/hle/service/olsc/olsc.h
+++ b/src/core/hle/service/olsc/olsc.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/olsc/olsc_service_for_application.cpp b/src/core/hle/service/olsc/olsc_service_for_application.cpp
index 8d6b20d7ff..73d7d4ed64 100644
--- a/src/core/hle/service/olsc/olsc_service_for_application.cpp
+++ b/src/core/hle/service/olsc/olsc_service_for_application.cpp
@@ -9,36 +9,36 @@
namespace Service::OLSC {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IOlscServiceForApplication::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IOlscServiceForApplication::Initialize>, "Initialize"},
- FunctionInfo{10, nullptr, "VerifySaveDataBackupLicenseAsync"},
- FunctionInfo{13, D<&IOlscServiceForApplication::GetSaveDataBackupSetting>, "GetSaveDataBackupSetting"},
- FunctionInfo{14, D<&IOlscServiceForApplication::SetSaveDataBackupSettingEnabled>, "SetSaveDataBackupSettingEnabled"},
- FunctionInfo{15, nullptr, "SetCustomData"},
- FunctionInfo{16, nullptr, "DeleteSaveDataBackupSetting"},
- FunctionInfo{18, nullptr, "GetSaveDataBackupInfoCache"},
- FunctionInfo{19, nullptr, "UpdateSaveDataBackupInfoCacheAsync"},
- FunctionInfo{22, nullptr, "DeleteSaveDataBackupAsync"},
- FunctionInfo{25, nullptr, "ListDownloadableSaveDataBackupInfoAsync"},
- FunctionInfo{26, nullptr, "DownloadSaveDataBackupAsync"},
- FunctionInfo{27, nullptr, "UploadSaveDataBackupAsync"},
- FunctionInfo{9010, nullptr, "VerifySaveDataBackupLicenseAsyncForDebug"},
- FunctionInfo{9013, nullptr, "GetSaveDataBackupSettingForDebug"},
- FunctionInfo{9014, nullptr, "SetSaveDataBackupSettingEnabledForDebug"},
- FunctionInfo{9015, nullptr, "SetCustomDataForDebug"},
- FunctionInfo{9016, nullptr, "DeleteSaveDataBackupSettingForDebug"},
- FunctionInfo{9018, nullptr, "GetSaveDataBackupInfoCacheForDebug"},
- FunctionInfo{9019, nullptr, "UpdateSaveDataBackupInfoCacheAsyncForDebug"},
- FunctionInfo{9022, nullptr, "DeleteSaveDataBackupAsyncForDebug"},
- FunctionInfo{9025, nullptr, "ListDownloadableSaveDataBackupInfoAsyncForDebug"},
- FunctionInfo{9026, nullptr, "DownloadSaveDataBackupAsyncForDebug"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IOlscServiceForApplication::IOlscServiceForApplication(Core::System& system_)
: ServiceFramework{system_, "olsc:u"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IOlscServiceForApplication::Initialize>, "Initialize"},
+ {10, nullptr, "VerifySaveDataBackupLicenseAsync"},
+ {13, D<&IOlscServiceForApplication::GetSaveDataBackupSetting>, "GetSaveDataBackupSetting"},
+ {14, D<&IOlscServiceForApplication::SetSaveDataBackupSettingEnabled>, "SetSaveDataBackupSettingEnabled"},
+ {15, nullptr, "SetCustomData"},
+ {16, nullptr, "DeleteSaveDataBackupSetting"},
+ {18, nullptr, "GetSaveDataBackupInfoCache"},
+ {19, nullptr, "UpdateSaveDataBackupInfoCacheAsync"},
+ {22, nullptr, "DeleteSaveDataBackupAsync"},
+ {25, nullptr, "ListDownloadableSaveDataBackupInfoAsync"},
+ {26, nullptr, "DownloadSaveDataBackupAsync"},
+ {27, nullptr, "UploadSaveDataBackupAsync"},
+ {9010, nullptr, "VerifySaveDataBackupLicenseAsyncForDebug"},
+ {9013, nullptr, "GetSaveDataBackupSettingForDebug"},
+ {9014, nullptr, "SetSaveDataBackupSettingEnabledForDebug"},
+ {9015, nullptr, "SetCustomDataForDebug"},
+ {9016, nullptr, "DeleteSaveDataBackupSettingForDebug"},
+ {9018, nullptr, "GetSaveDataBackupInfoCacheForDebug"},
+ {9019, nullptr, "UpdateSaveDataBackupInfoCacheAsyncForDebug"},
+ {9022, nullptr, "DeleteSaveDataBackupAsyncForDebug"},
+ {9025, nullptr, "ListDownloadableSaveDataBackupInfoAsyncForDebug"},
+ {9026, nullptr, "DownloadSaveDataBackupAsyncForDebug"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IOlscServiceForApplication::~IOlscServiceForApplication() = default;
diff --git a/src/core/hle/service/olsc/olsc_service_for_application.h b/src/core/hle/service/olsc/olsc_service_for_application.h
index 0d92f9ba78..8941659478 100644
--- a/src/core/hle/service/olsc/olsc_service_for_application.h
+++ b/src/core/hle/service/olsc/olsc_service_for_application.h
@@ -22,8 +22,6 @@ private:
Result GetSaveDataBackupSetting(Out<u8> out_save_data_backup_setting);
Result SetSaveDataBackupSettingEnabled(bool enabled, NS::Uid account_id);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
-
bool initialized{};
};
diff --git a/src/core/hle/service/olsc/olsc_service_for_system_service.cpp b/src/core/hle/service/olsc/olsc_service_for_system_service.cpp
new file mode 100644
index 0000000000..245bbd5c6b
--- /dev/null
+++ b/src/core/hle/service/olsc/olsc_service_for_system_service.cpp
@@ -0,0 +1,144 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/olsc/daemon_controller.h"
+#include "core/hle/service/olsc/olsc_service_for_system_service.h"
+#include "core/hle/service/olsc/remote_storage_controller.h"
+#include "core/hle/service/olsc/transfer_task_list_controller.h"
+
+namespace Service::OLSC {
+
+IOlscServiceForSystemService::IOlscServiceForSystemService(Core::System& system_)
+ : ServiceFramework{system_, "olsc:s"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IOlscServiceForSystemService::GetTransferTaskListController>, "GetTransferTaskListController"},
+ {1, D<&IOlscServiceForSystemService::GetRemoteStorageController>, "GetRemoteStorageController"},
+ {2, D<&IOlscServiceForSystemService::GetDaemonController>, "GetDaemonController"},
+ {10, nullptr, "PrepareDeleteUserProperty"},
+ {11, nullptr, "DeleteUserSaveDataProperty"},
+ {12, nullptr, "InvalidateMountCache"},
+ {13, nullptr, "DeleteDeviceSaveDataProperty"},
+ {100, nullptr, "ListLastTransferTaskErrorInfo"},
+ {101, nullptr, "GetLastErrorInfoCount"},
+ {102, nullptr, "RemoveLastErrorInfoOld"},
+ {103, nullptr, "GetLastErrorInfo"},
+ {104, nullptr, "GetLastErrorEventHolder"},
+ {105, D<&IOlscServiceForSystemService::GetTransferTaskErrorInfo>, "GetTransferTaskErrorInfo"},
+ {200, D<&IOlscServiceForSystemService::GetDataTransferPolicy>, "GetDataTransferPolicy"},
+ {201, nullptr, "DeleteDataTransferPolicyCache"},
+ {202, nullptr, "Unknown202"},
+ {203, nullptr, "RequestUpdateDataTransferPolicyCacheAsync"},
+ {204, nullptr, "ClearDataTransferPolicyCache"},
+ {205, nullptr, "RequestGetDataTransferPolicyAsync"},
+ {206, nullptr, "Unknown206"}, //21.0.0+
+ {300, nullptr, "GetUserSaveDataProperty"},
+ {301, nullptr, "SetUserSaveDataProperty"},
+ {302, nullptr, "Unknown302"}, //21.0.0+
+ {400, nullptr, "CleanupSaveDataBackupContextForSpecificApplications"},
+ {900, nullptr, "DeleteAllTransferTask"},
+ {902, nullptr, "DeleteAllSeriesInfo"},
+ {903, nullptr, "DeleteAllSdaInfoCache"},
+ {904, nullptr, "DeleteAllApplicationSetting"},
+ {905, nullptr, "DeleteAllTransferTaskErrorInfo"},
+ {906, nullptr, "RegisterTransferTaskErrorInfo"},
+ {907, nullptr, "AddSaveDataArchiveInfoCache"},
+ {908, nullptr, "DeleteSeriesInfo"},
+ {909, nullptr, "GetSeriesInfo"},
+ {910, nullptr, "RemoveTransferTaskErrorInfo"},
+ {911, nullptr, "DeleteAllSeriesInfoForSaveDataBackup"},
+ {912, nullptr, "DeleteSeriesInfoForSaveDataBackup"},
+ {913, nullptr, "GetSeriesInfoForSaveDataBackup"},
+ {914, nullptr, "Unknown914"}, //20.2.0+
+ {1000, nullptr, "UpdateIssueOld"},
+ {1010, nullptr, "Unknown1010"},
+ {1011, nullptr, "Unknown1011"},
+ {1012, nullptr, "Unknown1012"},
+ {1013, nullptr, "Unkown1013"},
+ {1014, nullptr, "Unknown1014"},
+ {1020, nullptr, "Unknown1020"},
+ {1021, nullptr, "Unknown1021"},
+ {1022, nullptr, "Unknown1022"},
+ {1023, nullptr, "Unknown1023"},
+ {1024, nullptr, "Unknown1024"},
+ {1100, nullptr, "RepairUpdateIssueInfoCacheAync"},
+ {1110, nullptr, "RepairGetIssueInfo"},
+ {1111, nullptr, "RepairListIssueInfo"},
+ {1112, nullptr, "RepairListOperationPermissionInfo"},
+ {1113, nullptr, "RepairListDataInfoForRepairedSaveDataDownload"},
+ {1114, nullptr, "RepairListDataInfoForOriginalSaveDataDownload"},
+ {1120, nullptr, "RepairUploadSaveDataAsync"},
+ {1121, nullptr, "RepairUploadSaveDataAsync1"},
+ {1122, nullptr, "RepairDownloadRepairedSaveDataAsync"},
+ {1123, nullptr, "RepairDownloadOriginalSaveDataAsync"},
+ {1124, nullptr, "RepairGetOperationProgressInfo"},
+ {10000, D<&IOlscServiceForSystemService::GetOlscServiceForSystemService>, "GetOlscServiceForSystemService"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
+IOlscServiceForSystemService::~IOlscServiceForSystemService() = default;
+
+Result IOlscServiceForSystemService::GetTransferTaskListController(
+ Out<SharedPointer<ITransferTaskListController>> out_interface) {
+ LOG_INFO(Service_OLSC, "called");
+ *out_interface = std::make_shared<ITransferTaskListController>(system);
+ R_SUCCEED();
+}
+
+Result IOlscServiceForSystemService::GetRemoteStorageController(
+ Out<SharedPointer<IRemoteStorageController>> out_interface) {
+ LOG_INFO(Service_OLSC, "called");
+ *out_interface = std::make_shared<IRemoteStorageController>(system);
+ R_SUCCEED();
+}
+
+Result IOlscServiceForSystemService::GetDaemonController(
+ Out<SharedPointer<IDaemonController>> out_interface) {
+ LOG_INFO(Service_OLSC, "called");
+ *out_interface = std::make_shared<IDaemonController>(system);
+ R_SUCCEED();
+}
+
+Result IOlscServiceForSystemService::GetDataTransferPolicy(
+ Out<DataTransferPolicy> out_policy, u64 application_id) {
+ LOG_WARNING(Service_OLSC, "(STUBBED) called");
+ DataTransferPolicy policy{};
+ policy.upload_policy = 0;
+ policy.download_policy = 0;
+ *out_policy = policy;
+ R_SUCCEED();
+}
+
+Result IOlscServiceForSystemService::GetTransferTaskErrorInfo(Out<TransferTaskErrorInfo> out_info,
+ Common::UUID uuid, u64 application_id) {
+ LOG_WARNING(Service_OLSC, "(STUBBED) called, uuid={} application_id={:016X}",
+ uuid.FormattedString(), application_id);
+
+ TransferTaskErrorInfo info{};
+ info.uid = uuid;
+ info.application_id = application_id;
+ info.unknown_0x18 = 0;
+ info.reserved_0x19.fill(0);
+ info.unknown_0x20 = 0;
+ info.error_code = 0;
+ info.reserved_0x2C = 0;
+
+ *out_info = info;
+ R_SUCCEED();
+}
+
+Result IOlscServiceForSystemService::GetOlscServiceForSystemService(
+ Out<SharedPointer<IOlscServiceForSystemService>> out_interface) {
+ LOG_INFO(Service_OLSC, "called");
+ *out_interface = std::static_pointer_cast<IOlscServiceForSystemService>(shared_from_this());
+ R_SUCCEED();
+}
+
+} // namespace Service::OLSC
diff --git a/src/core/hle/service/olsc/olsc_service_for_system_service.h b/src/core/hle/service/olsc/olsc_service_for_system_service.h
new file mode 100644
index 0000000000..d16c8b979b
--- /dev/null
+++ b/src/core/hle/service/olsc/olsc_service_for_system_service.h
@@ -0,0 +1,53 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include <array>
+
+#include "common/uuid.h"
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/service.h"
+
+namespace Service::OLSC {
+
+class IDaemonController;
+class IRemoteStorageController;
+class ITransferTaskListController;
+
+struct DataTransferPolicy {
+ u8 upload_policy;
+ u8 download_policy;
+};
+
+struct TransferTaskErrorInfo {
+ Common::UUID uid;
+ u64 application_id;
+ u8 unknown_0x18;
+ std::array<u8, 7> reserved_0x19;
+ u64 unknown_0x20;
+ u32 error_code;
+ u32 reserved_0x2C;
+};
+static_assert(sizeof(TransferTaskErrorInfo) == 0x30, "TransferTaskErrorInfo has incorrect size.");
+
+class IOlscServiceForSystemService final : public ServiceFramework<IOlscServiceForSystemService> {
+public:
+ explicit IOlscServiceForSystemService(Core::System& system_);
+ ~IOlscServiceForSystemService() override;
+
+private:
+ Result GetTransferTaskListController(
+ Out<SharedPointer<ITransferTaskListController>> out_interface);
+ Result GetRemoteStorageController(Out<SharedPointer<IRemoteStorageController>> out_interface);
+ Result GetDaemonController(Out<SharedPointer<IDaemonController>> out_interface);
+ Result GetDataTransferPolicy(Out<DataTransferPolicy> out_policy, u64 application_id);
+ Result GetTransferTaskErrorInfo(Out<TransferTaskErrorInfo> out_info, Common::UUID uid, u64 application_id);
+ Result GetOlscServiceForSystemService(
+ Out<SharedPointer<IOlscServiceForSystemService>> out_interface);
+};
+
+} // namespace Service::OLSC
diff --git a/src/core/hle/service/olsc/remote_storage_controller.cpp b/src/core/hle/service/olsc/remote_storage_controller.cpp
index 1e7825da30..817097b426 100644
--- a/src/core/hle/service/olsc/remote_storage_controller.cpp
+++ b/src/core/hle/service/olsc/remote_storage_controller.cpp
@@ -9,44 +9,44 @@
namespace Service::OLSC {
- std::optional<ServiceFrameworkBase::FunctionInfoBase> IRemoteStorageController::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetSaveDataArchiveInfoBySaveDataId"},
- FunctionInfo{1, nullptr, "GetSaveDataArchiveInfoByApplicationId"},
- FunctionInfo{3, nullptr, "GetSaveDataArchiveCount"},
- FunctionInfo{6, nullptr, "CleanupSaveDataArchives"},
- FunctionInfo{7, nullptr, "CreateSaveDataArchiveCacheUpdationTask"},
- FunctionInfo{8, nullptr, "CreateSaveDataArchiveCacheUpdationForSpecifiedApplicationTask"},
- FunctionInfo{9, nullptr, "Delete"},
- FunctionInfo{10, nullptr, "GetSeriesInfo"},
- FunctionInfo{11, nullptr, "CreateDeleteDataTask"},
- FunctionInfo{12, nullptr, "DeleteSeriesInfo"},
- FunctionInfo{13, nullptr, "CreateRegisterNotificationTokenTask"},
- FunctionInfo{14, D<&IRemoteStorageController::GetDataNewnessByApplicationId>, "GetDataNewnessByApplicationId"},
- FunctionInfo{15, nullptr, "RegisterUploadSaveDataTransferTaskForAutonomyRegistration"},
- FunctionInfo{16, nullptr, "CreateCleanupToDeleteSaveDataArchiveInfoTask"},
- FunctionInfo{17, nullptr, "ListDataInfo"},
- FunctionInfo{18, D<&IRemoteStorageController::GetDataInfo>, "GetDataInfoV1"},
- FunctionInfo{19, nullptr, "GetDataInfoCacheUpdateNativeHandleHolder"},
- FunctionInfo{20, nullptr, "CreateSaveDataArchiveInfoCacheForSaveDataBackupUpdationTask"},
- FunctionInfo{21, nullptr, "ListSecondarySaves"},
- FunctionInfo{22, D<&IRemoteStorageController::GetSecondarySave>, "GetSecondarySave"},
- FunctionInfo{23, nullptr, "TouchSecondarySave"},
- FunctionInfo{24, nullptr, "GetSecondarySaveDataInfo"},
- FunctionInfo{25, nullptr, "RegisterDownloadSaveDataTransferTaskForAutonomyRegistration"},
- FunctionInfo{26, nullptr, "Unknown26", MakeVersionGate({20,0,0})},
- FunctionInfo{27, D<&IRemoteStorageController::GetDataInfo>, "GetDataInfoV2", MakeVersionGate({20,0,0})},
- FunctionInfo{28, nullptr, "Unknown28", MakeVersionGate({20,0,0})},
- FunctionInfo{29, nullptr, "Unknown29", MakeVersionGate({21,0,0})},
- FunctionInfo{800, nullptr, "Unknown800", MakeVersionGate({20,0,0})},
- FunctionInfo{900, nullptr, "SetLoadedDataMissing"},
- FunctionInfo{901, nullptr, "Unknown901", MakeVersionGate({20,2,0})}
- );
- return HandlerTableGenerateWithFind(key, functions);
- }
-
IRemoteStorageController::IRemoteStorageController(Core::System& system_)
: ServiceFramework{system_, "IRemoteStorageController"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetSaveDataArchiveInfoBySaveDataId"},
+ {1, nullptr, "GetSaveDataArchiveInfoByApplicationId"},
+ {3, nullptr, "GetSaveDataArchiveCount"},
+ {6, nullptr, "CleanupSaveDataArchives"},
+ {7, nullptr, "CreateSaveDataArchiveCacheUpdationTask"},
+ {8, nullptr, "CreateSaveDataArchiveCacheUpdationForSpecifiedApplicationTask"},
+ {9, nullptr, "Delete"},
+ {10, nullptr, "GetSeriesInfo"},
+ {11, nullptr, "CreateDeleteDataTask"},
+ {12, nullptr, "DeleteSeriesInfo"},
+ {13, nullptr, "CreateRegisterNotificationTokenTask"},
+ {14, D<&IRemoteStorageController::GetDataNewnessByApplicationId>, "GetDataNewnessByApplicationId"},
+ {15, nullptr, "RegisterUploadSaveDataTransferTaskForAutonomyRegistration"},
+ {16, nullptr, "CreateCleanupToDeleteSaveDataArchiveInfoTask"},
+ {17, nullptr, "ListDataInfo"},
+ {18, D<&IRemoteStorageController::GetDataInfo>, "GetDataInfoV1"},
+ {19, nullptr, "GetDataInfoCacheUpdateNativeHandleHolder"},
+ {20, nullptr, "CreateSaveDataArchiveInfoCacheForSaveDataBackupUpdationTask"},
+ {21, nullptr, "ListSecondarySaves"},
+ {22, D<&IRemoteStorageController::GetSecondarySave>, "GetSecondarySave"},
+ {23, nullptr, "TouchSecondarySave"},
+ {24, nullptr, "GetSecondarySaveDataInfo"},
+ {25, nullptr, "RegisterDownloadSaveDataTransferTaskForAutonomyRegistration"},
+ {26, nullptr, "Unknown26"}, //20.0.0+
+ {27, D<&IRemoteStorageController::GetDataInfo>, "GetDataInfoV2"}, //20.0.0+
+ {28, nullptr, "Unknown28"}, //20.0.0+
+ {29, nullptr, "Unknown29"}, //21.0.0+
+ {800, nullptr, "Unknown800"}, //20.0.0+
+ {900, nullptr, "SetLoadedDataMissing"},
+ {901, nullptr, "Unknown901"}, //20.2.0+
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IRemoteStorageController::~IRemoteStorageController() = default;
diff --git a/src/core/hle/service/olsc/remote_storage_controller.h b/src/core/hle/service/olsc/remote_storage_controller.h
index 20503d9800..21b439013a 100644
--- a/src/core/hle/service/olsc/remote_storage_controller.h
+++ b/src/core/hle/service/olsc/remote_storage_controller.h
@@ -21,8 +21,6 @@ private:
u64 application_id);
Result GetDataNewnessByApplicationId(Out<u8> out_newness, u64 application_id);
Result GetDataInfo(Out<std::array<u8, 0x38>> out_data, u64 application_id);
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::OLSC
diff --git a/src/core/hle/service/olsc/transfer_task_list_controller.cpp b/src/core/hle/service/olsc/transfer_task_list_controller.cpp
index af090fc292..95e41cdb51 100644
--- a/src/core/hle/service/olsc/transfer_task_list_controller.cpp
+++ b/src/core/hle/service/olsc/transfer_task_list_controller.cpp
@@ -11,45 +11,45 @@
namespace Service::OLSC {
- std::optional<ServiceFrameworkBase::FunctionInfoBase> ITransferTaskListController::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetTransferTaskCountForOcean"},
- FunctionInfo{1, nullptr, "GetTransferTaskInfoForOcean"},
- FunctionInfo{2, nullptr, "ListTransferTaskInfoForOcean"},
- FunctionInfo{3, nullptr, "DeleteTransferTaskForOcean"},
- FunctionInfo{4, nullptr, "RaiseTransferTaskPriorityForOcean"},
- FunctionInfo{5, D<&ITransferTaskListController::GetTransferTaskEndEventNativeHandleHolder>, "GetTransferTaskEndEventNativeHandleHolder"},
- FunctionInfo{6, nullptr, "GetTransferTaskProgressForOcean"},
- FunctionInfo{7, nullptr, "GetTransferTaskLastResultForOcean"},
- FunctionInfo{8, D<&ITransferTaskListController::StopNextTransferTaskExecution>, "StopNextTransferTaskExecution"},
- FunctionInfo{9, D<&ITransferTaskListController::GetTransferTaskStartEventNativeHandleHolder>, "GetTransferTaskStartEventNativeHandleHolder"},
- FunctionInfo{10, nullptr, "SuspendTransferTaskForOcean"},
- FunctionInfo{11, nullptr, "GetCurrentTransferTaskInfoForOcean"},
- FunctionInfo{12, nullptr, "FindTransferTaskInfoForOcean"},
- FunctionInfo{13, nullptr, "CancelCurrentRepairTransferTask"},
- FunctionInfo{14, nullptr, "GetRepairTransferTaskProgress"},
- FunctionInfo{15, nullptr, "EnsureExecutableForRepairTransferTask"},
- FunctionInfo{16, D<&ITransferTaskListController::GetTransferTaskCount>, "GetTransferTaskCount"},
- FunctionInfo{17, nullptr, "GetTransferTaskInfo"},
- FunctionInfo{18, nullptr, "ListTransferTaskInfo"},
- FunctionInfo{19, nullptr, "DeleteTransferTask"},
- FunctionInfo{20, nullptr, "RaiseTransferTaskPriority"},
- FunctionInfo{21, D<&ITransferTaskListController::GetTransferTaskProgress>, "GetTransferTaskProgress", MakeVersionGate({10,1,0})},
- FunctionInfo{22, nullptr, "GetTransferTaskLastResult"},
- FunctionInfo{23, nullptr, "SuspendTransferTask"},
- FunctionInfo{24, D<&ITransferTaskListController::GetCurrentTransferTaskInfo>, "GetCurrentTransferTaskInfo"},
- FunctionInfo{25, D<&ITransferTaskListController::FindTransferTaskInfo>, "FindTransferTaskInfo"},
- FunctionInfo{26, nullptr, "Unknown26", MakeVersionGate({20,1,0})},
- FunctionInfo{27, nullptr, "Unknown27", MakeVersionGate({20,1,0})},
- FunctionInfo{28, nullptr, "Unknown28", MakeVersionGate({20,1,0})},
- FunctionInfo{29, nullptr, "Unknown29", MakeVersionGate({20,1,0})},
- FunctionInfo{30, nullptr, "Unknown30", MakeVersionGate({20,1,0})}
- );
- return HandlerTableGenerateWithFind(key, functions);
- }
-
ITransferTaskListController::ITransferTaskListController(Core::System& system_)
: ServiceFramework{system_, "ITransferTaskListController"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetTransferTaskCountForOcean"},
+ {1, nullptr, "GetTransferTaskInfoForOcean"},
+ {2, nullptr, "ListTransferTaskInfoForOcean"},
+ {3, nullptr, "DeleteTransferTaskForOcean"},
+ {4, nullptr, "RaiseTransferTaskPriorityForOcean"},
+ {5, D<&ITransferTaskListController::GetTransferTaskEndEventNativeHandleHolder>, "GetTransferTaskEndEventNativeHandleHolder"},
+ {6, nullptr, "GetTransferTaskProgressForOcean"},
+ {7, nullptr, "GetTransferTaskLastResultForOcean"},
+ {8, D<&ITransferTaskListController::StopNextTransferTaskExecution>, "StopNextTransferTaskExecution"},
+ {9, D<&ITransferTaskListController::GetTransferTaskStartEventNativeHandleHolder>, "GetTransferTaskStartEventNativeHandleHolder"},
+ {10, nullptr, "SuspendTransferTaskForOcean"},
+ {11, nullptr, "GetCurrentTransferTaskInfoForOcean"},
+ {12, nullptr, "FindTransferTaskInfoForOcean"},
+ {13, nullptr, "CancelCurrentRepairTransferTask"},
+ {14, nullptr, "GetRepairTransferTaskProgress"},
+ {15, nullptr, "EnsureExecutableForRepairTransferTask"},
+ {16, D<&ITransferTaskListController::GetTransferTaskCount>, "GetTransferTaskCount"},
+ {17, nullptr, "GetTransferTaskInfo"},
+ {18, nullptr, "ListTransferTaskInfo"},
+ {19, nullptr, "DeleteTransferTask"},
+ {20, nullptr, "RaiseTransferTaskPriority"},
+ {21, D<&ITransferTaskListController::GetTransferTaskProgress>, "GetTransferTaskProgress"}, //10.1.0+
+ {22, nullptr, "GetTransferTaskLastResult"},
+ {23, nullptr, "SuspendTransferTask"},
+ {24, D<&ITransferTaskListController::GetCurrentTransferTaskInfo>, "GetCurrentTransferTaskInfo"},
+ {25, D<&ITransferTaskListController::FindTransferTaskInfo>, "FindTransferTaskInfo"},
+ {26, nullptr, "Unknown26"}, //20.1.0+
+ {27, nullptr, "Unknown27"}, //20.1.0+
+ {28, nullptr, "Unknown28"}, //20.1.0+
+ {29, nullptr, "Unknown29"}, //20.1.0+
+ {30, nullptr, "Unknown30"}, //20.1.0+
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
ITransferTaskListController::~ITransferTaskListController() = default;
diff --git a/src/core/hle/service/olsc/transfer_task_list_controller.h b/src/core/hle/service/olsc/transfer_task_list_controller.h
index 74c5eddee3..5f3429879a 100644
--- a/src/core/hle/service/olsc/transfer_task_list_controller.h
+++ b/src/core/hle/service/olsc/transfer_task_list_controller.h
@@ -27,8 +27,6 @@ private:
Result GetTransferTaskProgress();
Result GetCurrentTransferTaskInfo(Out<std::array<u8, 0x30>> out_info, u8 unknown);
Result FindTransferTaskInfo(Out<std::array<u8, 0x30>> out_info, InBuffer<BufferAttr_HipcAutoSelect> in);
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::OLSC
diff --git a/src/core/hle/service/omm/omm.cpp b/src/core/hle/service/omm/omm.cpp
index b95319e26b..cc0b686ab1 100644
--- a/src/core/hle/service/omm/omm.cpp
+++ b/src/core/hle/service/omm/omm.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/omm/omm.h b/src/core/hle/service/omm/omm.h
index 7bf04688ae..6b100a6d61 100644
--- a/src/core/hle/service/omm/omm.h
+++ b/src/core/hle/service/omm/omm.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/omm/operation_mode_manager.cpp b/src/core/hle/service/omm/operation_mode_manager.cpp
index e36f606442..1af7714d0d 100644
--- a/src/core/hle/service/omm/operation_mode_manager.cpp
+++ b/src/core/hle/service/omm/operation_mode_manager.cpp
@@ -10,6 +10,41 @@ namespace Service::OMM {
IOperationModeManager::IOperationModeManager(Core::System& system_)
: ServiceFramework{system_, "omm"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetOperationMode"},
+ {1, nullptr, "GetOperationModeChangeEvent"},
+ {2, nullptr, "EnableAudioVisual"},
+ {3, nullptr, "DisableAudioVisual"},
+ {4, nullptr, "EnterSleepAndWait"},
+ {5, nullptr, "GetCradleStatus"},
+ {6, nullptr, "FadeInDisplay"},
+ {7, nullptr, "FadeOutDisplay"},
+ {8, nullptr, "GetCradleFwVersion"},
+ {9, nullptr, "NotifyCecSettingsChanged"},
+ {10, nullptr, "SetOperationModePolicy"},
+ {11, nullptr, "GetDefaultDisplayResolution"},
+ {12, nullptr, "GetDefaultDisplayResolutionChangeEvent"},
+ {13, nullptr, "UpdateDefaultDisplayResolution"},
+ {14, nullptr, "ShouldSleepOnBoot"},
+ {15, nullptr, "NotifyHdcpApplicationExecutionStarted"},
+ {16, nullptr, "NotifyHdcpApplicationExecutionFinished"},
+ {17, nullptr, "NotifyHdcpApplicationDrawingStarted"},
+ {18, nullptr, "NotifyHdcpApplicationDrawingFinished"},
+ {19, nullptr, "GetHdcpAuthenticationFailedEvent"},
+ {20, nullptr, "GetHdcpAuthenticationFailedEmulationEnabled"},
+ {21, nullptr, "SetHdcpAuthenticationFailedEmulation"},
+ {22, nullptr, "GetHdcpStateChangeEvent"},
+ {23, nullptr, "GetHdcpState"},
+ {24, nullptr, "ShowCardUpdateProcessing"},
+ {25, nullptr, "SetApplicationCecSettingsAndNotifyChanged"},
+ {26, nullptr, "GetOperationModeSystemInfo"},
+ {27, nullptr, "GetAppletFullAwakingSystemEvent"},
+ {28, nullptr, "CreateCradleFirmwareUpdater"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IOperationModeManager::~IOperationModeManager() = default;
diff --git a/src/core/hle/service/omm/operation_mode_manager.h b/src/core/hle/service/omm/operation_mode_manager.h
index ea604c8f60..dd6753757c 100644
--- a/src/core/hle/service/omm/operation_mode_manager.h
+++ b/src/core/hle/service/omm/operation_mode_manager.h
@@ -18,41 +18,6 @@ class IOperationModeManager final : public ServiceFramework<IOperationModeManage
public:
explicit IOperationModeManager(Core::System& system_);
~IOperationModeManager() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetOperationMode"},
- FunctionInfo{1, nullptr, "GetOperationModeChangeEvent"},
- FunctionInfo{2, nullptr, "EnableAudioVisual"},
- FunctionInfo{3, nullptr, "DisableAudioVisual"},
- FunctionInfo{4, nullptr, "EnterSleepAndWait"},
- FunctionInfo{5, nullptr, "GetCradleStatus"},
- FunctionInfo{6, nullptr, "FadeInDisplay"},
- FunctionInfo{7, nullptr, "FadeOutDisplay"},
- FunctionInfo{8, nullptr, "GetCradleFwVersion"},
- FunctionInfo{9, nullptr, "NotifyCecSettingsChanged"},
- FunctionInfo{10, nullptr, "SetOperationModePolicy"},
- FunctionInfo{11, nullptr, "GetDefaultDisplayResolution"},
- FunctionInfo{12, nullptr, "GetDefaultDisplayResolutionChangeEvent"},
- FunctionInfo{13, nullptr, "UpdateDefaultDisplayResolution"},
- FunctionInfo{14, nullptr, "ShouldSleepOnBoot"},
- FunctionInfo{15, nullptr, "NotifyHdcpApplicationExecutionStarted"},
- FunctionInfo{16, nullptr, "NotifyHdcpApplicationExecutionFinished"},
- FunctionInfo{17, nullptr, "NotifyHdcpApplicationDrawingStarted"},
- FunctionInfo{18, nullptr, "NotifyHdcpApplicationDrawingFinished"},
- FunctionInfo{19, nullptr, "GetHdcpAuthenticationFailedEvent"},
- FunctionInfo{20, nullptr, "GetHdcpAuthenticationFailedEmulationEnabled"},
- FunctionInfo{21, nullptr, "SetHdcpAuthenticationFailedEmulation"},
- FunctionInfo{22, nullptr, "GetHdcpStateChangeEvent"},
- FunctionInfo{23, nullptr, "GetHdcpState"},
- FunctionInfo{24, nullptr, "ShowCardUpdateProcessing"},
- FunctionInfo{25, nullptr, "SetApplicationCecSettingsAndNotifyChanged"},
- FunctionInfo{26, nullptr, "GetOperationModeSystemInfo"},
- FunctionInfo{27, nullptr, "GetAppletFullAwakingSystemEvent"},
- FunctionInfo{28, nullptr, "CreateCradleFirmwareUpdater"}
- );
};
} // namespace Service::OMM
diff --git a/src/core/hle/service/omm/policy_manager_system.cpp b/src/core/hle/service/omm/policy_manager_system.cpp
index 1d46de7f3e..b9e8277f8c 100644
--- a/src/core/hle/service/omm/policy_manager_system.cpp
+++ b/src/core/hle/service/omm/policy_manager_system.cpp
@@ -10,6 +10,18 @@ namespace Service::OMM {
IPolicyManagerSystem::IPolicyManagerSystem(Core::System& system_)
: ServiceFramework{system_, "idle:sys"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetAutoPowerDownEvent"},
+ {1, nullptr, "IsAutoPowerDownRequested"},
+ {2, nullptr, "Unknown2"},
+ {3, nullptr, "SetHandlingContext"},
+ {4, nullptr, "LoadAndApplySettings"},
+ {5, nullptr, "ReportUserIsActive"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IPolicyManagerSystem::~IPolicyManagerSystem() = default;
diff --git a/src/core/hle/service/omm/policy_manager_system.h b/src/core/hle/service/omm/policy_manager_system.h
index c6ff451e61..2fb6eb9293 100644
--- a/src/core/hle/service/omm/policy_manager_system.h
+++ b/src/core/hle/service/omm/policy_manager_system.h
@@ -18,18 +18,6 @@ class IPolicyManagerSystem final : public ServiceFramework<IPolicyManagerSystem>
public:
explicit IPolicyManagerSystem(Core::System& system_);
~IPolicyManagerSystem() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetAutoPowerDownEvent"},
- FunctionInfo{1, nullptr, "IsAutoPowerDownRequested"},
- FunctionInfo{2, nullptr, "Unknown2"},
- FunctionInfo{3, nullptr, "SetHandlingContext"},
- FunctionInfo{4, nullptr, "LoadAndApplySettings"},
- FunctionInfo{5, nullptr, "ReportUserIsActive"}
- );
};
} // namespace Service::OMM
diff --git a/src/core/hle/service/omm/power_state_interface.cpp b/src/core/hle/service/omm/power_state_interface.cpp
index 4150882695..04ea75b496 100644
--- a/src/core/hle/service/omm/power_state_interface.cpp
+++ b/src/core/hle/service/omm/power_state_interface.cpp
@@ -10,6 +10,24 @@ namespace Service::OMM {
IPowerStateInterface::IPowerStateInterface(Core::System& system_)
: ServiceFramework{system_, "spsm"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetState"},
+ {1, nullptr, "EnterSleep"},
+ {2, nullptr, "GetLastWakeReason"},
+ {3, nullptr, "Shutdown"},
+ {4, nullptr, "GetNotificationMessageEventHandle"},
+ {5, nullptr, "ReceiveNotificationMessage"},
+ {6, nullptr, "AnalyzeLogForLastSleepWakeSequence"},
+ {7, nullptr, "ResetEventLog"},
+ {8, nullptr, "AnalyzePerformanceLogForLastSleepWakeSequence"},
+ {9, nullptr, "ChangeHomeButtonLongPressingTime"},
+ {10, nullptr, "PutErrorState"},
+ {11, nullptr, "InvalidateCurrentHomeButtonPressing"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IPowerStateInterface::~IPowerStateInterface() = default;
diff --git a/src/core/hle/service/omm/power_state_interface.h b/src/core/hle/service/omm/power_state_interface.h
index fed55a4361..dc1d376a13 100644
--- a/src/core/hle/service/omm/power_state_interface.h
+++ b/src/core/hle/service/omm/power_state_interface.h
@@ -18,24 +18,6 @@ class IPowerStateInterface final : public ServiceFramework<IPowerStateInterface>
public:
explicit IPowerStateInterface(Core::System& system_);
~IPowerStateInterface() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetState"},
- FunctionInfo{1, nullptr, "EnterSleep"},
- FunctionInfo{2, nullptr, "GetLastWakeReason"},
- FunctionInfo{3, nullptr, "Shutdown"},
- FunctionInfo{4, nullptr, "GetNotificationMessageEventHandle"},
- FunctionInfo{5, nullptr, "ReceiveNotificationMessage"},
- FunctionInfo{6, nullptr, "AnalyzeLogForLastSleepWakeSequence"},
- FunctionInfo{7, nullptr, "ResetEventLog"},
- FunctionInfo{8, nullptr, "AnalyzePerformanceLogForLastSleepWakeSequence"},
- FunctionInfo{9, nullptr, "ChangeHomeButtonLongPressingTime"},
- FunctionInfo{10, nullptr, "PutErrorState"},
- FunctionInfo{11, nullptr, "InvalidateCurrentHomeButtonPressing"}
- );
};
} // namespace Service::OMM
diff --git a/src/core/hle/service/os/multi_wait.cpp b/src/core/hle/service/os/multi_wait.cpp
index 7b80d28bed..c9bb256ab0 100644
--- a/src/core/hle/service/os/multi_wait.cpp
+++ b/src/core/hle/service/os/multi_wait.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/os/multi_wait.h b/src/core/hle/service/os/multi_wait.h
index 340c611b5b..c9076c21d7 100644
--- a/src/core/hle/service/os/multi_wait.h
+++ b/src/core/hle/service/os/multi_wait.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/os/multi_wait_holder.cpp b/src/core/hle/service/os/multi_wait_holder.cpp
index 01efa045b5..f3864218c9 100644
--- a/src/core/hle/service/os/multi_wait_holder.cpp
+++ b/src/core/hle/service/os/multi_wait_holder.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/os/multi_wait_holder.h b/src/core/hle/service/os/multi_wait_holder.h
index 646395a3f3..3b28ec6b5a 100644
--- a/src/core/hle/service/os/multi_wait_holder.h
+++ b/src/core/hle/service/os/multi_wait_holder.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/os/multi_wait_utils.h b/src/core/hle/service/os/multi_wait_utils.h
index 96d3a10f37..d8f3ade4c1 100644
--- a/src/core/hle/service/os/multi_wait_utils.h
+++ b/src/core/hle/service/os/multi_wait_utils.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/os/mutex.h b/src/core/hle/service/os/mutex.h
index 95ac9b117a..8e29bbb633 100644
--- a/src/core/hle/service/os/mutex.h
+++ b/src/core/hle/service/os/mutex.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/pcie/pcie.cpp b/src/core/hle/service/pcie/pcie.cpp
index f9aaa2d3b8..d162881ecf 100644
--- a/src/core/hle/service/pcie/pcie.cpp
+++ b/src/core/hle/service/pcie/pcie.cpp
@@ -15,62 +15,64 @@ namespace Service::PCIe {
class ISession final : public ServiceFramework<ISession> {
public:
- explicit ISession(Core::System& system_) : ServiceFramework{system_, "ISession"} {}
+ explicit ISession(Core::System& system_) : ServiceFramework{system_, "ISession"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "QueryFunctions"},
+ {1, nullptr, "AcquireFunction"},
+ {2, nullptr, "ReleaseFunction"},
+ {3, nullptr, "GetFunctionState"},
+ {4, nullptr, "GetBarProfile"},
+ {5, nullptr, "ReadConfig"},
+ {6, nullptr, "WriteConfig"},
+ {7, nullptr, "ReadBarRegion"},
+ {8, nullptr, "WriteBarRegion"},
+ {9, nullptr, "FindCapability"},
+ {10, nullptr, "FindExtendedCapability"},
+ {11, nullptr, "MapDma"},
+ {12, nullptr, "UnmapDma"},
+ {13, nullptr, "UnmapDmaBusAddress"},
+ {14, nullptr, "GetDmaBusAddress"},
+ {15, nullptr, "GetDmaBusAddressRange"},
+ {16, nullptr, "SetDmaEnable"},
+ {17, nullptr, "AcquireIrq"},
+ {18, nullptr, "ReleaseIrq"},
+ {19, nullptr, "SetIrqEnable"},
+ {20, nullptr, "GetIrqEvent"},
+ {21, nullptr, "SetAspmEnable"},
+ {22, nullptr, "SetResetUponResumeEnable"},
+ {23, nullptr, "ResetFunction"},
+ };
+ // clang-format on
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "QueryFunctions"},
- FunctionInfo{1, nullptr, "AcquireFunction"},
- FunctionInfo{2, nullptr, "ReleaseFunction"},
- FunctionInfo{3, nullptr, "GetFunctionState"},
- FunctionInfo{4, nullptr, "GetBarProfile"},
- FunctionInfo{5, nullptr, "ReadConfig"},
- FunctionInfo{6, nullptr, "WriteConfig"},
- FunctionInfo{7, nullptr, "ReadBarRegion"},
- FunctionInfo{8, nullptr, "WriteBarRegion"},
- FunctionInfo{9, nullptr, "FindCapability"},
- FunctionInfo{10, nullptr, "FindExtendedCapability"},
- FunctionInfo{11, nullptr, "MapDma"},
- FunctionInfo{12, nullptr, "UnmapDma"},
- FunctionInfo{13, nullptr, "UnmapDmaBusAddress"},
- FunctionInfo{14, nullptr, "GetDmaBusAddress"},
- FunctionInfo{15, nullptr, "GetDmaBusAddressRange"},
- FunctionInfo{16, nullptr, "SetDmaEnable"},
- FunctionInfo{17, nullptr, "AcquireIrq"},
- FunctionInfo{18, nullptr, "ReleaseIrq"},
- FunctionInfo{19, nullptr, "SetIrqEnable"},
- FunctionInfo{20, nullptr, "GetIrqEvent"},
- FunctionInfo{21, nullptr, "SetAspmEnable"},
- FunctionInfo{22, nullptr, "SetResetUponResumeEnable"},
- FunctionInfo{23, nullptr, "ResetFunction"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
};
class PCIE final : public ServiceFramework<PCIE> {
public:
- explicit PCIE(Core::System& system_) : ServiceFramework{system_, "pcie"} {}
+ explicit PCIE(Core::System& system_) : ServiceFramework{system_, "pcie"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "RegisterClassDriver"},
+ {1, nullptr, "QueryFunctionsUnregistered"},
+ };
+ // clang-format on
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "RegisterClassDriver"},
- FunctionInfo{1, nullptr, "QueryFunctionsUnregistered"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
};
class PCIE_LOG final : public ServiceFramework<PCIE_LOG> {
public:
- explicit PCIE_LOG(Core::System& system_) : ServiceFramework{system_, "pcie:log"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetLoggedState"},
- FunctionInfo{1, nullptr, "GetLoggedStateEvent"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit PCIE_LOG(Core::System& system_) : ServiceFramework{system_, "pcie:log"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetLoggedState"},
+ {1, nullptr, "GetLoggedStateEvent"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
diff --git a/src/core/hle/service/pcie/pcie.h b/src/core/hle/service/pcie/pcie.h
index 5c2d4b805b..cf2048ce65 100644
--- a/src/core/hle/service/pcie/pcie.h
+++ b/src/core/hle/service/pcie/pcie.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/pctl/parental_control_service.cpp b/src/core/hle/service/pctl/parental_control_service.cpp
new file mode 100644
index 0000000000..51953c2657
--- /dev/null
+++ b/src/core/hle/service/pctl/parental_control_service.cpp
@@ -0,0 +1,498 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include <chrono>
+
+#include "core/core.h"
+#include "core/file_sys/control_metadata.h"
+#include "core/file_sys/patch_manager.h"
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/pctl/parental_control_service.h"
+#include "core/hle/service/pctl/pctl_results.h"
+
+namespace Service::PCTL {
+
+IParentalControlService::IParentalControlService(Core::System& system_, Capability capability_,
+ u64 program_id_)
+ : ServiceFramework{system_, "IParentalControlService"}, capability{capability_},
+ program_id{program_id_},
+ service_context{system_, "IParentalControlService"}, synchronization_event{service_context},
+ unlinked_event{service_context}, request_suspension_event{service_context} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {1, D<&IParentalControlService::Initialize>, "Initialize"},
+ {1001, D<&IParentalControlService::CheckFreeCommunicationPermission>, "CheckFreeCommunicationPermission"},
+ {1002, D<&IParentalControlService::ConfirmLaunchApplicationPermission>, "ConfirmLaunchApplicationPermission"},
+ {1003, D<&IParentalControlService::ConfirmResumeApplicationPermission>, "ConfirmResumeApplicationPermission"},
+ {1004, D<&IParentalControlService::ConfirmSnsPostPermission>, "ConfirmSnsPostPermission"},
+ {1005, D<&IParentalControlService::ConfirmSystemSettingsPermission>, "ConfirmSystemSettingsPermission"},
+ {1006, D<&IParentalControlService::IsRestrictionTemporaryUnlocked>, "IsRestrictionTemporaryUnlocked"},
+ {1007, nullptr, "RevertRestrictionTemporaryUnlocked"},
+ {1008, nullptr, "EnterRestrictedSystemSettings"},
+ {1009, nullptr, "LeaveRestrictedSystemSettings"},
+ {1010, D<&IParentalControlService::IsRestrictedSystemSettingsEntered>, "IsRestrictedSystemSettingsEntered"},
+ {1011, nullptr, "RevertRestrictedSystemSettingsEntered"},
+ {1012, nullptr, "GetRestrictedFeatures"},
+ {1013, D<&IParentalControlService::ConfirmStereoVisionPermission>, "ConfirmStereoVisionPermission"},
+ {1014, nullptr, "ConfirmPlayableApplicationVideoOld"},
+ {1015, nullptr, "ConfirmPlayableApplicationVideo"},
+ {1016, nullptr, "ConfirmShowNewsPermission"},
+ {1017, D<&IParentalControlService::EndFreeCommunication>, "EndFreeCommunication"},
+ {1018, D<&IParentalControlService::IsFreeCommunicationAvailable>, "IsFreeCommunicationAvailable"},
+ {1019, D<&IParentalControlService::ConfirmLaunchApplicationPermission>, "ConfirmLaunchApplicationPermission"},
+ {1020, nullptr, "ConfirmLaunchSharedApplicationPermission"}, //20.0.0+
+ {1021, nullptr, "TryBeginFreeCommunicationForStreamPlay"}, //21.0.0+
+ {1022, nullptr, "EndFreeCommunicationForStreamPlay"}, //21.0.0+
+ {1031, D<&IParentalControlService::IsRestrictionEnabled>, "IsRestrictionEnabled"},
+ {1032, D<&IParentalControlService::GetSafetyLevel>, "GetSafetyLevel"},
+ {1033, nullptr, "SetSafetyLevel"},
+ {1034, nullptr, "GetSafetyLevelSettings"},
+ {1035, D<&IParentalControlService::GetCurrentSettings>, "GetCurrentSettings"},
+ {1036, nullptr, "SetCustomSafetyLevelSettings"},
+ {1037, nullptr, "GetDefaultRatingOrganization"},
+ {1038, nullptr, "SetDefaultRatingOrganization"},
+ {1039, D<&IParentalControlService::GetFreeCommunicationApplicationListCount>, "GetFreeCommunicationApplicationListCount"},
+ {1042, nullptr, "AddToFreeCommunicationApplicationList"},
+ {1043, nullptr, "DeleteSettings"},
+ {1044, nullptr, "GetFreeCommunicationApplicationList"},
+ {1045, nullptr, "UpdateFreeCommunicationApplicationList"},
+ {1046, nullptr, "DisableFeaturesForReset"},
+ {1047, nullptr, "NotifyApplicationDownloadStarted"},
+ {1048, nullptr, "NotifyNetworkProfileCreated"},
+ {1049, nullptr, "ResetFreeCommunicationApplicationList"},
+ {1050, nullptr, "AddToFreeCommunicationApplicationList"}, //20.0.0+
+ {1051, nullptr, "NotifyApplicationDownloadStarted"}, //20.0.0+
+ {1061, D<&IParentalControlService::ConfirmStereoVisionRestrictionConfigurable>, "ConfirmStereoVisionRestrictionConfigurable"},
+ {1062, D<&IParentalControlService::GetStereoVisionRestriction>, "GetStereoVisionRestriction"},
+ {1063, D<&IParentalControlService::SetStereoVisionRestriction>, "SetStereoVisionRestriction"},
+ {1064, D<&IParentalControlService::ResetConfirmedStereoVisionPermission>, "ResetConfirmedStereoVisionPermission"},
+ {1065, D<&IParentalControlService::IsStereoVisionPermitted>, "IsStereoVisionPermitted"},
+ {1201, nullptr, "UnlockRestrictionTemporarily"},
+ {1202, nullptr, "UnlockSystemSettingsRestriction"},
+ {1203, nullptr, "SetPinCode"},
+ {1204, nullptr, "GenerateInquiryCode"},
+ {1205, nullptr, "CheckMasterKey"},
+ {1206, D<&IParentalControlService::GetPinCodeLength>, "GetPinCodeLength"},
+ {1207, nullptr, "GetPinCodeChangedEvent"},
+ {1208, nullptr, "GetPinCode"},
+ {1403, D<&IParentalControlService::IsPairingActive>, "IsPairingActive"},
+ {1406, nullptr, "GetSettingsLastUpdated"},
+ {1411, nullptr, "GetPairingAccountInfo"},
+ {1421, nullptr, "GetAccountNickname"},
+ {1424, nullptr, "GetAccountState"},
+ {1425, nullptr, "RequestPostEvents"},
+ {1426, nullptr, "GetPostEventInterval"},
+ {1427, nullptr, "SetPostEventInterval"},
+ {1432, D<&IParentalControlService::GetSynchronizationEvent>, "GetSynchronizationEvent"},
+ {1451, D<&IParentalControlService::StartPlayTimer>, "StartPlayTimer"},
+ {1452, D<&IParentalControlService::StopPlayTimer>, "StopPlayTimer"},
+ {1453, D<&IParentalControlService::IsPlayTimerEnabled>, "IsPlayTimerEnabled"},
+ {1454, D<&IParentalControlService::GetPlayTimerRemainingTime>, "GetPlayTimerRemainingTime"},
+ {1455, D<&IParentalControlService::IsRestrictedByPlayTimer>, "IsRestrictedByPlayTimer"},
+ {1456, D<&IParentalControlService::GetPlayTimerSettingsOld>, "GetPlayTimerSettingsOld"},
+ {1457, D<&IParentalControlService::GetPlayTimerEventToRequestSuspension>, "GetPlayTimerEventToRequestSuspension"},
+ {1458, D<&IParentalControlService::IsPlayTimerAlarmDisabled>, "IsPlayTimerAlarmDisabled"},
+ {1459, D<&IParentalControlService::GetPlayTimerRemainingTimeDisplayInfo>, "GetPlayTimerRemainingTimeDisplayInfo"},
+ {1460, D<&IParentalControlService::Unknown1460>, "Unknown1460"},
+ {1471, nullptr, "NotifyWrongPinCodeInputManyTimes"},
+ {1472, nullptr, "CancelNetworkRequest"},
+ {1473, D<&IParentalControlService::GetUnlinkedEvent>, "GetUnlinkedEvent"},
+ {1474, nullptr, "ClearUnlinkedEvent"},
+ {1475, nullptr, "GetExtendedPlayTimerEvent"}, // 18.0.0+
+ {1601, nullptr, "DisableAllFeatures"},
+ {1602, nullptr, "PostEnableAllFeatures"},
+ {1603, nullptr, "IsAllFeaturesDisabled"},
+ {1901, nullptr, "DeleteFromFreeCommunicationApplicationListForDebug"},
+ {1902, nullptr, "ClearFreeCommunicationApplicationListForDebug"},
+ {1903, nullptr, "GetExemptApplicationListCountForDebug"},
+ {1904, nullptr, "GetExemptApplicationListForDebug"},
+ {1905, nullptr, "UpdateExemptApplicationListForDebug"},
+ {1906, nullptr, "AddToExemptApplicationListForDebug"},
+ {1907, nullptr, "DeleteFromExemptApplicationListForDebug"},
+ {1908, nullptr, "ClearExemptApplicationListForDebug"},
+ {1941, nullptr, "DeletePairing"},
+ {1951, nullptr, "SetPlayTimerSettingsForDebug"},
+ {1952, nullptr, "GetPlayTimerSpentTimeForTest"},
+ {1953, nullptr, "SetPlayTimerAlarmDisabledForDebug"},
+ {1954, nullptr, "IsBedtimeAlarmEnabled"}, // 18.0.0+
+ {1955, nullptr, "GetBedtimeAlarmTime"}, // 18.0.0+
+ {1956, nullptr, "GetBedtimeAlarmTimeHour"}, // 18.0.0+
+ {1957, nullptr, "GetBedtimeAlarmTimeMinute"}, // 18.0.0+
+ {2001, nullptr, "RequestPairingAsync"},
+ {2002, nullptr, "FinishRequestPairing"},
+ {2003, nullptr, "AuthorizePairingAsync"},
+ {2004, nullptr, "FinishAuthorizePairing"},
+ {2005, nullptr, "RetrievePairingInfoAsync"},
+ {2006, nullptr, "FinishRetrievePairingInfo"},
+ {2007, nullptr, "UnlinkPairingAsync"},
+ {2008, nullptr, "FinishUnlinkPairing"},
+ {2009, nullptr, "GetAccountMiiImageAsync"},
+ {2010, nullptr, "FinishGetAccountMiiImage"},
+ {2011, nullptr, "GetAccountMiiImageContentTypeAsync"},
+ {2012, nullptr, "FinishGetAccountMiiImageContentType"},
+ {2013, nullptr, "SynchronizeParentalControlSettingsAsync"},
+ {2014, nullptr, "FinishSynchronizeParentalControlSettings"},
+ {2015, nullptr, "FinishSynchronizeParentalControlSettingsWithLastUpdated"},
+ {2016, nullptr, "RequestUpdateExemptionListAsync"}, //5.0.0+
+ {145601, D<&IParentalControlService::GetPlayTimerSettings>, "GetPlayTimerSettings"}, // 18.0.0+
+ {2017, nullptr, "AuthorizePairingAsync"}, //19.0.0+
+ {2019, nullptr, "RequestUpdateDeviceUsersBackground"}, //19.0.0+
+ {2021, nullptr, "RequestCopyPairingAsync"}, //20.0.0+
+ {2022, nullptr, "FinishRequestCopyPairing"}, //20.0.0+
+ {2023, nullptr, "IsFromPairingActiveDevice"}, //20.0.0+
+ {2024, nullptr, "RollbackCopyPairing"}, //21.0.0+
+ {3001, nullptr, "GetErrorContextChangedEvent"}, //20.0.0+
+ {145601, D<&IParentalControlService::GetPlayTimerSettings>, "GetPlayTimerSettings"}, // 18.0.0+
+ {195101, D<&IParentalControlService::SetPlayTimerSettings>, "SetPlayTimerSettingsForDebug"}, //18.0.0+
+ };
+ // clang-format on
+ RegisterHandlers(functions);
+}
+
+IParentalControlService::~IParentalControlService() = default;
+
+bool IParentalControlService::CheckFreeCommunicationPermissionImpl() const {
+ if (states.temporary_unlocked) {
+ return true;
+ }
+ if ((states.application_info.parental_control_flag & 1) == 0) {
+ return true;
+ }
+ if (pin_code[0] == '\0') {
+ return true;
+ }
+ if (!settings.is_free_communication_default_on) {
+ return true;
+ }
+ // TODO(ogniK): Check for blacklisted/exempted applications. Return false can happen here
+ // but as we don't have multiproceses support yet, we can just assume our application is
+ // valid for the time being
+ return true;
+}
+
+bool IParentalControlService::ConfirmStereoVisionPermissionImpl() const {
+ if (states.temporary_unlocked) {
+ return true;
+ }
+ if (pin_code[0] == '\0') {
+ return true;
+ }
+ if (!settings.is_stero_vision_restricted) {
+ return false;
+ }
+ return true;
+}
+
+void IParentalControlService::SetStereoVisionRestrictionImpl(bool is_restricted) {
+ if (settings.disabled) {
+ return;
+ }
+
+ if (pin_code[0] == '\0') {
+ return;
+ }
+ settings.is_stero_vision_restricted = is_restricted;
+}
+
+Result IParentalControlService::Initialize() {
+ LOG_DEBUG(Service_PCTL, "called");
+
+ if (False(capability & (Capability::Application | Capability::System))) {
+ LOG_ERROR(Service_PCTL, "Invalid capability! capability={:X}", capability);
+ R_THROW(PCTL::ResultNoCapability);
+ }
+
+ // TODO(ogniK): Recovery flag initialization for pctl:r
+
+ if (program_id != 0) {
+ const FileSys::PatchManager pm{program_id, system.GetFileSystemController(),
+ system.GetContentProvider()};
+ const auto control = pm.GetControlMetadata();
+ if (control.first) {
+ states.tid_from_event = 0;
+ states.launch_time_valid = false;
+ states.is_suspended = false;
+ states.free_communication = false;
+ states.stereo_vision = false;
+ states.application_info = ApplicationInfo{
+ .application_id = program_id,
+ .age_rating = control.first->GetRatingAge(),
+ .parental_control_flag = control.first->GetParentalControlFlag(),
+ .capability = capability,
+ };
+
+ if (False(capability & (Capability::System | Capability::Recovery))) {
+ // TODO(ogniK): Signal application launch event
+ }
+ }
+ }
+
+ R_SUCCEED();
+}
+
+Result IParentalControlService::CheckFreeCommunicationPermission() {
+ LOG_DEBUG(Service_PCTL, "called");
+
+ if (!CheckFreeCommunicationPermissionImpl()) {
+ R_THROW(PCTL::ResultNoFreeCommunication);
+ } else {
+ states.free_communication = true;
+ R_SUCCEED();
+ }
+}
+
+Result IParentalControlService::ConfirmLaunchApplicationPermission(
+ InBuffer<BufferAttr_HipcPointer> restriction_bitset, u64 nacp_flag, u64 application_id) {
+ LOG_WARNING(Service_PCTL, "(STUBBED) called, nacp_flag={:#x} application_id={:016X}", nacp_flag,
+ application_id);
+ R_SUCCEED();
+}
+
+Result IParentalControlService::ConfirmResumeApplicationPermission(
+ InBuffer<BufferAttr_HipcPointer> restriction_bitset, u64 nacp_flag, u64 application_id) {
+ LOG_WARNING(Service_PCTL, "(STUBBED) called, nacp_flag={:#x} application_id={:016X}", nacp_flag,
+ application_id);
+ R_SUCCEED();
+}
+
+Result IParentalControlService::ConfirmSnsPostPermission() {
+ LOG_WARNING(Service_PCTL, "(STUBBED) called");
+ R_THROW(PCTL::ResultNoFreeCommunication);
+}
+
+Result IParentalControlService::ConfirmSystemSettingsPermission() {
+ LOG_WARNING(Service_PCTL, "(STUBBED) called");
+ R_SUCCEED();
+}
+
+Result IParentalControlService::IsRestrictionTemporaryUnlocked(
+ Out<bool> out_is_temporary_unlocked) {
+ *out_is_temporary_unlocked = false;
+ LOG_WARNING(Service_PCTL, "(STUBBED) called, is_temporary_unlocked={}",
+ *out_is_temporary_unlocked);
+ R_SUCCEED();
+}
+
+Result IParentalControlService::IsRestrictedSystemSettingsEntered(
+ Out<bool> out_is_restricted_system_settings_entered) {
+ *out_is_restricted_system_settings_entered = false;
+ LOG_WARNING(Service_PCTL, "(STUBBED) called, is_temporary_unlocked={}",
+ *out_is_restricted_system_settings_entered);
+ R_SUCCEED();
+}
+
+Result IParentalControlService::ConfirmStereoVisionPermission() {
+ LOG_DEBUG(Service_PCTL, "called");
+ states.stereo_vision = true;
+ R_SUCCEED();
+}
+
+Result IParentalControlService::EndFreeCommunication() {
+ LOG_WARNING(Service_PCTL, "(STUBBED) called");
+ R_SUCCEED();
+}
+
+Result IParentalControlService::IsFreeCommunicationAvailable() {
+ LOG_DEBUG(Service_PCTL, "(STUBBED) called");
+
+ if (!CheckFreeCommunicationPermissionImpl()) {
+ R_THROW(PCTL::ResultNoFreeCommunication);
+ } else {
+ R_SUCCEED();
+ }
+}
+
+Result IParentalControlService::IsRestrictionEnabled(Out<bool> out_restriction_enabled) {
+ LOG_DEBUG(Service_PCTL, "called");
+
+ if (False(capability & (Capability::Status | Capability::Recovery))) {
+ LOG_ERROR(Service_PCTL, "Application does not have Status or Recovery capabilities!");
+ *out_restriction_enabled = false;
+ R_THROW(PCTL::ResultNoCapability);
+ }
+
+ *out_restriction_enabled = pin_code[0] != '\0';
+ R_SUCCEED();
+}
+
+Result IParentalControlService::GetSafetyLevel(Out<u32> out_safety_level) {
+ *out_safety_level = 0;
+ LOG_WARNING(Service_PCTL, "(STUBBED) called, safety_level={}", *out_safety_level);
+ R_SUCCEED();
+}
+
+Result IParentalControlService::GetCurrentSettings(Out<RestrictionSettings> out_settings) {
+ LOG_INFO(Service_PCTL, "called");
+ *out_settings = restriction_settings;
+ R_SUCCEED();
+}
+
+Result IParentalControlService::GetFreeCommunicationApplicationListCount(Out<s32> out_count) {
+ *out_count = 4;
+ LOG_WARNING(Service_PCTL, "(STUBBED) called, count={}", *out_count);
+ R_SUCCEED();
+}
+
+Result IParentalControlService::ConfirmStereoVisionRestrictionConfigurable() {
+ LOG_DEBUG(Service_PCTL, "called");
+
+ if (False(capability & Capability::StereoVision)) {
+ LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!");
+ R_THROW(PCTL::ResultNoCapability);
+ }
+
+ if (pin_code[0] == '\0') {
+ R_THROW(PCTL::ResultNoRestrictionEnabled);
+ }
+
+ R_SUCCEED();
+}
+
+Result IParentalControlService::IsStereoVisionPermitted(Out<bool> out_is_permitted) {
+ LOG_DEBUG(Service_PCTL, "called");
+
+ if (!ConfirmStereoVisionPermissionImpl()) {
+ *out_is_permitted = false;
+ R_THROW(PCTL::ResultStereoVisionRestricted);
+ } else {
+ *out_is_permitted = true;
+ R_SUCCEED();
+ }
+}
+
+Result IParentalControlService::GetPinCodeLength(Out<s32> out_length) {
+ *out_length = 0;
+ LOG_WARNING(Service_PCTL, "(STUBBED) called, length={}", *out_length);
+ R_SUCCEED();
+}
+
+Result IParentalControlService::IsPairingActive(Out<bool> out_is_pairing_active) {
+ *out_is_pairing_active = false;
+ LOG_WARNING(Service_PCTL, "(STUBBED) called, is_pairing_active={}", *out_is_pairing_active);
+ R_SUCCEED();
+}
+
+Result IParentalControlService::GetSynchronizationEvent(
+ OutCopyHandle<Kernel::KReadableEvent> out_event) {
+ LOG_INFO(Service_PCTL, "called");
+ *out_event = synchronization_event.GetHandle();
+ R_SUCCEED();
+}
+
+Result IParentalControlService::StartPlayTimer() {
+ LOG_WARNING(Service_PCTL, "(STUBBED) called");
+ R_SUCCEED();
+}
+
+Result IParentalControlService::StopPlayTimer() {
+ LOG_WARNING(Service_PCTL, "(STUBBED) called");
+ R_SUCCEED();
+}
+
+Result IParentalControlService::IsPlayTimerEnabled(Out<bool> out_is_play_timer_enabled) {
+ *out_is_play_timer_enabled = false;
+ LOG_WARNING(Service_PCTL, "(STUBBED) called, enabled={}", *out_is_play_timer_enabled);
+ R_SUCCEED();
+}
+
+Result IParentalControlService::GetPlayTimerRemainingTime(Out<s32> out_remaining_time) {
+ LOG_WARNING(Service_PCTL, "(STUBBED) called");
+ *out_remaining_time = std::numeric_limits<s32>::max();
+ R_SUCCEED();
+}
+
+Result IParentalControlService::IsRestrictedByPlayTimer(Out<bool> out_is_restricted_by_play_timer) {
+ *out_is_restricted_by_play_timer = false;
+ LOG_WARNING(Service_PCTL, "(STUBBED) called, restricted={}", *out_is_restricted_by_play_timer);
+ R_SUCCEED();
+}
+
+Result IParentalControlService::GetPlayTimerSettingsOld(
+ Out<PlayTimerSettingsOld> out_play_timer_settings) {
+ LOG_WARNING(Service_PCTL, "(STUBBED) called");
+ *out_play_timer_settings = {};
+ R_SUCCEED();
+}
+
+Result IParentalControlService::GetPlayTimerSettings(Out<PlayTimerSettings> out_play_timer_settings) {
+ LOG_WARNING(Service_PCTL, "(STUBBED) called");
+ *out_play_timer_settings = raw_play_timer_settings;
+ R_SUCCEED();
+}
+
+Result IParentalControlService::SetPlayTimerSettings(PlayTimerSettings play_timer_settings) {
+ LOG_WARNING(Service_PCTL, "(STUBBED) called");
+ raw_play_timer_settings = play_timer_settings;
+ R_SUCCEED();
+}
+
+Result IParentalControlService::GetPlayTimerEventToRequestSuspension(
+ OutCopyHandle<Kernel::KReadableEvent> out_event) {
+ LOG_INFO(Service_PCTL, "called");
+ *out_event = request_suspension_event.GetHandle();
+ R_SUCCEED();
+}
+
+Result IParentalControlService::IsPlayTimerAlarmDisabled(Out<bool> out_play_timer_alarm_disabled) {
+ *out_play_timer_alarm_disabled = false;
+ LOG_INFO(Service_PCTL, "called, is_play_timer_alarm_disabled={}",
+ *out_play_timer_alarm_disabled);
+ R_SUCCEED();
+}
+
+Result IParentalControlService::GetPlayTimerRemainingTimeDisplayInfo(Out<PlayTimerRemainingTimeDisplayInfo> out_display_info) {
+ LOG_DEBUG(Service_PCTL, "called");
+ *out_display_info = {.state = PlayTimerDisplayState::NotConfigured};
+ R_SUCCEED();
+}
+
+Result IParentalControlService::Unknown1460(u8 in_unk, Out<PlayTimerRemainingTimeDisplayInfo> out_display_info) {
+ LOG_DEBUG(Service_PCTL, "called, in_unk={}", in_unk);
+ *out_display_info = {.state = PlayTimerDisplayState::NotConfigured};
+ R_SUCCEED();
+}
+
+Result IParentalControlService::GetUnlinkedEvent(OutCopyHandle<Kernel::KReadableEvent> out_event) {
+ LOG_INFO(Service_PCTL, "called");
+ *out_event = unlinked_event.GetHandle();
+ R_SUCCEED();
+}
+
+Result IParentalControlService::GetStereoVisionRestriction(
+ Out<bool> out_stereo_vision_restriction) {
+ LOG_DEBUG(Service_PCTL, "called");
+
+ if (False(capability & Capability::StereoVision)) {
+ LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!");
+ *out_stereo_vision_restriction = false;
+ R_THROW(PCTL::ResultNoCapability);
+ }
+
+ *out_stereo_vision_restriction = settings.is_stero_vision_restricted;
+ R_SUCCEED();
+}
+
+Result IParentalControlService::SetStereoVisionRestriction(bool stereo_vision_restriction) {
+ LOG_DEBUG(Service_PCTL, "called, can_use={}", stereo_vision_restriction);
+
+ if (False(capability & Capability::StereoVision)) {
+ LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!");
+ R_THROW(PCTL::ResultNoCapability);
+ }
+
+ SetStereoVisionRestrictionImpl(stereo_vision_restriction);
+ R_SUCCEED();
+}
+
+Result IParentalControlService::ResetConfirmedStereoVisionPermission() {
+ LOG_DEBUG(Service_PCTL, "called");
+
+ states.stereo_vision = false;
+
+ R_SUCCEED();
+}
+
+} // namespace Service::PCTL
diff --git a/src/core/hle/service/pctl/parental_control_service.h b/src/core/hle/service/pctl/parental_control_service.h
new file mode 100644
index 0000000000..9dabe3d059
--- /dev/null
+++ b/src/core/hle/service/pctl/parental_control_service.h
@@ -0,0 +1,99 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator
+// Project// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/kernel_helpers.h"
+#include "core/hle/service/os/event.h"
+#include "core/hle/service/pctl/pctl_types.h"
+#include "core/hle/service/service.h"
+
+namespace Service::PCTL {
+
+class IParentalControlService final : public ServiceFramework<IParentalControlService> {
+public:
+ explicit IParentalControlService(Core::System& system_, Capability capability_,
+ u64 program_id_);
+ ~IParentalControlService() override;
+
+private:
+ bool CheckFreeCommunicationPermissionImpl() const;
+ bool ConfirmStereoVisionPermissionImpl() const;
+ void SetStereoVisionRestrictionImpl(bool is_restricted);
+
+ Result Initialize();
+ Result CheckFreeCommunicationPermission();
+ Result ConfirmLaunchApplicationPermission(InBuffer<BufferAttr_HipcPointer> restriction_bitset,
+ u64 nacp_flag, u64 application_id);
+ Result ConfirmResumeApplicationPermission(InBuffer<BufferAttr_HipcPointer> restriction_bitset,
+ u64 nacp_flag, u64 application_id);
+ Result ConfirmSnsPostPermission();
+ Result ConfirmSystemSettingsPermission();
+ Result IsRestrictionTemporaryUnlocked(Out<bool> out_is_temporary_unlocked);
+ Result IsRestrictedSystemSettingsEntered(Out<bool> out_is_restricted_system_settings_entered);
+ Result ConfirmStereoVisionPermission();
+ Result EndFreeCommunication();
+ Result IsFreeCommunicationAvailable();
+ Result IsRestrictionEnabled(Out<bool> out_restriction_enabled);
+ Result GetSafetyLevel(Out<u32> out_safety_level);
+ Result GetCurrentSettings(Out<RestrictionSettings> out_settings);
+ Result GetFreeCommunicationApplicationListCount(Out<s32> out_count);
+ Result ConfirmStereoVisionRestrictionConfigurable();
+ Result IsStereoVisionPermitted(Out<bool> out_is_permitted);
+ Result GetPinCodeLength(Out<s32> out_length);
+ Result IsPairingActive(Out<bool> out_is_pairing_active);
+ Result GetSynchronizationEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
+ Result StartPlayTimer();
+ Result StopPlayTimer();
+ Result IsPlayTimerEnabled(Out<bool> out_is_play_timer_enabled);
+ Result GetPlayTimerRemainingTime(Out<s32> out_remaining_time);
+ Result IsRestrictedByPlayTimer(Out<bool> out_is_restricted_by_play_timer);
+ Result GetPlayTimerSettingsOld(Out<PlayTimerSettingsOld> out_play_timer_settings);
+ Result GetPlayTimerEventToRequestSuspension(OutCopyHandle<Kernel::KReadableEvent> out_event);
+ Result IsPlayTimerAlarmDisabled(Out<bool> out_play_timer_alarm_disabled);
+ Result GetPlayTimerRemainingTimeDisplayInfo(Out<PlayTimerRemainingTimeDisplayInfo> out_display_info);
+ Result Unknown1460(u8 in_unk, Out<PlayTimerRemainingTimeDisplayInfo> out_display_info);
+ Result GetUnlinkedEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
+ Result GetStereoVisionRestriction(Out<bool> out_stereo_vision_restriction);
+ Result SetStereoVisionRestriction(bool stereo_vision_restriction);
+ Result ResetConfirmedStereoVisionPermission();
+ Result GetPlayTimerSettings(Out<PlayTimerSettings> out_play_timer_settings);
+ Result SetPlayTimerSettings(PlayTimerSettings out_play_timer_settings);
+
+ struct States {
+ u64 current_tid{};
+ ApplicationInfo application_info{};
+ u64 tid_from_event{};
+ bool launch_time_valid{};
+ bool is_suspended{};
+ bool temporary_unlocked{};
+ bool free_communication{};
+ bool stereo_vision{};
+ };
+
+ struct ParentalControlSettings {
+ bool is_stero_vision_restricted{};
+ bool is_free_communication_default_on{};
+ bool disabled{};
+ };
+
+ States states{};
+ ParentalControlSettings settings{};
+ RestrictionSettings restriction_settings{};
+ std::array<char, 8> pin_code{};
+ Capability capability{};
+ u64 program_id{};
+ // TODO: this is raw
+ PlayTimerSettings raw_play_timer_settings{};
+
+ KernelHelpers::ServiceContext service_context;
+ Event synchronization_event;
+ Event unlinked_event;
+ Event request_suspension_event;
+};
+
+} // namespace Service::PCTL
diff --git a/src/core/hle/service/pctl/parental_control_service_factory.cpp b/src/core/hle/service/pctl/parental_control_service_factory.cpp
new file mode 100644
index 0000000000..ae278a9bbc
--- /dev/null
+++ b/src/core/hle/service/pctl/parental_control_service_factory.cpp
@@ -0,0 +1,44 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/core.h"
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/pctl/parental_control_service.h"
+#include "core/hle/service/pctl/parental_control_service_factory.h"
+
+namespace Service::PCTL {
+
+IParentalControlServiceFactory::IParentalControlServiceFactory(Core::System& system_,
+ const char* name_,
+ Capability capability_)
+ : ServiceFramework{system_, name_}, capability{capability_} {
+ static const FunctionInfo functions[] = {
+ {0, D<&IParentalControlServiceFactory::CreateService>, "CreateService"},
+ {1, D<&IParentalControlServiceFactory::CreateServiceWithoutInitialize>,
+ "CreateServiceWithoutInitialize"},
+ };
+ RegisterHandlers(functions);
+}
+
+IParentalControlServiceFactory::~IParentalControlServiceFactory() = default;
+
+Result IParentalControlServiceFactory::CreateService(
+ Out<SharedPointer<IParentalControlService>> out_service, ClientProcessId process_id) {
+ LOG_DEBUG(Service_PCTL, "called, process_id={}", process_id.pid);
+ *out_service = std::make_shared<IParentalControlService>(
+ system, capability, system.ResolveCallerProgramId(*process_id));
+ R_SUCCEED();
+}
+
+Result IParentalControlServiceFactory::CreateServiceWithoutInitialize(
+ Out<SharedPointer<IParentalControlService>> out_service, ClientProcessId process_id) {
+ LOG_DEBUG(Service_PCTL, "called, process_id={}", process_id.pid);
+ *out_service = std::make_shared<IParentalControlService>(
+ system, capability, system.ResolveCallerProgramId(*process_id));
+ R_SUCCEED();
+}
+
+} // namespace Service::PCTL
diff --git a/src/core/hle/service/pctl/parental_control_service_factory.h b/src/core/hle/service/pctl/parental_control_service_factory.h
new file mode 100644
index 0000000000..0b5afede82
--- /dev/null
+++ b/src/core/hle/service/pctl/parental_control_service_factory.h
@@ -0,0 +1,34 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/pctl/pctl_types.h"
+#include "core/hle/service/service.h"
+
+namespace Service::PCTL {
+
+class IParentalControlService;
+
+class IParentalControlServiceFactory : public ServiceFramework<IParentalControlServiceFactory> {
+public:
+ explicit IParentalControlServiceFactory(Core::System& system_, const char* name_,
+ Capability capability_);
+ ~IParentalControlServiceFactory() override;
+
+ Result CreateService(Out<SharedPointer<IParentalControlService>> out_service,
+ ClientProcessId process_id);
+ Result CreateServiceWithoutInitialize(Out<SharedPointer<IParentalControlService>> out_service,
+ ClientProcessId process_id);
+
+private:
+ Capability capability{};
+};
+
+void LoopProcess(Core::System& system);
+
+} // namespace Service::PCTL
diff --git a/src/core/hle/service/pctl/pctl.cpp b/src/core/hle/service/pctl/pctl.cpp
index 4f0fbbe702..37f18a5d58 100644
--- a/src/core/hle/service/pctl/pctl.cpp
+++ b/src/core/hle/service/pctl/pctl.cpp
@@ -4,636 +4,27 @@
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
-#include "common/common_funcs.h"
-#include "core/file_sys/control_metadata.h"
-#include "core/file_sys/patch_manager.h"
-#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/pctl/parental_control_service_factory.h"
#include "core/hle/service/pctl/pctl.h"
#include "core/hle/service/server_manager.h"
-#include "core/hle/service/service.h"
-#include "core/hle/service/cmif_serialization.h"
namespace Service::PCTL {
-constexpr Result ResultNoFreeCommunication{ErrorModule::PCTL, 101};
-constexpr Result ResultStereoVisionRestricted{ErrorModule::PCTL, 104};
-constexpr Result ResultNoCapability{ErrorModule::PCTL, 131};
-constexpr Result ResultNoRestrictionEnabled{ErrorModule::PCTL, 181};
-
-enum class Capability : u32 {
- None = 0,
- Application = 1 << 0,
- SnsPost = 1 << 1,
- Recovery = 1 << 6,
- Status = 1 << 8,
- StereoVision = 1 << 9,
- System = 1 << 15,
-};
-DECLARE_ENUM_FLAG_OPERATORS(Capability);
-
-struct ApplicationInfo {
- u64 application_id{};
- std::array<u8, 32> age_rating{};
- u32 parental_control_flag{};
- Capability capability{};
-};
-static_assert(sizeof(ApplicationInfo) == 0x30, "ApplicationInfo has incorrect size.");
-
-// This is nn::pctl::RestrictionSettings
-struct RestrictionSettings {
- u8 rating_age;
- bool sns_post_restriction;
- bool free_communication_restriction;
-};
-static_assert(sizeof(RestrictionSettings) == 0x3, "RestrictionSettings has incorrect size.");
-
-// This is nn::pctl::PlayTimerSettingsOld
-struct PlayTimerSettingsOld {
- std::array<u32, 13> settings;
-};
-static_assert(sizeof(PlayTimerSettingsOld) == 0x34, "PlayTimerSettingsOld has incorrect size.");
-
-// This is nn::pctl::PlayTimerSettings
-struct PlayTimerSettings {
- std::array<u32, 17> settings; //21.0.0+ now takes 0x44
-};
-static_assert(sizeof(PlayTimerSettings) == 0x44, "PlayTimerSettings has incorrect size.");
-
-enum class PlayTimerDisplayState : u8 {
- TimesUp = 0,
- BedtimeAlarm = 1,
- RemainingTime = 2,
- Unknown3 = 3,
- Unknown4 = 4,
- Unknown5 = 5,
- TimerDisabled = 6,
- NotConfigured = 7,
-};
-
-// This is nn::pctl::PlayTimerRemainingTimeDisplayInfo
-struct PlayTimerRemainingTimeDisplayInfo {
- PlayTimerDisplayState state;
- INSERT_PADDING_BYTES(0x7);
- u64 unknown_08;
- u64 remaining_time;
-};
-static_assert(sizeof(PlayTimerRemainingTimeDisplayInfo) == 0x18, "PlayTimerRemainingTimeDisplayInfo has incorrect size.");
-
-class IParentalControlService final : public ServiceFramework<IParentalControlService> {
-public:
- explicit IParentalControlService(Core::System& system_, Capability capability_,
- u64 program_id_)
- : ServiceFramework{system_, "IParentalControlService"}, capability{capability_},
- program_id{program_id_},
- service_context{system_, "IParentalControlService"}, synchronization_event{service_context},
- unlinked_event{service_context}, request_suspension_event{service_context} {
- }
-
- ~IParentalControlService() override = default;
-
- bool CheckFreeCommunicationPermissionImpl() const {
- if (states.temporary_unlocked) {
- return true;
- }
- if ((states.application_info.parental_control_flag & 1) == 0) {
- return true;
- }
- if (pin_code[0] == '\0') {
- return true;
- }
- if (!settings.is_free_communication_default_on) {
- return true;
- }
- // TODO(ogniK): Check for blacklisted/exempted applications. Return false can happen here
- // but as we don't have multiproceses support yet, we can just assume our application is
- // valid for the time being
- return true;
- }
-
- bool ConfirmStereoVisionPermissionImpl() const {
- if (states.temporary_unlocked) {
- return true;
- }
- if (pin_code[0] == '\0') {
- return true;
- }
- if (!settings.is_stero_vision_restricted) {
- return false;
- }
- return true;
- }
-
- void SetStereoVisionRestrictionImpl(bool is_restricted) {
- if (settings.disabled) {
- return;
- }
-
- if (pin_code[0] == '\0') {
- return;
- }
- settings.is_stero_vision_restricted = is_restricted;
- }
-
- Result Initialize() {
- LOG_DEBUG(Service_PCTL, "called");
-
- if (False(capability & (Capability::Application | Capability::System))) {
- LOG_ERROR(Service_PCTL, "Invalid capability! capability={:X}", capability);
- R_THROW(PCTL::ResultNoCapability);
- }
-
- // TODO(ogniK): Recovery flag initialization for pctl:r
-
- if (program_id != 0) {
- const FileSys::PatchManager pm{program_id, system.GetFileSystemController(),
- system.GetContentProvider()};
- const auto control = pm.GetControlMetadata();
- if (control.first) {
- states.tid_from_event = 0;
- states.launch_time_valid = false;
- states.is_suspended = false;
- states.free_communication = false;
- states.stereo_vision = false;
- states.application_info = ApplicationInfo{
- .application_id = program_id,
- .age_rating = control.first->GetRatingAge(),
- .parental_control_flag = control.first->GetParentalControlFlag(),
- .capability = capability,
- };
-
- if (False(capability & (Capability::System | Capability::Recovery))) {
- // TODO(ogniK): Signal application launch event
- }
- }
- }
-
- R_SUCCEED();
- }
-
- Result CheckFreeCommunicationPermission() {
- LOG_DEBUG(Service_PCTL, "called");
-
- if (!CheckFreeCommunicationPermissionImpl()) {
- R_THROW(PCTL::ResultNoFreeCommunication);
- } else {
- states.free_communication = true;
- R_SUCCEED();
- }
- }
-
- Result ConfirmLaunchApplicationPermission(
- InBuffer<BufferAttr_HipcPointer> restriction_bitset, u64 nacp_flag, u64 application_id) {
- LOG_WARNING(Service_PCTL, "(STUBBED) called, nacp_flag={:#x} application_id={:016X}", nacp_flag,
- application_id);
- R_SUCCEED();
- }
-
- Result ConfirmResumeApplicationPermission(
- InBuffer<BufferAttr_HipcPointer> restriction_bitset, u64 nacp_flag, u64 application_id) {
- LOG_WARNING(Service_PCTL, "(STUBBED) called, nacp_flag={:#x} application_id={:016X}", nacp_flag,
- application_id);
- R_SUCCEED();
- }
-
- Result ConfirmSnsPostPermission() {
- LOG_WARNING(Service_PCTL, "(STUBBED) called");
- R_THROW(PCTL::ResultNoFreeCommunication);
- }
-
- Result ConfirmSystemSettingsPermission() {
- LOG_WARNING(Service_PCTL, "(STUBBED) called");
- R_SUCCEED();
- }
-
- Result IsRestrictionTemporaryUnlocked(
- Out<bool> out_is_temporary_unlocked) {
- *out_is_temporary_unlocked = false;
- LOG_WARNING(Service_PCTL, "(STUBBED) called, is_temporary_unlocked={}",
- *out_is_temporary_unlocked);
- R_SUCCEED();
- }
-
- Result IsRestrictedSystemSettingsEntered(
- Out<bool> out_is_restricted_system_settings_entered) {
- *out_is_restricted_system_settings_entered = false;
- LOG_WARNING(Service_PCTL, "(STUBBED) called, is_temporary_unlocked={}",
- *out_is_restricted_system_settings_entered);
- R_SUCCEED();
- }
-
- Result ConfirmStereoVisionPermission() {
- LOG_DEBUG(Service_PCTL, "called");
- states.stereo_vision = true;
- R_SUCCEED();
- }
-
- Result EndFreeCommunication() {
- LOG_WARNING(Service_PCTL, "(STUBBED) called");
- R_SUCCEED();
- }
-
- Result IsFreeCommunicationAvailable() {
- LOG_DEBUG(Service_PCTL, "(STUBBED) called");
-
- if (!CheckFreeCommunicationPermissionImpl()) {
- R_THROW(PCTL::ResultNoFreeCommunication);
- } else {
- R_SUCCEED();
- }
- }
-
- Result IsRestrictionEnabled(Out<bool> out_restriction_enabled) {
- LOG_DEBUG(Service_PCTL, "called");
-
- if (False(capability & (Capability::Status | Capability::Recovery))) {
- LOG_ERROR(Service_PCTL, "Application does not have Status or Recovery capabilities!");
- *out_restriction_enabled = false;
- R_THROW(PCTL::ResultNoCapability);
- }
-
- *out_restriction_enabled = pin_code[0] != '\0';
- R_SUCCEED();
- }
-
- Result GetSafetyLevel(Out<u32> out_safety_level) {
- *out_safety_level = 0;
- LOG_WARNING(Service_PCTL, "(STUBBED) called, safety_level={}", *out_safety_level);
- R_SUCCEED();
- }
-
- Result GetCurrentSettings(Out<RestrictionSettings> out_settings) {
- LOG_INFO(Service_PCTL, "called");
- *out_settings = restriction_settings;
- R_SUCCEED();
- }
-
- Result GetFreeCommunicationApplicationListCount(Out<s32> out_count) {
- *out_count = 4;
- LOG_WARNING(Service_PCTL, "(STUBBED) called, count={}", *out_count);
- R_SUCCEED();
- }
-
- Result ConfirmStereoVisionRestrictionConfigurable() {
- LOG_DEBUG(Service_PCTL, "called");
-
- if (False(capability & Capability::StereoVision)) {
- LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!");
- R_THROW(PCTL::ResultNoCapability);
- }
-
- if (pin_code[0] == '\0') {
- R_THROW(PCTL::ResultNoRestrictionEnabled);
- }
-
- R_SUCCEED();
- }
-
- Result IsStereoVisionPermitted(Out<bool> out_is_permitted) {
- LOG_DEBUG(Service_PCTL, "called");
-
- if (!ConfirmStereoVisionPermissionImpl()) {
- *out_is_permitted = false;
- R_THROW(PCTL::ResultStereoVisionRestricted);
- } else {
- *out_is_permitted = true;
- R_SUCCEED();
- }
- }
-
- Result GetPinCodeLength(Out<s32> out_length) {
- *out_length = 0;
- LOG_WARNING(Service_PCTL, "(STUBBED) called, length={}", *out_length);
- R_SUCCEED();
- }
-
- Result IsPairingActive(Out<bool> out_is_pairing_active) {
- *out_is_pairing_active = false;
- LOG_WARNING(Service_PCTL, "(STUBBED) called, is_pairing_active={}", *out_is_pairing_active);
- R_SUCCEED();
- }
-
- Result GetSynchronizationEvent(
- OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_INFO(Service_PCTL, "called");
- *out_event = synchronization_event.GetHandle();
- R_SUCCEED();
- }
-
- Result StartPlayTimer() {
- LOG_WARNING(Service_PCTL, "(STUBBED) called");
- R_SUCCEED();
- }
-
- Result StopPlayTimer() {
- LOG_WARNING(Service_PCTL, "(STUBBED) called");
- R_SUCCEED();
- }
-
- Result IsPlayTimerEnabled(Out<bool> out_is_play_timer_enabled) {
- *out_is_play_timer_enabled = false;
- LOG_WARNING(Service_PCTL, "(STUBBED) called, enabled={}", *out_is_play_timer_enabled);
- R_SUCCEED();
- }
-
- Result GetPlayTimerRemainingTime(Out<s32> out_remaining_time) {
- LOG_WARNING(Service_PCTL, "(STUBBED) called");
- *out_remaining_time = std::numeric_limits<s32>::max();
- R_SUCCEED();
- }
-
- Result IsRestrictedByPlayTimer(Out<bool> out_is_restricted_by_play_timer) {
- *out_is_restricted_by_play_timer = false;
- LOG_WARNING(Service_PCTL, "(STUBBED) called, restricted={}", *out_is_restricted_by_play_timer);
- R_SUCCEED();
- }
-
- Result GetPlayTimerSettingsOld(
- Out<PlayTimerSettingsOld> out_play_timer_settings) {
- LOG_WARNING(Service_PCTL, "(STUBBED) called");
- *out_play_timer_settings = {};
- R_SUCCEED();
- }
-
- Result GetPlayTimerSettings(Out<PlayTimerSettings> out_play_timer_settings) {
- LOG_WARNING(Service_PCTL, "(STUBBED) called");
- *out_play_timer_settings = raw_play_timer_settings;
- R_SUCCEED();
- }
-
- Result SetPlayTimerSettings(PlayTimerSettings play_timer_settings) {
- LOG_WARNING(Service_PCTL, "(STUBBED) called");
- raw_play_timer_settings = play_timer_settings;
- R_SUCCEED();
- }
-
- Result GetPlayTimerEventToRequestSuspension(
- OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_INFO(Service_PCTL, "called");
- *out_event = request_suspension_event.GetHandle();
- R_SUCCEED();
- }
-
- Result IsPlayTimerAlarmDisabled(Out<bool> out_play_timer_alarm_disabled) {
- *out_play_timer_alarm_disabled = false;
- LOG_INFO(Service_PCTL, "called, is_play_timer_alarm_disabled={}",
- *out_play_timer_alarm_disabled);
- R_SUCCEED();
- }
-
- Result GetPlayTimerRemainingTimeDisplayInfo(Out<PlayTimerRemainingTimeDisplayInfo> out_display_info) {
- LOG_DEBUG(Service_PCTL, "called");
- *out_display_info = {.state = PlayTimerDisplayState::NotConfigured};
- R_SUCCEED();
- }
-
- Result Unknown1460(u8 in_unk, Out<PlayTimerRemainingTimeDisplayInfo> out_display_info) {
- LOG_DEBUG(Service_PCTL, "called, in_unk={}", in_unk);
- *out_display_info = {.state = PlayTimerDisplayState::NotConfigured};
- R_SUCCEED();
- }
-
- Result GetUnlinkedEvent(OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_INFO(Service_PCTL, "called");
- *out_event = unlinked_event.GetHandle();
- R_SUCCEED();
- }
-
- Result GetStereoVisionRestriction(
- Out<bool> out_stereo_vision_restriction) {
- LOG_DEBUG(Service_PCTL, "called");
-
- if (False(capability & Capability::StereoVision)) {
- LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!");
- *out_stereo_vision_restriction = false;
- R_THROW(PCTL::ResultNoCapability);
- }
-
- *out_stereo_vision_restriction = settings.is_stero_vision_restricted;
- R_SUCCEED();
- }
-
- Result SetStereoVisionRestriction(bool stereo_vision_restriction) {
- LOG_DEBUG(Service_PCTL, "called, can_use={}", stereo_vision_restriction);
-
- if (False(capability & Capability::StereoVision)) {
- LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!");
- R_THROW(PCTL::ResultNoCapability);
- }
-
- SetStereoVisionRestrictionImpl(stereo_vision_restriction);
- R_SUCCEED();
- }
-
- Result ResetConfirmedStereoVisionPermission() {
- LOG_DEBUG(Service_PCTL, "called");
-
- states.stereo_vision = false;
-
- R_SUCCEED();
- }
-
- struct States {
- u64 current_tid{};
- ApplicationInfo application_info{};
- u64 tid_from_event{};
- bool launch_time_valid{};
- bool is_suspended{};
- bool temporary_unlocked{};
- bool free_communication{};
- bool stereo_vision{};
- };
-
- struct ParentalControlSettings {
- bool is_stero_vision_restricted{};
- bool is_free_communication_default_on{};
- bool disabled{};
- };
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{1, D<&IParentalControlService::Initialize>, "Initialize"},
- FunctionInfo{1001, D<&IParentalControlService::CheckFreeCommunicationPermission>, "CheckFreeCommunicationPermission"},
- FunctionInfo{1002, D<&IParentalControlService::ConfirmLaunchApplicationPermission>, "ConfirmLaunchApplicationPermission"},
- FunctionInfo{1003, D<&IParentalControlService::ConfirmResumeApplicationPermission>, "ConfirmResumeApplicationPermission"},
- FunctionInfo{1004, D<&IParentalControlService::ConfirmSnsPostPermission>, "ConfirmSnsPostPermission"},
- FunctionInfo{1005, D<&IParentalControlService::ConfirmSystemSettingsPermission>, "ConfirmSystemSettingsPermission"},
- FunctionInfo{1006, D<&IParentalControlService::IsRestrictionTemporaryUnlocked>, "IsRestrictionTemporaryUnlocked"},
- FunctionInfo{1007, nullptr, "RevertRestrictionTemporaryUnlocked"},
- FunctionInfo{1008, nullptr, "EnterRestrictedSystemSettings"},
- FunctionInfo{1009, nullptr, "LeaveRestrictedSystemSettings"},
- FunctionInfo{1010, D<&IParentalControlService::IsRestrictedSystemSettingsEntered>, "IsRestrictedSystemSettingsEntered"},
- FunctionInfo{1011, nullptr, "RevertRestrictedSystemSettingsEntered"},
- FunctionInfo{1012, nullptr, "GetRestrictedFeatures"},
- FunctionInfo{1013, D<&IParentalControlService::ConfirmStereoVisionPermission>, "ConfirmStereoVisionPermission"},
- FunctionInfo{1014, nullptr, "ConfirmPlayableApplicationVideoOld"},
- FunctionInfo{1015, nullptr, "ConfirmPlayableApplicationVideo"},
- FunctionInfo{1016, nullptr, "ConfirmShowNewsPermission"},
- FunctionInfo{1017, D<&IParentalControlService::EndFreeCommunication>, "EndFreeCommunication"},
- FunctionInfo{1018, D<&IParentalControlService::IsFreeCommunicationAvailable>, "IsFreeCommunicationAvailable"},
- FunctionInfo{1019, D<&IParentalControlService::ConfirmLaunchApplicationPermission>, "ConfirmLaunchApplicationPermission"},
- FunctionInfo{1020, nullptr, "ConfirmLaunchSharedApplicationPermission", MakeVersionGate({20,0,0})},
- FunctionInfo{1021, nullptr, "TryBeginFreeCommunicationForStreamPlay", MakeVersionGate({21,0,0})},
- FunctionInfo{1022, nullptr, "EndFreeCommunicationForStreamPlay", MakeVersionGate({21,0,0})},
- FunctionInfo{1031, D<&IParentalControlService::IsRestrictionEnabled>, "IsRestrictionEnabled"},
- FunctionInfo{1032, D<&IParentalControlService::GetSafetyLevel>, "GetSafetyLevel"},
- FunctionInfo{1033, nullptr, "SetSafetyLevel"},
- FunctionInfo{1034, nullptr, "GetSafetyLevelSettings"},
- FunctionInfo{1035, D<&IParentalControlService::GetCurrentSettings>, "GetCurrentSettings"},
- FunctionInfo{1036, nullptr, "SetCustomSafetyLevelSettings"},
- FunctionInfo{1037, nullptr, "GetDefaultRatingOrganization"},
- FunctionInfo{1038, nullptr, "SetDefaultRatingOrganization"},
- FunctionInfo{1039, D<&IParentalControlService::GetFreeCommunicationApplicationListCount>, "GetFreeCommunicationApplicationListCount"},
- FunctionInfo{1042, nullptr, "AddToFreeCommunicationApplicationList"},
- FunctionInfo{1043, nullptr, "DeleteSettings"},
- FunctionInfo{1044, nullptr, "GetFreeCommunicationApplicationList"},
- FunctionInfo{1045, nullptr, "UpdateFreeCommunicationApplicationList"},
- FunctionInfo{1046, nullptr, "DisableFeaturesForReset"},
- FunctionInfo{1047, nullptr, "NotifyApplicationDownloadStarted"},
- FunctionInfo{1048, nullptr, "NotifyNetworkProfileCreated"},
- FunctionInfo{1049, nullptr, "ResetFreeCommunicationApplicationList"},
- FunctionInfo{1050, nullptr, "AddToFreeCommunicationApplicationList", MakeVersionGate({20,0,0})},
- FunctionInfo{1051, nullptr, "NotifyApplicationDownloadStarted", MakeVersionGate({20,0,0})},
- FunctionInfo{1061, D<&IParentalControlService::ConfirmStereoVisionRestrictionConfigurable>, "ConfirmStereoVisionRestrictionConfigurable"},
- FunctionInfo{1062, D<&IParentalControlService::GetStereoVisionRestriction>, "GetStereoVisionRestriction"},
- FunctionInfo{1063, D<&IParentalControlService::SetStereoVisionRestriction>, "SetStereoVisionRestriction"},
- FunctionInfo{1064, D<&IParentalControlService::ResetConfirmedStereoVisionPermission>, "ResetConfirmedStereoVisionPermission"},
- FunctionInfo{1065, D<&IParentalControlService::IsStereoVisionPermitted>, "IsStereoVisionPermitted"},
- FunctionInfo{1201, nullptr, "UnlockRestrictionTemporarily"},
- FunctionInfo{1202, nullptr, "UnlockSystemSettingsRestriction"},
- FunctionInfo{1203, nullptr, "SetPinCode"},
- FunctionInfo{1204, nullptr, "GenerateInquiryCode"},
- FunctionInfo{1205, nullptr, "CheckMasterKey"},
- FunctionInfo{1206, D<&IParentalControlService::GetPinCodeLength>, "GetPinCodeLength"},
- FunctionInfo{1207, nullptr, "GetPinCodeChangedEvent"},
- FunctionInfo{1208, nullptr, "GetPinCode"},
- FunctionInfo{1403, D<&IParentalControlService::IsPairingActive>, "IsPairingActive"},
- FunctionInfo{1406, nullptr, "GetSettingsLastUpdated"},
- FunctionInfo{1411, nullptr, "GetPairingAccountInfo"},
- FunctionInfo{1421, nullptr, "GetAccountNickname"},
- FunctionInfo{1424, nullptr, "GetAccountState"},
- FunctionInfo{1425, nullptr, "RequestPostEvents"},
- FunctionInfo{1426, nullptr, "GetPostEventInterval"},
- FunctionInfo{1427, nullptr, "SetPostEventInterval"},
- FunctionInfo{1432, D<&IParentalControlService::GetSynchronizationEvent>, "GetSynchronizationEvent"},
- FunctionInfo{1451, D<&IParentalControlService::StartPlayTimer>, "StartPlayTimer"},
- FunctionInfo{1452, D<&IParentalControlService::StopPlayTimer>, "StopPlayTimer"},
- FunctionInfo{1453, D<&IParentalControlService::IsPlayTimerEnabled>, "IsPlayTimerEnabled"},
- FunctionInfo{1454, D<&IParentalControlService::GetPlayTimerRemainingTime>, "GetPlayTimerRemainingTime"},
- FunctionInfo{1455, D<&IParentalControlService::IsRestrictedByPlayTimer>, "IsRestrictedByPlayTimer"},
- FunctionInfo{1456, D<&IParentalControlService::GetPlayTimerSettingsOld>, "GetPlayTimerSettingsOld"},
- FunctionInfo{1457, D<&IParentalControlService::GetPlayTimerEventToRequestSuspension>, "GetPlayTimerEventToRequestSuspension"},
- FunctionInfo{1458, D<&IParentalControlService::IsPlayTimerAlarmDisabled>, "IsPlayTimerAlarmDisabled"},
- FunctionInfo{1459, D<&IParentalControlService::GetPlayTimerRemainingTimeDisplayInfo>, "GetPlayTimerRemainingTimeDisplayInfo"},
- FunctionInfo{1460, D<&IParentalControlService::Unknown1460>, "Unknown1460"},
- FunctionInfo{1471, nullptr, "NotifyWrongPinCodeInputManyTimes"},
- FunctionInfo{1472, nullptr, "CancelNetworkRequest"},
- FunctionInfo{1473, D<&IParentalControlService::GetUnlinkedEvent>, "GetUnlinkedEvent"},
- FunctionInfo{1474, nullptr, "ClearUnlinkedEvent"},
- FunctionInfo{1475, nullptr, "GetExtendedPlayTimerEvent", MakeVersionGate({18,0,0})},
- FunctionInfo{1601, nullptr, "DisableAllFeatures"},
- FunctionInfo{1602, nullptr, "PostEnableAllFeatures"},
- FunctionInfo{1603, nullptr, "IsAllFeaturesDisabled"},
- FunctionInfo{1901, nullptr, "DeleteFromFreeCommunicationApplicationListForDebug"},
- FunctionInfo{1902, nullptr, "ClearFreeCommunicationApplicationListForDebug"},
- FunctionInfo{1903, nullptr, "GetExemptApplicationListCountForDebug"},
- FunctionInfo{1904, nullptr, "GetExemptApplicationListForDebug"},
- FunctionInfo{1905, nullptr, "UpdateExemptApplicationListForDebug"},
- FunctionInfo{1906, nullptr, "AddToExemptApplicationListForDebug"},
- FunctionInfo{1907, nullptr, "DeleteFromExemptApplicationListForDebug"},
- FunctionInfo{1908, nullptr, "ClearExemptApplicationListForDebug"},
- FunctionInfo{1941, nullptr, "DeletePairing"},
- FunctionInfo{1951, nullptr, "SetPlayTimerSettingsForDebug"},
- FunctionInfo{1952, nullptr, "GetPlayTimerSpentTimeForTest"},
- FunctionInfo{1953, nullptr, "SetPlayTimerAlarmDisabledForDebug"},
- FunctionInfo{1954, nullptr, "IsBedtimeAlarmEnabled", MakeVersionGate({18,0,0})},
- FunctionInfo{1955, nullptr, "GetBedtimeAlarmTime", MakeVersionGate({18,0,0})},
- FunctionInfo{1956, nullptr, "GetBedtimeAlarmTimeHour", MakeVersionGate({18,0,0})},
- FunctionInfo{1957, nullptr, "GetBedtimeAlarmTimeMinute", MakeVersionGate({18,0,0})},
- FunctionInfo{2001, nullptr, "RequestPairingAsync"},
- FunctionInfo{2002, nullptr, "FinishRequestPairing"},
- FunctionInfo{2003, nullptr, "AuthorizePairingAsync"},
- FunctionInfo{2004, nullptr, "FinishAuthorizePairing"},
- FunctionInfo{2005, nullptr, "RetrievePairingInfoAsync"},
- FunctionInfo{2006, nullptr, "FinishRetrievePairingInfo"},
- FunctionInfo{2007, nullptr, "UnlinkPairingAsync"},
- FunctionInfo{2008, nullptr, "FinishUnlinkPairing"},
- FunctionInfo{2009, nullptr, "GetAccountMiiImageAsync"},
- FunctionInfo{2010, nullptr, "FinishGetAccountMiiImage"},
- FunctionInfo{2011, nullptr, "GetAccountMiiImageContentTypeAsync"},
- FunctionInfo{2012, nullptr, "FinishGetAccountMiiImageContentType"},
- FunctionInfo{2013, nullptr, "SynchronizeParentalControlSettingsAsync"},
- FunctionInfo{2014, nullptr, "FinishSynchronizeParentalControlSettings"},
- FunctionInfo{2015, nullptr, "FinishSynchronizeParentalControlSettingsWithLastUpdated"},
- FunctionInfo{2016, nullptr, "RequestUpdateExemptionListAsync", MakeVersionGate({5,0,0})},
- FunctionInfo{145601, D<&IParentalControlService::GetPlayTimerSettings>, "GetPlayTimerSettings", MakeVersionGate({18,0,0})},
- FunctionInfo{2017, nullptr, "AuthorizePairingAsync", MakeVersionGate({19,0,0})},
- FunctionInfo{2019, nullptr, "RequestUpdateDeviceUsersBackground", MakeVersionGate({19,0,0})},
- FunctionInfo{2021, nullptr, "RequestCopyPairingAsync", MakeVersionGate({20,0,0})},
- FunctionInfo{2022, nullptr, "FinishRequestCopyPairing", MakeVersionGate({20,0,0})},
- FunctionInfo{2023, nullptr, "IsFromPairingActiveDevice", MakeVersionGate({20,0,0})},
- FunctionInfo{2024, nullptr, "RollbackCopyPairing", MakeVersionGate({21,0,0})},
- FunctionInfo{3001, nullptr, "GetErrorContextChangedEvent", MakeVersionGate({20,0,0})},
- FunctionInfo{145601, D<&IParentalControlService::GetPlayTimerSettings>, "GetPlayTimerSettings", MakeVersionGate({18,0,0})},
- FunctionInfo{195101, D<&IParentalControlService::SetPlayTimerSettings>, "SetPlayTimerSettingsForDebug", MakeVersionGate({18,0,0})}
- );
- States states{};
- ParentalControlSettings settings{};
- RestrictionSettings restriction_settings{};
- std::array<char, 8> pin_code{};
- Capability capability{};
- u64 program_id{};
- // TODO: this is raw
- PlayTimerSettings raw_play_timer_settings{};
-
- KernelHelpers::ServiceContext service_context;
- Event synchronization_event;
- Event unlinked_event;
- Event request_suspension_event;
-};
-
-class IParentalControlServiceFactory : public ServiceFramework<IParentalControlServiceFactory> {
-public:
- explicit IParentalControlServiceFactory(Core::System& system_, const char* name_, Capability capability_)
- : ServiceFramework{system_, name_}, capability{capability_}
- {}
-
- ~IParentalControlServiceFactory() override = default;
-
- Result CreateService(Out<SharedPointer<IParentalControlService>> out_service, ClientProcessId process_id) {
- LOG_DEBUG(Service_PCTL, "called, process_id={}", process_id.pid);
- *out_service = std::make_shared<IParentalControlService>(
- system, capability, system.ResolveCallerProgramId(*process_id));
- R_SUCCEED();
- }
-
- Result CreateServiceWithoutInitialize(Out<SharedPointer<IParentalControlService>> out_service, ClientProcessId process_id) {
- LOG_DEBUG(Service_PCTL, "called, process_id={}", process_id.pid);
- *out_service = std::make_shared<IParentalControlService>(
- system, capability, system.ResolveCallerProgramId(*process_id));
- R_SUCCEED();
- }
-
-private:
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IParentalControlServiceFactory::CreateService>, "CreateService"},
- FunctionInfo{1, D<&IParentalControlServiceFactory::CreateServiceWithoutInitialize>, "CreateServiceWithoutInitialize"}
- );
- Capability capability{};
-};
-
void LoopProcess(Core::System& system) {
auto server_manager = std::make_unique<ServerManager>(system);
- server_manager->RegisterNamedService("pctl", std::make_shared<IParentalControlServiceFactory>(system, "pctl", Capability::Application | Capability::SnsPost | Capability::Status | Capability::StereoVision));
+ server_manager->RegisterNamedService("pctl",
+ std::make_shared<IParentalControlServiceFactory>(
+ system, "pctl",
+ Capability::Application | Capability::SnsPost |
+ Capability::Status | Capability::StereoVision));
// TODO(ogniK): Implement remaining capabilities
- server_manager->RegisterNamedService("pctl:a", std::make_shared<IParentalControlServiceFactory>(system, "pctl:a", Capability::None));
- server_manager->RegisterNamedService("pctl:r", std::make_shared<IParentalControlServiceFactory>(system, "pctl:r", Capability::None));
- server_manager->RegisterNamedService("pctl:s", std::make_shared<IParentalControlServiceFactory>(system, "pctl:s", Capability::None));
+ server_manager->RegisterNamedService("pctl:a", std::make_shared<IParentalControlServiceFactory>(
+ system, "pctl:a", Capability::None));
+ server_manager->RegisterNamedService("pctl:r", std::make_shared<IParentalControlServiceFactory>(
+ system, "pctl:r", Capability::None));
+ server_manager->RegisterNamedService("pctl:s", std::make_shared<IParentalControlServiceFactory>(
+ system, "pctl:s", Capability::None));
ServerManager::RunServer(std::move(server_manager));
}
diff --git a/src/core/hle/service/pctl/pctl.h b/src/core/hle/service/pctl/pctl.h
index 5f9d03d4df..020866aa3d 100644
--- a/src/core/hle/service/pctl/pctl.h
+++ b/src/core/hle/service/pctl/pctl.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/pctl/pctl_results.h b/src/core/hle/service/pctl/pctl_results.h
new file mode 100644
index 0000000000..0aa4714a9c
--- /dev/null
+++ b/src/core/hle/service/pctl/pctl_results.h
@@ -0,0 +1,18 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/result.h"
+
+namespace Service::PCTL {
+
+constexpr Result ResultNoFreeCommunication{ErrorModule::PCTL, 101};
+constexpr Result ResultStereoVisionRestricted{ErrorModule::PCTL, 104};
+constexpr Result ResultNoCapability{ErrorModule::PCTL, 131};
+constexpr Result ResultNoRestrictionEnabled{ErrorModule::PCTL, 181};
+
+} // namespace Service::PCTL
diff --git a/src/core/hle/service/pctl/pctl_types.h b/src/core/hle/service/pctl/pctl_types.h
new file mode 100644
index 0000000000..3a5a19099d
--- /dev/null
+++ b/src/core/hle/service/pctl/pctl_types.h
@@ -0,0 +1,73 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "common/common_funcs.h"
+
+namespace Service::PCTL {
+
+enum class Capability : u32 {
+ None = 0,
+ Application = 1 << 0,
+ SnsPost = 1 << 1,
+ Recovery = 1 << 6,
+ Status = 1 << 8,
+ StereoVision = 1 << 9,
+ System = 1 << 15,
+};
+DECLARE_ENUM_FLAG_OPERATORS(Capability);
+
+struct ApplicationInfo {
+ u64 application_id{};
+ std::array<u8, 32> age_rating{};
+ u32 parental_control_flag{};
+ Capability capability{};
+};
+static_assert(sizeof(ApplicationInfo) == 0x30, "ApplicationInfo has incorrect size.");
+
+// This is nn::pctl::RestrictionSettings
+struct RestrictionSettings {
+ u8 rating_age;
+ bool sns_post_restriction;
+ bool free_communication_restriction;
+};
+static_assert(sizeof(RestrictionSettings) == 0x3, "RestrictionSettings has incorrect size.");
+
+// This is nn::pctl::PlayTimerSettingsOld
+struct PlayTimerSettingsOld {
+ std::array<u32, 13> settings;
+};
+static_assert(sizeof(PlayTimerSettingsOld) == 0x34, "PlayTimerSettingsOld has incorrect size.");
+
+// This is nn::pctl::PlayTimerSettings
+struct PlayTimerSettings {
+ std::array<u32, 17> settings; //21.0.0+ now takes 0x44
+};
+static_assert(sizeof(PlayTimerSettings) == 0x44, "PlayTimerSettings has incorrect size.");
+
+enum class PlayTimerDisplayState : u8 {
+ TimesUp = 0,
+ BedtimeAlarm = 1,
+ RemainingTime = 2,
+ Unknown3 = 3,
+ Unknown4 = 4,
+ Unknown5 = 5,
+ TimerDisabled = 6,
+ NotConfigured = 7,
+};
+
+// This is nn::pctl::PlayTimerRemainingTimeDisplayInfo
+struct PlayTimerRemainingTimeDisplayInfo {
+ PlayTimerDisplayState state;
+ INSERT_PADDING_BYTES(0x7);
+ u64 unknown_08;
+ u64 remaining_time;
+};
+static_assert(sizeof(PlayTimerRemainingTimeDisplayInfo) == 0x18,
+ "PlayTimerRemainingTimeDisplayInfo has incorrect size.");
+
+} // namespace Service::PCTL
diff --git a/src/core/hle/service/pcv/pcv.cpp b/src/core/hle/service/pcv/pcv.cpp
index bb3d748527..1b314f3518 100644
--- a/src/core/hle/service/pcv/pcv.cpp
+++ b/src/core/hle/service/pcv/pcv.cpp
@@ -15,76 +15,91 @@ namespace Service::PCV {
class PCV final : public ServiceFramework<PCV> {
public:
- explicit PCV(Core::System& system_) : ServiceFramework{system_, "pcv"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "SetPowerEnabled"},
- FunctionInfo{1, nullptr, "SetClockEnabled"},
- FunctionInfo{2, nullptr, "SetClockRate"},
- FunctionInfo{3, nullptr, "GetClockRate"},
- FunctionInfo{4, nullptr, "GetState"},
- FunctionInfo{5, nullptr, "GetPossibleClockRates"},
- FunctionInfo{6, nullptr, "SetMinVClockRate"},
- FunctionInfo{7, nullptr, "SetReset"},
- FunctionInfo{8, nullptr, "SetVoltageEnabled"},
- FunctionInfo{9, nullptr, "GetVoltageEnabled"},
- FunctionInfo{10, nullptr, "GetVoltageRange"},
- FunctionInfo{11, nullptr, "SetVoltageValue"},
- FunctionInfo{12, nullptr, "GetVoltageValue"},
- FunctionInfo{13, nullptr, "GetTemperatureThresholds"},
- FunctionInfo{14, nullptr, "SetTemperature"},
- FunctionInfo{15, nullptr, "Initialize"},
- FunctionInfo{16, nullptr, "IsInitialized"},
- FunctionInfo{17, nullptr, "Finalize"},
- FunctionInfo{18, nullptr, "PowerOn"},
- FunctionInfo{19, nullptr, "PowerOff"},
- FunctionInfo{20, nullptr, "ChangeVoltage"},
- FunctionInfo{21, nullptr, "GetPowerClockInfoEvent"},
- FunctionInfo{22, nullptr, "GetOscillatorClock"},
- FunctionInfo{23, nullptr, "GetDvfsTable"},
- FunctionInfo{24, nullptr, "GetModuleStateTable"},
- FunctionInfo{25, nullptr, "GetPowerDomainStateTable"},
- FunctionInfo{26, nullptr, "GetFuseInfo"},
- FunctionInfo{27, nullptr, "GetDramId"},
- FunctionInfo{28, nullptr, "IsPoweredOn"},
- FunctionInfo{29, nullptr, "GetVoltage"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit PCV(Core::System& system_) : ServiceFramework{system_, "pcv"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "SetPowerEnabled"},
+ {1, nullptr, "SetClockEnabled"},
+ {2, nullptr, "SetClockRate"},
+ {3, nullptr, "GetClockRate"},
+ {4, nullptr, "GetState"},
+ {5, nullptr, "GetPossibleClockRates"},
+ {6, nullptr, "SetMinVClockRate"},
+ {7, nullptr, "SetReset"},
+ {8, nullptr, "SetVoltageEnabled"},
+ {9, nullptr, "GetVoltageEnabled"},
+ {10, nullptr, "GetVoltageRange"},
+ {11, nullptr, "SetVoltageValue"},
+ {12, nullptr, "GetVoltageValue"},
+ {13, nullptr, "GetTemperatureThresholds"},
+ {14, nullptr, "SetTemperature"},
+ {15, nullptr, "Initialize"},
+ {16, nullptr, "IsInitialized"},
+ {17, nullptr, "Finalize"},
+ {18, nullptr, "PowerOn"},
+ {19, nullptr, "PowerOff"},
+ {20, nullptr, "ChangeVoltage"},
+ {21, nullptr, "GetPowerClockInfoEvent"},
+ {22, nullptr, "GetOscillatorClock"},
+ {23, nullptr, "GetDvfsTable"},
+ {24, nullptr, "GetModuleStateTable"},
+ {25, nullptr, "GetPowerDomainStateTable"},
+ {26, nullptr, "GetFuseInfo"},
+ {27, nullptr, "GetDramId"},
+ {28, nullptr, "IsPoweredOn"},
+ {29, nullptr, "GetVoltage"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
class PCV_ARB final : public ServiceFramework<PCV_ARB> {
public:
- explicit PCV_ARB(Core::System& system_) : ServiceFramework{system_, "pcv:arb"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "ReleaseControl"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit PCV_ARB(Core::System& system_) : ServiceFramework{system_, "pcv:arb"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "ReleaseControl"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class PCV_IMM final : public ServiceFramework<PCV_IMM> {
public:
- explicit PCV_IMM(Core::System& system_) : ServiceFramework{system_, "pcv:imm"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "SetClockRate"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit PCV_IMM(Core::System& system_) : ServiceFramework{system_, "pcv:imm"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "SetClockRate"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class IClkrstSession final : public ServiceFramework<IClkrstSession> {
public:
explicit IClkrstSession(Core::System& system_, DeviceCode device_code_)
- : ServiceFramework{system_, "IClkrstSession"}, device_code(device_code_) {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "IClkrstSession"}, device_code(device_code_) {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "SetClockEnabled"},
+ {1, nullptr, "SetClockDisabled"},
+ {2, nullptr, "SetResetAsserted"},
+ {3, nullptr, "SetResetDeasserted"},
+ {4, nullptr, "SetPowerEnabled"},
+ {5, nullptr, "SetPowerDisabled"},
+ {6, nullptr, "GetState"},
+ {7, &IClkrstSession::SetClockRate, "SetClockRate"},
+ {8, &IClkrstSession::GetClockRate, "GetClockRate"},
+ {9, nullptr, "SetMinVClockRate"},
+ {10, nullptr, "GetPossibleClockRates"},
+ {11, nullptr, "GetDvfsTable"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
private:
@@ -105,30 +120,25 @@ private:
rb.Push<u32>(clock_rate);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "SetClockEnabled"},
- FunctionInfo{1, nullptr, "SetClockDisabled"},
- FunctionInfo{2, nullptr, "SetResetAsserted"},
- FunctionInfo{3, nullptr, "SetResetDeasserted"},
- FunctionInfo{4, nullptr, "SetPowerEnabled"},
- FunctionInfo{5, nullptr, "SetPowerDisabled"},
- FunctionInfo{6, nullptr, "GetState"},
- FunctionInfo{7, &IClkrstSession::SetClockRate, "SetClockRate"},
- FunctionInfo{8, &IClkrstSession::GetClockRate, "GetClockRate"},
- FunctionInfo{9, nullptr, "SetMinVClockRate"},
- FunctionInfo{10, nullptr, "GetPossibleClockRates"},
- FunctionInfo{11, nullptr, "GetDvfsTable"}
- );
DeviceCode device_code;
u32 clock_rate{};
};
class CLKRST final : public ServiceFramework<CLKRST> {
public:
- explicit CLKRST(Core::System& system_, const char* name) : ServiceFramework{system_, name} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit CLKRST(Core::System& system_, const char* name) : ServiceFramework{system_, name} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &CLKRST::OpenSession, "OpenSession"},
+ {1, nullptr, "GetTemperatureThresholds"},
+ {2, nullptr, "SetTemperature"},
+ {3, nullptr, "GetModuleStateTable"},
+ {4, nullptr, "GetModuleStateTableEvent"},
+ {5, nullptr, "GetModuleStateTableMaxCount"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
private:
@@ -143,26 +153,18 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<IClkrstSession>(ctx, system, device_code);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &CLKRST::OpenSession, "OpenSession"},
- FunctionInfo{1, nullptr, "GetTemperatureThresholds"},
- FunctionInfo{2, nullptr, "SetTemperature"},
- FunctionInfo{3, nullptr, "GetModuleStateTable"},
- FunctionInfo{4, nullptr, "GetModuleStateTableEvent"},
- FunctionInfo{5, nullptr, "GetModuleStateTableMaxCount"}
- );
};
class CLKRST_A final : public ServiceFramework<CLKRST_A> {
public:
- explicit CLKRST_A(Core::System& system_) : ServiceFramework{system_, "clkrst:a"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "ReleaseControl"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit CLKRST_A(Core::System& system_) : ServiceFramework{system_, "clkrst:a"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "ReleaseControl"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
diff --git a/src/core/hle/service/pcv/pcv.h b/src/core/hle/service/pcv/pcv.h
index bf541e6feb..27eb179ff4 100644
--- a/src/core/hle/service/pcv/pcv.h
+++ b/src/core/hle/service/pcv/pcv.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/pm/pm.cpp b/src/core/hle/service/pm/pm.cpp
index 3d431c305f..ff7053b690 100644
--- a/src/core/hle/service/pm/pm.cpp
+++ b/src/core/hle/service/pm/pm.cpp
@@ -47,7 +47,13 @@ void GetApplicationPidGeneric(Kernel::KernelCore& kernel, HLERequestContext& ctx
class BootMode final : public ServiceFramework<BootMode> {
public:
- explicit BootMode(Core::System& system_) : ServiceFramework{system_, "pm:bm"} {}
+ explicit BootMode(Core::System& system_) : ServiceFramework{system_, "pm:bm"} {
+ static const FunctionInfo functions[] = {
+ {0, &BootMode::GetBootMode, "GetBootMode"},
+ {1, &BootMode::SetMaintenanceBoot, "SetMaintenanceBoot"},
+ };
+ RegisterHandlers(functions);
+ }
private:
void GetBootMode(HLERequestContext& ctx) {
@@ -67,19 +73,28 @@ private:
rb.Push(ResultSuccess);
}
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &BootMode::GetBootMode, "GetBootMode"},
- FunctionInfo{1, &BootMode::SetMaintenanceBoot, "SetMaintenanceBoot"}
- );
SystemBootMode boot_mode = SystemBootMode::Normal;
};
class DebugMonitor final : public ServiceFramework<DebugMonitor> {
public:
- explicit DebugMonitor(Core::System& system_) : ServiceFramework{system_, "pm:dmnt"} {}
+ explicit DebugMonitor(Core::System& system_) : ServiceFramework{system_, "pm:dmnt"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetJitDebugProcessIdList"},
+ {1, nullptr, "StartProcess"},
+ {2, &DebugMonitor::GetProcessId, "GetProcessId"},
+ {3, nullptr, "HookToCreateProcess"},
+ {4, &DebugMonitor::GetApplicationProcessId, "GetApplicationProcessId"},
+ {5, nullptr, "HookToCreateApplicationProgress"},
+ {6, nullptr, "ClearHook"},
+ {65000, &DebugMonitor::AtmosphereGetProcessInfo, "AtmosphereGetProcessInfo"},
+ {65001, nullptr, "AtmosphereGetCurrentLimitInfo"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+ }
private:
void GetProcessId(HLERequestContext& ctx) {
@@ -149,26 +164,19 @@ private:
rb.PushRaw(program_location);
rb.PushRaw(override_status);
}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetJitDebugProcessIdList"},
- FunctionInfo{1, nullptr, "StartProcess"},
- FunctionInfo{2, &DebugMonitor::GetProcessId, "GetProcessId"},
- FunctionInfo{3, nullptr, "HookToCreateProcess"},
- FunctionInfo{4, &DebugMonitor::GetApplicationProcessId, "GetApplicationProcessId"},
- FunctionInfo{5, nullptr, "HookToCreateApplicationProgress"},
- FunctionInfo{6, nullptr, "ClearHook"},
- FunctionInfo{65000, &DebugMonitor::AtmosphereGetProcessInfo, "AtmosphereGetProcessInfo"},
- FunctionInfo{65001, nullptr, "AtmosphereGetCurrentLimitInfo"}
- );
};
class Info final : public ServiceFramework<Info> {
public:
- explicit Info(Core::System& system_) : ServiceFramework{system_, "pm:info"} {}
+ explicit Info(Core::System& system_) : ServiceFramework{system_, "pm:info"} {
+ static const FunctionInfo functions[] = {
+ {0, &Info::GetProgramId, "GetProgramId"},
+ {65000, &Info::AtmosphereGetProcessId, "AtmosphereGetProcessId"},
+ {65001, nullptr, "AtmosphereHasLaunchedProgram"},
+ {65002, nullptr, "AtmosphereGetProcessInfo"},
+ };
+ RegisterHandlers(functions);
+ }
private:
void GetProgramId(HLERequestContext& ctx) {
@@ -210,24 +218,27 @@ private:
rb.Push(ResultSuccess);
rb.Push(process->GetProcessId());
}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &Info::GetProgramId, "GetProgramId"},
- FunctionInfo{65000, &Info::AtmosphereGetProcessId, "AtmosphereGetProcessId"},
- FunctionInfo{65001, nullptr, "AtmosphereHasLaunchedProgram"},
- FunctionInfo{65002, nullptr, "AtmosphereGetProcessInfo"}
- );
};
class Shell final : public ServiceFramework<Shell> {
public:
- explicit Shell(Core::System& system_) : ServiceFramework{system_, "pm:shell"} {}
+ explicit Shell(Core::System& system_) : ServiceFramework{system_, "pm:shell"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "LaunchProgram"},
+ {1, nullptr, "TerminateProcess"},
+ {2, nullptr, "TerminateProgram"},
+ {3, nullptr, "GetProcessEventHandle"},
+ {4, nullptr, "GetProcessEventInfo"},
+ {5, nullptr, "NotifyBootFinished"},
+ {6, &Shell::GetApplicationProcessIdForShell, "GetApplicationProcessIdForShell"},
+ {7, nullptr, "BoostSystemMemoryResourceLimit"},
+ {8, nullptr, "BoostApplicationThreadResourceLimit"},
+ {9, nullptr, "GetBootFinishedEventHandle"},
+ };
+ // clang-format on
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
private:
@@ -236,19 +247,6 @@ private:
auto list = kernel.GetProcessList();
GetApplicationPidGeneric(system.Kernel(), ctx, list);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "LaunchProgram"},
- FunctionInfo{1, nullptr, "TerminateProcess"},
- FunctionInfo{2, nullptr, "TerminateProgram"},
- FunctionInfo{3, nullptr, "GetProcessEventHandle"},
- FunctionInfo{4, nullptr, "GetProcessEventInfo"},
- FunctionInfo{5, nullptr, "NotifyBootFinished"},
- FunctionInfo{6, &Shell::GetApplicationProcessIdForShell, "GetApplicationProcessIdForShell"},
- FunctionInfo{7, nullptr, "BoostSystemMemoryResourceLimit"},
- FunctionInfo{8, nullptr, "BoostApplicationThreadResourceLimit"},
- FunctionInfo{9, nullptr, "GetBootFinishedEventHandle"}
- );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/pm/pm.h b/src/core/hle/service/pm/pm.h
index 5d4a1a171c..da70cfc6b8 100644
--- a/src/core/hle/service/pm/pm.h
+++ b/src/core/hle/service/pm/pm.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/prepo/prepo.cpp b/src/core/hle/service/prepo/prepo.cpp
index a199c41d2c..e76c3ea93c 100644
--- a/src/core/hle/service/prepo/prepo.cpp
+++ b/src/core/hle/service/prepo/prepo.cpp
@@ -21,10 +21,45 @@ namespace Service::PlayReport {
class PlayReport final : public ServiceFramework<PlayReport> {
public:
- explicit PlayReport(const char* name, Core::System& system_) : ServiceFramework{system_, name} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit PlayReport(const char* name, Core::System& system_) : ServiceFramework{system_, name} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {10100, &PlayReport::SaveReport<Core::Reporter::PlayReportType::Old>, "SaveReportOld"},
+ {10101, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old>, "SaveReportWithUserOld"},
+ {10102, &PlayReport::SaveReport<Core::Reporter::PlayReportType::Old2>, "SaveReportOld2"},
+ {10103, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old2>, "SaveReportWithUserOld2"},
+ {10104, &PlayReport::SaveReport<Core::Reporter::PlayReportType::Old3>, "SaveReportOld3"},
+ {10105, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old3>, "SaveReportWithUserOld3"},
+ {10106, &PlayReport::SaveReport<Core::Reporter::PlayReportType::New>, "SaveReport"},
+ {10107, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::New>, "SaveReportWithUser"},
+ {10200, &PlayReport::RequestImmediateTransmission, "RequestImmediateTransmission"},
+ {10300, &PlayReport::GetTransmissionStatus, "GetTransmissionStatus"},
+ {10400, &PlayReport::GetSystemSessionId, "GetSystemSessionId"},
+ {20100, &PlayReport::SaveSystemReportOld, "SaveSystemReport"},
+ {20101, &PlayReport::SaveSystemReportWithUserOld, "SaveSystemReportWithUser"},
+ {20102, &PlayReport::SaveSystemReport, "SaveSystemReport"},
+ {20103, &PlayReport::SaveSystemReportWithUser, "SaveSystemReportWithUser"},
+ {20200, nullptr, "SetOperationMode"},
+ {30100, nullptr, "ClearStorage"},
+ {30200, nullptr, "ClearStatistics"},
+ {30300, nullptr, "GetStorageUsage"},
+ {30400, nullptr, "GetStatistics"},
+ {30401, nullptr, "GetThroughputHistory"},
+ {30500, nullptr, "GetLastUploadError"},
+ {30600, nullptr, "GetApplicationUploadSummary"},
+ {40100, nullptr, "IsUserAgreementCheckEnabled"},
+ {40101, nullptr, "SetUserAgreementCheckEnabled"},
+ {50100, nullptr, "ReadAllApplicationReportFiles"},
+ {90100, nullptr, "ReadAllReportFiles"},
+ {90101, nullptr, "Unknown90101"},
+ {90102, nullptr, "Unknown90102"},
+ {90200, nullptr, "GetStatistics"},
+ {90201, nullptr, "GetThroughputHistory"},
+ {90300, nullptr, "GetLastUploadError"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
private:
@@ -179,51 +214,21 @@ private:
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{10100, &PlayReport::SaveReport<Core::Reporter::PlayReportType::Old>, "SaveReportOld"},
- FunctionInfo{10101, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old>, "SaveReportWithUserOld"},
- FunctionInfo{10102, &PlayReport::SaveReport<Core::Reporter::PlayReportType::Old2>, "SaveReportOld2"},
- FunctionInfo{10103, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old2>, "SaveReportWithUserOld2"},
- FunctionInfo{10104, &PlayReport::SaveReport<Core::Reporter::PlayReportType::Old3>, "SaveReportOld3"},
- FunctionInfo{10105, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old3>, "SaveReportWithUserOld3"},
- FunctionInfo{10106, &PlayReport::SaveReport<Core::Reporter::PlayReportType::New>, "SaveReport"},
- FunctionInfo{10107, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::New>, "SaveReportWithUser"},
- FunctionInfo{10200, &PlayReport::RequestImmediateTransmission, "RequestImmediateTransmission"},
- FunctionInfo{10300, &PlayReport::GetTransmissionStatus, "GetTransmissionStatus"},
- FunctionInfo{10400, &PlayReport::GetSystemSessionId, "GetSystemSessionId"},
- FunctionInfo{20100, &PlayReport::SaveSystemReportOld, "SaveSystemReport"},
- FunctionInfo{20101, &PlayReport::SaveSystemReportWithUserOld, "SaveSystemReportWithUser"},
- FunctionInfo{20102, &PlayReport::SaveSystemReport, "SaveSystemReport"},
- FunctionInfo{20103, &PlayReport::SaveSystemReportWithUser, "SaveSystemReportWithUser"},
- FunctionInfo{20200, nullptr, "SetOperationMode"},
- FunctionInfo{30100, nullptr, "ClearStorage"},
- FunctionInfo{30200, nullptr, "ClearStatistics"},
- FunctionInfo{30300, nullptr, "GetStorageUsage"},
- FunctionInfo{30400, nullptr, "GetStatistics"},
- FunctionInfo{30401, nullptr, "GetThroughputHistory"},
- FunctionInfo{30500, nullptr, "GetLastUploadError"},
- FunctionInfo{30600, nullptr, "GetApplicationUploadSummary"},
- FunctionInfo{40100, nullptr, "IsUserAgreementCheckEnabled"},
- FunctionInfo{40101, nullptr, "SetUserAgreementCheckEnabled"},
- FunctionInfo{50100, nullptr, "ReadAllApplicationReportFiles"},
- FunctionInfo{90100, nullptr, "ReadAllReportFiles"},
- FunctionInfo{90101, nullptr, "Unknown90101"},
- FunctionInfo{90102, nullptr, "Unknown90102"},
- FunctionInfo{90200, nullptr, "GetStatistics"},
- FunctionInfo{90201, nullptr, "GetThroughputHistory"},
- FunctionInfo{90300, nullptr, "GetLastUploadError"}
- );
};
void LoopProcess(Core::System& system) {
auto server_manager = std::make_unique<ServerManager>(system);
- server_manager->RegisterNamedService("prepo:a", std::make_shared<PlayReport>("prepo:a", system));
- server_manager->RegisterNamedService("prepo:a2", std::make_shared<PlayReport>("prepo:a2", system));
- server_manager->RegisterNamedService("prepo:m", std::make_shared<PlayReport>("prepo:m", system));
- server_manager->RegisterNamedService("prepo:s", std::make_shared<PlayReport>("prepo:s", system));
- server_manager->RegisterNamedService("prepo:u", std::make_shared<PlayReport>("prepo:u", system));
+ server_manager->RegisterNamedService("prepo:a",
+ std::make_shared<PlayReport>("prepo:a", system));
+ server_manager->RegisterNamedService("prepo:a2",
+ std::make_shared<PlayReport>("prepo:a2", system));
+ server_manager->RegisterNamedService("prepo:m",
+ std::make_shared<PlayReport>("prepo:m", system));
+ server_manager->RegisterNamedService("prepo:s",
+ std::make_shared<PlayReport>("prepo:s", system));
+ server_manager->RegisterNamedService("prepo:u",
+ std::make_shared<PlayReport>("prepo:u", system));
ServerManager::RunServer(std::move(server_manager));
}
diff --git a/src/core/hle/service/prepo/prepo.h b/src/core/hle/service/prepo/prepo.h
index 2c2462f936..4caf752888 100644
--- a/src/core/hle/service/prepo/prepo.h
+++ b/src/core/hle/service/prepo/prepo.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/psc/ovln/ovln_types.h b/src/core/hle/service/psc/ovln/ovln_types.h
index f96b52fb49..d827f039fe 100644
--- a/src/core/hle/service/psc/ovln/ovln_types.h
+++ b/src/core/hle/service/psc/ovln/ovln_types.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
diff --git a/src/core/hle/service/psc/ovln/receiver.cpp b/src/core/hle/service/psc/ovln/receiver.cpp
new file mode 100644
index 0000000000..f43d705126
--- /dev/null
+++ b/src/core/hle/service/psc/ovln/receiver.cpp
@@ -0,0 +1,118 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/psc/ovln/receiver.h"
+#include "core/hle/service/cmif_serialization.h"
+
+namespace Service::PSC {
+
+IReceiver::IReceiver(Core::System& system_)
+ : ServiceFramework{system_, "IReceiver"}, service_context{system_, "IReceiver"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IReceiver::AddSource>, "AddSource"},
+ {1, D<&IReceiver::RemoveSource>, "RemoveSource"},
+ {2, D<&IReceiver::GetReceiveEventHandle>, "GetReceiveEventHandle"},
+ {3, D<&IReceiver::Receive>, "Receive"},
+ {4, D<&IReceiver::ReceiveWithTick>, "ReceiveWithTick"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+
+ receive_event = service_context.CreateEvent("IReceiver::ReceiveEvent");
+}
+
+IReceiver::~IReceiver() {
+ service_context.CloseEvent(receive_event);
+}
+
+Result IReceiver::AddSource(SourceName source_name) {
+ const std::string name = source_name.GetString();
+ LOG_INFO(Service_PSC, "called: source_name={}", name);
+
+ // Add source if it doesn't already exist
+ if (message_sources.find(name) == message_sources.end()) {
+ message_sources[name] = {};
+ }
+
+ R_SUCCEED();
+}
+
+Result IReceiver::RemoveSource(SourceName source_name) {
+ const std::string name = source_name.GetString();
+ LOG_INFO(Service_PSC, "called: source_name={}", name);
+
+ // Remove source if it exists
+ message_sources.erase(name);
+
+ R_SUCCEED();
+}
+
+Result IReceiver::GetReceiveEventHandle(OutCopyHandle<Kernel::KReadableEvent> out_event) {
+ LOG_INFO(Service_PSC, "called");
+ *out_event = &receive_event->GetReadableEvent();
+ R_SUCCEED();
+}
+
+Result IReceiver::Receive(Out<OverlayNotification> out_notification, Out<MessageFlags> out_flags) {
+ u64 tick;
+ return ReceiveWithTick(out_notification, out_flags, Out<u64>(&tick));
+}
+
+Result IReceiver::ReceiveWithTick(Out<OverlayNotification> out_notification,
+ Out<MessageFlags> out_flags, Out<u64> out_tick) {
+ LOG_DEBUG(Service_PSC, "called");
+
+ // Find the message with the lowest ID across all sources
+ const std::string* target_source = nullptr;
+ size_t target_index = 0;
+
+ for (const auto& [source_name, messages] : message_sources) {
+ if (!messages.empty()) {
+ if (target_source == nullptr) {
+ target_source = &source_name;
+ target_index = 0;
+ }
+ // Note: In the real implementation, we would track message IDs
+ // For now, just use FIFO order
+ }
+ }
+
+ if (target_source != nullptr) {
+ auto& messages = message_sources[*target_source];
+ *out_notification = messages[target_index].first;
+ *out_flags = messages[target_index].second;
+ *out_tick = 0; // TODO: Implement tick tracking
+
+ // Remove the message
+ messages.erase(messages.begin() + target_index);
+
+ // Clear event if no more messages
+ bool has_messages = false;
+ for (const auto& [_, msgs] : message_sources) {
+ if (!msgs.empty()) {
+ has_messages = true;
+ break;
+ }
+ }
+ if (!has_messages) {
+ receive_event->Clear(system.Kernel());
+ }
+
+ R_SUCCEED();
+ }
+
+ // No messages available
+ *out_notification = {};
+ *out_flags = {};
+ *out_tick = 0;
+
+ LOG_WARNING(Service_PSC, "No messages available");
+ R_THROW(ResultUnknown); // TODO: Use proper OvlnResult::NoMessages when available
+}
+
+} // namespace Service::PSC
diff --git a/src/core/hle/service/psc/ovln/receiver.h b/src/core/hle/service/psc/ovln/receiver.h
new file mode 100644
index 0000000000..5f73d1a66c
--- /dev/null
+++ b/src/core/hle/service/psc/ovln/receiver.h
@@ -0,0 +1,46 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include <map>
+#include <memory>
+#include <string>
+#include "core/hle/result.h"
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/kernel_helpers.h"
+#include "core/hle/service/service.h"
+#include "core/hle/service/psc/ovln/ovln_types.h"
+
+namespace Kernel {
+class KReadableEvent;
+}
+
+namespace Service::PSC {
+
+class IReceiver final : public ServiceFramework<IReceiver> {
+public:
+ explicit IReceiver(Core::System& system_);
+ ~IReceiver() override;
+
+ IReceiver(const IReceiver&) = delete;
+ IReceiver& operator=(const IReceiver&) = delete;
+
+private:
+ Result AddSource(SourceName source_name);
+ Result RemoveSource(SourceName source_name);
+ Result GetReceiveEventHandle(OutCopyHandle<Kernel::KReadableEvent> out_event);
+ Result Receive(Out<OverlayNotification> out_notification, Out<MessageFlags> out_flags);
+ Result ReceiveWithTick(Out<OverlayNotification> out_notification, Out<MessageFlags> out_flags,
+ Out<u64> out_tick);
+
+ KernelHelpers::ServiceContext service_context;
+ Kernel::KEvent* receive_event;
+
+ std::map<std::string, std::vector<std::pair<OverlayNotification, MessageFlags>>> message_sources;
+};
+
+} // namespace Service::PSC
diff --git a/src/core/hle/service/psc/ovln/receiver_service.cpp b/src/core/hle/service/psc/ovln/receiver_service.cpp
index 0df9d802b9..3b0b180725 100644
--- a/src/core/hle/service/psc/ovln/receiver_service.cpp
+++ b/src/core/hle/service/psc/ovln/receiver_service.cpp
@@ -5,126 +5,19 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#include "core/hle/service/cmif_serialization.h"
-#include "core/hle/service/psc/ovln/ovln_types.h"
+#include "core/hle/service/psc/ovln/receiver.h"
#include "core/hle/service/psc/ovln/receiver_service.h"
namespace Service::PSC {
-class IReceiver final : public ServiceFramework<IReceiver> {
-public:
- explicit IReceiver(Core::System& system_) : ServiceFramework{system_, "IReceiver"}, service_context{system_, "IReceiver"} {
- receive_event = service_context.CreateEvent("IReceiver::ReceiveEvent");
- }
-
- ~IReceiver() override {
- service_context.CloseEvent(receive_event);
- }
-
- Result AddSource(SourceName source_name) {
- const std::string name = source_name.GetString();
- LOG_INFO(Service_PSC, "called: source_name={}", name);
- // Add source if it doesn't already exist
- if (message_sources.find(name) == message_sources.end()) {
- message_sources[name] = {};
- }
- R_SUCCEED();
- }
-
- Result RemoveSource(SourceName source_name) {
- const std::string name = source_name.GetString();
- LOG_INFO(Service_PSC, "called: source_name={}", name);
- // Remove source if it exists
- message_sources.erase(name);
- R_SUCCEED();
- }
-
- Result GetReceiveEventHandle(OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_INFO(Service_PSC, "called");
- *out_event = &receive_event->GetReadableEvent();
- R_SUCCEED();
- }
-
- Result Receive(Out<OverlayNotification> out_notification, Out<MessageFlags> out_flags) {
- u64 tick;
- return ReceiveWithTick(out_notification, out_flags, Out<u64>(&tick));
- }
-
- Result ReceiveWithTick(Out<OverlayNotification> out_notification, Out<MessageFlags> out_flags, Out<u64> out_tick) {
- LOG_DEBUG(Service_PSC, "called");
-
- // Find the message with the lowest ID across all sources
- const std::string* target_source = nullptr;
- size_t target_index = 0;
-
- for (const auto& [source_name, messages] : message_sources) {
- if (!messages.empty()) {
- if (target_source == nullptr) {
- target_source = &source_name;
- target_index = 0;
- }
- // Note: In the real implementation, we would track message IDs
- // For now, just use FIFO order
- }
- }
-
- if (target_source != nullptr) {
- auto& messages = message_sources[*target_source];
- *out_notification = messages[target_index].first;
- *out_flags = messages[target_index].second;
- *out_tick = 0; // TODO: Implement tick tracking
-
- // Remove the message
- messages.erase(messages.begin() + target_index);
-
- // Clear event if no more messages
- bool has_messages = false;
- for (const auto& [_, msgs] : message_sources) {
- if (!msgs.empty()) {
- has_messages = true;
- break;
- }
- }
- if (!has_messages) {
- receive_event->Clear(system.Kernel());
- }
-
- R_SUCCEED();
- }
-
- // No messages available
- *out_notification = {};
- *out_flags = {};
- *out_tick = 0;
-
- LOG_WARNING(Service_PSC, "No messages available");
- R_THROW(ResultUnknown); // TODO: Use proper OvlnResult::NoMessages when available
- }
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IReceiver::AddSource>, "AddSource"},
- FunctionInfo{1, D<&IReceiver::RemoveSource>, "RemoveSource"},
- FunctionInfo{2, D<&IReceiver::GetReceiveEventHandle>, "GetReceiveEventHandle"},
- FunctionInfo{3, D<&IReceiver::Receive>, "Receive"},
- FunctionInfo{4, D<&IReceiver::ReceiveWithTick>, "ReceiveWithTick"}
- );
-
- KernelHelpers::ServiceContext service_context;
- Kernel::KEvent* receive_event;
-
- std::map<std::string, std::vector<std::pair<OverlayNotification, MessageFlags>>> message_sources;
-};
-
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IReceiverService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IReceiverService::OpenReceiver>, "OpenReceiver"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IReceiverService::IReceiverService(Core::System& system_) : ServiceFramework{system_, "ovln:rcv"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IReceiverService::OpenReceiver>, "OpenReceiver"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IReceiverService::~IReceiverService() = default;
diff --git a/src/core/hle/service/psc/ovln/receiver_service.h b/src/core/hle/service/psc/ovln/receiver_service.h
index bd053cd50c..a7a9b012e8 100644
--- a/src/core/hle/service/psc/ovln/receiver_service.h
+++ b/src/core/hle/service/psc/ovln/receiver_service.h
@@ -20,8 +20,6 @@ public:
private:
Result OpenReceiver(Out<SharedPointer<IReceiver>> out_receiver);
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::PSC
diff --git a/src/core/hle/service/psc/ovln/sender.cpp b/src/core/hle/service/psc/ovln/sender.cpp
new file mode 100644
index 0000000000..dffcd4bc36
--- /dev/null
+++ b/src/core/hle/service/psc/ovln/sender.cpp
@@ -0,0 +1,35 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/psc/ovln/sender.h"
+
+namespace Service::PSC {
+
+ISender::ISender(Core::System& system_) : ServiceFramework{system_, "ISender"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&ISender::Send>, "Send"},
+ {1, nullptr, "GetUnreceivedMessageCount"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
+ISender::~ISender() = default;
+
+Result ISender::Send(const OverlayNotification& notification, MessageFlags flags) {
+ std::string data;
+ for (const auto m : notification) {
+ data += fmt::format("{:016X} ", m);
+ }
+
+ LOG_WARNING(Service_PSC, "(STUBBED) called, flags={} notification={}", flags.raw, data);
+ R_SUCCEED();
+}
+
+} // namespace Service::PSC
diff --git a/src/core/hle/service/psc/ovln/sender.h b/src/core/hle/service/psc/ovln/sender.h
new file mode 100644
index 0000000000..9b0fe786bd
--- /dev/null
+++ b/src/core/hle/service/psc/ovln/sender.h
@@ -0,0 +1,24 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/psc/ovln/ovln_types.h"
+#include "core/hle/service/service.h"
+
+namespace Service::PSC {
+
+class ISender final : public ServiceFramework<ISender> {
+public:
+ explicit ISender(Core::System& system_);
+ ~ISender() override;
+
+private:
+ Result Send(const OverlayNotification& notification, MessageFlags flags);
+};
+
+} // namespace Service::PSC
diff --git a/src/core/hle/service/psc/ovln/sender_service.cpp b/src/core/hle/service/psc/ovln/sender_service.cpp
index 5a36f1e1ec..8f80a5c461 100644
--- a/src/core/hle/service/psc/ovln/sender_service.cpp
+++ b/src/core/hle/service/psc/ovln/sender_service.cpp
@@ -5,43 +5,19 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#include "core/hle/service/cmif_serialization.h"
-#include "core/hle/service/psc/ovln/ovln_types.h"
+#include "core/hle/service/psc/ovln/sender.h"
#include "core/hle/service/psc/ovln/sender_service.h"
namespace Service::PSC {
-class ISender final : public ServiceFramework<ISender> {
-public:
- explicit ISender(Core::System& system_) : ServiceFramework{system_, "ISender"} {}
- ~ISender() override = default;
-
- Result Send(const OverlayNotification& notification, MessageFlags flags) {
- std::string data;
- for (const auto m : notification) {
- data += fmt::format("{:016X} ", m);
- }
-
- LOG_WARNING(Service_PSC, "(STUBBED) called, flags={} notification={}", flags.raw, data);
- R_SUCCEED();
- }
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&ISender::Send>, "Send"},
- FunctionInfo{1, nullptr, "GetUnreceivedMessageCount"}
- );
-};
-
-std::optional<ServiceFrameworkBase::FunctionInfoBase> ISenderService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&ISenderService::OpenSender>, "OpenSender"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
ISenderService::ISenderService(Core::System& system_) : ServiceFramework{system_, "ovln:snd"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&ISenderService::OpenSender>, "OpenSender"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
ISenderService::~ISenderService() = default;
diff --git a/src/core/hle/service/psc/ovln/sender_service.h b/src/core/hle/service/psc/ovln/sender_service.h
index 90a9a33872..8176e85e23 100644
--- a/src/core/hle/service/psc/ovln/sender_service.h
+++ b/src/core/hle/service/psc/ovln/sender_service.h
@@ -19,9 +19,8 @@ public:
~ISenderService() override;
private:
- Result OpenSender(Out<SharedPointer<ISender>> out_sender, u32 sender_id, std::array<u64, 2> data);
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
+ Result OpenSender(Out<SharedPointer<ISender>> out_sender, u32 sender_id,
+ std::array<u64, 2> data);
};
} // namespace Service::PSC
diff --git a/src/core/hle/service/psc/pm_control.cpp b/src/core/hle/service/psc/pm_control.cpp
new file mode 100644
index 0000000000..fc5852f863
--- /dev/null
+++ b/src/core/hle/service/psc/pm_control.cpp
@@ -0,0 +1,31 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/psc/pm_control.h"
+
+namespace Service::PSC {
+
+IPmControl::IPmControl(Core::System& system_) : ServiceFramework{system_, "psc:c"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "Initialize"},
+ {1, nullptr, "DispatchRequest"},
+ {2, nullptr, "GetResult"},
+ {3, nullptr, "GetState"},
+ {4, nullptr, "Cancel"},
+ {5, nullptr, "PrintModuleInformation"},
+ {6, nullptr, "GetModuleInformation"},
+ {10, nullptr, "AcquireStateLock"},
+ {11, nullptr, "HasStateLock"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
+IPmControl::~IPmControl() = default;
+
+} // namespace Service::PSC
diff --git a/src/core/hle/service/psc/pm_control.h b/src/core/hle/service/psc/pm_control.h
new file mode 100644
index 0000000000..7967f7ab18
--- /dev/null
+++ b/src/core/hle/service/psc/pm_control.h
@@ -0,0 +1,19 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/service.h"
+
+namespace Service::PSC {
+
+class IPmControl final : public ServiceFramework<IPmControl> {
+public:
+ explicit IPmControl(Core::System& system_);
+ ~IPmControl() override;
+};
+
+} // namespace Service::PSC
diff --git a/src/core/hle/service/psc/pm_module.cpp b/src/core/hle/service/psc/pm_module.cpp
new file mode 100644
index 0000000000..38ca36ab8f
--- /dev/null
+++ b/src/core/hle/service/psc/pm_module.cpp
@@ -0,0 +1,27 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/psc/pm_module.h"
+
+namespace Service::PSC {
+
+IPmModule::IPmModule(Core::System& system_) : ServiceFramework{system_, "IPmModule"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "Initialize"},
+ {1, nullptr, "GetRequest"},
+ {2, nullptr, "Acknowledge"},
+ {3, nullptr, "Finalize"},
+ {4, nullptr, "AcknowledgeEx"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
+IPmModule::~IPmModule() = default;
+
+} // namespace Service::PSC
diff --git a/src/core/hle/service/psc/pm_module.h b/src/core/hle/service/psc/pm_module.h
new file mode 100644
index 0000000000..dac8fcff2a
--- /dev/null
+++ b/src/core/hle/service/psc/pm_module.h
@@ -0,0 +1,19 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/service.h"
+
+namespace Service::PSC {
+
+class IPmModule final : public ServiceFramework<IPmModule> {
+public:
+ explicit IPmModule(Core::System& system_);
+ ~IPmModule() override;
+};
+
+} // namespace Service::PSC
diff --git a/src/core/hle/service/psc/pm_service.cpp b/src/core/hle/service/psc/pm_service.cpp
new file mode 100644
index 0000000000..d1803bdf48
--- /dev/null
+++ b/src/core/hle/service/psc/pm_service.cpp
@@ -0,0 +1,31 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/psc/pm_module.h"
+#include "core/hle/service/psc/pm_service.h"
+
+namespace Service::PSC {
+
+IPmService::IPmService(Core::System& system_) : ServiceFramework{system_, "psc:m"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IPmService::GetPmModule>, "GetPmModule"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
+IPmService::~IPmService() = default;
+
+Result IPmService::GetPmModule(Out<SharedPointer<IPmModule>> out_module) {
+ LOG_DEBUG(Service_PSC, "called");
+ *out_module = std::make_shared<IPmModule>(system);
+ R_SUCCEED();
+}
+
+} // namespace Service::PSC
diff --git a/src/core/hle/service/psc/pm_service.h b/src/core/hle/service/psc/pm_service.h
new file mode 100644
index 0000000000..721a0602c9
--- /dev/null
+++ b/src/core/hle/service/psc/pm_service.h
@@ -0,0 +1,25 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/service.h"
+
+namespace Service::PSC {
+
+class IPmModule;
+
+class IPmService final : public ServiceFramework<IPmService> {
+public:
+ explicit IPmService(Core::System& system_);
+ ~IPmService() override;
+
+private:
+ Result GetPmModule(Out<SharedPointer<IPmModule>> out_module);
+};
+
+} // namespace Service::PSC
diff --git a/src/core/hle/service/psc/psc.cpp b/src/core/hle/service/psc/psc.cpp
index 553c4f63a4..31fb9f0117 100644
--- a/src/core/hle/service/psc/psc.cpp
+++ b/src/core/hle/service/psc/psc.cpp
@@ -6,157 +6,100 @@
#include "core/hle/service/psc/ovln/receiver_service.h"
#include "core/hle/service/psc/ovln/sender_service.h"
+#include "core/hle/service/psc/pm_control.h"
+#include "core/hle/service/psc/pm_service.h"
#include "core/hle/service/psc/psc.h"
#include "core/hle/service/psc/time/manager.h"
#include "core/hle/service/psc/time/power_state_service.h"
#include "core/hle/service/psc/time/service_manager.h"
#include "core/hle/service/psc/time/static.h"
#include "core/hle/service/service.h"
-#include "core/hle/service/cmif_serialization.h"
namespace Service::PSC {
class PSC_L final : public ServiceFramework<PSC_L> {
public:
- explicit PSC_L(Core::System& system_) : ServiceFramework{system_, "psc:l"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "Initialize_3"},
- FunctionInfo{1, nullptr, "Lock"},
- FunctionInfo{2, nullptr, "Unlock"},
- FunctionInfo{3, nullptr, "IsLocked"},
- FunctionInfo{4, nullptr, "GetRelatedState"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit PSC_L(Core::System& system_) : ServiceFramework{system_, "psc:l"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "Initialize_3"},
+ {1, nullptr, "Lock"},
+ {2, nullptr, "Unlock"},
+ {3, nullptr, "IsLocked"},
+ {4, nullptr, "GetRelatedState"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class INS_R final : public ServiceFramework<INS_R> {
public:
- explicit INS_R(Core::System& system_) : ServiceFramework{system_, "ins:r"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetInputSourceState"},
- FunctionInfo{1, nullptr, "GetTriggerTargetEvent"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit INS_R(Core::System& system_) : ServiceFramework{system_, "ins:r"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetInputSourceState"},
+ {1, nullptr, "GetTriggerTargetEvent"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class INS_S final : public ServiceFramework<INS_S> {
public:
- explicit INS_S(Core::System& system_) : ServiceFramework{system_, "ins:s"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetNotifyEvent"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit INS_S(Core::System& system_) : ServiceFramework{system_, "ins:s"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetNotifyEvent"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class HSHL_SYS final : public ServiceFramework<HSHL_SYS> {
public:
- explicit HSHL_SYS(Core::System& system_) : ServiceFramework{system_, "hshl:sys"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetBatteryPercentage"},
- FunctionInfo{1, nullptr, "GetChargerType"},
- FunctionInfo{2, nullptr, "OpenChargeSession"},
- FunctionInfo{3, nullptr, "GetRawBatteryPercentage"},
- FunctionInfo{4, nullptr, "GetBatteryVoltageLevel"},
- FunctionInfo{5, nullptr, "OpenThermalSession"},
- FunctionInfo{6, nullptr, "GetAbnormalTemperatureSet"},
- FunctionInfo{7, nullptr, "OpenClockSession"},
- FunctionInfo{8, nullptr, "GetClockRate"},
- FunctionInfo{9, nullptr, "OpenBridgeSession"},
- FunctionInfo{10, nullptr, "GetBridgePowerSupply"},
- FunctionInfo{11, nullptr, "OpenVsysVoltageSession"},
- FunctionInfo{12, nullptr, "GetIsBatteryEnoughForFullAwake"},
- FunctionInfo{13, nullptr, "GetIsCharging"},
- FunctionInfo{14, nullptr, "Cmd14"},
- FunctionInfo{15, nullptr, "Cmd15"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit HSHL_SYS(Core::System& system_) : ServiceFramework{system_, "hshl:sys"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetBatteryPercentage"},
+ {1, nullptr, "GetChargerType"},
+ {2, nullptr, "OpenChargeSession"},
+ {3, nullptr, "GetRawBatteryPercentage"},
+ {4, nullptr, "GetBatteryVoltageLevel"},
+ {5, nullptr, "OpenThermalSession"},
+ {6, nullptr, "GetAbnormalTemperatureSet"},
+ {7, nullptr, "OpenClockSession"},
+ {8, nullptr, "GetClockRate"},
+ {9, nullptr, "OpenBridgeSession"},
+ {10, nullptr, "GetBridgePowerSupply"},
+ {11, nullptr, "OpenVsysVoltageSession"},
+ {12, nullptr, "GetIsBatteryEnoughForFullAwake"},
+ {13, nullptr, "GetIsCharging"},
+ {14, nullptr, "Cmd14"},
+ {15, nullptr, "Cmd15"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class HSHL_SET final : public ServiceFramework<HSHL_SET> {
public:
- explicit HSHL_SET(Core::System& system_) : ServiceFramework{system_, "hshl:set"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "OpenChargeSession_2"},
- FunctionInfo{1, nullptr, "OpenThermalSession_2"},
- FunctionInfo{2, nullptr, "SetClockRate"},
- FunctionInfo{3, nullptr, "SetBridgePowerSupply"},
- FunctionInfo{4, nullptr, "Cmd4"},
- FunctionInfo{5, nullptr, "Cmd5"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
-};
-
-class IPmModule final : public ServiceFramework<IPmModule> {
-public:
- explicit IPmModule(Core::System& system_) : ServiceFramework{system_, "IPmModule"} {}
- ~IPmModule() override = default;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "Initialize"},
- FunctionInfo{1, nullptr, "GetRequest"},
- FunctionInfo{2, nullptr, "Acknowledge"},
- FunctionInfo{3, nullptr, "Finalize"},
- FunctionInfo{4, nullptr, "AcknowledgeEx"}
- );
-};
-
-class IPmService final : public ServiceFramework<IPmService> {
-public:
- explicit IPmService(Core::System& system_) : ServiceFramework{system_, "psc:m"} {}
- ~IPmService() override = default;
-
-private:
- Result GetPmModule(Out<SharedPointer<IPmModule>> out_module) {
- LOG_DEBUG(Service_PSC, "called");
- *out_module = std::make_shared<IPmModule>(system);
- R_SUCCEED();
- }
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IPmService::GetPmModule>, "GetPmModule"}
- );
-};
-
-class IPmControl final : public ServiceFramework<IPmControl> {
-public:
- explicit IPmControl(Core::System& system_) : ServiceFramework{system_, "psc:c"} {}
- ~IPmControl() override = default;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit HSHL_SET(Core::System& system_) : ServiceFramework{system_, "hshl:set"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "OpenChargeSession_2"},
+ {1, nullptr, "OpenThermalSession_2"},
+ {2, nullptr, "SetClockRate"},
+ {3, nullptr, "SetBridgePowerSupply"},
+ {4, nullptr, "Cmd4"},
+ {5, nullptr, "Cmd5"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "Initialize"},
- FunctionInfo{1, nullptr, "DispatchRequest"},
- FunctionInfo{2, nullptr, "GetResult"},
- FunctionInfo{3, nullptr, "GetState"},
- FunctionInfo{4, nullptr, "Cancel"},
- FunctionInfo{5, nullptr, "PrintModuleInformation"},
- FunctionInfo{6, nullptr, "GetModuleInformation"},
- FunctionInfo{10, nullptr, "AcquireStateLock"},
- FunctionInfo{11, nullptr, "HasStateLock"}
- );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/psc/psc.h b/src/core/hle/service/psc/psc.h
index c83d07ca80..d89e6854cc 100644
--- a/src/core/hle/service/psc/psc.h
+++ b/src/core/hle/service/psc/psc.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/psc/time/alarms.cpp b/src/core/hle/service/psc/time/alarms.cpp
index c9070896b3..17a795c4c5 100644
--- a/src/core/hle/service/psc/time/alarms.cpp
+++ b/src/core/hle/service/psc/time/alarms.cpp
@@ -33,7 +33,8 @@ Alarm::~Alarm() {
}
Alarms::Alarms(Core::System& system, StandardSteadyClockCore& steady_clock, PowerStateRequestManager& power_state_request_manager)
- : m_ctx{system, "Psc:Alarms"}
+ : m_system{system}
+ , m_ctx{system, "Psc:Alarms"}
, m_steady_clock{steady_clock}
, m_power_state_request_manager{power_state_request_manager}
, m_event{m_ctx.CreateEvent("Psc:Alarms:Event")}
@@ -135,7 +136,15 @@ Result Alarms::UpdateClosestAndSignal(Kernel::KernelCore& kernel) {
IAlarmService::IAlarmService(Core::System& system_, std::shared_ptr<TimeManager> manager)
: ServiceFramework{system_, "time:al"}
, m_alarms{manager->m_alarms}
-{}
+{
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &IAlarmService::CreateWakeupAlarm, "CreateWakeupAlarm"},
+ {1, &IAlarmService::CreateBackgroundTaskAlarm, "CreateBackgroundTaskAlarm"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
+}
void IAlarmService::CreateWakeupAlarm(HLERequestContext& ctx) {
LOG_DEBUG(Service_Time, "called.");
@@ -156,6 +165,17 @@ void IAlarmService::CreateBackgroundTaskAlarm(HLERequestContext& ctx) {
ISteadyClockAlarm::ISteadyClockAlarm(Core::System& system_, Alarms& alarms, AlarmType type)
: ServiceFramework{system_, "ISteadyClockAlarm"}, m_ctx{system, "Psc:ISteadyClockAlarm"},
m_alarms{alarms}, m_alarm{system, m_ctx, type} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &ISteadyClockAlarm::GetAlarmEvent, "GetAlarmEvent"},
+ {1, &ISteadyClockAlarm::Enable, "Enable"},
+ {2, &ISteadyClockAlarm::Disable, "Disable"},
+ {3, &ISteadyClockAlarm::IsEnabled, "IsEnabled"},
+ {10, nullptr, "CreateWakeLock"},
+ {11, nullptr, "DestroyWakeLock"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
void ISteadyClockAlarm::GetAlarmEvent(HLERequestContext& ctx) {
diff --git a/src/core/hle/service/psc/time/alarms.h b/src/core/hle/service/psc/time/alarms.h
index 6d916ca198..0a2fa7fac5 100644
--- a/src/core/hle/service/psc/time/alarms.h
+++ b/src/core/hle/service/psc/time/alarms.h
@@ -95,6 +95,7 @@ private:
void Erase(Kernel::KernelCore& kernel, Alarm& alarm);
Result UpdateClosestAndSignal(Kernel::KernelCore& kernel);
+ Core::System& m_system;
KernelHelpers::ServiceContext m_ctx;
StandardSteadyClockCore& m_steady_clock;
@@ -113,14 +114,6 @@ public:
private:
void CreateWakeupAlarm(HLERequestContext& ctx);
void CreateBackgroundTaskAlarm(HLERequestContext& ctx);
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &IAlarmService::CreateWakeupAlarm, "CreateWakeupAlarm"},
- FunctionInfo{1, &IAlarmService::CreateBackgroundTaskAlarm, "CreateBackgroundTaskAlarm"}
- );
Alarms& m_alarms;
};
@@ -135,18 +128,8 @@ private:
void Disable(HLERequestContext& ctx);
void IsEnabled(HLERequestContext& ctx);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &ISteadyClockAlarm::GetAlarmEvent, "GetAlarmEvent"},
- FunctionInfo{1, &ISteadyClockAlarm::Enable, "Enable"},
- FunctionInfo{2, &ISteadyClockAlarm::Disable, "Disable"},
- FunctionInfo{3, &ISteadyClockAlarm::IsEnabled, "IsEnabled"},
- FunctionInfo{10, nullptr, "CreateWakeLock"},
- FunctionInfo{11, nullptr, "DestroyWakeLock"}
- );
KernelHelpers::ServiceContext m_ctx;
+
Alarms& m_alarms;
Alarm m_alarm;
};
diff --git a/src/core/hle/service/psc/time/clocks/ephemeral_network_system_clock_core.h b/src/core/hle/service/psc/time/clocks/ephemeral_network_system_clock_core.h
index 0a68867d94..0abe200206 100644
--- a/src/core/hle/service/psc/time/clocks/ephemeral_network_system_clock_core.h
+++ b/src/core/hle/service/psc/time/clocks/ephemeral_network_system_clock_core.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.cpp b/src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.cpp
index 6a74d45946..d0e596c504 100644
--- a/src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.cpp
+++ b/src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.h b/src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.h
index 5722d8e965..832c6907a0 100644
--- a/src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.h
+++ b/src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.cpp b/src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.cpp
index 6938d369fe..b3143ead71 100644
--- a/src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.cpp
+++ b/src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.h b/src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.h
index bfafc7d71f..47a411e811 100644
--- a/src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.h
+++ b/src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/psc/time/clocks/standard_steady_clock_core.cpp b/src/core/hle/service/psc/time/clocks/standard_steady_clock_core.cpp
index 7a72d7aa25..8fc44fd691 100644
--- a/src/core/hle/service/psc/time/clocks/standard_steady_clock_core.cpp
+++ b/src/core/hle/service/psc/time/clocks/standard_steady_clock_core.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/psc/time/clocks/standard_steady_clock_core.h b/src/core/hle/service/psc/time/clocks/standard_steady_clock_core.h
index bbf98fcd5c..342d6385fd 100644
--- a/src/core/hle/service/psc/time/clocks/standard_steady_clock_core.h
+++ b/src/core/hle/service/psc/time/clocks/standard_steady_clock_core.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/psc/time/clocks/standard_user_system_clock_core.h b/src/core/hle/service/psc/time/clocks/standard_user_system_clock_core.h
index 32b8bc3bcd..14c8e613f4 100644
--- a/src/core/hle/service/psc/time/clocks/standard_user_system_clock_core.h
+++ b/src/core/hle/service/psc/time/clocks/standard_user_system_clock_core.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/psc/time/clocks/steady_clock_core.h b/src/core/hle/service/psc/time/clocks/steady_clock_core.h
index f933cc15f8..31be5e25ad 100644
--- a/src/core/hle/service/psc/time/clocks/steady_clock_core.h
+++ b/src/core/hle/service/psc/time/clocks/steady_clock_core.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/psc/time/clocks/system_clock_core.cpp b/src/core/hle/service/psc/time/clocks/system_clock_core.cpp
index 2b7466831d..7ca5e8515e 100644
--- a/src/core/hle/service/psc/time/clocks/system_clock_core.cpp
+++ b/src/core/hle/service/psc/time/clocks/system_clock_core.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/psc/time/clocks/system_clock_core.h b/src/core/hle/service/psc/time/clocks/system_clock_core.h
index 0b928432fb..d95bab5191 100644
--- a/src/core/hle/service/psc/time/clocks/system_clock_core.h
+++ b/src/core/hle/service/psc/time/clocks/system_clock_core.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.cpp b/src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.cpp
index 22da1fbccc..8666df57f1 100644
--- a/src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.cpp
+++ b/src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.h b/src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.h
index a7bea86a25..62890cd5ca 100644
--- a/src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.h
+++ b/src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/psc/time/common.cpp b/src/core/hle/service/psc/time/common.cpp
index a6d9f02ca3..dce2249ea1 100644
--- a/src/core/hle/service/psc/time/common.cpp
+++ b/src/core/hle/service/psc/time/common.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/psc/time/manager.h b/src/core/hle/service/psc/time/manager.h
index 2cb8b58a2b..7c771d25f5 100644
--- a/src/core/hle/service/psc/time/manager.h
+++ b/src/core/hle/service/psc/time/manager.h
@@ -26,20 +26,20 @@ namespace Service::PSC::Time {
class TimeManager {
public:
explicit TimeManager(Core::System& system)
- : m_standard_steady_clock{system}
- , m_tick_based_steady_clock{system}
- , m_standard_local_system_clock{m_standard_steady_clock}
- , m_standard_network_system_clock{m_standard_steady_clock}
- , m_standard_user_system_clock{system, m_standard_local_system_clock
- , m_standard_network_system_clock}
- , m_ephemeral_network_clock{m_tick_based_steady_clock}
- , m_shared_memory{system}
- , m_power_state_request_manager{system}
- , m_alarms{system, m_standard_steady_clock, m_power_state_request_manager}
- , m_local_system_clock_context_writer{system, m_shared_memory}
- , m_network_system_clock_context_writer{system, m_shared_memory, m_standard_user_system_clock}
- , m_ephemeral_network_clock_context_writer{system}
- {}
+ : m_system{system}, m_standard_steady_clock{system}, m_tick_based_steady_clock{m_system},
+ m_standard_local_system_clock{m_standard_steady_clock},
+ m_standard_network_system_clock{m_standard_steady_clock},
+ m_standard_user_system_clock{m_system, m_standard_local_system_clock,
+ m_standard_network_system_clock},
+ m_ephemeral_network_clock{m_tick_based_steady_clock}, m_shared_memory{m_system},
+ m_power_state_request_manager{m_system}, m_alarms{m_system, m_standard_steady_clock,
+ m_power_state_request_manager},
+ m_local_system_clock_context_writer{m_system, m_shared_memory},
+ m_network_system_clock_context_writer{m_system, m_shared_memory,
+ m_standard_user_system_clock},
+ m_ephemeral_network_clock_context_writer{m_system} {}
+
+ Core::System& m_system;
StandardSteadyClockCore m_standard_steady_clock;
TickBasedSteadyClockCore m_tick_based_steady_clock;
diff --git a/src/core/hle/service/psc/time/power_state_request_manager.h b/src/core/hle/service/psc/time/power_state_request_manager.h
index 30a0c947d6..325f73913b 100644
--- a/src/core/hle/service/psc/time/power_state_request_manager.h
+++ b/src/core/hle/service/psc/time/power_state_request_manager.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/psc/time/power_state_service.cpp b/src/core/hle/service/psc/time/power_state_service.cpp
index 795aeb94a8..39af16b6f1 100644
--- a/src/core/hle/service/psc/time/power_state_service.cpp
+++ b/src/core/hle/service/psc/time/power_state_service.cpp
@@ -9,19 +9,20 @@
namespace Service::PSC::Time {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IPowerStateRequestHandler::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&IPowerStateRequestHandler::GetPowerStateRequestEventReadableHandle>, "GetPowerStateRequestEventReadableHandle"},
- FunctionInfo{1, D<&IPowerStateRequestHandler::GetAndClearPowerStateRequest>, "GetAndClearPowerStateRequest"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IPowerStateRequestHandler::IPowerStateRequestHandler(
Core::System& system_, PowerStateRequestManager& power_state_request_manager)
: ServiceFramework{system_, "time:p"}
, m_power_state_request_manager{power_state_request_manager}
-{}
+{
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&IPowerStateRequestHandler::GetPowerStateRequestEventReadableHandle>, "GetPowerStateRequestEventReadableHandle"},
+ {1, D<&IPowerStateRequestHandler::GetAndClearPowerStateRequest>, "GetAndClearPowerStateRequest"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
Result IPowerStateRequestHandler::GetPowerStateRequestEventReadableHandle(
OutCopyHandle<Kernel::KReadableEvent> out_event) {
diff --git a/src/core/hle/service/psc/time/power_state_service.h b/src/core/hle/service/psc/time/power_state_service.h
index 14d9c1a77a..81b3adf234 100644
--- a/src/core/hle/service/psc/time/power_state_service.h
+++ b/src/core/hle/service/psc/time/power_state_service.h
@@ -27,7 +27,6 @@ public:
Result GetAndClearPowerStateRequest(Out<bool> out_cleared, Out<u32> out_priority);
private:
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
PowerStateRequestManager& m_power_state_request_manager;
};
diff --git a/src/core/hle/service/psc/time/service_manager.cpp b/src/core/hle/service/psc/time/service_manager.cpp
index be25ee9a70..e9f1407e4d 100644
--- a/src/core/hle/service/psc/time/service_manager.cpp
+++ b/src/core/hle/service/psc/time/service_manager.cpp
@@ -13,30 +13,6 @@
namespace Service::PSC::Time {
- std::optional<ServiceFrameworkBase::FunctionInfoBase> ServiceManager::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&ServiceManager::GetStaticServiceAsUser>, "GetStaticServiceAsUser"},
- FunctionInfo{5, D<&ServiceManager::GetStaticServiceAsAdmin>, "GetStaticServiceAsAdmin"},
- FunctionInfo{6, D<&ServiceManager::GetStaticServiceAsRepair>, "GetStaticServiceAsRepair"},
- FunctionInfo{9, D<&ServiceManager::GetStaticServiceAsServiceManager>, "GetStaticServiceAsServiceManager"},
- FunctionInfo{10, D<&ServiceManager::SetupStandardSteadyClockCore>, "SetupStandardSteadyClockCore"},
- FunctionInfo{11, D<&ServiceManager::SetupStandardLocalSystemClockCore>, "SetupStandardLocalSystemClockCore"},
- FunctionInfo{12, D<&ServiceManager::SetupStandardNetworkSystemClockCore>, "SetupStandardNetworkSystemClockCore"},
- FunctionInfo{13, D<&ServiceManager::SetupStandardUserSystemClockCore>, "SetupStandardUserSystemClockCore"},
- FunctionInfo{14, D<&ServiceManager::SetupTimeZoneServiceCore>, "SetupTimeZoneServiceCore"},
- FunctionInfo{15, D<&ServiceManager::SetupEphemeralNetworkSystemClockCore>, "SetupEphemeralNetworkSystemClockCore"},
- FunctionInfo{50, D<&ServiceManager::GetStandardLocalClockOperationEvent>, "GetStandardLocalClockOperationEvent"},
- FunctionInfo{51, D<&ServiceManager::GetStandardNetworkClockOperationEventForServiceManager>, "GetStandardNetworkClockOperationEventForServiceManager"},
- FunctionInfo{52, D<&ServiceManager::GetEphemeralNetworkClockOperationEventForServiceManager>, "GetEphemeralNetworkClockOperationEventForServiceManager"},
- FunctionInfo{60, D<&ServiceManager::GetStandardUserSystemClockAutomaticCorrectionUpdatedEvent>, "GetStandardUserSystemClockAutomaticCorrectionUpdatedEvent"},
- FunctionInfo{100, D<&ServiceManager::SetStandardSteadyClockBaseTime>, "SetStandardSteadyClockBaseTime"},
- FunctionInfo{200, D<&ServiceManager::GetClosestAlarmUpdatedEvent>, "GetClosestAlarmUpdatedEvent"},
- FunctionInfo{201, D<&ServiceManager::CheckAndSignalAlarms>, "CheckAndSignalAlarms"},
- FunctionInfo{202, D<&ServiceManager::GetClosestAlarmInfo>, "GetClosestAlarmInfo "}
- );
- return HandlerTableGenerateWithFind(key, functions);
- }
-
ServiceManager::ServiceManager(Core::System& system_, std::shared_ptr<TimeManager> time,
ServerManager* server_manager)
: ServiceFramework{system_, "time:m"}, m_time{std::move(time)},
@@ -51,6 +27,30 @@ ServiceManager::ServiceManager(Core::System& system_, std::shared_ptr<TimeManage
m_network_system_context_writer{m_time->m_network_system_clock_context_writer},
m_ephemeral_system_context_writer{m_time->m_ephemeral_network_clock_context_writer},
m_local_operation{system_}, m_network_operation{system_}, m_ephemeral_operation{system_} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&ServiceManager::GetStaticServiceAsUser>, "GetStaticServiceAsUser"},
+ {5, D<&ServiceManager::GetStaticServiceAsAdmin>, "GetStaticServiceAsAdmin"},
+ {6, D<&ServiceManager::GetStaticServiceAsRepair>, "GetStaticServiceAsRepair"},
+ {9, D<&ServiceManager::GetStaticServiceAsServiceManager>, "GetStaticServiceAsServiceManager"},
+ {10, D<&ServiceManager::SetupStandardSteadyClockCore>, "SetupStandardSteadyClockCore"},
+ {11, D<&ServiceManager::SetupStandardLocalSystemClockCore>, "SetupStandardLocalSystemClockCore"},
+ {12, D<&ServiceManager::SetupStandardNetworkSystemClockCore>, "SetupStandardNetworkSystemClockCore"},
+ {13, D<&ServiceManager::SetupStandardUserSystemClockCore>, "SetupStandardUserSystemClockCore"},
+ {14, D<&ServiceManager::SetupTimeZoneServiceCore>, "SetupTimeZoneServiceCore"},
+ {15, D<&ServiceManager::SetupEphemeralNetworkSystemClockCore>, "SetupEphemeralNetworkSystemClockCore"},
+ {50, D<&ServiceManager::GetStandardLocalClockOperationEvent>, "GetStandardLocalClockOperationEvent"},
+ {51, D<&ServiceManager::GetStandardNetworkClockOperationEventForServiceManager>, "GetStandardNetworkClockOperationEventForServiceManager"},
+ {52, D<&ServiceManager::GetEphemeralNetworkClockOperationEventForServiceManager>, "GetEphemeralNetworkClockOperationEventForServiceManager"},
+ {60, D<&ServiceManager::GetStandardUserSystemClockAutomaticCorrectionUpdatedEvent>, "GetStandardUserSystemClockAutomaticCorrectionUpdatedEvent"},
+ {100, D<&ServiceManager::SetStandardSteadyClockBaseTime>, "SetStandardSteadyClockBaseTime"},
+ {200, D<&ServiceManager::GetClosestAlarmUpdatedEvent>, "GetClosestAlarmUpdatedEvent"},
+ {201, D<&ServiceManager::CheckAndSignalAlarms>, "CheckAndSignalAlarms"},
+ {202, D<&ServiceManager::GetClosestAlarmInfo>, "GetClosestAlarmInfo "},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
+
m_local_system_context_writer.Link(m_local_operation);
m_network_system_context_writer.Link(m_network_operation);
m_ephemeral_system_context_writer.Link(m_ephemeral_operation);
diff --git a/src/core/hle/service/psc/time/service_manager.h b/src/core/hle/service/psc/time/service_manager.h
index a8b94d8939..09cff25038 100644
--- a/src/core/hle/service/psc/time/service_manager.h
+++ b/src/core/hle/service/psc/time/service_manager.h
@@ -65,8 +65,6 @@ private:
void SetupSAndP();
Result GetStaticService(OutInterface<StaticService> out_service, StaticServiceSetupInfo setup_info, const char* name);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
-
std::shared_ptr<TimeManager> m_time;
ServerManager& m_server_manager;
bool m_is_s_and_p_setup{};
diff --git a/src/core/hle/service/psc/time/shared_memory.cpp b/src/core/hle/service/psc/time/shared_memory.cpp
index adef6bcd8b..b6841a87cb 100644
--- a/src/core/hle/service/psc/time/shared_memory.cpp
+++ b/src/core/hle/service/psc/time/shared_memory.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/psc/time/static.cpp b/src/core/hle/service/psc/time/static.cpp
index 2b2b6f1f04..28cff3b764 100644
--- a/src/core/hle/service/psc/time/static.cpp
+++ b/src/core/hle/service/psc/time/static.cpp
@@ -33,31 +33,6 @@ constexpr Result GetTimeFromTimePointAndContext(s64* out_time, SteadyClockTimePo
}
} // namespace
-std::optional<ServiceFrameworkBase::FunctionInfoBase> StaticService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&StaticService::GetStandardUserSystemClock>, "GetStandardUserSystemClock"},
- FunctionInfo{1, D<&StaticService::GetStandardNetworkSystemClock>, "GetStandardNetworkSystemClock"},
- FunctionInfo{2, D<&StaticService::GetStandardSteadyClock>, "GetStandardSteadyClock"},
- FunctionInfo{3, D<&StaticService::GetTimeZoneService>, "GetTimeZoneService"},
- FunctionInfo{4, D<&StaticService::GetStandardLocalSystemClock>, "GetStandardLocalSystemClock"},
- FunctionInfo{5, D<&StaticService::GetEphemeralNetworkSystemClock>, "GetEphemeralNetworkSystemClock"},
- FunctionInfo{20, D<&StaticService::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"},
- FunctionInfo{50, D<&StaticService::SetStandardSteadyClockInternalOffset>, "SetStandardSteadyClockInternalOffset"},
- FunctionInfo{51, D<&StaticService::GetStandardSteadyClockRtcValue>, "GetStandardSteadyClockRtcValue"},
- FunctionInfo{100, D<&StaticService::IsStandardUserSystemClockAutomaticCorrectionEnabled>, "IsStandardUserSystemClockAutomaticCorrectionEnabled"},
- FunctionInfo{101, D<&StaticService::SetStandardUserSystemClockAutomaticCorrectionEnabled>, "SetStandardUserSystemClockAutomaticCorrectionEnabled"},
- FunctionInfo{102, D<&StaticService::GetStandardUserSystemClockInitialYear>, "GetStandardUserSystemClockInitialYear"},
- FunctionInfo{200, D<&StaticService::IsStandardNetworkSystemClockAccuracySufficient>, "IsStandardNetworkSystemClockAccuracySufficient"},
- FunctionInfo{201, D<&StaticService::GetStandardUserSystemClockAutomaticCorrectionUpdatedTime>, "GetStandardUserSystemClockAutomaticCorrectionUpdatedTime"},
- FunctionInfo{300, D<&StaticService::CalculateMonotonicSystemClockBaseTimePoint>, "CalculateMonotonicSystemClockBaseTimePoint"},
- FunctionInfo{400, D<&StaticService::GetClockSnapshot>, "GetClockSnapshot"},
- FunctionInfo{401, D<&StaticService::GetClockSnapshotFromSystemClockContext>, "GetClockSnapshotFromSystemClockContext"},
- FunctionInfo{500, D<&StaticService::CalculateStandardUserSystemClockDifferenceByUser>, "CalculateStandardUserSystemClockDifferenceByUser"},
- FunctionInfo{501, D<&StaticService::CalculateSpanBetween>, "CalculateSpanBetween"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
StaticService::StaticService(Core::System& system_, StaticServiceSetupInfo setup_info,
std::shared_ptr<TimeManager> time, const char* name)
: ServiceFramework{system_, name}, m_setup_info{setup_info}, m_time{time},
@@ -67,6 +42,31 @@ StaticService::StaticService(Core::System& system_, StaticServiceSetupInfo setup
m_time_zone{m_time->m_time_zone},
m_ephemeral_network_clock{m_time->m_ephemeral_network_clock}, m_shared_memory{
m_time->m_shared_memory} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&StaticService::GetStandardUserSystemClock>, "GetStandardUserSystemClock"},
+ {1, D<&StaticService::GetStandardNetworkSystemClock>, "GetStandardNetworkSystemClock"},
+ {2, D<&StaticService::GetStandardSteadyClock>, "GetStandardSteadyClock"},
+ {3, D<&StaticService::GetTimeZoneService>, "GetTimeZoneService"},
+ {4, D<&StaticService::GetStandardLocalSystemClock>, "GetStandardLocalSystemClock"},
+ {5, D<&StaticService::GetEphemeralNetworkSystemClock>, "GetEphemeralNetworkSystemClock"},
+ {20, D<&StaticService::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"},
+ {50, D<&StaticService::SetStandardSteadyClockInternalOffset>, "SetStandardSteadyClockInternalOffset"},
+ {51, D<&StaticService::GetStandardSteadyClockRtcValue>, "GetStandardSteadyClockRtcValue"},
+ {100, D<&StaticService::IsStandardUserSystemClockAutomaticCorrectionEnabled>, "IsStandardUserSystemClockAutomaticCorrectionEnabled"},
+ {101, D<&StaticService::SetStandardUserSystemClockAutomaticCorrectionEnabled>, "SetStandardUserSystemClockAutomaticCorrectionEnabled"},
+ {102, D<&StaticService::GetStandardUserSystemClockInitialYear>, "GetStandardUserSystemClockInitialYear"},
+ {200, D<&StaticService::IsStandardNetworkSystemClockAccuracySufficient>, "IsStandardNetworkSystemClockAccuracySufficient"},
+ {201, D<&StaticService::GetStandardUserSystemClockAutomaticCorrectionUpdatedTime>, "GetStandardUserSystemClockAutomaticCorrectionUpdatedTime"},
+ {300, D<&StaticService::CalculateMonotonicSystemClockBaseTimePoint>, "CalculateMonotonicSystemClockBaseTimePoint"},
+ {400, D<&StaticService::GetClockSnapshot>, "GetClockSnapshot"},
+ {401, D<&StaticService::GetClockSnapshotFromSystemClockContext>, "GetClockSnapshotFromSystemClockContext"},
+ {500, D<&StaticService::CalculateStandardUserSystemClockDifferenceByUser>, "CalculateStandardUserSystemClockDifferenceByUser"},
+ {501, D<&StaticService::CalculateSpanBetween>, "CalculateSpanBetween"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
Result StaticService::GetStandardUserSystemClock(OutInterface<SystemClock> out_service) {
diff --git a/src/core/hle/service/psc/time/static.h b/src/core/hle/service/psc/time/static.h
index a86fec178f..52659166f1 100644
--- a/src/core/hle/service/psc/time/static.h
+++ b/src/core/hle/service/psc/time/static.h
@@ -71,8 +71,6 @@ private:
Result GetClockSnapshotImpl(OutClockSnapshot out_snapshot,
const SystemClockContext& user_context,
const SystemClockContext& network_context, TimeType type);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
-
StaticServiceSetupInfo m_setup_info;
std::shared_ptr<TimeManager> m_time;
StandardLocalSystemClockCore& m_local_system_clock;
diff --git a/src/core/hle/service/psc/time/steady_clock.cpp b/src/core/hle/service/psc/time/steady_clock.cpp
index 3d138837d3..1d1551acf9 100644
--- a/src/core/hle/service/psc/time/steady_clock.cpp
+++ b/src/core/hle/service/psc/time/steady_clock.cpp
@@ -11,26 +11,26 @@
namespace Service::PSC::Time {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> SteadyClock::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&SteadyClock::GetCurrentTimePoint>, "GetCurrentTimePoint"},
- FunctionInfo{2, D<&SteadyClock::GetTestOffset>, "GetTestOffset"},
- FunctionInfo{3, D<&SteadyClock::SetTestOffset>, "SetTestOffset"},
- FunctionInfo{100, D<&SteadyClock::GetRtcValue>, "GetRtcValue"},
- FunctionInfo{101, D<&SteadyClock::IsRtcResetDetected>, "IsRtcResetDetected"},
- FunctionInfo{102, D<&SteadyClock::GetSetupResultValue>, "GetSetupResultValue"},
- FunctionInfo{200, D<&SteadyClock::GetInternalOffset>, "GetInternalOffset"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
SteadyClock::SteadyClock(Core::System& system_, std::shared_ptr<TimeManager> manager,
bool can_write_steady_clock, bool can_write_uninitialized_clock)
: ServiceFramework{system_, "ISteadyClock"}
, m_clock_core{manager->m_standard_steady_clock}
, m_can_write_steady_clock{can_write_steady_clock}
, m_can_write_uninitialized_clock{can_write_uninitialized_clock}
-{}
+{
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&SteadyClock::GetCurrentTimePoint>, "GetCurrentTimePoint"},
+ {2, D<&SteadyClock::GetTestOffset>, "GetTestOffset"},
+ {3, D<&SteadyClock::SetTestOffset>, "SetTestOffset"},
+ {100, D<&SteadyClock::GetRtcValue>, "GetRtcValue"},
+ {101, D<&SteadyClock::IsRtcResetDetected>, "IsRtcResetDetected"},
+ {102, D<&SteadyClock::GetSetupResultValue>, "GetSetupResultValue"},
+ {200, D<&SteadyClock::GetInternalOffset>, "GetInternalOffset"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
+}
Result SteadyClock::GetCurrentTimePoint(Out<SteadyClockTimePoint> out_time_point) {
SCOPE_EXIT {
diff --git a/src/core/hle/service/psc/time/steady_clock.h b/src/core/hle/service/psc/time/steady_clock.h
index e4de3e3717..8d3d9a6280 100644
--- a/src/core/hle/service/psc/time/steady_clock.h
+++ b/src/core/hle/service/psc/time/steady_clock.h
@@ -34,8 +34,6 @@ public:
Result GetSetupResultValue(Out<Result> out_result);
Result GetInternalOffset(Out<s64> out_internal_offset);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
-
private:
StandardSteadyClockCore& m_clock_core;
bool m_can_write_steady_clock;
diff --git a/src/core/hle/service/psc/time/system_clock.cpp b/src/core/hle/service/psc/time/system_clock.cpp
index c08eca0b02..e978ffb5e5 100644
--- a/src/core/hle/service/psc/time/system_clock.cpp
+++ b/src/core/hle/service/psc/time/system_clock.cpp
@@ -11,23 +11,23 @@
namespace Service::PSC::Time {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> SystemClock::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&SystemClock::GetCurrentTime>, "GetCurrentTime"},
- FunctionInfo{1, D<&SystemClock::SetCurrentTime>, "SetCurrentTime"},
- FunctionInfo{2, D<&SystemClock::GetSystemClockContext>, "GetSystemClockContext"},
- FunctionInfo{3, D<&SystemClock::SetSystemClockContext>, "SetSystemClockContext"},
- FunctionInfo{4, D<&SystemClock::GetOperationEventReadableHandle>, "GetOperationEventReadableHandle"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
SystemClock::SystemClock(Core::System& system_, SystemClockCore& clock_core, bool can_write_clock, bool can_write_uninitialized_clock)
: ServiceFramework{system_, "ISystemClock"}
, m_clock_core{clock_core}
, m_can_write_clock{can_write_clock}
, m_can_write_uninitialized_clock{can_write_uninitialized_clock}
-{}
+{
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&SystemClock::GetCurrentTime>, "GetCurrentTime"},
+ {1, D<&SystemClock::SetCurrentTime>, "SetCurrentTime"},
+ {2, D<&SystemClock::GetSystemClockContext>, "GetSystemClockContext"},
+ {3, D<&SystemClock::SetSystemClockContext>, "SetSystemClockContext"},
+ {4, D<&SystemClock::GetOperationEventReadableHandle>, "GetOperationEventReadableHandle"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
+}
Result SystemClock::GetCurrentTime(Out<s64> out_time) {
SCOPE_EXIT {
diff --git a/src/core/hle/service/psc/time/system_clock.h b/src/core/hle/service/psc/time/system_clock.h
index 4f7d285d39..0d91aaa735 100644
--- a/src/core/hle/service/psc/time/system_clock.h
+++ b/src/core/hle/service/psc/time/system_clock.h
@@ -31,7 +31,6 @@ public:
Result GetOperationEventReadableHandle(OutCopyHandle<Kernel::KReadableEvent> out_event);
private:
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
SystemClockCore& m_clock_core;
bool m_can_write_clock;
bool m_can_write_uninitialized_clock;
diff --git a/src/core/hle/service/psc/time/time_zone.cpp b/src/core/hle/service/psc/time/time_zone.cpp
index 81bfb90929..e537a821db 100644
--- a/src/core/hle/service/psc/time/time_zone.cpp
+++ b/src/core/hle/service/psc/time/time_zone.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/psc/time/time_zone.h b/src/core/hle/service/psc/time/time_zone.h
index 0e4ed6ed00..68a235e440 100644
--- a/src/core/hle/service/psc/time/time_zone.h
+++ b/src/core/hle/service/psc/time/time_zone.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/psc/time/time_zone_service.cpp b/src/core/hle/service/psc/time/time_zone_service.cpp
index 6a717846d3..bd6bb3ba93 100644
--- a/src/core/hle/service/psc/time/time_zone_service.cpp
+++ b/src/core/hle/service/psc/time/time_zone_service.cpp
@@ -13,33 +13,33 @@
namespace Service::PSC::Time {
- std::optional<ServiceFrameworkBase::FunctionInfoBase> TimeZoneService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&TimeZoneService::GetDeviceLocationName>, "GetDeviceLocationName"},
- FunctionInfo{1, D<&TimeZoneService::SetDeviceLocationName>, "SetDeviceLocationName"},
- FunctionInfo{2, D<&TimeZoneService::GetTotalLocationNameCount>, "GetTotalLocationNameCount"},
- FunctionInfo{3, D<&TimeZoneService::LoadLocationNameList>, "LoadLocationNameList"},
- FunctionInfo{4, D<&TimeZoneService::LoadTimeZoneRule>, "LoadTimeZoneRule"},
- FunctionInfo{5, D<&TimeZoneService::GetTimeZoneRuleVersion>, "GetTimeZoneRuleVersion"},
- FunctionInfo{6, D<&TimeZoneService::GetDeviceLocationNameAndUpdatedTime>, "GetDeviceLocationNameAndUpdatedTime"},
- FunctionInfo{7, D<&TimeZoneService::SetDeviceLocationNameWithTimeZoneRule>, "SetDeviceLocationNameWithTimeZoneRule"},
- FunctionInfo{8, D<&TimeZoneService::ParseTimeZoneBinary>, "ParseTimeZoneBinary"},
- FunctionInfo{20, D<&TimeZoneService::GetDeviceLocationNameOperationEventReadableHandle>, "GetDeviceLocationNameOperationEventReadableHandle"},
- FunctionInfo{100, D<&TimeZoneService::ToCalendarTime>, "ToCalendarTime"},
- FunctionInfo{101, D<&TimeZoneService::ToCalendarTimeWithMyRule>, "ToCalendarTimeWithMyRule"},
- FunctionInfo{201, D<&TimeZoneService::ToPosixTime>, "ToPosixTime"},
- FunctionInfo{202, D<&TimeZoneService::ToPosixTimeWithMyRule>, "ToPosixTimeWithMyRule"}
- );
- return HandlerTableGenerateWithFind(key, functions);
- }
-
TimeZoneService::TimeZoneService(Core::System& system_, StandardSteadyClockCore& clock_core,
TimeZone& time_zone, bool can_write_timezone_device_location)
: ServiceFramework{system_, "ITimeZoneService"}
, m_clock_core{clock_core}
, m_time_zone{time_zone}
, m_can_write_timezone_device_location{can_write_timezone_device_location}
-{}
+{
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&TimeZoneService::GetDeviceLocationName>, "GetDeviceLocationName"},
+ {1, D<&TimeZoneService::SetDeviceLocationName>, "SetDeviceLocationName"},
+ {2, D<&TimeZoneService::GetTotalLocationNameCount>, "GetTotalLocationNameCount"},
+ {3, D<&TimeZoneService::LoadLocationNameList>, "LoadLocationNameList"},
+ {4, D<&TimeZoneService::LoadTimeZoneRule>, "LoadTimeZoneRule"},
+ {5, D<&TimeZoneService::GetTimeZoneRuleVersion>, "GetTimeZoneRuleVersion"},
+ {6, D<&TimeZoneService::GetDeviceLocationNameAndUpdatedTime>, "GetDeviceLocationNameAndUpdatedTime"},
+ {7, D<&TimeZoneService::SetDeviceLocationNameWithTimeZoneRule>, "SetDeviceLocationNameWithTimeZoneRule"},
+ {8, D<&TimeZoneService::ParseTimeZoneBinary>, "ParseTimeZoneBinary"},
+ {20, D<&TimeZoneService::GetDeviceLocationNameOperationEventReadableHandle>, "GetDeviceLocationNameOperationEventReadableHandle"},
+ {100, D<&TimeZoneService::ToCalendarTime>, "ToCalendarTime"},
+ {101, D<&TimeZoneService::ToCalendarTimeWithMyRule>, "ToCalendarTimeWithMyRule"},
+ {201, D<&TimeZoneService::ToPosixTime>, "ToPosixTime"},
+ {202, D<&TimeZoneService::ToPosixTimeWithMyRule>, "ToPosixTimeWithMyRule"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
+}
Result TimeZoneService::GetDeviceLocationName(Out<LocationName> out_location_name) {
SCOPE_EXIT {
diff --git a/src/core/hle/service/psc/time/time_zone_service.h b/src/core/hle/service/psc/time/time_zone_service.h
index fbb107f87c..0067b08258 100644
--- a/src/core/hle/service/psc/time/time_zone_service.h
+++ b/src/core/hle/service/psc/time/time_zone_service.h
@@ -59,7 +59,6 @@ public:
const CalendarTime& calendar_time);
private:
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
StandardSteadyClockCore& m_clock_core;
TimeZone& m_time_zone;
bool m_can_write_timezone_device_location;
diff --git a/src/core/hle/service/ptm/psm.cpp b/src/core/hle/service/ptm/psm.cpp
index 5cad46f997..41d172b71b 100644
--- a/src/core/hle/service/ptm/psm.cpp
+++ b/src/core/hle/service/ptm/psm.cpp
@@ -21,13 +21,20 @@ namespace Service::PTM {
class IPsmSession final : public ServiceFramework<IPsmSession> {
public:
explicit IPsmSession(Core::System& system_)
- : ServiceFramework{system_, "IPsmSession"}
- , service_context{system_, "IPsmSession"} {
- state_change_event = service_context.CreateEvent("IPsmSession::state_change_event");
- }
+ : ServiceFramework{system_, "IPsmSession"}, service_context{system_, "IPsmSession"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &IPsmSession::BindStateChangeEvent, "BindStateChangeEvent"},
+ {1, &IPsmSession::UnbindStateChangeEvent, "UnbindStateChangeEvent"},
+ {2, &IPsmSession::SetChargerTypeChangeEventEnabled, "SetChargerTypeChangeEventEnabled"},
+ {3, &IPsmSession::SetPowerSupplyChangeEventEnabled, "SetPowerSupplyChangeEventEnabled"},
+ {4, &IPsmSession::SetBatteryVoltageStateChangeEventEnabled, "SetBatteryVoltageStateChangeEventEnabled"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ state_change_event = service_context.CreateEvent("IPsmSession::state_change_event");
}
~IPsmSession() override {
@@ -105,15 +112,8 @@ private:
rb.Push(ResultSuccess);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &IPsmSession::BindStateChangeEvent, "BindStateChangeEvent"},
- FunctionInfo{1, &IPsmSession::UnbindStateChangeEvent, "UnbindStateChangeEvent"},
- FunctionInfo{2, &IPsmSession::SetChargerTypeChangeEventEnabled, "SetChargerTypeChangeEventEnabled"},
- FunctionInfo{3, &IPsmSession::SetPowerSupplyChangeEventEnabled, "SetPowerSupplyChangeEventEnabled"},
- FunctionInfo{4, &IPsmSession::SetBatteryVoltageStateChangeEventEnabled, "SetBatteryVoltageStateChangeEventEnabled"}
- );
-
KernelHelpers::ServiceContext service_context;
+
bool should_signal_charger_type{};
bool should_signal_power_supply{};
bool should_signal_battery_voltage{};
@@ -122,6 +122,31 @@ private:
};
PSM::PSM(Core::System& system_) : ServiceFramework{system_, "psm"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &PSM::GetBatteryChargePercentage, "GetBatteryChargePercentage"},
+ {1, &PSM::GetChargerType, "GetChargerType"},
+ {2, nullptr, "EnableBatteryCharging"},
+ {3, nullptr, "DisableBatteryCharging"},
+ {4, nullptr, "IsBatteryChargingEnabled"},
+ {5, nullptr, "AcquireControllerPowerSupply"},
+ {6, nullptr, "ReleaseControllerPowerSupply"},
+ {7, &PSM::OpenSession, "OpenSession"},
+ {8, nullptr, "EnableEnoughPowerChargeEmulation"},
+ {9, nullptr, "DisableEnoughPowerChargeEmulation"},
+ {10, nullptr, "EnableFastBatteryCharging"},
+ {11, nullptr, "DisableFastBatteryCharging"},
+ {12, &PSM::GetBatteryVoltageState, "GetBatteryVoltageState"},
+ {13, nullptr, "GetRawBatteryChargePercentage"},
+ {14, nullptr, "IsEnoughPowerSupplied"},
+ {15, &PSM::GetBatteryAgePercentage, "GetBatteryAgePercentage"},
+ {16, nullptr, "GetBatteryChargeInfoEvent"},
+ {17, &PSM::GetBatteryChargeInfoFields, "GetBatteryChargeInfoFields"},
+ {18, nullptr, "GetBatteryChargeCalibratedEvent"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
PSM::~PSM() = default;
diff --git a/src/core/hle/service/ptm/psm.h b/src/core/hle/service/ptm/psm.h
index fe77b23d79..77c38d1f9b 100644
--- a/src/core/hle/service/ptm/psm.h
+++ b/src/core/hle/service/ptm/psm.h
@@ -28,31 +28,6 @@ private:
void GetBatteryVoltageState(HLERequestContext& ctx);
void GetBatteryAgePercentage(HLERequestContext& ctx);
void GetBatteryChargeInfoFields(HLERequestContext& ctx);
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &PSM::GetBatteryChargePercentage, "GetBatteryChargePercentage"},
- FunctionInfo{1, &PSM::GetChargerType, "GetChargerType"},
- FunctionInfo{2, nullptr, "EnableBatteryCharging"},
- FunctionInfo{3, nullptr, "DisableBatteryCharging"},
- FunctionInfo{4, nullptr, "IsBatteryChargingEnabled"},
- FunctionInfo{5, nullptr, "AcquireControllerPowerSupply"},
- FunctionInfo{6, nullptr, "ReleaseControllerPowerSupply"},
- FunctionInfo{7, &PSM::OpenSession, "OpenSession"},
- FunctionInfo{8, nullptr, "EnableEnoughPowerChargeEmulation"},
- FunctionInfo{9, nullptr, "DisableEnoughPowerChargeEmulation"},
- FunctionInfo{10, nullptr, "EnableFastBatteryCharging"},
- FunctionInfo{11, nullptr, "DisableFastBatteryCharging"},
- FunctionInfo{12, &PSM::GetBatteryVoltageState, "GetBatteryVoltageState"},
- FunctionInfo{13, nullptr, "GetRawBatteryChargePercentage"},
- FunctionInfo{14, nullptr, "IsEnoughPowerSupplied"},
- FunctionInfo{15, &PSM::GetBatteryAgePercentage, "GetBatteryAgePercentage"},
- FunctionInfo{16, nullptr, "GetBatteryChargeInfoEvent"},
- FunctionInfo{17, &PSM::GetBatteryChargeInfoFields, "GetBatteryChargeInfoFields"},
- FunctionInfo{18, nullptr, "GetBatteryChargeCalibratedEvent"}
- );
};
} // namespace Service::PTM
diff --git a/src/core/hle/service/ptm/ptm.cpp b/src/core/hle/service/ptm/ptm.cpp
index ad474ec411..de1d34a688 100644
--- a/src/core/hle/service/ptm/ptm.cpp
+++ b/src/core/hle/service/ptm/ptm.cpp
@@ -17,28 +17,28 @@ namespace Service::PTM {
class PSM_MANU final : public ServiceFramework<PSM_MANU> {
public:
explicit PSM_MANU(Core::System& system_)
- : ServiceFramework{system_, "psm:manu"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "EnableVdd50StateControl"},
- FunctionInfo{1, nullptr, "DisableVdd50StateControl"},
- FunctionInfo{2, nullptr, "SetVdd50State"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "psm:manu"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "EnableVdd50StateControl"},
+ {1, nullptr, "DisableVdd50StateControl"},
+ {2, nullptr, "SetVdd50State"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class POWCTL final : public ServiceFramework<POWCTL> {
public:
explicit POWCTL(Core::System& system_)
- : ServiceFramework{system_, "powctl"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "OpenSession"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "powctl"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "OpenSession"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
diff --git a/src/core/hle/service/ptm/ptm.h b/src/core/hle/service/ptm/ptm.h
index a0ae03d282..a62877e441 100644
--- a/src/core/hle/service/ptm/ptm.h
+++ b/src/core/hle/service/ptm/ptm.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/core/hle/service/ptm/ts.cpp b/src/core/hle/service/ptm/ts.cpp
index f22ff2ec69..b1ac0c8f11 100644
--- a/src/core/hle/service/ptm/ts.cpp
+++ b/src/core/hle/service/ptm/ts.cpp
@@ -19,10 +19,16 @@ enum class Location : u8 {
class ISession : public ServiceFramework<ISession> {
public:
- explicit ISession(Core::System& system_) : ServiceFramework{system_, "ISession"} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit ISession(Core::System& system_) : ServiceFramework{system_, "ISession"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetTemperatureRange"},
+ {2, nullptr, "SetMeasurementMode"},
+ {4, &ISession::GetTemperature, "GetTemperature"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
private:
@@ -33,15 +39,20 @@ private:
rb.Push(ResultSuccess);
rb.Push(temperature);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetTemperatureRange"},
- FunctionInfo{2, nullptr, "SetMeasurementMode"},
- FunctionInfo{4, &ISession::GetTemperature, "GetTemperature"}
- );
};
TS::TS(Core::System& system_) : ServiceFramework{system_, "ts"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetTemperatureRange"},
+ {1, &TS::GetTemperature, "GetTemperature"},
+ {2, nullptr, "SetMeasurementMode"},
+ {3, &TS::GetTemperatureMilliC, "GetTemperatureMilliC"},
+ {4, &TS::OpenSession, "OpenSession"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
TS::~TS() = default;
diff --git a/src/core/hle/service/ptm/ts.h b/src/core/hle/service/ptm/ts.h
index 21f3ac2b70..d8a0d49bf8 100644
--- a/src/core/hle/service/ptm/ts.h
+++ b/src/core/hle/service/ptm/ts.h
@@ -20,17 +20,6 @@ private:
void GetTemperature(HLERequestContext& ctx);
void GetTemperatureMilliC(HLERequestContext& ctx);
void OpenSession(HLERequestContext& ctx);
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetTemperatureRange"},
- FunctionInfo{1, &TS::GetTemperature, "GetTemperature"},
- FunctionInfo{2, nullptr, "SetMeasurementMode"},
- FunctionInfo{3, &TS::GetTemperatureMilliC, "GetTemperatureMilliC"},
- FunctionInfo{4, &TS::OpenSession, "OpenSession"}
- );
};
} // namespace Service::PTM
diff --git a/src/core/hle/service/ro/ro.cpp b/src/core/hle/service/ro/ro.cpp
index 838ff136f6..167bf04c9a 100644
--- a/src/core/hle/service/ro/ro.cpp
+++ b/src/core/hle/service/ro/ro.cpp
@@ -8,334 +8,21 @@
#include <openssl/evp.h>
#include "core/hle/kernel/k_process.h"
+
+#include "core/hle/service/cmif_serialization.h"
#include "core/hle/service/ro/ro.h"
+#include "core/hle/service/ro/ro_nro_utils.h"
+#include "core/hle/service/ro/ro_results.h"
+#include "core/hle/service/ro/ro_types.h"
#include "core/hle/service/server_manager.h"
#include "core/hle/service/service.h"
#ifdef HAS_NCE
#include "core/arm/nce/patcher.h"
#include "core/hle/kernel/k_shared_memory.h"
#endif
-#include "core/hle/service/cmif_serialization.h"
namespace Service::RO {
-constexpr Result ResultOutOfAddressSpace{ErrorModule::RO, 2};
-constexpr Result ResultAlreadyLoaded{ErrorModule::RO, 3};
-constexpr Result ResultInvalidNro{ErrorModule::RO, 4};
-constexpr Result ResultInvalidNrr{ErrorModule::RO, 6};
-constexpr Result ResultTooManyNro{ErrorModule::RO, 7};
-constexpr Result ResultTooManyNrr{ErrorModule::RO, 8};
-constexpr Result ResultNotAuthorized{ErrorModule::RO, 9};
-constexpr Result ResultInvalidNrrKind{ErrorModule::RO, 10};
-constexpr Result ResultInternalError{ErrorModule::RO, 1023};
-constexpr Result ResultInvalidAddress{ErrorModule::RO, 1025};
-constexpr Result ResultInvalidSize{ErrorModule::RO, 1026};
-constexpr Result ResultNotLoaded{ErrorModule::RO, 1028};
-constexpr Result ResultNotRegistered{ErrorModule::RO, 1029};
-constexpr Result ResultInvalidSession{ErrorModule::RO, 1030};
-constexpr Result ResultInvalidProcess{ErrorModule::RO, 1031};
-
-namespace {
-
-struct ProcessMemoryRegion {
- u64 address;
- u64 size;
-};
-
-size_t GetTotalProcessMemoryRegionSize(const ProcessMemoryRegion* regions, size_t num_regions) {
- size_t total = 0;
-
- for (size_t i = 0; i < num_regions; ++i) {
- total += regions[i].size;
- }
-
- return total;
-}
-
-size_t SetupNroProcessMemoryRegions(ProcessMemoryRegion* regions, u64 nro_heap_address,
- u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size) {
- // Reset region count.
- size_t num_regions = 0;
-
- // We always want a region for the nro.
- regions[num_regions++] = {nro_heap_address, nro_heap_size};
-
- // If we have bss, create a region for bss.
- if (bss_heap_size > 0) {
- regions[num_regions++] = {bss_heap_address, bss_heap_size};
- }
-
- return num_regions;
-}
-
-Result SetProcessMemoryPermission(Kernel::KProcess* process, u64 address, u64 size,
- Kernel::Svc::MemoryPermission permission) {
- auto& page_table = process->GetPageTable();
-
- // Set permission.
- R_RETURN(page_table.SetProcessMemoryPermission(address, size, permission));
-}
-
-Result UnmapProcessCodeMemory(Kernel::KProcess* process, u64 process_code_address,
- const ProcessMemoryRegion* regions, size_t num_regions) {
- // Get the total process memory region size.
- const size_t total_size = GetTotalProcessMemoryRegionSize(regions, num_regions);
-
- auto& page_table = process->GetPageTable();
-
- // Unmap each region in order.
- size_t cur_offset = total_size;
- for (size_t i = 0; i < num_regions; ++i) {
- // We want to unmap in reverse order.
- const auto& cur_region = regions[num_regions - 1 - i];
-
- // Subtract to update the current offset.
- cur_offset -= cur_region.size;
-
- // Unmap.
- R_TRY(page_table.UnmapCodeMemory(process_code_address + cur_offset, cur_region.address,
- cur_region.size));
- }
-
- R_SUCCEED();
-}
-
-Result EnsureGuardPages(Kernel::KProcessPageTable& page_table, u64 map_address, u64 map_size) {
- Kernel::KMemoryInfo memory_info;
- Kernel::Svc::PageInfo page_info;
-
- // Ensure page before mapping is unmapped.
- R_TRY(page_table.QueryInfo(std::addressof(memory_info), std::addressof(page_info),
- map_address - 1));
- R_UNLESS(memory_info.GetSvcState() == Kernel::Svc::MemoryState::Free,
- Kernel::ResultInvalidState);
-
- // Ensure page after mapping is unmapped.
- R_TRY(page_table.QueryInfo(std::addressof(memory_info), std::addressof(page_info),
- map_address + map_size));
- R_UNLESS(memory_info.GetSvcState() == Kernel::Svc::MemoryState::Free,
- Kernel::ResultInvalidState);
-
- // Successfully verified guard pages.
- R_SUCCEED();
-}
-
-Result MapProcessCodeMemory(u64* out, Kernel::KProcess* process, const ProcessMemoryRegion* regions,
- size_t num_regions, std::mt19937_64& generate_random) {
- auto& page_table = process->GetPageTable();
- const u64 alias_code_start =
- GetInteger(page_table.GetAliasCodeRegionStart()) / Kernel::PageSize;
- const u64 alias_code_size = page_table.GetAliasCodeRegionSize() / Kernel::PageSize;
-
- for (size_t trial = 0; trial < 64; trial++) {
- // Generate a new trial address.
- const u64 mapped_address =
- (alias_code_start + (generate_random() % alias_code_size)) * Kernel::PageSize;
-
- const auto MapRegions = [&] {
- // Map the regions in order.
- u64 mapped_size = 0;
- for (size_t i = 0; i < num_regions; ++i) {
- // If we fail, unmap up to where we've mapped.
- ON_RESULT_FAILURE {
- R_ASSERT(UnmapProcessCodeMemory(process, mapped_address, regions, i));
- };
-
- // Map the current region.
- R_TRY(page_table.MapCodeMemory(mapped_address + mapped_size, regions[i].address,
- regions[i].size));
-
- mapped_size += regions[i].size;
- }
-
- // If we fail, unmap all mapped regions.
- ON_RESULT_FAILURE {
- R_ASSERT(UnmapProcessCodeMemory(process, mapped_address, regions, num_regions));
- };
-
- // Ensure guard pages.
- R_RETURN(EnsureGuardPages(page_table, mapped_address, mapped_size));
- };
-
- if (R_SUCCEEDED(MapRegions())) {
- // Set the output address.
- *out = mapped_address;
- R_SUCCEED();
- }
- }
-
- // We failed to map anything.
- R_THROW(RO::ResultOutOfAddressSpace);
-}
-
-Result MapNro(u64* out_base_address, Kernel::KProcess* process, u64 nro_heap_address,
- u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size,
- std::mt19937_64& generate_random) {
- // Set up the process memory regions.
- std::array<ProcessMemoryRegion, 2> regions{};
- const size_t num_regions = SetupNroProcessMemoryRegions(
- regions.data(), nro_heap_address, nro_heap_size, bss_heap_address, bss_heap_size);
-
- // Re-map the nro/bss as code memory in the destination process.
- R_RETURN(MapProcessCodeMemory(out_base_address, process, regions.data(), num_regions,
- generate_random));
-}
-
-Result SetNroPerms(Kernel::KProcess* process, u64 base_address, u64 rx_size, u64 ro_size,
- u64 rw_size) {
- const u64 rx_offset = 0;
- const u64 ro_offset = rx_offset + rx_size;
- const u64 rw_offset = ro_offset + ro_size;
-
- R_TRY(SetProcessMemoryPermission(process, base_address + rx_offset, rx_size,
- Kernel::Svc::MemoryPermission::ReadExecute));
- R_TRY(SetProcessMemoryPermission(process, base_address + ro_offset, ro_size,
- Kernel::Svc::MemoryPermission::Read));
- R_TRY(SetProcessMemoryPermission(process, base_address + rw_offset, rw_size,
- Kernel::Svc::MemoryPermission::ReadWrite));
-
- R_SUCCEED();
-}
-
-Result UnmapNro(Kernel::KProcess* process, u64 base_address, u64 nro_heap_address,
- u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size) {
- // Set up the process memory regions.
- std::array<ProcessMemoryRegion, 2> regions{};
- const size_t num_regions = SetupNroProcessMemoryRegions(
- regions.data(), nro_heap_address, nro_heap_size, bss_heap_address, bss_heap_size);
-
- // Unmap the nro/bss.
- R_RETURN(UnmapProcessCodeMemory(process, base_address, regions.data(), num_regions));
-}
-
-} // namespace
-
-enum class NrrKind : u8 {
- User = 0,
- JitPlugin = 1,
- Count,
-};
-
-static constexpr size_t ModuleIdSize = 0x20;
-struct ModuleId {
- std::array<u8, ModuleIdSize> data;
-};
-static_assert(sizeof(ModuleId) == ModuleIdSize);
-
-struct NrrCertification {
- static constexpr size_t RsaKeySize = 0x100;
- static constexpr size_t SignedSize = 0x120;
-
- u64 program_id_mask;
- u64 program_id_pattern;
- std::array<u8, 0x10> reserved_10;
- std::array<u8, RsaKeySize> modulus;
- std::array<u8, RsaKeySize> signature;
-};
-static_assert(sizeof(NrrCertification) == NrrCertification::RsaKeySize + NrrCertification::SignedSize);
-
-class NrrHeader {
-public:
- static constexpr u32 Magic = Common::MakeMagic('N', 'R', 'R', '0');
-
-public:
- bool IsMagicValid() const {
- return m_magic == Magic;
- }
-
- bool IsProgramIdValid() const {
- return (m_program_id & m_certification.program_id_mask) ==
- m_certification.program_id_pattern;
- }
-
- NrrKind GetNrrKind() const {
- const NrrKind kind = static_cast<NrrKind>(m_nrr_kind);
- ASSERT(kind < NrrKind::Count);
- return kind;
- }
-
- u64 GetProgramId() const {
- return m_program_id;
- }
-
- u32 GetSize() const {
- return m_size;
- }
-
- u32 GetNumHashes() const {
- return m_num_hashes;
- }
-
- size_t GetHashesOffset() const {
- return m_hashes_offset;
- }
-
- u32 GetKeyGeneration() const {
- return m_key_generation;
- }
-
- const u8* GetCertificationSignature() const {
- return m_certification.signature.data();
- }
-
- const u8* GetCertificationSignedArea() const {
- return reinterpret_cast<const u8*>(std::addressof(m_certification));
- }
-
- const u8* GetCertificationModulus() const {
- return m_certification.modulus.data();
- }
-
- const u8* GetSignature() const {
- return m_signature.data();
- }
-
- size_t GetSignedAreaSize() const {
- return m_size - GetSignedAreaOffset();
- }
-
- static constexpr size_t GetSignedAreaOffset() {
- return offsetof(NrrHeader, m_program_id);
- }
-
-private:
- u32 m_magic;
- u32 m_key_generation;
- INSERT_PADDING_BYTES_NOINIT(8);
- NrrCertification m_certification;
- std::array<u8, 0x100> m_signature;
- u64 m_program_id;
- u32 m_size;
- u8 m_nrr_kind; // 7.0.0+
- INSERT_PADDING_BYTES_NOINIT(3);
- u32 m_hashes_offset;
- u32 m_num_hashes;
- INSERT_PADDING_BYTES_NOINIT(8);
-};
-static_assert(sizeof(NrrHeader) == 0x350, "NrrHeader has wrong size");
-
-static constexpr u32 NRO_HEADER_MAGIC = Common::MakeMagic('N', 'R', 'O', '0');
-struct NroHeader {
- u32 m_entrypoint_insn;
- u32 m_mod_offset;
- INSERT_PADDING_BYTES_NOINIT(0x8);
- u32 m_magic;
- INSERT_PADDING_BYTES_NOINIT(0x4);
- u32 m_size;
- INSERT_PADDING_BYTES_NOINIT(0x4);
- u32 m_text_offset;
- u32 m_text_size;
- u32 m_ro_offset;
- u32 m_ro_size;
- u32 m_rw_offset;
- u32 m_rw_size;
- u32 m_bss_size;
- INSERT_PADDING_BYTES_NOINIT(0x4);
- ModuleId m_module_id;
- INSERT_PADDING_BYTES_NOINIT(0x20);
-};
-static_assert(sizeof(NroHeader) == 0x80, "NroHeader has wrong size");
-
namespace {
// Atmosphere defines as follows:
@@ -848,19 +535,27 @@ private:
class RoInterface : public ServiceFramework<RoInterface> {
public:
- explicit RoInterface(Core::System& system_, const char* name_, std::shared_ptr<RoContext> ro, NrrKind nrr_kind)
- : ServiceFramework{system_, name_}
- , m_ro(ro)
- , m_context_id(InvalidContextId)
- , m_nrr_kind(nrr_kind)
- {}
+ explicit RoInterface(Core::System& system_, const char* name_, std::shared_ptr<RoContext> ro,
+ NrrKind nrr_kind)
+ : ServiceFramework{system_, name_}, m_ro(ro), m_context_id(InvalidContextId),
+ m_nrr_kind(nrr_kind) {
+
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, C<&RoInterface::MapManualLoadModuleMemory>, "MapManualLoadModuleMemory"},
+ {1, C<&RoInterface::UnmapManualLoadModuleMemory>, "UnmapManualLoadModuleMemory"},
+ {2, C<&RoInterface::RegisterModuleInfo>, "RegisterModuleInfo"},
+ {3, C<&RoInterface::UnregisterModuleInfo>, "UnregisterModuleInfo"},
+ {4, C<&RoInterface::RegisterProcessHandle>, "RegisterProcessHandle"},
+ {10, C<&RoInterface::RegisterProcessModuleInfo>, "RegisterProcessModuleInfo"},
+ };
+ // clang-format on
- ~RoInterface() {
- m_ro->UnregisterProcess(system.Kernel(), m_context_id);
+ RegisterHandlers(functions);
}
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ ~RoInterface() {
+ m_ro->UnregisterProcess(system.Kernel(), m_context_id);
}
Result MapManualLoadModuleMemory(Out<u64> out_load_address, ClientProcessId client_pid,
@@ -899,14 +594,6 @@ public:
}
private:
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, C<&RoInterface::MapManualLoadModuleMemory>, "MapManualLoadModuleMemory"},
- FunctionInfo{1, C<&RoInterface::UnmapManualLoadModuleMemory>, "UnmapManualLoadModuleMemory"},
- FunctionInfo{2, C<&RoInterface::RegisterModuleInfo>, "RegisterModuleInfo"},
- FunctionInfo{3, C<&RoInterface::UnregisterModuleInfo>, "UnregisterModuleInfo"},
- FunctionInfo{4, C<&RoInterface::RegisterProcessHandle>, "RegisterProcessHandle"},
- FunctionInfo{10, C<&RoInterface::RegisterProcessModuleInfo>, "RegisterProcessModuleInfo"}
- );
std::shared_ptr<RoContext> m_ro{};
size_t m_context_id{};
NrrKind m_nrr_kind{};
@@ -919,14 +606,12 @@ class IDebugMonitorInterface final : public ServiceFramework<IDebugMonitorInterf
public:
explicit IDebugMonitorInterface(Core::System& system_)
: ServiceFramework{system_, "ro:dmnt"}
- {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ {
+ static const FunctionInfo functions[] = {
+ { 0, nullptr, "GetProcessModuleInfo" },
+ };
+ RegisterHandlers(functions);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetProcessModuleInfo" }
- );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/ro/ro.h b/src/core/hle/service/ro/ro.h
index 74dc085368..c93aac3833 100644
--- a/src/core/hle/service/ro/ro.h
+++ b/src/core/hle/service/ro/ro.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/ro/ro_nro_utils.cpp b/src/core/hle/service/ro/ro_nro_utils.cpp
new file mode 100644
index 0000000000..1c2a97619d
--- /dev/null
+++ b/src/core/hle/service/ro/ro_nro_utils.cpp
@@ -0,0 +1,188 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/kernel/k_process.h"
+#include "core/hle/service/ro/ro_nro_utils.h"
+#include "core/hle/service/ro/ro_results.h"
+
+namespace Service::RO {
+
+namespace {
+
+struct ProcessMemoryRegion {
+ u64 address;
+ u64 size;
+};
+
+size_t GetTotalProcessMemoryRegionSize(const ProcessMemoryRegion* regions, size_t num_regions) {
+ size_t total = 0;
+
+ for (size_t i = 0; i < num_regions; ++i) {
+ total += regions[i].size;
+ }
+
+ return total;
+}
+
+size_t SetupNroProcessMemoryRegions(ProcessMemoryRegion* regions, u64 nro_heap_address,
+ u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size) {
+ // Reset region count.
+ size_t num_regions = 0;
+
+ // We always want a region for the nro.
+ regions[num_regions++] = {nro_heap_address, nro_heap_size};
+
+ // If we have bss, create a region for bss.
+ if (bss_heap_size > 0) {
+ regions[num_regions++] = {bss_heap_address, bss_heap_size};
+ }
+
+ return num_regions;
+}
+
+Result SetProcessMemoryPermission(Kernel::KProcess* process, u64 address, u64 size,
+ Kernel::Svc::MemoryPermission permission) {
+ auto& page_table = process->GetPageTable();
+
+ // Set permission.
+ R_RETURN(page_table.SetProcessMemoryPermission(address, size, permission));
+}
+
+Result UnmapProcessCodeMemory(Kernel::KProcess* process, u64 process_code_address,
+ const ProcessMemoryRegion* regions, size_t num_regions) {
+ // Get the total process memory region size.
+ const size_t total_size = GetTotalProcessMemoryRegionSize(regions, num_regions);
+
+ auto& page_table = process->GetPageTable();
+
+ // Unmap each region in order.
+ size_t cur_offset = total_size;
+ for (size_t i = 0; i < num_regions; ++i) {
+ // We want to unmap in reverse order.
+ const auto& cur_region = regions[num_regions - 1 - i];
+
+ // Subtract to update the current offset.
+ cur_offset -= cur_region.size;
+
+ // Unmap.
+ R_TRY(page_table.UnmapCodeMemory(process_code_address + cur_offset, cur_region.address,
+ cur_region.size));
+ }
+
+ R_SUCCEED();
+}
+
+Result EnsureGuardPages(Kernel::KProcessPageTable& page_table, u64 map_address, u64 map_size) {
+ Kernel::KMemoryInfo memory_info;
+ Kernel::Svc::PageInfo page_info;
+
+ // Ensure page before mapping is unmapped.
+ R_TRY(page_table.QueryInfo(std::addressof(memory_info), std::addressof(page_info),
+ map_address - 1));
+ R_UNLESS(memory_info.GetSvcState() == Kernel::Svc::MemoryState::Free,
+ Kernel::ResultInvalidState);
+
+ // Ensure page after mapping is unmapped.
+ R_TRY(page_table.QueryInfo(std::addressof(memory_info), std::addressof(page_info),
+ map_address + map_size));
+ R_UNLESS(memory_info.GetSvcState() == Kernel::Svc::MemoryState::Free,
+ Kernel::ResultInvalidState);
+
+ // Successfully verified guard pages.
+ R_SUCCEED();
+}
+
+Result MapProcessCodeMemory(u64* out, Kernel::KProcess* process, const ProcessMemoryRegion* regions,
+ size_t num_regions, std::mt19937_64& generate_random) {
+ auto& page_table = process->GetPageTable();
+ const u64 alias_code_start =
+ GetInteger(page_table.GetAliasCodeRegionStart()) / Kernel::PageSize;
+ const u64 alias_code_size = page_table.GetAliasCodeRegionSize() / Kernel::PageSize;
+
+ for (size_t trial = 0; trial < 64; trial++) {
+ // Generate a new trial address.
+ const u64 mapped_address =
+ (alias_code_start + (generate_random() % alias_code_size)) * Kernel::PageSize;
+
+ const auto MapRegions = [&] {
+ // Map the regions in order.
+ u64 mapped_size = 0;
+ for (size_t i = 0; i < num_regions; ++i) {
+ // If we fail, unmap up to where we've mapped.
+ ON_RESULT_FAILURE {
+ R_ASSERT(UnmapProcessCodeMemory(process, mapped_address, regions, i));
+ };
+
+ // Map the current region.
+ R_TRY(page_table.MapCodeMemory(mapped_address + mapped_size, regions[i].address,
+ regions[i].size));
+
+ mapped_size += regions[i].size;
+ }
+
+ // If we fail, unmap all mapped regions.
+ ON_RESULT_FAILURE {
+ R_ASSERT(UnmapProcessCodeMemory(process, mapped_address, regions, num_regions));
+ };
+
+ // Ensure guard pages.
+ R_RETURN(EnsureGuardPages(page_table, mapped_address, mapped_size));
+ };
+
+ if (R_SUCCEEDED(MapRegions())) {
+ // Set the output address.
+ *out = mapped_address;
+ R_SUCCEED();
+ }
+ }
+
+ // We failed to map anything.
+ R_THROW(RO::ResultOutOfAddressSpace);
+}
+
+} // namespace
+
+Result MapNro(u64* out_base_address, Kernel::KProcess* process, u64 nro_heap_address,
+ u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size,
+ std::mt19937_64& generate_random) {
+ // Set up the process memory regions.
+ std::array<ProcessMemoryRegion, 2> regions{};
+ const size_t num_regions = SetupNroProcessMemoryRegions(
+ regions.data(), nro_heap_address, nro_heap_size, bss_heap_address, bss_heap_size);
+
+ // Re-map the nro/bss as code memory in the destination process.
+ R_RETURN(MapProcessCodeMemory(out_base_address, process, regions.data(), num_regions,
+ generate_random));
+}
+
+Result SetNroPerms(Kernel::KProcess* process, u64 base_address, u64 rx_size, u64 ro_size,
+ u64 rw_size) {
+ const u64 rx_offset = 0;
+ const u64 ro_offset = rx_offset + rx_size;
+ const u64 rw_offset = ro_offset + ro_size;
+
+ R_TRY(SetProcessMemoryPermission(process, base_address + rx_offset, rx_size,
+ Kernel::Svc::MemoryPermission::ReadExecute));
+ R_TRY(SetProcessMemoryPermission(process, base_address + ro_offset, ro_size,
+ Kernel::Svc::MemoryPermission::Read));
+ R_TRY(SetProcessMemoryPermission(process, base_address + rw_offset, rw_size,
+ Kernel::Svc::MemoryPermission::ReadWrite));
+
+ R_SUCCEED();
+}
+
+Result UnmapNro(Kernel::KProcess* process, u64 base_address, u64 nro_heap_address,
+ u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size) {
+ // Set up the process memory regions.
+ std::array<ProcessMemoryRegion, 2> regions{};
+ const size_t num_regions = SetupNroProcessMemoryRegions(
+ regions.data(), nro_heap_address, nro_heap_size, bss_heap_address, bss_heap_size);
+
+ // Unmap the nro/bss.
+ R_RETURN(UnmapProcessCodeMemory(process, base_address, regions.data(), num_regions));
+}
+
+} // namespace Service::RO
diff --git a/src/core/hle/service/ro/ro_nro_utils.h b/src/core/hle/service/ro/ro_nro_utils.h
new file mode 100644
index 0000000000..32b97abed2
--- /dev/null
+++ b/src/core/hle/service/ro/ro_nro_utils.h
@@ -0,0 +1,29 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include <random>
+
+#include "common/common_types.h"
+
+namespace Kernel {
+class KProcess;
+}
+
+union Result;
+
+namespace Service::RO {
+
+Result MapNro(u64* out_base_address, Kernel::KProcess* process, u64 nro_heap_address,
+ u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size,
+ std::mt19937_64& generate_random);
+Result SetNroPerms(Kernel::KProcess* process, u64 base_address, u64 rx_size, u64 ro_size,
+ u64 rw_size);
+Result UnmapNro(Kernel::KProcess* process, u64 base_address, u64 nro_heap_address,
+ u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size);
+
+} // namespace Service::RO
diff --git a/src/core/hle/service/ro/ro_results.h b/src/core/hle/service/ro/ro_results.h
new file mode 100644
index 0000000000..906378bc7f
--- /dev/null
+++ b/src/core/hle/service/ro/ro_results.h
@@ -0,0 +1,29 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/result.h"
+
+namespace Service::RO {
+
+constexpr Result ResultOutOfAddressSpace{ErrorModule::RO, 2};
+constexpr Result ResultAlreadyLoaded{ErrorModule::RO, 3};
+constexpr Result ResultInvalidNro{ErrorModule::RO, 4};
+constexpr Result ResultInvalidNrr{ErrorModule::RO, 6};
+constexpr Result ResultTooManyNro{ErrorModule::RO, 7};
+constexpr Result ResultTooManyNrr{ErrorModule::RO, 8};
+constexpr Result ResultNotAuthorized{ErrorModule::RO, 9};
+constexpr Result ResultInvalidNrrKind{ErrorModule::RO, 10};
+constexpr Result ResultInternalError{ErrorModule::RO, 1023};
+constexpr Result ResultInvalidAddress{ErrorModule::RO, 1025};
+constexpr Result ResultInvalidSize{ErrorModule::RO, 1026};
+constexpr Result ResultNotLoaded{ErrorModule::RO, 1028};
+constexpr Result ResultNotRegistered{ErrorModule::RO, 1029};
+constexpr Result ResultInvalidSession{ErrorModule::RO, 1030};
+constexpr Result ResultInvalidProcess{ErrorModule::RO, 1031};
+
+} // namespace Service::RO
diff --git a/src/core/hle/service/ro/ro_types.h b/src/core/hle/service/ro/ro_types.h
new file mode 100644
index 0000000000..8e88f43246
--- /dev/null
+++ b/src/core/hle/service/ro/ro_types.h
@@ -0,0 +1,142 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "common/assert.h"
+#include "common/common_funcs.h"
+#include "common/common_types.h"
+
+namespace Service::RO {
+
+enum class NrrKind : u8 {
+ User = 0,
+ JitPlugin = 1,
+ Count,
+};
+
+static constexpr size_t ModuleIdSize = 0x20;
+struct ModuleId {
+ std::array<u8, ModuleIdSize> data;
+};
+static_assert(sizeof(ModuleId) == ModuleIdSize);
+
+struct NrrCertification {
+ static constexpr size_t RsaKeySize = 0x100;
+ static constexpr size_t SignedSize = 0x120;
+
+ u64 program_id_mask;
+ u64 program_id_pattern;
+ std::array<u8, 0x10> reserved_10;
+ std::array<u8, RsaKeySize> modulus;
+ std::array<u8, RsaKeySize> signature;
+};
+static_assert(sizeof(NrrCertification) ==
+ NrrCertification::RsaKeySize + NrrCertification::SignedSize);
+
+class NrrHeader {
+public:
+ static constexpr u32 Magic = Common::MakeMagic('N', 'R', 'R', '0');
+
+public:
+ bool IsMagicValid() const {
+ return m_magic == Magic;
+ }
+
+ bool IsProgramIdValid() const {
+ return (m_program_id & m_certification.program_id_mask) ==
+ m_certification.program_id_pattern;
+ }
+
+ NrrKind GetNrrKind() const {
+ const NrrKind kind = static_cast<NrrKind>(m_nrr_kind);
+ ASSERT(kind < NrrKind::Count);
+ return kind;
+ }
+
+ u64 GetProgramId() const {
+ return m_program_id;
+ }
+
+ u32 GetSize() const {
+ return m_size;
+ }
+
+ u32 GetNumHashes() const {
+ return m_num_hashes;
+ }
+
+ size_t GetHashesOffset() const {
+ return m_hashes_offset;
+ }
+
+ u32 GetKeyGeneration() const {
+ return m_key_generation;
+ }
+
+ const u8* GetCertificationSignature() const {
+ return m_certification.signature.data();
+ }
+
+ const u8* GetCertificationSignedArea() const {
+ return reinterpret_cast<const u8*>(std::addressof(m_certification));
+ }
+
+ const u8* GetCertificationModulus() const {
+ return m_certification.modulus.data();
+ }
+
+ const u8* GetSignature() const {
+ return m_signature.data();
+ }
+
+ size_t GetSignedAreaSize() const {
+ return m_size - GetSignedAreaOffset();
+ }
+
+ static constexpr size_t GetSignedAreaOffset() {
+ return offsetof(NrrHeader, m_program_id);
+ }
+
+private:
+ u32 m_magic;
+ u32 m_key_generation;
+ INSERT_PADDING_BYTES_NOINIT(8);
+ NrrCertification m_certification;
+ std::array<u8, 0x100> m_signature;
+ u64 m_program_id;
+ u32 m_size;
+ u8 m_nrr_kind; // 7.0.0+
+ INSERT_PADDING_BYTES_NOINIT(3);
+ u32 m_hashes_offset;
+ u32 m_num_hashes;
+ INSERT_PADDING_BYTES_NOINIT(8);
+};
+static_assert(sizeof(NrrHeader) == 0x350, "NrrHeader has wrong size");
+
+static constexpr u32 NRO_HEADER_MAGIC = Common::MakeMagic('N', 'R', 'O', '0');
+struct NroHeader {
+ u32 m_entrypoint_insn;
+ u32 m_mod_offset;
+ INSERT_PADDING_BYTES_NOINIT(0x8);
+ u32 m_magic;
+ INSERT_PADDING_BYTES_NOINIT(0x4);
+ u32 m_size;
+ INSERT_PADDING_BYTES_NOINIT(0x4);
+ u32 m_text_offset;
+ u32 m_text_size;
+ u32 m_ro_offset;
+ u32 m_ro_size;
+ u32 m_rw_offset;
+ u32 m_rw_size;
+ u32 m_bss_size;
+ INSERT_PADDING_BYTES_NOINIT(0x4);
+ ModuleId m_module_id;
+ INSERT_PADDING_BYTES_NOINIT(0x20);
+};
+static_assert(sizeof(NroHeader) == 0x80, "NroHeader has wrong size");
+
+} // namespace Service::RO
diff --git a/src/core/hle/service/server_manager.h b/src/core/hle/service/server_manager.h
index 5173ce46e1..d86d20b7c5 100644
--- a/src/core/hle/service/server_manager.h
+++ b/src/core/hle/service/server_manager.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp
index 2c6e8d1c07..225b92a783 100644
--- a/src/core/hle/service/service.cpp
+++ b/src/core/hle/service/service.cpp
@@ -19,7 +19,6 @@
#include "core/hle/service/service.h"
#include "core/hle/service/sm/sm.h"
#include "core/reporter.h"
-#include "frontend_common/firmware_manager.h"
namespace Service {
@@ -48,9 +47,24 @@ ServiceFrameworkBase::~ServiceFrameworkBase() {
const auto guard = ServiceFrameworkBase::LockService();
}
-void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx, const FunctionInfoBase* info, bool gated) {
+void ServiceFrameworkBase::RegisterHandlersBase(const FunctionInfoBase* functions, std::size_t n) {
+ // Usually this array is sorted by id already, so hint to insert at the end
+ handlers.reserve(handlers.size() + n);
+ for (std::size_t i = 0; i < n; ++i)
+ handlers.emplace_hint(handlers.cend(), functions[i].expected_header, functions[i]);
+}
+
+void ServiceFrameworkBase::RegisterHandlersBaseTipc(const FunctionInfoBase* functions, std::size_t n) {
+ // Usually this array is sorted by id already, so hint to insert at the end
+ handlers_tipc.reserve(handlers_tipc.size() + n);
+ for (std::size_t i = 0; i < n; ++i)
+ handlers_tipc.emplace_hint(handlers_tipc.cend(), functions[i].expected_header, functions[i]);
+}
+
+void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx,
+ const FunctionInfoBase* info) {
auto cmd_buf = ctx.CommandBuffer();
- std::string function_name = bool(info) ? info->name : "<unknown>";
+ std::string function_name = info == nullptr ? "<unknown>" : info->name;
fmt::memory_buffer buf;
fmt::format_to(std::back_inserter(buf), "function '{}({})': port='{}' cmd_buf={{[0]={:#x}", ctx.GetCommand(), function_name, service_name, cmd_buf[0]);
@@ -59,11 +73,7 @@ void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx, c
buf.push_back('}');
system.GetReporter().SaveUnimplementedFunctionReport(ctx, ctx.GetCommand(), function_name, service_name);
- if (gated) {
- LOG_ERROR(Service, "Version gated {}", fmt::to_string(buf));
- } else {
- UNIMPLEMENTED_MSG("Unknown / unimplemented {}", fmt::to_string(buf));
- }
+ UNIMPLEMENTED_MSG("Unknown / unimplemented {}", fmt::to_string(buf));
if (Settings::values.use_auto_stub) {
LOG_WARNING(Service, "Using auto stub fallback!");
IPC::ResponseBuilder rb{ctx, 2};
@@ -71,33 +81,17 @@ void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx, c
}
}
-[[nodiscard]] static bool VersionGateCheck(Core::System& system, u32 vg) {
- u32 const c_maj = FirmwareManager::GetFirmwareVersion(system).first.major;
- u32 const c_min = FirmwareManager::GetFirmwareVersion(system).first.minor;
- u32 const c_pat = FirmwareManager::GetFirmwareVersion(system).first.micro;
- u32 const cg = (c_pat << 0) | (c_min << 4) | (c_maj << 8);
- u32 const sg = (vg >> 16) & 0xffff;
- u32 const ug = vg & 0xffff;
- // feature available after current
- if (sg && cg < sg)
- return false;
- // feature until xxx (0 = up to current)
- return ug ? ug >= cg : true;
-}
-
void ServiceFrameworkBase::InvokeRequest(HLERequestContext& ctx) {
- const bool is_cmd_read = ctx.GetCommand() == 0;
- auto const info = FindRequest(ctx.GetCommand());
- if (!info.has_value() || info->handler_callback == nullptr)
- return ReportUnimplementedFunction(ctx, &*info, false);
-
- if (!VersionGateCheck(system, info->version_gating))
- {
- return ReportUnimplementedFunction(ctx, &*info, true);
- }
+ const auto command = ctx.GetCommand();
+ auto it = handlers.find(command);
+ const bool is_cmd_read = command == 0;
+ FunctionInfoBase const* info = it == handlers.end() ? nullptr : &it->second;
+ if (info == nullptr || info->handler_callback == nullptr)
+ return ReportUnimplementedFunction(ctx, info);
LOG_TRACE(Service, "{}", MakeFunctionString(info->name, GetServiceName(), ctx.CommandBuffer()));
handler_invoker(this, info->handler_callback, ctx);
+
if (is_i_storage && is_cmd_read) {
const auto* const process = ctx.GetThread().GetOwnerProcess();
if (process != nullptr && system.IsNVDECActiveForProcess(process->GetId())) {
@@ -107,15 +101,10 @@ void ServiceFrameworkBase::InvokeRequest(HLERequestContext& ctx) {
}
void ServiceFrameworkBase::InvokeRequestTipc(HLERequestContext& ctx) {
- auto const info = FindRequestTipc(ctx.GetCommand());
- if (!info.has_value() || info->handler_callback == nullptr)
- return ReportUnimplementedFunction(ctx, &*info, false);
-
- LOG_ERROR(Service, "check for {} version_gating: {}", info->name, info->version_gating);
- if (!VersionGateCheck(system, info->version_gating))
- {
- return ReportUnimplementedFunction(ctx, &*info, true);
- }
+ auto it = handlers_tipc.find(ctx.GetCommand());
+ FunctionInfoBase const* info = it == handlers_tipc.end() ? nullptr : &it->second;
+ if (info == nullptr || info->handler_callback == nullptr)
+ return ReportUnimplementedFunction(ctx, info);
LOG_TRACE(Service, "{}", MakeFunctionString(info->name, GetServiceName(), ctx.CommandBuffer()));
handler_invoker(this, info->handler_callback, ctx);
diff --git a/src/core/hle/service/service.h b/src/core/hle/service/service.h
index e8bd8683ea..ea98897e79 100644
--- a/src/core/hle/service/service.h
+++ b/src/core/hle/service/service.h
@@ -7,11 +7,7 @@
#pragma once
#include <cstddef>
-#include <memory>
#include <mutex>
-#include <tuple>
-#include <type_traits>
-#include "frozen/map.h"
#include "common/container/unordered_map.h"
#include "common/common_types.h"
#include "core/hle/service/hle_ipc.h"
@@ -81,35 +77,30 @@ protected:
[[nodiscard]] virtual std::unique_lock<std::mutex> LockService() noexcept {
return std::unique_lock{lock_service};
}
-
- static constexpr u32 MakeVersionGate(std::tuple<u32, u32, u32> since, std::tuple<u32, u32, u32> until = {0, 0, 0}) {
- auto const [s_maj, s_min, s_pat] = since;
- auto const [u_maj, u_min, u_pat] = until;
- return (u_pat << 0) | (u_min << 4) | (u_maj << 8)
- | (s_pat << 16) | (s_min << 20) | (s_maj << 24);
- }
+private:
+ template <typename T>
+ friend class ServiceFramework;
struct FunctionInfoBase {
+ u32 expected_header;
HandlerFnP<ServiceFrameworkBase> handler_callback;
const char* name;
- u32 version_gating;
};
- static_assert(std::is_trivially_constructible_v<FunctionInfoBase>);
-private:
- template <typename T>
- friend class ServiceFramework;
- using InvokerFn = void(ServiceFrameworkBase* object, HandlerFnP<ServiceFrameworkBase> member, HLERequestContext& ctx);
+ using InvokerFn = void(ServiceFrameworkBase* object, HandlerFnP<ServiceFrameworkBase> member,
+ HLERequestContext& ctx);
- explicit ServiceFrameworkBase(Core::System& system_, const char* service_name_, u32 max_sessions_, InvokerFn* handler_invoker_);
+ explicit ServiceFrameworkBase(Core::System& system_, const char* service_name_,
+ u32 max_sessions_, InvokerFn* handler_invoker_);
~ServiceFrameworkBase() override;
- virtual std::optional<FunctionInfoBase> FindRequest(u32 key) = 0;
- virtual std::optional<FunctionInfoBase> FindRequestTipc(u32 key) = 0;
-
- void ReportUnimplementedFunction(HLERequestContext& ctx, const FunctionInfoBase* info, bool gated);
+ void RegisterHandlersBase(const FunctionInfoBase* functions, std::size_t n);
+ void RegisterHandlersBaseTipc(const FunctionInfoBase* functions, std::size_t n);
+ void ReportUnimplementedFunction(HLERequestContext& ctx, const FunctionInfoBase* info);
protected:
+ ::Common::unordered_map<u32, FunctionInfoBase> handlers;
+ ::Common::unordered_map<u32, FunctionInfoBase> handlers_tipc;
/// Used to gain exclusive access to the service members, e.g. from CoreTiming thread.
std::mutex lock_service;
/// System context that the service operates under.
@@ -130,7 +121,8 @@ protected:
/**
* Framework for implementing HLE services. Dispatches on the header id of incoming SyncRequests
* based on a table mapping header ids to handler functions. Service implementations should inherit
- * from ServiceFramework using the CRTP (`class Foo : public ServiceFramework<Foo> { ... };`)
+ * from ServiceFramework using the CRTP (`class Foo : public ServiceFramework<Foo> { ... };`) and
+ * populate it with handlers by calling #RegisterHandlers.
*
* In order to avoid duplicating code in the binary and exposing too many implementation details in
* the header, this class is split into a non-templated base (ServiceFrameworkBase) and a template
@@ -151,77 +143,50 @@ protected:
/// @param expected_header_ request header in the command buffer which will trigger dispatch to this handler
/// @param handler_callback_ member function in this service which will be called to handle the request
/// @param name_ human-friendly name for the request. Used mostly for logging purposes.
- explicit constexpr FunctionInfoTyped(u32 expected_header_, HandlerFnP<T> handler_callback_, const char* name_, u32 version_gating_ = 0)
- : handler_callback{handler_callback_}
- , name{name_}
- , version_gating{version_gating_}
- , expected_header{expected_header_}
- {}
- HandlerFnP<T> handler_callback;
- const char* name;
- u32 version_gating;
- u32 expected_header;
+ FunctionInfoTyped(u32 expected_header_, HandlerFnP<T> handler_callback_, const char* name_)
+ : FunctionInfoBase{expected_header_, HandlerFnP<ServiceFrameworkBase>(handler_callback_), name_} {}
};
using FunctionInfo = FunctionInfoTyped<Self>;
- // expected_header serves as a key to 'address' function handlers, thus only include the minimal
- template <typename T>
- struct FunctionValueInfo {
- explicit constexpr FunctionValueInfo(HandlerFnP<T> handler_callback_, const char* name_, u32 version_gating_)
- : handler_callback{handler_callback_}
- , name{name_}
- , version_gating{version_gating_}
- {}
- HandlerFnP<T> handler_callback;
- const char* name;
- u32 version_gating;
- };
+ /**
+ * Initializes the handler with no functions installed.
+ *
+ * @param system_ The system context to construct this service under.
+ * @param service_name_ Name of the service.
+ * @param max_sessions_ Maximum number of sessions that can be connected to this service at the
+ * same time.
+ */
+ explicit ServiceFramework(Core::System& system_, const char* service_name_, u32 max_sessions_ = ServerSessionCountMax)
+ : ServiceFrameworkBase(system_, service_name_, max_sessions_, Invoker) {}
- template<typename ...Ts>
- //requires (std::same_as<Ts, FunctionInfo> && ...)
- [[nodiscard]] static consteval frozen::map<u32, FunctionValueInfo<Self>, sizeof...(Ts)> CreateStaticMap(Ts... args) {
- return frozen::map<u32, FunctionValueInfo<Self>, sizeof...(args)>{
- {args.expected_header, FunctionValueInfo<Self>{args.handler_callback, args.name, args.version_gating}}...
- };
+ /// Registers handlers in the service.
+ template <typename T = Self, std::size_t N>
+ void RegisterHandlers(const FunctionInfoTyped<T> (&functions)[N]) {
+ RegisterHandlers(functions, N);
}
- // Used exclusively by NFC
- template<typename T, typename ...Ts>
- //requires (std::same_as<Ts, FunctionInfoTyped<T>> && ...)
- [[nodiscard]] static consteval frozen::map<u32, FunctionValueInfo<T>, sizeof...(Ts)> CreateStaticMapWithClass(Ts... args) {
- return frozen::map<u32, FunctionValueInfo<T>, sizeof...(args)>{
- {args.expected_header, FunctionValueInfo<T>{args.handler_callback, args.name, args.version_gating}}...
- };
+ /**
+ * Registers handlers in the service. Usually prefer using the other RegisterHandlers
+ * overload in order to avoid needing to specify the array size.
+ */
+ template <typename T = Self>
+ void RegisterHandlers(const FunctionInfoTyped<T>* functions, std::size_t n) {
+ RegisterHandlersBase(functions, n);
}
- template<typename T>
- [[nodiscard]] static std::optional<FunctionInfoBase> HandlerTableGenerateWithFind(u32 key, T const& map) {
- auto const it = map.find(key);
- if (it != map.end()) {
- auto const r = it->second;
- return std::optional<FunctionInfoBase>{{
- HandlerFnP<ServiceFrameworkBase>(r.handler_callback),
- r.name,
- r.version_gating
- }};
- }
- return std::nullopt;
+ /// Registers handlers in the service.
+ template <typename T = Self, std::size_t N>
+ void RegisterHandlersTipc(const FunctionInfoTyped<T> (&functions)[N]) {
+ RegisterHandlersTipc(functions, N);
}
- /// @brief Initializes the handler with no functions installed.
- /// @param system_ The system context to construct this service under.
- /// @param service_name_ Name of the service.
- /// @param max_sessions_ Maximum number of sessions that can be connected to this service at the
- /// same time.
- explicit ServiceFramework(Core::System& system_, const char* service_name_, u32 max_sessions_ = ServerSessionCountMax)
- : ServiceFrameworkBase(system_, service_name_, max_sessions_, Invoker)
- {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- UNREACHABLE();
- }
- std::optional<FunctionInfoBase> FindRequestTipc(u32 key) override {
- UNREACHABLE();
+ /**
+ * Registers handlers in the service. Usually prefer using the other RegisterHandlers
+ * overload in order to avoid needing to specify the array size.
+ */
+ template <typename T = Self>
+ void RegisterHandlersTipc(const FunctionInfoTyped<T>* functions, std::size_t n) {
+ RegisterHandlersBaseTipc(functions, n);
}
protected:
diff --git a/src/core/hle/service/services.h b/src/core/hle/service/services.h
index da5281ff29..4072afa3d1 100644
--- a/src/core/hle/service/services.h
+++ b/src/core/hle/service/services.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
diff --git a/src/core/hle/service/set/factory_settings_server.cpp b/src/core/hle/service/set/factory_settings_server.cpp
index 70d02fab3b..d663283c98 100644
--- a/src/core/hle/service/set/factory_settings_server.cpp
+++ b/src/core/hle/service/set/factory_settings_server.cpp
@@ -10,6 +10,55 @@ namespace Service::Set {
IFactorySettingsServer::IFactorySettingsServer(Core::System& system_)
: ServiceFramework{system_, "set:cal"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetBluetoothBdAddress"},
+ {1, nullptr, "GetConfigurationId1"},
+ {2, nullptr, "GetAccelerometerOffset"},
+ {3, nullptr, "GetAccelerometerScale"},
+ {4, nullptr, "GetGyroscopeOffset"},
+ {5, nullptr, "GetGyroscopeScale"},
+ {6, nullptr, "GetWirelessLanMacAddress"},
+ {7, nullptr, "GetWirelessLanCountryCodeCount"},
+ {8, nullptr, "GetWirelessLanCountryCodes"},
+ {9, nullptr, "GetSerialNumber"},
+ {10, nullptr, "SetInitialSystemAppletProgramId"},
+ {11, nullptr, "SetOverlayDispProgramId"},
+ {12, nullptr, "GetBatteryLot"},
+ {14, nullptr, "GetEciDeviceCertificate"},
+ {15, nullptr, "GetEticketDeviceCertificate"},
+ {16, nullptr, "GetSslKey"},
+ {17, nullptr, "GetSslCertificate"},
+ {18, nullptr, "GetGameCardKey"},
+ {19, nullptr, "GetGameCardCertificate"},
+ {20, nullptr, "GetEciDeviceKey"},
+ {21, nullptr, "GetEticketDeviceKey"},
+ {22, nullptr, "GetSpeakerParameter"},
+ {23, nullptr, "GetLcdVendorId"},
+ {24, nullptr, "GetEciDeviceCertificate2"},
+ {25, nullptr, "GetEciDeviceKey2"},
+ {26, nullptr, "GetAmiiboKey"},
+ {27, nullptr, "GetAmiiboEcqvCertificate"},
+ {28, nullptr, "GetAmiiboEcdsaCertificate"},
+ {29, nullptr, "GetAmiiboEcqvBlsKey"},
+ {30, nullptr, "GetAmiiboEcqvBlsCertificate"},
+ {31, nullptr, "GetAmiiboEcqvBlsRootCertificate"},
+ {32, nullptr, "GetUsbTypeCPowerSourceCircuitVersion"},
+ {33, nullptr, "GetAnalogStickModuleTypeL"},
+ {34, nullptr, "GetAnalogStickModelParameterL"},
+ {35, nullptr, "GetAnalogStickFactoryCalibrationL"},
+ {36, nullptr, "GetAnalogStickModuleTypeR"},
+ {37, nullptr, "GetAnalogStickModelParameterR"},
+ {38, nullptr, "GetAnalogStickFactoryCalibrationR"},
+ {39, nullptr, "GetConsoleSixAxisSensorModuleType"},
+ {40, nullptr, "GetConsoleSixAxisSensorHorizontalOffset"},
+ {41, nullptr, "GetBatteryVersion"},
+ {42, nullptr, "GetDeviceId"},
+ {43, nullptr, "GetConsoleSixAxisSensorMountType"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IFactorySettingsServer::~IFactorySettingsServer() = default;
diff --git a/src/core/hle/service/set/factory_settings_server.h b/src/core/hle/service/set/factory_settings_server.h
index dcc329f9c2..ddffcee643 100644
--- a/src/core/hle/service/set/factory_settings_server.h
+++ b/src/core/hle/service/set/factory_settings_server.h
@@ -18,55 +18,6 @@ class IFactorySettingsServer final : public ServiceFramework<IFactorySettingsSer
public:
explicit IFactorySettingsServer(Core::System& system_);
~IFactorySettingsServer() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetBluetoothBdAddress"},
- FunctionInfo{1, nullptr, "GetConfigurationId1"},
- FunctionInfo{2, nullptr, "GetAccelerometerOffset"},
- FunctionInfo{3, nullptr, "GetAccelerometerScale"},
- FunctionInfo{4, nullptr, "GetGyroscopeOffset"},
- FunctionInfo{5, nullptr, "GetGyroscopeScale"},
- FunctionInfo{6, nullptr, "GetWirelessLanMacAddress"},
- FunctionInfo{7, nullptr, "GetWirelessLanCountryCodeCount"},
- FunctionInfo{8, nullptr, "GetWirelessLanCountryCodes"},
- FunctionInfo{9, nullptr, "GetSerialNumber"},
- FunctionInfo{10, nullptr, "SetInitialSystemAppletProgramId"},
- FunctionInfo{11, nullptr, "SetOverlayDispProgramId"},
- FunctionInfo{12, nullptr, "GetBatteryLot"},
- FunctionInfo{14, nullptr, "GetEciDeviceCertificate"},
- FunctionInfo{15, nullptr, "GetEticketDeviceCertificate"},
- FunctionInfo{16, nullptr, "GetSslKey"},
- FunctionInfo{17, nullptr, "GetSslCertificate"},
- FunctionInfo{18, nullptr, "GetGameCardKey"},
- FunctionInfo{19, nullptr, "GetGameCardCertificate"},
- FunctionInfo{20, nullptr, "GetEciDeviceKey"},
- FunctionInfo{21, nullptr, "GetEticketDeviceKey"},
- FunctionInfo{22, nullptr, "GetSpeakerParameter"},
- FunctionInfo{23, nullptr, "GetLcdVendorId"},
- FunctionInfo{24, nullptr, "GetEciDeviceCertificate2"},
- FunctionInfo{25, nullptr, "GetEciDeviceKey2"},
- FunctionInfo{26, nullptr, "GetAmiiboKey"},
- FunctionInfo{27, nullptr, "GetAmiiboEcqvCertificate"},
- FunctionInfo{28, nullptr, "GetAmiiboEcdsaCertificate"},
- FunctionInfo{29, nullptr, "GetAmiiboEcqvBlsKey"},
- FunctionInfo{30, nullptr, "GetAmiiboEcqvBlsCertificate"},
- FunctionInfo{31, nullptr, "GetAmiiboEcqvBlsRootCertificate"},
- FunctionInfo{32, nullptr, "GetUsbTypeCPowerSourceCircuitVersion"},
- FunctionInfo{33, nullptr, "GetAnalogStickModuleTypeL"},
- FunctionInfo{34, nullptr, "GetAnalogStickModelParameterL"},
- FunctionInfo{35, nullptr, "GetAnalogStickFactoryCalibrationL"},
- FunctionInfo{36, nullptr, "GetAnalogStickModuleTypeR"},
- FunctionInfo{37, nullptr, "GetAnalogStickModelParameterR"},
- FunctionInfo{38, nullptr, "GetAnalogStickFactoryCalibrationR"},
- FunctionInfo{39, nullptr, "GetConsoleSixAxisSensorModuleType"},
- FunctionInfo{40, nullptr, "GetConsoleSixAxisSensorHorizontalOffset"},
- FunctionInfo{41, nullptr, "GetBatteryVersion"},
- FunctionInfo{42, nullptr, "GetDeviceId"},
- FunctionInfo{43, nullptr, "GetConsoleSixAxisSensorMountType"}
- );
};
} // namespace Service::Set
diff --git a/src/core/hle/service/set/firmware_debug_settings_server.cpp b/src/core/hle/service/set/firmware_debug_settings_server.cpp
index 35fb43f7e7..c491675567 100644
--- a/src/core/hle/service/set/firmware_debug_settings_server.cpp
+++ b/src/core/hle/service/set/firmware_debug_settings_server.cpp
@@ -10,6 +10,23 @@ namespace Service::Set {
IFirmwareDebugSettingsServer::IFirmwareDebugSettingsServer(Core::System& system_)
: ServiceFramework{system_, "set:fd"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {2, nullptr, "SetSettingsItemValue"},
+ {3, nullptr, "ResetSettingsItemValue"},
+ {4, nullptr, "CreateSettingsItemKeyIterator"},
+ {10, nullptr, "ReadSettings"},
+ {11, nullptr, "ResetSettings"},
+ {20, nullptr, "SetWebInspectorFlag"},
+ {21, nullptr, "SetAllowedSslHosts"},
+ {22, nullptr, "SetHostFsMountPoint"},
+ {23, nullptr, "SetMemoryUsageRateFlag"},
+ {24, nullptr, "CommitSettings"}, //20.0.0+
+ {27, nullptr, "SetHttpAuthConfigs"}, //21.0.0+
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IFirmwareDebugSettingsServer::~IFirmwareDebugSettingsServer() = default;
diff --git a/src/core/hle/service/set/firmware_debug_settings_server.h b/src/core/hle/service/set/firmware_debug_settings_server.h
index 3727a1a94c..05019faa9f 100644
--- a/src/core/hle/service/set/firmware_debug_settings_server.h
+++ b/src/core/hle/service/set/firmware_debug_settings_server.h
@@ -18,23 +18,6 @@ class IFirmwareDebugSettingsServer final : public ServiceFramework<IFirmwareDebu
public:
explicit IFirmwareDebugSettingsServer(Core::System& system_);
~IFirmwareDebugSettingsServer() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{2, nullptr, "SetSettingsItemValue"},
- FunctionInfo{3, nullptr, "ResetSettingsItemValue"},
- FunctionInfo{4, nullptr, "CreateSettingsItemKeyIterator"},
- FunctionInfo{10, nullptr, "ReadSettings"},
- FunctionInfo{11, nullptr, "ResetSettings"},
- FunctionInfo{20, nullptr, "SetWebInspectorFlag"},
- FunctionInfo{21, nullptr, "SetAllowedSslHosts"},
- FunctionInfo{22, nullptr, "SetHostFsMountPoint"},
- FunctionInfo{23, nullptr, "SetMemoryUsageRateFlag"},
- FunctionInfo{24, nullptr, "CommitSettings", MakeVersionGate({20,0,0})},
- FunctionInfo{27, nullptr, "SetHttpAuthConfigs", MakeVersionGate({21,0,0})}
- );
};
} // namespace Service::Set
diff --git a/src/core/hle/service/set/key_code_map.h b/src/core/hle/service/set/key_code_map.h
index c76dc57298..8e010e718b 100644
--- a/src/core/hle/service/set/key_code_map.h
+++ b/src/core/hle/service/set/key_code_map.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/core/hle/service/set/setting_formats/appln_settings.cpp b/src/core/hle/service/set/setting_formats/appln_settings.cpp
index f7c7d5b912..5726a41cdf 100644
--- a/src/core/hle/service/set/setting_formats/appln_settings.cpp
+++ b/src/core/hle/service/set/setting_formats/appln_settings.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/set/setting_formats/appln_settings.h b/src/core/hle/service/set/setting_formats/appln_settings.h
index ba9af998ab..2128a631e0 100644
--- a/src/core/hle/service/set/setting_formats/appln_settings.h
+++ b/src/core/hle/service/set/setting_formats/appln_settings.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/set/setting_formats/device_settings.cpp b/src/core/hle/service/set/setting_formats/device_settings.cpp
index 5f295404d9..6e9c321d8e 100644
--- a/src/core/hle/service/set/setting_formats/device_settings.cpp
+++ b/src/core/hle/service/set/setting_formats/device_settings.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/set/setting_formats/private_settings.cpp b/src/core/hle/service/set/setting_formats/private_settings.cpp
index 81c3624826..c3a67b60eb 100644
--- a/src/core/hle/service/set/setting_formats/private_settings.cpp
+++ b/src/core/hle/service/set/setting_formats/private_settings.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/set/setting_formats/private_settings.h b/src/core/hle/service/set/setting_formats/private_settings.h
index 6579e95e04..75e3e03886 100644
--- a/src/core/hle/service/set/setting_formats/private_settings.h
+++ b/src/core/hle/service/set/setting_formats/private_settings.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/set/setting_formats/system_settings.cpp b/src/core/hle/service/set/setting_formats/system_settings.cpp
index 258e213e13..fd70e2ace3 100644
--- a/src/core/hle/service/set/setting_formats/system_settings.cpp
+++ b/src/core/hle/service/set/setting_formats/system_settings.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
diff --git a/src/core/hle/service/set/settings.h b/src/core/hle/service/set/settings.h
index 03cd4bb661..e6288af2e5 100644
--- a/src/core/hle/service/set/settings.h
+++ b/src/core/hle/service/set/settings.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/set/settings_server.cpp b/src/core/hle/service/set/settings_server.cpp
index 4580cb723b..942dddc9bc 100644
--- a/src/core/hle/service/set/settings_server.cpp
+++ b/src/core/hle/service/set/settings_server.cpp
@@ -89,26 +89,26 @@ LanguageCode GetLanguageCodeFromIndex(std::size_t index) {
return available_language_codes.at(index);
}
-std::optional<ServiceFrameworkBase::FunctionInfoBase> ISettingsServer::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, C<&ISettingsServer::GetLanguageCode>, "GetLanguageCode"},
- FunctionInfo{1, C<&ISettingsServer::GetAvailableLanguageCodes>, "GetAvailableLanguageCodes"},
- FunctionInfo{2, C<&ISettingsServer::MakeLanguageCode>, "MakeLanguageCode"},
- FunctionInfo{3, C<&ISettingsServer::GetAvailableLanguageCodeCount>, "GetAvailableLanguageCodeCount"},
- FunctionInfo{4, C<&ISettingsServer::GetRegionCode>, "GetRegionCode"},
- FunctionInfo{5, C<&ISettingsServer::GetAvailableLanguageCodes2>, "GetAvailableLanguageCodes2"},
- FunctionInfo{6, C<&ISettingsServer::GetAvailableLanguageCodeCount2>, "GetAvailableLanguageCodeCount2"},
- FunctionInfo{7, C<&ISettingsServer::GetKeyCodeMap>, "GetKeyCodeMap"},
- FunctionInfo{8, C<&ISettingsServer::GetQuestFlag>, "GetQuestFlag"},
- FunctionInfo{9, C<&ISettingsServer::GetKeyCodeMap2>, "GetKeyCodeMap2"},
- FunctionInfo{10, nullptr, "GetFirmwareVersionForDebug"},
- FunctionInfo{11, C<&ISettingsServer::GetDeviceNickName>, "GetDeviceNickName"},
- FunctionInfo{12, C<&ISettingsServer::GetKeyCodeMapByPort>, "GetKeyCodeMapByPort"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
ISettingsServer::ISettingsServer(Core::System& system_) : ServiceFramework{system_, "set"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, C<&ISettingsServer::GetLanguageCode>, "GetLanguageCode"},
+ {1, C<&ISettingsServer::GetAvailableLanguageCodes>, "GetAvailableLanguageCodes"},
+ {2, C<&ISettingsServer::MakeLanguageCode>, "MakeLanguageCode"},
+ {3, C<&ISettingsServer::GetAvailableLanguageCodeCount>, "GetAvailableLanguageCodeCount"},
+ {4, C<&ISettingsServer::GetRegionCode>, "GetRegionCode"},
+ {5, C<&ISettingsServer::GetAvailableLanguageCodes2>, "GetAvailableLanguageCodes2"},
+ {6, C<&ISettingsServer::GetAvailableLanguageCodeCount2>, "GetAvailableLanguageCodeCount2"},
+ {7, C<&ISettingsServer::GetKeyCodeMap>, "GetKeyCodeMap"},
+ {8, C<&ISettingsServer::GetQuestFlag>, "GetQuestFlag"},
+ {9, C<&ISettingsServer::GetKeyCodeMap2>, "GetKeyCodeMap2"},
+ {10, nullptr, "GetFirmwareVersionForDebug"},
+ {11, C<&ISettingsServer::GetDeviceNickName>, "GetDeviceNickName"},
+ {12, C<&ISettingsServer::GetKeyCodeMapByPort>, "GetKeyCodeMapByPort"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
ISettingsServer::~ISettingsServer() = default;
diff --git a/src/core/hle/service/set/settings_server.h b/src/core/hle/service/set/settings_server.h
index 2aa487b8b1..c37a65cbc9 100644
--- a/src/core/hle/service/set/settings_server.h
+++ b/src/core/hle/service/set/settings_server.h
@@ -26,19 +26,31 @@ public:
private:
Result GetLanguageCode(Out<LanguageCode> out_language_code);
- Result GetAvailableLanguageCodes(Out<s32> out_count, OutArray<LanguageCode, BufferAttr_HipcPointer> language_codes);
+
+ Result GetAvailableLanguageCodes(Out<s32> out_count,
+ OutArray<LanguageCode, BufferAttr_HipcPointer> language_codes);
+
Result MakeLanguageCode(Out<LanguageCode> out_language_code, Language language);
+
Result GetAvailableLanguageCodeCount(Out<s32> out_count);
+
Result GetRegionCode(Out<SystemRegionCode> out_region_code);
- Result GetAvailableLanguageCodes2(Out<s32> out_count, OutArray<LanguageCode, BufferAttr_HipcMapAlias> language_codes);
+
+ Result GetAvailableLanguageCodes2(
+ Out<s32> out_count, OutArray<LanguageCode, BufferAttr_HipcMapAlias> language_codes);
+
Result GetAvailableLanguageCodeCount2(Out<s32> out_count);
+
Result GetKeyCodeMap(OutLargeData<KeyCodeMap, BufferAttr_HipcMapAlias> out_key_code_map);
+
Result GetQuestFlag(Out<bool> out_quest_flag);
+
Result GetKeyCodeMap2(OutLargeData<KeyCodeMap, BufferAttr_HipcMapAlias> out_key_code_map);
- Result GetDeviceNickName(OutLargeData<std::array<u8, 0x80>, BufferAttr_HipcMapAlias> out_device_name);
- Result GetKeyCodeMapByPort(OutLargeData<KeyCodeMap, BufferAttr_HipcMapAlias> out_key_code_map, u32 port);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
+ Result GetDeviceNickName(
+ OutLargeData<std::array<u8, 0x80>, BufferAttr_HipcMapAlias> out_device_name);
+
+ Result GetKeyCodeMapByPort(OutLargeData<KeyCodeMap, BufferAttr_HipcMapAlias> out_key_code_map, u32 port);
};
} // namespace Service::Set
diff --git a/src/core/hle/service/set/system_settings_server.cpp b/src/core/hle/service/set/system_settings_server.cpp
index 925207d927..52642e37f7 100644
--- a/src/core/hle/service/set/system_settings_server.cpp
+++ b/src/core/hle/service/set/system_settings_server.cpp
@@ -114,239 +114,240 @@ Result GetFirmwareVersionImpl(FirmwareVersionFormat& out_firmware, Core::System&
return ResultSuccess;
}
-std::optional<ServiceFrameworkBase::FunctionInfoBase> ISystemSettingsServer::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, C<&ISystemSettingsServer::SetLanguageCode>, "SetLanguageCode"},
- FunctionInfo{1, nullptr, "SetNetworkSettings"},
- FunctionInfo{2, nullptr, "GetNetworkSettings"},
- FunctionInfo{3, C<&ISystemSettingsServer::GetFirmwareVersion>, "GetFirmwareVersion"},
- FunctionInfo{4, C<&ISystemSettingsServer::GetFirmwareVersion2>, "GetFirmwareVersion2"},
- FunctionInfo{5, nullptr, "GetFirmwareVersionDigest"},
- FunctionInfo{7, C<&ISystemSettingsServer::GetLockScreenFlag>, "GetLockScreenFlag"},
- FunctionInfo{8, C<&ISystemSettingsServer::SetLockScreenFlag>, "SetLockScreenFlag"},
- FunctionInfo{9, nullptr, "GetBacklightSettings"},
- FunctionInfo{10, nullptr, "SetBacklightSettings"},
- FunctionInfo{11, nullptr, "SetBluetoothDevicesSettings"},
- FunctionInfo{12, nullptr, "GetBluetoothDevicesSettings"},
- FunctionInfo{13, C<&ISystemSettingsServer::GetExternalSteadyClockSourceId>, "GetExternalSteadyClockSourceId"},
- FunctionInfo{14, C<&ISystemSettingsServer::SetExternalSteadyClockSourceId>, "SetExternalSteadyClockSourceId"},
- FunctionInfo{15, C<&ISystemSettingsServer::GetUserSystemClockContext>, "GetUserSystemClockContext"},
- FunctionInfo{16, C<&ISystemSettingsServer::SetUserSystemClockContext>, "SetUserSystemClockContext"},
- FunctionInfo{17, C<&ISystemSettingsServer::GetAccountSettings>, "GetAccountSettings"},
- FunctionInfo{18, C<&ISystemSettingsServer::SetAccountSettings>, "SetAccountSettings"},
- FunctionInfo{19, nullptr, "GetAudioVolume"},
- FunctionInfo{20, nullptr, "SetAudioVolume"},
- FunctionInfo{21, C<&ISystemSettingsServer::GetEulaVersions>, "GetEulaVersions"},
- FunctionInfo{22, C<&ISystemSettingsServer::SetEulaVersions>, "SetEulaVersions"},
- FunctionInfo{23, C<&ISystemSettingsServer::GetColorSetId>, "GetColorSetId"},
- FunctionInfo{24, C<&ISystemSettingsServer::SetColorSetId>, "SetColorSetId"},
- FunctionInfo{25, C<&ISystemSettingsServer::GetConsoleInformationUploadFlag>, "GetConsoleInformationUploadFlag"},
- FunctionInfo{26, C<&ISystemSettingsServer::SetConsoleInformationUploadFlag>, "SetConsoleInformationUploadFlag"},
- FunctionInfo{27, C<&ISystemSettingsServer::GetAutomaticApplicationDownloadFlag>, "GetAutomaticApplicationDownloadFlag"},
- FunctionInfo{28, C<&ISystemSettingsServer::SetAutomaticApplicationDownloadFlag>, "SetAutomaticApplicationDownloadFlag"},
- FunctionInfo{29, C<&ISystemSettingsServer::GetNotificationSettings>, "GetNotificationSettings"},
- FunctionInfo{30, C<&ISystemSettingsServer::SetNotificationSettings>, "SetNotificationSettings"},
- FunctionInfo{31, C<&ISystemSettingsServer::GetAccountNotificationSettings>, "GetAccountNotificationSettings"},
- FunctionInfo{32, C<&ISystemSettingsServer::SetAccountNotificationSettings>, "SetAccountNotificationSettings"},
- FunctionInfo{35, C<&ISystemSettingsServer::GetVibrationMasterVolume>, "GetVibrationMasterVolume"},
- FunctionInfo{36, C<&ISystemSettingsServer::SetVibrationMasterVolume>, "SetVibrationMasterVolume"},
- FunctionInfo{37, C<&ISystemSettingsServer::GetSettingsItemValueSize>, "GetSettingsItemValueSize"},
- FunctionInfo{38, C<&ISystemSettingsServer::GetSettingsItemValue>, "GetSettingsItemValue"},
- FunctionInfo{39, C<&ISystemSettingsServer::GetTvSettings>, "GetTvSettings"},
- FunctionInfo{40, C<&ISystemSettingsServer::SetTvSettings>, "SetTvSettings"},
- FunctionInfo{41, nullptr, "GetEdid"},
- FunctionInfo{42, nullptr, "SetEdid"},
- FunctionInfo{43, C<&ISystemSettingsServer::GetAudioOutputMode>, "GetAudioOutputMode"},
- FunctionInfo{44, C<&ISystemSettingsServer::SetAudioOutputMode>, "SetAudioOutputMode"},
- FunctionInfo{45, C<&ISystemSettingsServer::GetSpeakerAutoMuteFlag>, "GetSpeakerAutoMuteFlag"},
- FunctionInfo{46, C<&ISystemSettingsServer::SetSpeakerAutoMuteFlag>, "SetSpeakerAutoMuteFlag"},
- FunctionInfo{47, C<&ISystemSettingsServer::GetQuestFlag>, "GetQuestFlag"},
- FunctionInfo{48, C<&ISystemSettingsServer::SetQuestFlag>, "SetQuestFlag"},
- FunctionInfo{49, nullptr, "GetDataDeletionSettings"},
- FunctionInfo{50, nullptr, "SetDataDeletionSettings"},
- FunctionInfo{51, nullptr, "GetInitialSystemAppletProgramId"},
- FunctionInfo{52, nullptr, "GetOverlayDispProgramId"},
- FunctionInfo{53, C<&ISystemSettingsServer::GetDeviceTimeZoneLocationName>, "GetDeviceTimeZoneLocationName"},
- FunctionInfo{54, C<&ISystemSettingsServer::SetDeviceTimeZoneLocationName>, "SetDeviceTimeZoneLocationName"},
- FunctionInfo{55, nullptr, "GetWirelessCertificationFileSize"},
- FunctionInfo{56, nullptr, "GetWirelessCertificationFile"},
- FunctionInfo{57, C<&ISystemSettingsServer::SetRegionCode>, "SetRegionCode"},
- FunctionInfo{58, C<&ISystemSettingsServer::GetNetworkSystemClockContext>, "GetNetworkSystemClockContext"},
- FunctionInfo{59, C<&ISystemSettingsServer::SetNetworkSystemClockContext>, "SetNetworkSystemClockContext"},
- FunctionInfo{60, C<&ISystemSettingsServer::IsUserSystemClockAutomaticCorrectionEnabled>, "IsUserSystemClockAutomaticCorrectionEnabled"},
- FunctionInfo{61, C<&ISystemSettingsServer::SetUserSystemClockAutomaticCorrectionEnabled>, "SetUserSystemClockAutomaticCorrectionEnabled"},
- FunctionInfo{62, C<&ISystemSettingsServer::GetDebugModeFlag>, "GetDebugModeFlag"},
- FunctionInfo{63, C<&ISystemSettingsServer::GetPrimaryAlbumStorage>, "GetPrimaryAlbumStorage"},
- FunctionInfo{64, C<&ISystemSettingsServer::SetPrimaryAlbumStorage>, "SetPrimaryAlbumStorage"},
- FunctionInfo{65, C<&ISystemSettingsServer::GetUsb30EnableFlag>, "GetUsb30EnableFlag"},
- FunctionInfo{66, C<&ISystemSettingsServer::SetUsb30EnableFlag>, "SetUsb30EnableFlag"},
- FunctionInfo{67, C<&ISystemSettingsServer::GetBatteryLot>, "GetBatteryLot"},
- FunctionInfo{68, C<&ISystemSettingsServer::GetSerialNumber>, "GetSerialNumber"},
- FunctionInfo{69, C<&ISystemSettingsServer::GetNfcEnableFlag>, "GetNfcEnableFlag"},
- FunctionInfo{70, C<&ISystemSettingsServer::SetNfcEnableFlag>, "SetNfcEnableFlag"},
- FunctionInfo{71, C<&ISystemSettingsServer::GetSleepSettings>, "GetSleepSettings"},
- FunctionInfo{72, C<&ISystemSettingsServer::SetSleepSettings>, "SetSleepSettings"},
- FunctionInfo{73, C<&ISystemSettingsServer::GetWirelessLanEnableFlag>, "GetWirelessLanEnableFlag"},
- FunctionInfo{74, C<&ISystemSettingsServer::SetWirelessLanEnableFlag>, "SetWirelessLanEnableFlag"},
- FunctionInfo{75, C<&ISystemSettingsServer::GetInitialLaunchSettings>, "GetInitialLaunchSettings"},
- FunctionInfo{76, C<&ISystemSettingsServer::SetInitialLaunchSettings>, "SetInitialLaunchSettings"},
- FunctionInfo{77, C<&ISystemSettingsServer::GetDeviceNickName>, "GetDeviceNickName"},
- FunctionInfo{78, C<&ISystemSettingsServer::SetDeviceNickName>, "SetDeviceNickName"},
- FunctionInfo{79, C<&ISystemSettingsServer::GetProductModel>, "GetProductModel"},
- FunctionInfo{80, nullptr, "GetLdnChannel"},
- FunctionInfo{81, nullptr, "SetLdnChannel"},
- FunctionInfo{82, nullptr, "AcquireTelemetryDirtyFlagEventHandle"},
- FunctionInfo{83, nullptr, "GetTelemetryDirtyFlags"},
- FunctionInfo{84, nullptr, "GetPtmBatteryLot"},
- FunctionInfo{85, nullptr, "SetPtmBatteryLot"},
- FunctionInfo{86, nullptr, "GetPtmFuelGaugeParameter"},
- FunctionInfo{87, nullptr, "SetPtmFuelGaugeParameter"},
- FunctionInfo{88, C<&ISystemSettingsServer::GetBluetoothEnableFlag>, "GetBluetoothEnableFlag"},
- FunctionInfo{89, C<&ISystemSettingsServer::SetBluetoothEnableFlag>, "SetBluetoothEnableFlag"},
- FunctionInfo{90, C<&ISystemSettingsServer::GetMiiAuthorId>, "GetMiiAuthorId"},
- FunctionInfo{91, nullptr, "SetShutdownRtcValue"},
- FunctionInfo{92, nullptr, "GetShutdownRtcValue"},
- FunctionInfo{93, nullptr, "AcquireFatalDirtyFlagEventHandle"},
- FunctionInfo{94, nullptr, "GetFatalDirtyFlags"},
- FunctionInfo{95, C<&ISystemSettingsServer::GetAutoUpdateEnableFlag>, "GetAutoUpdateEnableFlag"},
- FunctionInfo{96, C<&ISystemSettingsServer::SetAutoUpdateEnableFlag>, "SetAutoUpdateEnableFlag"},
- FunctionInfo{97, nullptr, "GetNxControllerSettings"},
- FunctionInfo{98, nullptr, "SetNxControllerSettings"},
- FunctionInfo{99, C<&ISystemSettingsServer::GetBatteryPercentageFlag>, "GetBatteryPercentageFlag"},
- FunctionInfo{100, C<&ISystemSettingsServer::SetBatteryPercentageFlag>, "SetBatteryPercentageFlag"},
- FunctionInfo{101, nullptr, "GetExternalRtcResetFlag"},
- FunctionInfo{102, nullptr, "SetExternalRtcResetFlag"},
- FunctionInfo{103, nullptr, "GetUsbFullKeyEnableFlag"},
- FunctionInfo{104, nullptr, "SetUsbFullKeyEnableFlag"},
- FunctionInfo{105, C<&ISystemSettingsServer::SetExternalSteadyClockInternalOffset>, "SetExternalSteadyClockInternalOffset"},
- FunctionInfo{106, C<&ISystemSettingsServer::GetExternalSteadyClockInternalOffset>, "GetExternalSteadyClockInternalOffset"},
- FunctionInfo{107, nullptr, "GetBacklightSettingsEx"},
- FunctionInfo{108, nullptr, "SetBacklightSettingsEx"},
- FunctionInfo{109, nullptr, "GetHeadphoneVolumeWarningCount"},
- FunctionInfo{110, nullptr, "SetHeadphoneVolumeWarningCount"},
- FunctionInfo{111, nullptr, "GetBluetoothAfhEnableFlag"},
- FunctionInfo{112, nullptr, "SetBluetoothAfhEnableFlag"},
- FunctionInfo{113, nullptr, "GetBluetoothBoostEnableFlag"},
- FunctionInfo{114, nullptr, "SetBluetoothBoostEnableFlag"},
- FunctionInfo{115, nullptr, "GetInRepairProcessEnableFlag"},
- FunctionInfo{116, nullptr, "SetInRepairProcessEnableFlag"},
- FunctionInfo{117, nullptr, "GetHeadphoneVolumeUpdateFlag"},
- FunctionInfo{118, nullptr, "SetHeadphoneVolumeUpdateFlag"},
- FunctionInfo{119, nullptr, "NeedsToUpdateHeadphoneVolume"},
- FunctionInfo{120, C<&ISystemSettingsServer::GetPushNotificationActivityModeOnSleep>, "GetPushNotificationActivityModeOnSleep"},
- FunctionInfo{121, C<&ISystemSettingsServer::SetPushNotificationActivityModeOnSleep>, "SetPushNotificationActivityModeOnSleep"},
- FunctionInfo{122, nullptr, "GetServiceDiscoveryControlSettings"},
- FunctionInfo{123, nullptr, "SetServiceDiscoveryControlSettings"},
- FunctionInfo{124, C<&ISystemSettingsServer::GetErrorReportSharePermission>, "GetErrorReportSharePermission"},
- FunctionInfo{125, C<&ISystemSettingsServer::SetErrorReportSharePermission>, "SetErrorReportSharePermission"},
- FunctionInfo{126, C<&ISystemSettingsServer::GetAppletLaunchFlags>, "GetAppletLaunchFlags"},
- FunctionInfo{127, C<&ISystemSettingsServer::SetAppletLaunchFlags>, "SetAppletLaunchFlags"},
- FunctionInfo{128, nullptr, "GetConsoleSixAxisSensorAccelerationBias"},
- FunctionInfo{129, nullptr, "SetConsoleSixAxisSensorAccelerationBias"},
- FunctionInfo{130, nullptr, "GetConsoleSixAxisSensorAngularVelocityBias"},
- FunctionInfo{131, nullptr, "SetConsoleSixAxisSensorAngularVelocityBias"},
- FunctionInfo{132, nullptr, "GetConsoleSixAxisSensorAccelerationGain"},
- FunctionInfo{133, nullptr, "SetConsoleSixAxisSensorAccelerationGain"},
- FunctionInfo{134, nullptr, "GetConsoleSixAxisSensorAngularVelocityGain"},
- FunctionInfo{135, nullptr, "SetConsoleSixAxisSensorAngularVelocityGain"},
- FunctionInfo{136, C<&ISystemSettingsServer::GetKeyboardLayout>, "GetKeyboardLayout"},
- FunctionInfo{137, C<&ISystemSettingsServer::SetKeyboardLayout>, "SetKeyboardLayout"},
- FunctionInfo{138, nullptr, "GetWebInspectorFlag"},
- FunctionInfo{139, nullptr, "GetAllowedSslHosts"},
- FunctionInfo{140, nullptr, "GetHostFsMountPoint"},
- FunctionInfo{141, nullptr, "GetRequiresRunRepairTimeReviser"},
- FunctionInfo{142, nullptr, "SetRequiresRunRepairTimeReviser"},
- FunctionInfo{143, nullptr, "SetBlePairingSettings"},
- FunctionInfo{144, nullptr, "GetBlePairingSettings"},
- FunctionInfo{145, nullptr, "GetConsoleSixAxisSensorAngularVelocityTimeBias"},
- FunctionInfo{146, nullptr, "SetConsoleSixAxisSensorAngularVelocityTimeBias"},
- FunctionInfo{147, nullptr, "GetConsoleSixAxisSensorAngularAcceleration"},
- FunctionInfo{148, nullptr, "SetConsoleSixAxisSensorAngularAcceleration"},
- FunctionInfo{149, C<&ISystemSettingsServer::GetRebootlessSystemUpdateVersion>, "GetRebootlessSystemUpdateVersion"},
- FunctionInfo{150, C<&ISystemSettingsServer::GetDeviceTimeZoneLocationUpdatedTime>, "GetDeviceTimeZoneLocationUpdatedTime"},
- FunctionInfo{151, C<&ISystemSettingsServer::SetDeviceTimeZoneLocationUpdatedTime>, "SetDeviceTimeZoneLocationUpdatedTime"},
- FunctionInfo{152, C<&ISystemSettingsServer::GetUserSystemClockAutomaticCorrectionUpdatedTime>, "GetUserSystemClockAutomaticCorrectionUpdatedTime"},
- FunctionInfo{153, C<&ISystemSettingsServer::SetUserSystemClockAutomaticCorrectionUpdatedTime>, "SetUserSystemClockAutomaticCorrectionUpdatedTime"},
- FunctionInfo{154, nullptr, "GetAccountOnlineStorageSettings"},
- FunctionInfo{155, nullptr, "SetAccountOnlineStorageSettings"},
- FunctionInfo{156, nullptr, "GetPctlReadyFlag"},
- FunctionInfo{157, nullptr, "SetPctlReadyFlag"},
- FunctionInfo{158, nullptr, "GetAnalogStickUserCalibrationL"},
- FunctionInfo{159, nullptr, "SetAnalogStickUserCalibrationL"},
- FunctionInfo{160, nullptr, "GetAnalogStickUserCalibrationR"},
- FunctionInfo{161, nullptr, "SetAnalogStickUserCalibrationR"},
- FunctionInfo{162, nullptr, "GetPtmBatteryVersion"},
- FunctionInfo{163, nullptr, "SetPtmBatteryVersion"},
- FunctionInfo{164, nullptr, "GetUsb30HostEnableFlag"},
- FunctionInfo{165, nullptr, "SetUsb30HostEnableFlag"},
- FunctionInfo{166, nullptr, "GetUsb30DeviceEnableFlag"},
- FunctionInfo{167, nullptr, "SetUsb30DeviceEnableFlag"},
- FunctionInfo{168, nullptr, "GetThemeId"},
- FunctionInfo{169, nullptr, "SetThemeId"},
- FunctionInfo{170, C<&ISystemSettingsServer::GetChineseTraditionalInputMethod>, "GetChineseTraditionalInputMethod"},
- FunctionInfo{171, nullptr, "SetChineseTraditionalInputMethod"},
- FunctionInfo{172, nullptr, "GetPtmCycleCountReliability"},
- FunctionInfo{173, nullptr, "SetPtmCycleCountReliability"},
- FunctionInfo{174, C<&ISystemSettingsServer::GetHomeMenuScheme>, "GetHomeMenuScheme"},
- FunctionInfo{175, nullptr, "GetThemeSettings"},
- FunctionInfo{176, nullptr, "SetThemeSettings"},
- FunctionInfo{177, nullptr, "GetThemeKey"},
- FunctionInfo{178, nullptr, "SetThemeKey"},
- FunctionInfo{179, nullptr, "GetZoomFlag"},
- FunctionInfo{180, nullptr, "SetZoomFlag"},
- FunctionInfo{181, nullptr, "GetT"},
- FunctionInfo{182, nullptr, "SetT"},
- FunctionInfo{183, C<&ISystemSettingsServer::GetPlatformRegion>, "GetPlatformRegion"},
- FunctionInfo{184, C<&ISystemSettingsServer::SetPlatformRegion>, "SetPlatformRegion"},
- FunctionInfo{185, C<&ISystemSettingsServer::GetHomeMenuSchemeModel>, "GetHomeMenuSchemeModel"},
- FunctionInfo{186, nullptr, "GetMemoryUsageRateFlag"},
- FunctionInfo{187, C<&ISystemSettingsServer::GetTouchScreenMode>, "GetTouchScreenMode"},
- FunctionInfo{188, C<&ISystemSettingsServer::SetTouchScreenMode>, "SetTouchScreenMode"},
- FunctionInfo{189, nullptr, "GetButtonConfigSettingsFull"},
- FunctionInfo{190, nullptr, "SetButtonConfigSettingsFull"},
- FunctionInfo{191, nullptr, "GetButtonConfigSettingsEmbedded"},
- FunctionInfo{192, nullptr, "SetButtonConfigSettingsEmbedded"},
- FunctionInfo{193, nullptr, "GetButtonConfigSettingsLeft"},
- FunctionInfo{194, nullptr, "SetButtonConfigSettingsLeft"},
- FunctionInfo{195, nullptr, "GetButtonConfigSettingsRight"},
- FunctionInfo{196, nullptr, "SetButtonConfigSettingsRight"},
- FunctionInfo{197, nullptr, "GetButtonConfigRegisteredSettingsEmbedded"},
- FunctionInfo{198, nullptr, "SetButtonConfigRegisteredSettingsEmbedded"},
- FunctionInfo{199, nullptr, "GetButtonConfigRegisteredSettings"},
- FunctionInfo{200, nullptr, "SetButtonConfigRegisteredSettings"},
- FunctionInfo{201, C<&ISystemSettingsServer::GetFieldTestingFlag>, "GetFieldTestingFlag"},
- FunctionInfo{202, nullptr, "SetFieldTestingFlag"},
- FunctionInfo{203, C<&ISystemSettingsServer::GetPanelCrcMode>, "GetPanelCrcMode"},
- FunctionInfo{204, C<&ISystemSettingsServer::SetPanelCrcMode>, "SetPanelCrcMode"},
- FunctionInfo{205, nullptr, "GetNxControllerSettingsEx"},
- FunctionInfo{206, nullptr, "SetNxControllerSettingsEx"},
- FunctionInfo{207, nullptr, "GetHearingProtectionSafeguardFlag"},
- FunctionInfo{208, nullptr, "SetHearingProtectionSafeguardFlag"},
- FunctionInfo{209, nullptr, "GetHearingProtectionSafeguardRemainingTime"},
- FunctionInfo{210, nullptr, "SetHearingProtectionSafeguardRemainingTime"},
- FunctionInfo{221, nullptr, "GetForceMonauralOutputFlag", MakeVersionGate({17,0,0})},
- FunctionInfo{222, nullptr, "SetForceMonauralOutputFlag", MakeVersionGate({17,0,0})},
- FunctionInfo{251, nullptr, "GetAccountIdentificationSettings", MakeVersionGate({18,0,0})},
- FunctionInfo{252, nullptr, "SetAccountIdentificationSettings", MakeVersionGate({18,0,0})},
- FunctionInfo{263, nullptr, "AcquireVphymDirtyFlagEventHandle", MakeVersionGate({20,0,0})},
- FunctionInfo{264, nullptr, "GetVphymDirtyFlags", MakeVersionGate({20,0,0})},
- FunctionInfo{282, nullptr, "ConvertToProductModel", MakeVersionGate({20,0,0})},
- FunctionInfo{283, nullptr, "ConvertToProductModelName", MakeVersionGate({20,0,0})},
- FunctionInfo{289, nullptr, "GetDefaultAccountIdentificationFlagSet", MakeVersionGate({20,0,0})},
- FunctionInfo{300, nullptr, "AcquirePushNotificationDirtyFlagEventHandle", MakeVersionGate({20,0,0})},
- FunctionInfo{301, nullptr, "GetPushNotificationDirtyFlags", MakeVersionGate({20,0,0})},
- FunctionInfo{306, nullptr, "GetPinCodeReregistrationGuideAccounts", MakeVersionGate({20,0,0})},
- FunctionInfo{307, nullptr, "SetPinCodeReregistrationGuideAccounts", MakeVersionGate({20,0,0})},
- FunctionInfo{315, C<&ISystemSettingsServer::GetHttpAuthConfigs>, "GetHttpAuthConfigs", MakeVersionGate({21,0,0})},
- FunctionInfo{319, C<&ISystemSettingsServer::GetAccountUserSettings>, "GetAccountUserSettings", MakeVersionGate({21,0,0})},
- FunctionInfo{320, nullptr, "SetAccountUserSettings", MakeVersionGate({21,0,0})},
- FunctionInfo{321, C<&ISystemSettingsServer::GetDefaultAccountUserSettings>, "GetDefaultAccountUserSettings", MakeVersionGate({21,0,0})}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
ISystemSettingsServer::ISystemSettingsServer(Core::System& system_)
- : ServiceFramework{system_, "set:sys"} {
+ : ServiceFramework{system_, "set:sys"}, m_system{system} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, C<&ISystemSettingsServer::SetLanguageCode>, "SetLanguageCode"},
+ {1, nullptr, "SetNetworkSettings"},
+ {2, nullptr, "GetNetworkSettings"},
+ {3, C<&ISystemSettingsServer::GetFirmwareVersion>, "GetFirmwareVersion"},
+ {4, C<&ISystemSettingsServer::GetFirmwareVersion2>, "GetFirmwareVersion2"},
+ {5, nullptr, "GetFirmwareVersionDigest"},
+ {7, C<&ISystemSettingsServer::GetLockScreenFlag>, "GetLockScreenFlag"},
+ {8, C<&ISystemSettingsServer::SetLockScreenFlag>, "SetLockScreenFlag"},
+ {9, nullptr, "GetBacklightSettings"},
+ {10, nullptr, "SetBacklightSettings"},
+ {11, nullptr, "SetBluetoothDevicesSettings"},
+ {12, nullptr, "GetBluetoothDevicesSettings"},
+ {13, C<&ISystemSettingsServer::GetExternalSteadyClockSourceId>, "GetExternalSteadyClockSourceId"},
+ {14, C<&ISystemSettingsServer::SetExternalSteadyClockSourceId>, "SetExternalSteadyClockSourceId"},
+ {15, C<&ISystemSettingsServer::GetUserSystemClockContext>, "GetUserSystemClockContext"},
+ {16, C<&ISystemSettingsServer::SetUserSystemClockContext>, "SetUserSystemClockContext"},
+ {17, C<&ISystemSettingsServer::GetAccountSettings>, "GetAccountSettings"},
+ {18, C<&ISystemSettingsServer::SetAccountSettings>, "SetAccountSettings"},
+ {19, nullptr, "GetAudioVolume"},
+ {20, nullptr, "SetAudioVolume"},
+ {21, C<&ISystemSettingsServer::GetEulaVersions>, "GetEulaVersions"},
+ {22, C<&ISystemSettingsServer::SetEulaVersions>, "SetEulaVersions"},
+ {23, C<&ISystemSettingsServer::GetColorSetId>, "GetColorSetId"},
+ {24, C<&ISystemSettingsServer::SetColorSetId>, "SetColorSetId"},
+ {25, C<&ISystemSettingsServer::GetConsoleInformationUploadFlag>, "GetConsoleInformationUploadFlag"},
+ {26, C<&ISystemSettingsServer::SetConsoleInformationUploadFlag>, "SetConsoleInformationUploadFlag"},
+ {27, C<&ISystemSettingsServer::GetAutomaticApplicationDownloadFlag>, "GetAutomaticApplicationDownloadFlag"},
+ {28, C<&ISystemSettingsServer::SetAutomaticApplicationDownloadFlag>, "SetAutomaticApplicationDownloadFlag"},
+ {29, C<&ISystemSettingsServer::GetNotificationSettings>, "GetNotificationSettings"},
+ {30, C<&ISystemSettingsServer::SetNotificationSettings>, "SetNotificationSettings"},
+ {31, C<&ISystemSettingsServer::GetAccountNotificationSettings>, "GetAccountNotificationSettings"},
+ {32, C<&ISystemSettingsServer::SetAccountNotificationSettings>, "SetAccountNotificationSettings"},
+ {35, C<&ISystemSettingsServer::GetVibrationMasterVolume>, "GetVibrationMasterVolume"},
+ {36, C<&ISystemSettingsServer::SetVibrationMasterVolume>, "SetVibrationMasterVolume"},
+ {37, C<&ISystemSettingsServer::GetSettingsItemValueSize>, "GetSettingsItemValueSize"},
+ {38, C<&ISystemSettingsServer::GetSettingsItemValue>, "GetSettingsItemValue"},
+ {39, C<&ISystemSettingsServer::GetTvSettings>, "GetTvSettings"},
+ {40, C<&ISystemSettingsServer::SetTvSettings>, "SetTvSettings"},
+ {41, nullptr, "GetEdid"},
+ {42, nullptr, "SetEdid"},
+ {43, C<&ISystemSettingsServer::GetAudioOutputMode>, "GetAudioOutputMode"},
+ {44, C<&ISystemSettingsServer::SetAudioOutputMode>, "SetAudioOutputMode"},
+ {45, C<&ISystemSettingsServer::GetSpeakerAutoMuteFlag>, "GetSpeakerAutoMuteFlag"},
+ {46, C<&ISystemSettingsServer::SetSpeakerAutoMuteFlag>, "SetSpeakerAutoMuteFlag"},
+ {47, C<&ISystemSettingsServer::GetQuestFlag>, "GetQuestFlag"},
+ {48, C<&ISystemSettingsServer::SetQuestFlag>, "SetQuestFlag"},
+ {49, nullptr, "GetDataDeletionSettings"},
+ {50, nullptr, "SetDataDeletionSettings"},
+ {51, nullptr, "GetInitialSystemAppletProgramId"},
+ {52, nullptr, "GetOverlayDispProgramId"},
+ {53, C<&ISystemSettingsServer::GetDeviceTimeZoneLocationName>, "GetDeviceTimeZoneLocationName"},
+ {54, C<&ISystemSettingsServer::SetDeviceTimeZoneLocationName>, "SetDeviceTimeZoneLocationName"},
+ {55, nullptr, "GetWirelessCertificationFileSize"},
+ {56, nullptr, "GetWirelessCertificationFile"},
+ {57, C<&ISystemSettingsServer::SetRegionCode>, "SetRegionCode"},
+ {58, C<&ISystemSettingsServer::GetNetworkSystemClockContext>, "GetNetworkSystemClockContext"},
+ {59, C<&ISystemSettingsServer::SetNetworkSystemClockContext>, "SetNetworkSystemClockContext"},
+ {60, C<&ISystemSettingsServer::IsUserSystemClockAutomaticCorrectionEnabled>, "IsUserSystemClockAutomaticCorrectionEnabled"},
+ {61, C<&ISystemSettingsServer::SetUserSystemClockAutomaticCorrectionEnabled>, "SetUserSystemClockAutomaticCorrectionEnabled"},
+ {62, C<&ISystemSettingsServer::GetDebugModeFlag>, "GetDebugModeFlag"},
+ {63, C<&ISystemSettingsServer::GetPrimaryAlbumStorage>, "GetPrimaryAlbumStorage"},
+ {64, C<&ISystemSettingsServer::SetPrimaryAlbumStorage>, "SetPrimaryAlbumStorage"},
+ {65, C<&ISystemSettingsServer::GetUsb30EnableFlag>, "GetUsb30EnableFlag"},
+ {66, C<&ISystemSettingsServer::SetUsb30EnableFlag>, "SetUsb30EnableFlag"},
+ {67, C<&ISystemSettingsServer::GetBatteryLot>, "GetBatteryLot"},
+ {68, C<&ISystemSettingsServer::GetSerialNumber>, "GetSerialNumber"},
+ {69, C<&ISystemSettingsServer::GetNfcEnableFlag>, "GetNfcEnableFlag"},
+ {70, C<&ISystemSettingsServer::SetNfcEnableFlag>, "SetNfcEnableFlag"},
+ {71, C<&ISystemSettingsServer::GetSleepSettings>, "GetSleepSettings"},
+ {72, C<&ISystemSettingsServer::SetSleepSettings>, "SetSleepSettings"},
+ {73, C<&ISystemSettingsServer::GetWirelessLanEnableFlag>, "GetWirelessLanEnableFlag"},
+ {74, C<&ISystemSettingsServer::SetWirelessLanEnableFlag>, "SetWirelessLanEnableFlag"},
+ {75, C<&ISystemSettingsServer::GetInitialLaunchSettings>, "GetInitialLaunchSettings"},
+ {76, C<&ISystemSettingsServer::SetInitialLaunchSettings>, "SetInitialLaunchSettings"},
+ {77, C<&ISystemSettingsServer::GetDeviceNickName>, "GetDeviceNickName"},
+ {78, C<&ISystemSettingsServer::SetDeviceNickName>, "SetDeviceNickName"},
+ {79, C<&ISystemSettingsServer::GetProductModel>, "GetProductModel"},
+ {80, nullptr, "GetLdnChannel"},
+ {81, nullptr, "SetLdnChannel"},
+ {82, nullptr, "AcquireTelemetryDirtyFlagEventHandle"},
+ {83, nullptr, "GetTelemetryDirtyFlags"},
+ {84, nullptr, "GetPtmBatteryLot"},
+ {85, nullptr, "SetPtmBatteryLot"},
+ {86, nullptr, "GetPtmFuelGaugeParameter"},
+ {87, nullptr, "SetPtmFuelGaugeParameter"},
+ {88, C<&ISystemSettingsServer::GetBluetoothEnableFlag>, "GetBluetoothEnableFlag"},
+ {89, C<&ISystemSettingsServer::SetBluetoothEnableFlag>, "SetBluetoothEnableFlag"},
+ {90, C<&ISystemSettingsServer::GetMiiAuthorId>, "GetMiiAuthorId"},
+ {91, nullptr, "SetShutdownRtcValue"},
+ {92, nullptr, "GetShutdownRtcValue"},
+ {93, nullptr, "AcquireFatalDirtyFlagEventHandle"},
+ {94, nullptr, "GetFatalDirtyFlags"},
+ {95, C<&ISystemSettingsServer::GetAutoUpdateEnableFlag>, "GetAutoUpdateEnableFlag"},
+ {96, C<&ISystemSettingsServer::SetAutoUpdateEnableFlag>, "SetAutoUpdateEnableFlag"},
+ {97, nullptr, "GetNxControllerSettings"},
+ {98, nullptr, "SetNxControllerSettings"},
+ {99, C<&ISystemSettingsServer::GetBatteryPercentageFlag>, "GetBatteryPercentageFlag"},
+ {100, C<&ISystemSettingsServer::SetBatteryPercentageFlag>, "SetBatteryPercentageFlag"},
+ {101, nullptr, "GetExternalRtcResetFlag"},
+ {102, nullptr, "SetExternalRtcResetFlag"},
+ {103, nullptr, "GetUsbFullKeyEnableFlag"},
+ {104, nullptr, "SetUsbFullKeyEnableFlag"},
+ {105, C<&ISystemSettingsServer::SetExternalSteadyClockInternalOffset>, "SetExternalSteadyClockInternalOffset"},
+ {106, C<&ISystemSettingsServer::GetExternalSteadyClockInternalOffset>, "GetExternalSteadyClockInternalOffset"},
+ {107, nullptr, "GetBacklightSettingsEx"},
+ {108, nullptr, "SetBacklightSettingsEx"},
+ {109, nullptr, "GetHeadphoneVolumeWarningCount"},
+ {110, nullptr, "SetHeadphoneVolumeWarningCount"},
+ {111, nullptr, "GetBluetoothAfhEnableFlag"},
+ {112, nullptr, "SetBluetoothAfhEnableFlag"},
+ {113, nullptr, "GetBluetoothBoostEnableFlag"},
+ {114, nullptr, "SetBluetoothBoostEnableFlag"},
+ {115, nullptr, "GetInRepairProcessEnableFlag"},
+ {116, nullptr, "SetInRepairProcessEnableFlag"},
+ {117, nullptr, "GetHeadphoneVolumeUpdateFlag"},
+ {118, nullptr, "SetHeadphoneVolumeUpdateFlag"},
+ {119, nullptr, "NeedsToUpdateHeadphoneVolume"},
+ {120, C<&ISystemSettingsServer::GetPushNotificationActivityModeOnSleep>, "GetPushNotificationActivityModeOnSleep"},
+ {121, C<&ISystemSettingsServer::SetPushNotificationActivityModeOnSleep>, "SetPushNotificationActivityModeOnSleep"},
+ {122, nullptr, "GetServiceDiscoveryControlSettings"},
+ {123, nullptr, "SetServiceDiscoveryControlSettings"},
+ {124, C<&ISystemSettingsServer::GetErrorReportSharePermission>, "GetErrorReportSharePermission"},
+ {125, C<&ISystemSettingsServer::SetErrorReportSharePermission>, "SetErrorReportSharePermission"},
+ {126, C<&ISystemSettingsServer::GetAppletLaunchFlags>, "GetAppletLaunchFlags"},
+ {127, C<&ISystemSettingsServer::SetAppletLaunchFlags>, "SetAppletLaunchFlags"},
+ {128, nullptr, "GetConsoleSixAxisSensorAccelerationBias"},
+ {129, nullptr, "SetConsoleSixAxisSensorAccelerationBias"},
+ {130, nullptr, "GetConsoleSixAxisSensorAngularVelocityBias"},
+ {131, nullptr, "SetConsoleSixAxisSensorAngularVelocityBias"},
+ {132, nullptr, "GetConsoleSixAxisSensorAccelerationGain"},
+ {133, nullptr, "SetConsoleSixAxisSensorAccelerationGain"},
+ {134, nullptr, "GetConsoleSixAxisSensorAngularVelocityGain"},
+ {135, nullptr, "SetConsoleSixAxisSensorAngularVelocityGain"},
+ {136, C<&ISystemSettingsServer::GetKeyboardLayout>, "GetKeyboardLayout"},
+ {137, C<&ISystemSettingsServer::SetKeyboardLayout>, "SetKeyboardLayout"},
+ {138, nullptr, "GetWebInspectorFlag"},
+ {139, nullptr, "GetAllowedSslHosts"},
+ {140, nullptr, "GetHostFsMountPoint"},
+ {141, nullptr, "GetRequiresRunRepairTimeReviser"},
+ {142, nullptr, "SetRequiresRunRepairTimeReviser"},
+ {143, nullptr, "SetBlePairingSettings"},
+ {144, nullptr, "GetBlePairingSettings"},
+ {145, nullptr, "GetConsoleSixAxisSensorAngularVelocityTimeBias"},
+ {146, nullptr, "SetConsoleSixAxisSensorAngularVelocityTimeBias"},
+ {147, nullptr, "GetConsoleSixAxisSensorAngularAcceleration"},
+ {148, nullptr, "SetConsoleSixAxisSensorAngularAcceleration"},
+ {149, C<&ISystemSettingsServer::GetRebootlessSystemUpdateVersion>, "GetRebootlessSystemUpdateVersion"},
+ {150, C<&ISystemSettingsServer::GetDeviceTimeZoneLocationUpdatedTime>, "GetDeviceTimeZoneLocationUpdatedTime"},
+ {151, C<&ISystemSettingsServer::SetDeviceTimeZoneLocationUpdatedTime>, "SetDeviceTimeZoneLocationUpdatedTime"},
+ {152, C<&ISystemSettingsServer::GetUserSystemClockAutomaticCorrectionUpdatedTime>, "GetUserSystemClockAutomaticCorrectionUpdatedTime"},
+ {153, C<&ISystemSettingsServer::SetUserSystemClockAutomaticCorrectionUpdatedTime>, "SetUserSystemClockAutomaticCorrectionUpdatedTime"},
+ {154, nullptr, "GetAccountOnlineStorageSettings"},
+ {155, nullptr, "SetAccountOnlineStorageSettings"},
+ {156, nullptr, "GetPctlReadyFlag"},
+ {157, nullptr, "SetPctlReadyFlag"},
+ {158, nullptr, "GetAnalogStickUserCalibrationL"},
+ {159, nullptr, "SetAnalogStickUserCalibrationL"},
+ {160, nullptr, "GetAnalogStickUserCalibrationR"},
+ {161, nullptr, "SetAnalogStickUserCalibrationR"},
+ {162, nullptr, "GetPtmBatteryVersion"},
+ {163, nullptr, "SetPtmBatteryVersion"},
+ {164, nullptr, "GetUsb30HostEnableFlag"},
+ {165, nullptr, "SetUsb30HostEnableFlag"},
+ {166, nullptr, "GetUsb30DeviceEnableFlag"},
+ {167, nullptr, "SetUsb30DeviceEnableFlag"},
+ {168, nullptr, "GetThemeId"},
+ {169, nullptr, "SetThemeId"},
+ {170, C<&ISystemSettingsServer::GetChineseTraditionalInputMethod>, "GetChineseTraditionalInputMethod"},
+ {171, nullptr, "SetChineseTraditionalInputMethod"},
+ {172, nullptr, "GetPtmCycleCountReliability"},
+ {173, nullptr, "SetPtmCycleCountReliability"},
+ {174, C<&ISystemSettingsServer::GetHomeMenuScheme>, "GetHomeMenuScheme"},
+ {175, nullptr, "GetThemeSettings"},
+ {176, nullptr, "SetThemeSettings"},
+ {177, nullptr, "GetThemeKey"},
+ {178, nullptr, "SetThemeKey"},
+ {179, nullptr, "GetZoomFlag"},
+ {180, nullptr, "SetZoomFlag"},
+ {181, nullptr, "GetT"},
+ {182, nullptr, "SetT"},
+ {183, C<&ISystemSettingsServer::GetPlatformRegion>, "GetPlatformRegion"},
+ {184, C<&ISystemSettingsServer::SetPlatformRegion>, "SetPlatformRegion"},
+ {185, C<&ISystemSettingsServer::GetHomeMenuSchemeModel>, "GetHomeMenuSchemeModel"},
+ {186, nullptr, "GetMemoryUsageRateFlag"},
+ {187, C<&ISystemSettingsServer::GetTouchScreenMode>, "GetTouchScreenMode"},
+ {188, C<&ISystemSettingsServer::SetTouchScreenMode>, "SetTouchScreenMode"},
+ {189, nullptr, "GetButtonConfigSettingsFull"},
+ {190, nullptr, "SetButtonConfigSettingsFull"},
+ {191, nullptr, "GetButtonConfigSettingsEmbedded"},
+ {192, nullptr, "SetButtonConfigSettingsEmbedded"},
+ {193, nullptr, "GetButtonConfigSettingsLeft"},
+ {194, nullptr, "SetButtonConfigSettingsLeft"},
+ {195, nullptr, "GetButtonConfigSettingsRight"},
+ {196, nullptr, "SetButtonConfigSettingsRight"},
+ {197, nullptr, "GetButtonConfigRegisteredSettingsEmbedded"},
+ {198, nullptr, "SetButtonConfigRegisteredSettingsEmbedded"},
+ {199, nullptr, "GetButtonConfigRegisteredSettings"},
+ {200, nullptr, "SetButtonConfigRegisteredSettings"},
+ {201, C<&ISystemSettingsServer::GetFieldTestingFlag>, "GetFieldTestingFlag"},
+ {202, nullptr, "SetFieldTestingFlag"},
+ {203, C<&ISystemSettingsServer::GetPanelCrcMode>, "GetPanelCrcMode"},
+ {204, C<&ISystemSettingsServer::SetPanelCrcMode>, "SetPanelCrcMode"},
+ {205, nullptr, "GetNxControllerSettingsEx"},
+ {206, nullptr, "SetNxControllerSettingsEx"},
+ {207, nullptr, "GetHearingProtectionSafeguardFlag"},
+ {208, nullptr, "SetHearingProtectionSafeguardFlag"},
+ {209, nullptr, "GetHearingProtectionSafeguardRemainingTime"},
+ {210, nullptr, "SetHearingProtectionSafeguardRemainingTime"},
+ {221, nullptr, "GetForceMonauralOutputFlag"}, //17.0.0+
+ {222, nullptr, "SetForceMonauralOutputFlag"}, //17.0.0+
+ {251, nullptr, "GetAccountIdentificationSettings"}, //18.0.0+
+ {252, nullptr, "SetAccountIdentificationSettings"}, //18.0.0+
+ {263, nullptr, "AcquireVphymDirtyFlagEventHandle"}, //20.0.0+
+ {264, nullptr, "GetVphymDirtyFlags"}, //20.0.0+
+ {282, nullptr, "ConvertToProductModel"}, //20.0.0+
+ {283, nullptr, "ConvertToProductModelName"}, //20.0.0+
+ {289, nullptr, "GetDefaultAccountIdentificationFlagSet"}, //20.0.0+
+ {300, nullptr, "AcquirePushNotificationDirtyFlagEventHandle"}, //20.0.0+
+ {301, nullptr, "GetPushNotificationDirtyFlags"}, //20.0.0+
+ {306, nullptr, "GetPinCodeReregistrationGuideAccounts"}, //20.0.0+
+ {307, nullptr, "SetPinCodeReregistrationGuideAccounts"}, //20.0.0+
+ {315, C<&ISystemSettingsServer::GetHttpAuthConfigs>, "GetHttpAuthConfigs"}, //21.0.0+
+ {319, C<&ISystemSettingsServer::GetAccountUserSettings>, "GetAccountUserSettings"}, //21.0.0+
+ {320, nullptr, "SetAccountUserSettings"}, //21.0.0+
+ {321, C<&ISystemSettingsServer::GetDefaultAccountUserSettings>, "GetDefaultAccountUserSettings"}, //21.0.0+
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+
SetupSettings();
m_system_settings.region_code =
diff --git a/src/core/hle/service/set/system_settings_server.h b/src/core/hle/service/set/system_settings_server.h
index 471ed61176..1d56e61f88 100644
--- a/src/core/hle/service/set/system_settings_server.h
+++ b/src/core/hle/service/set/system_settings_server.h
@@ -179,7 +179,7 @@ private:
void StoreSettings();
void SetSaveNeeded();
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
+ Core::System& m_system;
SystemSettings m_system_settings{};
PrivateSettings m_private_settings{};
DeviceSettings m_device_settings{};
diff --git a/src/core/hle/service/sm/sm.cpp b/src/core/hle/service/sm/sm.cpp
index 5c196b3218..c75c5437df 100644
--- a/src/core/hle/service/sm/sm.cpp
+++ b/src/core/hle/service/sm/sm.cpp
@@ -18,16 +18,7 @@
#include "core/hle/service/ipc_helpers.h"
#include "core/hle/service/server_manager.h"
#include "core/hle/service/sm/sm.h"
-#include "common/assert.h"
-#include "common/logging.h"
-#include "core/core.h"
-#include "core/hle/kernel/k_client_port.h"
-#include "core/hle/kernel/k_port.h"
-#include "core/hle/kernel/k_scoped_resource_reservation.h"
-#include "core/hle/kernel/k_server_session.h"
-#include "core/hle/kernel/k_session.h"
-#include "core/hle/service/ipc_helpers.h"
-#include "core/hle/service/server_manager.h"
+#include "core/hle/service/sm/sm_controller.h"
namespace Service::SM {
@@ -36,116 +27,6 @@ constexpr Result ResultAlreadyRegistered(ErrorModule::SM, 4);
constexpr Result ResultInvalidServiceName(ErrorModule::SM, 6);
constexpr Result ResultNotRegistered(ErrorModule::SM, 7);
-class Controller final : public ServiceFramework<Controller> {
-public:
- // https://switchbrew.org/wiki/IPC_Marshalling
- explicit Controller(Core::System& system_) : ServiceFramework{system_, "IpcController"} {}
- ~Controller() override = default;
-
- void ConvertCurrentObjectToDomain(HLERequestContext& ctx) {
- ASSERT_MSG(!ctx.GetManager()->IsDomain(), "Session is already a domain");
- LOG_DEBUG(Service, "called, server_session={}", ctx.Session()->GetId());
- ctx.GetManager()->ConvertToDomainOnRequestEnd();
-
- IPC::ResponseBuilder rb{ctx, 3};
- rb.Push(ResultSuccess);
- rb.Push<u32>(1); // Converted sessions start with 1 request handler
- }
-
- void CloneCurrentObject(HLERequestContext& ctx) {
- LOG_DEBUG(Service, "called");
-
- auto session_manager = ctx.GetManager();
-
- // FIXME: this is duplicated from the SVC, it should just call it instead
- // once this is a proper process
-
- // Reserve a new session from the process resource limit.
- Kernel::KScopedResourceReservation session_reservation(system.Kernel(), Kernel::GetCurrentProcessPointer(kernel), Kernel::LimitableResource::SessionCountMax);
- ASSERT(session_reservation.Succeeded());
-
- // Create the session.
- Kernel::KSession* session = Kernel::KSession::Create(kernel);
- ASSERT(session != nullptr);
-
- // Initialize the session.
- session->Initialize(kernel, nullptr, 0);
-
- // Commit the session reservation.
- session_reservation.Commit();
-
- // Register the session.
- Kernel::KSession::Register(kernel, session);
-
- // Register with server manager.
- session_manager->GetServerManager().RegisterSession(&session->GetServerSession(),
- session_manager);
-
- // We succeeded.
- IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles};
- rb.Push(ResultSuccess);
- rb.PushMoveObjects(ctx, session->GetClientSession());
- }
-
- void CloneCurrentObjectEx(HLERequestContext& ctx) {
- LOG_DEBUG(Service, "called");
-
- CloneCurrentObject(ctx);
- }
-
- void QueryPointerBufferSize(HLERequestContext& ctx) {
- LOG_DEBUG(Service, "called");
-
- auto* process = Kernel::GetCurrentProcessPointer(kernel);
- ASSERT(process != nullptr);
-
- u32 buffer_size = process->GetPointerBufferSize();
- if (buffer_size > (std::numeric_limits<u16>::max)()) {
- LOG_WARNING(Service, "Pointer buffer size exceeds u16 max, clamping");
- buffer_size = (std::numeric_limits<u16>::max)();
- }
-
- IPC::ResponseBuilder rb{ctx, 3};
- rb.Push(ResultSuccess);
- rb.Push<u16>(static_cast<u16>(buffer_size));
- }
-
- void SetPointerBufferSize(HLERequestContext& ctx) {
- LOG_DEBUG(Service, "called");
-
- auto* process = Kernel::GetCurrentProcessPointer(kernel);
- ASSERT(process != nullptr);
-
- IPC::RequestParser rp{ctx};
-
- u32 requested_size = rp.PopRaw<u32>();
-
- if (requested_size > (std::numeric_limits<u16>::max)()) {
- LOG_WARNING(Service, "Requested pointer buffer size too large, clamping to 0xFFFF");
- requested_size = (std::numeric_limits<u16>::max)();
- }
-
- process->SetPointerBufferSize(requested_size);
-
- LOG_INFO(Service, "Pointer buffer size dynamically updated to {:#x} bytes by process", requested_size);
-
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(ResultSuccess);
- }
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &Controller::ConvertCurrentObjectToDomain, "ConvertCurrentObjectToDomain"},
- FunctionInfo{1, nullptr, "CopyFromCurrentDomain"},
- FunctionInfo{2, &Controller::CloneCurrentObject, "CloneCurrentObject"},
- FunctionInfo{3, &Controller::QueryPointerBufferSize, "QueryPointerBufferSize"},
- FunctionInfo{4, &Controller::CloneCurrentObjectEx, "CloneCurrentObjectEx"},
- FunctionInfo{5, &Controller::SetPointerBufferSize, "SetPointerBufferSize"} //TODO: where does this come from
- );
-};
-
ServiceManager::ServiceManager(Kernel::KernelCore& kernel_) : kernel{kernel_} {
controller_interface = std::make_unique<Controller>(kernel.System());
}
@@ -231,51 +112,6 @@ Result ServiceManager::GetServicePort(Kernel::KClientPort** out_client_port,
return ResultSuccess;
}
-/// Interface to "sm:" service
-class SM final : public ServiceFramework<SM> {
-public:
- explicit SM(ServiceManager& service_manager_, Core::System& system_);
- ~SM() override;
-
-private:
- void Initialize(HLERequestContext& ctx);
- void GetServiceCmif(HLERequestContext& ctx);
- void GetServiceTipc(HLERequestContext& ctx);
- void RegisterServiceCmif(HLERequestContext& ctx);
- void RegisterServiceTipc(HLERequestContext& ctx);
- void UnregisterService(HLERequestContext& ctx);
- void AtmosphereHasService(HLERequestContext& ctx);
-
- Result GetServiceImpl(Kernel::KClientSession** out_client_session, HLERequestContext& ctx);
- void RegisterServiceImpl(HLERequestContext& ctx, std::string name, u32 max_session_count, bool is_light);
-
- // TODO: We reuse function list for both TIPC and non-TIPC
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- std::optional<FunctionInfoBase> FindRequestTipc(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &SM::Initialize, "Initialize"},
- FunctionInfo{1, &SM::GetServiceTipc, "GetService"},
- FunctionInfo{2, &SM::RegisterServiceTipc, "RegisterService"},
- FunctionInfo{3, &SM::UnregisterService, "UnregisterService"},
- FunctionInfo{4, nullptr, "DetachClient"},
- FunctionInfo{65000, nullptr, "AtmosphereInstallMitm"},
- FunctionInfo{65001, nullptr, "AtmosphereUninstallMitm"},
- FunctionInfo{65002, nullptr, "Deprecated_AtmosphereAssociatePidTidForMitm"},
- FunctionInfo{65003, nullptr, "AtmosphereAcknowledgeMitmSession"},
- FunctionInfo{65004, nullptr, "AtmosphereHasMitm"},
- FunctionInfo{65005, nullptr, "AtmosphereWaitMitm"},
- FunctionInfo{65006, nullptr, "AtmosphereDeclareFutureMitm"},
- FunctionInfo{65100, &SM::AtmosphereHasService, "AtmosphereHasService"},
- FunctionInfo{65101, nullptr, "AtmosphereWaitService"}
- );
-
- ServiceManager& service_manager;
-};
-
/**
* SM::Initialize service function
* Inputs:
@@ -358,7 +194,7 @@ Result SM::GetServiceImpl(Kernel::KClientSession** out_client_session, HLEReques
// Create a new session.
Kernel::KClientSession* session{};
- if (const auto result = client_port->CreateSession(system.Kernel(), &session); result.IsError()) {
+ if (const auto result = client_port->CreateSession(kernel, &session); result.IsError()) {
LOG_ERROR(Service_SM, "called service={} -> error {:#08x}", name, result.raw);
return result;
}
@@ -429,7 +265,42 @@ void SM::AtmosphereHasService(HLERequestContext& ctx) {
SM::SM(ServiceManager& service_manager_, Core::System& system_)
: ServiceFramework{system_, "sm:", 64}
, service_manager{service_manager_}
-{}
+ , kernel{system_.Kernel()}
+{
+ RegisterHandlers({
+ {0, &SM::Initialize, "Initialize"},
+ {1, &SM::GetServiceCmif, "GetService"},
+ {2, &SM::RegisterServiceCmif, "RegisterService"},
+ {3, &SM::UnregisterService, "UnregisterService"},
+ {4, nullptr, "DetachClient"},
+ // TODO: are these non-TIPC as well?
+ {65000, nullptr, "AtmosphereInstallMitm"},
+ {65001, nullptr, "AtmosphereUninstallMitm"},
+ {65002, nullptr, "Deprecated_AtmosphereAssociatePidTidForMitm"},
+ {65003, nullptr, "AtmosphereAcknowledgeMitmSession"},
+ {65004, nullptr, "AtmosphereHasMitm"},
+ {65005, nullptr, "AtmosphereWaitMitm"},
+ {65006, nullptr, "AtmosphereDeclareFutureMitm"},
+ {65100, &SM::AtmosphereHasService, "AtmosphereHasService"},
+ {65101, nullptr, "AtmosphereWaitService"},
+ });
+ RegisterHandlersTipc({
+ {0, &SM::Initialize, "Initialize"},
+ {1, &SM::GetServiceTipc, "GetService"},
+ {2, &SM::RegisterServiceTipc, "RegisterService"},
+ {3, &SM::UnregisterService, "UnregisterService"},
+ {4, nullptr, "DetachClient"},
+ {65000, nullptr, "AtmosphereInstallMitm"},
+ {65001, nullptr, "AtmosphereUninstallMitm"},
+ {65002, nullptr, "Deprecated_AtmosphereAssociatePidTidForMitm"},
+ {65003, nullptr, "AtmosphereAcknowledgeMitmSession"},
+ {65004, nullptr, "AtmosphereHasMitm"},
+ {65005, nullptr, "AtmosphereWaitMitm"},
+ {65006, nullptr, "AtmosphereDeclareFutureMitm"},
+ {65100, &SM::AtmosphereHasService, "AtmosphereHasService"},
+ {65101, nullptr, "AtmosphereWaitService"},
+ });
+}
SM::~SM() = default;
diff --git a/src/core/hle/service/sm/sm.h b/src/core/hle/service/sm/sm.h
index f17fc60080..c520a46fb2 100644
--- a/src/core/hle/service/sm/sm.h
+++ b/src/core/hle/service/sm/sm.h
@@ -33,7 +33,29 @@ class SessionRequestHandler;
namespace Service::SM {
class Controller;
-class SM;
+
+/// Interface to "sm:" service
+class SM final : public ServiceFramework<SM> {
+public:
+ explicit SM(ServiceManager& service_manager_, Core::System& system_);
+ ~SM() override;
+
+private:
+ void Initialize(HLERequestContext& ctx);
+ void GetServiceCmif(HLERequestContext& ctx);
+ void GetServiceTipc(HLERequestContext& ctx);
+ void RegisterServiceCmif(HLERequestContext& ctx);
+ void RegisterServiceTipc(HLERequestContext& ctx);
+ void UnregisterService(HLERequestContext& ctx);
+ void AtmosphereHasService(HLERequestContext& ctx);
+
+ Result GetServiceImpl(Kernel::KClientSession** out_client_session, HLERequestContext& ctx);
+ void RegisterServiceImpl(HLERequestContext& ctx, std::string name, u32 max_session_count,
+ bool is_light);
+
+ ServiceManager& service_manager;
+ Kernel::KernelCore& kernel;
+};
class ServiceManager {
public:
diff --git a/src/core/hle/service/sm/sm_controller.cpp b/src/core/hle/service/sm/sm_controller.cpp
new file mode 100644
index 0000000000..125eb4a247
--- /dev/null
+++ b/src/core/hle/service/sm/sm_controller.cpp
@@ -0,0 +1,128 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "common/assert.h"
+#include "common/logging.h"
+#include "core/core.h"
+#include "core/hle/kernel/k_client_port.h"
+#include "core/hle/kernel/k_port.h"
+#include "core/hle/kernel/k_scoped_resource_reservation.h"
+#include "core/hle/kernel/k_server_session.h"
+#include "core/hle/kernel/k_session.h"
+#include "core/hle/service/ipc_helpers.h"
+#include "core/hle/service/server_manager.h"
+#include "core/hle/service/sm/sm_controller.h"
+
+namespace Service::SM {
+
+void Controller::ConvertCurrentObjectToDomain(HLERequestContext& ctx) {
+ ASSERT_MSG(!ctx.GetManager()->IsDomain(), "Session is already a domain");
+ LOG_DEBUG(Service, "called, server_session={}", ctx.Session()->GetId());
+ ctx.GetManager()->ConvertToDomainOnRequestEnd();
+
+ IPC::ResponseBuilder rb{ctx, 3};
+ rb.Push(ResultSuccess);
+ rb.Push<u32>(1); // Converted sessions start with 1 request handler
+}
+
+void Controller::CloneCurrentObject(HLERequestContext& ctx) {
+ LOG_DEBUG(Service, "called");
+
+ auto session_manager = ctx.GetManager();
+
+ // FIXME: this is duplicated from the SVC, it should just call it instead
+ // once this is a proper process
+
+ // Reserve a new session from the process resource limit.
+ Kernel::KScopedResourceReservation session_reservation(system.Kernel(), Kernel::GetCurrentProcessPointer(kernel), Kernel::LimitableResource::SessionCountMax);
+ ASSERT(session_reservation.Succeeded());
+
+ // Create the session.
+ Kernel::KSession* session = Kernel::KSession::Create(kernel);
+ ASSERT(session != nullptr);
+
+ // Initialize the session.
+ session->Initialize(kernel, nullptr, 0);
+
+ // Commit the session reservation.
+ session_reservation.Commit();
+
+ // Register the session.
+ Kernel::KSession::Register(kernel, session);
+
+ // Register with server manager.
+ session_manager->GetServerManager().RegisterSession(&session->GetServerSession(),
+ session_manager);
+
+ // We succeeded.
+ IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles};
+ rb.Push(ResultSuccess);
+ rb.PushMoveObjects(ctx, session->GetClientSession());
+}
+
+void Controller::CloneCurrentObjectEx(HLERequestContext& ctx) {
+ LOG_DEBUG(Service, "called");
+
+ CloneCurrentObject(ctx);
+}
+
+void Controller::QueryPointerBufferSize(HLERequestContext& ctx) {
+ LOG_DEBUG(Service, "called");
+
+ auto* process = Kernel::GetCurrentProcessPointer(kernel);
+ ASSERT(process != nullptr);
+
+ u32 buffer_size = process->GetPointerBufferSize();
+ if (buffer_size > (std::numeric_limits<u16>::max)()) {
+ LOG_WARNING(Service, "Pointer buffer size exceeds u16 max, clamping");
+ buffer_size = (std::numeric_limits<u16>::max)();
+ }
+
+ IPC::ResponseBuilder rb{ctx, 3};
+ rb.Push(ResultSuccess);
+ rb.Push<u16>(static_cast<u16>(buffer_size));
+}
+
+void Controller::SetPointerBufferSize(HLERequestContext& ctx) {
+ LOG_DEBUG(Service, "called");
+
+ auto* process = Kernel::GetCurrentProcessPointer(kernel);
+ ASSERT(process != nullptr);
+
+ IPC::RequestParser rp{ctx};
+
+ u32 requested_size = rp.PopRaw<u32>();
+
+ if (requested_size > (std::numeric_limits<u16>::max)()) {
+ LOG_WARNING(Service, "Requested pointer buffer size too large, clamping to 0xFFFF");
+ requested_size = (std::numeric_limits<u16>::max)();
+ }
+
+ process->SetPointerBufferSize(requested_size);
+
+ LOG_INFO(Service, "Pointer buffer size dynamically updated to {:#x} bytes by process", requested_size);
+
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+}
+
+
+// https://switchbrew.org/wiki/IPC_Marshalling
+Controller::Controller(Core::System& system_) : ServiceFramework{system_, "IpcController"} {
+ static const FunctionInfo functions[] = {
+ {0, &Controller::ConvertCurrentObjectToDomain, "ConvertCurrentObjectToDomain"},
+ {1, nullptr, "CopyFromCurrentDomain"},
+ {2, &Controller::CloneCurrentObject, "CloneCurrentObject"},
+ {3, &Controller::QueryPointerBufferSize, "QueryPointerBufferSize"},
+ {4, &Controller::CloneCurrentObjectEx, "CloneCurrentObjectEx"},
+ {5, &Controller::SetPointerBufferSize, "SetPointerBufferSize"}, //TODO: where does this come from
+ };
+ RegisterHandlers(functions);
+}
+
+Controller::~Controller() = default;
+
+} // namespace Service::SM
diff --git a/src/core/hle/service/sm/sm_controller.h b/src/core/hle/service/sm/sm_controller.h
new file mode 100644
index 0000000000..f1fa327ff7
--- /dev/null
+++ b/src/core/hle/service/sm/sm_controller.h
@@ -0,0 +1,30 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/service.h"
+
+namespace Core {
+class System;
+}
+
+namespace Service::SM {
+
+class Controller final : public ServiceFramework<Controller> {
+public:
+ explicit Controller(Core::System& system_);
+ ~Controller() override;
+
+private:
+ void ConvertCurrentObjectToDomain(HLERequestContext& ctx);
+ void CloneCurrentObject(HLERequestContext& ctx);
+ void CloneCurrentObjectEx(HLERequestContext& ctx);
+ void QueryPointerBufferSize(HLERequestContext& ctx);
+ void SetPointerBufferSize(HLERequestContext& ctx);
+};
+
+} // namespace Service::SM
diff --git a/src/core/hle/service/sockets/bsd.cpp b/src/core/hle/service/sockets/bsd.cpp
index 63bd7051ca..0137a3be66 100644
--- a/src/core/hle/service/sockets/bsd.cpp
+++ b/src/core/hle/service/sockets/bsd.cpp
@@ -1083,6 +1083,59 @@ void BSD_USA::OnProxyPacketReceived(const Network::ProxyPacket& packet) {
BSD_USA::BSD_USA(Core::System& system_, const char* name, bool is_user_)
: ServiceFramework{system_, name}
, is_user{is_user_} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &BSD_USA::RegisterClient, "RegisterClient"},
+ {1, &BSD_USA::StartMonitoring, "StartMonitoring"},
+ {2, &BSD_USA::Socket, "Socket"},
+ {3, &BSD_USA::SocketExempt, "SocketExempt"},
+ {4, nullptr, "Open"},
+ {5, &BSD_USA::Select, "Select"},
+ {6, &BSD_USA::Poll, "Poll"},
+ {7, nullptr, "Sysctl"},
+ {8, &BSD_USA::Recv, "Recv"},
+ {9, &BSD_USA::RecvFrom, "RecvFrom"},
+ {10, &BSD_USA::Send, "Send"},
+ {11, &BSD_USA::SendTo, "SendTo"},
+ {12, &BSD_USA::Accept, "Accept"},
+ {13, &BSD_USA::Bind, "Bind"},
+ {14, &BSD_USA::Connect, "Connect"},
+ {15, &BSD_USA::GetPeerName, "GetPeerName"},
+ {16, &BSD_USA::GetSockName, "GetSockName"},
+ {17, &BSD_USA::GetSockOpt, "GetSockOpt"},
+ {18, &BSD_USA::Listen, "Listen"},
+ {19, nullptr, "Ioctl"},
+ {20, &BSD_USA::Fcntl, "Fcntl"},
+ {21, &BSD_USA::SetSockOpt, "SetSockOpt"},
+ {22, &BSD_USA::Shutdown, "Shutdown"},
+ {23, nullptr, "ShutdownAllSockets"},
+ {24, &BSD_USA::Write, "Write"},
+ {25, &BSD_USA::Read, "Read"},
+ {26, &BSD_USA::Close, "Close"},
+ {27, &BSD_USA::DuplicateSocket, "DuplicateSocket"},
+ {28, nullptr, "GetResourceStatistics"},
+ {29, nullptr, "RecvMMsg"}, //3.0.0+
+ {30, nullptr, "SendMMsg"}, //3.0.0+
+ {31, &BSD_USA::EventFd, "EventFd"}, //7.0.0+
+ {32, nullptr, "RegisterResourceStatisticsName"}, //7.0.0+
+ {33, nullptr, "RegisterClientShared"}, //10.0.0+
+ {34, nullptr, "GetSocketStatistics"}, //15.0.0+
+ {35, nullptr, "NifIoctl"}, //17.0.0+
+ {36, nullptr, "Unknown36"}, //18.0.0+
+ {37, nullptr, "Unknown37"}, //18.0.0+
+ {38, nullptr, "Unknown38"}, //18.0.0+
+ {39, nullptr, "Unknown39"}, //20.0.0+
+ {40, nullptr, "Unknown40"}, //20.0.0+
+ {41, nullptr, "Unknown41"}, //21.0.0+
+ {42, nullptr, "Unknown42"}, //21.0.0+
+ {43, nullptr, "Unknown43"}, //21.0.0+
+ {200, nullptr, "SetThreadCoreMask"}, //15.0.0+
+ {201, nullptr, "GetThreadCoreMask"}, //15.0.0+
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+
if (auto room_member = Network::GetRoomMember().lock()) {
proxy_packet_received = room_member->BindOnProxyPacketReceived(
[this](const Network::ProxyPacket& packet) { OnProxyPacketReceived(packet); });
@@ -1103,12 +1156,40 @@ std::unique_lock<std::mutex> BSD_USA::LockService() noexcept {
BSDCFG::BSDCFG(Core::System& system_, const char *name)
: ServiceFramework{system_, name} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "SetIfUp"},
+ {1, nullptr, "SetIfUpWithEvent"},
+ {2, nullptr, "CancelIf"},
+ {3, nullptr, "SetIfDown"},
+ {4, nullptr, "GetIfState"},
+ {5, nullptr, "DhcpRenew"},
+ {6, nullptr, "AddStaticArpEntry"},
+ {7, nullptr, "RemoveArpEntry"},
+ {8, nullptr, "LookupArpEntry"},
+ {9, nullptr, "LookupArpEntry2"},
+ {10, nullptr, "ClearArpEntries"},
+ {11, nullptr, "ClearArpEntries2"},
+ {12, nullptr, "PrintArpEntries"},
+ {13, nullptr, "Unknown13"},
+ {14, nullptr, "Unknown14"},
+ {15, nullptr, "Unknown15"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
BSDCFG::~BSDCFG() = default;
BSD_NU::BSD_NU(Core::System& system_)
: ServiceFramework{system_, "bsd:nu"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "CreateUserService"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
BSD_NU::~BSD_NU() = default;
diff --git a/src/core/hle/service/sockets/bsd.h b/src/core/hle/service/sockets/bsd.h
index c2aa343d51..5cc3eb5b81 100644
--- a/src/core/hle/service/sockets/bsd.h
+++ b/src/core/hle/service/sockets/bsd.h
@@ -1,5 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -189,58 +190,6 @@ private:
protected:
std::unique_lock<std::mutex> LockService() noexcept override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &BSD_USA::RegisterClient, "RegisterClient"},
- FunctionInfo{1, &BSD_USA::StartMonitoring, "StartMonitoring"},
- FunctionInfo{2, &BSD_USA::Socket, "Socket"},
- FunctionInfo{3, &BSD_USA::SocketExempt, "SocketExempt"},
- FunctionInfo{4, nullptr, "Open"},
- FunctionInfo{5, &BSD_USA::Select, "Select"},
- FunctionInfo{6, &BSD_USA::Poll, "Poll"},
- FunctionInfo{7, nullptr, "Sysctl"},
- FunctionInfo{8, &BSD_USA::Recv, "Recv"},
- FunctionInfo{9, &BSD_USA::RecvFrom, "RecvFrom"},
- FunctionInfo{10, &BSD_USA::Send, "Send"},
- FunctionInfo{11, &BSD_USA::SendTo, "SendTo"},
- FunctionInfo{12, &BSD_USA::Accept, "Accept"},
- FunctionInfo{13, &BSD_USA::Bind, "Bind"},
- FunctionInfo{14, &BSD_USA::Connect, "Connect"},
- FunctionInfo{15, &BSD_USA::GetPeerName, "GetPeerName"},
- FunctionInfo{16, &BSD_USA::GetSockName, "GetSockName"},
- FunctionInfo{17, &BSD_USA::GetSockOpt, "GetSockOpt"},
- FunctionInfo{18, &BSD_USA::Listen, "Listen"},
- FunctionInfo{19, nullptr, "Ioctl"},
- FunctionInfo{20, &BSD_USA::Fcntl, "Fcntl"},
- FunctionInfo{21, &BSD_USA::SetSockOpt, "SetSockOpt"},
- FunctionInfo{22, &BSD_USA::Shutdown, "Shutdown"},
- FunctionInfo{23, nullptr, "ShutdownAllSockets"},
- FunctionInfo{24, &BSD_USA::Write, "Write"},
- FunctionInfo{25, &BSD_USA::Read, "Read"},
- FunctionInfo{26, &BSD_USA::Close, "Close"},
- FunctionInfo{27, &BSD_USA::DuplicateSocket, "DuplicateSocket"},
- FunctionInfo{28, nullptr, "GetResourceStatistics"},
- FunctionInfo{29, nullptr, "RecvMMsg", MakeVersionGate({3,0,0})},
- FunctionInfo{30, nullptr, "SendMMsg", MakeVersionGate({3,0,0})},
- FunctionInfo{31, &BSD_USA::EventFd, "EventFd", MakeVersionGate({7,0,0})},
- FunctionInfo{32, nullptr, "RegisterResourceStatisticsName", MakeVersionGate({7,0,0})},
- FunctionInfo{33, nullptr, "RegisterClientShared", MakeVersionGate({10,0,0})},
- FunctionInfo{34, nullptr, "GetSocketStatistics", MakeVersionGate({15,0,0})},
- FunctionInfo{35, nullptr, "NifIoctl", MakeVersionGate({17,0,0})},
- FunctionInfo{36, nullptr, "Unknown36", MakeVersionGate({18,0,0})},
- FunctionInfo{37, nullptr, "Unknown37", MakeVersionGate({18,0,0})},
- FunctionInfo{38, nullptr, "Unknown38", MakeVersionGate({18,0,0})},
- FunctionInfo{39, nullptr, "Unknown39", MakeVersionGate({20,0,0})},
- FunctionInfo{40, nullptr, "Unknown40", MakeVersionGate({20,0,0})},
- FunctionInfo{41, nullptr, "Unknown41", MakeVersionGate({21,0,0})},
- FunctionInfo{42, nullptr, "Unknown42", MakeVersionGate({21,0,0})},
- FunctionInfo{43, nullptr, "Unknown43", MakeVersionGate({21,0,0})},
- FunctionInfo{200, nullptr, "SetThreadCoreMask", MakeVersionGate({15,0,0})},
- FunctionInfo{201, nullptr, "GetThreadCoreMask", MakeVersionGate({15,0,0})}
- );
bool is_user = false;
};
@@ -248,41 +197,12 @@ class BSDCFG final : public ServiceFramework<BSDCFG> {
public:
explicit BSDCFG(Core::System& system_, const char *name);
~BSDCFG() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "SetIfUp"},
- FunctionInfo{1, nullptr, "SetIfUpWithEvent"},
- FunctionInfo{2, nullptr, "CancelIf"},
- FunctionInfo{3, nullptr, "SetIfDown"},
- FunctionInfo{4, nullptr, "GetIfState"},
- FunctionInfo{5, nullptr, "DhcpRenew"},
- FunctionInfo{6, nullptr, "AddStaticArpEntry"},
- FunctionInfo{7, nullptr, "RemoveArpEntry"},
- FunctionInfo{8, nullptr, "LookupArpEntry"},
- FunctionInfo{9, nullptr, "LookupArpEntry2"},
- FunctionInfo{10, nullptr, "ClearArpEntries"},
- FunctionInfo{11, nullptr, "ClearArpEntries2"},
- FunctionInfo{12, nullptr, "PrintArpEntries"},
- FunctionInfo{13, nullptr, "Unknown13"},
- FunctionInfo{14, nullptr, "Unknown14"},
- FunctionInfo{15, nullptr, "Unknown15"}
- );
};
class BSD_NU final : public ServiceFramework<BSD_NU> {
public:
explicit BSD_NU(Core::System& system_);
~BSD_NU() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "CreateUserService"}
- );
};
} // namespace Service::Sockets
diff --git a/src/core/hle/service/sockets/nsd.cpp b/src/core/hle/service/sockets/nsd.cpp
index 8f042aee75..241f2971ca 100644
--- a/src/core/hle/service/sockets/nsd.cpp
+++ b/src/core/hle/service/sockets/nsd.cpp
@@ -29,6 +29,38 @@ struct EnvironmentIdentifier {
static_assert(sizeof(EnvironmentIdentifier) == 0x8);
NSD::NSD(Core::System& system_, const char* name) : ServiceFramework{system_, name} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {5, nullptr, "GetSettingUrl"},
+ {10, nullptr, "GetSettingName"},
+ {11, &NSD::GetEnvironmentIdentifier, "GetEnvironmentIdentifier"},
+ {12, nullptr, "GetDeviceId"},
+ {13, nullptr, "DeleteSettings"},
+ {14, nullptr, "ImportSettings"},
+ {15, &NSD::SetChangeEnvironmentIdentifierDisabled, "SetChangeEnvironmentIdentifierDisabled"},
+ {20, &NSD::Resolve, "Resolve"},
+ {21, &NSD::ResolveEx, "ResolveEx"},
+ {30, nullptr, "GetNasServiceSetting"},
+ {31, nullptr, "GetNasServiceSettingEx"},
+ {40, nullptr, "GetNasRequestFqdn"},
+ {41, nullptr, "GetNasRequestFqdnEx"},
+ {42, nullptr, "GetNasApiFqdn"},
+ {43, nullptr, "GetNasApiFqdnEx"},
+ {50, nullptr, "GetCurrentSetting"},
+ {51, nullptr, "WriteTestParameter"},
+ {52, nullptr, "ReadTestParameter"},
+ {60, nullptr, "ReadSaveDataFromFsForTest"},
+ {61, nullptr, "WriteSaveDataToFsForTest"},
+ {62, nullptr, "DeleteSaveDataOfFsForTest"},
+ {63, nullptr, "IsChangeEnvironmentIdentifierDisabled"},
+ {64, nullptr, "SetWithoutDomainExchangeFqdns"},
+ {100, &NSD::GetApplicationServerEnvironmentType, "GetApplicationServerEnvironmentType"},
+ {101, nullptr, "SetApplicationServerEnvironmentType"},
+ {102, nullptr, "DeleteApplicationServerEnvironmentType"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
static std::string ResolveImpl(const std::string& fqdn_in) {
diff --git a/src/core/hle/service/sockets/nsd.h b/src/core/hle/service/sockets/nsd.h
index f3e4d48aff..e4a4588467 100644
--- a/src/core/hle/service/sockets/nsd.h
+++ b/src/core/hle/service/sockets/nsd.h
@@ -25,38 +25,6 @@ private:
void ResolveEx(HLERequestContext& ctx);
void GetEnvironmentIdentifier(HLERequestContext& ctx);
void GetApplicationServerEnvironmentType(HLERequestContext& ctx);
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{5, nullptr, "GetSettingUrl"},
- FunctionInfo{10, nullptr, "GetSettingName"},
- FunctionInfo{11, &NSD::GetEnvironmentIdentifier, "GetEnvironmentIdentifier"},
- FunctionInfo{12, nullptr, "GetDeviceId"},
- FunctionInfo{13, nullptr, "DeleteSettings"},
- FunctionInfo{14, nullptr, "ImportSettings"},
- FunctionInfo{15, &NSD::SetChangeEnvironmentIdentifierDisabled, "SetChangeEnvironmentIdentifierDisabled"},
- FunctionInfo{20, &NSD::Resolve, "Resolve"},
- FunctionInfo{21, &NSD::ResolveEx, "ResolveEx"},
- FunctionInfo{30, nullptr, "GetNasServiceSetting"},
- FunctionInfo{31, nullptr, "GetNasServiceSettingEx"},
- FunctionInfo{40, nullptr, "GetNasRequestFqdn"},
- FunctionInfo{41, nullptr, "GetNasRequestFqdnEx"},
- FunctionInfo{42, nullptr, "GetNasApiFqdn"},
- FunctionInfo{43, nullptr, "GetNasApiFqdnEx"},
- FunctionInfo{50, nullptr, "GetCurrentSetting"},
- FunctionInfo{51, nullptr, "WriteTestParameter"},
- FunctionInfo{52, nullptr, "ReadTestParameter"},
- FunctionInfo{60, nullptr, "ReadSaveDataFromFsForTest"},
- FunctionInfo{61, nullptr, "WriteSaveDataToFsForTest"},
- FunctionInfo{62, nullptr, "DeleteSaveDataOfFsForTest"},
- FunctionInfo{63, nullptr, "IsChangeEnvironmentIdentifierDisabled"},
- FunctionInfo{64, nullptr, "SetWithoutDomainExchangeFqdns"},
- FunctionInfo{100, &NSD::GetApplicationServerEnvironmentType, "GetApplicationServerEnvironmentType"},
- FunctionInfo{101, nullptr, "SetApplicationServerEnvironmentType"},
- FunctionInfo{102, nullptr, "DeleteApplicationServerEnvironmentType"}
- );
};
} // namespace Service::Sockets
diff --git a/src/core/hle/service/sockets/sfdnsres.cpp b/src/core/hle/service/sockets/sfdnsres.cpp
index c89705356e..93c01bf786 100644
--- a/src/core/hle/service/sockets/sfdnsres.cpp
+++ b/src/core/hle/service/sockets/sfdnsres.cpp
@@ -21,6 +21,25 @@
namespace Service::Sockets {
SFDNSRES::SFDNSRES(Core::System& system_) : ServiceFramework{system_, "sfdnsres"} {
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "SetDnsAddressesPrivateRequest"},
+ {1, nullptr, "GetDnsAddressPrivateRequest"},
+ {2, &SFDNSRES::GetHostByNameRequest, "GetHostByNameRequest"},
+ {3, nullptr, "GetHostByAddrRequest"},
+ {4, nullptr, "GetHostStringErrorRequest"},
+ {5, &SFDNSRES::GetGaiStringErrorRequest, "GetGaiStringErrorRequest"},
+ {6, &SFDNSRES::GetAddrInfoRequest, "GetAddrInfoRequest"},
+ {7, nullptr, "GetNameInfoRequest"},
+ {8, nullptr, "RequestCancelHandleRequest"},
+ {9, nullptr, "CancelRequest"},
+ {10, &SFDNSRES::GetHostByNameRequestWithOptions, "GetHostByNameRequestWithOptions"},
+ {11, nullptr, "GetHostByAddrRequestWithOptions"},
+ {12, &SFDNSRES::GetAddrInfoRequestWithOptions, "GetAddrInfoRequestWithOptions"},
+ {13, nullptr, "GetNameInfoRequestWithOptions"},
+ {14, &SFDNSRES::ResolverSetOptionRequest, "ResolverSetOptionRequest"},
+ {15, nullptr, "ResolverGetOptionRequest"},
+ };
+ RegisterHandlers(functions);
}
SFDNSRES::~SFDNSRES() = default;
@@ -391,6 +410,14 @@ void SFDNSRES::ResolverSetOptionRequest(HLERequestContext& ctx) {
DNS_PRIV::DNS_PRIV(Core::System& system_)
: ServiceFramework{system_, "dns:priv"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "Cmd0"},
+ {1, nullptr, "Cmd1"},
+ {2, nullptr, "Cmd2"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
DNS_PRIV::~DNS_PRIV() = default;
diff --git a/src/core/hle/service/sockets/sfdnsres.h b/src/core/hle/service/sockets/sfdnsres.h
index b365d03b2d..4302edc43e 100644
--- a/src/core/hle/service/sockets/sfdnsres.h
+++ b/src/core/hle/service/sockets/sfdnsres.h
@@ -26,43 +26,12 @@ private:
void GetAddrInfoRequest(HLERequestContext& ctx);
void GetAddrInfoRequestWithOptions(HLERequestContext& ctx);
void ResolverSetOptionRequest(HLERequestContext& ctx);
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "SetDnsAddressesPrivateRequest"},
- FunctionInfo{1, nullptr, "GetDnsAddressPrivateRequest"},
- FunctionInfo{2, &SFDNSRES::GetHostByNameRequest, "GetHostByNameRequest"},
- FunctionInfo{3, nullptr, "GetHostByAddrRequest"},
- FunctionInfo{4, nullptr, "GetHostStringErrorRequest"},
- FunctionInfo{5, &SFDNSRES::GetGaiStringErrorRequest, "GetGaiStringErrorRequest"},
- FunctionInfo{6, &SFDNSRES::GetAddrInfoRequest, "GetAddrInfoRequest"},
- FunctionInfo{7, nullptr, "GetNameInfoRequest"},
- FunctionInfo{8, nullptr, "RequestCancelHandleRequest"},
- FunctionInfo{9, nullptr, "CancelRequest"},
- FunctionInfo{10, &SFDNSRES::GetHostByNameRequestWithOptions, "GetHostByNameRequestWithOptions"},
- FunctionInfo{11, nullptr, "GetHostByAddrRequestWithOptions"},
- FunctionInfo{12, &SFDNSRES::GetAddrInfoRequestWithOptions, "GetAddrInfoRequestWithOptions"},
- FunctionInfo{13, nullptr, "GetNameInfoRequestWithOptions"},
- FunctionInfo{14, &SFDNSRES::ResolverSetOptionRequest, "ResolverSetOptionRequest"},
- FunctionInfo{15, nullptr, "ResolverGetOptionRequest"}
- );
};
class DNS_PRIV final : public ServiceFramework<DNS_PRIV> {
public:
explicit DNS_PRIV(Core::System& system_);
~DNS_PRIV() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "Cmd0"},
- FunctionInfo{1, nullptr, "Cmd1"},
- FunctionInfo{2, nullptr, "Cmd2"}
- );
};
} // namespace Service::Sockets
diff --git a/src/core/hle/service/sockets/sockets.cpp b/src/core/hle/service/sockets/sockets.cpp
index 1c723e96a6..e96d7c5638 100644
--- a/src/core/hle/service/sockets/sockets.cpp
+++ b/src/core/hle/service/sockets/sockets.cpp
@@ -15,49 +15,49 @@ namespace Service::Sockets {
class ETHC_C final : public ServiceFramework<ETHC_C> {
public:
explicit ETHC_C(Core::System& system_)
- : ServiceFramework{system_, "ethc:c"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "Initialize"},
- FunctionInfo{1, nullptr, "Cancel"},
- FunctionInfo{2, nullptr, "GetResult"},
- FunctionInfo{3, nullptr, "GetMediaList"},
- FunctionInfo{4, nullptr, "SetMediaType"},
- FunctionInfo{5, nullptr, "GetMediaType"},
- FunctionInfo{6, nullptr, "GetMacAddress"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "ethc:c"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "Initialize"},
+ {1, nullptr, "Cancel"},
+ {2, nullptr, "GetResult"},
+ {3, nullptr, "GetMediaList"},
+ {4, nullptr, "SetMediaType"},
+ {5, nullptr, "GetMediaType"},
+ {6, nullptr, "GetMacAddress"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class ETHC_I final : public ServiceFramework<ETHC_I> {
public:
explicit ETHC_I(Core::System& system_)
- : ServiceFramework{system_, "ethc:i"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetReadableHandle"},
- FunctionInfo{1, nullptr, "Cancel"},
- FunctionInfo{2, nullptr, "GetResult"},
- FunctionInfo{3, nullptr, "GetInterfaceList"},
- FunctionInfo{4, nullptr, "GetInterfaceCount"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "ethc:i"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetReadableHandle"},
+ {1, nullptr, "Cancel"},
+ {2, nullptr, "GetResult"},
+ {3, nullptr, "GetInterfaceList"},
+ {4, nullptr, "GetInterfaceCount"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class ISfDriverServiceCreator final : public ServiceFramework<ISfDriverServiceCreator> {
public:
explicit ISfDriverServiceCreator(Core::System& system_)
- : ServiceFramework{system_, "eth:nd"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "CreateDriverService"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "eth:nd"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "CreateDriverService"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
diff --git a/src/core/hle/service/sockets/sockets_translate.h b/src/core/hle/service/sockets/sockets_translate.h
index bd6721fd3e..b1dfc71961 100644
--- a/src/core/hle/service/sockets/sockets_translate.h
+++ b/src/core/hle/service/sockets/sockets_translate.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/spl/spl.cpp b/src/core/hle/service/spl/spl.cpp
index ad0251fac5..81be99c360 100644
--- a/src/core/hle/service/spl/spl.cpp
+++ b/src/core/hle/service/spl/spl.cpp
@@ -8,22 +8,181 @@
namespace Service::SPL {
-SPL::SPL(Core::System& system_, std::shared_ptr<Module> module_) : Interface(system_, std::move(module_), "spl:") {}
+SPL::SPL(Core::System& system_, std::shared_ptr<Module> module_)
+ : Interface(system_, std::move(module_), "spl:") {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &SPL::GetConfig, "GetConfig"},
+ {1, &SPL::ModularExponentiate, "ModularExponentiate"},
+ {5, &SPL::SetConfig, "SetConfig"},
+ {7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"},
+ {11, &SPL::IsDevelopment, "IsDevelopment"},
+ {24, &SPL::SetBootReason, "SetBootReason"},
+ {25, &SPL::GetBootReason, "GetBootReason"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
SPL::~SPL() = default;
-SPL_MIG::SPL_MIG(Core::System& system_, std::shared_ptr<Module> module_) : Interface(system_, std::move(module_), "spl:mig") {}
+SPL_MIG::SPL_MIG(Core::System& system_, std::shared_ptr<Module> module_)
+ : Interface(system_, std::move(module_), "spl:mig") {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &SPL::GetConfig, "GetConfig"},
+ {1, &SPL::ModularExponentiate, "ModularExponentiate"},
+ {2, &SPL::GenerateAesKek, "GenerateAesKek"},
+ {3, nullptr, "LoadAesKey"},
+ {4, &SPL::GenerateAesKey, "GenerateAesKey"},
+ {5, &SPL::SetConfig, "SetConfig"},
+ {7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"},
+ {11, &SPL::IsDevelopment, "IsDevelopment"},
+ {14, nullptr, "DecryptAesKey"},
+ {15, nullptr, "CryptAesCtr"},
+ {16, nullptr, "ComputeCmac"},
+ {21, nullptr, "AllocateAesKeyslot"},
+ {22, nullptr, "DeallocateAesKeySlot"},
+ {23, nullptr, "GetAesKeyslotAvailableEvent"},
+ {24, &SPL::SetBootReason, "SetBootReason"},
+ {25, &SPL::GetBootReason, "GetBootReason"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
SPL_MIG::~SPL_MIG() = default;
-SPL_FS::SPL_FS(Core::System& system_, std::shared_ptr<Module> module_) : Interface(system_, std::move(module_), "spl:fs") {}
+SPL_FS::SPL_FS(Core::System& system_, std::shared_ptr<Module> module_)
+ : Interface(system_, std::move(module_), "spl:fs") {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &SPL::GetConfig, "GetConfig"},
+ {1, &SPL::ModularExponentiate, "ModularExponentiate"},
+ {2, nullptr, "GenerateAesKek"},
+ {3, nullptr, "LoadAesKey"},
+ {4, nullptr, "GenerateAesKey"},
+ {5, &SPL::SetConfig, "SetConfig"},
+ {7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"},
+ {9, nullptr, "ImportLotusKey"},
+ {10, nullptr, "DecryptLotusMessage"},
+ {11, &SPL::IsDevelopment, "IsDevelopment"},
+ {12, nullptr, "GenerateSpecificAesKey"},
+ {14, nullptr, "DecryptAesKey"},
+ {15, nullptr, "CryptAesCtr"},
+ {16, nullptr, "ComputeCmac"},
+ {19, nullptr, "LoadTitleKey"},
+ {21, nullptr, "AllocateAesKeyslot"},
+ {22, nullptr, "DeallocateAesKeySlot"},
+ {23, nullptr, "GetAesKeyslotAvailableEvent"},
+ {24, &SPL::SetBootReason, "SetBootReason"},
+ {25, &SPL::GetBootReason, "GetBootReason"},
+ {31, nullptr, "GetPackage2Hash"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
SPL_FS::~SPL_FS() = default;
-SPL_SSL::SPL_SSL(Core::System& system_, std::shared_ptr<Module> module_) : Interface(system_, std::move(module_), "spl:ssl") {}
+SPL_SSL::SPL_SSL(Core::System& system_, std::shared_ptr<Module> module_)
+ : Interface(system_, std::move(module_), "spl:ssl") {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &SPL::GetConfig, "GetConfig"},
+ {1, &SPL::ModularExponentiate, "ModularExponentiate"},
+ {2, nullptr, "GenerateAesKek"},
+ {3, nullptr, "LoadAesKey"},
+ {4, nullptr, "GenerateAesKey"},
+ {5, &SPL::SetConfig, "SetConfig"},
+ {7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"},
+ {11, &SPL::IsDevelopment, "IsDevelopment"},
+ {13, nullptr, "DecryptDeviceUniqueData"},
+ {14, nullptr, "DecryptAesKey"},
+ {15, nullptr, "CryptAesCtr"},
+ {16, nullptr, "ComputeCmac"},
+ {21, nullptr, "AllocateAesKeyslot"},
+ {22, nullptr, "DeallocateAesKeySlot"},
+ {23, nullptr, "GetAesKeyslotAvailableEvent"},
+ {24, &SPL::SetBootReason, "SetBootReason"},
+ {25, &SPL::GetBootReason, "GetBootReason"},
+ {26, nullptr, "DecryptAndStoreSslClientCertKey"},
+ {27, nullptr, "ModularExponentiateWithSslClientCertKey"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
SPL_SSL::~SPL_SSL() = default;
-SPL_ES::SPL_ES(Core::System& system_, std::shared_ptr<Module> module_) : Interface(system_, std::move(module_), "spl:es") {}
+SPL_ES::SPL_ES(Core::System& system_, std::shared_ptr<Module> module_)
+ : Interface(system_, std::move(module_), "spl:es") {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &SPL::GetConfig, "GetConfig"},
+ {1, &SPL::ModularExponentiate, "ModularExponentiate"},
+ {2, nullptr, "GenerateAesKek"},
+ {3, nullptr, "LoadAesKey"},
+ {4, nullptr, "GenerateAesKey"},
+ {5, &SPL::SetConfig, "SetConfig"},
+ {7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"},
+ {11, &SPL::IsDevelopment, "IsDevelopment"},
+ {13, nullptr, "DecryptDeviceUniqueData"},
+ {14, nullptr, "DecryptAesKey"},
+ {15, nullptr, "CryptAesCtr"},
+ {16, nullptr, "ComputeCmac"},
+ {17, nullptr, "ImportEsKey"},
+ {18, nullptr, "UnwrapTitleKey"},
+ {20, nullptr, "PrepareEsCommonKey"},
+ {21, nullptr, "AllocateAesKeyslot"},
+ {22, nullptr, "DeallocateAesKeySlot"},
+ {23, nullptr, "GetAesKeyslotAvailableEvent"},
+ {24, &SPL::SetBootReason, "SetBootReason"},
+ {25, &SPL::GetBootReason, "GetBootReason"},
+ {28, nullptr, "DecryptAndStoreDrmDeviceCertKey"},
+ {29, nullptr, "ModularExponentiateWithDrmDeviceCertKey"},
+ {31, nullptr, "PrepareEsArchiveKey"},
+ {32, nullptr, "LoadPreparedAesKey"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
SPL_ES::~SPL_ES() = default;
-SPL_MANU::SPL_MANU(Core::System& system_, std::shared_ptr<Module> module_) : Interface(system_, std::move(module_), "spl:manu") {}
+SPL_MANU::SPL_MANU(Core::System& system_, std::shared_ptr<Module> module_)
+ : Interface(system_, std::move(module_), "spl:manu") {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &SPL::GetConfig, "GetConfig"},
+ {1, &SPL::ModularExponentiate, "ModularExponentiate"},
+ {2, nullptr, "GenerateAesKek"},
+ {3, nullptr, "LoadAesKey"},
+ {4, nullptr, "GenerateAesKey"},
+ {5, &SPL::SetConfig, "SetConfig"},
+ {7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"},
+ {11, &SPL::IsDevelopment, "IsDevelopment"},
+ {13, nullptr, "DecryptDeviceUniqueData"},
+ {14, nullptr, "DecryptAesKey"},
+ {15, nullptr, "CryptAesCtr"},
+ {16, nullptr, "ComputeCmac"},
+ {21, nullptr, "AllocateAesKeyslot"},
+ {22, nullptr, "DeallocateAesKeySlot"},
+ {23, nullptr, "GetAesKeyslotAvailableEvent"},
+ {24, &SPL::SetBootReason, "SetBootReason"},
+ {25, &SPL::GetBootReason, "GetBootReason"},
+ {30, nullptr, "ReencryptDeviceUniqueData"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
SPL_MANU::~SPL_MANU() = default;
} // namespace Service::SPL
diff --git a/src/core/hle/service/spl/spl.h b/src/core/hle/service/spl/spl.h
index 8f84d2a3d3..83a3cda539 100644
--- a/src/core/hle/service/spl/spl.h
+++ b/src/core/hle/service/spl/spl.h
@@ -18,177 +18,36 @@ class SPL final : public Module::Interface {
public:
explicit SPL(Core::System& system_, std::shared_ptr<Module> module_);
~SPL() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &SPL::GetConfig, "GetConfig"},
- FunctionInfo{1, &SPL::ModularExponentiate, "ModularExponentiate"},
- FunctionInfo{5, &SPL::SetConfig, "SetConfig"},
- FunctionInfo{7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"},
- FunctionInfo{11, &SPL::IsDevelopment, "IsDevelopment"},
- FunctionInfo{24, &SPL::SetBootReason, "SetBootReason"},
- FunctionInfo{25, &SPL::GetBootReason, "GetBootReason"}
- );
};
class SPL_MIG final : public Module::Interface {
public:
explicit SPL_MIG(Core::System& system_, std::shared_ptr<Module> module_);
~SPL_MIG() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &SPL::GetConfig, "GetConfig"},
- FunctionInfo{1, &SPL::ModularExponentiate, "ModularExponentiate"},
- FunctionInfo{2, &SPL::GenerateAesKek, "GenerateAesKek"},
- FunctionInfo{3, nullptr, "LoadAesKey"},
- FunctionInfo{4, &SPL::GenerateAesKey, "GenerateAesKey"},
- FunctionInfo{5, &SPL::SetConfig, "SetConfig"},
- FunctionInfo{7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"},
- FunctionInfo{11, &SPL::IsDevelopment, "IsDevelopment"},
- FunctionInfo{14, nullptr, "DecryptAesKey"},
- FunctionInfo{15, nullptr, "CryptAesCtr"},
- FunctionInfo{16, nullptr, "ComputeCmac"},
- FunctionInfo{21, nullptr, "AllocateAesKeyslot"},
- FunctionInfo{22, nullptr, "DeallocateAesKeySlot"},
- FunctionInfo{23, nullptr, "GetAesKeyslotAvailableEvent"},
- FunctionInfo{24, &SPL::SetBootReason, "SetBootReason"},
- FunctionInfo{25, &SPL::GetBootReason, "GetBootReason"}
- );
};
class SPL_FS final : public Module::Interface {
public:
explicit SPL_FS(Core::System& system_, std::shared_ptr<Module> module_);
~SPL_FS() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &SPL::GetConfig, "GetConfig"},
- FunctionInfo{1, &SPL::ModularExponentiate, "ModularExponentiate"},
- FunctionInfo{2, nullptr, "GenerateAesKek"},
- FunctionInfo{3, nullptr, "LoadAesKey"},
- FunctionInfo{4, nullptr, "GenerateAesKey"},
- FunctionInfo{5, &SPL::SetConfig, "SetConfig"},
- FunctionInfo{7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"},
- FunctionInfo{9, nullptr, "ImportLotusKey"},
- FunctionInfo{10, nullptr, "DecryptLotusMessage"},
- FunctionInfo{11, &SPL::IsDevelopment, "IsDevelopment"},
- FunctionInfo{12, nullptr, "GenerateSpecificAesKey"},
- FunctionInfo{14, nullptr, "DecryptAesKey"},
- FunctionInfo{15, nullptr, "CryptAesCtr"},
- FunctionInfo{16, nullptr, "ComputeCmac"},
- FunctionInfo{19, nullptr, "LoadTitleKey"},
- FunctionInfo{21, nullptr, "AllocateAesKeyslot"},
- FunctionInfo{22, nullptr, "DeallocateAesKeySlot"},
- FunctionInfo{23, nullptr, "GetAesKeyslotAvailableEvent"},
- FunctionInfo{24, &SPL::SetBootReason, "SetBootReason"},
- FunctionInfo{25, &SPL::GetBootReason, "GetBootReason"},
- FunctionInfo{31, nullptr, "GetPackage2Hash"}
- );
};
class SPL_SSL final : public Module::Interface {
public:
explicit SPL_SSL(Core::System& system_, std::shared_ptr<Module> module_);
~SPL_SSL() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &SPL::GetConfig, "GetConfig"},
- FunctionInfo{1, &SPL::ModularExponentiate, "ModularExponentiate"},
- FunctionInfo{2, nullptr, "GenerateAesKek"},
- FunctionInfo{3, nullptr, "LoadAesKey"},
- FunctionInfo{4, nullptr, "GenerateAesKey"},
- FunctionInfo{5, &SPL::SetConfig, "SetConfig"},
- FunctionInfo{7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"},
- FunctionInfo{11, &SPL::IsDevelopment, "IsDevelopment"},
- FunctionInfo{13, nullptr, "DecryptDeviceUniqueData"},
- FunctionInfo{14, nullptr, "DecryptAesKey"},
- FunctionInfo{15, nullptr, "CryptAesCtr"},
- FunctionInfo{16, nullptr, "ComputeCmac"},
- FunctionInfo{21, nullptr, "AllocateAesKeyslot"},
- FunctionInfo{22, nullptr, "DeallocateAesKeySlot"},
- FunctionInfo{23, nullptr, "GetAesKeyslotAvailableEvent"},
- FunctionInfo{24, &SPL::SetBootReason, "SetBootReason"},
- FunctionInfo{25, &SPL::GetBootReason, "GetBootReason"},
- FunctionInfo{26, nullptr, "DecryptAndStoreSslClientCertKey"},
- FunctionInfo{27, nullptr, "ModularExponentiateWithSslClientCertKey"}
- );
};
class SPL_ES final : public Module::Interface {
public:
explicit SPL_ES(Core::System& system_, std::shared_ptr<Module> module_);
~SPL_ES() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &SPL::GetConfig, "GetConfig"},
- FunctionInfo{1, &SPL::ModularExponentiate, "ModularExponentiate"},
- FunctionInfo{2, nullptr, "GenerateAesKek"},
- FunctionInfo{3, nullptr, "LoadAesKey"},
- FunctionInfo{4, nullptr, "GenerateAesKey"},
- FunctionInfo{5, &SPL::SetConfig, "SetConfig"},
- FunctionInfo{7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"},
- FunctionInfo{11, &SPL::IsDevelopment, "IsDevelopment"},
- FunctionInfo{13, nullptr, "DecryptDeviceUniqueData"},
- FunctionInfo{14, nullptr, "DecryptAesKey"},
- FunctionInfo{15, nullptr, "CryptAesCtr"},
- FunctionInfo{16, nullptr, "ComputeCmac"},
- FunctionInfo{17, nullptr, "ImportEsKey"},
- FunctionInfo{18, nullptr, "UnwrapTitleKey"},
- FunctionInfo{20, nullptr, "PrepareEsCommonKey"},
- FunctionInfo{21, nullptr, "AllocateAesKeyslot"},
- FunctionInfo{22, nullptr, "DeallocateAesKeySlot"},
- FunctionInfo{23, nullptr, "GetAesKeyslotAvailableEvent"},
- FunctionInfo{24, &SPL::SetBootReason, "SetBootReason"},
- FunctionInfo{25, &SPL::GetBootReason, "GetBootReason"},
- FunctionInfo{28, nullptr, "DecryptAndStoreDrmDeviceCertKey"},
- FunctionInfo{29, nullptr, "ModularExponentiateWithDrmDeviceCertKey"},
- FunctionInfo{31, nullptr, "PrepareEsArchiveKey"},
- FunctionInfo{32, nullptr, "LoadPreparedAesKey"}
- );
};
class SPL_MANU final : public Module::Interface {
public:
explicit SPL_MANU(Core::System& system_, std::shared_ptr<Module> module_);
~SPL_MANU() override;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &SPL::GetConfig, "GetConfig"},
- FunctionInfo{1, &SPL::ModularExponentiate, "ModularExponentiate"},
- FunctionInfo{2, nullptr, "GenerateAesKek"},
- FunctionInfo{3, nullptr, "LoadAesKey"},
- FunctionInfo{4, nullptr, "GenerateAesKey"},
- FunctionInfo{5, &SPL::SetConfig, "SetConfig"},
- FunctionInfo{7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"},
- FunctionInfo{11, &SPL::IsDevelopment, "IsDevelopment"},
- FunctionInfo{13, nullptr, "DecryptDeviceUniqueData"},
- FunctionInfo{14, nullptr, "DecryptAesKey"},
- FunctionInfo{15, nullptr, "CryptAesCtr"},
- FunctionInfo{16, nullptr, "ComputeCmac"},
- FunctionInfo{21, nullptr, "AllocateAesKeyslot"},
- FunctionInfo{22, nullptr, "DeallocateAesKeySlot"},
- FunctionInfo{23, nullptr, "GetAesKeyslotAvailableEvent"},
- FunctionInfo{24, &SPL::SetBootReason, "SetBootReason"},
- FunctionInfo{25, &SPL::GetBootReason, "GetBootReason"},
- FunctionInfo{30, nullptr, "ReencryptDeviceUniqueData"}
- );
};
} // namespace Service::SPL
diff --git a/src/core/hle/service/spl/spl_module.cpp b/src/core/hle/service/spl/spl_module.cpp
index 594575d9a0..520cb1860b 100644
--- a/src/core/hle/service/spl/spl_module.cpp
+++ b/src/core/hle/service/spl/spl_module.cpp
@@ -204,15 +204,14 @@ Result Module::Interface::GetConfigImpl(u64* out_config, ConfigItem config_item)
class CSRNG final : public Module::Interface {
public:
- explicit CSRNG(Core::System& system_, std::shared_ptr<Module> module_) : Interface(system_, std::move(module_), "csrng") {}
- ~CSRNG() override = default;
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit CSRNG(Core::System& system_, std::shared_ptr<Module> module_)
+ : Interface(system_, std::move(module_), "csrng") {
+ static const FunctionInfo functions[] = {
+ {0, &CSRNG::GenerateRandomBytes, "GenerateRandomBytes"},
+ };
+ RegisterHandlers(functions);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &CSRNG::GenerateRandomBytes, "GenerateRandomBytes"}
- );
+ ~CSRNG() override = default;
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/spl/spl_results.h b/src/core/hle/service/spl/spl_results.h
index dd7ba11f34..8c09be49ab 100644
--- a/src/core/hle/service/spl/spl_results.h
+++ b/src/core/hle/service/spl/spl_results.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/spl/spl_types.h b/src/core/hle/service/spl/spl_types.h
index 91f9cc0321..d7f0c4afbb 100644
--- a/src/core/hle/service/spl/spl_types.h
+++ b/src/core/hle/service/spl/spl_types.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/ssl/cert_store.cpp b/src/core/hle/service/ssl/cert_store.cpp
index b321e5d32b..ee5bf8306b 100644
--- a/src/core/hle/service/ssl/cert_store.cpp
+++ b/src/core/hle/service/ssl/cert_store.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/ssl/cert_store.h b/src/core/hle/service/ssl/cert_store.h
index 613d7b02af..4bbb3c9c1a 100644
--- a/src/core/hle/service/ssl/cert_store.h
+++ b/src/core/hle/service/ssl/cert_store.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/ssl/ssl.cpp b/src/core/hle/service/ssl/ssl.cpp
index c5902079ee..999efd4295 100644
--- a/src/core/hle/service/ssl/ssl.cpp
+++ b/src/core/hle/service/ssl/ssl.cpp
@@ -74,17 +74,57 @@ struct SslContextSharedData {
class ISslConnection final : public ServiceFramework<ISslConnection> {
public:
- explicit ISslConnection(Core::System& system_in, SslVersion ssl_version_in, std::shared_ptr<SslContextSharedData>& shared_data_in, std::unique_ptr<SSLConnectionBackend>&& backend_in)
- : ServiceFramework{system_in, "ISslConnection"}
- , ssl_version{ssl_version_in}
- , shared_data{shared_data_in}
- , backend{std::move(backend_in)} {
+ explicit ISslConnection(Core::System& system_in, SslVersion ssl_version_in,
+ std::shared_ptr<SslContextSharedData>& shared_data_in,
+ std::unique_ptr<SSLConnectionBackend>&& backend_in)
+ : ServiceFramework{system_in, "ISslConnection"}, ssl_version{ssl_version_in},
+ shared_data{shared_data_in}, backend{std::move(backend_in)} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&ISslConnection::SetSocketDescriptor>, "SetSocketDescriptor"},
+ {1, D<&ISslConnection::SetHostName>, "SetHostName"},
+ {2, D<&ISslConnection::SetVerifyOption>, "SetVerifyOption"},
+ {3, D<&ISslConnection::SetIoMode>, "SetIoMode"},
+ {4, D<&ISslConnection::GetSocketDescriptor>, "GetSocketDescriptor"},
+ {5, D<&ISslConnection::GetHostName>, "GetHostName"},
+ {6, nullptr, "GetVerifyOption"},
+ {7, D<&ISslConnection::GetIoMode>, "GetIoMode"},
+ {8, D<&ISslConnection::DoHandshake>, "DoHandshake"},
+ {9, &ISslConnection::DoHandshakeGetServerCert, "DoHandshakeGetServerCert"},
+ {10, D<&ISslConnection::Read>, "Read"},
+ {11, D<&ISslConnection::Write>, "Write"},
+ {12, D<&ISslConnection::Pending>, "Pending"},
+ {13, D<&ISslConnection::Peek>, "Peek"},
+ {14, D<&ISslConnection::Poll>, "Poll"},
+ {15, D<&ISslConnection::GetVerifyCertError>, "GetVerifyCertError"},
+ {16, D<&ISslConnection::GetNeededServerCertBufferSize>, "GetNeededServerCertBufferSize"},
+ {17, D<&ISslConnection::SetSessionCacheMode>, "SetSessionCacheMode"},
+ {18, D<&ISslConnection::GetSessionCacheMode>, "GetSessionCacheMode"},
+ {19, D<&ISslConnection::FlushSessionCache>, "FlushSessionCache"},
+ {20, D<&ISslConnection::SetRenegotiationMode>, "SetRenegotiationMode"},
+ {21, D<&ISslConnection::GetRenegotiationMode>, "GetRenegotiationMode"},
+ {22, D<&ISslConnection::SetOption>, "SetOption"},
+ {23, D<&ISslConnection::GetOption>, "GetOption"},
+ {24, nullptr, "GetVerifyCertErrors"},
+ {25, nullptr, "GetCipherInfo"},
+ {26, D<&ISslConnection::SetNextAlpnProto>, "SetNextAlpnProto"},
+ {27, D<&ISslConnection::GetNextAlpnProto>, "GetNextAlpnProto"},
+ {28, nullptr, "SetDtlsSocketDescriptor"},
+ {29, nullptr, "GetDtlsHandshakeTimeout"},
+ {30, nullptr, "SetPrivateOption"},
+ {31, nullptr, "SetSrtpCiphers"},
+ {32, nullptr, "GetSrtpCipher"},
+ {33, nullptr, "ExportKeyingMaterial"},
+ {34, nullptr, "SetIoTimeout"},
+ {35, nullptr, "GetIoTimeout"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+
backend->SetVerifyOption(verify_option);
- shared_data->connection_count++;
- }
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ shared_data->connection_count++;
}
~ISslConnection() {
@@ -392,44 +432,6 @@ private:
R_SUCCEED();
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&ISslConnection::SetSocketDescriptor>, "SetSocketDescriptor"},
- FunctionInfo{1, D<&ISslConnection::SetHostName>, "SetHostName"},
- FunctionInfo{2, D<&ISslConnection::SetVerifyOption>, "SetVerifyOption"},
- FunctionInfo{3, D<&ISslConnection::SetIoMode>, "SetIoMode"},
- FunctionInfo{4, D<&ISslConnection::GetSocketDescriptor>, "GetSocketDescriptor"},
- FunctionInfo{5, D<&ISslConnection::GetHostName>, "GetHostName"},
- FunctionInfo{6, nullptr, "GetVerifyOption"},
- FunctionInfo{7, D<&ISslConnection::GetIoMode>, "GetIoMode"},
- FunctionInfo{8, D<&ISslConnection::DoHandshake>, "DoHandshake"},
- FunctionInfo{9, &ISslConnection::DoHandshakeGetServerCert, "DoHandshakeGetServerCert"},
- FunctionInfo{10, D<&ISslConnection::Read>, "Read"},
- FunctionInfo{11, D<&ISslConnection::Write>, "Write"},
- FunctionInfo{12, D<&ISslConnection::Pending>, "Pending"},
- FunctionInfo{13, D<&ISslConnection::Peek>, "Peek"},
- FunctionInfo{14, D<&ISslConnection::Poll>, "Poll"},
- FunctionInfo{15, D<&ISslConnection::GetVerifyCertError>, "GetVerifyCertError"},
- FunctionInfo{16, D<&ISslConnection::GetNeededServerCertBufferSize>, "GetNeededServerCertBufferSize"},
- FunctionInfo{17, D<&ISslConnection::SetSessionCacheMode>, "SetSessionCacheMode"},
- FunctionInfo{18, D<&ISslConnection::GetSessionCacheMode>, "GetSessionCacheMode"},
- FunctionInfo{19, D<&ISslConnection::FlushSessionCache>, "FlushSessionCache"},
- FunctionInfo{20, D<&ISslConnection::SetRenegotiationMode>, "SetRenegotiationMode"},
- FunctionInfo{21, D<&ISslConnection::GetRenegotiationMode>, "GetRenegotiationMode"},
- FunctionInfo{22, D<&ISslConnection::SetOption>, "SetOption"},
- FunctionInfo{23, D<&ISslConnection::GetOption>, "GetOption"},
- FunctionInfo{24, nullptr, "GetVerifyCertErrors"},
- FunctionInfo{25, nullptr, "GetCipherInfo"},
- FunctionInfo{26, D<&ISslConnection::SetNextAlpnProto>, "SetNextAlpnProto"},
- FunctionInfo{27, D<&ISslConnection::GetNextAlpnProto>, "GetNextAlpnProto"},
- FunctionInfo{28, nullptr, "SetDtlsSocketDescriptor"},
- FunctionInfo{29, nullptr, "GetDtlsHandshakeTimeout"},
- FunctionInfo{30, nullptr, "SetPrivateOption"},
- FunctionInfo{31, nullptr, "SetSrtpCiphers"},
- FunctionInfo{32, nullptr, "GetSrtpCipher"},
- FunctionInfo{33, nullptr, "ExportKeyingMaterial"},
- FunctionInfo{34, nullptr, "SetIoTimeout"},
- FunctionInfo{35, nullptr, "GetIoTimeout"}
- );
SslVersion ssl_version;
std::shared_ptr<SslContextSharedData> shared_data;
std::unique_ptr<SSLConnectionBackend> backend;
@@ -450,9 +452,29 @@ public:
explicit ISslContext(Core::System& system_, SslVersion version)
: ServiceFramework{system_, "ISslContext"}, ssl_version{version},
shared_data{std::make_shared<SslContextSharedData>()} {
+ static const FunctionInfo functions[] = {
+ {0, &ISslContext::SetOption, "SetOption"},
+ {1, &ISslContext::GetOption, "GetOption"},
+ {2, &ISslContext::CreateConnection, "CreateConnection"},
+ {3, &ISslContext::GetConnectionCount, "GetConnectionCount"},
+ {4, &ISslContext::ImportServerPki, "ImportServerPki"},
+ {5, &ISslContext::ImportClientPki, "ImportClientPki"},
+ {6, nullptr, "RemoveServerPki"},
+ {7, nullptr, "RemoveClientPki"},
+ {8, D<&ISslContext::RegisterInternalPki>, "RegisterInternalPki"},
+ {9, nullptr, "AddPolicyOid"},
+ {10, nullptr, "ImportCrl"},
+ {11, nullptr, "RemoveCrl"},
+ {12, nullptr, "ImportClientCertKeyPki"},
+ {13, nullptr, "GeneratePrivateKeyAndCert"},
+ };
+ RegisterHandlers(functions);
}
private:
+ SslVersion ssl_version;
+ std::shared_ptr<SslContextSharedData> shared_data;
+
void SetOption(HLERequestContext& ctx) {
struct Parameters {
ContextOption option;
@@ -539,36 +561,28 @@ private:
LOG_WARNING(Service_SSL, "(STUBBED) called");
R_SUCCEED();
}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &ISslContext::SetOption, "SetOption"},
- FunctionInfo{1, &ISslContext::GetOption, "GetOption"},
- FunctionInfo{2, &ISslContext::CreateConnection, "CreateConnection"},
- FunctionInfo{3, &ISslContext::GetConnectionCount, "GetConnectionCount"},
- FunctionInfo{4, &ISslContext::ImportServerPki, "ImportServerPki"},
- FunctionInfo{5, &ISslContext::ImportClientPki, "ImportClientPki"},
- FunctionInfo{6, nullptr, "RemoveServerPki"},
- FunctionInfo{7, nullptr, "RemoveClientPki"},
- FunctionInfo{8, D<&ISslContext::RegisterInternalPki>, "RegisterInternalPki"},
- FunctionInfo{9, nullptr, "AddPolicyOid"},
- FunctionInfo{10, nullptr, "ImportCrl"},
- FunctionInfo{11, nullptr, "RemoveCrl"},
- FunctionInfo{12, nullptr, "ImportClientCertKeyPki"},
- FunctionInfo{13, nullptr, "GeneratePrivateKeyAndCert"}
- );
- SslVersion ssl_version;
- std::shared_ptr<SslContextSharedData> shared_data;
};
class ISslService final : public ServiceFramework<ISslService> {
public:
- explicit ISslService(Core::System& system_) : ServiceFramework{system_, "ssl"}, cert_store{system} {}
+ explicit ISslService(Core::System& system_)
+ : ServiceFramework{system_, "ssl"}, cert_store{system} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &ISslService::CreateContext, "CreateContext"},
+ {1, nullptr, "GetContextCount"},
+ {2, D<&ISslService::GetCertificates>, "GetCertificates"},
+ {3, D<&ISslService::GetCertificateBufSize>, "GetCertificateBufSize"},
+ {4, nullptr, "DebugIoctl"},
+ {5, &ISslService::SetInterfaceVersion, "SetInterfaceVersion"},
+ {6, nullptr, "FlushSessionCache"},
+ {7, nullptr, "SetDebugOption"},
+ {8, nullptr, "GetDebugOption"},
+ {8, nullptr, "ClearTls12FallbackFlag"},
+ };
+ // clang-format on
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ RegisterHandlers(functions);
}
private:
@@ -614,115 +628,146 @@ private:
}
private:
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &ISslService::CreateContext, "CreateContext"},
- FunctionInfo{1, nullptr, "GetContextCount"},
- FunctionInfo{2, D<&ISslService::GetCertificates>, "GetCertificates"},
- FunctionInfo{3, D<&ISslService::GetCertificateBufSize>, "GetCertificateBufSize"},
- FunctionInfo{4, nullptr, "DebugIoctl"},
- FunctionInfo{5, &ISslService::SetInterfaceVersion, "SetInterfaceVersion"},
- FunctionInfo{6, nullptr, "FlushSessionCache"},
- FunctionInfo{7, nullptr, "SetDebugOption"},
- FunctionInfo{8, nullptr, "GetDebugOption"},
- FunctionInfo{8, nullptr, "ClearTls12FallbackFlag"}
- );
CertStore cert_store;
};
class ISslServiceForSystem final : public ServiceFramework<ISslServiceForSystem> {
-public:
- explicit ISslServiceForSystem(Core::System& system_) : ServiceFramework{system_, "ssl:s"} {}
+ public:
+ explicit ISslServiceForSystem(Core::System& system_) : ServiceFramework{system_, "ssl:s"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, D<&ISslServiceForSystem::CreateContext>, "CreateContext"},
+ {1, D<&ISslServiceForSystem::GetContextCount>, "GetContextCount"},
+ {2, D<&ISslServiceForSystem::GetCertificates>, "GetCertificates"},
+ {3, D<&ISslServiceForSystem::GetCertificateBufSize>, "GetCertificateBufSize"},
+ {4, D<&ISslServiceForSystem::DebugIoctl>, "DebugIoctl"},
+ {5, D<&ISslServiceForSystem::SetInterfaceVersion>, "SetInterfaceVersion"},
+ {6, D<&ISslServiceForSystem::FlushSessionCache>, "FlushSessionCache"},
+ {7, D<&ISslServiceForSystem::SetDebugOption>, "SetDebugOption"},
+ {8, D<&ISslServiceForSystem::GetDebugOption>, "GetDebugOption"},
+ {9, D<&ISslServiceForSystem::ClearTls12FallbackFlag>, "ClearTls12FallbackFlag"},
+ {100, D<&ISslServiceForSystem::CreateContextForSystem>, "CreateContextForSystem"},
+ {101, D<&ISslServiceForSystem::SetThreadCoreMask>, "SetThreadCoreMask"},
+ {102, D<&ISslServiceForSystem::GetThreadCoreMask>, "GetThreadCoreMask"},
+ {103, D<&ISslServiceForSystem::VerifySignature>, "VerifySignature"}
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+ };
- Result CreateContext() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
- R_SUCCEED();
- };
+ Result CreateContext() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
- Result GetContextCount() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
- R_SUCCEED();
- };
+ // TODO (jarrodnorwell)
- Result GetCertificates() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
- R_SUCCEED();
- };
+ return ResultSuccess;
+ };
- Result GetCertificateBufSize() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
- R_SUCCEED();
- };
+ Result GetContextCount() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
- Result DebugIoctl() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
- R_SUCCEED();
- };
+ // TODO (jarrodnorwell)
- Result SetInterfaceVersion() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
- R_SUCCEED();
- };
+ return ResultSuccess;
+ };
- Result FlushSessionCache() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
- R_SUCCEED();
- };
+ Result GetCertificates() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
- Result SetDebugOption() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
- R_SUCCEED();
- };
+ // TODO (jarrodnorwell)
- Result GetDebugOption() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
- R_SUCCEED();
- };
+ return ResultSuccess;
+ };
- Result ClearTls12FallbackFlag() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
- R_SUCCEED();
- };
+ Result GetCertificateBufSize() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
- Result CreateContextForSystem() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
- R_SUCCEED();
- };
+ // TODO (jarrodnorwell)
- Result SetThreadCoreMask() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
- R_SUCCEED();
- };
+ return ResultSuccess;
+ };
- Result GetThreadCoreMask() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
- R_SUCCEED();
- };
+ Result DebugIoctl() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
- Result VerifySignature() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
- R_SUCCEED();
- };
+ // TODO (jarrodnorwell)
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
- }
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, D<&ISslServiceForSystem::CreateContext>, "CreateContext"},
- FunctionInfo{1, D<&ISslServiceForSystem::GetContextCount>, "GetContextCount"},
- FunctionInfo{2, D<&ISslServiceForSystem::GetCertificates>, "GetCertificates"},
- FunctionInfo{3, D<&ISslServiceForSystem::GetCertificateBufSize>, "GetCertificateBufSize"},
- FunctionInfo{4, D<&ISslServiceForSystem::DebugIoctl>, "DebugIoctl"},
- FunctionInfo{5, D<&ISslServiceForSystem::SetInterfaceVersion>, "SetInterfaceVersion"},
- FunctionInfo{6, D<&ISslServiceForSystem::FlushSessionCache>, "FlushSessionCache"},
- FunctionInfo{7, D<&ISslServiceForSystem::SetDebugOption>, "SetDebugOption"},
- FunctionInfo{8, D<&ISslServiceForSystem::GetDebugOption>, "GetDebugOption"},
- FunctionInfo{9, D<&ISslServiceForSystem::ClearTls12FallbackFlag>, "ClearTls12FallbackFlag"},
- FunctionInfo{100, D<&ISslServiceForSystem::CreateContextForSystem>, "CreateContextForSystem"},
- FunctionInfo{101, D<&ISslServiceForSystem::SetThreadCoreMask>, "SetThreadCoreMask"},
- FunctionInfo{102, D<&ISslServiceForSystem::GetThreadCoreMask>, "GetThreadCoreMask"},
- FunctionInfo{103, D<&ISslServiceForSystem::VerifySignature>, "VerifySignature"}
- );
-};
+ return ResultSuccess;
+ };
+
+ Result SetInterfaceVersion() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+
+ // TODO (jarrodnorwell)
+
+ return ResultSuccess;
+ };
+
+ Result FlushSessionCache() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+
+ // TODO (jarrodnorwell)
+
+ return ResultSuccess;
+ };
+
+ Result SetDebugOption() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+
+ // TODO (jarrodnorwell)
+
+ return ResultSuccess;
+ };
+
+ Result GetDebugOption() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+
+ // TODO (jarrodnorwell)
+
+ return ResultSuccess;
+ };
+
+ Result ClearTls12FallbackFlag() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+
+ // TODO (jarrodnorwell)
+
+ return ResultSuccess;
+ };
+
+ Result CreateContextForSystem() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+
+ // TODO (jarrodnorwell)
+
+ return ResultSuccess;
+ };
+
+ Result SetThreadCoreMask() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+
+ // TODO (jarrodnorwell)
+
+ return ResultSuccess;
+ };
+
+ Result GetThreadCoreMask() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+
+ // TODO (jarrodnorwell)
+
+ return ResultSuccess;
+ };
+
+ Result VerifySignature() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+
+ // TODO (jarrodnorwell)
+
+ return ResultSuccess;
+ };
+ };
void LoopProcess(Core::System& system) {
auto server_manager = std::make_unique<ServerManager>(system);
diff --git a/src/core/hle/service/ssl/ssl.h b/src/core/hle/service/ssl/ssl.h
index f6e21bbb3b..dc9f2b746b 100644
--- a/src/core/hle/service/ssl/ssl.h
+++ b/src/core/hle/service/ssl/ssl.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/ssl/ssl_types.h b/src/core/hle/service/ssl/ssl_types.h
index 16623c0fc5..cbd84ad1f9 100644
--- a/src/core/hle/service/ssl/ssl_types.h
+++ b/src/core/hle/service/ssl/ssl_types.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/tma/tma.cpp b/src/core/hle/service/tma/tma.cpp
index e9198eea64..c2fb33cd16 100644
--- a/src/core/hle/service/tma/tma.cpp
+++ b/src/core/hle/service/tma/tma.cpp
@@ -19,14 +19,12 @@ class HTC_TENV final : public ServiceFramework<HTC_TENV> {
public:
explicit HTC_TENV(Core::System& system_)
: ServiceFramework{system_, "htc:tenv"}
- {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ {
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetServiceInterface"},
+ };
+ RegisterHandlers(functions);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetServiceInterface"}
- );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/usb/usb.cpp b/src/core/hle/service/usb/usb.cpp
index f7dc15e3db..ff2a377172 100644
--- a/src/core/hle/service/usb/usb.cpp
+++ b/src/core/hle/service/usb/usb.cpp
@@ -17,127 +17,137 @@ namespace Service::USB {
class IDsInterface final : public ServiceFramework<IDsInterface> {
public:
- explicit IDsInterface(Core::System& system_) : ServiceFramework{system_, "IDsInterface"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "AddEndpoint"},
- FunctionInfo{1, nullptr, "GetSetupEvent"},
- FunctionInfo{2, nullptr, "GetSetupPacket"},
- FunctionInfo{3, nullptr, "Enable"},
- FunctionInfo{4, nullptr, "Disable"},
- FunctionInfo{5, nullptr, "CtrlIn"},
- FunctionInfo{6, nullptr, "CtrlOut"},
- FunctionInfo{7, nullptr, "GetCtrlInCompletionEvent"},
- FunctionInfo{8, nullptr, "GetCtrlInUrbReport"},
- FunctionInfo{9, nullptr, "GetCtrlOutCompletionEvent"},
- FunctionInfo{10, nullptr, "GetCtrlOutUrbReport"},
- FunctionInfo{11, nullptr, "CtrlStall"},
- FunctionInfo{12, nullptr, "AppendConfigurationData"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit IDsInterface(Core::System& system_) : ServiceFramework{system_, "IDsInterface"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "AddEndpoint"},
+ {1, nullptr, "GetSetupEvent"},
+ {2, nullptr, "GetSetupPacket"},
+ {3, nullptr, "Enable"},
+ {4, nullptr, "Disable"},
+ {5, nullptr, "CtrlIn"},
+ {6, nullptr, "CtrlOut"},
+ {7, nullptr, "GetCtrlInCompletionEvent"},
+ {8, nullptr, "GetCtrlInUrbReport"},
+ {9, nullptr, "GetCtrlOutCompletionEvent"},
+ {10, nullptr, "GetCtrlOutUrbReport"},
+ {11, nullptr, "CtrlStall"},
+ {12, nullptr, "AppendConfigurationData"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
class IDsRootSession final : public ServiceFramework<IDsRootSession> {
public:
- explicit IDsRootSession(Core::System& system_) : ServiceFramework{system_, "usb:ds"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "OpenDsService"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit IDsRootSession(Core::System& system_) : ServiceFramework{system_, "usb:ds"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "OpenDsService"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
class IClientEpSession final : public ServiceFramework<IClientEpSession> {
public:
explicit IClientEpSession(Core::System& system_)
- : ServiceFramework{system_, "IClientEpSession"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "ReOpen"},
- FunctionInfo{1, nullptr, "Close"},
- FunctionInfo{2, nullptr, "GetCompletionEvent"},
- FunctionInfo{3, nullptr, "PopulateRing"},
- FunctionInfo{4, nullptr, "PostBufferAsync"},
- FunctionInfo{5, nullptr, "GetXferReport"},
- FunctionInfo{6, nullptr, "PostBufferMultiAsync"},
- FunctionInfo{7, nullptr, "CreateSmmuSpace"},
- FunctionInfo{8, nullptr, "ShareReportRing"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "IClientEpSession"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "ReOpen"},
+ {1, nullptr, "Close"},
+ {2, nullptr, "GetCompletionEvent"},
+ {3, nullptr, "PopulateRing"},
+ {4, nullptr, "PostBufferAsync"},
+ {5, nullptr, "GetXferReport"},
+ {6, nullptr, "PostBufferMultiAsync"},
+ {7, nullptr, "CreateSmmuSpace"},
+ {8, nullptr, "ShareReportRing"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
class IClientIfSession final : public ServiceFramework<IClientIfSession> {
public:
explicit IClientIfSession(Core::System& system_)
- : ServiceFramework{system_, "IClientIfSession"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetStateChangeEvent"},
- FunctionInfo{1, nullptr, "SetInterface"},
- FunctionInfo{2, nullptr, "GetInterface"},
- FunctionInfo{3, nullptr, "GetAlternateInterface"},
- FunctionInfo{4, nullptr, "GetCurrentFrame"},
- FunctionInfo{5, nullptr, "CtrlXferAsync"},
- FunctionInfo{6, nullptr, "GetCtrlXferCompletionEvent"},
- FunctionInfo{7, nullptr, "GetCtrlXferReport"},
- FunctionInfo{8, nullptr, "ResetDevice"},
- FunctionInfo{9, nullptr, "OpenUsbEp"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "IClientIfSession"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetStateChangeEvent"},
+ {1, nullptr, "SetInterface"},
+ {2, nullptr, "GetInterface"},
+ {3, nullptr, "GetAlternateInterface"},
+ {4, nullptr, "GetCurrentFrame"},
+ {5, nullptr, "CtrlXferAsync"},
+ {6, nullptr, "GetCtrlXferCompletionEvent"},
+ {7, nullptr, "GetCtrlXferReport"},
+ {8, nullptr, "ResetDevice"},
+ {9, nullptr, "OpenUsbEp"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
class IClientRootSession final : public ServiceFramework<IClientRootSession> {
public:
- explicit IClientRootSession(Core::System& system_) : ServiceFramework{system_, "usb:hs"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "BindClientProcess"},
- FunctionInfo{1, nullptr, "QueryAllInterfaces"},
- FunctionInfo{2, nullptr, "QueryAvailableInterfaces"},
- FunctionInfo{3, nullptr, "QueryAcquiredInterfaces"},
- FunctionInfo{4, nullptr, "CreateInterfaceAvailableEvent"},
- FunctionInfo{5, nullptr, "DestroyInterfaceAvailableEvent"},
- FunctionInfo{6, nullptr, "GetInterfaceStateChangeEvent"},
- FunctionInfo{7, nullptr, "AcquireUsbIf"},
- FunctionInfo{8, nullptr, "SetTestMode"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit IClientRootSession(Core::System& system_) : ServiceFramework{system_, "usb:hs"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "BindClientProcess"},
+ {1, nullptr, "QueryAllInterfaces"},
+ {2, nullptr, "QueryAvailableInterfaces"},
+ {3, nullptr, "QueryAcquiredInterfaces"},
+ {4, nullptr, "CreateInterfaceAvailableEvent"},
+ {5, nullptr, "DestroyInterfaceAvailableEvent"},
+ {6, nullptr, "GetInterfaceStateChangeEvent"},
+ {7, nullptr, "AcquireUsbIf"},
+ {8, nullptr, "SetTestMode"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
class IPdSession final : public ServiceFramework<IPdSession> {
public:
- explicit IPdSession(Core::System& system_) : ServiceFramework{system_, "IPdSession"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "BindNoticeEvent"},
- FunctionInfo{1, nullptr, "UnbindNoticeEvent"},
- FunctionInfo{2, nullptr, "GetStatus"},
- FunctionInfo{3, nullptr, "GetNotice"},
- FunctionInfo{4, nullptr, "EnablePowerRequestNotice"},
- FunctionInfo{5, nullptr, "DisablePowerRequestNotice"},
- FunctionInfo{6, nullptr, "ReplyPowerRequest"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit IPdSession(Core::System& system_) : ServiceFramework{system_, "IPdSession"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "BindNoticeEvent"},
+ {1, nullptr, "UnbindNoticeEvent"},
+ {2, nullptr, "GetStatus"},
+ {3, nullptr, "GetNotice"},
+ {4, nullptr, "EnablePowerRequestNotice"},
+ {5, nullptr, "DisablePowerRequestNotice"},
+ {6, nullptr, "ReplyPowerRequest"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
class IPdManager final : public ServiceFramework<IPdManager> {
public:
- explicit IPdManager(Core::System& system_) : ServiceFramework{system_, "usb:pd"} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit IPdManager(Core::System& system_) : ServiceFramework{system_, "usb:pd"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &IPdManager::OpenSession, "OpenSession"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
private:
@@ -148,39 +158,40 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<IPdSession>(ctx, system);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &IPdManager::OpenSession, "OpenSession"}
- );
};
class IPdCradleSession final : public ServiceFramework<IPdCradleSession> {
public:
explicit IPdCradleSession(Core::System& system_)
- : ServiceFramework{system_, "IPdCradleSession"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "SetCradleVdo"},
- FunctionInfo{1, nullptr, "GetCradleVdo"},
- FunctionInfo{2, nullptr, "ResetCradleUsbHub"},
- FunctionInfo{3, nullptr, "GetHostPdcFirmwareType"},
- FunctionInfo{4, nullptr, "GetHostPdcFirmwareRevision"},
- FunctionInfo{5, nullptr, "GetHostPdcManufactureId"},
- FunctionInfo{6, nullptr, "GetHostPdcDeviceId"},
- FunctionInfo{7, nullptr, "EnableCradleRecovery"},
- FunctionInfo{8, nullptr, "DisableCradleRecovery"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ : ServiceFramework{system_, "IPdCradleSession"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "SetCradleVdo"},
+ {1, nullptr, "GetCradleVdo"},
+ {2, nullptr, "ResetCradleUsbHub"},
+ {3, nullptr, "GetHostPdcFirmwareType"},
+ {4, nullptr, "GetHostPdcFirmwareRevision"},
+ {5, nullptr, "GetHostPdcManufactureId"},
+ {6, nullptr, "GetHostPdcDeviceId"},
+ {7, nullptr, "EnableCradleRecovery"},
+ {8, nullptr, "DisableCradleRecovery"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
class IPdCradleManager final : public ServiceFramework<IPdCradleManager> {
public:
- explicit IPdCradleManager(Core::System& system_) : ServiceFramework{system_, "usb:pd:c"} {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit IPdCradleManager(Core::System& system_) : ServiceFramework{system_, "usb:pd:c"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, &IPdCradleManager::OpenCradleSession, "OpenCradleSession"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
private:
@@ -191,64 +202,61 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<IPdCradleSession>(ctx, system);
}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, &IPdCradleManager::OpenCradleSession, "OpenCradleSession"}
- );
};
class IPmMainService final : public ServiceFramework<IPmMainService> {
public:
- explicit IPmMainService(Core::System& system_) : ServiceFramework{system_, "usb:pm"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetPowerEvent"},
- FunctionInfo{1, nullptr, "GetPowerState"},
- FunctionInfo{2, nullptr, "GetDataEvent"},
- FunctionInfo{3, nullptr, "GetDataRole"},
- FunctionInfo{4, nullptr, "SetDiagData"},
- FunctionInfo{5, nullptr, "GetDiagData"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit IPmMainService(Core::System& system_) : ServiceFramework{system_, "usb:pm"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetPowerEvent"},
+ {1, nullptr, "GetPowerState"},
+ {2, nullptr, "GetDataEvent"},
+ {3, nullptr, "GetDataRole"},
+ {4, nullptr, "SetDiagData"},
+ {5, nullptr, "GetDiagData"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
};
class IPdManufactureManager final : public ServiceFramework<IPdManufactureManager> {
public:
- explicit IPdManufactureManager(Core::System& system_) : ServiceFramework{system_, "usb:pd:m"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "OpenManufactureSession"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit IPdManufactureManager(Core::System& system_) : ServiceFramework{system_, "usb:pd:m"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "OpenManufactureSession"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class IQdbManager final : public ServiceFramework<IQdbManager> {
public:
- explicit IQdbManager(Core::System& system_) : ServiceFramework{system_, "usb:qdb"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "ImportQuirkDevices"},
- FunctionInfo{1, nullptr, "HasQuirk"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit IQdbManager(Core::System& system_) : ServiceFramework{system_, "usb:qdb"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "ImportQuirkDevices"},
+ {1, nullptr, "HasQuirk"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
class IPmObserverService final : public ServiceFramework<IPmObserverService> {
public:
- explicit IPmObserverService(Core::System& system_) : ServiceFramework{system_, "usb:obsv"} {}
-
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetTopologyChangeEvent"},
- FunctionInfo{1, nullptr, "GetFlattenedTopology"}
- );
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ explicit IPmObserverService(Core::System& system_) : ServiceFramework{system_, "usb:obsv"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetTopologyChangeEvent"},
+ {1, nullptr, "GetFlattenedTopology"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
};
diff --git a/src/core/hle/service/usb/usb.h b/src/core/hle/service/usb/usb.h
index 98376ebc0c..cc25a3b29e 100644
--- a/src/core/hle/service/usb/usb.h
+++ b/src/core/hle/service/usb/usb.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/vi/application_display_service.cpp b/src/core/hle/service/vi/application_display_service.cpp
index dcebb2eba9..f179ba676a 100644
--- a/src/core/hle/service/vi/application_display_service.cpp
+++ b/src/core/hle/service/vi/application_display_service.cpp
@@ -17,38 +17,38 @@
namespace Service::VI {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IApplicationDisplayService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{100, C<&IApplicationDisplayService::GetRelayService>, "GetRelayService"},
- FunctionInfo{101, C<&IApplicationDisplayService::GetSystemDisplayService>, "GetSystemDisplayService"},
- FunctionInfo{102, C<&IApplicationDisplayService::GetManagerDisplayService>, "GetManagerDisplayService"},
- FunctionInfo{103, C<&IApplicationDisplayService::GetIndirectDisplayTransactionService>, "GetIndirectDisplayTransactionService"},
- FunctionInfo{1000, C<&IApplicationDisplayService::ListDisplays>, "ListDisplays"},
- FunctionInfo{1010, C<&IApplicationDisplayService::OpenDisplay>, "OpenDisplay"},
- FunctionInfo{1011, C<&IApplicationDisplayService::OpenDefaultDisplay>, "OpenDefaultDisplay"},
- FunctionInfo{1020, C<&IApplicationDisplayService::CloseDisplay>, "CloseDisplay"},
- FunctionInfo{1101, C<&IApplicationDisplayService::SetDisplayEnabled>, "SetDisplayEnabled"},
- FunctionInfo{1102, C<&IApplicationDisplayService::GetDisplayResolution>, "GetDisplayResolution"},
- FunctionInfo{2020, C<&IApplicationDisplayService::OpenLayer>, "OpenLayer"},
- FunctionInfo{2021, C<&IApplicationDisplayService::CloseLayer>, "CloseLayer"},
- FunctionInfo{2030, C<&IApplicationDisplayService::CreateStrayLayer>, "CreateStrayLayer"},
- FunctionInfo{2031, C<&IApplicationDisplayService::DestroyStrayLayer>, "DestroyStrayLayer"},
- FunctionInfo{2101, C<&IApplicationDisplayService::SetLayerScalingMode>, "SetLayerScalingMode"},
- FunctionInfo{2102, C<&IApplicationDisplayService::ConvertScalingMode>, "ConvertScalingMode"},
- FunctionInfo{2103, C<&IApplicationDisplayService::Cmd2103>, "Cmd2103"},
- FunctionInfo{2450, C<&IApplicationDisplayService::GetIndirectLayerImageMap>, "GetIndirectLayerImageMap"},
- FunctionInfo{2451, nullptr, "GetIndirectLayerImageCropMap"},
- FunctionInfo{2460, C<&IApplicationDisplayService::GetIndirectLayerImageRequiredMemoryInfo>, "GetIndirectLayerImageRequiredMemoryInfo"},
- FunctionInfo{5202, C<&IApplicationDisplayService::GetDisplayVsyncEvent>, "GetDisplayVsyncEvent"},
- FunctionInfo{5203, nullptr, "GetDisplayVsyncEventForDebug"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IApplicationDisplayService::IApplicationDisplayService(Core::System& system_,
std::shared_ptr<Container> container)
: ServiceFramework{system_, "IApplicationDisplayService"},
m_container{std::move(container)}, m_context{system, "IApplicationDisplayService"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {100, C<&IApplicationDisplayService::GetRelayService>, "GetRelayService"},
+ {101, C<&IApplicationDisplayService::GetSystemDisplayService>, "GetSystemDisplayService"},
+ {102, C<&IApplicationDisplayService::GetManagerDisplayService>, "GetManagerDisplayService"},
+ {103, C<&IApplicationDisplayService::GetIndirectDisplayTransactionService>, "GetIndirectDisplayTransactionService"},
+ {1000, C<&IApplicationDisplayService::ListDisplays>, "ListDisplays"},
+ {1010, C<&IApplicationDisplayService::OpenDisplay>, "OpenDisplay"},
+ {1011, C<&IApplicationDisplayService::OpenDefaultDisplay>, "OpenDefaultDisplay"},
+ {1020, C<&IApplicationDisplayService::CloseDisplay>, "CloseDisplay"},
+ {1101, C<&IApplicationDisplayService::SetDisplayEnabled>, "SetDisplayEnabled"},
+ {1102, C<&IApplicationDisplayService::GetDisplayResolution>, "GetDisplayResolution"},
+ {2020, C<&IApplicationDisplayService::OpenLayer>, "OpenLayer"},
+ {2021, C<&IApplicationDisplayService::CloseLayer>, "CloseLayer"},
+ {2030, C<&IApplicationDisplayService::CreateStrayLayer>, "CreateStrayLayer"},
+ {2031, C<&IApplicationDisplayService::DestroyStrayLayer>, "DestroyStrayLayer"},
+ {2101, C<&IApplicationDisplayService::SetLayerScalingMode>, "SetLayerScalingMode"},
+ {2102, C<&IApplicationDisplayService::ConvertScalingMode>, "ConvertScalingMode"},
+ {2103, C<&IApplicationDisplayService::Cmd2103>, "Cmd2103"},
+ {2450, C<&IApplicationDisplayService::GetIndirectLayerImageMap>, "GetIndirectLayerImageMap"},
+ {2451, nullptr, "GetIndirectLayerImageCropMap"},
+ {2460, C<&IApplicationDisplayService::GetIndirectLayerImageRequiredMemoryInfo>, "GetIndirectLayerImageRequiredMemoryInfo"},
+ {5202, C<&IApplicationDisplayService::GetDisplayVsyncEvent>, "GetDisplayVsyncEvent"},
+ {5203, nullptr, "GetDisplayVsyncEventForDebug"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IApplicationDisplayService::~IApplicationDisplayService() {
diff --git a/src/core/hle/service/vi/application_display_service.h b/src/core/hle/service/vi/application_display_service.h
index 0b5898ee56..d2db391efd 100644
--- a/src/core/hle/service/vi/application_display_service.h
+++ b/src/core/hle/service/vi/application_display_service.h
@@ -74,8 +74,8 @@ public:
s64 width, s64 height);
private:
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
const std::shared_ptr<Container> m_container;
+
KernelHelpers::ServiceContext m_context;
std::mutex m_lock{};
std::set<u64> m_open_layer_ids{};
diff --git a/src/core/hle/service/vi/application_root_service.cpp b/src/core/hle/service/vi/application_root_service.cpp
index f12c564277..2204f77ed4 100644
--- a/src/core/hle/service/vi/application_root_service.cpp
+++ b/src/core/hle/service/vi/application_root_service.cpp
@@ -14,17 +14,14 @@
namespace Service::VI {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IApplicationRootService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, C<&IApplicationRootService::GetDisplayService>, "GetDisplayService"},
- FunctionInfo{1, nullptr, "GetDisplayServiceWithProxyNameExchange"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IApplicationRootService::IApplicationRootService(Core::System& system_,
std::shared_ptr<Container> container)
: ServiceFramework{system_, "vi:u"}, m_container{std::move(container)} {
+ static const FunctionInfo functions[] = {
+ {0, C<&IApplicationRootService::GetDisplayService>, "GetDisplayService"},
+ {1, nullptr, "GetDisplayServiceWithProxyNameExchange"},
+ };
+ RegisterHandlers(functions);
}
IApplicationRootService::~IApplicationRootService() = default;
diff --git a/src/core/hle/service/vi/application_root_service.h b/src/core/hle/service/vi/application_root_service.h
index 4deaa04f4c..b66293b73f 100644
--- a/src/core/hle/service/vi/application_root_service.h
+++ b/src/core/hle/service/vi/application_root_service.h
@@ -30,7 +30,6 @@ private:
Policy policy);
private:
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
const std::shared_ptr<Container> m_container;
};
diff --git a/src/core/hle/service/vi/display.h b/src/core/hle/service/vi/display.h
index fceda75e39..543c6ee68d 100644
--- a/src/core/hle/service/vi/display.h
+++ b/src/core/hle/service/vi/display.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/vi/display_list.h b/src/core/hle/service/vi/display_list.h
index f710ac472c..bf9cf78a27 100644
--- a/src/core/hle/service/vi/display_list.h
+++ b/src/core/hle/service/vi/display_list.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/vi/layer.h b/src/core/hle/service/vi/layer.h
index e4c9c98646..9bd6d033ac 100644
--- a/src/core/hle/service/vi/layer.h
+++ b/src/core/hle/service/vi/layer.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/vi/layer_list.h b/src/core/hle/service/vi/layer_list.h
index 4afca6f403..8fc7cd3ade 100644
--- a/src/core/hle/service/vi/layer_list.h
+++ b/src/core/hle/service/vi/layer_list.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/vi/manager_display_service.cpp b/src/core/hle/service/vi/manager_display_service.cpp
index 1b3b0f3379..34a0175b49 100644
--- a/src/core/hle/service/vi/manager_display_service.cpp
+++ b/src/core/hle/service/vi/manager_display_service.cpp
@@ -10,96 +10,96 @@
namespace Service::VI {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IManagerDisplayService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{200, nullptr, "AllocateProcessHeapBlock"},
- FunctionInfo{201, nullptr, "FreeProcessHeapBlock"},
- FunctionInfo{1102, nullptr, "GetDisplayResolution"},
- FunctionInfo{2010, C<&IManagerDisplayService::CreateManagedLayer>, "CreateManagedLayer"},
- FunctionInfo{2011, C<&IManagerDisplayService::DestroyManagedLayer>, "DestroyManagedLayer"},
- FunctionInfo{2012, nullptr, "CreateStrayLayer"},
- FunctionInfo{2050, nullptr, "CreateIndirectLayer"},
- FunctionInfo{2051, nullptr, "DestroyIndirectLayer"},
- FunctionInfo{2052, nullptr, "CreateIndirectProducerEndPoint"},
- FunctionInfo{2053, nullptr, "DestroyIndirectProducerEndPoint"},
- FunctionInfo{2054, nullptr, "CreateIndirectConsumerEndPoint"},
- FunctionInfo{2055, nullptr, "DestroyIndirectConsumerEndPoint"},
- FunctionInfo{2060, nullptr, "CreateWatermarkCompositor"},
- FunctionInfo{2062, nullptr, "SetWatermarkText"},
- FunctionInfo{2063, nullptr, "SetWatermarkLayerStacks"},
- FunctionInfo{2300, nullptr, "AcquireLayerTexturePresentingEvent"},
- FunctionInfo{2301, nullptr, "ReleaseLayerTexturePresentingEvent"},
- FunctionInfo{2302, nullptr, "GetDisplayHotplugEvent"},
- FunctionInfo{2303, nullptr, "GetDisplayModeChangedEvent"},
- FunctionInfo{2402, nullptr, "GetDisplayHotplugState"},
- FunctionInfo{2501, nullptr, "GetCompositorErrorInfo"},
- FunctionInfo{2601, nullptr, "GetDisplayErrorEvent"},
- FunctionInfo{2701, nullptr, "GetDisplayFatalErrorEvent"},
- FunctionInfo{4201, nullptr, "SetDisplayAlpha"},
- FunctionInfo{4203, nullptr, "SetDisplayLayerStack"},
- FunctionInfo{4205, nullptr, "SetDisplayPowerState"},
- FunctionInfo{4206, nullptr, "SetDefaultDisplay"},
- FunctionInfo{4207, nullptr, "ResetDisplayPanel"},
- FunctionInfo{4208, nullptr, "SetDisplayFatalErrorEnabled"},
- FunctionInfo{4209, nullptr, "IsDisplayPanelOn"},
- FunctionInfo{4300, nullptr, "GetInternalPanelId"},
- FunctionInfo{6000, C<&IManagerDisplayService::AddToLayerStack>, "AddToLayerStack"},
- FunctionInfo{6001, nullptr, "RemoveFromLayerStack"},
- FunctionInfo{6002, C<&IManagerDisplayService::SetLayerVisibility>, "SetLayerVisibility"},
- FunctionInfo{6003, nullptr, "SetLayerConfig"},
- FunctionInfo{6004, nullptr, "AttachLayerPresentationTracer"},
- FunctionInfo{6005, nullptr, "DetachLayerPresentationTracer"},
- FunctionInfo{6006, nullptr, "StartLayerPresentationRecording"},
- FunctionInfo{6007, nullptr, "StopLayerPresentationRecording"},
- FunctionInfo{6008, nullptr, "StartLayerPresentationFenceWait"},
- FunctionInfo{6009, nullptr, "StopLayerPresentationFenceWait"},
- FunctionInfo{6010, nullptr, "GetLayerPresentationAllFencesExpiredEvent"},
- FunctionInfo{6011, nullptr, "EnableLayerAutoClearTransitionBuffer"},
- FunctionInfo{6012, nullptr, "DisableLayerAutoClearTransitionBuffer"},
- FunctionInfo{6013, nullptr, "SetLayerOpacity"},
- FunctionInfo{6014, nullptr, "AttachLayerWatermarkCompositor"},
- FunctionInfo{6015, nullptr, "DetachLayerWatermarkCompositor"},
- FunctionInfo{7000, nullptr, "SetContentVisibility"},
- FunctionInfo{8000, nullptr, "SetConductorLayer"},
- FunctionInfo{8001, nullptr, "SetTimestampTracking"},
- FunctionInfo{8100, nullptr, "SetIndirectProducerFlipOffset"},
- FunctionInfo{8200, nullptr, "CreateSharedBufferStaticStorage"},
- FunctionInfo{8201, nullptr, "CreateSharedBufferTransferMemory"},
- FunctionInfo{8202, nullptr, "DestroySharedBuffer"},
- FunctionInfo{8203, nullptr, "BindSharedLowLevelLayerToManagedLayer"},
- FunctionInfo{8204, nullptr, "BindSharedLowLevelLayerToIndirectLayer"},
- FunctionInfo{8207, nullptr, "UnbindSharedLowLevelLayer"},
- FunctionInfo{8208, nullptr, "ConnectSharedLowLevelLayerToSharedBuffer"},
- FunctionInfo{8209, nullptr, "DisconnectSharedLowLevelLayerFromSharedBuffer"},
- FunctionInfo{8210, nullptr, "CreateSharedLayer"},
- FunctionInfo{8211, nullptr, "DestroySharedLayer"},
- FunctionInfo{8216, nullptr, "AttachSharedLayerToLowLevelLayer"},
- FunctionInfo{8217, nullptr, "ForceDetachSharedLayerFromLowLevelLayer"},
- FunctionInfo{8218, nullptr, "StartDetachSharedLayerFromLowLevelLayer"},
- FunctionInfo{8219, nullptr, "FinishDetachSharedLayerFromLowLevelLayer"},
- FunctionInfo{8220, nullptr, "GetSharedLayerDetachReadyEvent"},
- FunctionInfo{8221, nullptr, "GetSharedLowLevelLayerSynchronizedEvent"},
- FunctionInfo{8222, nullptr, "CheckSharedLowLevelLayerSynchronized"},
- FunctionInfo{8223, nullptr, "RegisterSharedBufferImporterAruid"},
- FunctionInfo{8224, nullptr, "UnregisterSharedBufferImporterAruid"},
- FunctionInfo{8227, nullptr, "CreateSharedBufferProcessHeap"},
- FunctionInfo{8228, nullptr, "GetSharedLayerLayerStacks"},
- FunctionInfo{8229, nullptr, "SetSharedLayerLayerStacks"},
- FunctionInfo{8291, nullptr, "PresentDetachedSharedFrameBufferToLowLevelLayer"},
- FunctionInfo{8292, nullptr, "FillDetachedSharedFrameBufferColor"},
- FunctionInfo{8293, nullptr, "GetDetachedSharedFrameBufferImage"},
- FunctionInfo{8294, nullptr, "SetDetachedSharedFrameBufferImage"},
- FunctionInfo{8295, nullptr, "CopyDetachedSharedFrameBufferImage"},
- FunctionInfo{8296, nullptr, "SetDetachedSharedFrameBufferSubImage"},
- FunctionInfo{8297, nullptr, "GetSharedFrameBufferContentParameter"},
- FunctionInfo{8298, nullptr, "ExpandStartupLogoOnSharedFrameBuffer"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IManagerDisplayService::IManagerDisplayService(Core::System& system_,
std::shared_ptr<Container> container)
: ServiceFramework{system_, "IManagerDisplayService"}, m_container{std::move(container)} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {200, nullptr, "AllocateProcessHeapBlock"},
+ {201, nullptr, "FreeProcessHeapBlock"},
+ {1102, nullptr, "GetDisplayResolution"},
+ {2010, C<&IManagerDisplayService::CreateManagedLayer>, "CreateManagedLayer"},
+ {2011, C<&IManagerDisplayService::DestroyManagedLayer>, "DestroyManagedLayer"},
+ {2012, nullptr, "CreateStrayLayer"},
+ {2050, nullptr, "CreateIndirectLayer"},
+ {2051, nullptr, "DestroyIndirectLayer"},
+ {2052, nullptr, "CreateIndirectProducerEndPoint"},
+ {2053, nullptr, "DestroyIndirectProducerEndPoint"},
+ {2054, nullptr, "CreateIndirectConsumerEndPoint"},
+ {2055, nullptr, "DestroyIndirectConsumerEndPoint"},
+ {2060, nullptr, "CreateWatermarkCompositor"},
+ {2062, nullptr, "SetWatermarkText"},
+ {2063, nullptr, "SetWatermarkLayerStacks"},
+ {2300, nullptr, "AcquireLayerTexturePresentingEvent"},
+ {2301, nullptr, "ReleaseLayerTexturePresentingEvent"},
+ {2302, nullptr, "GetDisplayHotplugEvent"},
+ {2303, nullptr, "GetDisplayModeChangedEvent"},
+ {2402, nullptr, "GetDisplayHotplugState"},
+ {2501, nullptr, "GetCompositorErrorInfo"},
+ {2601, nullptr, "GetDisplayErrorEvent"},
+ {2701, nullptr, "GetDisplayFatalErrorEvent"},
+ {4201, nullptr, "SetDisplayAlpha"},
+ {4203, nullptr, "SetDisplayLayerStack"},
+ {4205, nullptr, "SetDisplayPowerState"},
+ {4206, nullptr, "SetDefaultDisplay"},
+ {4207, nullptr, "ResetDisplayPanel"},
+ {4208, nullptr, "SetDisplayFatalErrorEnabled"},
+ {4209, nullptr, "IsDisplayPanelOn"},
+ {4300, nullptr, "GetInternalPanelId"},
+ {6000, C<&IManagerDisplayService::AddToLayerStack>, "AddToLayerStack"},
+ {6001, nullptr, "RemoveFromLayerStack"},
+ {6002, C<&IManagerDisplayService::SetLayerVisibility>, "SetLayerVisibility"},
+ {6003, nullptr, "SetLayerConfig"},
+ {6004, nullptr, "AttachLayerPresentationTracer"},
+ {6005, nullptr, "DetachLayerPresentationTracer"},
+ {6006, nullptr, "StartLayerPresentationRecording"},
+ {6007, nullptr, "StopLayerPresentationRecording"},
+ {6008, nullptr, "StartLayerPresentationFenceWait"},
+ {6009, nullptr, "StopLayerPresentationFenceWait"},
+ {6010, nullptr, "GetLayerPresentationAllFencesExpiredEvent"},
+ {6011, nullptr, "EnableLayerAutoClearTransitionBuffer"},
+ {6012, nullptr, "DisableLayerAutoClearTransitionBuffer"},
+ {6013, nullptr, "SetLayerOpacity"},
+ {6014, nullptr, "AttachLayerWatermarkCompositor"},
+ {6015, nullptr, "DetachLayerWatermarkCompositor"},
+ {7000, nullptr, "SetContentVisibility"},
+ {8000, nullptr, "SetConductorLayer"},
+ {8001, nullptr, "SetTimestampTracking"},
+ {8100, nullptr, "SetIndirectProducerFlipOffset"},
+ {8200, nullptr, "CreateSharedBufferStaticStorage"},
+ {8201, nullptr, "CreateSharedBufferTransferMemory"},
+ {8202, nullptr, "DestroySharedBuffer"},
+ {8203, nullptr, "BindSharedLowLevelLayerToManagedLayer"},
+ {8204, nullptr, "BindSharedLowLevelLayerToIndirectLayer"},
+ {8207, nullptr, "UnbindSharedLowLevelLayer"},
+ {8208, nullptr, "ConnectSharedLowLevelLayerToSharedBuffer"},
+ {8209, nullptr, "DisconnectSharedLowLevelLayerFromSharedBuffer"},
+ {8210, nullptr, "CreateSharedLayer"},
+ {8211, nullptr, "DestroySharedLayer"},
+ {8216, nullptr, "AttachSharedLayerToLowLevelLayer"},
+ {8217, nullptr, "ForceDetachSharedLayerFromLowLevelLayer"},
+ {8218, nullptr, "StartDetachSharedLayerFromLowLevelLayer"},
+ {8219, nullptr, "FinishDetachSharedLayerFromLowLevelLayer"},
+ {8220, nullptr, "GetSharedLayerDetachReadyEvent"},
+ {8221, nullptr, "GetSharedLowLevelLayerSynchronizedEvent"},
+ {8222, nullptr, "CheckSharedLowLevelLayerSynchronized"},
+ {8223, nullptr, "RegisterSharedBufferImporterAruid"},
+ {8224, nullptr, "UnregisterSharedBufferImporterAruid"},
+ {8227, nullptr, "CreateSharedBufferProcessHeap"},
+ {8228, nullptr, "GetSharedLayerLayerStacks"},
+ {8229, nullptr, "SetSharedLayerLayerStacks"},
+ {8291, nullptr, "PresentDetachedSharedFrameBufferToLowLevelLayer"},
+ {8292, nullptr, "FillDetachedSharedFrameBufferColor"},
+ {8293, nullptr, "GetDetachedSharedFrameBufferImage"},
+ {8294, nullptr, "SetDetachedSharedFrameBufferImage"},
+ {8295, nullptr, "CopyDetachedSharedFrameBufferImage"},
+ {8296, nullptr, "SetDetachedSharedFrameBufferSubImage"},
+ {8297, nullptr, "GetSharedFrameBufferContentParameter"},
+ {8298, nullptr, "ExpandStartupLogoOnSharedFrameBuffer"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
}
IManagerDisplayService::~IManagerDisplayService() = default;
diff --git a/src/core/hle/service/vi/manager_display_service.h b/src/core/hle/service/vi/manager_display_service.h
index 1c7a79f337..2e05e730c7 100644
--- a/src/core/hle/service/vi/manager_display_service.h
+++ b/src/core/hle/service/vi/manager_display_service.h
@@ -37,7 +37,6 @@ public:
Result SetLayerVisibility(bool visible, u64 layer_id);
private:
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
const std::shared_ptr<Container> m_container;
};
diff --git a/src/core/hle/service/vi/manager_root_service.cpp b/src/core/hle/service/vi/manager_root_service.cpp
index 0cc98bc2c0..094261e060 100644
--- a/src/core/hle/service/vi/manager_root_service.cpp
+++ b/src/core/hle/service/vi/manager_root_service.cpp
@@ -15,21 +15,18 @@
namespace Service::VI {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> IManagerRootService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{2, C<&IManagerRootService::GetDisplayService>, "GetDisplayService"},
- FunctionInfo{3, nullptr, "GetDisplayServiceWithProxyNameExchange"},
- FunctionInfo{100, nullptr, "PrepareFatal"},
- FunctionInfo{101, nullptr, "ShowFatal"},
- FunctionInfo{102, nullptr, "DrawFatalRectangle"},
- FunctionInfo{103, nullptr, "DrawFatalText32"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
IManagerRootService::IManagerRootService(Core::System& system_,
std::shared_ptr<Container> container)
: ServiceFramework{system_, "vi:m"}, m_container{std::move(container)} {
+ static const FunctionInfo functions[] = {
+ {2, C<&IManagerRootService::GetDisplayService>, "GetDisplayService"},
+ {3, nullptr, "GetDisplayServiceWithProxyNameExchange"},
+ {100, nullptr, "PrepareFatal"},
+ {101, nullptr, "ShowFatal"},
+ {102, nullptr, "DrawFatalRectangle"},
+ {103, nullptr, "DrawFatalText32"},
+ };
+ RegisterHandlers(functions);
}
IManagerRootService::~IManagerRootService() = default;
diff --git a/src/core/hle/service/vi/manager_root_service.h b/src/core/hle/service/vi/manager_root_service.h
index 78c0d1f80d..114dc36c07 100644
--- a/src/core/hle/service/vi/manager_root_service.h
+++ b/src/core/hle/service/vi/manager_root_service.h
@@ -29,7 +29,6 @@ public:
Policy policy);
private:
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
const std::shared_ptr<Container> m_container;
};
diff --git a/src/core/hle/service/vi/service_creator.cpp b/src/core/hle/service/vi/service_creator.cpp
index 2b8e5f9577..34dbf7baae 100644
--- a/src/core/hle/service/vi/service_creator.cpp
+++ b/src/core/hle/service/vi/service_creator.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/vi/service_creator.h b/src/core/hle/service/vi/service_creator.h
index c6ba1797dc..8b50e94af5 100644
--- a/src/core/hle/service/vi/service_creator.h
+++ b/src/core/hle/service/vi/service_creator.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/vi/shared_buffer_manager.h b/src/core/hle/service/vi/shared_buffer_manager.h
index d1ce57ee27..807db10f31 100644
--- a/src/core/hle/service/vi/shared_buffer_manager.h
+++ b/src/core/hle/service/vi/shared_buffer_manager.h
@@ -18,10 +18,6 @@ class KPageGroup;
class KReadableEvent;
} // namespace Kernel
-namespace Core {
-class System;
-}
-
namespace Service::android {
class BufferQueueProducer;
}
diff --git a/src/core/hle/service/vi/system_display_service.cpp b/src/core/hle/service/vi/system_display_service.cpp
index 997f0a51fc..aa225f69df 100644
--- a/src/core/hle/service/vi/system_display_service.cpp
+++ b/src/core/hle/service/vi/system_display_service.cpp
@@ -12,63 +12,63 @@
namespace Service::VI {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> ISystemDisplayService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{1200, nullptr, "GetZOrderCountMin"},
- FunctionInfo{1202, nullptr, "GetZOrderCountMax"},
- FunctionInfo{1203, nullptr, "GetDisplayLogicalResolution"},
- FunctionInfo{1204, nullptr, "SetDisplayMagnification"},
- FunctionInfo{2201, nullptr, "SetLayerPosition"},
- FunctionInfo{2203, nullptr, "SetLayerSize"},
- FunctionInfo{2204, C<&ISystemDisplayService::GetLayerZ>, "GetLayerZ"},
- FunctionInfo{2205, C<&ISystemDisplayService::SetLayerZ>, "SetLayerZ"},
- FunctionInfo{2207, C<&ISystemDisplayService::SetLayerVisibility>, "SetLayerVisibility"},
- FunctionInfo{2209, nullptr, "SetLayerAlpha"},
- FunctionInfo{2210, nullptr, "SetLayerPositionAndSize"},
- FunctionInfo{2312, nullptr, "CreateStrayLayer"},
- FunctionInfo{2400, nullptr, "OpenIndirectLayer"},
- FunctionInfo{2401, nullptr, "CloseIndirectLayer"},
- FunctionInfo{2402, nullptr, "FlipIndirectLayer"},
- FunctionInfo{3000, C<&ISystemDisplayService::ListDisplayModes>, "ListDisplayModes"},
- FunctionInfo{3001, nullptr, "ListDisplayRgbRanges"},
- FunctionInfo{3002, nullptr, "ListDisplayContentTypes"},
- FunctionInfo{3200, C<&ISystemDisplayService::GetDisplayMode>, "GetDisplayMode"},
- FunctionInfo{3201, nullptr, "SetDisplayMode"},
- FunctionInfo{3202, nullptr, "GetDisplayUnderscan"},
- FunctionInfo{3203, nullptr, "SetDisplayUnderscan"},
- FunctionInfo{3204, nullptr, "GetDisplayContentType"},
- FunctionInfo{3205, nullptr, "SetDisplayContentType"},
- FunctionInfo{3206, nullptr, "GetDisplayRgbRange"},
- FunctionInfo{3207, nullptr, "SetDisplayRgbRange"},
- FunctionInfo{3208, nullptr, "GetDisplayCmuMode"},
- FunctionInfo{3209, nullptr, "SetDisplayCmuMode"},
- FunctionInfo{3210, nullptr, "GetDisplayContrastRatio"},
- FunctionInfo{3211, nullptr, "SetDisplayContrastRatio"},
- FunctionInfo{3214, nullptr, "GetDisplayGamma"},
- FunctionInfo{3215, nullptr, "SetDisplayGamma"},
- FunctionInfo{3216, nullptr, "GetDisplayCmuLuma"},
- FunctionInfo{3217, nullptr, "SetDisplayCmuLuma"},
- FunctionInfo{3218, nullptr, "SetDisplayCrcMode"},
- FunctionInfo{6013, nullptr, "GetLayerPresentationSubmissionTimestamps"},
- FunctionInfo{8225, C<&ISystemDisplayService::GetSharedBufferMemoryHandleId>, "GetSharedBufferMemoryHandleId"},
- FunctionInfo{8250, C<&ISystemDisplayService::OpenSharedLayer>, "OpenSharedLayer"},
- FunctionInfo{8251, nullptr, "CloseSharedLayer"},
- FunctionInfo{8252, C<&ISystemDisplayService::ConnectSharedLayer>, "ConnectSharedLayer"},
- FunctionInfo{8253, nullptr, "DisconnectSharedLayer"},
- FunctionInfo{8254, C<&ISystemDisplayService::AcquireSharedFrameBuffer>, "AcquireSharedFrameBuffer"},
- FunctionInfo{8255, C<&ISystemDisplayService::PresentSharedFrameBuffer>, "PresentSharedFrameBuffer"},
- FunctionInfo{8256, C<&ISystemDisplayService::GetSharedFrameBufferAcquirableEvent>, "GetSharedFrameBufferAcquirableEvent"},
- FunctionInfo{8257, nullptr, "FillSharedFrameBufferColor"},
- FunctionInfo{8258, C<&ISystemDisplayService::CancelSharedFrameBuffer>, "CancelSharedFrameBuffer"},
- FunctionInfo{9000, nullptr, "GetDp2hdmiController"}
- );
- return HandlerTableGenerateWithFind(key, functions);
+ISystemDisplayService::ISystemDisplayService(Core::System& system_,
+ std::shared_ptr<Container> container)
+ : ServiceFramework{system_, "ISystemDisplayService"}, m_container{std::move(container)} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {1200, nullptr, "GetZOrderCountMin"},
+ {1202, nullptr, "GetZOrderCountMax"},
+ {1203, nullptr, "GetDisplayLogicalResolution"},
+ {1204, nullptr, "SetDisplayMagnification"},
+ {2201, nullptr, "SetLayerPosition"},
+ {2203, nullptr, "SetLayerSize"},
+ {2204, C<&ISystemDisplayService::GetLayerZ>, "GetLayerZ"},
+ {2205, C<&ISystemDisplayService::SetLayerZ>, "SetLayerZ"},
+ {2207, C<&ISystemDisplayService::SetLayerVisibility>, "SetLayerVisibility"},
+ {2209, nullptr, "SetLayerAlpha"},
+ {2210, nullptr, "SetLayerPositionAndSize"},
+ {2312, nullptr, "CreateStrayLayer"},
+ {2400, nullptr, "OpenIndirectLayer"},
+ {2401, nullptr, "CloseIndirectLayer"},
+ {2402, nullptr, "FlipIndirectLayer"},
+ {3000, C<&ISystemDisplayService::ListDisplayModes>, "ListDisplayModes"},
+ {3001, nullptr, "ListDisplayRgbRanges"},
+ {3002, nullptr, "ListDisplayContentTypes"},
+ {3200, C<&ISystemDisplayService::GetDisplayMode>, "GetDisplayMode"},
+ {3201, nullptr, "SetDisplayMode"},
+ {3202, nullptr, "GetDisplayUnderscan"},
+ {3203, nullptr, "SetDisplayUnderscan"},
+ {3204, nullptr, "GetDisplayContentType"},
+ {3205, nullptr, "SetDisplayContentType"},
+ {3206, nullptr, "GetDisplayRgbRange"},
+ {3207, nullptr, "SetDisplayRgbRange"},
+ {3208, nullptr, "GetDisplayCmuMode"},
+ {3209, nullptr, "SetDisplayCmuMode"},
+ {3210, nullptr, "GetDisplayContrastRatio"},
+ {3211, nullptr, "SetDisplayContrastRatio"},
+ {3214, nullptr, "GetDisplayGamma"},
+ {3215, nullptr, "SetDisplayGamma"},
+ {3216, nullptr, "GetDisplayCmuLuma"},
+ {3217, nullptr, "SetDisplayCmuLuma"},
+ {3218, nullptr, "SetDisplayCrcMode"},
+ {6013, nullptr, "GetLayerPresentationSubmissionTimestamps"},
+ {8225, C<&ISystemDisplayService::GetSharedBufferMemoryHandleId>, "GetSharedBufferMemoryHandleId"},
+ {8250, C<&ISystemDisplayService::OpenSharedLayer>, "OpenSharedLayer"},
+ {8251, nullptr, "CloseSharedLayer"},
+ {8252, C<&ISystemDisplayService::ConnectSharedLayer>, "ConnectSharedLayer"},
+ {8253, nullptr, "DisconnectSharedLayer"},
+ {8254, C<&ISystemDisplayService::AcquireSharedFrameBuffer>, "AcquireSharedFrameBuffer"},
+ {8255, C<&ISystemDisplayService::PresentSharedFrameBuffer>, "PresentSharedFrameBuffer"},
+ {8256, C<&ISystemDisplayService::GetSharedFrameBufferAcquirableEvent>, "GetSharedFrameBufferAcquirableEvent"},
+ {8257, nullptr, "FillSharedFrameBufferColor"},
+ {8258, C<&ISystemDisplayService::CancelSharedFrameBuffer>, "CancelSharedFrameBuffer"},
+ {9000, nullptr, "GetDp2hdmiController"},
+ };
+ // clang-format on
+ RegisterHandlers(functions);
}
-ISystemDisplayService::ISystemDisplayService(Core::System& system_, std::shared_ptr<Container> container)
- : ServiceFramework{system_, "ISystemDisplayService"}, m_container{std::move(container)}
-{}
-
ISystemDisplayService::~ISystemDisplayService() = default;
Result ISystemDisplayService::GetLayerZ(Out<u64> out_z_value, u64 layer_id) {
diff --git a/src/core/hle/service/vi/system_display_service.h b/src/core/hle/service/vi/system_display_service.h
index 04c9f0977e..a3b88c519d 100644
--- a/src/core/hle/service/vi/system_display_service.h
+++ b/src/core/hle/service/vi/system_display_service.h
@@ -47,7 +47,6 @@ private:
Result CancelSharedFrameBuffer(u64 layer_id, s64 slot);
private:
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
const std::shared_ptr<Container> m_container;
};
diff --git a/src/core/hle/service/vi/system_root_service.cpp b/src/core/hle/service/vi/system_root_service.cpp
index c078be37a3..c761f136e2 100644
--- a/src/core/hle/service/vi/system_root_service.cpp
+++ b/src/core/hle/service/vi/system_root_service.cpp
@@ -14,17 +14,14 @@
namespace Service::VI {
-std::optional<ServiceFrameworkBase::FunctionInfoBase> ISystemRootService::FindRequest(u32 key) {
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{1, C<&ISystemRootService::GetDisplayService>, "GetDisplayService"},
- FunctionInfo{3, nullptr, "GetDisplayServiceWithProxyNameExchange"}
- );
- return HandlerTableGenerateWithFind(key, functions);
-}
-
ISystemRootService::ISystemRootService(Core::System& system_, std::shared_ptr<Container> container)
- : ServiceFramework{system_, "vi:s"}, m_container{std::move(container)}
-{}
+ : ServiceFramework{system_, "vi:s"}, m_container{std::move(container)} {
+ static const FunctionInfo functions[] = {
+ {1, C<&ISystemRootService::GetDisplayService>, "GetDisplayService"},
+ {3, nullptr, "GetDisplayServiceWithProxyNameExchange"},
+ };
+ RegisterHandlers(functions);
+}
ISystemRootService::~ISystemRootService() = default;
diff --git a/src/core/hle/service/vi/system_root_service.h b/src/core/hle/service/vi/system_root_service.h
index baf516fec5..1587e0e30f 100644
--- a/src/core/hle/service/vi/system_root_service.h
+++ b/src/core/hle/service/vi/system_root_service.h
@@ -29,7 +29,6 @@ private:
Out<SharedPointer<IApplicationDisplayService>> out_application_display_service,
Policy policy);
- std::optional<FunctionInfoBase> FindRequest(u32 key) override;
const std::shared_ptr<Container> m_container;
};
diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp
index b388efaf6f..2ea64f5d32 100644
--- a/src/core/hle/service/vi/vi.cpp
+++ b/src/core/hle/service/vi/vi.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/vi/vi.h b/src/core/hle/service/vi/vi.h
index 7c1f350d84..bcc55228aa 100644
--- a/src/core/hle/service/vi/vi.h
+++ b/src/core/hle/service/vi/vi.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/vi/vi_results.h b/src/core/hle/service/vi/vi_results.h
index 22bac799f0..89b7317792 100644
--- a/src/core/hle/service/vi/vi_results.h
+++ b/src/core/hle/service/vi/vi_results.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/vi/vi_types.h b/src/core/hle/service/vi/vi_types.h
index 95ff663582..2d4287169a 100644
--- a/src/core/hle/service/vi/vi_types.h
+++ b/src/core/hle/service/vi/vi_types.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
diff --git a/src/core/hle/service/wlan/wlan.cpp b/src/core/hle/service/wlan/wlan.cpp
index fa68ff51ba..bcd357d57a 100644
--- a/src/core/hle/service/wlan/wlan.cpp
+++ b/src/core/hle/service/wlan/wlan.cpp
@@ -16,248 +16,232 @@ class ILocalManager final : public ServiceFramework<ILocalManager> {
public:
explicit ILocalManager(Core::System& system_)
: ServiceFramework{system_, "wlan:lcl"}
- {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ {
+ static const FunctionInfo functions[] = {
+ { 0, nullptr, "OpenMasterMode" },
+ { 0, nullptr, "OpenMode_2" },
+ { 1, nullptr, "CloseMasterMode" },
+ { 1, nullptr, "CloseMode_2" },
+ { 2, nullptr, "OpenClientMode" },
+ { 2, nullptr, "GetMacAddress_2" },
+ { 3, nullptr, "CloseClientMode" },
+ { 3, nullptr, "CreateBss" },
+ { 4, nullptr, "OpenSpectatorMode" },
+ { 4, nullptr, "DestroyBss" },
+ { 5, nullptr, "CloseSpectatorMode" },
+ { 5, nullptr, "StartScan_2" },
+ { 6, nullptr, "GetMacAddress_2" },
+ { 6, nullptr, "StopScan_2" },
+ { 7, nullptr, "CreateBss" },
+ { 7, nullptr, "Connect_2" },
+ { 8, nullptr, "DestroyBss" },
+ { 8, nullptr, "CancelConnect_2" },
+ { 9, nullptr, "StartScan_2" },
+ { 9, nullptr, "Join" },
+ { 10, nullptr, "StopScan_2" },
+ { 10, nullptr, "CancelJoin" },
+ { 11, nullptr, "Connect_2" },
+ { 11, nullptr, "Disconnect_2" },
+ { 12, nullptr, "CancelConnect_2" },
+ { 12, nullptr, "SetBeaconLostCount" },
+ { 13, nullptr, "Join" },
+ { 13, nullptr, "GetSystemEvent_2" },
+ { 14, nullptr, "CancelJoin" },
+ { 14, nullptr, "GetConnectionStatus_2" },
+ { 15, nullptr, "Disconnect_2" },
+ { 15, nullptr, "GetClientStatus" },
+ { 16, nullptr, "SetBeaconLostCount" },
+ { 16, nullptr, "GetBssIndicationEvent" },
+ { 17, nullptr, "GetSystemEvent_2" },
+ { 17, nullptr, "GetBssIndicationInfo" },
+ { 18, nullptr, "GetConnectionStatus_2" },
+ { 18, nullptr, "GetState_2" },
+ { 19, nullptr, "GetClientStatus" },
+ { 19, nullptr, "GetAllowedChannels" },
+ { 20, nullptr, "GetBssIndicationEvent" },
+ { 20, nullptr, "AddIe" },
+ { 21, nullptr, "GetBssIndicationInfo" },
+ { 21, nullptr, "DeleteIe" },
+ { 22, nullptr, "GetState_2" },
+ { 22, nullptr, "PutFrameRaw" },
+ { 23, nullptr, "GetAllowedChannels" },
+ { 23, nullptr, "CancelGetFrame" },
+ { 24, nullptr, "AddIe" },
+ { 24, nullptr, "CreateRxEntry" },
+ { 25, nullptr, "DeleteIe" },
+ { 25, nullptr, "DeleteRxEntry" },
+ { 26, nullptr, "PutFrameRaw" },
+ { 26, nullptr, "AddEthertypeToRxEntry" },
+ { 27, nullptr, "CancelGetFrame" },
+ { 27, nullptr, "DeleteEthertypeFromRxEntry" },
+ { 28, nullptr, "CreateRxEntry" },
+ { 28, nullptr, "AddMatchingDataToRxEntry" },
+ { 29, nullptr, "DeleteRxEntry" },
+ { 29, nullptr, "RemoveMatchingDataFromRxEntry" },
+ { 30, nullptr, "AddEthertypeToRxEntry" },
+ { 30, nullptr, "GetScanResult_2" },
+ { 31, nullptr, "DeleteEthertypeFromRxEntry" },
+ { 31, nullptr, "PutActionFrameOneShot" },
+ { 32, nullptr, "AddMatchingDataToRxEntry" },
+ { 32, nullptr, "SetActionFrameWithBeacon" },
+ { 33, nullptr, "RemoveMatchingDataFromRxEntry" },
+ { 33, nullptr, "CancelActionFrameWithBeacon" },
+ { 34, nullptr, "GetScanResult_2" },
+ { 34, nullptr, "CreateRxEntryForActionFrame" },
+ { 35, nullptr, "PutActionFrameOneShot" },
+ { 35, nullptr, "DeleteRxEntryForActionFrame" },
+ { 36, nullptr, "SetActionFrameWithBeacon" },
+ { 36, nullptr, "AddSubtypeToRxEntryForActionFrame" },
+ { 37, nullptr, "CancelActionFrameWithBeacon" },
+ { 37, nullptr, "DeleteSubtypeFromRxEntryForActionFrame" },
+ { 38, nullptr, "CreateRxEntryForActionFrame" },
+ { 38, nullptr, "CancelGetActionFrame" },
+ { 39, nullptr, "DeleteRxEntryForActionFrame" },
+ { 39, nullptr, "GetRssi_2" },
+ { 40, nullptr, "AddSubtypeToRxEntryForActionFrame" },
+ { 40, nullptr, "SetMaxAssociationNumber" },
+ { 41, nullptr, "DeleteSubtypeFromRxEntryForActionFrame" },
+ { 41, nullptr, "Cmd41" },
+ { 42, nullptr, "CancelGetActionFrame" },
+ { 42, nullptr, "Cmd42" },
+ { 43, nullptr, "GetRssi_2" },
+ { 43, nullptr, "Cmd43" },
+ { 44, nullptr, "SetMaxAssociationNumber" },
+ { 45, nullptr, "OpenLcsMasterMode" },
+ { 46, nullptr, "CloseLcsMasterMode" },
+ { 47, nullptr, "OpenLcsClientMode" },
+ { 48, nullptr, "CloseLcsClientMode" },
+ { 49, nullptr, "GetChannelStats" },
+ { 50, nullptr, "Cmd50" },
+ { 51, nullptr, "Cmd51" },
+ { 52, nullptr, "Cmd52" },
+ };
+ RegisterHandlers(functions);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "OpenMasterMode"},
- FunctionInfo{0, nullptr, "OpenMode_2"},
- FunctionInfo{1, nullptr, "CloseMasterMode"},
- FunctionInfo{1, nullptr, "CloseMode_2"},
- FunctionInfo{2, nullptr, "OpenClientMode"},
- FunctionInfo{2, nullptr, "GetMacAddress_2"},
- FunctionInfo{3, nullptr, "CloseClientMode"},
- FunctionInfo{3, nullptr, "CreateBss"},
- FunctionInfo{4, nullptr, "OpenSpectatorMode"},
- FunctionInfo{4, nullptr, "DestroyBss"},
- FunctionInfo{5, nullptr, "CloseSpectatorMode"},
- FunctionInfo{5, nullptr, "StartScan_2"},
- FunctionInfo{6, nullptr, "GetMacAddress_2"},
- FunctionInfo{6, nullptr, "StopScan_2"},
- FunctionInfo{7, nullptr, "CreateBss"},
- FunctionInfo{7, nullptr, "Connect_2"},
- FunctionInfo{8, nullptr, "DestroyBss"},
- FunctionInfo{8, nullptr, "CancelConnect_2"},
- FunctionInfo{9, nullptr, "StartScan_2"},
- FunctionInfo{9, nullptr, "Join"},
- FunctionInfo{10, nullptr, "StopScan_2"},
- FunctionInfo{10, nullptr, "CancelJoin"},
- FunctionInfo{11, nullptr, "Connect_2"},
- FunctionInfo{11, nullptr, "Disconnect_2"},
- FunctionInfo{12, nullptr, "CancelConnect_2"},
- FunctionInfo{12, nullptr, "SetBeaconLostCount"},
- FunctionInfo{13, nullptr, "Join"},
- FunctionInfo{13, nullptr, "GetSystemEvent_2"},
- FunctionInfo{14, nullptr, "CancelJoin"},
- FunctionInfo{14, nullptr, "GetConnectionStatus_2"},
- FunctionInfo{15, nullptr, "Disconnect_2"},
- FunctionInfo{15, nullptr, "GetClientStatus"},
- FunctionInfo{16, nullptr, "SetBeaconLostCount"},
- FunctionInfo{16, nullptr, "GetBssIndicationEvent"},
- FunctionInfo{17, nullptr, "GetSystemEvent_2"},
- FunctionInfo{17, nullptr, "GetBssIndicationInfo"},
- FunctionInfo{18, nullptr, "GetConnectionStatus_2"},
- FunctionInfo{18, nullptr, "GetState_2"},
- FunctionInfo{19, nullptr, "GetClientStatus"},
- FunctionInfo{19, nullptr, "GetAllowedChannels"},
- FunctionInfo{20, nullptr, "GetBssIndicationEvent"},
- FunctionInfo{20, nullptr, "AddIe"},
- FunctionInfo{21, nullptr, "GetBssIndicationInfo"},
- FunctionInfo{21, nullptr, "DeleteIe"},
- FunctionInfo{22, nullptr, "GetState_2"},
- FunctionInfo{22, nullptr, "PutFrameRaw"},
- FunctionInfo{23, nullptr, "GetAllowedChannels"},
- FunctionInfo{23, nullptr, "CancelGetFrame"},
- FunctionInfo{24, nullptr, "AddIe"},
- FunctionInfo{24, nullptr, "CreateRxEntry"},
- FunctionInfo{25, nullptr, "DeleteIe"},
- FunctionInfo{25, nullptr, "DeleteRxEntry"},
- FunctionInfo{26, nullptr, "PutFrameRaw"},
- FunctionInfo{26, nullptr, "AddEthertypeToRxEntry"},
- FunctionInfo{27, nullptr, "CancelGetFrame"},
- FunctionInfo{27, nullptr, "DeleteEthertypeFromRxEntry"},
- FunctionInfo{28, nullptr, "CreateRxEntry"},
- FunctionInfo{28, nullptr, "AddMatchingDataToRxEntry"},
- FunctionInfo{29, nullptr, "DeleteRxEntry"},
- FunctionInfo{29, nullptr, "RemoveMatchingDataFromRxEntry"},
- FunctionInfo{30, nullptr, "AddEthertypeToRxEntry"},
- FunctionInfo{30, nullptr, "GetScanResult_2"},
- FunctionInfo{31, nullptr, "DeleteEthertypeFromRxEntry"},
- FunctionInfo{31, nullptr, "PutActionFrameOneShot"},
- FunctionInfo{32, nullptr, "AddMatchingDataToRxEntry"},
- FunctionInfo{32, nullptr, "SetActionFrameWithBeacon"},
- FunctionInfo{33, nullptr, "RemoveMatchingDataFromRxEntry"},
- FunctionInfo{33, nullptr, "CancelActionFrameWithBeacon"},
- FunctionInfo{34, nullptr, "GetScanResult_2"},
- FunctionInfo{34, nullptr, "CreateRxEntryForActionFrame"},
- FunctionInfo{35, nullptr, "PutActionFrameOneShot"},
- FunctionInfo{35, nullptr, "DeleteRxEntryForActionFrame"},
- FunctionInfo{36, nullptr, "SetActionFrameWithBeacon"},
- FunctionInfo{36, nullptr, "AddSubtypeToRxEntryForActionFrame"},
- FunctionInfo{37, nullptr, "CancelActionFrameWithBeacon"},
- FunctionInfo{37, nullptr, "DeleteSubtypeFromRxEntryForActionFrame"},
- FunctionInfo{38, nullptr, "CreateRxEntryForActionFrame"},
- FunctionInfo{38, nullptr, "CancelGetActionFrame"},
- FunctionInfo{39, nullptr, "DeleteRxEntryForActionFrame"},
- FunctionInfo{39, nullptr, "GetRssi_2"},
- FunctionInfo{40, nullptr, "AddSubtypeToRxEntryForActionFrame"},
- FunctionInfo{40, nullptr, "SetMaxAssociationNumber"},
- FunctionInfo{41, nullptr, "DeleteSubtypeFromRxEntryForActionFrame"},
- FunctionInfo{41, nullptr, "Cmd41"},
- FunctionInfo{42, nullptr, "CancelGetActionFrame"},
- FunctionInfo{42, nullptr, "Cmd42"},
- FunctionInfo{43, nullptr, "GetRssi_2"},
- FunctionInfo{43, nullptr, "Cmd43"},
- FunctionInfo{44, nullptr, "SetMaxAssociationNumber"},
- FunctionInfo{45, nullptr, "OpenLcsMasterMode"},
- FunctionInfo{46, nullptr, "CloseLcsMasterMode"},
- FunctionInfo{47, nullptr, "OpenLcsClientMode"},
- FunctionInfo{48, nullptr, "CloseLcsClientMode"},
- FunctionInfo{49, nullptr, "GetChannelStats"},
- FunctionInfo{50, nullptr, "Cmd50"},
- FunctionInfo{51, nullptr, "Cmd51"},
- FunctionInfo{52, nullptr, "Cmd52"}
- );
};
class ILocalGetFrame final : public ServiceFramework<ILocalGetFrame> {
public:
explicit ILocalGetFrame(Core::System& system_)
: ServiceFramework{system_, "wlan:lg"}
- {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ {
+ static const FunctionInfo functions[] = {
+ { 0, nullptr, "GetFrameRaw" },
+ };
+ RegisterHandlers(functions);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetFrameRaw" }
- );
};
class ILocalGetActionFrame final : public ServiceFramework<ILocalGetActionFrame> {
public:
explicit ILocalGetActionFrame(Core::System& system_)
: ServiceFramework{system_, "wlan:lga"}
- {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ {
+ static const FunctionInfo functions[] = {
+ { 0, nullptr, "GetActionFrame" },
+ };
+ RegisterHandlers(functions);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetActionFrame" }
- );
};
class ISocketGetFrame final : public ServiceFramework<ISocketGetFrame> {
public:
explicit ISocketGetFrame(Core::System& system_)
: ServiceFramework{system_, "wlan:sg"}
- {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ {
+ static const FunctionInfo functions[] = {
+ { 0, nullptr, "GetFrameRaw" },
+ };
+ RegisterHandlers(functions);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "GetFrameRaw" }
- );
};
class ISocketManager final : public ServiceFramework<ISocketManager> {
public:
explicit ISocketManager(Core::System& system_)
: ServiceFramework{system_, "wlan:soc"}
- {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ {
+ static const FunctionInfo functions[] = {
+ { 0, nullptr, "PutFrameRaw_2" },
+ { 1, nullptr, "CancelGetFrame_2" },
+ { 2, nullptr, "CreateRxEntry_2" },
+ { 3, nullptr, "DeleteRxEntry_2" },
+ { 4, nullptr, "AddEthertypeToRxEntry_2" },
+ { 5, nullptr, "DeleteEthertypeFromRxEntry_2" },
+ { 6, nullptr, "GetMacAddress_3" },
+ { 7, nullptr, "SwitchTsfTimerFunction" },
+ { 8, nullptr, "GetDeltaTimeBetweenSystemAndTsf" },
+ { 9, nullptr, "RegisterSharedMemory" },
+ { 10, nullptr, "UnregisterSharedMemory" },
+ { 11, nullptr, "EnableSharedMemory" },
+ { 12, nullptr, "SetMulticastFilter" },
+ };
+ RegisterHandlers(functions);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "PutFrameRaw_2"},
- FunctionInfo{1, nullptr, "CancelGetFrame_2"},
- FunctionInfo{2, nullptr, "CreateRxEntry_2"},
- FunctionInfo{3, nullptr, "DeleteRxEntry_2"},
- FunctionInfo{4, nullptr, "AddEthertypeToRxEntry_2"},
- FunctionInfo{5, nullptr, "DeleteEthertypeFromRxEntry_2"},
- FunctionInfo{6, nullptr, "GetMacAddress_3"},
- FunctionInfo{7, nullptr, "SwitchTsfTimerFunction"},
- FunctionInfo{8, nullptr, "GetDeltaTimeBetweenSystemAndTsf"},
- FunctionInfo{9, nullptr, "RegisterSharedMemory"},
- FunctionInfo{10, nullptr, "UnregisterSharedMemory"},
- FunctionInfo{11, nullptr, "EnableSharedMemory"},
- FunctionInfo{12, nullptr, "SetMulticastFilter"}
- );
};
class IDetectManager final : public ServiceFramework<IDetectManager> {
public:
explicit IDetectManager(Core::System& system_)
: ServiceFramework{system_, "wlan:dtc"}
- {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ {
+ static const FunctionInfo functions[] = {
+ { 0, nullptr, "Cmd0" },
+ { 1, nullptr, "Cmd1" },
+ { 2, nullptr, "Cmd2" },
+ { 3, nullptr, "Cmd3" },
+ { 4, nullptr, "Cmd4" },
+ { 5, nullptr, "Cmd5" },
+ { 6, nullptr, "Cmd6" },
+ { 7, nullptr, "Cmd7" },
+ { 8, nullptr, "Cmd8" },
+ { 9, nullptr, "Cmd9" },
+ { 10, nullptr, "Cmd10" },
+ { 11, nullptr, "Cmd11" },
+ { 12, nullptr, "Cmd12" },
+ { 13, nullptr, "Cmd13" },
+ { 14, nullptr, "Cmd14" },
+ { 15, nullptr, "Cmd15" },
+ { 16, nullptr, "Cmd16" },
+ { 17, nullptr, "Cmd17" },
+ { 18, nullptr, "Cmd18" },
+ { 19, nullptr, "Cmd19" },
+ { 20, nullptr, "Cmd20" },
+ { 21, nullptr, "Cmd21" },
+ { 22, nullptr, "Cmd22" },
+ { 23, nullptr, "Cmd23" },
+ { 24, nullptr, "Cmd24" },
+ { 25, nullptr, "Cmd25" },
+ { 26, nullptr, "Cmd26" },
+ { 27, nullptr, "Cmd27" },
+ };
+ RegisterHandlers(functions);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "Cmd0"},
- FunctionInfo{1, nullptr, "Cmd1"},
- FunctionInfo{2, nullptr, "Cmd2"},
- FunctionInfo{3, nullptr, "Cmd3"},
- FunctionInfo{4, nullptr, "Cmd4"},
- FunctionInfo{5, nullptr, "Cmd5"},
- FunctionInfo{6, nullptr, "Cmd6"},
- FunctionInfo{7, nullptr, "Cmd7"},
- FunctionInfo{8, nullptr, "Cmd8"},
- FunctionInfo{9, nullptr, "Cmd9"},
- FunctionInfo{10, nullptr, "Cmd10"},
- FunctionInfo{11, nullptr, "Cmd11"},
- FunctionInfo{12, nullptr, "Cmd12"},
- FunctionInfo{13, nullptr, "Cmd13"},
- FunctionInfo{14, nullptr, "Cmd14"},
- FunctionInfo{15, nullptr, "Cmd15"},
- FunctionInfo{16, nullptr, "Cmd16"},
- FunctionInfo{17, nullptr, "Cmd17"},
- FunctionInfo{18, nullptr, "Cmd18"},
- FunctionInfo{19, nullptr, "Cmd19"},
- FunctionInfo{20, nullptr, "Cmd20"},
- FunctionInfo{21, nullptr, "Cmd21"},
- FunctionInfo{22, nullptr, "Cmd22"},
- FunctionInfo{23, nullptr, "Cmd23"},
- FunctionInfo{24, nullptr, "Cmd24"},
- FunctionInfo{25, nullptr, "Cmd25"},
- FunctionInfo{26, nullptr, "Cmd26"},
- FunctionInfo{27, nullptr, "Cmd27"}
- );
};
class IPrivateServiceCreator final : public ServiceFramework<IPrivateServiceCreator> {
public:
explicit IPrivateServiceCreator(Core::System& system_)
: ServiceFramework{system_, "wlan:p"}
- {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ {
+ static const FunctionInfo functions[] = {
+ { 0, nullptr, "CreateWirelessCommunicationService" },
+ { 1, nullptr, "CreatePrivateWirelessCommunicationService" },
+ };
+ RegisterHandlers(functions);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "CreateWirelessCommunicationService"},
- FunctionInfo{1, nullptr, "CreatePrivateWirelessCommunicationService"}
- );
};
class ISfDriverServiceCreator final : public ServiceFramework<ISfDriverServiceCreator> {
public:
explicit ISfDriverServiceCreator(Core::System& system_)
: ServiceFramework{system_, "wlan:nd"}
- {}
-
- std::optional<FunctionInfoBase> FindRequest(u32 key) override {
- return HandlerTableGenerateWithFind(key, functions);
+ {
+ static const FunctionInfo functions[] = {
+ { 0, nullptr, "CreateDriverService" },
+ };
+ RegisterHandlers(functions);
}
- static constexpr auto functions = CreateStaticMap(
- FunctionInfo{0, nullptr, "CreateDriverService" }
- );
};
void LoopProcess(Core::System& system) {