cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

bug.h (2620B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef _ASMARM_BUG_H
      3#define _ASMARM_BUG_H
      4
      5#include <linux/linkage.h>
      6#include <linux/types.h>
      7#include <asm/opcodes.h>
      8
      9/*
     10 * Use a suitable undefined instruction to use for ARM/Thumb2 bug handling.
     11 * We need to be careful not to conflict with those used by other modules and
     12 * the register_undef_hook() system.
     13 */
     14#ifdef CONFIG_THUMB2_KERNEL
     15#define BUG_INSTR_VALUE 0xde02
     16#define BUG_INSTR(__value) __inst_thumb16(__value)
     17#else
     18#define BUG_INSTR_VALUE 0xe7f001f2
     19#define BUG_INSTR(__value) __inst_arm(__value)
     20#endif
     21
     22
     23#define BUG() _BUG(__FILE__, __LINE__, BUG_INSTR_VALUE)
     24#define _BUG(file, line, value) __BUG(file, line, value)
     25
     26#ifdef CONFIG_DEBUG_BUGVERBOSE
     27
     28/*
     29 * The extra indirection is to ensure that the __FILE__ string comes through
     30 * OK. Many version of gcc do not support the asm %c parameter which would be
     31 * preferable to this unpleasantness. We use mergeable string sections to
     32 * avoid multiple copies of the string appearing in the kernel image.
     33 */
     34
     35#define __BUG(__file, __line, __value)				\
     36do {								\
     37	asm volatile("1:\t" BUG_INSTR(__value) "\n"  \
     38		".pushsection .rodata.str, \"aMS\", %progbits, 1\n" \
     39		"2:\t.asciz " #__file "\n" 			\
     40		".popsection\n" 				\
     41		".pushsection __bug_table,\"aw\"\n"		\
     42		".align 2\n"					\
     43		"3:\t.word 1b, 2b\n"				\
     44		"\t.hword " #__line ", 0\n"			\
     45		".popsection");					\
     46	unreachable();						\
     47} while (0)
     48
     49#else
     50
     51#define __BUG(__file, __line, __value)				\
     52do {								\
     53	asm volatile(BUG_INSTR(__value) "\n");			\
     54	unreachable();						\
     55} while (0)
     56#endif  /* CONFIG_DEBUG_BUGVERBOSE */
     57
     58#define HAVE_ARCH_BUG
     59
     60#include <asm-generic/bug.h>
     61
     62struct pt_regs;
     63void die(const char *msg, struct pt_regs *regs, int err);
     64
     65void arm_notify_die(const char *str, struct pt_regs *regs,
     66		int signo, int si_code, void __user *addr,
     67		unsigned long err, unsigned long trap);
     68
     69#ifdef CONFIG_ARM_LPAE
     70#define FAULT_CODE_ALIGNMENT	33
     71#define FAULT_CODE_DEBUG	34
     72#else
     73#define FAULT_CODE_ALIGNMENT	1
     74#define FAULT_CODE_DEBUG	2
     75#endif
     76
     77void hook_fault_code(int nr, int (*fn)(unsigned long, unsigned int,
     78				       struct pt_regs *),
     79		     int sig, int code, const char *name);
     80
     81void hook_ifault_code(int nr, int (*fn)(unsigned long, unsigned int,
     82				       struct pt_regs *),
     83		     int sig, int code, const char *name);
     84
     85extern asmlinkage void c_backtrace(unsigned long fp, int pmode,
     86				   const char *loglvl);
     87
     88struct mm_struct;
     89void show_pte(const char *lvl, struct mm_struct *mm, unsigned long addr);
     90extern void __show_regs(struct pt_regs *);
     91extern void __show_regs_alloc_free(struct pt_regs *regs);
     92
     93#endif