On Mon, 18 May 2020 at 15:28, Peter Maydell <peter.mayd...@linaro.org> wrote: > > Using the MSR instruction to write to CPSR.E is deprecated, but it is > required to work from any mode including unprivileged code. We were > incorrectly forbidding usermode code from writing it because > CPSR_USER did not include the CPSR_E bit. > > We use CPSR_USER in only three places: > * as the mask of what to allow userspace MSR to write to CPSR > * when deciding what bits a linux-user signal-return should be > able to write from the sigcontext structure > * in target_user_copy_regs() when we set up the initial > registers for the linux-user process > > In the first two cases not being able to update CPSR.E is a bug, and > in the third case it doesn't matter because CPSR.E is always 0 there. > So we can fix both bugs by adding CPSR_E to CPSR_USER. > > Because the cpsr_write() in restore_sigcontext() is now changing > a CPSR bit which is cached in hflags, we need to add an > arm_rebuild_hflags() call there; the callsite in > target_user_copy_regs() was already rebuilding hflags for other > reasons. > > (The recommended way to change CPSR.E is to use the 'SETEND' > instruction, which we do correctly allow from usermode code.) > > Signed-off-by: Peter Maydell <peter.mayd...@linaro.org>
Applied to target-arm.next, thanks. -- PMM