diff options
author | Jim Blandy <jimb@codesourcery.com> | 2003-05-29 23:06:59 +0000 |
---|---|---|
committer | Jim Blandy <jimb@codesourcery.com> | 2003-05-29 23:06:59 +0000 |
commit | 64ea49d5a42df7b0545202909d4ebeb49b76cded (patch) | |
tree | a3cbd961e5694ea856316b07a3313b3743ebb450 /gdb | |
parent | 6ad34b19bc0976ff766e74d2c52cf36f241ae384 (diff) | |
download | gdb-64ea49d5a42df7b0545202909d4ebeb49b76cded.tar.gz |
gdb/ChangeLog:
2003-05-29 Jim Blandy <jimb@redhat.com>
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 <jimb@redhat.com>
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.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/configure.tgt | 4 | ||||
-rw-r--r-- | gdb/gdbserver/ChangeLog | 9 | ||||
-rw-r--r-- | gdb/gdbserver/Makefile.in | 6 | ||||
-rw-r--r-- | gdb/gdbserver/configure.srv | 7 | ||||
-rw-r--r-- | gdb/gdbserver/linux-ppc64-low.c | 113 | ||||
-rw-r--r-- | gdb/regformats/reg-ppc64.dat | 76 |
7 files changed, 216 insertions, 3 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index fa3b38c8fb1..b02f23f9926 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,9 @@ 2003-05-29 Jim Blandy <jimb@redhat.com> + Support gdbserver on 64-bit PowerPC Linux. + * configure.tgt (powerpc64-*-linux*): Build gdbserver, please. + * regformats/reg-ppc64.dat: New file. + Use gdbarch methods for solib stuff on PowerPC Linux. * config/powerpc/tm-linux.h (IN_SOLIB_CALL_TRAMPOLINE, SKIP_TRAMPOLINE_CODE): #undef these, so the gdbarch methods will diff --git a/gdb/configure.tgt b/gdb/configure.tgt index cee1807044f..0b59b0f41d4 100644 --- a/gdb/configure.tgt +++ b/gdb/configure.tgt @@ -194,7 +194,9 @@ powerpc-*-aix*) gdb_target=aix ;; powerpc-*-linux*) gdb_target=linux build_gdbserver=yes ;; -powerpc64-*-linux*) gdb_target=linux ;; +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 diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 7e998d094ed..a7764ff5bd3 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,5 +1,14 @@ 2003-05-29 Jim Blandy <jimb@redhat.com> + 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. + * linux-low.c (usr_store_inferior_registers): Transfer buf in PTRACE_XFER_TYPE-sized chunks, not int-sized chunks. Otherwise, if 'int' is smaller than PTRACE_XFER_TYPE, you end up throwing diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in index 763c21ed7b2..22ad78640f8 100644 --- a/gdb/gdbserver/Makefile.in +++ b/gdb/gdbserver/Makefile.in @@ -190,7 +190,7 @@ clean: 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 + 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,6 +260,7 @@ linux-i386-low.o: linux-i386-low.c $(linux_low_h) $(server_h) 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,6 +286,9 @@ reg-mips.c : $(srcdir)/../regformats/reg-mips.dat $(regdat_sh) 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 diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv index 28dc2aad1f6..b79d4a091d3 100644 --- a/gdb/gdbserver/configure.srv +++ b/gdb/gdbserver/configure.srv @@ -42,11 +42,16 @@ case "${target}" in srv_linux_usrregs=yes srv_linux_thread_db=yes ;; - powerpc*-*-linux*) srv_regobj=reg-ppc.o + 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 + ;; s390-*-linux*) srv_regobj=reg-s390.o srv_tgtobj="linux-low.o linux-s390-low.o" srv_linux_usrregs=yes diff --git a/gdb/gdbserver/linux-ppc64-low.c b/gdb/gdbserver/linux-ppc64-low.c new file mode 100644 index 00000000000..f88db35cb99 --- /dev/null +++ b/gdb/gdbserver/linux-ppc64-low.c @@ -0,0 +1,113 @@ +/* gdbserver low-level interface for GNU/Linux running on 64-bit PowerPC. + Copyright 2003 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 <asm/ptrace.h> + +#define ppc64_num_regs (sizeof (ppc64_regmap) / sizeof (ppc64_regmap[0])) + +#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) +{ + 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. + 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, +}; diff --git a/gdb/regformats/reg-ppc64.dat b/gdb/regformats/reg-ppc64.dat new file mode 100644 index 00000000000..281432ade47 --- /dev/null +++ b/gdb/regformats/reg-ppc64.dat @@ -0,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 |