xref: /openbmc/linux/arch/arm64/include/asm/traps.h (revision ee78fdc7)
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 
6360ffc30dSCatalin Marinas #endif
64