blob: fd5c0a91bbfec638e497ca71fc2fed3540ce675f [file] [log] [blame]
// Copyright 2016 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 "arch.h"
#include "lib/fxl/logging.h"
#include "garnet/lib/debugger_utils/util.h"
#include "garnet/lib/debugger_utils/x86_cpuid.h"
#include "garnet/lib/debugger_utils/x86_pt.h"
#include "arch_x86.h"
#include "thread.h"
namespace inferior_control {
GdbSignal ComputeGdbSignal(const zx_exception_context_t& context) {
GdbSignal sigval;
auto arch_exception = context.arch.u.x86_64.vector;
switch (arch_exception) {
case X86_INT_DIVIDE_0:
sigval = GdbSignal::kFpe;
break;
case X86_INT_DEBUG:
sigval = GdbSignal::kTrap;
break;
case X86_INT_NMI:
sigval = GdbSignal::kUrg;
break;
case X86_INT_BREAKPOINT:
sigval = GdbSignal::kTrap;
break;
case X86_INT_OVERFLOW:
sigval = GdbSignal::kFpe;
break;
case X86_INT_BOUND_RANGE:
sigval = GdbSignal::kSegv;
break;
case X86_INT_INVALID_OP:
sigval = GdbSignal::kIll;
break;
case X86_INT_DEVICE_NA: // e.g., Coprocessor Not Available
sigval = GdbSignal::kFpe;
break;
case X86_INT_DOUBLE_FAULT:
sigval = GdbSignal::kEmt;
break;
case X86_INT_COPROCESSOR_SEGMENT_OVERRUN:
case X86_INT_INVALID_TSS:
case X86_INT_SEGMENT_NOT_PRESENT:
case X86_INT_STACK_FAULT:
case X86_INT_GP_FAULT:
case X86_INT_PAGE_FAULT:
sigval = GdbSignal::kSegv;
break;
case X86_INT_RESERVED:
sigval = GdbSignal::kUsr1;
break;
case X86_INT_FPU_FP_ERROR:
case X86_INT_ALIGNMENT_CHECK:
sigval = GdbSignal::kEmt;
break;
case X86_INT_MACHINE_CHECK:
sigval = GdbSignal::kUrg;
break;
case X86_INT_SIMD_FP_ERROR:
sigval = GdbSignal::kFpe;
break;
case X86_INT_VIRT: // Virtualization Exception
sigval = GdbSignal::kVtalrm;
break;
case 21: // Control Protection Exception
sigval = GdbSignal::kSegv;
break;
case 22 ... 31:
sigval = GdbSignal::kUsr1; // reserved (-> SIGUSR1 for now)
break;
default:
sigval = GdbSignal::kUsr2; // "software generated" (-> SIGUSR2 for now)
break;
}
FXL_VLOG(1) << "x86 (AMD64) exception (" << arch_exception
<< ") mapped to: " << static_cast<int>(sigval);
return sigval;
}
bool IsSingleStepException(const zx_exception_context_t& context) {
auto arch_exception = context.arch.u.x86_64.vector;
return arch_exception == X86_INT_DEBUG;
}
void DumpArch(FILE* out) { debugger_utils::x86_feature_debug(out); }
} // namespace inferior_control