xref: /xnu-11215/bsd/sys/commpage.h (revision e6231be0)
1 /*
2  * Copyright (c) 2017 Apple Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 #ifndef _COMMPAGE_H
29 #define _COMMPAGE_H
30 
31 #ifdef  PRIVATE
32 
33 #include <stdint.h>
34 
35 #define _COMM_PAGE32_SIGNATURE_STRING           "commpage 32-bit"
36 #define _COMM_PAGE64_SIGNATURE_STRING           "commpage 64-bit"
37 
38 typedef volatile struct commpage_timeofday_data {
39 	uint64_t        TimeStamp_tick;
40 	uint64_t        TimeStamp_sec;
41 	uint64_t        TimeStamp_frac;
42 	uint64_t        Ticks_scale;
43 	uint64_t        Ticks_per_sec;
44 } new_commpage_timeofday_data_t;
45 
46 /*!
47  * @macro COMM_PAGE_SLOT_TYPE
48  *
49  * @brief
50  * Macro that expands to the proper type for a pointer to a commpage slot,
51  * to be used in a local variable declaration.
52  *
53  * @description
54  * Usage is something like:
55  * <code>
56  *     COMM_PAGE_SLOT_TYPE(uint64_t) slot = COMM_PAGE_SLOT(uint64_t, FOO);
57  * </code>
58  *
59  * @param type   The scalar base type for the slot.
60  */
61 #if __has_feature(address_sanitizer)
62 #define COMM_PAGE_SLOT_TYPE(type_t)     type_t __attribute__((address_space(1))) volatile *
63 #else
64 #define COMM_PAGE_SLOT_TYPE(type_t)     type_t volatile *
65 #endif
66 
67 /*!
68  * @macro COMM_PAGE_SLOT
69  *
70  * @brief
71  * Macro that expands to the properly typed address for a commpage slot.
72  *
73  * @param type   The scalar base type for the slot.
74  * @param name   The slot name, without its @c _COMM_PAGE_ prefix.
75  */
76 #define COMM_PAGE_SLOT(type_t, name)    ((COMM_PAGE_SLOT_TYPE(type_t))_COMM_PAGE_##name)
77 
78 /*!
79  * @macro COMM_PAGE_READ
80  *
81  * @brief
82  * Performs a single read from the commpage in a way that doesn't trip
83  * address sanitizers.
84  *
85  * @description
86  * Typical use looks like this:
87  * <code>
88  *     uint64_t foo_value = COMM_PAGE_READ(uint64_t, FOO);
89  * </code>
90  *
91  * @param type   The scalar base type for the slot.
92  * @param name   The slot name, without its @c _COMM_PAGE_ prefix.
93  */
94 #define COMM_PAGE_READ(type_t, slot)    (*(COMM_PAGE_SLOT(type_t, slot)))
95 
96 #endif
97 
98 #endif
99