// 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 CachePolicyToString(uint32_t cache_policy) {
  switch (cache_policy) {
    case 0u:
      return "ZX_CACHE_POLICY_CACHED";
    case 1u:
      return "ZX_CACHE_POLICY_UNCACHED";
    case 2u:
      return "ZX_CACHE_POLICY_UNCACHED_DEVICE";
    case 3u:
      return "ZX_CACHE_POLICY_WRITE_COMBINING";
    default:
      return "<unknown (" + std::to_string(cache_policy) + ")>";
  }
}

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::vector<std::string> VmoFlagsToStrings(uint32_t flags) {
  std::vector<std::string> result;

  // The low bit is special and has a flag for both set and unset values.
  if (flags & (1u << 0)) {
    result.emplace_back("ZX_INFO_VMO_TYPE_PAGED");
  } else {
    result.emplace_back("ZX_INFO_VMO_TYPE_PHYSICAL");
  }

  if (flags & (1u << 1))
    result.emplace_back("ZX_INFO_VMO_RESIZABLE");
  if (flags & (1u << 2))
    result.emplace_back("ZX_INFO_VMO_IS_COW_CLONE");
  if (flags & (1u << 3))
    result.emplace_back("ZX_INFO_VMO_VIA_HANDLE");
  if (flags & (1u << 4))
    result.emplace_back("ZX_INFO_VMO_VIA_MAPPING");
  if (flags & (1u << 5))
    result.emplace_back("ZX_INFO_VMO_PAGER_BACKED");
  if (flags & (1u << 6))
    result.emplace_back("ZX_INFO_VMO_CONTIGUOUS");

  return result;
}

}  // namespace debug_ipc
