diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2011-06-26 11:01:26 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2011-07-02 05:56:11 -0400 |
commit | da7404725781bc7c736e10cae5521e5604e222a5 (patch) | |
tree | e816cd79e1b09ddcbd41b7cd5b3c6c9c9bd5eb98 /arch/arm/mm/proc-arm6_7.S | |
parent | 0d147db0c127c561f8f9ead9f3c1ec38f89f1040 (diff) |
ARM: entry: data abort: tail-call the main data abort handler
Tail-call the main C data abort handler code from the per-CPU helper
code. Update the comments in the code wrt the new calling and return
register state.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/mm/proc-arm6_7.S')
-rw-r--r-- | arch/arm/mm/proc-arm6_7.S | 29 |
1 files changed, 14 insertions, 15 deletions
diff --git a/arch/arm/mm/proc-arm6_7.S b/arch/arm/mm/proc-arm6_7.S index d4c328ecf3ba..d755d5b83898 100644 --- a/arch/arm/mm/proc-arm6_7.S +++ b/arch/arm/mm/proc-arm6_7.S | |||
@@ -29,7 +29,8 @@ ENTRY(cpu_arm7_dcache_clean_area) | |||
29 | /* | 29 | /* |
30 | * Function: arm6_7_data_abort () | 30 | * Function: arm6_7_data_abort () |
31 | * | 31 | * |
32 | * Params : r4 = aborted context pc | 32 | * Params : r2 = pt_regs |
33 | * : r4 = aborted context pc | ||
33 | * : r5 = aborted context psr | 34 | * : r5 = aborted context psr |
34 | * | 35 | * |
35 | * Purpose : obtain information about current aborted instruction | 36 | * Purpose : obtain information about current aborted instruction |
@@ -49,7 +50,7 @@ ENTRY(cpu_arm7_data_abort) | |||
49 | nop | 50 | nop |
50 | 51 | ||
51 | /* 0 */ b .data_unknown | 52 | /* 0 */ b .data_unknown |
52 | /* 1 */ mov pc, lr @ swp | 53 | /* 1 */ b do_DataAbort @ swp |
53 | /* 2 */ b .data_unknown | 54 | /* 2 */ b .data_unknown |
54 | /* 3 */ b .data_unknown | 55 | /* 3 */ b .data_unknown |
55 | /* 4 */ b .data_arm_lateldrpostconst @ ldr rd, [rn], #m | 56 | /* 4 */ b .data_arm_lateldrpostconst @ ldr rd, [rn], #m |
@@ -60,16 +61,14 @@ ENTRY(cpu_arm7_data_abort) | |||
60 | /* 9 */ b .data_arm_ldmstm @ ldm*b rn, <rlist> | 61 | /* 9 */ b .data_arm_ldmstm @ ldm*b rn, <rlist> |
61 | /* a */ b .data_unknown | 62 | /* a */ b .data_unknown |
62 | /* b */ b .data_unknown | 63 | /* b */ b .data_unknown |
63 | /* c */ mov pc, lr @ ldc rd, [rn], #m @ Same as ldr rd, [rn], #m | 64 | /* c */ b do_DataAbort @ ldc rd, [rn], #m @ Same as ldr rd, [rn], #m |
64 | /* d */ mov pc, lr @ ldc rd, [rn, #m] | 65 | /* d */ b do_DataAbort @ ldc rd, [rn, #m] |
65 | /* e */ b .data_unknown | 66 | /* e */ b .data_unknown |
66 | /* f */ | 67 | /* f */ |
67 | .data_unknown: @ Part of jumptable | 68 | .data_unknown: @ Part of jumptable |
68 | mov r0, r4 | 69 | mov r0, r4 |
69 | mov r1, r8 | 70 | mov r1, r8 |
70 | mov r2, sp | 71 | b baddataabort |
71 | bl baddataabort | ||
72 | b ret_from_exception | ||
73 | 72 | ||
74 | ENTRY(cpu_arm6_data_abort) | 73 | ENTRY(cpu_arm6_data_abort) |
75 | mrc p15, 0, r1, c5, c0, 0 @ get FSR | 74 | mrc p15, 0, r1, c5, c0, 0 @ get FSR |
@@ -79,11 +78,11 @@ ENTRY(cpu_arm6_data_abort) | |||
79 | orreq r1, r1, #1 << 11 @ yes. | 78 | orreq r1, r1, #1 << 11 @ yes. |
80 | and r7, r8, #14 << 24 | 79 | and r7, r8, #14 << 24 |
81 | teq r7, #8 << 24 @ was it ldm/stm | 80 | teq r7, #8 << 24 @ was it ldm/stm |
82 | movne pc, lr | 81 | bne do_DataAbort |
83 | 82 | ||
84 | .data_arm_ldmstm: | 83 | .data_arm_ldmstm: |
85 | tst r8, #1 << 21 @ check writeback bit | 84 | tst r8, #1 << 21 @ check writeback bit |
86 | moveq pc, lr @ no writeback -> no fixup | 85 | beq do_DataAbort @ no writeback -> no fixup |
87 | mov r7, #0x11 | 86 | mov r7, #0x11 |
88 | orr r7, r7, #0x1100 | 87 | orr r7, r7, #0x1100 |
89 | and r6, r8, r7 | 88 | and r6, r8, r7 |
@@ -102,7 +101,7 @@ ENTRY(cpu_arm6_data_abort) | |||
102 | subne r7, r7, r6, lsl #2 @ Undo increment | 101 | subne r7, r7, r6, lsl #2 @ Undo increment |
103 | addeq r7, r7, r6, lsl #2 @ Undo decrement | 102 | addeq r7, r7, r6, lsl #2 @ Undo decrement |
104 | str r7, [sp, r5, lsr #14] @ Put register 'Rn' | 103 | str r7, [sp, r5, lsr #14] @ Put register 'Rn' |
105 | mov pc, lr | 104 | b do_DataAbort |
106 | 105 | ||
107 | .data_arm_apply_r6_and_rn: | 106 | .data_arm_apply_r6_and_rn: |
108 | and r5, r8, #15 << 16 @ Extract 'n' from instruction | 107 | and r5, r8, #15 << 16 @ Extract 'n' from instruction |
@@ -111,25 +110,25 @@ ENTRY(cpu_arm6_data_abort) | |||
111 | subne r7, r7, r6 @ Undo incrmenet | 110 | subne r7, r7, r6 @ Undo incrmenet |
112 | addeq r7, r7, r6 @ Undo decrement | 111 | addeq r7, r7, r6 @ Undo decrement |
113 | str r7, [sp, r5, lsr #14] @ Put register 'Rn' | 112 | str r7, [sp, r5, lsr #14] @ Put register 'Rn' |
114 | mov pc, lr | 113 | b do_DataAbort |
115 | 114 | ||
116 | .data_arm_lateldrpreconst: | 115 | .data_arm_lateldrpreconst: |
117 | tst r8, #1 << 21 @ check writeback bit | 116 | tst r8, #1 << 21 @ check writeback bit |
118 | moveq pc, lr @ no writeback -> no fixup | 117 | beq do_DataAbort @ no writeback -> no fixup |
119 | .data_arm_lateldrpostconst: | 118 | .data_arm_lateldrpostconst: |
120 | movs r9, r8, lsl #20 @ Get offset | 119 | movs r9, r8, lsl #20 @ Get offset |
121 | moveq pc, lr @ zero -> no fixup | 120 | beq do_DataAbort @ zero -> no fixup |
122 | and r5, r8, #15 << 16 @ Extract 'n' from instruction | 121 | and r5, r8, #15 << 16 @ Extract 'n' from instruction |
123 | ldr r7, [sp, r5, lsr #14] @ Get register 'Rn' | 122 | ldr r7, [sp, r5, lsr #14] @ Get register 'Rn' |
124 | tst r8, #1 << 23 @ Check U bit | 123 | tst r8, #1 << 23 @ Check U bit |
125 | subne r7, r7, r9, lsr #20 @ Undo increment | 124 | subne r7, r7, r9, lsr #20 @ Undo increment |
126 | addeq r7, r7, r9, lsr #20 @ Undo decrement | 125 | addeq r7, r7, r9, lsr #20 @ Undo decrement |
127 | str r7, [sp, r5, lsr #14] @ Put register 'Rn' | 126 | str r7, [sp, r5, lsr #14] @ Put register 'Rn' |
128 | mov pc, lr | 127 | b do_DataAbort |
129 | 128 | ||
130 | .data_arm_lateldrprereg: | 129 | .data_arm_lateldrprereg: |
131 | tst r8, #1 << 21 @ check writeback bit | 130 | tst r8, #1 << 21 @ check writeback bit |
132 | moveq pc, lr @ no writeback -> no fixup | 131 | beq do_DataAbort @ no writeback -> no fixup |
133 | .data_arm_lateldrpostreg: | 132 | .data_arm_lateldrpostreg: |
134 | and r7, r8, #15 @ Extract 'm' from instruction | 133 | and r7, r8, #15 @ Extract 'm' from instruction |
135 | ldr r6, [sp, r7, lsl #2] @ Get register 'Rm' | 134 | ldr r6, [sp, r7, lsl #2] @ Get register 'Rm' |