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