1*70a7ec85SAndroid Build Coastguard Worker /* 2*70a7ec85SAndroid Build Coastguard Worker * Copyright (C) 2017 The Android Open Source Project 3*70a7ec85SAndroid Build Coastguard Worker * 4*70a7ec85SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*70a7ec85SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*70a7ec85SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*70a7ec85SAndroid Build Coastguard Worker * 8*70a7ec85SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*70a7ec85SAndroid Build Coastguard Worker * 10*70a7ec85SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*70a7ec85SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*70a7ec85SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*70a7ec85SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*70a7ec85SAndroid Build Coastguard Worker * limitations under the License. 15*70a7ec85SAndroid Build Coastguard Worker */ 16*70a7ec85SAndroid Build Coastguard Worker 17*70a7ec85SAndroid Build Coastguard Worker #ifndef ANDROID_VINTF_RUNTIME_INFO_H 18*70a7ec85SAndroid Build Coastguard Worker #define ANDROID_VINTF_RUNTIME_INFO_H 19*70a7ec85SAndroid Build Coastguard Worker 20*70a7ec85SAndroid Build Coastguard Worker #include "Version.h" 21*70a7ec85SAndroid Build Coastguard Worker 22*70a7ec85SAndroid Build Coastguard Worker #include <map> 23*70a7ec85SAndroid Build Coastguard Worker #include <string> 24*70a7ec85SAndroid Build Coastguard Worker #include <vector> 25*70a7ec85SAndroid Build Coastguard Worker 26*70a7ec85SAndroid Build Coastguard Worker #include <utils/Errors.h> 27*70a7ec85SAndroid Build Coastguard Worker 28*70a7ec85SAndroid Build Coastguard Worker #include "CheckFlags.h" 29*70a7ec85SAndroid Build Coastguard Worker #include "KernelInfo.h" 30*70a7ec85SAndroid Build Coastguard Worker #include "MatrixKernel.h" 31*70a7ec85SAndroid Build Coastguard Worker #include "Version.h" 32*70a7ec85SAndroid Build Coastguard Worker 33*70a7ec85SAndroid Build Coastguard Worker namespace android { 34*70a7ec85SAndroid Build Coastguard Worker namespace vintf { 35*70a7ec85SAndroid Build Coastguard Worker 36*70a7ec85SAndroid Build Coastguard Worker namespace testing { 37*70a7ec85SAndroid Build Coastguard Worker class VintfObjectRuntimeInfoTest; 38*70a7ec85SAndroid Build Coastguard Worker } // namespace testing 39*70a7ec85SAndroid Build Coastguard Worker 40*70a7ec85SAndroid Build Coastguard Worker struct CompatibilityMatrix; 41*70a7ec85SAndroid Build Coastguard Worker 42*70a7ec85SAndroid Build Coastguard Worker // Runtime Info sent to OTA server 43*70a7ec85SAndroid Build Coastguard Worker struct RuntimeInfo { 44*70a7ec85SAndroid Build Coastguard Worker RuntimeInfoRuntimeInfo45*70a7ec85SAndroid Build Coastguard Worker RuntimeInfo() {} 46*70a7ec85SAndroid Build Coastguard Worker virtual ~RuntimeInfo() = default; 47*70a7ec85SAndroid Build Coastguard Worker 48*70a7ec85SAndroid Build Coastguard Worker // /proc/version 49*70a7ec85SAndroid Build Coastguard Worker // utsname.sysname 50*70a7ec85SAndroid Build Coastguard Worker const std::string &osName() const; 51*70a7ec85SAndroid Build Coastguard Worker // utsname.nodename 52*70a7ec85SAndroid Build Coastguard Worker const std::string &nodeName() const; 53*70a7ec85SAndroid Build Coastguard Worker // utsname.release 54*70a7ec85SAndroid Build Coastguard Worker const std::string &osRelease() const; 55*70a7ec85SAndroid Build Coastguard Worker // utsname.version 56*70a7ec85SAndroid Build Coastguard Worker const std::string &osVersion() const; 57*70a7ec85SAndroid Build Coastguard Worker // utsname.machine 58*70a7ec85SAndroid Build Coastguard Worker const std::string &hardwareId() const; 59*70a7ec85SAndroid Build Coastguard Worker // extract from utsname.release 60*70a7ec85SAndroid Build Coastguard Worker const KernelVersion &kernelVersion() const; 61*70a7ec85SAndroid Build Coastguard Worker 62*70a7ec85SAndroid Build Coastguard Worker const std::map<std::string, std::string> &kernelConfigs() const; 63*70a7ec85SAndroid Build Coastguard Worker 64*70a7ec85SAndroid Build Coastguard Worker const Version &bootVbmetaAvbVersion() const; 65*70a7ec85SAndroid Build Coastguard Worker const Version &bootAvbVersion() const; 66*70a7ec85SAndroid Build Coastguard Worker 67*70a7ec85SAndroid Build Coastguard Worker // /proc/cpuinfo 68*70a7ec85SAndroid Build Coastguard Worker const std::string &cpuInfo() const; 69*70a7ec85SAndroid Build Coastguard Worker 70*70a7ec85SAndroid Build Coastguard Worker // /sys/fs/selinux/policyvers 71*70a7ec85SAndroid Build Coastguard Worker size_t kernelSepolicyVersion() const; 72*70a7ec85SAndroid Build Coastguard Worker 73*70a7ec85SAndroid Build Coastguard Worker bool isMainlineKernel() const; 74*70a7ec85SAndroid Build Coastguard Worker 75*70a7ec85SAndroid Build Coastguard Worker // Return whether this RuntimeInfo works with the given compatibility matrix. Return true if: 76*70a7ec85SAndroid Build Coastguard Worker // - mat is a framework compat-mat 77*70a7ec85SAndroid Build Coastguard Worker // - sepolicy.kernel-sepolicy-version == kernelSepolicyVersion() 78*70a7ec85SAndroid Build Coastguard Worker // - /proc/config.gz matches the requirements. Note that /proc/config.gz is read when the 79*70a7ec85SAndroid Build Coastguard Worker // RuntimeInfo object is created (the first time VintfObject::GetRuntimeInfo is called), 80*70a7ec85SAndroid Build Coastguard Worker // not when RuntimeInfo::checkCompatibility is called. 81*70a7ec85SAndroid Build Coastguard Worker // - avb-vbmetaversion matches related sysprops 82*70a7ec85SAndroid Build Coastguard Worker bool checkCompatibility(const CompatibilityMatrix& mat, std::string* error = nullptr, 83*70a7ec85SAndroid Build Coastguard Worker CheckFlags::Type flags = CheckFlags::DEFAULT) const; 84*70a7ec85SAndroid Build Coastguard Worker 85*70a7ec85SAndroid Build Coastguard Worker 86*70a7ec85SAndroid Build Coastguard Worker using FetchFlags = uint32_t; 87*70a7ec85SAndroid Build Coastguard Worker enum FetchFlag : FetchFlags { 88*70a7ec85SAndroid Build Coastguard Worker CPU_VERSION = 1 << 0, 89*70a7ec85SAndroid Build Coastguard Worker CONFIG_GZ = 1 << 1, 90*70a7ec85SAndroid Build Coastguard Worker CPU_INFO = 1 << 2, 91*70a7ec85SAndroid Build Coastguard Worker POLICYVERS = 1 << 3, 92*70a7ec85SAndroid Build Coastguard Worker AVB = 1 << 4, 93*70a7ec85SAndroid Build Coastguard Worker KERNEL_FCM = 1 << 5, 94*70a7ec85SAndroid Build Coastguard Worker FETCH_FLAG_LAST_PLUS_ONE, 95*70a7ec85SAndroid Build Coastguard Worker 96*70a7ec85SAndroid Build Coastguard Worker NONE = 0, 97*70a7ec85SAndroid Build Coastguard Worker ALL = ((FETCH_FLAG_LAST_PLUS_ONE - 1) << 1) - 1, 98*70a7ec85SAndroid Build Coastguard Worker }; 99*70a7ec85SAndroid Build Coastguard Worker 100*70a7ec85SAndroid Build Coastguard Worker // GKI kernel release string specifies the kernel level using a string like 101*70a7ec85SAndroid Build Coastguard Worker // "android12". This function converts the trailing number of this string to 102*70a7ec85SAndroid Build Coastguard Worker // a Level. For example, androidReleaseToLevel(12) -> Level::S. 103*70a7ec85SAndroid Build Coastguard Worker // Abort if the value of |androidRelease| is higher than supported values 104*70a7ec85SAndroid Build Coastguard Worker // specified in Level. 105*70a7ec85SAndroid Build Coastguard Worker static Level gkiAndroidReleaseToLevel(uint64_t androidRelease); 106*70a7ec85SAndroid Build Coastguard Worker 107*70a7ec85SAndroid Build Coastguard Worker // Returns true if kernelRelease is a kernel release for a mainline kernel. 108*70a7ec85SAndroid Build Coastguard Worker static bool kernelReleaseIsMainline(std::string_view kernelRelease); 109*70a7ec85SAndroid Build Coastguard Worker 110*70a7ec85SAndroid Build Coastguard Worker protected: 111*70a7ec85SAndroid Build Coastguard Worker virtual status_t fetchAllInformation(FetchFlags flags); 112*70a7ec85SAndroid Build Coastguard Worker 113*70a7ec85SAndroid Build Coastguard Worker void setKernelLevel(Level level); 114*70a7ec85SAndroid Build Coastguard Worker Level kernelLevel() const; 115*70a7ec85SAndroid Build Coastguard Worker 116*70a7ec85SAndroid Build Coastguard Worker // Helper function to parse kernel release string as a GKI kernel release string. 117*70a7ec85SAndroid Build Coastguard Worker // Return error if: 118*70a7ec85SAndroid Build Coastguard Worker // - it is not a GKI kernel release string 119*70a7ec85SAndroid Build Coastguard Worker // - kernel level is not recognized by libvintf. 120*70a7ec85SAndroid Build Coastguard Worker static status_t parseGkiKernelRelease(RuntimeInfo::FetchFlags flags, 121*70a7ec85SAndroid Build Coastguard Worker const std::string& kernelReleaseString, 122*70a7ec85SAndroid Build Coastguard Worker KernelVersion* version, Level* kernelLevel); 123*70a7ec85SAndroid Build Coastguard Worker 124*70a7ec85SAndroid Build Coastguard Worker friend struct RuntimeInfoFetcher; 125*70a7ec85SAndroid Build Coastguard Worker friend class VintfObject; 126*70a7ec85SAndroid Build Coastguard Worker friend struct LibVintfTest; 127*70a7ec85SAndroid Build Coastguard Worker friend std::string dump(const RuntimeInfo& ki, bool); 128*70a7ec85SAndroid Build Coastguard Worker friend class testing::VintfObjectRuntimeInfoTest; 129*70a7ec85SAndroid Build Coastguard Worker 130*70a7ec85SAndroid Build Coastguard Worker // /proc/config.gz 131*70a7ec85SAndroid Build Coastguard Worker // Key: CONFIG_xxx; Value: the value after = sign. 132*70a7ec85SAndroid Build Coastguard Worker KernelInfo mKernel; 133*70a7ec85SAndroid Build Coastguard Worker std::string mOsName; 134*70a7ec85SAndroid Build Coastguard Worker std::string mNodeName; 135*70a7ec85SAndroid Build Coastguard Worker std::string mOsRelease; 136*70a7ec85SAndroid Build Coastguard Worker std::string mOsVersion; 137*70a7ec85SAndroid Build Coastguard Worker std::string mHardwareId; 138*70a7ec85SAndroid Build Coastguard Worker 139*70a7ec85SAndroid Build Coastguard Worker std::vector<std::string> mSepolicyFilePaths; 140*70a7ec85SAndroid Build Coastguard Worker std::string mCpuInfo; 141*70a7ec85SAndroid Build Coastguard Worker Version mBootVbmetaAvbVersion; 142*70a7ec85SAndroid Build Coastguard Worker Version mBootAvbVersion; 143*70a7ec85SAndroid Build Coastguard Worker 144*70a7ec85SAndroid Build Coastguard Worker size_t mKernelSepolicyVersion = 0u; 145*70a7ec85SAndroid Build Coastguard Worker 146*70a7ec85SAndroid Build Coastguard Worker bool mIsMainline = false; 147*70a7ec85SAndroid Build Coastguard Worker }; 148*70a7ec85SAndroid Build Coastguard Worker 149*70a7ec85SAndroid Build Coastguard Worker } // namespace vintf 150*70a7ec85SAndroid Build Coastguard Worker } // namespace android 151*70a7ec85SAndroid Build Coastguard Worker 152*70a7ec85SAndroid Build Coastguard Worker #endif // ANDROID_VINTF_RUNTIME_INFO_H 153