diff options
| -rw-r--r-- | src/common/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/common/assert.cpp | 11 | ||||
| -rw-r--r-- | src/common/assert.h | 14 | ||||
| -rw-r--r-- | src/core/hle/kernel/process_capability.cpp | 5 | ||||
| -rw-r--r-- | src/core/hle/kernel/process_capability.h | 2 | ||||
| -rw-r--r-- | src/core/hle/service/acc/acc.cpp | 17 | ||||
| -rw-r--r-- | src/core/hle/service/acc/acc_su.cpp | 36 | ||||
| -rw-r--r-- | src/core/hle/service/acc/acc_u1.cpp | 28 | ||||
| -rw-r--r-- | src/core/hle/service/audio/hwopus.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/service/filesystem/fsp_srv.cpp | 19 | ||||
| -rw-r--r-- | src/core/hle/service/filesystem/fsp_srv.h | 2 | ||||
| -rw-r--r-- | src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp | 8 | ||||
| -rw-r--r-- | src/video_core/command_classes/codecs/vp9.cpp | 16 | 
13 files changed, 101 insertions, 62 deletions
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 788516ded..66931ac97 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -97,6 +97,7 @@ add_custom_command(OUTPUT scm_rev.cpp  add_library(common STATIC      algorithm.h      alignment.h +    assert.cpp      assert.h      atomic_ops.h      detached_tasks.cpp diff --git a/src/common/assert.cpp b/src/common/assert.cpp new file mode 100644 index 000000000..d7d91b96b --- /dev/null +++ b/src/common/assert.cpp @@ -0,0 +1,11 @@ +// Copyright 2021 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "common/assert.h" + +#include "common/common_funcs.h" + +void assert_handle_failure() { +    Crash(); +} diff --git a/src/common/assert.h b/src/common/assert.h index 06d7b5612..b3ba35c0f 100644 --- a/src/common/assert.h +++ b/src/common/assert.h @@ -4,10 +4,13 @@  #pragma once -#include <cstdlib> -#include "common/common_funcs.h"  #include "common/logging/log.h" +// Sometimes we want to try to continue even after hitting an assert. +// However touching this file yields a global recompilation as this header is included almost +// everywhere. So let's just move the handling of the failed assert to a single cpp file. +void assert_handle_failure(); +  // For asserts we'd like to keep all the junk executed when an assert happens away from the  // important code in the function. One way of doing this is to put all the relevant code inside a  // lambda and force the compiler to not inline it. Unfortunately, MSVC seems to have no syntax to @@ -17,15 +20,14 @@  // enough for our purposes.  template <typename Fn>  #if defined(_MSC_VER) -[[msvc::noinline, noreturn]] +[[msvc::noinline]]  #elif defined(__GNUC__) -[[gnu::cold, gnu::noinline, noreturn]] +[[gnu::cold, gnu::noinline]]  #endif  static void  assert_noinline_call(const Fn& fn) {      fn(); -    Crash(); -    exit(1); // Keeps GCC's mouth shut about this actually returning +    assert_handle_failure();  }  #define ASSERT(_a_)                                                                                \ diff --git a/src/core/hle/kernel/process_capability.cpp b/src/core/hle/kernel/process_capability.cpp index 3fc326eab..1006ee50c 100644 --- a/src/core/hle/kernel/process_capability.cpp +++ b/src/core/hle/kernel/process_capability.cpp @@ -281,11 +281,6 @@ ResultCode ProcessCapabilities::HandleSyscallFlags(u32& set_svc_bits, u32 flags)              continue;          } -        if (svc_number >= svc_capabilities.size()) { -            LOG_ERROR(Kernel, "Process svc capability is out of range! svc_number={}", svc_number); -            return ResultOutOfRange; -        } -          svc_capabilities[svc_number] = true;      } diff --git a/src/core/hle/kernel/process_capability.h b/src/core/hle/kernel/process_capability.h index 73ad197fa..b7a9b2e45 100644 --- a/src/core/hle/kernel/process_capability.h +++ b/src/core/hle/kernel/process_capability.h @@ -68,7 +68,7 @@ enum class ProgramType {  class ProcessCapabilities {  public:      using InterruptCapabilities = std::bitset<1024>; -    using SyscallCapabilities = std::bitset<128>; +    using SyscallCapabilities = std::bitset<192>;      ProcessCapabilities() = default;      ProcessCapabilities(const ProcessCapabilities&) = delete; diff --git a/src/core/hle/service/acc/acc.cpp b/src/core/hle/service/acc/acc.cpp index 615e20a54..52535ecc0 100644 --- a/src/core/hle/service/acc/acc.cpp +++ b/src/core/hle/service/acc/acc.cpp @@ -610,12 +610,17 @@ public:      explicit DAUTH_O(Core::System& system_, Common::UUID) : ServiceFramework{system_, "dauth:o"} {          // clang-format off          static const FunctionInfo functions[] = { -            {0, nullptr, "EnsureAuthenticationTokenCacheAsync"}, // [5.0.0-5.1.0] GeneratePostData -            {1, nullptr, "LoadAuthenticationTokenCache"}, // 6.0.0+ -            {2, nullptr, "InvalidateAuthenticationTokenCache"}, // 6.0.0+ -            {10, nullptr, "EnsureEdgeTokenCacheAsync"}, // 6.0.0+ -            {11, nullptr, "LoadEdgeTokenCache"}, // 6.0.0+ -            {12, nullptr, "InvalidateEdgeTokenCache"}, // 6.0.0+ +            {0, nullptr, "EnsureAuthenticationTokenCacheAsync"}, +            {1, nullptr, "LoadAuthenticationTokenCache"}, +            {2, nullptr, "InvalidateAuthenticationTokenCache"}, +            {10, nullptr, "EnsureEdgeTokenCacheAsync"}, +            {11, nullptr, "LoadEdgeTokenCache"}, +            {12, nullptr, "InvalidateEdgeTokenCache"}, +            {20, nullptr, "EnsureApplicationAuthenticationCacheAsync"}, +            {21, nullptr, "LoadApplicationAuthenticationTokenCache"}, +            {22, nullptr, "LoadApplicationNetworkServiceClientConfigCache"}, +            {23, nullptr, "IsApplicationAuthenticationCacheAvailable"}, +            {24, nullptr, "InvalidateApplicationAuthenticationCache"},          };          // clang-format on diff --git a/src/core/hle/service/acc/acc_su.cpp b/src/core/hle/service/acc/acc_su.cpp index 49b22583e..bb6118abf 100644 --- a/src/core/hle/service/acc/acc_su.cpp +++ b/src/core/hle/service/acc/acc_su.cpp @@ -17,28 +17,30 @@ ACC_SU::ACC_SU(std::shared_ptr<Module> module, std::shared_ptr<ProfileManager> p          {3, &ACC_SU::ListOpenUsers, "ListOpenUsers"},          {4, &ACC_SU::GetLastOpenedUser, "GetLastOpenedUser"},          {5, &ACC_SU::GetProfile, "GetProfile"}, -        {6, nullptr, "GetProfileDigest"}, // 3.0.0+ +        {6, nullptr, "GetProfileDigest"},          {50, &ACC_SU::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"},          {51, &ACC_SU::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, -        {60, &ACC_SU::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, // 5.0.0 - 5.1.0 -        {99, nullptr, "DebugActivateOpenContextRetention"}, // 6.0.0+ +        {60, &ACC_SU::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, +        {99, nullptr, "DebugActivateOpenContextRetention"},          {100, nullptr, "GetUserRegistrationNotifier"},          {101, nullptr, "GetUserStateChangeNotifier"},          {102, nullptr, "GetBaasAccountManagerForSystemService"},          {103, nullptr, "GetBaasUserAvailabilityChangeNotifier"},          {104, nullptr, "GetProfileUpdateNotifier"}, -        {105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, // 4.0.0+ -        {106, nullptr, "GetProfileSyncNotifier"}, // 9.0.0+ +        {105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, +        {106, nullptr, "GetProfileSyncNotifier"},          {110, &ACC_SU::StoreSaveDataThumbnailSystem, "StoreSaveDataThumbnail"},          {111, nullptr, "ClearSaveDataThumbnail"},          {112, nullptr, "LoadSaveDataThumbnail"}, -        {113, nullptr, "GetSaveDataThumbnailExistence"}, // 5.0.0+ -        {120, nullptr, "ListOpenUsersInApplication"}, // 10.0.0+ -        {130, nullptr, "ActivateOpenContextRetention"}, // 6.0.0+ -        {140, &ACC_SU::ListQualifiedUsers, "ListQualifiedUsers"}, // 6.0.0+ -        {150, nullptr, "AuthenticateApplicationAsync"}, // 10.0.0+ -        {190, nullptr, "GetUserLastOpenedApplication"}, // 1.0.0 - 9.2.0 -        {191, nullptr, "ActivateOpenContextHolder"}, // 7.0.0+ +        {113, nullptr, "GetSaveDataThumbnailExistence"}, +        {120, nullptr, "ListOpenUsersInApplication"}, +        {130, nullptr, "ActivateOpenContextRetention"}, +        {140, &ACC_SU::ListQualifiedUsers, "ListQualifiedUsers"}, +        {150, nullptr, "AuthenticateApplicationAsync"}, +        {151, nullptr, "Unknown151"}, +        {152, nullptr, "Unknown152"}, +        {190, nullptr, "GetUserLastOpenedApplication"}, +        {191, nullptr, "ActivateOpenContextHolder"},          {200, nullptr, "BeginUserRegistration"},          {201, nullptr, "CompleteUserRegistration"},          {202, nullptr, "CancelUserRegistration"}, @@ -46,15 +48,15 @@ ACC_SU::ACC_SU(std::shared_ptr<Module> module, std::shared_ptr<ProfileManager> p          {204, nullptr, "SetUserPosition"},          {205, &ACC_SU::GetProfileEditor, "GetProfileEditor"},          {206, nullptr, "CompleteUserRegistrationForcibly"}, -        {210, nullptr, "CreateFloatingRegistrationRequest"}, // 3.0.0+ -        {211, nullptr, "CreateProcedureToRegisterUserWithNintendoAccount"}, // 8.0.0+ -        {212, nullptr, "ResumeProcedureToRegisterUserWithNintendoAccount"}, // 8.0.0+ +        {210, nullptr, "CreateFloatingRegistrationRequest"}, +        {211, nullptr, "CreateProcedureToRegisterUserWithNintendoAccount"}, +        {212, nullptr, "ResumeProcedureToRegisterUserWithNintendoAccount"},          {230, nullptr, "AuthenticateServiceAsync"},          {250, nullptr, "GetBaasAccountAdministrator"},          {290, nullptr, "ProxyProcedureForGuestLoginWithNintendoAccount"}, -        {291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"}, // 3.0.0+ +        {291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"},          {299, nullptr, "SuspendBackgroundDaemon"}, -        {997, nullptr, "DebugInvalidateTokenCacheForUser"}, // 3.0.0+ +        {997, nullptr, "DebugInvalidateTokenCacheForUser"},          {998, nullptr, "DebugSetUserStateClose"},          {999, nullptr, "DebugSetUserStateOpen"},      }; diff --git a/src/core/hle/service/acc/acc_u1.cpp b/src/core/hle/service/acc/acc_u1.cpp index 951081cd0..71982ad5a 100644 --- a/src/core/hle/service/acc/acc_u1.cpp +++ b/src/core/hle/service/acc/acc_u1.cpp @@ -17,29 +17,31 @@ ACC_U1::ACC_U1(std::shared_ptr<Module> module, std::shared_ptr<ProfileManager> p          {3, &ACC_U1::ListOpenUsers, "ListOpenUsers"},          {4, &ACC_U1::GetLastOpenedUser, "GetLastOpenedUser"},          {5, &ACC_U1::GetProfile, "GetProfile"}, -        {6, nullptr, "GetProfileDigest"}, // 3.0.0+ +        {6, nullptr, "GetProfileDigest"},          {50, &ACC_U1::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"},          {51, &ACC_U1::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, -        {60, &ACC_U1::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, // 5.0.0 - 5.1.0 -        {99, nullptr, "DebugActivateOpenContextRetention"}, // 6.0.0+ +        {60, &ACC_U1::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, +        {99, nullptr, "DebugActivateOpenContextRetention"},          {100, nullptr, "GetUserRegistrationNotifier"},          {101, nullptr, "GetUserStateChangeNotifier"},          {102, nullptr, "GetBaasAccountManagerForSystemService"},          {103, nullptr, "GetBaasUserAvailabilityChangeNotifier"},          {104, nullptr, "GetProfileUpdateNotifier"}, -        {105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, // 4.0.0+ -        {106, nullptr, "GetProfileSyncNotifier"}, // 9.0.0+ +        {105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, +        {106, nullptr, "GetProfileSyncNotifier"},          {110, &ACC_U1::StoreSaveDataThumbnailApplication, "StoreSaveDataThumbnail"},          {111, nullptr, "ClearSaveDataThumbnail"},          {112, nullptr, "LoadSaveDataThumbnail"}, -        {113, nullptr, "GetSaveDataThumbnailExistence"}, // 5.0.0+ -        {120, nullptr, "ListOpenUsersInApplication"}, // 10.0.0+ -        {130, nullptr, "ActivateOpenContextRetention"}, // 6.0.0+ -        {140, &ACC_U1::ListQualifiedUsers, "ListQualifiedUsers"}, // 6.0.0+ -        {150, nullptr, "AuthenticateApplicationAsync"}, // 10.0.0+ -        {190, nullptr, "GetUserLastOpenedApplication"}, // 1.0.0 - 9.2.0 -        {191, nullptr, "ActivateOpenContextHolder"}, // 7.0.0+ -        {997, nullptr, "DebugInvalidateTokenCacheForUser"}, // 3.0.0+ +        {113, nullptr, "GetSaveDataThumbnailExistence"}, +        {120, nullptr, "ListOpenUsersInApplication"}, +        {130, nullptr, "ActivateOpenContextRetention"}, +        {140, &ACC_U1::ListQualifiedUsers, "ListQualifiedUsers"}, +        {150, nullptr, "AuthenticateApplicationAsync"}, +        {151, nullptr, "Unknown151"}, +        {152, nullptr, "Unknown152"}, +        {190, nullptr, "GetUserLastOpenedApplication"}, +        {191, nullptr, "ActivateOpenContextHolder"}, +        {997, nullptr, "DebugInvalidateTokenCacheForUser"},          {998, nullptr, "DebugSetUserStateClose"},          {999, nullptr, "DebugSetUserStateOpen"},      }; diff --git a/src/core/hle/service/audio/hwopus.cpp b/src/core/hle/service/audio/hwopus.cpp index ea3414fd2..19c578b3a 100644 --- a/src/core/hle/service/audio/hwopus.cpp +++ b/src/core/hle/service/audio/hwopus.cpp @@ -297,6 +297,10 @@ HwOpus::HwOpus(Core::System& system_) : ServiceFramework{system_, "hwopus"} {          {1, &HwOpus::GetWorkBufferSize, "GetWorkBufferSize"},          {2, nullptr, "OpenOpusDecoderForMultiStream"},          {3, nullptr, "GetWorkBufferSizeForMultiStream"}, +        {4, nullptr, "OpenHardwareOpusDecoderEx"}, +        {5, nullptr, "GetWorkBufferSizeEx"}, +        {6, nullptr, "OpenHardwareOpusDecoderForMultiStreamEx"}, +        {7, nullptr, "GetWorkBufferSizeForMultiStreamEx"},      };      RegisterHandlers(functions);  } diff --git a/src/core/hle/service/filesystem/fsp_srv.cpp b/src/core/hle/service/filesystem/fsp_srv.cpp index 9cc260515..a0215c4d7 100644 --- a/src/core/hle/service/filesystem/fsp_srv.cpp +++ b/src/core/hle/service/filesystem/fsp_srv.cpp @@ -118,9 +118,13 @@ public:      explicit IFile(Core::System& system_, FileSys::VirtualFile backend_)          : ServiceFramework{system_, "IFile"}, backend(std::move(backend_)) {          static const FunctionInfo functions[] = { -            {0, &IFile::Read, "Read"},       {1, &IFile::Write, "Write"}, -            {2, &IFile::Flush, "Flush"},     {3, &IFile::SetSize, "SetSize"}, -            {4, &IFile::GetSize, "GetSize"}, {5, nullptr, "OperateRange"}, +            {0, &IFile::Read, "Read"}, +            {1, &IFile::Write, "Write"}, +            {2, &IFile::Flush, "Flush"}, +            {3, &IFile::SetSize, "SetSize"}, +            {4, &IFile::GetSize, "GetSize"}, +            {5, nullptr, "OperateRange"}, +            {6, nullptr, "OperateRangeWithBuffer"},          };          RegisterHandlers(functions);      } @@ -708,7 +712,10 @@ FSP_SRV::FSP_SRV(Core::System& system_)          {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"}, @@ -764,10 +771,12 @@ FSP_SRV::FSP_SRV(Core::System& system_)          {1008, nullptr, "OpenRegisteredUpdatePartition"},          {1009, nullptr, "GetAndClearMemoryReportInfo"},          {1010, nullptr, "SetDataStorageRedirectTarget"}, -        {1011, &FSP_SRV::GetAccessLogVersionInfo, "GetAccessLogVersionInfo"}, +        {1011, &FSP_SRV::GetProgramIndexForAccessLog, "GetProgramIndexForAccessLog"},          {1012, nullptr, "GetFsStackUsage"},          {1013, nullptr, "UnsetSaveDataRootPath"},          {1014, nullptr, "OutputMultiProgramTagAccessLog"}, +        {1016, nullptr, "FlushAccessLogOnSdCard"}, +        {1017, nullptr, "OutputApplicationInfoAccessLog"},          {1100, nullptr, "OverrideSaveDataTransferTokenSignVerificationKey"},          {1110, nullptr, "CorruptSaveDataFileSystemBySaveDataSpaceId2"},          {1200, &FSP_SRV::OpenMultiCommitManager, "OpenMultiCommitManager"}, @@ -1051,7 +1060,7 @@ void FSP_SRV::OutputAccessLogToSdCard(Kernel::HLERequestContext& ctx) {      rb.Push(RESULT_SUCCESS);  } -void FSP_SRV::GetAccessLogVersionInfo(Kernel::HLERequestContext& ctx) { +void FSP_SRV::GetProgramIndexForAccessLog(Kernel::HLERequestContext& ctx) {      LOG_DEBUG(Service_FS, "called");      IPC::ResponseBuilder rb{ctx, 4}; diff --git a/src/core/hle/service/filesystem/fsp_srv.h b/src/core/hle/service/filesystem/fsp_srv.h index 8ed933279..b01b924eb 100644 --- a/src/core/hle/service/filesystem/fsp_srv.h +++ b/src/core/hle/service/filesystem/fsp_srv.h @@ -53,7 +53,7 @@ private:      void SetGlobalAccessLogMode(Kernel::HLERequestContext& ctx);      void GetGlobalAccessLogMode(Kernel::HLERequestContext& ctx);      void OutputAccessLogToSdCard(Kernel::HLERequestContext& ctx); -    void GetAccessLogVersionInfo(Kernel::HLERequestContext& ctx); +    void GetProgramIndexForAccessLog(Kernel::HLERequestContext& ctx);      void OpenMultiCommitManager(Kernel::HLERequestContext& ctx);      FileSystemController& fsc; diff --git a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp index 933d42f3f..2edd803f3 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp @@ -248,7 +248,13 @@ NvResult nvhost_ctrl_gpu::ZBCSetTable(const std::vector<u8>& input, std::vector<      IoctlZbcSetTable params{};      std::memcpy(¶ms, input.data(), input.size());      // TODO(ogniK): What does this even actually do? -    std::memcpy(output.data(), ¶ms, output.size()); + +    // Prevent null pointer being passed as arg 1 +    if (output.empty()) { +        LOG_WARNING(Service_NVDRV, "Avoiding passing null pointer to memcpy"); +    } else { +        std::memcpy(output.data(), ¶ms, output.size()); +    }      return NvResult::Success;  } diff --git a/src/video_core/command_classes/codecs/vp9.cpp b/src/video_core/command_classes/codecs/vp9.cpp index 59e586695..29bb31418 100644 --- a/src/video_core/command_classes/codecs/vp9.cpp +++ b/src/video_core/command_classes/codecs/vp9.cpp @@ -2,8 +2,9 @@  // Licensed under GPLv2 or any later version  // Refer to the license.txt file included. -#include <cstring> // for std::memcpy +#include <algorithm> // for std::copy  #include <numeric> +#include "common/assert.h"  #include "video_core/command_classes/codecs/vp9.h"  #include "video_core/gpu.h"  #include "video_core/memory_manager.h" @@ -362,7 +363,8 @@ Vp9PictureInfo VP9::GetVp9PictureInfo(const NvdecCommon::NvdecRegisters& state)      // surface_luma_offset[0:3] contains the address of the reference frame offsets in the following      // order: last, golden, altref, current. It may be worthwhile to track the updates done here      // to avoid buffering frame data needed for reference frame updating in the header composition. -    std::memcpy(vp9_info.frame_offsets.data(), state.surface_luma_offset.data(), 4 * sizeof(u64)); +    std::copy(state.surface_luma_offset.begin(), state.surface_luma_offset.begin() + 4, +              vp9_info.frame_offsets.begin());      return vp9_info;  } @@ -821,11 +823,11 @@ const std::vector<u8>& VP9::ComposeFrameHeader(const NvdecCommon::NvdecRegisters      // Write headers and frame to buffer      frame.resize(uncompressed_header.size() + compressed_header.size() + bitstream.size()); -    std::memcpy(frame.data(), uncompressed_header.data(), uncompressed_header.size()); -    std::memcpy(frame.data() + uncompressed_header.size(), compressed_header.data(), -                compressed_header.size()); -    std::memcpy(frame.data() + uncompressed_header.size() + compressed_header.size(), -                bitstream.data(), bitstream.size()); +    std::copy(uncompressed_header.begin(), uncompressed_header.end(), frame.begin()); +    std::copy(compressed_header.begin(), compressed_header.end(), +              frame.begin() + uncompressed_header.size()); +    std::copy(bitstream.begin(), bitstream.end(), +              frame.begin() + uncompressed_header.size() + compressed_header.size());      // keep track of frame number      current_frame_number++;  | 
