xref: /freebsd-src/tests/sys/vm/soxstack/soxstack.c (revision eb5fd01b53a6579f3bd5769ed41964683335a7fc)
18920c5f2SDmitry Chagin /*-
28920c5f2SDmitry Chagin  * Copyright (c) 2023 Dmitry Chagin <dchagin@FreeBSD.org>
38920c5f2SDmitry Chagin  *
48920c5f2SDmitry Chagin  * SPDX-License-Identifier: BSD-2-Clause
58920c5f2SDmitry Chagin  */
68920c5f2SDmitry Chagin 
78920c5f2SDmitry Chagin #include <sys/param.h>
88920c5f2SDmitry Chagin #include <sys/sysctl.h>
98920c5f2SDmitry Chagin #include <sys/user.h>
108920c5f2SDmitry Chagin 
118920c5f2SDmitry Chagin #include <assert.h>
128920c5f2SDmitry Chagin #include <libprocstat.h>
138920c5f2SDmitry Chagin #include <stdio.h>
148920c5f2SDmitry Chagin #include <stdlib.h>
158920c5f2SDmitry Chagin #include <unistd.h>
168920c5f2SDmitry Chagin 
178920c5f2SDmitry Chagin int	checkstack(void);
188920c5f2SDmitry Chagin 
1907d3738bSEd Maste #define	_STACK_FLAG_GROWS	(KVME_FLAG_GROWS_UP | KVME_FLAG_GROWS_DOWN)
208920c5f2SDmitry Chagin int
checkstack(void)218920c5f2SDmitry Chagin checkstack(void)
228920c5f2SDmitry Chagin {
238920c5f2SDmitry Chagin 	struct kinfo_vmentry *freep, *kve;
248920c5f2SDmitry Chagin 	struct kinfo_proc *p;
258920c5f2SDmitry Chagin 	struct procstat *prstat;
26*eb5fd01bSBrooks Davis 	uintptr_t stack;
278920c5f2SDmitry Chagin 	int i, cnt;
288920c5f2SDmitry Chagin 
298920c5f2SDmitry Chagin 	prstat = procstat_open_sysctl();
308920c5f2SDmitry Chagin 	assert(prstat != NULL);
318920c5f2SDmitry Chagin 	p = procstat_getprocs(prstat, KERN_PROC_PID, getpid(), &cnt);
328920c5f2SDmitry Chagin 	assert(p != NULL);
338920c5f2SDmitry Chagin 	freep = procstat_getvmmap(prstat, p, &cnt);
348920c5f2SDmitry Chagin 	assert(freep != NULL);
358920c5f2SDmitry Chagin 
36*eb5fd01bSBrooks Davis 	stack = (uintptr_t)&i;
378920c5f2SDmitry Chagin 	for (i = 0; i < cnt; i++) {
388920c5f2SDmitry Chagin 		kve = &freep[i];
398920c5f2SDmitry Chagin 		if (stack < kve->kve_start || stack > kve->kve_end)
408920c5f2SDmitry Chagin 			continue;
418920c5f2SDmitry Chagin 		if ((kve->kve_flags & _STACK_FLAG_GROWS) != 0 &&
428920c5f2SDmitry Chagin 		    (kve->kve_protection & KVME_PROT_EXEC) != 0)
438920c5f2SDmitry Chagin 			stack = 0;
448920c5f2SDmitry Chagin 		break;
458920c5f2SDmitry Chagin 	}
468920c5f2SDmitry Chagin 
478920c5f2SDmitry Chagin 	free(freep);
488920c5f2SDmitry Chagin 	procstat_freeprocs(prstat, p);
498920c5f2SDmitry Chagin 	procstat_close(prstat);
508920c5f2SDmitry Chagin 	return (stack != 0);
518920c5f2SDmitry Chagin }
52