Include string.h in common-defs.h
[external/binutils.git] / gdb / gdbserver / spu-low.c
1 /* Low level interface to SPUs, for the remote server for GDB.
2    Copyright (C) 2006-2014 Free Software Foundation, Inc.
3
4    Contributed by Ulrich Weigand <uweigand@de.ibm.com>.
5
6    This file is part of GDB.
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20
21 #include "server.h"
22
23 #include "gdb_wait.h"
24 #include <sys/ptrace.h>
25 #include <fcntl.h>
26 #include <unistd.h>
27 #include <errno.h>
28 #include <sys/syscall.h>
29 #include "filestuff.h"
30 #include "hostio.h"
31
32 /* Some older glibc versions do not define this.  */
33 #ifndef __WNOTHREAD
34 #define __WNOTHREAD     0x20000000      /* Don't wait on children of other
35                                            threads in this group */
36 #endif
37
38 #define PTRACE_TYPE_RET long
39 #define PTRACE_TYPE_ARG3 long
40
41 /* Number of registers.  */
42 #define SPU_NUM_REGS         130
43 #define SPU_NUM_CORE_REGS    128
44
45 /* Special registers.  */
46 #define SPU_ID_REGNUM        128
47 #define SPU_PC_REGNUM        129
48
49 /* PPU side system calls.  */
50 #define INSTR_SC        0x44000002
51 #define NR_spu_run      0x0116
52
53 /* These are used in remote-utils.c.  */
54 int using_threads = 0;
55
56 /* Defined in auto-generated file reg-spu.c.  */
57 void init_registers_spu (void);
58 extern const struct target_desc *tdesc_spu;
59
60 /* Fetch PPU register REGNO.  */
61 static CORE_ADDR
62 fetch_ppc_register (int regno)
63 {
64   PTRACE_TYPE_RET res;
65
66   int tid = ptid_get_lwp (current_ptid);
67
68 #ifndef __powerpc64__
69   /* If running as a 32-bit process on a 64-bit system, we attempt
70      to get the full 64-bit register content of the target process.
71      If the PPC special ptrace call fails, we're on a 32-bit system;
72      just fall through to the regular ptrace call in that case.  */
73   {
74     char buf[8];
75
76     errno = 0;
77     ptrace (PPC_PTRACE_PEEKUSR_3264, tid,
78             (PTRACE_TYPE_ARG3) (regno * 8), buf);
79     if (errno == 0)
80       ptrace (PPC_PTRACE_PEEKUSR_3264, tid,
81               (PTRACE_TYPE_ARG3) (regno * 8 + 4), buf + 4);
82     if (errno == 0)
83       return (CORE_ADDR) *(unsigned long long *)buf;
84   }
85 #endif
86
87   errno = 0;
88   res = ptrace (PT_READ_U, tid,
89                 (PTRACE_TYPE_ARG3) (regno * sizeof (PTRACE_TYPE_RET)), 0);
90   if (errno != 0)
91     {
92       char mess[128];
93       sprintf (mess, "reading PPC register #%d", regno);
94       perror_with_name (mess);
95     }
96
97   return (CORE_ADDR) (unsigned long) res;
98 }
99
100 /* Fetch WORD from PPU memory at (aligned) MEMADDR in thread TID.  */
101 static int
102 fetch_ppc_memory_1 (int tid, CORE_ADDR memaddr, PTRACE_TYPE_RET *word)
103 {
104   errno = 0;
105
106 #ifndef __powerpc64__
107   if (memaddr >> 32)
108     {
109       unsigned long long addr_8 = (unsigned long long) memaddr;
110       ptrace (PPC_PTRACE_PEEKTEXT_3264, tid, (PTRACE_TYPE_ARG3) &addr_8, word);
111     }
112   else
113 #endif
114     *word = ptrace (PT_READ_I, tid, (PTRACE_TYPE_ARG3) (size_t) memaddr, 0);
115
116   return errno;
117 }
118
119 /* Store WORD into PPU memory at (aligned) MEMADDR in thread TID.  */
120 static int
121 store_ppc_memory_1 (int tid, CORE_ADDR memaddr, PTRACE_TYPE_RET word)
122 {
123   errno = 0;
124
125 #ifndef __powerpc64__
126   if (memaddr >> 32)
127     {
128       unsigned long long addr_8 = (unsigned long long) memaddr;
129       ptrace (PPC_PTRACE_POKEDATA_3264, tid, (PTRACE_TYPE_ARG3) &addr_8, word);
130     }
131   else
132 #endif
133     ptrace (PT_WRITE_D, tid, (PTRACE_TYPE_ARG3) (size_t) memaddr, word);
134
135   return errno;
136 }
137
138 /* Fetch LEN bytes of PPU memory at MEMADDR to MYADDR.  */
139 static int
140 fetch_ppc_memory (CORE_ADDR memaddr, char *myaddr, int len)
141 {
142   int i, ret;
143
144   CORE_ADDR addr = memaddr & -(CORE_ADDR) sizeof (PTRACE_TYPE_RET);
145   int count = ((((memaddr + len) - addr) + sizeof (PTRACE_TYPE_RET) - 1)
146                / sizeof (PTRACE_TYPE_RET));
147   PTRACE_TYPE_RET *buffer;
148
149   int tid = ptid_get_lwp (current_ptid);
150
151   buffer = (PTRACE_TYPE_RET *) alloca (count * sizeof (PTRACE_TYPE_RET));
152   for (i = 0; i < count; i++, addr += sizeof (PTRACE_TYPE_RET))
153     if ((ret = fetch_ppc_memory_1 (tid, addr, &buffer[i])) != 0)
154       return ret;
155
156   memcpy (myaddr,
157           (char *) buffer + (memaddr & (sizeof (PTRACE_TYPE_RET) - 1)),
158           len);
159
160   return 0;
161 }
162
163 /* Store LEN bytes from MYADDR to PPU memory at MEMADDR.  */
164 static int
165 store_ppc_memory (CORE_ADDR memaddr, char *myaddr, int len)
166 {
167   int i, ret;
168
169   CORE_ADDR addr = memaddr & -(CORE_ADDR) sizeof (PTRACE_TYPE_RET);
170   int count = ((((memaddr + len) - addr) + sizeof (PTRACE_TYPE_RET) - 1)
171                / sizeof (PTRACE_TYPE_RET));
172   PTRACE_TYPE_RET *buffer;
173
174   int tid = ptid_get_lwp (current_ptid);
175
176   buffer = (PTRACE_TYPE_RET *) alloca (count * sizeof (PTRACE_TYPE_RET));
177
178   if (addr != memaddr || len < (int) sizeof (PTRACE_TYPE_RET))
179     if ((ret = fetch_ppc_memory_1 (tid, addr, &buffer[0])) != 0)
180       return ret;
181
182   if (count > 1)
183     if ((ret = fetch_ppc_memory_1 (tid, addr + (count - 1)
184                                                * sizeof (PTRACE_TYPE_RET),
185                                    &buffer[count - 1])) != 0)
186       return ret;
187
188   memcpy ((char *) buffer + (memaddr & (sizeof (PTRACE_TYPE_RET) - 1)),
189           myaddr, len);
190
191   for (i = 0; i < count; i++, addr += sizeof (PTRACE_TYPE_RET))
192     if ((ret = store_ppc_memory_1 (tid, addr, buffer[i])) != 0)
193       return ret;
194
195   return 0;
196 }
197
198
199 /* If the PPU thread is currently stopped on a spu_run system call,
200    return to FD and ADDR the file handle and NPC parameter address
201    used with the system call.  Return non-zero if successful.  */
202 static int
203 parse_spufs_run (int *fd, CORE_ADDR *addr)
204 {
205   unsigned int insn;
206   CORE_ADDR pc = fetch_ppc_register (32);  /* nip */
207
208   /* Fetch instruction preceding current NIP.  */
209   if (fetch_ppc_memory (pc-4, (char *) &insn, 4) != 0)
210     return 0;
211   /* It should be a "sc" instruction.  */
212   if (insn != INSTR_SC)
213     return 0;
214   /* System call number should be NR_spu_run.  */
215   if (fetch_ppc_register (0) != NR_spu_run)
216     return 0;
217
218   /* Register 3 contains fd, register 4 the NPC param pointer.  */
219   *fd = fetch_ppc_register (34);  /* orig_gpr3 */
220   *addr = fetch_ppc_register (4);
221   return 1;
222 }
223
224
225 /* Copy LEN bytes at OFFSET in spufs file ANNEX into/from READBUF or WRITEBUF,
226    using the /proc file system.  */
227 static int
228 spu_proc_xfer_spu (const char *annex, unsigned char *readbuf,
229                    const unsigned char *writebuf,
230                    CORE_ADDR offset, int len)
231 {
232   char buf[128];
233   int fd = 0;
234   int ret = -1;
235
236   if (!annex)
237     return 0;
238
239   sprintf (buf, "/proc/%ld/fd/%s", ptid_get_lwp (current_ptid), annex);
240   fd = open (buf, writebuf? O_WRONLY : O_RDONLY);
241   if (fd <= 0)
242     return -1;
243
244   if (offset != 0
245       && lseek (fd, (off_t) offset, SEEK_SET) != (off_t) offset)
246     {
247       close (fd);
248       return 0;
249     }
250
251   if (writebuf)
252     ret = write (fd, writebuf, (size_t) len);
253   else if (readbuf)
254     ret = read (fd, readbuf, (size_t) len);
255
256   close (fd);
257   return ret;
258 }
259
260
261 /* Start an inferior process and returns its pid.
262    ALLARGS is a vector of program-name and args. */
263 static int
264 spu_create_inferior (char *program, char **allargs)
265 {
266   int pid;
267   ptid_t ptid;
268   struct process_info *proc;
269
270   pid = fork ();
271   if (pid < 0)
272     perror_with_name ("fork");
273
274   if (pid == 0)
275     {
276       close_most_fds ();
277       ptrace (PTRACE_TRACEME, 0, 0, 0);
278
279       setpgid (0, 0);
280
281       execv (program, allargs);
282       if (errno == ENOENT)
283         execvp (program, allargs);
284
285       fprintf (stderr, "Cannot exec %s: %s.\n", program,
286                strerror (errno));
287       fflush (stderr);
288       _exit (0177);
289     }
290
291   proc = add_process (pid, 0);
292   proc->tdesc = tdesc_spu;
293
294   ptid = ptid_build (pid, pid, 0);
295   add_thread (ptid, NULL);
296   return pid;
297 }
298
299 /* Attach to an inferior process.  */
300 int
301 spu_attach (unsigned long  pid)
302 {
303   ptid_t ptid;
304   struct process_info *proc;
305
306   if (ptrace (PTRACE_ATTACH, pid, 0, 0) != 0)
307     {
308       fprintf (stderr, "Cannot attach to process %ld: %s (%d)\n", pid,
309                strerror (errno), errno);
310       fflush (stderr);
311       _exit (0177);
312     }
313
314   proc = add_process (pid, 1);
315   proc->tdesc = tdesc_spu;
316   ptid = ptid_build (pid, pid, 0);
317   add_thread (ptid, NULL);
318   return 0;
319 }
320
321 /* Kill the inferior process.  */
322 static int
323 spu_kill (int pid)
324 {
325   int status, ret;
326   struct process_info *process = find_process_pid (pid);
327   if (process == NULL)
328     return -1;
329
330   ptrace (PTRACE_KILL, pid, 0, 0);
331
332   do {
333     ret = waitpid (pid, &status, 0);
334     if (WIFEXITED (status) || WIFSIGNALED (status))
335       break;
336   } while (ret != -1 || errno != ECHILD);
337
338   clear_inferiors ();
339   remove_process (process);
340   return 0;
341 }
342
343 /* Detach from inferior process.  */
344 static int
345 spu_detach (int pid)
346 {
347   struct process_info *process = find_process_pid (pid);
348   if (process == NULL)
349     return -1;
350
351   ptrace (PTRACE_DETACH, pid, 0, 0);
352
353   clear_inferiors ();
354   remove_process (process);
355   return 0;
356 }
357
358 static void
359 spu_mourn (struct process_info *process)
360 {
361   remove_process (process);
362 }
363
364 static void
365 spu_join (int pid)
366 {
367   int status, ret;
368
369   do {
370     ret = waitpid (pid, &status, 0);
371     if (WIFEXITED (status) || WIFSIGNALED (status))
372       break;
373   } while (ret != -1 || errno != ECHILD);
374 }
375
376 /* Return nonzero if the given thread is still alive.  */
377 static int
378 spu_thread_alive (ptid_t ptid)
379 {
380   return ptid_equal (ptid, current_ptid);
381 }
382
383 /* Resume process.  */
384 static void
385 spu_resume (struct thread_resume *resume_info, size_t n)
386 {
387   size_t i;
388
389   for (i = 0; i < n; i++)
390     if (ptid_equal (resume_info[i].thread, minus_one_ptid)
391         || ptid_equal (resume_info[i].thread, current_ptid))
392       break;
393
394   if (i == n)
395     return;
396
397   /* We don't support hardware single-stepping right now, assume
398      GDB knows to use software single-stepping.  */
399   if (resume_info[i].kind == resume_step)
400     fprintf (stderr, "Hardware single-step not supported.\n");
401
402   regcache_invalidate ();
403
404   errno = 0;
405   ptrace (PTRACE_CONT, ptid_get_lwp (current_ptid), 0, resume_info[i].sig);
406   if (errno)
407     perror_with_name ("ptrace");
408 }
409
410 /* Wait for process, returns status.  */
411 static ptid_t
412 spu_wait (ptid_t ptid, struct target_waitstatus *ourstatus, int options)
413 {
414   int pid = ptid_get_pid (ptid);
415   int w;
416   int ret;
417
418   while (1)
419     {
420       ret = waitpid (pid, &w, WNOHANG | __WALL | __WNOTHREAD);
421
422       if (ret == -1)
423         {
424           if (errno != ECHILD)
425             perror_with_name ("waitpid");
426         }
427       else if (ret > 0)
428         break;
429
430       usleep (1000);
431     }
432
433   /* On the first wait, continue running the inferior until we are
434      blocked inside an spu_run system call.  */
435   if (!server_waiting)
436     {
437       int fd;
438       CORE_ADDR addr;
439
440       while (!parse_spufs_run (&fd, &addr))
441         {
442           ptrace (PT_SYSCALL, pid, (PTRACE_TYPE_ARG3) 0, 0);
443           waitpid (pid, NULL, __WALL | __WNOTHREAD);
444         }
445     }
446
447   if (WIFEXITED (w))
448     {
449       fprintf (stderr, "\nChild exited with retcode = %x \n", WEXITSTATUS (w));
450       ourstatus->kind =  TARGET_WAITKIND_EXITED;
451       ourstatus->value.integer = WEXITSTATUS (w);
452       clear_inferiors ();
453       return pid_to_ptid (ret);
454     }
455   else if (!WIFSTOPPED (w))
456     {
457       fprintf (stderr, "\nChild terminated with signal = %x \n", WTERMSIG (w));
458       ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
459       ourstatus->value.sig = gdb_signal_from_host (WTERMSIG (w));
460       clear_inferiors ();
461       return pid_to_ptid (ret);
462     }
463
464   /* After attach, we may have received a SIGSTOP.  Do not return this
465      as signal to GDB, or else it will try to continue with SIGSTOP ...  */
466   if (!server_waiting)
467     {
468       ourstatus->kind = TARGET_WAITKIND_STOPPED;
469       ourstatus->value.sig = GDB_SIGNAL_0;
470       return ptid_build (ret, ret, 0);
471     }
472
473   ourstatus->kind = TARGET_WAITKIND_STOPPED;
474   ourstatus->value.sig = gdb_signal_from_host (WSTOPSIG (w));
475   return ptid_build (ret, ret, 0);
476 }
477
478 /* Fetch inferior registers.  */
479 static void
480 spu_fetch_registers (struct regcache *regcache, int regno)
481 {
482   int fd;
483   CORE_ADDR addr;
484
485   /* We must be stopped on a spu_run system call.  */
486   if (!parse_spufs_run (&fd, &addr))
487     return;
488
489   /* The ID register holds the spufs file handle.  */
490   if (regno == -1 || regno == SPU_ID_REGNUM)
491     supply_register (regcache, SPU_ID_REGNUM, (char *)&fd);
492
493   /* The NPC register is found at ADDR.  */
494   if (regno == -1 || regno == SPU_PC_REGNUM)
495     {
496       char buf[4];
497       if (fetch_ppc_memory (addr, buf, 4) == 0)
498         supply_register (regcache, SPU_PC_REGNUM, buf);
499     }
500
501   /* The GPRs are found in the "regs" spufs file.  */
502   if (regno == -1 || (regno >= 0 && regno < SPU_NUM_CORE_REGS))
503     {
504       unsigned char buf[16*SPU_NUM_CORE_REGS];
505       char annex[32];
506       int i;
507
508       sprintf (annex, "%d/regs", fd);
509       if (spu_proc_xfer_spu (annex, buf, NULL, 0, sizeof buf) == sizeof buf)
510         for (i = 0; i < SPU_NUM_CORE_REGS; i++)
511           supply_register (regcache, i, buf + i*16);
512     }
513 }
514
515 /* Store inferior registers.  */
516 static void
517 spu_store_registers (struct regcache *regcache, int regno)
518 {
519   int fd;
520   CORE_ADDR addr;
521
522   /* ??? Some callers use 0 to mean all registers.  */
523   if (regno == 0)
524     regno = -1;
525
526   /* We must be stopped on a spu_run system call.  */
527   if (!parse_spufs_run (&fd, &addr))
528     return;
529
530   /* The NPC register is found at ADDR.  */
531   if (regno == -1 || regno == SPU_PC_REGNUM)
532     {
533       char buf[4];
534       collect_register (regcache, SPU_PC_REGNUM, buf);
535       store_ppc_memory (addr, buf, 4);
536     }
537
538   /* The GPRs are found in the "regs" spufs file.  */
539   if (regno == -1 || (regno >= 0 && regno < SPU_NUM_CORE_REGS))
540     {
541       unsigned char buf[16*SPU_NUM_CORE_REGS];
542       char annex[32];
543       int i;
544
545       for (i = 0; i < SPU_NUM_CORE_REGS; i++)
546         collect_register (regcache, i, buf + i*16);
547
548       sprintf (annex, "%d/regs", fd);
549       spu_proc_xfer_spu (annex, NULL, buf, 0, sizeof buf);
550     }
551 }
552
553 /* Copy LEN bytes from inferior's memory starting at MEMADDR
554    to debugger memory starting at MYADDR.  */
555 static int
556 spu_read_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len)
557 {
558   int fd, ret;
559   CORE_ADDR addr;
560   char annex[32], lslr_annex[32], buf[32];
561   CORE_ADDR lslr;
562
563   /* We must be stopped on a spu_run system call.  */
564   if (!parse_spufs_run (&fd, &addr))
565     return 0;
566
567   /* Use the "mem" spufs file to access SPU local store.  */
568   sprintf (annex, "%d/mem", fd);
569   ret = spu_proc_xfer_spu (annex, myaddr, NULL, memaddr, len);
570   if (ret > 0)
571     return ret == len ? 0 : EIO;
572
573   /* SPU local store access wraps the address around at the
574      local store limit.  We emulate this here.  To avoid needing
575      an extra access to retrieve the LSLR, we only do that after
576      trying the original address first, and getting end-of-file.  */
577   sprintf (lslr_annex, "%d/lslr", fd);
578   memset (buf, 0, sizeof buf);
579   if (spu_proc_xfer_spu (lslr_annex, (unsigned char *)buf, NULL,
580                          0, sizeof buf) <= 0)
581     return ret;
582
583   lslr = strtoul (buf, NULL, 16);
584   ret = spu_proc_xfer_spu (annex, myaddr, NULL, memaddr & lslr, len);
585
586   return ret == len ? 0 : EIO;
587 }
588
589 /* Copy LEN bytes of data from debugger memory at MYADDR
590    to inferior's memory at MEMADDR.
591    On failure (cannot write the inferior)
592    returns the value of errno.  */
593 static int
594 spu_write_memory (CORE_ADDR memaddr, const unsigned char *myaddr, int len)
595 {
596   int fd, ret;
597   CORE_ADDR addr;
598   char annex[32], lslr_annex[32], buf[32];
599   CORE_ADDR lslr;
600
601   /* We must be stopped on a spu_run system call.  */
602   if (!parse_spufs_run (&fd, &addr))
603     return 0;
604
605   /* Use the "mem" spufs file to access SPU local store.  */
606   sprintf (annex, "%d/mem", fd);
607   ret = spu_proc_xfer_spu (annex, NULL, myaddr, memaddr, len);
608   if (ret > 0)
609     return ret == len ? 0 : EIO;
610
611   /* SPU local store access wraps the address around at the
612      local store limit.  We emulate this here.  To avoid needing
613      an extra access to retrieve the LSLR, we only do that after
614      trying the original address first, and getting end-of-file.  */
615   sprintf (lslr_annex, "%d/lslr", fd);
616   memset (buf, 0, sizeof buf);
617   if (spu_proc_xfer_spu (lslr_annex, (unsigned char *)buf, NULL,
618                          0, sizeof buf) <= 0)
619     return ret;
620
621   lslr = strtoul (buf, NULL, 16);
622   ret = spu_proc_xfer_spu (annex, NULL, myaddr, memaddr & lslr, len);
623
624   return ret == len ? 0 : EIO;
625 }
626
627 /* Look up special symbols -- unneded here.  */
628 static void
629 spu_look_up_symbols (void)
630 {
631 }
632
633 /* Send signal to inferior.  */
634 static void
635 spu_request_interrupt (void)
636 {
637   syscall (SYS_tkill, ptid_get_lwp (current_ptid), SIGINT);
638 }
639
640 static struct target_ops spu_target_ops = {
641   spu_create_inferior,
642   spu_attach,
643   spu_kill,
644   spu_detach,
645   spu_mourn,
646   spu_join,
647   spu_thread_alive,
648   spu_resume,
649   spu_wait,
650   spu_fetch_registers,
651   spu_store_registers,
652   NULL, /* prepare_to_access_memory */
653   NULL, /* done_accessing_memory */
654   spu_read_memory,
655   spu_write_memory,
656   spu_look_up_symbols,
657   spu_request_interrupt,
658   NULL,
659   NULL,  /* supports_z_point_type */
660   NULL,
661   NULL,
662   NULL,
663   NULL,
664   NULL,
665   NULL,
666   spu_proc_xfer_spu,
667   hostio_last_error_from_errno,
668 };
669
670 void
671 initialize_low (void)
672 {
673   static const unsigned char breakpoint[] = { 0x00, 0x00, 0x3f, 0xff };
674
675   set_target_ops (&spu_target_ops);
676   set_breakpoint_data (breakpoint, sizeof breakpoint);
677   init_registers_spu ();
678 }