--- 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; }