diff options
| author | Morph <39850852+Morph1984@users.noreply.github.com> | 2021-08-19 12:42:18 -0400 | 
|---|---|---|
| committer | Morph <39850852+Morph1984@users.noreply.github.com> | 2021-08-19 13:16:48 -0400 | 
| commit | 9cb376f8c2b73468912f47d7b25a0796b1a61180 (patch) | |
| tree | 75c5071e1b054d95cc38b69878bbce206103a8f9 /src/core/hle | |
| parent | 562d2aa3d665bbe57efc73723511f4106b07526d (diff) | |
applet_error: Fix 64-bit error code conversion
Diffstat (limited to 'src/core/hle')
| -rw-r--r-- | src/core/hle/service/am/applets/applet_error.cpp | 31 | 
1 files changed, 25 insertions, 6 deletions
| diff --git a/src/core/hle/service/am/applets/applet_error.cpp b/src/core/hle/service/am/applets/applet_error.cpp index ef6854d62..36a4aa9cd 100644 --- a/src/core/hle/service/am/applets/applet_error.cpp +++ b/src/core/hle/service/am/applets/applet_error.cpp @@ -16,6 +16,30 @@  namespace Service::AM::Applets { +struct ErrorCode { +    u32 error_category{}; +    u32 error_number{}; + +    static constexpr ErrorCode FromU64(u64 error_code) { +        return { +            .error_category{static_cast<u32>(error_code >> 32)}, +            .error_number{static_cast<u32>(error_code & 0xFFFFFFFF)}, +        }; +    } + +    static constexpr ErrorCode FromResultCode(ResultCode result) { +        return { +            .error_category{2000 + static_cast<u32>(result.module.Value())}, +            .error_number{result.description.Value()}, +        }; +    } + +    constexpr ResultCode ToResultCode() const { +        return ResultCode{static_cast<ErrorModule>(error_category - 2000), error_number}; +    } +}; +static_assert(sizeof(ErrorCode) == 0x8, "ErrorCode has incorrect size."); +  #pragma pack(push, 4)  struct ShowError {      u8 mode; @@ -76,12 +100,7 @@ void CopyArgumentData(const std::vector<u8>& data, T& variable) {  }  ResultCode Decode64BitError(u64 error) { -    const auto description = (error >> 32) & 0x1FFF; -    auto module = error & 0x3FF; -    if (module >= 2000) -        module -= 2000; -    module &= 0x1FF; -    return {static_cast<ErrorModule>(module), static_cast<u32>(description)}; +    return ErrorCode::FromU64(error).ToResultCode();  }  } // Anonymous namespace | 
