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