diff options
Diffstat (limited to 'arch/arm64/include/asm/assembler.h')
-rw-r--r-- | arch/arm64/include/asm/assembler.h | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/arch/arm64/include/asm/assembler.h b/arch/arm64/include/asm/assembler.h index fd3e3924041b..5901480bfdca 100644 --- a/arch/arm64/include/asm/assembler.h +++ b/arch/arm64/include/asm/assembler.h | |||
@@ -21,6 +21,7 @@ | |||
21 | #endif | 21 | #endif |
22 | 22 | ||
23 | #include <asm/ptrace.h> | 23 | #include <asm/ptrace.h> |
24 | #include <asm/thread_info.h> | ||
24 | 25 | ||
25 | /* | 26 | /* |
26 | * Stack pushing/popping (register pairs only). Equivalent to store decrement | 27 | * Stack pushing/popping (register pairs only). Equivalent to store decrement |
@@ -68,23 +69,31 @@ | |||
68 | msr daifclr, #8 | 69 | msr daifclr, #8 |
69 | .endm | 70 | .endm |
70 | 71 | ||
71 | .macro disable_step, tmp | 72 | .macro disable_step_tsk, flgs, tmp |
73 | tbz \flgs, #TIF_SINGLESTEP, 9990f | ||
72 | mrs \tmp, mdscr_el1 | 74 | mrs \tmp, mdscr_el1 |
73 | bic \tmp, \tmp, #1 | 75 | bic \tmp, \tmp, #1 |
74 | msr mdscr_el1, \tmp | 76 | msr mdscr_el1, \tmp |
77 | isb // Synchronise with enable_dbg | ||
78 | 9990: | ||
75 | .endm | 79 | .endm |
76 | 80 | ||
77 | .macro enable_step, tmp | 81 | .macro enable_step_tsk, flgs, tmp |
82 | tbz \flgs, #TIF_SINGLESTEP, 9990f | ||
83 | disable_dbg | ||
78 | mrs \tmp, mdscr_el1 | 84 | mrs \tmp, mdscr_el1 |
79 | orr \tmp, \tmp, #1 | 85 | orr \tmp, \tmp, #1 |
80 | msr mdscr_el1, \tmp | 86 | msr mdscr_el1, \tmp |
87 | 9990: | ||
81 | .endm | 88 | .endm |
82 | 89 | ||
83 | .macro enable_dbg_if_not_stepping, tmp | 90 | /* |
84 | mrs \tmp, mdscr_el1 | 91 | * Enable both debug exceptions and interrupts. This is likely to be |
85 | tbnz \tmp, #0, 9990f | 92 | * faster than two daifclr operations, since writes to this register |
86 | enable_dbg | 93 | * are self-synchronising. |
87 | 9990: | 94 | */ |
95 | .macro enable_dbg_and_irq | ||
96 | msr daifclr, #(8 | 2) | ||
88 | .endm | 97 | .endm |
89 | 98 | ||
90 | /* | 99 | /* |