1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Inferior process information for the remote server for GDB.
2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Copyright (C) 2002, 2005, 2011
3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Free Software Foundation, Inc.
4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Contributed by MontaVista Software.
6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   This file is part of GDB.
8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   It has been modified to integrate it in valgrind
9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   This program is free software; you can redistribute it and/or modify
11b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   it under the terms of the GNU General Public License as published by
12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   the Free Software Foundation; either version 2 of the License, or
13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   (at your option) any later version.
14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   This program is distributed in the hope that it will be useful,
16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   but WITHOUT ANY WARRANTY; without even the implied warranty of
17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GNU General Public License for more details.
19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   You should have received a copy of the GNU General Public License
21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   along with this program; if not, write to the Free Software
22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Foundation, Inc., 51 Franklin Street, Fifth Floor,
23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Boston, MA 02110-1301, USA.  */
24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "server.h"
26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstruct thread_info
28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   struct inferior_list_entry entry;
30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   void *target_data;
31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   void *regcache_data;
32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   unsigned int gdb_id;
33b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov};
34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstruct inferior_list all_threads;
36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstruct thread_info *current_inferior;
38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define get_thread(inf) ((struct thread_info *)(inf))
40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid add_inferior_to_list (struct inferior_list *list,
42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		      struct inferior_list_entry *new_inferior)
43b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
44b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   new_inferior->next = NULL;
45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (list->tail != NULL)
46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      list->tail->next = new_inferior;
47b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   else
48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      list->head = new_inferior;
49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   list->tail = new_inferior;
50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
51b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
52b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid for_each_inferior (struct inferior_list *list,
53b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		   void (*action) (struct inferior_list_entry *))
54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   struct inferior_list_entry *cur = list->head, *next;
56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   while (cur != NULL) {
58b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      next = cur->next;
59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      (*action) (cur);
60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      cur = next;
61b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
63b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
64b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid change_inferior_id (struct inferior_list *list,
65b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		    unsigned long new_id)
66b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
67b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (list->head != list->tail)
68b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      error ("tried to change thread ID after multiple threads are created\n");
69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
70b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   list->head->id = new_id;
71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid remove_inferior (struct inferior_list *list,
74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov		 struct inferior_list_entry *entry)
75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   struct inferior_list_entry **cur;
77b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
78b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (list->head == entry) {
79b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      list->head = entry->next;
80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (list->tail == entry)
81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         list->tail = list->head;
82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return;
83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   cur = &list->head;
86b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   while (*cur && (*cur)->next != entry)
87b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      cur = &(*cur)->next;
88b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (*cur == NULL)
90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return;
91b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
92b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   (*cur)->next = entry->next;
93b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
94b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (list->tail == entry)
95b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      list->tail = *cur;
96b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
97b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
98b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid add_thread (unsigned long thread_id, void *target_data, unsigned int gdb_id)
99b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   struct thread_info *new_thread
101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      = (struct thread_info *) malloc (sizeof (*new_thread));
102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VG_(memset) (new_thread, 0, sizeof (*new_thread));
104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   new_thread->entry.id = thread_id;
106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   add_inferior_to_list (&all_threads, & new_thread->entry);
108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (current_inferior == NULL)
110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      current_inferior = new_thread;
111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   new_thread->target_data = target_data;
113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   set_inferior_regcache_data (new_thread, new_register_cache ());
114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   new_thread->gdb_id = gdb_id;
115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovunsigned int thread_id_to_gdb_id (unsigned long thread_id)
118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   struct inferior_list_entry *inf = all_threads.head;
120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   while (inf != NULL) {
122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct thread_info *thread = get_thread (inf);
123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (inf->id == thread_id)
124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return thread->gdb_id;
125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      inf = inf->next;
126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return 0;
129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovunsigned int thread_to_gdb_id (struct thread_info *thread)
132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return thread->gdb_id;
134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstruct thread_info * gdb_id_to_thread (unsigned int gdb_id)
137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   struct inferior_list_entry *inf = all_threads.head;
139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   while (inf != NULL) {
141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct thread_info *thread = get_thread (inf);
142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (thread->gdb_id == gdb_id)
143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return thread;
144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      inf = inf->next;
145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return NULL;
148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovunsigned long gdb_id_to_thread_id (unsigned int gdb_id)
151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   struct thread_info *thread = gdb_id_to_thread (gdb_id);
153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return thread ? thread->entry.id : 0;
155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic
158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid free_one_thread (struct inferior_list_entry *inf)
159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   struct thread_info *thread = get_thread (inf);
161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   free_register_cache (inferior_regcache_data (thread));
162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   free (thread);
163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid remove_thread (struct thread_info *thread)
166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   remove_inferior (&all_threads, (struct inferior_list_entry *) thread);
168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   free_one_thread (&thread->entry);
169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid clear_inferiors (void)
172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   for_each_inferior (&all_threads, free_one_thread);
174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   all_threads.head = all_threads.tail = NULL;
176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstruct inferior_list_entry * find_inferior (struct inferior_list *list,
179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                            int (*func)
180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                              (struct inferior_list_entry *,
181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               void *),
182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                            void *arg)
183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   struct inferior_list_entry *inf = list->head;
185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   while (inf != NULL) {
187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if ((*func) (inf, arg))
188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return inf;
189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      inf = inf->next;
190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return NULL;
193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstruct inferior_list_entry * find_inferior_id (struct inferior_list *list,
196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                               unsigned long id)
197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   struct inferior_list_entry *inf = list->head;
199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   while (inf != NULL) {
201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (inf->id == id)
202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return inf;
203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      inf = inf->next;
204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return NULL;
207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid * inferior_target_data (struct thread_info *inferior)
210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return inferior->target_data;
212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid set_inferior_target_data (struct thread_info *inferior, void *data)
215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   inferior->target_data = data;
217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid * inferior_regcache_data (struct thread_info *inferior)
220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return inferior->regcache_data;
222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid set_inferior_regcache_data (struct thread_info *inferior, void *data)
225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   inferior->regcache_data = data;
227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
228