| // Copyright 2018 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. |
| |
| #ifndef SRC_DEVELOPER_DEBUG_SHARED_ARCH_X86_H_ |
| #define SRC_DEVELOPER_DEBUG_SHARED_ARCH_X86_H_ |
| |
| #include <stdint.h> |
| |
| #include <string> |
| |
| namespace debug { |
| |
| // Overall functionality for interpreting x86 specific information. Both the client and the debug |
| // agent need to access this information. |
| |
| // Macros for obtaining the mask of an x86 flag. |
| // Usage: |
| // FLAG_MASK(Dr7LEN0) |
| #define _X86_FLAG_MASK(shift, mask) ((uint64_t)((mask) << (shift))) |
| #define X86_FLAG_MASK(flag) _X86_FLAG_MASK(::debug::k##flag##Shift, ::debug::k##flag##Mask) |
| |
| // Macros for obtaining the value of an x86 flag. |
| // Usage: |
| // FLAG_VALUE(value, RflagsNT) |
| #define _X86_FLAG_VALUE(value, shift, mask) ((uint8_t)((value >> shift) & mask)) |
| #define X86_FLAG_VALUE(value, flag) \ |
| _X86_FLAG_VALUE(value, ::debug::k##flag##Shift, ::debug::k##flag##Mask) |
| |
| constexpr uint64_t kRflagsCFShift = 0; // Carry Flag. |
| constexpr uint64_t kRflagsCFMask = 0x1; |
| constexpr uint64_t kRflagsPFShift = 2; // Parity Flag. |
| constexpr uint64_t kRflagsPFMask = 0x1; |
| constexpr uint64_t kRflagsAFShift = 4; // Aux Carry Flag. |
| constexpr uint64_t kRflagsAFMask = 0x1; |
| constexpr uint64_t kRflagsZFShift = 6; // Zero Flag. |
| constexpr uint64_t kRflagsZFMask = 0x1; |
| constexpr uint64_t kRflagsSFShift = 7; // Sign Flag. |
| constexpr uint64_t kRflagsSFMask = 0x1; |
| constexpr uint64_t kRflagsTFShift = 8; // Trap Flag. |
| constexpr uint64_t kRflagsTFMask = 0x1; |
| |
| constexpr uint64_t kRflagsIFShift = 9; // Interrupt Enable Flag. |
| constexpr uint64_t kRflagsIFMask = 0x1; |
| constexpr uint64_t kRflagsDFShift = 10; // Direction Flag. |
| constexpr uint64_t kRflagsDFMask = 0x1; |
| constexpr uint64_t kRflagsOFShift = 11; // Overflow Flag. |
| constexpr uint64_t kRflagsOFMask = 0x1; |
| |
| constexpr uint64_t kRflagsIOPLShift = 12; // IO Privilege Level. |
| constexpr uint64_t kRflagsIOPLMask = 0x3; |
| constexpr uint64_t kRflagsNTShift = 14; // Nested Task. |
| constexpr uint64_t kRflagsNTMask = 0x1; |
| constexpr uint64_t kRflagsRFShift = 16; // Resume Flag. |
| constexpr uint64_t kRflagsRFMask = 0x1; |
| constexpr uint64_t kRflagsVMShift = 17; // Virtual-8086 Mode. |
| constexpr uint64_t kRflagsVMMask = 0x1; |
| constexpr uint64_t kRflagsACShift = 18; // Alignment Check/ Access Control. |
| constexpr uint64_t kRflagsACMask = 0x1; |
| constexpr uint64_t kRflagsVIFShift = 19; // Virtual Interrupt Flag. |
| constexpr uint64_t kRflagsVIFMask = 0x1; |
| constexpr uint64_t kRflagsVIPShift = 20; // Virtual Interrupt Pending. |
| constexpr uint64_t kRflagsVIPMask = 0x1; |
| constexpr uint64_t kRflagsIDShift = 21; // ID Flag. |
| constexpr uint64_t kRflagsIDMask = 0x1; |
| |
| constexpr uint64_t kDR6B0Shift = 0; // HW Breakpoint 0. |
| constexpr uint64_t kDR6B0Mask = 0x1; |
| constexpr uint64_t kDR6B1Shift = 1; // HW Breakpoint 1. |
| constexpr uint64_t kDR6B1Mask = 0x1; |
| constexpr uint64_t kDR6B2Shift = 2; // HW Breakpoint 2. |
| constexpr uint64_t kDR6B2Mask = 0x1; |
| constexpr uint64_t kDR6B3Shift = 3; // HW Breakpoint 3. |
| constexpr uint64_t kDR6B3Mask = 0x1; |
| constexpr uint64_t kDR6BDShift = 13; // Breakpoint Debug Access Detected. |
| constexpr uint64_t kDR6BDMask = 0x1; |
| constexpr uint64_t kDR6BSShift = 14; // Single Step. |
| constexpr uint64_t kDR6BSMask = 0x1; |
| constexpr uint64_t kDR6BTShift = 15; // Breakpoint Task. |
| constexpr uint64_t kDR6BTMask = 0x1; |
| |
| constexpr uint64_t kDR7L0Shift = 0; // HW Breakpoint 0 enabled. |
| constexpr uint64_t kDR7L0Mask = 0x1; |
| constexpr uint64_t kDR7G0Shift = 1; // Global Breakpoint 0 enabled (not used). |
| constexpr uint64_t kDR7G0Mask = 0x1; |
| constexpr uint64_t kDR7L1Shift = 2; // HW Breakpoint 1 enabled. |
| constexpr uint64_t kDR7L1Mask = 0x1; |
| constexpr uint64_t kDR7G1Shift = 3; // Global Breakpoint 1 enabled (not used). |
| constexpr uint64_t kDR7G1Mask = 0x1; |
| constexpr uint64_t kDR7L2Shift = 4; // HW Breakpoint 2 enabled. |
| constexpr uint64_t kDR7L2Mask = 0x1; |
| constexpr uint64_t kDR7G2Shift = 5; // Global Breakpoint 2 enabled (not used). |
| constexpr uint64_t kDR7G2Mask = 0x1; |
| constexpr uint64_t kDR7L3Shift = 6; // HW Breakpoint 3 enabled. |
| constexpr uint64_t kDR7L3Mask = 0x1; |
| constexpr uint64_t kDR7G3Shift = 7; // Global Breakpoint 3 enabled (not used). |
| constexpr uint64_t kDR7G3Mask = 0x1; |
| constexpr uint64_t kDR7LEShift = 8; // Local Exact enabled (not used). |
| constexpr uint64_t kDR7LEMask = 0x1; |
| constexpr uint64_t kDR7GEShift = 9; // Global Exact enabled (not used). |
| constexpr uint64_t kDR7GEMask = 0x1; |
| constexpr uint64_t kDR7GDShift = 13; // General Detect Enabled. |
| constexpr uint64_t kDR7GDMask = 0x1; |
| |
| constexpr uint64_t kDR7RW0Shift = 16; // Bkpt 0 R/W (which exception to trap). |
| constexpr uint64_t kDR7RW0Mask = 0x3; |
| constexpr uint64_t kDR7LEN0Shift = 18; // Bkpt 0 LEN (len of address to match). |
| constexpr uint64_t kDR7LEN0Mask = 0x3; |
| constexpr uint64_t kDR7RW1Shift = 20; // Bkpt 1 R/W (exception type). |
| constexpr uint64_t kDR7RW1Mask = 0x3; |
| constexpr uint64_t kDR7LEN1Shift = 22; // Bkpt 1 LEN (len of address to match). |
| constexpr uint64_t kDR7LEN1Mask = 0x3; |
| constexpr uint64_t kDR7RW2Shift = 24; // Bkpt 2 R/W (exception type). |
| constexpr uint64_t kDR7RW2Mask = 0x3; |
| constexpr uint64_t kDR7LEN2Shift = 26; // Bkpt 2 LEN (len of address to match). |
| constexpr uint64_t kDR7LEN2Mask = 0x3; |
| constexpr uint64_t kDR7RW3Shift = 28; // Bkpt 3 R/W (exception type). |
| constexpr uint64_t kDR7RW3Mask = 0x3; |
| constexpr uint64_t kDR7LEN3Shift = 30; // Bkpt 3 LEN (len of address to match). |
| constexpr uint64_t kDR7LEN3Mask = 0x3; |
| |
| // Debug functions --------------------------------------------------------------------------------- |
| |
| std::string DR6ToString(uint64_t dr6); |
| |
| std::string DR7ToString(uint64_t dr7); |
| |
| } // namespace debug |
| |
| #endif // SRC_DEVELOPER_DEBUG_SHARED_ARCH_X86_H_ |