| // 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 |