freebsd-ports/devel/avr-gdb/files/patch-atmega256x-gdb
Joerg Wunsch b4e46a1d2c Upgrade to GCC 6.5.
Add local patches to support the ATmega256x controller family that
features a 3-byte PC.  patch-atmega256x-binutils is Bjoern Haase's
backported binutils patch for the ATmega256x (stripped down to those
GNU binutils directories that are present in the GDB source tree),
while patch-atmega256x-gdb is my own one to modify the AVR backend in
GDB to understand 3-byte PCs.
2006-09-30 21:49:24 +00:00

66 lines
2 KiB
Text

--- gdb/avr-tdep.c~ Sat Jan 21 23:25:07 2006
+++ gdb/avr-tdep.c Sat Sep 30 22:57:08 2006
@@ -182,8 +182,10 @@
struct gdbarch_tdep
{
- /* FIXME: TRoth: is there anything to put here? */
- int foo;
+ /* Size of the PC on the current AVR target. This is equal 2 for
+ most AVRs except for the ATmega256x devices that have a 3-byte
+ PC. */
+ int pcsize;
};
/* Lookup the name of a register given it's number. */
@@ -1003,22 +1005,29 @@
on the stack is in big endian byte order, even though most
everything else about the avr is little endian. Ick! */
- /* FIXME: number of bytes read here will need updated for the
- mega256 when it is available. */
-
+ struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
ULONGEST pc;
unsigned char tmp;
- unsigned char buf[2];
+ unsigned char buf[3];
- read_memory (info->saved_regs[regnum].addr, buf, 2);
+ read_memory (info->saved_regs[regnum].addr, buf, tdep->pcsize);
/* Convert the PC read from memory as a big-endian to
little-endian order. */
- tmp = buf[0];
- buf[0] = buf[1];
- buf[1] = tmp;
+ if (tdep->pcsize == 2)
+ {
+ tmp = buf[0];
+ buf[0] = buf[1];
+ buf[1] = tmp;
+ }
+ else
+ {
+ tmp = buf[0];
+ buf[0] = buf[2];
+ buf[2] = tmp;
+ }
- pc = (extract_unsigned_integer (buf, 2) * 2);
+ pc = (extract_unsigned_integer (buf, tdep->pcsize) * 2);
store_unsigned_integer (bufferp,
register_size (current_gdbarch, regnum),
pc);
@@ -1253,6 +1262,11 @@
case bfd_mach_avr3:
case bfd_mach_avr4:
case bfd_mach_avr5:
+ tdep->pcsize = 2;
+ break;
+
+ case bfd_mach_avr6:
+ tdep->pcsize = 3;
break;
}