qemu-devel
[Top][All Lists]
Advanced

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

Re: [PATCH rc4 06/29] target/avr: Add defintions of AVR core types


From: Philippe Mathieu-Daudé
Subject: Re: [PATCH rc4 06/29] target/avr: Add defintions of AVR core types
Date: Tue, 16 Jun 2020 10:56:58 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.5.0

Hi Michael,

On 3/6/20 2:34 PM, Michael Rolnik wrote:
> Hi all.
> 
> are there any action items for me?

I am not sure neither of the status of this. See below.

> 
> Regards,
> Michael Rolnik
> 
> On Thu, Feb 27, 2020 at 10:38 AM Michael Rolnik <mrolnik@gmail.com
> <mailto:mrolnik@gmail.com>> wrote:
> 
>     Hi all.
> 
>     I don't see how the fact that some MCUs have an instruction and some
>     don't within same AVR family.
>     Think about gnu binutils (not GCC) these utils have no idea about
>     MCUs all they are aware of AVR CPU only.
>     However, I don't mind removing -cpu flag.
> 
>     Regards,
>     Michael Ronik
> 
>     On Fri, Feb 21, 2020 at 5:31 PM Aleksandar Markovic
>     <aleksandar.m.mail@gmail.com <mailto:aleksandar.m.mail@gmail.com>>
>     wrote:
> 
>         On Fri, Feb 21, 2020 at 12:04 PM Michael Rolnik
>         <mrolnik@gmail.com <mailto:mrolnik@gmail.com>> wrote:
>         >
>         > Hi all.
>         >
>         > How is it going?
>         >
>         > Regards,
>         > Michael.
>         >
> 
>         Michael,
> 
>         I think we are very close to merging.
> 
>         There is absolutely no need to support ALL AVR mcus or AVR core
>         types
>         in the first version that will be merged.
> 
>         But this issue (recently discovered during Jaoquin's review)
>         about the
>         fact that an avr core type doesn't determine in a complete way the
>         instruction set of a particular MCU is thorny.

I addressed Joaquin comments in the fork we use
with the following commit:
https://gitlab.com/philmd/qemu/-/commit/c6b227f1a0b2a3

But this was more than 3 months ago, so I don't remember much.

Anyway this thread is in the rc4, rc5 is on the list, you should
ping the rc5 thread instead.

> 
>         Should we switch from "-cpu <avr core type>" to "-cpu <mcu>"
>         (but keep
>         the current avr core type organization for internal purpose)? Or
>         something else?
> 
>         This is a high-level AVR suppot design issue. Let's think about it
>         without a rush.
> 
>         The problem is that once one organization/meaning of that switch is
>         upstreamed, it is very difficult to switch to other. There is a
>         procedural rule that deprecation process lasts at least 8
>         months, plus
>         there may be some technical obstacles and difficulties.
> 
>         In short, "-cpu <avr core type>" is not enough to emulate
>         accurately a
>         givem program.
> 
>         Regards,
>         Aleksandar
> 
>         > On Mon, Feb 10, 2020 at 9:39 AM Michael Rolnik
>         <mrolnik@gmail.com <mailto:mrolnik@gmail.com>> wrote:
>         >>
>         >> Hi all.
>         >>
>         >> When I decided to implement AVR 8 bit CPU support for QEMU I
>         found this document which listed all AVR instructions.
>         >> After that I learned that there are several CPU flavours, I
>         looked into this GCC file to figure out what are they as I could
>         not find any official document explaining it.
>         >> Then I downloaded several datasheets and created a list of
>         instructions by CPU type (attached).It turned out that there are
>         some variations
>         >> e.g.
>         >> - AVTTINY - some have LDS, some don't
>         >> - AVR1, AVR25 - some have short SP, some don't
>         >> - AVRXMEGA2, AVRXMEGA4, AVRXMEGA5, AVRXMEGA6, AVRXMEGA7 -
>         some have RMW, some don't
>         >> - AVRXMEGA3 - some have RCALL, some don't
>         >>
>         >> I decided to leave CPU flavour definition as suggested by GCC
>         gcc/config/avr/avr-devices.c file and when a specific MCU is
>         created it will set / reset CPU features relevant to it.
>         >>
>         >> I hope this helps.
>         >>
>         >> Best Regards,
>         >> Michael Rolnik
>         >>
>         >>
>         >>
>         >>
>         >>
>         >>
>         >>
>         >> On Sat, Feb 8, 2020 at 9:35 AM Aleksandar Markovic
>         <aleksandar.m.mail@gmail.com
>         <mailto:aleksandar.m.mail@gmail.com>> wrote:
>         >>>
>         >>>
>         >>>
>         >>> On Sunday, February 2, 2020, Joaquin de Andres
>         <me@xcancerberox.com.ar <mailto:me@xcancerberox.com.ar>> wrote:
>         >>>>
>         >>>> On 1/31/20 1:02 AM, Aleksandar Markovic wrote:
>         >>>>>
>         >>>>> From: Michael Rolnik <mrolnik@gmail.com
>         <mailto:mrolnik@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.mail@gmail.com <mailto:aleksandar.m.mail@gmail.com>>
>         >>>>>
>         >>>>> Co-developed-by: Michael Rolnik <mrolnik@gmail.com
>         <mailto:mrolnik@gmail.com>>
>         >>>>> Co-developed-by: Sarah Harris <S.E.Harris@kent.ac.uk
>         <mailto:S.E.Harris@kent.ac.uk>>
>         >>>>> Signed-off-by: Michael Rolnik <mrolnik@gmail.com
>         <mailto:mrolnik@gmail.com>>
>         >>>>> Signed-off-by: Sarah Harris <S.E.Harris@kent.ac.uk
>         <mailto:S.E.Harris@kent.ac.uk>>
>         >>>>> Signed-off-by: Michael Rolnik <mrolnik@gmail.com
>         <mailto:mrolnik@gmail.com>>
>         >>>>> Acked-by: Igor Mammedov <imammedo@redhat.com
>         <mailto:imammedo@redhat.com>>
>         >>>>> Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com
>         <mailto:philmd@redhat.com>>
>         >>>>> Signed-off-by: Richard Henderson
>         <richard.henderson@linaro.org <mailto:richard.henderson@linaro.org>>
>         >>>>> Signed-off-by: Aleksandar Markovic
>         <aleksandar.m.mail@gmail.com <mailto:aleksandar.m.mail@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
>         >>
>         >>
>         >>
>         >> --
>         >> Best Regards,
>         >> Michael Rolnik
>         >
>         >
>         >
>         > --
>         > Best Regards,
>         > Michael Rolnik
> 
> 
> 
>     -- 
>     Best Regards,
>     Michael Rolnik
> 
> 
> 
> -- 
> Best Regards,
> Michael Rolnik




reply via email to

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