X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/5ba3f43ea354af8ad55bea84372a2bc834d8757c..bca245acd4c03fd752d1a45f011ad495e60fe53d:/bsd/sys/monotonic.h diff --git a/bsd/sys/monotonic.h b/bsd/sys/monotonic.h index 883b6a0ad..6ec648972 100644 --- a/bsd/sys/monotonic.h +++ b/bsd/sys/monotonic.h @@ -1,9 +1,49 @@ +/* + * Copyright (c) 2017-2019 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + #ifndef SYS_MONOTONIC_H #define SYS_MONOTONIC_H #include #include #include + +__BEGIN_DECLS + +struct mt_cpu_inscyc { + uint64_t mtci_instructions; + uint64_t mtci_cycles; +}; + +__END_DECLS + +#if !MACH_KERNEL_PRIVATE + #include __BEGIN_DECLS @@ -12,9 +52,23 @@ __BEGIN_DECLS * XXX These declarations are subject to change at any time. */ +#define MT_IOC(x) _IO('m', (x)) +#define MT_IOC_RESET MT_IOC(0) +#define MT_IOC_ADD MT_IOC(1) +#define MT_IOC_ENABLE MT_IOC(2) +#define MT_IOC_COUNTS MT_IOC(3) +#define MT_IOC_GET_INFO MT_IOC(4) + +__END_DECLS + +#endif /* !MACH_KERNEL_PRIVATE */ + +__BEGIN_DECLS + struct monotonic_config { uint64_t event; uint64_t allowed_ctr_mask; + uint64_t cpu_mask; }; union monotonic_ctl_add { @@ -33,6 +87,7 @@ union monotonic_ctl_enable { } in; }; + union monotonic_ctl_counts { struct { uint64_t ctr_mask; @@ -43,31 +98,27 @@ union monotonic_ctl_counts { } out; }; -#define MT_IOC(x) _IO('m', (x)) -/* - * FIXME - * - * - Consider a separate IOC for disable -- to avoid the copyin to determine which way to set it. - * - * - Maybe IOC_COUNTS should just return all the enable counters' counts. - */ -enum monotonic_ioc { - MT_IOC_RESET = MT_IOC(0), - MT_IOC_ADD = MT_IOC(1), - MT_IOC_ENABLE = MT_IOC(2), - MT_IOC_COUNTS = MT_IOC(3), +union monotonic_ctl_info { + struct { + unsigned int nmonitors; + unsigned int ncounters; + } out; }; -#undef MT_IOC +__END_DECLS #if XNU_KERNEL_PRIVATE +#if MONOTONIC + #include #include #include #include +__BEGIN_DECLS + #ifdef MT_CORE_INSTRS #define COUNTS_INSTRS __counts[MT_CORE_INSTRS] #else /* defined(MT_CORE_INSTRS) */ @@ -89,13 +140,13 @@ enum monotonic_ioc { #define MT_KDBG_TMPCPU_(CODE, FUNC) \ do { \ - if (kdebug_enable && \ - kdebug_debugid_enabled(MT_KDBG_TMPCPU_EVT(CODE))) { \ - uint64_t __counts[MT_CORE_NFIXED]; \ - mt_fixed_counts(__counts); \ - KDBG(MT_KDBG_TMPCPU_EVT(CODE) | (FUNC), COUNTS_INSTRS, \ - __counts[MT_CORE_CYCLES]); \ - } \ + if (kdebug_enable && \ + kdebug_debugid_enabled(MT_KDBG_TMPCPU_EVT(CODE))) { \ + uint64_t __counts[MT_CORE_NFIXED]; \ + mt_fixed_counts(__counts); \ + KDBG(MT_KDBG_TMPCPU_EVT(CODE) | (FUNC), COUNTS_INSTRS, \ + __counts[MT_CORE_CYCLES]); \ + } \ } while (0) #define MT_KDBG_TMPCPU(CODE) MT_KDBG_TMPCPU_(CODE, DBG_FUNC_NONE) @@ -112,38 +163,44 @@ enum monotonic_ioc { #define MT_KDBG_TMPTH_(CODE, FUNC) \ do { \ - if (kdebug_enable && \ - kdebug_debugid_enabled(MT_KDBG_TMPTH_EVT(CODE))) { \ - uint64_t __counts[MT_CORE_NFIXED]; \ - mt_cur_thread_fixed_counts(__counts); \ - KDBG(MT_KDBG_TMPTH_EVT(CODE) | (FUNC), COUNTS_INSTRS, \ - __counts[MT_CORE_CYCLES]); \ - } \ + if (kdebug_enable && \ + kdebug_debugid_enabled(MT_KDBG_TMPTH_EVT(CODE))) { \ + uint64_t __counts[MT_CORE_NFIXED]; \ + mt_cur_thread_fixed_counts(__counts); \ + KDBG(MT_KDBG_TMPTH_EVT(CODE) | (FUNC), COUNTS_INSTRS, \ + __counts[MT_CORE_CYCLES]); \ + } \ } while (0) #define MT_KDBG_TMPTH(CODE) MT_KDBG_TMPTH_(CODE, DBG_FUNC_NONE) #define MT_KDBG_TMPTH_START(CODE) MT_KDBG_TMPTH_(CODE, DBG_FUNC_START) #define MT_KDBG_TMPTH_END(CODE) MT_KDBG_TMPTH_(CODE, DBG_FUNC_END) -/* maybe provider, bank, group, set, unit, pmu */ +extern lck_grp_t * mt_lock_grp; + +int mt_dev_init(void); -struct monotonic_dev { +struct mt_device { const char *mtd_name; - int (*mtd_init)(void); - int (*mtd_add)(struct monotonic_config *config, uint32_t *ctr_out); - void (*mtd_reset)(void); - void (*mtd_enable)(bool enable); - int (*mtd_read)(uint64_t ctr_mask, uint64_t *counts_out); + int(*const mtd_init)(struct mt_device *dev); + int(*const mtd_add)(struct monotonic_config *config, uint32_t *ctr_out); + void(*const mtd_reset)(void); + void(*const mtd_enable)(bool enable); + int(*const mtd_read)(uint64_t ctr_mask, uint64_t *counts_out); + decl_lck_mtx_data(, mtd_lock); + + uint8_t mtd_nmonitors; + uint8_t mtd_ncounters; + bool mtd_inuse; }; +typedef struct mt_device *mt_device_t; -extern const struct monotonic_dev monotonic_devs[]; +extern struct mt_device mt_devices[]; -extern lck_grp_t *mt_lock_grp; +__END_DECLS -int mt_dev_init(void); +#endif /* MONOTONIC */ #endif /* XNU_KERNEL_PRIVATE */ -__END_DECLS - #endif /* !defined(SYS_MONOTONIC_H) */