zephyr/subsys/tracing/tracing_format_common.c

89 lines
1.8 KiB
C

/*
* Copyright (c) 2019 Intel corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <string.h>
#include <tracing_buffer.h>
#include <tracing_format_common.h>
static int str_put(int c, void *ctx)
{
tracing_ctx_t *str_ctx = (tracing_ctx_t *)ctx;
if (str_ctx->status == 0) {
uint8_t *buf;
uint32_t claimed_size;
claimed_size = tracing_buffer_put_claim(&buf, 1);
if (claimed_size) {
*buf = (uint8_t)c;
str_ctx->length++;
} else {
str_ctx->status = -1;
}
}
return 0;
}
bool tracing_format_string_put(const char *str, va_list args)
{
tracing_ctx_t str_ctx = {0};
#if !defined(CONFIG_NEWLIB_LIBC) && !defined(CONFIG_ARCH_POSIX)
(void)z_prf(str_put, (void *)&str_ctx, (char *)str, args);
#else
z_vprintk(str_put, (void *)&str_ctx, str, args);
#endif
if (str_ctx.status == 0) {
tracing_buffer_put_finish(str_ctx.length);
return true;
}
tracing_buffer_put_finish(0);
return false;
}
bool tracing_format_raw_data_put(uint8_t *data, uint32_t size)
{
uint32_t space = tracing_buffer_space_get();
if (space >= size) {
tracing_buffer_put(data, size);
return true;
}
return false;
}
bool tracing_format_data_put(tracing_data_t *tracing_data_array, uint32_t count)
{
uint32_t total_size = 0U;
for (uint32_t i = 0; i < count; i++) {
tracing_data_t *tracing_data =
tracing_data_array + i;
uint8_t *data = tracing_data->data, *buf;
uint32_t length = tracing_data->length, claimed_size;
do {
claimed_size = tracing_buffer_put_claim(&buf, length);
memcpy(buf, data, claimed_size);
total_size += claimed_size;
length -= claimed_size;
data += claimed_size;
} while (length && claimed_size);
if (length && claimed_size == 0) {
tracing_buffer_put_finish(0);
return false;
}
}
tracing_buffer_put_finish(total_size);
return true;
}