1 /*- 2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3 * 4 * Copyright 2012 Konstantin Belousov <kib@FreeBSD.ORG>. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 * 27 * $FreeBSD$ 28 */ 29 30 #ifndef _SYS_VDSO_H 31 #define _SYS_VDSO_H 32 33 #include <sys/types.h> 34 #include <machine/vdso.h> 35 36 struct vdso_timehands { 37 uint32_t th_algo; 38 uint32_t th_gen; 39 uint64_t th_scale; 40 uint32_t th_offset_count; 41 uint32_t th_counter_mask; 42 struct bintime th_offset; 43 struct bintime th_boottime; 44 VDSO_TIMEHANDS_MD 45 }; 46 47 struct vdso_timekeep { 48 uint32_t tk_ver; 49 uint32_t tk_enabled; 50 uint32_t tk_current; 51 struct vdso_timehands tk_th[]; 52 }; 53 54 #define VDSO_TK_CURRENT_BUSY 0xffffffff 55 #define VDSO_TK_VER_1 0x1 56 #define VDSO_TK_VER_CURR VDSO_TK_VER_1 57 #define VDSO_TH_ALGO_1 0x1 58 #define VDSO_TH_ALGO_2 0x2 59 #define VDSO_TH_ALGO_3 0x3 60 #define VDSO_TH_ALGO_4 0x4 61 62 struct vdso_fxrng_generation_1 { 63 uint32_t fx_vdso_version; /* 1 */ 64 uint32_t fx_generation32; 65 uint64_t _fx_reserved; 66 }; 67 _Static_assert(sizeof(struct vdso_fxrng_generation_1) == 16, ""); 68 #define vdso_fxrng_generation vdso_fxrng_generation_1 69 70 /* fx_vdso_version values: */ 71 #define VDSO_FXRNG_VER_1 0x1 72 #define VDSO_FXRNG_VER_CURR VDSO_FXRNG_VER_1 73 74 #ifndef _KERNEL 75 76 struct timespec; 77 struct timeval; 78 struct timezone; 79 80 int __vdso_clock_gettime(clockid_t clock_id, struct timespec *ts); 81 int __vdso_gettimeofday(struct timeval *tv, struct timezone *tz); 82 int __vdso_gettc(const struct vdso_timehands *vdso_th, u_int *tc); 83 int __vdso_gettimekeep(struct vdso_timekeep **tk); 84 85 #endif 86 87 #ifdef _KERNEL 88 89 struct timecounter; 90 91 struct vdso_sv_tk { 92 int sv_timekeep_off; 93 int sv_timekeep_curr; 94 uint32_t sv_timekeep_gen; 95 }; 96 97 #ifdef RANDOM_FENESTRASX 98 void fxrng_push_seed_generation(uint64_t gen); 99 #endif 100 void timekeep_push_vdso(void); 101 102 uint32_t tc_fill_vdso_timehands(struct vdso_timehands *vdso_th); 103 104 /* 105 * The cpu_fill_vdso_timehands() function should fill MD-part of the 106 * struct vdso_timehands, which is both machine- and 107 * timecounter-depended. The return value should be 1 if fast 108 * userspace timecounter is enabled by hardware, and 0 otherwise. The 109 * global sysctl enable override is handled by machine-independed code 110 * after cpu_fill_vdso_timehands() call is made. 111 */ 112 uint32_t cpu_fill_vdso_timehands(struct vdso_timehands *vdso_th, 113 struct timecounter *tc); 114 115 struct vdso_sv_tk *alloc_sv_tk(void); 116 117 #define VDSO_TH_NUM 4 118 119 #ifdef COMPAT_FREEBSD32 120 121 /* 122 * i386 is the only arch with a 32 bit time_t. 123 */ 124 struct bintime32 { 125 #if defined(__amd64__) 126 uint32_t sec; 127 #else 128 uint64_t sec; 129 #endif 130 uint32_t frac[2]; 131 }; 132 133 struct vdso_timehands32 { 134 uint32_t th_algo; 135 uint32_t th_gen; 136 uint32_t th_scale[2]; 137 uint32_t th_offset_count; 138 uint32_t th_counter_mask; 139 struct bintime32 th_offset; 140 struct bintime32 th_boottime; 141 VDSO_TIMEHANDS_MD32 142 }; 143 144 struct vdso_timekeep32 { 145 uint32_t tk_ver; 146 uint32_t tk_enabled; 147 uint32_t tk_current; 148 struct vdso_timehands32 tk_th[]; 149 }; 150 151 uint32_t tc_fill_vdso_timehands32(struct vdso_timehands32 *vdso_th32); 152 uint32_t cpu_fill_vdso_timehands32(struct vdso_timehands32 *vdso_th32, 153 struct timecounter *tc); 154 struct vdso_sv_tk *alloc_sv_tk_compat32(void); 155 156 #endif 157 #endif 158 159 #endif 160