[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v35 01/13] target/avr: Add outward facing interfaces and core
From: |
Aleksandar Markovic |
Subject: |
Re: [PATCH v35 01/13] target/avr: Add outward facing interfaces and core CPU logic |
Date: |
Fri, 22 Nov 2019 18:11:56 +0100 |
> +
> +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
- Re: [PATCH v35 01/13] target/avr: Add outward facing interfaces and core CPU logic, (continued)
Re: [PATCH v35 01/13] target/avr: Add outward facing interfaces and core CPU logic, Aleksandar Markovic, 2019/11/21
Re: [PATCH v35 01/13] target/avr: Add outward facing interfaces and core CPU logic, Aleksandar Markovic, 2019/11/22
Re: [PATCH v35 01/13] target/avr: Add outward facing interfaces and core CPU logic,
Aleksandar Markovic <=
Re: [PATCH v35 01/13] target/avr: Add outward facing interfaces and core CPU logic, Aleksandar Markovic, 2019/11/22