blob: 7cb9e42e8a688bce7306dc3fd3d06e59a1c799ad [file] [log] [blame]
/*
* 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);