1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker * Copyright (C) 2019 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker *
4*38e8c45fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker *
8*38e8c45fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker *
10*38e8c45fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker */
16*38e8c45fSAndroid Build Coastguard Worker
17*38e8c45fSAndroid Build Coastguard Worker #include <android-base/logging.h>
18*38e8c45fSAndroid Build Coastguard Worker #include <android-base/properties.h>
19*38e8c45fSAndroid Build Coastguard Worker #include <binder/IPCThreadState.h>
20*38e8c45fSAndroid Build Coastguard Worker #include <binder/ProcessState.h>
21*38e8c45fSAndroid Build Coastguard Worker #include <binder/Status.h>
22*38e8c45fSAndroid Build Coastguard Worker #include <sys/timerfd.h>
23*38e8c45fSAndroid Build Coastguard Worker #include <utils/Looper.h>
24*38e8c45fSAndroid Build Coastguard Worker #include <utils/StrongPointer.h>
25*38e8c45fSAndroid Build Coastguard Worker
26*38e8c45fSAndroid Build Coastguard Worker #include "Access.h"
27*38e8c45fSAndroid Build Coastguard Worker #include "ServiceManager.h"
28*38e8c45fSAndroid Build Coastguard Worker
29*38e8c45fSAndroid Build Coastguard Worker #if !defined(VENDORSERVICEMANAGER) && !defined(__ANDROID_RECOVERY__)
30*38e8c45fSAndroid Build Coastguard Worker
31*38e8c45fSAndroid Build Coastguard Worker #include <perfetto/public/producer.h>
32*38e8c45fSAndroid Build Coastguard Worker #include <perfetto/public/te_category_macros.h>
33*38e8c45fSAndroid Build Coastguard Worker #include <perfetto/public/te_macros.h>
34*38e8c45fSAndroid Build Coastguard Worker #include <perfetto/public/track_event.h>
35*38e8c45fSAndroid Build Coastguard Worker
36*38e8c45fSAndroid Build Coastguard Worker namespace android {
37*38e8c45fSAndroid Build Coastguard Worker
register_perfetto_te_categories()38*38e8c45fSAndroid Build Coastguard Worker static void register_perfetto_te_categories() {
39*38e8c45fSAndroid Build Coastguard Worker struct PerfettoProducerInitArgs perfetto_args = PERFETTO_PRODUCER_INIT_ARGS_INIT();
40*38e8c45fSAndroid Build Coastguard Worker perfetto_args.backends = PERFETTO_BACKEND_SYSTEM;
41*38e8c45fSAndroid Build Coastguard Worker PerfettoProducerInit(perfetto_args);
42*38e8c45fSAndroid Build Coastguard Worker PerfettoTeInit();
43*38e8c45fSAndroid Build Coastguard Worker PERFETTO_TE_REGISTER_CATEGORIES(PERFETTO_SM_CATEGORIES);
44*38e8c45fSAndroid Build Coastguard Worker }
45*38e8c45fSAndroid Build Coastguard Worker } // namespace android
46*38e8c45fSAndroid Build Coastguard Worker
47*38e8c45fSAndroid Build Coastguard Worker #endif // !defined(VENDORSERVICEMANAGER) && !defined(__ANDROID_RECOVERY__)
48*38e8c45fSAndroid Build Coastguard Worker
49*38e8c45fSAndroid Build Coastguard Worker using ::android::Access;
50*38e8c45fSAndroid Build Coastguard Worker using ::android::IPCThreadState;
51*38e8c45fSAndroid Build Coastguard Worker using ::android::Looper;
52*38e8c45fSAndroid Build Coastguard Worker using ::android::LooperCallback;
53*38e8c45fSAndroid Build Coastguard Worker using ::android::ProcessState;
54*38e8c45fSAndroid Build Coastguard Worker using ::android::ServiceManager;
55*38e8c45fSAndroid Build Coastguard Worker using ::android::sp;
56*38e8c45fSAndroid Build Coastguard Worker using ::android::base::SetProperty;
57*38e8c45fSAndroid Build Coastguard Worker using ::android::os::IServiceManager;
58*38e8c45fSAndroid Build Coastguard Worker
59*38e8c45fSAndroid Build Coastguard Worker class BinderCallback : public LooperCallback {
60*38e8c45fSAndroid Build Coastguard Worker public:
setupTo(const sp<Looper> & looper)61*38e8c45fSAndroid Build Coastguard Worker static sp<BinderCallback> setupTo(const sp<Looper>& looper) {
62*38e8c45fSAndroid Build Coastguard Worker sp<BinderCallback> cb = sp<BinderCallback>::make();
63*38e8c45fSAndroid Build Coastguard Worker cb->mLooper = looper;
64*38e8c45fSAndroid Build Coastguard Worker
65*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::self()->setupPolling(&cb->mBinderFd);
66*38e8c45fSAndroid Build Coastguard Worker LOG_ALWAYS_FATAL_IF(cb->mBinderFd < 0, "Failed to setupPolling: %d", cb->mBinderFd);
67*38e8c45fSAndroid Build Coastguard Worker
68*38e8c45fSAndroid Build Coastguard Worker int ret = looper->addFd(cb->mBinderFd, Looper::POLL_CALLBACK, Looper::EVENT_INPUT, cb,
69*38e8c45fSAndroid Build Coastguard Worker nullptr /*data*/);
70*38e8c45fSAndroid Build Coastguard Worker LOG_ALWAYS_FATAL_IF(ret != 1, "Failed to add binder FD to Looper");
71*38e8c45fSAndroid Build Coastguard Worker
72*38e8c45fSAndroid Build Coastguard Worker return cb;
73*38e8c45fSAndroid Build Coastguard Worker }
74*38e8c45fSAndroid Build Coastguard Worker
handleEvent(int,int,void *)75*38e8c45fSAndroid Build Coastguard Worker int handleEvent(int /* fd */, int /* events */, void* /* data */) override {
76*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::self()->handlePolledCommands();
77*38e8c45fSAndroid Build Coastguard Worker return 1; // Continue receiving callbacks.
78*38e8c45fSAndroid Build Coastguard Worker }
79*38e8c45fSAndroid Build Coastguard Worker
repoll()80*38e8c45fSAndroid Build Coastguard Worker void repoll() {
81*38e8c45fSAndroid Build Coastguard Worker if (!mLooper->repoll(mBinderFd)) {
82*38e8c45fSAndroid Build Coastguard Worker ALOGE("Failed to repoll binder FD.");
83*38e8c45fSAndroid Build Coastguard Worker }
84*38e8c45fSAndroid Build Coastguard Worker }
85*38e8c45fSAndroid Build Coastguard Worker
86*38e8c45fSAndroid Build Coastguard Worker private:
87*38e8c45fSAndroid Build Coastguard Worker sp<Looper> mLooper;
88*38e8c45fSAndroid Build Coastguard Worker int mBinderFd = -1;
89*38e8c45fSAndroid Build Coastguard Worker };
90*38e8c45fSAndroid Build Coastguard Worker
91*38e8c45fSAndroid Build Coastguard Worker // LooperCallback for IClientCallback
92*38e8c45fSAndroid Build Coastguard Worker class ClientCallbackCallback : public LooperCallback {
93*38e8c45fSAndroid Build Coastguard Worker public:
setupTo(const sp<Looper> & looper,const sp<ServiceManager> & manager,sp<BinderCallback> binderCallback)94*38e8c45fSAndroid Build Coastguard Worker static sp<ClientCallbackCallback> setupTo(const sp<Looper>& looper,
95*38e8c45fSAndroid Build Coastguard Worker const sp<ServiceManager>& manager,
96*38e8c45fSAndroid Build Coastguard Worker sp<BinderCallback> binderCallback) {
97*38e8c45fSAndroid Build Coastguard Worker sp<ClientCallbackCallback> cb = sp<ClientCallbackCallback>::make(manager);
98*38e8c45fSAndroid Build Coastguard Worker cb->mBinderCallback = binderCallback;
99*38e8c45fSAndroid Build Coastguard Worker
100*38e8c45fSAndroid Build Coastguard Worker int fdTimer = timerfd_create(CLOCK_MONOTONIC, 0 /*flags*/);
101*38e8c45fSAndroid Build Coastguard Worker LOG_ALWAYS_FATAL_IF(fdTimer < 0, "Failed to timerfd_create: fd: %d err: %d", fdTimer, errno);
102*38e8c45fSAndroid Build Coastguard Worker
103*38e8c45fSAndroid Build Coastguard Worker itimerspec timespec {
104*38e8c45fSAndroid Build Coastguard Worker .it_interval = {
105*38e8c45fSAndroid Build Coastguard Worker .tv_sec = 5,
106*38e8c45fSAndroid Build Coastguard Worker .tv_nsec = 0,
107*38e8c45fSAndroid Build Coastguard Worker },
108*38e8c45fSAndroid Build Coastguard Worker .it_value = {
109*38e8c45fSAndroid Build Coastguard Worker .tv_sec = 5,
110*38e8c45fSAndroid Build Coastguard Worker .tv_nsec = 0,
111*38e8c45fSAndroid Build Coastguard Worker },
112*38e8c45fSAndroid Build Coastguard Worker };
113*38e8c45fSAndroid Build Coastguard Worker
114*38e8c45fSAndroid Build Coastguard Worker int timeRes = timerfd_settime(fdTimer, 0 /*flags*/, ×pec, nullptr);
115*38e8c45fSAndroid Build Coastguard Worker LOG_ALWAYS_FATAL_IF(timeRes < 0, "Failed to timerfd_settime: res: %d err: %d", timeRes, errno);
116*38e8c45fSAndroid Build Coastguard Worker
117*38e8c45fSAndroid Build Coastguard Worker int addRes = looper->addFd(fdTimer,
118*38e8c45fSAndroid Build Coastguard Worker Looper::POLL_CALLBACK,
119*38e8c45fSAndroid Build Coastguard Worker Looper::EVENT_INPUT,
120*38e8c45fSAndroid Build Coastguard Worker cb,
121*38e8c45fSAndroid Build Coastguard Worker nullptr);
122*38e8c45fSAndroid Build Coastguard Worker LOG_ALWAYS_FATAL_IF(addRes != 1, "Failed to add client callback FD to Looper");
123*38e8c45fSAndroid Build Coastguard Worker
124*38e8c45fSAndroid Build Coastguard Worker return cb;
125*38e8c45fSAndroid Build Coastguard Worker }
126*38e8c45fSAndroid Build Coastguard Worker
handleEvent(int fd,int,void *)127*38e8c45fSAndroid Build Coastguard Worker int handleEvent(int fd, int /*events*/, void* /*data*/) override {
128*38e8c45fSAndroid Build Coastguard Worker uint64_t expirations;
129*38e8c45fSAndroid Build Coastguard Worker int ret = read(fd, &expirations, sizeof(expirations));
130*38e8c45fSAndroid Build Coastguard Worker if (ret != sizeof(expirations)) {
131*38e8c45fSAndroid Build Coastguard Worker ALOGE("Read failed to callback FD: ret: %d err: %d", ret, errno);
132*38e8c45fSAndroid Build Coastguard Worker }
133*38e8c45fSAndroid Build Coastguard Worker
134*38e8c45fSAndroid Build Coastguard Worker mManager->handleClientCallbacks();
135*38e8c45fSAndroid Build Coastguard Worker mBinderCallback->repoll(); // b/316829336
136*38e8c45fSAndroid Build Coastguard Worker
137*38e8c45fSAndroid Build Coastguard Worker return 1; // Continue receiving callbacks.
138*38e8c45fSAndroid Build Coastguard Worker }
139*38e8c45fSAndroid Build Coastguard Worker private:
140*38e8c45fSAndroid Build Coastguard Worker friend sp<ClientCallbackCallback>;
ClientCallbackCallback(const sp<ServiceManager> & manager)141*38e8c45fSAndroid Build Coastguard Worker ClientCallbackCallback(const sp<ServiceManager>& manager) : mManager(manager) {}
142*38e8c45fSAndroid Build Coastguard Worker sp<ServiceManager> mManager;
143*38e8c45fSAndroid Build Coastguard Worker sp<BinderCallback> mBinderCallback;
144*38e8c45fSAndroid Build Coastguard Worker };
145*38e8c45fSAndroid Build Coastguard Worker
main(int argc,char ** argv)146*38e8c45fSAndroid Build Coastguard Worker int main(int argc, char** argv) {
147*38e8c45fSAndroid Build Coastguard Worker android::base::InitLogging(argv, android::base::KernelLogger);
148*38e8c45fSAndroid Build Coastguard Worker
149*38e8c45fSAndroid Build Coastguard Worker if (argc > 2) {
150*38e8c45fSAndroid Build Coastguard Worker LOG(FATAL) << "usage: " << argv[0] << " [binder driver]";
151*38e8c45fSAndroid Build Coastguard Worker }
152*38e8c45fSAndroid Build Coastguard Worker
153*38e8c45fSAndroid Build Coastguard Worker const char* driver = argc == 2 ? argv[1] : "/dev/binder";
154*38e8c45fSAndroid Build Coastguard Worker
155*38e8c45fSAndroid Build Coastguard Worker #if !defined(VENDORSERVICEMANAGER) && !defined(__ANDROID_RECOVERY__)
156*38e8c45fSAndroid Build Coastguard Worker android::register_perfetto_te_categories();
157*38e8c45fSAndroid Build Coastguard Worker #endif // !defined(VENDORSERVICEMANAGER) && !defined(__ANDROID_RECOVERY__)
158*38e8c45fSAndroid Build Coastguard Worker
159*38e8c45fSAndroid Build Coastguard Worker LOG(INFO) << "Starting sm instance on " << driver;
160*38e8c45fSAndroid Build Coastguard Worker
161*38e8c45fSAndroid Build Coastguard Worker sp<ProcessState> ps = ProcessState::initWithDriver(driver);
162*38e8c45fSAndroid Build Coastguard Worker ps->setThreadPoolMaxThreadCount(0);
163*38e8c45fSAndroid Build Coastguard Worker ps->setCallRestriction(ProcessState::CallRestriction::FATAL_IF_NOT_ONEWAY);
164*38e8c45fSAndroid Build Coastguard Worker
165*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::self()->disableBackgroundScheduling(true);
166*38e8c45fSAndroid Build Coastguard Worker
167*38e8c45fSAndroid Build Coastguard Worker sp<ServiceManager> manager = sp<ServiceManager>::make(std::make_unique<Access>());
168*38e8c45fSAndroid Build Coastguard Worker manager->setRequestingSid(true);
169*38e8c45fSAndroid Build Coastguard Worker if (!manager->addService("manager", manager, false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk()) {
170*38e8c45fSAndroid Build Coastguard Worker LOG(ERROR) << "Could not self register servicemanager";
171*38e8c45fSAndroid Build Coastguard Worker }
172*38e8c45fSAndroid Build Coastguard Worker
173*38e8c45fSAndroid Build Coastguard Worker IPCThreadState::self()->setTheContextObject(manager);
174*38e8c45fSAndroid Build Coastguard Worker if (!ps->becomeContextManager()) {
175*38e8c45fSAndroid Build Coastguard Worker LOG(FATAL) << "Could not become context manager";
176*38e8c45fSAndroid Build Coastguard Worker }
177*38e8c45fSAndroid Build Coastguard Worker
178*38e8c45fSAndroid Build Coastguard Worker sp<Looper> looper = Looper::prepare(false /*allowNonCallbacks*/);
179*38e8c45fSAndroid Build Coastguard Worker
180*38e8c45fSAndroid Build Coastguard Worker sp<BinderCallback> binderCallback = BinderCallback::setupTo(looper);
181*38e8c45fSAndroid Build Coastguard Worker ClientCallbackCallback::setupTo(looper, manager, binderCallback);
182*38e8c45fSAndroid Build Coastguard Worker
183*38e8c45fSAndroid Build Coastguard Worker #ifndef VENDORSERVICEMANAGER
184*38e8c45fSAndroid Build Coastguard Worker if (!SetProperty("servicemanager.ready", "true")) {
185*38e8c45fSAndroid Build Coastguard Worker LOG(ERROR) << "Failed to set servicemanager ready property";
186*38e8c45fSAndroid Build Coastguard Worker }
187*38e8c45fSAndroid Build Coastguard Worker #endif
188*38e8c45fSAndroid Build Coastguard Worker
189*38e8c45fSAndroid Build Coastguard Worker while(true) {
190*38e8c45fSAndroid Build Coastguard Worker looper->pollAll(-1);
191*38e8c45fSAndroid Build Coastguard Worker }
192*38e8c45fSAndroid Build Coastguard Worker
193*38e8c45fSAndroid Build Coastguard Worker // should not be reached
194*38e8c45fSAndroid Build Coastguard Worker return EXIT_FAILURE;
195*38e8c45fSAndroid Build Coastguard Worker }
196