blob: 64864a865e6d98a5547d35eefff8866556739ea9 [file] [log] [blame]
Igor Opaniukab88c952017-02-14 13:22:54 +02001/*
2 * Copyright (c) 2016, Linaro Limited
Etienne Carrieredfad7d22019-03-05 08:45:21 +01003 * SPDX-License-Identifier: BSD-2-Clause
Igor Opaniukab88c952017-02-14 13:22:54 +02004 */
Igor Opaniuk55fcc4a2018-02-06 19:20:22 +02005#include <fcntl.h>
Igor Opaniukab88c952017-02-14 13:22:54 +02006#include <libgen.h>
7#include <linux/limits.h>
8#include <math.h>
9#include <stdlib.h>
10#include <stdio.h>
11#include <string.h>
Igor Opaniuk55fcc4a2018-02-06 19:20:22 +020012#include <sys/mman.h>
13#include <sys/stat.h>
Igor Opaniukab88c952017-02-14 13:22:54 +020014#include <unistd.h>
15
16#include "benchmark_aux.h"
Igor Opaniukf1f3fd02017-09-14 15:34:56 +030017#include "common.h"
Igor Opaniukab88c952017-02-14 13:22:54 +020018
19/* Misc auxilary functions */
20void tee_errx(const char *msg, TEEC_Result res)
21{
Igor Opaniukf1f3fd02017-09-14 15:34:56 +030022 ERROR_EXIT("%s: 0x%08x\n", msg, res);
Igor Opaniukab88c952017-02-14 13:22:54 +020023}
24
25void tee_check_res(TEEC_Result res, const char *errmsg)
26{
27 if (res != TEEC_SUCCESS)
28 tee_errx(errmsg, res);
29}
30
31const char *bench_str_src(uint64_t source)
32{
33 switch (source) {
34 case TEE_BENCH_CORE:
Igor Opaniukf1f3fd02017-09-14 15:34:56 +030035 return "core";
Igor Opaniukab88c952017-02-14 13:22:54 +020036 case TEE_BENCH_KMOD:
Igor Opaniukf1f3fd02017-09-14 15:34:56 +030037 return "kmodule";
Igor Opaniukab88c952017-02-14 13:22:54 +020038 case TEE_BENCH_CLIENT:
Igor Opaniukf1f3fd02017-09-14 15:34:56 +030039 return "libteec";
Igor Opaniukab88c952017-02-14 13:22:54 +020040 case TEE_BENCH_UTEE:
Igor Opaniukf1f3fd02017-09-14 15:34:56 +030041 return "libutee";
Igor Opaniukab88c952017-02-14 13:22:54 +020042 default:
Igor Opaniukf1f3fd02017-09-14 15:34:56 +030043 return "-";
Igor Opaniukab88c952017-02-14 13:22:54 +020044 }
45}
46
47void print_line(void)
48{
49 int n = 115;
50
51 while (n-- > 0)
52 printf("=");
53 printf("\n");
54}
55
56void alloc_argv(int argc, char *argv[], char **new_argv[])
57{
58 char *res, *base;
59 char path[PATH_MAX];
60 char **testapp_argv;
l00176142d1cfd652017-11-23 00:52:28 +080061 int i;
Igor Opaniukab88c952017-02-14 13:22:54 +020062
63 res = realpath(argv[1], path);
64 if (!res)
65 _exit(EXIT_FAILURE);
66
67 *new_argv = malloc(argc * sizeof(void *));
68 if (!(*new_argv))
69 _exit(EXIT_FAILURE);
70
71 testapp_argv = *new_argv;
72 testapp_argv[argc-1] = NULL;
73 base = basename(path);
74
75 testapp_argv[0] = malloc(strlen(base) + 1);
76 if (!testapp_argv[0])
77 _exit(EXIT_FAILURE);
78
79 memcpy(testapp_argv[0], base, strlen(base) + 1);
80
l00176142d1cfd652017-11-23 00:52:28 +080081 for (i = 2; i < argc; i++) {
Igor Opaniukab88c952017-02-14 13:22:54 +020082 size_t length = strlen(argv[i]) + 1;
83
84 testapp_argv[i - 1] = malloc(length);
85 if (!testapp_argv[i - 1])
86 _exit(EXIT_FAILURE);
87
88 memcpy(testapp_argv[i-1], argv[i], length);
89 }
90}
91
92void dealloc_argv(int new_argc, char **new_argv)
93{
l00176142d1cfd652017-11-23 00:52:28 +080094 int i;
95 for (i = 0; i < new_argc; ++i)
Igor Opaniukab88c952017-02-14 13:22:54 +020096 free(new_argv[i]);
97
98 free(new_argv);
99}
100
101uint32_t get_cores(void)
102{
103 return sysconf(_SC_NPROCESSORS_ONLN);
104}
Igor Opaniuk55fcc4a2018-02-06 19:20:22 +0200105
106void *mmap_paddr(intptr_t paddr, uint64_t size)
107{
108 int devmem;
109 off_t offset = 0;
110 off_t page_addr;
111 intptr_t *hw_addr = (intptr_t *)paddr;
112
113 devmem = open("/dev/mem", O_RDWR);
114 if (!devmem)
115 return NULL;
116
Igor Opaniuk845a7832018-06-06 14:06:10 +0300117 offset = (off_t)(uintptr_t)hw_addr % getpagesize();
118 page_addr = (off_t)(uintptr_t)(hw_addr - offset);
Igor Opaniuk55fcc4a2018-02-06 19:20:22 +0200119
120 hw_addr = (intptr_t *)mmap(0, size, PROT_READ|PROT_WRITE,
121 MAP_SHARED, devmem, page_addr);
122 if (hw_addr == MAP_FAILED) {
123 close(devmem);
124 return NULL;
125 }
126
127 close(devmem);
128 return (hw_addr + offset);
129}
Igor Opaniuk3d566ae2018-01-29 02:41:33 +0200130
131size_t get_library_load_offset(pid_t pid, const char *libname)
132{
133 char path[256];
134 char buf[256];
135 FILE *file;
136 size_t addr = 0;
137 size_t start, end, offset;
138 char flags[4];
139 int len;
140 int len_libname = strlen(libname);
141
142 snprintf(path, sizeof(path), "/proc/%d/smaps", pid);
143
144 file = fopen(path, "rt");
145 if (file == NULL)
146 return 0;
147
148 while (fgets(buf, sizeof(buf), file) != NULL) {
149 len = strlen(buf);
150 if (len > 0 && buf[len-1] == '\n')
151 buf[--len] = '\0';
152
153 if (len <= len_libname || !strstr(buf, libname))
154 continue;
155
Igor Opaniuk3d566ae2018-01-29 02:41:33 +0200156 if (sscanf(buf, "%zx-%zx %c%c%c%c %zx", &start, &end,
157 &flags[0], &flags[1],
158 &flags[2], &flags[3], &offset) != 7)
159 continue;
160
161 if (flags[0] != 'r' || flags[2] != 'x')
162 continue;
163
164 addr = start - offset;
165 break;
166 }
167
168 fclose(file);
169
170 return addr;
171}
172