From 5cf49956e780d1a8bf5e6a0117a2a240f0ed85d8 Mon Sep 17 00:00:00 2001 From: Anas Nashif Date: Sun, 3 Mar 2019 20:16:08 -0500 Subject: [PATCH] logging: add backend for xtensa simulator Add backend for the xtensa simulator. Fixes #10164 Signed-off-by: Anas Nashif --- samples/subsys/logging/logger/sample.yaml | 2 +- .../sample_controller/Kconfig.defconfig | 3 + subsys/logging/CMakeLists.txt | 5 + subsys/logging/Kconfig | 19 ++- subsys/logging/log_backend_xtensa_sim.c | 128 ++++++++++++++++++ 5 files changed, 154 insertions(+), 3 deletions(-) create mode 100644 subsys/logging/log_backend_xtensa_sim.c diff --git a/samples/subsys/logging/logger/sample.yaml b/samples/subsys/logging/logger/sample.yaml index 27b0154866f..42923d82142 100644 --- a/samples/subsys/logging/logger/sample.yaml +++ b/samples/subsys/logging/logger/sample.yaml @@ -5,7 +5,7 @@ sample: tests: samples.logger: tags: logging - platform_exclude: qemu_xtensa qemu_x86_64 + platform_exclude: qemu_x86_64 harness: console harness_config: type: one_line diff --git a/soc/xtensa/sample_controller/Kconfig.defconfig b/soc/xtensa/sample_controller/Kconfig.defconfig index e0a5b6328a6..511fc2eef4b 100644 --- a/soc/xtensa/sample_controller/Kconfig.defconfig +++ b/soc/xtensa/sample_controller/Kconfig.defconfig @@ -16,4 +16,7 @@ config IRQ_OFFLOAD_INTNUM config XTENSA_ASM2 default y +config LOG_BACKEND_XTENSA_SIM + default LOG + endif diff --git a/subsys/logging/CMakeLists.txt b/subsys/logging/CMakeLists.txt index 552290ff55c..03dff816ec6 100644 --- a/subsys/logging/CMakeLists.txt +++ b/subsys/logging/CMakeLists.txt @@ -24,6 +24,11 @@ zephyr_sources_ifdef( log_backend_native_posix.c ) +zephyr_sources_ifdef( + CONFIG_LOG_BACKEND_XTENSA_SIM + log_backend_xtensa_sim.c + ) + zephyr_sources_ifdef( CONFIG_LOG_BACKEND_NET log_backend_net.c diff --git a/subsys/logging/Kconfig b/subsys/logging/Kconfig index c26620b3082..1e44f6c5138 100644 --- a/subsys/logging/Kconfig +++ b/subsys/logging/Kconfig @@ -438,6 +438,21 @@ config LOG_BACKEND_NATIVE_POSIX help Enable backend in native_posix +config LOG_BACKEND_XTENSA_SIM + bool "Enable xtensa simulator backend" + depends on SOC_XTENSA_SAMPLE_CONTROLLER + help + Enable backend in xtensa simulator + +if LOG_BACKEND_XTENSA_SIM +config LOG_BACKEND_XTENSA_OUTPUT_BUFFER_SIZE + int "Size of the output buffer" + default 16 + help + Buffer is used by log_output module for preparing output data (e.g. + string formatting). +endif + config LOG_BACKEND_NET bool "Enable networking backend" depends on NETWORKING @@ -488,7 +503,7 @@ endif # LOG_BACKEND_NET config LOG_BACKEND_SHOW_COLOR bool "Enable colors in the backend" depends on LOG_BACKEND_UART || LOG_BACKEND_NATIVE_POSIX || LOG_BACKEND_RTT \ - || LOG_BACKEND_SWO + || LOG_BACKEND_SWO || LOG_BACKEND_XTENSA_SIM default y help When enabled selected backend prints errors in red and warning in yellow. @@ -496,7 +511,7 @@ config LOG_BACKEND_SHOW_COLOR config LOG_BACKEND_FORMAT_TIMESTAMP bool "Enable timestamp formatting in the backend" depends on LOG_BACKEND_UART || LOG_BACKEND_NATIVE_POSIX || LOG_BACKEND_RTT \ - || LOG_BACKEND_SWO + || LOG_BACKEND_SWO || LOG_BACKEND_XTENSA_SIM default y help When enabled timestamp is formatted to hh:mm:ss:ms,us. diff --git a/subsys/logging/log_backend_xtensa_sim.c b/subsys/logging/log_backend_xtensa_sim.c new file mode 100644 index 00000000000..96a9700ec26 --- /dev/null +++ b/subsys/logging/log_backend_xtensa_sim.c @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2019 Intel Corporation Inc. + * Copyright (c) 2018 Nordic Semiconductor ASA + * Copyright (c) 2018 Intel Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#include +#include +#include + +#define CHAR_BUF_SIZE CONFIG_LOG_BACKEND_XTENSA_OUTPUT_BUFFER_SIZE + +static u8_t buf[CHAR_BUF_SIZE]; + +static int char_out(u8_t *data, size_t length, void *ctx) +{ + register int a1 __asm__ ("a2") = SYS_write; + register int b1 __asm__ ("a3") = 1; + register int c1 __asm__ ("a4") = (int) data; + register int d1 __asm__ ("a5") = length; + register int ret_val __asm__ ("a2"); + register int ret_err __asm__ ("a3"); + + __asm__ __volatile__ ( + "simcall\n" + "mov %0, a2\n" + "mov %1, a3\n" + : "=a" (ret_val), "=a" (ret_err), "+r"(a1), "+r"(b1) + : "r"(c1), "r"(d1) + : "memory"); + return length; +} + +LOG_OUTPUT_DEFINE(log_output, char_out, buf, sizeof(buf)); + +static void put(const struct log_backend *const backend, + struct log_msg *msg) +{ + log_msg_get(msg); + + u32_t flags = LOG_OUTPUT_FLAG_LEVEL | LOG_OUTPUT_FLAG_TIMESTAMP; + + if (IS_ENABLED(CONFIG_LOG_BACKEND_SHOW_COLOR)) { + flags |= LOG_OUTPUT_FLAG_COLORS; + } + + if (IS_ENABLED(CONFIG_LOG_BACKEND_FORMAT_TIMESTAMP)) { + flags |= LOG_OUTPUT_FLAG_FORMAT_TIMESTAMP; + } + + log_output_msg_process(&log_output, msg, flags); + + log_msg_put(msg); + +} + +static void panic(struct log_backend const *const backend) +{ + log_output_flush(&log_output); +} + +static void dropped(const struct log_backend *const backend, u32_t cnt) +{ + ARG_UNUSED(backend); + + log_output_dropped_process(&log_output, cnt); +} + +static void sync_string(const struct log_backend *const backend, + struct log_msg_ids src_level, u32_t timestamp, + const char *fmt, va_list ap) +{ + u32_t flags = LOG_OUTPUT_FLAG_LEVEL | LOG_OUTPUT_FLAG_TIMESTAMP; + u32_t key; + + if (IS_ENABLED(CONFIG_LOG_BACKEND_SHOW_COLOR)) { + flags |= LOG_OUTPUT_FLAG_COLORS; + } + + if (IS_ENABLED(CONFIG_LOG_BACKEND_FORMAT_TIMESTAMP)) { + flags |= LOG_OUTPUT_FLAG_FORMAT_TIMESTAMP; + } + + key = irq_lock(); + log_output_string(&log_output, src_level, timestamp, fmt, ap, flags); + irq_unlock(key); +} + +static void sync_hexdump(const struct log_backend *const backend, + struct log_msg_ids src_level, u32_t timestamp, + const char *metadata, const u8_t *data, u32_t length) +{ + u32_t flags = LOG_OUTPUT_FLAG_LEVEL | LOG_OUTPUT_FLAG_TIMESTAMP; + u32_t key; + + if (IS_ENABLED(CONFIG_LOG_BACKEND_SHOW_COLOR)) { + flags |= LOG_OUTPUT_FLAG_COLORS; + } + + if (IS_ENABLED(CONFIG_LOG_BACKEND_FORMAT_TIMESTAMP)) { + flags |= LOG_OUTPUT_FLAG_FORMAT_TIMESTAMP; + } + + key = irq_lock(); + log_output_hexdump(&log_output, src_level, timestamp, + metadata, data, length, flags); + irq_unlock(key); +} + +const struct log_backend_api log_backend_xtensa_sim_api = { + .put = IS_ENABLED(CONFIG_LOG_IMMEDIATE) ? NULL : put, + .put_sync_string = IS_ENABLED(CONFIG_LOG_IMMEDIATE) ? + sync_string : NULL, + .put_sync_hexdump = IS_ENABLED(CONFIG_LOG_IMMEDIATE) ? + sync_hexdump : NULL, + .panic = panic, + .dropped = IS_ENABLED(CONFIG_LOG_IMMEDIATE) ? NULL : dropped, +}; + +LOG_BACKEND_DEFINE(log_backend_xtensa_sim, + log_backend_xtensa_sim_api, + true);