Просмотр исходного кода

HLE/Applets: Give each applet its own block of heap memory, and use that when creating the framebuffer shared memory block.

Subv 10 лет назад
Родитель
Сommit
ac2de12ed8

+ 1 - 0
src/core/hle/applets/applet.h

@@ -65,6 +65,7 @@ protected:
     virtual ResultCode StartImpl(const Service::APT::AppletStartupParameter& parameter) = 0;
     virtual ResultCode StartImpl(const Service::APT::AppletStartupParameter& parameter) = 0;
 
 
     Service::APT::AppletId id; ///< Id of this Applet
     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
 /// Returns whether a library applet is currently running

+ 7 - 2
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);
     ASSERT(sizeof(capture_info) == parameter.buffer_size);
 
 
     memcpy(&capture_info, parameter.data, sizeof(capture_info));
     memcpy(&capture_info, parameter.data, sizeof(capture_info));
+
     using Kernel::MemoryPermission;
     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
     // Send the response message with the newly created SharedMemory
     Service::APT::MessageParameter result;
     Service::APT::MessageParameter result;

+ 6 - 2
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));
     memcpy(&capture_info, parameter.data, sizeof(capture_info));
 
 
     using Kernel::MemoryPermission;
     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
     // Send the response message with the newly created SharedMemory
     Service::APT::MessageParameter result;
     Service::APT::MessageParameter result;

+ 17 - 0
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
         // Copy it over to our own storage
         shared_memory->backing_block = std::make_shared<std::vector<u8>>(vma.backing_block->data() + vma.offset,
         shared_memory->backing_block = std::make_shared<std::vector<u8>>(vma.backing_block->data() + vma.offset,
                                                                          vma.backing_block->data() + vma.offset + size);
                                                                          vma.backing_block->data() + vma.offset + size);
+        shared_memory->backing_block_offset = 0;
         // Unmap the existing pages
         // Unmap the existing pages
         vm_manager.UnmapRange(address, size);
         vm_manager.UnmapRange(address, size);
         // Map our own block into the address space
         // Map our own block into the address space
@@ -70,6 +71,22 @@ SharedPtr<SharedMemory> SharedMemory::Create(SharedPtr<Process> owner_process, u
     return shared_memory;
     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,
 ResultCode SharedMemory::Map(Process* target_process, VAddr address, MemoryPermission permissions,
         MemoryPermission other_permissions) {
         MemoryPermission other_permissions) {
 
 

+ 13 - 1
src/core/hle/kernel/shared_memory.h

@@ -30,7 +30,7 @@ enum class MemoryPermission : u32 {
 class SharedMemory final : public Object {
 class SharedMemory final : public Object {
 public:
 public:
     /**
     /**
-     * Creates a shared memory object
+     * Creates a shared memory object.
      * @param owner_process Process that created this 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 size Size of the memory block. Must be page-aligned.
      * @param permissions Permission restrictions applied to the process which created the block.
      * @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,
     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");
             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 GetTypeName() const override { return "SharedMemory"; }
     std::string GetName() const override { return name; }
     std::string GetName() const override { return name; }