i915 driver fails on i686 userspace + x86_64 kernel

Chris Wilson chris at chris-wilson.co.uk
Sat Oct 12 22:44:37 CEST 2013


On Fri, Oct 11, 2013 at 10:37:25PM -0400, Pavel Roskin wrote:
> Hello!
> 
> I'm running 32-bit Ubuntu 12.04 on the latest x86_64 kernel
> (mainline git).  I'm using the latest X from the x-edgers PPA
> (2.99.904+git20131009.b9ad5b62-0ubuntu0sarvatt~precise).
> 
> The Intel Xorg driver fails with:
> 
> (EE) intel(0): No outputs and no modes.
> 
> Xorg works with the i386 kernel in the same configuration.
> 
> This is my understanding of what is happening.
> 
> sna_output_init() in the userspace driver calls
> DRM_IOCTL_MODE_GETCONNECTOR.  It sets conn.encoders_ptr to a 32-bit
> pointer (an address of enc.encoder_id in the process memory).  That
> pointer is never converted to a 64-bit pointer.
> 
> drm_mode_getconnector() in the kernel simply calls put_user() on
> that pointer to write the encoder IDs.  Debug printing shows that
> the pointer is indeed a 32-bit value.  The encoder ID goes to a
> wrong place in the memory.
> 
> Then sna_output_init() calls DRM_IOCTL_MODE_GETENCODER with the
> enc.encoder_id that wasn't written to by the kernel, so it's 0.
> drm_mode_getencoder() in the kernel returns -EINVAL.
> sna_output_init() fails.  Xorg assumes there are no valid screens
> and exits.
> 
> I believe the error is on the kernel side.  The kernel should
> convert the pointer.  compat_ptr() doesn't convert the value, only
> the type.  The comment in arch/x86/include/asm/compat.h says:

That seems odd as the kernel expects a 32-bit address for the user
process here. Can you please attach a dmesg with drm.debug=7 and
--enable-debug=full Xorg.0.log?
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre


More information about the dri-devel mailing list