Annotation of XNU/osfmk/profiling/profile-internal.h, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * The contents of this file constitute Original Code as defined in and
        !             7:  * are subject to the Apple Public Source License Version 1.1 (the
        !             8:  * "License").  You may not use this file except in compliance with the
        !             9:  * License.  Please obtain a copy of the License at
        !            10:  * http://www.apple.com/publicsource and read it before using this file.
        !            11:  * 
        !            12:  * This Original Code and all software distributed under the License are
        !            13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            17:  * License for the specific language governing rights and limitations
        !            18:  * under the License.
        !            19:  * 
        !            20:  * @APPLE_LICENSE_HEADER_END@
        !            21:  */
        !            22: /*
        !            23:  * @OSF_COPYRIGHT@
        !            24:  */
        !            25: /*
        !            26:  * Define the internal interfaces between the profiling support that is
        !            27:  * common between the kernel, mach servers, and user space library.
        !            28:  */
        !            29: 
        !            30: #ifndef _PROFILE_INTERNAL_H
        !            31: #define _PROFILE_INTERNAL_H
        !            32: 
        !            33: /*
        !            34:  * Allow us not to require stdio.h in kernel/server space, but
        !            35:  * use it in user space.
        !            36:  */
        !            37: 
        !            38: #if !defined(MACH_KERNEL) && !defined(_KERNEL)
        !            39: #include <stdio.h>
        !            40: #endif
        !            41: 
        !            42: /*
        !            43:  * Scaling factor for the profil system call.
        !            44:  */
        !            45: 
        !            46: #define        SCALE_1_TO_1    0x10000L
        !            47: 
        !            48: 
        !            49: /*
        !            50:  * Forward reference to structures used.
        !            51:  */
        !            52: 
        !            53: struct profile_vars;
        !            54: struct profile_stats;
        !            55: struct profile_md;
        !            56: struct profile_dci;
        !            57: struct profile_profil;
        !            58: struct callback;
        !            59: struct gprof_arc;
        !            60: struct prof_ext;
        !            61: 
        !            62: /*
        !            63:  * Profiling type
        !            64:  */
        !            65: 
        !            66: typedef enum profile_type {
        !            67:        PROFILE_NONE,
        !            68:        PROFILE_GPROF,
        !            69:        PROFILE_PROF
        !            70: } profile_type_t;
        !            71: 
        !            72: /*
        !            73:  * Whether to allocate memory in _profile_md_init.
        !            74:  */
        !            75: 
        !            76: typedef enum profile_alloc_mem {
        !            77:        PROFILE_ALLOC_MEM_NO,
        !            78:        PROFILE_ALLOC_MEM_YES
        !            79: } profile_alloc_mem_t;
        !            80: 
        !            81: /*
        !            82:  * Allocation context block types.
        !            83:  */
        !            84: 
        !            85: typedef enum acontext_type {
        !            86:        ACONTEXT_PROF,                  /* 0: prof records */
        !            87:        ACONTEXT_GPROF,                 /* 1: gprof arcs */
        !            88:        ACONTEXT_GFUNC,                 /* 2: gprof function headers */
        !            89:        ACONTEXT_MISC,                  /* 3: misc. allocations */
        !            90:        ACONTEXT_PROFIL,                /* 4: profil based allocations */
        !            91:        ACONTEXT_DCI,                   /* 5: dci based allocations */
        !            92:        ACONTEXT_BASIC_BLOCK,           /* 6: basic block allocations */
        !            93:        ACONTEXT_CALLBACK,              /* 7: callback structures */
        !            94:        ACONTEXT_MAX = 32               /* # allocation contexts */
        !            95: } acontext_type_t;
        !            96: 
        !            97: #define ACONTEXT_FIRST ACONTEXT_PROF
        !            98: 
        !            99: #define        ACONTEXT_NAMES {                                                \
        !           100:                 "prof",                                                \
        !           101:                 "gprof",                                               \
        !           102:                 "gfunc",                                               \
        !           103:                 "misc",                                                \
        !           104:                 "profil",                                              \
        !           105:                 "dci",                                                 \
        !           106:                 "bb",                                                  \
        !           107:                 "callback",                                            \
        !           108:                 "#8",                                                  \
        !           109:                 "#9",                                                  \
        !           110:                 "#10",                                                 \
        !           111:                 "#11",                                                 \
        !           112:                 "#12",                                                 \
        !           113:                 "#13",                                                 \
        !           114:                 "#14",                                                 \
        !           115:                 "#15",                                                 \
        !           116:                 "#16",                                                 \
        !           117:                 "#17",                                                 \
        !           118:                 "#18",                                                 \
        !           119:                 "#19",                                                 \
        !           120:                 "#20",                                                 \
        !           121:                 "#21",                                                 \
        !           122:                 "#22",                                                 \
        !           123:                 "#23",                                                 \
        !           124:                 "#24",                                                 \
        !           125:                 "#25",                                                 \
        !           126:                 "#26",                                                 \
        !           127:                 "#27",                                                 \
        !           128:                 "#28",                                                 \
        !           129:                 "#29",                                                 \
        !           130:                 "#30",                                                 \
        !           131:                 "#31",                                                 \
        !           132:         }
        !           133: 
        !           134: /*
        !           135:  * Kgmon control codes
        !           136:  */
        !           137: 
        !           138: typedef enum kgmon_control {
        !           139:        KGMON_UNUSED,                   /* insure no 0 is ever used */
        !           140:        KGMON_GET_STATUS,               /* return whether or not profiling is active */
        !           141:        KGMON_GET_PROFILE_VARS,         /* return the _profile_vars structure */
        !           142:        KGMON_GET_PROFILE_STATS,        /* return the _profile_stats structure */
        !           143:        KGMON_GET_DEBUG,                /* return whether or not debugging is on */
        !           144: 
        !           145:        KGMON_SET_PROFILE_ON    = 50,   /* turn on profiling */
        !           146:        KGMON_SET_PROFILE_OFF,          /* turn off profiling */
        !           147:        KGMON_SET_PROFILE_RESET,        /* reset profiling tables */
        !           148:        KGMON_SET_DEBUG_ON,             /* turn on debugging */
        !           149:        KGMON_SET_DEBUG_OFF             /* turn off debugging */
        !           150: } kgmon_control_t;
        !           151: 
        !           152: #define KGMON_GET_MIN  KGMON_GET_STATUS
        !           153: #define        KGMON_GET_MAX   KGMON_GET_DEBUG
        !           154: #define        KGMON_SET_MIN   KGMON_SET_PROFILE_ON
        !           155: #define        KGMON_SET_MAX   KGMON_SET_DEBUG_OFF
        !           156: 
        !           157: #define ENCODE_KGMON(num, control, cpu_thread)                         \
        !           158:   ((num) = ((cpu_thread) << 8) | (control))
        !           159: 
        !           160: #define DECODE_KGMON(num, control, cpu_thread)                         \
        !           161: do {                                                                   \
        !           162:        control = (num) & 0xff;                                         \
        !           163:        cpu_thread = (num) >> 8;                                        \
        !           164: } while (0)
        !           165: 
        !           166: #define        LEGAL_KGMON(num) (((unsigned long)(num)) <= 0xffff)
        !           167: 
        !           168: /*
        !           169:  * Pull in all of the machine dependent types now after defining the enums.
        !           170:  */
        !           171: 
        !           172: #include <profiling/machine/profile-md.h>
        !           173: 
        !           174: /*
        !           175:  *  general rounding functions.
        !           176:  */
        !           177: 
        !           178: #define ROUNDDOWN(x,y)  (((x)/(y))*(y))
        !           179: #define ROUNDUP(x,y)    ((((x)+(y)-1)/(y))*(y))
        !           180: 
        !           181: /*
        !           182:  * Linked list of pages allocated for a particular allocation context block.
        !           183:  */
        !           184: 
        !           185: struct page_list {
        !           186:        void *first;                    /* pointer to first byte available */
        !           187:        void *ptr;                      /* pointer to next available byte */
        !           188:        struct page_list *next;         /* next page allocated */
        !           189:        size_t bytes_free;              /* # bytes available */
        !           190:        size_t bytes_allocated;         /* # bytes allocates so far */
        !           191:        size_t num_allocations;         /* # of allocations */
        !           192: };
        !           193: 
        !           194: /*
        !           195:  * Allocation context block.
        !           196:  */
        !           197: 
        !           198: struct alloc_context {
        !           199:        struct alloc_context *next;     /* next allocation context block */
        !           200:        struct page_list *plist;        /* head of page list */
        !           201:        prof_lock_t lock;               /* lock field available to asm */
        !           202: };
        !           203: 
        !           204: 
        !           205: /*
        !           206:  * Callback structure that records information for one record in the
        !           207:  * profiling output.
        !           208:  */
        !           209: 
        !           210: #define STR_MAX 32
        !           211: 
        !           212: struct callback {
        !           213:        void    *sec_ptr;               /* callback user data */
        !           214:                                        /* callback function */
        !           215:        size_t (*callback)(struct profile_vars *, struct callback *);
        !           216:        long     sec_val1;              /* section specific value */
        !           217:        long     sec_val2;              /* section specific value */
        !           218:        size_t   sec_recsize;           /* record size */
        !           219:        size_t   sec_length;            /* total length */
        !           220:        char     sec_name[STR_MAX];     /* section name */
        !           221: };
        !           222: 
        !           223: /*
        !           224:  * Basic profil information (except for the profil buffer).
        !           225:  */
        !           226: 
        !           227: struct profile_profil {
        !           228:        prof_uptrint_t lowpc;           /* lowest address */
        !           229:        prof_uptrint_t highpc;          /* highest address */
        !           230:        size_t text_len;                /* highpc-lowpc */
        !           231:        size_t profil_len;              /* length of the profil buffer */
        !           232:        size_t counter_size;            /* size of indivual counters (HISTCOUNTER) */
        !           233:        unsigned long scale;            /* scaling factor (65536 / scale) */
        !           234:        unsigned long profil_unused[8]; /* currently unused */
        !           235: };
        !           236: 
        !           237: /*
        !           238:  * Profiling internal variables.  This structure is intended to be machine independent.
        !           239:  */
        !           240: 
        !           241: struct profile_vars {
        !           242:        int major_version;              /* major version number */
        !           243:        int minor_version;              /* minor version number */
        !           244:        size_t vars_size;               /* size of profile_vars structure */
        !           245:        size_t plist_size;              /* size of page_list structure */
        !           246:        size_t acontext_size;           /* size of allocation context struct */
        !           247:        size_t callback_size;           /* size of callback structure */
        !           248:        profile_type_t type;            /* profile type */
        !           249:        const char *error_msg;          /* error message for perror */
        !           250:        const char *filename;           /* filename to write to */
        !           251:        char *str_ptr;                  /* string table */
        !           252: 
        !           253: #if !defined(MACH_KERNEL) && !defined(_KERNEL)
        !           254:        FILE *stream;                   /* stdio stream to write to */
        !           255:        FILE *diag_stream;              /* stdio stream to write diagnostics to */
        !           256:                                        /* function to write out some bytes */
        !           257:        size_t (*fwrite_func)(const void *, size_t, size_t, FILE *);
        !           258: #else
        !           259:        void *stream;                   /* pointer passed to fwrite_func */
        !           260:        void *diag_stream;              /* stdio stream to write diagnostics to */
        !           261:                                        /* function to write out some bytes */
        !           262:        size_t (*fwrite_func)(const void *, size_t, size_t, void *);
        !           263: #endif
        !           264: 
        !           265:        size_t page_size;               /* machine pagesize */
        !           266:        size_t str_bytes;               /* # bytes in string table */
        !           267:        size_t str_total;               /* # bytes allocated total for string table */
        !           268:        long clock_ticks;               /* # clock ticks per second */
        !           269: 
        !           270:                                        /* profil related variables */
        !           271:        struct profile_profil profil_info; /* profil information */
        !           272:        HISTCOUNTER *profil_buf;        /* profil buffer */
        !           273: 
        !           274:                                        /* Profiling output selection */
        !           275:        void (*output_init)(struct profile_vars *);     /* output init function */
        !           276:        void (*output)(struct profile_vars *);          /* output function */
        !           277:        void *output_ptr;                               /* output specific info */
        !           278: 
        !           279:                                        /* allocation contexts */
        !           280:        struct alloc_context *acontext[(int)ACONTEXT_MAX];
        !           281: 
        !           282:        void (*bogus_func)(void);       /* Function to use if address out of bounds */
        !           283:        prof_uptrint_t vars_unused[63]; /* future growth */
        !           284: 
        !           285:                                        /* Various flags */
        !           286:        prof_flag_t init;               /* != 0 if initialized */
        !           287:        prof_flag_t active;             /* != 0 if profiling is active */
        !           288:        prof_flag_t do_profile;         /* != 0 if profiling is being done */
        !           289:        prof_flag_t use_dci;            /* != 0 if using DCI */
        !           290: 
        !           291:        prof_flag_t use_profil;         /* != 0 if using profil */
        !           292:        prof_flag_t recursive_alloc;    /* != 0 if alloc taking place */
        !           293:        prof_flag_t output_uarea;       /* != 0 if output the uarea */
        !           294:        prof_flag_t output_stats;       /* != 0 if output the stats */
        !           295: 
        !           296:        prof_flag_t output_clock;       /* != 0 if output the clock ticks */
        !           297:        prof_flag_t multiple_sections;  /* != 0 if output allows multiple sections */
        !           298:        prof_flag_t have_bb;            /* != 0 if we have basic block data */
        !           299:        prof_flag_t init_format;        /* != 0 if output format has been chosen */
        !           300: 
        !           301:        prof_flag_t debug;              /* != 0 if debugging */
        !           302:        prof_flag_t check_funcs;        /* != 0 if check gprof arcs for being in range */
        !           303:        prof_flag_t flag_unused[62];    /* space for more flags */
        !           304: 
        !           305:        struct profile_stats stats;     /* profiling statistics */
        !           306:        struct profile_md md;           /* machine dependent info */
        !           307: };
        !           308: 
        !           309: /*
        !           310:  * Profiling static data.
        !           311:  */
        !           312: 
        !           313: extern struct profile_vars  _profile_vars;
        !           314: 
        !           315: /*
        !           316:  * Functions called by the machine dependent routines, and provided by
        !           317:  * specific routines to the kernel, server, and user space library.
        !           318:  */
        !           319: 
        !           320: #if (__GNUC__ < 2) || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || defined(lint)
        !           321: #define __attribute__(arg)
        !           322: #endif
        !           323: 
        !           324: #if defined(_KERNEL) || defined(MACH_KERNEL)
        !           325: #define _profile_printf printf
        !           326: #else
        !           327: extern int _profile_printf(const char *, ...) __attribute__((format(printf,1,2)));
        !           328: #endif
        !           329: 
        !           330: extern void *_profile_alloc_pages (size_t);
        !           331: extern void _profile_free_pages (void *, size_t);
        !           332: extern void _profile_error(struct profile_vars *);
        !           333: 
        !           334: /*
        !           335:  * Functions provided by the machine dependent files.
        !           336:  */
        !           337: 
        !           338: extern void _profile_md_init(struct profile_vars *, profile_type_t, profile_alloc_mem_t);
        !           339: extern int _profile_md_start(void);
        !           340: extern int _profile_md_stop(void);
        !           341: extern void *_profile_alloc(struct profile_vars *, size_t, acontext_type_t);
        !           342: extern size_t _gprof_write(struct profile_vars *, struct callback *);
        !           343: extern size_t _prof_write(struct profile_vars *, struct callback *);
        !           344: extern void _profile_update_stats(struct profile_vars *);
        !           345: extern void _profile_reset(struct profile_vars *);
        !           346: 
        !           347: #if !defined(_KERNEL) && !defined(MACH_KERNEL)
        !           348: extern void _profile_print_stats(FILE *, const struct profile_stats *, const struct profile_profil *);
        !           349: extern void _profile_merge_stats(struct profile_stats *, const struct profile_stats *);
        !           350: #else
        !           351: 
        !           352: /*
        !           353:  * Functions defined in profile-kgmon.c
        !           354:  */
        !           355: 
        !           356: extern long _profile_kgmon(int,
        !           357:                           size_t,
        !           358:                           long,
        !           359:                           int,
        !           360:                           void **,
        !           361:                           void (*)(kgmon_control_t));
        !           362: #ifdef _KERNEL
        !           363: extern void kgmon_server_control(kgmon_control_t);
        !           364: 
        !           365: #endif /* _KERNEL */
        !           366: #endif /* _KERNEL or MACH_KERNEL */
        !           367: 
        !           368: #endif /* _PROFILE_INTERNAL_H */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.