diff options
author | Antonino A. Daplas <adaplas@gmail.com> | 2005-12-13 01:17:21 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-12-13 01:31:17 -0500 |
commit | be0d9b6c7aeaad1683059c00131cabd4c894c17c (patch) | |
tree | f7e55af855531331113cbddb98688f3901d48425 /drivers/video/cfbfillrect.c | |
parent | 7275b4b6bc2f783c135c3f0eeecc4fdc6e788aa8 (diff) |
[PATCH] fbdev: Fix incorrect unaligned access in little-endian machines
The drawing function cfbfillrect does not work correctly when access is not
unsigned-long aligned. It manifests as extra lines of pixels that are not
complete drawn. Reversing the shift operator solves the problem, so I would
presume that this bug would manifest only on little endian machines. The
function cfbcopyarea may also have this bug.
Aligned access should present no problems.
Signed-off-by: Antonino Daplas <adaplas@pol.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/video/cfbfillrect.c')
-rw-r--r-- | drivers/video/cfbfillrect.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/drivers/video/cfbfillrect.c b/drivers/video/cfbfillrect.c index 167d9314e6eb..e5ff62e9cfb8 100644 --- a/drivers/video/cfbfillrect.c +++ b/drivers/video/cfbfillrect.c | |||
@@ -110,8 +110,8 @@ bitfill_aligned(unsigned long __iomem *dst, int dst_idx, unsigned long pat, unsi | |||
110 | if (!n) | 110 | if (!n) |
111 | return; | 111 | return; |
112 | 112 | ||
113 | first = ~0UL >> dst_idx; | 113 | first = FB_SHIFT_HIGH(~0UL, dst_idx); |
114 | last = ~(~0UL >> ((dst_idx+n) % bits)); | 114 | last = ~(FB_SHIFT_HIGH(~0UL, (dst_idx+n) % bits)); |
115 | 115 | ||
116 | if (dst_idx+n <= bits) { | 116 | if (dst_idx+n <= bits) { |
117 | // Single word | 117 | // Single word |
@@ -167,8 +167,8 @@ bitfill_unaligned(unsigned long __iomem *dst, int dst_idx, unsigned long pat, | |||
167 | if (!n) | 167 | if (!n) |
168 | return; | 168 | return; |
169 | 169 | ||
170 | first = ~0UL >> dst_idx; | 170 | first = FB_SHIFT_HIGH(~0UL, dst_idx); |
171 | last = ~(~0UL >> ((dst_idx+n) % bits)); | 171 | last = ~(FB_SHIFT_HIGH(~0UL, (dst_idx+n) % bits)); |
172 | 172 | ||
173 | if (dst_idx+n <= bits) { | 173 | if (dst_idx+n <= bits) { |
174 | // Single word | 174 | // Single word |
@@ -221,8 +221,8 @@ bitfill_aligned_rev(unsigned long __iomem *dst, int dst_idx, unsigned long pat, | |||
221 | if (!n) | 221 | if (!n) |
222 | return; | 222 | return; |
223 | 223 | ||
224 | first = ~0UL >> dst_idx; | 224 | first = FB_SHIFT_HIGH(~0UL, dst_idx); |
225 | last = ~(~0UL >> ((dst_idx+n) % bits)); | 225 | last = ~(FB_SHIFT_HIGH(~0UL, (dst_idx+n) % bits)); |
226 | 226 | ||
227 | if (dst_idx+n <= bits) { | 227 | if (dst_idx+n <= bits) { |
228 | // Single word | 228 | // Single word |
@@ -290,8 +290,8 @@ bitfill_unaligned_rev(unsigned long __iomem *dst, int dst_idx, unsigned long pat | |||
290 | if (!n) | 290 | if (!n) |
291 | return; | 291 | return; |
292 | 292 | ||
293 | first = ~0UL >> dst_idx; | 293 | first = FB_SHIFT_HIGH(~0UL, dst_idx); |
294 | last = ~(~0UL >> ((dst_idx+n) % bits)); | 294 | last = ~(FB_SHIFT_HIGH(~0UL, (dst_idx+n) % bits)); |
295 | 295 | ||
296 | if (dst_idx+n <= bits) { | 296 | if (dst_idx+n <= bits) { |
297 | // Single word | 297 | // Single word |