blob: 5c222a79a839dc87ef3c4db8c51fe1aae9621208 [file] [log] [blame]
/*
* Copyright 2017, Data61, CSIRO (ABN 41 687 119 230)
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <sel4utils/util.h>
#include <stdint.h>
#define PROFILE_VAR_TYPE_INT32 1
#define PROFILE_VAR_TYPE_INT64 2
typedef struct profile_var {
int type;
void *var;
const char *varname;
const char *description;
} profile_var_t;
#define __WATCH_VAR(_type, _var, _description, _unique) \
static profile_var_t profile_##_unique \
__attribute__((used)) __attribute__((section("_profile_var"))) \
= {.type = _type, .var = &_var, .varname = #_var, .description = _description}
#define _WATCH_VAR32(var, description, unique) \
compile_time_assert(profile_size_##unique, sizeof(var) == 4); \
__WATCH_VAR(PROFILE_VAR_TYPE_INT32, var, description, unique)
#define WATCH_VAR32(var, description) \
_WATCH_VAR32(var, description, __LINE__)
#define _WATCH_VAR64(var, description, unique) \
compile_time_assert(profile_size_##unique, sizeof(var) == 8); \
__WATCH_VAR(PROFILE_VAR_TYPE_INT64, var, description, unique)
#define WATCH_VAR64(var, description) \
_WATCH_VAR64(var, description, __LINE__)
typedef void (*profile_callback32)(uint32_t value, const char *varname, const char *descrption, void *cookie);
typedef void (*profile_callback64)(uint64_t value, const char *varname, const char *descrption, void *cookie);
/* Sample functions that just output the vars using printf. cookie is ignored */
void profile_print32(uint32_t value, const char *varname, const char *description, void *cookie);
void profile_print64(uint64_t value, const char *varname, const char *description, void *cookie);
/* Iterates over all profile variables and calls back the specified function(s)
* with the current value. */
void profile_scrape(profile_callback32 callback32, profile_callback64 callback64, void *cookie);
/* Iterates over all profile variables and resets the value to zero */
void profile_reset(void);
#define _PSTART_TIME(x) uint32_t __begin_time##x = read_ccnt()
#define _PEND_TIME(x) uint32_t __end_time##x = read_ccnt()
#define _PTIME_DIFF(x) (__end_time##x - __begin_time##x)
#define PINC(name) PADD(name, 1)
#define PADDTIMEDIFF(name) PADD(name, PTIMEDIFF(name))
#define PADDTIME(name) PEND_TIME(name); PADDTIMEDIFF(name)
#define PTIMEDIFF(x) _PTIME_DIFF(x)
#ifdef CONFIG_SEL4UTILS_PROFILE
#define PVARUINT32(name, desc) static uint32_t name = 0; WATCH_VAR32(name, desc);
#define PVARUINT64(name, desc) static uint64_t name = 0; WATCH_VAR64(name, desc);
#define PADD(name, x) do {name += (x); } while(0)
#define PSTART_TIME(x) _PSTART_TIME(x)
#define PEND_TIME(x) _PEND_TIME(x)
#else
#define PVARUINT32(name, desc)
#define PVARUINT64(name, desc)
#define PADD(name, x) do { } while(0)
#define PSTART_TIME(x) do { } while(0)
#define PEND_TIME(x) do { } while(0)
#endif