blob: df5a8ed0d170a17b944c828e8f1dc3c3cf17d080 [file] [log] [blame]
Steven Moreland80e1e6d2019-06-21 12:35:59 -07001/*
2 * Copyright (C) 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <android-base/logging.h>
Steven Moreland454bfd92022-07-20 20:53:36 +000018#include <android-base/properties.h>
Steven Moreland80e1e6d2019-06-21 12:35:59 -070019#include <binder/IPCThreadState.h>
20#include <binder/ProcessState.h>
21#include <binder/Status.h>
Jon Spivack9f503a42019-10-22 16:49:19 -070022#include <sys/timerfd.h>
23#include <utils/Looper.h>
Steven Moreland80e1e6d2019-06-21 12:35:59 -070024#include <utils/StrongPointer.h>
25
26#include "Access.h"
27#include "ServiceManager.h"
28
Parth Sane5ade9f12024-05-19 13:02:07 +000029#if !defined(VENDORSERVICEMANAGER) && !defined(__ANDROID_RECOVERY__)
30
31#include <perfetto/public/producer.h>
32#include <perfetto/public/te_category_macros.h>
33#include <perfetto/public/te_macros.h>
34#include <perfetto/public/track_event.h>
35
36namespace android {
37
38static void register_perfetto_te_categories() {
39 struct PerfettoProducerInitArgs perfetto_args = PERFETTO_PRODUCER_INIT_ARGS_INIT();
40 perfetto_args.backends = PERFETTO_BACKEND_SYSTEM;
41 PerfettoProducerInit(perfetto_args);
42 PerfettoTeInit();
43 PERFETTO_TE_REGISTER_CATEGORIES(PERFETTO_SM_CATEGORIES);
44}
45} // namespace android
46
47#endif // !defined(VENDORSERVICEMANAGER) && !defined(__ANDROID_RECOVERY__)
48
Steven Moreland80e1e6d2019-06-21 12:35:59 -070049using ::android::Access;
Steven Moreland454bfd92022-07-20 20:53:36 +000050using ::android::IPCThreadState;
Jon Spivack9f503a42019-10-22 16:49:19 -070051using ::android::Looper;
52using ::android::LooperCallback;
53using ::android::ProcessState;
Steven Moreland46f380b2019-10-16 16:28:21 -070054using ::android::ServiceManager;
Steven Moreland46f380b2019-10-16 16:28:21 -070055using ::android::sp;
Steven Moreland454bfd92022-07-20 20:53:36 +000056using ::android::base::SetProperty;
57using ::android::os::IServiceManager;
Steven Moreland80e1e6d2019-06-21 12:35:59 -070058
Jon Spivack9f503a42019-10-22 16:49:19 -070059class BinderCallback : public LooperCallback {
60public:
61 static sp<BinderCallback> setupTo(const sp<Looper>& looper) {
Steven Morelandb0983182021-04-02 03:14:04 +000062 sp<BinderCallback> cb = sp<BinderCallback>::make();
Steven Moreland535f8f92024-01-20 01:55:56 +000063 cb->mLooper = looper;
Jon Spivack9f503a42019-10-22 16:49:19 -070064
Steven Moreland535f8f92024-01-20 01:55:56 +000065 IPCThreadState::self()->setupPolling(&cb->mBinderFd);
66 LOG_ALWAYS_FATAL_IF(cb->mBinderFd < 0, "Failed to setupPolling: %d", cb->mBinderFd);
Jon Spivack9f503a42019-10-22 16:49:19 -070067
Steven Moreland535f8f92024-01-20 01:55:56 +000068 int ret = looper->addFd(cb->mBinderFd, Looper::POLL_CALLBACK, Looper::EVENT_INPUT, cb,
Jon Spivack9f503a42019-10-22 16:49:19 -070069 nullptr /*data*/);
70 LOG_ALWAYS_FATAL_IF(ret != 1, "Failed to add binder FD to Looper");
71
72 return cb;
73 }
74
75 int handleEvent(int /* fd */, int /* events */, void* /* data */) override {
76 IPCThreadState::self()->handlePolledCommands();
77 return 1; // Continue receiving callbacks.
78 }
Steven Moreland535f8f92024-01-20 01:55:56 +000079
80 void repoll() {
81 if (!mLooper->repoll(mBinderFd)) {
82 ALOGE("Failed to repoll binder FD.");
83 }
84 }
85
86private:
87 sp<Looper> mLooper;
88 int mBinderFd = -1;
Jon Spivack9f503a42019-10-22 16:49:19 -070089};
90
91// LooperCallback for IClientCallback
92class ClientCallbackCallback : public LooperCallback {
93public:
Steven Moreland535f8f92024-01-20 01:55:56 +000094 static sp<ClientCallbackCallback> setupTo(const sp<Looper>& looper,
95 const sp<ServiceManager>& manager,
96 sp<BinderCallback> binderCallback) {
Steven Morelandb0983182021-04-02 03:14:04 +000097 sp<ClientCallbackCallback> cb = sp<ClientCallbackCallback>::make(manager);
Steven Moreland535f8f92024-01-20 01:55:56 +000098 cb->mBinderCallback = binderCallback;
Jon Spivack9f503a42019-10-22 16:49:19 -070099
100 int fdTimer = timerfd_create(CLOCK_MONOTONIC, 0 /*flags*/);
101 LOG_ALWAYS_FATAL_IF(fdTimer < 0, "Failed to timerfd_create: fd: %d err: %d", fdTimer, errno);
102
103 itimerspec timespec {
104 .it_interval = {
105 .tv_sec = 5,
106 .tv_nsec = 0,
107 },
108 .it_value = {
109 .tv_sec = 5,
110 .tv_nsec = 0,
111 },
112 };
113
114 int timeRes = timerfd_settime(fdTimer, 0 /*flags*/, &timespec, nullptr);
115 LOG_ALWAYS_FATAL_IF(timeRes < 0, "Failed to timerfd_settime: res: %d err: %d", timeRes, errno);
116
117 int addRes = looper->addFd(fdTimer,
118 Looper::POLL_CALLBACK,
119 Looper::EVENT_INPUT,
120 cb,
121 nullptr);
122 LOG_ALWAYS_FATAL_IF(addRes != 1, "Failed to add client callback FD to Looper");
123
124 return cb;
125 }
126
127 int handleEvent(int fd, int /*events*/, void* /*data*/) override {
128 uint64_t expirations;
129 int ret = read(fd, &expirations, sizeof(expirations));
130 if (ret != sizeof(expirations)) {
131 ALOGE("Read failed to callback FD: ret: %d err: %d", ret, errno);
132 }
133
134 mManager->handleClientCallbacks();
Steven Moreland535f8f92024-01-20 01:55:56 +0000135 mBinderCallback->repoll(); // b/316829336
136
Jon Spivack9f503a42019-10-22 16:49:19 -0700137 return 1; // Continue receiving callbacks.
138 }
139private:
Steven Morelandb0983182021-04-02 03:14:04 +0000140 friend sp<ClientCallbackCallback>;
Jon Spivack9f503a42019-10-22 16:49:19 -0700141 ClientCallbackCallback(const sp<ServiceManager>& manager) : mManager(manager) {}
142 sp<ServiceManager> mManager;
Steven Moreland535f8f92024-01-20 01:55:56 +0000143 sp<BinderCallback> mBinderCallback;
Jon Spivack9f503a42019-10-22 16:49:19 -0700144};
145
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700146int main(int argc, char** argv) {
Yifan Hong278d81f2021-11-12 19:52:35 -0800147 android::base::InitLogging(argv, android::base::KernelLogger);
Yifan Hong278d81f2021-11-12 19:52:35 -0800148
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700149 if (argc > 2) {
150 LOG(FATAL) << "usage: " << argv[0] << " [binder driver]";
151 }
152
153 const char* driver = argc == 2 ? argv[1] : "/dev/binder";
154
Parth Sane5ade9f12024-05-19 13:02:07 +0000155#if !defined(VENDORSERVICEMANAGER) && !defined(__ANDROID_RECOVERY__)
156 android::register_perfetto_te_categories();
157#endif // !defined(VENDORSERVICEMANAGER) && !defined(__ANDROID_RECOVERY__)
158
Steven Moreland86cdb082022-07-06 22:30:18 +0000159 LOG(INFO) << "Starting sm instance on " << driver;
160
Steven Moreland1ac84c42019-07-10 17:51:27 -0700161 sp<ProcessState> ps = ProcessState::initWithDriver(driver);
162 ps->setThreadPoolMaxThreadCount(0);
163 ps->setCallRestriction(ProcessState::CallRestriction::FATAL_IF_NOT_ONEWAY);
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700164
Steven Moreland310fce22023-08-30 20:57:11 +0000165 IPCThreadState::self()->disableBackgroundScheduling(true);
166
Steven Morelandb0983182021-04-02 03:14:04 +0000167 sp<ServiceManager> manager = sp<ServiceManager>::make(std::make_unique<Access>());
Steven Moreland90b14ea2024-12-06 23:55:35 +0000168 manager->setRequestingSid(true);
Steven Moreland46f380b2019-10-16 16:28:21 -0700169 if (!manager->addService("manager", manager, false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk()) {
170 LOG(ERROR) << "Could not self register servicemanager";
171 }
172
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700173 IPCThreadState::self()->setTheContextObject(manager);
Steven Morelandd98952d2023-05-11 23:27:43 +0000174 if (!ps->becomeContextManager()) {
Steven Moreland601b7952023-05-11 23:29:00 +0000175 LOG(FATAL) << "Could not become context manager";
Steven Morelandd98952d2023-05-11 23:27:43 +0000176 }
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700177
Jon Spivack9f503a42019-10-22 16:49:19 -0700178 sp<Looper> looper = Looper::prepare(false /*allowNonCallbacks*/);
179
Steven Moreland535f8f92024-01-20 01:55:56 +0000180 sp<BinderCallback> binderCallback = BinderCallback::setupTo(looper);
181 ClientCallbackCallback::setupTo(looper, manager, binderCallback);
Jon Spivack9f503a42019-10-22 16:49:19 -0700182
Steven Moreland454bfd92022-07-20 20:53:36 +0000183#ifndef VENDORSERVICEMANAGER
184 if (!SetProperty("servicemanager.ready", "true")) {
185 LOG(ERROR) << "Failed to set servicemanager ready property";
186 }
187#endif
188
Jon Spivack9f503a42019-10-22 16:49:19 -0700189 while(true) {
190 looper->pollAll(-1);
191 }
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700192
193 // should not be reached
194 return EXIT_FAILURE;
195}