diff options
| -rw-r--r-- | src/core/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/handle_table.cpp | 3 | ||||
| -rw-r--r-- | src/core/hle/kernel/init/init_slab_setup.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_page_table.h | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_transfer_memory.cpp | 45 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_transfer_memory.h | 82 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.h | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 93 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc_wrap.h | 12 | ||||
| -rw-r--r-- | src/core/hle/service/am/am.cpp | 9 | ||||
| -rw-r--r-- | src/core/hle/service/am/am.h | 2 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.cpp | 17 |
12 files changed, 209 insertions, 68 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index e30a30823..8e3b51ae7 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt | |||
| @@ -221,6 +221,8 @@ add_library(core STATIC | |||
| 221 | hle/kernel/k_thread.h | 221 | hle/kernel/k_thread.h |
| 222 | hle/kernel/k_thread_queue.h | 222 | hle/kernel/k_thread_queue.h |
| 223 | hle/kernel/k_trace.h | 223 | hle/kernel/k_trace.h |
| 224 | hle/kernel/k_transfer_memory.cpp | ||
| 225 | hle/kernel/k_transfer_memory.h | ||
| 224 | hle/kernel/k_writable_event.cpp | 226 | hle/kernel/k_writable_event.cpp |
| 225 | hle/kernel/k_writable_event.h | 227 | hle/kernel/k_writable_event.h |
| 226 | hle/kernel/kernel.cpp | 228 | hle/kernel/kernel.cpp |
| @@ -247,8 +249,6 @@ add_library(core STATIC | |||
| 247 | hle/kernel/svc_wrap.h | 249 | hle/kernel/svc_wrap.h |
| 248 | hle/kernel/time_manager.cpp | 250 | hle/kernel/time_manager.cpp |
| 249 | hle/kernel/time_manager.h | 251 | hle/kernel/time_manager.h |
| 250 | hle/kernel/transfer_memory.cpp | ||
| 251 | hle/kernel/transfer_memory.h | ||
| 252 | hle/lock.cpp | 252 | hle/lock.cpp |
| 253 | hle/lock.h | 253 | hle/lock.h |
| 254 | hle/result.h | 254 | hle/result.h |
diff --git a/src/core/hle/kernel/handle_table.cpp b/src/core/hle/kernel/handle_table.cpp index ddb1e6fb2..9291f0a76 100644 --- a/src/core/hle/kernel/handle_table.cpp +++ b/src/core/hle/kernel/handle_table.cpp | |||
| @@ -59,7 +59,8 @@ ResultVal<Handle> HandleTable::Create(Object* obj) { | |||
| 59 | case HandleType::WritableEvent: | 59 | case HandleType::WritableEvent: |
| 60 | case HandleType::ClientSession: | 60 | case HandleType::ClientSession: |
| 61 | case HandleType::ServerSession: | 61 | case HandleType::ServerSession: |
| 62 | case HandleType::Session: { | 62 | case HandleType::Session: |
| 63 | case HandleType::TransferMemory: { | ||
| 63 | Handle handle{}; | 64 | Handle handle{}; |
| 64 | Add(&handle, reinterpret_cast<KAutoObject*>(obj), {}); | 65 | Add(&handle, reinterpret_cast<KAutoObject*>(obj), {}); |
| 65 | return MakeResult<Handle>(handle); | 66 | return MakeResult<Handle>(handle); |
diff --git a/src/core/hle/kernel/init/init_slab_setup.cpp b/src/core/hle/kernel/init/init_slab_setup.cpp index 84d509d52..ce7a24c40 100644 --- a/src/core/hle/kernel/init/init_slab_setup.cpp +++ b/src/core/hle/kernel/init/init_slab_setup.cpp | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #include "core/hle/kernel/k_memory_manager.h" | 14 | #include "core/hle/kernel/k_memory_manager.h" |
| 15 | #include "core/hle/kernel/k_session.h" | 15 | #include "core/hle/kernel/k_session.h" |
| 16 | #include "core/hle/kernel/k_shared_memory.h" | 16 | #include "core/hle/kernel/k_shared_memory.h" |
| 17 | #include "core/hle/kernel/k_transfer_memory.h" | ||
| 17 | #include "core/hle/kernel/k_system_control.h" | 18 | #include "core/hle/kernel/k_system_control.h" |
| 18 | #include "core/hle/kernel/k_thread.h" | 19 | #include "core/hle/kernel/k_thread.h" |
| 19 | #include "core/hle/kernel/memory_types.h" | 20 | #include "core/hle/kernel/memory_types.h" |
| @@ -28,6 +29,7 @@ namespace Kernel::Init { | |||
| 28 | HANDLER(Process, (SLAB_COUNT(Process)), ##__VA_ARGS__) \ | 29 | HANDLER(Process, (SLAB_COUNT(Process)), ##__VA_ARGS__) \ |
| 29 | HANDLER(KThread, (SLAB_COUNT(KThread)), ##__VA_ARGS__) \ | 30 | HANDLER(KThread, (SLAB_COUNT(KThread)), ##__VA_ARGS__) \ |
| 30 | HANDLER(KEvent, (SLAB_COUNT(KEvent)), ##__VA_ARGS__) \ | 31 | HANDLER(KEvent, (SLAB_COUNT(KEvent)), ##__VA_ARGS__) \ |
| 32 | HANDLER(KTransferMemory, (SLAB_COUNT(KTransferMemory)), ##__VA_ARGS__) \ | ||
| 31 | HANDLER(KSharedMemory, (SLAB_COUNT(KSharedMemory)), ##__VA_ARGS__) \ | 33 | HANDLER(KSharedMemory, (SLAB_COUNT(KSharedMemory)), ##__VA_ARGS__) \ |
| 32 | HANDLER(KSession, (SLAB_COUNT(KSession)), ##__VA_ARGS__) | 34 | HANDLER(KSession, (SLAB_COUNT(KSession)), ##__VA_ARGS__) |
| 33 | 35 | ||
diff --git a/src/core/hle/kernel/k_page_table.h b/src/core/hle/kernel/k_page_table.h index 49b824379..80a1586db 100644 --- a/src/core/hle/kernel/k_page_table.h +++ b/src/core/hle/kernel/k_page_table.h | |||
| @@ -216,8 +216,6 @@ public: | |||
| 216 | constexpr PAddr GetPhysicalAddr(VAddr addr) { | 216 | constexpr PAddr GetPhysicalAddr(VAddr addr) { |
| 217 | return page_table_impl.backing_addr[addr >> PageBits] + addr; | 217 | return page_table_impl.backing_addr[addr >> PageBits] + addr; |
| 218 | } | 218 | } |
| 219 | |||
| 220 | private: | ||
| 221 | constexpr bool Contains(VAddr addr) const { | 219 | constexpr bool Contains(VAddr addr) const { |
| 222 | return address_space_start <= addr && addr <= address_space_end - 1; | 220 | return address_space_start <= addr && addr <= address_space_end - 1; |
| 223 | } | 221 | } |
| @@ -225,6 +223,8 @@ private: | |||
| 225 | return address_space_start <= addr && addr < addr + size && | 223 | return address_space_start <= addr && addr < addr + size && |
| 226 | addr + size - 1 <= address_space_end - 1; | 224 | addr + size - 1 <= address_space_end - 1; |
| 227 | } | 225 | } |
| 226 | |||
| 227 | private: | ||
| 228 | constexpr bool IsKernel() const { | 228 | constexpr bool IsKernel() const { |
| 229 | return is_kernel; | 229 | return is_kernel; |
| 230 | } | 230 | } |
diff --git a/src/core/hle/kernel/k_transfer_memory.cpp b/src/core/hle/kernel/k_transfer_memory.cpp new file mode 100644 index 000000000..09c067f95 --- /dev/null +++ b/src/core/hle/kernel/k_transfer_memory.cpp | |||
| @@ -0,0 +1,45 @@ | |||
| 1 | // Copyright 2021 yuzu emulator team | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #include "core/hle/kernel/k_resource_limit.h" | ||
| 6 | #include "core/hle/kernel/k_transfer_memory.h" | ||
| 7 | #include "core/hle/kernel/kernel.h" | ||
| 8 | #include "core/hle/kernel/process.h" | ||
| 9 | |||
| 10 | namespace Kernel { | ||
| 11 | |||
| 12 | KTransferMemory::KTransferMemory(KernelCore& kernel) | ||
| 13 | : KAutoObjectWithSlabHeapAndContainer{kernel} {} | ||
| 14 | |||
| 15 | KTransferMemory::~KTransferMemory() = default; | ||
| 16 | |||
| 17 | ResultCode KTransferMemory::Initialize(VAddr address_, std::size_t size_, | ||
| 18 | Svc::MemoryPermission owner_perm_) { | ||
| 19 | // Set members. | ||
| 20 | owner = kernel.CurrentProcess(); | ||
| 21 | |||
| 22 | // TODO(bunnei): Lock for transfer memory | ||
| 23 | |||
| 24 | // Set remaining tracking members. | ||
| 25 | owner->Open(); | ||
| 26 | owner_perm = owner_perm_; | ||
| 27 | address = address_; | ||
| 28 | size = size_; | ||
| 29 | is_initialized = true; | ||
| 30 | |||
| 31 | return RESULT_SUCCESS; | ||
| 32 | } | ||
| 33 | |||
| 34 | void KTransferMemory::Finalize() { | ||
| 35 | // Perform inherited finalization. | ||
| 36 | KAutoObjectWithSlabHeapAndContainer<KTransferMemory, KAutoObjectWithList>::Finalize(); | ||
| 37 | } | ||
| 38 | |||
| 39 | void KTransferMemory::PostDestroy(uintptr_t arg) { | ||
| 40 | Process* owner = reinterpret_cast<Process*>(arg); | ||
| 41 | owner->GetResourceLimit()->Release(LimitableResource::TransferMemory, 1); | ||
| 42 | owner->Close(); | ||
| 43 | } | ||
| 44 | |||
| 45 | } // namespace Kernel | ||
diff --git a/src/core/hle/kernel/k_transfer_memory.h b/src/core/hle/kernel/k_transfer_memory.h new file mode 100644 index 000000000..f43725c7f --- /dev/null +++ b/src/core/hle/kernel/k_transfer_memory.h | |||
| @@ -0,0 +1,82 @@ | |||
| 1 | // Copyright 2021 yuzu emulator team | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | #include <memory> | ||
| 8 | |||
| 9 | #include "core/hle/kernel/slab_helpers.h" | ||
| 10 | #include "core/hle/kernel/svc_types.h" | ||
| 11 | #include "core/hle/result.h" | ||
| 12 | |||
| 13 | union ResultCode; | ||
| 14 | |||
| 15 | namespace Core::Memory { | ||
| 16 | class Memory; | ||
| 17 | } | ||
| 18 | |||
| 19 | namespace Kernel { | ||
| 20 | |||
| 21 | class KernelCore; | ||
| 22 | class Process; | ||
| 23 | |||
| 24 | class KTransferMemory final | ||
| 25 | : public KAutoObjectWithSlabHeapAndContainer<KTransferMemory, KAutoObjectWithList> { | ||
| 26 | KERNEL_AUTOOBJECT_TRAITS(KTransferMemory, KAutoObject); | ||
| 27 | |||
| 28 | public: | ||
| 29 | explicit KTransferMemory(KernelCore& kernel); | ||
| 30 | ~KTransferMemory() override; | ||
| 31 | |||
| 32 | static constexpr HandleType HANDLE_TYPE = HandleType::TransferMemory; | ||
| 33 | |||
| 34 | ResultCode Initialize(VAddr address_, std::size_t size_, Svc::MemoryPermission owner_perm_); | ||
| 35 | |||
| 36 | virtual void Finalize() override; | ||
| 37 | |||
| 38 | virtual bool IsInitialized() const override { | ||
| 39 | return is_initialized; | ||
| 40 | } | ||
| 41 | |||
| 42 | virtual uintptr_t GetPostDestroyArgument() const override { | ||
| 43 | return reinterpret_cast<uintptr_t>(owner); | ||
| 44 | } | ||
| 45 | |||
| 46 | static void PostDestroy(uintptr_t arg); | ||
| 47 | |||
| 48 | Process* GetOwner() const { | ||
| 49 | return owner; | ||
| 50 | } | ||
| 51 | |||
| 52 | VAddr GetSourceAddress() const { | ||
| 53 | return address; | ||
| 54 | } | ||
| 55 | |||
| 56 | size_t GetSize() const { | ||
| 57 | return is_initialized ? size * PageSize : 0; | ||
| 58 | } | ||
| 59 | |||
| 60 | // DEPRECATED | ||
| 61 | |||
| 62 | std::string GetTypeName() const override { | ||
| 63 | return "TransferMemory"; | ||
| 64 | } | ||
| 65 | |||
| 66 | std::string GetName() const override { | ||
| 67 | return GetTypeName(); | ||
| 68 | } | ||
| 69 | |||
| 70 | HandleType GetHandleType() const override { | ||
| 71 | return HANDLE_TYPE; | ||
| 72 | } | ||
| 73 | |||
| 74 | private: | ||
| 75 | Process* owner{}; | ||
| 76 | VAddr address{}; | ||
| 77 | Svc::MemoryPermission owner_perm{}; | ||
| 78 | size_t size{}; | ||
| 79 | bool is_initialized{}; | ||
| 80 | }; | ||
| 81 | |||
| 82 | } // namespace Kernel | ||
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h index ecced1034..f07f0276e 100644 --- a/src/core/hle/kernel/kernel.h +++ b/src/core/hle/kernel/kernel.h | |||
| @@ -42,6 +42,7 @@ class KScheduler; | |||
| 42 | class KSession; | 42 | class KSession; |
| 43 | class KSharedMemory; | 43 | class KSharedMemory; |
| 44 | class KThread; | 44 | class KThread; |
| 45 | class KTransferMemory; | ||
| 45 | class KWritableEvent; | 46 | class KWritableEvent; |
| 46 | class PhysicalCore; | 47 | class PhysicalCore; |
| 47 | class Process; | 48 | class Process; |
| @@ -278,6 +279,8 @@ public: | |||
| 278 | return slab_heap_container->client_session; | 279 | return slab_heap_container->client_session; |
| 279 | } else if constexpr (std::is_same_v<T, KSession>) { | 280 | } else if constexpr (std::is_same_v<T, KSession>) { |
| 280 | return slab_heap_container->session; | 281 | return slab_heap_container->session; |
| 282 | } else if constexpr (std::is_same_v<T, KTransferMemory>) { | ||
| 283 | return slab_heap_container->transfer_memory; | ||
| 281 | } | 284 | } |
| 282 | } | 285 | } |
| 283 | 286 | ||
| @@ -320,6 +323,7 @@ private: | |||
| 320 | KSlabHeap<KWritableEvent> writeable_event; | 323 | KSlabHeap<KWritableEvent> writeable_event; |
| 321 | KSlabHeap<KClientSession> client_session; | 324 | KSlabHeap<KClientSession> client_session; |
| 322 | KSlabHeap<KSession> session; | 325 | KSlabHeap<KSession> session; |
| 326 | KSlabHeap<KTransferMemory> transfer_memory; | ||
| 323 | }; | 327 | }; |
| 324 | 328 | ||
| 325 | std::unique_ptr<SlabHeapContainer> slab_heap_container; | 329 | std::unique_ptr<SlabHeapContainer> slab_heap_container; |
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 28c45e8a3..0b7eb0740 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -38,6 +38,7 @@ | |||
| 38 | #include "core/hle/kernel/k_shared_memory.h" | 38 | #include "core/hle/kernel/k_shared_memory.h" |
| 39 | #include "core/hle/kernel/k_synchronization_object.h" | 39 | #include "core/hle/kernel/k_synchronization_object.h" |
| 40 | #include "core/hle/kernel/k_thread.h" | 40 | #include "core/hle/kernel/k_thread.h" |
| 41 | #include "core/hle/kernel/k_transfer_memory.h" | ||
| 41 | #include "core/hle/kernel/k_writable_event.h" | 42 | #include "core/hle/kernel/k_writable_event.h" |
| 42 | #include "core/hle/kernel/kernel.h" | 43 | #include "core/hle/kernel/kernel.h" |
| 43 | #include "core/hle/kernel/physical_core.h" | 44 | #include "core/hle/kernel/physical_core.h" |
| @@ -47,7 +48,6 @@ | |||
| 47 | #include "core/hle/kernel/svc_types.h" | 48 | #include "core/hle/kernel/svc_types.h" |
| 48 | #include "core/hle/kernel/svc_wrap.h" | 49 | #include "core/hle/kernel/svc_wrap.h" |
| 49 | #include "core/hle/kernel/time_manager.h" | 50 | #include "core/hle/kernel/time_manager.h" |
| 50 | #include "core/hle/kernel/transfer_memory.h" | ||
| 51 | #include "core/hle/lock.h" | 51 | #include "core/hle/lock.h" |
| 52 | #include "core/hle/result.h" | 52 | #include "core/hle/result.h" |
| 53 | #include "core/hle/service/service.h" | 53 | #include "core/hle/service/service.h" |
| @@ -1868,65 +1868,68 @@ static ResultCode ResetSignal32(Core::System& system, Handle handle) { | |||
| 1868 | return ResetSignal(system, handle); | 1868 | return ResetSignal(system, handle); |
| 1869 | } | 1869 | } |
| 1870 | 1870 | ||
| 1871 | /// Creates a TransferMemory object | 1871 | static constexpr bool IsValidTransferMemoryPermission(MemoryPermission perm) { |
| 1872 | static ResultCode CreateTransferMemory(Core::System& system, Handle* handle, VAddr addr, u64 size, | 1872 | switch (perm) { |
| 1873 | u32 permissions) { | 1873 | case MemoryPermission::None: |
| 1874 | std::lock_guard lock{HLE::g_hle_lock}; | 1874 | case MemoryPermission::Read: |
| 1875 | LOG_DEBUG(Kernel_SVC, "called addr=0x{:X}, size=0x{:X}, perms=0x{:08X}", addr, size, | 1875 | case MemoryPermission::ReadWrite: |
| 1876 | permissions); | 1876 | return true; |
| 1877 | 1877 | default: | |
| 1878 | if (!Common::Is4KBAligned(addr)) { | 1878 | return false; |
| 1879 | LOG_ERROR(Kernel_SVC, "Address ({:016X}) is not page aligned!", addr); | ||
| 1880 | return ResultInvalidAddress; | ||
| 1881 | } | 1879 | } |
| 1880 | } | ||
| 1882 | 1881 | ||
| 1883 | if (!Common::Is4KBAligned(size) || size == 0) { | 1882 | /// Creates a TransferMemory object |
| 1884 | LOG_ERROR(Kernel_SVC, "Size ({:016X}) is not page aligned or equal to zero!", size); | 1883 | static ResultCode CreateTransferMemory(Core::System& system, Handle* out, VAddr address, u64 size, |
| 1885 | return ResultInvalidAddress; | 1884 | MemoryPermission map_perm) { |
| 1886 | } | 1885 | auto& kernel = system.Kernel(); |
| 1887 | 1886 | ||
| 1888 | if (!IsValidAddressRange(addr, size)) { | 1887 | // Validate the size. |
| 1889 | LOG_ERROR(Kernel_SVC, "Address and size cause overflow! (address={:016X}, size={:016X})", | 1888 | R_UNLESS(Common::IsAligned(address, PageSize), ResultInvalidAddress); |
| 1890 | addr, size); | 1889 | R_UNLESS(Common::IsAligned(size, PageSize), ResultInvalidSize); |
| 1891 | return ResultInvalidCurrentMemory; | 1890 | R_UNLESS(size > 0, ResultInvalidSize); |
| 1892 | } | 1891 | R_UNLESS((address < address + size), ResultInvalidCurrentMemory); |
| 1893 | 1892 | ||
| 1894 | const auto perms{static_cast<MemoryPermission>(permissions)}; | 1893 | // Validate the permissions. |
| 1895 | if (perms > MemoryPermission::ReadWrite || perms == MemoryPermission::Write) { | 1894 | R_UNLESS(IsValidTransferMemoryPermission(map_perm), ResultInvalidNewMemoryPermission); |
| 1896 | LOG_ERROR(Kernel_SVC, "Invalid memory permissions for transfer memory! (perms={:08X})", | 1895 | |
| 1897 | permissions); | 1896 | // Get the current process and handle table. |
| 1898 | return ResultInvalidNewMemoryPermission; | 1897 | auto& process = *kernel.CurrentProcess(); |
| 1899 | } | 1898 | auto& handle_table = process.GetHandleTable(); |
| 1900 | 1899 | ||
| 1901 | auto& kernel = system.Kernel(); | ||
| 1902 | // Reserve a new transfer memory from the process resource limit. | 1900 | // Reserve a new transfer memory from the process resource limit. |
| 1903 | KScopedResourceReservation trmem_reservation(kernel.CurrentProcess(), | 1901 | KScopedResourceReservation trmem_reservation(kernel.CurrentProcess(), |
| 1904 | LimitableResource::TransferMemory); | 1902 | LimitableResource::TransferMemory); |
| 1905 | if (!trmem_reservation.Succeeded()) { | 1903 | R_UNLESS(trmem_reservation.Succeeded(), ResultLimitReached); |
| 1906 | LOG_ERROR(Kernel_SVC, "Could not reserve a new transfer memory"); | ||
| 1907 | return ResultLimitReached; | ||
| 1908 | } | ||
| 1909 | auto transfer_mem_handle = TransferMemory::Create(kernel, system.Memory(), addr, size, | ||
| 1910 | static_cast<KMemoryPermission>(perms)); | ||
| 1911 | 1904 | ||
| 1912 | if (const auto reserve_result{transfer_mem_handle->Reserve()}; reserve_result.IsError()) { | 1905 | // Create the transfer memory. |
| 1913 | return reserve_result; | 1906 | KTransferMemory* trmem = KTransferMemory::Create(kernel); |
| 1914 | } | 1907 | R_UNLESS(trmem != nullptr, ResultOutOfResource); |
| 1915 | 1908 | ||
| 1916 | auto& handle_table = kernel.CurrentProcess()->GetHandleTable(); | 1909 | // Ensure the only reference is in the handle table when we're done. |
| 1917 | const auto result{handle_table.Create(transfer_mem_handle.get())}; | 1910 | SCOPE_EXIT({ trmem->Close(); }); |
| 1918 | if (result.Failed()) { | 1911 | |
| 1919 | return result.Code(); | 1912 | // Ensure that the region is in range. |
| 1920 | } | 1913 | R_UNLESS(process.PageTable().Contains(address, size), ResultInvalidCurrentMemory); |
| 1914 | |||
| 1915 | // Initialize the transfer memory. | ||
| 1916 | R_TRY(trmem->Initialize(address, size, map_perm)); | ||
| 1917 | |||
| 1918 | // Commit the reservation. | ||
| 1921 | trmem_reservation.Commit(); | 1919 | trmem_reservation.Commit(); |
| 1922 | 1920 | ||
| 1923 | *handle = *result; | 1921 | // Register the transfer memory. |
| 1922 | KTransferMemory::Register(kernel, trmem); | ||
| 1923 | |||
| 1924 | // Add the transfer memory to the handle table. | ||
| 1925 | R_TRY(handle_table.Add(out, trmem)); | ||
| 1926 | |||
| 1924 | return RESULT_SUCCESS; | 1927 | return RESULT_SUCCESS; |
| 1925 | } | 1928 | } |
| 1926 | 1929 | ||
| 1927 | static ResultCode CreateTransferMemory32(Core::System& system, Handle* handle, u32 addr, u32 size, | 1930 | static ResultCode CreateTransferMemory32(Core::System& system, Handle* out, u32 address, u32 size, |
| 1928 | u32 permissions) { | 1931 | MemoryPermission map_perm) { |
| 1929 | return CreateTransferMemory(system, handle, addr, size, permissions); | 1932 | return CreateTransferMemory(system, out, address, size, map_perm); |
| 1930 | } | 1933 | } |
| 1931 | 1934 | ||
| 1932 | static ResultCode GetThreadCoreMask(Core::System& system, Handle thread_handle, s32* out_core_id, | 1935 | static ResultCode GetThreadCoreMask(Core::System& system, Handle thread_handle, s32* out_core_id, |
diff --git a/src/core/hle/kernel/svc_wrap.h b/src/core/hle/kernel/svc_wrap.h index 96afd544b..819eadfbb 100644 --- a/src/core/hle/kernel/svc_wrap.h +++ b/src/core/hle/kernel/svc_wrap.h | |||
| @@ -273,11 +273,12 @@ void SvcWrap64(Core::System& system) { | |||
| 273 | FuncReturn(system, retval); | 273 | FuncReturn(system, retval); |
| 274 | } | 274 | } |
| 275 | 275 | ||
| 276 | template <ResultCode func(Core::System&, u32*, u64, u64, u32)> | 276 | // Used by CreateTransferMemory |
| 277 | template <ResultCode func(Core::System&, Handle*, u64, u64, Svc::MemoryPermission)> | ||
| 277 | void SvcWrap64(Core::System& system) { | 278 | void SvcWrap64(Core::System& system) { |
| 278 | u32 param_1 = 0; | 279 | u32 param_1 = 0; |
| 279 | const u32 retval = func(system, ¶m_1, Param(system, 1), Param(system, 2), | 280 | const u32 retval = func(system, ¶m_1, Param(system, 1), Param(system, 2), |
| 280 | static_cast<u32>(Param(system, 3))) | 281 | static_cast<Svc::MemoryPermission>(Param(system, 3))) |
| 281 | .raw; | 282 | .raw; |
| 282 | 283 | ||
| 283 | system.CurrentArmInterface().SetReg(1, param_1); | 284 | system.CurrentArmInterface().SetReg(1, param_1); |
| @@ -586,11 +587,12 @@ void SvcWrap32(Core::System& system) { | |||
| 586 | } | 587 | } |
| 587 | 588 | ||
| 588 | // Used by CreateTransferMemory32 | 589 | // Used by CreateTransferMemory32 |
| 589 | template <ResultCode func(Core::System&, Handle*, u32, u32, u32)> | 590 | template <ResultCode func(Core::System&, Handle*, u32, u32, Svc::MemoryPermission)> |
| 590 | void SvcWrap32(Core::System& system) { | 591 | void SvcWrap32(Core::System& system) { |
| 591 | Handle handle = 0; | 592 | Handle handle = 0; |
| 592 | const u32 retval = | 593 | const u32 retval = func(system, &handle, Param32(system, 1), Param32(system, 2), |
| 593 | func(system, &handle, Param32(system, 1), Param32(system, 2), Param32(system, 3)).raw; | 594 | static_cast<Svc::MemoryPermission>(Param32(system, 3))) |
| 595 | .raw; | ||
| 594 | system.CurrentArmInterface().SetReg(1, handle); | 596 | system.CurrentArmInterface().SetReg(1, handle); |
| 595 | FuncReturn(system, retval); | 597 | FuncReturn(system, retval); |
| 596 | } | 598 | } |
diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index 937020a6e..47d194119 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp | |||
| @@ -16,10 +16,10 @@ | |||
| 16 | #include "core/hle/ipc_helpers.h" | 16 | #include "core/hle/ipc_helpers.h" |
| 17 | #include "core/hle/kernel/k_event.h" | 17 | #include "core/hle/kernel/k_event.h" |
| 18 | #include "core/hle/kernel/k_readable_event.h" | 18 | #include "core/hle/kernel/k_readable_event.h" |
| 19 | #include "core/hle/kernel/k_transfer_memory.h" | ||
| 19 | #include "core/hle/kernel/k_writable_event.h" | 20 | #include "core/hle/kernel/k_writable_event.h" |
| 20 | #include "core/hle/kernel/kernel.h" | 21 | #include "core/hle/kernel/kernel.h" |
| 21 | #include "core/hle/kernel/process.h" | 22 | #include "core/hle/kernel/process.h" |
| 22 | #include "core/hle/kernel/transfer_memory.h" | ||
| 23 | #include "core/hle/service/acc/profile_manager.h" | 23 | #include "core/hle/service/acc/profile_manager.h" |
| 24 | #include "core/hle/service/am/am.h" | 24 | #include "core/hle/service/am/am.h" |
| 25 | #include "core/hle/service/am/applet_ae.h" | 25 | #include "core/hle/service/am/applet_ae.h" |
| @@ -42,6 +42,7 @@ | |||
| 42 | #include "core/hle/service/set/set.h" | 42 | #include "core/hle/service/set/set.h" |
| 43 | #include "core/hle/service/sm/sm.h" | 43 | #include "core/hle/service/sm/sm.h" |
| 44 | #include "core/hle/service/vi/vi.h" | 44 | #include "core/hle/service/vi/vi.h" |
| 45 | #include "core/memory.h" | ||
| 45 | 46 | ||
| 46 | namespace Service::AM { | 47 | namespace Service::AM { |
| 47 | 48 | ||
| @@ -1248,16 +1249,16 @@ void ILibraryAppletCreator::CreateHandleStorage(Kernel::HLERequestContext& ctx) | |||
| 1248 | } | 1249 | } |
| 1249 | 1250 | ||
| 1250 | auto transfer_mem = | 1251 | auto transfer_mem = |
| 1251 | system.CurrentProcess()->GetHandleTable().Get<Kernel::TransferMemory>(handle); | 1252 | system.CurrentProcess()->GetHandleTable().GetObject<Kernel::KTransferMemory>(handle); |
| 1252 | 1253 | ||
| 1253 | if (transfer_mem == nullptr) { | 1254 | if (transfer_mem.IsNull()) { |
| 1254 | LOG_ERROR(Service_AM, "transfer_mem is a nullptr for handle={:08X}", handle); | 1255 | LOG_ERROR(Service_AM, "transfer_mem is a nullptr for handle={:08X}", handle); |
| 1255 | IPC::ResponseBuilder rb{ctx, 2}; | 1256 | IPC::ResponseBuilder rb{ctx, 2}; |
| 1256 | rb.Push(RESULT_UNKNOWN); | 1257 | rb.Push(RESULT_UNKNOWN); |
| 1257 | return; | 1258 | return; |
| 1258 | } | 1259 | } |
| 1259 | 1260 | ||
| 1260 | const u8* const mem_begin = transfer_mem->GetPointer(); | 1261 | const u8* const mem_begin = system.Memory().GetPointer(transfer_mem->GetSourceAddress()); |
| 1261 | const u8* const mem_end = mem_begin + transfer_mem->GetSize(); | 1262 | const u8* const mem_end = mem_begin + transfer_mem->GetSize(); |
| 1262 | std::vector<u8> memory{mem_begin, mem_end}; | 1263 | std::vector<u8> memory{mem_begin, mem_end}; |
| 1263 | 1264 | ||
diff --git a/src/core/hle/service/am/am.h b/src/core/hle/service/am/am.h index fbac7b2cf..184030a8e 100644 --- a/src/core/hle/service/am/am.h +++ b/src/core/hle/service/am/am.h | |||
| @@ -13,7 +13,7 @@ | |||
| 13 | 13 | ||
| 14 | namespace Kernel { | 14 | namespace Kernel { |
| 15 | class KernelCore; | 15 | class KernelCore; |
| 16 | class TransferMemory; | 16 | class KTransferMemory; |
| 17 | } // namespace Kernel | 17 | } // namespace Kernel |
| 18 | 18 | ||
| 19 | namespace Service::NVFlinger { | 19 | namespace Service::NVFlinger { |
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index 6b3ebeb8f..d831aa214 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp | |||
| @@ -16,14 +16,15 @@ | |||
| 16 | #include "core/hle/kernel/client_port.h" | 16 | #include "core/hle/kernel/client_port.h" |
| 17 | #include "core/hle/kernel/k_readable_event.h" | 17 | #include "core/hle/kernel/k_readable_event.h" |
| 18 | #include "core/hle/kernel/k_shared_memory.h" | 18 | #include "core/hle/kernel/k_shared_memory.h" |
| 19 | #include "core/hle/kernel/k_transfer_memory.h" | ||
| 19 | #include "core/hle/kernel/k_writable_event.h" | 20 | #include "core/hle/kernel/k_writable_event.h" |
| 20 | #include "core/hle/kernel/kernel.h" | 21 | #include "core/hle/kernel/kernel.h" |
| 21 | #include "core/hle/kernel/transfer_memory.h" | ||
| 22 | #include "core/hle/service/hid/errors.h" | 22 | #include "core/hle/service/hid/errors.h" |
| 23 | #include "core/hle/service/hid/hid.h" | 23 | #include "core/hle/service/hid/hid.h" |
| 24 | #include "core/hle/service/hid/irs.h" | 24 | #include "core/hle/service/hid/irs.h" |
| 25 | #include "core/hle/service/hid/xcd.h" | 25 | #include "core/hle/service/hid/xcd.h" |
| 26 | #include "core/hle/service/service.h" | 26 | #include "core/hle/service/service.h" |
| 27 | #include "core/memory.h" | ||
| 27 | 28 | ||
| 28 | #include "core/hle/service/hid/controllers/console_sixaxis.h" | 29 | #include "core/hle/service/hid/controllers/console_sixaxis.h" |
| 29 | #include "core/hle/service/hid/controllers/controller_base.h" | 30 | #include "core/hle/service/hid/controllers/controller_base.h" |
| @@ -1493,20 +1494,20 @@ void Hid::InitializeSevenSixAxisSensor(Kernel::HLERequestContext& ctx) { | |||
| 1493 | ASSERT_MSG(t_mem_1_size == 0x1000, "t_mem_1_size is not 0x1000 bytes"); | 1494 | ASSERT_MSG(t_mem_1_size == 0x1000, "t_mem_1_size is not 0x1000 bytes"); |
| 1494 | ASSERT_MSG(t_mem_2_size == 0x7F000, "t_mem_2_size is not 0x7F000 bytes"); | 1495 | ASSERT_MSG(t_mem_2_size == 0x7F000, "t_mem_2_size is not 0x7F000 bytes"); |
| 1495 | 1496 | ||
| 1496 | auto t_mem_1 = | 1497 | auto t_mem_1 = system.CurrentProcess()->GetHandleTable().GetObject<Kernel::KTransferMemory>( |
| 1497 | system.CurrentProcess()->GetHandleTable().Get<Kernel::TransferMemory>(t_mem_1_handle); | 1498 | t_mem_1_handle); |
| 1498 | 1499 | ||
| 1499 | if (t_mem_1 == nullptr) { | 1500 | if (t_mem_1.IsNull()) { |
| 1500 | LOG_ERROR(Service_HID, "t_mem_1 is a nullptr for handle=0x{:08X}", t_mem_1_handle); | 1501 | LOG_ERROR(Service_HID, "t_mem_1 is a nullptr for handle=0x{:08X}", t_mem_1_handle); |
| 1501 | IPC::ResponseBuilder rb{ctx, 2}; | 1502 | IPC::ResponseBuilder rb{ctx, 2}; |
| 1502 | rb.Push(RESULT_UNKNOWN); | 1503 | rb.Push(RESULT_UNKNOWN); |
| 1503 | return; | 1504 | return; |
| 1504 | } | 1505 | } |
| 1505 | 1506 | ||
| 1506 | auto t_mem_2 = | 1507 | auto t_mem_2 = system.CurrentProcess()->GetHandleTable().GetObject<Kernel::KTransferMemory>( |
| 1507 | system.CurrentProcess()->GetHandleTable().Get<Kernel::TransferMemory>(t_mem_2_handle); | 1508 | t_mem_2_handle); |
| 1508 | 1509 | ||
| 1509 | if (t_mem_2 == nullptr) { | 1510 | if (t_mem_2.IsNull()) { |
| 1510 | LOG_ERROR(Service_HID, "t_mem_2 is a nullptr for handle=0x{:08X}", t_mem_2_handle); | 1511 | LOG_ERROR(Service_HID, "t_mem_2 is a nullptr for handle=0x{:08X}", t_mem_2_handle); |
| 1511 | IPC::ResponseBuilder rb{ctx, 2}; | 1512 | IPC::ResponseBuilder rb{ctx, 2}; |
| 1512 | rb.Push(RESULT_UNKNOWN); | 1513 | rb.Push(RESULT_UNKNOWN); |
| @@ -1521,7 +1522,7 @@ void Hid::InitializeSevenSixAxisSensor(Kernel::HLERequestContext& ctx) { | |||
| 1521 | .ActivateController(); | 1522 | .ActivateController(); |
| 1522 | 1523 | ||
| 1523 | applet_resource->GetController<Controller_ConsoleSixAxis>(HidController::ConsoleSixAxisSensor) | 1524 | applet_resource->GetController<Controller_ConsoleSixAxis>(HidController::ConsoleSixAxisSensor) |
| 1524 | .SetTransferMemoryPointer(t_mem_1->GetPointer()); | 1525 | .SetTransferMemoryPointer(system.Memory().GetPointer(t_mem_1->GetSourceAddress())); |
| 1525 | 1526 | ||
| 1526 | LOG_WARNING(Service_HID, | 1527 | LOG_WARNING(Service_HID, |
| 1527 | "called, t_mem_1_handle=0x{:08X}, t_mem_2_handle=0x{:08X}, " | 1528 | "called, t_mem_1_handle=0x{:08X}, t_mem_2_handle=0x{:08X}, " |