On Tue, 2023-12-19 at 13:53 +0000, Arnd Bergmann wrote: > On Tue, Dec 19, 2023, at 02:50, Dmitry Torokhov wrote: > > Hi Antonious, > > > > On Thu, Dec 14, 2023 at 11:11:18AM +0100, Antonios Salios wrote: > > > Hi all. > > > > > > I'm having trouble getting evdev to run in a simulated Buildroot > > > environment on riscv32. Evtest (and the x11 driver) seems to be > > > receiving garbage data from input devices. > > > > > > Analyzing the input_event struct shows that the kernel uses 32- > > > bit (aka > > > __kernel_ulong_t) values for __sec & __usec. > > > Evtest on the other hand interprets these variables as 64-bit > > > time_t > > > values in a timeval struct, resulting in a mismatch between the > > > kernel > > > and userspace. > > > > > > What would be the correct size for these values on a 32-bit > > > architecture that uses 64-bit time_t values? > > > > I think there is misunderstanding - we do not have *2* 64-bit > > values on > > 32-but architectures. Here is what was done: > > > > Input: extend usable life of event timestamps to 2106 on 32 bit > > systems > > Thanks for forwarding this to me. You are definitely right that > the user-space structure is intended to use a pair of > __kernel_ulong_t > for the timestamp. Usually if an application gets this wrong, it is > the > result of having copied old kernel headers the source directory that > need to be updated. > > For evtest in particular, I don't see how that is possible, the > source > code at [1] shows that it just includes the global linux/input.h, > which on riscv32 would have to be at least from linux-5.6 anyway > because older versions are too old to build a time64 glibc. > > Antonios, can you check which header was used to build your copy > of evtest, and in case this came from /usr/include/linux, which > version it corresponds to? > > Arnd > > [1] > https://gitlab.freedesktop.org/libevdev/evtest/-/blob/master/evtest.c?ref_type=heads The header is included from the sysroot of the toolchain, using version 6.5.6. I'm using glibc 2.37 with a toolchain built from Buildroot. The problem seems to be, that __USE_TIME_BITS64 is not defined even though riscv32 uses 64-bit time. __BITS_PER_LONG is set to 32 & __KERNEL__ is (of course) undefined in userspace. The userspace therefore uses 64-bit values as opposed to the kernel, which uses 32-bit values. __USE_TIME_BITS64 is only set when __TIMESIZE is set to 32. [1] Under riscv32, the default value of 64 is used. [2] [1] https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/features-time64.h;h=af9d84daa7dfe4174e9f977b2c76c5c0df1ce47b;hb=refs/tags/glibc-2.37 [2] https://sourceware.org/git/?p=glibc.git;a=blob_plain;f=bits/timesize.h;hb=refs/tags/glibc-2.37 -- Antonios Salios Software Engineer MachineWare GmbH | www.machineware.de Hühnermarkt 19, 52062 Aachen, Germany Amtsgericht Aachen HRB25734 Geschäftsführung Lukas Jünger Dr.-Ing. Jan Henrik Weinstock