Date: Sun, 19 Aug 2012 09:43:32 +0800 From: Meowthink <meowthink@gmail.com> To: Konstantin Belousov <kostikbel@gmail.com> Cc: freebsd-x11@freebsd.org, freebsd-emulation@freebsd.org Subject: Re: [CFT]Patch for dri / drm interoperability i386 world / amd64 kernel Message-ID: <CABnABobMbR=Zp5Ppd6heVO9mV7iqmBxuZ4RMr9zXP441-mRSXQ@mail.gmail.com> In-Reply-To: <20120818190225.GF33100@deviant.kiev.zoral.com.ua> References: <CABnABoZKENJqcoQbkw6A0hJY_YY6Y0-FUM6GghtE%2Ba4wH7GwVA@mail.gmail.com> <20120818190225.GF33100@deviant.kiev.zoral.com.ua>
next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, Aug 19, 2012 at 3:02 AM, Konstantin Belousov
<kostikbel@gmail.com> wrote:
> On Sat, Aug 11, 2012 at 09:25:09AM +0800, Meowthink wrote:
>> Hello all,
>>
>> So long FreeBSD's DRI implementation lacks of i386/amd64
>> interoperability, as discussed [0] [1]. This breaks wine, linuxulator
>> etc. drawing using DRI-based OpenGL.
>> Paul Mackerras et al. actually did that part for Linux implementation,
>> so I simply translated their work to FreeBSD. Due to my poor
>> programming skills, there's some limitations:
>> 0. I tried to split compatible codes into separate files, like under
>> Linux. But as a result of the difference between FreeBSD and Linux,
>> the code is integrated in a "#include ...ioc32.c" form which is not
>> so elegant.
>> 1. For same reason, struct drm_driver_info has to be changed.
> I fixed 0 and 1 to my liking and committed the patch.
>
> Thank you.
>
>> 2. There should be some assertions if a 64-bit pointer failed to fit
>> in a 32-bit space. Linux implementation didn't do this either, but
>> they're guaranteed by user-space ioctl structures. This may result
>> unstable under heavy load.
> I am not sure what do you mean exactly. Can you elaborate, please ?
Excuse me for my poor expression. What I mean is, for example, line
177-180 in sys/dev/drm2/drm_ioc32.c reads:
handle = map.handle;
m32->mtrr = map.mtrr;
m32->handle = (unsigned long)handle;
drm_map.handle will be a 64-bit pointer under 64-bit mode, so I wonder
this needs verification? But Linux version of drm didn't verify:
if (__get_user(m32.offset, &map->offset)
|| __get_user(m32.size, &map->size)
|| __get_user(m32.type, &map->type)
|| __get_user(m32.flags, &map->flags)
|| __get_user(handle, &map->handle)
|| __get_user(m32.mtrr, &map->mtrr))
return -EFAULT;
m32.handle = (unsigned long)handle;
if (copy_to_user(argp, &m32, sizeof(m32)))
return -EFAULT;
In this case, drm_addmap(drm_bufs.c) guarantee the handle always a
32-bit integer, with 0s only in high 32 bits on amd64. But I'm not
very sure that all kinds of this pointer operations, esp. those
buffer-related address ops can guarantee a 32-bit pointer in all
cases.
Thanks for your review.
Meowthink
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CABnABobMbR=Zp5Ppd6heVO9mV7iqmBxuZ4RMr9zXP441-mRSXQ>
