summaryrefslogtreecommitdiffstats
path: root/src/core/hle
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/core/hle/kernel/kernel.cpp23
-rw-r--r--src/core/hle/service/am/applets/applet_error.cpp31
2 files changed, 38 insertions, 16 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index 8673384ee..8fdab44e4 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -261,20 +261,23 @@ struct KernelCore::Impl {
current_process = process;
}
- /// Creates a new host thread ID, should only be called by GetHostThreadId
- u32 AllocateHostThreadId(std::optional<std::size_t> core_id) {
- if (core_id) {
- // The first for slots are reserved for CPU core threads
- ASSERT(*core_id < Core::Hardware::NUM_CPU_CORES);
- return static_cast<u32>(*core_id);
- } else {
- return next_host_thread_id++;
+ static inline thread_local u32 host_thread_id = UINT32_MAX;
+
+ /// Gets the host thread ID for the caller, allocating a new one if this is the first time
+ u32 GetHostThreadId(std::size_t core_id) {
+ if (host_thread_id == UINT32_MAX) {
+ // The first four slots are reserved for CPU core threads
+ ASSERT(core_id < Core::Hardware::NUM_CPU_CORES);
+ host_thread_id = static_cast<u32>(core_id);
}
+ return host_thread_id;
}
/// Gets the host thread ID for the caller, allocating a new one if this is the first time
- u32 GetHostThreadId(std::optional<std::size_t> core_id = std::nullopt) {
- const thread_local auto host_thread_id{AllocateHostThreadId(core_id)};
+ u32 GetHostThreadId() {
+ if (host_thread_id == UINT32_MAX) {
+ host_thread_id = next_host_thread_id++;
+ }
return host_thread_id;
}
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