aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenneth Magic <kmagic@google.com>2018-10-23 08:38:36 -0700
committerKarthik Ramakrishnan <karthikmr@google.com>2019-01-23 23:42:26 +0000
commit1a1e0cf369fcc171782d3b20ec044f7616033d4a (patch)
tree3b402c9d7ac321e41e7fd5dde671a7235cd89a07
parent263ce2c5d1b3785c1d565c12bc6d9a4397cbcc91 (diff)
downloadplatform_external_ltp-pie-vts-dev.tar.gz
platform_external_ltp-pie-vts-dev.tar.bz2
platform_external_ltp-pie-vts-dev.zip
Correct the kernel_bits value in x86 PER_LINUX32.pie-vts-dev
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. Bug: 110557404 Test: On emulator: vts run vts -m VtsKernelLtp Signed-off-by: Kenneth Magic <kmagic@google.com> Reviewed-by: Petr Vorel <pvorel@suse.cz> Signed-off-by: Petr Vorel <pvorel@suse.cz> (cherry picked from commit f6dd3af2f13629f20a0a0b912c09c4f261ddf3fd) Merged-In:I6698449c8753b311f3ba6bbc2e152edff2c86e87 Change-Id: I6698449c8753b311f3ba6bbc2e152edff2c86e87
-rw-r--r--lib/tst_kernel.c47
1 files changed, 41 insertions, 6 deletions
diff --git a/lib/tst_kernel.c b/lib/tst_kernel.c
index 42d64cbdc..8edafb8ff 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);