From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7007 invoked by alias); 29 May 2003 06:31:04 -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 6938 invoked from network); 29 May 2003 06:31:02 -0000 Received: from unknown (HELO zenia.red-bean.com) (12.223.225.216) by sources.redhat.com with SMTP; 29 May 2003 06:31:02 -0000 Received: from zenia.red-bean.com (localhost.localdomain [127.0.0.1]) by zenia.red-bean.com (8.12.5/8.12.5) with ESMTP id h4T6dtFq004987; Thu, 29 May 2003 01:39:55 -0500 Received: (from jimb@localhost) by zenia.red-bean.com (8.12.5/8.12.5/Submit) id h4T6dtlR004983; Thu, 29 May 2003 01:39:55 -0500 To: gdb-patches@sources.redhat.com Subject: [ppc64-linux]: Support gdbserver on PPC64 Linux From: Jim Blandy Date: Thu, 29 May 2003 06:31:00 -0000 Message-ID: User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.3 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2003-05/txt/msg00527.txt.bz2 gdb/ChangeLog: 2003-05-29 Jim Blandy Support gdbserver on 64-bit PowerPC Linux. * configure.tgt (powerpc64-*-linux*): Build gdbserver, please. * regformats/reg-ppc64.dat: New file. gdb/gdbserver/ChangeLog: 2003-05-29 Jim Blandy Add support for Linux on the 64-bit PowerPC. * linux-ppc64-low.c: New file. * configure.srv (powerpc64-*-linux*): New case. (powerpc*-*-linux*): Adjust case pattern not to match powerpc64-*-linux*. * Makefile.in (linux-ppc64-low.o, reg-ppc64.o, reg-ppc64.c): New rules. (clean): Delete reg-ppc64.c, too. Index: gdb/configure.tgt =================================================================== RCS file: /cvs/src/src/gdb/configure.tgt,v retrieving revision 1.104.2.1 diff -c -r1.104.2.1 configure.tgt *** gdb/configure.tgt 28 May 2003 16:51:21 -0000 1.104.2.1 --- gdb/configure.tgt 29 May 2003 06:26:43 -0000 *************** *** 194,200 **** powerpc-*-linux*) gdb_target=linux build_gdbserver=yes ;; ! powerpc64-*-linux*) gdb_target=linux ;; powerpc-*-vxworks*) gdb_target=vxworks ;; powerpc*-*-*) if test -f ../sim/ppc/Makefile; then gdb_target=ppc-sim --- 194,202 ---- powerpc-*-linux*) gdb_target=linux build_gdbserver=yes ;; ! powerpc64-*-linux*) gdb_target=linux ! build_gdbserver=yes ! ;; powerpc-*-vxworks*) gdb_target=vxworks ;; powerpc*-*-*) if test -f ../sim/ppc/Makefile; then gdb_target=ppc-sim Index: gdb/gdbserver/Makefile.in =================================================================== RCS file: /cvs/src/src/gdb/gdbserver/Makefile.in,v retrieving revision 1.22 diff -c -r1.22 Makefile.in *** gdb/gdbserver/Makefile.in 2 Jan 2003 14:40:35 -0000 1.22 --- gdb/gdbserver/Makefile.in 29 May 2003 06:26:44 -0000 *************** *** 190,196 **** rm -f *.o ${ADD_FILES} *~ rm -f gdbserver gdbreplay core make.log rm -f reg-arm.c reg-i386.c reg-ia64.c reg-m68k.c reg-mips.c ! rm -f reg-ppc.c reg-sh.c reg-x86-64.c reg-i386-linux.c distclean: clean rm -f nm.h tm.h xm.h config.status --- 190,196 ---- rm -f *.o ${ADD_FILES} *~ rm -f gdbserver gdbreplay core make.log rm -f reg-arm.c reg-i386.c reg-ia64.c reg-m68k.c reg-mips.c ! rm -f reg-ppc.c reg-ppc64.c reg-sh.c reg-x86-64.c reg-i386-linux.c distclean: clean rm -f nm.h tm.h xm.h config.status *************** *** 260,265 **** --- 260,266 ---- linux-ia64-low.o: linux-ia64-low.c $(linux_low_h) $(server_h) linux-mips-low.o: linux-mips-low.c $(linux_low_h) $(server_h) linux-ppc-low.o: linux-ppc-low.c $(linux_low_h) $(server_h) + linux-ppc64-low.o: linux-ppc64-low.c $(linux_low_h) $(server_h) linux-s390-low.o: linux-s390-low.c $(linux_low_h) $(server_h) linux-sh-low.o: linux-sh-low.c $(linux_low_h) $(server_h) linux-x86-64-low.o: linux-x86-64-low.c $(linux_low_h) $(server_h) *************** *** 285,290 **** --- 286,294 ---- reg-ppc.o : reg-ppc.c $(regdef_h) reg-ppc.c : $(srcdir)/../regformats/reg-ppc.dat $(regdat_sh) sh $(regdat_sh) $(srcdir)/../regformats/reg-ppc.dat reg-ppc.c + reg-ppc64.o : reg-ppc64.c $(regdef_h) + reg-ppc64.c : $(srcdir)/../regformats/reg-ppc64.dat $(regdat_sh) + sh $(regdat_sh) $(srcdir)/../regformats/reg-ppc64.dat reg-ppc64.c reg-s390.o : reg-s390.c $(regdef_h) reg-s390.c : $(srcdir)/../regformats/reg-s390.dat $(regdat_sh) sh $(regdat_sh) $(srcdir)/../regformats/reg-s390.dat reg-s390.c Index: gdb/gdbserver/configure.srv =================================================================== RCS file: /cvs/src/src/gdb/gdbserver/configure.srv,v retrieving revision 1.5 diff -c -r1.5 configure.srv *** gdb/gdbserver/configure.srv 11 Jun 2002 17:32:39 -0000 1.5 --- gdb/gdbserver/configure.srv 29 May 2003 06:26:45 -0000 *************** *** 42,49 **** srv_linux_usrregs=yes srv_linux_thread_db=yes ;; ! powerpc*-*-linux*) srv_regobj=reg-ppc.o srv_tgtobj="linux-low.o linux-ppc-low.o" srv_linux_usrregs=yes srv_linux_thread_db=yes ;; --- 42,54 ---- srv_linux_usrregs=yes srv_linux_thread_db=yes ;; ! powerpc-*-linux*) srv_regobj=reg-ppc.o srv_tgtobj="linux-low.o linux-ppc-low.o" + srv_linux_usrregs=yes + srv_linux_thread_db=yes + ;; + powerpc64-*-linux*) srv_regobj=reg-ppc64.o + srv_tgtobj="linux-low.o linux-ppc64-low.o" srv_linux_usrregs=yes srv_linux_thread_db=yes ;; Index: gdb/gdbserver/linux-ppc64-low.c =================================================================== RCS file: gdb/gdbserver/linux-ppc64-low.c diff -N gdb/gdbserver/linux-ppc64-low.c *** gdb/gdbserver/linux-ppc64-low.c 1 Jan 1970 00:00:00 -0000 --- gdb/gdbserver/linux-ppc64-low.c 29 May 2003 06:26:45 -0000 *************** *** 0 **** --- 1,120 ---- + /* GNU/Linux/PowerPC specific low level interface, for the remote server for + GDB. + Copyright 1995, 1996, 1998, 1999, 2000, 2001, 2002 + Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + #include "server.h" + #include "linux-low.h" + + #include + + #define ppc64_num_regs 71 + + #define FPR(n) ((PT_FPR0 + (n)) * 8) + + /* Currently, don't check/send MQ. */ + static int ppc64_regmap[] = + { + PT_R0 * 8, PT_R1 * 8, PT_R2 * 8, PT_R3 * 8, + PT_R4 * 8, PT_R5 * 8, PT_R6 * 8, PT_R7 * 8, + PT_R8 * 8, PT_R9 * 8, PT_R10 * 8, PT_R11 * 8, + PT_R12 * 8, PT_R13 * 8, PT_R14 * 8, PT_R15 * 8, + PT_R16 * 8, PT_R17 * 8, PT_R18 * 8, PT_R19 * 8, + PT_R20 * 8, PT_R21 * 8, PT_R22 * 8, PT_R23 * 8, + PT_R24 * 8, PT_R25 * 8, PT_R26 * 8, PT_R27 * 8, + PT_R28 * 8, PT_R29 * 8, PT_R30 * 8, PT_R31 * 8, + FPR (0), FPR (1), FPR (2), FPR (3), + FPR (4), FPR (5), FPR (6), FPR (7), + FPR (8), FPR (9), FPR (10), FPR (11), + FPR (12), FPR (13), FPR (14), FPR (15), + FPR (16), FPR (17), FPR (18), FPR (19), + FPR (20), FPR (21), FPR (22), FPR (23), + FPR (24), FPR (25), FPR (26), FPR (27), + FPR (28), FPR (29), FPR (30), FPR (31), + PT_NIP * 8, PT_MSR * 8, PT_CCR * 8, PT_LNK * 8, + PT_CTR * 8, PT_XER * 8, PT_FPSCR * 8, + }; + + static int + ppc64_cannot_store_register (int regno) + { + /* Some kernels do not allow us to store fpscr. */ + if (regno == find_regno ("fpscr")) + return 2; + + return 0; + } + + static int + ppc64_cannot_fetch_register (int regno) + { + return 0; + } + + static CORE_ADDR + ppc64_get_pc (void) + { + unsigned long pc; + + collect_register_by_name ("pc", &pc); + return (CORE_ADDR) pc; + } + + static void + ppc64_set_pc (CORE_ADDR pc) + { + unsigned long newpc = pc; + + supply_register_by_name ("pc", &newpc); + } + + /* Correct in either endianness. Note that this file is + for PowerPC only, not PowerPC64. + This instruction is "twge r2, r2", which GDB uses as a software + breakpoint. */ + static const unsigned int ppc64_breakpoint = 0x7d821008; + #define ppc64_breakpoint_len 4 + + static int + ppc64_breakpoint_at (CORE_ADDR where) + { + unsigned int insn; + + (*the_target->read_memory) (where, (char *) &insn, 4); + if (insn == ppc64_breakpoint) + return 1; + /* If necessary, recognize more trap instructions here. GDB only uses the + one. */ + return 0; + } + + struct linux_target_ops the_low_target = { + ppc64_num_regs, + ppc64_regmap, + ppc64_cannot_fetch_register, + ppc64_cannot_store_register, + ppc64_get_pc, + ppc64_set_pc, + (const char *) &ppc64_breakpoint, + ppc64_breakpoint_len, + NULL, + 0, + ppc64_breakpoint_at, + }; Index: gdb/regformats/reg-ppc64.dat =================================================================== RCS file: gdb/regformats/reg-ppc64.dat diff -N gdb/regformats/reg-ppc64.dat *** gdb/regformats/reg-ppc64.dat 1 Jan 1970 00:00:00 -0000 --- gdb/regformats/reg-ppc64.dat 29 May 2003 06:26:45 -0000 *************** *** 0 **** --- 1,76 ---- + name:ppc64 + expedite:r1,pc + 64:r0 + 64:r1 + 64:r2 + 64:r3 + 64:r4 + 64:r5 + 64:r6 + 64:r7 + 64:r8 + 64:r9 + 64:r10 + 64:r11 + 64:r12 + 64:r13 + 64:r14 + 64:r15 + 64:r16 + 64:r17 + 64:r18 + 64:r19 + 64:r20 + 64:r21 + 64:r22 + 64:r23 + 64:r24 + 64:r25 + 64:r26 + 64:r27 + 64:r28 + 64:r29 + 64:r30 + 64:r31 + + 64:f0 + 64:f1 + 64:f2 + 64:f3 + 64:f4 + 64:f5 + 64:f6 + 64:f7 + 64:f8 + 64:f9 + 64:f10 + 64:f11 + 64:f12 + 64:f13 + 64:f14 + 64:f15 + 64:f16 + 64:f17 + 64:f18 + 64:f19 + 64:f20 + 64:f21 + 64:f22 + 64:f23 + 64:f24 + 64:f25 + 64:f26 + 64:f27 + 64:f28 + 64:f29 + 64:f30 + 64:f31 + + 64:pc + 64:ps + + 32:cr + 64:lr + 64:ctr + 32:xer + 32:fpscr