diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/core/core.vcxproj | 2 | ||||
| -rw-r--r-- | src/core/core.vcxproj.filters | 6 | ||||
| -rw-r--r-- | src/core/hle/kernel/shared_memory.cpp | 94 | ||||
| -rw-r--r-- | src/core/hle/kernel/shared_memory.h | 38 |
5 files changed, 142 insertions, 0 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 9ee803fda..0d3189d29 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt | |||
| @@ -38,6 +38,7 @@ set(SRCS core.cpp | |||
| 38 | hle/kernel/event.cpp | 38 | hle/kernel/event.cpp |
| 39 | hle/kernel/kernel.cpp | 39 | hle/kernel/kernel.cpp |
| 40 | hle/kernel/mutex.cpp | 40 | hle/kernel/mutex.cpp |
| 41 | hle/kernel/shared_memory.cpp | ||
| 41 | hle/kernel/thread.cpp | 42 | hle/kernel/thread.cpp |
| 42 | hle/service/apt.cpp | 43 | hle/service/apt.cpp |
| 43 | hle/service/fs.cpp | 44 | hle/service/fs.cpp |
| @@ -85,6 +86,7 @@ set(HEADERS core.h | |||
| 85 | hle/kernel/archive.h | 86 | hle/kernel/archive.h |
| 86 | hle/kernel/kernel.h | 87 | hle/kernel/kernel.h |
| 87 | hle/kernel/mutex.h | 88 | hle/kernel/mutex.h |
| 89 | hle/kernel/shared_memory.h | ||
| 88 | hle/kernel/thread.h | 90 | hle/kernel/thread.h |
| 89 | hle/function_wrappers.h | 91 | hle/function_wrappers.h |
| 90 | hle/service/apt.h | 92 | hle/service/apt.h |
diff --git a/src/core/core.vcxproj b/src/core/core.vcxproj index 4e521903c..a09a4a1f1 100644 --- a/src/core/core.vcxproj +++ b/src/core/core.vcxproj | |||
| @@ -170,6 +170,7 @@ | |||
| 170 | <ClCompile Include="hle\kernel\event.cpp" /> | 170 | <ClCompile Include="hle\kernel\event.cpp" /> |
| 171 | <ClCompile Include="hle\kernel\kernel.cpp" /> | 171 | <ClCompile Include="hle\kernel\kernel.cpp" /> |
| 172 | <ClCompile Include="hle\kernel\mutex.cpp" /> | 172 | <ClCompile Include="hle\kernel\mutex.cpp" /> |
| 173 | <ClCompile Include="hle\kernel\shared_memory.cpp" /> | ||
| 173 | <ClCompile Include="hle\kernel\thread.cpp" /> | 174 | <ClCompile Include="hle\kernel\thread.cpp" /> |
| 174 | <ClCompile Include="hle\service\apt.cpp" /> | 175 | <ClCompile Include="hle\service\apt.cpp" /> |
| 175 | <ClCompile Include="hle\service\fs.cpp" /> | 176 | <ClCompile Include="hle\service\fs.cpp" /> |
| @@ -222,6 +223,7 @@ | |||
| 222 | <ClInclude Include="hle\kernel\event.h" /> | 223 | <ClInclude Include="hle\kernel\event.h" /> |
| 223 | <ClInclude Include="hle\kernel\kernel.h" /> | 224 | <ClInclude Include="hle\kernel\kernel.h" /> |
| 224 | <ClInclude Include="hle\kernel\mutex.h" /> | 225 | <ClInclude Include="hle\kernel\mutex.h" /> |
| 226 | <ClInclude Include="hle\kernel\shared_memory.h" /> | ||
| 225 | <ClInclude Include="hle\kernel\thread.h" /> | 227 | <ClInclude Include="hle\kernel\thread.h" /> |
| 226 | <ClInclude Include="hle\service\apt.h" /> | 228 | <ClInclude Include="hle\service\apt.h" /> |
| 227 | <ClInclude Include="hle\service\fs.h" /> | 229 | <ClInclude Include="hle\service\fs.h" /> |
diff --git a/src/core/core.vcxproj.filters b/src/core/core.vcxproj.filters index 17829b8b1..7e6a7f91b 100644 --- a/src/core/core.vcxproj.filters +++ b/src/core/core.vcxproj.filters | |||
| @@ -179,6 +179,9 @@ | |||
| 179 | <ClCompile Include="file_sys\archive_romfs.cpp"> | 179 | <ClCompile Include="file_sys\archive_romfs.cpp"> |
| 180 | <Filter>file_sys</Filter> | 180 | <Filter>file_sys</Filter> |
| 181 | </ClCompile> | 181 | </ClCompile> |
| 182 | <ClCompile Include="hle\kernel\shared_memory.cpp"> | ||
| 183 | <Filter>hle\kernel</Filter> | ||
| 184 | </ClCompile> | ||
| 182 | </ItemGroup> | 185 | </ItemGroup> |
| 183 | <ItemGroup> | 186 | <ItemGroup> |
| 184 | <ClInclude Include="arm\disassembler\arm_disasm.h"> | 187 | <ClInclude Include="arm\disassembler\arm_disasm.h"> |
| @@ -320,6 +323,9 @@ | |||
| 320 | <ClInclude Include="file_sys\archive_romfs.h"> | 323 | <ClInclude Include="file_sys\archive_romfs.h"> |
| 321 | <Filter>file_sys</Filter> | 324 | <Filter>file_sys</Filter> |
| 322 | </ClInclude> | 325 | </ClInclude> |
| 326 | <ClInclude Include="hle\kernel\shared_memory.h"> | ||
| 327 | <Filter>hle\kernel</Filter> | ||
| 328 | </ClInclude> | ||
| 323 | </ItemGroup> | 329 | </ItemGroup> |
| 324 | <ItemGroup> | 330 | <ItemGroup> |
| 325 | <Text Include="CMakeLists.txt" /> | 331 | <Text Include="CMakeLists.txt" /> |
diff --git a/src/core/hle/kernel/shared_memory.cpp b/src/core/hle/kernel/shared_memory.cpp new file mode 100644 index 000000000..3030d66fa --- /dev/null +++ b/src/core/hle/kernel/shared_memory.cpp | |||
| @@ -0,0 +1,94 @@ | |||
| 1 | // Copyright 2014 Citra Emulator Project | ||
| 2 | // Licensed under GPLv2 | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #include "common/common.h" | ||
| 6 | |||
| 7 | #include "core/mem_map.h" | ||
| 8 | #include "core/hle/kernel/shared_memory.h" | ||
| 9 | |||
| 10 | namespace Kernel { | ||
| 11 | |||
| 12 | class SharedMemory : public Object { | ||
| 13 | public: | ||
| 14 | const char* GetTypeName() const { return "SharedMemory"; } | ||
| 15 | |||
| 16 | static Kernel::HandleType GetStaticHandleType() { return Kernel::HandleType::SharedMemory; } | ||
| 17 | Kernel::HandleType GetHandleType() const { return Kernel::HandleType::SharedMemory; } | ||
| 18 | |||
| 19 | /** | ||
| 20 | * Wait for kernel object to synchronize | ||
| 21 | * @param wait Boolean wait set if current thread should wait as a result of sync operation | ||
| 22 | * @return Result of operation, 0 on success, otherwise error code | ||
| 23 | */ | ||
| 24 | Result WaitSynchronization(bool* wait) { | ||
| 25 | // TODO(bunnei): ImplementMe | ||
| 26 | ERROR_LOG(OSHLE, "(UNIMPLEMENTED)"); | ||
| 27 | return 0; | ||
| 28 | } | ||
| 29 | |||
| 30 | u32 base_address; ///< Address of shared memory block in RAM | ||
| 31 | u32 permissions; ///< Permissions of shared memory block (specified by SVC field) | ||
| 32 | u32 other_permissions; ///< Other permissions of shared memory block (specified by SVC field) | ||
| 33 | std::string name; ///< Name of shared memory object (optional) | ||
| 34 | }; | ||
| 35 | |||
| 36 | //////////////////////////////////////////////////////////////////////////////////////////////////// | ||
| 37 | |||
| 38 | /** | ||
| 39 | * Creates a shared memory object | ||
| 40 | * @param handle Handle of newly created shared memory object | ||
| 41 | * @param name Name of shared memory object | ||
| 42 | * @return Pointer to newly created shared memory object | ||
| 43 | */ | ||
| 44 | SharedMemory* CreateSharedMemory(Handle& handle, const std::string& name) { | ||
| 45 | SharedMemory* shared_memory = new SharedMemory; | ||
| 46 | handle = Kernel::g_object_pool.Create(shared_memory); | ||
| 47 | shared_memory->name = name; | ||
| 48 | return shared_memory; | ||
| 49 | } | ||
| 50 | |||
| 51 | /** | ||
| 52 | * Creates a shared memory object | ||
| 53 | * @param name Optional name of shared memory object | ||
| 54 | * @return Handle of newly created shared memory object | ||
| 55 | */ | ||
| 56 | Handle CreateSharedMemory(const std::string& name) { | ||
| 57 | Handle handle; | ||
| 58 | CreateSharedMemory(handle, name); | ||
| 59 | return handle; | ||
| 60 | } | ||
| 61 | |||
| 62 | /** | ||
| 63 | * Maps a shared memory block to an address in system memory | ||
| 64 | * @param handle Shared memory block handle | ||
| 65 | * @param address Address in system memory to map shared memory block to | ||
| 66 | * @param permissions Memory block map permissions (specified by SVC field) | ||
| 67 | * @param other_permissions Memory block map other permissions (specified by SVC field) | ||
| 68 | * @return Result of operation, 0 on success, otherwise error code | ||
| 69 | */ | ||
| 70 | Result MapSharedMemory(u32 handle, u32 address, u32 permissions, u32 other_permissions) { | ||
| 71 | SharedMemory* shared_memory = Kernel::g_object_pool.GetFast<SharedMemory>(handle); | ||
| 72 | shared_memory->base_address = address; | ||
| 73 | shared_memory->permissions = permissions; | ||
| 74 | shared_memory->other_permissions = other_permissions; | ||
| 75 | return 0; | ||
| 76 | } | ||
| 77 | |||
| 78 | /** | ||
| 79 | * Gets a pointer to the shared memory block | ||
| 80 | * @param handle Shared memory block handle | ||
| 81 | * @param offset Offset from the start of the shared memory block to get pointer | ||
| 82 | * @return Pointer to the shared memory block from the specified offset | ||
| 83 | */ | ||
| 84 | u8* GetSharedMemoryPointer(Handle handle, u32 offset) { | ||
| 85 | SharedMemory* shared_memory = Kernel::g_object_pool.GetFast<SharedMemory>(handle); | ||
| 86 | _assert_msg_(KERNEL, (shared_memory != nullptr), "handle 0x%08X is not valid!", handle); | ||
| 87 | if (0 != shared_memory->base_address) | ||
| 88 | return Memory::GetPointer(shared_memory->base_address + offset); | ||
| 89 | |||
| 90 | ERROR_LOG(KERNEL, "memory block handle=0x%08X not mapped!", handle); | ||
| 91 | return nullptr; | ||
| 92 | } | ||
| 93 | |||
| 94 | } // namespace | ||
diff --git a/src/core/hle/kernel/shared_memory.h b/src/core/hle/kernel/shared_memory.h new file mode 100644 index 000000000..4e235f605 --- /dev/null +++ b/src/core/hle/kernel/shared_memory.h | |||
| @@ -0,0 +1,38 @@ | |||
| 1 | // Copyright 2014 Citra Emulator Project | ||
| 2 | // Licensed under GPLv2 | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | #include "common/common_types.h" | ||
| 8 | |||
| 9 | #include "core/hle/kernel/kernel.h" | ||
| 10 | |||
| 11 | namespace Kernel { | ||
| 12 | |||
| 13 | /** | ||
| 14 | * Creates a shared memory object | ||
| 15 | * @param name Optional name of shared memory object | ||
| 16 | * @return Handle of newly created shared memory object | ||
| 17 | */ | ||
| 18 | Handle CreateSharedMemory(const std::string& name="Unknown"); | ||
| 19 | |||
| 20 | /** | ||
| 21 | * Maps a shared memory block to an address in system memory | ||
| 22 | * @param handle Shared memory block handle | ||
| 23 | * @param address Address in system memory to map shared memory block to | ||
| 24 | * @param permissions Memory block map permissions (specified by SVC field) | ||
| 25 | * @param other_permissions Memory block map other permissions (specified by SVC field) | ||
| 26 | * @return Result of operation, 0 on success, otherwise error code | ||
| 27 | */ | ||
| 28 | Result MapSharedMemory(u32 handle, u32 address, u32 permissions, u32 other_permissions); | ||
| 29 | |||
| 30 | /** | ||
| 31 | * Gets a pointer to the shared memory block | ||
| 32 | * @param handle Shared memory block handle | ||
| 33 | * @param offset Offset from the start of the shared memory block to get pointer | ||
| 34 | * @return Pointer to the shared memory block from the specified offset | ||
| 35 | */ | ||
| 36 | u8* GetSharedMemoryPointer(Handle handle, u32 offset); | ||
| 37 | |||
| 38 | } // namespace | ||