On Thu, 14 Sep 2023 13:17:00 -0400
Steven Rostedt <rost...@goodmis.org> wrote:

> Now lets look at big endian layout:
> 
>  uaddr = 0xbeef0004
>  enabler = 1;
> 
>  memory at 0xbeef0000:  00 00 00 00 00 00 00 02
>                                     ^
>                                     addr: 0xbeef0004
> 
>                               (enabler is set )
> 
>       bitoffset = uaddr & (sizeof(unsigned long) - 1); bitoffset = 4
>       bit_offset *= 8;                                 bitoffset = 32
>       uaddr &= ~(sizeof(unsigned long) - 1);           uaddr = 0xbeef0000
> 
>       ptr = kaddr + (uaddr & ~PAGE_MASK);
> 
>       clear_bit(1 + 32, ptr);
> 
>  memory at 0xbeef0000:  00 00 00 00 00 00 00 02
>                                   ^
>                               bit 33 of 0xbeef0000
> 
> I don't think that's what you expected!

I believe the above can be fixed with:

        bit_offset = uaddr & (sizeof(unsigned long) - 1);
        if (bit_offset) {
#ifdef CONFIG_CPU_BIG_ENDIAN
                bit_offest = 0;
#else
                bit_offset *= BITS_PER_BYTE;
#endif
                uaddr &= ~(sizeof(unsigned long) - 1);
        }

-- Steve

Reply via email to