I found that gcc doesn't manage to do this rewrite itself. My micro-patch
saves a few bytes. Also the code becomes a little bit cleaner (IMHO).
Probably the same change could (and should) be made for the other
architectures too.
Per Persson
[email protected]
--- arch/i386/mm/extable.c.orig Mon Nov 12 00:13:52 2001
+++ arch/i386/mm/extable.c Tue Nov 13 17:39:42 2001
@@ -19,7 +19,7 @@
const struct exception_table_entry *mid;
long diff;
- mid = (last - first) / 2 + first;
+ mid = (last + first) / 2
diff = mid->insn - value;
if (diff == 0)
return mid->fixup;
Per Persson wrote:
>
> I found that gcc doesn't manage to do this rewrite itself. My micro-patch
> saves a few bytes. Also the code becomes a little bit cleaner (IMHO).
>
> Probably the same change could (and should) be made for the other
> architectures too.
>
> Per Persson
> [email protected]
>
> --- arch/i386/mm/extable.c.orig Mon Nov 12 00:13:52 2001
> +++ arch/i386/mm/extable.c Tue Nov 13 17:39:42 2001
> @@ -19,7 +19,7 @@
> const struct exception_table_entry *mid;
> long diff;
>
> - mid = (last - first) / 2 + first;
> + mid = (last + first) / 2
> diff = mid->insn - value;
> if (diff == 0)
> return mid->fixup;
>
This change will not work because of lost high bits due to overflow.
Remember that kernel addresses are in the 0xc0000000-0xffffffff range.
--
Brian Gerst
On Tue, 2001-11-13 at 17:32, Per Persson wrote:
> - mid = (last - first) / 2 + first;
> + mid = (last + first) / 2
Ehh, maybe its my scientific computer side talking, but your change will
overflow. Adding two addresses can certainly return an address larger
than 0xffffffff, so you see formulas like the above.
Robert Love