Logging API
-
enum log_level_t
Log levels supported, ranging from most to least important
Constants
LOGL_EMERG
U-Boot is unstable
LOGL_ALERT
Action must be taken immediately
LOGL_CRIT
Critical conditions
LOGL_ERR
Error that prevents something from working
LOGL_WARNING
Warning may prevent optimal operation
LOGL_NOTICE
Normal but significant condition, printf()
LOGL_INFO
General information message
LOGL_DEBUG
Basic debug-level message
LOGL_DEBUG_CONTENT
Debug message showing full message content
LOGL_DEBUG_IO
Debug message showing hardware I/O access
LOGL_COUNT
Total number of valid log levels
LOGL_NONE
Used to indicate that there is no valid log level
LOGL_LEVEL_MASK
Mask for valid log levels
LOGL_FORCE_DEBUG
Mask to force output due to LOG_DEBUG
LOGL_FIRST
The first, most-important log level
LOGL_MAX
The last, least-important log level
LOGL_CONT
Use same log level as in previous call
-
enum log_category_t
Log categories supported.
Constants
LOGC_FIRST
First log category
LOGC_NONE
Default log category
LOGC_ARCH
Related to arch-specific code
LOGC_BOARD
Related to board-specific code
LOGC_CORE
Related to core features (non-driver-model)
LOGC_DM
Core driver-model
LOGC_DT
Device-tree
LOGC_EFI
EFI implementation
LOGC_ALLOC
Memory allocation
LOGC_SANDBOX
Related to the sandbox board
LOGC_BLOBLIST
Bloblist
LOGC_DEVRES
Device resources (
devres_...
functions)LOGC_ACPI
Advanced Configuration and Power Interface (ACPI)
LOGC_BOOT
Related to boot process / boot image processing
LOGC_EVENT
Related to event and event handling
LOGC_FS
Related to filesystems
LOGC_EXPO
Related to expo handling
LOGC_CONSOLE
Related to the console and stdio
LOGC_COUNT
Number of log categories
LOGC_END
Sentinel value for lists of log categories
LOGC_CONT
Use same category as in previous call
Description
Log categories between LOGC_FIRST
and LOGC_NONE
correspond to uclasses
(i.e. enum uclass_id
), but there are also some more generic categories.
Remember to update log_cat_name[] after adding a new category.
-
int _log(enum log_category_t cat, enum log_level_t level, const char *file, int line, const char *func, const char *fmt, ...)
Internal function to emit a new log record
Parameters
enum log_category_t cat
Category of log record (indicating which subsystem generated it)
enum log_level_t level
Level of log record (indicating its severity)
const char *file
File name of file where log record was generated
int line
Line number in file where log record was generated
const char *func
Function where log record was generated, NULL if not known
const char *fmt
printf() format string for log record
...
Optional parameters, according to the format string fmt
Return
0 if log record was emitted, -ve on error
-
int _log_buffer(enum log_category_t cat, enum log_level_t level, const char *file, int line, const char *func, ulong addr, const void *data, uint width, uint count, uint linelen)
Internal function to print data buffer in hex and ascii form
Parameters
enum log_category_t cat
Category of log record (indicating which subsystem generated it)
enum log_level_t level
Level of log record (indicating its severity)
const char *file
File name of file where log record was generated
int line
Line number in file where log record was generated
const char *func
Function where log record was generated, NULL if not known
ulong addr
Starting address to display at start of line
const void *data
pointer to data buffer
uint width
data value width. May be 1, 2, or 4.
uint count
number of values to display
uint linelen
Number of values to print per line; specify 0 for default length
-
assert
assert (x)
assert expression is true
Parameters
x
expression to test
Description
If the expression x evaluates to false and _DEBUG evaluates to true, a panic message is written and the system stalls. The value of _DEBUG is set to true if DEBUG is defined before including common.h.
The expression x is always executed irrespective of the value of _DEBUG.
-
struct log_rec
a single log record
Definition
struct log_rec {
enum log_category_t cat;
enum log_level_t level;
u16 line;
u8 flags;
const char *file;
const char *func;
const char *msg;
};
Members
cat
Category, representing a uclass or part of U-Boot
level
Severity level, less severe is higher
line
Line number where the log record was generated
flags
Flags for log record (enum log_rec_flags)
file
Name of file where the log record was generated (not allocated)
func
Function where the log record was generated (not allocated)
msg
Log message (allocated)
Description
Holds information about a single record in the log
Members marked as ‘not allocated’ are stored as pointers and the caller is responsible for making sure that the data pointed to is not overwritten. Members marked as ‘allocated’ are allocated (e.g. via strdup()) by the log system.
TODO(sjg**chromium.org**): Compress this struct down a bit to reduce space, e.g. a single u32 for cat, level, line and force_debug
-
struct log_driver
a driver which accepts and processes log records
Definition
struct log_driver {
const char *name;
int (*emit)(struct log_device *ldev, struct log_rec *rec);
unsigned short flags;
};
Members
name
Name of driver
emit
emit a log record
Called by the log system to pass a log record to a particular driver for processing. The filter is checked before calling this function.
flags
Initial value for flags (use LOGDF_ENABLE to enable on start-up)
-
struct log_device
an instance of a log driver
Definition
struct log_device {
unsigned short next_filter_num;
unsigned short flags;
struct log_driver *drv;
struct list_head filter_head;
struct list_head sibling_node;
};
Members
next_filter_num
Sequence number of next filter filter added (0=no filters yet). This increments with each new filter on the device, but never decrements
flags
Flags for this filter (enum log_device_flags)
drv
Pointer to driver for this device
filter_head
List of filters for this device
sibling_node
Next device in the list of all devices
Description
Since drivers are set up at build-time we need to have a separate device for the run-time aspects of drivers (currently just a list of filters to apply to records send to this device).
-
enum log_filter_flags
Flags which modify a filter
Constants
LOGFF_HAS_CAT
Filter has a category list
LOGFF_DENY
Filter denies matching messages
LOGFF_LEVEL_MIN
Filter’s level is a minimum, not a maximum
-
struct log_filter
criteria to filter out log messages
Definition
struct log_filter {
int filter_num;
int flags;
enum log_category_t cat_list[LOGF_MAX_CATEGORIES];
enum log_level_t level;
const char *file_list;
struct list_head sibling_node;
};
Members
filter_num
Sequence number of this filter. This is returned when adding a new filter, and must be provided when removing a previously added filter.
flags
Flags for this filter (
LOGFF_...
)cat_list
List of categories to allow (terminated by
LOGC_END
). If empty then all categories are permitted. Up toLOGF_MAX_CATEGORIES
entries can be providedlevel
Maximum (or minimum, if
LOGFF_MIN_LEVEL
) log level to allowfile_list
List of files to allow, separated by comma. If NULL then all files are permitted
sibling_node
Next filter in the list of filters for this log device
Description
If a message matches all criteria, then it is allowed. If LOGFF_DENY is set, then it is denied instead.
-
const char *log_get_cat_name(enum log_category_t cat)
Get the name of a category
Parameters
enum log_category_t cat
Category to look up
Return
- category name (which may be a uclass driver name) if found, or
“<invalid>” if invalid, or “<missing>” if not found. All error responses begin with ‘<’.
-
enum log_category_t log_get_cat_by_name(const char *name)
Look up a category by name
Parameters
const char *name
Name to look up
Return
Category, or LOGC_NONE
if not found
-
const char *log_get_level_name(enum log_level_t level)
Get the name of a log level
Parameters
enum log_level_t level
Log level to look up
Return
Log level name (in ALL CAPS)
-
enum log_level_t log_get_level_by_name(const char *name)
Look up a log level by name
Parameters
const char *name
Name to look up
Return
Log level, or LOGL_NONE
if not found
-
struct log_device *log_device_find_by_name(const char *drv_name)
Look up a log device by its driver’s name
Parameters
const char *drv_name
Name of the driver
Return
the log device, or NULL
if not found
-
bool log_has_cat(enum log_category_t cat_list[], enum log_category_t cat)
check if a log category exists within a list
Parameters
enum log_category_t cat_list[]
List of categories to check, at most
LOGF_MAX_CATEGORIES
entries long, terminated byLC_END
if fewerenum log_category_t cat
Category to search for
Return
true
if cat is in cat_list, else false
-
bool log_has_file(const char *file_list, const char *file)
check if a file is with a list
Parameters
const char *file_list
List of files to check, separated by comma
const char *file
File to check for. This string is matched against the end of each file in the list, i.e. ignoring any preceding path. The list is intended to consist of relative pathnames, e.g. common/main.c,cmd/log.c
Return
true
if file is in file_list, else false
-
int log_add_filter_flags(const char *drv_name, enum log_category_t cat_list[], enum log_level_t level, const char *file_list, int flags)
Add a new filter to a log device, specifying flags
Parameters
const char *drv_name
Driver name to add the filter to (since each driver only has a single device)
enum log_category_t cat_list[]
List of categories to allow (terminated by
LOGC_END
). If empty then all categories are permitted. Up toLOGF_MAX_CATEGORIES
entries can be providedenum log_level_t level
Maximum (or minimum, if
LOGFF_LEVEL_MIN
) log level to allowconst char *file_list
List of files to allow, separated by comma. If NULL then all files are permitted
int flags
Flags for this filter (
LOGFF_...
)
Return
the sequence number of the new filter (>=0) if the filter was added, or a -ve value on error
-
int log_add_filter(const char *drv_name, enum log_category_t cat_list[], enum log_level_t max_level, const char *file_list)
Add a new filter to a log device
Parameters
const char *drv_name
Driver name to add the filter to (since each driver only has a single device)
enum log_category_t cat_list[]
List of categories to allow (terminated by
LOGC_END
). If empty then all categories are permitted. Up toLOGF_MAX_CATEGORIES
entries can be providedenum log_level_t max_level
Maximum log level to allow
const char *file_list
List of files to allow, separated by comma. If
NULL
then all files are permitted
Return
the sequence number of the new filter (>=0) if the filter was added, or a -ve value on error
-
int log_remove_filter(const char *drv_name, int filter_num)
Remove a filter from a log device
Parameters
const char *drv_name
Driver name to remove the filter from (since each driver only has a single device)
int filter_num
Filter number to remove (as returned by log_add_filter())
Return
0 if the filter was removed, -
ENOENT
if either the driver or the filter number was not found
-
int log_device_set_enable(struct log_driver *drv, bool enable)
Enable or disable a log device
Parameters
struct log_driver *drv
Driver of device to enable
bool enable
true to enable, false to disable
Description
Devices are referenced by their driver, so use LOG_GET_DRIVER(name) to pass the driver to this function. For example if the driver is declared with LOG_DRIVER(wibble) then pass LOG_GET_DRIVER(wibble) here.
Return
0 if OK, -ENOENT if the driver was not found
-
int log_init(void)
Set up the log system ready for use
Parameters
void
no arguments
Return
0 if OK, -ENOMEM
if out of memory
-
int log_get_default_format(void)
get default log format
Parameters
void
no arguments
Description
The default log format is configurable via
CONFIG_LOGF_FILE
, CONFIG_LOGF_LINE
, and CONFIG_LOGF_FUNC
.
Return
default log format
-
void log_fixup_for_gd_move(struct global_data *new_gd)
Handle global_data moving to a new place
Parameters
struct global_data *new_gd
Pointer to the new global data
Description
The log_head list is part of global_data. Due to the way lists work, moving the list will cause it to become invalid. This function fixes that up so that the log_head list will work correctly.