summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2018-01-01 13:25:37 -0500
committerGravatar bunnei2018-01-01 13:25:37 -0500
commitd0046b120a6be248cabb69c4394b7e6f01b6d520 (patch)
treec8b7609452a02d1fac36528b30ba3aa1062625a4 /src
parentthread: Keep track of the initially created handle. (diff)
downloadyuzu-d0046b120a6be248cabb69c4394b7e6f01b6d520.tar.gz
yuzu-d0046b120a6be248cabb69c4394b7e6f01b6d520.tar.xz
yuzu-d0046b120a6be248cabb69c4394b7e6f01b6d520.zip
kernel: Add ObjectAddressTable class.
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/kernel/kernel.cpp7
-rw-r--r--src/core/hle/kernel/object_address_table.cpp34
-rw-r--r--src/core/hle/kernel/object_address_table.h62
3 files changed, 101 insertions, 2 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index 7470a97ca..b0c3f4ae1 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -6,6 +6,7 @@
6#include "core/hle/kernel/handle_table.h" 6#include "core/hle/kernel/handle_table.h"
7#include "core/hle/kernel/kernel.h" 7#include "core/hle/kernel/kernel.h"
8#include "core/hle/kernel/memory.h" 8#include "core/hle/kernel/memory.h"
9#include "core/hle/kernel/object_address_table.h"
9#include "core/hle/kernel/process.h" 10#include "core/hle/kernel/process.h"
10#include "core/hle/kernel/resource_limit.h" 11#include "core/hle/kernel/resource_limit.h"
11#include "core/hle/kernel/thread.h" 12#include "core/hle/kernel/thread.h"
@@ -35,7 +36,9 @@ void Init(u32 system_mode) {
35 36
36/// Shutdown the kernel 37/// Shutdown the kernel
37void Shutdown() { 38void Shutdown() {
38 g_handle_table.Clear(); // Free all kernel objects 39 // Free all kernel objects
40 g_handle_table.Clear();
41 g_object_address_table.Clear();
39 42
40 Kernel::ThreadingShutdown(); 43 Kernel::ThreadingShutdown();
41 g_current_process = nullptr; 44 g_current_process = nullptr;
@@ -45,4 +48,4 @@ void Shutdown() {
45 Kernel::MemoryShutdown(); 48 Kernel::MemoryShutdown();
46} 49}
47 50
48} // namespace 51} // namespace Kernel
diff --git a/src/core/hle/kernel/object_address_table.cpp b/src/core/hle/kernel/object_address_table.cpp
new file mode 100644
index 000000000..dda532a88
--- /dev/null
+++ b/src/core/hle/kernel/object_address_table.cpp
@@ -0,0 +1,34 @@
1// Copyright 2018 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include "common/assert.h"
6#include "core/hle/kernel/object_address_table.h"
7
8namespace Kernel {
9
10ObjectAddressTable g_object_address_table;
11
12void ObjectAddressTable::Insert(VAddr addr, SharedPtr<Object> obj) {
13 ASSERT_MSG(objects.find(addr) == objects.end(), "Object already exists with addr=0x%llx", addr);
14 objects[addr] = obj;
15}
16
17void ObjectAddressTable::Close(VAddr addr) {
18 ASSERT_MSG(objects.find(addr) != objects.end(), "Object does not exist with addr=0x%llx", addr);
19 objects.erase(addr);
20}
21
22SharedPtr<Object> ObjectAddressTable::GetGeneric(VAddr addr) const {
23 auto iter = objects.find(addr);
24 if (iter != objects.end()) {
25 return iter->second;
26 }
27 return {};
28}
29
30void ObjectAddressTable::Clear() {
31 objects.clear();
32}
33
34} // namespace Kernel
diff --git a/src/core/hle/kernel/object_address_table.h b/src/core/hle/kernel/object_address_table.h
new file mode 100644
index 000000000..ba0aac9e3
--- /dev/null
+++ b/src/core/hle/kernel/object_address_table.h
@@ -0,0 +1,62 @@
1// Copyright 2018 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include <map>
8#include "common/common_types.h"
9#include "core/hle/kernel/kernel.h"
10
11namespace Kernel {
12
13/**
14 * This class is used to keep a table of Kernel objects and their respective addresses in emulated
15 * memory. For certain Switch SVCs, Kernel objects are referenced by an address to an object the
16 * guest application manages, so we use this table to look these kernel objects up. This is similiar
17 * to the HandleTable class.
18 */
19class ObjectAddressTable final : NonCopyable {
20public:
21 ObjectAddressTable() = default;
22
23 /**
24 * Inserts an object and address pair into the table.
25 */
26 void Insert(VAddr addr, SharedPtr<Object> obj);
27
28 /**
29 * Closes an object by its address, removing it from the table and decreasing the object's
30 * ref-count.
31 * @return `RESULT_SUCCESS` or one of the following errors:
32 * - `ERR_INVALID_HANDLE`: an invalid handle was passed in.
33 */
34 void Close(VAddr addr);
35
36 /**
37 * Looks up an object by its address.
38 * @return Pointer to the looked-up object, or `nullptr` if the handle is not valid.
39 */
40 SharedPtr<Object> GetGeneric(VAddr addr) const;
41
42 /**
43 * Looks up an object by its address while verifying its type.
44 * @return Pointer to the looked-up object, or `nullptr` if the handle is not valid or its
45 * type differs from the requested one.
46 */
47 template <class T>
48 SharedPtr<T> Get(VAddr addr) const {
49 return DynamicObjectCast<T>(GetGeneric(addr));
50 }
51
52 /// Closes all addresses held in this table.
53 void Clear();
54
55private:
56 /// Stores the Object referenced by the address
57 std::map<VAddr, SharedPtr<Object>> objects;
58};
59
60extern ObjectAddressTable g_object_address_table;
61
62} // namespace Kernel