18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#ifndef _ASM_X86_KGDB_H 38c2ecf20Sopenharmony_ci#define _ASM_X86_KGDB_H 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci/* 68c2ecf20Sopenharmony_ci * Copyright (C) 2001-2004 Amit S. Kale 78c2ecf20Sopenharmony_ci * Copyright (C) 2008 Wind River Systems, Inc. 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <asm/ptrace.h> 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci/* 138c2ecf20Sopenharmony_ci * BUFMAX defines the maximum number of characters in inbound/outbound 148c2ecf20Sopenharmony_ci * buffers at least NUMREGBYTES*2 are needed for register packets 158c2ecf20Sopenharmony_ci * Longer buffer is needed to list all threads 168c2ecf20Sopenharmony_ci */ 178c2ecf20Sopenharmony_ci#define BUFMAX 1024 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci/* 208c2ecf20Sopenharmony_ci * Note that this register image is in a different order than 218c2ecf20Sopenharmony_ci * the register image that Linux produces at interrupt time. 228c2ecf20Sopenharmony_ci * 238c2ecf20Sopenharmony_ci * Linux's register image is defined by struct pt_regs in ptrace.h. 248c2ecf20Sopenharmony_ci * Just why GDB uses a different order is a historical mystery. 258c2ecf20Sopenharmony_ci */ 268c2ecf20Sopenharmony_ci#ifdef CONFIG_X86_32 278c2ecf20Sopenharmony_cienum regnames { 288c2ecf20Sopenharmony_ci GDB_AX, /* 0 */ 298c2ecf20Sopenharmony_ci GDB_CX, /* 1 */ 308c2ecf20Sopenharmony_ci GDB_DX, /* 2 */ 318c2ecf20Sopenharmony_ci GDB_BX, /* 3 */ 328c2ecf20Sopenharmony_ci GDB_SP, /* 4 */ 338c2ecf20Sopenharmony_ci GDB_BP, /* 5 */ 348c2ecf20Sopenharmony_ci GDB_SI, /* 6 */ 358c2ecf20Sopenharmony_ci GDB_DI, /* 7 */ 368c2ecf20Sopenharmony_ci GDB_PC, /* 8 also known as eip */ 378c2ecf20Sopenharmony_ci GDB_PS, /* 9 also known as eflags */ 388c2ecf20Sopenharmony_ci GDB_CS, /* 10 */ 398c2ecf20Sopenharmony_ci GDB_SS, /* 11 */ 408c2ecf20Sopenharmony_ci GDB_DS, /* 12 */ 418c2ecf20Sopenharmony_ci GDB_ES, /* 13 */ 428c2ecf20Sopenharmony_ci GDB_FS, /* 14 */ 438c2ecf20Sopenharmony_ci GDB_GS, /* 15 */ 448c2ecf20Sopenharmony_ci}; 458c2ecf20Sopenharmony_ci#define GDB_ORIG_AX 41 468c2ecf20Sopenharmony_ci#define DBG_MAX_REG_NUM 16 478c2ecf20Sopenharmony_ci#define NUMREGBYTES ((GDB_GS+1)*4) 488c2ecf20Sopenharmony_ci#else /* ! CONFIG_X86_32 */ 498c2ecf20Sopenharmony_cienum regnames { 508c2ecf20Sopenharmony_ci GDB_AX, /* 0 */ 518c2ecf20Sopenharmony_ci GDB_BX, /* 1 */ 528c2ecf20Sopenharmony_ci GDB_CX, /* 2 */ 538c2ecf20Sopenharmony_ci GDB_DX, /* 3 */ 548c2ecf20Sopenharmony_ci GDB_SI, /* 4 */ 558c2ecf20Sopenharmony_ci GDB_DI, /* 5 */ 568c2ecf20Sopenharmony_ci GDB_BP, /* 6 */ 578c2ecf20Sopenharmony_ci GDB_SP, /* 7 */ 588c2ecf20Sopenharmony_ci GDB_R8, /* 8 */ 598c2ecf20Sopenharmony_ci GDB_R9, /* 9 */ 608c2ecf20Sopenharmony_ci GDB_R10, /* 10 */ 618c2ecf20Sopenharmony_ci GDB_R11, /* 11 */ 628c2ecf20Sopenharmony_ci GDB_R12, /* 12 */ 638c2ecf20Sopenharmony_ci GDB_R13, /* 13 */ 648c2ecf20Sopenharmony_ci GDB_R14, /* 14 */ 658c2ecf20Sopenharmony_ci GDB_R15, /* 15 */ 668c2ecf20Sopenharmony_ci GDB_PC, /* 16 */ 678c2ecf20Sopenharmony_ci GDB_PS, /* 17 */ 688c2ecf20Sopenharmony_ci GDB_CS, /* 18 */ 698c2ecf20Sopenharmony_ci GDB_SS, /* 19 */ 708c2ecf20Sopenharmony_ci GDB_DS, /* 20 */ 718c2ecf20Sopenharmony_ci GDB_ES, /* 21 */ 728c2ecf20Sopenharmony_ci GDB_FS, /* 22 */ 738c2ecf20Sopenharmony_ci GDB_GS, /* 23 */ 748c2ecf20Sopenharmony_ci}; 758c2ecf20Sopenharmony_ci#define GDB_ORIG_AX 57 768c2ecf20Sopenharmony_ci#define DBG_MAX_REG_NUM 24 778c2ecf20Sopenharmony_ci/* 17 64 bit regs and 5 32 bit regs */ 788c2ecf20Sopenharmony_ci#define NUMREGBYTES ((17 * 8) + (5 * 4)) 798c2ecf20Sopenharmony_ci#endif /* ! CONFIG_X86_32 */ 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_cistatic inline void arch_kgdb_breakpoint(void) 828c2ecf20Sopenharmony_ci{ 838c2ecf20Sopenharmony_ci asm(" int $3"); 848c2ecf20Sopenharmony_ci} 858c2ecf20Sopenharmony_ci#define BREAK_INSTR_SIZE 1 868c2ecf20Sopenharmony_ci#define CACHE_FLUSH_IS_SAFE 1 878c2ecf20Sopenharmony_ci#define GDB_ADJUSTS_BREAK_OFFSET 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ciextern int kgdb_ll_trap(int cmd, const char *str, 908c2ecf20Sopenharmony_ci struct pt_regs *regs, long err, int trap, int sig); 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci#endif /* _ASM_X86_KGDB_H */ 93