[Kernel] nonintrusive guest to host object mapping

This commit is contained in:
disjtqz
2023-10-13 15:04:01 -04:00
committed by Radosław Gliński
parent d36b1b3830
commit ee424ae14a
7 changed files with 106 additions and 63 deletions

View File

@@ -17,9 +17,7 @@ struct XAPC;
struct X_KPCR;
struct X_KTHREAD;
struct X_OBJECT_HEADER;
struct X_OBJECT_CREATE_INFORMATION;
struct X_OBJECT_TYPE;
} // namespace xe::kernel

View File

@@ -479,6 +479,31 @@ X_STATUS ObjectTable::RestoreHandle(X_HANDLE handle, XObject* object) {
return X_STATUS_SUCCESS;
}
void ObjectTable::MapGuestObjectToHostHandle(uint32_t guest_object,
X_HANDLE host_handle) {
auto global_lock = global_critical_region_.Acquire();
guest_to_host_handle_[guest_object] = host_handle;
}
bool ObjectTable::HostHandleForGuestObject(uint32_t guest_object, X_HANDLE& out) {
auto global_lock = global_critical_region_.Acquire();
auto gobj_iter = guest_to_host_handle_.find(guest_object);
if (gobj_iter == guest_to_host_handle_.end()) {
return false;
}
out = gobj_iter->second;
return true;
}
void ObjectTable::UnmapGuestObjectHostHandle(uint32_t guest_object) {
auto global_lock = global_critical_region_.Acquire();
auto iter = guest_to_host_handle_.find(guest_object);
if (iter == guest_to_host_handle_.end()) {
return;
} else {
guest_to_host_handle_.erase(iter);
}
}
} // namespace util
} // namespace kernel
} // namespace xe

View File

@@ -80,6 +80,9 @@ class ObjectTable {
std::vector<object_ref<XObject>> GetAllObjects();
void PurgeAllObjects(); // Purges the object table of all guest objects
void MapGuestObjectToHostHandle(uint32_t guest_object, X_HANDLE host_handle);
void UnmapGuestObjectHostHandle(uint32_t guest_object);
bool HostHandleForGuestObject(uint32_t guest_object, X_HANDLE& out);
private:
struct ObjectTableEntry {
int handle_ref_count = 0;
@@ -107,6 +110,7 @@ class ObjectTable {
uint32_t last_free_entry_ = 0;
uint32_t last_free_host_entry_ = 0;
std::unordered_map<string_key_case, X_HANDLE> name_table_;
std::unordered_map<uint32_t, X_HANDLE> guest_to_host_handle_;
};
// Generic lookup