On Thu, 2013-10-31 at 13:38 -0500, Tom wrote:
> From: Tom Musta <tommu...@gmail.com>
> 
> This patch modifies the unaligned access routines of the sstep.c
> module so that it properly reverses the bytes of storage operands
> in the little endian kernel kernel.

Do that patch differ from v1 ? (I already merged v1)

Cheers,
Ben.
 
> Signed-off-by: Tom Musta <tommu...@gmail.com>
> ---
>  arch/powerpc/lib/sstep.c |   45 +++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 45 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c
> index 7bfaa9d..c8743e1 100644
> --- a/arch/powerpc/lib/sstep.c
> +++ b/arch/powerpc/lib/sstep.c
> @@ -212,11 +212,19 @@ static int __kprobes read_mem_unaligned(unsigned long 
> *dest, unsigned long ea,
>  {
>       int err;
>       unsigned long x, b, c;
> +#ifdef __LITTLE_ENDIAN__
> +     int len = nb; /* save a copy of the length for byte reversal */
> +#endif
>  
>       /* unaligned, do this in pieces */
>       x = 0;
>       for (; nb > 0; nb -= c) {
> +#ifdef __LITTLE_ENDIAN__
> +             c = 1;
> +#endif
> +#ifdef __BIG_ENDIAN__
>               c = max_align(ea);
> +#endif
>               if (c > nb)
>                       c = max_align(nb);
>               err = read_mem_aligned(&b, ea, c);
> @@ -225,7 +233,24 @@ static int __kprobes read_mem_unaligned(unsigned long 
> *dest, unsigned long ea,
>               x = (x << (8 * c)) + b;
>               ea += c;
>       }
> +#ifdef __LITTLE_ENDIAN__
> +     switch (len) {
> +     case 2:
> +             *dest = byterev_2(x);
> +             break;
> +     case 4:
> +             *dest = byterev_4(x);
> +             break;
> +#ifdef __powerpc64__
> +     case 8:
> +             *dest = byterev_8(x);
> +             break;
> +#endif
> +     }
> +#endif
> +#ifdef __BIG_ENDIAN__
>       *dest = x;
> +#endif
>       return 0;
>  }
>  
> @@ -273,9 +298,29 @@ static int __kprobes write_mem_unaligned(unsigned long 
> val, unsigned long ea,
>       int err;
>       unsigned long c;
>  
> +#ifdef __LITTLE_ENDIAN__
> +     switch (nb) {
> +     case 2:
> +             val = byterev_2(val);
> +             break;
> +     case 4:
> +             val = byterev_4(val);
> +             break;
> +#ifdef __powerpc64__
> +     case 8:
> +             val = byterev_8(val);
> +             break;
> +#endif
> +     }
> +#endif
>       /* unaligned or little-endian, do this in pieces */
>       for (; nb > 0; nb -= c) {
> +#ifdef __LITTLE_ENDIAN__
> +             c = 1;
> +#endif
> +#ifdef __BIG_ENDIAN__
>               c = max_align(ea);
> +#endif
>               if (c > nb)
>                       c = max_align(nb);
>               err = write_mem_aligned(val >> (nb - c) * 8, ea, c);


_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to