mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-23 09:56:00 +00:00
arm64: fix access to preempt_count from assembly code
preempt_count is defined as an int. Oddly enough, we access it as a 64bit value. Things become interesting when running a BE kernel, and looking at the current CPU number, which is stored as an int next to preempt_count. Like in a per-cpu interrupt handler, for example... Using a 32bit access fixes the issue for good. Cc: Matthew Leach <matthew.leach@arm.com> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
This commit is contained in:
parent
7ade67b598
commit
717321fcb5
@ -311,14 +311,14 @@ el1_irq:
|
|||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_PREEMPT
|
#ifdef CONFIG_PREEMPT
|
||||||
get_thread_info tsk
|
get_thread_info tsk
|
||||||
ldr x24, [tsk, #TI_PREEMPT] // get preempt count
|
ldr w24, [tsk, #TI_PREEMPT] // get preempt count
|
||||||
add x0, x24, #1 // increment it
|
add w0, w24, #1 // increment it
|
||||||
str x0, [tsk, #TI_PREEMPT]
|
str w0, [tsk, #TI_PREEMPT]
|
||||||
#endif
|
#endif
|
||||||
irq_handler
|
irq_handler
|
||||||
#ifdef CONFIG_PREEMPT
|
#ifdef CONFIG_PREEMPT
|
||||||
str x24, [tsk, #TI_PREEMPT] // restore preempt count
|
str w24, [tsk, #TI_PREEMPT] // restore preempt count
|
||||||
cbnz x24, 1f // preempt count != 0
|
cbnz w24, 1f // preempt count != 0
|
||||||
ldr x0, [tsk, #TI_FLAGS] // get flags
|
ldr x0, [tsk, #TI_FLAGS] // get flags
|
||||||
tbz x0, #TIF_NEED_RESCHED, 1f // needs rescheduling?
|
tbz x0, #TIF_NEED_RESCHED, 1f // needs rescheduling?
|
||||||
bl el1_preempt
|
bl el1_preempt
|
||||||
@ -509,15 +509,15 @@ el0_irq_naked:
|
|||||||
#endif
|
#endif
|
||||||
get_thread_info tsk
|
get_thread_info tsk
|
||||||
#ifdef CONFIG_PREEMPT
|
#ifdef CONFIG_PREEMPT
|
||||||
ldr x24, [tsk, #TI_PREEMPT] // get preempt count
|
ldr w24, [tsk, #TI_PREEMPT] // get preempt count
|
||||||
add x23, x24, #1 // increment it
|
add w23, w24, #1 // increment it
|
||||||
str x23, [tsk, #TI_PREEMPT]
|
str w23, [tsk, #TI_PREEMPT]
|
||||||
#endif
|
#endif
|
||||||
irq_handler
|
irq_handler
|
||||||
#ifdef CONFIG_PREEMPT
|
#ifdef CONFIG_PREEMPT
|
||||||
ldr x0, [tsk, #TI_PREEMPT]
|
ldr w0, [tsk, #TI_PREEMPT]
|
||||||
str x24, [tsk, #TI_PREEMPT]
|
str w24, [tsk, #TI_PREEMPT]
|
||||||
cmp x0, x23
|
cmp w0, w23
|
||||||
b.eq 1f
|
b.eq 1f
|
||||||
mov x1, #0
|
mov x1, #0
|
||||||
str x1, [x1] // BUG
|
str x1, [x1] // BUG
|
||||||
|
Loading…
Reference in New Issue
Block a user