1642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata/*
2642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * This file is part of ltrace.
36bcc092da6b7e20c6c2a9a5846536fbd3d77dbb8Petr Machata * Copyright (C) 2011,2012,2013,2014 Petr Machata, Red Hat Inc.
4642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * Copyright (C) 2010 Joe Damato
5642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * Copyright (C) 1998,2009 Juan Cespedes
6642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata *
7642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * This program is free software; you can redistribute it and/or
8642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * modify it under the terms of the GNU General Public License as
9642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * published by the Free Software Foundation; either version 2 of the
10642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * License, or (at your option) any later version.
11642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata *
12642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * This program is distributed in the hope that it will be useful, but
13642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * WITHOUT ANY WARRANTY; without even the implied warranty of
14642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * General Public License for more details.
16642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata *
17642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * You should have received a copy of the GNU General Public License
18642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * along with this program; if not, write to the Free Software
19642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * 02110-1301 USA
21642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata */
22642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata
23ab3b72cc5d2d3efb3542192f0d72ff2ea4b082f9Joe Damato#include "config.h"
24ab3b72cc5d2d3efb3542192f0d72ff2ea4b082f9Joe Damato
25ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata#include <sys/types.h>
26ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata#include <assert.h>
27ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata#include <errno.h>
28ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata#include <stdio.h>
29ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata#include <stdlib.h>
30ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata#include <string.h>
31ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata
32ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata#include "backend.h"
339294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata#include "breakpoint.h"
34ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata#include "debug.h"
35ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata#include "fetch.h"
36af1e603fa8afd1ed0f1819a984c57311efbc7f1fPetr Machata#include "options.h"
37366c2f46d844f040458df9b7e35fc3b8527ed2d3Petr Machata#include "proc.h"
38ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata#include "value_dict.h"
39273ea6d18164e35ee40524e853a6f04706d3bdffJuan Cespedes
4023124cc5c33c6b7a547eb1008505f60590f67593Petr Machata#ifndef OS_HAVE_PROCESS_DATA
41744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machataint
4223124cc5c33c6b7a547eb1008505f60590f67593Petr Machataos_process_init(struct process *proc)
43744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machata{
44744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machata	return 0;
45744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machata}
46744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machata
47744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machatavoid
4823124cc5c33c6b7a547eb1008505f60590f67593Petr Machataos_process_destroy(struct process *proc)
49744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machata{
50744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machata}
51744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machata
52744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machataint
5323124cc5c33c6b7a547eb1008505f60590f67593Petr Machataos_process_clone(struct process *retp, struct process *proc)
54744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machata{
55744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machata	return 0;
56744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machata}
57744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machata
58744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machataint
5923124cc5c33c6b7a547eb1008505f60590f67593Petr Machataos_process_exec(struct process *proc)
60744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machata{
61744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machata	return 0;
62744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machata}
63744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machata#endif
64744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machata
6523124cc5c33c6b7a547eb1008505f60590f67593Petr Machata#ifndef ARCH_HAVE_PROCESS_DATA
660f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machataint
6723124cc5c33c6b7a547eb1008505f60590f67593Petr Machataarch_process_init(struct process *proc)
680f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machata{
690f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machata	return 0;
700f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machata}
710f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machata
720f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machatavoid
7323124cc5c33c6b7a547eb1008505f60590f67593Petr Machataarch_process_destroy(struct process *proc)
740f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machata{
750f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machata}
760f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machata
770f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machataint
7823124cc5c33c6b7a547eb1008505f60590f67593Petr Machataarch_process_clone(struct process *retp, struct process *proc)
790f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machata{
800f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machata	return 0;
810f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machata}
820f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machata
830f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machataint
8423124cc5c33c6b7a547eb1008505f60590f67593Petr Machataarch_process_exec(struct process *proc)
850f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machata{
860f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machata	return 0;
870f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machata}
880f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machata#endif
890f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machata
9093d95dff48698b8bde511c7f71acda7646da2626Petr Machata#ifndef ARCH_HAVE_DYNLINK_DONE
9193d95dff48698b8bde511c7f71acda7646da2626Petr Machatavoid
92929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataarch_dynlink_done(struct process *proc)
9393d95dff48698b8bde511c7f71acda7646da2626Petr Machata{
9493d95dff48698b8bde511c7f71acda7646da2626Petr Machata}
9593d95dff48698b8bde511c7f71acda7646da2626Petr Machata#endif
9693d95dff48698b8bde511c7f71acda7646da2626Petr Machata
97baf00e4ebd96bba26804696fbee73e662678ef6aPetr Machatastatic int add_process(struct process *proc, int was_exec);
98929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatastatic void unlist_process(struct process *proc);
9944965c7a1d3106439b20e8f36307f506df3df44bPetr Machata
100e677c7e0b79fc0af7c98436d924fefca7d43f359Petr Machatastatic void
101929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatadestroy_unwind(struct process *proc)
102e677c7e0b79fc0af7c98436d924fefca7d43f359Petr Machata{
103e677c7e0b79fc0af7c98436d924fefca7d43f359Petr Machata#if defined(HAVE_LIBUNWIND)
104af1e603fa8afd1ed0f1819a984c57311efbc7f1fPetr Machata	if (proc->unwind_priv != NULL)
105af1e603fa8afd1ed0f1819a984c57311efbc7f1fPetr Machata		_UPT_destroy(proc->unwind_priv);
106af1e603fa8afd1ed0f1819a984c57311efbc7f1fPetr Machata	if (proc->unwind_as != NULL)
107af1e603fa8afd1ed0f1819a984c57311efbc7f1fPetr Machata		unw_destroy_addr_space(proc->unwind_as);
108e677c7e0b79fc0af7c98436d924fefca7d43f359Petr Machata#endif /* defined(HAVE_LIBUNWIND) */
109dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard
110dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard#if defined(HAVE_LIBDW)
111dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard	if (proc->dwfl != NULL)
112dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard		dwfl_end(proc->dwfl);
113dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard#endif /* defined(HAVE_LIBDW) */
114e677c7e0b79fc0af7c98436d924fefca7d43f359Petr Machata}
115e677c7e0b79fc0af7c98436d924fefca7d43f359Petr Machata
1162b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machatastatic int
117929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataprocess_bare_init(struct process *proc, const char *filename,
1183d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata		  pid_t pid, int was_exec)
1192b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata{
1203d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata	if (!was_exec) {
1213d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata		memset(proc, 0, sizeof(*proc));
1223d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata
1233d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata		proc->filename = strdup(filename);
1243d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata		if (proc->filename == NULL) {
1253d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata		fail:
1263d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata			free(proc->filename);
127d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata			if (proc->breakpoints != NULL) {
128d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata				dict_destroy(proc->breakpoints,
129d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata					     NULL, NULL, NULL);
130d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata				free(proc->breakpoints);
131d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata				proc->breakpoints = NULL;
132d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata			}
1333d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata			return -1;
1343d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata		}
1352b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	}
1362b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
1372b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	/* Add process so that we know who the leader is.  */
1381b17dbf4c3754018310f22e26effffdcffde47abPetr Machata	proc->pid = pid;
139baf00e4ebd96bba26804696fbee73e662678ef6aPetr Machata	if (add_process(proc, was_exec) < 0)
1402b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata		goto fail;
141baf00e4ebd96bba26804696fbee73e662678ef6aPetr Machata	if (proc->leader == NULL) {
142baf00e4ebd96bba26804696fbee73e662678ef6aPetr Machata	unlist_and_fail:
143baf00e4ebd96bba26804696fbee73e662678ef6aPetr Machata		if (!was_exec)
144baf00e4ebd96bba26804696fbee73e662678ef6aPetr Machata			unlist_process(proc);
145baf00e4ebd96bba26804696fbee73e662678ef6aPetr Machata		goto fail;
146baf00e4ebd96bba26804696fbee73e662678ef6aPetr Machata	}
1472b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
1482b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	if (proc->leader == proc) {
149d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata		proc->breakpoints = malloc(sizeof(*proc->breakpoints));
1502b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata		if (proc->breakpoints == NULL)
151baf00e4ebd96bba26804696fbee73e662678ef6aPetr Machata			goto unlist_and_fail;
152d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata		DICT_INIT(proc->breakpoints,
153d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata			  arch_addr_t, struct breakpoint *,
154d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata			  arch_addr_hash, arch_addr_eq, NULL);
1552b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	} else {
1562b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata		proc->breakpoints = NULL;
1572b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	}
1582b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
159ab3b72cc5d2d3efb3542192f0d72ff2ea4b082f9Joe Damato#if defined(HAVE_LIBUNWIND)
160a2c270e86913ab93c41cdd61055d7c2b71b10fa1Petr Machata	if (options.bt_depth > 0) {
161af1e603fa8afd1ed0f1819a984c57311efbc7f1fPetr Machata		proc->unwind_priv = _UPT_create(pid);
162af1e603fa8afd1ed0f1819a984c57311efbc7f1fPetr Machata		proc->unwind_as = unw_create_addr_space(&_UPT_accessors, 0);
163ab3b72cc5d2d3efb3542192f0d72ff2ea4b082f9Joe Damato
164af1e603fa8afd1ed0f1819a984c57311efbc7f1fPetr Machata		if (proc->unwind_priv == NULL || proc->unwind_as == NULL) {
165af1e603fa8afd1ed0f1819a984c57311efbc7f1fPetr Machata			fprintf(stderr,
166af1e603fa8afd1ed0f1819a984c57311efbc7f1fPetr Machata				"Couldn't initialize unwinding "
167af1e603fa8afd1ed0f1819a984c57311efbc7f1fPetr Machata				"for process %d\n", proc->pid);
168af1e603fa8afd1ed0f1819a984c57311efbc7f1fPetr Machata			destroy_unwind(proc);
169af1e603fa8afd1ed0f1819a984c57311efbc7f1fPetr Machata			proc->unwind_priv = NULL;
170af1e603fa8afd1ed0f1819a984c57311efbc7f1fPetr Machata			proc->unwind_as = NULL;
171af1e603fa8afd1ed0f1819a984c57311efbc7f1fPetr Machata		}
172af1e603fa8afd1ed0f1819a984c57311efbc7f1fPetr Machata	}
173a2c270e86913ab93c41cdd61055d7c2b71b10fa1Petr Machata#endif /* defined(HAVE_LIBUNWIND) */
174af1e603fa8afd1ed0f1819a984c57311efbc7f1fPetr Machata
175dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard#if defined(HAVE_LIBDW)
176dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard	proc->dwfl = NULL; /* Initialize for leader only on first library.  */
177dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard#endif /* defined(HAVE_LIBDW) */
178dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard
1792b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	return 0;
1802b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata}
1812b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
1822b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machatastatic void
183929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataprocess_bare_destroy(struct process *proc, int was_exec)
1842b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata{
185d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata	dict_destroy(proc->breakpoints, NULL, NULL, NULL);
186d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata	free(proc->breakpoints);
1873d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata	if (!was_exec) {
1883d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata		free(proc->filename);
18961686c26634ea847c41470801572b49bebce5b99Petr Machata		unlist_process(proc);
190e677c7e0b79fc0af7c98436d924fefca7d43f359Petr Machata		destroy_unwind(proc);
1913d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata	}
1922b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata}
1932b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
1943d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machatastatic int
195929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataprocess_init_main(struct process *proc)
1962b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata{
1973d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata	if (breakpoints_init(proc) < 0) {
19818bd8ffa003c680e3d44d1b05fc3a7b43e6a25cePetr Machata		fprintf(stderr, "failed to init breakpoints %d\n",
19918bd8ffa003c680e3d44d1b05fc3a7b43e6a25cePetr Machata			proc->pid);
200218c5ff26841f5bbd188c42ccbd67422a7a20556Petr Machata		return -1;
20118bd8ffa003c680e3d44d1b05fc3a7b43e6a25cePetr Machata	}
20218bd8ffa003c680e3d44d1b05fc3a7b43e6a25cePetr Machata
2032b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	return 0;
2042b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata}
2052b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
2063d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machataint
207929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataprocess_init(struct process *proc, const char *filename, pid_t pid)
2083d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata{
2093d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata	if (process_bare_init(proc, filename, pid, 0) < 0) {
210218c5ff26841f5bbd188c42ccbd67422a7a20556Petr Machata	fail:
211cc0e1e4b83d69441cc5f61ea87eda5458ee9fae3Petr Machata		fprintf(stderr, "failed to initialize process %d: %s\n",
212cc0e1e4b83d69441cc5f61ea87eda5458ee9fae3Petr Machata			pid, strerror(errno));
2133d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata		return -1;
2143d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata	}
2153d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata
2160f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machata	if (os_process_init(proc) < 0) {
2170f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machata		process_bare_destroy(proc, 0);
2180f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machata		goto fail;
2190f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machata	}
2200f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machata
221744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machata	if (arch_process_init(proc) < 0) {
2220f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machata		os_process_destroy(proc);
223744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machata		process_bare_destroy(proc, 0);
224744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machata		goto fail;
225744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machata	}
226744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machata
2278137e804992f15590105a3db29673674971dff7bPetr Machata	if (proc->leader != proc) {
2288137e804992f15590105a3db29673674971dff7bPetr Machata		proc->e_machine = proc->leader->e_machine;
2298137e804992f15590105a3db29673674971dff7bPetr Machata		proc->e_class = proc->leader->e_class;
2308137e804992f15590105a3db29673674971dff7bPetr Machata		get_arch_dep(proc);
2318137e804992f15590105a3db29673674971dff7bPetr Machata	} else if (process_init_main(proc) < 0) {
232218c5ff26841f5bbd188c42ccbd67422a7a20556Petr Machata		process_bare_destroy(proc, 0);
233218c5ff26841f5bbd188c42ccbd67422a7a20556Petr Machata		goto fail;
234218c5ff26841f5bbd188c42ccbd67422a7a20556Petr Machata	}
235218c5ff26841f5bbd188c42ccbd67422a7a20556Petr Machata	return 0;
2363d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata}
2373d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata
2388ead1cde21252e779f29ee4bcd68ae4a1bc86ed9Petr Machatastatic enum callback_status
239929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatadestroy_breakpoint_cb(struct process *proc, struct breakpoint *bp, void *data)
2403d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata{
2413d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata	breakpoint_destroy(bp);
2423d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata	free(bp);
2438ead1cde21252e779f29ee4bcd68ae4a1bc86ed9Petr Machata	return CBS_CONT;
2443d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata}
2453d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata
246e0e89edff4ff9216a9a8631b078858851a15f0e7Petr Machata// XXX see comment in handle_event.c
247929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatavoid callstack_pop(struct process *proc);
248e0e89edff4ff9216a9a8631b078858851a15f0e7Petr Machata
2493d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machatastatic void
250929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataprivate_process_destroy(struct process *proc, int was_exec)
2513d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata{
252e0e89edff4ff9216a9a8631b078858851a15f0e7Petr Machata	/* Pop remaining stack elements.  */
253e0e89edff4ff9216a9a8631b078858851a15f0e7Petr Machata	while (proc->callstack_depth > 0) {
254e0e89edff4ff9216a9a8631b078858851a15f0e7Petr Machata		/* When this is called just before a process is
255e0e89edff4ff9216a9a8631b078858851a15f0e7Petr Machata		 * destroyed, the breakpoints should either have been
256e0e89edff4ff9216a9a8631b078858851a15f0e7Petr Machata		 * retracted by now, or were killed by exec.  In any
257e0e89edff4ff9216a9a8631b078858851a15f0e7Petr Machata		 * case, it's safe to pretend that there are no
258e0e89edff4ff9216a9a8631b078858851a15f0e7Petr Machata		 * breakpoints associated with the stack elements, so
259e0e89edff4ff9216a9a8631b078858851a15f0e7Petr Machata		 * that stack_pop doesn't attempt to destroy them.  */
260e0e89edff4ff9216a9a8631b078858851a15f0e7Petr Machata		size_t i = proc->callstack_depth - 1;
261e0e89edff4ff9216a9a8631b078858851a15f0e7Petr Machata		if (!proc->callstack[i].is_syscall)
262e0e89edff4ff9216a9a8631b078858851a15f0e7Petr Machata			proc->callstack[i].return_addr = 0;
263e0e89edff4ff9216a9a8631b078858851a15f0e7Petr Machata
264e0e89edff4ff9216a9a8631b078858851a15f0e7Petr Machata		callstack_pop(proc);
265e0e89edff4ff9216a9a8631b078858851a15f0e7Petr Machata	}
266e0e89edff4ff9216a9a8631b078858851a15f0e7Petr Machata
267e0e89edff4ff9216a9a8631b078858851a15f0e7Petr Machata	if (!was_exec)
2683d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata		free(proc->filename);
2693d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata
2708ead1cde21252e779f29ee4bcd68ae4a1bc86ed9Petr Machata	/* Libraries and symbols.  This is only relevant in
2718ead1cde21252e779f29ee4bcd68ae4a1bc86ed9Petr Machata	 * leader.  */
2723d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata	struct library *lib;
2733d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata	for (lib = proc->libraries; lib != NULL; ) {
2743d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata		struct library *next = lib->next;
2753d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata		library_destroy(lib);
2763d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata		free(lib);
2773d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata		lib = next;
2783d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata	}
2793d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata	proc->libraries = NULL;
2803d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata
2813d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata	/* Breakpoints.  */
2828ead1cde21252e779f29ee4bcd68ae4a1bc86ed9Petr Machata	if (proc->breakpoints != NULL) {
2838ead1cde21252e779f29ee4bcd68ae4a1bc86ed9Petr Machata		proc_each_breakpoint(proc, NULL, destroy_breakpoint_cb, NULL);
284d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata		dict_destroy(proc->breakpoints, NULL, NULL, NULL);
285d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata		free(proc->breakpoints);
2868ead1cde21252e779f29ee4bcd68ae4a1bc86ed9Petr Machata		proc->breakpoints = NULL;
2878ead1cde21252e779f29ee4bcd68ae4a1bc86ed9Petr Machata	}
288e677c7e0b79fc0af7c98436d924fefca7d43f359Petr Machata
289e677c7e0b79fc0af7c98436d924fefca7d43f359Petr Machata	destroy_unwind(proc);
2903d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata}
2913d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata
2923d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machatavoid
293929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataprocess_destroy(struct process *proc)
2943d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata{
295744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machata	arch_process_destroy(proc);
2960f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machata	os_process_destroy(proc);
2973cc0cd11ff97fd013813ae020aaf24dbdc818e43Petr Machata	private_process_destroy(proc, 0);
2983d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata}
2993d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata
3003d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machataint
301929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataprocess_exec(struct process *proc)
3023d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata{
3030f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machata	/* Call exec handlers first, before we destroy the main
3043cc0cd11ff97fd013813ae020aaf24dbdc818e43Petr Machata	 * state.  */
3050f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machata	if (arch_process_exec(proc) < 0
3060f6e6d9861ce790cb8b7d07aca28a5878d705359Petr Machata	    || os_process_exec(proc) < 0)
307744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machata		return -1;
308744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machata
3093d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata	private_process_destroy(proc, 1);
3103cc0cd11ff97fd013813ae020aaf24dbdc818e43Petr Machata
3113d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata	if (process_bare_init(proc, NULL, proc->pid, 1) < 0)
3123d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata		return -1;
3133d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata	if (process_init_main(proc) < 0) {
3143d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata		process_bare_destroy(proc, 1);
3153d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata		return -1;
3163d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata	}
3173d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata	return 0;
3183d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata}
3193d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata
320929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatastruct process *
32175934ad3b30790f6a892069576d0790a351ef101Petr Machataopen_program(const char *filename, pid_t pid)
3222b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata{
3232b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	assert(pid != 0);
324929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata	struct process *proc = malloc(sizeof(*proc));
32575934ad3b30790f6a892069576d0790a351ef101Petr Machata	if (proc == NULL || process_init(proc, filename, pid) < 0) {
3261974dbccbf10a2dd8e06724d2fb4eb61fd91076aPetr Machata		free(proc);
3271974dbccbf10a2dd8e06724d2fb4eb61fd91076aPetr Machata		return NULL;
3281974dbccbf10a2dd8e06724d2fb4eb61fd91076aPetr Machata	}
3292b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	return proc;
3302b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata}
331273ea6d18164e35ee40524e853a6f04706d3bdffJuan Cespedes
3322b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machatastruct clone_single_bp_data {
333929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata	struct process *old_proc;
334929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata	struct process *new_proc;
3352b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata};
3362b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
337d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machatastatic enum callback_status
338d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machataclone_single_bp(arch_addr_t *key, struct breakpoint **bpp, void *u)
3392b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata{
340d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata	struct breakpoint *bp = *bpp;
3412b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	struct clone_single_bp_data *data = u;
3422b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
3432b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	struct breakpoint *clone = malloc(sizeof(*clone));
3442b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	if (clone == NULL
345e50355295eac26e15db259fbb7ff705487b501d0Petr Machata	    || breakpoint_clone(clone, data->new_proc, bp) < 0) {
346d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata	fail:
347d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata		free(clone);
348d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata		return CBS_STOP;
3492b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	}
350d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata	if (proc_add_breakpoint(data->new_proc->leader, clone) < 0) {
351d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata		breakpoint_destroy(clone);
352d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata		goto fail;
353d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata	}
354d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata	return CBS_CONT;
3552b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata}
3562b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
3572b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machataint
358929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataprocess_clone(struct process *retp, struct process *proc, pid_t pid)
3592b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata{
3603d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata	if (process_bare_init(retp, proc->filename, pid, 0) < 0) {
361ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata	fail1:
362f56d129435a34c415214b1ce00b7c23e28ed1c02Petr Machata		fprintf(stderr, "Failed to clone process %d to %d: %s\n",
363cc0e1e4b83d69441cc5f61ea87eda5458ee9fae3Petr Machata			proc->pid, pid, strerror(errno));
3642b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata		return -1;
3652b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	}
3662b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
367cf1679a93919e9a161f7f37be93ba2821315a853Petr Machata	retp->tracesysgood = proc->tracesysgood;
3682cb124c21d5471a5443658b2e31a786856ff2f6dPetr Machata	retp->e_machine = proc->e_machine;
3694d4e1b853db0c97b7c7f023bc301e3c3eee58ce4Petr Machata	retp->e_class = proc->e_class;
370cf1679a93919e9a161f7f37be93ba2821315a853Petr Machata
3712b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	/* For non-leader processes, that's all we need to do.  */
372d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata	if (retp->leader != retp)
3732b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata		return 0;
3742b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
3752b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	/* Clone symbols first so that we can clone and relink
3762b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	 * breakpoints.  */
3772b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	struct library *lib;
3782b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	struct library **nlibp = &retp->libraries;
3791e339e00198972a75892d5073d47f090db5d77a2Petr Machata	for (lib = proc->leader->libraries; lib != NULL; lib = lib->next) {
3802b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata		*nlibp = malloc(sizeof(**nlibp));
381d19b91640b2d1bcfeef14d029891dd93217b9c24Petr Machata
3822b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata		if (*nlibp == NULL
3832b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata		    || library_clone(*nlibp, lib) < 0) {
384d19b91640b2d1bcfeef14d029891dd93217b9c24Petr Machata			free(*nlibp);
385d19b91640b2d1bcfeef14d029891dd93217b9c24Petr Machata			*nlibp = NULL;
386d19b91640b2d1bcfeef14d029891dd93217b9c24Petr Machata
3872b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata		fail2:
3883d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata			process_bare_destroy(retp, 0);
3892b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
3902b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata			/* Error when cloning.  Unroll what was done.  */
3912b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata			for (lib = retp->libraries; lib != NULL; ) {
3922b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata				struct library *next = lib->next;
3932b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata				library_destroy(lib);
3942b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata				free(lib);
3952b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata				lib = next;
3962b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata			}
397ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata			goto fail1;
3981974dbccbf10a2dd8e06724d2fb4eb61fd91076aPetr Machata		}
3992b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
4002b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata		nlibp = &(*nlibp)->next;
40161196a4a81e77322bf1f3dc609007f5d35a5103aPetr Machata	}
402ab3b72cc5d2d3efb3542192f0d72ff2ea4b082f9Joe Damato
4032b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	/* Now clone breakpoints.  Symbol relinking is done in
4042b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	 * clone_single_bp.  */
4052b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	struct clone_single_bp_data data = {
4062b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata		.old_proc = proc,
4072b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata		.new_proc = retp,
4082b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	};
409d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata	if (DICT_EACH(proc->leader->breakpoints,
410d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata		      arch_addr_t, struct breakpoint *, NULL,
411d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata		      clone_single_bp, &data) != NULL)
41294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata		goto fail2;
4132b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
414ded6f97d105f3597246376d45ff455d16016c3f0Petr Machata	/* And finally the call stack.  */
415b6de841675aab74d1700aa379535b76ef183bec2Petr Machata	/* XXX clearly the callstack handling should be moved to a
416b6de841675aab74d1700aa379535b76ef183bec2Petr Machata	 * separate module and this whole business extracted to
417b6de841675aab74d1700aa379535b76ef183bec2Petr Machata	 * callstack_clone, or callstack_element_clone.  */
418ded6f97d105f3597246376d45ff455d16016c3f0Petr Machata	memcpy(retp->callstack, proc->callstack, sizeof(retp->callstack));
419ded6f97d105f3597246376d45ff455d16016c3f0Petr Machata	retp->callstack_depth = proc->callstack_depth;
420ded6f97d105f3597246376d45ff455d16016c3f0Petr Machata
42194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata	size_t i;
42294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata	for (i = 0; i < retp->callstack_depth; ++i) {
423b6de841675aab74d1700aa379535b76ef183bec2Petr Machata		struct callstack_element *elem = &retp->callstack[i];
424b6de841675aab74d1700aa379535b76ef183bec2Petr Machata		struct fetch_context *ctx = elem->fetch_context;
425f6ec08afb96292fd3c802c1f633d8de249664c72Petr Machata		if (ctx != NULL) {
426ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata			struct fetch_context *nctx = fetch_arg_clone(retp, ctx);
427f6ec08afb96292fd3c802c1f633d8de249664c72Petr Machata			if (nctx == NULL) {
428ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata				size_t j;
429ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata			fail3:
430f6ec08afb96292fd3c802c1f633d8de249664c72Petr Machata				for (j = 0; j < i; ++j) {
431f56d129435a34c415214b1ce00b7c23e28ed1c02Petr Machata					nctx = retp->callstack[j].fetch_context;
432f6ec08afb96292fd3c802c1f633d8de249664c72Petr Machata					fetch_arg_done(nctx);
433b6de841675aab74d1700aa379535b76ef183bec2Petr Machata					elem->fetch_context = NULL;
434f6ec08afb96292fd3c802c1f633d8de249664c72Petr Machata				}
435f6ec08afb96292fd3c802c1f633d8de249664c72Petr Machata				goto fail2;
436f6ec08afb96292fd3c802c1f633d8de249664c72Petr Machata			}
437b6de841675aab74d1700aa379535b76ef183bec2Petr Machata			elem->fetch_context = nctx;
438f6ec08afb96292fd3c802c1f633d8de249664c72Petr Machata		}
439f6ec08afb96292fd3c802c1f633d8de249664c72Petr Machata
440f56d129435a34c415214b1ce00b7c23e28ed1c02Petr Machata		if (elem->arguments != NULL) {
44194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata			struct value_dict *nargs = malloc(sizeof(*nargs));
44294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata			if (nargs == NULL
443f56d129435a34c415214b1ce00b7c23e28ed1c02Petr Machata			    || val_dict_clone(nargs, elem->arguments) < 0) {
444ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata				size_t j;
44594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata				for (j = 0; j < i; ++j) {
446f56d129435a34c415214b1ce00b7c23e28ed1c02Petr Machata					nargs = retp->callstack[j].arguments;
44794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata					val_dict_destroy(nargs);
44894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata					free(nargs);
449b6de841675aab74d1700aa379535b76ef183bec2Petr Machata					elem->arguments = NULL;
45094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata				}
451f6ec08afb96292fd3c802c1f633d8de249664c72Petr Machata
452f6ec08afb96292fd3c802c1f633d8de249664c72Petr Machata				/* Pretend that this round went well,
453ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata				 * so that fail3 frees I-th
454f6ec08afb96292fd3c802c1f633d8de249664c72Petr Machata				 * fetch_context.  */
455f6ec08afb96292fd3c802c1f633d8de249664c72Petr Machata				++i;
456ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata				goto fail3;
45794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata			}
458b6de841675aab74d1700aa379535b76ef183bec2Petr Machata			elem->arguments = nargs;
45994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata		}
460165b566a50b2bd560af3bd9649e456915397066bPetr Machata
461165b566a50b2bd560af3bd9649e456915397066bPetr Machata		/* If it's not a syscall, we need to find the
462165b566a50b2bd560af3bd9649e456915397066bPetr Machata		 * corresponding library symbol in the cloned
463165b566a50b2bd560af3bd9649e456915397066bPetr Machata		 * library.  */
464165b566a50b2bd560af3bd9649e456915397066bPetr Machata		if (!elem->is_syscall && elem->c_un.libfunc != NULL) {
465165b566a50b2bd560af3bd9649e456915397066bPetr Machata			struct library_symbol *libfunc = elem->c_un.libfunc;
466165b566a50b2bd560af3bd9649e456915397066bPetr Machata			int rc = proc_find_symbol(retp, libfunc,
467165b566a50b2bd560af3bd9649e456915397066bPetr Machata						  NULL, &elem->c_un.libfunc);
468165b566a50b2bd560af3bd9649e456915397066bPetr Machata			assert(rc == 0);
469165b566a50b2bd560af3bd9649e456915397066bPetr Machata		}
47094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata	}
4712b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
4725bf471403f1145fb004005b99eb439969d672dcdPetr Machata	/* At this point, retp is fully initialized, except for OS and
4735bf471403f1145fb004005b99eb439969d672dcdPetr Machata	 * arch parts, and we can call private_process_destroy.  */
4745bf471403f1145fb004005b99eb439969d672dcdPetr Machata	if (os_process_clone(retp, proc) < 0) {
4755bf471403f1145fb004005b99eb439969d672dcdPetr Machata		private_process_destroy(retp, 0);
4765bf471403f1145fb004005b99eb439969d672dcdPetr Machata		return -1;
4775bf471403f1145fb004005b99eb439969d672dcdPetr Machata	}
4785bf471403f1145fb004005b99eb439969d672dcdPetr Machata	if (arch_process_clone(retp, proc) < 0) {
4795bf471403f1145fb004005b99eb439969d672dcdPetr Machata		os_process_destroy(retp);
4805bf471403f1145fb004005b99eb439969d672dcdPetr Machata		private_process_destroy(retp, 0);
4815bf471403f1145fb004005b99eb439969d672dcdPetr Machata		return -1;
4825bf471403f1145fb004005b99eb439969d672dcdPetr Machata	}
483744f255ed0d676896dbe2f326b9c353c56438f0aPetr Machata
4842b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	return 0;
485273ea6d18164e35ee40524e853a6f04706d3bdffJuan Cespedes}
486273ea6d18164e35ee40524e853a6f04706d3bdffJuan Cespedes
4873c516d5ced53508d8df7d82914a3190a3235b62dPetr Machatastatic int
4889a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machataopen_one_pid(pid_t pid)
4899a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata{
4909a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata	debug(DEBUG_PROCESS, "open_one_pid(pid=%d)", pid);
4919a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata
4921974dbccbf10a2dd8e06724d2fb4eb61fd91076aPetr Machata	/* Get the filename first.  Should the trace_pid fail, we can
4931974dbccbf10a2dd8e06724d2fb4eb61fd91076aPetr Machata	 * easily free it, untracing is more work.  */
494929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata	char *filename = pid2name(pid);
495929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata	if (filename == NULL || trace_pid(pid) < 0) {
496ef0c74de9320c86ab1f08e5f9c15b031ed36d01fPetr Machata	fail:
4971974dbccbf10a2dd8e06724d2fb4eb61fd91076aPetr Machata		free(filename);
4981974dbccbf10a2dd8e06724d2fb4eb61fd91076aPetr Machata		return -1;
4991974dbccbf10a2dd8e06724d2fb4eb61fd91076aPetr Machata	}
500273ea6d18164e35ee40524e853a6f04706d3bdffJuan Cespedes
501929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata	struct process *proc = open_program(filename, pid);
5021974dbccbf10a2dd8e06724d2fb4eb61fd91076aPetr Machata	if (proc == NULL)
503ef0c74de9320c86ab1f08e5f9c15b031ed36d01fPetr Machata		goto fail;
504ef0c74de9320c86ab1f08e5f9c15b031ed36d01fPetr Machata	free(filename);
5053ed2a4227d5f2a8d44f3c6ffd704a9d2e867c591Petr Machata	trace_set_options(proc);
5063c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata
5071974dbccbf10a2dd8e06724d2fb4eb61fd91076aPetr Machata	return 0;
5081974dbccbf10a2dd8e06724d2fb4eb61fd91076aPetr Machata}
5091974dbccbf10a2dd8e06724d2fb4eb61fd91076aPetr Machata
5102b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machatastatic enum callback_status
511929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatastart_one_pid(struct process *proc, void *data)
5121974dbccbf10a2dd8e06724d2fb4eb61fd91076aPetr Machata{
5131974dbccbf10a2dd8e06724d2fb4eb61fd91076aPetr Machata	continue_process(proc->pid);
5142b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	return CBS_CONT;
515273ea6d18164e35ee40524e853a6f04706d3bdffJuan Cespedes}
516e74c80de19a628cab68f10a1e7c92bef2988aafbJuan Cespedes
517df2c88cec5bf17a92f0d5d740e3b756f00b798c6Petr Machatastatic enum callback_status
518df2c88cec5bf17a92f0d5d740e3b756f00b798c6Petr Machatais_main(struct process *proc, struct library *lib, void *data)
519df2c88cec5bf17a92f0d5d740e3b756f00b798c6Petr Machata{
520df2c88cec5bf17a92f0d5d740e3b756f00b798c6Petr Machata	return CBS_STOP_IF(lib->type == LT_LIBTYPE_MAIN);
521df2c88cec5bf17a92f0d5d740e3b756f00b798c6Petr Machata}
522df2c88cec5bf17a92f0d5d740e3b756f00b798c6Petr Machata
523df2c88cec5bf17a92f0d5d740e3b756f00b798c6Petr Machatavoid
524df2c88cec5bf17a92f0d5d740e3b756f00b798c6Petr Machataprocess_hit_start(struct process *proc)
525df2c88cec5bf17a92f0d5d740e3b756f00b798c6Petr Machata{
526df2c88cec5bf17a92f0d5d740e3b756f00b798c6Petr Machata	struct process *leader = proc->leader;
527df2c88cec5bf17a92f0d5d740e3b756f00b798c6Petr Machata	assert(leader != NULL);
528df2c88cec5bf17a92f0d5d740e3b756f00b798c6Petr Machata
529df2c88cec5bf17a92f0d5d740e3b756f00b798c6Petr Machata	struct library *mainlib
530df2c88cec5bf17a92f0d5d740e3b756f00b798c6Petr Machata		= proc_each_library(leader, NULL, is_main, NULL);
531df2c88cec5bf17a92f0d5d740e3b756f00b798c6Petr Machata	assert(mainlib != NULL);
532df2c88cec5bf17a92f0d5d740e3b756f00b798c6Petr Machata	linkmap_init(leader, mainlib->dyn_addr);
533df2c88cec5bf17a92f0d5d740e3b756f00b798c6Petr Machata	arch_dynlink_done(leader);
534df2c88cec5bf17a92f0d5d740e3b756f00b798c6Petr Machata}
535df2c88cec5bf17a92f0d5d740e3b756f00b798c6Petr Machata
5369a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machatavoid
5379a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machataopen_pid(pid_t pid)
5389a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata{
5399a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata	debug(DEBUG_PROCESS, "open_pid(pid=%d)", pid);
5403c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata	/* If we are already tracing this guy, we should be seeing all
5413c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata	 * his children via normal tracing route.  */
5423c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata	if (pid2proc(pid) != NULL)
5433c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata		return;
5443c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata
5453c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata	/* First, see if we can attach the requested PID itself.  */
5468be68ff436d32e803907e6dda3dc994c495d2f1ePetr Machata	if (open_one_pid(pid) < 0) {
5473c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata		fprintf(stderr, "Cannot attach to pid %u: %s\n",
5483c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata			pid, strerror(errno));
549cec06ec8282c538a40bde968ae36fe8356daffaaPetr Machata		trace_fail_warning(pid);
5503c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata		return;
5519a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata	}
5529a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata
5533c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata	/* Now attach to all tasks that belong to that PID.  There's a
5543c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata	 * race between process_tasks and open_one_pid.  So when we
5553c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata	 * fail in open_one_pid below, we just do another round.
5563c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata	 * Chances are that by then that PID will have gone away, and
5573c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata	 * that's why we have seen the failure.  The processes that we
5583c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata	 * manage to open_one_pid are stopped, so we should eventually
5593c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata	 * reach a point where process_tasks doesn't give any new
5603c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata	 * processes (because there's nobody left to produce
5613c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata	 * them).  */
5621974dbccbf10a2dd8e06724d2fb4eb61fd91076aPetr Machata	size_t old_ntasks = 0;
5633c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata	int have_all;
5641974dbccbf10a2dd8e06724d2fb4eb61fd91076aPetr Machata	while (1) {
5653c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata		pid_t *tasks;
5663c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata		size_t ntasks;
5673c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata		size_t i;
5681974dbccbf10a2dd8e06724d2fb4eb61fd91076aPetr Machata
5693c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata		if (process_tasks(pid, &tasks, &ntasks) < 0) {
5703c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata			fprintf(stderr, "Cannot obtain tasks of pid %u: %s\n",
5713c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata				pid, strerror(errno));
572fed1e8d33ab050df892a88110e1a316d285ee650Petr Machata			break;
5733c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata		}
5743c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata
5753c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata		have_all = 1;
5763c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata		for (i = 0; i < ntasks; ++i)
5773c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata			if (pid2proc(tasks[i]) == NULL
5788be68ff436d32e803907e6dda3dc994c495d2f1ePetr Machata			    && open_one_pid(tasks[i]) < 0)
5793c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata				have_all = 0;
5809a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata
5819a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata		free(tasks);
5823c516d5ced53508d8df7d82914a3190a3235b62dPetr Machata
5831974dbccbf10a2dd8e06724d2fb4eb61fd91076aPetr Machata		if (have_all && old_ntasks == ntasks)
5841974dbccbf10a2dd8e06724d2fb4eb61fd91076aPetr Machata			break;
5851974dbccbf10a2dd8e06724d2fb4eb61fd91076aPetr Machata		old_ntasks = ntasks;
5861974dbccbf10a2dd8e06724d2fb4eb61fd91076aPetr Machata	}
5871974dbccbf10a2dd8e06724d2fb4eb61fd91076aPetr Machata
588929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata	struct process *leader = pid2proc(pid)->leader;
58993d95dff48698b8bde511c7f71acda7646da2626Petr Machata
59093d95dff48698b8bde511c7f71acda7646da2626Petr Machata	/* XXX Is there a way to figure out whether _start has
59193d95dff48698b8bde511c7f71acda7646da2626Petr Machata	 * actually already been hit?  */
592df2c88cec5bf17a92f0d5d740e3b756f00b798c6Petr Machata	process_hit_start(leader);
59393d95dff48698b8bde511c7f71acda7646da2626Petr Machata
5942f9b78e38a45f00991baca17eb036d5e87d8d417Petr Machata	/* Done.  Continue everyone.  */
59593d95dff48698b8bde511c7f71acda7646da2626Petr Machata	each_task(leader, NULL, start_one_pid, NULL);
5969a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata}
5979a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata
5982b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machatastatic enum callback_status
599929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatafind_proc(struct process *proc, void *data)
600cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata{
6017725d4b171138e8d2b77c8a1186e9f8215b6c91fPetr Machata	return CBS_STOP_IF(proc->pid == (pid_t)(uintptr_t)data);
602cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata}
603cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata
604929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatastruct process *
605929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatapid2proc(pid_t pid)
606929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata{
607cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata	return each_process(NULL, &find_proc, (void *)(uintptr_t)pid);
608cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata}
609cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata
610929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatastatic struct process *list_of_processes = NULL;
611cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata
612cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machatastatic void
613929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataunlist_process(struct process *proc)
614cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata{
615cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata	if (list_of_processes == proc) {
616cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata		list_of_processes = list_of_processes->next;
617cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata		return;
618cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata	}
619cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata
620929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata	struct process *tmp;
621cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata	for (tmp = list_of_processes; ; tmp = tmp->next) {
622cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata		/* If the following assert fails, the process wasn't
623cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata		 * in the list.  */
624cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata		assert(tmp->next != NULL);
625cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata
626cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata		if (tmp->next == proc) {
627cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata			tmp->next = tmp->next->next;
628cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata			return;
629cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata		}
630cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata	}
631cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata}
632cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata
633929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatastruct process *
634929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataeach_process(struct process *start_after,
635929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata	     enum callback_status(*cb)(struct process *proc, void *data),
6362b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	     void *data)
637cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata{
638929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata	struct process *it = start_after == NULL ? list_of_processes
63974132a447b18c588c698ecfb8cf4ad4b16360f2fPetr Machata		: start_after->next;
64074132a447b18c588c698ecfb8cf4ad4b16360f2fPetr Machata
64174132a447b18c588c698ecfb8cf4ad4b16360f2fPetr Machata	while (it != NULL) {
642cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata		/* Callback might call remove_process.  */
643929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata		struct process *next = it->next;
6442b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata		switch ((*cb)(it, data)) {
645ef7fa37f2d0b949b5afb1f326187e4f023d86c25Petr Machata		case CBS_FAIL:
646ef7fa37f2d0b949b5afb1f326187e4f023d86c25Petr Machata			/* XXX handle me */
6472b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata		case CBS_STOP:
648cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata			return it;
6492b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata		case CBS_CONT:
6502b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata			break;
6512b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata		}
652cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata		it = next;
653cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata	}
654cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata	return NULL;
655cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata}
6569a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata
657929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatastruct process *
658929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataeach_task(struct process *proc, struct process *start_after,
659929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata	  enum callback_status(*cb)(struct process *proc, void *data),
6602b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	  void *data)
6619a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata{
66274132a447b18c588c698ecfb8cf4ad4b16360f2fPetr Machata	assert(proc != NULL);
663929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata	struct process *it = start_after == NULL ? proc->leader
66474132a447b18c588c698ecfb8cf4ad4b16360f2fPetr Machata		: start_after->next;
66574132a447b18c588c698ecfb8cf4ad4b16360f2fPetr Machata
6669a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata	if (it != NULL) {
667929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata		struct process *leader = it->leader;
66874132a447b18c588c698ecfb8cf4ad4b16360f2fPetr Machata		while (it != NULL && it->leader == leader) {
6699a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata			/* Callback might call remove_process.  */
670929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata			struct process *next = it->next;
6712b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata			switch ((*cb)(it, data)) {
672ef7fa37f2d0b949b5afb1f326187e4f023d86c25Petr Machata			case CBS_FAIL:
673ef7fa37f2d0b949b5afb1f326187e4f023d86c25Petr Machata				/* XXX handle me */
6742b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata			case CBS_STOP:
6759a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata				return it;
6762b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata			case CBS_CONT:
6772b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata				break;
6782b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata			}
6799a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata			it = next;
6809a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata		}
6819a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata	}
6829a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata	return NULL;
6839a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata}
6849a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata
685baf00e4ebd96bba26804696fbee73e662678ef6aPetr Machatastatic int
686929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataadd_process(struct process *proc, int was_exec)
687cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata{
688929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata	struct process **leaderp = &list_of_processes;
6899a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata	if (proc->pid) {
6909a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata		pid_t tgid = process_leader(proc->pid);
6911974dbccbf10a2dd8e06724d2fb4eb61fd91076aPetr Machata		if (tgid == 0)
6921974dbccbf10a2dd8e06724d2fb4eb61fd91076aPetr Machata			/* Must have been terminated before we managed
6931974dbccbf10a2dd8e06724d2fb4eb61fd91076aPetr Machata			 * to fully attach.  */
694baf00e4ebd96bba26804696fbee73e662678ef6aPetr Machata			return -1;
695929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata		if (tgid == proc->pid) {
6969a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata			proc->leader = proc;
697929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata		} else {
698929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata			struct process *leader = pid2proc(tgid);
6999a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata			proc->leader = leader;
7009a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata			if (leader != NULL)
7019a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata				leaderp = &leader->next;
7029a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata		}
7039a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata	}
7043d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata
7053d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata	if (!was_exec) {
7063d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata		proc->next = *leaderp;
7073d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata		*leaderp = proc;
7083d0c91c0c7b425e2866f9c65f655d399693328a5Petr Machata	}
709baf00e4ebd96bba26804696fbee73e662678ef6aPetr Machata	return 0;
7109a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata}
7119a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata
712cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machatavoid
713929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatachange_process_leader(struct process *proc, struct process *leader)
714cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata{
715929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata	struct process **leaderp = &list_of_processes;
716cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata	if (proc->leader == leader)
717cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata		return;
718cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata
719cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata	assert(leader != NULL);
720cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata	unlist_process(proc);
721cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata	if (proc != leader)
722cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata		leaderp = &leader->next;
723cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata
724cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata	proc->leader = leader;
725cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata	proc->next = *leaderp;
726cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata	*leaderp = proc;
727cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata}
728cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata
7292b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machatastatic enum callback_status
730929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataclear_leader(struct process *proc, void *data)
7319a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata{
7329a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata	debug(DEBUG_FUNCTION, "detach_task %d from leader %d",
7339a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata	      proc->pid, proc->leader->pid);
7349a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata	proc->leader = NULL;
7352b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	return CBS_CONT;
736cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata}
737e74c80de19a628cab68f10a1e7c92bef2988aafbJuan Cespedes
738cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machatavoid
739929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataremove_process(struct process *proc)
740cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata{
741cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata	debug(DEBUG_FUNCTION, "remove_proc(pid=%d)", proc->pid);
742cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata
7439a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata	if (proc->leader == proc)
74474132a447b18c588c698ecfb8cf4ad4b16360f2fPetr Machata		each_task(proc, NULL, &clear_leader, NULL);
7459a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata
746cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata	unlist_process(proc);
747cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machata	process_removed(proc);
7489b87e82848a8a7e3e8dadf917c0262d838661596Petr Machata	process_destroy(proc);
7499b87e82848a8a7e3e8dadf917c0262d838661596Petr Machata	free(proc);
750e74c80de19a628cab68f10a1e7c92bef2988aafbJuan Cespedes}
7514007d74c2435ce4b50305d64ffe831627f989335Petr Machata
7524007d74c2435ce4b50305d64ffe831627f989335Petr Machatavoid
753929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatainstall_event_handler(struct process *proc, struct event_handler *handler)
7544007d74c2435ce4b50305d64ffe831627f989335Petr Machata{
75575dcf7d73b6c19f7aeb932e4cb5e251b316a6c69Petr Machata	debug(DEBUG_FUNCTION, "install_event_handler(pid=%d, %p)", proc->pid, handler);
7564007d74c2435ce4b50305d64ffe831627f989335Petr Machata	assert(proc->event_handler == NULL);
7574007d74c2435ce4b50305d64ffe831627f989335Petr Machata	proc->event_handler = handler;
7584007d74c2435ce4b50305d64ffe831627f989335Petr Machata}
7594007d74c2435ce4b50305d64ffe831627f989335Petr Machata
7604007d74c2435ce4b50305d64ffe831627f989335Petr Machatavoid
761929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatadestroy_event_handler(struct process *proc)
7624007d74c2435ce4b50305d64ffe831627f989335Petr Machata{
763366c2f46d844f040458df9b7e35fc3b8527ed2d3Petr Machata	struct event_handler *handler = proc->event_handler;
76475dcf7d73b6c19f7aeb932e4cb5e251b316a6c69Petr Machata	debug(DEBUG_FUNCTION, "destroy_event_handler(pid=%d, %p)", proc->pid, handler);
7654007d74c2435ce4b50305d64ffe831627f989335Petr Machata	assert(handler != NULL);
766cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata	if (handler->destroy != NULL)
767cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata		handler->destroy(handler);
7684007d74c2435ce4b50305d64ffe831627f989335Petr Machata	free(handler);
7694007d74c2435ce4b50305d64ffe831627f989335Petr Machata	proc->event_handler = NULL;
7704007d74c2435ce4b50305d64ffe831627f989335Petr Machata}
7712b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
772ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machatastatic int
773929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatabreakpoint_for_symbol(struct library_symbol *libsym, struct process *proc)
7742b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata{
775ad64047d1d724637896d0f93af1a8fcce758c9b5Edgar E. Iglesias	arch_addr_t bp_addr;
776d5e85569fa3cd1705eca0bd9a4ab79cf908e5faaPetr Machata	assert(proc->leader == proc);
777d5e85569fa3cd1705eca0bd9a4ab79cf908e5faaPetr Machata
778ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machata	/* Don't enable latent or delayed symbols.  */
77996f0482fa1d15f4e6be75b49ff5fa8d77602be7bPetr Machata	if (libsym->latent || libsym->delayed) {
78096f0482fa1d15f4e6be75b49ff5fa8d77602be7bPetr Machata		debug(DEBUG_FUNCTION,
78196f0482fa1d15f4e6be75b49ff5fa8d77602be7bPetr Machata		      "delayed and/or latent breakpoint pid=%d, %s@%p",
78296f0482fa1d15f4e6be75b49ff5fa8d77602be7bPetr Machata		      proc->pid, libsym->name, libsym->enter_addr);
783ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machata		return 0;
78496f0482fa1d15f4e6be75b49ff5fa8d77602be7bPetr Machata	}
7856ef7b2597cd3f4edf851a7b3516aef7449e554adEdgar E. Iglesias
786f97b187598192f4c1f0ea47369f4e1dd4c08c392Edgar E. Iglesias	bp_addr = sym2addr(proc, libsym);
787f97b187598192f4c1f0ea47369f4e1dd4c08c392Edgar E. Iglesias
788d5e85569fa3cd1705eca0bd9a4ab79cf908e5faaPetr Machata	/* If there is an artificial breakpoint on the same address,
789d5e85569fa3cd1705eca0bd9a4ab79cf908e5faaPetr Machata	 * its libsym will be NULL, and we can smuggle our libsym
790d5e85569fa3cd1705eca0bd9a4ab79cf908e5faaPetr Machata	 * there.  That artificial breakpoint is there presumably for
791d5e85569fa3cd1705eca0bd9a4ab79cf908e5faaPetr Machata	 * the callbacks, which we don't touch.  If there is a real
792d5e85569fa3cd1705eca0bd9a4ab79cf908e5faaPetr Machata	 * breakpoint, then this is a bug.  ltrace-elf.c should filter
793a24163658be2cc9249621701e6d056df0063f52fPetr Machata	 * symbols and ignore extra symbol aliases.
794a24163658be2cc9249621701e6d056df0063f52fPetr Machata	 *
795a24163658be2cc9249621701e6d056df0063f52fPetr Machata	 * The other direction is more complicated and currently not
796a24163658be2cc9249621701e6d056df0063f52fPetr Machata	 * supported.  If a breakpoint has custom callbacks, it might
797a24163658be2cc9249621701e6d056df0063f52fPetr Machata	 * be also custom-allocated, and we would really need to swap
798a24163658be2cc9249621701e6d056df0063f52fPetr Machata	 * the two: delete the one now in the dictionary, swap values
799a24163658be2cc9249621701e6d056df0063f52fPetr Machata	 * around, and put the new breakpoint back in.  */
80098ff309cdc98857eb30992f108439cb7d7673598Petr Machata	struct breakpoint *bp;
80198ff309cdc98857eb30992f108439cb7d7673598Petr Machata	if (DICT_FIND_VAL(proc->breakpoints, &bp_addr, &bp) == 0) {
8028d58d8b6f0922f57c6fed8e65df86ba57bba31f1Petr Machata		/* MIPS backend makes duplicate requests.  This is
8038d58d8b6f0922f57c6fed8e65df86ba57bba31f1Petr Machata		 * likely a bug in the backend.  Currently there's no
8048d58d8b6f0922f57c6fed8e65df86ba57bba31f1Petr Machata		 * point assigning more than one symbol to a
8058d58d8b6f0922f57c6fed8e65df86ba57bba31f1Petr Machata		 * breakpoint, because when it hits, we won't know
8068d58d8b6f0922f57c6fed8e65df86ba57bba31f1Petr Machata		 * what to print out.  But it's easier to fix it here
8078d58d8b6f0922f57c6fed8e65df86ba57bba31f1Petr Machata		 * before someone who understands MIPS has the time to
8088d58d8b6f0922f57c6fed8e65df86ba57bba31f1Petr Machata		 * look into it.  So turn the sanity check off on
8098d58d8b6f0922f57c6fed8e65df86ba57bba31f1Petr Machata		 * MIPS.  References:
8108d58d8b6f0922f57c6fed8e65df86ba57bba31f1Petr Machata		 *
8118d58d8b6f0922f57c6fed8e65df86ba57bba31f1Petr Machata		 *   http://lists.alioth.debian.org/pipermail/ltrace-devel/2012-November/000764.html
8128d58d8b6f0922f57c6fed8e65df86ba57bba31f1Petr Machata		 *   http://lists.alioth.debian.org/pipermail/ltrace-devel/2012-November/000770.html
8138d58d8b6f0922f57c6fed8e65df86ba57bba31f1Petr Machata		 */
8148d58d8b6f0922f57c6fed8e65df86ba57bba31f1Petr Machata#ifndef __mips__
81598ff309cdc98857eb30992f108439cb7d7673598Petr Machata		assert(bp->libsym == NULL);
81698ff309cdc98857eb30992f108439cb7d7673598Petr Machata		bp->libsym = libsym;
8178d58d8b6f0922f57c6fed8e65df86ba57bba31f1Petr Machata#endif
818ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machata		return 0;
819d5e85569fa3cd1705eca0bd9a4ab79cf908e5faaPetr Machata	}
8202b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
82198ff309cdc98857eb30992f108439cb7d7673598Petr Machata	bp = malloc(sizeof(*bp));
8223fd099b71ae9e0c4fe9f48a239523e7037e4baf4Petr Machata	if (bp == NULL
823ad64047d1d724637896d0f93af1a8fcce758c9b5Edgar E. Iglesias	    || breakpoint_init(bp, proc, bp_addr, libsym) < 0) {
8243fd099b71ae9e0c4fe9f48a239523e7037e4baf4Petr Machata	fail:
8253fd099b71ae9e0c4fe9f48a239523e7037e4baf4Petr Machata		free(bp);
826ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machata		return -1;
8273fd099b71ae9e0c4fe9f48a239523e7037e4baf4Petr Machata	}
8283fd099b71ae9e0c4fe9f48a239523e7037e4baf4Petr Machata	if (proc_add_breakpoint(proc, bp) < 0) {
8293fd099b71ae9e0c4fe9f48a239523e7037e4baf4Petr Machata		breakpoint_destroy(bp);
8303fd099b71ae9e0c4fe9f48a239523e7037e4baf4Petr Machata		goto fail;
8313fd099b71ae9e0c4fe9f48a239523e7037e4baf4Petr Machata	}
8322b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
833fa0c5704352beb3f81efe8970dbd5af45a4b00cePetr Machata	if (breakpoint_turn_on(bp, proc) < 0) {
83476dd9290bd760f363a6f39db06020e61e3f7b345Petr Machata		proc_remove_breakpoint(proc, bp);
83576dd9290bd760f363a6f39db06020e61e3f7b345Petr Machata		breakpoint_destroy(bp);
83676dd9290bd760f363a6f39db06020e61e3f7b345Petr Machata		goto fail;
83776dd9290bd760f363a6f39db06020e61e3f7b345Petr Machata	}
83876dd9290bd760f363a6f39db06020e61e3f7b345Petr Machata
839ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machata	return 0;
840ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machata}
841ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machata
842ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machatastatic enum callback_status
843ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machatacb_breakpoint_for_symbol(struct library_symbol *libsym, void *data)
844ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machata{
8457725d4b171138e8d2b77c8a1186e9f8215b6c91fPetr Machata	return CBS_STOP_IF(breakpoint_for_symbol(libsym, data) < 0);
846ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machata}
847ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machata
848ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machatastatic int
849929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataproc_activate_latent_symbol(struct process *proc,
850ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machata			    struct library_symbol *libsym)
851ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machata{
852ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machata	assert(libsym->latent);
853ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machata	libsym->latent = 0;
85496f0482fa1d15f4e6be75b49ff5fa8d77602be7bPetr Machata	debug(DEBUG_FUNCTION, "activated latent symbol");
855ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machata	return breakpoint_for_symbol(libsym, proc);
856ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machata}
857ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machata
858ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machataint
859929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataproc_activate_delayed_symbol(struct process *proc,
860ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machata			     struct library_symbol *libsym)
861ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machata{
862ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machata	assert(libsym->delayed);
863ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machata	libsym->delayed = 0;
86496f0482fa1d15f4e6be75b49ff5fa8d77602be7bPetr Machata	debug(DEBUG_FUNCTION, "activated delayed symbol");
865ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machata	return breakpoint_for_symbol(libsym, proc);
8662b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata}
8672b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
868a1f768374c98ac0ed616482916bfedbe98753ebaPetr Machatastatic enum callback_status
869929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataactivate_latent_in(struct process *proc, struct library *lib, void *data)
870a1f768374c98ac0ed616482916bfedbe98753ebaPetr Machata{
871a1f768374c98ac0ed616482916bfedbe98753ebaPetr Machata	struct library_exported_name *exported;
872a1f768374c98ac0ed616482916bfedbe98753ebaPetr Machata	for (exported = data; exported != NULL; exported = exported->next) {
873a1f768374c98ac0ed616482916bfedbe98753ebaPetr Machata		struct library_symbol *libsym = NULL;
874a1f768374c98ac0ed616482916bfedbe98753ebaPetr Machata		while ((libsym = library_each_symbol(lib, libsym,
875a1f768374c98ac0ed616482916bfedbe98753ebaPetr Machata						     library_symbol_named_cb,
876a1f768374c98ac0ed616482916bfedbe98753ebaPetr Machata						     (void *)exported->name))
877a1f768374c98ac0ed616482916bfedbe98753ebaPetr Machata		       != NULL)
878a1f768374c98ac0ed616482916bfedbe98753ebaPetr Machata			if (libsym->latent
879a1f768374c98ac0ed616482916bfedbe98753ebaPetr Machata			    && proc_activate_latent_symbol(proc, libsym) < 0)
880a1f768374c98ac0ed616482916bfedbe98753ebaPetr Machata				return CBS_FAIL;
881a1f768374c98ac0ed616482916bfedbe98753ebaPetr Machata	}
882a1f768374c98ac0ed616482916bfedbe98753ebaPetr Machata	return CBS_CONT;
883a1f768374c98ac0ed616482916bfedbe98753ebaPetr Machata}
884a1f768374c98ac0ed616482916bfedbe98753ebaPetr Machata
8852b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machatavoid
886929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataproc_add_library(struct process *proc, struct library *lib)
8872b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata{
8882b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	assert(lib->next == NULL);
8892b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	lib->next = proc->libraries;
8902b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	proc->libraries = lib;
8918b00d5bb6a0925ece06aad0d9df0a85e8dbd7b57Petr Machata	debug(DEBUG_PROCESS, "added library %s@%p (%s) to %d",
8928b00d5bb6a0925ece06aad0d9df0a85e8dbd7b57Petr Machata	      lib->soname, lib->base, lib->pathname, proc->pid);
8932b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
894dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard#if defined(HAVE_LIBDW)
895dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard	if (options.bt_depth > 0) {
896dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard		/* Setup module tracking for libdwfl unwinding.  */
897dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard		struct process *leader = proc->leader;
898dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard		Dwfl *dwfl = leader->dwfl;
899dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard		if (dwfl == NULL) {
900dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard			static const Dwfl_Callbacks proc_callbacks = {
901dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard				.find_elf = dwfl_linux_proc_find_elf,
902dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard				.find_debuginfo = dwfl_standard_find_debuginfo
903dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard			};
904dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard			dwfl = dwfl_begin(&proc_callbacks);
905dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard			if (dwfl == NULL)
906dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard				fprintf(stderr,
907dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard					"Couldn't initialize libdwfl unwinding "
908dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard					"for process %d: %s\n", leader->pid,
909dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard					dwfl_errmsg (-1));
910dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard		}
911dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard
912dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard		if (dwfl != NULL) {
913dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard			dwfl_report_begin_add(dwfl);
914dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard			if (dwfl_report_elf(dwfl, lib->soname,
915dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard					    lib->pathname, -1,
916dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard					    (GElf_Addr) lib->base,
917dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard					    false) == NULL)
918dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard				fprintf(stderr,
919dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard					"dwfl_report_elf %s@%p (%s) %d: %s\n",
920dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard					lib->soname, lib->base, lib->pathname,
921dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard					proc->pid, dwfl_errmsg (-1));
922dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard			dwfl_report_end(dwfl, NULL, NULL);
923dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard
924dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard			if (leader->dwfl == NULL) {
925dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard				int r = dwfl_linux_proc_attach(dwfl,
926dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard							       leader->pid,
927dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard							       true);
928dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard				if (r == 0)
929dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard					leader->dwfl = dwfl;
930dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard				else {
931dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard					const char *msg;
932dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard					dwfl_end(dwfl);
933dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard					if (r < 0)
934dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard						msg = dwfl_errmsg(-1);
935dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard					else
936dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard						msg = strerror(r);
937dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard					fprintf(stderr, "Couldn't initialize "
938dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard						"libdwfl unwinding for "
939dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard						"process %d: %s\n",
940dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard						leader->pid, msg);
941dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard				}
942dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard			}
943dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard		}
944dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard	}
945dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard#endif /* defined(HAVE_LIBDW) */
946dfefa9f057857735a073ea655f5cb34351032c8eMark Wielaard
947ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machata	/* Insert breakpoints for all active (non-latent) symbols.  */
9482b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	struct library_symbol *libsym = NULL;
949ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machata	while ((libsym = library_each_symbol(lib, libsym,
950ef2fd27a347bbb0e7cca7fdee97422f6ae4d4bdaPetr Machata					     cb_breakpoint_for_symbol,
95174132a447b18c588c698ecfb8cf4ad4b16360f2fPetr Machata					     proc)) != NULL)
9523717f290b3538f7a9fca534c0b96f513884c8745Petr Machata		fprintf(stderr,
9533717f290b3538f7a9fca534c0b96f513884c8745Petr Machata			"Couldn't insert breakpoint for %s to %d: %s.\n",
954cc0e1e4b83d69441cc5f61ea87eda5458ee9fae3Petr Machata			libsym->name, proc->pid, strerror(errno));
955a1f768374c98ac0ed616482916bfedbe98753ebaPetr Machata
956a1f768374c98ac0ed616482916bfedbe98753ebaPetr Machata	/* Look through export list of the new library and compare it
957a1f768374c98ac0ed616482916bfedbe98753ebaPetr Machata	 * with latent symbols of all libraries (including this
958a1f768374c98ac0ed616482916bfedbe98753ebaPetr Machata	 * library itself).  */
959a1f768374c98ac0ed616482916bfedbe98753ebaPetr Machata	struct library *lib2 = NULL;
960a1f768374c98ac0ed616482916bfedbe98753ebaPetr Machata	while ((lib2 = proc_each_library(proc, lib2, activate_latent_in,
961a1f768374c98ac0ed616482916bfedbe98753ebaPetr Machata					 lib->exported_names)) != NULL)
962a1f768374c98ac0ed616482916bfedbe98753ebaPetr Machata		fprintf(stderr,
9633717f290b3538f7a9fca534c0b96f513884c8745Petr Machata			"Couldn't activate latent symbols for %s in %d: %s.\n",
9645c5d48092beb90c903461db6a90db2ed73198306Petr Machata			lib2->soname, proc->pid, strerror(errno));
9652b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata}
9662b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
9672b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machataint
968929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataproc_remove_library(struct process *proc, struct library *lib)
9692b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata{
9702b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	struct library **libp;
9712b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	for (libp = &proc->libraries; *libp != NULL; libp = &(*libp)->next)
9722b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata		if (*libp == lib) {
9732b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata			*libp = lib->next;
9742b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata			return 0;
9752b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata		}
9762b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	return -1;
9772b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata}
9782b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
9792b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machatastruct library *
980929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataproc_each_library(struct process *proc, struct library *it,
981929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata		  enum callback_status (*cb)(struct process *proc,
9822b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata					     struct library *lib, void *data),
9832b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata		  void *data)
9842b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata{
9852b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	if (it == NULL)
9862b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata		it = proc->libraries;
987c4763a0aba5a9c4e12f024991bf3f73e6860e33ePetr Machata	else
988c4763a0aba5a9c4e12f024991bf3f73e6860e33ePetr Machata		it = it->next;
9892b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
9902b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	while (it != NULL) {
9912b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata		struct library *next = it->next;
9922b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
9932b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata		switch (cb(proc, it, data)) {
994ef7fa37f2d0b949b5afb1f326187e4f023d86c25Petr Machata		case CBS_FAIL:
995ef7fa37f2d0b949b5afb1f326187e4f023d86c25Petr Machata			/* XXX handle me */
9962b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata		case CBS_STOP:
9972b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata			return it;
9982b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata		case CBS_CONT:
9992b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata			break;
10002b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata		}
10012b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
10022b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata		it = next;
10032b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	}
10042b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata
10052b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	return NULL;
10062b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata}
100752dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata
1008f7fee43f72667f453bba5aaeea6b5490ece6792aPetr Machatastatic void
1009929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatacheck_leader(struct process *proc)
101052dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata{
101152dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata	/* Only the group leader should be getting the breakpoints and
101252dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata	 * thus have ->breakpoint initialized.  */
1013fa0c5704352beb3f81efe8970dbd5af45a4b00cePetr Machata	assert(proc->leader != NULL);
1014fa0c5704352beb3f81efe8970dbd5af45a4b00cePetr Machata	assert(proc->leader == proc);
1015fa0c5704352beb3f81efe8970dbd5af45a4b00cePetr Machata	assert(proc->breakpoints != NULL);
1016f7fee43f72667f453bba5aaeea6b5490ece6792aPetr Machata}
101752dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata
1018f7fee43f72667f453bba5aaeea6b5490ece6792aPetr Machataint
1019929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataproc_add_breakpoint(struct process *proc, struct breakpoint *bp)
1020f7fee43f72667f453bba5aaeea6b5490ece6792aPetr Machata{
1021fa0c5704352beb3f81efe8970dbd5af45a4b00cePetr Machata	debug(DEBUG_FUNCTION, "proc_add_breakpoint(pid=%d, %s@%p)",
102252dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata	      proc->pid, breakpoint_name(bp), bp->addr);
1023f7fee43f72667f453bba5aaeea6b5490ece6792aPetr Machata	check_leader(proc);
102452dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata
1025a24163658be2cc9249621701e6d056df0063f52fPetr Machata	/* XXX We might merge bp->libsym instead of the following
10260092820afcd45fe045ccc294b061bce8da00a1f2Petr Machata	 * assert, but that's not necessary right now.  Read the
10270092820afcd45fe045ccc294b061bce8da00a1f2Petr Machata	 * comment in breakpoint_for_symbol.  */
1028d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata	assert(dict_find(proc->breakpoints, &bp->addr) == NULL);
1029a24163658be2cc9249621701e6d056df0063f52fPetr Machata
1030d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata	if (DICT_INSERT(proc->breakpoints, &bp->addr, &bp) < 0) {
1031cc0e1e4b83d69441cc5f61ea87eda5458ee9fae3Petr Machata		fprintf(stderr,
1032cc0e1e4b83d69441cc5f61ea87eda5458ee9fae3Petr Machata			"couldn't enter breakpoint %s@%p to dictionary: %s\n",
1033cc0e1e4b83d69441cc5f61ea87eda5458ee9fae3Petr Machata			breakpoint_name(bp), bp->addr, strerror(errno));
103452dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata		return -1;
103552dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata	}
103652dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata
103752dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata	return 0;
103852dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata}
103952dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata
1040f7fee43f72667f453bba5aaeea6b5490ece6792aPetr Machatavoid
1041929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataproc_remove_breakpoint(struct process *proc, struct breakpoint *bp)
104252dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata{
1043f7fee43f72667f453bba5aaeea6b5490ece6792aPetr Machata	debug(DEBUG_FUNCTION, "proc_remove_breakpoint(pid=%d, %s@%p)",
1044f7fee43f72667f453bba5aaeea6b5490ece6792aPetr Machata	      proc->pid, breakpoint_name(bp), bp->addr);
1045f7fee43f72667f453bba5aaeea6b5490ece6792aPetr Machata	check_leader(proc);
1046d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata	int rc = DICT_ERASE(proc->breakpoints, &bp->addr, struct breakpoint *,
1047d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata			    NULL, NULL, NULL);
1048d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata	assert(rc == 0);
104952dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata}
1050d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata
1051d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machatastruct each_breakpoint_data
1052d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata{
1053929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata	struct process *proc;
1054929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata	enum callback_status (*cb)(struct process *proc,
1055d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata				   struct breakpoint *bp,
1056d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata				   void *data);
1057d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata	void *cb_data;
1058d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata};
1059d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata
1060d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machatastatic enum callback_status
1061d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machataeach_breakpoint_cb(arch_addr_t *key, struct breakpoint **bpp, void *d)
1062d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata{
1063d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata	struct each_breakpoint_data *data = d;
1064d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata	return data->cb(data->proc, *bpp, data->cb_data);
1065d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata}
1066d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata
10676bcc092da6b7e20c6c2a9a5846536fbd3d77dbb8Petr Machataarch_addr_t *
10686bcc092da6b7e20c6c2a9a5846536fbd3d77dbb8Petr Machataproc_each_breakpoint(struct process *proc, arch_addr_t *start,
1069929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata		     enum callback_status (*cb)(struct process *proc,
1070d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata						struct breakpoint *bp,
1071d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata						void *data), void *data)
1072d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata{
1073d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata	struct each_breakpoint_data dd = {
1074d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata		.proc = proc,
1075d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata		.cb = cb,
1076d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata		.cb_data = data,
1077d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata	};
1078d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata	return DICT_EACH(proc->breakpoints,
1079d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata			 arch_addr_t, struct breakpoint *, start,
1080d7e4ca82e1cf20bb2605befb1da74dd1688c706ePetr Machata			 &each_breakpoint_cb, &dd);
1081d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata}
1082165b566a50b2bd560af3bd9649e456915397066bPetr Machata
1083165b566a50b2bd560af3bd9649e456915397066bPetr Machataint
1084929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataproc_find_symbol(struct process *proc, struct library_symbol *sym,
1085165b566a50b2bd560af3bd9649e456915397066bPetr Machata		 struct library **retlib, struct library_symbol **retsym)
1086165b566a50b2bd560af3bd9649e456915397066bPetr Machata{
1087165b566a50b2bd560af3bd9649e456915397066bPetr Machata	struct library *lib = sym->lib;
1088165b566a50b2bd560af3bd9649e456915397066bPetr Machata	assert(lib != NULL);
1089165b566a50b2bd560af3bd9649e456915397066bPetr Machata
1090165b566a50b2bd560af3bd9649e456915397066bPetr Machata	struct library *flib
1091165b566a50b2bd560af3bd9649e456915397066bPetr Machata		= proc_each_library(proc, NULL, library_with_key_cb, &lib->key);
1092165b566a50b2bd560af3bd9649e456915397066bPetr Machata	if (flib == NULL)
1093165b566a50b2bd560af3bd9649e456915397066bPetr Machata		return -1;
1094165b566a50b2bd560af3bd9649e456915397066bPetr Machata
1095165b566a50b2bd560af3bd9649e456915397066bPetr Machata	struct library_symbol *fsym
1096165b566a50b2bd560af3bd9649e456915397066bPetr Machata		= library_each_symbol(flib, NULL, library_symbol_named_cb,
1097165b566a50b2bd560af3bd9649e456915397066bPetr Machata				      (char *)sym->name);
1098165b566a50b2bd560af3bd9649e456915397066bPetr Machata	if (fsym == NULL)
1099165b566a50b2bd560af3bd9649e456915397066bPetr Machata		return -1;
1100165b566a50b2bd560af3bd9649e456915397066bPetr Machata
1101165b566a50b2bd560af3bd9649e456915397066bPetr Machata	if (retlib != NULL)
1102165b566a50b2bd560af3bd9649e456915397066bPetr Machata		*retlib = flib;
1103165b566a50b2bd560af3bd9649e456915397066bPetr Machata	if (retsym != NULL)
1104165b566a50b2bd560af3bd9649e456915397066bPetr Machata		*retsym = fsym;
1105165b566a50b2bd560af3bd9649e456915397066bPetr Machata
1106165b566a50b2bd560af3bd9649e456915397066bPetr Machata	return 0;
1107165b566a50b2bd560af3bd9649e456915397066bPetr Machata}
11083240554e943bf773aa57b7e3e3bf80d7102a8b10Petr Machata
11093240554e943bf773aa57b7e3e3bf80d7102a8b10Petr Machatastruct library_symbol *
1110929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataproc_each_symbol(struct process *proc, struct library_symbol *start_after,
11113240554e943bf773aa57b7e3e3bf80d7102a8b10Petr Machata		 enum callback_status (*cb)(struct library_symbol *, void *),
11123240554e943bf773aa57b7e3e3bf80d7102a8b10Petr Machata		 void *data)
11133240554e943bf773aa57b7e3e3bf80d7102a8b10Petr Machata{
11143240554e943bf773aa57b7e3e3bf80d7102a8b10Petr Machata	struct library *lib;
11153240554e943bf773aa57b7e3e3bf80d7102a8b10Petr Machata	for (lib = start_after != NULL ? start_after->lib : proc->libraries;
11163240554e943bf773aa57b7e3e3bf80d7102a8b10Petr Machata	     lib != NULL; lib = lib->next) {
11173240554e943bf773aa57b7e3e3bf80d7102a8b10Petr Machata		start_after = library_each_symbol(lib, start_after, cb, data);
11183240554e943bf773aa57b7e3e3bf80d7102a8b10Petr Machata		if (start_after != NULL)
11193240554e943bf773aa57b7e3e3bf80d7102a8b10Petr Machata			return start_after;
11203240554e943bf773aa57b7e3e3bf80d7102a8b10Petr Machata	}
11213240554e943bf773aa57b7e3e3bf80d7102a8b10Petr Machata
11223240554e943bf773aa57b7e3e3bf80d7102a8b10Petr Machata	return NULL;
11233240554e943bf773aa57b7e3e3bf80d7102a8b10Petr Machata}
1124653085a32cdc89f5215c2d70249b58c9fe6aebb7Petr Machata
1125653085a32cdc89f5215c2d70249b58c9fe6aebb7Petr Machata#define DEF_READER(NAME, SIZE)						\
1126653085a32cdc89f5215c2d70249b58c9fe6aebb7Petr Machata	int								\
1127653085a32cdc89f5215c2d70249b58c9fe6aebb7Petr Machata	NAME(struct process *proc, arch_addr_t addr,			\
1128653085a32cdc89f5215c2d70249b58c9fe6aebb7Petr Machata	     uint##SIZE##_t *lp)					\
1129653085a32cdc89f5215c2d70249b58c9fe6aebb7Petr Machata	{								\
1130653085a32cdc89f5215c2d70249b58c9fe6aebb7Petr Machata		union {							\
1131653085a32cdc89f5215c2d70249b58c9fe6aebb7Petr Machata			uint##SIZE##_t dst;				\
1132653085a32cdc89f5215c2d70249b58c9fe6aebb7Petr Machata			char buf[0];					\
1133653085a32cdc89f5215c2d70249b58c9fe6aebb7Petr Machata		} u;							\
1134653085a32cdc89f5215c2d70249b58c9fe6aebb7Petr Machata		if (umovebytes(proc, addr, &u.buf, sizeof(u.dst))	\
1135653085a32cdc89f5215c2d70249b58c9fe6aebb7Petr Machata		    != sizeof(u.dst))					\
1136653085a32cdc89f5215c2d70249b58c9fe6aebb7Petr Machata			return -1;					\
1137653085a32cdc89f5215c2d70249b58c9fe6aebb7Petr Machata		*lp = u.dst;						\
1138653085a32cdc89f5215c2d70249b58c9fe6aebb7Petr Machata		return 0;						\
1139653085a32cdc89f5215c2d70249b58c9fe6aebb7Petr Machata	}
1140653085a32cdc89f5215c2d70249b58c9fe6aebb7Petr Machata
1141dc70e76a94f842e2b8eaf0b9c2aabb829dc4826aPetr MachataDEF_READER(proc_read_8, 8)
1142653085a32cdc89f5215c2d70249b58c9fe6aebb7Petr MachataDEF_READER(proc_read_16, 16)
1143653085a32cdc89f5215c2d70249b58c9fe6aebb7Petr MachataDEF_READER(proc_read_32, 32)
1144653085a32cdc89f5215c2d70249b58c9fe6aebb7Petr MachataDEF_READER(proc_read_64, 64)
1145653085a32cdc89f5215c2d70249b58c9fe6aebb7Petr Machata
1146653085a32cdc89f5215c2d70249b58c9fe6aebb7Petr Machata#undef DEF_READER
1147