diff options
author | Uwe Kleine-König <u.kleine-koenig@pengutronix.de> | 2011-12-15 15:47:56 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-12-15 17:02:19 -0500 |
commit | ddf5a25c5fdd4cc276edf451871c38002eec0f95 (patch) | |
tree | 6262274a4299ace9b83bc14649049f405c348df0 /arch | |
parent | 42ebfc61cfcb13af3e638db1c497dcbde7abfed8 (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')
-rw-r--r-- | arch/arm/kernel/unwind.c | 4 |
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; |