gdbserver: bfin: new port

Signed-off-by: Jie Zhang <jie.zhang@analog.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
This commit is contained in:
Mike Frysinger 2010-12-29 16:15:42 +00:00
parent 9102122396
commit eb826dc62c
10 changed files with 201 additions and 3 deletions

View file

@ -1,3 +1,9 @@
2010-12-29 Jie Zhang <jie.zhang@analog.com>
* configure.tgt (bfin-*-*): Set build_gdbserver to yes.
* NEWS: Mention new Blackfin support.
* regformats/reg-bfin.dat: New file.
2010-12-29 Jie Zhang <jie.zhang@analog.com>
Mike Frysinger <vapier@gentoo.org>

View file

@ -111,6 +111,8 @@
** GDBserver is now supported on PowerPC LynxOS (versions 4.x and 5.x),
and i686 LynxOS (version 5.x).
** GDBserver is now supported on Blackfin Linux.
* New targets:
Analog Devices, Inc. Blackfin Processor bfin-*

View file

@ -109,6 +109,7 @@ avr-*-*)
bfin-*-*linux*)
# Target: Blackfin Linux
gdb_target_obs="bfin-tdep.o bfin-linux-tdep.o linux-tdep.o"
build_gdbserver=yes
;;
bfin-*-*)
# Target: Blackfin processor

View file

@ -1,3 +1,14 @@
2010-12-29 Jie Zhang <jie.zhang@analog.com>
* configure.srv (bfin-*-*linux*): Handle Blackfin/Linux targets.
* linux-bfin-low.c: New file.
* linux-low.c: Define PT_TEXT_ADDR, PT_TEXT_END_ADDR, and
PT_DATA_ADDR for BFIN targets.
* Makefile.in (SFILES): Add linux-bfin-low.c.
(clean): Remove reg-bfin.c.
(linux-bfin-low.o, reg-bfin.o, reg-bfin.c): New targets.
* README: Mention supported Blackfin targets.
2010-12-23 Mike Frysinger <vapier@gentoo.org>
* .gitignore: New file.

View file

@ -111,8 +111,8 @@ SFILES= $(srcdir)/gdbreplay.c $(srcdir)/inferiors.c \
$(srcdir)/proc-service.list $(srcdir)/regcache.c \
$(srcdir)/remote-utils.c $(srcdir)/server.c $(srcdir)/target.c \
$(srcdir)/thread-db.c $(srcdir)/utils.c \
$(srcdir)/linux-arm-low.c $(srcdir)/linux-cris-low.c \
$(srcdir)/linux-crisv32-low.c \
$(srcdir)/linux-arm-low.c $(srcdir)/linux-bfin-low.c \
$(srcdir)/linux-cris-low.c $(srcdir)/linux-crisv32-low.c \
${srcdir}/i386-low.c $(srcdir)/i387-fp.c \
$(srcdir)/linux-ia64-low.c $(srcdir)/linux-low.c \
$(srcdir)/linux-m32r-low.c \
@ -263,7 +263,7 @@ clean:
rm -f version.c
rm -f gdbserver$(EXEEXT) gdbreplay$(EXEEXT) core make.log
rm -f $(IPA_LIB)
rm -f reg-arm.c i386.c reg-ia64.c reg-m32r.c reg-m68k.c
rm -f reg-arm.c reg-bfin.c i386.c reg-ia64.c reg-m32r.c reg-m68k.c
rm -f reg-sh.c reg-sparc.c reg-spu.c amd64.c i386-linux.c
rm -f reg-cris.c reg-crisv32.c amd64-linux.c reg-xtensa.c
rm -f arm-with-iwmmxt.c
@ -413,6 +413,7 @@ linux-low.o: linux-low.c $(linux_low_h) $(server_h)
linux-arm-low.o: linux-arm-low.c $(linux_low_h) $(server_h) \
$(gdb_proc_service_h)
linux-bfin-low.o: linux-bfin-low.c $(linux_low_h) $(server_h)
linux-cris-low.o: linux-cris-low.c $(linux_low_h) $(server_h)
linux-crisv32-low.o: linux-crisv32-low.c $(linux_low_h) $(server_h)
linux-ia64-low.o: linux-ia64-low.c $(linux_low_h) $(server_h)
@ -455,6 +456,9 @@ arm-with-vfpv3.c : $(srcdir)/../regformats/arm-with-vfpv3.dat $(regdat_sh)
arm-with-neon.o : arm-with-neon.c $(regdef_h)
arm-with-neon.c : $(srcdir)/../regformats/arm-with-neon.dat $(regdat_sh)
$(SHELL) $(regdat_sh) $(srcdir)/../regformats/arm-with-neon.dat arm-with-neon.c
reg-bfin.o : reg-bfin.c $(regdef_h)
reg-bfin.c : $(srcdir)/../regformats/reg-bfin.dat $(regdat_sh)
$(SHELL) $(regdat_sh) $(srcdir)/../regformats/reg-bfin.dat reg-bfin.c
reg-cris.o : reg-cris.c $(regdef_h)
reg-cris.c : $(srcdir)/../regformats/reg-cris.dat $(regdat_sh)
$(SHELL) $(regdat_sh) $(srcdir)/../regformats/reg-cris.dat reg-cris.c

View file

@ -81,6 +81,8 @@ Building GDBserver:
The supported targets as of November 2006 are:
arm-*-linux*
bfin-*-uclinux
bfin-*-linux-uclibc
crisv32-*-linux*
cris-*-linux*
i[34567]86-*-cygwin*

View file

@ -67,6 +67,11 @@ case "${target}" in
srv_mingw=yes
srv_mingwce=yes
;;
bfin-*-*linux*) srv_regobj=reg-bfin.o
srv_tgtobj="linux-low.o linux-bfin-low.o"
srv_linux_usrregs=yes
srv_linux_thread_db=yes
;;
crisv32-*-linux*) srv_regobj=reg-crisv32.o
srv_tgtobj="linux-low.o linux-crisv32-low.o"
srv_linux_regsets=yes

View file

@ -0,0 +1,107 @@
/* GNU/Linux/BFIN specific low level interface, for the remote server for GDB.
Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
Free Software Foundation, Inc.
Contributed by Analog Devices, 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 "server.h"
#include "linux-low.h"
#include "libiberty.h"
#include <asm/ptrace.h>
/* Defined in auto-generated file reg-bfin.c. */
void init_registers_bfin (void);
static int bfin_regmap[] =
{
PT_R0, PT_R1, PT_R2, PT_R3, PT_R4, PT_R5, PT_R6, PT_R7,
PT_P0, PT_P1, PT_P2, PT_P3, PT_P4, PT_P5, PT_USP, PT_FP,
PT_I0, PT_I1, PT_I2, PT_I3, PT_M0, PT_M1, PT_M2, PT_M3,
PT_B0, PT_B1, PT_B2, PT_B3, PT_L0, PT_L1, PT_L2, PT_L3,
PT_A0X, PT_A0W, PT_A1X, PT_A1W, PT_ASTAT, PT_RETS,
PT_LC0, PT_LT0, PT_LB0, PT_LC1, PT_LT1, PT_LB1,
-1 /* PT_CYCLES */, -1 /* PT_CYCLES2 */,
-1 /* PT_USP */, PT_SEQSTAT, PT_SYSCFG, PT_PC, PT_RETX, PT_RETN, PT_RETE,
PT_PC,
};
#define bfin_num_regs ARRAY_SIZE (bfin_regmap)
static int
bfin_cannot_store_register (int regno)
{
return (regno >= bfin_num_regs);
}
static int
bfin_cannot_fetch_register (int regno)
{
return (regno >= bfin_num_regs);
}
static CORE_ADDR
bfin_get_pc (struct regcache *regcache)
{
unsigned long pc;
collect_register_by_name (regcache, "pc", &pc);
return pc;
}
static void
bfin_set_pc (struct regcache *regcache, CORE_ADDR pc)
{
unsigned long newpc = pc;
supply_register_by_name (regcache, "pc", &newpc);
}
#define bfin_breakpoint_len 2
static const unsigned char bfin_breakpoint[bfin_breakpoint_len] = {0xa1, 0x00};
static int
bfin_breakpoint_at (CORE_ADDR where)
{
unsigned char insn[bfin_breakpoint_len];
read_inferior_memory(where, insn, bfin_breakpoint_len);
if (insn[0] == bfin_breakpoint[0]
&& insn[1] == bfin_breakpoint[1])
return 1;
/* If necessary, recognize more trap instructions here. GDB only uses the
one. */
return 0;
}
struct linux_target_ops the_low_target = {
init_registers_bfin,
bfin_num_regs,
bfin_regmap,
bfin_cannot_fetch_register,
bfin_cannot_store_register,
bfin_get_pc,
bfin_set_pc,
bfin_breakpoint,
bfin_breakpoint_len,
0,
2,
bfin_breakpoint_at,
};

View file

@ -4373,6 +4373,10 @@ linux_stopped_data_address (void)
#define PT_TEXT_ADDR 49*4
#define PT_DATA_ADDR 50*4
#define PT_TEXT_END_ADDR 51*4
#elif defined(BFIN)
#define PT_TEXT_ADDR 220
#define PT_TEXT_END_ADDR 224
#define PT_DATA_ADDR 228
#endif
/* Under uClinux, programs are loaded at non-zero offsets, which we need

View file

@ -0,0 +1,56 @@
name:bfin
expedite:pc,sp,fp
32:r0
32:r1
32:r2
32:r3
32:r4
32:r5
32:r6
32:r7
32:p0
32:p1
32:p2
32:p3
32:p4
32:p5
32:sp
32:fp
32:i0
32:i1
32:i2
32:i3
32:m0
32:m1
32:m2
32:m3
32:b0
32:b1
32:b2
32:b3
32:l0
32:l1
32:l2
32:l3
32:a0x
32:a0w
32:a1x
32:a1w
32:astat
32:rets
32:lc0
32:lt0
32:lb0
32:lc1
32:lt1
32:lb1
32:cycles
32:cycles2
32:usp
32:seqstat
32:syscfg
32:reti
32:retx
32:retn
32:rete
32:pc