3 changed files with 101 additions and 2 deletions
-
7src/core/hle/kernel/kernel.cpp
-
34src/core/hle/kernel/object_address_table.cpp
-
62src/core/hle/kernel/object_address_table.h
@ -0,0 +1,34 @@ |
|||
// Copyright 2018 Citra Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include "common/assert.h"
|
|||
#include "core/hle/kernel/object_address_table.h"
|
|||
|
|||
namespace Kernel { |
|||
|
|||
ObjectAddressTable g_object_address_table; |
|||
|
|||
void ObjectAddressTable::Insert(VAddr addr, SharedPtr<Object> obj) { |
|||
ASSERT_MSG(objects.find(addr) == objects.end(), "Object already exists with addr=0x%llx", addr); |
|||
objects[addr] = obj; |
|||
} |
|||
|
|||
void ObjectAddressTable::Close(VAddr addr) { |
|||
ASSERT_MSG(objects.find(addr) != objects.end(), "Object does not exist with addr=0x%llx", addr); |
|||
objects.erase(addr); |
|||
} |
|||
|
|||
SharedPtr<Object> ObjectAddressTable::GetGeneric(VAddr addr) const { |
|||
auto iter = objects.find(addr); |
|||
if (iter != objects.end()) { |
|||
return iter->second; |
|||
} |
|||
return {}; |
|||
} |
|||
|
|||
void ObjectAddressTable::Clear() { |
|||
objects.clear(); |
|||
} |
|||
|
|||
} // namespace Kernel
|
|||
@ -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 |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue