summaryrefslogtreecommitdiff
path: root/cesar/lib/src/trace.c
diff options
context:
space:
mode:
authorschodet2009-11-12 12:46:51 +0000
committerschodet2009-11-12 12:46:51 +0000
commit8ccf0d21935462f902789f4c13f6cf7b30501ff8 (patch)
treea6e7ffcfa27d5d49db141805defbf179ecba835a /cesar/lib/src/trace.c
parent90ff45b527e0ac48f12b2cf69af1dd8317fb4bf3 (diff)
cesar/lib/trace: add bare trace buffer support, closes #736
This is a lightweight trace buffer to be used from assembly sources. git-svn-id: svn+ssh://pessac/svn/cesar/trunk@6359 017c9cb6-072f-447c-8318-d5b54f68fe89
Diffstat (limited to 'cesar/lib/src/trace.c')
-rw-r--r--cesar/lib/src/trace.c95
1 files changed, 81 insertions, 14 deletions
diff --git a/cesar/lib/src/trace.c b/cesar/lib/src/trace.c
index 195c00ec7a..f9c3fa0e88 100644
--- a/cesar/lib/src/trace.c
+++ b/cesar/lib/src/trace.c
@@ -30,6 +30,9 @@
* buffer. */
#define TRACE_DUMP_TEXT_SLACK 20
+/** Uninitialised trace data. */
+#define TRACE_UNINITIALISED 0xffffffff
+
/** Trace system context. */
struct trace_t
{
@@ -248,6 +251,7 @@ trace_buffer_add (trace_buffer_t *buf, const char *name, uint drop_level,
buf->drop_level = drop_level;
buf->preload = preload;
buf->locked = locked && !CONFIG_TRACE_ALL_SLOW;
+ buf->bare = NULL;
buf->name = name;
buf->namespace = namespace;
/* Allocate chunks. */
@@ -270,6 +274,38 @@ trace_buffer_add (trace_buffer_t *buf, const char *name, uint drop_level,
}
void
+trace_buffer_add_bare (trace_buffer_t *buf, const char *name,
+ trace_buffer_bare_t *bare, u32 *data, uint size,
+ trace_namespace_t *namespace)
+{
+ dbg_assert (buf);
+ dbg_assert (name);
+ dbg_assert (bare);
+ dbg_assert_ptr (data);
+ trace_t * const ctx = &trace_global;
+ /* Initialise trace buffer. */
+ list_init_node (&buf->node);
+ buf->chunks_nb = 0;
+ buf->drop_level = 0;
+ buf->preload = 0;
+ buf->locked = true;
+ buf->head = buf->tail = NULL;
+ buf->bare = bare;
+ buf->name = name;
+ buf->namespace = namespace;
+ /* Initialise bare buffer. */
+ bare->data_tail = data;
+ bare->data_end = data + size;
+ bare->data = data;
+ /* Initialise bare buffer content. */
+ u32 *p;
+ for (p = data; p != data + size; p++)
+ *p = TRACE_UNINITIALISED;
+ /* Add it to context. */
+ list_push (&ctx->buffers, &buf->node);
+}
+
+void
trace_buffer_remove (trace_buffer_t *buf)
{
dbg_assert (buf);
@@ -277,7 +313,8 @@ trace_buffer_remove (trace_buffer_t *buf)
/* Remove from context. */
list_remove (&ctx->buffers, &buf->node);
/* Release chunks. */
- blk_release_desc_range ((blk_t *) buf->head, (blk_t *) buf->tail);
+ if (buf->head)
+ blk_release_desc_range ((blk_t *) buf->head, (blk_t *) buf->tail);
}
trace_buffer_t *
@@ -414,6 +451,9 @@ trace_buffer_dump_events (char *text, int *text_size,
trace_dump_callback_t cb, void *user)
{
int sum = 0;
+ /* Skip uninitialised data. */
+ while (data < data_end && *data == TRACE_UNINITIALISED)
+ data++;
/* Loop on this chunk. */
while (data < data_end)
{
@@ -450,8 +490,6 @@ trace_buffer_dump (trace_buffer_t *buf, trace_dump_callback_t cb, void *user)
u32 *data, *data_end;
int sum = 0;
dbg_assert (buf);
- dbg_assert (buf->head);
- dbg_assert (buf->tail);
dbg_assert (buf->name);
dbg_assert (cb);
/* Dump buffer name. */
@@ -471,22 +509,51 @@ trace_buffer_dump (trace_buffer_t *buf, trace_dump_callback_t cb, void *user)
/* TODO: acquire lock, increment reference counter. */
tail = buf->tail;
head = buf->head;
- /* Loop for each chunks. */
- do
+ if (head)
+ {
+ /* Loop for each chunks. */
+ do
+ {
+ data = head->data;
+ data_end = data + head->commit_index;
+ int ret = trace_buffer_dump_events (
+ text, &text_size, buf->namespace, data, data_end, cb, user);
+ if (ret == -1)
+ sum = -1;
+ else
+ sum += ret;
+ if (sum == -1 || head == tail)
+ break;
+ head = head->next;
+ } while (1);
+ }
+ else
{
- data = head->data;
- data_end = data + head->commit_index;
- int ret = trace_buffer_dump_events (text, &text_size, buf->namespace,
- data, data_end, cb, user);
+ int ret;
+ /* Dump bare buffer. */
+ dbg_assert (buf->bare);
+ dbg_assert (buf->bare->data <= buf->bare->data_tail
+ && buf->bare->data_tail < buf->bare->data_end);
+ /* First part, after tail. */
+ ret = trace_buffer_dump_events (
+ text, &text_size, buf->namespace, buf->bare->data_tail,
+ buf->bare->data_end, cb, user);
if (ret == -1)
sum = -1;
else
+ {
sum += ret;
- if (sum == -1 || head == tail)
- break;
- head = head->next;
- } while (1);
- /* Final text. */
+ /* Second part, before tail. */
+ ret = trace_buffer_dump_events (
+ text, &text_size, buf->namespace, buf->bare->data,
+ buf->bare->data_tail, cb, user);
+ if (ret == -1)
+ sum = -1;
+ else
+ sum += ret;
+ }
+ }
+ /* Final text, if sum is -1, there was a user callback error. */
if (sum != -1)
{
dbg_assert (sizeof (trace_stop) - 1 < TRACE_DUMP_TEXT_SLACK);