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.
66 lines
2 KiB
Text
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;
|
|
}
|
|
|