mirror of
https://github.com/torvalds/linux.git
synced 2026-09-21 20:17:00 -04:00
[PARISC] add ASM_EXCEPTIONTABLE_ENTRY() macro
- this macro unifies the code to add exception table entries - additionally use ENTRY()/ENDPROC() at more places Signed-off-by: Helge Deller <deller@gmx.de> Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
This commit is contained in:
committed by
Kyle McMartin
parent
8e9e9844b4
commit
0b3d643f9e
@@ -31,9 +31,13 @@
|
||||
#define STREGM std,ma
|
||||
#define SHRREG shrd
|
||||
#define SHLREG shld
|
||||
#define ADDIB addib,*
|
||||
#define CMPB cmpb,*
|
||||
#define ANDCM andcm,*
|
||||
#define RP_OFFSET 16
|
||||
#define FRAME_SIZE 128
|
||||
#define CALLEE_REG_FRAME_SIZE 144
|
||||
#define ASM_ULONG_INSN .dword
|
||||
#else /* CONFIG_64BIT */
|
||||
#define LDREG ldw
|
||||
#define STREG stw
|
||||
@@ -42,9 +46,13 @@
|
||||
#define STREGM stwm
|
||||
#define SHRREG shr
|
||||
#define SHLREG shlw
|
||||
#define ADDIB addib,
|
||||
#define CMPB cmpb,
|
||||
#define ANDCM andcm
|
||||
#define RP_OFFSET 20
|
||||
#define FRAME_SIZE 64
|
||||
#define CALLEE_REG_FRAME_SIZE 128
|
||||
#define ASM_ULONG_INSN .word
|
||||
#endif
|
||||
|
||||
#define CALLEE_SAVE_FRAME_SIZE (CALLEE_REG_FRAME_SIZE + CALLEE_FLOAT_FRAME_SIZE)
|
||||
|
||||
@@ -14,10 +14,10 @@
|
||||
#define PARISC_BUG_BREAK_ASM "break 0x1f, 0x1fff"
|
||||
#define PARISC_BUG_BREAK_INSN 0x03ffe01f /* PARISC_BUG_BREAK_ASM */
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
#define ASM_ULONG_INSN ".dword"
|
||||
#if defined(CONFIG_64BIT)
|
||||
#define ASM_WORD_INSN ".dword\t"
|
||||
#else
|
||||
#define ASM_ULONG_INSN ".word"
|
||||
#define ASM_WORD_INSN ".word\t"
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_DEBUG_BUGVERBOSE
|
||||
@@ -26,7 +26,7 @@
|
||||
asm volatile("\n" \
|
||||
"1:\t" PARISC_BUG_BREAK_ASM "\n" \
|
||||
"\t.pushsection __bug_table,\"a\"\n" \
|
||||
"2:\t" ASM_ULONG_INSN " 1b, %c0\n" \
|
||||
"2:\t" ASM_WORD_INSN "1b, %c0\n" \
|
||||
"\t.short %c1, %c2\n" \
|
||||
"\t.org 2b+%c3\n" \
|
||||
"\t.popsection" \
|
||||
@@ -49,7 +49,7 @@
|
||||
asm volatile("\n" \
|
||||
"1:\t" PARISC_BUG_BREAK_ASM "\n" \
|
||||
"\t.pushsection __bug_table,\"a\"\n" \
|
||||
"2:\t" ASM_ULONG_INSN " 1b, %c0\n" \
|
||||
"2:\t" ASM_WORD_INSN "1b, %c0\n" \
|
||||
"\t.short %c1, %c2\n" \
|
||||
"\t.org 2b+%c3\n" \
|
||||
"\t.popsection" \
|
||||
@@ -63,7 +63,7 @@
|
||||
asm volatile("\n" \
|
||||
"1:\t" PARISC_BUG_BREAK_ASM "\n" \
|
||||
"\t.pushsection __bug_table,\"a\"\n" \
|
||||
"2:\t" ASM_ULONG_INSN " 1b\n" \
|
||||
"2:\t" ASM_WORD_INSN "1b\n" \
|
||||
"\t.short %c0\n" \
|
||||
"\t.org 2b+%c1\n" \
|
||||
"\t.popsection" \
|
||||
|
||||
@@ -67,6 +67,11 @@ struct exception_table_entry {
|
||||
long fixup; /* fixup routine */
|
||||
};
|
||||
|
||||
#define ASM_EXCEPTIONTABLE_ENTRY( fault_addr, except_addr )\
|
||||
".section __ex_table,\"aw\"\n" \
|
||||
ASM_WORD_INSN #fault_addr ", " #except_addr "\n\t" \
|
||||
".previous\n"
|
||||
|
||||
/*
|
||||
* The page fault handler stores, in a per-cpu area, the following information
|
||||
* if a fixup routine is available.
|
||||
@@ -106,21 +111,15 @@ struct exception_data {
|
||||
})
|
||||
|
||||
#define __get_kernel_asm(ldx,ptr) \
|
||||
__asm__("\n1:\t" ldx "\t0(%2),%0\n" \
|
||||
"\t.section __ex_table,\"aw\"\n" \
|
||||
"\t" ASM_WORD_INSN \
|
||||
"1b,fixup_get_user_skip_1\n" \
|
||||
"\t.previous" \
|
||||
__asm__("\n1:\t" ldx "\t0(%2),%0\n\t" \
|
||||
ASM_EXCEPTIONTABLE_ENTRY(1b, fixup_get_user_skip_1)\
|
||||
: "=r"(__gu_val), "=r"(__gu_err) \
|
||||
: "r"(ptr), "1"(__gu_err) \
|
||||
: "r1");
|
||||
|
||||
#define __get_user_asm(ldx,ptr) \
|
||||
__asm__("\n1:\t" ldx "\t0(%%sr3,%2),%0\n" \
|
||||
"\t.section __ex_table,\"aw\"\n" \
|
||||
"\t" ASM_WORD_INSN \
|
||||
"1b,fixup_get_user_skip_1\n" \
|
||||
"\t.previous" \
|
||||
__asm__("\n1:\t" ldx "\t0(%%sr3,%2),%0\n\t" \
|
||||
ASM_EXCEPTIONTABLE_ENTRY(1b,fixup_get_user_skip_1)\
|
||||
: "=r"(__gu_val), "=r"(__gu_err) \
|
||||
: "r"(ptr), "1"(__gu_err) \
|
||||
: "r1");
|
||||
@@ -164,22 +163,16 @@ struct exception_data {
|
||||
|
||||
#define __put_kernel_asm(stx,x,ptr) \
|
||||
__asm__ __volatile__ ( \
|
||||
"\n1:\t" stx "\t%2,0(%1)\n" \
|
||||
"\t.section __ex_table,\"aw\"\n" \
|
||||
"\t" ASM_WORD_INSN \
|
||||
"1b,fixup_put_user_skip_1\n" \
|
||||
"\t.previous" \
|
||||
"\n1:\t" stx "\t%2,0(%1)\n\t" \
|
||||
ASM_EXCEPTIONTABLE_ENTRY(1b,fixup_put_user_skip_1)\
|
||||
: "=r"(__pu_err) \
|
||||
: "r"(ptr), "r"(x), "0"(__pu_err) \
|
||||
: "r1")
|
||||
|
||||
#define __put_user_asm(stx,x,ptr) \
|
||||
__asm__ __volatile__ ( \
|
||||
"\n1:\t" stx "\t%2,0(%%sr3,%1)\n" \
|
||||
"\t.section __ex_table,\"aw\"\n" \
|
||||
"\t" ASM_WORD_INSN \
|
||||
"1b,fixup_put_user_skip_1\n" \
|
||||
"\t.previous" \
|
||||
"\n1:\t" stx "\t%2,0(%%sr3,%1)\n\t" \
|
||||
ASM_EXCEPTIONTABLE_ENTRY(1b,fixup_put_user_skip_1)\
|
||||
: "=r"(__pu_err) \
|
||||
: "r"(ptr), "r"(x), "0"(__pu_err) \
|
||||
: "r1")
|
||||
@@ -192,12 +185,10 @@ struct exception_data {
|
||||
u32 hi = (__val64) >> 32; \
|
||||
u32 lo = (__val64) & 0xffffffff; \
|
||||
__asm__ __volatile__ ( \
|
||||
"\n1:\tstw %2,0(%1)\n" \
|
||||
"\n2:\tstw %3,4(%1)\n" \
|
||||
"\t.section __ex_table,\"aw\"\n" \
|
||||
"\t.word\t1b,fixup_put_user_skip_2\n" \
|
||||
"\t.word\t2b,fixup_put_user_skip_1\n" \
|
||||
"\t.previous" \
|
||||
"\n1:\tstw %2,0(%1)" \
|
||||
"\n2:\tstw %3,4(%1)\n\t" \
|
||||
ASM_EXCEPTIONTABLE_ENTRY(1b,fixup_put_user_skip_2)\
|
||||
ASM_EXCEPTIONTABLE_ENTRY(2b,fixup_put_user_skip_1)\
|
||||
: "=r"(__pu_err) \
|
||||
: "r"(ptr), "r"(hi), "r"(lo), "0"(__pu_err) \
|
||||
: "r1"); \
|
||||
@@ -208,12 +199,10 @@ struct exception_data {
|
||||
u32 hi = (__val64) >> 32; \
|
||||
u32 lo = (__val64) & 0xffffffff; \
|
||||
__asm__ __volatile__ ( \
|
||||
"\n1:\tstw %2,0(%%sr3,%1)\n" \
|
||||
"\n2:\tstw %3,4(%%sr3,%1)\n" \
|
||||
"\t.section __ex_table,\"aw\"\n" \
|
||||
"\t.word\t1b,fixup_put_user_skip_2\n" \
|
||||
"\t.word\t2b,fixup_put_user_skip_1\n" \
|
||||
"\t.previous" \
|
||||
"\n1:\tstw %2,0(%%sr3,%1)" \
|
||||
"\n2:\tstw %3,4(%%sr3,%1)\n\t" \
|
||||
ASM_EXCEPTIONTABLE_ENTRY(1b,fixup_put_user_skip_2)\
|
||||
ASM_EXCEPTIONTABLE_ENTRY(2b,fixup_put_user_skip_1)\
|
||||
: "=r"(__pu_err) \
|
||||
: "r"(ptr), "r"(hi), "r"(lo), "0"(__pu_err) \
|
||||
: "r1"); \
|
||||
|
||||
Reference in New Issue
Block a user