1 /*
2 * Copyright (c) 2019 Intel corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include <string.h>
8 #include <zephyr/sys/cbprintf.h>
9 #include <tracing_buffer.h>
10 #include <tracing_format_common.h>
11
str_put(int c,void * ctx)12 static int str_put(int c, void *ctx)
13 {
14 tracing_ctx_t *str_ctx = (tracing_ctx_t *)ctx;
15
16 if (str_ctx->status == 0) {
17 uint8_t *buf;
18 uint32_t claimed_size;
19
20 claimed_size = tracing_buffer_put_claim(&buf, 1);
21 if (claimed_size) {
22 *buf = (uint8_t)c;
23 str_ctx->length++;
24 } else {
25 str_ctx->status = -1;
26 }
27 }
28
29 return 0;
30 }
31
tracing_format_string_put(const char * str,va_list args)32 bool tracing_format_string_put(const char *str, va_list args)
33 {
34 tracing_ctx_t str_ctx = {0};
35
36 (void)cbvprintf(str_put, (void *)&str_ctx, str, args);
37
38 if (str_ctx.status == 0) {
39 tracing_buffer_put_finish(str_ctx.length);
40 return true;
41 }
42
43 tracing_buffer_put_finish(0);
44 return false;
45 }
46
tracing_format_raw_data_put(uint8_t * data,uint32_t size)47 bool tracing_format_raw_data_put(uint8_t *data, uint32_t size)
48 {
49 uint32_t space = tracing_buffer_space_get();
50
51 if (space >= size) {
52 tracing_buffer_put(data, size);
53 return true;
54 }
55
56 return false;
57 }
58
tracing_format_data_put(tracing_data_t * tracing_data_array,uint32_t count)59 bool tracing_format_data_put(tracing_data_t *tracing_data_array, uint32_t count)
60 {
61 uint32_t total_size = 0U;
62
63 for (uint32_t i = 0; i < count; i++) {
64 tracing_data_t *tracing_data =
65 tracing_data_array + i;
66 uint8_t *data = tracing_data->data, *buf;
67 uint32_t length = tracing_data->length, claimed_size;
68
69 do {
70 claimed_size = tracing_buffer_put_claim(&buf, length);
71 memcpy(buf, data, claimed_size);
72 total_size += claimed_size;
73 length -= claimed_size;
74 data += claimed_size;
75 } while (length && claimed_size);
76
77 if (length && claimed_size == 0) {
78 tracing_buffer_put_finish(0);
79 return false;
80 }
81 }
82
83 tracing_buffer_put_finish(total_size);
84 return true;
85 }
86