On 8/26/21 7:03 PM, Peter Maydell wrote:
> Currently we rely on all the callsites of cpsr_write() to rebuild the
> cached hflags if they change one of the CPSR bits which we use as a
> TB flag and cache in hflags.  This is a bit awkward when we want to
> change the set of CPSR bits that we cache, because it means we need
> to re-audit all the cpsr_write() callsites to see which flags they
> are writing and whether they now need to rebuild the hflags.
> 
> Switch instead to making cpsr_write() call arm_rebuild_hflags()
> itself if one of the bits being changed is a cached bit.
> 
> We don't do the rebuild for the CPSRWriteRaw write type, because that
> kind of write is generally doing something special anyway.  For the
> CPSRWriteRaw callsites in the KVM code and inbound migration we
> definitely don't want to recalculate the hflags; the callsites in
> boot.c and arm-powerctl.c have to do a rebuild-hflags call themselves
> anyway because of other CPU state changes they make.
> 
> This allows us to drop explicit arm_rebuild_hflags() calls in a
> couple of places where the only reason we needed to call it was the
> CPSR write.

Just noticing this patch, nice.

> This fixes a bug where we were incorrectly failing to rebuild hflags
> in the code path for a gdbstub write to CPSR, which meant that you
> could make QEMU assert by breaking into a running guest, altering the
> CPSR to change the value of, for example, CPSR.E, and then
> continuing.
> 
> Signed-off-by: Peter Maydell <[email protected]>
> Reviewed-by: Richard Henderson <[email protected]>
> Message-id: [email protected]
> ---
>  target/arm/cpu.h        | 10 ++++++++--
>  linux-user/arm/signal.c |  2 --
>  target/arm/helper.c     |  5 +++++
>  3 files changed, 13 insertions(+), 4 deletions(-)

Reply via email to