blob: 5c62b6103bb1cc60c389a197e1dd9efaf425ca85 [file] [log] [blame]
/*
* 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.
*
* @TAG(DATA61_BSD)
*/
#include <sel4utils/profile.h>
#include <stdio.h>
#include <inttypes.h>
/*
* __start_SECTION_NAME and __stop_SECTION_NAME are magic symbols inserted by the gcc
* linker
*/
extern profile_var_t __start__profile_var[];
extern profile_var_t __stop__profile_var[];
void profile_print32(uint32_t value, const char *varname, const char *description, void *cookie)
{
printf("%s: %"PRIu32" %s\n", varname, value, description);
}
void profile_print64(uint64_t value, const char *varname, const char *description, void *cookie)
{
printf("%s: %"PRIu64" %s\n", varname, value, description);
}
void profile_scrape(profile_callback32 callback32, profile_callback64 callback64, void *cookie)
{
for (profile_var_t *i = __start__profile_var; i < __stop__profile_var; i++) {
switch (i->type) {
case PROFILE_VAR_TYPE_INT32:
callback32(*(uint32_t*)i->var, i->varname, i->description, cookie);
break;
case PROFILE_VAR_TYPE_INT64:
callback64(*(uint64_t*)i->var, i->varname, i->description, cookie);
break;
default:
ZF_LOGE("Unknown profile var. Probable memory corruption or linker failure!");
break;
}
}
}
void profile_reset(void)
{
for (profile_var_t *i = __start__profile_var; i < __stop__profile_var; i++) {
switch (i->type) {
case PROFILE_VAR_TYPE_INT32:
*(uint32_t*)i->var = 0;
break;
case PROFILE_VAR_TYPE_INT64:
*(uint64_t*)i->var = 0;
break;
default:
ZF_LOGE("Unknown profile var. Probable memory corruption or linker failure!");
break;
}
}
}