Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 263871 Details for
Bug 296539
Uvesafb fails on 2.6.32-gentoo
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
include-linux-kernelh-abs-fix-handling-of-32-bit-unsigneds-on-64-bit.patch
include-linux-kernelh-abs-fix-handling-of-32-bit-unsigneds-on-64-bit.patch (text/plain), 2.71 KB, created by
Serkan Kaba (RETIRED)
on 2011-02-26 04:58:17 UTC
(
hide
)
Description:
include-linux-kernelh-abs-fix-handling-of-32-bit-unsigneds-on-64-bit.patch
Filename:
MIME Type:
Creator:
Serkan Kaba (RETIRED)
Created:
2011-02-26 04:58:17 UTC
Size:
2.71 KB
patch
obsolete
>From: Andrew Morton <akpm@linux-foundation.org> > >Michal reports: > >In the framebuffer subsystem the abs() macro is often used as a part of >the calculation of a Manhattan metric, which in turn is used as a measure >of similarity between video modes. The arguments of abs() are sometimes >unsigned numbers. This worked fine until commit a49c59c0 ("Make sure the >value in abs() does not get truncated if it is greater than 2^32:) , which >changed the definition of abs() to prevent truncation. As a result of >this change, in the following piece of code: > >u32 a = 0, b = 1; >u32 c = abs(a - b); > >'c' will end up with a value of 0xffffffff instead of the expected 0x1. > >A problem caused by this change and visible by the end user is that >framebuffer drivers relying on functions from modedb.c will fail to find >high resolution video modes similar to that explicitly requested by the >user if an exact match cannot be found (see e.g. > >Fix this by special-casing `long' types within abs(). > >This patch reduces x86_64 code size a bit - drivers/video/uvesafb.o shrunk >by 15 bytes, presumably because it is doing abs() on 4-byte quantities, >and expanding those to 8-byte longs adds code. > >testcase: > >#define oldabs(x) ({ \ > long __x = (x); \ > (__x < 0) ? -__x : __x; \ > }) > >#define newabs(x) ({ \ > long ret; \ > if (sizeof(x) == sizeof(long)) { \ > long __x = (x); \ > ret = (__x < 0) ? -__x : __x; \ > } else { \ > int __x = (x); \ > ret = (__x < 0) ? -__x : __x; \ > } \ > ret; \ > }) > >typedef unsigned int u32; > >main() >{ > u32 a = 0; > u32 b = 1; > u32 oldc = oldabs(a - b); > u32 newc = newabs(a - b); > > printf("%u %u\n", oldc, newc); >} > >akpm:/home/akpm> gcc t.c >akpm:/home/akpm> ./a.out >4294967295 1 > >Reported-by: Michal Januszewski <michalj@gmail.com> >Cc: Rolf Eike Beer <eike-kernel@sf-tec.de >Cc: Geert Uytterhoeven <geert@linux-m68k.org> >Signed-off-by: Andrew Morton <akpm@linux-foundation.org> >--- > > include/linux/kernel.h | 13 ++++++++++--- > 1 file changed, 10 insertions(+), 3 deletions(-) > >diff -puN include/linux/kernel.h~include-linux-kernelh-abs-fix-handling-of-32-bit-unsigneds-on-64-bit include/linux/kernel.h >--- a/include/linux/kernel.h~include-linux-kernelh-abs-fix-handling-of-32-bit-unsigneds-on-64-bit >+++ a/include/linux/kernel.h >@@ -143,9 +143,16 @@ extern int _cond_resched(void); > > #define might_sleep_if(cond) do { if (cond) might_sleep(); } while (0) > >-#define abs(x) ({ \ >- long __x = (x); \ >- (__x < 0) ? -__x : __x; \ >+#define abs(x) ({ \ >+ long ret; \ >+ if (sizeof(x) == sizeof(long)) { \ >+ long __x = (x); \ >+ ret = (__x < 0) ? -__x : __x; \ >+ } else { \ >+ int __x = (x); \ >+ ret = (__x < 0) ? -__x : __x; \ >+ } \ >+ ret; \ > }) > > #define abs64(x) ({ \ >_
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 296539
:
232545
|
240249
|
240313
|
240365
|
240379
|
240409
| 263871