profile-internal.h [plain text]
#ifndef _PROFILE_INTERNAL_H
#define _PROFILE_INTERNAL_H
#if !defined(MACH_KERNEL) && !defined(_KERNEL)
#include <stdio.h>
#endif
#define SCALE_1_TO_1 0x10000L
struct profile_vars;
struct profile_stats;
struct profile_md;
struct profile_dci;
struct profile_profil;
struct callback;
struct gprof_arc;
struct prof_ext;
typedef enum profile_type {
PROFILE_NONE,
PROFILE_GPROF,
PROFILE_PROF
} profile_type_t;
typedef enum profile_alloc_mem {
PROFILE_ALLOC_MEM_NO,
PROFILE_ALLOC_MEM_YES
} profile_alloc_mem_t;
typedef enum acontext_type {
ACONTEXT_PROF,
ACONTEXT_GPROF,
ACONTEXT_GFUNC,
ACONTEXT_MISC,
ACONTEXT_PROFIL,
ACONTEXT_DCI,
ACONTEXT_BASIC_BLOCK,
ACONTEXT_CALLBACK,
ACONTEXT_MAX = 32
} acontext_type_t;
#define ACONTEXT_FIRST ACONTEXT_PROF
#define ACONTEXT_NAMES { \
"prof", \
"gprof", \
"gfunc", \
"misc", \
"profil", \
"dci", \
"bb", \
"callback", \
"#8", \
"#9", \
"#10", \
"#11", \
"#12", \
"#13", \
"#14", \
"#15", \
"#16", \
"#17", \
"#18", \
"#19", \
"#20", \
"#21", \
"#22", \
"#23", \
"#24", \
"#25", \
"#26", \
"#27", \
"#28", \
"#29", \
"#30", \
"#31", \
}
typedef enum kgmon_control {
KGMON_UNUSED,
KGMON_GET_STATUS,
KGMON_GET_PROFILE_VARS,
KGMON_GET_PROFILE_STATS,
KGMON_GET_DEBUG,
KGMON_SET_PROFILE_ON = 50,
KGMON_SET_PROFILE_OFF,
KGMON_SET_PROFILE_RESET,
KGMON_SET_DEBUG_ON,
KGMON_SET_DEBUG_OFF
} kgmon_control_t;
#define KGMON_GET_MIN KGMON_GET_STATUS
#define KGMON_GET_MAX KGMON_GET_DEBUG
#define KGMON_SET_MIN KGMON_SET_PROFILE_ON
#define KGMON_SET_MAX KGMON_SET_DEBUG_OFF
#define ENCODE_KGMON(num, control, cpu_thread) \
((num) = ((cpu_thread) << 8) | (control))
#define DECODE_KGMON(num, control, cpu_thread) \
do { \
control = (num) & 0xff; \
cpu_thread = (num) >> 8; \
} while (0)
#define LEGAL_KGMON(num) (((unsigned long)(num)) <= 0xffff)
#include <profiling/machine/profile-md.h>
#define ROUNDDOWN(x,y) (((x)/(y))*(y))
#define ROUNDUP(x,y) ((((x)+(y)-1)/(y))*(y))
struct page_list {
void *first;
void *ptr;
struct page_list *next;
size_t bytes_free;
size_t bytes_allocated;
size_t num_allocations;
};
struct alloc_context {
struct alloc_context *next;
struct page_list *plist;
prof_lock_t lock;
};
#define STR_MAX 32
struct callback {
void *sec_ptr;
size_t (*callback)(struct profile_vars *, struct callback *);
long sec_val1;
long sec_val2;
size_t sec_recsize;
size_t sec_length;
char sec_name[STR_MAX];
};
struct profile_profil {
prof_uptrint_t lowpc;
prof_uptrint_t highpc;
size_t text_len;
size_t profil_len;
size_t counter_size;
unsigned long scale;
unsigned long profil_unused[8];
};
struct profile_vars {
int major_version;
int minor_version;
size_t vars_size;
size_t plist_size;
size_t acontext_size;
size_t callback_size;
profile_type_t type;
const char *error_msg;
const char *filename;
char *str_ptr;
#if !defined(MACH_KERNEL) && !defined(_KERNEL)
FILE *stream;
FILE *diag_stream;
size_t (*fwrite_func)(const void *, size_t, size_t, FILE *);
#else
void *stream;
void *diag_stream;
size_t (*fwrite_func)(const void *, size_t, size_t, void *);
#endif
size_t page_size;
size_t str_bytes;
size_t str_total;
long clock_ticks;
struct profile_profil profil_info;
HISTCOUNTER *profil_buf;
void (*output_init)(struct profile_vars *);
void (*output)(struct profile_vars *);
void *output_ptr;
struct alloc_context *acontext[(int)ACONTEXT_MAX];
void (*bogus_func)(void);
prof_uptrint_t vars_unused[63];
prof_flag_t init;
prof_flag_t active;
prof_flag_t do_profile;
prof_flag_t use_dci;
prof_flag_t use_profil;
prof_flag_t recursive_alloc;
prof_flag_t output_uarea;
prof_flag_t output_stats;
prof_flag_t output_clock;
prof_flag_t multiple_sections;
prof_flag_t have_bb;
prof_flag_t init_format;
prof_flag_t debug;
prof_flag_t check_funcs;
prof_flag_t flag_unused[62];
struct profile_stats stats;
struct profile_md md;
};
extern struct profile_vars _profile_vars;
#if (__GNUC__ < 2) || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || defined(lint)
#define __attribute__(arg)
#endif
#if defined(_KERNEL) || defined(MACH_KERNEL)
#define _profile_printf printf
#else
extern int _profile_printf(const char *, ...) __attribute__((format(printf,1,2)));
#endif
extern void *_profile_alloc_pages (size_t);
extern void _profile_free_pages (void *, size_t);
extern void _profile_error(struct profile_vars *);
extern void _profile_md_init(struct profile_vars *, profile_type_t, profile_alloc_mem_t);
extern int _profile_md_start(void);
extern int _profile_md_stop(void);
extern void *_profile_alloc(struct profile_vars *, size_t, acontext_type_t);
extern size_t _gprof_write(struct profile_vars *, struct callback *);
extern size_t _prof_write(struct profile_vars *, struct callback *);
extern void _profile_update_stats(struct profile_vars *);
extern void _profile_reset(struct profile_vars *);
#if !defined(_KERNEL) && !defined(MACH_KERNEL)
extern void _profile_print_stats(FILE *, const struct profile_stats *, const struct profile_profil *);
extern void _profile_merge_stats(struct profile_stats *, const struct profile_stats *);
#else
extern long _profile_kgmon(int,
size_t,
long,
int,
void **,
void (*)(kgmon_control_t));
#ifdef _KERNEL
extern void kgmon_server_control(kgmon_control_t);
#endif
#endif
#endif