4 * Copyright (c) 2000 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
8 * Cherepanov Vitaliy <v.cherepanov@samsung.com>
9 * Nikita Kalyazin <n.kalyazin@samsung.com>
11 * Licensed under the Apache License, Version 2.0 (the "License");
12 * you may not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
15 * http://www.apache.org/licenses/LICENSE-2.0
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS,
19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
24 * - Samsung RnD Institute Russia
36 #include <linux/input.h>
39 NMSG_KEEP_ALIVE =0x0001,
43 NMSG_BINARY_INFO =0x0005,
44 NMSG_GET_TARGET_INFO =0x0007,
45 NMSG_SWAP_INST_ADD =0x0008,
46 NMSG_SWAP_INST_REMOVE =0x0009,
47 NMSG_GET_SCREENSHOT =0x0010,
49 NMSG_KEEP_ALIVE_ACK =0x1001,
50 NMSG_START_ACK =0x1002,
51 NMSG_STOP_ACK =0x1003,
52 NMSG_CONFIG_ACK =0x1004,
53 NMSG_BINARY_INFO_ACK =0x1005,
54 NMSG_SWAP_INST_ACK =0x1006,
55 NMSG_GET_TARGET_INFO_ACK =0x1007,
56 NMSG_SWAP_INST_ADD_ACK =0x1008,
57 NMSG_SWAP_INST_REMOVE_ACK =0x1009,
59 NMSG_PROCESS_INFO =0x0001, // target process info
60 NMSG_TERMINATE =0x0002, //terminate
61 NMSG_ERROR =0x0003, //error message
62 NMSG_SAMPLE =0x0004, //N 10ms
63 NMSG_SYSTEM =0x0005, //N 10~1000ms DaData, start sending immediately after start message from host, first system message time is tracing start time
64 NMSG_IMAGE =0x0006, //N irregular image
65 NMSG_RECORD =0x0007, //N irregular replay event
66 NMSG_FUNCTION_ENTRY =0x0008, //N irregular swap instrumentation, Instrumented functions by AppInst and LibInst
67 NMSG_FUNCTION_EXIT =0x0009, //N irregular swap instrumentation, Instrumented functions by AppInst and LibInst
68 NMSG_CONTEXT_SWITCH_ENTRY =0x0010, //N irregular swap instrumentation for kernel
69 NMSG_CONTEXT_SWITCH_EXIT =0x0011, //N irregular swap instrumentation for kernel
71 NMSG_PROBE =0x0100, //N irregular resource log
72 NMSG_PROBE_MEMORY =0x0101, //N irregular resource log
73 NMSG_PROBE_UICONTROL =0x0102, //N irregular resource log
74 NMSG_PROBE_UIEVENT =0x0103, //N irregular resource log
75 NMSG_PROBE_RESOURCE =0x0104, //N irregular resource log
76 NMSG_PROBE_LIFECYCLE =0x0105, //N irregular resource log
77 NMSG_PROBE_SCREENSHOT =0x0106, //N irregular resource log
78 NMSG_PROBE_SCENE =0x0107, //N irregular resource log
79 NMSG_PROBE_THREAD =0x0108, //N irregular resource log
80 NMSG_PROBE_CUSTOM =0x0109, //N irregular resource log
81 NMSG_PROBE_SYNC =0x0110 //N irregular resource log
85 #define MSG_MAX_NUM NMSG_SWAP_INST_REMOVE
89 ERR_LOCKFILE_CREATE_FAILED =-101, //lock file create failed
90 ERR_ALREADY_RUNNING =-102, //already running
91 ERR_INITIALIZE_SYSTEM_INFO_FAILED =-103, //initialize system info failed
92 ERR_HOST_SERVER_SOCKET_CREATE_FAILED =-104, //host server socket create failed
93 ERR_TARGET_SERVER_SOCKET_CREATE_FAILED =-105, //target server socket create failed
95 ERR_SIGNAL_MASK_SETTING_FAILED =-106, //TODO del (old parametr)
97 ERR_WRONG_MESSAGE_FORMAT =-201, //wrong message format
98 ERR_WRONG_MESSAGE_TYPE =-202, //wrong message type
99 ERR_WRONG_MESSAGE_DATA =-203, //wrong message data
100 ERR_CANNOT_START_PROFILING =-204, //cannot start profiling
101 ERR_SERV_SOCK_CREATE =-900, //server socket creation failed (written in /tmp/da.port file)
102 ERR_SERV_SOCK_BIND =-901, //server socket bind failed (written in /tmp/da.port file)
103 ERR_SERV_SOCK_LISTEN =-902, //server socket listen failed (written in /tmp/da.port file)
104 ERR_UNKNOWN =-999 //unknown error
108 FL_RESERVED1 = 0x00000001,
109 FL_RESERVED2 = 0x00000002,
110 FL_FUNCTION_PROFILING = 0x00000004, //On/Off the UserSpaceInst
111 FL_MEMORY_ALLCATION_PROBING = 0x00000008, //memory allocation API (glibc)
112 FL_FILE_API_PROBING = 0x00000010, //file API (glibc, OSP)
113 FL_THREAD_API_PROBING = 0x00000020, //thread API (glibc, OSP)
114 FL_OSP_UI_API_PROBING = 0x00000040, //UI API (OSP)
115 FL_SCREENSHOT = 0x00000080, //Screenshot
116 FL_USER_EVENT = 0x00000100, //events of Touch, Gesture, Orientation, Key
117 FL_RECORDING = 0x00000200, //recording the user event
118 FL_SYSTCALL_FILE = 0x00000400, //File operation syscalls tracing
119 FL_SYSTCALL_IPC = 0x00000800, //IPC syscall tracing
120 FL_SYSTCALL_PROCESS = 0x00001000, //Process syscalls tracing
121 FL_SYSTCALL_SIGNAL = 0x00002000, //Signal syscalls tracing
122 FL_SYSTCALL_NETWORK = 0x00004000, //Network syscalls tracing
123 FL_SYSTCALL_DESC = 0x00008000, //Descriptor syscalls tracing
124 FL_CONTEXT_SWITCH = 0x00010000, //Context switch tracing
125 FL_NETWORK_API_PROBING = 0x00020000, //network API (glibc, OSP, libsoap, openssl)
126 FL_OPENGL_API_PROBING = 0x00040000, //openGL API
127 FL_FUNCTION_SAMPLING = 0x00080000, //Function sampling
128 FL_CPU = 0x00100000, //CPU core load, frequency
129 FL_PROCESSES = 0x00200000, //Process load
130 FL_MEMORY = 0x00400000, //Process size(VSS, PSS. RSS), heap usage(application, library), physical memory in use
131 FL_DISK = 0x00800000,
132 FL_NETWORK = 0x01000000,
133 FL_DEVICE = 0x02000000,
134 FL_ENERGY = 0x04000000,
135 FL_RESERVED3 = 0x08000000,
137 FL_ALL_FEATURES = 0xFFFFFFFF &
143 #define IS_OPT_SET_IN(OPT, reg) (reg & (OPT))
144 #define IS_OPT_SET(OPT) IS_OPT_SET_IN((OPT), prof_session.conf.use_features0)
151 enum supported_device {
155 static const char *supported_devices_strings[] = {
159 #define array_size(x) (sizeof(x)/sizeof((x)[0]))
160 enum { supported_devices_count = array_size(supported_devices_strings) };
162 #define MAX_FILENAME 128
164 #define MSG_DATA_HDR_LEN 20
174 #define MSG_CMD_HDR_LEN 8
191 uint64_t use_features0;
192 uint64_t use_features1;
193 uint32_t system_trace_period;
194 uint32_t data_message_period;
197 typedef uint32_t log_interval_t;
202 APP_TYPE_RUNNING = 2,
214 struct us_func_inst_plane_t {
216 //name | type | len | info
217 //------------------------------------------
218 //func_addr | uint64 | 8 |
219 //args | string | len(args) |end with '\0'
220 //ret_type | char | 1 |
225 struct us_lib_inst_t {
229 struct user_space_inst_t {
231 struct app_list_t *app_inst_list;
233 struct lib_list_t *lib_inst_list;
237 struct replay_event_t {
239 struct input_event ev;
242 struct replay_event_seq_t {
246 struct replay_event_t *events;
249 struct prof_session_t {
251 struct user_space_inst_t user_space_inst;
252 struct replay_event_seq_t replay_event_seq;
253 unsigned running_status:1; // to stop properly (1 - it is running, 0 - no)
256 int parseHostMessage(struct msg_t *log, char *msg);
257 int host_message_handler(struct msg_t *msg);
259 char *msg_ID_str(enum HostMessageT ID);
262 #include <sys/stat.h>
267 struct thread_info_t {
272 struct process_info_t {
277 struct system_info_t {
280 float *cpu_frequency;
282 uint32_t count_of_threads;
283 struct thread_info_t *thread_load;
286 uint32_t count_of_processes;
287 struct process_info_t *process_load;
290 uint32_t virtual_memory;
291 uint32_t resident_memory;
292 uint32_t shared_memory;
294 uint32_t total_alloc_size;
295 uint64_t system_memory_total;
296 uint64_t system_memory_used;
299 uint32_t total_used_drive;
301 uint32_t disk_sectors_read;
302 uint32_t disk_writes;
303 uint32_t disk_sectors_write;
306 uint32_t network_send_size;
307 uint32_t network_receive_size;
310 uint32_t wifi_status;
313 uint32_t brightness_status;
314 uint32_t camera_status;
315 uint32_t sound_status;
316 uint32_t audio_status;
317 uint32_t vibration_status;
318 uint32_t voltage_status;
319 uint32_t rssi_status;
320 uint32_t video_status;
321 uint32_t call_status;
322 uint32_t dnet_status;
326 uint32_t energy_per_device[supported_devices_count];
327 uint32_t app_energy_per_device[supported_devices_count];
330 struct recorded_event_t {
336 #define static_assert(cond) \
337 char __attribute__((unused)) __static_assert[(cond) ? 1 : -1];
339 #define pack_int64(to, n) do { \
340 static_assert(sizeof(n) == 8); \
341 *(uint64_t *)to = n; \
342 to += sizeof(uint64_t); \
345 #define pack_int32(to, n) do { \
346 static_assert(sizeof(n) == 4); \
347 *(uint32_t *)to = n; \
348 to += sizeof(uint32_t); \
351 #define pack_time(to, n) \
353 pack_int32(to, n.tv_sec); \
354 pack_int32(to, n.tv_usec); \
357 #define pack_float(to, n) \
360 to += sizeof(float); \
363 #define pack_str(to, n) \
365 memcpy(to, n, strlen(n) + 1); \
366 to += strlen(n) + 1; \
369 static inline void* pack_str_array(void *buffer, const char **strings,
373 for (index = 0; index != count; ++index)
374 pack_str(buffer, strings[index]);
378 struct msg_data_t *pack_system_info(struct system_info_t *sys_info);
379 int write_to_buf(struct msg_data_t *msg);
380 void free_msg_data(struct msg_data_t *msg);
381 void free_msg_payload(struct msg_t *msg);
382 void free_sys_info(struct system_info_t *sys_info);
383 int start_replay(void);
384 void stop_replay(void);
386 enum ErrorCode stop_all(void);
387 enum ErrorCode stop_all_no_lock(void);
388 int stop_all_in_process(void);
389 void stop_all_done(void);
391 void reset_msg(struct msg_t *msg);
392 void reset_replay_event_seq(struct replay_event_seq_t *res);
393 void reset_system_info(struct system_info_t *sys);
394 int check_running_status(struct prof_session_t *prof_session);
396 extern struct prof_session_t prof_session;
399 void print_replay_event(struct replay_event_t *ev, uint32_t num, char *tab);
401 int sendACKToHost(enum HostMessageT resp, enum ErrorCode err_code,
402 char *payload, int payload_size);
404 int parse_int8(struct msg_buf_t *msg, uint8_t *val);
405 int parse_int32(struct msg_buf_t *msg, uint32_t *val);
406 int parse_int64(struct msg_buf_t *msg, uint64_t *val);
407 int parse_string(struct msg_buf_t *msg, char **str);
408 int parse_string_no_alloc(struct msg_buf_t *msg, char *str);
409 int parse_replay_event_seq(struct msg_buf_t *msg, struct replay_event_seq_t *res);
411 void init_prof_session(struct prof_session_t *prof_session);
412 #endif /* _DA_PROTOCOL_ */