Fix uname syscall
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
@@ -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:
Quoted 1 line · Paul Brook
+#define
UNAME_MACHINE"armv4"
Wouldn't this be armv4l/armv4b (depending on endianness)?
--L
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
@@ -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:
Fabrice Bellard
AppliedApplied, 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.