On Thu, Aug 22, 2024 at 10:05 AM H.J. Lu <hjl.tools@xxxxxxxxx> wrote: > > On Thu, Aug 22, 2024 at 5:21 AM Adhemerval Zanella Netto > <adhemerval.zanella@xxxxxxxxxx> wrote: > > > > > > > > On 21/08/24 16:41, Alejandro Colomar wrote: > > > Hi Adhemerval, Elliott, > > > > > > On Wed, Aug 21, 2024 at 03:19:02PM GMT, Adhemerval Zanella Netto wrote: > > >> I would use either the kernel interface: > > >> > > >> arch/x86/kernel/process_64.c > > >> 961 SYSCALL_DEFINE2(arch_prctl, int, option, unsigned long, arg2) > > >> > > >> Where is seems to what most caller do, or maybe something like: > > >> > > >> union __arch_prctl_arg > > >> { > > >> unsigned long addr; > > >> unsigned long *vaddr; > > >> }; > > >> > > >> int arch_prctl (int option, union __arch_prctl_arg *arg); > > > > > > Or you could use a transparent union: > > > > > > $ cat arch_prctl.c > > > union __attribute__((__transparent_union__)) __arch_prctl_arg { > > > unsigned long set; > > > unsigned long *get; > > > }; > > > > > > int my_arch_prctl(int op, union __arch_prctl_arg arg2); > > > > > > int > > > main(void) > > > { > > > unsigned long u = 0; > > > > > > my_arch_prctl(1, u); > > > my_arch_prctl(1, &u); > > > } > > > $ gcc -Wall -Wextra -S arch_prctl.c > > > $ > > > > Although we do use __transparent_union__ we have to still handle very old > > compilers: > > We can hide the prototype for the older compilers. Softwares need to > deal with the missing prototype anyway. (avoiding source incompatibility via mismatching declarations is perhaps a reason to just go with the kernel signature, since that's what the folks i've seen `extern` this function themselves seem to use...) > > socket/sys/socket.h > > > > 51 /* This is the type we use for generic socket address arguments. > > 52 > > 53 With GCC 2.7 and later, the funky union causes redeclarations or > > 54 uses with any of the listed types to be allowed without complaint. > > 55 G++ 2.7 does not support transparent unions so there we want the > > 56 old-style declaration, too. */ > > 57 #if defined __cplusplus || !__GNUC_PREREQ (2, 7) || !defined __USE_GNU > > > > I guess this is not really required anymore. > > > > > > > >> And for constants, it would require a x86_64 specific sys/prctl.h header > > >> with either the has_include tricks to include the kernel one or to just > > >> copy the kernel one (along with possible a test to check the sync with > > >> kernel definitions). > > > > > > I think including would be simpler, if it's possible. > > > > > > I've seen some problems arise from copying kernel stuff in glibc > > > headers, such as being unable to include both a some kernel and some > > > glibc headers in the same program due to redefinitions. > > > > > > > > > Have a lovely night! > > > Alex > > > > > > > > > > -- > H.J.