blob: ebf1f67af4566a72e73c8a2c9fef1844a2464a1f [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/developer/debug/shared/handle_info.h"
namespace debug_ipc {
std::string HandleTypeToString(uint32_t handle_type) {
// Don't use Zircon headers from here, so need to hardcode the values.
switch (handle_type) {
case 0u:
return "ZX_OBJ_TYPE_NONE";
case 1u:
return "ZX_OBJ_TYPE_PROCESS";
case 2u:
return "ZX_OBJ_TYPE_THREAD";
case 3u:
return "ZX_OBJ_TYPE_VMO";
case 4u:
return "ZX_OBJ_TYPE_CHANNEL";
case 5u:
return "ZX_OBJ_TYPE_EVENT";
case 6u:
return "ZX_OBJ_TYPE_PORT";
case 9u:
return "ZX_OBJ_TYPE_INTERRUPT";
case 11u:
return "ZX_OBJ_TYPE_PCI_DEVICE";
case 12u:
return "ZX_OBJ_TYPE_LOG";
case 14u:
return "ZX_OBJ_TYPE_SOCKET";
case 15u:
return "ZX_OBJ_TYPE_RESOURCE";
case 16u:
return "ZX_OBJ_TYPE_EVENTPAIR";
case 17u:
return "ZX_OBJ_TYPE_JOB";
case 18u:
return "ZX_OBJ_TYPE_VMAR";
case 19u:
return "ZX_OBJ_TYPE_FIFO";
case 20u:
return "ZX_OBJ_TYPE_GUEST";
case 21u:
return "ZX_OBJ_TYPE_VCPU";
case 22u:
return "ZX_OBJ_TYPE_TIMER";
case 23u:
return "ZX_OBJ_TYPE_IOMMU";
case 24u:
return "ZX_OBJ_TYPE_BTI";
case 25u:
return "ZX_OBJ_TYPE_PROFILE";
case 26u:
return "ZX_OBJ_TYPE_PMT";
case 27u:
return "ZX_OBJ_TYPE_SUSPEND_TOKEN";
case 28u:
return "ZX_OBJ_TYPE_PAGER";
case 29u:
return "ZX_OBJ_TYPE_EXCEPTION";
case 30u:
return "ZX_OBJ_TYPE_CLOCK";
case 31u:
return "ZX_OBJ_TYPE_STREAM";
case 32u:
return "ZX_OBJ_TYPE_MSI_ALLOCATION";
case 33u:
return "ZX_OBJ_TYPE_MSI_INTERRUPT";
default:
return "<unknown (" + std::to_string(handle_type) + ")>";
}
}
std::string HandlePropsToString(uint32_t handle_props) {
if (handle_props == 0)
return "ZX_OBJ_PROP_NONE";
// Currently this is just one possible value. It may be extended to be a bitfield in the future.
// In that case, we probably want a version that returns an array like the "handle rights" one.
if (handle_props == 1)
return "ZX_OBJ_PROP_WAITABLE";
return "<unknown (" + std::to_string(handle_props) + ")>";
}
std::vector<std::string> HandleRightsToStrings(uint32_t handle_rights) {
std::vector<std::string> result;
if (handle_rights == 0) {
result.emplace_back("ZX_RIGHT_NONE");
return result;
}
struct RightMapping {
uint32_t bit_value;
const char* name;
};
static const RightMapping kRightMapping[] = {
{1u << 0, "ZX_RIGHT_DUPLICATE"}, {1u << 1, "ZX_RIGHT_TRANSFER"},
{1u << 2, "ZX_RIGHT_READ"}, {1u << 3, "ZX_RIGHT_WRITE"},
{1u << 4, "ZX_RIGHT_EXECUTE"}, {1u << 5, "ZX_RIGHT_MAP"},
{1u << 6, "ZX_RIGHT_GET_PROPERTY"}, {1u << 7, "ZX_RIGHT_SET_PROPERTY"},
{1u << 8, "ZX_RIGHT_ENUMERATE"}, {1u << 9, "ZX_RIGHT_DESTROY"},
{1u << 10, "ZX_RIGHT_SET_POLICY"}, {1u << 11, "ZX_RIGHT_GET_POLICY"},
{1u << 12, "ZX_RIGHT_SIGNAL"}, {1u << 13, "ZX_RIGHT_SIGNAL_PEER"},
{1u << 14, "ZX_RIGHT_WAIT"}, {1u << 15, "ZX_RIGHT_INSPECT"},
{1u << 16, "ZX_RIGHT_MANAGE_JOB"}, {1u << 17, "ZX_RIGHT_MANAGE_PROCESS"},
{1u << 18, "ZX_RIGHT_MANAGE_THREAD"}, {1u << 19, "<unknown (1 << 19)>"},
{1u << 20, "<unknown (1 << 20)>"}, {1u << 21, "<unknown (1 << 21)>"},
{1u << 22, "<unknown (1 << 22)>"}, {1u << 23, "<unknown (1 << 23)>"},
{1u << 24, "<unknown (1 << 24)>"}, {1u << 25, "<unknown (1 << 25)>"},
{1u << 26, "<unknown (1 << 26)>"}, {1u << 27, "<unknown (1 << 27)>"},
{1u << 28, "<unknown (1 << 28)>"}, {1u << 29, "<unknown (1 << 29)>"},
{1u << 30, "<unknown (1 << 30)>"}, {1u << 31, "ZX_RIGHT_SAME_RIGHTS"},
};
for (const auto& mapping : kRightMapping) {
if (handle_rights & mapping.bit_value)
result.emplace_back(mapping.name);
}
return result;
}
std::string HandleRightsToString(uint32_t handle_rights) {
auto rights = HandleRightsToStrings(handle_rights);
std::string result;
for (size_t i = 0; i < rights.size(); i++) {
if (i > 0)
result += " | ";
result += rights[i];
}
return result;
}
} // namespace debug_ipc