summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/CMakeLists.txt2
-rw-r--r--src/core/core.vcxproj2
-rw-r--r--src/core/core.vcxproj.filters6
-rw-r--r--src/core/hle/kernel/shared_memory.cpp94
-rw-r--r--src/core/hle/kernel/shared_memory.h38
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
10namespace Kernel {
11
12class SharedMemory : public Object {
13public:
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 */
44SharedMemory* 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 */
56Handle 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 */
70Result 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 */
84u8* 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
11namespace 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 */
18Handle 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 */
28Result 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 */
36u8* GetSharedMemoryPointer(Handle handle, u32 offset);
37
38} // namespace