acpica: provide verbose config

If "verbose" is set to true in the config, AcpiOsPrintf etc. are enabled
to log to a dedicated LOG session using the Format:Console utility.

Issue #5083
This commit is contained in:
Christian Helmuth 2023-12-18 11:47:08 +01:00
parent a6b30d58df
commit 30e37d90dd
6 changed files with 80 additions and 9 deletions

View File

@ -162,9 +162,10 @@ set config {
</route>
</start>
<start name="acpica" caps="200">
<start name="acpica" caps="400">
<resource name="RAM" quantum="8M"/>
<config ld_verbose="yes" reset="yes" poweroff="yes" report="yes" report_period_ms="0">
<config ld_verbose="yes" reset="yes" poweroff="yes" report="yes"
report_period_ms="0" verbose="yes">
</config>
<route>
<service name="ROM" label="system"> <child name="dynamic_rom"/> </service>

View File

@ -41,13 +41,16 @@ Furthermore the ACPICA library may trigger, dependent on the ACPI ASL code,
various I/O port and I/O mem accesses to hardware. Accesses to PCI devices are
ignored and dropped by this component.
Log verbosity can be increased by the "verbose" config attribute.
Excerpt of important parts of the acpica configuration
------------------------------------------------------
!<start name="acpica">
! <!-- <binary name="debug-acpica"/> -->
! ...
! <config reset="no" sleep="no" poweroff="no" report="yes" report_period_ms="2000" use_gpe="true"/>
! <config reset="no" sleep="no" poweroff="no" report="yes" report_period_ms="2000"
use_gpe="true" verbose="no"/>
! <route>
! <service name="ROM" label="system"> <child name="..."/> </service>
! <service name="Report"> <child name="..."/> </service>

View File

@ -200,11 +200,15 @@ struct Acpica::Main
bool const enable_reset = config.xml().attribute_value("reset", false);
bool const enable_poweroff = config.xml().attribute_value("poweroff", false);
bool const enable_report = config.xml().attribute_value("report", false);
bool const verbose = config.xml().attribute_value("verbose", false);
auto const periodic_ms = config.xml().attribute_value("report_period_ms", 0ULL);
if (enable_report)
report = new (heap) Acpica::Reportstate(env);
if (verbose)
init_printf(env);
init_acpica(config.xml().attribute_value("use_gpe", true));
if (enable_report)

View File

@ -6,12 +6,67 @@
*/
#include <stdarg.h>
#include <log_session/connection.h>
#include <format/console.h>
extern "C"
void AcpiOsPrintf (const char *fmt, ...)
{ }
#include "util.h"
using namespace Genode;
struct Formatted_log : Format::Console
{
Log_connection con;
char str[Log_session::MAX_STRING_LEN] { };
size_t pos { };
Formatted_log(Env &env) : con(env, "debug") { }
void _out_char(char c) override
{
if (c != '\n')
str[pos++] = c;
if (c == '\n' || pos == sizeof(str)) {
str[pos] = 0;
con.write(str);
pos = 0;
}
}
};
static Formatted_log *formatted_log;
void Acpica::init_printf(Env &env)
{
static Formatted_log instance(env);
formatted_log = &instance;
};
extern "C" {
#include "acpi.h"
#include "acpiosxf.h"
extern "C"
void AcpiOsVprintf (const char *fmt, va_list va)
{ }
{
if (formatted_log)
formatted_log->vprintf(fmt, va);
}
void AcpiOsPrintf (const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
AcpiOsVprintf(fmt, args);
va_end(args);
}
}

View File

@ -1,6 +1,6 @@
TARGET := acpica
SRC_CC := os.cc printf.cc report.cc
REQUIRES := x86
LIBS += base acpica
LIBS += base acpica format
CC_CXX_WARN_STRICT =

View File

@ -13,12 +13,18 @@
#ifndef _ACPICA__UTIL_H_
#define _ACPICA__UTIL_H_
#include <base/env.h>
#include <os/reporter.h>
extern "C" {
#include "acpi.h"
}
namespace Acpica {
using namespace Genode;
template<typename> class Buffer;
template<typename> class Callback;
@ -26,6 +32,8 @@ namespace Acpica {
void for_each_element(H const head, S *, F const &fn, FSIZE const &fn_size);
void generate_suspend_report(Genode::Reporter::Xml_generator &);
void init_printf(Env &);
}
template <typename T>