svc_version.h 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include "common/bit_field.h"
  5. #include "common/common_types.h"
  6. #include "common/literals.h"
  7. namespace Kernel::Svc {
  8. constexpr inline u32 ConvertToSvcMajorVersion(u32 sdk) {
  9. return sdk + 4;
  10. }
  11. constexpr inline u32 ConvertToSdkMajorVersion(u32 svc) {
  12. return svc - 4;
  13. }
  14. constexpr inline u32 ConvertToSvcMinorVersion(u32 sdk) {
  15. return sdk;
  16. }
  17. constexpr inline u32 ConvertToSdkMinorVersion(u32 svc) {
  18. return svc;
  19. }
  20. union KernelVersion {
  21. u32 value;
  22. BitField<0, 4, u32> minor_version;
  23. BitField<4, 13, u32> major_version;
  24. };
  25. constexpr inline u32 EncodeKernelVersion(u32 major, u32 minor) {
  26. return decltype(KernelVersion::minor_version)::FormatValue(minor) |
  27. decltype(KernelVersion::major_version)::FormatValue(major);
  28. }
  29. constexpr inline u32 GetKernelMajorVersion(u32 encoded) {
  30. return decltype(KernelVersion::major_version)::ExtractValue(encoded);
  31. }
  32. constexpr inline u32 GetKernelMinorVersion(u32 encoded) {
  33. return decltype(KernelVersion::minor_version)::ExtractValue(encoded);
  34. }
  35. // Nintendo doesn't support programs targeting SVC versions < 3.0.
  36. constexpr inline u32 RequiredKernelMajorVersion = 3;
  37. constexpr inline u32 RequiredKernelMinorVersion = 0;
  38. constexpr inline u32 RequiredKernelVersion =
  39. EncodeKernelVersion(RequiredKernelMajorVersion, RequiredKernelMinorVersion);
  40. // This is the highest SVC version supported, to be updated on new kernel releases.
  41. // NOTE: Official kernel versions have SVC major = SDK major + 4, SVC minor = SDK minor.
  42. constexpr inline u32 SupportedKernelMajorVersion = ConvertToSvcMajorVersion(15);
  43. constexpr inline u32 SupportedKernelMinorVersion = ConvertToSvcMinorVersion(3);
  44. constexpr inline u32 SupportedKernelVersion =
  45. EncodeKernelVersion(SupportedKernelMajorVersion, SupportedKernelMinorVersion);
  46. } // namespace Kernel::Svc