162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci#ifndef _ASM_UPROBES_H
362306a36Sopenharmony_ci#define _ASM_UPROBES_H
462306a36Sopenharmony_ci/*
562306a36Sopenharmony_ci * User-space Probes (UProbes) for sparc
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Copyright (C) 2013 Oracle, Inc.
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci * Authors:
1062306a36Sopenharmony_ci *     Jose E. Marchesi <jose.marchesi@oracle.com>
1162306a36Sopenharmony_ci *	Eric Saint Etienne <eric.saint.etienne@oracle.com>
1262306a36Sopenharmony_ci */
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_citypedef u32 uprobe_opcode_t;
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#define MAX_UINSN_BYTES		4
1762306a36Sopenharmony_ci#define UPROBE_XOL_SLOT_BYTES	(MAX_UINSN_BYTES * 2)
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#define UPROBE_SWBP_INSN_SIZE	4
2062306a36Sopenharmony_ci#define UPROBE_SWBP_INSN	0x91d02073 /* ta 0x73 */
2162306a36Sopenharmony_ci#define UPROBE_STP_INSN		0x91d02074 /* ta 0x74 */
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#define ANNUL_BIT (1 << 29)
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cistruct arch_uprobe {
2662306a36Sopenharmony_ci	union {
2762306a36Sopenharmony_ci		u8  insn[MAX_UINSN_BYTES];
2862306a36Sopenharmony_ci		u32 ixol;
2962306a36Sopenharmony_ci	};
3062306a36Sopenharmony_ci};
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_cistruct arch_uprobe_task {
3362306a36Sopenharmony_ci	u64 saved_tpc;
3462306a36Sopenharmony_ci	u64 saved_tnpc;
3562306a36Sopenharmony_ci};
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cistruct task_struct;
3862306a36Sopenharmony_cistruct notifier_block;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ciextern int  arch_uprobe_analyze_insn(struct arch_uprobe *aup, struct mm_struct *mm, unsigned long addr);
4162306a36Sopenharmony_ciextern int  arch_uprobe_pre_xol(struct arch_uprobe *aup, struct pt_regs *regs);
4262306a36Sopenharmony_ciextern int  arch_uprobe_post_xol(struct arch_uprobe *aup, struct pt_regs *regs);
4362306a36Sopenharmony_ciextern bool arch_uprobe_xol_was_trapped(struct task_struct *tsk);
4462306a36Sopenharmony_ciextern int  arch_uprobe_exception_notify(struct notifier_block *self, unsigned long val, void *data);
4562306a36Sopenharmony_ciextern void arch_uprobe_abort_xol(struct arch_uprobe *aup, struct pt_regs *regs);
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci#endif	/* _ASM_UPROBES_H */
48