uprobe_opcode_t *insn;
};
-/**
- * @struct arch_tramp
- * @brief Stores arch-dependent trampolines.
- */
-struct arch_tramp {
- unsigned long tramp_arm[UPROBES_TRAMP_LEN]; /**< ARM trampoline */
- unsigned long tramp_thumb[UPROBES_TRAMP_LEN]; /**< Thumb trampoline */
- void *utramp; /**< Pointer to trampoline */
-};
-
static inline u32 swap_get_urp_float(struct pt_regs *regs)
{
int arch_prepare_uprobe(struct uprobe *p)
{
struct task_struct *task = p->task;
- u8 *tramp = p->atramp.tramp;
+ u8 tramp[UPROBES_TRAMP_LEN + BP_INSN_SIZE]; /* BP for uretprobe */
enum { call_relative_opcode = 0xe8 };
if (!read_proc_vm_atomic(task, (unsigned long)p->addr,
tramp[UPROBES_TRAMP_RET_BREAK_IDX] = BREAKPOINT_INSTRUCTION;
- /* TODO: remove dual info */
p->opcode = tramp[0];
-
p->ainsn.boostable = swap_can_boost(tramp) ? 0 : -1;
p->ainsn.insn = swap_slot_alloc(p->sm);
}
if (!write_proc_vm_atomic(task, (unsigned long)p->ainsn.insn,
- tramp, sizeof(p->atramp.tramp))) {
+ tramp, sizeof(tramp))) {
swap_slot_free(p->sm, p->ainsn.insn);
printk(KERN_INFO "failed to write memory %p!\n", tramp);
return -EINVAL;
unsigned safe_thumb:1;
#endif
struct arch_insn ainsn; /**< Copy of the original instruction.*/
- struct arch_tramp atramp; /**< Stores trampoline */
struct task_struct *task; /**< Pointer to the task struct */
struct slot_manager *sm; /**< Pointer to slot manager */
bool atomic_ctx; /**< Handler context */