Enable range stepping if software single step is supported
[deliverable/binutils-gdb.git] / gdb / gdbserver / spu-low.c
CommitLineData
a13e2c95 1/* Low level interface to SPUs, for the remote server for GDB.
618f726f 2 Copyright (C) 2006-2016 Free Software Foundation, Inc.
a13e2c95
UW
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
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
a13e2c95
UW
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
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
a13e2c95
UW
20
21#include "server.h"
22
8bdce1ff 23#include "gdb_wait.h"
a13e2c95
UW
24#include <sys/ptrace.h>
25#include <fcntl.h>
a13e2c95 26#include <unistd.h>
a13e2c95 27#include <sys/syscall.h>
602e3198 28#include "filestuff.h"
533b0600 29#include "hostio.h"
a13e2c95
UW
30
31/* Some older glibc versions do not define this. */
32#ifndef __WNOTHREAD
33#define __WNOTHREAD 0x20000000 /* Don't wait on children of other
1b3f6016 34 threads in this group */
a13e2c95
UW
35#endif
36
37#define PTRACE_TYPE_RET long
38#define PTRACE_TYPE_ARG3 long
39
40/* Number of registers. */
41#define SPU_NUM_REGS 130
42#define SPU_NUM_CORE_REGS 128
43
44/* Special registers. */
45#define SPU_ID_REGNUM 128
46#define SPU_PC_REGNUM 129
47
48/* PPU side system calls. */
49#define INSTR_SC 0x44000002
50#define NR_spu_run 0x0116
51
a13e2c95
UW
52/* These are used in remote-utils.c. */
53int using_threads = 0;
a13e2c95 54
d05b4ac3
UW
55/* Defined in auto-generated file reg-spu.c. */
56void init_registers_spu (void);
3aee8918 57extern const struct target_desc *tdesc_spu;
a13e2c95 58
fb78e89c
AT
59/* Software breakpoint instruction. */
60static const gdb_byte breakpoint[] = { 0x00, 0x00, 0x3f, 0xff };
61
a13e2c95
UW
62/* Fetch PPU register REGNO. */
63static CORE_ADDR
64fetch_ppc_register (int regno)
65{
66 PTRACE_TYPE_RET res;
67
5472f405 68 int tid = ptid_get_lwp (current_ptid);
a13e2c95
UW
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;
c1aebf87 79 ptrace ((PTRACE_TYPE_ARG1) PPC_PTRACE_PEEKUSR_3264, tid,
a13e2c95
UW
80 (PTRACE_TYPE_ARG3) (regno * 8), buf);
81 if (errno == 0)
c1aebf87 82 ptrace ((PTRACE_TYPE_ARG1) PPC_PTRACE_PEEKUSR_3264, tid,
a13e2c95
UW
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,
1b3f6016 91 (PTRACE_TYPE_ARG3) (regno * sizeof (PTRACE_TYPE_RET)), 0);
a13e2c95
UW
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. */
103static int
104fetch_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;
c1aebf87
UW
112 ptrace ((PTRACE_TYPE_ARG1) PPC_PTRACE_PEEKTEXT_3264, tid,
113 (PTRACE_TYPE_ARG3) &addr_8, word);
a13e2c95
UW
114 }
115 else
116#endif
117 *word = ptrace (PT_READ_I, tid, (PTRACE_TYPE_ARG3) (size_t) memaddr, 0);
118
119 return errno;
120}
121
122/* Store WORD into PPU memory at (aligned) MEMADDR in thread TID. */
123static int
124store_ppc_memory_1 (int tid, CORE_ADDR memaddr, PTRACE_TYPE_RET word)
125{
126 errno = 0;
127
128#ifndef __powerpc64__
129 if (memaddr >> 32)
130 {
131 unsigned long long addr_8 = (unsigned long long) memaddr;
c1aebf87
UW
132 ptrace ((PTRACE_TYPE_ARG1) PPC_PTRACE_POKEDATA_3264, tid,
133 (PTRACE_TYPE_ARG3) &addr_8, word);
a13e2c95
UW
134 }
135 else
136#endif
137 ptrace (PT_WRITE_D, tid, (PTRACE_TYPE_ARG3) (size_t) memaddr, word);
138
139 return errno;
140}
141
142/* Fetch LEN bytes of PPU memory at MEMADDR to MYADDR. */
143static int
144fetch_ppc_memory (CORE_ADDR memaddr, char *myaddr, int len)
145{
146 int i, ret;
147
148 CORE_ADDR addr = memaddr & -(CORE_ADDR) sizeof (PTRACE_TYPE_RET);
149 int count = ((((memaddr + len) - addr) + sizeof (PTRACE_TYPE_RET) - 1)
150 / sizeof (PTRACE_TYPE_RET));
151 PTRACE_TYPE_RET *buffer;
152
5472f405 153 int tid = ptid_get_lwp (current_ptid);
a13e2c95 154
8d749320 155 buffer = XALLOCAVEC (PTRACE_TYPE_RET, count);
a13e2c95
UW
156 for (i = 0; i < count; i++, addr += sizeof (PTRACE_TYPE_RET))
157 if ((ret = fetch_ppc_memory_1 (tid, addr, &buffer[i])) != 0)
158 return ret;
159
160 memcpy (myaddr,
161 (char *) buffer + (memaddr & (sizeof (PTRACE_TYPE_RET) - 1)),
162 len);
163
164 return 0;
165}
166
167/* Store LEN bytes from MYADDR to PPU memory at MEMADDR. */
168static int
169store_ppc_memory (CORE_ADDR memaddr, char *myaddr, int len)
170{
171 int i, ret;
172
173 CORE_ADDR addr = memaddr & -(CORE_ADDR) sizeof (PTRACE_TYPE_RET);
174 int count = ((((memaddr + len) - addr) + sizeof (PTRACE_TYPE_RET) - 1)
175 / sizeof (PTRACE_TYPE_RET));
176 PTRACE_TYPE_RET *buffer;
177
5472f405 178 int tid = ptid_get_lwp (current_ptid);
a13e2c95 179
8d749320 180 buffer = XALLOCAVEC (PTRACE_TYPE_RET, count);
a13e2c95
UW
181
182 if (addr != memaddr || len < (int) sizeof (PTRACE_TYPE_RET))
183 if ((ret = fetch_ppc_memory_1 (tid, addr, &buffer[0])) != 0)
184 return ret;
185
186 if (count > 1)
187 if ((ret = fetch_ppc_memory_1 (tid, addr + (count - 1)
188 * sizeof (PTRACE_TYPE_RET),
189 &buffer[count - 1])) != 0)
190 return ret;
191
192 memcpy ((char *) buffer + (memaddr & (sizeof (PTRACE_TYPE_RET) - 1)),
1b3f6016 193 myaddr, len);
a13e2c95
UW
194
195 for (i = 0; i < count; i++, addr += sizeof (PTRACE_TYPE_RET))
196 if ((ret = store_ppc_memory_1 (tid, addr, buffer[i])) != 0)
197 return ret;
198
199 return 0;
200}
201
202
203/* If the PPU thread is currently stopped on a spu_run system call,
204 return to FD and ADDR the file handle and NPC parameter address
205 used with the system call. Return non-zero if successful. */
1b3f6016 206static int
a13e2c95
UW
207parse_spufs_run (int *fd, CORE_ADDR *addr)
208{
9d236627 209 unsigned int insn;
a13e2c95
UW
210 CORE_ADDR pc = fetch_ppc_register (32); /* nip */
211
212 /* Fetch instruction preceding current NIP. */
9d236627 213 if (fetch_ppc_memory (pc-4, (char *) &insn, 4) != 0)
a13e2c95
UW
214 return 0;
215 /* It should be a "sc" instruction. */
9d236627 216 if (insn != INSTR_SC)
a13e2c95
UW
217 return 0;
218 /* System call number should be NR_spu_run. */
219 if (fetch_ppc_register (0) != NR_spu_run)
220 return 0;
221
222 /* Register 3 contains fd, register 4 the NPC param pointer. */
223 *fd = fetch_ppc_register (34); /* orig_gpr3 */
224 *addr = fetch_ppc_register (4);
225 return 1;
226}
227
228
229/* Copy LEN bytes at OFFSET in spufs file ANNEX into/from READBUF or WRITEBUF,
230 using the /proc file system. */
231static int
232spu_proc_xfer_spu (const char *annex, unsigned char *readbuf,
233 const unsigned char *writebuf,
234 CORE_ADDR offset, int len)
235{
236 char buf[128];
237 int fd = 0;
238 int ret = -1;
239
240 if (!annex)
241 return 0;
242
5472f405 243 sprintf (buf, "/proc/%ld/fd/%s", ptid_get_lwp (current_ptid), annex);
a13e2c95
UW
244 fd = open (buf, writebuf? O_WRONLY : O_RDONLY);
245 if (fd <= 0)
246 return -1;
247
248 if (offset != 0
249 && lseek (fd, (off_t) offset, SEEK_SET) != (off_t) offset)
250 {
251 close (fd);
374c1d38 252 return 0;
a13e2c95
UW
253 }
254
255 if (writebuf)
256 ret = write (fd, writebuf, (size_t) len);
257 else if (readbuf)
258 ret = read (fd, readbuf, (size_t) len);
259
260 close (fd);
261 return ret;
262}
263
264
265/* Start an inferior process and returns its pid.
266 ALLARGS is a vector of program-name and args. */
267static int
268spu_create_inferior (char *program, char **allargs)
269{
270 int pid;
95954743 271 ptid_t ptid;
3aee8918 272 struct process_info *proc;
a13e2c95
UW
273
274 pid = fork ();
275 if (pid < 0)
276 perror_with_name ("fork");
277
278 if (pid == 0)
279 {
602e3198 280 close_most_fds ();
a13e2c95
UW
281 ptrace (PTRACE_TRACEME, 0, 0, 0);
282
283 setpgid (0, 0);
284
2b876972
DJ
285 execv (program, allargs);
286 if (errno == ENOENT)
287 execvp (program, allargs);
a13e2c95
UW
288
289 fprintf (stderr, "Cannot exec %s: %s.\n", program,
290 strerror (errno));
291 fflush (stderr);
292 _exit (0177);
293 }
294
3aee8918
PA
295 proc = add_process (pid, 0);
296 proc->tdesc = tdesc_spu;
95954743
PA
297
298 ptid = ptid_build (pid, pid, 0);
299 add_thread (ptid, NULL);
a13e2c95
UW
300 return pid;
301}
302
303/* Attach to an inferior process. */
304int
305spu_attach (unsigned long pid)
306{
95954743 307 ptid_t ptid;
3aee8918 308 struct process_info *proc;
95954743 309
a13e2c95
UW
310 if (ptrace (PTRACE_ATTACH, pid, 0, 0) != 0)
311 {
312 fprintf (stderr, "Cannot attach to process %ld: %s (%d)\n", pid,
313 strerror (errno), errno);
314 fflush (stderr);
315 _exit (0177);
316 }
317
3aee8918
PA
318 proc = add_process (pid, 1);
319 proc->tdesc = tdesc_spu;
95954743
PA
320 ptid = ptid_build (pid, pid, 0);
321 add_thread (ptid, NULL);
a13e2c95
UW
322 return 0;
323}
324
325/* Kill the inferior process. */
95954743 326static int
5472f405 327spu_kill (int pid)
a13e2c95 328{
4168d2d6 329 int status, ret;
5472f405
UW
330 struct process_info *process = find_process_pid (pid);
331 if (process == NULL)
332 return -1;
333
334 ptrace (PTRACE_KILL, pid, 0, 0);
4168d2d6
UW
335
336 do {
337 ret = waitpid (pid, &status, 0);
338 if (WIFEXITED (status) || WIFSIGNALED (status))
339 break;
340 } while (ret != -1 || errno != ECHILD);
341
342 clear_inferiors ();
5472f405 343 remove_process (process);
95954743 344 return 0;
a13e2c95
UW
345}
346
347/* Detach from inferior process. */
dd6953e1 348static int
95954743 349spu_detach (int pid)
a13e2c95 350{
5472f405
UW
351 struct process_info *process = find_process_pid (pid);
352 if (process == NULL)
353 return -1;
354
355 ptrace (PTRACE_DETACH, pid, 0, 0);
4168d2d6
UW
356
357 clear_inferiors ();
5472f405 358 remove_process (process);
dd6953e1 359 return 0;
a13e2c95
UW
360}
361
505106cd
PA
362static void
363spu_mourn (struct process_info *process)
364{
365 remove_process (process);
366}
367
444d6139 368static void
95954743 369spu_join (int pid)
444d6139
PA
370{
371 int status, ret;
372
373 do {
5472f405 374 ret = waitpid (pid, &status, 0);
444d6139
PA
375 if (WIFEXITED (status) || WIFSIGNALED (status))
376 break;
377 } while (ret != -1 || errno != ECHILD);
378}
379
a13e2c95
UW
380/* Return nonzero if the given thread is still alive. */
381static int
95954743 382spu_thread_alive (ptid_t ptid)
a13e2c95 383{
5472f405 384 return ptid_equal (ptid, current_ptid);
a13e2c95
UW
385}
386
387/* Resume process. */
388static void
2bd7c093 389spu_resume (struct thread_resume *resume_info, size_t n)
a13e2c95 390{
f0db101d 391 struct thread_info *thr = get_first_thread ();
2bd7c093 392 size_t i;
a13e2c95 393
2bd7c093 394 for (i = 0; i < n; i++)
95954743 395 if (ptid_equal (resume_info[i].thread, minus_one_ptid)
f0db101d 396 || ptid_equal (resume_info[i].thread, ptid_of (thr)))
2bd7c093
PA
397 break;
398
399 if (i == n)
a13e2c95
UW
400 return;
401
402 /* We don't support hardware single-stepping right now, assume
403 GDB knows to use software single-stepping. */
bd99dc85 404 if (resume_info[i].kind == resume_step)
a13e2c95
UW
405 fprintf (stderr, "Hardware single-step not supported.\n");
406
407 regcache_invalidate ();
408
409 errno = 0;
f0db101d 410 ptrace (PTRACE_CONT, ptid_get_lwp (ptid_of (thr)), 0, resume_info[i].sig);
a13e2c95
UW
411 if (errno)
412 perror_with_name ("ptrace");
413}
414
415/* Wait for process, returns status. */
95954743
PA
416static ptid_t
417spu_wait (ptid_t ptid, struct target_waitstatus *ourstatus, int options)
a13e2c95 418{
5472f405 419 int pid = ptid_get_pid (ptid);
a13e2c95
UW
420 int w;
421 int ret;
422
a13e2c95
UW
423 while (1)
424 {
5472f405 425 ret = waitpid (pid, &w, WNOHANG | __WALL | __WNOTHREAD);
a13e2c95
UW
426
427 if (ret == -1)
428 {
429 if (errno != ECHILD)
430 perror_with_name ("waitpid");
431 }
432 else if (ret > 0)
433 break;
434
435 usleep (1000);
436 }
437
438 /* On the first wait, continue running the inferior until we are
439 blocked inside an spu_run system call. */
440 if (!server_waiting)
441 {
442 int fd;
443 CORE_ADDR addr;
444
445 while (!parse_spufs_run (&fd, &addr))
446 {
5472f405
UW
447 ptrace (PT_SYSCALL, pid, (PTRACE_TYPE_ARG3) 0, 0);
448 waitpid (pid, NULL, __WALL | __WNOTHREAD);
a13e2c95
UW
449 }
450 }
451
a13e2c95
UW
452 if (WIFEXITED (w))
453 {
454 fprintf (stderr, "\nChild exited with retcode = %x \n", WEXITSTATUS (w));
5b1c542e
PA
455 ourstatus->kind = TARGET_WAITKIND_EXITED;
456 ourstatus->value.integer = WEXITSTATUS (w);
a13e2c95 457 clear_inferiors ();
95954743 458 return pid_to_ptid (ret);
a13e2c95
UW
459 }
460 else if (!WIFSTOPPED (w))
461 {
462 fprintf (stderr, "\nChild terminated with signal = %x \n", WTERMSIG (w));
5b1c542e 463 ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
2ea28649 464 ourstatus->value.sig = gdb_signal_from_host (WTERMSIG (w));
a13e2c95 465 clear_inferiors ();
95954743 466 return pid_to_ptid (ret);
a13e2c95
UW
467 }
468
469 /* After attach, we may have received a SIGSTOP. Do not return this
470 as signal to GDB, or else it will try to continue with SIGSTOP ... */
471 if (!server_waiting)
472 {
5b1c542e 473 ourstatus->kind = TARGET_WAITKIND_STOPPED;
a493e3e2 474 ourstatus->value.sig = GDB_SIGNAL_0;
95954743 475 return ptid_build (ret, ret, 0);
a13e2c95
UW
476 }
477
5b1c542e 478 ourstatus->kind = TARGET_WAITKIND_STOPPED;
2ea28649 479 ourstatus->value.sig = gdb_signal_from_host (WSTOPSIG (w));
95954743 480 return ptid_build (ret, ret, 0);
a13e2c95
UW
481}
482
483/* Fetch inferior registers. */
484static void
85492558 485spu_fetch_registers (struct regcache *regcache, int regno)
a13e2c95
UW
486{
487 int fd;
488 CORE_ADDR addr;
489
a13e2c95
UW
490 /* We must be stopped on a spu_run system call. */
491 if (!parse_spufs_run (&fd, &addr))
492 return;
493
494 /* The ID register holds the spufs file handle. */
495 if (regno == -1 || regno == SPU_ID_REGNUM)
85492558 496 supply_register (regcache, SPU_ID_REGNUM, (char *)&fd);
a13e2c95
UW
497
498 /* The NPC register is found at ADDR. */
499 if (regno == -1 || regno == SPU_PC_REGNUM)
500 {
501 char buf[4];
502 if (fetch_ppc_memory (addr, buf, 4) == 0)
85492558 503 supply_register (regcache, SPU_PC_REGNUM, buf);
a13e2c95
UW
504 }
505
506 /* The GPRs are found in the "regs" spufs file. */
507 if (regno == -1 || (regno >= 0 && regno < SPU_NUM_CORE_REGS))
508 {
509 unsigned char buf[16*SPU_NUM_CORE_REGS];
510 char annex[32];
511 int i;
512
513 sprintf (annex, "%d/regs", fd);
514 if (spu_proc_xfer_spu (annex, buf, NULL, 0, sizeof buf) == sizeof buf)
515 for (i = 0; i < SPU_NUM_CORE_REGS; i++)
85492558 516 supply_register (regcache, i, buf + i*16);
a13e2c95
UW
517 }
518}
519
520/* Store inferior registers. */
521static void
85492558 522spu_store_registers (struct regcache *regcache, int regno)
a13e2c95
UW
523{
524 int fd;
525 CORE_ADDR addr;
526
527 /* ??? Some callers use 0 to mean all registers. */
528 if (regno == 0)
529 regno = -1;
530
531 /* We must be stopped on a spu_run system call. */
532 if (!parse_spufs_run (&fd, &addr))
533 return;
534
535 /* The NPC register is found at ADDR. */
536 if (regno == -1 || regno == SPU_PC_REGNUM)
537 {
538 char buf[4];
85492558 539 collect_register (regcache, SPU_PC_REGNUM, buf);
a13e2c95
UW
540 store_ppc_memory (addr, buf, 4);
541 }
542
543 /* The GPRs are found in the "regs" spufs file. */
544 if (regno == -1 || (regno >= 0 && regno < SPU_NUM_CORE_REGS))
545 {
546 unsigned char buf[16*SPU_NUM_CORE_REGS];
547 char annex[32];
548 int i;
549
550 for (i = 0; i < SPU_NUM_CORE_REGS; i++)
85492558 551 collect_register (regcache, i, buf + i*16);
a13e2c95
UW
552
553 sprintf (annex, "%d/regs", fd);
554 spu_proc_xfer_spu (annex, NULL, buf, 0, sizeof buf);
555 }
556}
557
558/* Copy LEN bytes from inferior's memory starting at MEMADDR
559 to debugger memory starting at MYADDR. */
560static int
561spu_read_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len)
562{
563 int fd, ret;
564 CORE_ADDR addr;
d2ed6730
UW
565 char annex[32], lslr_annex[32], buf[32];
566 CORE_ADDR lslr;
a13e2c95
UW
567
568 /* We must be stopped on a spu_run system call. */
569 if (!parse_spufs_run (&fd, &addr))
570 return 0;
571
572 /* Use the "mem" spufs file to access SPU local store. */
573 sprintf (annex, "%d/mem", fd);
574 ret = spu_proc_xfer_spu (annex, myaddr, NULL, memaddr, len);
d2ed6730
UW
575 if (ret > 0)
576 return ret == len ? 0 : EIO;
577
578 /* SPU local store access wraps the address around at the
579 local store limit. We emulate this here. To avoid needing
580 an extra access to retrieve the LSLR, we only do that after
581 trying the original address first, and getting end-of-file. */
582 sprintf (lslr_annex, "%d/lslr", fd);
583 memset (buf, 0, sizeof buf);
584 if (spu_proc_xfer_spu (lslr_annex, (unsigned char *)buf, NULL,
585 0, sizeof buf) <= 0)
586 return ret;
587
588 lslr = strtoul (buf, NULL, 16);
589 ret = spu_proc_xfer_spu (annex, myaddr, NULL, memaddr & lslr, len);
590
a13e2c95
UW
591 return ret == len ? 0 : EIO;
592}
593
594/* Copy LEN bytes of data from debugger memory at MYADDR
595 to inferior's memory at MEMADDR.
596 On failure (cannot write the inferior)
597 returns the value of errno. */
598static int
599spu_write_memory (CORE_ADDR memaddr, const unsigned char *myaddr, int len)
600{
601 int fd, ret;
602 CORE_ADDR addr;
d2ed6730
UW
603 char annex[32], lslr_annex[32], buf[32];
604 CORE_ADDR lslr;
a13e2c95
UW
605
606 /* We must be stopped on a spu_run system call. */
607 if (!parse_spufs_run (&fd, &addr))
608 return 0;
609
610 /* Use the "mem" spufs file to access SPU local store. */
611 sprintf (annex, "%d/mem", fd);
612 ret = spu_proc_xfer_spu (annex, NULL, myaddr, memaddr, len);
d2ed6730
UW
613 if (ret > 0)
614 return ret == len ? 0 : EIO;
615
616 /* SPU local store access wraps the address around at the
617 local store limit. We emulate this here. To avoid needing
618 an extra access to retrieve the LSLR, we only do that after
619 trying the original address first, and getting end-of-file. */
620 sprintf (lslr_annex, "%d/lslr", fd);
621 memset (buf, 0, sizeof buf);
622 if (spu_proc_xfer_spu (lslr_annex, (unsigned char *)buf, NULL,
623 0, sizeof buf) <= 0)
624 return ret;
625
626 lslr = strtoul (buf, NULL, 16);
627 ret = spu_proc_xfer_spu (annex, NULL, myaddr, memaddr & lslr, len);
628
a13e2c95
UW
629 return ret == len ? 0 : EIO;
630}
631
632/* Look up special symbols -- unneded here. */
633static void
634spu_look_up_symbols (void)
635{
636}
637
638/* Send signal to inferior. */
639static void
ef57601b 640spu_request_interrupt (void)
a13e2c95 641{
f0db101d
PA
642 struct thread_info *thr = get_first_thread ();
643
a8c6d4fc 644 syscall (SYS_tkill, lwpid_of (thr), SIGINT);
a13e2c95
UW
645}
646
fb78e89c
AT
647/* Implementation of the target_ops method "sw_breakpoint_from_kind". */
648
649static const gdb_byte *
650spu_sw_breakpoint_from_kind (int kind, int *size)
651{
652 *size = sizeof breakpoint;
653 return breakpoint;
654}
655
a13e2c95
UW
656static struct target_ops spu_target_ops = {
657 spu_create_inferior,
ece66d65 658 NULL, /* post_create_inferior */
a13e2c95
UW
659 spu_attach,
660 spu_kill,
661 spu_detach,
505106cd 662 spu_mourn,
444d6139 663 spu_join,
a13e2c95
UW
664 spu_thread_alive,
665 spu_resume,
666 spu_wait,
667 spu_fetch_registers,
668 spu_store_registers,
90d74c30 669 NULL, /* prepare_to_access_memory */
0146f85b 670 NULL, /* done_accessing_memory */
a13e2c95
UW
671 spu_read_memory,
672 spu_write_memory,
673 spu_look_up_symbols,
ef57601b 674 spu_request_interrupt,
a13e2c95 675 NULL,
802e8e6d 676 NULL, /* supports_z_point_type */
ab39bf24
UW
677 NULL,
678 NULL,
f5771b1d
PA
679 NULL, /* stopped_by_sw_breakpoint */
680 NULL, /* supports_stopped_by_sw_breakpoint */
681 NULL, /* stopped_by_hw_breakpoint */
682 NULL, /* supports_stopped_by_hw_breakpoint */
70b90b91 683 NULL, /* supports_hardware_single_step */
ab39bf24
UW
684 NULL,
685 NULL,
686 NULL,
687 NULL,
0e7f50da 688 spu_proc_xfer_spu,
59a016f0 689 hostio_last_error_from_errno,
fb78e89c
AT
690 NULL, /* qxfer_osdata */
691 NULL, /* qxfer_siginfo */
692 NULL, /* supports_non_stop */
693 NULL, /* async */
694 NULL, /* start_non_stop */
695 NULL, /* supports_multi_process */
696 NULL, /* supports_fork_events */
697 NULL, /* supports_vfork_events */
698 NULL, /* supports_exec_events */
699 NULL, /* handle_new_gdb_connection */
700 NULL, /* handle_monitor_command */
701 NULL, /* core_of_thread */
702 NULL, /* read_loadmap */
703 NULL, /* process_qsupported */
704 NULL, /* supports_tracepoints */
705 NULL, /* read_pc */
706 NULL, /* write_pc */
707 NULL, /* thread_stopped */
708 NULL, /* get_tib_address */
709 NULL, /* pause_all */
710 NULL, /* unpause_all */
711 NULL, /* stabilize_threads */
712 NULL, /* install_fast_tracepoint_jump_pad */
713 NULL, /* emit_ops */
714 NULL, /* supports_disable_randomization */
715 NULL, /* get_min_fast_tracepoint_insn_len */
716 NULL, /* qxfer_libraries_svr4 */
717 NULL, /* support_agent */
718 NULL, /* support_btrace */
719 NULL, /* enable_btrace */
720 NULL, /* disable_btrace */
721 NULL, /* read_btrace */
722 NULL, /* read_btrace_conf */
723 NULL, /* supports_range_stepping */
724 NULL, /* pid_to_exec_file */
725 NULL, /* multifs_open */
726 NULL, /* multifs_unlink */
727 NULL, /* multifs_readlink */
728 NULL, /* breakpoint_kind_from_pc */
729 spu_sw_breakpoint_from_kind,
a13e2c95
UW
730};
731
732void
733initialize_low (void)
734{
a13e2c95 735 set_target_ops (&spu_target_ops);
d05b4ac3 736 init_registers_spu ();
a13e2c95 737}
This page took 0.93853 seconds and 4 git commands to generate.