Date: Tue, 20 Jul 2010 00:30:54 +0300 From: Kostik Belousov <kostikbel@gmail.com> To: arch@freebsd.org Cc: amd64@freebsd.org Subject: uname -m/-p for compat32 binaries Message-ID: <20100719213054.GB2381@deviant.kiev.zoral.com.ua>
next in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
Hi,
I intend to commit the following change, that makes sysctls
hw.machine_arch and hw.machine to return "i386" for 32 bit
binaries run on amd64. In particular, 32 bit uname -m and uname -p
print "i386", that is good for i386 jails on amd64 kernels.
I find the change very useful for me, but I wonder why such trivial
modification is not yet done. Can anybody note a possible fallout from
it ?
diff --git a/sys/amd64/amd64/identcpu.c b/sys/amd64/amd64/identcpu.c
index 52e7568..68de22b 100644
--- a/sys/amd64/amd64/identcpu.c
+++ b/sys/amd64/amd64/identcpu.c
@@ -76,8 +76,26 @@ static void print_via_padlock_info(void);
int cpu_class;
char machine[] = "amd64";
-SYSCTL_STRING(_hw, HW_MACHINE, machine, CTLFLAG_RD,
- machine, 0, "Machine class");
+
+static int
+sysctl_hw_machine(SYSCTL_HANDLER_ARGS)
+{
+#ifdef SCTL_MASK32
+ static const char machine32[] = "i386";
+#endif
+ int error;
+
+#ifdef SCTL_MASK32
+ if ((req->flags & SCTL_MASK32) != 0)
+ error = SYSCTL_OUT(req, machine32, sizeof(machine32));
+ else
+#endif
+ error = SYSCTL_OUT(req, machine, sizeof(machine));
+ return (error);
+
+}
+SYSCTL_PROC(_hw, HW_MACHINE, machine, CTLTYPE_STRING | CTLFLAG_RD,
+ NULL, 0, sysctl_hw_machine, "A", "Machine class");
static char cpu_model[128];
SYSCTL_STRING(_hw, HW_MODEL, model, CTLFLAG_RD,
diff --git a/sys/kern/kern_mib.c b/sys/kern/kern_mib.c
index 7ef580f..0b7d27f 100644
--- a/sys/kern/kern_mib.c
+++ b/sys/kern/kern_mib.c
@@ -232,9 +232,31 @@ sysctl_hw_pagesizes(SYSCTL_HANDLER_ARGS)
SYSCTL_PROC(_hw, OID_AUTO, pagesizes, CTLTYPE_ULONG | CTLFLAG_RD,
NULL, 0, sysctl_hw_pagesizes, "LU", "Supported page sizes");
-static char machine_arch[] = MACHINE_ARCH;
-SYSCTL_STRING(_hw, HW_MACHINE_ARCH, machine_arch, CTLFLAG_RD,
- machine_arch, 0, "System architecture");
+static int
+sysctl_hw_machine_arch(SYSCTL_HANDLER_ARGS)
+{
+ static const char machine_arch[] = MACHINE_ARCH;
+#ifdef SCTL_MASK32
+ static const char machine_arch32[] =
+#if defined(__amd64__) || defined(__ia64__)
+ "i386";
+#else
+ MACHINE_ARCH;
+#endif
+#endif
+ int error;
+
+#ifdef SCTL_MASK32
+ if ((req->flags & SCTL_MASK32) != 0)
+ error = SYSCTL_OUT(req, machine_arch32, sizeof(machine_arch32));
+ else
+#endif
+ error = SYSCTL_OUT(req, machine_arch, sizeof(machine_arch));
+ return (error);
+
+}
+SYSCTL_PROC(_hw, HW_MACHINE_ARCH, machine_arch, CTLTYPE_STRING | CTLFLAG_RD,
+ NULL, 0, sysctl_hw_machine_arch, "A", "System architecture");
static int
sysctl_hostname(SYSCTL_HANDLER_ARGS)
[-- Attachment #2 --]
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (FreeBSD)
iEYEARECAAYFAkxExA4ACgkQC3+MBN1Mb4gU1wCeKOkfffKkS5WYTXHjuIdgO+V6
KB0AoI6WR+a6LS3/KA+SnQeULxS16EAX
=AEoP
-----END PGP SIGNATURE-----
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20100719213054.GB2381>
