Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

xtensa: Implement "current_stack_pointer"

To follow the existing per-arch conventions replace open-coded uses
of asm "sp" as "current_stack_pointer". This will let it be used in
non-arch places (like HARDENED_USERCOPY).

Cc: Chris Zankel <chris@zankel.net>
Cc: Marc Zyngier <maz@kernel.org>
Cc: linux-xtensa@linux-xtensa.org
Signed-off-by: Kees Cook <keescook@chromium.org>
Acked-by: Max Filippov <jcmvbkbc@gmail.com>
Link: https://lore.kernel.org/lkml/CAMo8BfJFJE-n3=AF+pb9_6oF3gzxX7a+7aBrASHjjNX5byqDqw@mail.gmail.com

+8 -6
+1
arch/xtensa/Kconfig
··· 3 3 def_bool y 4 4 select ARCH_32BIT_OFF_T 5 5 select ARCH_HAS_BINFMT_FLAT if !MMU 6 + select ARCH_HAS_CURRENT_STACK_POINTER 6 7 select ARCH_HAS_DMA_PREP_COHERENT if MMU 7 8 select ARCH_HAS_SYNC_DMA_FOR_CPU if MMU 8 9 select ARCH_HAS_SYNC_DMA_FOR_DEVICE if MMU
+2
arch/xtensa/include/asm/current.h
··· 26 26 27 27 #define current get_current() 28 28 29 + register unsigned long current_stack_pointer __asm__("a1"); 30 + 29 31 #else 30 32 31 33 #define GET_CURRENT(reg,sp) \
+4 -4
arch/xtensa/include/asm/stacktrace.h
··· 19 19 20 20 static __always_inline unsigned long *stack_pointer(struct task_struct *task) 21 21 { 22 - unsigned long *sp; 22 + unsigned long sp; 23 23 24 24 if (!task || task == current) 25 - __asm__ __volatile__ ("mov %0, a1\n" : "=a"(sp)); 25 + sp = current_stack_pointer; 26 26 else 27 - sp = (unsigned long *)task->thread.sp; 27 + sp = task->thread.sp; 28 28 29 - return sp; 29 + return (unsigned long *)sp; 30 30 } 31 31 32 32 void walk_stackframe(unsigned long *sp,
+1 -2
arch/xtensa/kernel/irq.c
··· 36 36 #ifdef CONFIG_DEBUG_STACKOVERFLOW 37 37 /* Debugging check for stack overflow: is there less than 1KB free? */ 38 38 { 39 - unsigned long sp; 39 + unsigned long sp = current_stack_pointer; 40 40 41 - __asm__ __volatile__ ("mov %0, a1\n" : "=a" (sp)); 42 41 sp &= THREAD_SIZE - 1; 43 42 44 43 if (unlikely(sp < (sizeof(thread_info) + 1024)))