From 3be1a565f895d5399a6c1f6d0997dc528537fe86 Mon Sep 17 00:00:00 2001 From: Chloe Marcec Date: Sat, 30 Jan 2021 20:40:49 +1100 Subject: kernel: Rewrite resource limit to be more accurate Matches closer to hardware --- src/core/hle/kernel/k_resource_limit.h | 80 ++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/core/hle/kernel/k_resource_limit.h (limited to 'src/core/hle/kernel/k_resource_limit.h') diff --git a/src/core/hle/kernel/k_resource_limit.h b/src/core/hle/kernel/k_resource_limit.h new file mode 100644 index 000000000..84c59177c --- /dev/null +++ b/src/core/hle/kernel/k_resource_limit.h @@ -0,0 +1,80 @@ +// Copyright 2020 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +// This file references various implementation details from Atmosphere, an open-source firmware for +// the Nintendo Switch. Copyright 2018-2020 Atmosphere-NX. + +#pragma once + +#include +#include "common/common_types.h" +#include "core/hle/kernel/k_light_condition_variable.h" +#include "core/hle/kernel/k_light_lock.h" +#include "core/hle/kernel/object.h" + +union ResultCode; + +namespace Core { +class System; +} + +namespace Kernel { +class KernelCore; +enum class LimitableResource : u32 { + PhysicalMemoryMax = 0, + ThreadCountMax = 1, + EventCountMax = 2, + TransferMemoryCountMax = 3, + SessionCountMax = 4, + + Count, +}; + +constexpr bool IsValidResourceType(LimitableResource type) { + return type < LimitableResource::Count; +} + +class KResourceLimit final : public Object { +public: + KResourceLimit(KernelCore& kernel, Core::System& system); + ~KResourceLimit(); + + s64 GetLimitValue(LimitableResource which) const; + s64 GetCurrentValue(LimitableResource which) const; + s64 GetPeakValue(LimitableResource which) const; + s64 GetFreeValue(LimitableResource which) const; + + ResultCode SetLimitValue(LimitableResource which, s64 value); + + bool Reserve(LimitableResource which, s64 value); + bool Reserve(LimitableResource which, s64 value, s64 timeout); + void Release(LimitableResource which, s64 value); + void Release(LimitableResource which, s64 value, s64 hint); + + std::string GetTypeName() const override { + return "KResourceLimit"; + } + std::string GetName() const override { + return GetTypeName(); + } + + static constexpr HandleType HANDLE_TYPE = HandleType::ResourceLimit; + HandleType GetHandleType() const override { + return HANDLE_TYPE; + } + + virtual void Finalize() override {} + +private: + std::array(LimitableResource::Count)> limit_values{}; + std::array(LimitableResource::Count)> current_values{}; + std::array(LimitableResource::Count)> current_hints{}; + std::array(LimitableResource::Count)> peak_values{}; + mutable KLightLock m_lock; + s32 waiter_count{}; + KLightConditionVariable cond_var; + KernelCore& kernel; + Core::System& system; +}; +} // namespace Kernel -- cgit v1.2.3 From 7791cfd9603d983fe58d3463e94d87448ad9e5a6 Mon Sep 17 00:00:00 2001 From: Chloe Marcec Date: Sat, 30 Jan 2021 21:19:49 +1100 Subject: Drop m_ from lock --- src/core/hle/kernel/k_resource_limit.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/core/hle/kernel/k_resource_limit.h') diff --git a/src/core/hle/kernel/k_resource_limit.h b/src/core/hle/kernel/k_resource_limit.h index 84c59177c..5f916c99c 100644 --- a/src/core/hle/kernel/k_resource_limit.h +++ b/src/core/hle/kernel/k_resource_limit.h @@ -71,7 +71,7 @@ private: std::array(LimitableResource::Count)> current_values{}; std::array(LimitableResource::Count)> current_hints{}; std::array(LimitableResource::Count)> peak_values{}; - mutable KLightLock m_lock; + mutable KLightLock lock; s32 waiter_count{}; KLightConditionVariable cond_var; KernelCore& kernel; -- cgit v1.2.3 From 9e4b2d60bc4827552b0d74675ae03fec06f73452 Mon Sep 17 00:00:00 2001 From: Chloe Marcec Date: Tue, 2 Feb 2021 13:23:00 +1100 Subject: Address issues --- src/core/hle/kernel/k_resource_limit.h | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'src/core/hle/kernel/k_resource_limit.h') diff --git a/src/core/hle/kernel/k_resource_limit.h b/src/core/hle/kernel/k_resource_limit.h index 5f916c99c..6b3437ea6 100644 --- a/src/core/hle/kernel/k_resource_limit.h +++ b/src/core/hle/kernel/k_resource_limit.h @@ -37,7 +37,7 @@ constexpr bool IsValidResourceType(LimitableResource type) { class KResourceLimit final : public Object { public: - KResourceLimit(KernelCore& kernel, Core::System& system); + explicit KResourceLimit(KernelCore& kernel, Core::System& system); ~KResourceLimit(); s64 GetLimitValue(LimitableResource which) const; @@ -67,10 +67,11 @@ public: virtual void Finalize() override {} private: - std::array(LimitableResource::Count)> limit_values{}; - std::array(LimitableResource::Count)> current_values{}; - std::array(LimitableResource::Count)> current_hints{}; - std::array(LimitableResource::Count)> peak_values{}; + using ResourceArray = std::array(LimitableResource::Count)>; + ResourceArray limit_values{}; + ResourceArray current_values{}; + ResourceArray current_hints{}; + ResourceArray peak_values{}; mutable KLightLock lock; s32 waiter_count{}; KLightConditionVariable cond_var; -- cgit v1.2.3 From 2c6e94049362f592bfb578a2b078f6f3067ed0d8 Mon Sep 17 00:00:00 2001 From: Chloe Marcec Date: Wed, 3 Feb 2021 12:55:16 +1100 Subject: Simplify limitableresource names --- src/core/hle/kernel/k_resource_limit.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src/core/hle/kernel/k_resource_limit.h') diff --git a/src/core/hle/kernel/k_resource_limit.h b/src/core/hle/kernel/k_resource_limit.h index 6b3437ea6..58ae456f1 100644 --- a/src/core/hle/kernel/k_resource_limit.h +++ b/src/core/hle/kernel/k_resource_limit.h @@ -22,11 +22,11 @@ class System; namespace Kernel { class KernelCore; enum class LimitableResource : u32 { - PhysicalMemoryMax = 0, - ThreadCountMax = 1, - EventCountMax = 2, - TransferMemoryCountMax = 3, - SessionCountMax = 4, + PhysicalMemory = 0, + Threads = 1, + Events = 2, + TransferMemory = 3, + Sessions = 4, Count, }; -- cgit v1.2.3