فهرست منبع

APT: Adjust shared font hack so it works with the new linear heap code

Yuri Kunde Schlesner 11 سال پیش
والد
کامیت
38bfbe1b2b
1فایلهای تغییر یافته به همراه11 افزوده شده و 10 حذف شده
  1. 11 10
      src/core/hle/service/apt/apt.cpp

+ 11 - 10
src/core/hle/service/apt/apt.cpp

@@ -16,6 +16,7 @@
 #include "core/hle/hle.h"
 #include "core/hle/kernel/event.h"
 #include "core/hle/kernel/mutex.h"
+#include "core/hle/kernel/process.h"
 #include "core/hle/kernel/shared_memory.h"
 #include "core/hle/kernel/thread.h"
 
@@ -37,7 +38,7 @@ static Kernel::SharedPtr<Kernel::Mutex> lock;
 static Kernel::SharedPtr<Kernel::Event> notification_event; ///< APT notification event
 static Kernel::SharedPtr<Kernel::Event> parameter_event; ///< APT parameter event
 
-static std::vector<u8> shared_font;
+static std::shared_ptr<std::vector<u8>> shared_font;
 
 static u32 cpu_percent; ///< CPU time available to the running application
 
@@ -74,11 +75,12 @@ void Initialize(Service::Interface* self) {
 void GetSharedFont(Service::Interface* self) {
     u32* cmd_buff = Kernel::GetCommandBuffer();
 
-    if (!shared_font.empty()) {
-        // TODO(bunnei): This function shouldn't copy the shared font every time it's called.
-        // Instead, it should probably map the shared font as RO memory. We don't currently have
-        // an easy way to do this, but the copy should be sufficient for now.
-        memcpy(Memory::GetPointer(SHARED_FONT_VADDR), shared_font.data(), shared_font.size());
+    if (shared_font != nullptr) {
+        // TODO(yuriks): This is a hack to keep this working right now even with our completely
+        // broken shared memory system.
+        shared_font_mem->base_address = SHARED_FONT_VADDR;
+        Kernel::g_current_process->vm_manager.MapMemoryBlock(shared_font_mem->base_address,
+                shared_font, 0, shared_font_mem->size, Kernel::MemoryState::Shared);
 
         cmd_buff[0] = IPC::MakeHeader(0x44, 2, 2);
         cmd_buff[1] = RESULT_SUCCESS.raw; // No error
@@ -391,7 +393,6 @@ void Init() {
     // a homebrew app to do this: https://github.com/citra-emu/3dsutils. Put the resulting file
     // "shared_font.bin" in the Citra "sysdata" directory.
 
-    shared_font.clear();
     std::string filepath = FileUtil::GetUserPath(D_SYSDATA_IDX) + SHARED_FONT;
 
     FileUtil::CreateFullPath(filepath); // Create path if not already created
@@ -399,8 +400,8 @@ void Init() {
 
     if (file.IsOpen()) {
         // Read shared font data
-        shared_font.resize((size_t)file.GetSize());
-        file.ReadBytes(shared_font.data(), (size_t)file.GetSize());
+        shared_font = std::make_shared<std::vector<u8>>((size_t)file.GetSize());
+        file.ReadBytes(shared_font->data(), shared_font->size());
 
         // Create shared font memory object
         using Kernel::MemoryPermission;
@@ -424,7 +425,7 @@ void Init() {
 }
 
 void Shutdown() {
-    shared_font.clear();
+    shared_font = nullptr;
     shared_font_mem = nullptr;
     lock = nullptr;
     notification_event = nullptr;