/*
 * Copyright 2017, Data61
 * Commonwealth Scientific and Industrial Research Organisation (CSIRO)
 * ABN 41 687 119 230.
 *
 * This software may be distributed and modified according to the terms of
 * the BSD 2-Clause license. Note that NO WARRANTY is provided.
 * See "LICENSE_BSD2.txt" for details.
 *
 *  @LICENSE(DATA61_BSD)
 */
#include <autoconf.h>
#include <sel4debug/gen_config.h>
#include <sel4/sel4.h>
#include <sel4debug/instrumentation.h>

/* Don't instrument seL4_GetIPCBuffer so we don't recurse. */
seL4_IPCBuffer *seL4_GetIPCBuffer(void) __attribute__((no_instrument_function));

/* We can't just store backtrace information in a single static area because it
 * needs to be tracked per-thread. To do this we assume each thread has a
 * different IPC buffer and write backtrace information into the area of memory
 * directly following the IPC buffer. Note that this assumes that such an area
 * is mapped and not in use for anything else. This is not true in environments
 * like CAmkES, where you will have to tweak the following #define for the base
 * of this region. We also assume that the size of the stack is initialised to
 * 0 for us because seL4 zeroes frames on creation. The stored information looks
 * like this:
 *
 *   |        ↑        |
 *   | backtrace stack |
 *   +-----------------+
 *   |   stack size    |
 *   +-----------------+ BACKTRACE_BASE
 */
#define BACKTRACE_BASE (((void*)seL4_GetIPCBuffer()) + sizeof(seL4_IPCBuffer))

int backtrace(void **buffer, int size)
{
    int *bt_stack_sz = (int *)BACKTRACE_BASE;
    void **bt_stack = (void **)(BACKTRACE_BASE + sizeof(int));

    /* Write as many entries as we can, starting from the top of the stack,
     * into the caller's buffer.
     */
    int i;
    for (i = 0; i < size && i < *bt_stack_sz; i++) {
        buffer[i] = bt_stack[*bt_stack_sz - 1 - i];
    }

    return i;
}

#ifdef CONFIG_LIBSEL4DEBUG_FUNCTION_INSTRUMENTATION_BACKTRACE

void __cyg_profile_func_enter(void *func, void *caller)
{
    if (seL4_GetIPCBuffer() == NULL) {
        /* The caller doesn't have a valid IPC buffer. Assume it has not been
         * setup yet and just skip logging the current function.
         */
        return;
    }
    int *bt_stack_sz = (int *)BACKTRACE_BASE;
    void **bt_stack = (void **)(BACKTRACE_BASE + sizeof(int));

    /* Push the current function */
    bt_stack[*bt_stack_sz] = func;
    *bt_stack_sz += 1;
}

void __cyg_profile_func_exit(void *func, void *caller)
{
    if (seL4_GetIPCBuffer() == NULL) {
        return;
    }
    int *bt_stack_sz = (int *)BACKTRACE_BASE;

    /* Pop the current function */
    *bt_stack_sz -= 1;
}

#endif
