cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

kgdb.h (12342B)


      1/*
      2 * This provides the callbacks and functions that KGDB needs to share between
      3 * the core, I/O and arch-specific portions.
      4 *
      5 * Author: Amit Kale <amitkale@linsyssoft.com> and
      6 *         Tom Rini <trini@kernel.crashing.org>
      7 *
      8 * 2001-2004 (c) Amit S. Kale and 2003-2005 (c) MontaVista Software, Inc.
      9 * This file is licensed under the terms of the GNU General Public License
     10 * version 2. This program is licensed "as is" without any warranty of any
     11 * kind, whether express or implied.
     12 */
     13#ifndef _KGDB_H_
     14#define _KGDB_H_
     15
     16#include <linux/linkage.h>
     17#include <linux/init.h>
     18#include <linux/atomic.h>
     19#include <linux/kprobes.h>
     20#ifdef CONFIG_HAVE_ARCH_KGDB
     21#include <asm/kgdb.h>
     22#endif
     23
     24#ifdef CONFIG_KGDB
     25struct pt_regs;
     26
     27/**
     28 *	kgdb_skipexception - (optional) exit kgdb_handle_exception early
     29 *	@exception: Exception vector number
     30 *	@regs: Current &struct pt_regs.
     31 *
     32 *	On some architectures it is required to skip a breakpoint
     33 *	exception when it occurs after a breakpoint has been removed.
     34 *	This can be implemented in the architecture specific portion of kgdb.
     35 */
     36extern int kgdb_skipexception(int exception, struct pt_regs *regs);
     37
     38struct tasklet_struct;
     39struct task_struct;
     40struct uart_port;
     41
     42/**
     43 *	kgdb_breakpoint - compiled in breakpoint
     44 *
     45 *	This will be implemented as a static inline per architecture.  This
     46 *	function is called by the kgdb core to execute an architecture
     47 *	specific trap to cause kgdb to enter the exception processing.
     48 *
     49 */
     50void kgdb_breakpoint(void);
     51
     52extern int kgdb_connected;
     53extern int kgdb_io_module_registered;
     54
     55extern atomic_t			kgdb_setting_breakpoint;
     56extern atomic_t			kgdb_cpu_doing_single_step;
     57
     58extern struct task_struct	*kgdb_usethread;
     59extern struct task_struct	*kgdb_contthread;
     60
     61enum kgdb_bptype {
     62	BP_BREAKPOINT = 0,
     63	BP_HARDWARE_BREAKPOINT,
     64	BP_WRITE_WATCHPOINT,
     65	BP_READ_WATCHPOINT,
     66	BP_ACCESS_WATCHPOINT,
     67	BP_POKE_BREAKPOINT,
     68};
     69
     70enum kgdb_bpstate {
     71	BP_UNDEFINED = 0,
     72	BP_REMOVED,
     73	BP_SET,
     74	BP_ACTIVE
     75};
     76
     77struct kgdb_bkpt {
     78	unsigned long		bpt_addr;
     79	unsigned char		saved_instr[BREAK_INSTR_SIZE];
     80	enum kgdb_bptype	type;
     81	enum kgdb_bpstate	state;
     82};
     83
     84struct dbg_reg_def_t {
     85	char *name;
     86	int size;
     87	int offset;
     88};
     89
     90#ifndef DBG_MAX_REG_NUM
     91#define DBG_MAX_REG_NUM 0
     92#else
     93extern struct dbg_reg_def_t dbg_reg_def[];
     94extern char *dbg_get_reg(int regno, void *mem, struct pt_regs *regs);
     95extern int dbg_set_reg(int regno, void *mem, struct pt_regs *regs);
     96#endif
     97#ifndef KGDB_MAX_BREAKPOINTS
     98# define KGDB_MAX_BREAKPOINTS	1000
     99#endif
    100
    101#define KGDB_HW_BREAKPOINT	1
    102
    103/*
    104 * Functions each KGDB-supporting architecture must provide:
    105 */
    106
    107/**
    108 *	kgdb_arch_init - Perform any architecture specific initialization.
    109 *
    110 *	This function will handle the initialization of any architecture
    111 *	specific callbacks.
    112 */
    113extern int kgdb_arch_init(void);
    114
    115/**
    116 *	kgdb_arch_exit - Perform any architecture specific uninitalization.
    117 *
    118 *	This function will handle the uninitalization of any architecture
    119 *	specific callbacks, for dynamic registration and unregistration.
    120 */
    121extern void kgdb_arch_exit(void);
    122
    123/**
    124 *	pt_regs_to_gdb_regs - Convert ptrace regs to GDB regs
    125 *	@gdb_regs: A pointer to hold the registers in the order GDB wants.
    126 *	@regs: The &struct pt_regs of the current process.
    127 *
    128 *	Convert the pt_regs in @regs into the format for registers that
    129 *	GDB expects, stored in @gdb_regs.
    130 */
    131extern void pt_regs_to_gdb_regs(unsigned long *gdb_regs, struct pt_regs *regs);
    132
    133/**
    134 *	sleeping_thread_to_gdb_regs - Convert ptrace regs to GDB regs
    135 *	@gdb_regs: A pointer to hold the registers in the order GDB wants.
    136 *	@p: The &struct task_struct of the desired process.
    137 *
    138 *	Convert the register values of the sleeping process in @p to
    139 *	the format that GDB expects.
    140 *	This function is called when kgdb does not have access to the
    141 *	&struct pt_regs and therefore it should fill the gdb registers
    142 *	@gdb_regs with what has	been saved in &struct thread_struct
    143 *	thread field during switch_to.
    144 */
    145extern void
    146sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, struct task_struct *p);
    147
    148/**
    149 *	gdb_regs_to_pt_regs - Convert GDB regs to ptrace regs.
    150 *	@gdb_regs: A pointer to hold the registers we've received from GDB.
    151 *	@regs: A pointer to a &struct pt_regs to hold these values in.
    152 *
    153 *	Convert the GDB regs in @gdb_regs into the pt_regs, and store them
    154 *	in @regs.
    155 */
    156extern void gdb_regs_to_pt_regs(unsigned long *gdb_regs, struct pt_regs *regs);
    157
    158/**
    159 *	kgdb_arch_handle_exception - Handle architecture specific GDB packets.
    160 *	@vector: The error vector of the exception that happened.
    161 *	@signo: The signal number of the exception that happened.
    162 *	@err_code: The error code of the exception that happened.
    163 *	@remcom_in_buffer: The buffer of the packet we have read.
    164 *	@remcom_out_buffer: The buffer of %BUFMAX bytes to write a packet into.
    165 *	@regs: The &struct pt_regs of the current process.
    166 *
    167 *	This function MUST handle the 'c' and 's' command packets,
    168 *	as well packets to set / remove a hardware breakpoint, if used.
    169 *	If there are additional packets which the hardware needs to handle,
    170 *	they are handled here.  The code should return -1 if it wants to
    171 *	process more packets, and a %0 or %1 if it wants to exit from the
    172 *	kgdb callback.
    173 */
    174extern int
    175kgdb_arch_handle_exception(int vector, int signo, int err_code,
    176			   char *remcom_in_buffer,
    177			   char *remcom_out_buffer,
    178			   struct pt_regs *regs);
    179
    180/**
    181 *	kgdb_arch_handle_qxfer_pkt - Handle architecture specific GDB XML
    182 *				     packets.
    183 *	@remcom_in_buffer: The buffer of the packet we have read.
    184 *	@remcom_out_buffer: The buffer of %BUFMAX bytes to write a packet into.
    185 */
    186
    187extern void
    188kgdb_arch_handle_qxfer_pkt(char *remcom_in_buffer,
    189			   char *remcom_out_buffer);
    190
    191/**
    192 *	kgdb_call_nmi_hook - Call kgdb_nmicallback() on the current CPU
    193 *	@ignored: This parameter is only here to match the prototype.
    194 *
    195 *	If you're using the default implementation of kgdb_roundup_cpus()
    196 *	this function will be called per CPU.  If you don't implement
    197 *	kgdb_call_nmi_hook() a default will be used.
    198 */
    199
    200extern void kgdb_call_nmi_hook(void *ignored);
    201
    202/**
    203 *	kgdb_roundup_cpus - Get other CPUs into a holding pattern
    204 *
    205 *	On SMP systems, we need to get the attention of the other CPUs
    206 *	and get them into a known state.  This should do what is needed
    207 *	to get the other CPUs to call kgdb_wait(). Note that on some arches,
    208 *	the NMI approach is not used for rounding up all the CPUs.  Normally
    209 *	those architectures can just not implement this and get the default.
    210 *
    211 *	On non-SMP systems, this is not called.
    212 */
    213extern void kgdb_roundup_cpus(void);
    214
    215/**
    216 *	kgdb_arch_set_pc - Generic call back to the program counter
    217 *	@regs: Current &struct pt_regs.
    218 *  @pc: The new value for the program counter
    219 *
    220 *	This function handles updating the program counter and requires an
    221 *	architecture specific implementation.
    222 */
    223extern void kgdb_arch_set_pc(struct pt_regs *regs, unsigned long pc);
    224
    225
    226/* Optional functions. */
    227extern int kgdb_validate_break_address(unsigned long addr);
    228extern int kgdb_arch_set_breakpoint(struct kgdb_bkpt *bpt);
    229extern int kgdb_arch_remove_breakpoint(struct kgdb_bkpt *bpt);
    230
    231/**
    232 *	kgdb_arch_late - Perform any architecture specific initialization.
    233 *
    234 *	This function will handle the late initialization of any
    235 *	architecture specific callbacks.  This is an optional function for
    236 *	handling things like late initialization of hw breakpoints.  The
    237 *	default implementation does nothing.
    238 */
    239extern void kgdb_arch_late(void);
    240
    241
    242/**
    243 * struct kgdb_arch - Describe architecture specific values.
    244 * @gdb_bpt_instr: The instruction to trigger a breakpoint.
    245 * @flags: Flags for the breakpoint, currently just %KGDB_HW_BREAKPOINT.
    246 * @set_breakpoint: Allow an architecture to specify how to set a software
    247 * breakpoint.
    248 * @remove_breakpoint: Allow an architecture to specify how to remove a
    249 * software breakpoint.
    250 * @set_hw_breakpoint: Allow an architecture to specify how to set a hardware
    251 * breakpoint.
    252 * @remove_hw_breakpoint: Allow an architecture to specify how to remove a
    253 * hardware breakpoint.
    254 * @disable_hw_break: Allow an architecture to specify how to disable
    255 * hardware breakpoints for a single cpu.
    256 * @remove_all_hw_break: Allow an architecture to specify how to remove all
    257 * hardware breakpoints.
    258 * @correct_hw_break: Allow an architecture to specify how to correct the
    259 * hardware debug registers.
    260 * @enable_nmi: Manage NMI-triggered entry to KGDB
    261 */
    262struct kgdb_arch {
    263	unsigned char		gdb_bpt_instr[BREAK_INSTR_SIZE];
    264	unsigned long		flags;
    265
    266	int	(*set_breakpoint)(unsigned long, char *);
    267	int	(*remove_breakpoint)(unsigned long, char *);
    268	int	(*set_hw_breakpoint)(unsigned long, int, enum kgdb_bptype);
    269	int	(*remove_hw_breakpoint)(unsigned long, int, enum kgdb_bptype);
    270	void	(*disable_hw_break)(struct pt_regs *regs);
    271	void	(*remove_all_hw_break)(void);
    272	void	(*correct_hw_break)(void);
    273
    274	void	(*enable_nmi)(bool on);
    275};
    276
    277/**
    278 * struct kgdb_io - Describe the interface for an I/O driver to talk with KGDB.
    279 * @name: Name of the I/O driver.
    280 * @read_char: Pointer to a function that will return one char.
    281 * @write_char: Pointer to a function that will write one char.
    282 * @flush: Pointer to a function that will flush any pending writes.
    283 * @init: Pointer to a function that will initialize the device.
    284 * @deinit: Pointer to a function that will deinit the device. Implies that
    285 * this I/O driver is temporary and expects to be replaced. Called when
    286 * an I/O driver is replaced or explicitly unregistered.
    287 * @pre_exception: Pointer to a function that will do any prep work for
    288 * the I/O driver.
    289 * @post_exception: Pointer to a function that will do any cleanup work
    290 * for the I/O driver.
    291 * @cons: valid if the I/O device is a console; else NULL.
    292 */
    293struct kgdb_io {
    294	const char		*name;
    295	int			(*read_char) (void);
    296	void			(*write_char) (u8);
    297	void			(*flush) (void);
    298	int			(*init) (void);
    299	void			(*deinit) (void);
    300	void			(*pre_exception) (void);
    301	void			(*post_exception) (void);
    302	struct console		*cons;
    303};
    304
    305extern const struct kgdb_arch		arch_kgdb_ops;
    306
    307extern unsigned long kgdb_arch_pc(int exception, struct pt_regs *regs);
    308
    309#ifdef CONFIG_SERIAL_KGDB_NMI
    310extern int kgdb_register_nmi_console(void);
    311extern int kgdb_unregister_nmi_console(void);
    312extern bool kgdb_nmi_poll_knock(void);
    313#else
    314static inline int kgdb_register_nmi_console(void) { return 0; }
    315static inline int kgdb_unregister_nmi_console(void) { return 0; }
    316static inline bool kgdb_nmi_poll_knock(void) { return true; }
    317#endif
    318
    319extern int kgdb_register_io_module(struct kgdb_io *local_kgdb_io_ops);
    320extern void kgdb_unregister_io_module(struct kgdb_io *local_kgdb_io_ops);
    321extern struct kgdb_io *dbg_io_ops;
    322
    323extern int kgdb_hex2long(char **ptr, unsigned long *long_val);
    324extern char *kgdb_mem2hex(char *mem, char *buf, int count);
    325extern int kgdb_hex2mem(char *buf, char *mem, int count);
    326
    327extern int kgdb_isremovedbreak(unsigned long addr);
    328extern int kgdb_has_hit_break(unsigned long addr);
    329
    330extern int
    331kgdb_handle_exception(int ex_vector, int signo, int err_code,
    332		      struct pt_regs *regs);
    333extern int kgdb_nmicallback(int cpu, void *regs);
    334extern int kgdb_nmicallin(int cpu, int trapnr, void *regs, int err_code,
    335			  atomic_t *snd_rdy);
    336extern void gdbstub_exit(int status);
    337
    338/*
    339 * kgdb and kprobes both use the same (kprobe) blocklist (which makes sense
    340 * given they are both typically hooked up to the same trap meaning on most
    341 * architectures one cannot be used to debug the other)
    342 *
    343 * However on architectures where kprobes is not (yet) implemented we permit
    344 * breakpoints everywhere rather than blocking everything by default.
    345 */
    346static inline bool kgdb_within_blocklist(unsigned long addr)
    347{
    348#ifdef CONFIG_KGDB_HONOUR_BLOCKLIST
    349	return within_kprobe_blacklist(addr);
    350#else
    351	return false;
    352#endif
    353}
    354
    355extern int			kgdb_single_step;
    356extern atomic_t			kgdb_active;
    357#define in_dbg_master() \
    358	(irqs_disabled() && (smp_processor_id() == atomic_read(&kgdb_active)))
    359extern bool dbg_is_early;
    360extern void __init dbg_late_init(void);
    361extern void kgdb_panic(const char *msg);
    362extern void kgdb_free_init_mem(void);
    363#else /* ! CONFIG_KGDB */
    364#define in_dbg_master() (0)
    365#define dbg_late_init()
    366static inline void kgdb_panic(const char *msg) {}
    367static inline void kgdb_free_init_mem(void) { }
    368#endif /* ! CONFIG_KGDB */
    369#endif /* _KGDB_H_ */