Regards,
Michael Rolnik
On Mon, Jan 27, 2020 at 3:27 PM Joaquin de Andres
<m...@xcancerberox.com.ar <mailto:m...@xcancerberox.com.ar>> wrote:
On 1/24/20 1:51 AM, Philippe Mathieu-Daudé wrote:
> From: Michael Rolnik <mrol...@gmail.com <mailto:mrol...@gmail.com>>
>
> This includes:
> - CPU data structures
> - object model classes and functions
> - migration functions
> - GDB hooks
>
> Co-developed-by: Michael Rolnik <mrol...@gmail.com
<mailto:mrol...@gmail.com>>
> Co-developed-by: Sarah Harris <s.e.har...@kent.ac.uk
<mailto:s.e.har...@kent.ac.uk>>
> Signed-off-by: Michael Rolnik <mrol...@gmail.com
<mailto:mrol...@gmail.com>>
> Signed-off-by: Sarah Harris <s.e.har...@kent.ac.uk
<mailto:s.e.har...@kent.ac.uk>>
> Signed-off-by: Michael Rolnik <mrol...@gmail.com
<mailto:mrol...@gmail.com>>
> Acked-by: Igor Mammedov <imamm...@redhat.com
<mailto:imamm...@redhat.com>>
> Tested-by: Philippe Mathieu-Daudé <phi...@redhat.com
<mailto:phi...@redhat.com>>
> Message-Id: <20200118191416.19934-2-mrol...@gmail.com
<mailto:20200118191416.19934-2-mrol...@gmail.com>>
> Signed-off-by: Richard Henderson <richard.hender...@linaro.org
<mailto:richard.hender...@linaro.org>>
> ---
> ...
> diff --git a/target/avr/cpu.c b/target/avr/cpu.c
> new file mode 100644
> index 0000000000..c74c5106fe
> --- /dev/null
> +++ b/target/avr/cpu.c
> @@ -0,0 +1,826 @@
> ...
> +/*
> + * 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;
> +> + avr_set_feature(env, AVR_FEATURE_LPM);
Hi! According to the datasheets the at90s1200 is an special case and the
LPM instruction is not present.
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_SP);
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_PC);
Ok. Checked with at90s1200 datasheet.
> +}
> +
> +/*
> + * 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;
> +
> + avr_set_feature(env, AVR_FEATURE_LPM);
Ok. Checked with at90s2313 datasheet.
> + avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
Ok. Checked with at90s2313 datasheet.
> + avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
Ok. Checked with at90s2313 datasheet.
> + avr_set_feature(env, AVR_FEATURE_SRAM);
Ok. Checked with at90s2313 datasheet.
> + avr_set_feature(env, AVR_FEATURE_BREAK);
> +
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_PC);
Ok. Checked with at90s2313 datasheet.
> + avr_set_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;
> +
> + avr_set_feature(env, AVR_FEATURE_LPM);
Ok. Checked with attiny13 datasheet.
> + avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
Ok. Checked with attiny13 datasheet.
> + avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
Ok. Checked with attiny13 datasheet.
> + avr_set_feature(env, AVR_FEATURE_SRAM);
Ok. Checked with attiny13 datasheet.
> + avr_set_feature(env, AVR_FEATURE_BREAK);
> +
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_PC);
Ok. Checked with attiny13 datasheet.
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_SP);
> + avr_set_feature(env, AVR_FEATURE_LPMX);> +
avr_set_feature(env, AVR_FEATURE_MOVW);
Ok. Checked with attiny13 datasheet.
> +}
> +
> +/*
> + * 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;
> +
> + avr_set_feature(env, AVR_FEATURE_LPM);
Ok. Checked with at43usb355 datasheet.
> + avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);> +
avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
> + avr_set_feature(env, AVR_FEATURE_SRAM);
Ok. Checked with at43usb355 datasheet.
> + avr_set_feature(env, AVR_FEATURE_BREAK);
> +
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_PC);
Ok. Checked with at43usb355 datasheet.
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_SP);
> + avr_set_feature(env, AVR_FEATURE_JMP_CALL);
> +}
I couldn't find the full instruction set for this microcontrollers, but
according with this [1] (not a certainty at all) wikipedia page, all the
instructions in the features are part of the instruction set (BREAK,
ICALL, IJMP, JMP, CALL, ADIW, SBIW).
> +
> +/*
> + * 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;
> +
> + avr_set_feature(env, AVR_FEATURE_LPM);
Ok. Checked with atmega103 datasheet.
> + avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
Ok. Checked with atmega103 datasheet.
> + avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
Ok. Checked with atmega103 datasheet.
> + avr_set_feature(env, AVR_FEATURE_SRAM);
Ok. Checked with atmega103 datasheet.
> + avr_set_feature(env, AVR_FEATURE_BREAK);
> +
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_PC);
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_SP);
> + avr_set_feature(env, AVR_FEATURE_RAMPZ);
Ok. Checked with atmega103 datasheet.
> + avr_set_feature(env, AVR_FEATURE_ELPM);
Ok. Checked with atmega103 datasheet.
> + avr_set_feature(env, AVR_FEATURE_JMP_CALL);
Ok. Checked with atmega103 datasheet.
> +}
> +
> +/*
> + * 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;
> +
> + avr_set_feature(env, AVR_FEATURE_LPM);
Ok. Checked with atmega8u2/16u2/32u2 datasheet.
> + avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
Ok. Checked with atmega8u2/16u2/32u2 datasheet.
> + avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
Ok. Checked with atmega8u2/16u2/32u2 datasheet.
> + avr_set_feature(env, AVR_FEATURE_SRAM);
Ok. Checked with atmega8u2/16u2/32u2 datasheet.
> + avr_set_feature(env, AVR_FEATURE_BREAK);
Ok. Checked with atmega8u2/16u2/32u2 datasheet.
> +
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_PC);
Ok. Checked with atmega8u2/16u2/32u2 datasheet.
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_SP);
> + avr_set_feature(env, AVR_FEATURE_JMP_CALL);
Ok. Checked with atmega8u2/16u2/32u2 datasheet.
> + avr_set_feature(env, AVR_FEATURE_LPMX);
> + avr_set_feature(env, AVR_FEATURE_MOVW);
Ok. Checked with atmega8u2/16u2/32u2 datasheet.
> +}
> +
> +/*
> + * 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;
> +
> + avr_set_feature(env, AVR_FEATURE_LPM);
Ok. Checked with atmega8 datasheet.
> + avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
Ok. Checked with atmega8 datasheet.
> + avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
Ok. Checked with atmega8 datasheet.
> + avr_set_feature(env, AVR_FEATURE_SRAM);
Ok. Checked with atmega8 datasheet.
> + avr_set_feature(env, AVR_FEATURE_BREAK);
> +
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_PC);
Ok. Checked with atmega8 datasheet.
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_SP);
> + avr_set_feature(env, AVR_FEATURE_LPMX);
> + avr_set_feature(env, AVR_FEATURE_MOVW);
Ok. Checked with atmega8 datasheet.
> + avr_set_feature(env, AVR_FEATURE_MUL);
Ok. Checked with atmega8 datasheet.
> +}
> +
> +/*
> + * 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;
> +
> + avr_set_feature(env, AVR_FEATURE_LPM);
Ok. Checked with atmega640 datasheet.
> + avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
Ok. Checked with atmega8 datasheet.
> + avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
Ok. Checked with atmega8 datasheet.
> + avr_set_feature(env, AVR_FEATURE_SRAM);
Ok. Checked with atmega8 datasheet.
> + avr_set_feature(env, AVR_FEATURE_BREAK);
Ok. Checked with atmega8 datasheet.
> +
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_PC);> +
avr_set_feature(env, AVR_FEATURE_2_BYTE_SP);
> + avr_set_feature(env, AVR_FEATURE_JMP_CALL);
Ok. Checked with atmega8 datasheet.
> + avr_set_feature(env, AVR_FEATURE_LPMX);
> + avr_set_feature(env, AVR_FEATURE_MOVW);
Ok. Checked with atmega8 datasheet.
> + avr_set_feature(env, AVR_FEATURE_MUL);
Ok. Checked with atmega8 datasheet.
> +}
> +
> +/*
> + * 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;
> +
> + avr_set_feature(env, AVR_FEATURE_LPM);
Ok. Checked with atmega128 datasheet.
> + avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
Ok. Checked with atmega128 datasheet.
> + avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
Ok. Checked with atmega128 datasheet.
> + avr_set_feature(env, AVR_FEATURE_SRAM);
Ok. Checked with atmega128 datasheet.
> + avr_set_feature(env, AVR_FEATURE_BREAK);
Ok. Checked with atmega128 datasheet.
> +
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_PC);
Ok. Checked with atmega128 datasheet.
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_SP);
> + avr_set_feature(env, AVR_FEATURE_RAMPZ);
Ok. Checked with atmega128 datasheet.
> + avr_set_feature(env, AVR_FEATURE_ELPMX);
> + avr_set_feature(env, AVR_FEATURE_ELPM);
Ok. Checked with atmega128 datasheet.
> + avr_set_feature(env, AVR_FEATURE_JMP_CALL);
Ok. Checked with atmega128 datasheet.
> + avr_set_feature(env, AVR_FEATURE_LPMX);
> + avr_set_feature(env, AVR_FEATURE_MOVW);
Ok. Checked with atmega128 datasheet.
> + avr_set_feature(env, AVR_FEATURE_MUL);
Ok. Checked with atmega128 datasheet.
> +}
> +
> +/*
> + * 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;
> +
> + avr_set_feature(env, AVR_FEATURE_LPM);
Ok. Checked with atmega2560 datasheet.
> + avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
Ok. Checked with atmega2560 datasheet.
> + avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
Ok. Checked with atmega2560 datasheet.
> + avr_set_feature(env, AVR_FEATURE_SRAM);
Ok. Checked with atmega2560 datasheet.
> + avr_set_feature(env, AVR_FEATURE_BREAK);
Ok. Checked with atmega2560 datasheet.
> +
> + avr_set_feature(env, AVR_FEATURE_3_BYTE_PC);
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_SP);
> + avr_set_feature(env, AVR_FEATURE_RAMPZ);
Ok. Checked with atmega2560 datasheet.
> + avr_set_feature(env, AVR_FEATURE_EIJMP_EICALL);
Ok. Checked with atmega2560 datasheet.
> + avr_set_feature(env, AVR_FEATURE_ELPMX);
> + avr_set_feature(env, AVR_FEATURE_ELPM);
Ok. Checked with atmega2560 datasheet.
> + avr_set_feature(env, AVR_FEATURE_JMP_CALL);
Ok. Checked with atmega2560 datasheet.
> + avr_set_feature(env, AVR_FEATURE_LPMX);
> + avr_set_feature(env, AVR_FEATURE_MOVW);
Ok. Checked with atmega2560 datasheet.
> + avr_set_feature(env, AVR_FEATURE_MUL);
Ok. Checked with atmega2560 datasheet.
> +}
> +
> +/*
> + * 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;
> +
> + avr_set_feature(env, AVR_FEATURE_LPM);
According with the attiny4/5/9/10 datasheet there is no LPM instruction.
> + avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
Ok. Checked with attiny4/5/9/10 datasheet.
> + avr_set_feature(env, AVR_FEATURE_BREAK);
Ok. Checked with attiny4/5/9/10 datasheet.
> +
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_PC);
Ok. Checked with attiny4/5/9/10 datasheet.
> + avr_set_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;
> +
> + avr_set_feature(env, AVR_FEATURE_LPM);
Ok. Checked with atxmega8e5/16e5/32e5 datasheet.
> + avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
Ok. Checked with atxmega8e5/16e5/32e5 datasheet.
> + avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
> + avr_set_feature(env, AVR_FEATURE_SRAM);
> + avr_set_feature(env, AVR_FEATURE_BREAK);
Ok. Checked with atxmega8e5/16e5/32e5 datasheet.
> +
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_PC);
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_SP);
> + avr_set_feature(env, AVR_FEATURE_JMP_CALL);
Ok. Checked with atxmega8e5/16e5/32e5 datasheet.
> + avr_set_feature(env, AVR_FEATURE_LPMX);
> + avr_set_feature(env, AVR_FEATURE_MOVW);
Ok. Checked with atxmega8e5/16e5/32e5 datasheet.
> + avr_set_feature(env, AVR_FEATURE_MUL);
Ok. Checked with atxmega8e5/16e5/32e5 datasheet.
> + avr_set_feature(env, AVR_FEATURE_RMW);
Ok. Checked with atxmega8e5/16e5/32e5 datasheet.
> +}
> +
> +/*
> + * 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;
> +
> + avr_set_feature(env, AVR_FEATURE_LPM);
Ok. Checked with attiny212 datasheet.
> + avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
Ok. Checked with attiny212 datasheet.
> + avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
Ok. Checked with attiny212 datasheet.
> + avr_set_feature(env, AVR_FEATURE_SRAM);
Ok. Checked with attiny212 datasheet.
> + avr_set_feature(env, AVR_FEATURE_BREAK);
Ok. Checked with attiny212 datasheet.
> +
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_PC);
Ok. Checked with attiny212 datasheet.
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_SP);
> + avr_set_feature(env, AVR_FEATURE_JMP_CALL);
Ok. Checked with attiny212 datasheet.
> + avr_set_feature(env, AVR_FEATURE_LPMX);
> + avr_set_feature(env, AVR_FEATURE_MOVW);
Ok. Checked with attiny212 datasheet.
> + avr_set_feature(env, AVR_FEATURE_MUL);
Ok. Checked with attiny212 datasheet.
> + avr_set_feature(env, AVR_FEATURE_RMW);
Ok. Checked with attiny212 datasheet.
> +}
> +
> +/*
> + * 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;
> +
> + avr_set_feature(env, AVR_FEATURE_LPM);
Ok. Checked with atxmega64a3 datasheet.
> + avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
Ok. Checked with atxmega64a3 datasheet.
> + avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
Ok. Checked with atxmega64a3 datasheet.
> + avr_set_feature(env, AVR_FEATURE_SRAM);
Ok. Checked with atxmega64a3 datasheet.
> + avr_set_feature(env, AVR_FEATURE_BREAK);
Ok. Checked with atxmega64a3 datasheet.
> +
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_PC);
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_SP);
> + avr_set_feature(env, AVR_FEATURE_ELPMX);
> + avr_set_feature(env, AVR_FEATURE_ELPM);
Ok. Checked with atxmega64a3 datasheet.
> + avr_set_feature(env, AVR_FEATURE_JMP_CALL);
Ok. Checked with atxmega64a3 datasheet.
> + avr_set_feature(env, AVR_FEATURE_LPMX);
> + avr_set_feature(env, AVR_FEATURE_MOVW);
Ok. Checked with atxmega64a3 datasheet.
> + avr_set_feature(env, AVR_FEATURE_MUL);
Ok. Checked with atxmega64a3 datasheet.
> + avr_set_feature(env, AVR_FEATURE_RMW);
Ok. Checked with atxmega64a3 datasheet.
> +}
> +
> +/*
> + * 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;
> +
> + avr_set_feature(env, AVR_FEATURE_LPM);
Ok. Checked with atxmega64a1 datasheet.
> + avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
Ok. Checked with atxmega64a1 datasheet.
> + avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
Ok. Checked with atxmega64a1 datasheet.
> + avr_set_feature(env, AVR_FEATURE_SRAM);
Ok. Checked with atxmega64a1 datasheet.
> + avr_set_feature(env, AVR_FEATURE_BREAK);
Ok. Checked with atxmega64a1 datasheet.
> +
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_PC);
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_SP);
> + avr_set_feature(env, AVR_FEATURE_RAMPD);
> + avr_set_feature(env, AVR_FEATURE_RAMPX);
> + avr_set_feature(env, AVR_FEATURE_RAMPY);
> + avr_set_feature(env, AVR_FEATURE_RAMPZ);
> + avr_set_feature(env, AVR_FEATURE_ELPMX);
> + avr_set_feature(env, AVR_FEATURE_ELPM);
Ok. Checked with atxmega64a1 datasheet.
> + avr_set_feature(env, AVR_FEATURE_JMP_CALL);
Ok. Checked with atxmega64a1 datasheet.
> + avr_set_feature(env, AVR_FEATURE_LPMX);
> + avr_set_feature(env, AVR_FEATURE_MOVW);
Ok. Checked with atxmega64a1 datasheet.
> + avr_set_feature(env, AVR_FEATURE_MUL);
Ok. Checked with atxmega64a1 datasheet.
> + avr_set_feature(env, AVR_FEATURE_RMW);
Ok. Checked with atxmega64a1 datasheet.
> +}
> +
> +/*
> + * 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;
> +
> + avr_set_feature(env, AVR_FEATURE_LPM);
Ok. Checked with atxmega128a3 datasheet.
> + avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
Ok. Checked with atxmega128a3 datasheet.
> + avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
Ok. Checked with atxmega128a3 datasheet.
> + avr_set_feature(env, AVR_FEATURE_SRAM);
Ok. Checked with atxmega128a3 datasheet.
> + avr_set_feature(env, AVR_FEATURE_BREAK);
Ok. Checked with atxmega128a3 datasheet.
> +
> + avr_set_feature(env, AVR_FEATURE_3_BYTE_PC);
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_SP);
> + avr_set_feature(env, AVR_FEATURE_RAMPZ);
> + avr_set_feature(env, AVR_FEATURE_EIJMP_EICALL);
Ok. Checked with atxmega128a3 datasheet.
> + avr_set_feature(env, AVR_FEATURE_ELPMX);
> + avr_set_feature(env, AVR_FEATURE_ELPM);
> + avr_set_feature(env, AVR_FEATURE_JMP_CALL);
Ok. Checked with atxmega128a3 datasheet.
> + avr_set_feature(env, AVR_FEATURE_LPMX);
> + avr_set_feature(env, AVR_FEATURE_MOVW);
Ok. Checked with atxmega128a3 datasheet.
> + avr_set_feature(env, AVR_FEATURE_MUL);
Ok. Checked with atxmega128a3 datasheet.
> + avr_set_feature(env, AVR_FEATURE_RMW);
Ok. Checked with atxmega128a3 datasheet.
> +}
> +
> +/*
> + * 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;
> +
> + avr_set_feature(env, AVR_FEATURE_LPM);
Ok. Checked with atxmega128a1 datasheet.
> + avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
Ok. Checked with atxmega128a1 datasheet.
> + avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
Ok. Checked with atxmega128a1 datasheet.
> + avr_set_feature(env, AVR_FEATURE_SRAM);
Ok. Checked with atxmega128a1 datasheet.
> + avr_set_feature(env, AVR_FEATURE_BREAK);
Ok. Checked with atxmega128a1 datasheet.
> +
> + avr_set_feature(env, AVR_FEATURE_3_BYTE_PC);
> + avr_set_feature(env, AVR_FEATURE_2_BYTE_SP);
> + avr_set_feature(env, AVR_FEATURE_RAMPD);
> + avr_set_feature(env, AVR_FEATURE_RAMPX);
> + avr_set_feature(env, AVR_FEATURE_RAMPY);
> + avr_set_feature(env, AVR_FEATURE_RAMPZ);
> + avr_set_feature(env, AVR_FEATURE_EIJMP_EICALL);
Ok. Checked with atxmega128a1 datasheet.
> + avr_set_feature(env, AVR_FEATURE_ELPMX);
> + avr_set_feature(env, AVR_FEATURE_ELPM);
Ok. Checked with atxmega128a1 datasheet.
> + avr_set_feature(env, AVR_FEATURE_JMP_CALL);
Ok. Checked with atxmega128a1 datasheet.
> + avr_set_feature(env, AVR_FEATURE_LPMX);
> + avr_set_feature(env, AVR_FEATURE_MOVW);
Ok. Checked with atxmega128a1 datasheet.
> + avr_set_feature(env, AVR_FEATURE_MUL);
Ok. Checked with atxmega128a1 datasheet.
> + avr_set_feature(env, AVR_FEATURE_RMW);
Ok. Checked with atxmega128a1 datasheet.
> +}
> ...
I hope this cross check is useful. The features that I didn't comment on
is because I'm not sure.
Really nice to have this in qemu :). Thanks!
--joa
[1] https://en.wikipedia.org/wiki/Atmel_AVR_instruction_set
--
Best Regards,
Michael Rolnik