diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/hle/applets/applet.h | 1 | ||||
| -rw-r--r-- | src/core/hle/applets/mii_selector.cpp | 9 | ||||
| -rw-r--r-- | src/core/hle/applets/swkbd.cpp | 8 | ||||
| -rw-r--r-- | src/core/hle/kernel/shared_memory.cpp | 17 | ||||
| -rw-r--r-- | src/core/hle/kernel/shared_memory.h | 14 | 
5 files changed, 44 insertions, 5 deletions
| diff --git a/src/core/hle/applets/applet.h b/src/core/hle/applets/applet.h index af442f81d..754c6f7db 100644 --- a/src/core/hle/applets/applet.h +++ b/src/core/hle/applets/applet.h @@ -65,6 +65,7 @@ protected:      virtual ResultCode StartImpl(const Service::APT::AppletStartupParameter& parameter) = 0;      Service::APT::AppletId id; ///< Id of this Applet +    std::shared_ptr<std::vector<u8>> heap_memory; ///< Heap memory for this Applet  };  /// Returns whether a library applet is currently running diff --git a/src/core/hle/applets/mii_selector.cpp b/src/core/hle/applets/mii_selector.cpp index 7f174f3e6..bf39eca22 100644 --- a/src/core/hle/applets/mii_selector.cpp +++ b/src/core/hle/applets/mii_selector.cpp @@ -35,9 +35,14 @@ ResultCode MiiSelector::ReceiveParameter(const Service::APT::MessageParameter& p      ASSERT(sizeof(capture_info) == parameter.buffer_size);      memcpy(&capture_info, parameter.data, sizeof(capture_info)); +      using Kernel::MemoryPermission; -    framebuffer_memory = Kernel::SharedMemory::Create(nullptr, capture_info.size, MemoryPermission::ReadWrite, -                                                      MemoryPermission::ReadWrite, 0, Kernel::MemoryRegion::BASE, "MiiSelector Memory"); +    // Allocate a heap block of the required size for this applet. +    heap_memory = std::make_shared<std::vector<u8>>(capture_info.size); +    // Create a SharedMemory that directly points to this heap block. +    framebuffer_memory = Kernel::SharedMemory::CreateForApplet(heap_memory, 0, heap_memory->size(), +                                                               MemoryPermission::ReadWrite, MemoryPermission::ReadWrite, +                                                               "MiiSelector Memory");      // Send the response message with the newly created SharedMemory      Service::APT::MessageParameter result; diff --git a/src/core/hle/applets/swkbd.cpp b/src/core/hle/applets/swkbd.cpp index e0c134182..90c6adc65 100644 --- a/src/core/hle/applets/swkbd.cpp +++ b/src/core/hle/applets/swkbd.cpp @@ -40,8 +40,12 @@ ResultCode SoftwareKeyboard::ReceiveParameter(Service::APT::MessageParameter con      memcpy(&capture_info, parameter.data, sizeof(capture_info));      using Kernel::MemoryPermission; -    framebuffer_memory = Kernel::SharedMemory::Create(nullptr, capture_info.size, MemoryPermission::ReadWrite, -                                                      MemoryPermission::ReadWrite, 0, Kernel::MemoryRegion::BASE, "SoftwareKeyboard Memory"); +    // Allocate a heap block of the required size for this applet. +    heap_memory = std::make_shared<std::vector<u8>>(capture_info.size); +    // Create a SharedMemory that directly points to this heap block. +    framebuffer_memory = Kernel::SharedMemory::CreateForApplet(heap_memory, 0, heap_memory->size(), +                                                               MemoryPermission::ReadWrite, MemoryPermission::ReadWrite, +                                                               "SoftwareKeyboard Memory");      // Send the response message with the newly created SharedMemory      Service::APT::MessageParameter result; diff --git a/src/core/hle/kernel/shared_memory.cpp b/src/core/hle/kernel/shared_memory.cpp index 74947f023..6a22c8986 100644 --- a/src/core/hle/kernel/shared_memory.cpp +++ b/src/core/hle/kernel/shared_memory.cpp @@ -58,6 +58,7 @@ SharedPtr<SharedMemory> SharedMemory::Create(SharedPtr<Process> owner_process, u          // Copy it over to our own storage          shared_memory->backing_block = std::make_shared<std::vector<u8>>(vma.backing_block->data() + vma.offset,                                                                           vma.backing_block->data() + vma.offset + size); +        shared_memory->backing_block_offset = 0;          // Unmap the existing pages          vm_manager.UnmapRange(address, size);          // Map our own block into the address space @@ -70,6 +71,22 @@ SharedPtr<SharedMemory> SharedMemory::Create(SharedPtr<Process> owner_process, u      return shared_memory;  } +SharedPtr<SharedMemory> SharedMemory::CreateForApplet(std::shared_ptr<std::vector<u8>> heap_block, u32 offset, u32 size, +                                                      MemoryPermission permissions, MemoryPermission other_permissions, std::string name) { +    SharedPtr<SharedMemory> shared_memory(new SharedMemory); + +    shared_memory->owner_process = nullptr; +    shared_memory->name = std::move(name); +    shared_memory->size = size; +    shared_memory->permissions = permissions; +    shared_memory->other_permissions = other_permissions; +    shared_memory->backing_block = heap_block; +    shared_memory->backing_block_offset = offset; +    shared_memory->base_address = Memory::HEAP_VADDR + offset; + +    return shared_memory; +} +  ResultCode SharedMemory::Map(Process* target_process, VAddr address, MemoryPermission permissions,          MemoryPermission other_permissions) { diff --git a/src/core/hle/kernel/shared_memory.h b/src/core/hle/kernel/shared_memory.h index af145bef5..0c404a9f8 100644 --- a/src/core/hle/kernel/shared_memory.h +++ b/src/core/hle/kernel/shared_memory.h @@ -30,7 +30,7 @@ enum class MemoryPermission : u32 {  class SharedMemory final : public Object {  public:      /** -     * Creates a shared memory object +     * Creates a shared memory object.       * @param owner_process Process that created this shared memory object.       * @param size Size of the memory block. Must be page-aligned.       * @param permissions Permission restrictions applied to the process which created the block. @@ -42,6 +42,18 @@ public:      static SharedPtr<SharedMemory> Create(SharedPtr<Process> owner_process, u32 size, MemoryPermission permissions,              MemoryPermission other_permissions, VAddr address = 0, MemoryRegion region = MemoryRegion::BASE, std::string name = "Unknown"); +    /** +     * Creates a shared memory object from a block of memory managed by an HLE applet. +     * @param heap_block Heap block of the HLE applet. +     * @param offset The offset into the heap block that the SharedMemory will map. +     * @param size Size of the memory block. Must be page-aligned. +     * @param permissions Permission restrictions applied to the process which created the block. +     * @param other_permissions Permission restrictions applied to other processes mapping the block. +     * @param name Optional object name, used for debugging purposes. +     */ +    static SharedPtr<SharedMemory> CreateForApplet(std::shared_ptr<std::vector<u8>> heap_block, u32 offset, u32 size, +                                                   MemoryPermission permissions, MemoryPermission other_permissions, std::string name = "Unknown Applet"); +      std::string GetTypeName() const override { return "SharedMemory"; }      std::string GetName() const override { return name; } | 
