bootstage: Allow marking a particular line of code
Add a function which allows a (file, function, line number) to be marked in bootstage. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Che-Liang Chiou <clchiou@chromium.org>
This commit is contained in:
parent
2e65959be6
commit
fb7db41cd4
|
@ -30,6 +30,8 @@
|
||||||
|
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <libfdt.h>
|
#include <libfdt.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
#include <linux/compiler.h>
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
@ -117,6 +119,33 @@ ulong bootstage_mark_name(enum bootstage_id id, const char *name)
|
||||||
return bootstage_add_record(id, name, flags, timer_get_boot_us());
|
return bootstage_add_record(id, name, flags, timer_get_boot_us());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ulong bootstage_mark_code(const char *file, const char *func, int linenum)
|
||||||
|
{
|
||||||
|
char *str, *p;
|
||||||
|
__maybe_unused char *end;
|
||||||
|
int len = 0;
|
||||||
|
|
||||||
|
/* First work out the length we need to allocate */
|
||||||
|
if (linenum != -1)
|
||||||
|
len = 11;
|
||||||
|
if (func)
|
||||||
|
len += strlen(func);
|
||||||
|
if (file)
|
||||||
|
len += strlen(file);
|
||||||
|
|
||||||
|
str = malloc(len + 1);
|
||||||
|
p = str;
|
||||||
|
end = p + len;
|
||||||
|
if (file)
|
||||||
|
p += snprintf(p, end - p, "%s,", file);
|
||||||
|
if (linenum != -1)
|
||||||
|
p += snprintf(p, end - p, "%d", linenum);
|
||||||
|
if (func)
|
||||||
|
p += snprintf(p, end - p, ": %s", func);
|
||||||
|
|
||||||
|
return bootstage_mark_name(BOOTSTAGE_ID_ALLOC, str);
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t bootstage_start(enum bootstage_id id, const char *name)
|
uint32_t bootstage_start(enum bootstage_id id, const char *name)
|
||||||
{
|
{
|
||||||
struct bootstage_record *rec = &record[id];
|
struct bootstage_record *rec = &record[id];
|
||||||
|
|
|
@ -266,6 +266,19 @@ ulong bootstage_error(enum bootstage_id id);
|
||||||
|
|
||||||
ulong bootstage_mark_name(enum bootstage_id id, const char *name);
|
ulong bootstage_mark_name(enum bootstage_id id, const char *name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mark a time stamp in the given function and line number
|
||||||
|
*
|
||||||
|
* See BOOTSTAGE_MARKER() for a convenient macro.
|
||||||
|
*
|
||||||
|
* @param file Filename to record (NULL if none)
|
||||||
|
* @param func Function name to record
|
||||||
|
* @param linenum Line number to record
|
||||||
|
* @return recorded time stamp
|
||||||
|
*/
|
||||||
|
ulong bootstage_mark_code(const char *file, const char *func,
|
||||||
|
int linenum);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mark the start of a bootstage activity. The end will be marked later with
|
* Mark the start of a bootstage activity. The end will be marked later with
|
||||||
* bootstage_accum() and at that point we accumulate the time taken. Calling
|
* bootstage_accum() and at that point we accumulate the time taken. Calling
|
||||||
|
@ -358,6 +371,12 @@ static inline ulong bootstage_mark_name(enum bootstage_id id, const char *name)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline ulong bootstage_mark_code(const char *file, const char *func,
|
||||||
|
int linenum)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static inline uint32_t bootstage_start(enum bootstage_id id, const char *name)
|
static inline uint32_t bootstage_start(enum bootstage_id id, const char *name)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -379,4 +398,8 @@ static inline int bootstage_unstash(void *base, int size)
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_BOOTSTAGE */
|
#endif /* CONFIG_BOOTSTAGE */
|
||||||
|
|
||||||
|
/* Helper macro for adding a bootstage to a line of code */
|
||||||
|
#define BOOTSTAGE_MARKER() \
|
||||||
|
bootstage_mark_code(__FILE__, __func__, __LINE__)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue