jit_context.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <memory>
  5. #include <span>
  6. #include <string>
  7. #include "common/common_types.h"
  8. namespace Core::Memory {
  9. class Memory;
  10. }
  11. namespace Service::JIT {
  12. class JITContextImpl;
  13. class JITContext {
  14. public:
  15. explicit JITContext(Core::Memory::Memory& memory);
  16. ~JITContext();
  17. [[nodiscard]] bool LoadNRO(std::span<const u8> data);
  18. void MapProcessMemory(VAddr dest_address, std::size_t size);
  19. template <typename T, typename... Ts>
  20. u64 CallFunction(VAddr func, T argument, Ts... rest) {
  21. static_assert(std::is_trivially_copyable_v<T>);
  22. static_assert(!std::is_floating_point_v<T>);
  23. PushArgument(&argument, sizeof(argument));
  24. if constexpr (sizeof...(rest) > 0) {
  25. return CallFunction(func, rest...);
  26. } else {
  27. return CallFunction(func);
  28. }
  29. }
  30. u64 CallFunction(VAddr func);
  31. VAddr GetHelper(const std::string& name);
  32. template <typename T>
  33. VAddr AddHeap(T argument) {
  34. return AddHeap(&argument, sizeof(argument));
  35. }
  36. VAddr AddHeap(const void* data, size_t size);
  37. template <typename T>
  38. T GetHeap(VAddr location) {
  39. static_assert(std::is_trivially_copyable_v<T>);
  40. T result;
  41. GetHeap(location, &result, sizeof(result));
  42. return result;
  43. }
  44. void GetHeap(VAddr location, void* data, size_t size);
  45. private:
  46. std::unique_ptr<JITContextImpl> impl;
  47. void PushArgument(const void* data, size_t size);
  48. };
  49. } // namespace Service::JIT