]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
LoongArch: Give more information if kmem access failed
authorTiezhu Yang <yangtiezhu@loongson.cn>
Mon, 16 Mar 2026 02:36:01 +0000 (10:36 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Mon, 16 Mar 2026 02:36:01 +0000 (10:36 +0800)
If memory access such as copy_{from, to}_kernel_nofault() failed, its
users do not know what happened, so it is very useful to print the
exception code for such cases. Furthermore, it is better to print the
caller function to know where is the entry.

Here are the low level call chains:

  copy_from_kernel_nofault()
    copy_from_kernel_nofault_loop()
      __get_kernel_nofault()

  copy_to_kernel_nofault()
    copy_to_kernel_nofault_loop()
      __put_kernel_nofault()

Cc: stable@vger.kernel.org
Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
arch/loongarch/include/asm/uaccess.h

index 4e259d490e456708b233378a970d247b3ade2989..438269313e78c454d6c1b901e20ddd817b47b6fb 100644 (file)
@@ -253,8 +253,13 @@ do {                                                                       \
                                                                        \
        __get_kernel_common(*((type *)(dst)), sizeof(type),             \
                            (__force type *)(src));                     \
-       if (unlikely(__gu_err))                                         \
+       if (unlikely(__gu_err)) {                                       \
+               pr_info("%s: memory access failed, ecode 0x%x\n",       \
+                       __func__, read_csr_excode());                   \
+               pr_info("%s: the caller is %pS\n",                      \
+                       __func__, __builtin_return_address(0));         \
                goto err_label;                                         \
+       }                                                               \
 } while (0)
 
 #define __put_kernel_nofault(dst, src, type, err_label)                        \
@@ -264,8 +269,13 @@ do {                                                                       \
                                                                        \
        __pu_val = *(__force type *)(src);                              \
        __put_kernel_common(((type *)(dst)), sizeof(type));             \
-       if (unlikely(__pu_err))                                         \
+       if (unlikely(__pu_err)) {                                       \
+               pr_info("%s: memory access failed, ecode 0x%x\n",       \
+                       __func__, read_csr_excode());                   \
+               pr_info("%s: the caller is %pS\n",                      \
+                       __func__, __builtin_return_address(0));         \
                goto err_label;                                         \
+       }                                                               \
 } while (0)
 
 extern unsigned long __copy_user(void *to, const void *from, __kernel_size_t n);