// 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. #ifndef ZIRCON_SYSCALLS_DEBUG_ #define ZIRCON_SYSCALLS_DEBUG_ #include <stdint.h> #include <zircon/compiler.h> __BEGIN_CDECLS #if defined(__x86_64__) // Value for ZX_THREAD_STATE_GENERAL_REGS on x86-64 platforms. typedef struct zx_thread_state_general_regs { uint64_t rax; uint64_t rbx; uint64_t rcx; uint64_t rdx; uint64_t rsi; uint64_t rdi; uint64_t rbp; uint64_t rsp; uint64_t r8; uint64_t r9; uint64_t r10; uint64_t r11; uint64_t r12; uint64_t r13; uint64_t r14; uint64_t r15; uint64_t rip; uint64_t rflags; } zx_thread_state_general_regs_t; // Value for ZX_THREAD_STATE_FP_REGS on x64. Holds x87 and MMX state. typedef struct zx_thread_state_fp_regs { uint16_t fcw; // Control word. uint16_t fsw; // Status word. uint8_t ftw; // Tag word. uint8_t reserved; uint16_t fop; // Opcode. uint64_t fip; // Instruction pointer. uint64_t fdp; // Data pointer. // The x87/MMX state. For x87 the each "st" entry has the low 80 bits used for the register // contents. For MMX, the low 64 bits are used. The higher bits are unused. __ALIGNED(16) struct { uint64_t low; uint64_t high; } st[8]; } zx_thread_state_fp_regs_t; // Value for ZX_THREAD_STATE_VECTOR_REGS on x64. Holds SSE and AVX registers. // // Setting vector registers will only work for threads that have previously executed an // instruction using the corresponding register class. typedef struct zx_thread_state_vector_regs { // When only 16 registers are supported (pre-AVX-512), zmm[16-31] will be 0. // YMM registers (256 bits) are v[0-4], XMM registers (128 bits) are v[0-2]. struct { uint64_t v[8]; } zmm[32]; // AVX-512 opmask registers. Will be 0 unless AVX-512 is supported. uint64_t opmask[8]; // SIMD control and status register. uint32_t mxcsr; } zx_thread_state_vector_regs_t; // Value for ZX_THREAD_STATE_DEBUG_REGS on x64 platforms. typedef struct zx_thread_state_debug_regs { uint64_t dr[4]; // DR4 and D5 are not used. uint64_t dr6; // Status register. uint64_t dr7; // Control register. // TODO(donosoc): These values are deprecated but are still used by zxdb. We debine both values // in order to do a soft transition. Delete these values once zxdb has made the // update. uint64_t dr6_status; // Status register. uint64_t dr7_control; // Control register. } zx_thread_state_debug_regs_t; #elif defined(__aarch64__) // Value for ZX_THREAD_STATE_GENERAL_REGS on ARM64 platforms. typedef struct zx_thread_state_general_regs { uint64_t r[30]; uint64_t lr; uint64_t sp; uint64_t pc; uint64_t cpsr; } zx_thread_state_general_regs_t; // Value for ZX_THREAD_STATE_FP_REGS on ARM64 platforms. // This is unused because vector state is used for all floating point on ARM64. typedef struct zx_thread_state_fp_regs { // Avoids sizing differences for empty structs between C and C++. uint32_t unused; } zx_thread_state_fp_regs_t; // Value for ZX_THREAD_STATE_VECTOR_REGS on ARM64 platforms. typedef struct zx_thread_state_vector_regs { uint32_t fpcr; uint32_t fpsr; struct { uint64_t low; uint64_t high; } v[32]; } zx_thread_state_vector_regs_t; // ARMv8-A provides 2 to 16 hardware breakpoint registers. // The number is obtained by the BRPs field in the EDDFR register. #define AARCH64_MAX_HW_BREAKPOINTS 16 // ARMv8-A provides 2 to 16 watchpoint breakpoint registers. // The number is obtained by the WRPs field in the EDDFR register. #define AARCH64_MAX_HW_WATCHPOINTS 16 // Value for XZ_THREAD_STATE_DEBUG_REGS for ARM64 platforms. typedef struct zx_thread_state_debug_regs { struct { uint64_t dbgbvr; // HW Breakpoint Value register. uint32_t dbgbcr; // HW Breakpoint Control register. } hw_bps[AARCH64_MAX_HW_BREAKPOINTS]; // Number of HW Breakpoints in the platform. // Will be set on read and ignored on write. uint8_t hw_bps_count; struct { uint64_t dbgwvr; // HW Watchpoint Value register. uint32_t dbgwcr; // HW Watchpoint Control register. } hw_wps[AARCH64_MAX_HW_WATCHPOINTS]; // Number of HW Watchpoints in the platform. // Will be set on read and ignored on write. uint8_t hw_wps_count; } zx_thread_state_debug_regs_t; #endif // Value for ZX_THREAD_STATE_SINGLE_STEP. The value can be 0 (not single-stepping), or 1 // (single-stepping). Other values will give ZX_ERR_INVALID_ARGS. typedef uint32_t zx_thread_state_single_step_t; // Values for ZX_THREAD_X86_REGISTER_FS and ZX_THREAD_X86_REGISTER_GS; typedef uint64_t zx_thread_x86_register_fs_t; typedef uint64_t zx_thread_x86_register_gs_t; // Possible values for "kind" in zx_thread_read_state and zx_thread_write_state. typedef uint32_t zx_thread_state_topic_t; #define ZX_THREAD_STATE_GENERAL_REGS ((uint32_t)0) // zx_thread_state_general_regs_t value. #define ZX_THREAD_STATE_FP_REGS ((uint32_t)1) // zx_thread_state_fp_regs_t value. #define ZX_THREAD_STATE_VECTOR_REGS ((uint32_t)2) // zx_thread_state_vector_regs_t value. #define ZX_THREAD_STATE_DEBUG_REGS ((uint32_t)4) // zx_thread_state_debug_regs_t value. #define ZX_THREAD_STATE_SINGLE_STEP ((uint32_t)5) // zx_thread_state_single_step_t value. #define ZX_THREAD_X86_REGISTER_FS ((uint32_t)6) // zx_thread_x86_register_fs_t value. #define ZX_THREAD_X86_REGISTER_GS ((uint32_t)7) // zx_thread_x86_register_gs_t value. __END_CDECLS #endif // ZIRCON_SYSCALLS_DEBUG_