Pass vdso address to userspace
Reviewed by: emaste Discussed with: jrtc27 Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 month Differential revision: https://reviews.freebsd.org/D32960
This commit is contained in:
parent
ab4524b3d7
commit
01c77a436e
@ -6103,6 +6103,7 @@ static const struct auxfmt {
|
||||
AUXFMT(AT_ENVV, "%p"),
|
||||
AUXFMT(AT_PS_STRINGS, "%p"),
|
||||
AUXFMT(AT_FXRNG, "%p"),
|
||||
AUXFMT(AT_KPRELOAD, "%p"),
|
||||
};
|
||||
|
||||
static bool
|
||||
|
@ -1414,6 +1414,8 @@ __elfN(freebsd_copyout_auxargs)(struct image_params *imgp, uintptr_t base)
|
||||
AUXARGS_ENTRY_PTR(pos, AT_PS_STRINGS, imgp->ps_strings);
|
||||
if (imgp->sysent->sv_fxrng_gen_base != 0)
|
||||
AUXARGS_ENTRY(pos, AT_FXRNG, imgp->sysent->sv_fxrng_gen_base);
|
||||
if (imgp->sysent->sv_vdso_base != 0)
|
||||
AUXARGS_ENTRY(pos, AT_KPRELOAD, imgp->sysent->sv_vdso_base);
|
||||
AUXARGS_ENTRY(pos, AT_NULL, 0);
|
||||
|
||||
free(imgp->auxargs, M_TEMP);
|
||||
|
@ -328,6 +328,7 @@ exec_sysvec_init(void *param)
|
||||
if (res == -1)
|
||||
panic("copying sigtramp to shared page");
|
||||
sb += res;
|
||||
sv->sv_vdso_base = sb;
|
||||
sb += sv->sv_sigcodeoff;
|
||||
sv->sv_sigcode_base = sb;
|
||||
} else {
|
||||
@ -386,12 +387,18 @@ exec_sysvec_init_secondary(struct sysentvec *sv, struct sysentvec *sv2)
|
||||
MPASS((sv2->sv_flags & SV_ABI_MASK) == (sv->sv_flags & SV_ABI_MASK));
|
||||
MPASS((sv2->sv_flags & SV_TIMEKEEP) == (sv->sv_flags & SV_TIMEKEEP));
|
||||
MPASS((sv2->sv_flags & SV_SHP) != 0 && (sv->sv_flags & SV_SHP) != 0);
|
||||
MPASS((sv2->sv_flags & SV_DSO_SIG) != 0 &&
|
||||
(sv->sv_flags & SV_DSO_SIG) != 0);
|
||||
MPASS((sv2->sv_flags & SV_RNG_SEED_VER) ==
|
||||
(sv->sv_flags & SV_RNG_SEED_VER));
|
||||
|
||||
sv2->sv_shared_page_obj = sv->sv_shared_page_obj;
|
||||
sv2->sv_sigcode_base = sv2->sv_shared_page_base +
|
||||
(sv->sv_sigcode_base - sv->sv_shared_page_base);
|
||||
if ((sv2->sv_flags & SV_DSO_SIG) != 0) {
|
||||
sv2->sv_vdso_base = sv2->sv_shared_page_base +
|
||||
(sv->sv_vdso_base - sv->sv_shared_page_base);
|
||||
}
|
||||
if ((sv2->sv_flags & SV_ABI_MASK) != SV_ABI_FREEBSD)
|
||||
return;
|
||||
if ((sv2->sv_flags & SV_TIMEKEEP) != 0) {
|
||||
|
@ -981,8 +981,9 @@ typedef struct {
|
||||
#define AT_ENVV 31 /* Environment vector */
|
||||
#define AT_PS_STRINGS 32 /* struct ps_strings */
|
||||
#define AT_FXRNG 33 /* Pointer to root RNG seed version. */
|
||||
#define AT_KPRELOAD 34 /* Base of vdso, preloaded by rtld */
|
||||
|
||||
#define AT_COUNT 34 /* Count of defined aux entry types. */
|
||||
#define AT_COUNT 35 /* Count of defined aux entry types. */
|
||||
|
||||
/*
|
||||
* Relocation types.
|
||||
|
@ -144,6 +144,7 @@ struct sysentvec {
|
||||
vm_offset_t sv_shared_page_len;
|
||||
vm_offset_t sv_sigcode_base;
|
||||
void *sv_shared_page_obj;
|
||||
vm_offset_t sv_vdso_base;
|
||||
void (*sv_schedtail)(struct thread *);
|
||||
void (*sv_thread_detach)(struct thread *);
|
||||
int (*sv_trap)(struct thread *);
|
||||
|
@ -239,6 +239,12 @@ procstat_auxv(struct procstat *procstat, struct kinfo_proc *kipp)
|
||||
xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_FXRNG/%p}\n",
|
||||
prefix, "AT_FXRNG", auxv[i].a_un.a_ptr);
|
||||
break;
|
||||
#endif
|
||||
#ifdef AT_KPRELOAD
|
||||
case AT_KPRELOAD:
|
||||
xo_emit("{dw:/%s}{Lw:/%-16s/%s}{:AT_KPRELOAD/%p}\n",
|
||||
prefix, "AT_KPRELOAD", auxv[i].a_un.a_ptr);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
xo_emit("{dw:/%s}{Lw:/%16ld/%ld}{:UNKNOWN/%#lx}\n",
|
||||
|
Loading…
x
Reference in New Issue
Block a user