aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mm/abort-lv4t.S
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mm/abort-lv4t.S')
-rw-r--r--arch/arm/mm/abort-lv4t.S48
1 files changed, 22 insertions, 26 deletions
diff --git a/arch/arm/mm/abort-lv4t.S b/arch/arm/mm/abort-lv4t.S
index 54b6d279371a..f3982580c273 100644
--- a/arch/arm/mm/abort-lv4t.S
+++ b/arch/arm/mm/abort-lv4t.S
@@ -7,11 +7,7 @@
7 * : r4 = aborted context pc 7 * : r4 = aborted context pc
8 * : r5 = aborted context psr 8 * : r5 = aborted context psr
9 * 9 *
10 * Returns : r0 = address of abort 10 * Returns : r4-r5, r10-r11, r13 preserved
11 * : r1 = FSR, bit 11 = write
12 * : r2-r8 = corrupted
13 * : r9 = preserved
14 * : sp = pointer to registers
15 * 11 *
16 * Purpose : obtain information about current aborted instruction. 12 * Purpose : obtain information about current aborted instruction.
17 * Note: we read user space. This means we might cause a data 13 * Note: we read user space. This means we might cause a data
@@ -72,30 +68,30 @@ ENTRY(v4t_late_abort)
72 add r6, r6, r6, lsr #8 68 add r6, r6, r6, lsr #8
73 add r6, r6, r6, lsr #4 69 add r6, r6, r6, lsr #4
74 and r6, r6, #15 @ r6 = no. of registers to transfer. 70 and r6, r6, #15 @ r6 = no. of registers to transfer.
75 and r5, r8, #15 << 16 @ Extract 'n' from instruction 71 and r9, r8, #15 << 16 @ Extract 'n' from instruction
76 ldr r7, [r2, r5, lsr #14] @ Get register 'Rn' 72 ldr r7, [r2, r9, lsr #14] @ Get register 'Rn'
77 tst r8, #1 << 23 @ Check U bit 73 tst r8, #1 << 23 @ Check U bit
78 subne r7, r7, r6, lsl #2 @ Undo increment 74 subne r7, r7, r6, lsl #2 @ Undo increment
79 addeq r7, r7, r6, lsl #2 @ Undo decrement 75 addeq r7, r7, r6, lsl #2 @ Undo decrement
80 str r7, [r2, r5, lsr #14] @ Put register 'Rn' 76 str r7, [r2, r9, lsr #14] @ Put register 'Rn'
81 b do_DataAbort 77 b do_DataAbort
82 78
83.data_arm_lateldrhpre: 79.data_arm_lateldrhpre:
84 tst r8, #1 << 21 @ Check writeback bit 80 tst r8, #1 << 21 @ Check writeback bit
85 beq do_DataAbort @ No writeback -> no fixup 81 beq do_DataAbort @ No writeback -> no fixup
86.data_arm_lateldrhpost: 82.data_arm_lateldrhpost:
87 and r5, r8, #0x00f @ get Rm / low nibble of immediate value 83 and r9, r8, #0x00f @ get Rm / low nibble of immediate value
88 tst r8, #1 << 22 @ if (immediate offset) 84 tst r8, #1 << 22 @ if (immediate offset)
89 andne r6, r8, #0xf00 @ { immediate high nibble 85 andne r6, r8, #0xf00 @ { immediate high nibble
90 orrne r6, r5, r6, lsr #4 @ combine nibbles } else 86 orrne r6, r9, r6, lsr #4 @ combine nibbles } else
91 ldreq r6, [r2, r5, lsl #2] @ { load Rm value } 87 ldreq r6, [r2, r9, lsl #2] @ { load Rm value }
92.data_arm_apply_r6_and_rn: 88.data_arm_apply_r6_and_rn:
93 and r5, r8, #15 << 16 @ Extract 'n' from instruction 89 and r9, r8, #15 << 16 @ Extract 'n' from instruction
94 ldr r7, [r2, r5, lsr #14] @ Get register 'Rn' 90 ldr r7, [r2, r9, lsr #14] @ Get register 'Rn'
95 tst r8, #1 << 23 @ Check U bit 91 tst r8, #1 << 23 @ Check U bit
96 subne r7, r7, r6 @ Undo incrmenet 92 subne r7, r7, r6 @ Undo incrmenet
97 addeq r7, r7, r6 @ Undo decrement 93 addeq r7, r7, r6 @ Undo decrement
98 str r7, [r2, r5, lsr #14] @ Put register 'Rn' 94 str r7, [r2, r9, lsr #14] @ Put register 'Rn'
99 b do_DataAbort 95 b do_DataAbort
100 96
101.data_arm_lateldrpreconst: 97.data_arm_lateldrpreconst:
@@ -104,12 +100,12 @@ ENTRY(v4t_late_abort)
104.data_arm_lateldrpostconst: 100.data_arm_lateldrpostconst:
105 movs r6, r8, lsl #20 @ Get offset 101 movs r6, r8, lsl #20 @ Get offset
106 beq do_DataAbort @ zero -> no fixup 102 beq do_DataAbort @ zero -> no fixup
107 and r5, r8, #15 << 16 @ Extract 'n' from instruction 103 and r9, r8, #15 << 16 @ Extract 'n' from instruction
108 ldr r7, [r2, r5, lsr #14] @ Get register 'Rn' 104 ldr r7, [r2, r9, lsr #14] @ Get register 'Rn'
109 tst r8, #1 << 23 @ Check U bit 105 tst r8, #1 << 23 @ Check U bit
110 subne r7, r7, r6, lsr #20 @ Undo increment 106 subne r7, r7, r6, lsr #20 @ Undo increment
111 addeq r7, r7, r6, lsr #20 @ Undo decrement 107 addeq r7, r7, r6, lsr #20 @ Undo decrement
112 str r7, [r2, r5, lsr #14] @ Put register 'Rn' 108 str r7, [r2, r9, lsr #14] @ Put register 'Rn'
113 b do_DataAbort 109 b do_DataAbort
114 110
115.data_arm_lateldrprereg: 111.data_arm_lateldrprereg:
@@ -118,14 +114,14 @@ ENTRY(v4t_late_abort)
118.data_arm_lateldrpostreg: 114.data_arm_lateldrpostreg:
119 and r7, r8, #15 @ Extract 'm' from instruction 115 and r7, r8, #15 @ Extract 'm' from instruction
120 ldr r6, [r2, r7, lsl #2] @ Get register 'Rm' 116 ldr r6, [r2, r7, lsl #2] @ Get register 'Rm'
121 mov r5, r8, lsr #7 @ get shift count 117 mov r9, r8, lsr #7 @ get shift count
122 ands r5, r5, #31 118 ands r9, r9, #31
123 and r7, r8, #0x70 @ get shift type 119 and r7, r8, #0x70 @ get shift type
124 orreq r7, r7, #8 @ shift count = 0 120 orreq r7, r7, #8 @ shift count = 0
125 add pc, pc, r7 121 add pc, pc, r7
126 nop 122 nop
127 123
128 mov r6, r6, lsl r5 @ 0: LSL #!0 124 mov r6, r6, lsl r9 @ 0: LSL #!0
129 b .data_arm_apply_r6_and_rn 125 b .data_arm_apply_r6_and_rn
130 b .data_arm_apply_r6_and_rn @ 1: LSL #0 126 b .data_arm_apply_r6_and_rn @ 1: LSL #0
131 nop 127 nop
@@ -133,7 +129,7 @@ ENTRY(v4t_late_abort)
133 nop 129 nop
134 b .data_unknown @ 3: MUL? 130 b .data_unknown @ 3: MUL?
135 nop 131 nop
136 mov r6, r6, lsr r5 @ 4: LSR #!0 132 mov r6, r6, lsr r9 @ 4: LSR #!0
137 b .data_arm_apply_r6_and_rn 133 b .data_arm_apply_r6_and_rn
138 mov r6, r6, lsr #32 @ 5: LSR #32 134 mov r6, r6, lsr #32 @ 5: LSR #32
139 b .data_arm_apply_r6_and_rn 135 b .data_arm_apply_r6_and_rn
@@ -141,7 +137,7 @@ ENTRY(v4t_late_abort)
141 nop 137 nop
142 b .data_unknown @ 7: MUL? 138 b .data_unknown @ 7: MUL?
143 nop 139 nop
144 mov r6, r6, asr r5 @ 8: ASR #!0 140 mov r6, r6, asr r9 @ 8: ASR #!0
145 b .data_arm_apply_r6_and_rn 141 b .data_arm_apply_r6_and_rn
146 mov r6, r6, asr #32 @ 9: ASR #32 142 mov r6, r6, asr #32 @ 9: ASR #32
147 b .data_arm_apply_r6_and_rn 143 b .data_arm_apply_r6_and_rn
@@ -149,7 +145,7 @@ ENTRY(v4t_late_abort)
149 nop 145 nop
150 b .data_unknown @ B: MUL? 146 b .data_unknown @ B: MUL?
151 nop 147 nop
152 mov r6, r6, ror r5 @ C: ROR #!0 148 mov r6, r6, ror r9 @ C: ROR #!0
153 b .data_arm_apply_r6_and_rn 149 b .data_arm_apply_r6_and_rn
154 mov r6, r6, rrx @ D: RRX 150 mov r6, r6, rrx @ D: RRX
155 b .data_arm_apply_r6_and_rn 151 b .data_arm_apply_r6_and_rn
@@ -216,9 +212,9 @@ ENTRY(v4t_late_abort)
216 and r6, r6, #0x33 212 and r6, r6, #0x33
217 add r6, r6, r9, lsr #2 213 add r6, r6, r9, lsr #2
218 add r6, r6, r6, lsr #4 214 add r6, r6, r6, lsr #4
219 and r5, r8, #7 << 8 215 and r9, r8, #7 << 8
220 ldr r7, [r2, r5, lsr #6] 216 ldr r7, [r2, r9, lsr #6]
221 and r6, r6, #15 @ number of regs to transfer 217 and r6, r6, #15 @ number of regs to transfer
222 sub r7, r7, r6, lsl #2 @ always decrement 218 sub r7, r7, r6, lsl #2 @ always decrement
223 str r7, [r2, r5, lsr #6] 219 str r7, [r2, r9, lsr #6]
224 b do_DataAbort 220 b do_DataAbort