On Sunday, February 2, 2020, Joaquin de Andres <m...@xcancerberox.com.ar> wrote:
> On 1/31/20 1:02 AM, Aleksandar Markovic wrote: > >> From: Michael Rolnik <mrol...@gmail.com> >> >> AVR core types are: >> >> - avr1 >> - avr2 >> - avr25 >> - avr3 >> - avr31 >> - avr35 >> - avr4 >> - avr5 >> - avr51 >> - avr6 >> - avrtiny >> - xmega2 >> - xmega3 >> - xmega4 >> - xmega5 >> - xmega6 >> - xmega7 >> >> Each core type covers multiple AVR MCUs, mentioned in the comments >> before definition of particular AVR core type (part of this patch). >> >> AVR core type defines shared features that are valid for all AVR >> MCUs belonging in that type. >> >> [AM: Split a larger AVR introduction patch into logical units] >> Suggested-by: Aleksandar Markovic <aleksandar.m.m...@gmail.com> >> >> Co-developed-by: Michael Rolnik <mrol...@gmail.com> >> Co-developed-by: Sarah Harris <s.e.har...@kent.ac.uk> >> Signed-off-by: Michael Rolnik <mrol...@gmail.com> >> Signed-off-by: Sarah Harris <s.e.har...@kent.ac.uk> >> Signed-off-by: Michael Rolnik <mrol...@gmail.com> >> Acked-by: Igor Mammedov <imamm...@redhat.com> >> Tested-by: Philippe Mathieu-Daudé <phi...@redhat.com> >> Signed-off-by: Richard Henderson <richard.hender...@linaro.org> >> Signed-off-by: Aleksandar Markovic <aleksandar.m.m...@gmail.com> >> --- >> target/avr/cpu.c | 601 ++++++++++++++++++++++++++++++ >> +++++++++++++++++++++++++ >> 1 file changed, 601 insertions(+) >> >> diff --git a/target/avr/cpu.c b/target/avr/cpu.c >> index f41a887..e0ae055 100644 >> --- a/target/avr/cpu.c >> +++ b/target/avr/cpu.c >> @@ -215,3 +215,604 @@ static void avr_cpu_class_init(ObjectClass *oc, >> void *data) >> cc->gdb_num_core_regs = 35; >> cc->gdb_core_xml_file = "avr-cpu.xml"; >> } >> + >> +/* >> + * Setting features of AVR core type avr1 >> + * -------------------------------------- >> + * >> + * This type of AVR core is present in the following AVR MCUs: >> + * >> + * at90s1200, attiny11, attiny12, attiny15, attiny28 >> + */ >> +static void avr_avr1_initfn(Object *obj) >> +{ >> + AVRCPU *cpu = AVR_CPU(obj); >> + CPUAVRState *env = &cpu->env; >> + >> + set_avr_feature(env, AVR_FEATURE_LPM); >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_SP); >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_PC); >> +} >> + >> +/* >> + * Setting features of AVR core type avr2 >> + * -------------------------------------- >> + * >> + * This type of AVR core is present in the following AVR MCUs: >> + * >> + * at90s2313, at90s2323, at90s2333, at90s2343, attiny22, attiny26, >> at90s4414, >> + * at90s4433, at90s4434, at90s8515, at90c8534, at90s8535 >> + */ >> +static void avr_avr2_initfn(Object *obj) >> +{ >> + AVRCPU *cpu = AVR_CPU(obj); >> + CPUAVRState *env = &cpu->env; >> + >> + set_avr_feature(env, AVR_FEATURE_LPM); >> + set_avr_feature(env, AVR_FEATURE_IJMP_ICALL); >> + set_avr_feature(env, AVR_FEATURE_ADIW_SBIW); >> + set_avr_feature(env, AVR_FEATURE_SRAM); >> + set_avr_feature(env, AVR_FEATURE_BREAK); >> + >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_PC); >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_SP); >> +} >> + >> +/* >> + * Setting features of AVR core type avr25 >> + * -------------------------------------- >> + * >> + * This type of AVR core is present in the following AVR MCUs: >> + * >> + * ata5272, ata6616c, attiny13, attiny13a, attiny2313, attiny2313a, >> attiny24, >> + * attiny24a, attiny4313, attiny44, attiny44a, attiny441, attiny84, >> attiny84a, >> + * attiny25, attiny45, attiny85, attiny261, attiny261a, attiny461, >> attiny461a, >> + * attiny861, attiny861a, attiny43u, attiny87, attiny48, attiny88, >> attiny828, >> + * attiny841, at86rf401 >> + */ >> +static void avr_avr25_initfn(Object *obj) >> +{ >> + AVRCPU *cpu = AVR_CPU(obj); >> + CPUAVRState *env = &cpu->env; >> + >> + set_avr_feature(env, AVR_FEATURE_LPM); >> + set_avr_feature(env, AVR_FEATURE_IJMP_ICALL); >> + set_avr_feature(env, AVR_FEATURE_ADIW_SBIW); >> + set_avr_feature(env, AVR_FEATURE_SRAM); >> + set_avr_feature(env, AVR_FEATURE_BREAK); >> + >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_PC); >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_SP); >> + set_avr_feature(env, AVR_FEATURE_LPMX); >> + set_avr_feature(env, AVR_FEATURE_MOVW); >> +} >> + >> +/* >> + * Setting features of AVR core type avr3 >> + * -------------------------------------- >> + * >> + * This type of AVR core is present in the following AVR MCUs: >> + * >> + * at43usb355, at76c711 >> + */ >> +static void avr_avr3_initfn(Object *obj) >> +{ >> + AVRCPU *cpu = AVR_CPU(obj); >> + CPUAVRState *env = &cpu->env; >> + >> + set_avr_feature(env, AVR_FEATURE_LPM); >> + set_avr_feature(env, AVR_FEATURE_IJMP_ICALL); >> + set_avr_feature(env, AVR_FEATURE_ADIW_SBIW); >> + set_avr_feature(env, AVR_FEATURE_SRAM); >> + set_avr_feature(env, AVR_FEATURE_BREAK); >> + >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_PC); >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_SP); >> + set_avr_feature(env, AVR_FEATURE_JMP_CALL); >> +} >> + >> +/* >> + * Setting features of AVR core type avr31 >> + * -------------------------------------- >> + * >> + * This type of AVR core is present in the following AVR MCUs: >> + * >> + * atmega103, at43usb320 >> + */ >> +static void avr_avr31_initfn(Object *obj) >> +{ >> + AVRCPU *cpu = AVR_CPU(obj); >> + CPUAVRState *env = &cpu->env; >> + >> + set_avr_feature(env, AVR_FEATURE_LPM); >> + set_avr_feature(env, AVR_FEATURE_IJMP_ICALL); >> + set_avr_feature(env, AVR_FEATURE_ADIW_SBIW); >> + set_avr_feature(env, AVR_FEATURE_SRAM); >> + set_avr_feature(env, AVR_FEATURE_BREAK); >> + >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_PC); >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_SP); >> + set_avr_feature(env, AVR_FEATURE_RAMPZ); >> + set_avr_feature(env, AVR_FEATURE_ELPM); >> + set_avr_feature(env, AVR_FEATURE_JMP_CALL); >> +} >> + >> +/* >> + * Setting features of AVR core type avr35 >> + * -------------------------------------- >> + * >> + * This type of AVR core is present in the following AVR MCUs: >> + * >> + * ata5505, ata6617c, ata664251, at90usb82, at90usb162, atmega8u2, >> atmega16u2, >> + * atmega32u2, attiny167, attiny1634 >> + */ >> +static void avr_avr35_initfn(Object *obj) >> +{ >> + AVRCPU *cpu = AVR_CPU(obj); >> + CPUAVRState *env = &cpu->env; >> + >> + set_avr_feature(env, AVR_FEATURE_LPM); >> + set_avr_feature(env, AVR_FEATURE_IJMP_ICALL); >> + set_avr_feature(env, AVR_FEATURE_ADIW_SBIW); >> + set_avr_feature(env, AVR_FEATURE_SRAM); >> + set_avr_feature(env, AVR_FEATURE_BREAK); >> + >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_PC); >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_SP); >> + set_avr_feature(env, AVR_FEATURE_JMP_CALL); >> + set_avr_feature(env, AVR_FEATURE_LPMX); >> + set_avr_feature(env, AVR_FEATURE_MOVW); >> +} >> + >> +/* >> + * Setting features of AVR core type avr4 >> + * -------------------------------------- >> + * >> + * This type of AVR core is present in the following AVR MCUs: >> + * >> + * ata6285, ata6286, ata6289, ata6612c, atmega8, atmega8a, atmega48, >> atmega48a, >> + * atmega48p, atmega48pa, atmega48pb, atmega88, atmega88a, atmega88p, >> + * atmega88pa, atmega88pb, atmega8515, atmega8535, atmega8hva, at90pwm1, >> + * at90pwm2, at90pwm2b, at90pwm3, at90pwm3b, at90pwm81 >> + */ >> +static void avr_avr4_initfn(Object *obj) >> +{ >> + AVRCPU *cpu = AVR_CPU(obj); >> + CPUAVRState *env = &cpu->env; >> + >> + set_avr_feature(env, AVR_FEATURE_LPM); >> + set_avr_feature(env, AVR_FEATURE_IJMP_ICALL); >> + set_avr_feature(env, AVR_FEATURE_ADIW_SBIW); >> + set_avr_feature(env, AVR_FEATURE_SRAM); >> + set_avr_feature(env, AVR_FEATURE_BREAK); >> + >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_PC); >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_SP); >> + set_avr_feature(env, AVR_FEATURE_LPMX); >> + set_avr_feature(env, AVR_FEATURE_MOVW); >> + set_avr_feature(env, AVR_FEATURE_MUL); >> +} >> + >> +/* >> + * Setting features of AVR core type avr5 >> + * -------------------------------------- >> + * >> + * This type of AVR core is present in the following AVR MCUs: >> + * >> + * ata5702m322, ata5782, ata5790, ata5790n, ata5791, ata5795, ata5831, >> ata6613c, >> + * ata6614q, ata8210, ata8510, atmega16, atmega16a, atmega161, atmega162, >> + * atmega163, atmega164a, atmega164p, atmega164pa, atmega165, atmega165a, >> + * atmega165p, atmega165pa, atmega168, atmega168a, atmega168p, >> atmega168pa, >> + * atmega168pb, atmega169, atmega169a, atmega169p, atmega169pa, >> atmega16hvb, >> + * atmega16hvbrevb, atmega16m1, atmega16u4, atmega32a, atmega32, >> atmega323, >> + * atmega324a, atmega324p, atmega324pa, atmega325, atmega325a, >> atmega325p, >> + * atmega325pa, atmega3250, atmega3250a, atmega3250p, atmega3250pa, >> atmega328, >> + * atmega328p, atmega328pb, atmega329, atmega329a, atmega329p, >> atmega329pa, >> + * atmega3290, atmega3290a, atmega3290p, atmega3290pa, atmega32c1, >> atmega32m1, >> + * atmega32u4, atmega32u6, atmega406, atmega64, atmega64a, atmega640, >> atmega644, >> + * atmega644a, atmega644p, atmega644pa, atmega645, atmega645a, >> atmega645p, >> + * atmega6450, atmega6450a, atmega6450p, atmega649, atmega649a, >> atmega649p, >> + * atmega6490, atmega16hva, atmega16hva2, atmega32hvb, atmega6490a, >> atmega6490p, >> + * atmega64c1, atmega64m1, atmega64hve, atmega64hve2, atmega64rfr2, >> + * atmega644rfr2, atmega32hvbrevb, at90can32, at90can64, at90pwm161, >> at90pwm216, >> + * at90pwm316, at90scr100, at90usb646, at90usb647, at94k, m3000 >> + */ >> +static void avr_avr5_initfn(Object *obj) >> +{ >> + AVRCPU *cpu = AVR_CPU(obj); >> + CPUAVRState *env = &cpu->env; >> + >> + set_avr_feature(env, AVR_FEATURE_LPM); >> + set_avr_feature(env, AVR_FEATURE_IJMP_ICALL); >> + set_avr_feature(env, AVR_FEATURE_ADIW_SBIW); >> + set_avr_feature(env, AVR_FEATURE_SRAM); >> + set_avr_feature(env, AVR_FEATURE_BREAK); >> + >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_PC); >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_SP); >> + set_avr_feature(env, AVR_FEATURE_JMP_CALL); >> + set_avr_feature(env, AVR_FEATURE_LPMX); >> + set_avr_feature(env, AVR_FEATURE_MOVW); >> + set_avr_feature(env, AVR_FEATURE_MUL); >> +} >> + >> +/* >> + * Setting features of AVR core type avr51 >> + * -------------------------------------- >> + * >> + * This type of AVR core is present in the following AVR MCUs: >> + * >> + * atmega128, atmega128a, atmega1280, atmega1281, atmega1284, >> atmega1284p, >> + * atmega128rfa1, atmega128rfr2, atmega1284rfr2, at90can128, at90usb1286, >> + * at90usb1287 >> + */ >> +static void avr_avr51_initfn(Object *obj) >> +{ >> + AVRCPU *cpu = AVR_CPU(obj); >> + CPUAVRState *env = &cpu->env; >> + >> + set_avr_feature(env, AVR_FEATURE_LPM); >> + set_avr_feature(env, AVR_FEATURE_IJMP_ICALL); >> + set_avr_feature(env, AVR_FEATURE_ADIW_SBIW); >> + set_avr_feature(env, AVR_FEATURE_SRAM); >> + set_avr_feature(env, AVR_FEATURE_BREAK); >> + >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_PC); >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_SP); >> + set_avr_feature(env, AVR_FEATURE_RAMPZ); >> + set_avr_feature(env, AVR_FEATURE_ELPMX); >> + set_avr_feature(env, AVR_FEATURE_ELPM); >> + set_avr_feature(env, AVR_FEATURE_JMP_CALL); >> + set_avr_feature(env, AVR_FEATURE_LPMX); >> + set_avr_feature(env, AVR_FEATURE_MOVW); >> + set_avr_feature(env, AVR_FEATURE_MUL); >> +} >> + >> +/* >> + * Setting features of AVR core type avr6 >> + * -------------------------------------- >> + * >> + * This type of AVR core is present in the following AVR MCUs: >> + * >> + * atmega2560, atmega2561, atmega256rfr2, atmega2564rfr2 >> + */ >> +static void avr_avr6_initfn(Object *obj) >> +{ >> + AVRCPU *cpu = AVR_CPU(obj); >> + CPUAVRState *env = &cpu->env; >> + >> + set_avr_feature(env, AVR_FEATURE_LPM); >> + set_avr_feature(env, AVR_FEATURE_IJMP_ICALL); >> + set_avr_feature(env, AVR_FEATURE_ADIW_SBIW); >> + set_avr_feature(env, AVR_FEATURE_SRAM); >> + set_avr_feature(env, AVR_FEATURE_BREAK); >> + >> + set_avr_feature(env, AVR_FEATURE_3_BYTE_PC); >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_SP); >> + set_avr_feature(env, AVR_FEATURE_RAMPZ); >> + set_avr_feature(env, AVR_FEATURE_EIJMP_EICALL); >> + set_avr_feature(env, AVR_FEATURE_ELPMX); >> + set_avr_feature(env, AVR_FEATURE_ELPM); >> + set_avr_feature(env, AVR_FEATURE_JMP_CALL); >> + set_avr_feature(env, AVR_FEATURE_LPMX); >> + set_avr_feature(env, AVR_FEATURE_MOVW); >> + set_avr_feature(env, AVR_FEATURE_MUL); >> +} >> + >> +/* >> + * Setting features of AVR core type avrtiny >> + * -------------------------------------- >> + * >> + * This type of AVR core is present in the following AVR MCUs: >> + * >> + * attiny4, attiny5, attiny9, attiny10, attiny20, attiny40 >> + */ >> +static void avr_avrtiny_initfn(Object *obj) >> +{ >> + AVRCPU *cpu = AVR_CPU(obj); >> + CPUAVRState *env = &cpu->env; >> + >> + set_avr_feature(env, AVR_FEATURE_LPM); >> + set_avr_feature(env, AVR_FEATURE_IJMP_ICALL); >> + set_avr_feature(env, AVR_FEATURE_BREAK); >> + >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_PC); >> + set_avr_feature(env, AVR_FEATURE_1_BYTE_SP); >> +} >> + >> +/* >> + * Setting features of AVR core type xmega2 >> + * -------------------------------------- >> + * >> + * This type of AVR core is present in the following AVR MCUs: >> + * >> + * atxmega8e5, atxmega16a4, atxmega16d4, atxmega16e5, atxmega32a4, >> atxmega32c3, >> + * atxmega32d3, atxmega32d4, atxmega16a4u, atxmega16c4, atxmega32a4u, >> + * atxmega32c4, atxmega32e5 >> + */ >> +static void avr_xmega2_initfn(Object *obj) >> +{ >> + AVRCPU *cpu = AVR_CPU(obj); >> + CPUAVRState *env = &cpu->env; >> + >> + set_avr_feature(env, AVR_FEATURE_LPM); >> + set_avr_feature(env, AVR_FEATURE_IJMP_ICALL); >> + set_avr_feature(env, AVR_FEATURE_ADIW_SBIW); >> + set_avr_feature(env, AVR_FEATURE_SRAM); >> + set_avr_feature(env, AVR_FEATURE_BREAK); >> + >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_PC); >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_SP); >> + set_avr_feature(env, AVR_FEATURE_JMP_CALL); >> + set_avr_feature(env, AVR_FEATURE_LPMX); >> + set_avr_feature(env, AVR_FEATURE_MOVW); >> + set_avr_feature(env, AVR_FEATURE_MUL); >> + set_avr_feature(env, AVR_FEATURE_RMW); >> +} >> + >> +/* >> + * Setting features of AVR core type xmega3 >> + * -------------------------------------- >> + * >> + * This type of AVR core is present in the following AVR MCUs: >> + * >> + * attiny212, attiny214, attiny412, attiny414, attiny416, attiny417, >> attiny814, >> + * attiny816, attiny817, attiny1614, attiny1616, attiny1617, attiny3214, >> + * attiny3216, attiny3217, atmega808, atmega809, atmega1608, atmega1609, >> + * atmega3208, atmega3209, atmega4808, atmega4809 >> + */ >> +static void avr_xmega3_initfn(Object *obj) >> +{ >> + AVRCPU *cpu = AVR_CPU(obj); >> + CPUAVRState *env = &cpu->env; >> + >> + set_avr_feature(env, AVR_FEATURE_LPM); >> + set_avr_feature(env, AVR_FEATURE_IJMP_ICALL); >> + set_avr_feature(env, AVR_FEATURE_ADIW_SBIW); >> + set_avr_feature(env, AVR_FEATURE_SRAM); >> + set_avr_feature(env, AVR_FEATURE_BREAK); >> + >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_PC); >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_SP); >> + set_avr_feature(env, AVR_FEATURE_JMP_CALL); >> + set_avr_feature(env, AVR_FEATURE_LPMX); >> + set_avr_feature(env, AVR_FEATURE_MOVW); >> + set_avr_feature(env, AVR_FEATURE_MUL); >> + set_avr_feature(env, AVR_FEATURE_RMW); >> +} >> + >> +/* >> + * Setting features of AVR core type xmega4 >> + * -------------------------------------- >> + * >> + * This type of AVR core is present in the following AVR MCUs: >> + * >> + * atxmega64a3, atxmega64d3, atxmega64a3u, atxmega64a4u, atxmega64b1, >> + * atxmega64b3, atxmega64c3, atxmega64d4 >> + */ >> +static void avr_xmega4_initfn(Object *obj) >> +{ >> + AVRCPU *cpu = AVR_CPU(obj); >> + CPUAVRState *env = &cpu->env; >> + >> + set_avr_feature(env, AVR_FEATURE_LPM); >> + set_avr_feature(env, AVR_FEATURE_IJMP_ICALL); >> + set_avr_feature(env, AVR_FEATURE_ADIW_SBIW); >> + set_avr_feature(env, AVR_FEATURE_SRAM); >> + set_avr_feature(env, AVR_FEATURE_BREAK); >> + >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_PC); >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_SP); >> + set_avr_feature(env, AVR_FEATURE_ELPMX); >> + set_avr_feature(env, AVR_FEATURE_ELPM); >> + set_avr_feature(env, AVR_FEATURE_JMP_CALL); >> + set_avr_feature(env, AVR_FEATURE_LPMX); >> + set_avr_feature(env, AVR_FEATURE_MOVW); >> + set_avr_feature(env, AVR_FEATURE_MUL); >> + set_avr_feature(env, AVR_FEATURE_RMW); >> +} >> + >> +/* >> + * Setting features of AVR core type xmega5 >> + * -------------------------------------- >> + * >> + * This type of AVR core is present in the following AVR MCUs: >> + * >> + * atxmega64a1, atxmega64a1u >> + */ >> +static void avr_xmega5_initfn(Object *obj) >> +{ >> + AVRCPU *cpu = AVR_CPU(obj); >> + CPUAVRState *env = &cpu->env; >> + >> + set_avr_feature(env, AVR_FEATURE_LPM); >> + set_avr_feature(env, AVR_FEATURE_IJMP_ICALL); >> + set_avr_feature(env, AVR_FEATURE_ADIW_SBIW); >> + set_avr_feature(env, AVR_FEATURE_SRAM); >> + set_avr_feature(env, AVR_FEATURE_BREAK); >> + >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_PC); >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_SP); >> + set_avr_feature(env, AVR_FEATURE_RAMPD); >> + set_avr_feature(env, AVR_FEATURE_RAMPX); >> + set_avr_feature(env, AVR_FEATURE_RAMPY); >> + set_avr_feature(env, AVR_FEATURE_RAMPZ); >> + set_avr_feature(env, AVR_FEATURE_ELPMX); >> + set_avr_feature(env, AVR_FEATURE_ELPM); >> + set_avr_feature(env, AVR_FEATURE_JMP_CALL); >> + set_avr_feature(env, AVR_FEATURE_LPMX); >> + set_avr_feature(env, AVR_FEATURE_MOVW); >> + set_avr_feature(env, AVR_FEATURE_MUL); >> + set_avr_feature(env, AVR_FEATURE_RMW); >> +} >> + >> +/* >> + * Setting features of AVR core type xmega6 >> + * -------------------------------------- >> + * >> + * This type of AVR core is present in the following AVR MCUs: >> + * >> + * atxmega128a3, atxmega128d3, atxmega192a3, atxmega192d3, atxmega256a3, >> + * atxmega256a3b, atxmega256a3bu, atxmega256d3, atxmega128a3u, >> atxmega128b1, >> + * atxmega128b3, atxmega128c3, atxmega128d4, atxmega192a3u, atxmega192c3, >> + * atxmega256a3u, atxmega256c3, atxmega384c3, atxmega384d3 >> + */ >> +static void avr_xmega6_initfn(Object *obj) >> +{ >> + AVRCPU *cpu = AVR_CPU(obj); >> + CPUAVRState *env = &cpu->env; >> + >> + set_avr_feature(env, AVR_FEATURE_LPM); >> + set_avr_feature(env, AVR_FEATURE_IJMP_ICALL); >> + set_avr_feature(env, AVR_FEATURE_ADIW_SBIW); >> + set_avr_feature(env, AVR_FEATURE_SRAM); >> + set_avr_feature(env, AVR_FEATURE_BREAK); >> + >> + set_avr_feature(env, AVR_FEATURE_3_BYTE_PC); >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_SP); >> + set_avr_feature(env, AVR_FEATURE_RAMPZ); >> + set_avr_feature(env, AVR_FEATURE_EIJMP_EICALL); >> + set_avr_feature(env, AVR_FEATURE_ELPMX); >> + set_avr_feature(env, AVR_FEATURE_ELPM); >> + set_avr_feature(env, AVR_FEATURE_JMP_CALL); >> + set_avr_feature(env, AVR_FEATURE_LPMX); >> + set_avr_feature(env, AVR_FEATURE_MOVW); >> + set_avr_feature(env, AVR_FEATURE_MUL); >> + set_avr_feature(env, AVR_FEATURE_RMW); >> +} >> + >> +/* >> + * Setting features of AVR core type xmega7 >> + * -------------------------------------- >> + * >> + * This type of AVR core is present in the following AVR MCUs: >> + * >> + * atxmega128a1, atxmega128a1u, atxmega128a4u >> + */ >> +static void avr_xmega7_initfn(Object *obj) >> +{ >> + AVRCPU *cpu = AVR_CPU(obj); >> + CPUAVRState *env = &cpu->env; >> + >> + set_avr_feature(env, AVR_FEATURE_LPM); >> + set_avr_feature(env, AVR_FEATURE_IJMP_ICALL); >> + set_avr_feature(env, AVR_FEATURE_ADIW_SBIW); >> + set_avr_feature(env, AVR_FEATURE_SRAM); >> + set_avr_feature(env, AVR_FEATURE_BREAK); >> + >> + set_avr_feature(env, AVR_FEATURE_3_BYTE_PC); >> + set_avr_feature(env, AVR_FEATURE_2_BYTE_SP); >> + set_avr_feature(env, AVR_FEATURE_RAMPD); >> + set_avr_feature(env, AVR_FEATURE_RAMPX); >> + set_avr_feature(env, AVR_FEATURE_RAMPY); >> + set_avr_feature(env, AVR_FEATURE_RAMPZ); >> + set_avr_feature(env, AVR_FEATURE_EIJMP_EICALL); >> + set_avr_feature(env, AVR_FEATURE_ELPMX); >> + set_avr_feature(env, AVR_FEATURE_ELPM); >> + set_avr_feature(env, AVR_FEATURE_JMP_CALL); >> + set_avr_feature(env, AVR_FEATURE_LPMX); >> + set_avr_feature(env, AVR_FEATURE_MOVW); >> + set_avr_feature(env, AVR_FEATURE_MUL); >> + set_avr_feature(env, AVR_FEATURE_RMW); >> +} >> + >> +typedef struct AVRCPUInfo { >> + const char *name; >> + void (*initfn)(Object *obj); >> +} AVRCPUInfo; >> + >> + >> +static void avr_cpu_list_entry(gpointer data, gpointer user_data) >> +{ >> + const char *typename = object_class_get_name(OBJECT_CLASS(data)); >> + >> + qemu_printf("%s\n", typename); >> +} >> + >> +void avr_cpu_list(void) >> +{ >> + GSList *list; >> + list = object_class_get_list_sorted(TYPE_AVR_CPU, false); >> + g_slist_foreach(list, avr_cpu_list_entry, NULL); >> + g_slist_free(list); >> +} >> + >> +#define DEFINE_AVR_CPU_TYPE(model, initfn) \ >> + { \ >> + .parent = TYPE_AVR_CPU, \ >> + .instance_init = initfn, \ >> + .name = AVR_CPU_TYPE_NAME(model), \ >> + } >> + >> +static const TypeInfo avr_cpu_type_info[] = { >> + { >> + .name = TYPE_AVR_CPU, >> + .parent = TYPE_CPU, >> + .instance_size = sizeof(AVRCPU), >> + .instance_init = avr_cpu_initfn, >> + .class_size = sizeof(AVRCPUClass), >> + .class_init = avr_cpu_class_init, >> + .abstract = true, >> + }, >> + DEFINE_AVR_CPU_TYPE("avrtiny", avr_avrtiny_initfn), >> + DEFINE_AVR_CPU_TYPE("avr1", avr_avr1_initfn), >> + DEFINE_AVR_CPU_TYPE("avr2", avr_avr2_initfn), >> + DEFINE_AVR_CPU_TYPE("avr25", avr_avr25_initfn), >> + DEFINE_AVR_CPU_TYPE("avr3", avr_avr3_initfn), >> + DEFINE_AVR_CPU_TYPE("avr31", avr_avr31_initfn), >> + DEFINE_AVR_CPU_TYPE("avr35", avr_avr35_initfn), >> + DEFINE_AVR_CPU_TYPE("avr4", avr_avr4_initfn), >> + DEFINE_AVR_CPU_TYPE("avr5", avr_avr5_initfn), >> + DEFINE_AVR_CPU_TYPE("avr51", avr_avr51_initfn), >> + DEFINE_AVR_CPU_TYPE("avr6", avr_avr6_initfn), >> + DEFINE_AVR_CPU_TYPE("xmega2", avr_xmega2_initfn), >> + DEFINE_AVR_CPU_TYPE("xmega3", avr_xmega3_initfn), >> + DEFINE_AVR_CPU_TYPE("xmega4", avr_xmega4_initfn), >> + DEFINE_AVR_CPU_TYPE("xmega5", avr_xmega5_initfn), >> + DEFINE_AVR_CPU_TYPE("xmega6", avr_xmega6_initfn), >> + DEFINE_AVR_CPU_TYPE("xmega7", avr_xmega7_initfn), >> +}; >> + >> +const char *avr_flags_to_cpu_type(uint32_t flags, const char >> *def_cpu_type) >> +{ >> + switch (flags & EF_AVR_MACH) { >> + case bfd_mach_avr1: >> + return AVR_CPU_TYPE_NAME("avr1"); >> + case bfd_mach_avr2: >> + return AVR_CPU_TYPE_NAME("avr2"); >> + case bfd_mach_avr25: >> + return AVR_CPU_TYPE_NAME("avr25"); >> + case bfd_mach_avr3: >> + return AVR_CPU_TYPE_NAME("avr3"); >> + case bfd_mach_avr31: >> + return AVR_CPU_TYPE_NAME("avr31"); >> + case bfd_mach_avr35: >> + return AVR_CPU_TYPE_NAME("avr35"); >> + case bfd_mach_avr4: >> + return AVR_CPU_TYPE_NAME("avr4"); >> + case bfd_mach_avr5: >> + return AVR_CPU_TYPE_NAME("avr5"); >> + case bfd_mach_avr51: >> + return AVR_CPU_TYPE_NAME("avr51"); >> + case bfd_mach_avr6: >> + return AVR_CPU_TYPE_NAME("avr6"); >> + case bfd_mach_avrtiny: >> + return AVR_CPU_TYPE_NAME("avrtiny"); >> + case bfd_mach_avrxmega2: >> + return AVR_CPU_TYPE_NAME("xmega2"); >> + case bfd_mach_avrxmega3: >> + return AVR_CPU_TYPE_NAME("xmega3"); >> + case bfd_mach_avrxmega4: >> + return AVR_CPU_TYPE_NAME("xmega4"); >> + case bfd_mach_avrxmega5: >> + return AVR_CPU_TYPE_NAME("xmega5"); >> + case bfd_mach_avrxmega6: >> + return AVR_CPU_TYPE_NAME("xmega6"); >> + case bfd_mach_avrxmega7: >> + return AVR_CPU_TYPE_NAME("xmega7"); >> + default: >> + return def_cpu_type; >> + } >> +} >> + >> +DEFINE_TYPES(avr_cpu_type_info) >> >> > Hi! me again. Following the RC2 discussion. I've being looking in the GCC > definition of the architecture and as far as I can understand this > definitions are the generic definitions of the arch families. > > avr_arch_types[] = > { > /* unknown device specified */ > { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0060, 0, 32, NULL, > AVR_MMCU_DEFAULT }, > /* > A M J LM E E E X R T d S FPO S O A > S U M PO L L I M A I a t lMff F ff r > M L P MV P P J E M N t a a s R s c > XW M M M G P Y a r s e e h > X P A D t h t t ID */ > { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0060, 0, 32, "1", "avr1" }, > { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0060, 0, 32, "2", "avr2" }, > { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0x0060, 0, 32, "25", "avr25" }, > { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0x0060, 0, 32, "3", "avr3" }, > { 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0x0060, 0, 32, "31", "avr31" }, > { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0x0060, 0, 32, "35", "avr35" }, > { 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0x0060, 0, 32, "4", "avr4" }, > { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0x0060, 0, 32, "5", "avr5" }, > { 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0x0060, 0, 32, "51", "avr51" }, > { 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0x0060, 0, 32, "6", "avr6" }, > > { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0x0040, 0x4000, 0, "100", "avrtiny"}, > { 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0x2000, 0, 0, "102", "avrxmega2" }, > { 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0x2000, 0x8000, 0, "103", "avrxmega3" }, > { 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0x2000, 0, 0, "104", "avrxmega4" }, > { 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0x2000, 0, 0, "105", "avrxmega5" }, > { 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0x2000, 0, 0, "106", "avrxmega6" }, > { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0x2000, 0, 0, "107", "avrxmega7" } > }; > > And then you have features for the specific microcontrollers: > > AVR_ISA_RMW > AVR_SHORT_SP > AVR_ERRATA_SKIP > AVR_ISA_LDS > AVR_ISA_RCALL > > They are mixed in the file 'avr-mcus.def' for family and microcontroller > definition. Only looking at the family definition: > > AVR_MCU ("avr2", ARCH_AVR2, AVR_ERRATA_SKIP, NULL, > 0x0060, 0x0, 0x60000, 0) > AVR_MCU ("avr25", ARCH_AVR25, AVR_ISA_NONE, NULL, > 0x0060, 0x0, 0x2000, 0) > AVR_MCU ("avr3", ARCH_AVR3, AVR_ISA_NONE, NULL, > 0x0060, 0x0, 0x6000, 0) > AVR_MCU ("avr31", ARCH_AVR31, AVR_ERRATA_SKIP, NULL, > 0x0060, 0x0, 0x20000, 0) > AVR_MCU ("avr35", ARCH_AVR35, AVR_ISA_NONE, NULL, > 0x0100, 0x0, 0x4000, 0) > AVR_MCU ("avr4", ARCH_AVR4, AVR_ISA_NONE, NULL, > 0x0060, 0x0, 0x2000, 0) > AVR_MCU ("avr5", ARCH_AVR5, AVR_ISA_NONE, NULL, > 0x0060, 0x0, 0x4000, 0) > AVR_MCU ("avr51", ARCH_AVR51, AVR_ISA_NONE, NULL, > 0x0100, 0x0, 0x20000, 0) > AVR_MCU ("avr6", ARCH_AVR6, AVR_ISA_NONE, NULL, > 0x0200, 0x0, 0x40000, 0) > AVR_MCU ("avrxmega2", ARCH_AVRXMEGA2, AVR_ISA_NONE, NULL, > 0x2000, 0x0, 0x9000, 0) > AVR_MCU ("avrxmega3", ARCH_AVRXMEGA3, AVR_ISA_NONE, NULL, > 0x3f00, 0x0, 0x8000, 0) > AVR_MCU ("avrxmega4", ARCH_AVRXMEGA4, AVR_ISA_NONE, NULL, > 0x2000, 0x0, 0x11000, 0) > AVR_MCU ("avrxmega5", ARCH_AVRXMEGA5, AVR_ISA_NONE, NULL, > 0x2000, 0x0, 0x11000, 0) > AVR_MCU ("avrxmega6", ARCH_AVRXMEGA6, AVR_ISA_NONE, NULL, > 0x2000, 0x0, 0x60000, 0) > AVR_MCU ("avrxmega7", ARCH_AVRXMEGA7, AVR_ISA_NONE, NULL, > 0x2000, 0x0, 0x22000, 0) > AVR_MCU ("avrtiny", ARCH_AVRTINY, AVR_ISA_NONE, NULL, > 0x0040, 0x0, 0x400, 0) > AVR_MCU ("avr1", ARCH_AVR1, AVR_ISA_NONE, NULL, > 0x0060, 0x0, 0x400, 0) > > I don't really understand how do you get to the proposed family definition > for qemu. Probably is my fault but if you can help me to understand will be > grate! > > Michal, can you really give us more details on how this mapping is done? I alredy asked a similar question a while ago, and then you said you used wikipedia article + avr datasheets. Can you give us more detailed info of the whole process of creating ABRFeature list for a particular AVR core type, and how that compares with the corresponding content in gcc, as Joakin brought to our attention? Thanks, Aleksandar > Regards, > --joa >