Merge pull request #6320 from Morph1984/get-pid

hle_ipc: Add a getter for PID
This commit is contained in:
bunnei 2021-05-20 21:40:03 -07:00 committed by GitHub
commit ea4e4b05e4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 9 deletions

View File

@ -64,7 +64,7 @@ void HLERequestContext::ParseCommandBuffer(const KHandleTable& handle_table, u32
if (command_header->enable_handle_descriptor) { if (command_header->enable_handle_descriptor) {
handle_descriptor_header = rp.PopRaw<IPC::HandleDescriptorHeader>(); handle_descriptor_header = rp.PopRaw<IPC::HandleDescriptorHeader>();
if (handle_descriptor_header->send_current_pid) { if (handle_descriptor_header->send_current_pid) {
rp.Skip(2, false); pid = rp.Pop<u64>();
} }
if (incoming) { if (incoming) {
// Populate the object lists with the data in the IPC request. // Populate the object lists with the data in the IPC request.
@ -86,16 +86,16 @@ void HLERequestContext::ParseCommandBuffer(const KHandleTable& handle_table, u32
} }
} }
for (unsigned i = 0; i < command_header->num_buf_x_descriptors; ++i) { for (u32 i = 0; i < command_header->num_buf_x_descriptors; ++i) {
buffer_x_desciptors.push_back(rp.PopRaw<IPC::BufferDescriptorX>()); buffer_x_desciptors.push_back(rp.PopRaw<IPC::BufferDescriptorX>());
} }
for (unsigned i = 0; i < command_header->num_buf_a_descriptors; ++i) { for (u32 i = 0; i < command_header->num_buf_a_descriptors; ++i) {
buffer_a_desciptors.push_back(rp.PopRaw<IPC::BufferDescriptorABW>()); buffer_a_desciptors.push_back(rp.PopRaw<IPC::BufferDescriptorABW>());
} }
for (unsigned i = 0; i < command_header->num_buf_b_descriptors; ++i) { for (u32 i = 0; i < command_header->num_buf_b_descriptors; ++i) {
buffer_b_desciptors.push_back(rp.PopRaw<IPC::BufferDescriptorABW>()); buffer_b_desciptors.push_back(rp.PopRaw<IPC::BufferDescriptorABW>());
} }
for (unsigned i = 0; i < command_header->num_buf_w_descriptors; ++i) { for (u32 i = 0; i < command_header->num_buf_w_descriptors; ++i) {
buffer_w_desciptors.push_back(rp.PopRaw<IPC::BufferDescriptorABW>()); buffer_w_desciptors.push_back(rp.PopRaw<IPC::BufferDescriptorABW>());
} }
@ -148,14 +148,14 @@ void HLERequestContext::ParseCommandBuffer(const KHandleTable& handle_table, u32
IPC::CommandHeader::BufferDescriptorCFlag::OneDescriptor) { IPC::CommandHeader::BufferDescriptorCFlag::OneDescriptor) {
buffer_c_desciptors.push_back(rp.PopRaw<IPC::BufferDescriptorC>()); buffer_c_desciptors.push_back(rp.PopRaw<IPC::BufferDescriptorC>());
} else { } else {
unsigned num_buf_c_descriptors = u32 num_buf_c_descriptors =
static_cast<unsigned>(command_header->buf_c_descriptor_flags.Value()) - 2; static_cast<u32>(command_header->buf_c_descriptor_flags.Value()) - 2;
// This is used to detect possible underflows, in case something is broken // This is used to detect possible underflows, in case something is broken
// with the two ifs above and the flags value is == 0 || == 1. // with the two ifs above and the flags value is == 0 || == 1.
ASSERT(num_buf_c_descriptors < 14); ASSERT(num_buf_c_descriptors < 14);
for (unsigned i = 0; i < num_buf_c_descriptors; ++i) { for (u32 i = 0; i < num_buf_c_descriptors; ++i) {
buffer_c_desciptors.push_back(rp.PopRaw<IPC::BufferDescriptorC>()); buffer_c_desciptors.push_back(rp.PopRaw<IPC::BufferDescriptorC>());
} }
} }

View File

@ -150,6 +150,10 @@ public:
return command_header->type; return command_header->type;
} }
u64 GetPID() const {
return pid;
}
u32 GetDataPayloadOffset() const { u32 GetDataPayloadOffset() const {
return data_payload_offset; return data_payload_offset;
} }
@ -305,11 +309,12 @@ private:
std::vector<IPC::BufferDescriptorABW> buffer_w_desciptors; std::vector<IPC::BufferDescriptorABW> buffer_w_desciptors;
std::vector<IPC::BufferDescriptorC> buffer_c_desciptors; std::vector<IPC::BufferDescriptorC> buffer_c_desciptors;
u32_le command{};
u64 pid{};
u32 data_payload_offset{}; u32 data_payload_offset{};
u32 handles_offset{}; u32 handles_offset{};
u32 domain_offset{}; u32 domain_offset{};
u32 data_size{}; u32 data_size{};
u32_le command{};
std::vector<std::shared_ptr<SessionRequestHandler>> domain_request_handlers; std::vector<std::shared_ptr<SessionRequestHandler>> domain_request_handlers;
bool is_thread_waiting{}; bool is_thread_waiting{};