diff options
Diffstat (limited to 'arch/blackfin/mach-common/entry.S')
-rw-r--r-- | arch/blackfin/mach-common/entry.S | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/arch/blackfin/mach-common/entry.S b/arch/blackfin/mach-common/entry.S index eceb484d90f9..847c172a99eb 100644 --- a/arch/blackfin/mach-common/entry.S +++ b/arch/blackfin/mach-common/entry.S | |||
@@ -43,7 +43,7 @@ | |||
43 | #include <asm/asm-offsets.h> | 43 | #include <asm/asm-offsets.h> |
44 | #include <asm/trace.h> | 44 | #include <asm/trace.h> |
45 | 45 | ||
46 | #include <asm/mach-common/context.S> | 46 | #include <asm/context.S> |
47 | 47 | ||
48 | #if defined(CONFIG_BFIN_SCRATCH_REG_RETN) | 48 | #if defined(CONFIG_BFIN_SCRATCH_REG_RETN) |
49 | # define EX_SCRATCH_REG RETN | 49 | # define EX_SCRATCH_REG RETN |
@@ -158,14 +158,16 @@ ENTRY(_ex_single_step) | |||
158 | cc = r7 == r6; | 158 | cc = r7 == r6; |
159 | if cc jump _bfin_return_from_exception; | 159 | if cc jump _bfin_return_from_exception; |
160 | 160 | ||
161 | #ifdef CONFIG_KGDB | ||
161 | /* Don't do single step in hardware exception handler */ | 162 | /* Don't do single step in hardware exception handler */ |
162 | p5.l = lo(IPEND); | 163 | p5.l = lo(IPEND); |
163 | p5.h = hi(IPEND); | 164 | p5.h = hi(IPEND); |
164 | r6 = [p5]; | 165 | r6 = [p5]; |
166 | cc = bittst(r6, 4); | ||
167 | if cc jump _bfin_return_from_exception; | ||
165 | cc = bittst(r6, 5); | 168 | cc = bittst(r6, 5); |
166 | if cc jump _bfin_return_from_exception; | 169 | if cc jump _bfin_return_from_exception; |
167 | 170 | ||
168 | #ifdef CONFIG_KGDB | ||
169 | /* skip single step if current interrupt priority is higher than | 171 | /* skip single step if current interrupt priority is higher than |
170 | * that of the first instruction, from which gdb starts single step */ | 172 | * that of the first instruction, from which gdb starts single step */ |
171 | r6 >>= 6; | 173 | r6 >>= 6; |
@@ -186,17 +188,27 @@ ENTRY(_ex_single_step) | |||
186 | if cc jump .Ldo_single_step; | 188 | if cc jump .Ldo_single_step; |
187 | r6 += -1; | 189 | r6 += -1; |
188 | cc = r6 < r7; | 190 | cc = r6 < r7; |
189 | if cc jump _bfin_return_from_exception; | 191 | if cc jump 1f; |
190 | .Ldo_single_step: | 192 | .Ldo_single_step: |
191 | #endif | 193 | #else |
192 | |||
193 | /* If we were in user mode, do the single step normally. */ | 194 | /* If we were in user mode, do the single step normally. */ |
195 | p5.l = lo(IPEND); | ||
196 | p5.h = hi(IPEND); | ||
194 | r6 = [p5]; | 197 | r6 = [p5]; |
195 | r7 = 0xffe0 (z); | 198 | r7 = 0xffe0 (z); |
196 | r7 = r7 & r6; | 199 | r7 = r7 & r6; |
197 | cc = r7 == 0; | 200 | cc = r7 == 0; |
198 | if cc jump 1f; | 201 | if !cc jump 1f; |
202 | #endif | ||
199 | 203 | ||
204 | /* Single stepping only a single instruction, so clear the trace | ||
205 | * bit here. */ | ||
206 | r7 = syscfg; | ||
207 | bitclr (r7, 0); | ||
208 | syscfg = R7; | ||
209 | jump _ex_trap_c; | ||
210 | |||
211 | 1: | ||
200 | /* | 212 | /* |
201 | * We were in an interrupt handler. By convention, all of them save | 213 | * We were in an interrupt handler. By convention, all of them save |
202 | * SYSCFG with their first instruction, so by checking whether our | 214 | * SYSCFG with their first instruction, so by checking whether our |
@@ -224,15 +236,11 @@ ENTRY(_ex_single_step) | |||
224 | cc = R7 == R6; | 236 | cc = R7 == R6; |
225 | if !cc jump _bfin_return_from_exception; | 237 | if !cc jump _bfin_return_from_exception; |
226 | 238 | ||
227 | 1: | ||
228 | /* Single stepping only a single instruction, so clear the trace | ||
229 | * bit here. */ | ||
230 | r7 = syscfg; | 239 | r7 = syscfg; |
231 | bitclr (r7, 0); | 240 | bitclr (r7, 0); |
232 | syscfg = R7; | 241 | syscfg = R7; |
233 | 242 | ||
234 | jump _ex_trap_c; | 243 | /* Fall through to _bfin_return_from_exception. */ |
235 | |||
236 | ENDPROC(_ex_single_step) | 244 | ENDPROC(_ex_single_step) |
237 | 245 | ||
238 | ENTRY(_bfin_return_from_exception) | 246 | ENTRY(_bfin_return_from_exception) |
@@ -1414,6 +1422,12 @@ ENTRY(_sys_call_table) | |||
1414 | .long _sys_semtimedop | 1422 | .long _sys_semtimedop |
1415 | .long _sys_timerfd_settime | 1423 | .long _sys_timerfd_settime |
1416 | .long _sys_timerfd_gettime | 1424 | .long _sys_timerfd_gettime |
1425 | .long _sys_signalfd4 /* 360 */ | ||
1426 | .long _sys_eventfd2 | ||
1427 | .long _sys_epoll_create1 | ||
1428 | .long _sys_dup3 | ||
1429 | .long _sys_pipe2 | ||
1430 | .long _sys_inotify_init1 /* 365 */ | ||
1417 | 1431 | ||
1418 | .rept NR_syscalls-(.-_sys_call_table)/4 | 1432 | .rept NR_syscalls-(.-_sys_call_table)/4 |
1419 | .long _sys_ni_syscall | 1433 | .long _sys_ni_syscall |