Skip to contentSkip to conversation

Fix uname syscall

PATCH Applied Paul Brook 3 participants 4 messages Sep 11, 2004 – Sep 13, 2004

lore
Share & tools
lore

Paul Brook

author
#0 lore raw

PATCH 1/1 Fix uname syscall

The patch below changes the uname syscall to return the emulated machine type, rather than the host machine type. Without this things get awfully confused when trying to compile in a chroot.

Paul

Index: syscall.c
===================================================================
RCS file: /cvsroot/qemu/qemu/linux-user/syscall.c,v retrieving revision 1.50

syscall.c 11 Sep 2004 18:28:19 -0000 renamed from syscall.c 19 Jun 2004 16:59:03 -0000 1.50 +22 -2
diff -u -p -r1.50 syscall.c
@@ -72,6 +72,17 @@
 /* 16 bit uid wrappers emulation */
 #define USE_UID16
 #endif
+#if defined(TARGET_ARM)
+#define UNAME_MACHINE "armv4"
+#elif defined(TARGET_I386)
+#define UNAME_MACHINE "i686"
+#elif defined(TARGET_PPC)
+#define UNAME_MACHINE "ppc"
+#elif defined(TARGET_SPARC)
+#define UNAME_MACHINE "sun4"
+#else
+#error unsupported CPU
+#endif
 
 //#include <linux/msdos_fs.h>
 #define VFAT_IOCTL_READDIR_BOTH  _IOR('r', 1, struct dirent [2])
@@ -2391,8 +2406,17 @@ long do_syscall(void *cpu_env, int num, 
         ret = get_errno(setdomainname((const char *)arg1, arg2));
         break;
     case TARGET_NR_uname:
-        /* no need to transcode because we use the linux syscall */
-        ret = get_errno(sys_uname((struct new_utsname *)arg1));
+ {
+     struct new_utsname * buf;
+
+     buf = (struct new_utsname *)arg1;
+     ret = get_errno(sys_uname(buf));
+     if (!is_error(ret)) {
+  /* Overwrite the native machine name with whatever is being
+     emulated. */
+  strcpy (buf->machine, UNAME_MACHINE);
+     }
+ }
         break;
 #ifdef TARGET_I386
     case TARGET_NR_modify_ldt:
#1 lore raw
Quoted 1 line · Paul Brook

+#define UNAME_MACHINE "armv4"

Wouldn't this be armv4l/armv4b (depending on endianness)?

--L

author
#2 lore raw
Quoted 4 lines · Lennert Buytenhek
Quoted 1 line · Paul Brook

+#define UNAME_MACHINE "armv4"

Wouldn't this be armv4l/armv4b (depending on endianness)?

Yes. Updated patch below.

Paul

Index: syscall.c
===================================================================
RCS file: /cvsroot/qemu/qemu/linux-user/syscall.c,v retrieving revision 1.50

syscall.c 12 Sep 2004 11:11:26 -0000 renamed from syscall.c 19 Jun 2004 16:59:03 -0000 1.50 +26 -2
diff -u -p -r1.50 syscall.c
@@ -72,6 +72,21 @@
 /* 16 bit uid wrappers emulation */
 #define USE_UID16
 #endif
+#if defined(TARGET_ARM)
+#if defined(TARGET_WORDS_BIGENDIAN)
+#define UNAME_MACHINE "armv4b"
+#else
+#define UNAME_MACHINE "armv4l"
+#endif
+#elif defined(TARGET_I386)
+#define UNAME_MACHINE "i686"
+#elif defined(TARGET_PPC)
+#define UNAME_MACHINE "ppc"
+#elif defined(TARGET_SPARC)
+#define UNAME_MACHINE "sun4"
+#else
+#error unsupported CPU
+#endif
 
 //#include <linux/msdos_fs.h>
 #define VFAT_IOCTL_READDIR_BOTH  _IOR('r', 1, struct dirent [2])
@@ -2391,8 +2410,17 @@ long do_syscall(void *cpu_env, int num, 
         ret = get_errno(setdomainname((const char *)arg1, arg2));
         break;
     case TARGET_NR_uname:
-        /* no need to transcode because we use the linux syscall */
-        ret = get_errno(sys_uname((struct new_utsname *)arg1));
+ {
+     struct new_utsname * buf;
+
+     buf = (struct new_utsname *)arg1;
+     ret = get_errno(sys_uname(buf));
+     if (!is_error(ret)) {
+  /* Overrite the native machine name with whatever is being
+     emulated. */
+  strcpy (buf->machine, UNAME_MACHINE);
+     }
+ }
         break;
 #ifdef TARGET_I386
     case TARGET_NR_modify_ldt:
#3 lore raw
In reply to Paul Brook

Applied, but suppressed ifdefs.

Fabrice.

Quoted 1 line · Paul Brook

The patch below changes the uname syscall to return the emulated machine type, rather than the host machine type. Without this things get awfully confused when trying to compile in a chroot.