qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH rc2 01/25] target/avr: Add outward facing interfaces and core


From: Joaquin de Andres
Subject: Re: [PATCH rc2 01/25] target/avr: Add outward facing interfaces and core CPU logic
Date: Mon, 27 Jan 2020 14:27:28 +0100

On 1/24/20 1:51 AM, Philippe Mathieu-Daudé wrote:
> From: Michael Rolnik <address@hidden>
> 
> This includes:
> - CPU data structures
> - object model classes and functions
> - migration functions
> - GDB hooks
> 
> Co-developed-by: Michael Rolnik <address@hidden>
> Co-developed-by: Sarah Harris <address@hidden>
> Signed-off-by: Michael Rolnik <address@hidden>
> Signed-off-by: Sarah Harris <address@hidden>
> Signed-off-by: Michael Rolnik <address@hidden>
> Acked-by: Igor Mammedov <address@hidden>
> Tested-by: Philippe Mathieu-Daudé <address@hidden>
> Message-Id: <address@hidden>
> Signed-off-by: Richard Henderson <address@hidden>
> ---
> ...
> 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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]