blob: d2740ac48cab3dc791f11a3cf0c8350a093ce70a [file] [log] [blame]
Petr Machata92822542012-03-28 00:31:14 +02001/*
2 * This file is part of ltrace.
Petr Machata693dfad2013-01-14 22:10:51 +01003 * Copyright (C) 2011,2012,2013 Petr Machata, Red Hat Inc.
Petr Machata92822542012-03-28 00:31:14 +02004 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of the
8 * License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
18 * 02110-1301 USA
19 */
20
21#ifndef _LTRACE_LINUX_TRACE_H_
22#define _LTRACE_LINUX_TRACE_H_
23
Petr Machataba1664b2012-04-28 14:59:05 +020024#include "proc.h"
25
Petr Machata92822542012-03-28 00:31:14 +020026/* This publishes some Linux-specific data structures used for process
27 * handling. */
28
29/**
30 * This is used for bookkeeping related to PIDs that the event
31 * handlers work with.
32 */
33struct pid_task {
34 pid_t pid; /* This may be 0 for tasks that exited
35 * mid-handling. */
36 int sigstopped : 1;
37 int got_event : 1;
38 int delivered : 1;
39 int vforked : 1;
40 int sysret : 1;
41};
42
43struct pid_set {
44 struct pid_task *tasks;
45 size_t count;
46 size_t alloc;
47};
48
49/**
50 * Breakpoint re-enablement. When we hit a breakpoint, we must
51 * disable it, single-step, and re-enable it. That single-step can be
52 * done only by one task in a task group, while others are stopped,
53 * otherwise the processes would race for who sees the breakpoint
54 * disabled and who doesn't. The following is to keep track of it
55 * all.
56 */
57struct process_stopping_handler
58{
59 struct event_handler super;
60
61 /* The task that is doing the re-enablement. */
Petr Machata929bd572012-12-17 03:20:34 +010062 struct process *task_enabling_breakpoint;
Petr Machata92822542012-03-28 00:31:14 +020063
64 /* The pointer being re-enabled. */
65 struct breakpoint *breakpoint_being_enabled;
66
Petr Machata6e5e2de2013-01-21 22:25:34 +010067 /* Software singlestep breakpoints, if any needed. */
68 struct breakpoint *sws_bps[2];
Petr Machata92822542012-03-28 00:31:14 +020069
70 /* When all tasks are stopped, this callback gets called. */
71 void (*on_all_stopped)(struct process_stopping_handler *);
72
Petr Machata36f40e72012-03-28 02:07:19 +020073 /* When we get a singlestep event, this is called to decide
74 * whether to stop stepping, or whether to enable the
75 * brakpoint, sink remaining signals, and continue
76 * everyone. */
77 enum callback_status (*keep_stepping_p)
78 (struct process_stopping_handler *);
79
Petr Machatacb9a28d2012-03-28 11:11:32 +020080 /* Whether we need to use ugly workaround to get around
81 * various problems with singlestepping. */
82 enum callback_status (*ugly_workaround_p)
83 (struct process_stopping_handler *);
84
Petr Machata92822542012-03-28 00:31:14 +020085 enum {
86 /* We are waiting for everyone to land in t/T. */
Petr Machata96cb8e32012-12-17 03:49:41 +010087 PSH_STOPPING = 0,
Petr Machata92822542012-03-28 00:31:14 +020088
89 /* We are doing the PTRACE_SINGLESTEP. */
Petr Machata96cb8e32012-12-17 03:49:41 +010090 PSH_SINGLESTEP,
Petr Machata92822542012-03-28 00:31:14 +020091
92 /* We are waiting for all the SIGSTOPs to arrive so
93 * that we can sink them. */
Petr Machata96cb8e32012-12-17 03:49:41 +010094 PSH_SINKING,
Petr Machata92822542012-03-28 00:31:14 +020095
96 /* This is for tracking the ugly workaround. */
Petr Machata96cb8e32012-12-17 03:49:41 +010097 PSH_UGLY_WORKAROUND,
Petr Machata92822542012-03-28 00:31:14 +020098 } state;
99
100 int exiting;
101
102 struct pid_set pids;
103};
104
105/* Allocate a process stopping handler, initialize it and install it.
Petr Machata36f40e72012-03-28 02:07:19 +0200106 * Return 0 on success or a negative value on failure. Pass NULL for
107 * each callback to use a default instead. The default for
Petr Machata1e2a4dd2012-04-15 04:35:48 +0200108 * ON_ALL_STOPPED is LINUX_PTRACE_DISABLE_AND_SINGLESTEP, the default
109 * for KEEP_STEPPING_P and UGLY_WORKAROUND_P is "no". */
Petr Machata92822542012-03-28 00:31:14 +0200110int process_install_stopping_handler
Petr Machata929bd572012-12-17 03:20:34 +0100111 (struct process *proc, struct breakpoint *sbp,
Petr Machata36f40e72012-03-28 02:07:19 +0200112 void (*on_all_stopped)(struct process_stopping_handler *),
113 enum callback_status (*keep_stepping_p)
Petr Machatacb9a28d2012-03-28 11:11:32 +0200114 (struct process_stopping_handler *),
115 enum callback_status (*ugly_workaround_p)
Petr Machata36f40e72012-03-28 02:07:19 +0200116 (struct process_stopping_handler *));
Petr Machata92822542012-03-28 00:31:14 +0200117
Petr Machata1e2a4dd2012-04-15 04:35:48 +0200118void linux_ptrace_disable_and_singlestep(struct process_stopping_handler *self);
119void linux_ptrace_disable_and_continue(struct process_stopping_handler *self);
120
Petr Machatab420a222013-10-15 10:46:28 +0200121/* When main binary needs to call an IFUNC function defined in the
122 * binary itself, a PLT entry is set up so that dynamic linker can get
123 * involved and resolve the symbol. But unlike other PLT relocation,
124 * this one can't rely on symbol table being available. So it doesn't
125 * reference the symbol by its name, but by its address, and
126 * correspondingly, has another type. When arch backend wishes to
127 * support these IRELATIVE relocations, it should override
128 * arch_elf_add_plt_entry and dispatch to this function for IRELATIVE
129 * relocations.
130 *
131 * This function behaves as arch_elf_add_plt_entry, except that it
132 * doesn't take name for a parameter, but instead looks up the name in
133 * symbol tables in LTE. */
134enum plt_status linux_elf_add_plt_entry_irelative(struct process *proc,
135 struct ltelf *lte,
136 GElf_Rela *rela, size_t ndx,
137 struct library_symbol **ret);
138
Petr Machatab061bae2013-10-25 23:50:18 +0200139/* Service routine of the above. Determines a name corresponding to
140 * RELA, or invents a new one. Returns NULL on failures, otherwise it
141 * returns a malloc'd pointer that the caller is responsible for
142 * freeing. */
143char *linux_elf_find_irelative_name(struct ltelf *lte, GElf_Rela *rela);
144
Petr Machata92822542012-03-28 00:31:14 +0200145#endif /* _LTRACE_LINUX_TRACE_H_ */