1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2b332828cSK.Prasad #ifndef _I386_HW_BREAKPOINT_H 3b332828cSK.Prasad #define _I386_HW_BREAKPOINT_H 4b332828cSK.Prasad 5af170c50SDavid Howells #include <uapi/asm/hw_breakpoint.h> 6af170c50SDavid Howells 7b332828cSK.Prasad #define __ARCH_HW_BREAKPOINT_H 8b332828cSK.Prasad 924f1e32cSFrederic Weisbecker /* 1024f1e32cSFrederic Weisbecker * The name should probably be something dealt in 1124f1e32cSFrederic Weisbecker * a higher level. While dealing with the user 1224f1e32cSFrederic Weisbecker * (display/resolving) 1324f1e32cSFrederic Weisbecker */ 14b332828cSK.Prasad struct arch_hw_breakpoint { 15b332828cSK.Prasad unsigned long address; 16d6d55f0bSJacob Shin unsigned long mask; 17b332828cSK.Prasad u8 len; 18b332828cSK.Prasad u8 type; 19b332828cSK.Prasad }; 20b332828cSK.Prasad 21b332828cSK.Prasad #include <linux/kdebug.h> 2224f1e32cSFrederic Weisbecker #include <linux/percpu.h> 2324f1e32cSFrederic Weisbecker #include <linux/list.h> 24b332828cSK.Prasad 25b332828cSK.Prasad /* Available HW breakpoint length encodings */ 2689e45aacSFrederic Weisbecker #define X86_BREAKPOINT_LEN_X 0x40 2724f1e32cSFrederic Weisbecker #define X86_BREAKPOINT_LEN_1 0x40 2824f1e32cSFrederic Weisbecker #define X86_BREAKPOINT_LEN_2 0x44 2924f1e32cSFrederic Weisbecker #define X86_BREAKPOINT_LEN_4 0x4c 30b332828cSK.Prasad 31b332828cSK.Prasad #ifdef CONFIG_X86_64 3224f1e32cSFrederic Weisbecker #define X86_BREAKPOINT_LEN_8 0x48 33b332828cSK.Prasad #endif 34b332828cSK.Prasad 35b332828cSK.Prasad /* Available HW breakpoint type encodings */ 36b332828cSK.Prasad 37b332828cSK.Prasad /* trigger on instruction execute */ 3824f1e32cSFrederic Weisbecker #define X86_BREAKPOINT_EXECUTE 0x80 39b332828cSK.Prasad /* trigger on memory write */ 4024f1e32cSFrederic Weisbecker #define X86_BREAKPOINT_WRITE 0x81 41b332828cSK.Prasad /* trigger on memory read or write */ 4224f1e32cSFrederic Weisbecker #define X86_BREAKPOINT_RW 0x83 43b332828cSK.Prasad 44b332828cSK.Prasad /* Total number of available HW breakpoint registers */ 45b332828cSK.Prasad #define HBP_NUM 4 46b332828cSK.Prasad 47*be3f1525SMarco Elver #define hw_breakpoint_slots(type) (HBP_NUM) 48feef47d0SFrederic Weisbecker 49a0baf043SFrederic Weisbecker struct perf_event_attr; 5024f1e32cSFrederic Weisbecker struct perf_event; 5124f1e32cSFrederic Weisbecker struct pmu; 52b332828cSK.Prasad 538e983ff9SFrederic Weisbecker extern int arch_check_bp_in_kernelspace(struct arch_hw_breakpoint *hw); 54a0baf043SFrederic Weisbecker extern int hw_breakpoint_arch_parse(struct perf_event *bp, 55a0baf043SFrederic Weisbecker const struct perf_event_attr *attr, 56a0baf043SFrederic Weisbecker struct arch_hw_breakpoint *hw); 57b332828cSK.Prasad extern int hw_breakpoint_exceptions_notify(struct notifier_block *unused, 58b332828cSK.Prasad unsigned long val, void *data); 5924f1e32cSFrederic Weisbecker 6024f1e32cSFrederic Weisbecker 6124f1e32cSFrederic Weisbecker int arch_install_hw_breakpoint(struct perf_event *bp); 6224f1e32cSFrederic Weisbecker void arch_uninstall_hw_breakpoint(struct perf_event *bp); 6324f1e32cSFrederic Weisbecker void hw_breakpoint_pmu_read(struct perf_event *bp); 6424f1e32cSFrederic Weisbecker void hw_breakpoint_pmu_unthrottle(struct perf_event *bp); 6524f1e32cSFrederic Weisbecker 6624f1e32cSFrederic Weisbecker extern void 6724f1e32cSFrederic Weisbecker arch_fill_perf_breakpoint(struct perf_event *bp); 6824f1e32cSFrederic Weisbecker 6924f1e32cSFrederic Weisbecker unsigned long encode_dr7(int drnum, unsigned int len, unsigned int type); 7024f1e32cSFrederic Weisbecker int decode_dr7(unsigned long dr7, int bpnum, unsigned *len, unsigned *type); 7124f1e32cSFrederic Weisbecker 7224f1e32cSFrederic Weisbecker extern int arch_bp_generic_fields(int x86_len, int x86_type, 7324f1e32cSFrederic Weisbecker int *gen_len, int *gen_type); 7424f1e32cSFrederic Weisbecker 7524f1e32cSFrederic Weisbecker extern struct pmu perf_ops_bp; 7624f1e32cSFrederic Weisbecker 77b332828cSK.Prasad #endif /* _I386_HW_BREAKPOINT_H */ 78