--- gdb/avr-tdep.c.orig	2008-01-11 06:19:59.000000000 -0700
+++ gdb/avr-tdep.c	2008-06-18 16:01:50.309167300 -0600
@@ -181,8 +181,10 @@ struct avr_unwind_cache
 
 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. */
@@ -1030,22 +1032,28 @@ avr_frame_prev_register (struct frame_in
                  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.  */
-
               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 (get_frame_arch (next_frame), regnum),
 		 pc);
@@ -1280,6 +1288,11 @@ avr_gdbarch_init (struct gdbarch_info in
     case bfd_mach_avr3:
     case bfd_mach_avr4:
     case bfd_mach_avr5:
+      tdep->pcsize = 2;
+      break;
+
+    case bfd_mach_avr6:
+      tdep->pcsize = 3;
       break;
     }
 
