Patchwork [U-Boot,1/1] fix min/max macros in common.h

login
register
mail settings
Submitter Aaron Williams
Date Jan. 25, 2011, 10:30 p.m.
Message ID <201101251430.55755.Aaron.Williams@caviumnetworks.com>
Download mbox | patch
Permalink /patch/80417/
State Superseded
Headers show

Comments

Aaron Williams - Jan. 25, 2011, 10:30 p.m.
In some of my work with the Cavium Octeon 64-bit processor I ran into a 
problem with the min and max macros provided in common.h. The problem occurs 
if x is 32-bit and y is 64-bit. In this case, y will always be truncated to 
32-bits.  This patch fixes this problem.

-Aaron
Aaron Williams - Jan. 27, 2011, 10:44 p.m.
Any comments on this?  This bug caused me a lot of problems since we make use 
of 64-bit values quite a bit.

-Aaron

On Tuesday, January 25, 2011 02:30:55 pm Aaron Williams wrote:
> In some of my work with the Cavium Octeon 64-bit processor I ran into a
> problem with the min and max macros provided in common.h. The problem
> occurs if x is 32-bit and y is 64-bit. In this case, y will always be
> truncated to 32-bits.  This patch fixes this problem.
> 
> -Aaron
> 
> diff --git a/include/common.h b/include/common.h
> index d8c912d..cf5c076 100644
> --- a/include/common.h
> +++ b/include/common.h
> @@ -180,11 +180,13 @@ typedef void (interrupt_handler_t)(void *);
>   * General Purpose Utilities
>   */
>  #define min(X, Y)                              \
> -       ({ typeof (X) __x = (X), __y = (Y);     \
> +       ({ typeof (X) __x = (X);                \
> +               typeof (Y) __y = (Y);           \
>                 (__x < __y) ? __x : __y; })
> 
>  #define max(X, Y)                              \
> -       ({ typeof (X) __x = (X), __y = (Y);     \
> +       ({ typeof (X) __x = (X);                \
> +               typeof (Y) __y = (Y);           \
>                 (__x > __y) ? __x : __y; })
> 
>  #define MIN(x, y)  min(x, y)
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
Aaron Williams - Jan. 31, 2011, 11:14 p.m.
Any comments on this?  This bug caused me a lot of troube.

-Aaron

On Tuesday, January 25, 2011 02:30:55 pm Aaron Williams wrote:
> In some of my work with the Cavium Octeon 64-bit processor I ran into a
> problem with the min and max macros provided in common.h. The problem
> occurs if x is 32-bit and y is 64-bit. In this case, y will always be
> truncated to 32-bits.  This patch fixes this problem.
> 
> -Aaron
> 
> diff --git a/include/common.h b/include/common.h
> index d8c912d..cf5c076 100644
> --- a/include/common.h
> +++ b/include/common.h
> @@ -180,11 +180,13 @@ typedef void (interrupt_handler_t)(void *);
>   * General Purpose Utilities
>   */
>  #define min(X, Y)                              \
> -       ({ typeof (X) __x = (X), __y = (Y);     \
> +       ({ typeof (X) __x = (X);                \
> +               typeof (Y) __y = (Y);           \
>                 (__x < __y) ? __x : __y; })
> 
>  #define max(X, Y)                              \
> -       ({ typeof (X) __x = (X), __y = (Y);     \
> +       ({ typeof (X) __x = (X);                \
> +               typeof (Y) __y = (Y);           \
>                 (__x > __y) ? __x : __y; })
> 
>  #define MIN(x, y)  min(x, y)
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

Patch

diff --git a/include/common.h b/include/common.h
index d8c912d..cf5c076 100644
--- a/include/common.h
+++ b/include/common.h
@@ -180,11 +180,13 @@  typedef void (interrupt_handler_t)(void *);
  * General Purpose Utilities
  */
 #define min(X, Y)                              \
-       ({ typeof (X) __x = (X), __y = (Y);     \
+       ({ typeof (X) __x = (X);                \
+               typeof (Y) __y = (Y);           \
                (__x < __y) ? __x : __y; })
 
 #define max(X, Y)                              \
-       ({ typeof (X) __x = (X), __y = (Y);     \
+       ({ typeof (X) __x = (X);                \
+               typeof (Y) __y = (Y);           \
                (__x > __y) ? __x : __y; })
 
 #define MIN(x, y)  min(x, y)