From: kernel test robot <lkp@intel.com>
To: "Maciej Wieczor-Retman" <maciej.wieczor-retman@intel.com>
Cc: oe-kbuild-all@lists.linux.dev,
David Hildenbrand <david@kernel.org>,
Andrew Morton <akpm@linux-foundation.org>,
Linux Memory Management List <linux-mm@kvack.org>
Subject: [akpm-mm:mm-new 294/303] arch/arm64/kernel/traps.c:1074:9: error: implicit declaration of function 'kasan_die_unless_recover'
Date: Wed, 14 Jan 2026 02:41:53 +0800 [thread overview]
Message-ID: <202601140248.D9Oj5lCh-lkp@intel.com> (raw)
tree: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-new
head: abb8eb84b7bb668d982e556b2b19f0e3ac42c591
commit: c22668ddeabded18adfebc428e99d20d59bc6d9d [294/303] arm64: unify software tag-based KASAN inline recovery path
config: arm64-randconfig-r064-20260113 (https://download.01.org/0day-ci/archive/20260114/202601140248.D9Oj5lCh-lkp@intel.com/config)
compiler: aarch64-linux-gcc (GCC) 13.4.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260114/202601140248.D9Oj5lCh-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202601140248.D9Oj5lCh-lkp@intel.com/
All errors (new ones prefixed by >>):
853 | [ESR_ELx_EC_SVE] = "SVE",
| ^~~~~
arch/arm64/kernel/traps.c:853:43: note: (near initialization for 'esr_class_str[25]')
arch/arm64/kernel/traps.c:854:43: warning: initialized field overwritten [-Woverride-init]
854 | [ESR_ELx_EC_ERET] = "ERET/ERETAA/ERETAB",
| ^~~~~~~~~~~~~~~~~~~~
arch/arm64/kernel/traps.c:854:43: note: (near initialization for 'esr_class_str[26]')
arch/arm64/kernel/traps.c:855:43: warning: initialized field overwritten [-Woverride-init]
855 | [ESR_ELx_EC_FPAC] = "FPAC",
| ^~~~~~
arch/arm64/kernel/traps.c:855:43: note: (near initialization for 'esr_class_str[28]')
arch/arm64/kernel/traps.c:856:43: warning: initialized field overwritten [-Woverride-init]
856 | [ESR_ELx_EC_SME] = "SME",
| ^~~~~
arch/arm64/kernel/traps.c:856:43: note: (near initialization for 'esr_class_str[29]')
arch/arm64/kernel/traps.c:857:43: warning: initialized field overwritten [-Woverride-init]
857 | [ESR_ELx_EC_IMP_DEF] = "EL3 IMP DEF",
| ^~~~~~~~~~~~~
arch/arm64/kernel/traps.c:857:43: note: (near initialization for 'esr_class_str[31]')
arch/arm64/kernel/traps.c:858:43: warning: initialized field overwritten [-Woverride-init]
858 | [ESR_ELx_EC_IABT_LOW] = "IABT (lower EL)",
| ^~~~~~~~~~~~~~~~~
arch/arm64/kernel/traps.c:858:43: note: (near initialization for 'esr_class_str[32]')
arch/arm64/kernel/traps.c:859:43: warning: initialized field overwritten [-Woverride-init]
859 | [ESR_ELx_EC_IABT_CUR] = "IABT (current EL)",
| ^~~~~~~~~~~~~~~~~~~
arch/arm64/kernel/traps.c:859:43: note: (near initialization for 'esr_class_str[33]')
arch/arm64/kernel/traps.c:860:43: warning: initialized field overwritten [-Woverride-init]
860 | [ESR_ELx_EC_PC_ALIGN] = "PC Alignment",
| ^~~~~~~~~~~~~~
arch/arm64/kernel/traps.c:860:43: note: (near initialization for 'esr_class_str[34]')
arch/arm64/kernel/traps.c:861:43: warning: initialized field overwritten [-Woverride-init]
861 | [ESR_ELx_EC_DABT_LOW] = "DABT (lower EL)",
| ^~~~~~~~~~~~~~~~~
arch/arm64/kernel/traps.c:861:43: note: (near initialization for 'esr_class_str[36]')
arch/arm64/kernel/traps.c:862:43: warning: initialized field overwritten [-Woverride-init]
862 | [ESR_ELx_EC_DABT_CUR] = "DABT (current EL)",
| ^~~~~~~~~~~~~~~~~~~
arch/arm64/kernel/traps.c:862:43: note: (near initialization for 'esr_class_str[37]')
arch/arm64/kernel/traps.c:863:43: warning: initialized field overwritten [-Woverride-init]
863 | [ESR_ELx_EC_SP_ALIGN] = "SP Alignment",
| ^~~~~~~~~~~~~~
arch/arm64/kernel/traps.c:863:43: note: (near initialization for 'esr_class_str[38]')
arch/arm64/kernel/traps.c:864:43: warning: initialized field overwritten [-Woverride-init]
864 | [ESR_ELx_EC_MOPS] = "MOPS",
| ^~~~~~
arch/arm64/kernel/traps.c:864:43: note: (near initialization for 'esr_class_str[39]')
arch/arm64/kernel/traps.c:865:43: warning: initialized field overwritten [-Woverride-init]
865 | [ESR_ELx_EC_FP_EXC32] = "FP (AArch32)",
| ^~~~~~~~~~~~~~
arch/arm64/kernel/traps.c:865:43: note: (near initialization for 'esr_class_str[40]')
arch/arm64/kernel/traps.c:866:43: warning: initialized field overwritten [-Woverride-init]
866 | [ESR_ELx_EC_FP_EXC64] = "FP (AArch64)",
| ^~~~~~~~~~~~~~
arch/arm64/kernel/traps.c:866:43: note: (near initialization for 'esr_class_str[44]')
arch/arm64/kernel/traps.c:867:43: warning: initialized field overwritten [-Woverride-init]
867 | [ESR_ELx_EC_GCS] = "Guarded Control Stack",
| ^~~~~~~~~~~~~~~~~~~~~~~
arch/arm64/kernel/traps.c:867:43: note: (near initialization for 'esr_class_str[45]')
arch/arm64/kernel/traps.c:868:43: warning: initialized field overwritten [-Woverride-init]
868 | [ESR_ELx_EC_SERROR] = "SError",
| ^~~~~~~~
arch/arm64/kernel/traps.c:868:43: note: (near initialization for 'esr_class_str[47]')
arch/arm64/kernel/traps.c:869:43: warning: initialized field overwritten [-Woverride-init]
869 | [ESR_ELx_EC_BREAKPT_LOW] = "Breakpoint (lower EL)",
| ^~~~~~~~~~~~~~~~~~~~~~~
arch/arm64/kernel/traps.c:869:43: note: (near initialization for 'esr_class_str[48]')
arch/arm64/kernel/traps.c:870:43: warning: initialized field overwritten [-Woverride-init]
870 | [ESR_ELx_EC_BREAKPT_CUR] = "Breakpoint (current EL)",
| ^~~~~~~~~~~~~~~~~~~~~~~~~
arch/arm64/kernel/traps.c:870:43: note: (near initialization for 'esr_class_str[49]')
arch/arm64/kernel/traps.c:871:43: warning: initialized field overwritten [-Woverride-init]
871 | [ESR_ELx_EC_SOFTSTP_LOW] = "Software Step (lower EL)",
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
arch/arm64/kernel/traps.c:871:43: note: (near initialization for 'esr_class_str[50]')
arch/arm64/kernel/traps.c:872:43: warning: initialized field overwritten [-Woverride-init]
872 | [ESR_ELx_EC_SOFTSTP_CUR] = "Software Step (current EL)",
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/arm64/kernel/traps.c:872:43: note: (near initialization for 'esr_class_str[51]')
arch/arm64/kernel/traps.c:873:43: warning: initialized field overwritten [-Woverride-init]
873 | [ESR_ELx_EC_WATCHPT_LOW] = "Watchpoint (lower EL)",
| ^~~~~~~~~~~~~~~~~~~~~~~
arch/arm64/kernel/traps.c:873:43: note: (near initialization for 'esr_class_str[52]')
arch/arm64/kernel/traps.c:874:43: warning: initialized field overwritten [-Woverride-init]
874 | [ESR_ELx_EC_WATCHPT_CUR] = "Watchpoint (current EL)",
| ^~~~~~~~~~~~~~~~~~~~~~~~~
arch/arm64/kernel/traps.c:874:43: note: (near initialization for 'esr_class_str[53]')
arch/arm64/kernel/traps.c:875:43: warning: initialized field overwritten [-Woverride-init]
875 | [ESR_ELx_EC_BKPT32] = "BKPT (AArch32)",
| ^~~~~~~~~~~~~~~~
arch/arm64/kernel/traps.c:875:43: note: (near initialization for 'esr_class_str[56]')
arch/arm64/kernel/traps.c:876:43: warning: initialized field overwritten [-Woverride-init]
876 | [ESR_ELx_EC_VECTOR32] = "Vector catch (AArch32)",
| ^~~~~~~~~~~~~~~~~~~~~~~~
arch/arm64/kernel/traps.c:876:43: note: (near initialization for 'esr_class_str[58]')
arch/arm64/kernel/traps.c:877:43: warning: initialized field overwritten [-Woverride-init]
877 | [ESR_ELx_EC_BRK64] = "BRK (AArch64)",
| ^~~~~~~~~~~~~~~
arch/arm64/kernel/traps.c:877:43: note: (near initialization for 'esr_class_str[60]')
arch/arm64/kernel/traps.c: In function 'kasan_brk_handler':
>> arch/arm64/kernel/traps.c:1074:9: error: implicit declaration of function 'kasan_die_unless_recover' [-Werror=implicit-function-declaration]
1074 | kasan_die_unless_recover(recover, "Oops - KASAN", regs, esr, die);
| ^~~~~~~~~~~~~~~~~~~~~~~~
cc1: some warnings being treated as errors
vim +/kasan_die_unless_recover +1074 arch/arm64/kernel/traps.c
831
832 static const char *esr_class_str[] = {
833 [0 ... ESR_ELx_EC_MAX] = "UNRECOGNIZED EC",
834 [ESR_ELx_EC_UNKNOWN] = "Unknown/Uncategorized",
835 [ESR_ELx_EC_WFx] = "WFI/WFE",
836 [ESR_ELx_EC_CP15_32] = "CP15 MCR/MRC",
837 [ESR_ELx_EC_CP15_64] = "CP15 MCRR/MRRC",
838 [ESR_ELx_EC_CP14_MR] = "CP14 MCR/MRC",
839 [ESR_ELx_EC_CP14_LS] = "CP14 LDC/STC",
840 [ESR_ELx_EC_FP_ASIMD] = "ASIMD",
841 [ESR_ELx_EC_CP10_ID] = "CP10 MRC/VMRS",
842 [ESR_ELx_EC_PAC] = "PAC",
843 [ESR_ELx_EC_CP14_64] = "CP14 MCRR/MRRC",
844 [ESR_ELx_EC_BTI] = "BTI",
845 [ESR_ELx_EC_ILL] = "PSTATE.IL",
846 [ESR_ELx_EC_SVC32] = "SVC (AArch32)",
847 [ESR_ELx_EC_HVC32] = "HVC (AArch32)",
848 [ESR_ELx_EC_SMC32] = "SMC (AArch32)",
849 [ESR_ELx_EC_SVC64] = "SVC (AArch64)",
850 [ESR_ELx_EC_HVC64] = "HVC (AArch64)",
851 [ESR_ELx_EC_SMC64] = "SMC (AArch64)",
852 [ESR_ELx_EC_SYS64] = "MSR/MRS (AArch64)",
853 [ESR_ELx_EC_SVE] = "SVE",
854 [ESR_ELx_EC_ERET] = "ERET/ERETAA/ERETAB",
855 [ESR_ELx_EC_FPAC] = "FPAC",
856 [ESR_ELx_EC_SME] = "SME",
857 [ESR_ELx_EC_IMP_DEF] = "EL3 IMP DEF",
858 [ESR_ELx_EC_IABT_LOW] = "IABT (lower EL)",
859 [ESR_ELx_EC_IABT_CUR] = "IABT (current EL)",
860 [ESR_ELx_EC_PC_ALIGN] = "PC Alignment",
861 [ESR_ELx_EC_DABT_LOW] = "DABT (lower EL)",
862 [ESR_ELx_EC_DABT_CUR] = "DABT (current EL)",
863 [ESR_ELx_EC_SP_ALIGN] = "SP Alignment",
864 [ESR_ELx_EC_MOPS] = "MOPS",
865 [ESR_ELx_EC_FP_EXC32] = "FP (AArch32)",
866 [ESR_ELx_EC_FP_EXC64] = "FP (AArch64)",
867 [ESR_ELx_EC_GCS] = "Guarded Control Stack",
868 [ESR_ELx_EC_SERROR] = "SError",
869 [ESR_ELx_EC_BREAKPT_LOW] = "Breakpoint (lower EL)",
870 [ESR_ELx_EC_BREAKPT_CUR] = "Breakpoint (current EL)",
871 [ESR_ELx_EC_SOFTSTP_LOW] = "Software Step (lower EL)",
872 [ESR_ELx_EC_SOFTSTP_CUR] = "Software Step (current EL)",
873 [ESR_ELx_EC_WATCHPT_LOW] = "Watchpoint (lower EL)",
874 [ESR_ELx_EC_WATCHPT_CUR] = "Watchpoint (current EL)",
875 [ESR_ELx_EC_BKPT32] = "BKPT (AArch32)",
> 876 [ESR_ELx_EC_VECTOR32] = "Vector catch (AArch32)",
877 [ESR_ELx_EC_BRK64] = "BRK (AArch64)",
878 };
879
880 const char *esr_get_class_string(unsigned long esr)
881 {
882 return esr_class_str[ESR_ELx_EC(esr)];
883 }
884
885 /*
886 * bad_el0_sync handles unexpected, but potentially recoverable synchronous
887 * exceptions taken from EL0.
888 */
889 void bad_el0_sync(struct pt_regs *regs, int reason, unsigned long esr)
890 {
891 unsigned long pc = instruction_pointer(regs);
892
893 current->thread.fault_address = 0;
894 current->thread.fault_code = esr;
895
896 arm64_force_sig_fault(SIGILL, ILL_ILLOPC, pc,
897 "Bad EL0 synchronous exception");
898 }
899
900 DEFINE_PER_CPU(unsigned long [OVERFLOW_STACK_SIZE/sizeof(long)], overflow_stack)
901 __aligned(16);
902
903 void __noreturn panic_bad_stack(struct pt_regs *regs, unsigned long esr, unsigned long far)
904 {
905 unsigned long tsk_stk = (unsigned long)current->stack;
906 unsigned long irq_stk = (unsigned long)this_cpu_read(irq_stack_ptr);
907 unsigned long ovf_stk = (unsigned long)this_cpu_ptr(overflow_stack);
908
909 console_verbose();
910 pr_emerg("Insufficient stack space to handle exception!");
911
912 pr_emerg("ESR: 0x%016lx -- %s\n", esr, esr_get_class_string(esr));
913 pr_emerg("FAR: 0x%016lx\n", far);
914
915 pr_emerg("Task stack: [0x%016lx..0x%016lx]\n",
916 tsk_stk, tsk_stk + THREAD_SIZE);
917 pr_emerg("IRQ stack: [0x%016lx..0x%016lx]\n",
918 irq_stk, irq_stk + IRQ_STACK_SIZE);
919 pr_emerg("Overflow stack: [0x%016lx..0x%016lx]\n",
920 ovf_stk, ovf_stk + OVERFLOW_STACK_SIZE);
921
922 __show_regs(regs);
923
924 /*
925 * We use nmi_panic to limit the potential for recursive overflows, and
926 * to get a better stack trace.
927 */
928 nmi_panic(NULL, "kernel stack overflow");
929 cpu_park_loop();
930 }
931
932 void __noreturn arm64_serror_panic(struct pt_regs *regs, unsigned long esr)
933 {
934 add_taint(TAINT_MACHINE_CHECK, LOCKDEP_STILL_OK);
935 console_verbose();
936
937 pr_crit("SError Interrupt on CPU%d, code 0x%016lx -- %s\n",
938 smp_processor_id(), esr, esr_get_class_string(esr));
939 if (regs)
940 __show_regs(regs);
941
942 nmi_panic(regs, "Asynchronous SError Interrupt");
943
944 cpu_park_loop();
945 }
946
947 bool arm64_is_fatal_ras_serror(struct pt_regs *regs, unsigned long esr)
948 {
949 unsigned long aet = arm64_ras_serror_get_severity(esr);
950
951 switch (aet) {
952 case ESR_ELx_AET_CE: /* corrected error */
953 case ESR_ELx_AET_UEO: /* restartable, not yet consumed */
954 /*
955 * The CPU can make progress. We may take UEO again as
956 * a more severe error.
957 */
958 return false;
959
960 case ESR_ELx_AET_UEU: /* Uncorrected Unrecoverable */
961 case ESR_ELx_AET_UER: /* Uncorrected Recoverable */
962 /*
963 * The CPU can't make progress. The exception may have
964 * been imprecise.
965 *
966 * Neoverse-N1 #1349291 means a non-KVM SError reported as
967 * Unrecoverable should be treated as Uncontainable. We
968 * call arm64_serror_panic() in both cases.
969 */
970 return true;
971
972 case ESR_ELx_AET_UC: /* Uncontainable or Uncategorized error */
973 default:
974 /* Error has been silently propagated */
975 arm64_serror_panic(regs, esr);
976 }
977 }
978
979 void do_serror(struct pt_regs *regs, unsigned long esr)
980 {
981 /* non-RAS errors are not containable */
982 if (!arm64_is_ras_serror(esr) || arm64_is_fatal_ras_serror(regs, esr))
983 arm64_serror_panic(regs, esr);
984 }
985
986 /* GENERIC_BUG traps */
987 #ifdef CONFIG_GENERIC_BUG
988 int is_valid_bugaddr(unsigned long addr)
989 {
990 /*
991 * bug_brk_handler() only called for BRK #BUG_BRK_IMM.
992 * So the answer is trivial -- any spurious instances with no
993 * bug table entry will be rejected by report_bug() and passed
994 * back to the debug-monitors code and handled as a fatal
995 * unexpected debug exception.
996 */
997 return 1;
998 }
999 #endif
1000
1001 int bug_brk_handler(struct pt_regs *regs, unsigned long esr)
1002 {
1003 switch (report_bug(regs->pc, regs)) {
1004 case BUG_TRAP_TYPE_BUG:
1005 die("Oops - BUG", regs, esr);
1006 break;
1007
1008 case BUG_TRAP_TYPE_WARN:
1009 break;
1010
1011 default:
1012 /* unknown/unrecognised bug trap type */
1013 return DBG_HOOK_ERROR;
1014 }
1015
1016 /* If thread survives, skip over the BUG instruction and continue: */
1017 arm64_skip_faulting_instruction(regs, AARCH64_INSN_SIZE);
1018 return DBG_HOOK_HANDLED;
1019 }
1020
1021 #ifdef CONFIG_CFI
1022 int cfi_brk_handler(struct pt_regs *regs, unsigned long esr)
1023 {
1024 unsigned long target;
1025 u32 type;
1026
1027 target = pt_regs_read_reg(regs, FIELD_GET(CFI_BRK_IMM_TARGET, esr));
1028 type = (u32)pt_regs_read_reg(regs, FIELD_GET(CFI_BRK_IMM_TYPE, esr));
1029
1030 switch (report_cfi_failure(regs, regs->pc, &target, type)) {
1031 case BUG_TRAP_TYPE_BUG:
1032 die("Oops - CFI", regs, esr);
1033 break;
1034
1035 case BUG_TRAP_TYPE_WARN:
1036 break;
1037
1038 default:
1039 return DBG_HOOK_ERROR;
1040 }
1041
1042 arm64_skip_faulting_instruction(regs, AARCH64_INSN_SIZE);
1043 return DBG_HOOK_HANDLED;
1044 }
1045 #endif /* CONFIG_CFI */
1046
1047 int reserved_fault_brk_handler(struct pt_regs *regs, unsigned long esr)
1048 {
1049 pr_err("%s generated an invalid instruction at %pS!\n",
1050 "Kernel text patching",
1051 (void *)instruction_pointer(regs));
1052
1053 /* We cannot handle this */
1054 return DBG_HOOK_ERROR;
1055 }
1056
1057 #ifdef CONFIG_KASAN_SW_TAGS
1058
1059 #define KASAN_ESR_RECOVER 0x20
1060 #define KASAN_ESR_WRITE 0x10
1061 #define KASAN_ESR_SIZE_MASK 0x0f
1062 #define KASAN_ESR_SIZE(esr) (1 << ((esr) & KASAN_ESR_SIZE_MASK))
1063
1064 int kasan_brk_handler(struct pt_regs *regs, unsigned long esr)
1065 {
1066 bool recover = esr & KASAN_ESR_RECOVER;
1067 bool write = esr & KASAN_ESR_WRITE;
1068 size_t size = KASAN_ESR_SIZE(esr);
1069 void *addr = (void *)regs->regs[0];
1070 u64 pc = regs->pc;
1071
1072 kasan_report(addr, size, write, pc);
1073
> 1074 kasan_die_unless_recover(recover, "Oops - KASAN", regs, esr, die);
1075
1076 /* If thread survives, skip over the brk instruction and continue: */
1077 arm64_skip_faulting_instruction(regs, AARCH64_INSN_SIZE);
1078 return DBG_HOOK_HANDLED;
1079 }
1080 #endif
1081
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
reply other threads:[~2026-01-13 18:42 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202601140248.D9Oj5lCh-lkp@intel.com \
--to=lkp@intel.com \
--cc=akpm@linux-foundation.org \
--cc=david@kernel.org \
--cc=linux-mm@kvack.org \
--cc=maciej.wieczor-retman@intel.com \
--cc=oe-kbuild-all@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox