24 #include <sys/ptrace.h> 27 #include <sys/syscall.h> 34 #define __WNOTHREAD 0x20000000 38 #define PTRACE_TYPE_RET long 39 #define PTRACE_TYPE_ARG3 long 42 #define SPU_NUM_REGS 130 43 #define SPU_NUM_CORE_REGS 128 46 #define SPU_ID_REGNUM 128 47 #define SPU_PC_REGNUM 129 50 #define INSTR_SC 0x44000002 51 #define NR_spu_run 0x0116 86 return (
CORE_ADDR) *(
unsigned long long *)buf;
96 sprintf (mess,
"reading PPC register #%d", regno);
109 #ifndef __powerpc64__ 112 unsigned long long addr_8 = (
unsigned long long) memaddr;
129 #ifndef __powerpc64__ 132 unsigned long long addr_8 = (
unsigned long long) memaddr;
190 &
buffer[count - 1])) != 0)
234 const unsigned char *writebuf,
245 fd = open (buf, writebuf? O_WRONLY : O_RDONLY);
250 && lseek (fd, (off_t)
offset, SEEK_SET) != (off_t)
offset)
257 ret = write (fd, writebuf, (
size_t) len);
259 ret = read (fd, readbuf, (
size_t) len);
271 if (
ptrace (PTRACE_TRACEME, 0, 0, 0) < 0)
273 if (setpgid (0, 0) < 0)
291 str_program_args.c_str (),
293 NULL, NULL, NULL, NULL);
312 if (
ptrace (PTRACE_ATTACH,
pid, 0, 0) != 0)
314 fprintf (stderr,
"Cannot attach to process %ld: %s (%d)\n",
pid,
339 ret = waitpid (
pid, &status, 0);
342 }
while (ret != -1 ||
errno != ECHILD);
376 ret = waitpid (
pid, &status, 0);
379 }
while (ret != -1 ||
errno != ECHILD);
396 for (i = 0; i < n; i++)
406 if (resume_info[i].kind == resume_step)
407 fprintf (stderr,
"Hardware single-step not supported.\n");
456 fprintf (stderr,
"\nChild exited with retcode = %x \n",
WEXITSTATUS (w));
457 ourstatus->kind = TARGET_WAITKIND_EXITED;
464 fprintf (stderr,
"\nChild terminated with signal = %x \n",
WTERMSIG (w));
465 ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
475 ourstatus->kind = TARGET_WAITKIND_STOPPED;
476 ourstatus->value.sig = GDB_SIGNAL_0;
480 ourstatus->kind = TARGET_WAITKIND_STOPPED;
515 sprintf (annex,
"%d/regs", fd);
555 sprintf (annex,
"%d/regs", fd);
567 char annex[32], lslr_annex[32], buf[32];
575 sprintf (annex,
"%d/mem", fd);
578 return ret == len ? 0 : EIO;
584 sprintf (lslr_annex,
"%d/lslr", fd);
585 memset (buf, 0,
sizeof buf);
590 lslr = strtoul (buf, NULL, 16);
593 return ret == len ? 0 : EIO;
605 char annex[32], lslr_annex[32], buf[32];
613 sprintf (annex,
"%d/mem", fd);
616 return ret == len ? 0 : EIO;
622 sprintf (lslr_annex,
"%d/lslr", fd);
623 memset (buf, 0,
sizeof buf);
628 lslr = strtoul (buf, NULL, 16);
631 return ret == len ? 0 : EIO;
646 syscall (SYS_tkill,
lwpid_of (thr), SIGINT);
static void spu_request_interrupt(void)
void collect_register(struct regcache *regcache, int n, void *buf)
static const gdb_byte * spu_sw_breakpoint_from_kind(int kind, int *size)
static void spu_store_registers(struct regcache *regcache, int regno)
struct process_info * add_process(int pid, int attached)
static void spu_resume(struct thread_resume *resume_info, size_t n)
static void spu_look_up_symbols(void)
static int store_ppc_memory(CORE_ADDR memaddr, char *myaddr, int len)
int ptid_get_pid(const ptid_t &ptid)
std::string stringify_argv(const std::vector< char *> &args)
static long lwpid_of(const thread_info *thread)
static int spu_kill(int pid)
static ptid_t ptid_of(const thread_info *thread)
void * memset(T *s, int c, size_t n)=delete
static int fetch_ppc_memory(CORE_ADDR memaddr, char *myaddr, int len)
static int spu_proc_xfer_spu(const char *annex, unsigned char *readbuf, const unsigned char *writebuf, CORE_ADDR offset, int len)
const struct target_desc * tdesc
ptid_t ptid_build(int pid, long lwp, long tid)
static int spu_create_inferior(const char *program, const std::vector< char *> &program_args)
static int store_ppc_memory_1(int tid, CORE_ADDR memaddr, PTRACE_TYPE_RET word)
const struct target_desc * tdesc_spu
void regcache_invalidate(void)
gdb_environ * get_environ()
process_info * find_process_pid(int pid)
ptid_t pid_to_ptid(int pid)
enum gdb_signal gdb_signal_from_host(int)
static int spu_thread_alive(ptid_t ptid)
static CORE_ADDR fetch_ppc_register(int regno)
void remove_process(struct process_info *process)
void set_target_ops(struct target_ops *target)
static int spu_detach(int pid)
long ptid_get_lwp(const ptid_t &ptid)
void post_fork_inferior(int pid, const char *program)
static struct target_ops spu_target_ops
struct thread_info * get_first_thread(void)
static const gdb_byte breakpoint[]
void trace_start_error_with_name(const char *string)
static int spu_write_memory(CORE_ADDR memaddr, const unsigned char *myaddr, int len)
pid_t fork_inferior(const char *exec_file_arg, const std::string &allargs, char **env, void(*traceme_fun)(), void(*init_trace_fun)(int), void(*pre_trace_fun)(), const char *shell_file_arg, void(*exec_fun)(const char *file, char *const *argv, char *const *env))
static ptid_t spu_wait(ptid_t ptid, struct target_waitstatus *ourstatus, int options)
void hostio_last_error_from_errno(char *buf)
static int fetch_ppc_memory_1(int tid, CORE_ADDR memaddr, PTRACE_TYPE_RET *word)
void perror_with_name(const char *string)
static void spu_fetch_registers(struct regcache *regcache, int regno)
static void spu_ptrace_fun()
int ptid_equal(const ptid_t &ptid1, const ptid_t &ptid2)
int spu_attach(unsigned long pid)
void init_registers_spu(void)
static void spu_join(int pid)
void initialize_low(void)
static void spu_mourn(struct process_info *process)
static int parse_spufs_run(int *fd, CORE_ADDR *addr)
#define SPU_NUM_CORE_REGS
static std::vector< char * > program_args
void supply_register(struct regcache *regcache, int n, const void *buf)
struct thread_info * add_thread(ptid_t ptid, void *target_data)
static int spu_read_memory(CORE_ADDR memaddr, unsigned char *myaddr, int len)
void clear_inferiors(void)