// 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/zxdb/console/format_exception.h"

#include <lib/syslog/cpp/macros.h>

#include <algorithm>

#include "src/developer/debug/zxdb/client/frame.h"
#include "src/developer/debug/zxdb/client/process.h"
#include "src/developer/debug/zxdb/client/session.h"
#include "src/developer/debug/zxdb/client/stack.h"
#include "src/developer/debug/zxdb/client/system.h"
#include "src/developer/debug/zxdb/client/thread.h"
#include "src/developer/debug/zxdb/common/string_util.h"
#include "src/developer/debug/zxdb/console/console_context.h"

namespace zxdb {

namespace {

std::string X64PageFaultToString(const debug_ipc::ExceptionRecord& record) {
  // Bits in the error code for a page fault.
  constexpr uint32_t kPresentBit = 1 << 0;
  constexpr uint32_t kWriteBit = 1 << 1;
  // constexpr uint32_t kUserBit = 1 << 2;  // Currently unneeded.
  // constexpr uint32_t kReservedWrite = 1 << 3;  // Currently unneeded.
  constexpr uint32_t kInstructionFetchBit = 1 << 4;

  std::string result = "Page fault ";

  // Decode read/write/execute.
  if (record.arch.x64.err_code & kInstructionFetchBit)
    result += "executing ";
  else if (record.arch.x64.err_code & kWriteBit)
    result += "writing ";
  else
    result += "reading ";

  result += "address ";
  result += to_hex_string(record.arch.x64.cr2);

  // The page table can mark pages as explicitly protected. Otherwise the page isn't in the page
  // table.
  if (record.arch.x64.err_code & kPresentBit)
    result += " (page protection violation)";

  return result;
}

std::string X64ExceptionRecordToString(const debug_ipc::ExceptionRecord& record) {
  switch (record.arch.x64.vector) {
      // clang-format off
    case  0: return "Divide-by-zero exception";
    case  1: return "Debug exception";
    case  2: return "Non-maskable interrupt";
    case  3: return "Breakpoint exception";
    case  4: return "Overflow exception";
    case  5: return "Bound range exceeded exception";
    case  6: return "Invalid opcode exception";
    case  7: return "No math coprocessor present exception";
    case  8: return "Double fault";
    case  9: return "CoProcessor segment overrun exception";
    case 10: return "Invalid TSS exception";
    case 11: return "Segment not present exception";
    case 12: return "Stack segment fault";
    case 13: return "General protection fault";
    case 14: return X64PageFaultToString(record);
    case 15: return "Reserved exception";
    case 16: return "Floating-point exception";
    case 17: return "Alignment check exception";
    case 18: return "Machine check exception";
    case 19: return "SIMD floating-point exception";
    case 20: return "Virtualization exception";
    case 21: return "Control protection exception";
    // clang-format on
    default:
      return "Unknown exception (" + std::to_string(record.arch.x64.vector) + ")";
  }
}

std::string Arm64DataAbortToString(const debug_ipc::ExceptionRecord& record) {
  constexpr uint32_t kWriteNotReadBit = 1 << 6;

  // Toplevel description.
  std::string result = "Data fault ";
  if (record.arch.arm64.esr & kWriteNotReadBit)
    result += "writing ";
  else
    result += "reading ";

  result += "address ";
  result += to_hex_string(record.arch.arm64.far);

  // The data fault status code is the low 6 bits of the ESR.
  // Many of these we'll never see but it's easier to make the table complete.
  uint32_t dfsc = record.arch.arm64.esr & 0b111111;
  const char* status = nullptr;
  switch (dfsc) {
      // clang-format off
    case 0b000000: status = "address size fault level 0"; break;
    case 0b000001: status = "address size fault level 1"; break;
    case 0b000010: status = "address size fault level 2"; break;
    case 0b000011: status = "address size fault level 3"; break;
    case 0b000100: status = "translation fault level 0"; break;
    case 0b000101: status = "translation fault level 1"; break;
    case 0b000110: status = "translation fault level 2"; break;
    case 0b000111: status = "translation fault level 3"; break;
    case 0b001001: status = "access fault level 1"; break;
    case 0b001010: status = "access fault level 2"; break;
    case 0b001011: status = "access fault level 3"; break;
    case 0b001101: status = "permission fault level 1"; break;
    case 0b001110: status = "permission fault level 2"; break;
    case 0b001111: status = "permission fault level 3"; break;
    case 0b010000: status = "external, not on translation table walk"; break;
    case 0b010001: status = "synchronous tag check fail"; break;
    case 0b010100: status = "external, on translation table walk level 0"; break;
    case 0b010101: status = "external, on translation table walk level 1"; break;
    case 0b010110: status = "external, on translation table walk level 2"; break;
    case 0b010111: status = "external, on translation table walk level 3"; break;
    case 0b011000: status = "parity/ECC error not on translation table walk"; break;
    case 0b011100: status = "parity/ECC error on translation table walk level 0"; break;
    case 0b011101: status = "parity/ECC error on translation table walk level 1"; break;
    case 0b011110: status = "parity/ECC error on translation table walk level 2"; break;
    case 0b011111: status = "parity/ECC error on translation table walk level 3"; break;
    case 0b100001: status = "alignment fault"; break;
    case 0b110000: status = "TLB conflict"; break;
    case 0b110001: status = "unsupported atomic hardware updated"; break;
    case 0b110100: status = "implementation defined - lockdown"; break;
    case 0b110101: status = "implementation defined - unsupported exclusive or atomic"; break;
    case 0b111101: status = "section domain fault"; break;
    case 0b111110: status = "page domain fault"; break;
      // clang-format on
  }
  if (status) {
    result += " (";
    result += status;
    result += ")";
  }

  return result;
}

std::string Arm64ExceptionRecordToString(const debug_ipc::ExceptionRecord& record) {
  // The exception class is bits 26-31 in the esr register.
  uint32_t ec = (record.arch.arm64.esr >> 26) & 0b111111;

  // This is the list from:
  // https://developer.arm.com/docs/ddi0595/e/aarch64-system-registers/esr_el1
  // Many of these we will never encounter at the user level but it's safer to be exhaustive.
  switch (ec) {
      // clang-format off
    case 0b000000: return "Unknown exception";
    case 0b000001: return "Trapped WFI or WFE execution";
    case 0b000011: return "Wrapped MCR or MRC access";
    case 0b000100: return "Trapped MCRR or MRRC";
    case 0b000101: return "Trapped MCR or MRC access";
    case 0b000110: return "Trapped LDC or STC access";
    case 0b000111: return "SVE/SIMD/FP exception";
    case 0b001100: return "Trapped MRRC exception";
    case 0b001101: return "Branch target exception";
    case 0b001110: return "Illegal execution state exception";
    case 0b010001: // fall through
    case 0b010101: return "SVC instruction execution";
    case 0b011000: return "Wrapped MSR, MRS, or system instruction exception";
    case 0b011001: return "Access to SVE exception";
    case 0b011100: return "Pointer authentication failure exception";
    case 0b100000: // fall through
    case 0b100001: return "Instruction abort (MMU fault)";
    case 0b100010: return "PC alignment fault exception";
    case 0b100100: // fall through
    case 0b100101: return Arm64DataAbortToString(record);
    case 0b100110: return "SP alignment fault exception";
    case 0b101000: // fall through
    case 0b101100: return "Wrapped floating-point exception";
    case 0b101111: return "SError interrupt";
    case 0b110000: // fall through
    case 0b110001: return "Breakpoint exception";
    case 0b110010: // fall through
    case 0b110011: return "Software step exception";
    case 0b110100: // fall through
    case 0b110101: return "Watchpoint exception";
    case 0b111000: return "BKPT instruction";
    case 0b111100: return "BRK instruction";
      // clang-format on
  }
  return std::string();
}

}  // namespace

OutputBuffer FormatException(const ConsoleContext* context, const Thread* thread,
                             const debug_ipc::ExceptionRecord& record) {
  std::string heading = ExceptionRecordToString(thread->session()->arch(), record);

  // Lines on each side of the exception string. Max out at 80 cols in the case of long strings.
  // Leave two extra to indent the string a bit.
  size_t divider_length = std::min<size_t>(heading.size() + 2, 80);
  std::string divider;
  for (size_t i = 0; i < divider_length; i++)
    divider += "═";  // UTF-8 character, can't use the string repeated constructor.

  OutputBuffer out;
  out.Append(Syntax::kError, divider);
  out.Append("\n ");  // Extra space to indent heading inside dividers.
  out.Append(Syntax::kHeading, heading);
  out.Append("\n");
  out.Append(Syntax::kError, divider);
  out.Append("\n");

  // Output process record.
  out.Append(" Process ");
  out.Append(Syntax::kSpecial,
             std::to_string(context->IdForTarget(thread->GetProcess()->GetTarget())));
  out.Append(" (");
  out.Append(Syntax::kVariable,
             debug::PlatformProcessIdName(context->session()->platform(), false));
  out.Append("=");
  out.Append(std::to_string(thread->GetProcess()->GetKoid()));
  out.Append(") ");

  // Output thread record.
  out.Append("thread ");
  out.Append(Syntax::kSpecial, std::to_string(context->IdForThread(thread)));
  out.Append(" (");
  out.Append(Syntax::kVariable, debug::PlatformThreadIdName(context->session()->platform(), false));
  out.Append("=");
  out.Append(std::to_string(thread->GetKoid()));
  out.Append(")\n");

  // Output exception address.
  const Stack& stack = thread->GetStack();
  if (!stack.empty()) {
    out.Append(" Faulting instruction: " + to_hex_string(stack[0]->GetAddress()));
    out.Append("\n");
  }

  return out;
}

std::string ExceptionRecordToString(debug::Arch arch, const debug_ipc::ExceptionRecord& record) {
  if (!record.valid)
    return "No exception information";

  std::string suffix =
      (record.strategy == debug_ipc::ExceptionStrategy::kSecondChance) ? " (second chance)" : "";
  switch (arch) {
    case debug::Arch::kUnknown:
      return "Unknown architecture";
    case debug::Arch::kX64:
      return X64ExceptionRecordToString(record) + suffix;
    case debug::Arch::kArm64:
      return Arm64ExceptionRecordToString(record) + suffix;
    case debug::Arch::kRiscv64:
      return "Not implemented on RISC-V 64 yet";
  }
}

}  // namespace zxdb
