diff options
author | bunnei <bunneidev@gmail.com> | 2018-01-01 19:25:37 +0100 |
---|---|---|
committer | bunnei <bunneidev@gmail.com> | 2018-01-01 19:25:37 +0100 |
commit | d0046b120a6be248cabb69c4394b7e6f01b6d520 (patch) | |
tree | c8b7609452a02d1fac36528b30ba3aa1062625a4 /src/core/hle/kernel/object_address_table.h | |
parent | thread: Keep track of the initially created handle. (diff) | |
download | yuzu-d0046b120a6be248cabb69c4394b7e6f01b6d520.tar yuzu-d0046b120a6be248cabb69c4394b7e6f01b6d520.tar.gz yuzu-d0046b120a6be248cabb69c4394b7e6f01b6d520.tar.bz2 yuzu-d0046b120a6be248cabb69c4394b7e6f01b6d520.tar.lz yuzu-d0046b120a6be248cabb69c4394b7e6f01b6d520.tar.xz yuzu-d0046b120a6be248cabb69c4394b7e6f01b6d520.tar.zst yuzu-d0046b120a6be248cabb69c4394b7e6f01b6d520.zip |
Diffstat (limited to '')
-rw-r--r-- | src/core/hle/kernel/object_address_table.h | 62 |
1 files changed, 62 insertions, 0 deletions
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 @@ +// Copyright 2018 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include <map> +#include "common/common_types.h" +#include "core/hle/kernel/kernel.h" + +namespace Kernel { + +/** + * This class is used to keep a table of Kernel objects and their respective addresses in emulated + * memory. For certain Switch SVCs, Kernel objects are referenced by an address to an object the + * guest application manages, so we use this table to look these kernel objects up. This is similiar + * to the HandleTable class. + */ +class ObjectAddressTable final : NonCopyable { +public: + ObjectAddressTable() = default; + + /** + * Inserts an object and address pair into the table. + */ + void Insert(VAddr addr, SharedPtr<Object> obj); + + /** + * Closes an object by its address, removing it from the table and decreasing the object's + * ref-count. + * @return `RESULT_SUCCESS` or one of the following errors: + * - `ERR_INVALID_HANDLE`: an invalid handle was passed in. + */ + void Close(VAddr addr); + + /** + * Looks up an object by its address. + * @return Pointer to the looked-up object, or `nullptr` if the handle is not valid. + */ + SharedPtr<Object> GetGeneric(VAddr addr) const; + + /** + * Looks up an object by its address while verifying its type. + * @return Pointer to the looked-up object, or `nullptr` if the handle is not valid or its + * type differs from the requested one. + */ + template <class T> + SharedPtr<T> Get(VAddr addr) const { + return DynamicObjectCast<T>(GetGeneric(addr)); + } + + /// Closes all addresses held in this table. + void Clear(); + +private: + /// Stores the Object referenced by the address + std::map<VAddr, SharedPtr<Object>> objects; +}; + +extern ObjectAddressTable g_object_address_table; + +} // namespace Kernel |