blob: 09db32609a76711c9abaae5224e5bfbdd0949c1a [file] [log] [blame]
Andrei Homescu74a54452021-12-10 05:30:21 +00001/*
2 * Copyright (C) 2022 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
Ayrton Munoz04137372022-08-03 17:05:09 -040017#if defined(TRUSTY_USERSPACE)
Andrei Homescu74a54452021-12-10 05:30:21 +000018#include <openssl/rand.h>
Andrei Homescu1c18a802022-08-17 04:59:01 +000019#include <trusty_ipc.h>
Ayrton Munoz04137372022-08-03 17:05:09 -040020#else
21#include <lib/rand/rand.h>
22#endif
Andrei Homescu74a54452021-12-10 05:30:21 +000023
Frederick Maylef7b65d12024-05-14 16:55:14 -070024#include <binder/Common.h>
Andrei Homescu024727b2022-08-24 23:54:59 +000025#include <binder/RpcTransportTipcTrusty.h>
Tomasz Wasilczykc7c22ea2023-11-30 20:13:44 -080026#include <log/log.h>
27#include <trusty_log.h>
Andrei Homescu024727b2022-08-24 23:54:59 +000028
Andrei Homescu74a54452021-12-10 05:30:21 +000029#include "../OS.h"
Andrei Homescu1c18a802022-08-17 04:59:01 +000030#include "TrustyStatus.h"
Andrei Homescu74a54452021-12-10 05:30:21 +000031
Tomasz Wasilczykc7c22ea2023-11-30 20:13:44 -080032#include <cstdarg>
33
Tomasz Wasilczyk639490b2023-11-01 13:49:41 -070034using android::binder::borrowed_fd;
35using android::binder::unique_fd;
36
Tomasz Wasilczyk0d9dec22023-10-06 20:28:49 +000037namespace android::binder::os {
Andrei Homescu74a54452021-12-10 05:30:21 +000038
Tomasz Wasilczykdaf727a2023-11-21 13:50:09 -080039void trace_begin(uint64_t, const char*) {}
40
41void trace_end(uint64_t) {}
42
43uint64_t GetThreadId() {
44 return 0;
45}
46
47bool report_sysprop_change() {
48 return false;
49}
50
Tomasz Wasilczyk639490b2023-11-01 13:49:41 -070051status_t setNonBlocking(borrowed_fd /*fd*/) {
Andrei Homescu74a54452021-12-10 05:30:21 +000052 // Trusty IPC syscalls are all non-blocking by default.
Tomasz Wasilczyk88aa8c32023-11-01 09:46:07 -070053 return OK;
Andrei Homescu74a54452021-12-10 05:30:21 +000054}
55
56status_t getRandomBytes(uint8_t* data, size_t size) {
Ayrton Munoz04137372022-08-03 17:05:09 -040057#if defined(TRUSTY_USERSPACE)
Andrei Homescu74a54452021-12-10 05:30:21 +000058 int res = RAND_bytes(data, size);
59 return res == 1 ? OK : UNKNOWN_ERROR;
Ayrton Munoz04137372022-08-03 17:05:09 -040060#else
61 int res = rand_get_bytes(data, size);
62 return res == 0 ? OK : UNKNOWN_ERROR;
63#endif // TRUSTY_USERSPACE
Andrei Homescu74a54452021-12-10 05:30:21 +000064}
65
Andrei Homescu1c18a802022-08-17 04:59:01 +000066status_t dupFileDescriptor(int oldFd, int* newFd) {
67 int res = dup(oldFd);
68 if (res < 0) {
69 return statusFromTrusty(res);
70 }
71
72 *newFd = res;
73 return OK;
Andrei Homescu24ad36e2022-08-04 01:33:33 +000074}
75
Andrei Homescu024727b2022-08-24 23:54:59 +000076std::unique_ptr<RpcTransportCtxFactory> makeDefaultRpcTransportCtxFactory() {
77 return RpcTransportCtxFactoryTipcTrusty::make();
78}
79
David Brazdilc3964f62022-10-24 23:06:14 +010080ssize_t sendMessageOnSocket(
David Brazdil21c887c2022-09-23 12:25:18 +010081 const RpcTransportFd& /* socket */, iovec* /* iovs */, int /* niovs */,
Tomasz Wasilczyk639490b2023-11-01 13:49:41 -070082 const std::vector<std::variant<unique_fd, borrowed_fd>>* /* ancillaryFds */) {
David Brazdil21c887c2022-09-23 12:25:18 +010083 errno = ENOTSUP;
84 return -1;
85}
86
David Brazdilc3964f62022-10-24 23:06:14 +010087ssize_t receiveMessageFromSocket(
David Brazdil21c887c2022-09-23 12:25:18 +010088 const RpcTransportFd& /* socket */, iovec* /* iovs */, int /* niovs */,
Tomasz Wasilczyk639490b2023-11-01 13:49:41 -070089 std::vector<std::variant<unique_fd, borrowed_fd>>* /* ancillaryFds */) {
David Brazdil21c887c2022-09-23 12:25:18 +010090 errno = ENOTSUP;
91 return -1;
92}
93
Tomasz Wasilczyk0d9dec22023-10-06 20:28:49 +000094} // namespace android::binder::os
Tomasz Wasilczykc7c22ea2023-11-30 20:13:44 -080095
Frederick Maylef7b65d12024-05-14 16:55:14 -070096LIBBINDER_EXPORTED int __android_log_print(int prio [[maybe_unused]], const char* tag,
97 const char* fmt, ...) {
Tomasz Wasilczykc7c22ea2023-11-30 20:13:44 -080098#ifdef TRUSTY_USERSPACE
99#define trusty_tlog _tlog
100#define trusty_vtlog _vtlog
101#else
102 // mapping taken from kernel trusty_log.h (TLOGx)
103 int kernelLogLevel;
104 if (prio <= ANDROID_LOG_DEBUG) {
105 kernelLogLevel = LK_DEBUGLEVEL_ALWAYS;
106 } else if (prio == ANDROID_LOG_INFO) {
107 kernelLogLevel = LK_DEBUGLEVEL_SPEW;
108 } else if (prio == ANDROID_LOG_WARN) {
109 kernelLogLevel = LK_DEBUGLEVEL_INFO;
110 } else if (prio == ANDROID_LOG_ERROR) {
111 kernelLogLevel = LK_DEBUGLEVEL_CRITICAL;
112 } else { /* prio >= ANDROID_LOG_FATAL */
113 kernelLogLevel = LK_DEBUGLEVEL_CRITICAL;
114 }
115#if LK_DEBUGLEVEL_NO_ALIASES
116 auto LK_DEBUGLEVEL_kernelLogLevel = kernelLogLevel;
117#endif
118
119#define trusty_tlog(...) _tlog(kernelLogLevel, __VA_ARGS__)
120#define trusty_vtlog(...) _vtlog(kernelLogLevel, __VA_ARGS__)
121#endif
122
123 va_list args;
124 va_start(args, fmt);
125 trusty_tlog((tag[0] == '\0') ? "libbinder" : "libbinder-");
126 trusty_vtlog(fmt, args);
127 va_end(args);
128
129 return 1;
130}