From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9820 invoked by alias); 9 Apr 2002 01:52:31 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 9810 invoked from network); 9 Apr 2002 01:52:27 -0000 Received: from unknown (HELO cygnus.com) (205.180.230.5) by sources.redhat.com with SMTP; 9 Apr 2002 01:52:27 -0000 Received: from romulus.sfbay.redhat.com (remus.sfbay.redhat.com [172.16.27.252]) by runyon.cygnus.com (8.8.7-cygnus/8.8.7) with ESMTP id SAA12102 for ; Mon, 8 Apr 2002 18:52:26 -0700 (PDT) Received: (from kev@localhost) by romulus.sfbay.redhat.com (8.11.6/8.11.6) id g391q7c22772 for gdb-patches@sources.redhat.com; Mon, 8 Apr 2002 18:52:07 -0700 Date: Mon, 08 Apr 2002 18:52:00 -0000 From: Kevin Buettner Message-Id: <1020409015207.ZM22771@localhost.localdomain> To: gdb-patches@sources.redhat.com Subject: [PATCH] rs6000_software_single_step() cleanup / bug fix MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2002-04/txt/msg00340.txt.bz2 I've just committed the patch below. Thanks again to Jimi for yet another cleanup. (Note too that it fixes 64-bit software singlestep support.) From Jimi X : * rs6000-tdep.c (rs6000_software_single_step): Use rs6000_breakpoint_from_pc() to fetch breakpoint instruction and size. Use target_insert_breakpoint() and target_remove_breakpoint() to insert and remove breakpoints instead of explicit memory reads and writes. Index: rs6000-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/rs6000-tdep.c,v retrieving revision 1.47 diff -u -p -r1.47 rs6000-tdep.c --- rs6000-tdep.c 9 Apr 2002 00:53:28 -0000 1.47 +++ rs6000-tdep.c 9 Apr 2002 01:40:07 -0000 @@ -299,11 +299,9 @@ void rs6000_software_single_step (enum target_signal signal, int insert_breakpoints_p) { -#define INSNLEN(OPCODE) 4 - - static char le_breakp[] = LITTLE_BREAKPOINT; - static char be_breakp[] = BIG_BREAKPOINT; - char *breakp = TARGET_BYTE_ORDER == BFD_ENDIAN_BIG ? be_breakp : le_breakp; + CORE_ADDR dummy; + int breakp_sz; + char *breakp = rs6000_breakpoint_from_pc (&dummy, &breakp_sz); int ii, insn; CORE_ADDR loc; CORE_ADDR breaks[2]; @@ -316,7 +314,7 @@ rs6000_software_single_step (enum target insn = read_memory_integer (loc, 4); - breaks[0] = loc + INSNLEN (insn); + breaks[0] = loc + breakp_sz; opcode = insn >> 26; breaks[1] = branch_dest (opcode, insn, loc, breaks[0]); @@ -332,10 +330,7 @@ rs6000_software_single_step (enum target /* ignore invalid breakpoint. */ if (breaks[ii] == -1) continue; - - read_memory (breaks[ii], stepBreaks[ii].data, 4); - - write_memory (breaks[ii], breakp, 4); + target_insert_breakpoint (breaks[ii], stepBreaks[ii].data); stepBreaks[ii].address = breaks[ii]; } @@ -346,9 +341,8 @@ rs6000_software_single_step (enum target /* remove step breakpoints. */ for (ii = 0; ii < 2; ++ii) if (stepBreaks[ii].address != 0) - write_memory - (stepBreaks[ii].address, stepBreaks[ii].data, 4); - + target_remove_breakpoint (stepBreaks[ii].address, + stepBreaks[ii].data); } errno = 0; /* FIXME, don't ignore errors! */ /* What errors? {read,write}_memory call error(). */