48590fa89f
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>
110 lines
2.2 KiB
C
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);
|
|
}
|