xref: /aosp_15_r20/system/libhidl/base/include/hidl/HidlInternal.h (revision 8222fbe171c3d6fadfe95119c180cf3010c392a8)
1*8222fbe1SAndroid Build Coastguard Worker /*
2*8222fbe1SAndroid Build Coastguard Worker  * Copyright (C) 2016 The Android Open Source Project
3*8222fbe1SAndroid Build Coastguard Worker  *
4*8222fbe1SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*8222fbe1SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*8222fbe1SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*8222fbe1SAndroid Build Coastguard Worker  *
8*8222fbe1SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*8222fbe1SAndroid Build Coastguard Worker  *
10*8222fbe1SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*8222fbe1SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*8222fbe1SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*8222fbe1SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*8222fbe1SAndroid Build Coastguard Worker  * limitations under the License.
15*8222fbe1SAndroid Build Coastguard Worker  */
16*8222fbe1SAndroid Build Coastguard Worker 
17*8222fbe1SAndroid Build Coastguard Worker #ifndef ANDROID_HIDL_INTERNAL_H
18*8222fbe1SAndroid Build Coastguard Worker #define ANDROID_HIDL_INTERNAL_H
19*8222fbe1SAndroid Build Coastguard Worker 
20*8222fbe1SAndroid Build Coastguard Worker #include <cstdint>
21*8222fbe1SAndroid Build Coastguard Worker #include <dirent.h>
22*8222fbe1SAndroid Build Coastguard Worker #include <functional>
23*8222fbe1SAndroid Build Coastguard Worker #include <string>
24*8222fbe1SAndroid Build Coastguard Worker #include <vector>
25*8222fbe1SAndroid Build Coastguard Worker #include <utility>
26*8222fbe1SAndroid Build Coastguard Worker 
27*8222fbe1SAndroid Build Coastguard Worker namespace android {
28*8222fbe1SAndroid Build Coastguard Worker namespace hardware {
29*8222fbe1SAndroid Build Coastguard Worker namespace details {
30*8222fbe1SAndroid Build Coastguard Worker 
31*8222fbe1SAndroid Build Coastguard Worker // tag for pure interfaces (e.x. IFoo)
32*8222fbe1SAndroid Build Coastguard Worker struct i_tag {};
33*8222fbe1SAndroid Build Coastguard Worker 
34*8222fbe1SAndroid Build Coastguard Worker // tag for server interfaces (e.x. BnHwFoo)
35*8222fbe1SAndroid Build Coastguard Worker struct bnhw_tag {};
36*8222fbe1SAndroid Build Coastguard Worker 
37*8222fbe1SAndroid Build Coastguard Worker // tag for proxy interfaces (e.x. BpHwFoo)
38*8222fbe1SAndroid Build Coastguard Worker struct bphw_tag {};
39*8222fbe1SAndroid Build Coastguard Worker 
40*8222fbe1SAndroid Build Coastguard Worker // tag for passthrough interfaces (e.x. BsFoo)
41*8222fbe1SAndroid Build Coastguard Worker struct bs_tag {};
42*8222fbe1SAndroid Build Coastguard Worker 
43*8222fbe1SAndroid Build Coastguard Worker //Templated classes can use the below method
44*8222fbe1SAndroid Build Coastguard Worker //to avoid creating dependencies on liblog.
45*8222fbe1SAndroid Build Coastguard Worker void logAlwaysFatal(const char *message);
46*8222fbe1SAndroid Build Coastguard Worker 
47*8222fbe1SAndroid Build Coastguard Worker // Returns VNDK-SP hw path according to "ro.vndk.version"
48*8222fbe1SAndroid Build Coastguard Worker #if defined(__LP64__)
49*8222fbe1SAndroid Build Coastguard Worker std::string getVndkSpHwPath(const char* lib = "lib64");
50*8222fbe1SAndroid Build Coastguard Worker #else
51*8222fbe1SAndroid Build Coastguard Worker std::string getVndkSpHwPath(const char* lib = "lib");
52*8222fbe1SAndroid Build Coastguard Worker #endif
53*8222fbe1SAndroid Build Coastguard Worker 
54*8222fbe1SAndroid Build Coastguard Worker // Explicitly invokes the parameterized element's destructor;
55*8222fbe1SAndroid Build Coastguard Worker // intended to be used alongside the placement new operator.
56*8222fbe1SAndroid Build Coastguard Worker template<typename T>
destructElement(T * element)57*8222fbe1SAndroid Build Coastguard Worker void destructElement(T* element) {
58*8222fbe1SAndroid Build Coastguard Worker     if (element != nullptr) {
59*8222fbe1SAndroid Build Coastguard Worker         element->~T();
60*8222fbe1SAndroid Build Coastguard Worker     }
61*8222fbe1SAndroid Build Coastguard Worker }
62*8222fbe1SAndroid Build Coastguard Worker 
63*8222fbe1SAndroid Build Coastguard Worker // HIDL client/server code should *NOT* use this class.
64*8222fbe1SAndroid Build Coastguard Worker //
65*8222fbe1SAndroid Build Coastguard Worker // hidl_pointer wraps a pointer without taking ownership,
66*8222fbe1SAndroid Build Coastguard Worker // and stores it in a union with a uint64_t. This ensures
67*8222fbe1SAndroid Build Coastguard Worker // that we always have enough space to store a pointer,
68*8222fbe1SAndroid Build Coastguard Worker // regardless of whether we're running in a 32-bit or 64-bit
69*8222fbe1SAndroid Build Coastguard Worker // process.
70*8222fbe1SAndroid Build Coastguard Worker template<typename T>
71*8222fbe1SAndroid Build Coastguard Worker struct hidl_pointer {
hidl_pointerhidl_pointer72*8222fbe1SAndroid Build Coastguard Worker     hidl_pointer()
73*8222fbe1SAndroid Build Coastguard Worker         : _pad(0) {
74*8222fbe1SAndroid Build Coastguard Worker         static_assert(sizeof(*this) == 8, "wrong size");
75*8222fbe1SAndroid Build Coastguard Worker     }
hidl_pointerhidl_pointer76*8222fbe1SAndroid Build Coastguard Worker     hidl_pointer(T* ptr) : hidl_pointer() { mPointer = ptr; }
hidl_pointerhidl_pointer77*8222fbe1SAndroid Build Coastguard Worker     hidl_pointer(const hidl_pointer<T>& other) : hidl_pointer() { mPointer = other.mPointer; }
hidl_pointerhidl_pointer78*8222fbe1SAndroid Build Coastguard Worker     hidl_pointer(hidl_pointer<T>&& other) noexcept : hidl_pointer() { *this = std::move(other); }
79*8222fbe1SAndroid Build Coastguard Worker 
80*8222fbe1SAndroid Build Coastguard Worker     hidl_pointer &operator=(const hidl_pointer<T>& other) {
81*8222fbe1SAndroid Build Coastguard Worker         mPointer = other.mPointer;
82*8222fbe1SAndroid Build Coastguard Worker         return *this;
83*8222fbe1SAndroid Build Coastguard Worker     }
84*8222fbe1SAndroid Build Coastguard Worker     hidl_pointer& operator=(hidl_pointer<T>&& other) noexcept {
85*8222fbe1SAndroid Build Coastguard Worker         mPointer = other.mPointer;
86*8222fbe1SAndroid Build Coastguard Worker         other.mPointer = nullptr;
87*8222fbe1SAndroid Build Coastguard Worker         return *this;
88*8222fbe1SAndroid Build Coastguard Worker     }
89*8222fbe1SAndroid Build Coastguard Worker     hidl_pointer &operator=(T* ptr) {
90*8222fbe1SAndroid Build Coastguard Worker         mPointer = ptr;
91*8222fbe1SAndroid Build Coastguard Worker         return *this;
92*8222fbe1SAndroid Build Coastguard Worker     }
93*8222fbe1SAndroid Build Coastguard Worker 
94*8222fbe1SAndroid Build Coastguard Worker     operator T*() const {
95*8222fbe1SAndroid Build Coastguard Worker         return mPointer;
96*8222fbe1SAndroid Build Coastguard Worker     }
97*8222fbe1SAndroid Build Coastguard Worker     explicit operator void*() const { // requires explicit cast to avoid ambiguity
98*8222fbe1SAndroid Build Coastguard Worker         return mPointer;
99*8222fbe1SAndroid Build Coastguard Worker     }
100*8222fbe1SAndroid Build Coastguard Worker     T& operator*() const {
101*8222fbe1SAndroid Build Coastguard Worker         return *mPointer;
102*8222fbe1SAndroid Build Coastguard Worker     }
103*8222fbe1SAndroid Build Coastguard Worker     T* operator->() const {
104*8222fbe1SAndroid Build Coastguard Worker         return mPointer;
105*8222fbe1SAndroid Build Coastguard Worker     }
106*8222fbe1SAndroid Build Coastguard Worker     T &operator[](size_t index) {
107*8222fbe1SAndroid Build Coastguard Worker         return mPointer[index];
108*8222fbe1SAndroid Build Coastguard Worker     }
109*8222fbe1SAndroid Build Coastguard Worker     const T &operator[](size_t index) const {
110*8222fbe1SAndroid Build Coastguard Worker         return mPointer[index];
111*8222fbe1SAndroid Build Coastguard Worker     }
112*8222fbe1SAndroid Build Coastguard Worker 
113*8222fbe1SAndroid Build Coastguard Worker private:
114*8222fbe1SAndroid Build Coastguard Worker     union {
115*8222fbe1SAndroid Build Coastguard Worker         T* mPointer;
116*8222fbe1SAndroid Build Coastguard Worker         uint64_t _pad;
117*8222fbe1SAndroid Build Coastguard Worker     };
118*8222fbe1SAndroid Build Coastguard Worker };
119*8222fbe1SAndroid Build Coastguard Worker 
120*8222fbe1SAndroid Build Coastguard Worker #define HAL_LIBRARY_PATH_SYSTEM_64BIT "/system/lib64/hw/"
121*8222fbe1SAndroid Build Coastguard Worker #define HAL_LIBRARY_PATH_VENDOR_64BIT "/vendor/lib64/hw/"
122*8222fbe1SAndroid Build Coastguard Worker #define HAL_LIBRARY_PATH_ODM_64BIT    "/odm/lib64/hw/"
123*8222fbe1SAndroid Build Coastguard Worker #define HAL_LIBRARY_PATH_SYSTEM_32BIT "/system/lib/hw/"
124*8222fbe1SAndroid Build Coastguard Worker #define HAL_LIBRARY_PATH_VENDOR_32BIT "/vendor/lib/hw/"
125*8222fbe1SAndroid Build Coastguard Worker #define HAL_LIBRARY_PATH_ODM_32BIT    "/odm/lib/hw/"
126*8222fbe1SAndroid Build Coastguard Worker 
127*8222fbe1SAndroid Build Coastguard Worker #if defined(__LP64__)
128*8222fbe1SAndroid Build Coastguard Worker #define HAL_LIBRARY_PATH_SYSTEM HAL_LIBRARY_PATH_SYSTEM_64BIT
129*8222fbe1SAndroid Build Coastguard Worker #define HAL_LIBRARY_PATH_VENDOR HAL_LIBRARY_PATH_VENDOR_64BIT
130*8222fbe1SAndroid Build Coastguard Worker #define HAL_LIBRARY_PATH_ODM    HAL_LIBRARY_PATH_ODM_64BIT
131*8222fbe1SAndroid Build Coastguard Worker #else
132*8222fbe1SAndroid Build Coastguard Worker #define HAL_LIBRARY_PATH_SYSTEM HAL_LIBRARY_PATH_SYSTEM_32BIT
133*8222fbe1SAndroid Build Coastguard Worker #define HAL_LIBRARY_PATH_VENDOR HAL_LIBRARY_PATH_VENDOR_32BIT
134*8222fbe1SAndroid Build Coastguard Worker #define HAL_LIBRARY_PATH_ODM    HAL_LIBRARY_PATH_ODM_32BIT
135*8222fbe1SAndroid Build Coastguard Worker #endif
136*8222fbe1SAndroid Build Coastguard Worker 
137*8222fbe1SAndroid Build Coastguard Worker // ----------------------------------------------------------------------
138*8222fbe1SAndroid Build Coastguard Worker // Class that provides Hidl instrumentation utilities.
139*8222fbe1SAndroid Build Coastguard Worker struct HidlInstrumentor {
140*8222fbe1SAndroid Build Coastguard Worker     // Event that triggers the instrumentation. e.g. enter of an API call on
141*8222fbe1SAndroid Build Coastguard Worker     // the server/client side, exit of an API call on the server/client side
142*8222fbe1SAndroid Build Coastguard Worker     // etc.
143*8222fbe1SAndroid Build Coastguard Worker     enum InstrumentationEvent {
144*8222fbe1SAndroid Build Coastguard Worker         SERVER_API_ENTRY = 0,
145*8222fbe1SAndroid Build Coastguard Worker         SERVER_API_EXIT,
146*8222fbe1SAndroid Build Coastguard Worker         CLIENT_API_ENTRY,
147*8222fbe1SAndroid Build Coastguard Worker         CLIENT_API_EXIT,
148*8222fbe1SAndroid Build Coastguard Worker         SYNC_CALLBACK_ENTRY,
149*8222fbe1SAndroid Build Coastguard Worker         SYNC_CALLBACK_EXIT,
150*8222fbe1SAndroid Build Coastguard Worker         ASYNC_CALLBACK_ENTRY,
151*8222fbe1SAndroid Build Coastguard Worker         ASYNC_CALLBACK_EXIT,
152*8222fbe1SAndroid Build Coastguard Worker         PASSTHROUGH_ENTRY,
153*8222fbe1SAndroid Build Coastguard Worker         PASSTHROUGH_EXIT,
154*8222fbe1SAndroid Build Coastguard Worker     };
155*8222fbe1SAndroid Build Coastguard Worker 
156*8222fbe1SAndroid Build Coastguard Worker     // Signature of the instrumentation callback function.
157*8222fbe1SAndroid Build Coastguard Worker     using InstrumentationCallback = std::function<void(
158*8222fbe1SAndroid Build Coastguard Worker             const InstrumentationEvent event,
159*8222fbe1SAndroid Build Coastguard Worker             const char *package,
160*8222fbe1SAndroid Build Coastguard Worker             const char *version,
161*8222fbe1SAndroid Build Coastguard Worker             const char *interface,
162*8222fbe1SAndroid Build Coastguard Worker             const char *method,
163*8222fbe1SAndroid Build Coastguard Worker             std::vector<void *> *args)>;
164*8222fbe1SAndroid Build Coastguard Worker 
165*8222fbe1SAndroid Build Coastguard Worker     explicit HidlInstrumentor(
166*8222fbe1SAndroid Build Coastguard Worker             const std::string &package,
167*8222fbe1SAndroid Build Coastguard Worker             const std::string &insterface);
168*8222fbe1SAndroid Build Coastguard Worker     virtual ~HidlInstrumentor();
169*8222fbe1SAndroid Build Coastguard Worker 
170*8222fbe1SAndroid Build Coastguard Worker    public:
getInstrumentationCallbacksHidlInstrumentor171*8222fbe1SAndroid Build Coastguard Worker     const std::vector<InstrumentationCallback>& getInstrumentationCallbacks() {
172*8222fbe1SAndroid Build Coastguard Worker         return mInstrumentationCallbacks;
173*8222fbe1SAndroid Build Coastguard Worker     }
isInstrumentationEnabledHidlInstrumentor174*8222fbe1SAndroid Build Coastguard Worker     bool isInstrumentationEnabled() { return mEnableInstrumentation; }
175*8222fbe1SAndroid Build Coastguard Worker 
176*8222fbe1SAndroid Build Coastguard Worker    protected:
177*8222fbe1SAndroid Build Coastguard Worker     // Set mEnableInstrumentation based on system property
178*8222fbe1SAndroid Build Coastguard Worker     // hal.instrumentation.enable, register/de-register instrumentation
179*8222fbe1SAndroid Build Coastguard Worker     // callbacks if mEnableInstrumentation is true/false.
180*8222fbe1SAndroid Build Coastguard Worker     void configureInstrumentation(bool log=true);
181*8222fbe1SAndroid Build Coastguard Worker     // Function that lookup and dynamically loads the hidl instrumentation
182*8222fbe1SAndroid Build Coastguard Worker     // libraries and registers the instrumentation callback functions.
183*8222fbe1SAndroid Build Coastguard Worker     //
184*8222fbe1SAndroid Build Coastguard Worker     // The instrumentation libraries should be stored under any of the following
185*8222fbe1SAndroid Build Coastguard Worker     // directories: HAL_LIBRARY_PATH_SYSTEM, HAL_LIBRARY_PATH_VNDK_SP,
186*8222fbe1SAndroid Build Coastguard Worker     // HAL_LIBRARY_PATH_VENDOR and HAL_LIBRARY_PATH_ODM.
187*8222fbe1SAndroid Build Coastguard Worker     // The name of instrumentation libraries should follow pattern:
188*8222fbe1SAndroid Build Coastguard Worker     // ^profilerPrefix(.*).profiler.so$
189*8222fbe1SAndroid Build Coastguard Worker     //
190*8222fbe1SAndroid Build Coastguard Worker     // Each instrumentation library is expected to implement the instrumentation
191*8222fbe1SAndroid Build Coastguard Worker     // function called HIDL_INSTRUMENTATION_FUNCTION.
192*8222fbe1SAndroid Build Coastguard Worker     //
193*8222fbe1SAndroid Build Coastguard Worker     // A no-op for user build.
194*8222fbe1SAndroid Build Coastguard Worker     void registerInstrumentationCallbacks(
195*8222fbe1SAndroid Build Coastguard Worker             std::vector<InstrumentationCallback> *instrumentationCallbacks);
196*8222fbe1SAndroid Build Coastguard Worker 
197*8222fbe1SAndroid Build Coastguard Worker     // Utility function to determine whether a give file is a instrumentation
198*8222fbe1SAndroid Build Coastguard Worker     // library (i.e. the file name follow the expected pattern).
199*8222fbe1SAndroid Build Coastguard Worker     bool isInstrumentationLib(const dirent *file);
200*8222fbe1SAndroid Build Coastguard Worker 
201*8222fbe1SAndroid Build Coastguard Worker     // A list of registered instrumentation callbacks.
202*8222fbe1SAndroid Build Coastguard Worker     std::vector<InstrumentationCallback> mInstrumentationCallbacks;
203*8222fbe1SAndroid Build Coastguard Worker     // Flag whether to enable instrumentation.
204*8222fbe1SAndroid Build Coastguard Worker     union {
205*8222fbe1SAndroid Build Coastguard Worker         bool mEnableInstrumentation;
206*8222fbe1SAndroid Build Coastguard Worker         void* mReserved0;
207*8222fbe1SAndroid Build Coastguard Worker     };
208*8222fbe1SAndroid Build Coastguard Worker     // Prefix to lookup the instrumentation libraries.
209*8222fbe1SAndroid Build Coastguard Worker     std::string mInstrumentationLibPackage;
210*8222fbe1SAndroid Build Coastguard Worker     // Used for dlsym to load the profiling method for given interface.
211*8222fbe1SAndroid Build Coastguard Worker     std::string mInterfaceName;
212*8222fbe1SAndroid Build Coastguard Worker 
213*8222fbe1SAndroid Build Coastguard Worker };
214*8222fbe1SAndroid Build Coastguard Worker 
215*8222fbe1SAndroid Build Coastguard Worker #ifdef __LP64__
216*8222fbe1SAndroid Build Coastguard Worker static_assert(sizeof(HidlInstrumentor) == 88, "HidlInstrumentor size frozen by prebuilts");
217*8222fbe1SAndroid Build Coastguard Worker #else
218*8222fbe1SAndroid Build Coastguard Worker static_assert(sizeof(HidlInstrumentor) == 44, "HidlInstrumentor size frozen by prebuilts");
219*8222fbe1SAndroid Build Coastguard Worker #endif
220*8222fbe1SAndroid Build Coastguard Worker 
221*8222fbe1SAndroid Build Coastguard Worker }  // namespace details
222*8222fbe1SAndroid Build Coastguard Worker }  // namespace hardware
223*8222fbe1SAndroid Build Coastguard Worker }  // namespace android
224*8222fbe1SAndroid Build Coastguard Worker 
225*8222fbe1SAndroid Build Coastguard Worker #endif  // ANDROID_HIDL_INTERNAL_H
226