Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef __ASM_EXTABLE_H
0003 #define __ASM_EXTABLE_H
0004 
0005 #include <linux/stringify.h>
0006 #include <linux/bits.h>
0007 #include <asm/asm-const.h>
0008 
0009 #define EX_TYPE_NONE        0
0010 #define EX_TYPE_FIXUP       1
0011 #define EX_TYPE_BPF     2
0012 #define EX_TYPE_UA_STORE    3
0013 #define EX_TYPE_UA_LOAD_MEM 4
0014 #define EX_TYPE_UA_LOAD_REG 5
0015 
0016 #define EX_DATA_REG_ERR_SHIFT   0
0017 #define EX_DATA_REG_ERR     GENMASK(3, 0)
0018 
0019 #define EX_DATA_REG_ADDR_SHIFT  4
0020 #define EX_DATA_REG_ADDR    GENMASK(7, 4)
0021 
0022 #define EX_DATA_LEN_SHIFT   8
0023 #define EX_DATA_LEN     GENMASK(11, 8)
0024 
0025 #define __EX_TABLE(_section, _fault, _target, _type)            \
0026     stringify_in_c(.section _section,"a";)              \
0027     stringify_in_c(.align   4;)                 \
0028     stringify_in_c(.long    (_fault) - .;)              \
0029     stringify_in_c(.long    (_target) - .;)             \
0030     stringify_in_c(.short   (_type);)               \
0031     stringify_in_c(.short   0;)                 \
0032     stringify_in_c(.previous)
0033 
0034 #define __EX_TABLE_UA(_section, _fault, _target, _type, _regerr, _regaddr, _len)\
0035     stringify_in_c(.section _section,"a";)                  \
0036     stringify_in_c(.align   4;)                     \
0037     stringify_in_c(.long    (_fault) - .;)                  \
0038     stringify_in_c(.long    (_target) - .;)                 \
0039     stringify_in_c(.short   (_type);)                   \
0040     stringify_in_c(.macro   extable_reg regerr, regaddr;)           \
0041     stringify_in_c(.set .Lfound, 0;)                    \
0042     stringify_in_c(.set .Lcurr, 0;)                 \
0043     stringify_in_c(.irp rs,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;)  \
0044     stringify_in_c(     .ifc    "\regerr", "%%r\rs";)           \
0045     stringify_in_c(         .set    .Lfound, 1;)            \
0046     stringify_in_c(         .set    .Lregerr, .Lcurr;)      \
0047     stringify_in_c(     .endif;)                    \
0048     stringify_in_c(     .set    .Lcurr, .Lcurr+1;)          \
0049     stringify_in_c(.endr;)                          \
0050     stringify_in_c(.ifne    (.Lfound != 1);)                \
0051     stringify_in_c(     .error  "extable_reg: bad register argument1";) \
0052     stringify_in_c(.endif;)                         \
0053     stringify_in_c(.set .Lfound, 0;)                    \
0054     stringify_in_c(.set .Lcurr, 0;)                 \
0055     stringify_in_c(.irp rs,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;)  \
0056     stringify_in_c(     .ifc    "\regaddr", "%%r\rs";)          \
0057     stringify_in_c(         .set    .Lfound, 1;)            \
0058     stringify_in_c(         .set    .Lregaddr, .Lcurr;)     \
0059     stringify_in_c(     .endif;)                    \
0060     stringify_in_c(     .set    .Lcurr, .Lcurr+1;)          \
0061     stringify_in_c(.endr;)                          \
0062     stringify_in_c(.ifne    (.Lfound != 1);)                \
0063     stringify_in_c(     .error  "extable_reg: bad register argument2";) \
0064     stringify_in_c(.endif;)                         \
0065     stringify_in_c(.short   .Lregerr << EX_DATA_REG_ERR_SHIFT |     \
0066                 .Lregaddr << EX_DATA_REG_ADDR_SHIFT |       \
0067                 _len << EX_DATA_LEN_SHIFT;)         \
0068     stringify_in_c(.endm;)                          \
0069     stringify_in_c(extable_reg _regerr,_regaddr;)               \
0070     stringify_in_c(.purgem  extable_reg;)                   \
0071     stringify_in_c(.previous)
0072 
0073 #define EX_TABLE(_fault, _target)                   \
0074     __EX_TABLE(__ex_table, _fault, _target, EX_TYPE_FIXUP)
0075 
0076 #define EX_TABLE_AMODE31(_fault, _target)               \
0077     __EX_TABLE(.amode31.ex_table, _fault, _target, EX_TYPE_FIXUP)
0078 
0079 #define EX_TABLE_UA_STORE(_fault, _target, _regerr)         \
0080     __EX_TABLE_UA(__ex_table, _fault, _target, EX_TYPE_UA_STORE, _regerr, _regerr, 0)
0081 
0082 #define EX_TABLE_UA_LOAD_MEM(_fault, _target, _regerr, _regmem, _len)   \
0083     __EX_TABLE_UA(__ex_table, _fault, _target, EX_TYPE_UA_LOAD_MEM, _regerr, _regmem, _len)
0084 
0085 #define EX_TABLE_UA_LOAD_REG(_fault, _target, _regerr, _regzero)    \
0086     __EX_TABLE_UA(__ex_table, _fault, _target, EX_TYPE_UA_LOAD_REG, _regerr, _regzero, 0)
0087 
0088 #endif /* __ASM_EXTABLE_H */