• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Target operations for the remote server for GDB.
2    Copyright (C) 2002, 2004, 2005, 2011
3    Free Software Foundation, Inc.
4 
5    Contributed by MontaVista Software.
6 
7    This file is part of GDB.
8    It has been modified to integrate it in valgrind
9 
10    This program is free software; you can redistribute it and/or modify
11    it under the terms of the GNU General Public License as published by
12    the Free Software Foundation; either version 2 of the License, or
13    (at your option) any later version.
14 
15    This program is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18    GNU General Public License for more details.
19 
20    You should have received a copy of the GNU General Public License
21    along with this program; if not, write to the Free Software
22    Foundation, Inc., 51 Franklin Street, Fifth Floor,
23    Boston, MA 02110-1301, USA.  */
24 
25 #include "server.h"
26 #include "target.h"
27 #include "regdef.h"
28 #include "regcache.h"
29 #include "valgrind_low.h"
30 #include "gdb/signals.h"
31 #include "pub_core_aspacemgr.h"
32 #include "pub_core_machine.h"
33 #include "pub_core_threadstate.h"
34 #include "pub_core_transtab.h"
35 #include "pub_core_gdbserver.h"
36 #include "pub_core_debuginfo.h"
37 
38 
39 /* the_low_target defines the architecture specific aspects depending
40    on the cpu */
41 static struct valgrind_target_ops the_low_target;
42 
43 static
image_ptid(unsigned long ptid)44 char *image_ptid(unsigned long ptid)
45 {
46   static char result[50];    // large enough
47   VG_(sprintf) (result, "id %lu", ptid);
48   return result;
49 }
50 #define get_thread(inf) ((struct thread_info *)(inf))
51 static
remove_thread_if_not_in_vg_threads(struct inferior_list_entry * inf)52 void remove_thread_if_not_in_vg_threads (struct inferior_list_entry *inf)
53 {
54   struct thread_info *thread = get_thread (inf);
55   if (!VG_(lwpid_to_vgtid)(thread_to_gdb_id(thread))) {
56      dlog(1, "removing gdb ptid %s\n",
57           image_ptid(thread_to_gdb_id(thread)));
58      remove_thread (thread);
59   }
60 }
61 
62 /* synchronize threads known by valgrind and threads known by gdbserver */
63 static
valgrind_update_threads(int pid)64 void valgrind_update_threads (int pid)
65 {
66   ThreadId tid;
67   ThreadState *ts;
68   unsigned long ptid;
69   struct thread_info *ti;
70 
71   /* call remove_thread for all gdb threads not in valgrind threads */
72   for_each_inferior (&all_threads, remove_thread_if_not_in_vg_threads);
73 
74   /* call add_thread for all valgrind threads not known in gdb all_threads */
75   for (tid = 1; tid < VG_N_THREADS; tid++) {
76 
77 #define LOCAL_THREAD_TRACE " ti* %p vgtid %u status %s as gdb ptid %s lwpid %d\n", \
78         ti, tid, VG_(name_of_ThreadStatus) (ts->status), \
79         image_ptid (ptid), ts->os_state.lwpid
80 
81      if (VG_(is_valid_tid) (tid)) {
82         ts = VG_(get_ThreadState) (tid);
83         ptid = ts->os_state.lwpid;
84         ti = gdb_id_to_thread (ptid);
85         if (!ti) {
86            /* we do not report the threads which are not yet fully
87               initialized otherwise this creates duplicated threads
88               in gdb: once with pid xxx lwpid 0, then after that
89               with pid xxx lwpid yyy. */
90            if (ts->status != VgTs_Init) {
91               dlog(1, "adding_thread" LOCAL_THREAD_TRACE);
92               add_thread (ptid, ts, ptid);
93            }
94         } else {
95            dlog(2, "(known thread)" LOCAL_THREAD_TRACE);
96         }
97      }
98 #undef LOCAL_THREAD_TRACE
99   }
100 }
101 
102 static
build_shadow_arch(struct reg * reg_defs,int n)103 struct reg* build_shadow_arch (struct reg *reg_defs, int n) {
104    int i, r;
105    static const char *postfix[3] = { "", "s1", "s2" };
106    struct reg *new_regs = malloc(3 * n * sizeof(reg_defs[0]));
107    int reg_set_len = reg_defs[n-1].offset + reg_defs[n-1].size;
108 
109    for (i = 0; i < 3; i++) {
110       for (r = 0; r < n; r++) {
111          char *regname = malloc(strlen(reg_defs[r].name)
112                                 + strlen (postfix[i]) + 1);
113          strcpy (regname, reg_defs[r].name);
114          strcat (regname, postfix[i]);
115          new_regs[i*n + r].name = regname;
116          new_regs[i*n + r].offset = i*reg_set_len + reg_defs[r].offset;
117          new_regs[i*n + r].size = reg_defs[r].size;
118          dlog(1,
119               "%-10s Nr %d offset(bit) %d offset(byte) %d  size(bit) %d\n",
120               new_regs[i*n + r].name, i*n + r, new_regs[i*n + r].offset,
121               (new_regs[i*n + r].offset) / 8, new_regs[i*n + r].size);
122       }
123    }
124 
125    return new_regs;
126 }
127 
128 
129 static CORE_ADDR stopped_data_address = 0;
VG_(set_watchpoint_stop_address)130 void VG_(set_watchpoint_stop_address) (Addr addr)
131 {
132    stopped_data_address = addr;
133 }
134 
valgrind_stopped_by_watchpoint(void)135 int valgrind_stopped_by_watchpoint (void)
136 {
137    return stopped_data_address != 0;
138 }
139 
valgrind_stopped_data_address(void)140 CORE_ADDR valgrind_stopped_data_address (void)
141 {
142    return stopped_data_address;
143 }
144 
145 /* pc at which we last stopped */
146 static CORE_ADDR stop_pc;
147 
148 /* pc at which we resume.
149    If stop_pc != resume_pc, it means
150       gdb/gdbserver has changed the pc so as to have either
151       a    "continue by jumping at that address"
152       or a "continue at that address to call some code from gdb".
153 */
154 static CORE_ADDR resume_pc;
155 
156 static vki_siginfo_t vki_signal_to_report;
157 static vki_siginfo_t vki_signal_to_deliver;
158 
gdbserver_signal_encountered(const vki_siginfo_t * info)159 void gdbserver_signal_encountered (const vki_siginfo_t *info)
160 {
161    vki_signal_to_report = *info;
162    vki_signal_to_deliver = *info;
163 }
164 
gdbserver_pending_signal_to_report(vki_siginfo_t * info)165 void gdbserver_pending_signal_to_report (vki_siginfo_t *info)
166 {
167    *info = vki_signal_to_report;
168 }
169 
gdbserver_deliver_signal(vki_siginfo_t * info)170 Bool gdbserver_deliver_signal (vki_siginfo_t *info)
171 {
172    if (info->si_signo != vki_signal_to_deliver.si_signo)
173       dlog(1, "GDB changed signal  info %d to_report %d to_deliver %d\n",
174            info->si_signo, vki_signal_to_report.si_signo,
175            vki_signal_to_deliver.si_signo);
176    *info = vki_signal_to_deliver;
177    return vki_signal_to_deliver.si_signo != 0;
178 }
179 
180 static Bool before_syscall;
181 static Int sysno_to_report = -1;
gdbserver_syscall_encountered(Bool before,Int sysno)182 void gdbserver_syscall_encountered (Bool before, Int sysno)
183 {
184    before_syscall = before;
185    sysno_to_report = sysno;
186 }
187 
valgrind_stopped_by_syscall(void)188 Int valgrind_stopped_by_syscall (void)
189 {
190    return sysno_to_report;
191 }
192 
valgrind_stopped_before_syscall()193 Bool valgrind_stopped_before_syscall()
194 {
195    vg_assert (sysno_to_report >= 0);
196    return before_syscall;
197 }
198 
199 
200 static unsigned char exit_status_to_report;
201 static int exit_code_to_report;
gdbserver_process_exit_encountered(unsigned char status,Int code)202 void gdbserver_process_exit_encountered (unsigned char status, Int code)
203 {
204    vg_assert (status == 'W' || status == 'X');
205    exit_status_to_report = status;
206    exit_code_to_report = code;
207 }
208 
209 static
sym(Addr addr)210 const HChar* sym (Addr addr)
211 {
212    return VG_(describe_IP) (addr, NULL);
213 }
214 
215 ThreadId vgdb_interrupted_tid = 0;
216 
217 /* 0 => not single stepping.
218    1 => single stepping asked by gdb
219    2 => single stepping asked by valgrind (watchpoint) */
220 static int stepping = 0;
221 
valgrind_get_ignore_break_once(void)222 Addr valgrind_get_ignore_break_once(void)
223 {
224    if (valgrind_single_stepping())
225       return resume_pc;
226    else
227       return 0;
228 }
229 
valgrind_set_single_stepping(Bool set)230 void valgrind_set_single_stepping(Bool set)
231 {
232    if (set)
233       stepping = 2;
234    else
235       stepping = 0;
236 }
237 
valgrind_single_stepping(void)238 Bool valgrind_single_stepping(void)
239 {
240    if (stepping)
241       return True;
242    else
243       return False;
244 }
245 
valgrind_thread_alive(unsigned long tid)246 int valgrind_thread_alive (unsigned long tid)
247 {
248   struct thread_info *ti =  gdb_id_to_thread(tid);
249   ThreadState *tst;
250 
251   if (ti != NULL) {
252      tst = (ThreadState *) inferior_target_data (ti);
253      return tst->status != VgTs_Zombie;
254   }
255   else {
256     return 0;
257   }
258 }
259 
valgrind_resume(struct thread_resume * resume_info)260 void valgrind_resume (struct thread_resume *resume_info)
261 {
262    dlog(1,
263         "resume_info step %d sig %d stepping %d\n",
264         resume_info->step,
265         resume_info->sig,
266         stepping);
267    if (valgrind_stopped_by_watchpoint()) {
268       dlog(1, "clearing watchpoint stopped_data_address %p\n",
269            C2v(stopped_data_address));
270       VG_(set_watchpoint_stop_address) ((Addr) 0);
271    }
272    if (valgrind_stopped_by_syscall () >= 0) {
273       dlog(1, "clearing stopped by syscall %d\n",
274            valgrind_stopped_by_syscall ());
275       gdbserver_syscall_encountered (False, -1);
276    }
277 
278    vki_signal_to_deliver.si_signo = resume_info->sig;
279    /* signal was reported to GDB, GDB told us to resume execution.
280       So, reset the signal to report to 0. */
281    VG_(memset) (&vki_signal_to_report, 0, sizeof(vki_signal_to_report));
282 
283    stepping = resume_info->step;
284    resume_pc = (*the_low_target.get_pc) ();
285    if (resume_pc != stop_pc) {
286       dlog(1,
287            "stop_pc %p changed to be resume_pc %s\n",
288            C2v(stop_pc), sym(resume_pc));
289    }
290    regcache_invalidate();
291 }
292 
valgrind_wait(char * ourstatus)293 unsigned char valgrind_wait (char *ourstatus)
294 {
295    int pid;
296    unsigned long wptid;
297    ThreadState *tst;
298    enum target_signal sig;
299    int code;
300 
301    pid = VG_(getpid) ();
302    dlog(1, "enter valgrind_wait pid %d\n", pid);
303 
304    regcache_invalidate();
305    valgrind_update_threads(pid);
306 
307    /* First see if we are done with this process. */
308    if (exit_status_to_report != 0) {
309       *ourstatus = exit_status_to_report;
310       exit_status_to_report = 0;
311 
312       if (*ourstatus == 'W') {
313          code = exit_code_to_report;
314          exit_code_to_report = 0;
315          dlog(1, "exit valgrind_wait status W exit code %d\n", code);
316          return code;
317       }
318 
319       if (*ourstatus == 'X') {
320          sig = target_signal_from_host(exit_code_to_report);
321          exit_code_to_report = 0;
322          dlog(1, "exit valgrind_wait status X signal %u\n", sig);
323          return sig;
324       }
325    }
326 
327    /* in valgrind, we consider that a wait always succeeds with STOPPED 'T'
328       and with a signal TRAP (i.e. a breakpoint), unless there is
329       a signal to report. */
330    *ourstatus = 'T';
331    if (vki_signal_to_report.si_signo == 0)
332       sig = TARGET_SIGNAL_TRAP;
333    else
334       sig = target_signal_from_host(vki_signal_to_report.si_signo);
335 
336    if (vgdb_interrupted_tid != 0)
337       tst = VG_(get_ThreadState) (vgdb_interrupted_tid);
338    else
339       tst = VG_(get_ThreadState) (VG_(running_tid));
340    wptid = tst->os_state.lwpid;
341    /* we can only change the current_inferior when the wptid references
342       an existing thread. Otherwise, we are still in the init phase.
343       (hack similar to main thread hack in valgrind_update_threads) */
344    if (tst->os_state.lwpid)
345       current_inferior = gdb_id_to_thread (wptid);
346    stop_pc = (*the_low_target.get_pc) ();
347 
348    dlog(1,
349         "exit valgrind_wait status T ptid %s stop_pc %s signal %u\n",
350         image_ptid (wptid), sym (stop_pc), sig);
351    return sig;
352 }
353 
354 /* Fetch one register from valgrind VEX guest state.  */
355 static
fetch_register(int regno)356 void fetch_register (int regno)
357 {
358    int size;
359    ThreadState *tst = (ThreadState *) inferior_target_data (current_inferior);
360    ThreadId tid = tst->tid;
361 
362    if (regno >= the_low_target.num_regs) {
363       dlog(0, "error fetch_register regno %d max %d\n",
364            regno, the_low_target.num_regs);
365       return;
366    }
367    size = register_size (regno);
368    if (size > 0) {
369       Bool mod;
370       char buf [size];
371       VG_(memset) (buf, 0, size); // registers not fetched will be seen as 0.
372       (*the_low_target.transfer_register) (tid, regno, buf,
373                                            valgrind_to_gdbserver, size, &mod);
374       // Note: the *mod received from transfer_register is not interesting.
375       // We are interested to see if the register data in the register cache is modified.
376       supply_register (regno, buf, &mod);
377       if (mod && VG_(debugLog_getLevel)() > 1) {
378          char bufimage [2*size + 1];
379          heximage (bufimage, buf, size);
380          dlog(3, "fetched register %d size %d name %s value %s tid %u status %s\n",
381               regno, size, the_low_target.reg_defs[regno].name, bufimage,
382               tid, VG_(name_of_ThreadStatus) (tst->status));
383       }
384    }
385 }
386 
387 /* Fetch all registers, or just one, from the child process.  */
388 static
usr_fetch_inferior_registers(int regno)389 void usr_fetch_inferior_registers (int regno)
390 {
391    if (regno == -1 || regno == 0)
392       for (regno = 0; regno < the_low_target.num_regs; regno++)
393          fetch_register (regno);
394    else
395       fetch_register (regno);
396 }
397 
398 /* Store our register values back into the inferior.
399    If REGNO is -1, do this for all registers.
400    Otherwise, REGNO specifies which register (so we can save time).  */
401 static
usr_store_inferior_registers(int regno)402 void usr_store_inferior_registers (int regno)
403 {
404    int size;
405    ThreadState *tst = (ThreadState *) inferior_target_data (current_inferior);
406    ThreadId tid = tst->tid;
407 
408    if (regno >= 0) {
409 
410       if (regno >= the_low_target.num_regs) {
411          dlog(0, "error store_register regno %d max %d\n",
412               regno, the_low_target.num_regs);
413          return;
414       }
415 
416       size = register_size (regno);
417       if (size > 0) {
418          Bool mod;
419          Addr old_SP, new_SP;
420          char buf[size];
421 
422          if (regno == the_low_target.stack_pointer_regno) {
423             /* When the stack pointer register is changed such that
424                the stack is extended, we better inform the tool of the
425                stack increase.  This is needed in particular to avoid
426                spurious Memcheck errors during Inferior calls. So, we
427                save in old_SP the SP before the change. A change of
428                stack pointer is also assumed to have initialised this
429                new stack space. For the typical example of an inferior
430                call, gdb writes arguments on the stack, and then
431                changes the stack pointer. As the stack increase tool
432                function might mark it as undefined, we have to call it
433                at the good moment. */
434             VG_(memset) ((void *) &old_SP, 0, size);
435             (*the_low_target.transfer_register) (tid, regno, (void *) &old_SP,
436                                                  valgrind_to_gdbserver, size, &mod);
437          }
438 
439          VG_(memset) (buf, 0, size);
440          collect_register (regno, buf);
441          (*the_low_target.transfer_register) (tid, regno, buf,
442                                               gdbserver_to_valgrind, size, &mod);
443          if (mod && VG_(debugLog_getLevel)() > 1) {
444             char bufimage [2*size + 1];
445             heximage (bufimage, buf, size);
446             dlog(2,
447                  "stored register %d size %d name %s value %s "
448                  "tid %u status %s\n",
449                  regno, size, the_low_target.reg_defs[regno].name, bufimage,
450                  tid, VG_(name_of_ThreadStatus) (tst->status));
451          }
452          if (regno == the_low_target.stack_pointer_regno) {
453             VG_(memcpy) (&new_SP, buf, size);
454             if (old_SP > new_SP) {
455                Word delta  = (Word)new_SP - (Word)old_SP;
456                dlog(1,
457                     "   stack increase by stack pointer changed from %p to %p "
458                     "delta %ld\n",
459                     (void*) old_SP, (void *) new_SP,
460                     delta);
461                VG_TRACK( new_mem_stack_w_ECU, new_SP, -delta, 0 );
462                VG_TRACK( new_mem_stack,       new_SP, -delta );
463                VG_TRACK( post_mem_write, Vg_CoreClientReq, tid,
464                          new_SP, -delta);
465             }
466          }
467       }
468    }
469    else {
470       for (regno = 0; regno < the_low_target.num_regs; regno++)
471          usr_store_inferior_registers (regno);
472    }
473 }
474 
valgrind_fetch_registers(int regno)475 void valgrind_fetch_registers (int regno)
476 {
477    usr_fetch_inferior_registers (regno);
478 }
479 
valgrind_store_registers(int regno)480 void valgrind_store_registers (int regno)
481 {
482    usr_store_inferior_registers (regno);
483 }
484 
485 Bool hostvisibility = False;
486 
valgrind_read_memory(CORE_ADDR memaddr,unsigned char * myaddr,int len)487 int valgrind_read_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len)
488 {
489    const void *sourceaddr = C2v (memaddr);
490    dlog(3, "reading memory %p size %d\n", sourceaddr, len);
491    if (VG_(am_is_valid_for_client) ((Addr) sourceaddr,
492                                     len, VKI_PROT_READ)
493        || (hostvisibility
494            && VG_(am_is_valid_for_valgrind) ((Addr) sourceaddr,
495                                              len, VKI_PROT_READ))) {
496       VG_(memcpy) (myaddr, sourceaddr, len);
497       return 0;
498    } else {
499       dlog(1, "error reading memory %p size %d\n", sourceaddr, len);
500       return -1;
501    }
502 }
503 
valgrind_write_memory(CORE_ADDR memaddr,const unsigned char * myaddr,int len)504 int valgrind_write_memory (CORE_ADDR memaddr,
505                            const unsigned char *myaddr, int len)
506 {
507    Bool is_valid_client_memory;
508    void *targetaddr = C2v (memaddr);
509    dlog(3, "writing memory %p size %d\n", targetaddr, len);
510    is_valid_client_memory
511       = VG_(am_is_valid_for_client) ((Addr)targetaddr, len, VKI_PROT_WRITE);
512    if (is_valid_client_memory
513        || (hostvisibility
514            && VG_(am_is_valid_for_valgrind) ((Addr) targetaddr,
515                                              len, VKI_PROT_READ))) {
516       if (len > 0) {
517          VG_(memcpy) (targetaddr, myaddr, len);
518          if (is_valid_client_memory && VG_(tdict).track_post_mem_write) {
519             /* Inform the tool of the post memwrite.  Note that we do the
520                minimum necessary to avoid complains from e.g.
521                memcheck. The idea is that the debugger is as least
522                intrusive as possible.  So, we do not inform of the pre
523                mem write (and in any case, this would cause problems with
524                memcheck that does not like our CorePart in
525                pre_mem_write. */
526             ThreadState *tst =
527                (ThreadState *) inferior_target_data (current_inferior);
528             ThreadId tid = tst->tid;
529             VG_(tdict).track_post_mem_write( Vg_CoreClientReq, tid,
530                                              (Addr) targetaddr, len );
531          }
532       }
533       return 0;
534    } else {
535       dlog(1, "error writing memory %p size %d\n", targetaddr, len);
536       return -1;
537    }
538 }
539 
540 /* insert or remove a breakpoint */
541 static
valgrind_point(Bool insert,char type,CORE_ADDR addr,int len)542 int valgrind_point (Bool insert, char type, CORE_ADDR addr, int len)
543 {
544    PointKind kind;
545    switch (type) {
546    case '0': /* implemented by inserting checks at each instruction in sb */
547       kind = software_breakpoint;
548       break;
549    case '1': /* hw breakpoint, same implementation as sw breakpoint */
550       kind = hardware_breakpoint;
551       break;
552    case '2':
553       kind = write_watchpoint;
554       break;
555    case '3':
556       kind = read_watchpoint;
557       break;
558    case '4':
559       kind = access_watchpoint;
560       break;
561    default:
562       vg_assert (0);
563    }
564 
565    /* Attention: gdbserver convention differs: 0 means ok; 1 means not ok */
566    if (VG_(gdbserver_point) (kind, insert, addr, len))
567       return 0;
568    else
569       return 1; /* error or unsupported */
570 }
571 
valgrind_target_xml(Bool shadow_mode)572 const char* valgrind_target_xml (Bool shadow_mode)
573 {
574    return (*the_low_target.target_xml) (shadow_mode);
575 }
576 
valgrind_insert_watchpoint(char type,CORE_ADDR addr,int len)577 int valgrind_insert_watchpoint (char type, CORE_ADDR addr, int len)
578 {
579    return valgrind_point (/* insert */ True, type, addr, len);
580 }
581 
valgrind_remove_watchpoint(char type,CORE_ADDR addr,int len)582 int valgrind_remove_watchpoint (char type, CORE_ADDR addr, int len)
583 {
584    return valgrind_point (/* insert*/ False, type, addr, len);
585 }
586 
587 /* Returns the (platform specific) offset of lm_modid field in the link map
588    struct.
589    Stores the offset in *result and returns True if offset can be determined.
590    Returns False otherwise. *result is not to be used then. */
getplatformoffset(SizeT * result)591 static Bool getplatformoffset (SizeT *result)
592 {
593    static Bool getplatformoffset_called = False;
594 
595    static Bool lm_modid_offset_found = False;
596    static SizeT lm_modid_offset = 1u << 31; // Rubbish initial value.
597    // lm_modid_offset is a magic offset, retrieved using an external program.
598 
599    if (!getplatformoffset_called) {
600       getplatformoffset_called = True;
601       const HChar *platform = VG_PLATFORM;
602       const HChar *cmdformat = "%s/%s-%s -o %s";
603       const HChar *getoff = "getoff";
604       HChar outfile[VG_(mkstemp_fullname_bufsz) (VG_(strlen)(getoff))];
605       Int fd = VG_(mkstemp) (getoff, outfile);
606       if (fd == -1)
607          return False;
608       HChar cmd[ VG_(strlen)(cmdformat)
609                  + VG_(strlen)(VG_(libdir)) - 2
610                  + VG_(strlen)(getoff)      - 2
611                  + VG_(strlen)(platform)    - 2
612                  + VG_(strlen)(outfile)     - 2
613                  + 1];
614       UInt cmdlen;
615       struct vg_stat stat_buf;
616       Int ret;
617 
618       cmdlen = VG_(snprintf)(cmd, sizeof(cmd),
619                              cmdformat,
620                              VG_(libdir), getoff, platform, outfile);
621       vg_assert (cmdlen == sizeof(cmd) - 1);
622       ret = VG_(system) (cmd);
623       if (ret != 0 || VG_(debugLog_getLevel)() >= 1)
624          VG_(dmsg) ("command %s exit code %d\n", cmd, ret);
625       ret = VG_(fstat)( fd, &stat_buf );
626       if (ret != 0)
627          VG_(dmsg) ("error VG_(fstat) %d %s\n", fd, outfile);
628       else {
629          HChar *w;
630          HChar *ssaveptr;
631          HChar *os;
632          HChar *str;
633          HChar *endptr;
634 
635          os = malloc (stat_buf.size+1);
636          vg_assert (os);
637          ret = VG_(read)(fd, os, stat_buf.size);
638          vg_assert(ret == stat_buf.size);
639          os[ret] = '\0';
640          str = os;
641          while ((w = VG_(strtok_r)(str, " \n", &ssaveptr)) != NULL) {
642             if (VG_(strcmp) (w, "lm_modid_offset") == 0) {
643                w = VG_(strtok_r)(NULL, " \n", &ssaveptr);
644                lm_modid_offset = (SizeT) VG_(strtoull16) ( w, &endptr );
645                if (endptr == w)
646                   VG_(dmsg) ("%s lm_modid_offset unexpected hex value %s\n",
647                              cmd, w);
648                else
649                   lm_modid_offset_found = True;
650             } else {
651                VG_(dmsg) ("%s produced unexpected %s\n", cmd, w);
652             }
653             str = NULL; // ensure next  VG_(strtok_r) continues the parsing.
654          }
655          VG_(free) (os);
656       }
657 
658       VG_(close)(fd);
659       ret = VG_(unlink)( outfile );
660       if (ret != 0)
661          VG_(umsg) ("error: could not unlink %s\n", outfile);
662    }
663 
664    *result = lm_modid_offset;
665    return lm_modid_offset_found;
666 }
667 
valgrind_get_tls_addr(ThreadState * tst,CORE_ADDR offset,CORE_ADDR lm,CORE_ADDR * tls_addr)668 Bool valgrind_get_tls_addr (ThreadState *tst,
669                             CORE_ADDR offset,
670                             CORE_ADDR lm,
671                             CORE_ADDR *tls_addr)
672 {
673    CORE_ADDR **dtv_loc;
674    CORE_ADDR *dtv;
675    SizeT lm_modid_offset;
676    unsigned long int modid;
677 
678 #define CHECK_DEREF(addr, len, name) \
679    if (!VG_(am_is_valid_for_client) ((Addr)(addr), (len), VKI_PROT_READ)) { \
680       dlog(0, "get_tls_addr: %s at %p len %lu not addressable\n",       \
681            name, (void*)(addr), (unsigned long)(len));                  \
682       return False;                                                     \
683    }
684 
685    *tls_addr = 0;
686 
687    if (the_low_target.target_get_dtv == NULL) {
688       dlog(1, "low level dtv support not available\n");
689       return False;
690    }
691 
692    if (!getplatformoffset (&lm_modid_offset)) {
693       dlog(0, "link_map modid field offset not available\n");
694       return False;
695    }
696    dlog (2, "link_map modid offset %p\n", (void*)lm_modid_offset);
697    vg_assert (lm_modid_offset < 0x10000); // let's say
698 
699    dtv_loc = (*the_low_target.target_get_dtv)(tst);
700    if (dtv_loc == NULL) {
701       dlog(0, "low level dtv support returned NULL\n");
702       return False;
703    }
704 
705    CHECK_DEREF(dtv_loc, sizeof(CORE_ADDR), "dtv_loc");
706    dtv = *dtv_loc;
707 
708    // Check we can read at least 2 address at the beginning of dtv.
709    CHECK_DEREF(dtv, 2*sizeof(CORE_ADDR), "dtv 2 first entries");
710    dlog (2, "tid %u dtv %p\n", tst->tid, (void*)dtv);
711 
712    // Check we can read the modid
713    CHECK_DEREF(lm+lm_modid_offset, sizeof(unsigned long int), "link_map modid");
714    modid = *(unsigned long int *)(lm+lm_modid_offset);
715 
716    // Check we can access the dtv entry for modid
717    CHECK_DEREF(dtv + 2 * modid, sizeof(CORE_ADDR), "dtv[2*modid]");
718 
719    // Compute the base address of the tls block.
720    *tls_addr = *(dtv + 2 * modid);
721 
722 #if defined(VGA_mips32) || defined(VGA_mips64)
723    if (*tls_addr & 1) {
724       /* This means that computed address is not valid, most probably
725          because given module uses Static TLS.
726          However, the best we can is to try to compute address using
727          static TLS. This is what libthread_db does.
728          Ref. GLIBC/nptl_db/td_thr_tlsbase.c:td_thr_tlsbase().
729       */
730 
731       CORE_ADDR tls_offset_addr;
732       PtrdiffT tls_offset;
733 
734       dlog(1, "computing tls_addr using static TLS\n");
735 
736       /* Assumes that tls_offset is placed right before tls_modid.
737          To check the assumption, start a gdb on none/tests/tls and do:
738          p &((struct link_map*)0x0)->l_tls_modid
739          p &((struct link_map*)0x0)->l_tls_offset */
740       tls_offset_addr = lm + lm_modid_offset - sizeof(PtrdiffT);
741 
742       // Check we can read the tls_offset.
743       CHECK_DEREF(tls_offset_addr, sizeof(PtrdiffT), "link_map tls_offset");
744       tls_offset = *(PtrdiffT *)(tls_offset_addr);
745 
746       /* Following two values represent platform dependent constants
747          NO_TLS_OFFSET and FORCED_DYNAMIC_TLS_OFFSET, respectively. */
748       if ((tls_offset == -1) || (tls_offset == -2)) {
749          dlog(2, "link_map tls_offset is not valid for static TLS\n");
750          return False;
751       }
752 
753       // This calculation is also platform dependent.
754       *tls_addr = ((CORE_ADDR)dtv_loc + 2 * sizeof(CORE_ADDR) + tls_offset);
755    }
756 #endif
757 
758    // Finally, add tls variable offset to tls block base address.
759    *tls_addr += offset;
760 
761    return True;
762 
763 #undef CHECK_DEREF
764 }
765 
766 /* returns a pointer to the architecture state corresponding to
767    the provided register set: 0 => normal guest registers,
768                               1 => shadow1
769                               2 => shadow2
770 */
get_arch(int set,ThreadState * tst)771 VexGuestArchState* get_arch (int set, ThreadState* tst)
772 {
773   switch (set) {
774   case 0: return &tst->arch.vex;
775   case 1: return &tst->arch.vex_shadow1;
776   case 2: return &tst->arch.vex_shadow2;
777   default: vg_assert(0);
778   }
779 }
780 
781 static int non_shadow_num_regs = 0;
782 static struct reg *non_shadow_reg_defs = NULL;
initialize_shadow_low(Bool shadow_mode)783 void initialize_shadow_low(Bool shadow_mode)
784 {
785   if (non_shadow_reg_defs == NULL) {
786     non_shadow_reg_defs = the_low_target.reg_defs;
787     non_shadow_num_regs = the_low_target.num_regs;
788   }
789 
790   regcache_invalidate();
791   if (the_low_target.reg_defs != non_shadow_reg_defs) {
792      free (the_low_target.reg_defs);
793   }
794   if (shadow_mode) {
795     the_low_target.num_regs = 3 * non_shadow_num_regs;
796     the_low_target.reg_defs = build_shadow_arch (non_shadow_reg_defs, non_shadow_num_regs);
797   } else {
798     the_low_target.num_regs = non_shadow_num_regs;
799     the_low_target.reg_defs = non_shadow_reg_defs;
800   }
801   set_register_cache (the_low_target.reg_defs, the_low_target.num_regs);
802 }
803 
set_desired_inferior(int use_general)804 void set_desired_inferior (int use_general)
805 {
806   struct thread_info *found;
807 
808   if (use_general == 1) {
809      found = (struct thread_info *) find_inferior_id (&all_threads,
810                                                       general_thread);
811   } else {
812      found = NULL;
813 
814      /* If we are continuing any (all) thread(s), use step_thread
815         to decide which thread to step and/or send the specified
816         signal to.  */
817      if ((step_thread != 0 && step_thread != -1)
818          && (cont_thread == 0 || cont_thread == -1))
819 	found = (struct thread_info *) find_inferior_id (&all_threads,
820 							 step_thread);
821 
822      if (found == NULL)
823 	found = (struct thread_info *) find_inferior_id (&all_threads,
824 							 cont_thread);
825   }
826 
827   if (found == NULL)
828      current_inferior = (struct thread_info *) all_threads.head;
829   else
830      current_inferior = found;
831   {
832      ThreadState *tst = (ThreadState *) inferior_target_data (current_inferior);
833      ThreadId tid = tst->tid;
834      dlog(1, "set_desired_inferior use_general %d found %p tid %u lwpid %d\n",
835           use_general, found, tid, tst->os_state.lwpid);
836   }
837 }
838 
VG_(dmemcpy)839 void* VG_(dmemcpy) ( void *d, const void *s, SizeT sz, Bool *mod )
840 {
841    if (VG_(memcmp) (d, s, sz)) {
842       *mod = True;
843       return VG_(memcpy) (d, s, sz);
844    } else {
845       *mod = False;
846       return d;
847    }
848 }
849 
VG_(transfer)850 void VG_(transfer) (void *valgrind,
851                     void *gdbserver,
852                     transfer_direction dir,
853                     SizeT sz,
854                     Bool *mod)
855 {
856    if (dir == valgrind_to_gdbserver)
857       VG_(dmemcpy) (gdbserver, valgrind, sz, mod);
858    else if (dir == gdbserver_to_valgrind)
859       VG_(dmemcpy) (valgrind, gdbserver, sz, mod);
860    else
861       vg_assert (0);
862 }
863 
valgrind_initialize_target(void)864 void valgrind_initialize_target(void)
865 {
866 #if defined(VGA_x86)
867    x86_init_architecture(&the_low_target);
868 #elif defined(VGA_amd64)
869    amd64_init_architecture(&the_low_target);
870 #elif defined(VGA_arm)
871    arm_init_architecture(&the_low_target);
872 #elif defined(VGA_arm64)
873    arm64_init_architecture(&the_low_target);
874 #elif defined(VGA_ppc32)
875    ppc32_init_architecture(&the_low_target);
876 #elif defined(VGA_ppc64be) || defined(VGA_ppc64le)
877    ppc64_init_architecture(&the_low_target);
878 #elif defined(VGA_s390x)
879    s390x_init_architecture(&the_low_target);
880 #elif defined(VGA_mips32)
881    mips32_init_architecture(&the_low_target);
882 #elif defined(VGA_mips64)
883    mips64_init_architecture(&the_low_target);
884 #else
885    #error "architecture missing in target.c valgrind_initialize_target"
886 #endif
887 }
888