From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21654 invoked by alias); 25 Jul 2013 21:20:14 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 21644 invoked by uid 89); 25 Jul 2013 21:20:14 -0000 X-Spam-SWARE-Status: No, score=-2.8 required=5.0 tests=AWL,BAYES_50,KHOP_RCVD_UNTRUST,KHOP_THREADED,RCVD_IN_HOSTKARMA_W,RCVD_IN_HOSTKARMA_WL,RDNS_NONE autolearn=no version=3.3.1 Received: from Unknown (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Thu, 25 Jul 2013 21:20:13 +0000 Received: from svr-orw-exc-10.mgc.mentorg.com ([147.34.98.58]) by relay1.mentorg.com with esmtp id 1V2SxC-0004s9-5h from Maciej_Rozycki@mentor.com for gdb-patches@sourceware.org; Thu, 25 Jul 2013 14:20:06 -0700 Received: from SVR-IES-FEM-01.mgc.mentorg.com ([137.202.0.104]) by SVR-ORW-EXC-10.mgc.mentorg.com with Microsoft SMTPSVC(6.0.3790.4675); Thu, 25 Jul 2013 14:20:06 -0700 Received: from [172.30.64.136] (137.202.0.76) by SVR-IES-FEM-01.mgc.mentorg.com (137.202.0.104) with Microsoft SMTP Server id 14.2.247.3; Thu, 25 Jul 2013 22:20:03 +0100 Date: Thu, 25 Jul 2013 21:20:00 -0000 From: "Maciej W. Rozycki" To: Yao Qi CC: Subject: Re: [PATCH 5/5] MIPS GDBserver watchpoint In-Reply-To: <51F06E54.9000504@codesourcery.com> Message-ID: References: <1369881867-11372-1-git-send-email-yao@codesourcery.com> <1372475427-24862-1-git-send-email-yao@codesourcery.com> <1372475427-24862-6-git-send-email-yao@codesourcery.com> <51F06E54.9000504@codesourcery.com> User-Agent: Alpine 1.10 (DEB 962 2008-03-14) MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" X-SW-Source: 2013-07/txt/msg00631.txt.bz2 On Thu, 25 Jul 2013, Yao Qi wrote: > gdb/gdbserver: > > 2013-07-25 Jie Zhang > Daniel Jacobowitz > Yao Qi > > * Makefile.in (SFILES): Add common/mips-linux-watch.c. > (mips-linux-watch.o): New rule. You've lost an entry for mips_linux_watch_h: (mips_linux_watch_h): New variable. should do. > * configure.srv : Add mips-linux-watch.o to > srv_tgtobj. > * linux-mips-low.c: Include mips-linux-watch.h. > (struct arch_process_info, struct arch_lwp_info): New. > (update_watch_registers_callback): New. > (mips_linux_new_process, mips_linux_new_thread) New. > (mips_linux_prepare_to_resume, mips_insert_point): New. > (mips_remove_point, mips_stopped_by_watchpoint): New. > (rsp_bp_type_to_target_hw_bp_type): New. > (mips_stopped_data_address): New. > (the_low_target): Add watchpoint support functions. Please name entity types, e.g.: "New function.", "New variables.", etc. as applicable. > diff --git a/gdb/gdbserver/linux-mips-low.c b/gdb/gdbserver/linux-mips-low.c > index 1010528..dd6ebaf 100644 > --- a/gdb/gdbserver/linux-mips-low.c > +++ b/gdb/gdbserver/linux-mips-low.c > @@ -257,6 +291,328 @@ 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. */ > + > +static int > +update_watch_registers_callback (struct inferior_list_entry *entry, > + void *pid_p) > +{ > + struct lwp_info *lwp = (struct lwp_info *) entry; > + int pid = *(int *) pid_p; > + > + /* Only update the threads of this process. */ > + if (pid_of (lwp) == 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); > + } > + > + return 0; > +} > + > +/* This is the implementation of linux_target_ops method > + new_process. */ > + > +static struct arch_process_info * > +mips_linux_new_process (void) > +{ > + struct arch_process_info *info = xcalloc (1, sizeof (*info)); > + > + return 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. */ > + > +static struct arch_lwp_info * > +mips_linux_new_thread (void) > +{ > + struct arch_lwp_info *info = xcalloc (1, sizeof (*info)); > + > + info->watch_registers_changed = 1; > + > + return info; > +} > + > +/* This is the implementation of linux_target_ops method > + prepare_to_resume. If the watch regs have changed, update the > + thread's copies. */ > + > +static void > +mips_linux_prepare_to_resume (struct lwp_info *lwp) > +{ > + ptid_t ptid = ptid_of (lwp); > + struct process_info *proc = find_process_pid (ptid_get_pid (ptid)); > + struct arch_process_info *private = proc->private->arch_private; > + > + if (lwp->arch_private->watch_registers_changed) > + { > + /* Only update the watch registers if we have set or unset a > + watchpoint already. */ > + if (mips_linux_watch_get_num_valid (&private->watch_mirror) > 0) > + { > + /* Write the mirrored watch register values. */ > + int tid = ptid_get_lwp (ptid); > + > + if (-1 == ptrace (PTRACE_SET_WATCH_REGS, tid, > + &private->watch_mirror)) > + perror_with_name ("Couldn't write watch register"); > + } > + > + lwp->arch_private->watch_registers_changed = 0; > + } > +} > + > +/* Translate breakpoint type TYPE in rsp to 'enum target_hw_bp_type'. */ > + > +static enum target_hw_bp_type > +rsp_bp_type_to_target_hw_bp_type (char type) > +{ > + switch (type) > + { > + case '2': > + return hw_write; > + case '3': > + return hw_read; > + case '4': > + return hw_access; > + } > + > + gdb_assert_not_reached ("unhandled RSP breakpoint type"); > + return -1; > +} gdb_assert_not_reached is `__attribute__ ((noreturn))', so there's no need for the `return -1' statement. Please remove it. OK with this change and the ChangeLog updates, thanks for your work. Maciej