diff options
| author | 2020-11-04 11:21:17 -0500 | |
|---|---|---|
| committer | 2020-11-08 09:35:25 -0500 | |
| commit | af1183a9938d885a643efaf28397235a4d1bd2ef (patch) | |
| tree | 6b0b18255c82d58695bfd1b164525098b05af6ac | |
| parent | applets/controller: Add ControllerUpdateFirmwareArg struct (diff) | |
| download | yuzu-af1183a9938d885a643efaf28397235a4d1bd2ef.tar.gz yuzu-af1183a9938d885a643efaf28397235a4d1bd2ef.tar.xz yuzu-af1183a9938d885a643efaf28397235a4d1bd2ef.zip | |
applets/controller: Introduce additional checks for mode and caller
Some games like Cave Story+ set invalid values in the ControllerPrivateArg's mode and caller fields.
Use other fields to determine the appropriate mode and caller should either or both fields be invalid.
| -rw-r--r-- | src/core/hle/service/am/applets/controller.cpp | 30 | ||||
| -rw-r--r-- | src/core/hle/service/am/applets/controller.h | 14 |
2 files changed, 39 insertions, 5 deletions
diff --git a/src/core/hle/service/am/applets/controller.cpp b/src/core/hle/service/am/applets/controller.cpp index 2151da783..6b8eeabf4 100644 --- a/src/core/hle/service/am/applets/controller.cpp +++ b/src/core/hle/service/am/applets/controller.cpp | |||
| @@ -75,6 +75,36 @@ void Controller::Initialize() { | |||
| 75 | "Unknown ControllerSupportArgPrivate revision={} with size={}", | 75 | "Unknown ControllerSupportArgPrivate revision={} with size={}", |
| 76 | library_applet_version, controller_private_arg.arg_private_size); | 76 | library_applet_version, controller_private_arg.arg_private_size); |
| 77 | 77 | ||
| 78 | // Some games such as Cave Story+ set invalid values for the ControllerSupportMode. | ||
| 79 | // Defer to arg_size to set the ControllerSupportMode. | ||
| 80 | if (controller_private_arg.mode >= ControllerSupportMode::MaxControllerSupportMode) { | ||
| 81 | switch (controller_private_arg.arg_size) { | ||
| 82 | case sizeof(ControllerSupportArgOld): | ||
| 83 | case sizeof(ControllerSupportArgNew): | ||
| 84 | controller_private_arg.mode = ControllerSupportMode::ShowControllerSupport; | ||
| 85 | break; | ||
| 86 | case sizeof(ControllerUpdateFirmwareArg): | ||
| 87 | controller_private_arg.mode = ControllerSupportMode::ShowControllerFirmwareUpdate; | ||
| 88 | break; | ||
| 89 | default: | ||
| 90 | UNIMPLEMENTED_MSG("Unknown ControllerPrivateArg mode={} with arg_size={}", | ||
| 91 | controller_private_arg.mode, controller_private_arg.arg_size); | ||
| 92 | controller_private_arg.mode = ControllerSupportMode::ShowControllerSupport; | ||
| 93 | break; | ||
| 94 | } | ||
| 95 | } | ||
| 96 | |||
| 97 | // Some games such as Cave Story+ set invalid values for the ControllerSupportCaller. | ||
| 98 | // This is always 0 (Application) except with ShowControllerFirmwareUpdateForSystem. | ||
| 99 | if (controller_private_arg.caller >= ControllerSupportCaller::MaxControllerSupportCaller) { | ||
| 100 | if (controller_private_arg.flag_1 && | ||
| 101 | controller_private_arg.mode == ControllerSupportMode::ShowControllerFirmwareUpdate) { | ||
| 102 | controller_private_arg.caller = ControllerSupportCaller::System; | ||
| 103 | } else { | ||
| 104 | controller_private_arg.caller = ControllerSupportCaller::Application; | ||
| 105 | } | ||
| 106 | } | ||
| 107 | |||
| 78 | switch (controller_private_arg.mode) { | 108 | switch (controller_private_arg.mode) { |
| 79 | case ControllerSupportMode::ShowControllerSupport: { | 109 | case ControllerSupportMode::ShowControllerSupport: { |
| 80 | const auto user_arg_storage = broker.PopNormalDataToApplet(); | 110 | const auto user_arg_storage = broker.PopNormalDataToApplet(); |
diff --git a/src/core/hle/service/am/applets/controller.h b/src/core/hle/service/am/applets/controller.h index 86269190b..05788966e 100644 --- a/src/core/hle/service/am/applets/controller.h +++ b/src/core/hle/service/am/applets/controller.h | |||
| @@ -29,14 +29,18 @@ enum class LibraryAppletVersion : u32_le { | |||
| 29 | }; | 29 | }; |
| 30 | 30 | ||
| 31 | enum class ControllerSupportMode : u8 { | 31 | enum class ControllerSupportMode : u8 { |
| 32 | ShowControllerSupport = 0, | 32 | ShowControllerSupport, |
| 33 | ShowControllerStrapGuide = 1, | 33 | ShowControllerStrapGuide, |
| 34 | ShowControllerFirmwareUpdate = 2, | 34 | ShowControllerFirmwareUpdate, |
| 35 | |||
| 36 | MaxControllerSupportMode, | ||
| 35 | }; | 37 | }; |
| 36 | 38 | ||
| 37 | enum class ControllerSupportCaller : u8 { | 39 | enum class ControllerSupportCaller : u8 { |
| 38 | Application = 0, | 40 | Application, |
| 39 | System = 1, | 41 | System, |
| 42 | |||
| 43 | MaxControllerSupportCaller, | ||
| 40 | }; | 44 | }; |
| 41 | 45 | ||
| 42 | struct ControllerSupportArgPrivate { | 46 | struct ControllerSupportArgPrivate { |