1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <errno.h> 18 #include <sys/cdefs.h> 19 #include <sys/utsname.h> 20 #include <gtest/gtest.h> 21 22 // getauxval() was only added as of glibc version 2.16. 23 // See: http://lwn.net/Articles/519085/ 24 // Don't try to compile this code on older glibc versions. 25 26 #if defined(__BIONIC__) 27 #define GETAUXVAL_CAN_COMPILE 1 28 #elif defined(__GLIBC_PREREQ) 29 #if __GLIBC_PREREQ(2, 16) 30 #define GETAUXVAL_CAN_COMPILE 1 31 #endif 32 #endif 33 34 #if defined(GETAUXVAL_CAN_COMPILE) 35 #include <sys/auxv.h> 36 #endif 37 38 TEST(getauxval, expected_values) { 39 #if defined(GETAUXVAL_CAN_COMPILE) 40 ASSERT_EQ(0UL, getauxval(AT_SECURE)); 41 ASSERT_EQ(getuid(), getauxval(AT_UID)); 42 ASSERT_EQ(geteuid(), getauxval(AT_EUID)); 43 ASSERT_EQ(getgid(), getauxval(AT_GID)); 44 ASSERT_EQ(getegid(), getauxval(AT_EGID)); 45 ASSERT_EQ(static_cast<unsigned long>(getpagesize()), getauxval(AT_PAGESZ)); 46 47 ASSERT_NE(0UL, getauxval(AT_PHDR)); 48 ASSERT_NE(0UL, getauxval(AT_PHNUM)); 49 ASSERT_NE(0UL, getauxval(AT_ENTRY)); 50 ASSERT_NE(0UL, getauxval(AT_PAGESZ)); 51 #else 52 GTEST_LOG_(INFO) << "This test requires a C library with getauxval.\n"; 53 #endif 54 } 55 56 TEST(getauxval, unexpected_values) { 57 #if defined(GETAUXVAL_CAN_COMPILE) 58 errno = 0; 59 ASSERT_EQ(0UL, getauxval(0xdeadbeef)); 60 ASSERT_EQ(ENOENT, errno); 61 #else 62 GTEST_LOG_(INFO) << "This test requires a C library with getauxval.\n"; 63 #endif 64 } 65 66 TEST(getauxval, arm_has_AT_HWCAP2) { 67 #if defined(__arm__) 68 // There are no known 32-bit processors that implement any of these instructions, so rather 69 // than require that OEMs backport kernel patches, let's just ignore old hardware. Strictly 70 // speaking this would be fooled by someone choosing to ship a 32-bit kernel on 64-bit hardware, 71 // but that doesn't seem very likely in 2016. 72 utsname u; 73 ASSERT_EQ(0, uname(&u)); 74 if (strcmp(u.machine, "aarch64") == 0) { 75 // If this test fails, apps that use getauxval to decide at runtime whether crypto hardware is 76 // available will incorrectly assume that it isn't, and will have really bad performance. 77 // If this test fails, ensure that you've enabled COMPAT_BINFMT_ELF in your kernel configuration. 78 // Note that 0 ("I don't support any of these things") is a legitimate response --- we need 79 // to check errno to see whether we got a "true" 0 or a "not found" 0. 80 errno = 0; 81 getauxval(AT_HWCAP2); 82 ASSERT_EQ(0, errno) << "64-bit kernel not reporting AT_HWCAP2 to 32-bit ARM process"; 83 return; 84 } 85 #endif 86 GTEST_LOG_(INFO) << "This test is only meaningful for 32-bit ARM code on 64-bit devices.\n"; 87 } 88