This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH] Add support for Tilera TILE-Gx processor (part 2/3: gdb)
- From: Pedro Alves <palves at redhat dot com>
- To: Jeff Kenton <jkenton at tilera dot com>
- Cc: gdb-patches at sourceware dot org
- Date: Wed, 23 May 2012 18:44:53 +0100
- Subject: Re: [PATCH] Add support for Tilera TILE-Gx processor (part 2/3: gdb)
- References: <4FAD3AE9.3080701@tilera.com> <4FBA50C8.2040605@tilera.com>
On 05/21/2012 03:27 PM, Jeff Kenton wrote:
> gdb/
> * configure.host: Add tilegx target.
> * tilegx-linux-nat.c : New file.
> * config/tilegx/tilegx.mh : New file.
There should be no space before ':'.
> * config/tilegx/nm-linux.h: New file.
>
> diff -r -u -N /home/packages/gdb-7.4x/gdb/config/tilegx/nm-linux.h ./gdb/config/tilegx/nm-linux.h
> --- /home/packages/gdb-7.4x/gdb/config/tilegx/nm-linux.h 1969-12-31 19:00:00.000000000 -0500
> +++ ./gdb/config/tilegx/nm-linux.h 2012-05-18 14:00:31.331191000 -0400
> @@ -0,0 +1,25 @@
> +/* Native-dependent definitions for GNU/Linux on TILE.
> +
> + Copyright (C) 2012 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 3 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, see <http://www.gnu.org/licenses/>. */
> +
> +#ifndef NM_TILELINUX_H
> +#define NM_TILELINUX_H
> +
> +#include "config/nm-linux.h"
> +
> +#endif /* NM_TILELINUX_H */
No other GNU/Linux port needs this file.
Just do like the other ports (see below).
> diff -r -u -N /home/packages/gdb-7.4x/gdb/config/tilegx/tilegx.mh ./gdb/config/tilegx/tilegx.mh
> --- /home/packages/gdb-7.4x/gdb/config/tilegx/tilegx.mh 1969-12-31 19:00:00.000000000 -0500
> +++ ./gdb/config/tilegx/tilegx.mh 2012-05-18 14:00:31.348182000 -0400
> @@ -0,0 +1,12 @@
> +# Host: Tilera tilegx running GNU/Linux.
> +
> +NAT_FILE= nm-linux.h
$ cd config
$ grep nm-linux.h * -rn
alpha/alpha-linux.mh:2:NAT_FILE= config/nm-linux.h
arm/linux.mh:3:NAT_FILE= config/nm-linux.h
i386/linux64.mh:7:NAT_FILE= config/nm-linux.h
i386/linux.mh:3:NAT_FILE= config/nm-linux.h
ia64/linux.mh:3:NAT_FILE= config/nm-linux.h
m32r/linux.mh:3:NAT_FILE= config/nm-linux.h
m68k/linux.mh:3:NAT_FILE= config/nm-linux.h
mips/linux.mh:2:NAT_FILE= config/nm-linux.h
pa/linux.mh:2:NAT_FILE= config/nm-linux.h
powerpc/linux.mh:5:NAT_FILE= config/nm-linux.h
powerpc/ppc64-linux.mh:5:NAT_FILE= config/nm-linux.h
s390/s390.mh:2:NAT_FILE= config/nm-linux.h
sparc/linux64.mh:2:NAT_FILE= config/nm-linux.h
sparc/linux.mh:2:NAT_FILE= config/nm-linux.h
xtensa/linux.mh:3:NAT_FILE= config/nm-linux.h
> +NATDEPFILES= inf-ptrace.o fork-child.o \
> + tilegx-linux-nat.o \
> + proc-service.o linux-thread-db.o \
> + linux-nat.o linux-osdata.o linux-fork.o \
> + linux-procfs.o linux-ptrace.o
> +
> +# The dynamically loaded libthread_db needs access to symbols in the
> +# gdb executable.
> +LOADLIBES = -ldl $(RDYNAMIC)
> diff -r -u -N /home/packages/gdb-7.4x/gdb/configure.host ./gdb/configure.host
> --- /home/packages/gdb-7.4x/gdb/configure.host 2011-05-04 15:28:14.000000000 -0400
> +++ ./gdb/configure.host 2012-05-18 14:00:31.368194000 -0400
> @@ -50,6 +50,7 @@
> sparcv9 | sparc64) gdb_host_cpu=sparc ;;
> s390*) gdb_host_cpu=s390 ;;
> sh*) gdb_host_cpu=sh ;;
> +tilegx*) gdb_host_cpu=tilegx ;;
> x86_64*) gdb_host_cpu=i386 ;;
> m32r*) gdb_host_cpu=m32r ;;
> xtensa*) gdb_host_cpu=xtensa ;;
> @@ -159,6 +160,8 @@
> gdb_host=sol2
> ;;
>
> +tilegx-*-*) gdb_host=tilegx ;;
> +
> vax-*-bsd*) gdb_host=vax ;;
> vax-*-netbsdelf* | vax-*-knetbsd*-gnu)
> gdb_host=nbsdelf ;;
> diff -r -u -N /home/packages/gdb-7.4x/gdb/tilegx-linux-nat.c ./gdb/tilegx-linux-nat.c
> --- /home/packages/gdb-7.4x/gdb/tilegx-linux-nat.c 1969-12-31 19:00:00.000000000 -0500
> +++ ./gdb/tilegx-linux-nat.c 2012-05-18 14:00:31.550178000 -0400
> @@ -0,0 +1,187 @@
> +/* Native-dependent code for GNU/Linux Tile
> +
> + Copyright (C) 2012 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 3 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, see <http://www.gnu.org/licenses/>. */
> +
> +#include "defs.h"
> +#include "inferior.h"
> +#include "gdbcore.h"
> +#include "regcache.h"
> +#include "linux-nat.h"
> +
> +#include <sys/ptrace.h>
> +
> +#include "gdb_assert.h"
> +#include "gdb_string.h"
> +
> +#include <sys/procfs.h>
> +
> +/* Prototypes for supply_gregset etc. */
> +#include "gregset.h"
> +
> +/* Defines ps_err_e, struct ps_prochandle. */
> +#include "gdb_proc_service.h"
> +
> +
> +/* The register sets used in GNU/Linux ELF core-dumps are identical to
> + the register sets in `struct user' that is used for a.out
> + core-dumps, and is also used by `ptrace'. The corresponding types
> + are `elf_gregset_t' for the general-purpose registers (with
> + `elf_greg_t' the type of a single GP register) and `elf_fpregset_t'
> + for the floating-point registers.
> +
> + Those types used to be available under the names `gregset_t' and
> + `fpregset_t' too, and this file used those names in the past. But
> + those names are now used for the register sets used in the
> + `mcontext_t' type, and have a different size and layout. */
> +
> +/* Mapping between the general-purpose registers in `struct user'
> + format and GDB's register array layout. Note that we map the
> + first 56 registers (0 thru 55) one-to-one. GDB maps the pc to
> + slot 64, but ptrace returns it in slot 56. */
> +static const int regmap[] =
> +{
> + 0, 1, 2, 3, 4, 5, 6, 7,
> + 8, 9, 10, 11, 12, 13, 14, 15,
> + 16, 17, 18, 19, 20, 21, 22, 23,
> + 24, 25, 26, 27, 28, 29, 30, 31,
> + 32, 33, 34, 35, 36, 37, 38, 39,
> + 40, 41, 42, 43, 44, 45, 46, 47,
> + 48, 49, 50, 51, 52, 53, 54, 55,
> + -1, -1, -1, -1, -1, -1, -1, -1,
> + 56
> +};
> +
> +
> +/* Transfering the general-purpose registers between GDB, inferiors
> + and core files. */
> +
> +/* Fill GDB's register array with the general-purpose register values
> + in *GREGSETP. */
> +
> +void
> +supply_gregset (struct regcache* regcache,
> + const elf_gregset_t *gregsetp)
> +{
> + elf_greg_t *regp = (elf_greg_t *) gregsetp;
> + int i;
> +
> + for (i = 0; i < sizeof (regmap) / sizeof (regmap[0]); i++)
> + if (regmap[i] >= 0)
> + regcache_raw_supply (regcache, i, regp + regmap[i]);
> +}
> +
> +/* Fill registers in *GREGSETPS with the values in GDB's
> + register array. */
> +
> +void
> +fill_gregset (const struct regcache* regcache,
> + elf_gregset_t *gregsetp, int regno)
> +{
> + elf_greg_t *regp = (elf_greg_t *) gregsetp;
> + int i;
> +
> + for (i = 0; i < sizeof (regmap) / sizeof (regmap[0]); i++)
> + if (regmap[i] >= 0)
> + regcache_raw_collect (regcache, i, regp + regmap[i]);
> +}
> +
> +/* Transfering floating-point registers between GDB, inferiors and cores. */
> +
> +/* Fill GDB's register array with the floating-point register values in
> + *FPREGSETP. */
> +
> +void
> +supply_fpregset (struct regcache *regcache,
> + const elf_fpregset_t *fpregsetp)
> +{
> + /* NOTE: There are no floating-point registers for TILE-Gx. */
> +}
> +
> +/* Fill register REGNO (if it is a floating-point register) in
> + *FPREGSETP with the value in GDB's register array. If REGNO is -1,
> + do this for all registers. */
> +
> +void
> +fill_fpregset (const struct regcache *regcache,
> + elf_fpregset_t *fpregsetp, int regno)
> +{
> + /* NOTE: There are no floating-point registers for TILE-Gx. */
> +}
> +
> +
> +/* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
> + for all registers. */
> +
> +static void
> +fetch_inferior_registers (struct target_ops *ops,
> + struct regcache *regcache, int regnum)
> +{
> + elf_gregset_t regs;
> + int tid;
> +
> + tid = ptid_get_lwp (inferior_ptid);
> + if (tid == 0)
> + tid = ptid_get_pid (inferior_ptid);
> +
> + if (ptrace (PTRACE_GETREGS, tid, 0, (PTRACE_TYPE_ARG3) ®s) < 0)
> + perror_with_name (_("Couldn't get registers"));
> +
> + supply_gregset (regcache, (const elf_gregset_t *)®s);
> +}
> +
> +/* Store register REGNUM back into the inferior. If REGNUM is -1, do
> + this for all registers. */
> +
> +static void
> +store_inferior_registers (struct target_ops *ops,
> + struct regcache *regcache, int regnum)
> +{
> + elf_gregset_t regs;
> + int tid;
> +
> + tid = ptid_get_lwp (inferior_ptid);
> + if (tid == 0)
> + tid = ptid_get_pid (inferior_ptid);
> +
> + if (ptrace (PTRACE_GETREGS, tid, 0, (PTRACE_TYPE_ARG3) ®s) < 0)
> + perror_with_name (_("Couldn't get registers"));
> +
> + fill_gregset (regcache, ®s, regnum);
> +
> + if (ptrace (PTRACE_SETREGS, tid, 0, (PTRACE_TYPE_ARG3) ®s) < 0)
> + perror_with_name (_("Couldn't write registers"));
> +}
> +
> +
> +extern initialize_file_ftype _initialize_tile_linux_nat;
> +
> +void
> +_initialize_tile_linux_nat (void)
> +{
> + struct target_ops *t;
> +
> + /* Fill in the generic GNU/Linux methods. */
> + t = linux_target ();
> +
> + /* Add our register access methods. */
> + t->to_fetch_registers = fetch_inferior_registers;
> + t->to_store_registers = store_inferior_registers;
> +
> + /* Register the target. */
> + linux_nat_add_target (t);
> +}
Otherwise looks fine.
Don't you need a "ps_get_thread_area" function for TLS support though?
--
Pedro Alves