applet_error: Fix 64-bit error code conversion

This commit is contained in:
Morph 2021-08-19 12:42:18 -04:00
parent 562d2aa3d6
commit 9cb376f8c2
1 changed files with 25 additions and 6 deletions

View File

@ -16,6 +16,30 @@
namespace Service::AM::Applets { 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) #pragma pack(push, 4)
struct ShowError { struct ShowError {
u8 mode; u8 mode;
@ -76,12 +100,7 @@ void CopyArgumentData(const std::vector<u8>& data, T& variable) {
} }
ResultCode Decode64BitError(u64 error) { ResultCode Decode64BitError(u64 error) {
const auto description = (error >> 32) & 0x1FFF; return ErrorCode::FromU64(error).ToResultCode();
auto module = error & 0x3FF;
if (module >= 2000)
module -= 2000;
module &= 0x1FF;
return {static_cast<ErrorModule>(module), static_cast<u32>(description)};
} }
} // Anonymous namespace } // Anonymous namespace