1/*	$OpenBSD: exec_self.c,v 1.3 2024/01/23 10:27:12 anton Exp $	*/
2/*
3 *	Written by Artur Grabowski <art@openbsd.org> 2002 Public Domain.
4 */
5#include <stdio.h>
6#include <stdlib.h>
7#include <unistd.h>
8#include <err.h>
9#include <sys/types.h>
10#include <sys/mman.h>
11
12struct {
13	const char pad1[256*1024];	/* avoid read-ahead. */
14	const char string[256*1024];	/* at least one page */
15	const char pad2[256*1024];	/* avoid read-behind. */
16} const blob __attribute__((section(".openbsd.mutable"))) = {
17	"padding1",
18	"the_test",
19	"padding2"
20};
21
22int
23main(int argc, char **argv)
24{
25	int pgsz = getpagesize();
26	vaddr_t va, off;
27
28	if (argc > 1) {
29		return (0);
30	}
31	va = (vaddr_t)&blob;
32	off = va & (pgsz - 1);
33
34	/* Make sure that nothing in the "blob" is cached. */
35	if (madvise((void *)(va - off), sizeof(blob) + (off > 0 ? pgsz : 0),
36	    MADV_FREE))
37		err(1, "madvise");
38
39	if (execl(argv[0], argv[0], &blob.string, (char *)NULL))
40		err(1, "execl");
41
42	/* NOTREACHED */
43	return (1);
44}
45