On 2025-09-15 11:09:40+0000, Berg, Benjamin wrote:
> On Mon, 2025-09-15 at 11:07 +0200, Thomas Weißschuh wrote:
> > On 2025-09-15 09:11:15+0200, Benjamin Berg wrote:
> > > From: Benjamin Berg <benjamin.b...@intel.com>
> > > 
> > > The registers.c file only contain the routines for floating point
> > > register access in ptrace mode and initial size detection. The file can
> > > be moved over to nolibc by replacing the ptrace libc call with a simple
> > > wrapper that does a direct syscall.
> > > 
> > > Signed-off-by: Benjamin Berg <benjamin.b...@intel.com>
> > > ---
> > >  arch/x86/um/os-Linux/Makefile    |  5 ++++-
> > >  arch/x86/um/os-Linux/registers.c | 22 ++++++++--------------
> > >  2 files changed, 12 insertions(+), 15 deletions(-)
> > > 
> > > diff --git a/arch/x86/um/os-Linux/Makefile b/arch/x86/um/os-Linux/Makefile
> > > index 77a308aaa5ec..d37320430822 100644
> > > --- a/arch/x86/um/os-Linux/Makefile
> > > +++ b/arch/x86/um/os-Linux/Makefile
> > > @@ -3,10 +3,13 @@
> > >  # Licensed under the GPL
> > >  #
> > >  
> > > -obj-y = registers.o mcontext.o
> > > +obj-y = mcontext.o
> > >  
> > >  obj-$(CONFIG_X86_32) += tls.o
> > >  
> > >  USER_OBJS := $(obj-y)
> > >  
> > > +obj-y += registers.o
> > > +NOLIBC_OBJS := registers.o
> > > +
> > >  include $(srctree)/arch/um/scripts/Makefile.rules
> > > diff --git a/arch/x86/um/os-Linux/registers.c 
> > > b/arch/x86/um/os-Linux/registers.c
> > > index eb1cdadc8a61..55bce0d3f5d2 100644
> > > --- a/arch/x86/um/os-Linux/registers.c
> > > +++ b/arch/x86/um/os-Linux/registers.c
> > > @@ -6,18 +6,20 @@
> > >  
> > >  #include <errno.h>
> > 
> > Given that you are explicitly disabling errno support for nolibc, is
> > this include necessary?
> 
> I think it is technically correct as we do need ENODEV and ENOMEM to be
> defined. Not that we actually need the include if we pull in nolibc.h.

Yes, indeed.

> Considering we would never build against libc, should we maybe just do
> an explicit nolibc.h include and rely on it pulling in the rest
> automatically? That seems a bit weird to me, but as-is we will never
> notice when we forget an include.

Your choice. nolibc will always include itself fully transitively in any
case. So you won't notice a missing include that way either. The
different headers mostly exist to structure the nolibc sources
themselves and to let the application code look normal.
I would go with normal includes.

> > >  #include <stdlib.h>
> > > -#include <sys/ptrace.h>
> > > +#include <linux/ptrace.h>
> > >  #ifdef __i386__
> > >  #include <sys/user.h>
> > >  #endif
> > >  #include <longjmp.h>
> > >  #include <sysdep/ptrace_user.h>
> > > -#include <sys/uio.h>
> > > +#include <linux/uio.h>
> > 
> > It looks fairly trivial to add sys/uio.h to nolibc.
> > Only 'struct iovec' (already provided by the UAPI) and readv()/writev()
> > are necessary.
> > 
> > >  #include <asm/sigcontext.h>
> > >  #include <linux/elf.h>
> > >  #include <registers.h>
> > >  #include <sys/mman.h>
> > >  
> > > +#define my_ptrace(...) my_syscall4(__NR_ptrace, __VA_ARGS__)
> > 
> > Why not add sys/ptrace.h to nolibc and then use sys_ptrace()?
> 
> Honestly, I just got a bit lazy at that point and this was a reasonable
> proof that mixing nolibc with libc works fine.

Fair enough :-)

> You are absolutely right
> that it would be better to add this to nolibc.
> 
> > In general I'm not a fan of the my_syscall() naming scheme and would
> > like to change this in nolibc itself, so having fewer external users
> > would be nice.
> 
> How about adding a sys_syscall macro? That would match the naming
> scheme of the other functions. Then, once all users are ported, one can
> simply change the my_ prefix to __nolibc_.

sys_syscall() looks weird. Personally I would have gone with _syscall().
Let's just sidestep the issue for now by adding sys_ptrace() to nolibc.

(...)

Reply via email to