diff --git a/arch/loongarch/include/asm/entry-common.h b/arch/loongarch/include/asm/entry-common.h index 0fe2a098ded96caec4e556d53552392a9fba2e60..a1d2ff1d05923c0f91bdac12b6250d07adf8bb76 100644 --- a/arch/loongarch/include/asm/entry-common.h +++ b/arch/loongarch/include/asm/entry-common.h @@ -7,7 +7,7 @@ static inline bool on_thread_stack(void) { - return !(((unsigned long)(current->stack) ^ current_stack_pointer) & ~(THREAD_SIZE - 1)); + return !(((unsigned long)(current->stack) ^ current_stack_pointer()) & ~(THREAD_SIZE - 1)); } #endif diff --git a/arch/loongarch/include/asm/percpu.h b/arch/loongarch/include/asm/percpu.h index ad8d88494554a73951ac1c7b12c5b322c9750ab5..e4872bcd851cb8c688d5544d0fd0ade028283665 100644 --- a/arch/loongarch/include/asm/percpu.h +++ b/arch/loongarch/include/asm/percpu.h @@ -18,14 +18,19 @@ #endif /* Use r21 for fast access */ -register unsigned long __my_cpu_offset __asm__("$r21"); +static inline unsigned long __kern_my_cpu_offset(void) +{ + register unsigned long off __asm__("$r21"); + + return off; +} +#define __my_cpu_offset __kern_my_cpu_offset() static inline void set_my_cpu_offset(unsigned long off) { - __my_cpu_offset = off; + asm volatile("move $r21, %0"::"r"(off)); csr_write64(off, PERCPU_BASE_KS); } -#define __my_cpu_offset __my_cpu_offset #define PERCPU_OP(op, asm_op, c_op) \ static inline unsigned long __percpu_##op(void *ptr, \ diff --git a/arch/loongarch/include/asm/thread_info.h b/arch/loongarch/include/asm/thread_info.h index 1be904ab37926ea555a2bc78870f730de9882462..c9030464cbb59272c2eb1e02f896382e9f46b731 100644 --- a/arch/loongarch/include/asm/thread_info.h +++ b/arch/loongarch/include/asm/thread_info.h @@ -44,14 +44,19 @@ struct thread_info { } /* How to get the thread information struct from C. */ -register struct thread_info *__current_thread_info __asm__("$tp"); - static inline struct thread_info *current_thread_info(void) { + register struct thread_info *__current_thread_info __asm__("$tp"); + return __current_thread_info; } -register unsigned long current_stack_pointer __asm__("$sp"); +static inline unsigned long current_stack_pointer(void) +{ + register unsigned long __current_stack_pointer __asm__("$sp"); + + return __current_stack_pointer; +} #endif /* !__ASSEMBLY__ */