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:
Konstantin Belousov 2021-11-11 19:29:24 +02:00
parent ab4524b3d7
commit 01c77a436e
6 changed files with 19 additions and 1 deletions

View File

@ -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

View File

@ -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);

View File

@ -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) {

View File

@ -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.

View File

@ -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 *);

View File

@ -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",