root/arch/arm/include/asm/uprobes.h
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (C) 2012 Rabin Vincent <rabin at rab.in>
 */

#ifndef _ASM_UPROBES_H
#define _ASM_UPROBES_H

#include <asm/probes.h>
#include <asm/opcodes.h>

typedef u32 uprobe_opcode_t;

#define MAX_UINSN_BYTES         4
#define UPROBE_XOL_SLOT_BYTES   64

#define UPROBE_SWBP_ARM_INSN    0xe7f001f9
#define UPROBE_SS_ARM_INSN      0xe7f001fa
#define UPROBE_SWBP_INSN        __opcode_to_mem_arm(UPROBE_SWBP_ARM_INSN)
#define UPROBE_SWBP_INSN_SIZE   4

struct arch_uprobe_task {
        u32 backup;
        unsigned long   saved_trap_no;
};

struct arch_uprobe {
        u8 insn[MAX_UINSN_BYTES];
        unsigned long ixol[2];
        uprobe_opcode_t bpinsn;
        bool simulate;
        u32 pcreg;
        void (*prehandler)(struct arch_uprobe *auprobe,
                           struct arch_uprobe_task *autask,
                           struct pt_regs *regs);
        void (*posthandler)(struct arch_uprobe *auprobe,
                            struct arch_uprobe_task *autask,
                            struct pt_regs *regs);
        struct arch_probes_insn asi;
};

#endif