shared_memory.h 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // Copyright 2014 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include <memory>
  6. #include <string>
  7. #include "common/common_types.h"
  8. #include "core/device_memory.h"
  9. #include "core/hle/kernel/memory/memory_block.h"
  10. #include "core/hle/kernel/memory/page_linked_list.h"
  11. #include "core/hle/kernel/object.h"
  12. #include "core/hle/kernel/process.h"
  13. #include "core/hle/result.h"
  14. namespace Kernel {
  15. class KernelCore;
  16. class SharedMemory final : public Object {
  17. public:
  18. explicit SharedMemory(KernelCore& kernel, Core::DeviceMemory& device_memory);
  19. ~SharedMemory() override;
  20. static std::shared_ptr<SharedMemory> Create(
  21. KernelCore& kernel, Core::DeviceMemory& device_memory, Process* owner_process,
  22. Memory::PageLinkedList&& page_list, Memory::MemoryPermission owner_permission,
  23. Memory::MemoryPermission user_permission, PAddr physical_address, std::size_t size,
  24. std::string name);
  25. std::string GetTypeName() const override {
  26. return "SharedMemory";
  27. }
  28. std::string GetName() const override {
  29. return name;
  30. }
  31. static constexpr HandleType HANDLE_TYPE = HandleType::SharedMemory;
  32. HandleType GetHandleType() const override {
  33. return HANDLE_TYPE;
  34. }
  35. /**
  36. * Maps a shared memory block to an address in the target process' address space
  37. * @param target_process Process on which to map the memory block
  38. * @param address Address in system memory to map shared memory block to
  39. * @param size Size of the shared memory block to map
  40. * @param permissions Memory block map permissions (specified by SVC field)
  41. */
  42. ResultCode Map(Process& target_process, VAddr address, std::size_t size,
  43. Memory::MemoryPermission permission);
  44. /**
  45. * Gets a pointer to the shared memory block
  46. * @param offset Offset from the start of the shared memory block to get pointer
  47. * @return A pointer to the shared memory block from the specified offset
  48. */
  49. u8* GetPointer(std::size_t offset = 0) {
  50. return device_memory.GetPointer(physical_address + offset);
  51. }
  52. /**
  53. * Gets a pointer to the shared memory block
  54. * @param offset Offset from the start of the shared memory block to get pointer
  55. * @return A pointer to the shared memory block from the specified offset
  56. */
  57. const u8* GetPointer(std::size_t offset = 0) const {
  58. return device_memory.GetPointer(physical_address + offset);
  59. }
  60. private:
  61. Core::DeviceMemory& device_memory;
  62. Process* owner_process{};
  63. Memory::PageLinkedList page_list;
  64. Memory::MemoryPermission owner_permission{};
  65. Memory::MemoryPermission user_permission{};
  66. PAddr physical_address{};
  67. std::size_t size{};
  68. std::string name;
  69. };
  70. } // namespace Kernel