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