aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm
diff options
context:
space:
mode:
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>2011-12-15 15:47:56 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2011-12-15 17:02:19 -0500
commitddf5a25c5fdd4cc276edf451871c38002eec0f95 (patch)
tree6262274a4299ace9b83bc14649049f405c348df0 /arch/arm
parent42ebfc61cfcb13af3e638db1c497dcbde7abfed8 (diff)
ARM: unwinder: fix bisection to find origin in .idx section
The bisection implemented in unwind_find_origin() stopped to early. If there is only a single entry left to check the original code just took the end point as origin which might be wrong. This was introduced in commit de66a979012d ("ARM: 7187/1: fix unwinding for XIP kernels"). Reported-and-tested-by: Nick Bowler <nbowler@elliptictech.com> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/kernel/unwind.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/arm/kernel/unwind.c b/arch/arm/kernel/unwind.c
index 3f03fe0c3269..00df012c4678 100644
--- a/arch/arm/kernel/unwind.c
+++ b/arch/arm/kernel/unwind.c
@@ -160,12 +160,12 @@ static const struct unwind_idx *unwind_find_origin(
160 const struct unwind_idx *start, const struct unwind_idx *stop) 160 const struct unwind_idx *start, const struct unwind_idx *stop)
161{ 161{
162 pr_debug("%s(%p, %p)\n", __func__, start, stop); 162 pr_debug("%s(%p, %p)\n", __func__, start, stop);
163 while (start < stop - 1) { 163 while (start < stop) {
164 const struct unwind_idx *mid = start + ((stop - start) >> 1); 164 const struct unwind_idx *mid = start + ((stop - start) >> 1);
165 165
166 if (mid->addr_offset >= 0x40000000) 166 if (mid->addr_offset >= 0x40000000)
167 /* negative offset */ 167 /* negative offset */
168 start = mid; 168 start = mid + 1;
169 else 169 else
170 /* positive offset */ 170 /* positive offset */
171 stop = mid; 171 stop = mid;