summaryrefslogtreecommitdiff
path: root/devel/avr-binutils/files/patch-xmega
diff options
context:
space:
mode:
Diffstat (limited to 'devel/avr-binutils/files/patch-xmega')
-rw-r--r--devel/avr-binutils/files/patch-xmega792
1 files changed, 426 insertions, 366 deletions
diff --git a/devel/avr-binutils/files/patch-xmega b/devel/avr-binutils/files/patch-xmega
index 19953e59daf1..1db6d6bf515a 100644
--- a/devel/avr-binutils/files/patch-xmega
+++ b/devel/avr-binutils/files/patch-xmega
@@ -1,80 +1,88 @@
-Not committed
---------------------------------------------------------------------------------
---- opcodes/avr-dis.c.orig 2007-08-06 13:58:38.000000000 -0600
-+++ opcodes/avr-dis.c 2008-04-09 16:37:17.233737600 -0600
-@@ -50,7 +50,7 @@ static const char * comment_start = "0x"
+--- ./include/opcode/avr.h.orig 2008-08-09 07:35:13.000000000 +0200
++++ ./include/opcode/avr.h 2009-01-07 17:46:15.000000000 +0100
+@@ -30,6 +30,8 @@
+ #define AVR_ISA_BRK 0x0400 /* device has BREAK (on-chip debug) */
+ #define AVR_ISA_EIND 0x0800 /* device has >128K program memory (none yet) */
+ #define AVR_ISA_MOVW 0x1000 /* device has MOVW */
++#define AVR_ISA_SPMX 0x2000 /* device has SPM Z[+] */
++#define AVR_ISA_DES 0x4000 /* device has DES */
- static int
- avr_operand (unsigned int insn, unsigned int insn2, unsigned int pc, int constraint,
-- char *buf, char *comment, int regs, int *sym, bfd_vma *sym_addr)
-+ char *opcode_str, char *buf, char *comment, int regs, int *sym, bfd_vma *sym_addr)
- {
- int ok = 1;
- *sym = 0;
-@@ -118,8 +118,18 @@ avr_operand (unsigned int insn, unsigned
+ #define AVR_ISA_TINY1 (AVR_ISA_1200 | AVR_ISA_LPM)
+ #define AVR_ISA_2xxx (AVR_ISA_TINY1 | AVR_ISA_SRAM)
+@@ -48,6 +50,8 @@
+ #define AVR_ISA_94K (AVR_ISA_M603 | AVR_ISA_MUL | AVR_ISA_MOVW | AVR_ISA_LPMX)
+ #define AVR_ISA_M323 (AVR_ISA_M161 | AVR_ISA_BRK)
+ #define AVR_ISA_M128 (AVR_ISA_M323 | AVR_ISA_ELPM | AVR_ISA_ELPMX)
++#define AVR_ISA_M256 (AVR_ISA_M128 | AVR_ISA_EIND)
++#define AVR_ISA_XMEGA (AVR_ISA_M256 | AVR_ISA_SPMX | AVR_ISA_DES)
- case 'z':
- *buf++ = 'Z';
-- if (insn & 0x1)
-- *buf++ = '+';
-+
-+ /* Check for post-increment. */
-+ char *s;
-+ for (s = opcode_str; *s; ++s)
-+ {
-+ if (*s == '+')
-+ {
-+ *buf++ = '+';
-+ break;
-+ }
-+ }
-+
- *buf = '\0';
- if (AVR_UNDEF_P (insn))
- sprintf (comment, _("undefined"));
-@@ -226,6 +236,10 @@ avr_operand (unsigned int insn, unsigned
- sprintf (comment, "%d", x);
- }
- break;
-+
-+ case 'E':
-+ sprintf (buf, "%d", (insn >> 4) & 15);
-+ break;
-
- case '?':
- *buf = '\0';
-@@ -331,7 +345,8 @@ print_insn_avr (bfd_vma addr, disassembl
+ #define AVR_ISA_AVR1 AVR_ISA_TINY1
+ #define AVR_ISA_AVR2 AVR_ISA_2xxx
+@@ -108,6 +112,7 @@
+ L - signed pc relative offset from -2048 to 2047
+ h - absolute code address (call, jmp)
+ S - immediate value from 0 to 7 (S = s << 4)
++ E - immediate value from 0 to 15, shifted left by 4 (des)
+ ? - use this opcode entry if no parameters, else use next opcode entry
- if (opcode->name)
- {
-- char *op = opcode->constraints;
-+ char *constraints = opcode->constraints;
-+ char *opcode_str = opcode->opcode;
+ Order is important - some binary opcodes have more than one name,
+@@ -168,7 +173,8 @@
+ AVR_INSN (sleep,"", "1001010110001000", 1, AVR_ISA_1200, 0x9588)
+ AVR_INSN (break,"", "1001010110011000", 1, AVR_ISA_BRK, 0x9598)
+ AVR_INSN (wdr, "", "1001010110101000", 1, AVR_ISA_1200, 0x95a8)
+-AVR_INSN (spm, "", "1001010111101000", 1, AVR_ISA_SPM, 0x95e8)
++AVR_INSN (spm, "?", "1001010111101000", 1, AVR_ISA_SPM, 0x95e8)
++AVR_INSN (spm, "z", "10010101111+1000", 1, AVR_ISA_SPMX, 0x95e8)
- insn2 = 0;
- ok = 1;
-@@ -342,14 +357,14 @@ print_insn_avr (bfd_vma addr, disassembl
- cmd_len = 4;
- }
+ AVR_INSN (adc, "r,r", "000111rdddddrrrr", 1, AVR_ISA_1200, 0x1c00)
+ AVR_INSN (add, "r,r", "000011rdddddrrrr", 1, AVR_ISA_1200, 0x0c00)
+@@ -282,3 +288,6 @@
+ AVR_INSN (eicall, "", "1001010100011001", 1, AVR_ISA_EIND, 0x9519)
+ AVR_INSN (eijmp, "", "1001010000011001", 1, AVR_ISA_EIND, 0x9419)
-- if (*op && *op != '?')
-+ if (*constraints && *constraints != '?')
- {
-- int regs = REGISTER_P (*op);
-+ int regs = REGISTER_P (*constraints);
++/* DES instruction for encryption and decryption */
++AVR_INSN (des, "E", "10010100EEEE1011", 1, AVR_ISA_DES, 0x940B)
++
+--- ./include/elf/avr.h.orig 2008-08-09 07:35:13.000000000 +0200
++++ ./include/elf/avr.h 2009-01-07 17:46:15.000000000 +0100
+@@ -40,6 +40,13 @@
+ #define E_AVR_MACH_AVR5 5
+ #define E_AVR_MACH_AVR51 51
+ #define E_AVR_MACH_AVR6 6
++#define E_AVR_MACH_XMEGA1 101
++#define E_AVR_MACH_XMEGA2 102
++#define E_AVR_MACH_XMEGA3 103
++#define E_AVR_MACH_XMEGA4 104
++#define E_AVR_MACH_XMEGA5 105
++#define E_AVR_MACH_XMEGA6 106
++#define E_AVR_MACH_XMEGA7 107
-- ok = avr_operand (insn, insn2, addr, *op, op1, comment1, 0, &sym_op1, &sym_addr1);
-+ ok = avr_operand (insn, insn2, addr, *constraints, opcode_str, op1, comment1, 0, &sym_op1, &sym_addr1);
+ /* Relocations. */
+ START_RELOC_NUMBERS (elf_avr_reloc_type)
+--- ./gas/doc/c-avr.texi.orig 2009-01-07 17:37:16.000000000 +0100
++++ ./gas/doc/c-avr.texi 2009-01-07 17:46:28.000000000 +0100
+@@ -76,6 +76,19 @@
+ Instruction set avr6 is for the enhanced AVR core with a 3-byte PC (MCU types:
+ atmega2560, atmega2561).
-- if (ok && *(++op) == ',')
-- ok = avr_operand (insn, insn2, addr, *(++op), op2,
-+ if (ok && *(++constraints) == ',')
-+ ok = avr_operand (insn, insn2, addr, *(++constraints), opcode_str, op2,
- *comment1 ? comment2 : comment1, regs, &sym_op2, &sym_addr2);
- }
- }
---- gas/config/tc-avr.c.orig 2008-04-09 14:03:00.411627300 -0600
-+++ gas/config/tc-avr.c 2008-04-09 16:35:42.382096600 -0600
++Instruction set avrxmega4 is for the XMEGA AVR cor with up to 64K program
++memory space and less than 64K data space (MCU types: atxmega64a3).
++
++Instruction set avrxmega5 is for the XMEGA AVR core with up to 64K program
++memory space and greater than 64K data space (MCU types: atxmega64a1).
++
++Instruction set avrxmega6 is for the XMEGA AVR core with up to 256K program
++memory space and less than 64K data space (MCU types: atxmega128a3,
++atxmega256a3, atxmega256a3b).
++
++Instruction set avrxmega7 is for the XMEGA AVR core with up to 256K program
++memory space and greater than 64K data space (MCU types: atxmega128a1).
++
+ @cindex @code{-mall-opcodes} command line option, AVR
+ @item -mall-opcodes
+ Accept all AVR opcodes, even if not supported by @code{-mmcu}.
+--- ./gas/config/tc-avr.c.orig 2009-01-07 17:36:41.000000000 +0100
++++ ./gas/config/tc-avr.c 2009-01-07 17:46:28.000000000 +0100
@@ -27,20 +27,21 @@
struct avr_opcodes_s
@@ -103,10 +111,10 @@ Not committed
};
const char comment_chars[] = ";";
-@@ -64,6 +65,13 @@ static struct mcu_type_s mcu_types[] =
- {"avr51", AVR_ISA_M128, bfd_mach_avr5},
-- {"avr6", AVR_ISA_ALL, bfd_mach_avr6},
-+ {"avr6", AVR_ISA_M256, bfd_mach_avr6},
+@@ -79,6 +80,13 @@
+ {"avr5", AVR_ISA_AVR51, bfd_mach_avr5},
+ {"avr51", AVR_ISA_AVR51, bfd_mach_avr51},
+ {"avr6", AVR_ISA_AVR6, bfd_mach_avr6},
+ {"avrxmega1", AVR_ISA_XMEGA, bfd_mach_avrxmega1},
+ {"avrxmega2", AVR_ISA_XMEGA, bfd_mach_avrxmega2},
+ {"avrxmega3", AVR_ISA_XMEGA, bfd_mach_avrxmega3},
@@ -115,23 +123,33 @@ Not committed
+ {"avrxmega6", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
+ {"avrxmega7", AVR_ISA_XMEGA, bfd_mach_avrxmega7},
{"at90s1200", AVR_ISA_1200, bfd_mach_avr1},
- {"attiny10", AVR_ISA_TINY1, bfd_mach_avr1}, /* XXX -> tn11 */
- {"attiny11", AVR_ISA_TINY1, bfd_mach_avr1},
- {"attiny12", AVR_ISA_TINY1, bfd_mach_avr1},
-@@ -169,8 +180,10 @@ static struct mcu_type_s mcu_types[] =
- {"at90usb1286",AVR_ISA_M128, bfd_mach_avr5},
- {"at90usb1287",AVR_ISA_M128, bfd_mach_avr5},
- {"at94k", AVR_ISA_94K, bfd_mach_avr5},
-- {"atmega2560", AVR_ISA_ALL, bfd_mach_avr6},
-- {"atmega2561", AVR_ISA_ALL, bfd_mach_avr6},
-+ {"atmega2560", AVR_ISA_M256, bfd_mach_avr6},
-+ {"atmega2561", AVR_ISA_M256, bfd_mach_avr6},
-+ {"atxmega64a1", AVR_ISA_XMEGA, bfd_mach_avrxmega2},
-+ {"atxmega128a1", AVR_ISA_XMEGA, bfd_mach_avrxmega3},
+ {"attiny11", AVR_ISA_AVR1, bfd_mach_avr1},
+ {"attiny12", AVR_ISA_AVR1, bfd_mach_avr1},
+@@ -186,6 +194,12 @@
+ {"at90usb1287",AVR_ISA_AVR51, bfd_mach_avr51},
+ {"atmega2560", AVR_ISA_AVR6, bfd_mach_avr6},
+ {"atmega2561", AVR_ISA_AVR6, bfd_mach_avr6},
++ {"atxmega64a3", AVR_ISA_XMEGA, bfd_mach_avrxmega4},
++ {"atxmega64a1", AVR_ISA_XMEGA, bfd_mach_avrxmega5},
++ {"atxmega128a3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
++ {"atxmega256a3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
++ {"atxmega256a3b",AVR_ISA_XMEGA, bfd_mach_avrxmega6},
++ {"atxmega128a1", AVR_ISA_XMEGA, bfd_mach_avrxmega7},
{NULL, 0, 0}
};
-@@ -804,7 +817,12 @@ avr_operand (struct avr_opcodes_s *opcod
+@@ -363,6 +377,10 @@
+ " avr5 - enhanced AVR core with up to 64K program memory\n"
+ " avr51 - enhanced AVR core with up to 128K program memory\n"
+ " avr6 - enhanced AVR core with up to 256K program memory\n"
++ " avrxmega4 - XMEGA, > 64K, <= 128K FLASH, <= 64K RAM\n"
++ " avrxmega5 - XMEGA, > 64K, <= 128K FLASH, > 64K RAM\n"
++ " avrxmega6 - XMEGA, > 128K, <= 256K FLASH, <= 64K RAM\n"
++ " avrxmega7 - XMEGA, > 128K, <= 256K FLASH, > 64K RAM\n"
+ " or immediate microcontroller name.\n"));
+ fprintf (stream,
+ _(" -mall-opcodes accept all AVR opcodes, even if not supported by MCU\n"
+@@ -790,7 +808,12 @@
if (*str == '+')
{
++str;
@@ -145,7 +163,7 @@ Not committed
}
/* attiny26 can do "lpm" and "lpm r,Z" but not "lpm r,Z+". */
-@@ -921,6 +939,16 @@ avr_operand (struct avr_opcodes_s *opcod
+@@ -907,6 +930,16 @@
}
break;
@@ -162,143 +180,127 @@ Not committed
case '?':
break;
---- include/opcode/avr.h.orig 2008-04-09 14:03:00.411627300 -0600
-+++ include/opcode/avr.h 2008-04-09 16:34:28.329060900 -0600
-@@ -30,6 +30,8 @@
- #define AVR_ISA_BRK 0x0400 /* device has BREAK (on-chip debug) */
- #define AVR_ISA_EIND 0x0800 /* device has >128K program memory (none yet) */
- #define AVR_ISA_MOVW 0x1000 /* device has MOVW */
-+#define AVR_ISA_SPMX 0x2000 /* device has SPM Z[+] */
-+#define AVR_ISA_DES 0x4000 /* device has DES */
-
- #define AVR_ISA_TINY1 (AVR_ISA_1200 | AVR_ISA_LPM)
- #define AVR_ISA_PWMx (AVR_ISA_M8 | AVR_ISA_BRK)
-@@ -53,6 +55,8 @@
- #define AVR_ISA_94K (AVR_ISA_M603 | AVR_ISA_MUL | AVR_ISA_MOVW | AVR_ISA_LPMX)
- #define AVR_ISA_M323 (AVR_ISA_M161 | AVR_ISA_BRK)
- #define AVR_ISA_M128 (AVR_ISA_M323 | AVR_ISA_ELPM | AVR_ISA_ELPMX)
-+#define AVR_ISA_M256 (AVR_ISA_M128 | AVR_ISA_EIND)
-+#define AVR_ISA_XMEGA (AVR_ISA_M256 | AVR_ISA_SPMX | AVR_ISA_DES)
-
- #define AVR_ISA_ALL 0xFFFF
-
-@@ -98,6 +102,7 @@
- L - signed pc relative offset from -2048 to 2047
- h - absolute code address (call, jmp)
- S - immediate value from 0 to 7 (S = s << 4)
-+ E - immediate value from 0 to 15, shifted left by 4 (des)
- ? - use this opcode entry if no parameters, else use next opcode entry
-
- Order is important - some binary opcodes have more than one name,
-@@ -158,7 +163,8 @@ AVR_INSN (reti, "", "1001010100011000
- AVR_INSN (sleep,"", "1001010110001000", 1, AVR_ISA_1200, 0x9588)
- AVR_INSN (break,"", "1001010110011000", 1, AVR_ISA_BRK, 0x9598)
- AVR_INSN (wdr, "", "1001010110101000", 1, AVR_ISA_1200, 0x95a8)
--AVR_INSN (spm, "", "1001010111101000", 1, AVR_ISA_SPM, 0x95e8)
-+AVR_INSN (spm, "?", "1001010111101000", 1, AVR_ISA_SPM, 0x95e8)
-+AVR_INSN (spm, "z", "10010101111+1000", 1, AVR_ISA_SPMX, 0x95e8)
-
- AVR_INSN (adc, "r,r", "000111rdddddrrrr", 1, AVR_ISA_1200, 0x1c00)
- AVR_INSN (add, "r,r", "000011rdddddrrrr", 1, AVR_ISA_1200, 0x0c00)
-@@ -272,3 +278,6 @@ AVR_INSN (st, "e,r", "100!001rrrrree-+
- AVR_INSN (eicall, "", "1001010100011001", 1, AVR_ISA_EIND, 0x9519)
- AVR_INSN (eijmp, "", "1001010000011001", 1, AVR_ISA_EIND, 0x9419)
-
-+/* DES instruction for encryption and decryption */
-+AVR_INSN (des, "E", "10010100EEEE1011", 1, AVR_ISA_DES, 0x940B)
+--- ./ld/emulparams/avrxmega6.sh.orig 2009-01-07 17:46:15.000000000 +0100
++++ ./ld/emulparams/avrxmega6.sh 2009-01-07 17:46:15.000000000 +0100
+@@ -0,0 +1,12 @@
++ARCH=avr:106
++MACHINE=
++SCRIPT_NAME=avr
++OUTPUT_FORMAT="elf32-avr"
++MAXPAGESIZE=1
++EMBEDDED=yes
++TEMPLATE_NAME=elf32
+
-Index: bfd/archures.c
-===================================================================
-RCS file: /cvs/src/src/bfd/archures.c,v
-retrieving revision 1.130
-diff -a -u -p -r1.130 archures.c
---- bfd/archures.c 4 Feb 2008 19:15:50 -0000 1.130
-+++ bfd/archures.c 14 Feb 2008 18:01:43 -0000
-@@ -352,6 +352,13 @@ DESCRIPTION
- .#define bfd_mach_avr4 4
- .#define bfd_mach_avr5 5
- .#define bfd_mach_avr6 6
-+.#define bfd_mach_avrxmega1 101
-+.#define bfd_mach_avrxmega2 102
-+.#define bfd_mach_avrxmega3 103
-+.#define bfd_mach_avrxmega4 104
-+.#define bfd_mach_avrxmega5 105
-+.#define bfd_mach_avrxmega6 106
-+.#define bfd_mach_avrxmega7 107
- . bfd_arch_bfin, {* ADI Blackfin *}
- .#define bfd_mach_bfin 1
- . bfd_arch_cr16, {* National Semiconductor CompactRISC (ie CR16). *}
-Index: bfd/cpu-avr.c
-===================================================================
-RCS file: /cvs/src/src/bfd/cpu-avr.c,v
-retrieving revision 1.12
-diff -a -u -p -r1.12 cpu-avr.c
---- bfd/cpu-avr.c 3 Jul 2007 14:26:40 -0000 1.12
-+++ bfd/cpu-avr.c 14 Feb 2008 18:01:43 -0000
-@@ -86,7 +86,29 @@ static const bfd_arch_info_type arch_inf
- N (22, bfd_mach_avr5, "avr:5", FALSE, & arch_info_struct[5]),
-
- /* ATmega256x. */
-- N (22, bfd_mach_avr6, "avr:6", FALSE, NULL)
-+ N (22, bfd_mach_avr6, "avr:6", FALSE, & arch_info_struct[6]),
-+
-+ /* Xmega 1 */
-+ N (24, bfd_mach_avrxmega1, "avr:101", FALSE, & arch_info_struct[7]),
++TEXT_LENGTH=1024K
++DATA_ORIGIN=0x802000
++DATA_LENGTH=0xffa0
++EXTRA_EM_FILE=avrelf
+--- ./ld/emulparams/avrxmega7.sh.orig 2009-01-07 17:46:15.000000000 +0100
++++ ./ld/emulparams/avrxmega7.sh 2009-01-07 17:46:15.000000000 +0100
+@@ -0,0 +1,12 @@
++ARCH=avr:107
++MACHINE=
++SCRIPT_NAME=avr
++OUTPUT_FORMAT="elf32-avr"
++MAXPAGESIZE=1
++EMBEDDED=yes
++TEMPLATE_NAME=elf32
+
-+ /* Xmega 2 */
-+ N (24, bfd_mach_avrxmega2, "avr:102", FALSE, & arch_info_struct[8]),
-+
-+ /* Xmega 3 */
-+ N (24, bfd_mach_avrxmega3, "avr:103", FALSE, & arch_info_struct[9]),
-+
-+ /* Xmega 4 */
-+ N (24, bfd_mach_avrxmega4, "avr:104", FALSE, & arch_info_struct[10]),
-+
-+ /* Xmega 5 */
-+ N (24, bfd_mach_avrxmega5, "avr:105", FALSE, & arch_info_struct[11]),
-+
-+ /* Xmega 6 */
-+ N (24, bfd_mach_avrxmega6, "avr:106", FALSE, & arch_info_struct[12]),
-+
-+ /* Xmega 7 */
-+ N (24, bfd_mach_avrxmega7, "avr:107", FALSE, NULL)
-+
- };
-
- const bfd_arch_info_type bfd_avr_arch =
-Index: include/elf/avr.h
-===================================================================
-RCS file: /cvs/src/src/include/elf/avr.h,v
-retrieving revision 1.8
-diff -a -u -p -r1.8 avr.h
---- include/elf/avr.h 24 May 2006 07:36:11 -0000 1.8
-+++ include/elf/avr.h 14 Feb 2008 18:01:44 -0000
-@@ -35,7 +35,14 @@
- #define E_AVR_MACH_AVR3 3
- #define E_AVR_MACH_AVR4 4
- #define E_AVR_MACH_AVR5 5
--#define E_AVR_MACH_AVR6 6
-+#define E_AVR_MACH_AVR6 6
-+#define E_AVR_MACH_XMEGA1 101
-+#define E_AVR_MACH_XMEGA2 102
-+#define E_AVR_MACH_XMEGA3 103
-+#define E_AVR_MACH_XMEGA4 104
-+#define E_AVR_MACH_XMEGA5 105
-+#define E_AVR_MACH_XMEGA6 106
-+#define E_AVR_MACH_XMEGA7 107
-
- /* Relocations. */
- START_RELOC_NUMBERS (elf_avr_reloc_type)
-Index: ld/Makefile.am
-===================================================================
-RCS file: /cvs/src/src/ld/Makefile.am,v
-retrieving revision 1.244
-diff -a -u -p -r1.244 Makefile.am
---- ld/Makefile.am 24 Oct 2007 04:56:47 -0000 1.244
-+++ ld/Makefile.am 14 Feb 2008 18:01:45 -0000
-@@ -138,6 +138,13 @@ ALL_EMULATIONS = \
- eavr4.o \
++TEXT_LENGTH=1024K
++DATA_ORIGIN=0x802000
++DATA_LENGTH=0xffa0
++EXTRA_EM_FILE=avrelf
+--- ./ld/emulparams/avrxmega1.sh.orig 2009-01-07 17:46:15.000000000 +0100
++++ ./ld/emulparams/avrxmega1.sh 2009-01-07 17:46:15.000000000 +0100
+@@ -0,0 +1,12 @@
++ARCH=avr:101
++MACHINE=
++SCRIPT_NAME=avr
++OUTPUT_FORMAT="elf32-avr"
++MAXPAGESIZE=1
++EMBEDDED=yes
++TEMPLATE_NAME=elf32
++
++TEXT_LENGTH=1024K
++DATA_ORIGIN=0x802000
++DATA_LENGTH=0xffa0
++EXTRA_EM_FILE=avrelf
+--- ./ld/emulparams/avrxmega4.sh.orig 2009-01-07 17:46:15.000000000 +0100
++++ ./ld/emulparams/avrxmega4.sh 2009-01-07 17:46:15.000000000 +0100
+@@ -0,0 +1,12 @@
++ARCH=avr:104
++MACHINE=
++SCRIPT_NAME=avr
++OUTPUT_FORMAT="elf32-avr"
++MAXPAGESIZE=1
++EMBEDDED=yes
++TEMPLATE_NAME=elf32
++
++TEXT_LENGTH=1024K
++DATA_ORIGIN=0x802000
++DATA_LENGTH=0xffa0
++EXTRA_EM_FILE=avrelf
+--- ./ld/emulparams/avrxmega5.sh.orig 2009-01-07 17:46:15.000000000 +0100
++++ ./ld/emulparams/avrxmega5.sh 2009-01-07 17:46:15.000000000 +0100
+@@ -0,0 +1,12 @@
++ARCH=avr:105
++MACHINE=
++SCRIPT_NAME=avr
++OUTPUT_FORMAT="elf32-avr"
++MAXPAGESIZE=1
++EMBEDDED=yes
++TEMPLATE_NAME=elf32
++
++TEXT_LENGTH=1024K
++DATA_ORIGIN=0x802000
++DATA_LENGTH=0xffa0
++EXTRA_EM_FILE=avrelf
+--- ./ld/emulparams/avrxmega2.sh.orig 2009-01-07 17:46:15.000000000 +0100
++++ ./ld/emulparams/avrxmega2.sh 2009-01-07 17:46:15.000000000 +0100
+@@ -0,0 +1,12 @@
++ARCH=avr:102
++MACHINE=
++SCRIPT_NAME=avr
++OUTPUT_FORMAT="elf32-avr"
++MAXPAGESIZE=1
++EMBEDDED=yes
++TEMPLATE_NAME=elf32
++
++TEXT_LENGTH=1024K
++DATA_ORIGIN=0x802000
++DATA_LENGTH=0xffa0
++EXTRA_EM_FILE=avrelf
+--- ./ld/emulparams/avrxmega3.sh.orig 2009-01-07 17:46:15.000000000 +0100
++++ ./ld/emulparams/avrxmega3.sh 2009-01-07 17:46:15.000000000 +0100
+@@ -0,0 +1,12 @@
++ARCH=avr:103
++MACHINE=
++SCRIPT_NAME=avr
++OUTPUT_FORMAT="elf32-avr"
++MAXPAGESIZE=1
++EMBEDDED=yes
++TEMPLATE_NAME=elf32
++
++TEXT_LENGTH=1024K
++DATA_ORIGIN=0x802000
++DATA_LENGTH=0xffa0
++EXTRA_EM_FILE=avrelf
+--- ./ld/configure.tgt.orig 2008-08-09 07:35:13.000000000 +0200
++++ ./ld/configure.tgt 2009-01-07 17:46:15.000000000 +0100
+@@ -107,7 +107,7 @@
+ xscale-*-elf) targ_emul=armelf
+ ;;
+ avr-*-*) targ_emul=avr2
+- targ_extra_emuls="avr1 avr25 avr3 avr31 avr35 avr4 avr5 avr51 avr6"
++ targ_extra_emuls="avr1 avr25 avr3 avr31 avr35 avr4 avr5 avr51 avr6 avrxmega1 avrxmega2 avrxmega3 avrxmega4 avrxmega5 avrxmega6 avrxmega7"
+ ;;
+ bfin-*-elf) targ_emul=elf32bfin;
+ targ_extra_emuls="elf32bfinfd"
+--- ./ld/Makefile.in.orig 2008-09-09 10:02:19.000000000 +0200
++++ ./ld/Makefile.in 2009-01-07 17:46:15.000000000 +0100
+@@ -393,6 +393,13 @@
eavr5.o \
+ eavr51.o \
eavr6.o \
+ eavrxmega1.o \
+ eavrxmega2.o \
@@ -310,7 +312,7 @@ diff -a -u -p -r1.244 Makefile.am
ecoff_i860.o \
ecoff_sparc.o \
eelf32_spu.o \
-@@ -622,6 +629,34 @@ eavr6.c: $(srcdir)/emulparams/avr6.sh $(
+@@ -1476,6 +1483,34 @@
$(ELF_DEPS) $(srcdir)/scripttempl/avr.sc \
${GEN_DEPENDS}
${GENSCRIPTS} avr6 "$(tdir_avr2)"
@@ -345,16 +347,11 @@ diff -a -u -p -r1.244 Makefile.am
ecoff_i860.c: $(srcdir)/emulparams/coff_i860.sh \
$(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/i860coff.sc ${GEN_DEPENDS}
${GENSCRIPTS} coff_i860 "$(tdir_coff_i860)"
-Index: ld/Makefile.in
-===================================================================
-RCS file: /cvs/src/src/ld/Makefile.in,v
-retrieving revision 1.262
-diff -a -u -p -r1.262 Makefile.in
---- ld/Makefile.in 24 Oct 2007 04:56:47 -0000 1.262
-+++ ld/Makefile.in 14 Feb 2008 18:01:45 -0000
-@@ -385,6 +385,13 @@ ALL_EMULATIONS = \
- eavr4.o \
+--- ./ld/Makefile.am.orig 2008-09-09 10:02:19.000000000 +0200
++++ ./ld/Makefile.am 2009-01-07 17:46:15.000000000 +0100
+@@ -142,6 +142,13 @@
eavr5.o \
+ eavr51.o \
eavr6.o \
+ eavrxmega1.o \
+ eavrxmega2.o \
@@ -366,7 +363,7 @@ diff -a -u -p -r1.262 Makefile.in
ecoff_i860.o \
ecoff_sparc.o \
eelf32_spu.o \
-@@ -1448,6 +1455,34 @@ eavr6.c: $(srcdir)/emulparams/avr6.sh $(
+@@ -646,6 +653,34 @@
$(ELF_DEPS) $(srcdir)/scripttempl/avr.sc \
${GEN_DEPENDS}
${GENSCRIPTS} avr6 "$(tdir_avr2)"
@@ -401,157 +398,220 @@ diff -a -u -p -r1.262 Makefile.in
ecoff_i860.c: $(srcdir)/emulparams/coff_i860.sh \
$(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/i860coff.sc ${GEN_DEPENDS}
${GENSCRIPTS} coff_i860 "$(tdir_coff_i860)"
-Index: ld/configure.tgt
-===================================================================
-RCS file: /cvs/src/src/ld/configure.tgt,v
-retrieving revision 1.217
-diff -a -u -p -r1.217 configure.tgt
---- ld/configure.tgt 1 Feb 2008 17:58:48 -0000 1.217
-+++ ld/configure.tgt 14 Feb 2008 18:01:45 -0000
-@@ -107,7 +107,7 @@ xscale-*-coff) targ_emul=armcoff ;;
- xscale-*-elf) targ_emul=armelf
- ;;
- avr-*-*) targ_emul=avr2
-- targ_extra_emuls="avr1 avr3 avr4 avr5 avr6"
-+ targ_extra_emuls="avr1 avr3 avr4 avr5 avr6 avrxmega1 avrxmega2 avrxmega3 avrxmega4 avrxmega5 avrxmega6 avrxmega7"
- ;;
- bfin-*-elf) targ_emul=elf32bfin;
- targ_extra_emuls="elf32bfinfd"
-Index: ld/emultempl/avrelf.em
-===================================================================
-RCS file: /cvs/src/src/ld/emultempl/avrelf.em,v
-retrieving revision 1.5
-diff -a -u -p -r1.5 avrelf.em
---- ld/emultempl/avrelf.em 17 Aug 2007 13:50:48 -0000 1.5
-+++ ld/emultempl/avrelf.em 14 Feb 2008 18:01:45 -0000
-@@ -71,8 +71,15 @@ avr_elf_${EMULATION_NAME}_before_allocat
+--- ./ld/emultempl/avrelf.em.orig 2008-07-07 02:46:51.000000000 +0200
++++ ./ld/emultempl/avrelf.em 2009-01-07 17:46:15.000000000 +0100
+@@ -71,8 +71,10 @@
gld${EMULATION_NAME}_before_allocation ();
- /* We only need stubs for the avr6 family. */
- if (strcmp ("${EMULATION_NAME}","avr6"))
-+ /* We only need stubs for the avr6 and avrxmega* family. */
++ /* We only need stubs for avr6, avrxmega6, and avrxmega7. */
+ if (strcmp ("${EMULATION_NAME}","avr6")
-+ && strcmp ("${EMULATION_NAME}","avrxmega1")
-+ && strcmp ("${EMULATION_NAME}","avrxmega2")
-+ && strcmp ("${EMULATION_NAME}","avrxmega3")
-+ && strcmp ("${EMULATION_NAME}","avrxmega4")
-+ && strcmp ("${EMULATION_NAME}","avrxmega5")
+ && strcmp ("${EMULATION_NAME}","avrxmega6")
+ && strcmp ("${EMULATION_NAME}","avrxmega7") )
avr_no_stubs = TRUE;
avr_elf_set_global_bfd_parameters ();
---- /dev/null 2008-02-14 11:03:14.488602600 -0700
-+++ ld/emulparams/avrxmega1.sh 2008-02-14 09:08:29.531250000 -0700
-@@ -0,0 +1,12 @@
-+ARCH=avr:101
-+MACHINE=
-+SCRIPT_NAME=avr
-+OUTPUT_FORMAT="elf32-avr"
-+MAXPAGESIZE=1
-+EMBEDDED=yes
-+TEMPLATE_NAME=elf32
+--- ./bfd/cpu-avr.c.orig 2008-08-09 07:35:12.000000000 +0200
++++ ./bfd/cpu-avr.c 2009-01-07 17:46:15.000000000 +0100
+@@ -126,7 +126,29 @@
+ N (22, bfd_mach_avr51, "avr:51", FALSE, & arch_info_struct[9]),
+
+ /* 3-Byte PC. */
+- N (22, bfd_mach_avr6, "avr:6", FALSE, NULL)
++ N (22, bfd_mach_avr6, "avr:6", FALSE, & arch_info_struct[10]),
++
++ /* Xmega 1 */
++ N (24, bfd_mach_avrxmega1, "avr:101", FALSE, & arch_info_struct[11]),
+
-+TEXT_LENGTH=1024K
-+DATA_ORIGIN=0x802000
-+DATA_LENGTH=0xffa0
-+EXTRA_EM_FILE=avrelf
---- /dev/null 2008-02-14 11:03:18.394502600 -0700
-+++ ld/emulparams/avrxmega2.sh 2008-02-14 09:08:29.546875000 -0700
-@@ -0,0 +1,12 @@
-+ARCH=avr:102
-+MACHINE=
-+SCRIPT_NAME=avr
-+OUTPUT_FORMAT="elf32-avr"
-+MAXPAGESIZE=1
-+EMBEDDED=yes
-+TEMPLATE_NAME=elf32
++ /* Xmega 2 */
++ N (24, bfd_mach_avrxmega2, "avr:102", FALSE, & arch_info_struct[12]),
++
++ /* Xmega 3 */
++ N (24, bfd_mach_avrxmega3, "avr:103", FALSE, & arch_info_struct[13]),
++
++ /* Xmega 4 */
++ N (24, bfd_mach_avrxmega4, "avr:104", FALSE, & arch_info_struct[14]),
++
++ /* Xmega 5 */
++ N (24, bfd_mach_avrxmega5, "avr:105", FALSE, & arch_info_struct[15]),
++
++ /* Xmega 6 */
++ N (24, bfd_mach_avrxmega6, "avr:106", FALSE, & arch_info_struct[16]),
++
++ /* Xmega 7 */
++ N (24, bfd_mach_avrxmega7, "avr:107", FALSE, NULL)
++
+ };
+
+ const bfd_arch_info_type bfd_avr_arch =
+--- ./bfd/archures.c.orig 2008-08-09 07:35:12.000000000 +0200
++++ ./bfd/archures.c 2009-01-07 17:46:15.000000000 +0100
+@@ -357,6 +357,13 @@
+ .#define bfd_mach_avr5 5
+ .#define bfd_mach_avr51 51
+ .#define bfd_mach_avr6 6
++.#define bfd_mach_avrxmega1 101
++.#define bfd_mach_avrxmega2 102
++.#define bfd_mach_avrxmega3 103
++.#define bfd_mach_avrxmega4 104
++.#define bfd_mach_avrxmega5 105
++.#define bfd_mach_avrxmega6 106
++.#define bfd_mach_avrxmega7 107
+ . bfd_arch_bfin, {* ADI Blackfin *}
+ .#define bfd_mach_bfin 1
+ . bfd_arch_cr16, {* National Semiconductor CompactRISC (ie CR16). *}
+--- ./bfd/elf32-avr.c.orig 2008-08-09 07:35:12.000000000 +0200
++++ ./bfd/elf32-avr.c 2009-01-07 17:46:15.000000000 +0100
+@@ -1324,6 +1324,34 @@
+ case bfd_mach_avr6:
+ val = E_AVR_MACH_AVR6;
+ break;
+
-+TEXT_LENGTH=1024K
-+DATA_ORIGIN=0x802000
-+DATA_LENGTH=0xffa0
-+EXTRA_EM_FILE=avrelf
---- /dev/null 2008-02-14 11:03:22.050425000 -0700
-+++ ld/emulparams/avrxmega3.sh 2008-02-14 09:08:29.546875000 -0700
-@@ -0,0 +1,12 @@
-+ARCH=avr:103
-+MACHINE=
-+SCRIPT_NAME=avr
-+OUTPUT_FORMAT="elf32-avr"
-+MAXPAGESIZE=1
-+EMBEDDED=yes
-+TEMPLATE_NAME=elf32
++ case bfd_mach_avrxmega1:
++ val = E_AVR_MACH_XMEGA1;
++ break;
+
-+TEXT_LENGTH=1024K
-+DATA_ORIGIN=0x802000
-+DATA_LENGTH=0xffa0
-+EXTRA_EM_FILE=avrelf
---- /dev/null 2008-02-14 11:03:25.784465400 -0700
-+++ ld/emulparams/avrxmega4.sh 2008-02-14 09:08:29.546875000 -0700
-@@ -0,0 +1,12 @@
-+ARCH=avr:104
-+MACHINE=
-+SCRIPT_NAME=avr
-+OUTPUT_FORMAT="elf32-avr"
-+MAXPAGESIZE=1
-+EMBEDDED=yes
-+TEMPLATE_NAME=elf32
++ case bfd_mach_avrxmega2:
++ val = E_AVR_MACH_XMEGA2;
++ break;
+
-+TEXT_LENGTH=1024K
-+DATA_ORIGIN=0x802000
-+DATA_LENGTH=0xffa0
-+EXTRA_EM_FILE=avrelf
---- /dev/null 2008-02-14 11:03:25.784465400 -0700
-+++ ld/emulparams/avrxmega5.sh 2008-02-14 09:08:29.546875000 -0700
-@@ -0,0 +1,12 @@
-+ARCH=avr:105
-+MACHINE=
-+SCRIPT_NAME=avr
-+OUTPUT_FORMAT="elf32-avr"
-+MAXPAGESIZE=1
-+EMBEDDED=yes
-+TEMPLATE_NAME=elf32
++ case bfd_mach_avrxmega3:
++ val = E_AVR_MACH_XMEGA3;
++ break;
+
-+TEXT_LENGTH=1024K
-+DATA_ORIGIN=0x802000
-+DATA_LENGTH=0xffa0
-+EXTRA_EM_FILE=avrelf
---- /dev/null 2008-02-14 11:03:25.784465400 -0700
-+++ ld/emulparams/avrxmega6.sh 2008-02-14 09:08:29.546875000 -0700
-@@ -0,0 +1,12 @@
-+ARCH=avr:106
-+MACHINE=
-+SCRIPT_NAME=avr
-+OUTPUT_FORMAT="elf32-avr"
-+MAXPAGESIZE=1
-+EMBEDDED=yes
-+TEMPLATE_NAME=elf32
++ case bfd_mach_avrxmega4:
++ val = E_AVR_MACH_XMEGA4;
++ break;
+
-+TEXT_LENGTH=1024K
-+DATA_ORIGIN=0x802000
-+DATA_LENGTH=0xffa0
-+EXTRA_EM_FILE=avrelf
---- /dev/null 2008-02-14 11:03:25.784465400 -0700
-+++ ld/emulparams/avrxmega7.sh 2008-02-14 09:08:29.546875000 -0700
-@@ -0,0 +1,12 @@
-+ARCH=avr:107
-+MACHINE=
-+SCRIPT_NAME=avr
-+OUTPUT_FORMAT="elf32-avr"
-+MAXPAGESIZE=1
-+EMBEDDED=yes
-+TEMPLATE_NAME=elf32
++ case bfd_mach_avrxmega5:
++ val = E_AVR_MACH_XMEGA5;
++ break;
+
-+TEXT_LENGTH=1024K
-+DATA_ORIGIN=0x802000
-+DATA_LENGTH=0xffa0
-+EXTRA_EM_FILE=avrelf
---- bfd/bfd-in2.h~ 2007-08-06 21:59:15.000000000 +0200
-+++ bfd/bfd-in2.h 2008-07-22 17:55:46.000000000 +0200
-@@ -2017,6 +2017,13 @@
- #define bfd_mach_avr4 4
++ case bfd_mach_avrxmega6:
++ val = E_AVR_MACH_XMEGA6;
++ break;
++
++ case bfd_mach_avrxmega7:
++ val = E_AVR_MACH_XMEGA7;
++ break;
+ }
+
+ elf_elfheader (abfd)->e_machine = EM_AVR;
+@@ -1386,6 +1414,34 @@
+ case E_AVR_MACH_AVR6:
+ e_set = bfd_mach_avr6;
+ break;
++
++ case E_AVR_MACH_XMEGA1:
++ e_set = bfd_mach_avrxmega1;
++ break;
++
++ case E_AVR_MACH_XMEGA2:
++ e_set = bfd_mach_avrxmega2;
++ break;
++
++ case E_AVR_MACH_XMEGA3:
++ e_set = bfd_mach_avrxmega3;
++ break;
++
++ case E_AVR_MACH_XMEGA4:
++ e_set = bfd_mach_avrxmega4;
++ break;
++
++ case E_AVR_MACH_XMEGA5:
++ e_set = bfd_mach_avrxmega5;
++ break;
++
++ case E_AVR_MACH_XMEGA6:
++ e_set = bfd_mach_avrxmega6;
++ break;
++
++ case E_AVR_MACH_XMEGA7:
++ e_set = bfd_mach_avrxmega7;
++ break;
+ }
+ }
+ return bfd_default_set_arch_mach (abfd, bfd_arch_avr,
+--- ./opcodes/avr-dis.c.orig 2007-07-05 11:49:00.000000000 +0200
++++ ./opcodes/avr-dis.c 2009-01-07 17:46:15.000000000 +0100
+@@ -50,7 +50,7 @@
+
+ static int
+ avr_operand (unsigned int insn, unsigned int insn2, unsigned int pc, int constraint,
+- char *buf, char *comment, int regs, int *sym, bfd_vma *sym_addr)
++ char *opcode_str, char *buf, char *comment, int regs, int *sym, bfd_vma *sym_addr)
+ {
+ int ok = 1;
+ *sym = 0;
+@@ -118,8 +118,18 @@
+
+ case 'z':
+ *buf++ = 'Z';
+- if (insn & 0x1)
+- *buf++ = '+';
++
++ /* Check for post-increment. */
++ char *s;
++ for (s = opcode_str; *s; ++s)
++ {
++ if (*s == '+')
++ {
++ *buf++ = '+';
++ break;
++ }
++ }
++
+ *buf = '\0';
+ if (AVR_UNDEF_P (insn))
+ sprintf (comment, _("undefined"));
+@@ -226,6 +236,10 @@
+ sprintf (comment, "%d", x);
+ }
+ break;
++
++ case 'E':
++ sprintf (buf, "%d", (insn >> 4) & 15);
++ break;
+
+ case '?':
+ *buf = '\0';
+@@ -331,7 +345,8 @@
+
+ if (opcode->name)
+ {
+- char *op = opcode->constraints;
++ char *constraints = opcode->constraints;
++ char *opcode_str = opcode->opcode;
+
+ insn2 = 0;
+ ok = 1;
+@@ -342,14 +357,14 @@
+ cmd_len = 4;
+ }
+
+- if (*op && *op != '?')
++ if (*constraints && *constraints != '?')
+ {
+- int regs = REGISTER_P (*op);
++ int regs = REGISTER_P (*constraints);
+
+- ok = avr_operand (insn, insn2, addr, *op, op1, comment1, 0, &sym_op1, &sym_addr1);
++ ok = avr_operand (insn, insn2, addr, *constraints, opcode_str, op1, comment1, 0, &sym_op1, &sym_addr1);
+
+- if (ok && *(++op) == ',')
+- ok = avr_operand (insn, insn2, addr, *(++op), op2,
++ if (ok && *(++constraints) == ',')
++ ok = avr_operand (insn, insn2, addr, *(++constraints), opcode_str, op2,
+ *comment1 ? comment2 : comment1, regs, &sym_op2, &sym_addr2);
+ }
+ }
+--- ./bfd/bfd-in2.h.orig 2009-01-08 17:41:43.000000000 +0100
++++ ./bfd/bfd-in2.h 2009-01-08 17:42:06.000000000 +0100
+@@ -1979,6 +1979,13 @@
#define bfd_mach_avr5 5
+ #define bfd_mach_avr51 51
#define bfd_mach_avr6 6
+#define bfd_mach_avrxmega1 101
+#define bfd_mach_avrxmega2 102