1642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata/*
2642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * This file is part of ltrace.
3642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * Copyright (C) 2007,2011,2012 Petr Machata, Red Hat Inc.
4642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * Copyright (C) 1998,2001,2004,2007,2008,2009 Juan Cespedes
5642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata *
6642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * This program is free software; you can redistribute it and/or
7642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * modify it under the terms of the GNU General Public License as
8642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * published by the Free Software Foundation; either version 2 of the
9642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * License, or (at your option) any later version.
10642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata *
11642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * This program is distributed in the hope that it will be useful, but
12642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * WITHOUT ANY WARRANTY; without even the implied warranty of
13642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * General Public License for more details.
15642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata *
16642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * You should have received a copy of the GNU General Public License
17642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * along with this program; if not, write to the Free Software
18642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
19642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * 02110-1301 USA
20642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata */
21642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata
22d44c6b8b090b8b7aa9d971d9e0bfd848732a3071Juan Cespedes#include "config.h"
23d44c6b8b090b8b7aa9d971d9e0bfd848732a3071Juan Cespedes
245e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes#define	_GNU_SOURCE	1
25ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata#include <sys/ptrace.h>
265e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes#include <sys/types.h>
275e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes#include <sys/wait.h>
28ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata#include <assert.h>
295e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes#include <errno.h>
305e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes#include <signal.h>
31ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata#include <stdio.h>
32ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata#include <stdlib.h>
335e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes#include <string.h>
3497b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata#include <unistd.h>
355e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes
36642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata#include "backend.h"
37ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata#include "breakpoint.h"
38ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata#include "debug.h"
39cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machata#include "events.h"
40ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata#include "proc.h"
41af766ab1e37231fe1d7dc5e4b598b9c92f78ecd4Petr Machata#include "linux-gnu/trace-defs.h"
425e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes
43393f1d00c582058078cc238547f65202c438fb19Juan Cespedesstatic Event event;
445e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes
4569a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata/* A queue of events that we missed while enabling the
4669a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata * breakpoint in one of tasks.  */
4769a03e6f8c15fb0272089e387a658acad887fb9cPetr Machatastatic Event * delayed_events = NULL;
4869a03e6f8c15fb0272089e387a658acad887fb9cPetr Machatastatic Event * end_delayed_events = NULL;
4969a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata
502b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machatastatic enum callback_status
51929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatafirst(struct process *proc, void *data)
52cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata{
532b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata	return CBS_STOP;
54cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata}
55cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata
5669a03e6f8c15fb0272089e387a658acad887fb9cPetr Machatavoid
5769a03e6f8c15fb0272089e387a658acad887fb9cPetr Machataenque_event(Event * event)
5869a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata{
5969a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata	debug(DEBUG_FUNCTION, "%d: queuing event %d for later",
6069a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata	      event->proc->pid, event->type);
6169a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata	Event * ne = malloc(sizeof(*ne));
6269a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata	if (ne == NULL) {
63ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata		fprintf(stderr, "event will be missed: %s\n", strerror(errno));
6469a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata		return;
6569a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata	}
6669a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata
6769a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata	*ne = *event;
6869a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata	ne->next = NULL;
6969a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata	if (end_delayed_events == NULL) {
7069a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata		assert(delayed_events == NULL);
7169a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata		end_delayed_events = delayed_events = ne;
7269a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata	}
7369a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata	else {
7469a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata		assert(delayed_events != NULL);
7569a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata		end_delayed_events = end_delayed_events->next = ne;
7669a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata	}
7769a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata}
7869a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata
7969a03e6f8c15fb0272089e387a658acad887fb9cPetr MachataEvent *
8069a03e6f8c15fb0272089e387a658acad887fb9cPetr Machataeach_qd_event(enum ecb_status (*pred)(Event *, void *), void * data)
8169a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata{
8269a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata	Event * prev = delayed_events;
8369a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata	Event * event;
8469a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata	for (event = prev; event != NULL; ) {
8569a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata		switch ((*pred)(event, data)) {
8671f25e25a4081b726e75026727483b6959dd8661Petr Machata		case ECB_CONT:
8769a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata			prev = event;
8869a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata			event = event->next;
8969a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata			continue;
9069a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata
9171f25e25a4081b726e75026727483b6959dd8661Petr Machata		case ECB_DEQUE:
9269a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata			debug(DEBUG_FUNCTION, "dequeuing event %d for %d",
9369a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata			      event->type,
9469a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata			      event->proc != NULL ? event->proc->pid : -1);
9569a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata			/*
9669a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata			printf("dequeuing event %d for %d\n", event->type,
9769a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata			       event->proc != NULL ? event->proc->pid : -1) ;
9869a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata			*/
9969a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata			if (end_delayed_events == event)
10069a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata				end_delayed_events = prev;
10169a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata			if (delayed_events == event)
10269a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata				delayed_events = event->next;
10369a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata			else
10469a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata				prev->next = event->next;
10569a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata			if (delayed_events == NULL)
10669a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata				end_delayed_events = NULL;
10769a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata			/* fall-through */
10869a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata
10971f25e25a4081b726e75026727483b6959dd8661Petr Machata		case ECB_YIELD:
11069a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata			return event;
11169a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata		}
11269a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata	}
11369a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata
11469a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata	return NULL;
11569a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata}
11669a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata
11769a03e6f8c15fb0272089e387a658acad887fb9cPetr Machatastatic enum ecb_status
11869a03e6f8c15fb0272089e387a658acad887fb9cPetr Machataevent_process_not_reenabling(Event * event, void * data)
11969a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata{
1204007d74c2435ce4b50305d64ffe831627f989335Petr Machata	if (event->proc == NULL
1214007d74c2435ce4b50305d64ffe831627f989335Petr Machata	    || event->proc->leader == NULL
1224007d74c2435ce4b50305d64ffe831627f989335Petr Machata	    || event->proc->leader->event_handler == NULL)
12371f25e25a4081b726e75026727483b6959dd8661Petr Machata		return ECB_DEQUE;
1244007d74c2435ce4b50305d64ffe831627f989335Petr Machata	else
12571f25e25a4081b726e75026727483b6959dd8661Petr Machata		return ECB_CONT;
12669a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata}
12769a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata
12869a03e6f8c15fb0272089e387a658acad887fb9cPetr Machatastatic Event *
12969a03e6f8c15fb0272089e387a658acad887fb9cPetr Machatanext_qd_event(void)
13069a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata{
13169a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata	return each_qd_event(&event_process_not_reenabling, NULL);
13269a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata}
13369a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata
134ffe4cd25089680daf1bd1ec0114d177ec3e0cf95Petr Machataint linux_in_waitpid = 0;
135ffe4cd25089680daf1bd1ec0114d177ec3e0cf95Petr Machata
136393f1d00c582058078cc238547f65202c438fb19Juan CespedesEvent *
1372662768efe599f6bb43c4310177e30f56b601bb7Petr Machatanext_event(void)
1382662768efe599f6bb43c4310177e30f56b601bb7Petr Machata{
1395e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes	pid_t pid;
1405e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes	int status;
1415e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes	int tmp;
142ef46b3e70e54059a7a8bf32af7361bb262ccc8d1Petr Machata	int stop_signal;
1435e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes
144cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes	debug(DEBUG_FUNCTION, "next_event()");
14569a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata	Event * ev;
14669a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata	if ((ev = next_qd_event()) != NULL) {
14769a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata		event = *ev;
14869a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata		free(ev);
14969a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata		return &event;
15069a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata	}
15169a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata
152cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata	if (!each_process(NULL, &first, NULL)) {
153cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes		debug(DEBUG_EVENT, "event: No more traced programs: exiting");
15428f60197b93b45422a73e5d1a6aa581584d6c4a5Juan Cespedes		exit(0);
15528f60197b93b45422a73e5d1a6aa581584d6c4a5Juan Cespedes	}
156ffe4cd25089680daf1bd1ec0114d177ec3e0cf95Petr Machata
157ffe4cd25089680daf1bd1ec0114d177ec3e0cf95Petr Machata	linux_in_waitpid = 1;
1586be8028492b29f68126ce413b7ef4b875c7bb017Juan Cespedes	pid = waitpid(-1, &status, __WALL);
159ffe4cd25089680daf1bd1ec0114d177ec3e0cf95Petr Machata	linux_in_waitpid = 0;
160ffe4cd25089680daf1bd1ec0114d177ec3e0cf95Petr Machata
1612d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand	if (pid == -1) {
1622d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand		if (errno == ECHILD) {
163cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes			debug(DEBUG_EVENT, "event: No more traced programs: exiting");
1645e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes			exit(0);
1652d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand		} else if (errno == EINTR) {
166cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes			debug(DEBUG_EVENT, "event: none (wait received EINTR?)");
1678f6d1ecd5f4301f899927a553572c5089fd29bcfJuan Cespedes			event.type = EVENT_NONE;
16828f60197b93b45422a73e5d1a6aa581584d6c4a5Juan Cespedes			return &event;
1695e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes		}
1705e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes		perror("wait");
1715e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes		exit(1);
1725e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes	}
1735e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes	event.proc = pid2proc(pid);
1742721e6adbc7399e1b621b896b4f5b864082fbf03Juan Cespedes	if (!event.proc || event.proc->state == STATE_BEING_CREATED) {
17597b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata		/* Work around (presumably) a bug on some kernels,
17697b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata		 * where we are seeing a waitpid event even though the
17797b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata		 * process is still reported to be running.  Wait for
17897b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata		 * the tracing stop to propagate.  But don't get stuck
17997b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata		 * here forever.
18097b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata		 *
18197b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata		 * We need the process in T, because there's a lot of
18297b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata		 * ptracing going on all over the place, and these
18397b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata		 * calls fail when the process is not in T.
18497b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata		 *
18597b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata		 * N.B. This was observed on RHEL 5 Itanium, but I'm
18697b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata		 * turning this on globally, to save some poor soul
18797b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata		 * down the road (which could well be me a year from
18897b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata		 * now) the pain of figuring this out all over again.
18997b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata		 * Petr Machata 2011-11-22.  */
19097b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata		int i = 0;
1916dfc544b6aa6703d2292be34470aebf874d78452Petr Machata		for (; i < 100 && process_status(pid) != PS_TRACING_STOP; ++i) {
19297b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata			debug(2, "waiting for %d to stop", pid);
19397b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata			usleep(10000);
19497b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata		}
1958f6d1ecd5f4301f899927a553572c5089fd29bcfJuan Cespedes		event.type = EVENT_NEW;
1962721e6adbc7399e1b621b896b4f5b864082fbf03Juan Cespedes		event.e_un.newpid = pid;
197cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes		debug(DEBUG_EVENT, "event: NEW: pid=%d", pid);
198a8909f71e1421949c960f287217be6c42c286c0fJuan Cespedes		return &event;
1995e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes	}
200ba36f0ac51d194c599fd56457796e33e62c3220bPetr Machata
2015c3fe0697b202cc7d95e90459de0fb312b297b27Juan Cespedes	get_arch_dep(event.proc);
2021e583132c95aa211fab9e0e0869b237adfa78304Juan Cespedes	debug(3, "event from pid %u", pid);
203929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata	struct process *leader = event.proc->leader;
204f0bd98b3e6753d8609a3054a61f2df6f9cdac10aJoe Damato
205f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata	/* The process should be stopped after the waitpid call.  But
206f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata	 * when the whole thread group is terminated, we see
207f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata	 * individual tasks spontaneously transitioning from 't' to
208f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata	 * 'R' and 'Z'.  Calls to ptrace fail and /proc/pid/status may
209f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata	 * not even be available anymore, so we can't check in
210f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata	 * advance.  So we just drop the error checking around ptrace
211f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata	 * calls.  We check for termination ex post when it fails,
212f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata	 * suppress the event, and let the event loop collect the
213f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata	 * termination in the next iteration.  */
214f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata#define CHECK_PROCESS_TERMINATED					\
215f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata	do {								\
216f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata		int errno_save = errno;					\
217f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata		switch (process_stopped(pid))				\
218f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata		case 0:							\
219f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata		case -1: {						\
220f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata			debug(DEBUG_EVENT,				\
221f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata			      "process not stopped, is it terminating?"); \
222f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata			event.type = EVENT_NONE;			\
223f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata			continue_process(event.proc->pid);		\
224f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata			return &event;					\
225f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata		}							\
226f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata		errno = errno_save;					\
227f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata	} while (0)
228f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata
2299a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata	event.proc->instruction_pointer = (void *)(uintptr_t)-1;
2306901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata
231f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata	/* Check for task termination now, before we have a need to
232f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata	 * call CHECK_PROCESS_TERMINATED later.  That would suppress
233f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata	 * the event that we are processing.  */
234f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata	if (WIFSIGNALED(status)) {
235f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata		event.type = EVENT_EXIT_SIGNAL;
236f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata		event.e_un.signum = WTERMSIG(status);
237f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata		debug(DEBUG_EVENT, "event: EXIT_SIGNAL: pid=%d, signum=%d", pid, event.e_un.signum);
238f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata		return &event;
239f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata	}
240f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata	if (WIFEXITED(status)) {
241f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata		event.type = EVENT_EXIT;
242f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata		event.e_un.ret_val = WEXITSTATUS(status);
243f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata		debug(DEBUG_EVENT, "event: EXIT: pid=%d, status=%d", pid, event.e_un.ret_val);
244f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata		return &event;
245f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata	}
246f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata
2476901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata	event.proc->instruction_pointer = get_instruction_pointer(event.proc);
2486901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata	if (event.proc->instruction_pointer == (void *)(uintptr_t)-1) {
249f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata		CHECK_PROCESS_TERMINATED;
2506901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata		if (errno != 0)
2516901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata			perror("get_instruction_pointer");
252f0fdae9e2444c2fb7764774088c574ab53c787f4Juan Cespedes	}
2536901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata
2542d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand	switch (syscall_p(event.proc, status, &tmp)) {
25563184be8c577f5799e44db2a4e312a8240ad7751Juan Cespedes		case 1:
2568f6d1ecd5f4301f899927a553572c5089fd29bcfJuan Cespedes			event.type = EVENT_SYSCALL;
25763184be8c577f5799e44db2a4e312a8240ad7751Juan Cespedes			event.e_un.sysnum = tmp;
258cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes			debug(DEBUG_EVENT, "event: SYSCALL: pid=%d, sysnum=%d", pid, tmp);
25963184be8c577f5799e44db2a4e312a8240ad7751Juan Cespedes			return &event;
26063184be8c577f5799e44db2a4e312a8240ad7751Juan Cespedes		case 2:
2618f6d1ecd5f4301f899927a553572c5089fd29bcfJuan Cespedes			event.type = EVENT_SYSRET;
26263184be8c577f5799e44db2a4e312a8240ad7751Juan Cespedes			event.e_un.sysnum = tmp;
263cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes			debug(DEBUG_EVENT, "event: SYSRET: pid=%d, sysnum=%d", pid, tmp);
26463184be8c577f5799e44db2a4e312a8240ad7751Juan Cespedes			return &event;
26563184be8c577f5799e44db2a4e312a8240ad7751Juan Cespedes		case 3:
2668f6d1ecd5f4301f899927a553572c5089fd29bcfJuan Cespedes			event.type = EVENT_ARCH_SYSCALL;
26763184be8c577f5799e44db2a4e312a8240ad7751Juan Cespedes			event.e_un.sysnum = tmp;
268cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes			debug(DEBUG_EVENT, "event: ARCH_SYSCALL: pid=%d, sysnum=%d", pid, tmp);
26963184be8c577f5799e44db2a4e312a8240ad7751Juan Cespedes			return &event;
27063184be8c577f5799e44db2a4e312a8240ad7751Juan Cespedes		case 4:
2718f6d1ecd5f4301f899927a553572c5089fd29bcfJuan Cespedes			event.type = EVENT_ARCH_SYSRET;
27263184be8c577f5799e44db2a4e312a8240ad7751Juan Cespedes			event.e_un.sysnum = tmp;
273cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes			debug(DEBUG_EVENT, "event: ARCH_SYSRET: pid=%d, sysnum=%d", pid, tmp);
27463184be8c577f5799e44db2a4e312a8240ad7751Juan Cespedes			return &event;
27563184be8c577f5799e44db2a4e312a8240ad7751Juan Cespedes		case -1:
276f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata			CHECK_PROCESS_TERMINATED;
277f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata			if (errno != 0)
278f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata				perror("syscall_p");
2795e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes	}
280cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata	if (WIFSTOPPED(status)) {
281cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata		int what = status >> 16;
282cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata		if (what == PTRACE_EVENT_VFORK
283cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata		    || what == PTRACE_EVENT_FORK
284cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata		    || what == PTRACE_EVENT_CLONE) {
285cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata			unsigned long data;
286cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata			event.type = what == PTRACE_EVENT_VFORK
287cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata				? EVENT_VFORK : EVENT_CLONE;
288cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata			ptrace(PTRACE_GETEVENTMSG, pid, NULL, &data);
289cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata			event.e_un.newpid = data;
290cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata			debug(DEBUG_EVENT, "event: CLONE: pid=%d, newpid=%d",
291cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata			      pid, (int)data);
292cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata			return &event;
293cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata		}
2941e583132c95aa211fab9e0e0869b237adfa78304Juan Cespedes	}
2951e583132c95aa211fab9e0e0869b237adfa78304Juan Cespedes	if (WIFSTOPPED(status) && (status>>16 == PTRACE_EVENT_EXEC)) {
2968f6d1ecd5f4301f899927a553572c5089fd29bcfJuan Cespedes		event.type = EVENT_EXEC;
297cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes		debug(DEBUG_EVENT, "event: EXEC: pid=%d", pid);
2981e583132c95aa211fab9e0e0869b237adfa78304Juan Cespedes		return &event;
2991e583132c95aa211fab9e0e0869b237adfa78304Juan Cespedes	}
3005e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes	if (!WIFSTOPPED(status)) {
301427b7811598f905b583ac86b35c72228fd415476Juan Cespedes		/* should never happen */
3028f6d1ecd5f4301f899927a553572c5089fd29bcfJuan Cespedes		event.type = EVENT_NONE;
303cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes		debug(DEBUG_EVENT, "event: NONE: pid=%d (wait error?)", pid);
3045e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes		return &event;
3055e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes	}
306ef46b3e70e54059a7a8bf32af7361bb262ccc8d1Petr Machata
307ef46b3e70e54059a7a8bf32af7361bb262ccc8d1Petr Machata	stop_signal = WSTOPSIG(status);
308ef46b3e70e54059a7a8bf32af7361bb262ccc8d1Petr Machata
309ef46b3e70e54059a7a8bf32af7361bb262ccc8d1Petr Machata	/* On some targets, breakpoints are signalled not using
3106901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata	   SIGTRAP, but also with SIGILL, SIGSEGV or SIGEMT.  SIGEMT
3116901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata	   is not defined on Linux, but check for the others.
312ef46b3e70e54059a7a8bf32af7361bb262ccc8d1Petr Machata
3136901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata	   N.B. see comments in GDB's infrun.c for details.  I've
3146901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata	   actually seen this on an Itanium machine on RHEL 5, I don't
3156901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata	   remember the exact kernel version anymore.  ia64-sigill.s
3166901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata	   in the test suite tests this.  Petr Machata 2011-06-08.  */
317ba36f0ac51d194c599fd56457796e33e62c3220bPetr Machata	arch_addr_t break_address
3186901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata		= event.proc->instruction_pointer - DECR_PC_AFTER_BREAK;
3196901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata	if ((stop_signal == SIGSEGV || stop_signal == SIGILL)
3209a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata	    && leader != NULL
3219a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata	    && address2bpstruct(leader, break_address))
322ef46b3e70e54059a7a8bf32af7361bb262ccc8d1Petr Machata			stop_signal = SIGTRAP;
323ef46b3e70e54059a7a8bf32af7361bb262ccc8d1Petr Machata
324ef46b3e70e54059a7a8bf32af7361bb262ccc8d1Petr Machata	if (stop_signal != (SIGTRAP | event.proc->tracesysgood)
325427b7811598f905b583ac86b35c72228fd415476Juan Cespedes			&& stop_signal != SIGTRAP) {
3268f6d1ecd5f4301f899927a553572c5089fd29bcfJuan Cespedes		event.type = EVENT_SIGNAL;
327a413e5b8880de643a83ad124d078091c0956fe1dJuan Cespedes		event.e_un.signum = stop_signal;
328cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes		debug(DEBUG_EVENT, "event: SIGNAL: pid=%d, signum=%d", pid, stop_signal);
3295e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes		return &event;
3305e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes	}
33155ed83b24df9c6d671091a8c75caab33ffecd40ePetr Machata
332427b7811598f905b583ac86b35c72228fd415476Juan Cespedes	/* last case [by exhaustion] */
3338f6d1ecd5f4301f899927a553572c5089fd29bcfJuan Cespedes	event.type = EVENT_BREAKPOINT;
334427b7811598f905b583ac86b35c72228fd415476Juan Cespedes
3356901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata	event.e_un.brk_addr = break_address;
336cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes	debug(DEBUG_EVENT, "event: BREAKPOINT: pid=%d, addr=%p", pid, event.e_un.brk_addr);
3376901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata
3385e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes	return &event;
3395e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes}
340cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machata
341cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machatastatic enum ecb_status
342cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machataevent_for_proc(struct Event *event, void *data)
343cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machata{
344cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machata	if (event->proc == data)
34571f25e25a4081b726e75026727483b6959dd8661Petr Machata		return ECB_DEQUE;
346cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machata	else
34771f25e25a4081b726e75026727483b6959dd8661Petr Machata		return ECB_CONT;
348cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machata}
349cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machata
350cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machatavoid
351929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatadelete_events_for(struct process *proc)
352cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machata{
353cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machata	struct Event *event;
354cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machata	while ((event = each_qd_event(&event_for_proc, proc)) != NULL)
355cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machata		free(event);
356cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machata}
357