| /* |
| * Copyright 2017, Data61, CSIRO (ABN 41 687 119 230) |
| * |
| * SPDX-License-Identifier: BSD-2-Clause |
| */ |
| |
| #pragma once |
| |
| #include <sel4/types.h> |
| #include <sel4/constants.h> |
| #include <sel4bench/kernel_logging.h> |
| |
| /* Log format matching the one used in the kernel. |
| * This will be used as a generic log entry struct. |
| */ |
| |
| /* Dynamically expanding array */ |
| typedef struct log_buffer { |
| seL4_Word *buffer; |
| unsigned int capacity; |
| unsigned int length; |
| |
| /* Flag set when length == capacity and the most recent |
| * call to realloc has failed (indicating a lack of |
| * available heap). |
| */ |
| unsigned int full; |
| } log_buffer_t; |
| |
| /* Allocates initial memory for the log buffer's internal buffer */ |
| void logging_init_log_buffer(log_buffer_t *log_buffer, unsigned int initial_capacity); |
| |
| /* Adds a new entry to the log buffer, reallocating memory to expand its buffer if necessary */ |
| void logging_append_log_buffer(log_buffer_t *log_buffer, seL4_Word data); |
| |
| /* Given an array of log entries and an array of buffers, copies the data field of each array entry |
| * into a buffer whose position in the array of buffers corresponds to the log entry's key field. |
| */ |
| void logging_separate_log(kernel_log_entry_t *logs, unsigned int num_logs, log_buffer_t *buffers, unsigned int num_buffers); |
| |
| /* Sorts an array of logs in place, in ascending order of key. |
| * Not necessarily a stable sort. |
| */ |
| void logging_sort_log(kernel_log_entry_t *logs, unsigned int num_logs); |
| |
| /* Sorts an array of logs in place, in ascending order of key. |
| * Guaranteed to be stable. |
| */ |
| void logging_stable_sort_log(kernel_log_entry_t *logs, unsigned int num_logs); |
| |
| /* Given a sorted array of logs, for each distinct key, records the offset in the now sorted array |
| * containing the first occurence of that key, and the number of elements in the array with that key. |
| */ |
| void logging_group_log_by_key(kernel_log_entry_t *logs, unsigned int num_logs, |
| unsigned int *sizes, unsigned int *offsets, |
| unsigned int max_groups); |