1*0b73214fSGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0+ */ 2c6557e7fSMartin Schwidefsky #ifndef _ASM_S390_KPROBES_H 3c6557e7fSMartin Schwidefsky #define _ASM_S390_KPROBES_H 4c6557e7fSMartin Schwidefsky /* 5c6557e7fSMartin Schwidefsky * Kernel Probes (KProbes) 6c6557e7fSMartin Schwidefsky * 7a53c8fabSHeiko Carstens * Copyright IBM Corp. 2002, 2006 8c6557e7fSMartin Schwidefsky * 9c6557e7fSMartin Schwidefsky * 2002-Oct Created by Vamsi Krishna S <vamsi_krishna@in.ibm.com> Kernel 10c6557e7fSMartin Schwidefsky * Probes initial implementation ( includes suggestions from 11c6557e7fSMartin Schwidefsky * Rusty Russell). 12c6557e7fSMartin Schwidefsky * 2004-Nov Modified for PPC64 by Ananth N Mavinakayanahalli 13c6557e7fSMartin Schwidefsky * <ananth@in.ibm.com> 14c6557e7fSMartin Schwidefsky * 2005-Dec Used as a template for s390 by Mike Grundy 15c6557e7fSMartin Schwidefsky * <grundym@us.ibm.com> 16c6557e7fSMartin Schwidefsky */ 17db55947dSHeiko Carstens #include <linux/types.h> 187d134b2cSLuis R. Rodriguez #include <asm-generic/kprobes.h> 197d134b2cSLuis R. Rodriguez 207d134b2cSLuis R. Rodriguez #define BREAKPOINT_INSTRUCTION 0x0002 217d134b2cSLuis R. Rodriguez 22db55947dSHeiko Carstens #define FIXUP_PSW_NORMAL 0x08 23db55947dSHeiko Carstens #define FIXUP_BRANCH_NOT_TAKEN 0x04 24db55947dSHeiko Carstens #define FIXUP_RETURN_REGISTER 0x02 25db55947dSHeiko Carstens #define FIXUP_NOT_REQUIRED 0x01 26db55947dSHeiko Carstens 27db55947dSHeiko Carstens int probe_is_prohibited_opcode(u16 *insn); 28db55947dSHeiko Carstens int probe_get_fixup_type(u16 *insn); 29db55947dSHeiko Carstens int probe_is_insn_relative_long(u16 *insn); 30db55947dSHeiko Carstens 317d134b2cSLuis R. Rodriguez #ifdef CONFIG_KPROBES 32c6557e7fSMartin Schwidefsky #include <linux/ptrace.h> 33c6557e7fSMartin Schwidefsky #include <linux/percpu.h> 3468db0cf1SIngo Molnar #include <linux/sched/task_stack.h> 35c6557e7fSMartin Schwidefsky 3663c40436SHeiko Carstens #define __ARCH_WANT_KPROBES_INSN_SLOT 3763c40436SHeiko Carstens 38c6557e7fSMartin Schwidefsky struct pt_regs; 39c6557e7fSMartin Schwidefsky struct kprobe; 40c6557e7fSMartin Schwidefsky 41c6557e7fSMartin Schwidefsky typedef u16 kprobe_opcode_t; 42c6557e7fSMartin Schwidefsky 43c6557e7fSMartin Schwidefsky /* Maximum instruction size is 3 (16bit) halfwords: */ 44c6557e7fSMartin Schwidefsky #define MAX_INSN_SIZE 0x0003 45c6557e7fSMartin Schwidefsky #define MAX_STACK_SIZE 64 46c6557e7fSMartin Schwidefsky #define MIN_STACK_SIZE(ADDR) (((MAX_STACK_SIZE) < \ 47c3bdf2e1SHeiko Carstens (((unsigned long)task_stack_page(current)) + THREAD_SIZE - (ADDR))) \ 48c6557e7fSMartin Schwidefsky ? (MAX_STACK_SIZE) \ 49c3bdf2e1SHeiko Carstens : (((unsigned long)task_stack_page(current)) + THREAD_SIZE - (ADDR))) 50c6557e7fSMartin Schwidefsky 51c6557e7fSMartin Schwidefsky #define kretprobe_blacklist_size 0 52c6557e7fSMartin Schwidefsky 53c6557e7fSMartin Schwidefsky /* Architecture specific copy of original instruction */ 54c6557e7fSMartin Schwidefsky struct arch_specific_insn { 55c6557e7fSMartin Schwidefsky /* copy of original instruction */ 5663c40436SHeiko Carstens kprobe_opcode_t *insn; 57c6557e7fSMartin Schwidefsky }; 58c6557e7fSMartin Schwidefsky 59c6557e7fSMartin Schwidefsky struct prev_kprobe { 60c6557e7fSMartin Schwidefsky struct kprobe *kp; 61c6557e7fSMartin Schwidefsky unsigned long status; 62c6557e7fSMartin Schwidefsky }; 63c6557e7fSMartin Schwidefsky 64c6557e7fSMartin Schwidefsky /* per-cpu kprobe control block */ 65c6557e7fSMartin Schwidefsky struct kprobe_ctlblk { 66c6557e7fSMartin Schwidefsky unsigned long kprobe_status; 67c6557e7fSMartin Schwidefsky unsigned long kprobe_saved_imask; 68c6557e7fSMartin Schwidefsky unsigned long kprobe_saved_ctl[3]; 69c6557e7fSMartin Schwidefsky struct prev_kprobe prev_kprobe; 70c6557e7fSMartin Schwidefsky }; 71c6557e7fSMartin Schwidefsky 72c6557e7fSMartin Schwidefsky void arch_remove_kprobe(struct kprobe *p); 73c6557e7fSMartin Schwidefsky 74c6557e7fSMartin Schwidefsky int kprobe_fault_handler(struct pt_regs *regs, int trapnr); 75c6557e7fSMartin Schwidefsky int kprobe_exceptions_notify(struct notifier_block *self, 76c6557e7fSMartin Schwidefsky unsigned long val, void *data); 77c6557e7fSMartin Schwidefsky 78c6557e7fSMartin Schwidefsky #define flush_insn_slot(p) do { } while (0) 79c6557e7fSMartin Schwidefsky 807d134b2cSLuis R. Rodriguez #endif /* CONFIG_KPROBES */ 81c6557e7fSMartin Schwidefsky #endif /* _ASM_S390_KPROBES_H */ 82