Thread (18 messages) 18 messages, 5 authors, 2023-09-25

Re: [PATCH] tracing/user_events: align uaddr on unsigned long alignment

From: Clément Léger <hidden>
Date: 2023-09-19 12:59:21
Also in: lkml


On 14/09/2023 19:29, Steven Rostedt wrote:
On Thu, 14 Sep 2023 13:17:00 -0400
Steven Rostedt [off-list ref] wrote:
quoted
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

Actually, after looking more in depth at that, it seems like there are
actually 2 problems that can happen.

First one is atomic access misalignment due to enable_size == 4 and
uaddr not being aligned on a (long) boundary on 64 bits architecture.
This can generate misaligned exceptions on various architectures. This
can be fixed in a more general way according to Masami snippet.

Second one that I can see is on 64 bits, big endian architectures with
enable_size == 4. In that case, the bit provided by the userspace won't
be correctly set since this code kind of assume that the atomic are done
on 32bits value. Since the kernel assume long sized atomic operation, on
big endian 64 bits architecture, the updated bit will actually be in the
next 32 bits word.

Can someone confirm my understanding ?

Clément
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help