Re: [PATCH 2.6.17 sparc64] 32-bit compat for Mach64 framebuffer

From: Mikael Pettersson
Date: Wed Jul 05 2006 - 21:43:43 EST


On Thu, 06 Jul 2006 09:01:04 +0800, Antonino A. Daplas wrote:
>Mikael Pettersson wrote:
>> To: davem@xxxxxxxxxxxxx
>> Subject: [PATCH 2.6.17 sparc64] 32-bit compat for Mach64 framebuffer
>> Cc: sparclinux@xxxxxxxxxxxxxxx, linux-kernel@xxxxxxxxxxxxxxx, linux-fbdev-devel@xxxxxxxxxxxxxxxxxxxxx
>>
>> In recent sparc64 kernels, starting a 32-bit mode X server on
>> a machine with a Mach64 framebuffer (CONFIG_FB_ATY_CT=y) like
>> an Ultra5, results in the kernel complaining:
>>
>> ioctl32(X:1977): Unknown cmd fd(6) cmd(40584606){00} arg(ef8dd6d8) on /dev/fb0
>> ioctl32(X:1977): Unknown cmd fd(6) cmd(40184600){00} arg(ef8dd6e0) on /dev/fb0
>>
>> That's FBIOGTYPE and FBIOGATTR. These errors occur because
>> kernel 2.6.15-rc2 changed the way sparc64 handles SPARC-specific
>> framebuffer ioctls from 32-bit processes: before 2.6.15-rc2
>> arch/sparc64/kernel/ioctl32.c handled them for all devices,
>> but 2.6.15-rc2 dropped that support and changed SPARC-only
>> framebuffer drivers like ffb.c to set up ->compat_ioctl methods
>> pointing to sbusfb_compat_ioctl in drivers/video/sbuslib.c.
>> However, drivers for framebuffers like the Mach64 that can exist
>> on both SPARCs and non-SPARCs were not adjusted, so in sparc64
>> kernels SPARC-specific framebuffer ioctls on Mach64 devices are
>> no longer accepted from 32-bit mode processes. Hence the errors.
>>
>> The fix is to make atyfb_base.c set up a ->compat_ioctl pointing
>> to sbusfb_compat_ioctl when running in a sparc64 kernel with
>> compatibility for sparc32 user-space, and to compile and link
>> sbuslib.o with the frambuffer driver.
>>
>> A complication is that sbuslib.c doesn't compile on non-SPARC
>> machines, so we must be careful to only enable it in the case
>> described above. That's why the patch puts an ugly "if" statement
>> in the Makefile.
>
>Why not something like this?
>
>1. In Kconfig
>
>config FB_SBUSLIB
>tristate
>default n
>
>Then all the sbus drivers will have this:
>
>select FB_SBUSLIB
>
>and atyfb will have this
>
>select FB_SBUSLIB if SPARC64 && COMPAT
>
>2. In Makefile
>obj-$(CONFIG_FB_SBUSLIB) += sbuslib.o
>
>3. In sbuslib.h
>
>#ifdef CONFIG_COMPAT
>int sbusfb_compat_ioctl(...);
>#else
>#define sbusfb_compat_ioctl NULL;
>#endif

That could work. But it's a much larger patch than mine,
and I don't want to go around hacking random other stuff
just to repair atyfb. It's up the the Powers That Be to
decide whether a local fix or a global one is most appropriate.

>This way, we can also eliminate all the #ifdef CONFIG_COMPAT in all the
>cg* drivers and atyfb.

That would require sbuslib.h to be completely benign on
non-SPARC machines. If it is, great, but I can't currently
guarantee that it is.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/