Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 22 Jul 2010 09:13:49 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r210369 - in head/sys: amd64/amd64 amd64/include ia64/include kern powerpc/include
Message-ID:  <201007220913.o6M9Dnm9000347@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Thu Jul 22 09:13:49 2010
New Revision: 210369
URL: http://svn.freebsd.org/changeset/base/210369

Log:
  When compat32 binary asks for the value of hw.machine_arch, report the
  name of 32bit sibling architecture instead of the host one. Do the
  same for hw.machine on amd64.
  
  Add a safety belt debug.adaptive_machine_arch sysctl, to turn the
  substitution off.
  
  Reviewed by:	jhb, nwhitehorn
  MFC after:	2 weeks

Modified:
  head/sys/amd64/amd64/identcpu.c
  head/sys/amd64/include/param.h
  head/sys/ia64/include/param.h
  head/sys/kern/kern_mib.c
  head/sys/powerpc/include/param.h

Modified: head/sys/amd64/amd64/identcpu.c
==============================================================================
--- head/sys/amd64/amd64/identcpu.c	Thu Jul 22 08:30:14 2010	(r210368)
+++ head/sys/amd64/amd64/identcpu.c	Thu Jul 22 09:13:49 2010	(r210369)
@@ -76,8 +76,30 @@ 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");
+
+#ifdef SCTL_MASK32
+extern int adaptive_machine_arch;
+#endif
+
+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 && adaptive_machine_arch)
+		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, 

Modified: head/sys/amd64/include/param.h
==============================================================================
--- head/sys/amd64/include/param.h	Thu Jul 22 08:30:14 2010	(r210368)
+++ head/sys/amd64/include/param.h	Thu Jul 22 09:13:49 2010	(r210369)
@@ -59,6 +59,9 @@
 #ifndef MACHINE_ARCH
 #define	MACHINE_ARCH	"amd64"
 #endif
+#ifndef MACHINE_ARCH32
+#define	MACHINE_ARCH32	"i386"
+#endif
 
 #if defined(SMP) || defined(KLD_MODULE)
 #define MAXCPU		32

Modified: head/sys/ia64/include/param.h
==============================================================================
--- head/sys/ia64/include/param.h	Thu Jul 22 08:30:14 2010	(r210368)
+++ head/sys/ia64/include/param.h	Thu Jul 22 09:13:49 2010	(r210369)
@@ -57,6 +57,9 @@
 #ifndef MACHINE_ARCH
 #define	MACHINE_ARCH	"ia64"
 #endif
+#ifndef MACHINE_ARCH32
+#define	MACHINE_ARCH32	"i386"
+#endif
 
 #if defined(SMP) || defined(KLD_MODULE)
 #define	MAXCPU		32

Modified: head/sys/kern/kern_mib.c
==============================================================================
--- head/sys/kern/kern_mib.c	Thu Jul 22 08:30:14 2010	(r210368)
+++ head/sys/kern/kern_mib.c	Thu Jul 22 09:13:49 2010	(r210369)
@@ -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");
+#ifdef SCTL_MASK32
+int adaptive_machine_arch = 1;
+SYSCTL_INT(_debug, OID_AUTO, adaptive_machine_arch, CTLFLAG_RW,
+    &adaptive_machine_arch, 1,
+    "Adapt reported machine architecture to the ABI of the binary");
+#endif
+
+static int
+sysctl_hw_machine_arch(SYSCTL_HANDLER_ARGS)
+{
+	int error;
+	static const char machine_arch[] = MACHINE_ARCH;
+#ifdef SCTL_MASK32
+	static const char machine_arch32[] = MACHINE_ARCH32;
+
+	if ((req->flags & SCTL_MASK32) != 0 && adaptive_machine_arch)
+		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)

Modified: head/sys/powerpc/include/param.h
==============================================================================
--- head/sys/powerpc/include/param.h	Thu Jul 22 08:30:14 2010	(r210368)
+++ head/sys/powerpc/include/param.h	Thu Jul 22 09:13:49 2010	(r210369)
@@ -61,6 +61,11 @@
 #endif
 #endif
 #define	MID_MACHINE	MID_POWERPC
+#ifdef __powerpc64__
+#ifndef	MACHINE_ARCH32
+#define	MACHINE_ARCH32	"powerpc"
+#endif
+#endif
 
 #if defined(SMP) || defined(KLD_MODULE)
 #define	MAXCPU		2



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201007220913.o6M9Dnm9000347>