[PATCH] um: make personality(PER_LINUX32) work on x86_64

Maciej Żenczykowski posted 1 patch 1 year, 5 months ago
arch/um/include/asm/Kbuild   |  1 -
arch/um/include/asm/compat.h | 12 ++++++++++++
2 files changed, 12 insertions(+), 1 deletion(-)
create mode 100644 arch/um/include/asm/compat.h
[PATCH] um: make personality(PER_LINUX32) work on x86_64
Posted by Maciej Żenczykowski 1 year, 5 months ago
Without this patch:
  #!/usr/bin/python3
  import ctypes
  import os
  personality = ctypes.CDLL(None).personality
  personality.restype = ctypes.c_int
  personality.argtypes = [ctypes.c_ulong]
  PER_LINUX32=8
  personality(PER_LINUX32)
  print(os.uname().machine)
returns:
  x86_64
instead of the desired:
  i686

Cc: Richard Weinberger <richard@nod.at>
Cc: Anton Ivanov <anton.ivanov@cambridgegreys.com>
Cc: Johannes Berg <johannes@sipsolutions.net>
Cc: linux-um@lists.infradead.org
Signed-off-by: Maciej Żenczykowski <maze@google.com>
---
 arch/um/include/asm/Kbuild   |  1 -
 arch/um/include/asm/compat.h | 12 ++++++++++++
 2 files changed, 12 insertions(+), 1 deletion(-)
 create mode 100644 arch/um/include/asm/compat.h

diff --git a/arch/um/include/asm/Kbuild b/arch/um/include/asm/Kbuild
index b2d834a29f3a..0b961dd089ab 100644
--- a/arch/um/include/asm/Kbuild
+++ b/arch/um/include/asm/Kbuild
@@ -1,7 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0
 generic-y += bpf_perf_event.h
 generic-y += bug.h
-generic-y += compat.h
 generic-y += current.h
 generic-y += device.h
 generic-y += dma-mapping.h
diff --git a/arch/um/include/asm/compat.h b/arch/um/include/asm/compat.h
new file mode 100644
index 000000000000..110319031dcf
--- /dev/null
+++ b/arch/um/include/asm/compat.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef __UM_COMPAT_H
+#define __UM_COMPAT_H
+
+#include <asm-generic/compat.h>
+
+#if defined(CONFIG_UML_X86) && defined(CONFIG_64BIT)
+/* From arch/x86/include/asm/compat.h */
+#define COMPAT_UTS_MACHINE     "i686\0\0"
+#endif
+
+#endif
-- 
2.46.0.76.ge559c4bf1a-goog
Re: [PATCH] um: make personality(PER_LINUX32) work on x86_64
Posted by Johannes Berg 1 year, 5 months ago
On Tue, 2024-08-13 at 16:47 -0700, Maciej Żenczykowski wrote:
> Without this patch:
>   #!/usr/bin/python3
>   import ctypes
>   import os
>   personality = ctypes.CDLL(None).personality
>   personality.restype = ctypes.c_int
>   personality.argtypes = [ctypes.c_ulong]
>   PER_LINUX32=8
>   personality(PER_LINUX32)
>   print(os.uname().machine)
> returns:
>   x86_64
> instead of the desired:
>   i686
> 

But ... why should it work? UML has no 32-bit compat support anyway.

johannes
Re: [PATCH] um: make personality(PER_LINUX32) work on x86_64
Posted by Maciej Żenczykowski 1 year, 5 months ago
On Mon, Aug 19, 2024 at 5:23 AM Johannes Berg <johannes@sipsolutions.net> wrote:
>
> On Tue, 2024-08-13 at 16:47 -0700, Maciej Żenczykowski wrote:
> > Without this patch:
> >   #!/usr/bin/python3
> >   import ctypes
> >   import os
> >   personality = ctypes.CDLL(None).personality
> >   personality.restype = ctypes.c_int
> >   personality.argtypes = [ctypes.c_ulong]
> >   PER_LINUX32=8
> >   personality(PER_LINUX32)
> >   print(os.uname().machine)
> > returns:
> >   x86_64
> > instead of the desired:
> >   i686
> >
>
> But ... why should it work? UML has no 32-bit compat support anyway.

Well, that's certainly a fair point.
On 'native' x86_64 this works even for 64-bit processes though.
I wonder if that, in itself, is a feature or a bug...

In my case I was writing some debug code (to print the environment
some test code is running in, since I think it was failing due to
running 32-bit code in PER_LINUX32 on 64-bit arm) and testing (the
test code) on x86_64 UML.  I was surprised to discover the difference
in UML vs my host desktop.

> johannes

--
Maciej Żenczykowski, Kernel Networking Developer @ Google
Re: [PATCH] um: make personality(PER_LINUX32) work on x86_64
Posted by Johannes Berg 1 year, 5 months ago
On Mon, 2024-08-19 at 11:46 -0700, Maciej Żenczykowski wrote:
> On Mon, Aug 19, 2024 at 5:23 AM Johannes Berg <johannes@sipsolutions.net> wrote:
> > 
> > On Tue, 2024-08-13 at 16:47 -0700, Maciej Żenczykowski wrote:
> > > Without this patch:
> > >   #!/usr/bin/python3
> > >   import ctypes
> > >   import os
> > >   personality = ctypes.CDLL(None).personality
> > >   personality.restype = ctypes.c_int
> > >   personality.argtypes = [ctypes.c_ulong]
> > >   PER_LINUX32=8
> > >   personality(PER_LINUX32)
> > >   print(os.uname().machine)
> > > returns:
> > >   x86_64
> > > instead of the desired:
> > >   i686
> > > 
> > 
> > But ... why should it work? UML has no 32-bit compat support anyway.
> 
> Well, that's certainly a fair point.
> On 'native' x86_64 this works even for 64-bit processes though.
> I wonder if that, in itself, is a feature or a bug...
> 
> In my case I was writing some debug code (to print the environment
> some test code is running in, since I think it was failing due to
> running 32-bit code in PER_LINUX32 on 64-bit arm) and testing (the
> test code) on x86_64 UML.  I was surprised to discover the difference
> in UML vs my host desktop.
> 

Alright, I have no idea. This doesn't really seem to do anything else,
so I'm not sure what the point is... It _was_ introduced for compat
though, but obviously the binary doesn't suddenly change to a 32-bit
binary when you do this :)

Maybe the x86 maintainers have any other comments?

johannes