blob: 8dc5c4f5576ef25067f950a16bb597259067a7ae [file] [log] [blame]
// 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_