X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fgdbserver%2Flinux-mips-low.c;h=d423633747acb7923a274f2dcf2819335d493c37;hb=e2882c85786571175a0b0bfc3bcd2f14620b1ea3;hp=d3b01d61f957025c78a185c4f5a7568eff71a9e2;hpb=5826e159863b6cd69953dc01faf7c20414409909;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbserver/linux-mips-low.c b/gdb/gdbserver/linux-mips-low.c index d3b01d61f9..d423633747 100644 --- a/gdb/gdbserver/linux-mips-low.c +++ b/gdb/gdbserver/linux-mips-low.c @@ -1,5 +1,5 @@ /* GNU/Linux/MIPS specific low level interface, for the remote server for GDB. - Copyright (C) 1995-2015 Free Software Foundation, Inc. + Copyright (C) 1995-2018 Free Software Foundation, Inc. This file is part of GDB. @@ -266,16 +266,13 @@ mips_set_pc (struct regcache *regcache, CORE_ADDR pc) static const unsigned int mips_breakpoint = 0x0005000d; #define mips_breakpoint_len 4 -/* We only place breakpoints in empty marker functions, and thread locking - is outside of the function. So rather than importing software single-step, - we can just run until exit. */ -static CORE_ADDR -mips_reinsert_addr (void) +/* Implementation of linux_target_ops method "sw_breakpoint_from_kind". */ + +static const gdb_byte * +mips_sw_breakpoint_from_kind (int kind, int *size) { - struct regcache *regcache = get_thread_regcache (current_thread, 1); - union mips_register ra; - collect_register_by_name (regcache, "r31", ra.buf); - return register_size (regcache->tdesc, 0) == 4 ? ra.reg32 : ra.reg64; + *size = mips_breakpoint_len; + return (const gdb_byte *) &mips_breakpoint; } static int @@ -292,31 +289,21 @@ mips_breakpoint_at (CORE_ADDR where) return 0; } -/* Mark the watch registers of lwp, represented by ENTRY, as changed, - if the lwp's process id is *PID_P. */ +/* Mark the watch registers of lwp, represented by ENTRY, as changed. */ -static int -update_watch_registers_callback (struct inferior_list_entry *entry, - void *pid_p) +static void +update_watch_registers_callback (thread_info *thread) { - struct thread_info *thread = (struct thread_info *) entry; struct lwp_info *lwp = get_thread_lwp (thread); - int pid = *(int *) pid_p; - /* Only update the threads of this process. */ - if (pid_of (thread) == pid) - { - /* The actual update is done later just before resuming the lwp, - we just mark that the registers need updating. */ - lwp->arch_private->watch_registers_changed = 1; - - /* If the lwp isn't stopped, force it to momentarily pause, so - we can update its watch registers. */ - if (!lwp->stopped) - linux_stop_lwp (lwp); - } + /* The actual update is done later just before resuming the lwp, + we just mark that the registers need updating. */ + lwp->arch_private->watch_registers_changed = 1; - return 0; + /* If the lwp isn't stopped, force it to momentarily pause, so + we can update its watch registers. */ + if (!lwp->stopped) + linux_stop_lwp (lwp); } /* This is the implementation of linux_target_ops method @@ -325,11 +312,20 @@ update_watch_registers_callback (struct inferior_list_entry *entry, static struct arch_process_info * mips_linux_new_process (void) { - struct arch_process_info *info = xcalloc (1, sizeof (*info)); + struct arch_process_info *info = XCNEW (struct arch_process_info); return info; } +/* This is the implementation of linux_target_ops method + delete_process. */ + +static void +mips_linux_delete_process (struct arch_process_info *info) +{ + xfree (info); +} + /* This is the implementation of linux_target_ops method new_thread. Mark the watch registers as changed, so the threads' copies will be updated. */ @@ -337,29 +333,37 @@ mips_linux_new_process (void) static void mips_linux_new_thread (struct lwp_info *lwp) { - struct arch_lwp_info *info = xcalloc (1, sizeof (*info)); + struct arch_lwp_info *info = XCNEW (struct arch_lwp_info); info->watch_registers_changed = 1; lwp->arch_private = info; } +/* Function to call when a thread is being deleted. */ + +static void +mips_linux_delete_thread (struct arch_lwp_info *arch_lwp) +{ + xfree (arch_lwp); +} + /* Create a new mips_watchpoint and add it to the list. */ static void -mips_add_watchpoint (struct arch_process_info *private, CORE_ADDR addr, - int len, int watch_type) +mips_add_watchpoint (struct arch_process_info *priv, CORE_ADDR addr, int len, + enum target_hw_bp_type watch_type) { struct mips_watchpoint *new_watch; struct mips_watchpoint **pw; - new_watch = xmalloc (sizeof (struct mips_watchpoint)); + new_watch = XNEW (struct mips_watchpoint); new_watch->addr = addr; new_watch->len = len; new_watch->type = watch_type; new_watch->next = NULL; - pw = &private->current_watches; + pw = &priv->current_watches; while (*pw != NULL) pw = &(*pw)->next; *pw = new_watch; @@ -427,7 +431,7 @@ mips_linux_prepare_to_resume (struct lwp_info *lwp) int tid = ptid_get_lwp (ptid); if (-1 == ptrace (PTRACE_SET_WATCH_REGS, tid, - &priv->watch_mirror)) + &priv->watch_mirror, NULL)) perror_with_name ("Couldn't write watch register"); } @@ -459,7 +463,6 @@ mips_insert_point (enum raw_bkpt_type type, CORE_ADDR addr, struct process_info *proc = current_process (); struct arch_process_info *priv = proc->priv->arch_private; struct pt_watch_regs regs; - int pid; long lwpid; enum target_hw_bp_type watch_type; uint32_t irw; @@ -490,8 +493,7 @@ mips_insert_point (enum raw_bkpt_type type, CORE_ADDR addr, priv->watch_mirror = regs; /* Only update the threads of this process. */ - pid = pid_of (proc); - find_inferior (&all_threads, update_watch_registers_callback, &pid); + for_each_thread (proc->pid, update_watch_registers_callback); return 0; } @@ -507,7 +509,6 @@ mips_remove_point (enum raw_bkpt_type type, CORE_ADDR addr, struct arch_process_info *priv = proc->priv->arch_private; int deleted_one; - int pid; enum target_hw_bp_type watch_type; struct mips_watchpoint **pw; @@ -541,8 +542,8 @@ mips_remove_point (enum raw_bkpt_type type, CORE_ADDR addr, &priv->watch_mirror); /* Only update the threads of this process. */ - pid = pid_of (proc); - find_inferior (&all_threads, update_watch_registers_callback, &pid); + for_each_thread (proc->pid, update_watch_registers_callback); + return 0; } @@ -640,7 +641,7 @@ mips_stopped_data_address (void) /* Fetch the thread-local storage pointer for libthread_db. */ ps_err_e -ps_get_thread_area (const struct ps_prochandle *ph, +ps_get_thread_area (struct ps_prochandle *ph, lwpid_t lwpid, int idx, void **base) { if (ptrace (PTRACE_GET_THREAD_AREA, lwpid, NULL, base) != 0) @@ -715,7 +716,7 @@ mips_supply_register_32bit (struct regcache *regcache, static void mips_fill_gregset (struct regcache *regcache, void *buf) { - union mips_register *regset = buf; + union mips_register *regset = (union mips_register *) buf; int i, use_64bit; const struct target_desc *tdesc = regcache->tdesc; @@ -744,7 +745,7 @@ mips_fill_gregset (struct regcache *regcache, void *buf) static void mips_store_gregset (struct regcache *regcache, const void *buf) { - const union mips_register *regset = buf; + const union mips_register *regset = (const union mips_register *) buf; int i, use_64bit; use_64bit = (register_size (regcache->tdesc, 0) == 8); @@ -772,7 +773,7 @@ mips_store_gregset (struct regcache *regcache, const void *buf) static void mips_fill_fpregset (struct regcache *regcache, void *buf) { - union mips_register *regset = buf; + union mips_register *regset = (union mips_register *) buf; int i, use_64bit, first_fp, big_endian; use_64bit = (register_size (regcache->tdesc, 0) == 8); @@ -797,7 +798,7 @@ mips_fill_fpregset (struct regcache *regcache, void *buf) static void mips_store_fpregset (struct regcache *regcache, const void *buf) { - const union mips_register *regset = buf; + const union mips_register *regset = (const union mips_register *) buf; int i, use_64bit, first_fp, big_endian; use_64bit = (register_size (regcache->tdesc, 0) == 8); @@ -828,7 +829,7 @@ static struct regset_info mips_regsets[] = { { PTRACE_GETFPREGS, PTRACE_SETFPREGS, 0, 33 * 8, FP_REGS, mips_fill_fpregset, mips_store_fpregset }, #endif /* HAVE_PTRACE_GETREGS */ - { 0, 0, 0, -1, -1, NULL, NULL } + NULL_REGSET }; static struct regsets_info mips_regsets_info = @@ -881,9 +882,9 @@ struct linux_target_ops the_low_target = { NULL, /* fetch_register */ mips_get_pc, mips_set_pc, - (const unsigned char *) &mips_breakpoint, - mips_breakpoint_len, - mips_reinsert_addr, + NULL, /* breakpoint_kind_from_pc */ + mips_sw_breakpoint_from_kind, + NULL, /* get_next_pcs */ 0, mips_breakpoint_at, mips_supports_z_point_type, @@ -895,7 +896,9 @@ struct linux_target_ops the_low_target = { NULL, NULL, /* siginfo_fixup */ mips_linux_new_process, + mips_linux_delete_process, mips_linux_new_thread, + mips_linux_delete_thread, mips_linux_new_fork, mips_linux_prepare_to_resume };