x86/extable: Extend extable functionality
[linux-2.6-microblaze.git] / arch / x86 / include / asm / asm.h
index 3a16848..c878fed 100644 (file)
 
 #else /* ! __ASSEMBLY__ */
 
+# define DEFINE_EXTABLE_TYPE_REG \
+       ".macro extable_type_reg type:req reg:req\n"                                            \
+       ".set found, 0\n"                                                                       \
+       ".set regnr, 0\n"                                                                       \
+       ".irp rs,rax,rcx,rdx,rbx,rsp,rbp,rsi,rdi,r8,r9,r10,r11,r12,r13,r14,r15\n"               \
+       ".ifc \\reg, %%\\rs\n"                                                                  \
+       ".set found, found+1\n"                                                                 \
+       ".long \\type + (regnr << 8)\n"                                                         \
+       ".endif\n"                                                                              \
+       ".set regnr, regnr+1\n"                                                                 \
+       ".endr\n"                                                                               \
+       ".set regnr, 0\n"                                                                       \
+       ".irp rs,eax,ecx,edx,ebx,esp,ebp,esi,edi,r8d,r9d,r10d,r11d,r12d,r13d,r14d,r15d\n"       \
+       ".ifc \\reg, %%\\rs\n"                                                                  \
+       ".set found, found+1\n"                                                                 \
+       ".long \\type + (regnr << 8)\n"                                                         \
+       ".endif\n"                                                                              \
+       ".set regnr, regnr+1\n"                                                                 \
+       ".endr\n"                                                                               \
+       ".if (found != 1)\n"                                                                    \
+       ".error \"extable_type_reg: bad register argument\"\n"                                  \
+       ".endif\n"                                                                              \
+       ".endm\n"
+
+# define UNDEFINE_EXTABLE_TYPE_REG \
+       ".purgem extable_type_reg\n"
+
 # define _ASM_EXTABLE_TYPE(from, to, type)                     \
        " .pushsection \"__ex_table\",\"a\"\n"                  \
        " .balign 4\n"                                          \
        " .long " __stringify(type) " \n"                       \
        " .popsection\n"
 
+# define _ASM_EXTABLE_TYPE_REG(from, to, type, reg)                            \
+       " .pushsection \"__ex_table\",\"a\"\n"                                  \
+       " .balign 4\n"                                                          \
+       " .long (" #from ") - .\n"                                              \
+       " .long (" #to ") - .\n"                                                \
+       DEFINE_EXTABLE_TYPE_REG                                                 \
+       "extable_type_reg reg=" __stringify(reg) ", type=" __stringify(type) " \n"\
+       UNDEFINE_EXTABLE_TYPE_REG                                               \
+       " .popsection\n"
+
 /* For C file, we already have NOKPROBE_SYMBOL macro */
 
 /*