bootstage: Allow marking a particular line of code
authorSimon Glass <sjg@chromium.org>
Wed, 17 Apr 2013 16:13:44 +0000 (16:13 +0000)
committerSimon Glass <sjg@chromium.org>
Mon, 13 May 2013 20:33:22 +0000 (13:33 -0700)
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>
common/bootstage.c
include/bootstage.h

index 15afa24c44bb5a60cab358f9fbf67d10668b73db..c5c69961acc91dd8590968598deff5ba69def306 100644 (file)
@@ -30,6 +30,8 @@
 
 #include <common.h>
 #include <libfdt.h>
+#include <malloc.h>
+#include <linux/compiler.h>
 
 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());
 }
 
+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)
 {
        struct bootstage_record *rec = &record[id];
index c8235e8ed6ad10a0c7a551b785201d735be290b2..0f44e71fe24ad447ad7e5af123fcb2f919f68ce3 100644 (file)
@@ -266,6 +266,19 @@ ulong bootstage_error(enum bootstage_id id);
 
 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
  * 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;
 }
 
+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)
 {
        return 0;
@@ -379,4 +398,8 @@ static inline int bootstage_unstash(void *base, int size)
 }
 #endif /* CONFIG_BOOTSTAGE */
 
+/* Helper macro for adding a bootstage to a line of code */
+#define BOOTSTAGE_MARKER()     \
+               bootstage_mark_code(__FILE__, __func__, __LINE__)
+
 #endif