160ffc30dSCatalin Marinas /* 260ffc30dSCatalin Marinas * Based on arch/arm/include/asm/traps.h 360ffc30dSCatalin Marinas * 460ffc30dSCatalin Marinas * Copyright (C) 2012 ARM Ltd. 560ffc30dSCatalin Marinas * 660ffc30dSCatalin Marinas * This program is free software; you can redistribute it and/or modify 760ffc30dSCatalin Marinas * it under the terms of the GNU General Public License version 2 as 860ffc30dSCatalin Marinas * published by the Free Software Foundation. 960ffc30dSCatalin Marinas * 1060ffc30dSCatalin Marinas * This program is distributed in the hope that it will be useful, 1160ffc30dSCatalin Marinas * but WITHOUT ANY WARRANTY; without even the implied warranty of 1260ffc30dSCatalin Marinas * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1360ffc30dSCatalin Marinas * GNU General Public License for more details. 1460ffc30dSCatalin Marinas * 1560ffc30dSCatalin Marinas * You should have received a copy of the GNU General Public License 1660ffc30dSCatalin Marinas * along with this program. If not, see <http://www.gnu.org/licenses/>. 1760ffc30dSCatalin Marinas */ 1860ffc30dSCatalin Marinas #ifndef __ASM_TRAP_H 1960ffc30dSCatalin Marinas #define __ASM_TRAP_H 2060ffc30dSCatalin Marinas 219b79f52dSPunit Agrawal #include <linux/list.h> 22ee78fdc7SJames Morse #include <asm/sections.h> 239b79f52dSPunit Agrawal 249b79f52dSPunit Agrawal struct pt_regs; 259b79f52dSPunit Agrawal 269b79f52dSPunit Agrawal struct undef_hook { 279b79f52dSPunit Agrawal struct list_head node; 289b79f52dSPunit Agrawal u32 instr_mask; 299b79f52dSPunit Agrawal u32 instr_val; 309b79f52dSPunit Agrawal u64 pstate_mask; 319b79f52dSPunit Agrawal u64 pstate_val; 329b79f52dSPunit Agrawal int (*fn)(struct pt_regs *regs, u32 instr); 339b79f52dSPunit Agrawal }; 349b79f52dSPunit Agrawal 359b79f52dSPunit Agrawal void register_undef_hook(struct undef_hook *hook); 369b79f52dSPunit Agrawal void unregister_undef_hook(struct undef_hook *hook); 379b79f52dSPunit Agrawal 38390bf177SAndre Przywara void arm64_notify_segfault(struct pt_regs *regs, unsigned long addr); 39390bf177SAndre Przywara 409a5ad7d0SJungseok Lee #ifdef CONFIG_FUNCTION_GRAPH_TRACER 419a5ad7d0SJungseok Lee static inline int __in_irqentry_text(unsigned long ptr) 429a5ad7d0SJungseok Lee { 439a5ad7d0SJungseok Lee return ptr >= (unsigned long)&__irqentry_text_start && 449a5ad7d0SJungseok Lee ptr < (unsigned long)&__irqentry_text_end; 459a5ad7d0SJungseok Lee } 469a5ad7d0SJungseok Lee #else 479a5ad7d0SJungseok Lee static inline int __in_irqentry_text(unsigned long ptr) 489a5ad7d0SJungseok Lee { 499a5ad7d0SJungseok Lee return 0; 509a5ad7d0SJungseok Lee } 519a5ad7d0SJungseok Lee #endif 529a5ad7d0SJungseok Lee 5360ffc30dSCatalin Marinas static inline int in_exception_text(unsigned long ptr) 5460ffc30dSCatalin Marinas { 559a5ad7d0SJungseok Lee int in; 5660ffc30dSCatalin Marinas 579a5ad7d0SJungseok Lee in = ptr >= (unsigned long)&__exception_text_start && 5860ffc30dSCatalin Marinas ptr < (unsigned long)&__exception_text_end; 599a5ad7d0SJungseok Lee 609a5ad7d0SJungseok Lee return in ? : __in_irqentry_text(ptr); 6160ffc30dSCatalin Marinas } 6260ffc30dSCatalin Marinas 6373267498SArd Biesheuvel static inline int in_entry_text(unsigned long ptr) 6473267498SArd Biesheuvel { 6573267498SArd Biesheuvel return ptr >= (unsigned long)&__entry_text_start && 6673267498SArd Biesheuvel ptr < (unsigned long)&__entry_text_end; 6773267498SArd Biesheuvel } 6860ffc30dSCatalin Marinas #endif 69