On 10/27/2026 6:05 AM, Peter Maydell wrote: > On Tue, 27 Oct 2026 at 13:06, Yonggang Luo <[email protected]> wrote: >> >> On Wed, Oct 14, 2026 at 5:37 AM Pierrick Bouvier >> <[email protected]> wrote: >>> >>> On 10/13/2026 2:30 PM, Yonggang Luo wrote: >>>> On Wed, Oct 14, 2026 at 5:07 AM Pierrick Bouvier >>>> <[email protected]> wrote: >>>>> >>>>> On 10/13/26 1:19 PM, Yonggang Luo wrote: >>>>>> On Wed, Oct 14, 2026 at 4:08 AM Pierrick Bouvier >>>>>> <[email protected]> wrote: >>>>>>> >>>>>>> On 10/13/2026 12:56 PM, Yonggang Luo wrote: >>>>>>>> This is for avoid "max-v8" qom name conflict in multi-target qemu >>>>>>>> >>>>>>>> Signed-off-by: Yonggang Luo <[email protected]> >>>>>>>> --- >>>>>>>> target/arm/tcg/cpu-max-v8.c | 17 +++++++++++++---- >>>>>>>> 1 file changed, 13 insertions(+), 4 deletions(-) >>>>>>>> >>>>>>>> diff --git a/target/arm/tcg/cpu-max-v8.c b/target/arm/tcg/cpu-max-v8.c >>>>>>>> index 65f851f2006..d7323ab431c 100644 >>>>>>>> --- a/target/arm/tcg/cpu-max-v8.c >>>>>>>> +++ b/target/arm/tcg/cpu-max-v8.c >>>>>>>> @@ -119,12 +119,21 @@ void aarch32_max_v8_tcg_initfn(Object *obj) >>>>>>>> #endif >>>>>>>> } >>>>>>>> >>>>>>>> +static void max_v8_tcg_initfn(Object *obj) >>>>>>>> +{ >>>>>>>> + if (target_aarch64()) { >>>>>>>> + aarch64_max_v8_tcg_initfn(obj); >>>>>>>> + } else { >>>>>>>> + aarch32_max_v8_tcg_initfn(obj); >>>>>>>> + } >>>>>>>> +} >>>>>>>> + >>>>>>>> static void cpu_max_v8_register_type(void) >>>>>>>> { >>>>>>>> - static const ARMCPUInfo max_v8[2] = { >>>>>>>> - { .name = "max-v8", .initfn = aarch32_max_v8_tcg_initfn }, >>>>>>>> - { .name = "max-v8", .initfn = aarch64_max_v8_tcg_initfn }, >>>>>>>> + static const ARMCPUInfo max_v8 = { >>>>>>>> + .name = "max-v8", >>>>>>>> + .initfn = max_v8_tcg_initfn, >>>>>>>> }; >>>>>>>> - arm_cpu_register(&max_v8[target_aarch64()]); >>>>>>>> + arm_cpu_register(&max_v8); >>>>>>>> } >>>>>>>> type_init(cpu_max_v8_register_type) >>>>>>> >>>>>>> It works for the current need, but will require further changes for >>>>>>> heterogeneous emulation. A more versatile solution could be: >>>>>>> >>>>>>> arm_cpu_register(&aarch32_max_v8, target_arm); >>>>>>> arm_cpu_register(&aarch64_max_v8, target_aarch64); >>>>>> >>>>>> And another way to handle it is like x86. it's comes with two variant for >>>>>> >>>>>> #ifdef TARGET_X86_64 >>>>>> #define TYPE_X86_CPU "x86_64-cpu" >>>>>> #else >>>>>> #define TYPE_X86_CPU "i386-cpu" >>>>>> #endif >>>>>> >>>>>> This also solves this issue, which looks more straightforward. no need >>>>>> .targets magic for CPU. >>>>>> Anyway, maybe the best way is to merge "x86_64-cpu" and "i386-cpu" >>>>>> into a single cpu type and >>>>>> add .targets magic? When I am trying to get x86 works, faced this issue >>>>>> >>>>> >>>>> This solves including i386 or x86_64, but not including both at the same >>>>> time. Same goes for arm vs aarch64. >>>>> >>>>> You can take a look at git history in target/arm, to see which kind of >>>>> changes we did to make arm and aarch64 targets linkable. You'll notice >>>>> most of the work was to remove (a lot of) #ifdef TARGET_X. >>>> >>>> See it >>>> SHA-1: ec7e5a90fea996f04ea24e81b680a87bc975354a >>>> * target/arm: Remove TYPE_AARCH64_CPU >>>> >>>> So I am just doing just the reverse direction, I am fixes x86_64 in a way >>>> that >>>> register both "x86_64-cpu" "i386-cpu" variants, though this way seems >>>> more suitable >>>> for your heterogeneous emulation, but we need to register >>>> everything(CPUs) twice. >>> >>> We'll have to register this twice anyway for heterogeneous, I don't see >>> any other solution to have both accessible at the same time. That said, >>> we are not yet there, and current patch solves the actual problem of >>> having QOM types registered twice. >>> >>> I'll let Peter say what he thinks about this. >> >> Hi Peter, what's your suggest about this? > > I don't really have a preference here as I haven't been following > the heterogenous work that closely. I'm happy to go with whatever > Pierrick / Philippe think makes sense. >
Ok. In this case Yonggang, let's go with two max types, each with on init function, and using is_available to register the right one. Regards, Pierrick
