1/* 2 * Copyright 2014, General Dynamics C4 Systems 3 * 4 * SPDX-License-Identifier: GPL-2.0-only 5 */ 6 7/* 8 * Profiler Interface 9 * 10 * 2006 - 2007 David Greenaway 11 * 2007 Ported to seL4 C kernel by Philip Derrin 12 */ 13 14#pragma once 15 16#include <machine/registerset.h> 17#include <machine/hardware.h> 18 19#ifdef PROFILER 20 21/* Approximate number of unique addresses that we can record. 22 * 23 * This value corresponds to the size of a hash table, and needs 24 * to be a prime number to ensure correctness. 25 */ 26//#define MAX_UNIQUE_INSTRUCTIONS ((256 * 1024) + 3) /* 262147 is prime */ 27/* Downsized to fit in the default 1M kernel section - davec */ 28#define MAX_UNIQUE_INSTRUCTIONS 94349 29 30#define MAX_UNIQUE_CHECKPOINTS 2000 31 32/* Record the given program counter */ 33void profiler_record_sample(word_t pc) VISIBLE; 34 35/* Reset all counters */ 36void profiler_reset(void); 37 38/* List the recorded values to stdout */ 39void profiler_list(void); 40 41/* Should we be profiling the system? */ 42extern bool_t profiler_enabled; 43 44/* Set the current status of the profiler */ 45static inline void profiler_set_enabled(bool_t enabled) 46{ 47 profiler_enabled = enabled; 48} 49 50/* Get the current status of the profiler */ 51static inline bool_t profiler_is_enabled(void) 52{ 53 return profiler_enabled; 54} 55 56/* Number of entries the profiler currently keeps track of */ 57extern int profiler_num_entries; 58 59/* Number of instructions the profiler could not record */ 60extern long long profiler_dropped_instructions; 61 62/* The instructions recorded by the profiler */ 63typedef struct { 64 word_t pc; 65 word_t count; 66} profiler_entry_t; 67 68#ifdef CHECKPOINT_PROFILER 69extern volatile unsigned int checkpoint; 70extern profiler_entry_t profiler_entries[MAX_UNIQUE_CHECKPOINTS]; 71#else 72extern profiler_entry_t profiler_entries[MAX_UNIQUE_INSTRUCTIONS]; 73#endif 74 75#endif /* PROFILER */ 76 77 78