19294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata/*
29294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * This file is part of ltrace.
356134ff5442bee4e128b189bb86cfc97dcb6f60aPetr Machata * Copyright (C) 2012,2013,2014 Petr Machata, Red Hat Inc.
49294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * Copyright (C) 2009 Juan Cespedes
59294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata *
69294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * This program is free software; you can redistribute it and/or
79294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * modify it under the terms of the GNU General Public License as
89294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * published by the Free Software Foundation; either version 2 of the
99294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * License, or (at your option) any later version.
109294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata *
119294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * This program is distributed in the hope that it will be useful, but
129294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * WITHOUT ANY WARRANTY; without even the implied warranty of
139294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
149294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * General Public License for more details.
159294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata *
169294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * You should have received a copy of the GNU General Public License
179294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * along with this program; if not, write to the Free Software
189294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
199294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * 02110-1301 USA
209294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata */
219294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata
229294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata#ifndef BREAKPOINT_H
239294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata#define BREAKPOINT_H
249294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata
259294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata/* XXX This is currently a very weak abstraction.  We would like to
269294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * much expand this to allow things like breakpoints on SDT probes and
279294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * such.
289294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata *
299294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * In particular, we would like to add a tracepoint abstraction.
309294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * Tracepoint is a traceable feature--e.g. an exact address, a DWARF
319294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * symbol, an ELF symbol, a PLT entry, or an SDT probe.  Tracepoints
329294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * are named and the user can configure which of them he wants to
339294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * enable.  Realized tracepoints enable breakpoints, which are a
349294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * low-level realization of high-level tracepoint.
359294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata *
360c3377e8d516bbb8b053ca92a2bb68dc65a64288Petr Machata * Service breakpoints like the handling of dlopen would be a
370c3377e8d516bbb8b053ca92a2bb68dc65a64288Petr Machata * low-level breakpoint, likely without tracepoint attached.
389294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata *
399294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * So that's for sometimes.
409294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata */
419294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata
42d3dc17b5e87068819a780af434afaf69e63d2b50Petr Machata#include "sysdep.h"
432b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata#include "library.h"
44929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata#include "forward.h"
45a9fd8f45e97edc629bdc218d95ce0d0a9e3de401Petr Machata
46a9fd8f45e97edc629bdc218d95ce0d0a9e3de401Petr Machatastruct bp_callbacks {
47929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata	void (*on_hit)(struct breakpoint *bp, struct process *proc);
48929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata	void (*on_continue)(struct breakpoint *bp, struct process *proc);
4956134ff5442bee4e128b189bb86cfc97dcb6f60aPetr Machata	void (*on_install)(struct breakpoint *bp, struct process *proc);
50929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata	void (*on_retract)(struct breakpoint *bp, struct process *proc);
51cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata
52cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata	/* Create a new breakpoint that should handle return from the
53cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata	 * function.  BP is the breakpoint that was just hit and for
54cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata	 * which we wish to find the corresponding return breakpoint.
55cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata	 * This returns 0 on success (in which case *RET will have
56cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata	 * been initialized to desired breakpoint object, or NULL if
57cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata	 * none is necessary) or a negative value on failure.  */
58cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata	int (*get_return_bp)(struct breakpoint **ret,
59cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata			     struct breakpoint *bp, struct process *proc);
60a9fd8f45e97edc629bdc218d95ce0d0a9e3de401Petr Machata};
619294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata
629294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machatastruct breakpoint {
63a9fd8f45e97edc629bdc218d95ce0d0a9e3de401Petr Machata	struct bp_callbacks *cbs;
6429add4fdf852b10ddd22cac0d1390f6d01577bc2Petr Machata	struct library_symbol *libsym;
659294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata	void *addr;
669294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata	unsigned char orig_value[BREAKPOINT_LENGTH];
679294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata	int enabled;
682b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	struct arch_breakpoint_data arch;
699f819d5747dc2b8e0f7ac54b38dc321115de6ddaPetr Machata	struct os_breakpoint_data os;
709294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata};
719294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata
722f140bfae6d45ef119ad14252c0d99c30a91d3a6Petr Machata/* Call ON_HIT handler of BP, if any is set.  */
73929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatavoid breakpoint_on_hit(struct breakpoint *bp, struct process *proc);
74a9fd8f45e97edc629bdc218d95ce0d0a9e3de401Petr Machata
752f140bfae6d45ef119ad14252c0d99c30a91d3a6Petr Machata/* Call ON_CONTINUE handler of BP.  If none is set, call
7656a9ea6b41470d5a0590f23baaff7dff99f277d5Petr Machata * continue_after_breakpoint.  */
77929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatavoid breakpoint_on_continue(struct breakpoint *bp, struct process *proc);
7856a9ea6b41470d5a0590f23baaff7dff99f277d5Petr Machata
792f140bfae6d45ef119ad14252c0d99c30a91d3a6Petr Machata/* Call ON_RETRACT handler of BP, if any is set.  This should be
8086d3828129e70222abdb77bdda6f31a7f1eafd5aPetr Machata * called before the breakpoints are destroyed.  The reason for a
8186d3828129e70222abdb77bdda6f31a7f1eafd5aPetr Machata * separate interface is that breakpoint_destroy has to be callable
8286d3828129e70222abdb77bdda6f31a7f1eafd5aPetr Machata * without PROC.  ON_DISABLE might be useful as well, but that would
8386d3828129e70222abdb77bdda6f31a7f1eafd5aPetr Machata * be called every time we disable the breakpoint, which is too often
8486d3828129e70222abdb77bdda6f31a7f1eafd5aPetr Machata * (a breakpoint has to be disabled every time that we need to execute
8586d3828129e70222abdb77bdda6f31a7f1eafd5aPetr Machata * the instruction underneath it).  */
86929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatavoid breakpoint_on_retract(struct breakpoint *bp, struct process *proc);
8756134ff5442bee4e128b189bb86cfc97dcb6f60aPetr Machata
8856134ff5442bee4e128b189bb86cfc97dcb6f60aPetr Machata/* Call ON_INSTALL handler of BP, if any is set.  This should be
8956134ff5442bee4e128b189bb86cfc97dcb6f60aPetr Machata * called after the breakpoint is enabled for the first time, not
9056134ff5442bee4e128b189bb86cfc97dcb6f60aPetr Machata * every time it's enabled (such as after stepping over a site of a
9156134ff5442bee4e128b189bb86cfc97dcb6f60aPetr Machata * temporarily disabled breakpoint).  */
9256134ff5442bee4e128b189bb86cfc97dcb6f60aPetr Machatavoid breakpoint_on_install(struct breakpoint *bp, struct process *proc);
9386d3828129e70222abdb77bdda6f31a7f1eafd5aPetr Machata
94cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata/* Call GET_RETURN_BP handler of BP, if any is set.  If none is set,
95cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata * call CREATE_DEFAULT_RETURN_BP to obtain one.  */
96cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machataint breakpoint_get_return_bp(struct breakpoint **ret,
97cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata			     struct breakpoint *bp, struct process *proc);
98cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata
992b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata/* Initialize a breakpoint structure.  That doesn't actually realize
1002b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata * the breakpoint.  The breakpoint is initially assumed to be
1012b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata * disabled.  orig_value has to be set separately.  CBS may be
1022b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata * NULL.  */
103929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataint breakpoint_init(struct breakpoint *bp, struct process *proc,
104bac2da505ee174b7fb984b975c5938f88f0dbab2Petr Machata		    arch_addr_t addr, struct library_symbol *libsym);
10555ac932f2802f85c53792153ac909dcd8a690c5cPetr Machata
106d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata/* Make a clone of breakpoint BP into the area of memory pointed to by
107e50355295eac26e15db259fbb7ff705487b501d0Petr Machata * RETP.  Symbols of cloned breakpoint are looked up in NEW_PROC.
108d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata * Returns 0 on success or a negative value on failure.  */
109929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataint breakpoint_clone(struct breakpoint *retp, struct process *new_proc,
110e50355295eac26e15db259fbb7ff705487b501d0Petr Machata		     struct breakpoint *bp);
111d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata
11255ac932f2802f85c53792153ac909dcd8a690c5cPetr Machata/* Set callbacks.  If CBS is non-NULL, then BP->cbs shall be NULL.  */
11355ac932f2802f85c53792153ac909dcd8a690c5cPetr Machatavoid breakpoint_set_callbacks(struct breakpoint *bp, struct bp_callbacks *cbs);
1142b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
1150fe76c64833e09b382d40ee26ba23f02c63d6eb5Petr Machata/* Destroy a breakpoint structure.   */
1168cce1193ebd35cb5a8b288bc7325cdda1b8ffe50Petr Machatavoid breakpoint_destroy(struct breakpoint *bp);
1178cce1193ebd35cb5a8b288bc7325cdda1b8ffe50Petr Machata
11852dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata/* Call enable_breakpoint the first time it's called.  Returns 0 on
11952dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata * success and a negative value on failure.  */
120929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataint breakpoint_turn_on(struct breakpoint *bp, struct process *proc);
12152dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata
12252dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata/* Call disable_breakpoint when turned off the same number of times
12352dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata * that it was turned on.  Returns 0 on success and a negative value
12452dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata * on failure.  */
125929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataint breakpoint_turn_off(struct breakpoint *bp, struct process *proc);
12652dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata
127cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata/* Allocate and initialize a default return breakpoint.  Returns NULL
128cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata * on failure.  */
129cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machatastruct breakpoint *create_default_return_bp(struct process *proc);
130cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata
131dad1b779e2ed29c9fce17853ca71cb719240b9cfPetr Machata/* This allocates and initializes new breakpoint at ADDR, then calls
132dad1b779e2ed29c9fce17853ca71cb719240b9cfPetr Machata * INSERT_BREAKPOINT.  Returns the new breakpoint or NULL if there are
133dad1b779e2ed29c9fce17853ca71cb719240b9cfPetr Machata * errors.  */
13402a796e5e49c147982020c78b0066930e979f3e4Petr Machatastruct breakpoint *insert_breakpoint_at(struct process *proc, arch_addr_t addr,
13502a796e5e49c147982020c78b0066930e979f3e4Petr Machata					struct library_symbol *libsym);
1369294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata
137dad1b779e2ed29c9fce17853ca71cb719240b9cfPetr Machata/* Check if there is a breakpoint on this address already.  If yes,
138dad1b779e2ed29c9fce17853ca71cb719240b9cfPetr Machata * return that breakpoint instead (BP was not added).  If no, try to
139dad1b779e2ed29c9fce17853ca71cb719240b9cfPetr Machata * PROC_ADD_BREAKPOINT and BREAKPOINT_TURN_ON.  If it all works,
140dad1b779e2ed29c9fce17853ca71cb719240b9cfPetr Machata * return BP.  Otherwise return NULL.  */
141dad1b779e2ed29c9fce17853ca71cb719240b9cfPetr Machatastruct breakpoint *insert_breakpoint(struct process *proc,
142dad1b779e2ed29c9fce17853ca71cb719240b9cfPetr Machata				     struct breakpoint *bp);
143dad1b779e2ed29c9fce17853ca71cb719240b9cfPetr Machata
144e9aebd6cfb4710f96b27b5d268208ddd7f0d9eacPetr Machata/* Name of a symbol associated with BP.  May be NULL.  */
145e9aebd6cfb4710f96b27b5d268208ddd7f0d9eacPetr Machataconst char *breakpoint_name(const struct breakpoint *bp);
146e9aebd6cfb4710f96b27b5d268208ddd7f0d9eacPetr Machata
14752dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata/* A library that this breakpoint comes from.  May be NULL.  */
14852dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machatastruct library *breakpoint_library(const struct breakpoint *bp);
14952dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata
1508cce1193ebd35cb5a8b288bc7325cdda1b8ffe50Petr Machata/* Again, this seems to be several interfaces rolled into one:
1518cce1193ebd35cb5a8b288bc7325cdda1b8ffe50Petr Machata *  - breakpoint_disable
15252dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata *  - proc_remove_breakpoint
1538cce1193ebd35cb5a8b288bc7325cdda1b8ffe50Petr Machata *  - breakpoint_destroy
1548cce1193ebd35cb5a8b288bc7325cdda1b8ffe50Petr Machata * XXX */
155b94407705ecddffd7820ee61bcad3f0d72ee87c1Petr Machatavoid delete_breakpoint_at(struct process *proc, void *addr);
156b94407705ecddffd7820ee61bcad3f0d72ee87c1Petr Machataint delete_breakpoint(struct process *proc, struct breakpoint *bp);
1579294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata
1589294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata/* XXX some of the following belongs to proc.h/proc.c.  */
159929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatastruct breakpoint *address2bpstruct(struct process *proc, void *addr);
160929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatavoid disable_all_breakpoints(struct process *proc);
161929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataint breakpoints_init(struct process *proc);
1629294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata
1639294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata#endif /* BREAKPOINT_H */
164