[PATCH libXi] Fix bus error on MIPS N32 for bug #38331.

walter harms wharms at bfs.de
Tue Feb 21 00:32:30 PST 2012



Am 20.02.2012 23:47, schrieb Michał Masłowski:
> XIValuatorClassInfo and XIScrollClassInfo might have an address
> of 4 bytes modulo 8, while they contain doubles which needs 8 byte
> alignment.  This is fixed by adding extra padding before instances of
> these structure in size_classes and copy_classes.
> 
> Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=38331
> Signed-off-by: Michał Masłowski <mtjm at mtjm.eu>
> ---
>  src/XExtInt.c |   28 ++++++++++++++++++++++++++++
>  1 files changed, 28 insertions(+), 0 deletions(-)
> 
> diff --git a/src/XExtInt.c b/src/XExtInt.c
> index b12886d..b537730 100644
> --- a/src/XExtInt.c
> +++ b/src/XExtInt.c
> @@ -1471,6 +1471,30 @@ wireToDeviceEvent(xXIDeviceEvent *in, XGenericEventCookie* cookie)
>      return 1;
>  }
>  
> +/* Return the size with added padding so next element would be
> +   double-aligned unless the architecture is known to allow unaligned
> +   data accesses.  Not doing this can cause a bus error on
> +   MIPS N32. */
> +static size_t
> +pad_to_double(size_t size)
> +{
> +#if !defined(__i386__) && !defined(__sh__)
> +  if (size % sizeof(double) != 0)
> +    size += sizeof(double) - size % sizeof(double);
> +#endif
> +  return size;
> +}
> +
> +static void*
> +pad_ptr_to_double(void* ptr)
> +{
> +#if !defined(__i386__) && !defined(__sh__)
> +  if (((size_t) ptr) % sizeof(double) != 0)
> +    *(unsigned char**) &ptr += sizeof(double) - ((size_t) ptr) % sizeof(double);
> +#endif
> +  return ptr;
> +}
> +

hi,
maybe it is more easy to ask gcc to do this ? you can force a certain alignment
see: http://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html#Type-Attributes

hope that helps.

re,
 wh


>  _X_HIDDEN int
>  size_classes(xXIAnyInfo* from, int nclasses)
>  {
> @@ -1495,9 +1519,11 @@ size_classes(xXIAnyInfo* from, int nclasses)
>                          ((xXIKeyInfo*)any_wire)->num_keycodes);
>                  break;
>              case XIValuatorClass:
> +                len = pad_to_double(len);
>                  l = sizeDeviceClassType(XIValuatorClass, 0);
>                  break;
>              case XIScrollClass:
> +                len = pad_to_double(len);
>                  l = sizeDeviceClassType(XIScrollClass, 0);
>                  break;
>              case XITouchClass:
> @@ -1598,6 +1624,7 @@ copy_classes(XIDeviceInfo* to, xXIAnyInfo* from, int *nclasses)
>                      XIValuatorClassInfo *cls_lib;
>                      xXIValuatorInfo *cls_wire;
>  
> +                    ptr_lib = pad_ptr_to_double(ptr_lib);
>                      cls_lib = next_block(&ptr_lib, sizeof(XIValuatorClassInfo));
>                      cls_wire = (xXIValuatorInfo*)any_wire;
>  
> @@ -1620,6 +1647,7 @@ copy_classes(XIDeviceInfo* to, xXIAnyInfo* from, int *nclasses)
>                      XIScrollClassInfo *cls_lib;
>                      xXIScrollInfo *cls_wire;
>  
> +                    ptr_lib = pad_ptr_to_double(ptr_lib);
>                      cls_lib = next_block(&ptr_lib, sizeof(XIScrollClassInfo));
>                      cls_wire = (xXIScrollInfo*)any_wire;
>  


More information about the xorg-devel mailing list