From: kmagic@google.com <kmagic@google.com>
To: ltp@lists.linux.it
Subject: [LTP] [PATCH] Correct the kernel_bits value in x86 PER_LINUX32.
Date: Mon, 1 Oct 2018 10:11:16 -0700 [thread overview]
Message-ID: <20181001171116.235573-1-kmagic@google.com> (raw)
From: Kenneth Magic <kmagic@google.com>
Android runs all 32bit programs in a PER_LIINUX32 personality
even under a 64 bit kernel, causing the machine to show up as
"i686". Check for and correct this case so tests use the correct
kernel_bits value.
Signed-off-by: Kenneth Magic <kmagic@google.com>
---
lib/tst_kernel.c | 47 +++++++++++++++++++++++++++++++++++++++++------
1 file changed, 41 insertions(+), 6 deletions(-)
diff --git a/lib/tst_kernel.c b/lib/tst_kernel.c
index 4206e3c0d..d051f3b07 100644
--- a/lib/tst_kernel.c
+++ b/lib/tst_kernel.c
@@ -15,21 +15,28 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <linux/personality.h>
#include <sys/utsname.h>
#include "test.h"
#include "tst_kernel.h"
-int tst_kernel_bits(void)
+static int get_kernel_bits_from_uname(struct utsname *buf)
{
- struct utsname buf;
- int kernel_bits;
-
- if (uname(&buf)) {
+ if (uname(buf)) {
tst_brkm(TBROK | TERRNO, NULL, "uname()");
return -1;
}
- kernel_bits = strstr(buf.machine, "64") ? 64 : 32;
+ return strstr(buf->machine, "64") ? 64 : 32;
+}
+
+int tst_kernel_bits(void)
+{
+ struct utsname buf;
+ int kernel_bits = get_kernel_bits_from_uname(&buf);
+
+ if (kernel_bits == -1)
+ return -1;
/*
* ARM64 (aarch64) defines 32-bit compatibility modes as
@@ -40,6 +47,34 @@ int tst_kernel_bits(void)
|| !strcmp(buf.machine, "s390x"))
kernel_bits = 64;
+#ifdef __ANDROID__
+ /* Android's bionic libc sets the PER_LINUX32 personality for all 32-bit
+ * programs. This will cause buf.machine to report as i686 even though
+ * the kernel itself is 64-bit.
+ */
+ if (!strcmp(buf.machine, "i686") &&
+ (personality(0xffffffff) & PER_MASK) == PER_LINUX32) {
+ /* Set the personality back to the default. */
+ if (personality(PER_LINUX) == -1) {
+ tst_brkm(TBROK | TERRNO, NULL, "personality()");
+ return -1;
+ }
+
+ /* Redo the uname check without the PER_LINUX32 personality to
+ * determine the actual kernel bits value.
+ */
+ kernel_bits = get_kernel_bits_from_uname(&buf);
+ if (kernel_bits == -1)
+ return -1;
+
+ /* Set the personality back to PER_LINUX32. */
+ if (personality(PER_LINUX32) == -1) {
+ tst_brkm(TBROK | TERRNO, NULL, "personality()");
+ return -1;
+ }
+ }
+#endif /* __ANDROID__ */
+
tst_resm(TINFO, "uname.machine=%s kernel is %ibit",
buf.machine, kernel_bits);
--
2.19.0.605.g01d371f741-goog
next reply other threads:[~2018-10-01 17:11 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-01 17:11 kmagic [this message]
2018-10-08 9:47 ` [LTP] [PATCH] Correct the kernel_bits value in x86 PER_LINUX32 Petr Vorel
2018-10-12 16:16 ` Petr Vorel
-- strict thread matches above, loose matches on Subject: below --
2018-09-14 18:40 Kenneth Magic
2018-10-01 14:47 ` Cyril Hrubis
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181001171116.235573-1-kmagic@google.com \
--to=kmagic@google.com \
--cc=ltp@lists.linux.it \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.