xref: /aosp_15_r20/trusty/kernel/app/busytest/busytest.c (revision 344aa361028b423587d4ef3fa52a23d194628137)
1*344aa361SAndroid Build Coastguard Worker /*
2*344aa361SAndroid Build Coastguard Worker  * Copyright (c) 2019, Google Inc. All rights reserved
3*344aa361SAndroid Build Coastguard Worker  *
4*344aa361SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining
5*344aa361SAndroid Build Coastguard Worker  * a copy of this software and associated documentation files
6*344aa361SAndroid Build Coastguard Worker  * (the "Software"), to deal in the Software without restriction,
7*344aa361SAndroid Build Coastguard Worker  * including without limitation the rights to use, copy, modify, merge,
8*344aa361SAndroid Build Coastguard Worker  * publish, distribute, sublicense, and/or sell copies of the Software,
9*344aa361SAndroid Build Coastguard Worker  * and to permit persons to whom the Software is furnished to do so,
10*344aa361SAndroid Build Coastguard Worker  * subject to the following conditions:
11*344aa361SAndroid Build Coastguard Worker  *
12*344aa361SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be
13*344aa361SAndroid Build Coastguard Worker  * included in all copies or substantial portions of the Software.
14*344aa361SAndroid Build Coastguard Worker  *
15*344aa361SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16*344aa361SAndroid Build Coastguard Worker  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17*344aa361SAndroid Build Coastguard Worker  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18*344aa361SAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19*344aa361SAndroid Build Coastguard Worker  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20*344aa361SAndroid Build Coastguard Worker  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21*344aa361SAndroid Build Coastguard Worker  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22*344aa361SAndroid Build Coastguard Worker  */
23*344aa361SAndroid Build Coastguard Worker 
24*344aa361SAndroid Build Coastguard Worker #include <err.h>
25*344aa361SAndroid Build Coastguard Worker #include <kernel/event.h>
26*344aa361SAndroid Build Coastguard Worker #include <kernel/thread.h>
27*344aa361SAndroid Build Coastguard Worker #include <lib/trusty/ipc.h>
28*344aa361SAndroid Build Coastguard Worker #include <lk/init.h>
29*344aa361SAndroid Build Coastguard Worker #include <lk/trace.h>
30*344aa361SAndroid Build Coastguard Worker #include <stdbool.h>
31*344aa361SAndroid Build Coastguard Worker #include <stdio.h>
32*344aa361SAndroid Build Coastguard Worker 
33*344aa361SAndroid Build Coastguard Worker #define LOCAL_TRACE (0)
34*344aa361SAndroid Build Coastguard Worker 
35*344aa361SAndroid Build Coastguard Worker static struct event busy_test_event =
36*344aa361SAndroid Build Coastguard Worker         EVENT_INITIAL_VALUE(busy_test_event, false, 0);
37*344aa361SAndroid Build Coastguard Worker 
busy_test_connected(struct handle * chandle)38*344aa361SAndroid Build Coastguard Worker static void busy_test_connected(struct handle* chandle) {
39*344aa361SAndroid Build Coastguard Worker     int ret;
40*344aa361SAndroid Build Coastguard Worker     uint32_t event;
41*344aa361SAndroid Build Coastguard Worker 
42*344aa361SAndroid Build Coastguard Worker     LTRACEF("event wait count: %d\n", busy_test_event.wait.count);
43*344aa361SAndroid Build Coastguard Worker 
44*344aa361SAndroid Build Coastguard Worker     ret = event_signal(&busy_test_event, true);
45*344aa361SAndroid Build Coastguard Worker     if (ret) {
46*344aa361SAndroid Build Coastguard Worker         TRACEF("event_signal failed %d\n", ret);
47*344aa361SAndroid Build Coastguard Worker         goto err;
48*344aa361SAndroid Build Coastguard Worker     }
49*344aa361SAndroid Build Coastguard Worker     ret = handle_wait(chandle, &event, INFINITE_TIME);
50*344aa361SAndroid Build Coastguard Worker     LTRACEF("got channel event (ret=%d): ev=%x\n", ret, event);
51*344aa361SAndroid Build Coastguard Worker 
52*344aa361SAndroid Build Coastguard Worker err:
53*344aa361SAndroid Build Coastguard Worker     ret = event_unsignal(&busy_test_event);
54*344aa361SAndroid Build Coastguard Worker     if (ret) {
55*344aa361SAndroid Build Coastguard Worker         TRACEF("event_unsignal failed %d\n", ret);
56*344aa361SAndroid Build Coastguard Worker     }
57*344aa361SAndroid Build Coastguard Worker     handle_close(chandle);
58*344aa361SAndroid Build Coastguard Worker }
59*344aa361SAndroid Build Coastguard Worker 
busy_test_server(void * arg)60*344aa361SAndroid Build Coastguard Worker static int busy_test_server(void* arg) {
61*344aa361SAndroid Build Coastguard Worker     struct handle* phandle = arg;
62*344aa361SAndroid Build Coastguard Worker     struct handle* chandle;
63*344aa361SAndroid Build Coastguard Worker     const uuid_t* unused_uuid_p;
64*344aa361SAndroid Build Coastguard Worker     uint32_t event;
65*344aa361SAndroid Build Coastguard Worker     int ret;
66*344aa361SAndroid Build Coastguard Worker 
67*344aa361SAndroid Build Coastguard Worker     while (true) {
68*344aa361SAndroid Build Coastguard Worker         ret = handle_wait(phandle, &event, INFINITE_TIME);
69*344aa361SAndroid Build Coastguard Worker         if (ret < 0) {
70*344aa361SAndroid Build Coastguard Worker             TRACEF("handle_wait failed: %d\n", ret);
71*344aa361SAndroid Build Coastguard Worker             break;
72*344aa361SAndroid Build Coastguard Worker         }
73*344aa361SAndroid Build Coastguard Worker         LTRACEF("got port event (ret=%d): ev=%x\n", ret, event);
74*344aa361SAndroid Build Coastguard Worker         if (event & IPC_HANDLE_POLL_READY) {
75*344aa361SAndroid Build Coastguard Worker             /* get connection request */
76*344aa361SAndroid Build Coastguard Worker             ret = ipc_port_accept(phandle, &chandle, &unused_uuid_p);
77*344aa361SAndroid Build Coastguard Worker             LTRACEF("accept returned %d\n", ret);
78*344aa361SAndroid Build Coastguard Worker             if (ret >= 0) {
79*344aa361SAndroid Build Coastguard Worker                 busy_test_connected(chandle);
80*344aa361SAndroid Build Coastguard Worker             }
81*344aa361SAndroid Build Coastguard Worker         }
82*344aa361SAndroid Build Coastguard Worker     }
83*344aa361SAndroid Build Coastguard Worker     return 0;
84*344aa361SAndroid Build Coastguard Worker }
85*344aa361SAndroid Build Coastguard Worker 
busy_test_init(uint level)86*344aa361SAndroid Build Coastguard Worker static void busy_test_init(uint level) {
87*344aa361SAndroid Build Coastguard Worker     int ret;
88*344aa361SAndroid Build Coastguard Worker     thread_t* thread;
89*344aa361SAndroid Build Coastguard Worker     struct handle* phandle;
90*344aa361SAndroid Build Coastguard Worker 
91*344aa361SAndroid Build Coastguard Worker     ret = ipc_port_create(&kernel_uuid, "com.android.kernel.busy-test", 1, 1,
92*344aa361SAndroid Build Coastguard Worker                           IPC_PORT_ALLOW_NS_CONNECT, &phandle);
93*344aa361SAndroid Build Coastguard Worker     if (ret) {
94*344aa361SAndroid Build Coastguard Worker         goto err_port_create;
95*344aa361SAndroid Build Coastguard Worker     }
96*344aa361SAndroid Build Coastguard Worker 
97*344aa361SAndroid Build Coastguard Worker     ret = ipc_port_publish(phandle);
98*344aa361SAndroid Build Coastguard Worker     if (ret) {
99*344aa361SAndroid Build Coastguard Worker         goto err_port_publish;
100*344aa361SAndroid Build Coastguard Worker     }
101*344aa361SAndroid Build Coastguard Worker 
102*344aa361SAndroid Build Coastguard Worker     thread = thread_create("busy-test-server", busy_test_server, phandle,
103*344aa361SAndroid Build Coastguard Worker                            DEFAULT_PRIORITY, DEFAULT_STACK_SIZE);
104*344aa361SAndroid Build Coastguard Worker     if (!thread) {
105*344aa361SAndroid Build Coastguard Worker         ret = ERR_NO_MEMORY;
106*344aa361SAndroid Build Coastguard Worker         goto err_thread_create;
107*344aa361SAndroid Build Coastguard Worker     }
108*344aa361SAndroid Build Coastguard Worker     thread_resume(thread);
109*344aa361SAndroid Build Coastguard Worker     return;
110*344aa361SAndroid Build Coastguard Worker 
111*344aa361SAndroid Build Coastguard Worker err_thread_create:
112*344aa361SAndroid Build Coastguard Worker     handle_close(phandle);
113*344aa361SAndroid Build Coastguard Worker err_port_publish:
114*344aa361SAndroid Build Coastguard Worker     handle_close(phandle);
115*344aa361SAndroid Build Coastguard Worker err_port_create:
116*344aa361SAndroid Build Coastguard Worker     TRACEF("Failed to add busy_test: %d\n", ret);
117*344aa361SAndroid Build Coastguard Worker     return;
118*344aa361SAndroid Build Coastguard Worker }
119*344aa361SAndroid Build Coastguard Worker 
120*344aa361SAndroid Build Coastguard Worker LK_INIT_HOOK(busy_test_init, busy_test_init, LK_INIT_LEVEL_APPS);
121*344aa361SAndroid Build Coastguard Worker 
busy_test_busy_func(void * arg)122*344aa361SAndroid Build Coastguard Worker static int busy_test_busy_func(void* arg) {
123*344aa361SAndroid Build Coastguard Worker     LTRACEF("cpu %d ready\n", arch_curr_cpu_num());
124*344aa361SAndroid Build Coastguard Worker     while (true) {
125*344aa361SAndroid Build Coastguard Worker         event_wait(&busy_test_event);
126*344aa361SAndroid Build Coastguard Worker     }
127*344aa361SAndroid Build Coastguard Worker     return 0;
128*344aa361SAndroid Build Coastguard Worker }
129*344aa361SAndroid Build Coastguard Worker 
busy_test_cpu_init(uint level)130*344aa361SAndroid Build Coastguard Worker static void busy_test_cpu_init(uint level) {
131*344aa361SAndroid Build Coastguard Worker     thread_t* thread;
132*344aa361SAndroid Build Coastguard Worker     char thread_name[32];
133*344aa361SAndroid Build Coastguard Worker     uint cpu = arch_curr_cpu_num();
134*344aa361SAndroid Build Coastguard Worker     snprintf(thread_name, sizeof(thread_name), "busy-test-%d", cpu);
135*344aa361SAndroid Build Coastguard Worker     thread = thread_create(thread_name, busy_test_busy_func, NULL, LOW_PRIORITY,
136*344aa361SAndroid Build Coastguard Worker                            DEFAULT_STACK_SIZE);
137*344aa361SAndroid Build Coastguard Worker #if WITH_SMP
138*344aa361SAndroid Build Coastguard Worker     thread->pinned_cpu = cpu;
139*344aa361SAndroid Build Coastguard Worker #endif
140*344aa361SAndroid Build Coastguard Worker     thread_resume(thread);
141*344aa361SAndroid Build Coastguard Worker }
142*344aa361SAndroid Build Coastguard Worker 
143*344aa361SAndroid Build Coastguard Worker LK_INIT_HOOK_FLAGS(busy_test_cpu_init,
144*344aa361SAndroid Build Coastguard Worker                    busy_test_cpu_init,
145*344aa361SAndroid Build Coastguard Worker                    LK_INIT_LEVEL_APPS,
146*344aa361SAndroid Build Coastguard Worker                    LK_INIT_FLAG_ALL_CPUS);
147