diff options
Diffstat (limited to 'arch/blackfin/mach-common/entry.S')
-rw-r--r-- | arch/blackfin/mach-common/entry.S | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/arch/blackfin/mach-common/entry.S b/arch/blackfin/mach-common/entry.S index dc9d3ee2e691..56ff51bc8c21 100644 --- a/arch/blackfin/mach-common/entry.S +++ b/arch/blackfin/mach-common/entry.S | |||
@@ -95,6 +95,9 @@ ENTRY(_ex_workaround_261) | |||
95 | R6 = 0x26; /* Data CPLB Miss */ | 95 | R6 = 0x26; /* Data CPLB Miss */ |
96 | cc = R6 == R7; | 96 | cc = R6 == R7; |
97 | if cc jump _ex_dcplb_miss (BP); | 97 | if cc jump _ex_dcplb_miss (BP); |
98 | R6 = 0x23; /* Data CPLB Miss */ | ||
99 | cc = R6 == R7; | ||
100 | if cc jump _ex_dcplb_viol (BP); | ||
98 | /* Handle 0x23 Data CPLB Protection Violation | 101 | /* Handle 0x23 Data CPLB Protection Violation |
99 | * and Data CPLB Multiple Hits - Linux Trap Zero | 102 | * and Data CPLB Multiple Hits - Linux Trap Zero |
100 | */ | 103 | */ |
@@ -102,17 +105,33 @@ ENTRY(_ex_workaround_261) | |||
102 | ENDPROC(_ex_workaround_261) | 105 | ENDPROC(_ex_workaround_261) |
103 | 106 | ||
104 | #else | 107 | #else |
108 | #ifdef CONFIG_MPU | ||
109 | #define _ex_dviol _ex_dcplb_viol | ||
110 | #else | ||
105 | #define _ex_dviol _ex_trap_c | 111 | #define _ex_dviol _ex_trap_c |
112 | #endif | ||
106 | #define _ex_dmiss _ex_dcplb_miss | 113 | #define _ex_dmiss _ex_dcplb_miss |
107 | #define _ex_dmult _ex_trap_c | 114 | #define _ex_dmult _ex_trap_c |
108 | #endif | 115 | #endif |
109 | 116 | ||
117 | |||
118 | ENTRY(_ex_dcplb_viol) | ||
110 | ENTRY(_ex_dcplb_miss) | 119 | ENTRY(_ex_dcplb_miss) |
111 | ENTRY(_ex_icplb_miss) | 120 | ENTRY(_ex_icplb_miss) |
112 | (R7:6,P5:4) = [sp++]; | 121 | (R7:6,P5:4) = [sp++]; |
113 | ASTAT = [sp++]; | 122 | ASTAT = [sp++]; |
114 | SAVE_ALL_SYS | 123 | SAVE_ALL_SYS |
124 | #ifdef CONFIG_MPU | ||
125 | R0 = SEQSTAT; | ||
126 | R1 = SP; | ||
127 | sp += -12; | ||
128 | call _cplb_hdr; | ||
129 | sp += 12; | ||
130 | CC = R0 == 0; | ||
131 | IF !CC JUMP _handle_bad_cplb; | ||
132 | #else | ||
115 | call __cplb_hdr; | 133 | call __cplb_hdr; |
134 | #endif | ||
116 | DEBUG_START_HWTRACE(p5, r7) | 135 | DEBUG_START_HWTRACE(p5, r7) |
117 | RESTORE_ALL_SYS | 136 | RESTORE_ALL_SYS |
118 | SP = EX_SCRATCH_REG; | 137 | SP = EX_SCRATCH_REG; |
@@ -329,7 +348,7 @@ ENTRY(_exception_to_level5) | |||
329 | R7 = R7 + R6; | 348 | R7 = R7 + R6; |
330 | P5 = R7; | 349 | P5 = R7; |
331 | R1 = [P5]; | 350 | R1 = [P5]; |
332 | [SP + 8] = r1; | 351 | [SP + PT_SEQSTAT] = r1; |
333 | 352 | ||
334 | r0 = sp; /* stack frame pt_regs pointer argument ==> r0 */ | 353 | r0 = sp; /* stack frame pt_regs pointer argument ==> r0 */ |
335 | SP += -12; | 354 | SP += -12; |
@@ -633,9 +652,7 @@ ENTRY(_ret_from_exception) | |||
633 | [sp + PT_IPEND] = r0; | 652 | [sp + PT_IPEND] = r0; |
634 | 653 | ||
635 | 1: | 654 | 1: |
636 | r1 = 0x37(Z); | 655 | r2 = LO(~0x37) (Z); |
637 | r2 = ~r1; | ||
638 | r2.h = 0; | ||
639 | r0 = r2 & r0; | 656 | r0 = r2 & r0; |
640 | cc = r0 == 0; | 657 | cc = r0 == 0; |
641 | if !cc jump 4f; /* if not return to user mode, get out */ | 658 | if !cc jump 4f; /* if not return to user mode, get out */ |
@@ -1364,6 +1381,7 @@ ENTRY(_sys_call_table) | |||
1364 | .long _sys_set_robust_list | 1381 | .long _sys_set_robust_list |
1365 | .long _sys_get_robust_list /* 355 */ | 1382 | .long _sys_get_robust_list /* 355 */ |
1366 | .long _sys_fallocate | 1383 | .long _sys_fallocate |
1384 | .long _sys_semtimedop | ||
1367 | .rept NR_syscalls-(.-_sys_call_table)/4 | 1385 | .rept NR_syscalls-(.-_sys_call_table)/4 |
1368 | .long _sys_ni_syscall | 1386 | .long _sys_ni_syscall |
1369 | .endr | 1387 | .endr |