zephyr/boards/posix/nrf52_bsim/trace_hook.c
Alberto Escolar Piedras 48590fa89f nrf52_bsim: Fix: shell return code should be != 0 on ASSERT
When calling posix_print_error_and_exit()
a return != 0 was not provided to the shell
This was due to thee way the tracing functions call back
into the main app exit function, assuming that callback
will return.
But in the SOC_INF boards, that function does
not return, and the tracing functions never have the
chance to exit(!=0)
Fix it by calling posix_exit() in the wrap function instead.

Signed-off-by: Alberto Escolar Piedras <alpi@oticon.com>
2019-11-08 14:04:19 +01:00

110 lines
2.2 KiB
C

/*
* Copyright (c) 2017 Oticon A/S
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <stdio.h>
#include <init.h>
#include "bs_tracing.h"
#include "posix_board_if.h"
#define _STDOUT_BUF_SIZE 256
static char stdout_buff[_STDOUT_BUF_SIZE];
static int n_pend; /* Number of pending characters in buffer */
int print_char(int c)
{
int printnow = 0;
if ((c != '\n') && (c != '\r')) {
stdout_buff[n_pend++] = c;
stdout_buff[n_pend] = 0;
} else {
printnow = 1;
}
if (n_pend >= _STDOUT_BUF_SIZE - 1) {
printnow = 1;
}
if (printnow) {
bs_trace_print(BS_TRACE_RAW, NULL, 0, 2, BS_TRACE_AUTOTIME, 0,
"%s\n", stdout_buff);
n_pend = 0;
stdout_buff[0] = 0;
}
return c;
}
/**
* Flush to the terminal any possible pending printk
*/
void posix_flush_stdout(void)
{
if (n_pend) {
stdout_buff[n_pend] = 0;
bs_trace_print(BS_TRACE_RAW, NULL, 0, 2, BS_TRACE_AUTOTIME, 0,
"%s", stdout_buff);
n_pend = 0;
stdout_buff[0] = 0;
fflush(stdout);
}
}
/*
* @brief Initialize the driver that provides the printk output
*
* @return 0 if successful, otherwise failed.
*/
static int printk_init(struct device *arg)
{
ARG_UNUSED(arg);
extern void __printk_hook_install(int (*fn)(int));
__printk_hook_install(print_char);
return 0;
}
SYS_INIT(printk_init, PRE_KERNEL_1, CONFIG_PRINTK_HOOK_INIT_PRIORITY);
void posix_print_error_and_exit(const char *format, ...)
{
va_list variable_argsp;
va_start(variable_argsp, format);
bs_trace_vprint(BS_TRACE_WARNING, NULL, 0, 0, BS_TRACE_AUTOTIME, 0,
format, variable_argsp);
va_end(variable_argsp);
posix_exit(1);
}
void posix_print_warning(const char *format, ...)
{
va_list variable_argsp;
va_start(variable_argsp, format);
bs_trace_vprint(BS_TRACE_WARNING, NULL, 0, 0, BS_TRACE_AUTOTIME, 0,
format, variable_argsp);
va_end(variable_argsp);
}
void posix_print_trace(const char *format, ...)
{
va_list variable_argsp;
va_start(variable_argsp, format);
bs_trace_vprint(BS_TRACE_RAW, NULL, 0, 2, BS_TRACE_AUTOTIME, 0,
format, variable_argsp);
va_end(variable_argsp);
}
int posix_trace_over_tty(int file_number)
{
return bs_trace_is_tty(file_number);
}