blob: 8138ad1f209c691dfa5cf890eb2fdcd486cd3ba5 [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.
#pragma once
#include <stdint.h>
namespace debug_ipc {
// Overall functionality for interpreting arm64 specific information.
// This is defined in debug_ipc because both the client and the debug agent
// need to access this information.
// Macros for obtaining the mask of an arm64 flag.
// Usage:
// FLAG_MASK(CpsrEL)
#define _ARM64_FLAG_MASK(shift, mask) ((uint64_t)((mask) << (shift)))
#define ARM64_FLAG_MASK(reg, flag) \
_ARM64_FLAG_MASK(::debug_ipc::k##reg##_##flag##_##Shift, \
::debug_ipc::k##reg##_##flag##_##Mask)
// Macros for obtaining the value of an arm64 flag.
// Usage:
// FLAG_VALUE(value, CpsrV)
#define _ARM64_FLAG_VALUE(value, shift, mask) \
((uint8_t)((value >> shift) & mask))
#define ARM64_FLAG_VALUE(value, reg, flag) \
_ARM64_FLAG_VALUE(value, ::debug_ipc::k##reg##_##flag##_##Shift, \
::debug_ipc::k##reg##_##flag##_##Mask)
// CPSR ------------------------------------------------------------------------
constexpr uint64_t kCpsr_EL_Shift = 0; // Exception Level
constexpr uint64_t kCpsr_EL_Mask = 0x1;
constexpr uint64_t kCpsr_F_Shift = 6; // FIQ mask bit.
constexpr uint64_t kCpsr_F_Mask = 0x1;
constexpr uint64_t kCpsr_I_Shift = 7; // IRQ mask bit.
constexpr uint64_t kCpsr_I_Mask = 0x1;
constexpr uint64_t kCpsr_A_Shift = 8; // SError mask bit.
constexpr uint64_t kCpsr_A_Mask = 0x1;
constexpr uint64_t kCpsr_D_Shift = 9; // Debug exception mask bit.
constexpr uint64_t kCpsr_D_Mask = 0x1;
constexpr uint64_t kCpsr_IL_Shift = 20; // Illegal Execution bit.
constexpr uint64_t kCpsr_IL_Mask = 0x1;
constexpr uint64_t kCpsr_SS_Shift = 21; // Single Step.
constexpr uint64_t kCpsr_SS_Mask = 0x1;
constexpr uint64_t kCpsr_PAN_Shift = 22; // Privilege Access Never.
constexpr uint64_t kCpsr_PAN_Mask = 0x1;
constexpr uint64_t kCpsr_UAO_Shift = 23; // Load/Store privilege access.
constexpr uint64_t kCpsr_UAO_Mask = 0x1;
constexpr uint64_t kCpsr_V_Shift = 28; // Overflow bit.
constexpr uint64_t kCpsr_V_Mask = 0x1;
constexpr uint64_t kCpsr_C_Shift = 29; // Carry bit.
constexpr uint64_t kCpsr_C_Mask = 0x1;
constexpr uint64_t kCpsr_Z_Shift = 30; // Zero bit.
constexpr uint64_t kCpsr_Z_Mask = 0x1;
constexpr uint64_t kCpsr_N_Shift = 31; // Negative bit.
constexpr uint64_t kCpsr_N_Mask = 0x1;
// DBGBCR ----------------------------------------------------------------------
constexpr uint64_t kDBGBCR_E_Shift = 0;
constexpr uint64_t kDBGBCR_E_Mask = 0b1;
constexpr uint64_t kDBGBCR_PMC_Shift = 1;
constexpr uint64_t kDBGBCR_PMC_Mask = 0b11;
constexpr uint64_t kDBGBCR_BAS_Shift = 5;
constexpr uint64_t kDBGBCR_BAS_Mask = 0b1111;
constexpr uint64_t kDBGBCR_HMC_Shift = 13;
constexpr uint64_t kDBGBCR_HMC_Mask = 0b1;
constexpr uint64_t kDBGBCR_SSC_Shift = 14;
constexpr uint64_t kDBGBCR_SSC_Mask = 0b11;
constexpr uint64_t kDBGBCR_LBN_Shift = 16;
constexpr uint64_t kDBGBCR_LBN_Mask = 0b1111;
constexpr uint64_t kDBGBCR_BT_Shift = 20;
constexpr uint64_t kDBGBCR_BT_Mask = 0b1111;
// ID_AA64DFR0_EL1 -------------------------------------------------------------
constexpr uint64_t kID_AA64DFR0_EL1_DV_Shift = 0; // Debug Version.
constexpr uint64_t kID_AA64DFR0_EL1_DV_Mask = 0b1111;
constexpr uint64_t kID_AA64DFR0_EL1_TV_Shift = 4; // Trace Version.
constexpr uint64_t kID_AA64DFR0_EL1_TV_Mask = 0b1111;
constexpr uint64_t kID_AA64DFR0_EL1_PMUV_Shift = 8; // PMU Version.
constexpr uint64_t kID_AA64DFR0_EL1_PMUV_Mask = 0b1111;
// HW breakpoint count (value is count - 1).
constexpr uint64_t kID_AA64DFR0_EL1_BRP_Shift = 12;
constexpr uint64_t kID_AA64DFR0_EL1_BRP_Mask = 0b1111;
// HW watchpoint count (value is count - 1).
constexpr uint64_t kID_AA64DFR0_EL1_WRP_Shift = 20;
constexpr uint64_t kID_AA64DFR0_EL1_WRP_Mask = 0b1111;
// Number of breakpoints that are context-aware (value is count - 1).
// These are the highest numbered breakpoints.
// TODO(donosoc): Actually find out what this means.
constexpr uint64_t kID_AA64DFR0_EL1_CTX_CMP_Shift = 28;
constexpr uint64_t kID_AA64DFR0_EL1_CTX_CMP_Mask = 0b1111;
// Statistical Profiling Extension version.
constexpr uint64_t kID_AA64DFR0_EL1_PMSV_Shift = 32;
constexpr uint64_t kID_AA64DFR0_EL1_PMSV_Mask = 0b1111;
// MDSCR_EL1 -------------------------------------------------------------------
constexpr uint64_t kMDSCR_EL1_SS_Shift = 0;
constexpr uint64_t kMDSCR_EL1_SS_Mask = 0b1;
constexpr uint64_t kMDSCR_EL1_ERR_Shift = 6;
constexpr uint64_t kMDSCR_EL1_ERR_Mask = 0b1;
constexpr uint64_t kMDSCR_EL1_TDCC_Shift = 12;
constexpr uint64_t kMDSCR_EL1_TDCC_Mask = 0b1;
constexpr uint64_t kMDSCR_EL1_KDE_Shift = 13;
constexpr uint64_t kMDSCR_EL1_KDE_Mask = 0b1;
constexpr uint64_t kMDSCR_EL1_HDE_Shift = 14;
constexpr uint64_t kMDSCR_EL1_HDE_Mask = 0b1;
constexpr uint64_t kMDSCR_EL1_MDE_Shift = 15;
constexpr uint64_t kMDSCR_EL1_MDE_Mask = 0b1;
constexpr uint64_t kMDSCR_EL1_RAZ_WI_Shift = 16;
constexpr uint64_t kMDSCR_EL1_RAZ_WI_Mask = 0b111;
constexpr uint64_t kMDSCR_EL1_TDA_Shift = 21;
constexpr uint64_t kMDSCR_EL1_TDA_Mask = 0b1;
constexpr uint64_t kMDSCR_EL1_INTdis_Shift = 22;
constexpr uint64_t kMDSCR_EL1_INTdis_Mask = 0b11;
constexpr uint64_t kMDSCR_EL1_TXU_Shift = 26;
constexpr uint64_t kMDSCR_EL1_TXU_Mask = 0b1;
constexpr uint64_t kMDSCR_EL1_RXO_Shift = 27;
constexpr uint64_t kMDSCR_EL1_RXO_Mask = 0b1;
constexpr uint64_t kMDSCR_EL1_TXfull_Shift = 29;
constexpr uint64_t kMDSCR_EL1_TXfull_Mask = 0b1;
constexpr uint64_t kMDSCR_EL1_RXfull_Shift = 30;
constexpr uint64_t kMDSCR_EL1_RXfull_Mask = 0b1;
} // namespace debug_ipc