i915 driver fails on i686 userspace + x86_64 kernel

Chris Wilson chris at chris-wilson.co.uk
Tue Oct 15 22:59:08 CEST 2013


On Tue, Oct 15, 2013 at 02:00:50PM -0400, Pavel Roskin wrote:
> Hi Chris,
> 
> It's almost certainly stack corruption.  This "patch" fixes X for me.
> The first DRM_IOCTL_MODE_GETCONNECTOR in sna_output_init() must be
> overwriting the implied memory bounds.
> 
> diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
> index 28151ab..dac834f 100644
> --- a/src/sna/sna_display.c
> +++ b/src/sna/sna_display.c
> @@ -2588,6 +2588,7 @@ sna_output_init(ScrnInfoPtr scrn, struct sna_mode *mode, int num)
>  	struct sna *sna = to_sna(scrn);
>  	xf86OutputPtr output;
>  	struct drm_mode_get_connector conn;
> +	int enc_protect[16];

Yikes, that implies we have a size mismatch with the kernel - ideally we
construct the struct to have the same size when compiled with 32 or 64 bits.

Please try:

commit a63b4d5a0766a7e98efeff8dd520c58e9a1bea88
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Oct 15 21:53:16 2013 +0100

    sna: Expand packed KMS structs for 64-bit alignment
    
    Pavel Roskin found that with a 32-bit build of the DDX with a 64-bit
    kernel that the call to GETCONNECTOR was overwriting the 4 bytes beyond
    the end of the drm_mode_get_connector structure. This would appear to be
    due to the surreptious padding inserted by the compiler so that the
    structure would be naturally aligned on a 64-bit system. To compenstate
    we need to insert padding between the adjacent 32-bit structures on the
    stack.
    
    As usual, be paranoid and make sure that all the adjacent KMS structs we
    use are padded out to an 64-bit boundary.
    
    Reported-by: Pavel Roskin <proski at gnu.org>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

Thanks,
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre


More information about the dri-devel mailing list