blob: 9dd1aee8e4e09061e8ce3dce009598883aa80dbf [file] [log] [blame]
Steven Morelandfe66b732019-02-01 14:29:45 -08001/*
2 * Copyright (C) 2016 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
Steven Moreland5fb3d652016-11-03 13:45:18 -070017#define LOG_TAG "hwservicemanager"
Steven Morelandd83d1102016-10-25 15:01:47 -070018
19#include <utils/Log.h>
20
21#include <inttypes.h>
22#include <unistd.h>
Steven Morelandd8536202018-09-26 10:56:19 -070023#include <sys/timerfd.h>
Steven Morelandd83d1102016-10-25 15:01:47 -070024
Steven Moreland66ac4012016-12-21 15:06:10 -080025#include <android/hidl/token/1.0/ITokenManager.h>
Steven Morelandd83d1102016-10-25 15:01:47 -070026#include <cutils/properties.h>
Steven Moreland73859242018-10-05 11:08:32 -070027#include <hidl/HidlBinderSupport.h>
28#include <hidl/HidlTransportSupport.h>
Steven Morelandd83d1102016-10-25 15:01:47 -070029#include <hidl/Status.h>
30#include <hwbinder/IPCThreadState.h>
Martijn Coenen6942be62017-11-07 16:25:11 +010031#include <hwbinder/ProcessState.h>
Steven Morelandd83d1102016-10-25 15:01:47 -070032#include <utils/Errors.h>
33#include <utils/Looper.h>
34#include <utils/StrongPointer.h>
35
36#include "ServiceManager.h"
Steven Moreland66ac4012016-12-21 15:06:10 -080037#include "TokenManager.h"
Steven Morelandd83d1102016-10-25 15:01:47 -070038
39// libutils:
Steven Morelandd83d1102016-10-25 15:01:47 -070040using android::sp;
Steven Moreland72cde212018-09-26 09:51:47 -070041using android::Looper;
42using android::LooperCallback;
Steven Morelandd83d1102016-10-25 15:01:47 -070043
44// libhwbinder:
Steven Moreland73859242018-10-05 11:08:32 -070045using android::hardware::BHwBinder;
46using android::hardware::IBinder;
Steven Morelandd83d1102016-10-25 15:01:47 -070047using android::hardware::IPCThreadState;
Martijn Coenen6942be62017-11-07 16:25:11 +010048using android::hardware::ProcessState;
Steven Morelandd83d1102016-10-25 15:01:47 -070049
50// libhidl
Steven Moreland72cde212018-09-26 09:51:47 -070051using android::hardware::handleTransportPoll;
Steven Moreland7185a892019-01-09 18:00:05 -080052using android::hardware::setRequestingSid;
Steven Morelandf0e244a2019-03-05 19:36:34 -080053using android::hardware::HidlReturnRestriction;
54using android::hardware::setProcessHidlReturnRestriction;
Steven Moreland72cde212018-09-26 09:51:47 -070055using android::hardware::setupTransportPolling;
Steven Moreland73859242018-10-05 11:08:32 -070056using android::hardware::toBinder;
Steven Morelandd83d1102016-10-25 15:01:47 -070057
Steven Moreland66ac4012016-12-21 15:06:10 -080058// implementations
Steven Moreland6f4fbe12017-07-21 18:07:42 -070059using android::hidl::manager::implementation::ServiceManager;
Steven Moreland73859242018-10-05 11:08:32 -070060using android::hidl::manager::V1_0::IServiceManager;
Steven Moreland66ac4012016-12-21 15:06:10 -080061using android::hidl::token::V1_0::implementation::TokenManager;
Steven Morelandd83d1102016-10-25 15:01:47 -070062
Yifan Hong18996882017-02-24 17:04:48 -080063static std::string serviceName = "default";
Steven Morelandd83d1102016-10-25 15:01:47 -070064
Steven Moreland72cde212018-09-26 09:51:47 -070065class HwBinderCallback : public LooperCallback {
66public:
67 static sp<HwBinderCallback> setupTo(const sp<Looper>& looper) {
68 sp<HwBinderCallback> cb = new HwBinderCallback;
Martijn Coenen437bbb42016-12-28 17:06:54 +010069
Steven Moreland72cde212018-09-26 09:51:47 -070070 int fdHwBinder = setupTransportPolling();
71 LOG_ALWAYS_FATAL_IF(fdHwBinder < 0, "Failed to setupTransportPolling: %d", fdHwBinder);
72
73 // Flush after setupPolling(), to make sure the binder driver
74 // knows about this thread handling commands.
75 IPCThreadState::self()->flushCommands();
76
77 int ret = looper->addFd(fdHwBinder,
78 Looper::POLL_CALLBACK,
79 Looper::EVENT_INPUT,
80 cb,
81 nullptr /*data*/);
82 LOG_ALWAYS_FATAL_IF(ret != 1, "Failed to add binder FD to Looper");
83
84 return cb;
85 }
86
87 int handleEvent(int fd, int /*events*/, void* /*data*/) override {
88 handleTransportPoll(fd);
89 return 1; // Continue receiving callbacks.
90 }
91};
92
Steven Morelandd8536202018-09-26 10:56:19 -070093// LooperCallback for IClientCallback
94class ClientCallbackCallback : public LooperCallback {
95public:
96 static sp<ClientCallbackCallback> setupTo(const sp<Looper>& looper, const sp<ServiceManager>& manager) {
97 sp<ClientCallbackCallback> cb = new ClientCallbackCallback(manager);
Steven Morelandd83d1102016-10-25 15:01:47 -070098
Steven Morelandd8536202018-09-26 10:56:19 -070099 int fdTimer = timerfd_create(CLOCK_MONOTONIC, 0 /*flags*/);
100 LOG_ALWAYS_FATAL_IF(fdTimer < 0, "Failed to timerfd_create: fd: %d err: %d", fdTimer, errno);
101
102 itimerspec timespec {
103 .it_interval = {
104 .tv_sec = 5,
105 .tv_nsec = 0,
106 },
107 .it_value = {
108 .tv_sec = 5,
109 .tv_nsec = 0,
110 },
111 };
112
113 int timeRes = timerfd_settime(fdTimer, 0 /*flags*/, &timespec, nullptr);
114 LOG_ALWAYS_FATAL_IF(timeRes < 0, "Failed to timerfd_settime: res: %d err: %d", timeRes, errno);
115
116 int addRes = looper->addFd(fdTimer,
117 Looper::POLL_CALLBACK,
118 Looper::EVENT_INPUT,
119 cb,
120 nullptr);
121 LOG_ALWAYS_FATAL_IF(addRes != 1, "Failed to add client callback FD to Looper");
122
123 return cb;
124 }
125
126 int handleEvent(int fd, int /*events*/, void* /*data*/) override {
127 uint64_t expirations;
128 int ret = read(fd, &expirations, sizeof(expirations));
129 if (ret != sizeof(expirations)) {
130 ALOGE("Read failed to callback FD: ret: %d err: %d", ret, errno);
131 }
132
133 mManager->handleClientCallbacks();
134 return 1; // Continue receiving callbacks.
135 }
136private:
137 ClientCallbackCallback(const sp<ServiceManager>& manager) : mManager(manager) {}
138 sp<ServiceManager> mManager;
139};
140
141int main() {
Steven Morelandf0e244a2019-03-05 19:36:34 -0800142 // If hwservicemanager crashes, the system may be unstable and hard to debug. This is both why
143 // we log this and why we care about this at all.
144 setProcessHidlReturnRestriction(HidlReturnRestriction::ERROR_IF_UNCHECKED);
145
Steven Morelandd8536202018-09-26 10:56:19 -0700146 sp<ServiceManager> manager = new ServiceManager();
Steven Moreland7185a892019-01-09 18:00:05 -0800147 setRequestingSid(manager, true);
148
Steven Morelandf0e244a2019-03-05 19:36:34 -0800149 if (!manager->add(serviceName, manager).withDefault(false)) {
Martijn Coenen1a5da1c2017-03-06 13:05:39 +0100150 ALOGE("Failed to register hwservicemanager with itself.");
151 }
Steven Moreland76237812016-11-08 15:59:04 -0800152
Steven Morelandd8536202018-09-26 10:56:19 -0700153 sp<TokenManager> tokenManager = new TokenManager();
Steven Morelandf0e244a2019-03-05 19:36:34 -0800154 if (!manager->add(serviceName, tokenManager).withDefault(false)) {
Martijn Coenen1a5da1c2017-03-06 13:05:39 +0100155 ALOGE("Failed to register ITokenManager with hwservicemanager.");
156 }
Steven Moreland76237812016-11-08 15:59:04 -0800157
Steven Morelandd83d1102016-10-25 15:01:47 -0700158 // Tell IPCThreadState we're the service manager
Steven Moreland73859242018-10-05 11:08:32 -0700159 sp<IBinder> binder = toBinder<IServiceManager>(manager);
160 sp<BHwBinder> service = static_cast<BHwBinder*>(binder.get()); // local binder object
Steven Morelandd83d1102016-10-25 15:01:47 -0700161 IPCThreadState::self()->setTheContextObject(service);
Martijn Coenen6942be62017-11-07 16:25:11 +0100162 // Then tell the kernel
163 ProcessState::self()->becomeContextManager(nullptr, nullptr);
Steven Morelandd83d1102016-10-25 15:01:47 -0700164
Martijn Coenen62c51302017-11-07 13:22:22 +0100165 int rc = property_set("hwservicemanager.ready", "true");
Steven Morelandd83d1102016-10-25 15:01:47 -0700166 if (rc) {
Steven Moreland50bf1822017-03-27 08:33:16 -0700167 ALOGE("Failed to set \"hwservicemanager.ready\" (error %d). "\
168 "HAL services will not start!\n", rc);
Steven Morelandd83d1102016-10-25 15:01:47 -0700169 }
170
Steven Moreland72cde212018-09-26 09:51:47 -0700171 sp<Looper> looper = Looper::prepare(0 /* opts */);
172
173 (void)HwBinderCallback::setupTo(looper);
Steven Morelandd8536202018-09-26 10:56:19 -0700174 (void)ClientCallbackCallback::setupTo(looper, manager);
Steven Moreland72cde212018-09-26 09:51:47 -0700175
Wei Wang64e5f902018-04-04 13:41:10 -0700176 ALOGI("hwservicemanager is ready now.");
Steven Moreland72cde212018-09-26 09:51:47 -0700177
178 while (true) {
179 looper->pollAll(-1 /* timeoutMillis */);
180 }
Steven Morelandd83d1102016-10-25 15:01:47 -0700181
182 return 0;
Martijn Coenenfcfcdfb2016-12-12 13:46:44 +0100183}