| 302 | #endif /* RANDOM_FENESTRASX */ |
| 303 | |
| 304 | void |
| 305 | exec_sysvec_init(void *param) |
| 306 | { |
| 307 | struct sysentvec *sv; |
| 308 | #ifdef RANDOM_FENESTRASX |
| 309 | ptrdiff_t base; |
| 310 | #endif |
| 311 | |
| 312 | sv = (struct sysentvec *)param; |
| 313 | if ((sv->sv_flags & SV_SHP) == 0) |
| 314 | return; |
| 315 | sv->sv_shared_page_obj = shared_page_obj; |
| 316 | sv->sv_sigcode_base = sv->sv_shared_page_base + |
| 317 | shared_page_fill(*(sv->sv_szsigcode), 16, sv->sv_sigcode); |
| 318 | if ((sv->sv_flags & SV_ABI_MASK) != SV_ABI_FREEBSD) |
| 319 | return; |
| 320 | if ((sv->sv_flags & SV_TIMEKEEP) != 0) { |
| 321 | #ifdef COMPAT_FREEBSD32 |
| 322 | if ((sv->sv_flags & SV_ILP32) != 0) { |
| 323 | KASSERT(compat32_svtk == NULL, |
| 324 | ("Compat32 already registered")); |
| 325 | compat32_svtk = alloc_sv_tk_compat32(); |
| 326 | sv->sv_timekeep_base = sv->sv_shared_page_base + |
| 327 | compat32_svtk->sv_timekeep_off; |
| 328 | } else { |
| 329 | #endif |
| 330 | KASSERT(host_svtk == NULL, ("Host already registered")); |
| 331 | host_svtk = alloc_sv_tk(); |
| 332 | sv->sv_timekeep_base = sv->sv_shared_page_base + |
| 333 | host_svtk->sv_timekeep_off; |
| 334 | #ifdef COMPAT_FREEBSD32 |
| 335 | } |
| 336 | #endif |
| 337 | } |
| 338 | #ifdef RANDOM_FENESTRASX |
| 339 | if ((sv->sv_flags & SV_RNG_SEED_VER) != 0) { |
| 340 | /* |
| 341 | * Only allocate a single VDSO entry for multiple sysentvecs, |
| 342 | * i.e., native and COMPAT32. |
| 343 | */ |
| 344 | if (fxrng_shpage_mapping == NULL) |
| 345 | alloc_sv_fxrng_generation(); |
| 346 | base = (char *)fxrng_shpage_mapping - shared_page_mapping; |
| 347 | sv->sv_fxrng_gen_base = sv->sv_shared_page_base + base; |
| 348 | } |
| 349 | #endif |
| 350 | } |
| 351 | |
| 352 | void |
| 353 | exec_sysvec_init_secondary(struct sysentvec *sv, struct sysentvec *sv2) |
no test coverage detected