27 #include <sys/cdefs.h>
30 #include "opt_compat.h"
33 #include <sys/param.h>
34 #include <sys/systm.h>
35 #include <sys/kernel.h>
37 #include <sys/mutex.h>
38 #include <sys/sysent.h>
39 #include <sys/sysctl.h>
43 #include <vm/vm_param.h>
45 #include <vm/vm_extern.h>
46 #include <vm/vm_kern.h>
47 #include <vm/vm_map.h>
48 #include <vm/vm_object.h>
49 #include <vm/vm_page.h>
50 #include <vm/vm_pager.h>
109 VM_PROT_DEFAULT, 0, NULL);
111 m = vm_page_grab(
shared_page_obj, 0, VM_ALLOC_RETRY | VM_ALLOC_NOBUSY |
113 m->valid = VM_PAGE_BITS_ALL;
115 addr = kmem_alloc_nofault(kernel_map, PAGE_SIZE);
116 pmap_qenter(addr, &m, 1);
126 struct vdso_timehands th;
127 struct vdso_timekeep *tk;
128 uint32_t enabled, idx;
132 sv->sv_timekeep_off);
133 idx = sv->sv_timekeep_curr;
134 atomic_store_rel_32(&tk->tk_th[idx].th_gen, 0);
135 if (++idx >= VDSO_TH_NUM)
137 sv->sv_timekeep_curr = idx;
138 if (++sv->sv_timekeep_gen == 0)
139 sv->sv_timekeep_gen = 1;
143 tk->tk_enabled = enabled;
144 atomic_store_rel_32(&tk->tk_th[idx].th_gen, sv->sv_timekeep_gen);
145 tk->tk_current = idx;
150 timehands_update32(
struct sysentvec *sv)
152 struct vdso_timekeep32 *tk;
153 struct vdso_timehands32 th;
154 uint32_t enabled, idx;
156 enabled = tc_fill_vdso_timehands32(&th);
158 sv->sv_timekeep_off);
159 idx = sv->sv_timekeep_curr;
160 atomic_store_rel_32(&tk->tk_th[idx].th_gen, 0);
161 if (++idx >= VDSO_TH_NUM)
163 sv->sv_timekeep_curr = idx;
164 if (++sv->sv_timekeep_gen == 0)
165 sv->sv_timekeep_gen = 1;
169 tk->tk_enabled = enabled;
170 atomic_store_rel_32(&tk->tk_th[idx].th_gen, sv->sv_timekeep_gen);
171 tk->tk_current = idx;
182 static struct sysentvec *compat32_sysentvec;
189 if (host_sysentvec != NULL && host_sysentvec->sv_timekeep_base != 0)
192 if (compat32_sysentvec != NULL &&
193 compat32_sysentvec->sv_timekeep_base != 0)
194 timehands_update32(compat32_sysentvec);
201 struct sysentvec *sv;
205 sv = (
struct sysentvec *)param;
207 if ((sv->sv_flags & SV_SHP) == 0)
210 sv->sv_sigcode_base = sv->sv_shared_page_base +
212 if ((sv->sv_flags & SV_ABI_MASK) != SV_ABI_FREEBSD && (sv->sv_flags & SV_ABI_MASK) != SV_ABI_BSDSUNIX)
214 tk_ver = VDSO_TK_VER_CURR;
216 if ((sv->sv_flags & SV_ILP32) != 0) {
218 sizeof(
struct vdso_timehands32) * VDSO_TH_NUM, 16);
219 KASSERT(tk_base != -1, (
"tk_base -1 for 32bit"));
221 tk_ver),
sizeof(uint32_t), &tk_ver);
222 KASSERT(compat32_sysentvec == 0,
223 (
"Native compat32 already registered"));
224 compat32_sysentvec = sv;
228 sizeof(
struct vdso_timehands) * VDSO_TH_NUM, 16);
229 KASSERT(tk_base != -1, (
"tk_base -1 for native"));
231 tk_ver),
sizeof(uint32_t), &tk_ver);
232 KASSERT(host_sysentvec == 0, (
"Native already registered"));
237 sv->sv_timekeep_base = sv->sv_shared_page_base + tk_base;
238 sv->sv_timekeep_off = tk_base;
void shared_page_write(int base, int size, const void *data)
static int shared_page_free
static struct sx shared_page_alloc_sx
char * shared_page_mapping
static int shared_page_alloc_locked(int size, int align)
static void timehands_update(struct sysentvec *sv)
static void shared_page_init(void *dummy __unused)
int shared_page_fill(int size, int align, const void *data)
SYSINIT(shp, SI_SUB_EXEC, SI_ORDER_FIRST,(sysinit_cfunc_t) shared_page_init, NULL)
static vm_object_t shared_page_obj
static struct sysentvec * host_sysentvec
int shared_page_alloc(int size, int align)
uint32_t tc_fill_vdso_timehands(struct vdso_timehands *vdso_th)
void exec_sysvec_init(void *param)
void timekeep_push_vdso(void)