On Saturday, November 23, 2019, Michael Rolnik <mrol...@gmail.com> wrote:

> On Fri, Nov 22, 2019 at 7:12 PM Aleksandar Markovic
> <aleksandar.m.m...@gmail.com> wrote:
> >
> > > +
> > > +static void avr_avr1_initfn(Object *obj)
> > > +{
> > > +    AVRCPU *cpu = AVR_CPU(obj);
> > > +    CPUAVRState *env = &cpu->env;
> > > +
> > > +    avr_set_feature(env, AVR_FEATURE_LPM);
> > > +    avr_set_feature(env, AVR_FEATURE_2_BYTE_SP);
> > > +    avr_set_feature(env, AVR_FEATURE_2_BYTE_PC);
> > > +}
> > > +
> > > +static void avr_avr2_initfn(Object *obj)
> > > +{
> > > +    AVRCPU *cpu = AVR_CPU(obj);
> > > +    CPUAVRState *env = &cpu->env;
> > > +
> > > +    avr_set_feature(env, AVR_FEATURE_LPM);
> > > +    avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
> > > +    avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
> > > +    avr_set_feature(env, AVR_FEATURE_SRAM);
> > > +    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);
> > > +}
> > > +
> > > +static void avr_avr25_initfn(Object *obj)
> > > +{
> > > +    AVRCPU *cpu = AVR_CPU(obj);
> > > +    CPUAVRState *env = &cpu->env;
> > > +
> > > +    avr_set_feature(env, AVR_FEATURE_LPM);
> > > +    avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
> > > +    avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
> > > +    avr_set_feature(env, AVR_FEATURE_SRAM);
> > > +    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_LPMX);
> > > +    avr_set_feature(env, AVR_FEATURE_MOVW);
> > > +}
> > > +
> > > +static void avr_avr3_initfn(Object *obj)
> > > +{
> > > +    AVRCPU *cpu = AVR_CPU(obj);
> > > +    CPUAVRState *env = &cpu->env;
> > > +
> > > +    avr_set_feature(env, AVR_FEATURE_LPM);
> > > +    avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
> > > +    avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
> > > +    avr_set_feature(env, AVR_FEATURE_SRAM);
> > > +    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_JMP_CALL);
> > > +}
> > > +
> > > +static void avr_avr31_initfn(Object *obj)
> > > +{
> > > +    AVRCPU *cpu = AVR_CPU(obj);
> > > +    CPUAVRState *env = &cpu->env;
> > > +
> > > +    avr_set_feature(env, AVR_FEATURE_LPM);
> > > +    avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
> > > +    avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
> > > +    avr_set_feature(env, AVR_FEATURE_SRAM);
> > > +    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);
> > > +    avr_set_feature(env, AVR_FEATURE_ELPM);
> > > +    avr_set_feature(env, AVR_FEATURE_JMP_CALL);
> > > +}
> > > +
> > > +static void avr_avr35_initfn(Object *obj)
> > > +{
> > > +    AVRCPU *cpu = AVR_CPU(obj);
> > > +    CPUAVRState *env = &cpu->env;
> > > +
> > > +    avr_set_feature(env, AVR_FEATURE_LPM);
> > > +    avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
> > > +    avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
> > > +    avr_set_feature(env, AVR_FEATURE_SRAM);
> > > +    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_JMP_CALL);
> > > +    avr_set_feature(env, AVR_FEATURE_LPMX);
> > > +    avr_set_feature(env, AVR_FEATURE_MOVW);
> > > +}
> > > +
> > > +static void avr_avr4_initfn(Object *obj)
> > > +{
> > > +    AVRCPU *cpu = AVR_CPU(obj);
> > > +    CPUAVRState *env = &cpu->env;
> > > +
> > > +    avr_set_feature(env, AVR_FEATURE_LPM);
> > > +    avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
> > > +    avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
> > > +    avr_set_feature(env, AVR_FEATURE_SRAM);
> > > +    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_LPMX);
> > > +    avr_set_feature(env, AVR_FEATURE_MOVW);
> > > +    avr_set_feature(env, AVR_FEATURE_MUL);
> > > +}
> > > +
> > > +static void avr_avr5_initfn(Object *obj)
> > > +{
> > > +    AVRCPU *cpu = AVR_CPU(obj);
> > > +    CPUAVRState *env = &cpu->env;
> > > +
> > > +    avr_set_feature(env, AVR_FEATURE_LPM);
> > > +    avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
> > > +    avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
> > > +    avr_set_feature(env, AVR_FEATURE_SRAM);
> > > +    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_JMP_CALL);
> > > +    avr_set_feature(env, AVR_FEATURE_LPMX);
> > > +    avr_set_feature(env, AVR_FEATURE_MOVW);
> > > +    avr_set_feature(env, AVR_FEATURE_MUL);
> > > +}
> > > +
> > > +static void avr_avr51_initfn(Object *obj)
> > > +{
> > > +    AVRCPU *cpu = AVR_CPU(obj);
> > > +    CPUAVRState *env = &cpu->env;
> > > +
> > > +    avr_set_feature(env, AVR_FEATURE_LPM);
> > > +    avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
> > > +    avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
> > > +    avr_set_feature(env, AVR_FEATURE_SRAM);
> > > +    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);
> > > +    avr_set_feature(env, AVR_FEATURE_ELPMX);
> > > +    avr_set_feature(env, AVR_FEATURE_ELPM);
> > > +    avr_set_feature(env, AVR_FEATURE_JMP_CALL);
> > > +    avr_set_feature(env, AVR_FEATURE_LPMX);
> > > +    avr_set_feature(env, AVR_FEATURE_MOVW);
> > > +    avr_set_feature(env, AVR_FEATURE_MUL);
> > > +}
> > > +
> > > +static void avr_avr6_initfn(Object *obj)
> > > +{
> > > +    AVRCPU *cpu = AVR_CPU(obj);
> > > +    CPUAVRState *env = &cpu->env;
> > > +
> > > +    avr_set_feature(env, AVR_FEATURE_LPM);
> > > +    avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
> > > +    avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
> > > +    avr_set_feature(env, AVR_FEATURE_SRAM);
> > > +    avr_set_feature(env, AVR_FEATURE_BREAK);
> > > +
> > > +    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);
> > > +    avr_set_feature(env, AVR_FEATURE_ELPMX);
> > > +    avr_set_feature(env, AVR_FEATURE_ELPM);
> > > +    avr_set_feature(env, AVR_FEATURE_JMP_CALL);
> > > +    avr_set_feature(env, AVR_FEATURE_LPMX);
> > > +    avr_set_feature(env, AVR_FEATURE_MOVW);
> > > +    avr_set_feature(env, AVR_FEATURE_MUL);
> > > +}
> > > +
> > > +static void avr_xmega2_initfn(Object *obj)
> > > +{
> > > +    AVRCPU *cpu = AVR_CPU(obj);
> > > +    CPUAVRState *env = &cpu->env;
> > > +
> > > +    avr_set_feature(env, AVR_FEATURE_LPM);
> > > +    avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
> > > +    avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
> > > +    avr_set_feature(env, AVR_FEATURE_SRAM);
> > > +    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_JMP_CALL);
> > > +    avr_set_feature(env, AVR_FEATURE_LPMX);
> > > +    avr_set_feature(env, AVR_FEATURE_MOVW);
> > > +    avr_set_feature(env, AVR_FEATURE_MUL);
> > > +    avr_set_feature(env, AVR_FEATURE_RMW);
> > > +}
> > > +
> > > +static void avr_xmega4_initfn(Object *obj)
> > > +{
> > > +    AVRCPU *cpu = AVR_CPU(obj);
> > > +    CPUAVRState *env = &cpu->env;
> > > +
> > > +    avr_set_feature(env, AVR_FEATURE_LPM);
> > > +    avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
> > > +    avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
> > > +    avr_set_feature(env, AVR_FEATURE_SRAM);
> > > +    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);
> > > +    avr_set_feature(env, AVR_FEATURE_ELPMX);
> > > +    avr_set_feature(env, AVR_FEATURE_ELPM);
> > > +    avr_set_feature(env, AVR_FEATURE_JMP_CALL);
> > > +    avr_set_feature(env, AVR_FEATURE_LPMX);
> > > +    avr_set_feature(env, AVR_FEATURE_MOVW);
> > > +    avr_set_feature(env, AVR_FEATURE_MUL);
> > > +    avr_set_feature(env, AVR_FEATURE_RMW);
> > > +}
> > > +
> > > +static void avr_xmega5_initfn(Object *obj)
> > > +{
> > > +    AVRCPU *cpu = AVR_CPU(obj);
> > > +    CPUAVRState *env = &cpu->env;
> > > +
> > > +    avr_set_feature(env, AVR_FEATURE_LPM);
> > > +    avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
> > > +    avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
> > > +    avr_set_feature(env, AVR_FEATURE_SRAM);
> > > +    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_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);
> > > +    avr_set_feature(env, AVR_FEATURE_JMP_CALL);
> > > +    avr_set_feature(env, AVR_FEATURE_LPMX);
> > > +    avr_set_feature(env, AVR_FEATURE_MOVW);
> > > +    avr_set_feature(env, AVR_FEATURE_MUL);
> > > +    avr_set_feature(env, AVR_FEATURE_RMW);
> > > +}
> > > +
> > > +static void avr_xmega6_initfn(Object *obj)
> > > +{
> > > +    AVRCPU *cpu = AVR_CPU(obj);
> > > +    CPUAVRState *env = &cpu->env;
> > > +
> > > +    avr_set_feature(env, AVR_FEATURE_LPM);
> > > +    avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
> > > +    avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
> > > +    avr_set_feature(env, AVR_FEATURE_SRAM);
> > > +    avr_set_feature(env, AVR_FEATURE_BREAK);
> > > +
> > > +    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);
> > > +    avr_set_feature(env, AVR_FEATURE_ELPMX);
> > > +    avr_set_feature(env, AVR_FEATURE_ELPM);
> > > +    avr_set_feature(env, AVR_FEATURE_JMP_CALL);
> > > +    avr_set_feature(env, AVR_FEATURE_LPMX);
> > > +    avr_set_feature(env, AVR_FEATURE_MOVW);
> > > +    avr_set_feature(env, AVR_FEATURE_MUL);
> > > +    avr_set_feature(env, AVR_FEATURE_RMW);
> > > +}
> > > +
> > > +static void avr_xmega7_initfn(Object *obj)
> > > +{
> > > +    AVRCPU *cpu = AVR_CPU(obj);
> > > +    CPUAVRState *env = &cpu->env;
> > > +
> > > +    avr_set_feature(env, AVR_FEATURE_LPM);
> > > +    avr_set_feature(env, AVR_FEATURE_IJMP_ICALL);
> > > +    avr_set_feature(env, AVR_FEATURE_ADIW_SBIW);
> > > +    avr_set_feature(env, AVR_FEATURE_SRAM);
> > > +    avr_set_feature(env, AVR_FEATURE_BREAK);
> > > +
> > > +    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);
> > > +    avr_set_feature(env, AVR_FEATURE_ELPMX);
> > > +    avr_set_feature(env, AVR_FEATURE_ELPM);
> > > +    avr_set_feature(env, AVR_FEATURE_JMP_CALL);
> > > +    avr_set_feature(env, AVR_FEATURE_LPMX);
> > > +    avr_set_feature(env, AVR_FEATURE_MOVW);
> > > +    avr_set_feature(env, AVR_FEATURE_MUL);
> > > +    avr_set_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 = model "-avr-cpu", \
> > > +    }
> > > +
> > > +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("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("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),
> > > +};
> > > +
> >
> > Hi, Michael,
> >
> > I have the hardest time finding in the documentation some kind of
> > table of AVR CPUs containing supported features. Related to that:
> >
> > - Is there a list in the docs equivalent to the definitions of
> > AVR_FEATURE_XXX constants in your code?
> > - How did you collect all info needed for definition of 15 CPUs above
> > (link to the source of info would be great)?
> > - Would all 15 CPUs be supported in QEMU once this series is
> > integrated, without caveats?
> >
> > Sincerely yours,
> > Aleksandar
>
> Hi Alexandar.
>
> you can find this info in different source
> 1. this wiki https://en.wikipedia.org/wiki/Atmel_AVR_instruction_set


Hmm. Introducing a new target to QEMU based on Wikipedia article?


> 2. download all the speck and compare


It would be helpful if you provided links to the specs you meant here.


> 3. GCC
>     1. https://gcc.gnu.org/onlinedocs/gcc/AVR-Options.html
>     2. https://github.com/gcc-mirror/gcc/blob/master/gcc/config/
> avr/avr-mcus.def
>     3. https://github.com/gcc-mirror/gcc/blob/master/gcc/config/
> avr/avr-arch.h
>     4. https://github.com/gcc-mirror/gcc/blob/master/gcc/config/
> avr/avr-devices.c
>
>
QEMU should not be dependent on gcc code, as it is, by its definition, a
compiler-agnostic tool. Dependence on gcc opens the possibility of
importing bugs from gcc, among other problems.

It appears to me that all AVR_FEATURE_XXX constants are pure gcc
constructs, never mentioned (unfortunately) in official AVR documentation,
or some comparison table by the vendor. I understand that it is nice to
have the same organuzation of such flags both in QEMU and gcc, but gcc is
not QEMU's reference, and your checking each single item related to
AVR_FEATURE_XXX in the AVR documentation would be much appreciated. I know
it is a lot of work - but is there any other better solution than just
copying the code from gcc?

Thanks, Aleksandar


> as for the flags
> 1. AVR_FEATURE_SRAM defined but never used
> 2. AVR_FEATURE_LPM assigned for all cores, however there are more
> cores that do not support this instruction, so if added to QEMU will
> not have it defined for them.
>
>
>
> --
> Best Regards,
> Michael Rolnik
>

Reply via email to