Message ID | 20220619001541.131672-3-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | target/arm: Fix issue 1078 | expand |
On Sun, 19 Jun 2022 at 01:18, Richard Henderson <richard.henderson@linaro.org> wrote: > > In machvirt_init we create a cpu but do not fully initialize it. > Thus the propagation of V7VE to LPAE has not been done, and we > compute the wrong value for some v7 cpus, e.g. cortex-a15. > > Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1078 > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > target/arm/ptw.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/target/arm/ptw.c b/target/arm/ptw.c > index 07f7a21861..da478104f0 100644 > --- a/target/arm/ptw.c > +++ b/target/arm/ptw.c > @@ -47,7 +47,13 @@ unsigned int arm_pamax(ARMCPU *cpu) > assert(parange < ARRAY_SIZE(pamax_map)); > return pamax_map[parange]; > } > - if (arm_feature(&cpu->env, ARM_FEATURE_LPAE)) { > + > + /* > + * In machvirt_init, we call arm_pamax on a cpu that is not fully > + * initialized, so we can't rely on the propagation done in realize. > + */ > + if (arm_feature(&cpu->env, ARM_FEATURE_LPAE) || > + arm_feature(&cpu->env, ARM_FEATURE_V7VE)) { > /* v7 with LPAE */ > return 40; I guess this is expedient, so on that basis Reviewed-by: Peter Maydell <peter.maydell@linaro.org> but as I mentioned in the gitlab issue it's kind of bogus that the virt board is doing stuff to a non-realized CPU object. thanks -- PMM
On 6/24/22 09:27, Peter Maydell wrote: >> + /* >> + * In machvirt_init, we call arm_pamax on a cpu that is not fully >> + * initialized, so we can't rely on the propagation done in realize. >> + */ >> + if (arm_feature(&cpu->env, ARM_FEATURE_LPAE) || >> + arm_feature(&cpu->env, ARM_FEATURE_V7VE)) { >> /* v7 with LPAE */ >> return 40; > > I guess this is expedient, so on that basis > Reviewed-by: Peter Maydell <peter.maydell@linaro.org> > > but as I mentioned in the gitlab issue it's kind of bogus > that the virt board is doing stuff to a non-realized CPU object. My first look suggested that the virt board wasn't even setting all of the cpu properties properly, so realization might not help. I meant to go back again and soend more time, but that hasn't happened yet. r~
diff --git a/target/arm/ptw.c b/target/arm/ptw.c index 07f7a21861..da478104f0 100644 --- a/target/arm/ptw.c +++ b/target/arm/ptw.c @@ -47,7 +47,13 @@ unsigned int arm_pamax(ARMCPU *cpu) assert(parange < ARRAY_SIZE(pamax_map)); return pamax_map[parange]; } - if (arm_feature(&cpu->env, ARM_FEATURE_LPAE)) { + + /* + * In machvirt_init, we call arm_pamax on a cpu that is not fully + * initialized, so we can't rely on the propagation done in realize. + */ + if (arm_feature(&cpu->env, ARM_FEATURE_LPAE) || + arm_feature(&cpu->env, ARM_FEATURE_V7VE)) { /* v7 with LPAE */ return 40; }
In machvirt_init we create a cpu but do not fully initialize it. Thus the propagation of V7VE to LPAE has not been done, and we compute the wrong value for some v7 cpus, e.g. cortex-a15. Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1078 Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- target/arm/ptw.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)