1663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Target operations for the Valgrind remote server for GDB.
2663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Copyright (C) 2002, 2003, 2004, 2005, 2012
3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Free Software Foundation, Inc.
4663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Philippe Waroquiers.
5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Contributed by MontaVista Software.
7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   This file is part of GDB.
9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   It has been modified to integrate it in valgrind
10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
11b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   This program is free software; you can redistribute it and/or modify
12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   it under the terms of the GNU General Public License as published by
13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   the Free Software Foundation; either version 2 of the License, or
14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   (at your option) any later version.
15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   This program is distributed in the hope that it will be useful,
17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   but WITHOUT ANY WARRANTY; without even the implied warranty of
18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GNU General Public License for more details.
20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   You should have received a copy of the GNU General Public License
22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   along with this program; if not, write to the Free Software
23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Foundation, Inc., 51 Franklin Street, Fifth Floor,
24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Boston, MA 02110-1301, USA.  */
25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef TARGET_H
27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define TARGET_H
28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
29663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* This file defines the architecture independent Valgrind gdbserver
30663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   high level operations such as read memory, get/set registers, ...
31663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
32663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   These high level operations are called by the gdbserver
33663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   protocol implementation (e.g. typically server.c).
34663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
35663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   For some of these high level operations, target.c will call
36663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   low level operations dependent on the architecture.
37663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
38663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   For example, getting or setting the registers will work on a
39663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register cache. The exact details of the registers (how much,
40663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   their size, etc) is not defined by target.c or the register cache.
41663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
42663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Such architecture dependent information is defined by
43663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   valgrind_low.h/valgrind-low-xxxxx.c providing 'low level operations'
44663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   specific to the xxxxx architecture (for example,
45663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   valgrind-low-x86.c, valgrind-low-armc.c). */
46663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
47663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* -------------------------------------------------------------------------- */
48663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* ------------------------ Initialisation ---------------------------------- */
49663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* -------------------------------------------------------------------------- */
50663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
51663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Initialize the Valgrind high target. This will in turn
52663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   initialise the low (architecture specific) target. */
53663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern void valgrind_initialize_target(void);
54663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
55663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* initialize or re-initialize the register set of the low target.
56663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if shadow_mode, then (re-)define the normal and valgrind shadow registers
57663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   else (re-)define only the normal registers. */
58663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern void initialize_shadow_low (Bool shadow_mode);
59663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
60663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Returns the name of the xml target description file.
61663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   returns NULL if no xml target description available.
62663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if shadow_mode, then returns the xml target description
63663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   with the shadow registers
64663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   else returns the xml target description only for
65663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   the normal registers. */
66663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern char* valgrind_target_xml (Bool shadow_mode);
67663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
68663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
69663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* -------------------------------------------------------------------------- */
70663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* --------------------------- Execution control ---------------------------- */
71663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* -------------------------------------------------------------------------- */
72663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
73663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* This structure describes how to resume the execution.
74663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Currently, there is no way to resume only a specific thread.  */
75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstruct thread_resume
76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
77b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  /* If non-zero, we want to single-step.  */
78b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  int step;
79b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  /* If non-zero, send this signal when we resume.  */
81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  int sig;
82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov};
83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
84663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Prepare to Resume (i.e. restart) the guest.
85663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   The resume info indicates how the resume will be done.
86663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   In case GDB has changed the program counter, valgrind_resume
87663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   will also ensure that the execution will be resumed at this
88663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   new program counter.
89663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   The Resume is really only executed once the gdbserver
90663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   returns (giving back the control to Valgrind). */
91663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern void valgrind_resume (struct thread_resume *resume_info);
92663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
93663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* When Valgrind gets the control, it will execute the guest
94663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   process till there is a reason to call the gdbserver
95663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   again (e.g. because a breakpoint is encountered or the
96663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   tool reports an error).
97663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   In such case, the executionof guest code  stops, and the
98663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   control is given to gdbserver. Gdbserver will send a resume
99663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   reply packet to GDB.
100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   valgrind_wait gets from Valgrind data structures the
102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   information needed produce the resume reply for GDB:
103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   a.o. OURSTATUS will be filled in with a response code to send to GDB.
104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Returns the signal which caused the process to stop, in the
106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   remote protocol numbering (e.g. TARGET_SIGNAL_STOP), or the
107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   exit code as an integer if *OURSTATUS is 'W'.  */
108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern unsigned char valgrind_wait (char *outstatus);
109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* When execution is stopped and gdbserver has control, more
111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   info about the stop reason can be retrieved using the following
112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   functions. */
113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* gets the addr at which a (possible) break must be ignored once.
115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   If there is no such break to be ignored once, 0 is returned.
116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   This is needed for the following case:
117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   The user sets a break at address AAA.
118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   The break is encountered. Then the user does stepi
119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   (i.e. step one instruction).
120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   In such a case, the already encountered break must be ignored
121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   to ensure the stepi will advance by one instruction: a "break"
122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   is implemented in valgrind by some helper code just after the
123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   instruction mark at which the break is set. This helper code
124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   verifies if either there is a break at the current PC
125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   or if we are in stepping mode. If we are in stepping mode,
126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   the already encountered break must be ignored once to advance
127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   to the next instruction.
128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ??? need to check if this is *really* needed. */
129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern Addr valgrind_get_ignore_break_once(void);
130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* When addr > 0, ensures the next resume reply packet informs
132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   gdb about the encountered watchpoint.
133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   valgrind_stopped_by_watchpoint() will return 1 till reset.
134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Use addr 0x0 to reset. */
135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern void VG_(set_watchpoint_stop_address) (Addr addr);
136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Returns 1 if target was stopped due to a watchpoint hit, 0 otherwise.  */
138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern int valgrind_stopped_by_watchpoint (void);
139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Returns the address associated with the watchpoint that hit, if any;
141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   returns 0 otherwise.  */
142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern CORE_ADDR valgrind_stopped_data_address (void);
143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* True if gdbserver is single stepping the valgrind process */
145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern Bool valgrind_single_stepping(void);
146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Set Valgrind in single stepping mode or not according to Bool. */
148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern void valgrind_set_single_stepping(Bool);
149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* -------------------------------------------------------------------------- */
151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* ----------------- Examining/modifying data while stopped ----------------- */
152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* -------------------------------------------------------------------------- */
153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Return 1 iff the thread with ID tid is alive.  */
155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern int valgrind_thread_alive (unsigned long tid);
156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Allows to controls the thread (current_inferior) used for following
158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   valgrind_(fetch|store)_registers calls.
159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   If USE_GENERAL,
160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     current_inferior is set to general_thread
161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   else
162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     current_inferior is set to step_thread or else cont_thread.
163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   If the above gives no valid thread, then current_inferior is
164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   set to the first valid thread. */
165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern void set_desired_inferior (int use_general);
166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Fetch registers from the current_inferior thread.
168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   If REGNO is -1, fetch all registers; otherwise, fetch at least REGNO.  */
169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern void valgrind_fetch_registers (int regno);
170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Store registers to the current_inferior thread.
172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   If REGNO is -1, store all registers; otherwise, store at least REGNO.  */
173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern void valgrind_store_registers (int regno);
174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Read memory from the inferior process.
178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Read LEN bytes at MEMADDR into a buffer at MYADDR.
179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Returns 0 on success and errno on failure.  */
180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern int valgrind_read_memory (CORE_ADDR memaddr,
181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 unsigned char *myaddr, int len);
182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Write memory to the inferior process.
184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Write LEN bytes from the buffer at MYADDR to MEMADDR.
185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Returns 0 on success and errno on failure.  */
186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern int valgrind_write_memory (CORE_ADDR memaddr,
187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                  const unsigned char *myaddr, int len);
188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Insert and remove a hardware watchpoint.
191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Returns 0 on success, -1 on failure and 1 on unsupported.
192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   The type is coded as follows:
193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   2 = write watchpoint
194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   3 = read watchpoint
195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   4 = access watchpoint
196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng*/
197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern int valgrind_insert_watchpoint (char type, CORE_ADDR addr, int len);
198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern int valgrind_remove_watchpoint (char type, CORE_ADDR addr, int len);
199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* -------------------------------------------------------------------------- */
202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* ----------- Utils functions for low level arch specific files ------------ */
203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* -------------------------------------------------------------------------- */
204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* returns a pointer to the architecture state corresponding to
206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   the provided register set: 0 => normal guest registers,
207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                              1 => shadow1
208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                              2 => shadow2
209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng*/
210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern VexGuestArchState* get_arch (int set, ThreadState* tst);
211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* like memcpy but first check if content of destination and source
213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   differs. If no difference, no copy is done, *mod set to False.
214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   If different; copy is done, *mod set to True. */
215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern void* VG_(dmemcpy) ( void *d, const void *s, SizeT sz, Bool *mod );
216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef
218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   enum {
219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      valgrind_to_gdbserver,
220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      gdbserver_to_valgrind} transfer_direction;
221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// According to dir, calls VG_(dmemcpy)
223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// to copy data from/to valgrind to/from gdbserver.
224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// If the transferred data differs from what is currently stored,
225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// sets *mod to True otherwise set *mod to False.
226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovextern void  VG_(transfer) (void *valgrind,
227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                            void *gdbserver,
228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                            transfer_direction dir,
229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                            SizeT sz,
230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                            Bool *mod);
231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif /* TARGET_H */
235