traps.c (df7686101956929dcea410971656e34926773b88) traps.c (26a04d84bc5311d7785b229b353f327e866ab61a)
1/*
2 * Based on arch/arm/kernel/traps.c
3 *
4 * Copyright (C) 1995-2009 Russell King
5 * Copyright (C) 2012 ARM Ltd.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as

--- 955 unchanged lines hidden (view full) ---

964 }
965
966 /* If thread survives, skip over the BUG instruction and continue: */
967 arm64_skip_faulting_instruction(regs, AARCH64_INSN_SIZE);
968 return DBG_HOOK_HANDLED;
969}
970
971static struct break_hook bug_break_hook = {
1/*
2 * Based on arch/arm/kernel/traps.c
3 *
4 * Copyright (C) 1995-2009 Russell King
5 * Copyright (C) 2012 ARM Ltd.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as

--- 955 unchanged lines hidden (view full) ---

964 }
965
966 /* If thread survives, skip over the BUG instruction and continue: */
967 arm64_skip_faulting_instruction(regs, AARCH64_INSN_SIZE);
968 return DBG_HOOK_HANDLED;
969}
970
971static struct break_hook bug_break_hook = {
972 .esr_val = 0xf2000000 | BUG_BRK_IMM,
973 .esr_mask = 0xffffffff,
974 .fn = bug_handler,
972 .fn = bug_handler,
973 .imm = BUG_BRK_IMM,
975};
976
977#ifdef CONFIG_KASAN_SW_TAGS
978
979#define KASAN_ESR_RECOVER 0x20
980#define KASAN_ESR_WRITE 0x10
981#define KASAN_ESR_SIZE_MASK 0x0f
982#define KASAN_ESR_SIZE(esr) (1 << ((esr) & KASAN_ESR_SIZE_MASK))

--- 28 unchanged lines hidden (view full) ---

1011 if (!recover)
1012 die("Oops - KASAN", regs, 0);
1013
1014 /* If thread survives, skip over the brk instruction and continue: */
1015 arm64_skip_faulting_instruction(regs, AARCH64_INSN_SIZE);
1016 return DBG_HOOK_HANDLED;
1017}
1018
974};
975
976#ifdef CONFIG_KASAN_SW_TAGS
977
978#define KASAN_ESR_RECOVER 0x20
979#define KASAN_ESR_WRITE 0x10
980#define KASAN_ESR_SIZE_MASK 0x0f
981#define KASAN_ESR_SIZE(esr) (1 << ((esr) & KASAN_ESR_SIZE_MASK))

--- 28 unchanged lines hidden (view full) ---

1010 if (!recover)
1011 die("Oops - KASAN", regs, 0);
1012
1013 /* If thread survives, skip over the brk instruction and continue: */
1014 arm64_skip_faulting_instruction(regs, AARCH64_INSN_SIZE);
1015 return DBG_HOOK_HANDLED;
1016}
1017
1019#define KASAN_ESR_VAL (0xf2000000 | KASAN_BRK_IMM)
1020#define KASAN_ESR_MASK 0xffffff00
1021
1022static struct break_hook kasan_break_hook = {
1018static struct break_hook kasan_break_hook = {
1023 .esr_val = KASAN_ESR_VAL,
1024 .esr_mask = KASAN_ESR_MASK,
1025 .fn = kasan_handler,
1019 .fn = kasan_handler,
1020 .imm = KASAN_BRK_IMM,
1021 .mask = KASAN_BRK_MASK,
1026};
1027#endif
1028
1029/*
1030 * Initial handler for AArch64 BRK exceptions
1031 * This handler only used until debug_traps_init().
1032 */
1033int __init early_brk64(unsigned long addr, unsigned int esr,
1034 struct pt_regs *regs)
1035{
1036#ifdef CONFIG_KASAN_SW_TAGS
1022};
1023#endif
1024
1025/*
1026 * Initial handler for AArch64 BRK exceptions
1027 * This handler only used until debug_traps_init().
1028 */
1029int __init early_brk64(unsigned long addr, unsigned int esr,
1030 struct pt_regs *regs)
1031{
1032#ifdef CONFIG_KASAN_SW_TAGS
1037 if ((esr & KASAN_ESR_MASK) == KASAN_ESR_VAL)
1033 unsigned int comment = esr & BRK64_ESR_MASK;
1034
1035 if ((comment & ~KASAN_BRK_MASK) == KASAN_BRK_IMM)
1038 return kasan_handler(regs, esr) != DBG_HOOK_HANDLED;
1039#endif
1040 return bug_handler(regs, esr) != DBG_HOOK_HANDLED;
1041}
1042
1043/* This registration must happen early, before debug_traps_init(). */
1044void __init trap_init(void)
1045{
1036 return kasan_handler(regs, esr) != DBG_HOOK_HANDLED;
1037#endif
1038 return bug_handler(regs, esr) != DBG_HOOK_HANDLED;
1039}
1040
1041/* This registration must happen early, before debug_traps_init(). */
1042void __init trap_init(void)
1043{
1046 register_break_hook(&bug_break_hook);
1044 register_kernel_break_hook(&bug_break_hook);
1047#ifdef CONFIG_KASAN_SW_TAGS
1045#ifdef CONFIG_KASAN_SW_TAGS
1048 register_break_hook(&kasan_break_hook);
1046 register_kernel_break_hook(&kasan_break_hook);
1049#endif
1050}
1047#endif
1048}