1*77b80299SAndroid Build Coastguard Worker /* 2*77b80299SAndroid Build Coastguard Worker * Copyright (C) 2005 The Android Open Source Project 3*77b80299SAndroid Build Coastguard Worker * 4*77b80299SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*77b80299SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*77b80299SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*77b80299SAndroid Build Coastguard Worker * 8*77b80299SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*77b80299SAndroid Build Coastguard Worker * 10*77b80299SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*77b80299SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*77b80299SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*77b80299SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*77b80299SAndroid Build Coastguard Worker * limitations under the License. 15*77b80299SAndroid Build Coastguard Worker */ 16*77b80299SAndroid Build Coastguard Worker 17*77b80299SAndroid Build Coastguard Worker #ifndef ANDROID_HARDWARE_IPC_THREAD_STATE_H 18*77b80299SAndroid Build Coastguard Worker #define ANDROID_HARDWARE_IPC_THREAD_STATE_H 19*77b80299SAndroid Build Coastguard Worker 20*77b80299SAndroid Build Coastguard Worker #include <utils/Errors.h> 21*77b80299SAndroid Build Coastguard Worker #include <hwbinder/Parcel.h> 22*77b80299SAndroid Build Coastguard Worker #include <hwbinder/ProcessState.h> 23*77b80299SAndroid Build Coastguard Worker #include <utils/Vector.h> 24*77b80299SAndroid Build Coastguard Worker 25*77b80299SAndroid Build Coastguard Worker #include <functional> 26*77b80299SAndroid Build Coastguard Worker 27*77b80299SAndroid Build Coastguard Worker // WARNING: this code is part of libhwbinder, a fork of libbinder. Generally, 28*77b80299SAndroid Build Coastguard Worker // this means that it is only relevant to HIDL. Any AIDL- or libbinder-specific 29*77b80299SAndroid Build Coastguard Worker // code should not try to use these things. 30*77b80299SAndroid Build Coastguard Worker 31*77b80299SAndroid Build Coastguard Worker #if defined(_WIN32) 32*77b80299SAndroid Build Coastguard Worker typedef int uid_t; 33*77b80299SAndroid Build Coastguard Worker #endif 34*77b80299SAndroid Build Coastguard Worker 35*77b80299SAndroid Build Coastguard Worker // --------------------------------------------------------------------------- 36*77b80299SAndroid Build Coastguard Worker namespace android { 37*77b80299SAndroid Build Coastguard Worker 38*77b80299SAndroid Build Coastguard Worker namespace hardware { 39*77b80299SAndroid Build Coastguard Worker 40*77b80299SAndroid Build Coastguard Worker class IPCThreadState 41*77b80299SAndroid Build Coastguard Worker { 42*77b80299SAndroid Build Coastguard Worker public: 43*77b80299SAndroid Build Coastguard Worker static IPCThreadState* self(); 44*77b80299SAndroid Build Coastguard Worker static IPCThreadState* selfOrNull(); // self(), but won't instantiate 45*77b80299SAndroid Build Coastguard Worker 46*77b80299SAndroid Build Coastguard Worker sp<ProcessState> process(); 47*77b80299SAndroid Build Coastguard Worker 48*77b80299SAndroid Build Coastguard Worker status_t clearLastError(); 49*77b80299SAndroid Build Coastguard Worker 50*77b80299SAndroid Build Coastguard Worker pid_t getCallingPid() const; 51*77b80299SAndroid Build Coastguard Worker // nullptr if unavailable 52*77b80299SAndroid Build Coastguard Worker // 53*77b80299SAndroid Build Coastguard Worker // this can't be restored once it's cleared, and it does not return the 54*77b80299SAndroid Build Coastguard Worker // context of the current process when not in a binder call. 55*77b80299SAndroid Build Coastguard Worker const char* getCallingSid() const; 56*77b80299SAndroid Build Coastguard Worker uid_t getCallingUid() const; 57*77b80299SAndroid Build Coastguard Worker 58*77b80299SAndroid Build Coastguard Worker void setStrictModePolicy(int32_t policy); 59*77b80299SAndroid Build Coastguard Worker int32_t getStrictModePolicy() const; 60*77b80299SAndroid Build Coastguard Worker 61*77b80299SAndroid Build Coastguard Worker void setLastTransactionBinderFlags(int32_t flags); 62*77b80299SAndroid Build Coastguard Worker int32_t getLastTransactionBinderFlags() const; 63*77b80299SAndroid Build Coastguard Worker 64*77b80299SAndroid Build Coastguard Worker int64_t clearCallingIdentity(); 65*77b80299SAndroid Build Coastguard Worker // Restores PID/UID (not SID) 66*77b80299SAndroid Build Coastguard Worker void restoreCallingIdentity(int64_t token); 67*77b80299SAndroid Build Coastguard Worker 68*77b80299SAndroid Build Coastguard Worker int setupPolling(int* fd); 69*77b80299SAndroid Build Coastguard Worker status_t handlePolledCommands(); 70*77b80299SAndroid Build Coastguard Worker void flushCommands(); 71*77b80299SAndroid Build Coastguard Worker 72*77b80299SAndroid Build Coastguard Worker void joinThreadPool(bool isMain = true); 73*77b80299SAndroid Build Coastguard Worker 74*77b80299SAndroid Build Coastguard Worker // Stop the local process. 75*77b80299SAndroid Build Coastguard Worker void stopProcess(bool immediate = true); 76*77b80299SAndroid Build Coastguard Worker 77*77b80299SAndroid Build Coastguard Worker status_t transact(int32_t handle, 78*77b80299SAndroid Build Coastguard Worker uint32_t code, const Parcel& data, 79*77b80299SAndroid Build Coastguard Worker Parcel* reply, uint32_t flags); 80*77b80299SAndroid Build Coastguard Worker 81*77b80299SAndroid Build Coastguard Worker void incStrongHandle(int32_t handle, BpHwBinder *proxy); 82*77b80299SAndroid Build Coastguard Worker void decStrongHandle(int32_t handle); 83*77b80299SAndroid Build Coastguard Worker void incWeakHandle(int32_t handle, BpHwBinder *proxy); 84*77b80299SAndroid Build Coastguard Worker void decWeakHandle(int32_t handle); 85*77b80299SAndroid Build Coastguard Worker status_t attemptIncStrongHandle(int32_t handle); 86*77b80299SAndroid Build Coastguard Worker static void expungeHandle(int32_t handle, IBinder* binder); 87*77b80299SAndroid Build Coastguard Worker status_t requestDeathNotification( int32_t handle, 88*77b80299SAndroid Build Coastguard Worker BpHwBinder* proxy); 89*77b80299SAndroid Build Coastguard Worker status_t clearDeathNotification( int32_t handle, 90*77b80299SAndroid Build Coastguard Worker BpHwBinder* proxy); 91*77b80299SAndroid Build Coastguard Worker 92*77b80299SAndroid Build Coastguard Worker static void shutdown(); 93*77b80299SAndroid Build Coastguard Worker 94*77b80299SAndroid Build Coastguard Worker // Service manager registration 95*77b80299SAndroid Build Coastguard Worker void setTheContextObject(sp<BHwBinder> obj); 96*77b80299SAndroid Build Coastguard Worker 97*77b80299SAndroid Build Coastguard Worker bool isLooperThread(); 98*77b80299SAndroid Build Coastguard Worker bool isOnlyBinderThread(); 99*77b80299SAndroid Build Coastguard Worker 100*77b80299SAndroid Build Coastguard Worker // WARNING: DO NOT USE THIS API 101*77b80299SAndroid Build Coastguard Worker // 102*77b80299SAndroid Build Coastguard Worker // Returns a pointer to the stack from the last time a transaction 103*77b80299SAndroid Build Coastguard Worker // was initiated by the kernel. Used to compare when making nested 104*77b80299SAndroid Build Coastguard Worker // calls between multiple different transports. 105*77b80299SAndroid Build Coastguard Worker const void* getServingStackPointer() const; 106*77b80299SAndroid Build Coastguard Worker 107*77b80299SAndroid Build Coastguard Worker // Tasks which are done on the binder thread after the thread returns to the 108*77b80299SAndroid Build Coastguard Worker // threadpool. 109*77b80299SAndroid Build Coastguard Worker void addPostCommandTask(const std::function<void(void)>& task); 110*77b80299SAndroid Build Coastguard Worker 111*77b80299SAndroid Build Coastguard Worker private: 112*77b80299SAndroid Build Coastguard Worker IPCThreadState(); 113*77b80299SAndroid Build Coastguard Worker ~IPCThreadState(); 114*77b80299SAndroid Build Coastguard Worker 115*77b80299SAndroid Build Coastguard Worker status_t sendReply(const Parcel& reply, uint32_t flags); 116*77b80299SAndroid Build Coastguard Worker status_t waitForResponse(Parcel *reply, 117*77b80299SAndroid Build Coastguard Worker status_t *acquireResult=nullptr); 118*77b80299SAndroid Build Coastguard Worker status_t talkWithDriver(bool doReceive=true); 119*77b80299SAndroid Build Coastguard Worker status_t writeTransactionData(int32_t cmd, 120*77b80299SAndroid Build Coastguard Worker uint32_t binderFlags, 121*77b80299SAndroid Build Coastguard Worker int32_t handle, 122*77b80299SAndroid Build Coastguard Worker uint32_t code, 123*77b80299SAndroid Build Coastguard Worker const Parcel& data, 124*77b80299SAndroid Build Coastguard Worker status_t* statusBuffer); 125*77b80299SAndroid Build Coastguard Worker status_t getAndExecuteCommand(); 126*77b80299SAndroid Build Coastguard Worker status_t executeCommand(int32_t command); 127*77b80299SAndroid Build Coastguard Worker void processPendingDerefs(); 128*77b80299SAndroid Build Coastguard Worker void processPostWriteDerefs(); 129*77b80299SAndroid Build Coastguard Worker 130*77b80299SAndroid Build Coastguard Worker void clearCaller(); 131*77b80299SAndroid Build Coastguard Worker 132*77b80299SAndroid Build Coastguard Worker static void threadDestructor(void *st); 133*77b80299SAndroid Build Coastguard Worker static void freeBuffer(Parcel* parcel, 134*77b80299SAndroid Build Coastguard Worker const uint8_t* data, size_t dataSize, 135*77b80299SAndroid Build Coastguard Worker const binder_size_t* objects, size_t objectsSize, 136*77b80299SAndroid Build Coastguard Worker void* cookie); 137*77b80299SAndroid Build Coastguard Worker 138*77b80299SAndroid Build Coastguard Worker const sp<ProcessState> mProcess; 139*77b80299SAndroid Build Coastguard Worker Vector<BHwBinder*> mPendingStrongDerefs; 140*77b80299SAndroid Build Coastguard Worker Vector<RefBase::weakref_type*> mPendingWeakDerefs; 141*77b80299SAndroid Build Coastguard Worker Vector<RefBase*> mPostWriteStrongDerefs; 142*77b80299SAndroid Build Coastguard Worker Vector<RefBase::weakref_type*> mPostWriteWeakDerefs; 143*77b80299SAndroid Build Coastguard Worker Parcel mIn; 144*77b80299SAndroid Build Coastguard Worker Parcel mOut; 145*77b80299SAndroid Build Coastguard Worker status_t mLastError; 146*77b80299SAndroid Build Coastguard Worker const void* mServingStackPointer; 147*77b80299SAndroid Build Coastguard Worker pid_t mCallingPid; 148*77b80299SAndroid Build Coastguard Worker const char* mCallingSid; 149*77b80299SAndroid Build Coastguard Worker uid_t mCallingUid; 150*77b80299SAndroid Build Coastguard Worker int32_t mStrictModePolicy; 151*77b80299SAndroid Build Coastguard Worker int32_t mLastTransactionBinderFlags; 152*77b80299SAndroid Build Coastguard Worker bool mIsLooper; 153*77b80299SAndroid Build Coastguard Worker bool mIsPollingThread; 154*77b80299SAndroid Build Coastguard Worker 155*77b80299SAndroid Build Coastguard Worker std::vector<std::function<void(void)>> mPostCommandTasks; 156*77b80299SAndroid Build Coastguard Worker 157*77b80299SAndroid Build Coastguard Worker ProcessState::CallRestriction mCallRestriction; 158*77b80299SAndroid Build Coastguard Worker }; 159*77b80299SAndroid Build Coastguard Worker 160*77b80299SAndroid Build Coastguard Worker } // namespace hardware 161*77b80299SAndroid Build Coastguard Worker } // namespace android 162*77b80299SAndroid Build Coastguard Worker 163*77b80299SAndroid Build Coastguard Worker // --------------------------------------------------------------------------- 164*77b80299SAndroid Build Coastguard Worker 165*77b80299SAndroid Build Coastguard Worker #endif // ANDROID_HARDWARE_IPC_THREAD_STATE_H 166