11
#include <debug/symbol.h>
12
#include <lib/libds/bitmap.h>
13
#include <kernel/printk.h>
14
#include <embox/unit.h>
15
#include "cyg_profile.h"
17
extern const struct symbol __symbol_table[];
18
extern const size_t __symbol_table_size;
20
EMBOX_UNIT_INIT(coverage_init);
22
#define COVERAGE_TABLE_SIZE OPTION_GET(NUMBER,coverage_table_size)
23
static BITMAP_DECL(coverage_table_bitmap, COVERAGE_TABLE_SIZE);
25
void __coverage_func_enter(void *func, void *caller) {
26
const struct symbol *sym;
29
sym = symbol_lookup(func);
33
sym_pos = sym - __symbol_table;
34
if (!(0 <= sym_pos && sym_pos < __symbol_table_size))
37
bitmap_set_bit(coverage_table_bitmap, sym_pos);
40
void __coverage_func_exit(void *func, void *caller) {
44
int coverage_getstat(const struct symbol **sym_table, const unsigned long **cov_bitmap) {
46
*sym_table = __symbol_table;
47
*cov_bitmap = coverage_table_bitmap;
49
return __symbol_table_size;
52
static int coverage_init(void) {
54
if (COVERAGE_TABLE_SIZE < __symbol_table_size) {
55
printk("\n[%s]: coverage_table_size too small, "
56
"try to increase it [%zu; required at least %zu]\n",
57
__func__, (size_t)COVERAGE_TABLE_SIZE, __symbol_table_size);
62
ARRAY_SPREAD_DECLARE(cyg_func, __cyg_handler_enter_array);
63
ARRAY_SPREAD_DECLARE(cyg_func, __cyg_handler_exit_array);
64
ARRAY_SPREAD_ADD(__cyg_handler_enter_array, &__coverage_func_enter);
65
ARRAY_SPREAD_ADD(__cyg_handler_exit_array, &__coverage_func_exit);