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 #ifndef _KERNEL 63 64 struct timespec; 65 struct timeval; 66 struct timezone; 67 68 int __vdso_clock_gettime(clockid_t clock_id, struct timespec *ts); 69 int __vdso_gettimeofday(struct timeval *tv, struct timezone *tz); 70 int __vdso_gettc(const struct vdso_timehands *vdso_th, u_int *tc); 71 int __vdso_gettimekeep(struct vdso_timekeep **tk); 72 73 #endif 74 75 #ifdef _KERNEL 76 77 struct timecounter; 78 79 struct vdso_sv_tk { 80 int sv_timekeep_off; 81 int sv_timekeep_curr; 82 uint32_t sv_timekeep_gen; 83 }; 84 85 void timekeep_push_vdso(void); 86 87 uint32_t tc_fill_vdso_timehands(struct vdso_timehands *vdso_th); 88 89 /* 90 * The cpu_fill_vdso_timehands() function should fill MD-part of the 91 * struct vdso_timehands, which is both machine- and 92 * timecounter-depended. The return value should be 1 if fast 93 * userspace timecounter is enabled by hardware, and 0 otherwise. The 94 * global sysctl enable override is handled by machine-independed code 95 * after cpu_fill_vdso_timehands() call is made. 96 */ 97 uint32_t cpu_fill_vdso_timehands(struct vdso_timehands *vdso_th, 98 struct timecounter *tc); 99 100 struct vdso_sv_tk *alloc_sv_tk(void); 101 102 #define VDSO_TH_NUM 4 103 104 #ifdef COMPAT_FREEBSD32 105 struct bintime32 { 106 uint32_t sec; 107 uint32_t frac[2]; 108 }; 109 110 struct vdso_timehands32 { 111 uint32_t th_algo; 112 uint32_t th_gen; 113 uint32_t th_scale[2]; 114 uint32_t th_offset_count; 115 uint32_t th_counter_mask; 116 struct bintime32 th_offset; 117 struct bintime32 th_boottime; 118 VDSO_TIMEHANDS_MD32 119 }; 120 121 struct vdso_timekeep32 { 122 uint32_t tk_ver; 123 uint32_t tk_enabled; 124 uint32_t tk_current; 125 struct vdso_timehands32 tk_th[]; 126 }; 127 128 uint32_t tc_fill_vdso_timehands32(struct vdso_timehands32 *vdso_th32); 129 uint32_t cpu_fill_vdso_timehands32(struct vdso_timehands32 *vdso_th32, 130 struct timecounter *tc); 131 struct vdso_sv_tk *alloc_sv_tk_compat32(void); 132 133 #endif 134 #endif 135 136 #endif 137