1436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--------------------------------------------------------------------*/
3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--- Declarations common for vgdb and implementations             ---*/
4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--- of vgdb-invoker.                                      vgdb.h ---*/
5436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--------------------------------------------------------------------*/
6436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*
8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   This file is part of Valgrind, a dynamic binary instrumentation
9436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   framework.
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Copyright (C) 2011-2013 Philippe Waroquiers
12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   This program is free software; you can redistribute it and/or
14436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   modify it under the terms of the GNU General Public License as
15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   published by the Free Software Foundation; either version 2 of the
16436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   License, or (at your option) any later version.
17436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
18436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   This program is distributed in the hope that it will be useful, but
19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   WITHOUT ANY WARRANTY; without even the implied warranty of
20436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   General Public License for more details.
22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   You should have received a copy of the GNU General Public License
24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   along with this program; if not, write to the Free Software
25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   02111-1307, USA.
27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   The GNU General Public License is contained in the file COPYING.
29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov*/
30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#ifndef __VGDB_H
32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define __VGDB_H
33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "pub_core_basics.h"
35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "pub_core_vki.h"
36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "pub_core_gdbserver.h"
37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <sys/types.h>
39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern int debuglevel;
41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern struct timeval dbgtv;
42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* if level <= debuglevel, print timestamp, then print provided by debug info */
43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define DEBUG(level, ...) (level <= debuglevel ?                        \
44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           gettimeofday(&dbgtv, NULL),                  \
45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           fprintf(stderr, "%ld.%6.6ld ",               \
46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   (long int)dbgtv.tv_sec,              \
47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   (long int)dbgtv.tv_usec),            \
48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           fprintf(stderr, __VA_ARGS__),fflush(stderr)  \
49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           : 0)
50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* same as DEBUG but does not print time stamp info */
52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define PDEBUG(level, ...) (level <= debuglevel ?                       \
53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            fprintf(stderr, __VA_ARGS__),fflush(stderr) \
54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            : 0)
55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* if errno != 0,
57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   report the errno and fprintf the ... varargs on stderr. */
58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define ERROR(errno, ...) ((errno == 0 ? 0 : perror("syscall failed")), \
59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           fprintf(stderr, __VA_ARGS__),                \
60436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           fflush(stderr))
61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* same as ERROR, but also exits with status 1 */
62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define XERROR(errno, ...) ((errno == 0 ? 0 : perror("syscall failed")), \
63436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            fprintf(stderr, __VA_ARGS__),                \
64436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            fflush(stderr),                              \
65436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            exit(1))
66436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
67eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov/* Calls malloc (size). Exits if memory can't be allocated. */
68eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovextern void *vmalloc(size_t size);
69eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov/* Calls realloc (size). Exits if memory can't be allocated. */
70eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovextern void *vrealloc(void *ptr,size_t size);
71eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
72436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Will be set to True when any condition indicating we have to shutdown
73436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   is encountered. */
74436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern Bool shutting_down;
75436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
76436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern VgdbShared32 *shared32;
77436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovextern VgdbShared64 *shared64;
78436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
79436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--------------------------------------------------------------------*/
80436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--- Below is vgdb-invoker interface which must be implemented by ---*/
81436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--- all vgdb-invoker implementations.                            ---*/
82436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--------------------------------------------------------------------*/
83436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
84436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Possibly produces additional usage information documenting the
85436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   invoker restrictions. */
86436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid invoker_restrictions_msg(void);
87436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
88436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Restore the registers to the saved value, then detaches from all threads.
89436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Used as a cleanup handler for thread cancellation. */
90436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid invoker_cleanup_restore_and_detach(void *v_pid);
91436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
92436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Ensures that the gdbserver code is invoked by pid.
93436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   If an error occurs, resets the valgrind process
94436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   to the state it had before being invoked.
95436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Returns True if invoke successful, False otherwise. */
96436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovBool invoker_invoke_gdbserver(pid_t pid);
97436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
98436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Called when connection with valgrind is lost.  In case we
99436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   have lost the connection, it means that Valgrind has closed the
100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   connection and is busy exiting. We can't and don't have to stop it in
101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   this case. */
102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid invoker_valgrind_dying(void);
103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif // __VGDB_H
105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--------------------------------------------------------------------*/
107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--- end                                                          ---*/
108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--------------------------------------------------------------------*/
109