Przeglądaj źródła

ac:u: stub CloseAsync; check memory size aling in svc:GetProcessInfo(type=2)

mailwl 10 lat temu
rodzic
commit
bd8cc69893
2 zmienionych plików z 29 dodań i 1 usunięć
  1. 25 1
      src/core/hle/service/ac_u.cpp
  2. 4 0
      src/core/hle/svc.cpp

+ 25 - 1
src/core/hle/service/ac_u.cpp

@@ -3,6 +3,8 @@
 // Refer to the license.txt file included.
 
 #include "common/logging/log.h"
+
+#include "core/hle/kernel/event.h"
 #include "core/hle/service/ac_u.h"
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -10,6 +12,28 @@
 
 namespace AC_U {
 
+/**
+ * AC_U::CloseAsync service function
+ *  Inputs:
+ *      1 : Always 0x20
+ *      3 : Always 0
+ *      4 : Event handle, should be signaled when AC connection is closed
+ *  Outputs:
+ *      1 : Result of function, 0 on success, otherwise error code
+ */
+static void CloseAsync(Service::Interface* self) {
+    u32* cmd_buff = Kernel::GetCommandBuffer();
+
+    auto evt = Kernel::g_handle_table.Get<Kernel::Event>(cmd_buff[4]);
+
+    if (evt) {
+        evt->name = "AC_U:close_event";
+        evt->Signal();
+    }
+    cmd_buff[1] = RESULT_SUCCESS.raw; // No error
+
+    LOG_WARNING(Service_AC, "(STUBBED) called");
+}
 /**
  * AC_U::GetWifiStatus service function
  *  Outputs:
@@ -47,7 +71,7 @@ const Interface::FunctionInfo FunctionTable[] = {
     {0x00010000, nullptr,               "CreateDefaultConfig"},
     {0x00040006, nullptr,               "ConnectAsync"},
     {0x00050002, nullptr,               "GetConnectResult"},
-    {0x00080004, nullptr,               "CloseAsync"},
+    {0x00080004, CloseAsync,            "CloseAsync"},
     {0x00090002, nullptr,               "GetCloseResult"},
     {0x000A0000, nullptr,               "GetLastErrorCode"},
     {0x000D0000, GetWifiStatus,         "GetWifiStatus"},

+ 4 - 0
src/core/hle/svc.cpp

@@ -860,6 +860,10 @@ static ResultCode GetProcessInfo(s64* out, Handle process_handle, u32 type) {
         // TODO(yuriks): Type 0 returns a slightly higher number than type 2, but I'm not sure
         // what's the difference between them.
         *out = process->heap_used + process->linear_heap_used + process->misc_memory_used;
+        if(*out % Memory::PAGE_SIZE != 0) {
+            LOG_ERROR(Kernel_SVC, "called, memory size not page-aligned");
+            return ERR_MISALIGNED_SIZE;
+        }
         break;
     case 1:
     case 3: